#include <stdio.h>
#include <time.h>
#include <string.h>

#include "kernel.h"

#include "hbp10gm.h"


static _kernel_swi_regs r;


int hbp10gm_scheduler_flush_buffer() {

  r.r[0] = 7;
  if (_kernel_swi(HBP10GM_Ticker, &r, &r))  return 1;

  return 0;
}

int hbp10gm_scheduler_reset_ticker() {

  r.r[0] = 0;
  if (_kernel_swi(HBP10GM_Ticker, &r, &r))  return 1;

  return 0;
}

int hbp10gm_scheduler_set_ticks_per_second(int n) {

  r.r[0] = 4;
  r.r[1] = n;
  if (_kernel_swi(HBP10GM_Ticker, &r, &r))  return 1;

  return 0;
}

int hbp10gm_scheduler_info(int *n, int *first, int *last, int *size, int *ticker, int *tps) {

  r.r[0] = -1;
  if (_kernel_swi(HBP10GM_Schedule, &r, &r))   return 1;
  if (n)       *n = r.r[0];
  if (first)   *first = r.r[1];
  if (last)    *last = r.r[2];
  if (size)    *size = r.r[3];
  if (ticker)  *ticker = r.r[4];
  if (tps)     *tps = r.r[5];

  return 0;
}

int hbp10gm_schedule(int event, int event2, int ms) {

  r.r[0] = event;
  r.r[1] = event2;
  r.r[2] = ms;
  if (_kernel_swi(HBP10GM_Schedule, &r, &r))  return -1;

  return r.r[0];
}

int hbp10gm_master_volume(int v) {

  r.r[0] = 2;
  if (v >= 0 && v <= 4096)
    r.r[1] = v;
  else
    r.r[0] |= 0x80000000;
  if (_kernel_swi(HBP10GM_Control, &r, &r))  return -1;
  return r.r[0];
}

int hbp10gm_read_output_volume() {

  r.r[0] = 1;
  if (_kernel_swi(HBP10GM_Info, &r, &r))  return -1;
  return r.r[0];
}
