import "io" let twotimes(x) be { let sptr, prev; if x = 0 then resultis 0; prev := twotimes(x-1); resultis prev+2 } let start() be { let pdir = 6 << 11, ptablow = 7 << 11, ptabhigh = 8 << 11; let a, b; for i = 0 to 2047 do { pdir ! i := 0; ptablow ! i := 0; ptabhigh ! i := 0 } pdir ! 0 := ptablow bitor 1; pdir ! 0x1FF := ptabhigh bitor 1; ptablow ! 0 := 1; ptabhigh ! 0x7FF := 0x7FFFF801; out("pdir = %x\n", pdir); out("pdir!0 = %x\n", pdir ! 0); out("pdir!1FF = %x\n", pdir ! 0x1FF); outs("Dangerous place\n"); assembly { load r1, [] setsr r1, $pdbr getsr r1, $flags sbit r1, $vm flagsj r1, pc } outs("still alive\n"); a := 500; // this works when a is small, but not when it is more than about 350. // the stack frames are 6 words long, and we have only allowed one // page of 2048 words for the stack. b := twotimes(a); out("twotimes(%d) = %d\n", a, b) }