diff options
-rw-r--r-- | src/devices/cpu/pdp1/tx0dasm.cpp | 78 | ||||
-rw-r--r-- | src/devices/cpu/pps4/pps4dasm.cpp | 32 | ||||
-rw-r--r-- | src/devices/cpu/sm510/sm510d.cpp | 24 | ||||
-rw-r--r-- | src/devices/cpu/tlcs900/dasm900.cpp | 359 | ||||
-rw-r--r-- | src/mame/drivers/hh_tms1k.cpp | 33 | ||||
-rw-r--r-- | src/mame/drivers/wmg.cpp | 513 |
6 files changed, 553 insertions, 486 deletions
diff --git a/src/devices/cpu/pdp1/tx0dasm.cpp b/src/devices/cpu/pdp1/tx0dasm.cpp index 3d8a1daf9e1..e309b27603d 100644 --- a/src/devices/cpu/pdp1/tx0dasm.cpp +++ b/src/devices/cpu/pdp1/tx0dasm.cpp @@ -3,7 +3,7 @@ #include "emu.h" #include "cpu/pdp1/tx0.h" -CPU_DISASSEMBLE( tx0_64kw ) +static offs_t internal_disasm_tx0_64kw(cpu_device *device, std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, int options) { int md; int x; @@ -14,22 +14,31 @@ CPU_DISASSEMBLE( tx0_64kw ) switch (md >> 16) { case 0: - sprintf (buffer, "sto 0%06o", x); + util::stream_format(stream, "sto 0%06o", x); break; case 1: - sprintf (buffer, "add 0%06o", x); + util::stream_format(stream, "add 0%06o", x); break; case 2: - sprintf (buffer, "trn 0%06o", x); + util::stream_format(stream, "trn 0%06o", x); break; case 3: - sprintf (buffer, "opr 0%06o", x); + util::stream_format(stream, "opr 0%06o", x); break; } return 1; } -CPU_DISASSEMBLE( tx0_8kw ) +CPU_DISASSEMBLE(tx0_64kw) +{ + std::ostringstream stream; + offs_t result = internal_disasm_tx0_64kw(device, stream, pc, oprom, opram, options); + std::string stream_str = stream.str(); + strcpy(buffer, stream_str.c_str()); + return result; +} + +static offs_t internal_disasm_tx0_8kw(cpu_device *device, std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, int options) { int md; int x; @@ -40,70 +49,70 @@ CPU_DISASSEMBLE( tx0_8kw ) switch (md >> 13) { case 0: - sprintf (buffer, "sto 0%05o", x); + util::stream_format(stream, "sto 0%05o", x); break; case 1: - sprintf (buffer, "stx 0%05o", x); + util::stream_format(stream, "stx 0%05o", x); break; case 2: - sprintf (buffer, "sxa 0%05o", x); + util::stream_format(stream, "sxa 0%05o", x); break; case 3: - sprintf (buffer, "ado 0%05o", x); + util::stream_format(stream, "ado 0%05o", x); break; case 4: - sprintf (buffer, "slr 0%05o", x); + util::stream_format(stream, "slr 0%05o", x); break; case 5: - sprintf (buffer, "slx 0%05o", x); + util::stream_format(stream, "slx 0%05o", x); break; case 6: - sprintf (buffer, "stz 0%05o", x); + util::stream_format(stream, "stz 0%05o", x); break; case 8: - sprintf (buffer, "add 0%05o", x); + util::stream_format(stream, "add 0%05o", x); break; case 9: - sprintf (buffer, "adx 0%05o", x); + util::stream_format(stream, "adx 0%05o", x); break; case 10: - sprintf (buffer, "ldx 0%05o", x); + util::stream_format(stream, "ldx 0%05o", x); break; case 11: - sprintf (buffer, "aux 0%05o", x); + util::stream_format(stream, "aux 0%05o", x); break; case 12: - sprintf (buffer, "llr 0%05o", x); + util::stream_format(stream, "llr 0%05o", x); break; case 13: - sprintf (buffer, "llx 0%05o", x); + util::stream_format(stream, "llx 0%05o", x); break; case 14: - sprintf (buffer, "lda 0%05o", x); + util::stream_format(stream, "lda 0%05o", x); break; case 15: - sprintf (buffer, "lax 0%05o", x); + util::stream_format(stream, "lax 0%05o", x); break; case 16: - sprintf (buffer, "trn 0%05o", x); + util::stream_format(stream, "trn 0%05o", x); break; case 17: - sprintf (buffer, "tze 0%05o", x); + util::stream_format(stream, "tze 0%05o", x); break; case 18: - sprintf (buffer, "tsx 0%05o", x); + util::stream_format(stream, "tsx 0%05o", x); break; case 19: - sprintf (buffer, "tix 0%05o", x); + util::stream_format(stream, "tix 0%05o", x); break; case 20: - sprintf (buffer, "tra 0%05o", x); + util::stream_format(stream, "tra 0%05o", x); break; case 21: - sprintf (buffer, "trx 0%05o", x); + util::stream_format(stream, "trx 0%05o", x); break; case 22: - sprintf (buffer, "tlv 0%05o", x); + util::stream_format(stream, "tlv 0%05o", x); break; case 24: case 25: @@ -113,11 +122,20 @@ CPU_DISASSEMBLE( tx0_8kw ) case 29: case 30: case 31: - sprintf (buffer, "opr 0%06o", md & 0177777); + util::stream_format(stream, "opr 0%06o", md & 0177777); break; default: - sprintf (buffer, "illegal"); + util::stream_format(stream, "illegal"); break; } return 1; } + +CPU_DISASSEMBLE(tx0_8kw) +{ + std::ostringstream stream; + offs_t result = internal_disasm_tx0_8kw(device, stream, pc, oprom, opram, options); + std::string stream_str = stream.str(); + strcpy(buffer, stream_str.c_str()); + return result; +} diff --git a/src/devices/cpu/pps4/pps4dasm.cpp b/src/devices/cpu/pps4/pps4dasm.cpp index 410f7986a60..3dad2e7d1fd 100644 --- a/src/devices/cpu/pps4/pps4dasm.cpp +++ b/src/devices/cpu/pps4/pps4dasm.cpp @@ -367,49 +367,48 @@ static const uint16_t table[] = { /* ff */ t_TM | t_I6i | t_OVER }; -CPU_DISASSEMBLE( pps4 ) +static offs_t internal_disasm_pps4(cpu_device *device, std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, int options) { uint32_t flags = 0; unsigned PC = pc; uint8_t op = OP(pc++); uint32_t tok = table[op]; - char *dst = nullptr; if (0 == (tok & t_MASK)) { - sprintf(buffer, "%s", token_str[tok & t_MASK]); + stream << token_str[tok & t_MASK]; } else { - dst = buffer + sprintf(buffer, "%-7s", token_str[tok & t_MASK]); + util::stream_format(stream, "%-7s", token_str[tok & t_MASK]); } if (tok & t_I3c) { // 3 bit immediate, complemented uint8_t i = ~op & 7; if (0 != i) // only print if non-zero - dst += sprintf(dst, "%x", i); + util::stream_format(stream, "%x", i); } if (tok & t_I4) { // 4 bit immediate uint8_t i = op & 15; - dst += sprintf(dst, "%x", i); + util::stream_format(stream, "%x", i); } if (tok & t_I4c) { // 4 bit immediate, complemented uint8_t i = ~op & 15; - dst += sprintf(dst, "%x", i); + util::stream_format(stream, "%x", i); } if (tok & t_I4p) { // 4 bit immediate offset into page 3 uint8_t i = op & 15; - dst += sprintf(dst, "[%x]", 0x0c0 | i); + util::stream_format(stream, "[%x]", 0x0c0 | i); } if (tok & t_I6p) { // 6 bit immediate offset into current page uint8_t i = op & 63; - dst += sprintf(dst, "%x", (PC & ~63) | i); + util::stream_format(stream, "%x", (PC & ~63) | i); } if (tok & t_I6i) { @@ -418,19 +417,19 @@ CPU_DISASSEMBLE( pps4 ) // 8 bit absolute offset at 0x0100 uint16_t addr = (1 << 8) | 0; // ROM[ip3] can't be reached!? (void)addr; // avoid unused variable warning - dst += sprintf(dst, "[%x]", i6p3); + util::stream_format(stream, "[%x]", i6p3); } if (tok & t_I8) { // 8 bit immediate I/O port address uint8_t arg = ARG(pc++); - dst += sprintf(dst, "%02x", arg); + util::stream_format(stream, "%02x", arg); } if (tok & t_I8c) { // 8 bit immediate offset into page uint16_t arg = ~ARG(pc++) & 255; - dst += sprintf(dst, "%02x", arg); + util::stream_format(stream, "%02x", arg); } if (tok & t_OVER) // TL or TML @@ -441,3 +440,12 @@ CPU_DISASSEMBLE( pps4 ) return (pc - PC) | flags | DASMFLAG_SUPPORTED; } + +CPU_DISASSEMBLE(pps4) +{ + std::ostringstream stream; + offs_t result = internal_disasm_pps4(device, stream, pc, oprom, opram, options); + std::string stream_str = stream.str(); + strcpy(buffer, stream_str.c_str()); + return result; +} diff --git a/src/devices/cpu/sm510/sm510d.cpp b/src/devices/cpu/sm510/sm510d.cpp index ae48fa3a3e5..6a5d97f50de 100644 --- a/src/devices/cpu/sm510/sm510d.cpp +++ b/src/devices/cpu/sm510/sm510d.cpp @@ -139,7 +139,7 @@ static const int8_t s_next_pc[0x40] = // common disasm -static offs_t sm510_common_disasm(const uint8_t *lut_mnemonic, const uint8_t *lut_extended, char *buffer, offs_t pc, const uint8_t *oprom, const uint8_t *opram) +static offs_t sm510_common_disasm(const uint8_t *lut_mnemonic, const uint8_t *lut_extended, std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram) { // get raw opcode uint8_t op = oprom[0]; @@ -163,36 +163,44 @@ static offs_t sm510_common_disasm(const uint8_t *lut_mnemonic, const uint8_t *lu instr = lut_extended[param]; // disassemble it - char *dst = buffer; - dst += sprintf(dst, "%-6s ", s_mnemonics[instr]); + util::stream_format(stream, "%-6s ", s_mnemonics[instr]); if (bits > 0) { if (bits <= 4) { if (param < 10) - dst += sprintf(dst, "%d", param); + util::stream_format(stream, "%d", param); else - dst += sprintf(dst, "$%X", param); + util::stream_format(stream, "$%X", param); } else if (bits <= 8) { if (!is_extended) - dst += sprintf(dst, "$%02X", param); + util::stream_format(stream, "$%02X", param); } else { uint16_t address = (param << 4 & 0xc00) | (mask << 6 & 0x3c0) | (param & 0x03f); - dst += sprintf(dst, "$%03X", address); + util::stream_format(stream, "$%03X", address); } // show param offset if (bits >= 8) - dst += sprintf(dst, " [$%03X]", pc + s_next_pc[pc & 0x3f]); + util::stream_format(stream, " [$%03X]", pc + s_next_pc[pc & 0x3f]); } return len | s_flags[instr] | DASMFLAG_SUPPORTED; } +static offs_t sm510_common_disasm(const uint8_t *lut_mnemonic, const uint8_t *lut_extended, char *buffer, offs_t pc, const uint8_t *oprom, const uint8_t *opram) +{ + std::ostringstream stream; + offs_t result = sm510_common_disasm(lut_mnemonic, lut_extended, stream, pc, oprom, opram); + std::string stream_str = stream.str(); + strcpy(buffer, stream_str.c_str()); + return result; +} + // SM510 disasm diff --git a/src/devices/cpu/tlcs900/dasm900.cpp b/src/devices/cpu/tlcs900/dasm900.cpp index 1acb08617f6..aa1bdcbc9b2 100644 --- a/src/devices/cpu/tlcs900/dasm900.cpp +++ b/src/devices/cpu/tlcs900/dasm900.cpp @@ -1436,7 +1436,7 @@ static const char *const s_cond[16] = static offs_t internal_disasm_tlcs900(cpu_device *device, std::ostream &stream, offs_t pc, const uint8_t *oprom, const uint8_t *opram, int options) { const tlcs900inst *dasm; - char buf[32]; + std::string buf; uint8_t op, op1; uint32_t imm; int flags = 0; @@ -1449,56 +1449,57 @@ static offs_t internal_disasm_tlcs900(cpu_device *device, std::ostream &stream, /* Check for extended addressing modes */ switch( dasm->mnemonic ) { - default: - break; + default: + break; + case M_80: - sprintf( buf, "%s", s_reg32[op & 0x07] ); + buf = string_format("%s", s_reg32[op & 0x07]); op = oprom[ pos++ ]; dasm = &mnemonic_80[ op ]; break; case M_88: imm = oprom[ pos++ ]; - sprintf( buf, "%s+0x%02x", s_reg32[op & 0x07], imm ); + buf = string_format("%s+0x%02x", s_reg32[op & 0x07], imm); op = oprom[ pos++ ]; dasm = &mnemonic_88[ op ]; break; case M_90: - sprintf( buf, "%s", s_reg32[op & 0x07] ); + buf = string_format("%s", s_reg32[op & 0x07]); op = oprom[ pos++ ]; dasm = &mnemonic_90[ op ]; break; case M_98: imm = oprom[ pos++ ]; - sprintf( buf, "%s+0x%02x", s_reg32[op & 0x07], imm ); + buf = string_format("%s+0x%02x", s_reg32[op & 0x07], imm); op = oprom[ pos++ ]; dasm = &mnemonic_98[ op ]; break; case M_A0: - sprintf( buf, "%s", s_reg32[op & 0x07] ); + buf = string_format("%s", s_reg32[op & 0x07]); op = oprom[ pos++ ]; dasm = &mnemonic_a0[ op ]; break; case M_A8: imm = oprom[ pos++ ]; - sprintf( buf, "%s+0x%02x", s_reg32[op & 0x07], imm ); + buf = string_format("%s+0x%02x", s_reg32[op & 0x07], imm); op = oprom[ pos++ ]; dasm = &mnemonic_a0[ op ]; break; case M_B0: - sprintf( buf, "%s", s_reg32[op & 0x07] ); + buf = string_format("%s", s_reg32[op & 0x07]); op = oprom[ pos++ ]; dasm = &mnemonic_b0[ op ]; break; case M_B8: imm = oprom[ pos++ ]; - sprintf( buf, "%s+0x%02x", s_reg32[op & 0x07], imm ); + buf = string_format("%s+0x%02x", s_reg32[op & 0x07], imm); op = oprom[ pos++ ]; dasm = &mnemonic_b8[ op ]; break; @@ -1508,20 +1509,20 @@ static offs_t internal_disasm_tlcs900(cpu_device *device, std::ostream &stream, { case 0x00: /* 0xC0 */ imm = oprom[ pos++ ]; - sprintf( buf, "0x%02x", imm ); + buf = string_format("0x%02x", imm); break; case 0x01: /* 0xC1 */ imm = oprom[ pos++ ]; - imm = imm | ( oprom[ pos++ ] << 8 ); - sprintf( buf, "0x%04x", imm ); + imm = imm | (oprom[ pos++ ] << 8); + buf = string_format("0x%04x", imm); break; case 0x02: /* 0xC2 */ imm = oprom[ pos++ ]; - imm = imm | ( oprom[ pos++ ] << 8 ); - imm = imm | ( oprom[ pos++ ] << 16 ); - sprintf( buf, "0x%06x", imm ); + imm = imm | (oprom[ pos++ ] << 8); + imm = imm | (oprom[ pos++ ] << 16); + buf = string_format("0x%06x", imm); break; case 0x03: /* 0xC3 */ @@ -1529,18 +1530,18 @@ static offs_t internal_disasm_tlcs900(cpu_device *device, std::ostream &stream, switch( imm & 0x03 ) { case 0x00: - sprintf( buf, "%s", s_allreg32[imm] ); + buf = string_format("%s", s_allreg32[imm]); break; case 0x01: op = imm; imm = oprom[ pos++ ]; - imm = imm | ( oprom[ pos++ ] << 8 ); - sprintf( buf, "%s+0x%04x", s_allreg32[op], imm ); + imm = imm | (oprom[ pos++ ] << 8); + buf = string_format("%s+0x%04x", s_allreg32[op], imm); break; case 0x02: - sprintf( buf, "unknown" ); + buf = string_format("unknown"); break; case 0x03: @@ -1549,19 +1550,19 @@ static offs_t internal_disasm_tlcs900(cpu_device *device, std::ostream &stream, case 0x03: op = oprom[ pos++ ]; op1 = oprom[ pos++ ]; - sprintf( buf, "%s+%s", s_allreg32[op], s_allreg8[op1] ); + buf = string_format("%s+%s", s_allreg32[op], s_allreg8[op1]); break; case 0x07: op = oprom[ pos++ ]; op1 = oprom[ pos++ ]; - sprintf( buf, "%s+%s", s_allreg32[op], s_allreg16[op1] ); + buf = string_format("%s+%s", s_allreg32[op], s_allreg16[op1]); break; case 0x13: imm = oprom[ pos++ ]; - imm = imm | ( oprom[ pos++ ] << 8 ); - sprintf( buf, "0x%06x", pc + pos + (int16_t)imm ); + imm = imm | (oprom[ pos++ ] << 8); + buf = string_format("0x%06x", pc + pos + (int16_t)imm); break; } break; @@ -1570,12 +1571,12 @@ static offs_t internal_disasm_tlcs900(cpu_device *device, std::ostream &stream, case 0x04: /* 0xC4 */ imm = oprom[ pos++ ]; - sprintf( buf, "-%s", s_allreg32[imm] ); + buf = string_format("-%s", s_allreg32[imm]); break; case 0x05: /* 0xC5 */ imm = oprom[ pos++ ]; - sprintf( buf, "%s+", s_allreg32[imm] ); + buf = string_format("%s+", s_allreg32[imm]); break; } op = oprom[ pos++ ]; @@ -1585,12 +1586,12 @@ static offs_t internal_disasm_tlcs900(cpu_device *device, std::ostream &stream, case oC8: if ( op & 0x08 ) { - sprintf( buf, "%s", s_reg8[ op & 0x07 ] ); + buf = string_format("%s", s_reg8[ op & 0x07 ]); } else { imm = oprom[ pos++ ]; - sprintf( buf, "%s", s_allreg8[imm] ); + buf = string_format("%s", s_allreg8[imm]); } op = oprom[ pos++ ]; dasm = &mnemonic_c8[ op ]; @@ -1601,20 +1602,20 @@ static offs_t internal_disasm_tlcs900(cpu_device *device, std::ostream &stream, { case 0x00: /* 0xD0 */ imm = oprom[ pos++ ]; - sprintf( buf, "0x%02x", imm ); + buf = string_format("0x%02x", imm); break; case 0x01: /* 0xD1 */ imm = oprom[ pos++ ]; - imm = imm | ( oprom[ pos++ ] << 8 ); - sprintf( buf, "0x%04x", imm ); + imm = imm | (oprom[ pos++ ] << 8); + buf = string_format("0x%04x", imm); break; case 0x02: /* 0xD2 */ imm = oprom[ pos++ ]; - imm = imm | ( oprom[ pos++ ] << 8 ); - imm = imm | ( oprom[ pos++ ] << 16 ); - sprintf( buf, "0x%06x", imm ); + imm = imm | (oprom[ pos++ ] << 8); + imm = imm | (oprom[ pos++ ] << 16); + buf = string_format("0x%06x", imm); break; case 0x03: /* 0xD3 */ @@ -1622,18 +1623,18 @@ static offs_t internal_disasm_tlcs900(cpu_device *device, std::ostream &stream, switch( imm & 0x03 ) { case 0x00: - sprintf( buf, "%s", s_allreg32[imm] ); + buf = string_format("%s", s_allreg32[imm]); break; case 0x01: op = imm; imm = oprom[ pos++ ]; - imm = imm | ( oprom[ pos++ ] << 8 ); - sprintf( buf, "%s+0x%04x", s_allreg32[op], imm ); + imm = imm | (oprom[ pos++ ] << 8); + buf = string_format("%s+0x%04x", s_allreg32[op], imm); break; case 0x02: - sprintf( buf, "unknown" ); + buf = string_format("unknown"); break; case 0x03: @@ -1642,19 +1643,19 @@ static offs_t internal_disasm_tlcs900(cpu_device *device, std::ostream &stream, case 0x03: op = oprom[ pos++ ]; op1 = oprom[ pos++ ]; - sprintf( buf, "%s+%s", s_allreg32[op], s_allreg8[op1] ); + buf = string_format("%s+%s", s_allreg32[op], s_allreg8[op1]); break; case 0x07: op = oprom[ pos++ ]; op1 = oprom[ pos++ ]; - sprintf( buf, "%s+%s", s_allreg32[op], s_allreg16[op1] ); + buf = string_format("%s+%s", s_allreg32[op], s_allreg16[op1]); break; case 0x13: imm = oprom[ pos++ ]; - imm = imm | ( oprom[ pos++ ] << 8 ); - sprintf( buf, "0x%06x", pc + pos + (int16_t)imm ); + imm = imm | (oprom[ pos++ ] << 8); + buf = string_format("0x%06x", pc + pos + (int16_t)imm); break; } break; @@ -1663,12 +1664,12 @@ static offs_t internal_disasm_tlcs900(cpu_device *device, std::ostream &stream, case 0x04: /* 0xD4 */ imm = oprom[ pos++ ]; - sprintf( buf, "-%s", s_allreg32[imm] ); + buf = string_format("-%s", s_allreg32[imm]); break; case 0x05: /* 0xD5 */ imm = oprom[ pos++ ]; - sprintf( buf, "%s+", s_allreg32[imm] ); + buf = string_format("%s+", s_allreg32[imm]); break; } op = oprom[ pos++ ]; @@ -1678,12 +1679,12 @@ static offs_t internal_disasm_tlcs900(cpu_device *device, std::ostream &stream, case oD8: if ( op & 0x08 ) { - sprintf( buf, "%s", s_reg16[ op & 0x07 ] ); + buf = string_format("%s", s_reg16[ op & 0x07 ]); } else { imm = oprom[ pos++ ]; - sprintf( buf, "%s", s_allreg16[imm] ); + buf = string_format("%s", s_allreg16[imm]); } op = oprom[ pos++ ]; @@ -1695,20 +1696,20 @@ static offs_t internal_disasm_tlcs900(cpu_device *device, std::ostream &stream, { case 0x00: /* 0xE0 */ imm = oprom[ pos++ ]; - sprintf( buf, "0x%02x", imm ); + buf = string_format("0x%02x", imm); break; case 0x01: /* 0xE1 */ imm = oprom[ pos++ ]; - imm = imm | ( oprom[ pos++ ] << 8 ); - sprintf( buf, "0x%04x", imm ); + imm = imm | (oprom[ pos++ ] << 8); + buf = string_format("0x%04x", imm); break; case 0x02: /* 0xE2 */ imm = oprom[ pos++ ]; - imm = imm | ( oprom[ pos++ ] << 8 ); - imm = imm | ( oprom[ pos++ ] << 16 ); - sprintf( buf, "0x%06x", imm ); + imm = imm | (oprom[ pos++ ] << 8); + imm = imm | (oprom[ pos++ ] << 16); + buf = string_format("0x%06x", imm); break; case 0x03: /* 0xE3 */ @@ -1716,18 +1717,18 @@ static offs_t internal_disasm_tlcs900(cpu_device *device, std::ostream &stream, switch( imm & 0x03 ) { case 0x00: - sprintf( buf, "%s", s_allreg32[imm] ); + buf = string_format("%s", s_allreg32[imm]); break; case 0x01: op = imm; imm = oprom[ pos++ ]; - imm = imm | ( oprom[ pos++ ] << 8 ); - sprintf( buf, "%s+0x%04x", s_allreg32[op], imm ); + imm = imm | (oprom[ pos++ ] << 8); + buf = string_format("%s+0x%04x", s_allreg32[op], imm); break; case 0x02: - sprintf( buf, "unknown" ); + buf = string_format("unknown"); break; case 0x03: @@ -1736,19 +1737,19 @@ static offs_t internal_disasm_tlcs900(cpu_device *device, std::ostream &stream, case 0x03: op = oprom[ pos++ ]; op1 = oprom[ pos++ ]; - sprintf( buf, "%s+%s", s_allreg32[op], s_allreg8[op1] ); + buf = string_format("%s+%s", s_allreg32[op], s_allreg8[op1]); break; case 0x07: op = oprom[ pos++ ]; op1 = oprom[ pos++ ]; - sprintf( buf, "%s+%s", s_allreg32[op], s_allreg16[op1] ); + buf = string_format("%s+%s", s_allreg32[op], s_allreg16[op1]); break; case 0x13: imm = oprom[ pos++ ]; - imm = imm | ( oprom[ pos++ ] << 8 ); - sprintf( buf, "0x%06x", pc + pos + (int16_t)imm ); + imm = imm | (oprom[ pos++ ] << 8); + buf = string_format("0x%06x", pc + pos + (int16_t)imm); break; } break; @@ -1757,12 +1758,12 @@ static offs_t internal_disasm_tlcs900(cpu_device *device, std::ostream &stream, case 0x04: /* 0xE4 */ imm = oprom[ pos++ ]; - sprintf( buf, "-%s", s_allreg32[imm] ); + buf = string_format("-%s", s_allreg32[imm]); break; case 0x05: /* 0xE5 */ imm = oprom[ pos++ ]; - sprintf( buf, "%s+", s_allreg32[imm] ); + buf = string_format("%s+", s_allreg32[imm]); break; } op = oprom[ pos++ ]; @@ -1772,12 +1773,12 @@ static offs_t internal_disasm_tlcs900(cpu_device *device, std::ostream &stream, case M_E8: if ( op & 0x08 ) { - sprintf( buf, "%s", s_reg32[ op & 0x07 ] ); + buf = string_format("%s", s_reg32[ op & 0x07 ]); } else { imm = oprom[ pos++ ]; - sprintf( buf, "%s", s_allreg32[imm] ); + buf = string_format("%s", s_allreg32[imm]); } op = oprom[ pos++ ]; dasm = &mnemonic_e8[ op ]; @@ -1788,20 +1789,20 @@ static offs_t internal_disasm_tlcs900(cpu_device *device, std::ostream &stream, { case 0x00: /* 0xF0 */ imm = oprom[ pos++ ]; - sprintf( buf, "0x%02x", imm ); + buf = string_format("0x%02x", imm); break; case 0x01: /* 0xF1 */ imm = oprom[ pos++ ]; - imm = imm | ( oprom[ pos++ ] << 8 ); - sprintf( buf, "0x%04x", imm ); + imm = imm | (oprom[ pos++ ] << 8); + buf = string_format("0x%04x", imm); break; case 0x02: /* 0xF2 */ imm = oprom[ pos++ ]; - imm = imm | ( oprom[ pos++ ] << 8 ); - imm = imm | ( oprom[ pos++ ] << 16 ); - sprintf( buf, "0x%06x", imm ); + imm = imm | (oprom[ pos++ ] << 8); + imm = imm | (oprom[ pos++ ] << 16); + buf = string_format("0x%06x", imm); break; case 0x03: /* 0xF3 */ @@ -1809,18 +1810,18 @@ static offs_t internal_disasm_tlcs900(cpu_device *device, std::ostream &stream, switch( imm & 0x03 ) { case 0x00: - sprintf( buf, "%s", s_allreg32[imm] ); + buf = string_format("%s", s_allreg32[imm]); break; case 0x01: op = imm; imm = oprom[ pos++ ]; - imm = imm | ( oprom[ pos++ ] << 8 ); - sprintf( buf, "%s+0x%04x", s_allreg32[op], imm ); + imm = imm | (oprom[ pos++ ] << 8); + buf = string_format("%s+0x%04x", s_allreg32[op], imm); break; case 0x02: - sprintf( buf, "unknown" ); + buf = string_format("unknown"); break; case 0x03: @@ -1829,19 +1830,19 @@ static offs_t internal_disasm_tlcs900(cpu_device *device, std::ostream &stream, case 0x03: op = oprom[ pos++ ]; op1 = oprom[ pos++ ]; - sprintf( buf, "%s+%s", s_allreg32[op], s_allreg8[op1] ); + buf = string_format("%s+%s", s_allreg32[op], s_allreg8[op1]); break; case 0x07: op = oprom[ pos++ ]; op1 = oprom[ pos++ ]; - sprintf( buf, "%s+%s", s_allreg32[op], s_allreg16[op1] ); + buf = string_format("%s+%s", s_allreg32[op], s_allreg16[op1]); break; case 0x13: imm = oprom[ pos++ ]; - imm = imm | ( oprom[ pos++ ] << 8 ); - sprintf( buf, "0x%06x", pc + pos + (int16_t)imm ); + imm = imm | (oprom[ pos++ ] << 8); + buf = string_format("0x%06x", pc + pos + (int16_t)imm); break; } break; @@ -1850,12 +1851,12 @@ static offs_t internal_disasm_tlcs900(cpu_device *device, std::ostream &stream, case 0x04: /* 0xF4 */ imm = oprom[ pos++ ]; - sprintf( buf, "-%s", s_allreg32[imm] ); + buf = string_format("-%s", s_allreg32[imm]); break; case 0x05: /* 0xF5 */ imm = oprom[ pos++ ]; - sprintf( buf, "%s+", s_allreg32[imm] ); + buf = string_format("%s+", s_allreg32[imm]); break; } op = oprom[ pos++ ]; @@ -1863,13 +1864,13 @@ static offs_t internal_disasm_tlcs900(cpu_device *device, std::ostream &stream, break; } - util::stream_format(stream, "%s", s_mnemonic[ dasm->mnemonic ] ); + util::stream_format(stream, "%s", s_mnemonic[ dasm->mnemonic ]); switch( dasm->mnemonic ) { - default: - /* maybe assert */ - break; + default: + /* maybe assert */ + break; case M_CALL: case M_CALR: flags = DASMFLAG_STEP_OVER; @@ -1887,27 +1888,27 @@ static offs_t internal_disasm_tlcs900(cpu_device *device, std::ostream &stream, break; case O_A: - util::stream_format(stream, " A" ); + util::stream_format(stream, " A"); break; case O_C8: - util::stream_format(stream, " %s", s_reg8[op & 0x07] ); + util::stream_format(stream, " %s", s_reg8[op & 0x07]); break; case O_C16: - util::stream_format(stream, " %s", s_reg16[op & 0x07] ); + util::stream_format(stream, " %s", s_reg16[op & 0x07]); break; case O_C32: - util::stream_format(stream, " %s", s_reg32[op & 0x07] ); + util::stream_format(stream, " %s", s_reg32[op & 0x07]); break; case O_MC16: - util::stream_format(stream, " %s", s_mulreg16[op & 0x07] ); + util::stream_format(stream, " %s", s_mulreg16[op & 0x07]); break; case O_CC: - util::stream_format(stream, " %s", s_cond[op & 0x0F] ); + util::stream_format(stream, " %s", s_cond[op & 0x0F]); break; case O_CR8: @@ -1915,19 +1916,19 @@ static offs_t internal_disasm_tlcs900(cpu_device *device, std::ostream &stream, switch( imm ) { case 0x22: - util::stream_format(stream, " DMAM0" ); + util::stream_format(stream, " DMAM0"); break; case 0x26: - util::stream_format(stream, " DMAM1" ); + util::stream_format(stream, " DMAM1"); break; case 0x2a: - util::stream_format(stream, " DMAM2" ); + util::stream_format(stream, " DMAM2"); break; case 0x2e: - util::stream_format(stream, " DMAM3" ); + util::stream_format(stream, " DMAM3"); break; default: - util::stream_format(stream, " unknown" ); + util::stream_format(stream, " unknown"); break; } break; @@ -1937,19 +1938,19 @@ static offs_t internal_disasm_tlcs900(cpu_device *device, std::ostream &stream, switch( imm ) { case 0x20: - util::stream_format(stream, " DMAC0" ); + util::stream_format(stream, " DMAC0"); break; case 0x24: - util::stream_format(stream, " DMAC1" ); + util::stream_format(stream, " DMAC1"); break; case 0x28: - util::stream_format(stream, " DMAC2" ); + util::stream_format(stream, " DMAC2"); break; case 0x2c: - util::stream_format(stream, " DMAC3" ); + util::stream_format(stream, " DMAC3"); break; default: - util::stream_format(stream, " unknown" ); + util::stream_format(stream, " unknown"); break; } break; @@ -1959,78 +1960,78 @@ static offs_t internal_disasm_tlcs900(cpu_device *device, std::ostream &stream, switch( imm ) { case 0x00: - util::stream_format(stream, " DMAS0" ); + util::stream_format(stream, " DMAS0"); break; case 0x04: - util::stream_format(stream, " DMAS1" ); + util::stream_format(stream, " DMAS1"); break; case 0x08: - util::stream_format(stream, " DMAS2" ); + util::stream_format(stream, " DMAS2"); break; case 0x0c: - util::stream_format(stream, " DMAS3" ); + util::stream_format(stream, " DMAS3"); break; case 0x10: - util::stream_format(stream, " DMAD0" ); + util::stream_format(stream, " DMAD0"); break; case 0x14: - util::stream_format(stream, " DMAD1" ); + util::stream_format(stream, " DMAD1"); break; case 0x18: - util::stream_format(stream, " DMAD2" ); + util::stream_format(stream, " DMAD2"); break; case 0x1c: - util::stream_format(stream, " DMAD3" ); + util::stream_format(stream, " DMAD3"); break; default: - util::stream_format(stream, " unknown" ); + util::stream_format(stream, " unknown"); break; } break; case O_D8: imm = oprom[ pos++ ]; - util::stream_format(stream, " 0x%06x", ( pc + pos + (int8_t)imm ) & 0xFFFFFF ); + util::stream_format(stream, " 0x%06x", ( pc + pos + (int8_t)imm ) & 0xFFFFFF); break; case O_D16: imm = oprom[ pos++ ]; - imm = imm | ( oprom[ pos++ ] << 8 ); - util::stream_format(stream, " 0x%06x", ( pc + pos + (int16_t)imm ) & 0xFFFFFF ); + imm = imm | (oprom[ pos++ ] << 8); + util::stream_format(stream, " 0x%06x", ( pc + pos + (int16_t)imm ) & 0xFFFFFF); break; case O_F: - util::stream_format(stream, " F" ); + util::stream_format(stream, " F"); break; case O_I3: - util::stream_format(stream, " %d", op & 0x07 ); + util::stream_format(stream, " %d", op & 0x07); break; case O_I8: imm = oprom[ pos++ ]; - util::stream_format(stream, " 0x%02x", imm ); + util::stream_format(stream, " 0x%02x", imm); break; case O_I16: imm = oprom[ pos++ ]; - imm = imm | ( oprom[ pos++ ] << 8 ); - util::stream_format(stream, " 0x%04x", imm ); + imm = imm | (oprom[ pos++ ] << 8); + util::stream_format(stream, " 0x%04x", imm); break; case O_I24: imm = oprom[ pos++ ]; - imm = imm | ( oprom[ pos++ ] << 8 ); - imm = imm | ( oprom[ pos++ ] << 16 ); - util::stream_format(stream, " 0x%06x", imm ); + imm = imm | (oprom[ pos++ ] << 8); + imm = imm | (oprom[ pos++ ] << 16); + util::stream_format(stream, " 0x%06x", imm); break; case O_I32: imm = oprom[ pos++ ]; - imm = imm | ( oprom[ pos++ ] << 8 ); - imm = imm | ( oprom[ pos++ ] << 16 ); - imm = imm | ( oprom[ pos++ ] << 24 ); - util::stream_format(stream, "0x%08x", imm ); + imm = imm | (oprom[ pos++ ] << 8); + imm = imm | (oprom[ pos++ ] << 16); + imm = imm | (oprom[ pos++ ] << 24); + util::stream_format(stream, "0x%08x", imm); break; case O_M: @@ -2039,31 +2040,31 @@ static offs_t internal_disasm_tlcs900(cpu_device *device, std::ostream &stream, case M_CALL: case M_JP: case M_LDA: - util::stream_format(stream, " %s", buf ); + util::stream_format(stream, " %s", buf); break; default: - util::stream_format(stream, " (%s)", buf ); + util::stream_format(stream, " (%s)", buf); break; } break; case O_M8: imm = oprom[ pos++ ]; - util::stream_format(stream, " (0x%02x)", imm ); + util::stream_format(stream, " (0x%02x)", imm); break; case O_M16: imm = oprom[ pos++ ]; - imm = imm | ( oprom[ pos++ ] << 8 ); - util::stream_format(stream, " (0x%04x)", imm ); + imm = imm | (oprom[ pos++ ] << 8); + util::stream_format(stream, " (0x%04x)", imm); break; case O_R: - util::stream_format(stream, " %s", buf ); + util::stream_format(stream, " %s", buf); break; case O_SR: - util::stream_format(stream, " SR" ); + util::stream_format(stream, " SR"); break; } @@ -2073,27 +2074,27 @@ static offs_t internal_disasm_tlcs900(cpu_device *device, std::ostream &stream, break; case O_A: - util::stream_format(stream, ",A" ); + util::stream_format(stream, ",A"); break; case O_C8: - util::stream_format(stream, ",%s", s_reg8[op & 0x07] ); + util::stream_format(stream, ",%s", s_reg8[op & 0x07]); break; case O_C16: - util::stream_format(stream, ",%s", s_reg16[op & 0x07] ); + util::stream_format(stream, ",%s", s_reg16[op & 0x07]); break; case O_C32: - util::stream_format(stream, ",%s", s_reg32[op & 0x07] ); + util::stream_format(stream, ",%s", s_reg32[op & 0x07]); break; case O_MC16: - util::stream_format(stream, ",%s", s_mulreg16[op & 0x07] ); + util::stream_format(stream, ",%s", s_mulreg16[op & 0x07]); break; case O_CC: - util::stream_format(stream, ",%s", s_cond[op & 0x0F] ); + util::stream_format(stream, ",%s", s_cond[op & 0x0F]); break; case O_CR8: @@ -2101,19 +2102,19 @@ static offs_t internal_disasm_tlcs900(cpu_device *device, std::ostream &stream, switch( imm ) { case 0x22: - util::stream_format(stream, ",DMAM0" ); + util::stream_format(stream, ",DMAM0"); break; case 0x26: - util::stream_format(stream, ",DMAM1" ); + util::stream_format(stream, ",DMAM1"); break; case 0x2a: - util::stream_format(stream, ",DMAM2" ); + util::stream_format(stream, ",DMAM2"); break; case 0x2e: - util::stream_format(stream, ",DMAM3" ); + util::stream_format(stream, ",DMAM3"); break; default: - util::stream_format(stream, ",unknown" ); + util::stream_format(stream, ",unknown"); break; } break; @@ -2123,19 +2124,19 @@ static offs_t internal_disasm_tlcs900(cpu_device *device, std::ostream &stream, switch( imm ) { case 0x20: - util::stream_format(stream, ",DMAC0" ); + util::stream_format(stream, ",DMAC0"); break; case 0x24: - util::stream_format(stream, ",DMAC1" ); + util::stream_format(stream, ",DMAC1"); break; case 0x28: - util::stream_format(stream, ",DMAC2" ); + util::stream_format(stream, ",DMAC2"); break; case 0x2c: - util::stream_format(stream, ",DMAC3" ); + util::stream_format(stream, ",DMAC3"); break; default: - util::stream_format(stream, ",unknown" ); + util::stream_format(stream, ",unknown"); break; } break; @@ -2145,78 +2146,78 @@ static offs_t internal_disasm_tlcs900(cpu_device *device, std::ostream &stream, switch( imm ) { case 0x00: - util::stream_format(stream, ",DMAS0" ); + util::stream_format(stream, ",DMAS0"); break; case 0x04: - util::stream_format(stream, ",DMAS1" ); + util::stream_format(stream, ",DMAS1"); break; case 0x08: - util::stream_format(stream, ",DMAS2" ); + util::stream_format(stream, ",DMAS2"); break; case 0x0c: - util::stream_format(stream, ",DMAS3" ); + util::stream_format(stream, ",DMAS3"); break; case 0x10: - util::stream_format(stream, ",DMAD0" ); + util::stream_format(stream, ",DMAD0"); break; case 0x14: - util::stream_format(stream, ",DMAD1" ); + util::stream_format(stream, ",DMAD1"); break; case 0x18: - util::stream_format(stream, ",DMAD2" ); + util::stream_format(stream, ",DMAD2"); break; case 0x1c: - util::stream_format(stream, ",DMAD3" ); + util::stream_format(stream, ",DMAD3"); break; default: - util::stream_format(stream, ",unknown" ); + util::stream_format(stream, ",unknown"); break; } break; case O_D8: imm = oprom[ pos++ ]; - util::stream_format(stream, ",0x%06x", ( pc + pos + (int8_t)imm ) & 0xFFFFFF ); + util::stream_format(stream, ",0x%06x", ( pc + pos + (int8_t)imm ) & 0xFFFFFF); break; case O_D16: imm = oprom[ pos++ ]; - imm = imm | ( oprom[ pos++ ] << 8 ); - util::stream_format(stream, ",0x%06x", ( pc + pos + (int16_t)imm ) & 0xFFFFFF ); + imm = imm | (oprom[ pos++ ] << 8); + util::stream_format(stream, ",0x%06x", ( pc + pos + (int16_t)imm ) & 0xFFFFFF); break; case O_F: - util::stream_format(stream, ",F'" ); + util::stream_format(stream, ",F'"); break; case O_I3: - util::stream_format(stream, ",%d", op & 0x07 ); + util::stream_format(stream, ",%d", op & 0x07); break; case O_I8: imm = oprom[ pos++ ]; - util::stream_format(stream, ",0x%02x", imm ); + util::stream_format(stream, ",0x%02x", imm); break; case O_I16: imm = oprom[ pos++ ]; - imm = imm | ( oprom[ pos++ ] << 8 ); - util::stream_format(stream, ",0x%04x", imm ); + imm = imm | (oprom[ pos++ ] << 8); + util::stream_format(stream, ",0x%04x", imm); break; case O_I24: imm = oprom[ pos++ ]; - imm = imm | ( oprom[ pos++ ] << 8 ); - imm = imm | ( oprom[ pos++ ] << 16 ); - util::stream_format(stream, ",0x%06x", imm ); + imm = imm | (oprom[ pos++ ] << 8); + imm = imm | (oprom[ pos++ ] << 16); + util::stream_format(stream, ",0x%06x", imm); break; case O_I32: imm = oprom[ pos++ ]; - imm = imm | ( oprom[ pos++ ] << 8 ); - imm = imm | ( oprom[ pos++ ] << 16 ); - imm = imm | ( oprom[ pos++ ] << 24 ); - util::stream_format(stream, ",0x%08x", imm ); + imm = imm | (oprom[ pos++ ] << 8); + imm = imm | (oprom[ pos++ ] << 16); + imm = imm | (oprom[ pos++ ] << 24); + util::stream_format(stream, ",0x%08x", imm); break; case O_M: @@ -2225,31 +2226,31 @@ static offs_t internal_disasm_tlcs900(cpu_device *device, std::ostream &stream, case M_CALL: case M_JP: case M_LDA: - util::stream_format(stream, ",%s", buf ); + util::stream_format(stream, ",%s", buf); break; default: - util::stream_format(stream, ",(%s)", buf ); + util::stream_format(stream, ",(%s)", buf); break; } break; case O_M8: imm = oprom[ pos++ ]; - util::stream_format(stream, ",(0x%02x)", imm ); + util::stream_format(stream, ",(0x%02x)", imm); break; case O_M16: imm = oprom[ pos++ ]; - imm = imm | ( oprom[ pos++ ] << 8 ); - util::stream_format(stream, ",(0x%04x)", imm ); + imm = imm | (oprom[ pos++ ] << 8); + util::stream_format(stream, ",(0x%04x)", imm); break; case O_R: - util::stream_format(stream, ",%s", buf ); + util::stream_format(stream, ",%s", buf); break; case O_SR: - util::stream_format(stream, ",SR" ); + util::stream_format(stream, ",SR"); break; } diff --git a/src/mame/drivers/hh_tms1k.cpp b/src/mame/drivers/hh_tms1k.cpp index 229eb2c8f9d..85b9d0842c6 100644 --- a/src/mame/drivers/hh_tms1k.cpp +++ b/src/mame/drivers/hh_tms1k.cpp @@ -2555,7 +2555,7 @@ MACHINE_CONFIG_END Entex Space Battle * TMS1000 EN-6004 MP0920 (die label 1000B, MP0920) - * x + * 2 7seg LEDs, and other LEDs behind bezel, 1-bit sound The Japanese version was published by Gakken, same name. @@ -2591,14 +2591,29 @@ public: void esbattle_state::prepare_display() { + // R8,R9 are 7segs + set_display_segmask(0x300, 0x7f); + display_matrix(8, 10, m_o, m_r); } WRITE16_MEMBER(esbattle_state::write_r) { + // R0,R1: input mux + m_inp_mux = data & 3; + + // R10: speaker out + m_speaker->level_w(data >> 10 & 1); + + // R0-R9: led select + m_r = data; + prepare_display(); } WRITE16_MEMBER(esbattle_state::write_o) { + // O0-O7: led state + m_o = data; + prepare_display(); } READ8_MEMBER(esbattle_state::read_k) @@ -2612,15 +2627,15 @@ READ8_MEMBER(esbattle_state::read_k) static INPUT_PORTS_START( esbattle ) PORT_START("IN.0") // R0 - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL PORT_NAME("P2 Fire 1") // F1 - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_COCKTAIL PORT_NAME("P2 Fire 2") // F2 - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_COCKTAIL PORT_NAME("P2 Launch") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) - - PORT_START("IN.1") // R1 PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("P1 Fire 1") // F1 PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("P1 Fire 2") // F2 PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("P1 Launch") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) + + PORT_START("IN.1") // R1 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_COCKTAIL PORT_NAME("P2 Fire 1") // F1 + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_COCKTAIL PORT_NAME("P2 Fire 2") // F2 + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_COCKTAIL PORT_NAME("P2 Launch") PORT_CONFNAME( 0x08, 0x08, "Players" ) PORT_CONFSETTING( 0x08, "1" ) // Auto PORT_CONFSETTING( 0x00, "2" ) // Manual @@ -2629,7 +2644,7 @@ INPUT_PORTS_END static MACHINE_CONFIG_START( esbattle, esbattle_state ) /* basic machine hardware */ - MCFG_CPU_ADD("maincpu", TMS1000, 350000) // approximation - RC osc. R=47K, C=33pf + MCFG_CPU_ADD("maincpu", TMS1000, 425000) // approximation - RC osc. R=47K, C=33pf MCFG_TMS1XXX_READ_K_CB(READ8(esbattle_state, read_k)) MCFG_TMS1XXX_WRITE_R_CB(WRITE16(esbattle_state, write_r)) MCFG_TMS1XXX_WRITE_O_CB(WRITE16(esbattle_state, write_o)) @@ -6466,7 +6481,7 @@ INPUT_PORTS_END static MACHINE_CONFIG_START( monkeysee, monkeysee_state ) /* basic machine hardware */ - MCFG_CPU_ADD("maincpu", TMS1000, 225000) // approximation - RC osc. R=68K, C=47pf + MCFG_CPU_ADD("maincpu", TMS1000, 250000) // approximation - RC osc. R=68K, C=47pf MCFG_TMS1XXX_READ_K_CB(READ8(monkeysee_state, read_k)) MCFG_TMS1XXX_WRITE_R_CB(WRITE16(monkeysee_state, write_r)) MCFG_TMS1XXX_WRITE_O_CB(WRITE16(monkeysee_state, write_o)) diff --git a/src/mame/drivers/wmg.cpp b/src/mame/drivers/wmg.cpp index 8b0baba54f7..07f5ae8e726 100644 --- a/src/mame/drivers/wmg.cpp +++ b/src/mame/drivers/wmg.cpp @@ -84,197 +84,36 @@ public: wmg_state(const machine_config &mconfig, device_type type, const char *tag) : williams_state(mconfig, type, tag) , m_p_ram(*this, "nvram") + , m_pia0(*this, "pia_0") + , m_pia1(*this, "pia_1") + , m_keyboard(*this, "X%d", 0) { } - DECLARE_WRITE8_MEMBER(wmg_rombank_w); DECLARE_MACHINE_RESET(wmg); DECLARE_DRIVER_INIT(wmg); - uint8_t m_wmg_bank; - uint8_t m_wmg_def_bank; - uint8_t m_wmg_port_select; - uint8_t m_wmg_vram_bank; DECLARE_READ8_MEMBER(wmg_nvram_r); DECLARE_WRITE8_MEMBER(wmg_nvram_w); DECLARE_READ8_MEMBER(wmg_pia_0_r); - DECLARE_WRITE8_MEMBER(wmg_def_rombank_w); + DECLARE_WRITE8_MEMBER(wmg_c400_w); + DECLARE_WRITE8_MEMBER(wmg_d000_w); DECLARE_WRITE_LINE_MEMBER(wmg_port_select_w); DECLARE_WRITE8_MEMBER(wmg_sound_reset_w); DECLARE_WRITE8_MEMBER(wmg_vram_select_w); DECLARE_CUSTOM_INPUT_MEMBER(wmg_mux_r); - void wmg_def_install_io_space(address_space &space); - required_shared_ptr<uint8_t> m_p_ram; -}; - - -/************************************* - * - * NVRAM (8k x 8), banked - * - *************************************/ -READ8_MEMBER( wmg_state::wmg_nvram_r ) -{ - return m_p_ram[offset+(m_wmg_bank<<10)]; -} - -WRITE8_MEMBER( wmg_state::wmg_nvram_w ) -{ - m_p_ram[offset+(m_wmg_bank<<10)] = data; -} - -/************************************* - * - * Bankswitching - * - *************************************/ - -/* switches the banks around when given a game number. - The hardware has a lock feature, so that once a bank is selected, the next choice must be the menu */ - -WRITE8_MEMBER( wmg_state::wmg_rombank_w ) -{ - address_space &space1 = m_maincpu->space(AS_PROGRAM); - uint8_t *RAM = memregion("maincpu")->base(); - - data &= 7; - - if ((!data) || (!m_wmg_bank)) // we must be going to/from the menu - { - m_wmg_bank = data; - wmg_def_rombank_w( space1, 0, 0); - memcpy( &RAM[0x10000], &RAM[(data << 16) + 0x20000], 0x9000 ); /* Gfx etc */ - membank("bank5")->set_entry(data); /* Code */ - membank("bank6")->set_entry(data); /* Sound */ - } -} - -WRITE8_MEMBER( wmg_state::wmg_sound_reset_w ) -{ - /* This resets the sound card when bit 0 is low */ - if (!BIT(data, 0)) m_soundcpu->reset(); -} - -WRITE8_MEMBER( wmg_state::wmg_vram_select_w ) -{ - /* VRAM/ROM banking from bit 0 */ - m_wmg_vram_bank = BIT(data, 0); - membank("bank1")->set_entry(m_wmg_vram_bank); - - /* cocktail flip from bit 1 */ - m_cocktail = BIT(data, 1); -} - -void wmg_state::wmg_def_install_io_space(address_space &space) -{ - pia6821_device *pia_0 = space.machine().device<pia6821_device>("pia_0"); - pia6821_device *pia_1 = space.machine().device<pia6821_device>("pia_1"); - - /* this routine dynamically installs the memory mapped above from c000-cfff */ - space.install_write_bank (0xc000, 0xc00f, "bank4"); - space.install_write_handler (0xc010, 0xc01f, write8_delegate(FUNC(williams_state::defender_video_control_w),this)); - space.install_write_handler (0xc400, 0xc400, write8_delegate(FUNC(wmg_state::wmg_rombank_w),this)); - space.install_write_handler (0xc401, 0xc401, write8_delegate(FUNC(wmg_state::wmg_sound_reset_w),this)); - space.install_readwrite_handler(0xc804, 0xc807, read8_delegate(FUNC(wmg_state::wmg_pia_0_r),this), write8_delegate(FUNC(pia6821_device::write), pia_0)); - space.install_readwrite_handler(0xc80c, 0xc80f, read8_delegate(FUNC(pia6821_device::read), pia_1), write8_delegate(FUNC(pia6821_device::write), pia_1)); - space.install_write_handler (0xc900, 0xc9ff, write8_delegate(FUNC(wmg_state::wmg_vram_select_w),this)); - space.install_write_handler (0xca00, 0xca07, write8_delegate(FUNC(williams_state::williams_blitter_w),this)); - space.install_write_handler (0xcbff, 0xcbff, write8_delegate(FUNC(williams_state::williams_watchdog_reset_w),this)); - space.install_read_handler (0xcb00, 0xcbff, read8_delegate(FUNC(williams_state::williams_video_counter_r),this)); - space.install_readwrite_handler(0xcc00, 0xcfff, read8_delegate(FUNC(wmg_state::wmg_nvram_r), this), write8_delegate(FUNC(wmg_state::wmg_nvram_w),this)); - membank("bank4")->set_base(m_generic_paletteram_8); -} - -WRITE8_MEMBER( wmg_state::wmg_def_rombank_w ) -{ - address_space &space1 = m_maincpu->space(AS_PROGRAM); - data &= 15; - - if ((m_wmg_def_bank != data) && (m_wmg_bank == 5) && (data != 0)) - { - m_wmg_def_bank = data; - - /* set bank address */ - switch (data) - { - /* pages 1,2,3,7 map to ROM banks */ - case 1: - case 2: - case 3: - space1.install_read_bank(0xc000, 0xcfff, "bank7"); - space1.unmap_write(0xc000, 0xcfff); - membank("bank7")->set_entry(data); - break; - - case 7: - space1.install_read_bank(0xc000, 0xcfff, "bank7"); - space1.unmap_write(0xc000, 0xcfff); - membank("bank7")->set_entry(4); - break; - - default: - printf("Unknown bank %X selected\n",data); - } - } - else if ((m_wmg_def_bank != data) && (!data)) - { - /* page 0 is I/O space */ - m_wmg_def_bank = data; - wmg_def_install_io_space(space1); - } -} - - -MACHINE_RESET_MEMBER( wmg_state, wmg ) -{ - address_space &space1 = m_maincpu->space(AS_PROGRAM); - m_wmg_bank=0; - m_wmg_def_bank=8; - m_wmg_port_select=0; - m_wmg_vram_bank=0; - wmg_rombank_w( space1, 0, 0); - MACHINE_RESET_CALL_MEMBER(williams_common); - m_maincpu->reset(); -} - -/************************************* - * - * Input selector code - * - *************************************/ - -WRITE_LINE_MEMBER( wmg_state::wmg_port_select_w ) -{ - m_wmg_port_select = state | (m_wmg_bank << 1); -} -CUSTOM_INPUT_MEMBER(wmg_state::wmg_mux_r) -{ - const char *tag = (const char *)param; +private: - if (m_wmg_port_select) - for (int i = 0; i < m_wmg_port_select; i++) - tag += strlen(tag) + 1; - - return ioport(tag)->read(); -} - -READ8_MEMBER( wmg_state::wmg_pia_0_r ) -{ -/* if player presses P1 and P2 in a game, return to the menu. - Since there is no code in rom to handle this, it must be a hardware feature - which probably just resets the cpu. */ - - address_space &space1 = m_maincpu->space(AS_PROGRAM); - pia6821_device *pia_0 = space1.machine().device<pia6821_device>("pia_0"); - uint8_t data = pia_0->read(space1, offset); + uint8_t m_wmg_c400; + uint8_t m_wmg_d000; + uint8_t m_wmg_port_select; + uint8_t m_wmg_vram_bank; + required_shared_ptr<uint8_t> m_p_ram; + required_device<pia6821_device> m_pia0; + required_device<pia6821_device> m_pia1; + required_ioport_array<17> m_keyboard; +}; - if ((m_wmg_bank) && (!offset) && ((data & 0x30) == 0x30)) // P1 and P2 pressed - { - wmg_rombank_w( space1, 0, 0); - m_maincpu->reset(); - } - return data; -} /************************************* * @@ -286,7 +125,7 @@ static ADDRESS_MAP_START( wmg_cpu1, AS_PROGRAM, 8, wmg_state ) AM_RANGE(0x9000, 0xbfff) AM_RAM AM_RANGE(0xc000, 0xcfff) AM_ROMBANK("bank7") AM_RANGE(0xd000, 0xffff) AM_ROMBANK("bank5") - AM_RANGE(0xd000, 0xd000) AM_WRITE(wmg_def_rombank_w) + AM_RANGE(0xd000, 0xd000) AM_WRITE(wmg_d000_w) ADDRESS_MAP_END static ADDRESS_MAP_START( wmg_cpu2, AS_PROGRAM, 8, wmg_state ) @@ -299,17 +138,20 @@ static ADDRESS_MAP_START( wmg_cpu2, AS_PROGRAM, 8, wmg_state ) AM_RANGE(0xf000, 0xffff) AM_ROMBANK("bank6") ADDRESS_MAP_END -/****************************************** +/*************************************************************** * * Inputs, banked. One set for each game. + * Note: defaults from original games are used. + * JOYSTICK PLAYER(1) is really JOYSTICKLEFT on WMG hardware + * JOYSTICK PLAYER(2) is really JOYSTICKRIGHT on WMG hardware * - ******************************************/ + ***************************************************************/ static INPUT_PORTS_START( wmg ) PORT_START("IN0") - PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, wmg_state, wmg_mux_r, "IN000\0IN000\0IN100\0IN100\0IN202\0IN201\0IN300\0IN300\0IN400\0IN400\0IN500\0IN500\0IN602\0IN601\0IN400\0IN400") + PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, wmg_state, wmg_mux_r, "0") PORT_START("IN1") - PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, wmg_state, wmg_mux_r, "IN010\0IN010\0IN110\0IN110\0IN210\0IN210\0IN310\0IN310\0IN410\0IN410\0IN510\0IN510\0IN612\0IN611\0IN410\0IN410") + PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, wmg_state, wmg_mux_r, "1") PORT_START("IN2") PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Auto Up / Manual Down") PORT_TOGGLE PORT_CODE(KEYCODE_F1) @@ -322,17 +164,17 @@ static INPUT_PORTS_START( wmg ) PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNKNOWN ) /* menu */ - PORT_START("IN000") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_UP ) PORT_8WAY PORT_NAME("Menu/Left/Up") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_DOWN ) PORT_8WAY PORT_NAME("Menu/Left/Down") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_LEFT ) PORT_8WAY PORT_NAME("Menu/Left/Left") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_RIGHT ) PORT_8WAY PORT_NAME("Menu/Left/Right") + PORT_START("X0") // IN000 (game,port,player) + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_8WAY PORT_NAME("Menu/Left/Up") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_NAME("Menu/Left/Down") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_NAME("Menu/Left/Left") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_NAME("Menu/Left/Right") PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_START1 ) PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_START2 ) PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_UP ) PORT_8WAY PORT_NAME("Menu/Right/Up") PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_DOWN ) PORT_8WAY PORT_NAME("Menu/Right/Down") - PORT_START("IN010") + PORT_START("X1") // IN010 PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_LEFT ) PORT_8WAY PORT_NAME("Menu/Right/Left") PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_RIGHT ) PORT_8WAY PORT_NAME("Menu/Right/Right") PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Menu/Fire") @@ -343,43 +185,43 @@ static INPUT_PORTS_START( wmg ) PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_NAME("Menu/Inviso or Flap") /* robotron */ - PORT_START("IN100") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_UP ) PORT_8WAY PORT_NAME("Robotron/Left/Up") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_DOWN ) PORT_8WAY PORT_NAME("Robotron/Left/Down") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_LEFT ) PORT_8WAY PORT_NAME("Robotron/Left/Left") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_RIGHT ) PORT_8WAY PORT_NAME("Robotron/Left/Right") + PORT_START("X2") // IN100 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_8WAY PORT_NAME("Robotron/Left/Move Up") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_NAME("Robotron/Left/Move Down") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_NAME("Robotron/Left/Move Left") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_NAME("Robotron/Left/Move Right") PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_START2 ) PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_START1 ) - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_UP ) PORT_8WAY PORT_NAME("Robotron/Right/Up") - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_DOWN ) PORT_8WAY PORT_NAME("Robotron/Right/Down") + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_UP ) PORT_8WAY PORT_NAME("Robotron/Right/Fire Up") + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_DOWN ) PORT_8WAY PORT_NAME("Robotron/Right/Fire Down") - PORT_START("IN110") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_LEFT ) PORT_8WAY PORT_NAME("Robotron/Right/Left") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_RIGHT ) PORT_8WAY PORT_NAME("Robotron/Right/Right") + PORT_START("X3") // IN110 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_LEFT ) PORT_8WAY PORT_NAME("Robotron/Right/Fire Left") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_RIGHT ) PORT_8WAY PORT_NAME("Robotron/Right/Fire Right") PORT_BIT( 0xfc, IP_ACTIVE_HIGH, IPT_UNKNOWN ) /* joust */ - PORT_START("IN201") /* muxed into IN0 */ - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_LEFT ) PORT_2WAY PORT_NAME("Joust/P1/Left") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_RIGHT ) PORT_2WAY PORT_NAME("Joust/P1/Right") + PORT_START("X4") // IN201 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_2WAY PORT_PLAYER(1) PORT_NAME("Joust/P1/Left") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_2WAY PORT_PLAYER(1) PORT_NAME("Joust/P1/Right") PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_NAME("Joust/P1/Flap") PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_START2 ) PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_START1 ) PORT_BIT( 0xc8, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_START("IN202") /* muxed into IN0 */ - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_LEFT ) PORT_2WAY PORT_NAME("Joust/P2/Left") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_RIGHT ) PORT_2WAY PORT_NAME("Joust/P2/Right") + PORT_START("X5") // IN202 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_2WAY PORT_PLAYER(2) PORT_NAME("Joust/P2/Left") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_2WAY PORT_PLAYER(2) PORT_NAME("Joust/P2/Right") PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Joust/P2/Flap") PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_START2 ) PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_START1 ) PORT_BIT( 0xc8, IP_ACTIVE_HIGH, IPT_UNUSED ) - PORT_START("IN210") + PORT_START("X6") // IN210 PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_UNUSED ) /* stargate */ - PORT_START("IN300") + PORT_START("X7") // IN300 PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Stargate/Fire") PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Stargate/Thrust") PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Stargate/Smart Bomb") @@ -387,28 +229,28 @@ static INPUT_PORTS_START( wmg ) PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_START2 ) PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_START1 ) PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME("Stargate/Reverse") - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_DOWN ) PORT_2WAY PORT_NAME("Stargate/Down") + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_2WAY PORT_NAME("Stargate/Down") - PORT_START("IN310") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_UP ) PORT_2WAY PORT_NAME("Stargate/Up") + PORT_START("X8") // IN310 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_2WAY PORT_NAME("Stargate/Up") PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_NAME("Stargate/Inviso") PORT_BIT( 0xfc, IP_ACTIVE_HIGH, IPT_UNKNOWN ) /* bubbles */ - PORT_START("IN400") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_UP ) PORT_8WAY PORT_NAME("Bubbles/Up") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_DOWN ) PORT_8WAY PORT_NAME("Bubbles/Down") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_LEFT ) PORT_8WAY PORT_NAME("Bubbles/Left") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_RIGHT ) PORT_8WAY PORT_NAME("Bubble/Right") + PORT_START("X9") // IN400 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_8WAY PORT_NAME("Bubbles/Up") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_NAME("Bubbles/Down") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_NAME("Bubbles/Left") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_NAME("Bubble/Right") PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_START2 ) PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_START1 ) PORT_BIT( 0xc0, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_START("IN410") + PORT_START("X10") // IN410 PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_UNKNOWN ) /* defender */ - PORT_START("IN500") + PORT_START("X11") // IN500 PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Defender/Fire") PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Defender/Thrust") PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Defender/Smart Bomb") @@ -416,39 +258,231 @@ static INPUT_PORTS_START( wmg ) PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_START2 ) PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_START1 ) PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME("Defender/Reverse") - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_DOWN) PORT_2WAY PORT_NAME("Defender/Down") + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN) PORT_2WAY PORT_NAME("Defender/Down") - PORT_START("IN510") - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_UP ) PORT_2WAY PORT_NAME("Defender/Up") + PORT_START("X12") // IN510 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_2WAY PORT_NAME("Defender/Up") PORT_BIT( 0xfe, IP_ACTIVE_HIGH, IPT_UNKNOWN ) /* splat - there are no P2 controls, so it can only be played by a single player */ - PORT_START("IN601") /* muxed into IN0 */ - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_UP ) PORT_8WAY PORT_PLAYER(1) PORT_NAME("Splat/P1/Left/Up") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_DOWN ) PORT_8WAY PORT_PLAYER(1) PORT_NAME("Splat/P1/Left/Down") - PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_LEFT ) PORT_8WAY PORT_PLAYER(1) PORT_NAME("Splat/P1/Left/Left") - PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICKLEFT_RIGHT ) PORT_8WAY PORT_PLAYER(1) PORT_NAME("Splat/P1/Left/Right") + PORT_START("X13") // IN601 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(1) PORT_NAME("Splat/P1/Left/Move Up") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(1) PORT_NAME("Splat/P1/Left/Move Down") + PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(1) PORT_NAME("Splat/P1/Left/Move Left") + PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(1) PORT_NAME("Splat/P1/Left/Move Right") PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_START1 ) PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_START2 ) - PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_UP ) PORT_8WAY PORT_PLAYER(1) PORT_NAME("Splat/P1/Right/Up") - PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_DOWN ) PORT_8WAY PORT_PLAYER(1) PORT_NAME("Splat/P1/Right/Down") + PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_UP ) PORT_8WAY PORT_PLAYER(1) PORT_NAME("Splat/P1/Right/Fire Up") + PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_DOWN ) PORT_8WAY PORT_PLAYER(1) PORT_NAME("Splat/P1/Right/Fire Down") - PORT_START("IN602") /* muxed into IN0 */ + PORT_START("X14") // IN602 PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_START1 ) PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_START2 ) PORT_BIT( 0xcf, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_START("IN611") /* muxed into IN1 */ - PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_LEFT ) PORT_8WAY PORT_PLAYER(1) PORT_NAME("Splat/P1/Right/Left") - PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_RIGHT ) PORT_8WAY PORT_PLAYER(1) PORT_NAME("Splat/P1/Right/Right") + PORT_START("X15") // IN611 + PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_LEFT ) PORT_8WAY PORT_PLAYER(1) PORT_NAME("Splat/P1/Right/Fire Left") + PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICKRIGHT_RIGHT ) PORT_8WAY PORT_PLAYER(1) PORT_NAME("Splat/P1/Right/Fire Right") PORT_BIT( 0xfc, IP_ACTIVE_HIGH, IPT_UNKNOWN ) - PORT_START("IN612") /* muxed into IN1 */ + PORT_START("X16") // IN612 PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_UNKNOWN ) INPUT_PORTS_END /************************************* * + * NVRAM (8k x 8), banked + * + *************************************/ +READ8_MEMBER( wmg_state::wmg_nvram_r ) +{ + return m_p_ram[offset+(m_wmg_c400<<10)]; +} + +WRITE8_MEMBER( wmg_state::wmg_nvram_w ) +{ + m_p_ram[offset+(m_wmg_c400<<10)] = data; +} + +/************************************* + * + * Bankswitching + * + *************************************/ + +/* switches the banks around when given a game number. + The hardware has a lock feature, so that once a bank is selected, the next choice must be the menu */ + +WRITE8_MEMBER( wmg_state::wmg_c400_w ) +{ + data &= 7; + if (m_wmg_c400 == data) + return; + + if ((data == 0) || (m_wmg_c400 == 0)) // we must be going to/from the menu + { + m_wmg_c400 = data; + wmg_d000_w( space, 0, 0); // select i/o + uint8_t *cpu = memregion("maincpu")->base(); + memcpy( &cpu[0x10000], &cpu[(data << 16) + 0x20000], 0x9000 ); // Gfx etc + membank("bank5")->set_entry(data); // Code + membank("bank6")->set_entry(data); // Sound + m_soundcpu->reset(); + } +} + +WRITE8_MEMBER( wmg_state::wmg_sound_reset_w ) +{ + /* This resets the sound card when bit 0 is low */ + if (!BIT(data, 0)) m_soundcpu->reset(); +} + +WRITE8_MEMBER( wmg_state::wmg_vram_select_w ) +{ + /* VRAM/ROM banking from bit 0 */ + m_wmg_vram_bank = BIT(data, 0); + membank("bank1")->set_entry(m_wmg_vram_bank); + + /* cocktail flip from bit 1 */ + m_cocktail = BIT(data, 1); +} + + +// if defender, choose a rom, else enable i/o +WRITE8_MEMBER( wmg_state::wmg_d000_w ) +{ + data &= 15; + if (m_wmg_d000 == data) + return; + + // defender && data > 0 + if ((m_wmg_c400 == 5) && (data)) + { + // replace i/o with defender roms + if (m_wmg_d000 == 0) // was i/o? + { + space.install_read_bank(0xc000, 0xcfff, "bank7"); + space.unmap_write(0xc000, 0xcfff); + } + + switch (data) + { + /* pages 1,2,3,7 map to ROM banks */ + case 1: + case 2: + case 3: + membank("bank7")->set_entry(data); + break; + + case 7: + membank("bank7")->set_entry(4); + break; + + default: + printf("Unknown bank %X selected\n",data); + } + } + else + // everything else - choose i/o space + if (data == 0) + { + /* install the i/o devices into c000-cfff */ + pia6821_device *pia0 = m_pia0; + pia6821_device *pia1 = m_pia1; + + space.unmap_read(0xc000, 0xcfff); // throw out bank7 + space.install_write_bank (0xc000, 0xc00f, "bank4"); + membank("bank4")->set_base(m_generic_paletteram_8); + space.install_write_handler (0xc010, 0xc01f, write8_delegate(FUNC(williams_state::defender_video_control_w),this)); + space.install_write_handler (0xc400, 0xc400, write8_delegate(FUNC(wmg_state::wmg_c400_w),this)); + space.install_write_handler (0xc401, 0xc401, write8_delegate(FUNC(wmg_state::wmg_sound_reset_w),this)); + space.install_readwrite_handler(0xc804, 0xc807, read8_delegate(FUNC(wmg_state::wmg_pia_0_r),this), write8_delegate(FUNC(pia6821_device::write), pia0)); + space.install_readwrite_handler(0xc80c, 0xc80f, read8_delegate(FUNC(pia6821_device::read), pia1), write8_delegate(FUNC(pia6821_device::write), pia1)); + space.install_write_handler (0xc900, 0xc9ff, write8_delegate(FUNC(wmg_state::wmg_vram_select_w),this)); + space.install_write_handler (0xca00, 0xca07, write8_delegate(FUNC(williams_state::williams_blitter_w),this)); + space.install_write_handler (0xcbff, 0xcbff, write8_delegate(FUNC(williams_state::williams_watchdog_reset_w),this)); + space.install_read_handler (0xcb00, 0xcbff, read8_delegate(FUNC(williams_state::williams_video_counter_r),this)); + space.install_readwrite_handler(0xcc00, 0xcfff, read8_delegate(FUNC(wmg_state::wmg_nvram_r), this), write8_delegate(FUNC(wmg_state::wmg_nvram_w),this)); + } + + m_wmg_d000 = data; +} + + +MACHINE_RESET_MEMBER( wmg_state, wmg ) +{ + address_space &space1 = m_maincpu->space(AS_PROGRAM); + m_wmg_c400=0xff; + m_wmg_d000=0xff; + m_wmg_port_select=0; + m_wmg_vram_bank=0; + wmg_c400_w( space1, 0, 0); + MACHINE_RESET_CALL_MEMBER(williams_common); + m_maincpu->reset(); +} + +/************************************* + * + * Input selector code + * + *************************************/ + +WRITE_LINE_MEMBER( wmg_state::wmg_port_select_w ) +{ + m_wmg_port_select = state | (m_wmg_c400 << 1); +} + +CUSTOM_INPUT_MEMBER(wmg_state::wmg_mux_r) +{ + const char *port = (const char *)param; + + if (port[0] == '0') + { + uint8_t ports[17] = { 0,0,2,2,5,4,7,7,9,9,11,11,14,13,9,9 }; + return m_keyboard[ports[m_wmg_port_select]]->read(); + } + else + { + uint8_t ports[17] = { 1,1,3,3,6,6,8,8,10,10,12,12,16,15,10,10 }; + return m_keyboard[ports[m_wmg_port_select]]->read(); + } +} + +READ8_MEMBER( wmg_state::wmg_pia_0_r ) +{ +/* if player presses P1 and P2 in a game, return to the menu. + Since there is no code in rom to handle this, it must be a hardware feature + which probably just resets the cpu. */ + + uint8_t data = m_pia0->read(space, offset); + + if ((m_wmg_c400) && (offset == 0) && ((data & 0x30) == 0x30)) // P1 and P2 pressed + { + wmg_c400_w( space, 0, 0); + m_maincpu->reset(); + } + + return data; +} + +/************************************* + * + * Driver Initialisation + * + *************************************/ +DRIVER_INIT_MEMBER( wmg_state, wmg ) +{ + uint8_t *cpu = memregion("maincpu")->base(); + uint8_t *snd = memregion("soundcpu")->base(); + membank("bank5")->configure_entries(0, 8, &cpu[0x2d000], 0x10000); // Code + membank("bank6")->configure_entries(0, 8, &snd[0x10000], 0x1000); // Sound + membank("bank7")->configure_entries(1, 4, &cpu[0x78000], 0x1000); // Defender roms + m_blitter_config = WILLIAMS_BLITTER_SC01; + m_blitter_clip_address = 0xc000; +} + +/************************************* + * * Machine Driver * *************************************/ @@ -505,29 +539,12 @@ MACHINE_CONFIG_END /************************************* * - * Driver Initialisation - * - *************************************/ -DRIVER_INIT_MEMBER( wmg_state, wmg ) -{ - uint8_t *RAM = memregion("maincpu")->base(); - uint8_t *ROM = memregion("soundcpu")->base(); - membank("bank5")->configure_entries(0, 8, &RAM[0x2d000], 0x10000); /* Code */ - membank("bank6")->configure_entries(0, 8, &ROM[0x10000], 0x1000); /* Sound */ - membank("bank7")->configure_entries(1, 4, &RAM[0x78000], 0x1000); /* Defender roms */ -// CONFIGURE_BLITTER(WILLIAMS_BLITTER_SC01, 0xc000); - m_blitter_config = WILLIAMS_BLITTER_SC01; - m_blitter_clip_address = 0xc000; -} - -/************************************* - * * Roms * *************************************/ ROM_START( wmg ) ROM_REGION( 0xa0000, "maincpu", 0 ) - ROM_LOAD( "wmg.cpu", 0x20000, 0x80000, CRC(975516ec) SHA1(571aaf9bff8ebfc36448cd9394b47bcfae7d1b83) ) + ROM_LOAD( "wmg.cpu", 0x20000, 0x80000, CRC(975516ec) SHA1(571aaf9bff8ebfc36448cd9394b47bcfae7d1b83) ) /* This little HACK! lets the menu boot up. It patches a jump to some new code, which sets a few memory locations, and sets the stack pointer. |