static WRITE_HANDLER(bank_w) { if (locals.enable) { locals.bank = core_BitColToNum((~data & 0x0f) ^ 0x01); // logerror("bank: %d\n", locals.bank); cpu_setbank(1, memory_region(REGION_SOUND1) + 0x8000 * locals.bank); locals.mute = (data >> 6) & 1; locals.LED = ~data >> 7; coreGlobals.diagnosticLed = (coreGlobals.diagnosticLed & 1) | (locals.LED << 1); }
static READ_HANDLER(port_r) { UINT8 *ram = memory_region(REGION_CPU1) + 0x1000; UINT8 retVal = ram[offset]; logerror("%03x: R%x %02x - %02x\n", activecpu_get_previouspc(), locals.p2 >> 4, offset, locals.p1); switch (locals.p2 >> 4) { case 0: retVal = ~core_revbyte(coreGlobals.swMatrix[1 + core_BitColToNum(0xff ^ locals.p1)]); break; // case 1: unused by code, possible expansion (J4-7) case 4: retVal = core_getDip(0); break; case 5: retVal = core_getDip(1); break; case 6: retVal = core_getDip(3); printf("DIP3 used!!!"); break; // unused, so place it at the end and don't map it case 7: retVal = core_getDip(2); break; } return retVal; }
static WRITE_HANDLER(row_w) { locals.row = !data ? 0 : 1 + core_BitColToNum(data); locals.pos = 0; }
static WRITE_HANDLER(col_w) { locals.col = core_BitColToNum(data); }
static WRITE_HANDLER(port_w) { static int solBank; static UINT8 lampData; static UINT8 segData[4]; static UINT8 dispBlank; int col; UINT8 *ram = memory_region(REGION_CPU1) + 0x1000; logerror("%03x: W%x %02x: %02x\n", activecpu_get_previouspc(), locals.p2 >> 4, offset, data); switch (locals.p2 >> 4) { case 0: case 0x0e: ram[offset] = data; break; case 1: solBank = data; if (!solBank) { locals.solenoids = 0; } break; case 2: if (solBank) { locals.vblankCount = 0; if (solBank & 1) { locals.solenoids = (locals.solenoids & 0xff00) | data; } if (solBank & 2) { locals.solenoids = (locals.solenoids & 0x00ff) | (data << 8); } if (data) { // sometimes data is flaky, so allow fast overwrites and also keep previous data coreGlobals.solenoids = locals.solenoids; } } break; case 3: dispBlank = 0xff ^ data; break; // case 5/6: unused by code, possible expansion (J4-14, J4-13) case 8: segData[0] = data; break; case 9: segData[1] = data; break; case 0x0a: segData[2] = data; break; case 0x0b: segData[3] = data; break; case 0x0c: lampData = data; break; case 0x0d: col = core_BitColToNum(data); coreGlobals.lampMatrix[col] = lampData; coreGlobals.segments[col].w = dispBlank & 1 ? 0 : core_bcd2seg7[segData[0] & 0x0f]; coreGlobals.segments[8 + col].w = dispBlank & 2 ? 0 : core_bcd2seg7[segData[0] >> 4]; coreGlobals.segments[16 + col].w = dispBlank & 4 ? 0 : core_bcd2seg7[segData[1] & 0x0f]; coreGlobals.segments[24 + col].w = dispBlank & 8 ? 0 : core_bcd2seg7[segData[1] >> 4]; coreGlobals.segments[32 + col].w = dispBlank & 0x10 ? 0 : core_bcd2seg7[segData[2] & 0x0f]; coreGlobals.segments[40 + col].w = dispBlank & 0x20 ? 0 : core_bcd2seg7[segData[2] >> 4]; coreGlobals.segments[48 + col].w = dispBlank & 0x40 ? 0 : core_bcd2seg7[segData[3] & 0x0f]; coreGlobals.segments[56 + col].w = dispBlank & 0x80 ? 0 : core_bcd2seg7[segData[3] >> 4]; break; default: printf("%03x: W%x %02x: %02x\n", activecpu_get_previouspc(), locals.p2 >> 4, offset, data); } }
static WRITE_HANDLER(parallel_0_out) { locals.strobe = core_BitColToNum(data); }