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  `