# HG changeset patch # User Michael Pavone # Date 1486012775 28800 # Node ID cf69a179aeaf2d1e4c8771606e0b370bdc9f6140 # Parent afa3d0a227ae7c7375b1a291ce5754d85f7353f4 Basic implementation of serial IO registers, but without actual serial IO support. Needed to run a certain software check cartridge that is floating around. diff -r afa3d0a227ae -r cf69a179aeaf genesis.c --- a/genesis.c Wed Feb 01 19:33:11 2017 -0800 +++ b/genesis.c Wed Feb 01 21:19:35 2017 -0800 @@ -517,6 +517,29 @@ case 0x6: gen->io.ports[2].control = value; break; + case 0x7: + gen->io.ports[0].serial_out = value; + break; + case 0x8: + case 0xB: + case 0xE: + //serial input port is not writeable + break; + case 0x9: + gen->io.ports[0].serial_ctrl = value; + break; + case 0xA: + gen->io.ports[1].serial_out = value; + break; + case 0xC: + gen->io.ports[1].serial_ctrl = value; + break; + case 0xD: + gen->io.ports[2].serial_out = value; + break; + case 0xF: + gen->io.ports[2].serial_ctrl = value; + break; } } else { if (location == 0x1100) { @@ -628,6 +651,33 @@ case 0x6: value = gen->io.ports[2].control; break; + case 0x7: + value = gen->io.ports[0].serial_out; + break; + case 0x8: + value = gen->io.ports[0].serial_in; + break; + case 0x9: + value = gen->io.ports[0].serial_ctrl; + break; + case 0xA: + value = gen->io.ports[1].serial_out; + break; + case 0xB: + value = gen->io.ports[1].serial_in; + break; + case 0xC: + value = gen->io.ports[1].serial_ctrl; + break; + case 0xD: + value = gen->io.ports[2].serial_out; + break; + case 0xE: + value = gen->io.ports[2].serial_in; + break; + case 0xF: + value = gen->io.ports[2].serial_ctrl; + break; default: value = 0xFF; } diff -r afa3d0a227ae -r cf69a179aeaf io.h --- a/io.h Wed Feb 01 19:33:11 2017 -0800 +++ b/io.h Wed Feb 01 21:19:35 2017 -0800 @@ -57,6 +57,9 @@ uint8_t output; uint8_t control; uint8_t input[3]; + uint8_t serial_out; + uint8_t serial_in; + uint8_t serial_ctrl; uint8_t device_type; } io_port;