summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--src/devices/cpu/pdp1/tx0dasm.cpp78
-rw-r--r--src/devices/cpu/pps4/pps4dasm.cpp32
-rw-r--r--src/devices/cpu/sm510/sm510d.cpp24
-rw-r--r--src/devices/cpu/tlcs900/dasm900.cpp359
-rw-r--r--src/mame/drivers/hh_tms1k.cpp33
-rw-r--r--src/mame/drivers/wmg.cpp513
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.