import "io"

manifest
{ iv_none = 0,        iv_memory = 1,      iv_pagefault = 2,   iv_unimpop = 3,
  iv_halt = 4,        iv_divzero = 5,     iv_unwrop = 6,      iv_timer = 7,
  iv_privop = 8,      iv_keybd = 9,       iv_badcall = 10,    iv_pagepriv = 11,
  iv_debug = 12,      iv_intrfault = 13 }

let ivec = table 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0

let set_handler(int, fn) be
  if int >= 0 /\ int <= 13 then
    ivec ! int := fn

let int_enable() be
  assembly
  { LOAD  R1, [<ivec>]
    SETSR R1, $INTVEC
    LOAD  R1, 0
    SETFL R1, $IP }

let int_disable() be
  assembly
  { LOAD  R1, 1
    SETFL R1, $IP }

let set_timer(t) be
  assembly
  { LOAD  R1, [<t>]
    SETSR R1, $TIMER }

let timhandler() be
{ outch('*');
  set_timer(100000);
  ireturn }

let idle() be
  assembly 
  { pause }
  repeat

let start() be
{ set_handler(iv_timer, timhandler);
  int_enable();
  set_timer(100000);
  idle() }