|
31 | 31 | #include "../binimage.h" |
32 | 32 | #include "../opcodes.h" |
33 | 33 | #include "../log.h" |
| 34 | +#include "../gecode.h" |
34 | 35 |
|
35 | 36 | #include <stdio.h> |
36 | 37 |
|
@@ -324,3 +325,53 @@ UTEST(printer, output_per_prints_and_halts_when_polled) |
324 | 325 |
|
325 | 326 | ge_deinit(&g); |
326 | 327 | } |
| 328 | + |
| 329 | +UTEST(printer, input_line_waits_for_keyboard_and_fills_buffer) |
| 330 | +{ |
| 331 | + struct ge g; |
| 332 | + ge_init(&g); |
| 333 | + |
| 334 | + /* PER connector-2, order block @ 0x10: read a line into 0x0200. */ |
| 335 | + g.mem[0x00] = PER_OPCODE; g.mem[0x01] = 0x80; g.mem[0x02] = 0x00; g.mem[0x03] = 0x10; |
| 336 | + g.mem[0x10] = 0x00; g.mem[0x11] = 0x40; /* z, cmd=KBD_CMD_LINE */ |
| 337 | + g.mem[0x12] = 0x00; g.mem[0x13] = 0x20; /* len = 32 */ |
| 338 | + g.mem[0x14] = 0x02; g.mem[0x15] = 0x00; /* buf = 0x0200 */ |
| 339 | + |
| 340 | + ge_clear(&g); |
| 341 | + printer_register(&g); |
| 342 | + ge_start(&g); |
| 343 | + |
| 344 | + /* Without a completed line queued, the PER must remain pending. */ |
| 345 | + for (int i = 0; i < 40; i++) { |
| 346 | + if (ge_run_cycle(&g)) |
| 347 | + break; |
| 348 | + } |
| 349 | + ASSERT_EQ(g.mem[0x30], 0x00); |
| 350 | + ASSERT_EQ(g.mem[0x31], 0x00); |
| 351 | + ASSERT_EQ(g.mem[0x200], 0x00); |
| 352 | + |
| 353 | + printer_feed_key(&g, 'C'); |
| 354 | + printer_feed_key(&g, 'I'); |
| 355 | + printer_feed_key(&g, 'A'); |
| 356 | + printer_feed_key(&g, 'O'); |
| 357 | + printer_feed_key(&g, '\r'); |
| 358 | + |
| 359 | + for (int i = 0; i < 80; i++) { |
| 360 | + if (ge_run_cycle(&g)) |
| 361 | + break; |
| 362 | + if (g.mem[0x31] == 0x01) |
| 363 | + break; |
| 364 | + } |
| 365 | + |
| 366 | + ASSERT_EQ(g.mem[0x30], 0x00); |
| 367 | + ASSERT_EQ(g.mem[0x31], 0x01); |
| 368 | + ASSERT_EQ(g.mem[0x32], 0x00); |
| 369 | + ASSERT_EQ(g.mem[0x33], 0x04); |
| 370 | + ASSERT_EQ(g.mem[0x200], ge_code('C')); |
| 371 | + ASSERT_EQ(g.mem[0x201], ge_code('I')); |
| 372 | + ASSERT_EQ(g.mem[0x202], ge_code('A')); |
| 373 | + ASSERT_EQ(g.mem[0x203], ge_code('O')); |
| 374 | + ASSERT_EQ(g.mem[0x204], 0x00); /* trailing NUL */ |
| 375 | + |
| 376 | + ge_deinit(&g); |
| 377 | +} |
0 commit comments