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 idle() be assembly { pause } repeat 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 otherhandler(intcode, address, info) be { out("interrupt %d (%x, %d)\n", intcode, address, info); ireturn } let kbhandler(intcode, address, info) be { let c = 0, v = vec 3; out("interrupt %d (%x, %d) ", intcode, address, info); assembly { load r1, [<v>] load r2, $terminc store r2, [r1+0] load r2, 1 store r2, [r1+1] load r2, <c> store r2, [r1+2] peri r2, r1 } out("character %x '%c'\n", c, c); ireturn } let start() be { set_handler(iv_timer, timhandler); set_handler(iv_keybd, kbhandler); int_enable(); set_timer(100000); idle() }