tomtel_test.go (4119B)
1 package tdo 2 3 import "testing" 4 5 func TestParseMv(t *testing.T) { 6 tests := []struct { 7 input uint8 8 wantOk bool 9 wantDest uint8 10 wantSrc uint8 11 }{ 12 {0b01011110, true, 0b011, 0b110}, 13 {0b01101110, true, 0b101, 0b110}, 14 {0b11000000, false, 0, 0}, 15 {0b00000000, false, 0, 0}, 16 } 17 18 for _, test := range tests { 19 ok, dest, src := parseMv(test.input) 20 if ok != test.wantOk || dest != test.wantDest || src != test.wantSrc { 21 t.Errorf("parseMv(%08b) = %t, %d, %d; want %t, %d, %d", test.input, ok, dest, src, test.wantOk, test.wantDest, test.wantSrc) 22 } 23 } 24 } 25 26 func TestParseMvi(t *testing.T) { 27 tests := []struct { 28 input uint8 29 wantOk bool 30 wantDest uint8 31 }{ 32 {0b01111000, true, 0b111}, 33 {0b01101000, true, 0b101}, 34 {0b01111001, false, 0}, 35 {0b01111111, false, 0}, 36 {0b00000000, false, 0}, 37 {0b11000000, false, 0}, 38 } 39 40 for _, test := range tests { 41 ok, dest := parseMvi(test.input) 42 if ok != test.wantOk || dest != test.wantDest { 43 t.Errorf("parseMvi(%08b) = %t, %d; want %t, %d", test.input, ok, dest, test.wantOk, test.wantDest) 44 } 45 } 46 } 47 48 func TestParseMv32(t *testing.T) { 49 tests := []struct { 50 input uint8 51 wantOk bool 52 wantDest uint8 53 wantSrc uint8 54 }{ 55 {0b10011110, true, 0b011, 0b110}, 56 {0b10101110, true, 0b101, 0b110}, 57 {0b10111000, false, 0, 0}, 58 {0b11111111, false, 0, 0}, 59 {0b01000000, false, 0, 0}, 60 } 61 62 for _, test := range tests { 63 ok, dest, src := parseMv32(test.input) 64 if ok != test.wantOk || dest != test.wantDest || src != test.wantSrc { 65 t.Errorf("parseMv32(%08b) = %t, %d, %d; want %t, %d, %d", test.input, ok, dest, src, test.wantOk, test.wantDest, test.wantSrc) 66 } 67 } 68 } 69 70 func TestParseMvi32(t *testing.T) { 71 tests := []struct { 72 input uint8 73 wantOk bool 74 wantDest uint8 75 }{ 76 {0b10111000, true, 0b111}, 77 {0b10101000, true, 0b101}, 78 {0b00000000, false, 0}, 79 {0b11000000, false, 0}, 80 {0b10111111, false, 0}, 81 } 82 83 for _, test := range tests { 84 ok, dest := parseMvi32(test.input) 85 if ok != test.wantOk || dest != test.wantDest { 86 t.Errorf("parseMvi32(%08b) = %t, %d; want %t, %d", test.input, ok, dest, test.wantOk, test.wantDest) 87 } 88 } 89 } 90 91 func TestTomtel_HelloWorld(t *testing.T) { 92 code := []byte{ 93 // 50 48 # MVI b <- 72 94 0x50, 0x48, 95 // C2 # ADD a <- b 96 0xC2, 97 // 02 # OUT a 98 0x02, 99 // A8 4D 00 00 00 # MVI32 ptr <- 0x0000004d 100 0xA8, 0x4D, 0x00, 0x00, 0x00, 101 // 4F # MV a <- (ptr+c) 102 0x4F, 103 // 02 # OUT a 104 0x02, 105 // 50 09 # MVI b <- 9 106 0x50, 0x09, 107 // C4 # XOR a <- b 108 0xC4, 109 // 02 # OUT a 110 0x02, 111 // 02 # OUT a 112 0x02, 113 // E1 01 # APTR 0x00000001 114 0xE1, 0x01, 115 // 4F # MV a <- (ptr+c) 116 0x4F, 117 // 02 # OUT a 118 0x02, 119 // C1 # CMP 120 0xC1, 121 // 22 1D 00 00 00 # JNZ 0x0000001d 122 0x22, 0x1D, 0x00, 0x00, 0x00, 123 // 48 30 # MVI a <- 48 124 0x48, 0x30, 125 // 02 # OUT a 126 0x02, 127 // 58 03 # MVI c <- 3 128 0x58, 0x03, 129 // 4F # MV a <- (ptr+c) 130 0x4F, 131 // 02 # OUT a 132 0x02, 133 // B0 29 00 00 00 # MVI32 pc <- 0x00000029 134 0xB0, 0x29, 0x00, 0x00, 0x00, 135 // 48 31 # MVI a <- 49 136 0x48, 0x31, 137 // 02 # OUT a 138 0x02, 139 // 50 0C # MVI b <- 12 140 0x50, 0x0C, 141 // C3 # SUB a <- b 142 0xC3, 143 // 02 # OUT a 144 0x02, 145 // AA # MV32 ptr <- lb 146 0xAA, 147 // 57 # MV b <- (ptr+c) 148 0x57, 149 // 48 02 # MVI a <- 2 150 0x48, 0x02, 151 // C1 # CMP 152 0xC1, 153 // 21 3A 00 00 00 # JEZ 0x0000003a 154 0x21, 0x3A, 0x00, 0x00, 0x00, 155 // 48 32 # MVI a <- 50 156 0x48, 0x32, 157 // 02 # OUT a 158 0x02, 159 // 48 77 # MVI a <- 119 160 0x48, 0x77, 161 // 02 # OUT a 162 0x02, 163 // 48 6F # MVI a <- 111 164 0x48, 0x6F, 165 // 02 # OUT a 166 0x02, 167 // 48 72 # MVI a <- 114 168 0x48, 0x72, 169 // 02 # OUT a 170 0x02, 171 // 48 6C # MVI a <- 108 172 0x48, 0x6C, 173 // 02 # OUT a 174 0x02, 175 // 48 64 # MVI a <- 100 176 0x48, 0x64, 177 // 02 # OUT a 178 0x02, 179 // 48 21 # MVI a <- 33 180 0x48, 0x21, 181 // 02 # OUT a 182 0x02, 183 // 01 # HALT 184 0x01, 185 // 65 6F 33 34 2C # non-instruction data 186 0x65, 0x6F, 0x33, 0x34, 0x2C, 187 } 188 189 tom := NewTomtel(code) 190 out := tom.Run() 191 if string(out) != "Hello, world!" { 192 t.Errorf("Unexpected output: %v", string(out)) 193 } 194 }