github.com/jflude/taocp@v0.0.0-20240210234939-99f2a91af3c2/mix/interrupt_test.go (about) 1 package mix 2 3 import ( 4 "errors" 5 "os" 6 "strings" 7 "testing" 8 ) 9 10 func TestInterrupt(t *testing.T) { 11 c, tmpDir := newSandbox(t, "") 12 defer closeSandbox(t, c, tmpDir) 13 if testing.Verbose() { 14 c.Tracer = os.Stdout 15 } 16 17 copy(c.Contents[mBase-1000:], egInterrupt1) 18 copy(c.Contents[mBase-11:], egInterrupt2) 19 copy(c.Contents[mBase-38:], egInterrupt3) 20 copy(c.Contents[mBase+1000:], egInterrupt4) 21 c.next = 1000 22 c.Interrupts = true 23 if err := c.resume(); !errors.Is(err, ErrHalted) { 24 t.Error("error:", err) 25 } 26 if c.Elapsed != 12100020 { 27 t.Errorf("got: %du elapsed, want: 12100020u", c.Elapsed) 28 } 29 b, err := os.ReadFile("printer.mix") 30 if err != nil { 31 t.Fatal("error:", err) 32 } 33 if strings.Compare(string(b), okInterrupt) != 0 { 34 t.Error("got: incorrect printer output") 35 } 36 } 37 38 var egInterrupt1 = []Word{ // * EXAMPLE: INTERRUPT CAPABILITY 39 // * SUPERVISOR ROUTINE 40 // QUANTUM EQU 1000 41 // CLOCK EQU -10 42 // PRINTER EQU 18 43 // STATUS EQU -1 44 // NEXTOP EQU 0:2 45 // BUF EQU -2000 46 // ORIG -1000 47 NewWord(01750000260), // SUPER ENTA QUANTUM 48 NewWord(-012000530), // STA CLOCK 49 NewWord(-01741002242), // JBUS RESUME(PRINTER) 50 NewWord(-01000210), // LDA STATUS(NEXTOP) 51 NewWord(0105), // CHAR 52 NewWord(-03720000537), // STX BUF 53 NewWord(-03720002245), // OUT BUF(PRINTER) 54 NewWord(01105), // RESUME INT 55 } 56 57 var egInterrupt2 = []Word{ // * INTERRUPT VECTORS 58 // CLOCKVEC EQU -11 59 // PRINTVEC EQU -20-PRINTER 60 // ORIG CLOCKVEC 61 NewWord(-01750000047), // JMP SUPER 62 NewWord(01750), // CON QUANTUM 63 } 64 65 var egInterrupt3 = []Word{ // ORIG PRINTVEC 66 NewWord(01105), // INT 67 } 68 69 var egInterrupt4 = []Word{ // * WORKER ROUTINE 70 // ORIG 1000 71 NewWord(01766000510), // START LDA =1000000= 72 NewWord(0500), // LOOP NOP 73 NewWord(0500), // NOP 74 NewWord(0500), // NOP 75 NewWord(0500), // NOP 76 NewWord(0500), // NOP 77 NewWord(0500), // NOP 78 NewWord(0500), // NOP 79 NewWord(0500), // NOP 80 NewWord(0500), // NOP 81 NewWord(0500), // NOP 82 NewWord(01000160), // DECA 1 83 NewWord(01751000450), // JANZ LOOP 84 NewWord(0205), // HLT 85 NewWord(03641100), // END START 86 } 87 88 var okInterrupt = `01003 89 01007 90 01011 91 01003 92 01007 93 01011 94 01003 95 01007 96 01011 97 01003 98 01007 99 01011 100 `