import "io" let compute() be { let x = 0; while true do { out("computed %d\n", x); for j = 0 to 500 do { for i = 0 to 1000 do x +:= 1; for i = 0 to 999 do x -:= 1; } } } let set_timer(t) be { assembly { load r1, [] setsr r1, $timer } } let timer_gone() be { out("Boo!\n"); set_timer(50000000); ireturn } let key_pressed() be { let c; devctl(dc_terminc, 1, @c); out("You typed '%c'\n", c); ireturn; } 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 start() be { let iv = vec(14); for i = 0 to 13 do iv ! i := nil; iv ! iv_timer := timer_gone; iv ! iv_keybd := key_pressed; assembly { load r1, [] setsr r1, $intvec load r1, 0 setfl r1, $ip } set_timer(50000000); compute(); }