Merged i8x41 (UPI-41) core into MCS-48 core:

* all code now lives in mcs48.c
 * rewrote disassembler as unified MCS-48/UPI-41 disassembler
 * changed UPI-41 interfaces to match MCS-48
 * added new master read/write interfaces for external access
 * unified interface to 8243 expander chip
 * converted tnzs and decocass to the new interfaces

DECO Cassette fixes/cleanups:
 * converted tape handling to a device
 * changed tape handling to use a timer callback
 * updated to work with new UPI-41 core
 * corrected clock speeds for all chips (esp. the 8041)
 * fixed very wrong CRC implementation (how did it ever work?)
 * corrected sound IRQ rate
 * corrected video timing

Burger Time hardware fixes:
 * corrected sound IRQ rate and handling
 * removed lnc audio reset hack
 * full audio memory maps based on schematics
 * corrected video timing
This commit is contained in:
Aaron Giles 2008-12-30 00:24:06 +00:00
parent 33e828c111
commit 528d5b6528
19 changed files with 2161 additions and 4884 deletions

4
.gitattributes vendored
View File

@ -166,10 +166,6 @@ src/emu/cpu/i86/table86.h svneol=native#text/plain
src/emu/cpu/i860/i860.c svneol=native#text/plain
src/emu/cpu/i860/i860.h svneol=native#text/plain
src/emu/cpu/i860/i860dasm.c svneol=native#text/plain
src/emu/cpu/i8x41/8x41dasm.c svneol=native#text/plain
src/emu/cpu/i8x41/i8x41.c svneol=native#text/plain
src/emu/cpu/i8x41/i8x41.h svneol=native#text/plain
src/emu/cpu/i8x41/i8x41ops.c svneol=native#text/plain
src/emu/cpu/i960/i960.c svneol=native#text/plain
src/emu/cpu/i960/i960.h svneol=native#text/plain
src/emu/cpu/i960/i960dis.c svneol=native#text/plain

View File

@ -671,27 +671,6 @@ $(CPUOBJ)/mcs48/mcs48.o: $(CPUSRC)/mcs48/mcs48.c \
#-------------------------------------------------
# Intel 8x41
#-------------------------------------------------
CPUDEFS += -DHAS_I8041=$(if $(filter I8041,$(CPUS)),1,0)
CPUDEFS += -DHAS_I8741=$(if $(filter I8741,$(CPUS)),1,0)
CPUDEFS += -DHAS_I8042=$(if $(filter I8042,$(CPUS)),1,0)
CPUDEFS += -DHAS_I8242=$(if $(filter I8242,$(CPUS)),1,0)
CPUDEFS += -DHAS_I8742=$(if $(filter I8742,$(CPUS)),1,0)
ifneq ($(filter I8041 I8741 I8042 I8242 I8742 ,$(CPUS)),)
OBJDIRS += $(CPUOBJ)/i8x41
CPUOBJS += $(CPUOBJ)/i8x41/i8x41.o
DBGOBJS += $(CPUOBJ)/i8x41/8x41dasm.o
endif
$(CPUOBJ)/i8x41/i8x41.o: $(CPUSRC)/i8x41/i8x41.c \
$(CPUSRC)/i8x41/i8x41.h
#-------------------------------------------------
# Intel 8051 and derivatives
#-------------------------------------------------

View File

@ -1,523 +0,0 @@
#include "debugger.h"
#include "i8x41.h"
CPU_DISASSEMBLE( i8x41 )
{
UINT32 flags = 0;
unsigned PC = pc;
UINT8 op;
UINT8 arg;
op = oprom[PC++ - pc];
switch( op )
{
case 0x00: /* 1: 0000 0000 */
sprintf(buffer, "nop");
break;
case 0x01: /* 1: 0000 0001 */
sprintf(buffer, "ill");
break;
case 0x02: /* 1: 0000 0010 */
sprintf(buffer, "out dbb,a");
break;
case 0x03: /* 2: 0000 0011 */
sprintf(buffer, "add a,#$%02X", opram[PC++ - pc]);
break;
case 0x04: /* 2: aaa0 0100 */
case 0x24: /* 2: aaa0 0100 */
case 0x44: /* 2: aaa0 0100 */
case 0x64: /* 2: aaa0 0100 */
case 0x84: /* 2: aaa0 0100 */
case 0xa4: /* 2: aaa0 0100 */
case 0xc4: /* 2: aaa0 0100 */
case 0xe4: /* 2: aaa0 0100 */
sprintf(buffer, "jmp $%04X", ((op<<3) & 0x700) | opram[PC++ - pc]);
break;
case 0x05: /* 1: 0000 0101 */
sprintf(buffer, "en i");
break;
case 0x06: /* 1: 0000 0110 */
sprintf(buffer, "ill");
break;
case 0x07: /* 1: 0000 0111 */
sprintf(buffer, "dec a");
break;
case 0x08: /* 2: 0000 10pp */
case 0x09: /* 2: 0000 10pp */
case 0x0a: /* 2: 0000 10pp */
case 0x0b: /* 2: 0000 10pp */
sprintf(buffer, "in a,p%d", op&3);
break;
case 0x0c: /* 2: 0000 11pp */
case 0x0d: /* 2: 0000 11pp */
case 0x0e: /* 2: 0000 11pp */
case 0x0f: /* 2: 0000 11pp */
sprintf(buffer, "movd a,p%d", op&3);
break;
case 0x10: /* 1: 0001 000r */
case 0x11: /* 1: 0001 000r */
sprintf(buffer, "inc @r%d", op&1);
break;
case 0x12: /* 2: bbb1 0010 */
case 0x32: /* 2: bbb1 0010 */
case 0x52: /* 2: bbb1 0010 */
case 0x72: /* 2: bbb1 0010 */
case 0x92: /* 2: bbb1 0010 */
case 0xb2: /* 2: bbb1 0010 */
case 0xd2: /* 2: bbb1 0010 */
case 0xf2: /* 2: bbb1 0010 */
arg = opram[PC++ - pc];
sprintf(buffer, "jb%d $%04X", op >> 5, (PC & 0x700) | arg);
break;
case 0x13: /* 2: 0001 0011 */
sprintf(buffer, "addc $%02X", opram[PC++ - pc]);
break;
case 0x14: /* 2: aaa1 0100 */
case 0x34: /* 2: aaa1 0100 */
case 0x54: /* 2: aaa1 0100 */
case 0x74: /* 2: aaa1 0100 */
case 0x94: /* 2: aaa1 0100 */
case 0xb4: /* 2: aaa1 0100 */
case 0xd4: /* 2: aaa1 0100 */
case 0xf4: /* 2: aaa1 0100 */
sprintf(buffer, "call $%04X", ((op<<3) & 0x700) | opram[PC++ - pc]);
flags = DASMFLAG_STEP_OVER;
break;
case 0x15: /* 1: 0001 0101 */
sprintf(buffer, "dis i");
break;
case 0x16: /* 2: 0001 0110 */
arg = opram[PC++ - pc];
sprintf(buffer, "jtf $%04X", (PC & 0x700) | arg);
break;
case 0x17: /* 1: 0001 0111 */
sprintf(buffer, "inc a");
break;
case 0x18: /* 1: 0001 1rrr */
case 0x19: /* 1: 0001 1rrr */
case 0x1a: /* 1: 0001 1rrr */
case 0x1b: /* 1: 0001 1rrr */
case 0x1c: /* 1: 0001 1rrr */
case 0x1d: /* 1: 0001 1rrr */
case 0x1e: /* 1: 0001 1rrr */
case 0x1f: /* 1: 0001 1rrr */
sprintf(buffer, "inc r%d", op&7);
break;
case 0x20: /* 1: 0010 000r */
case 0x21: /* 1: 0010 000r */
sprintf(buffer, "xch a,@r%d", op&1);
break;
case 0x22: /* 1: 0010 0010 */
sprintf(buffer, "in a,ddb");
break;
case 0x23: /* 2: 0010 0011 */
sprintf(buffer, "mov a,#$%02X", opram[PC++ - pc]);
break;
case 0x25: /* 1: 0010 0101 */
sprintf(buffer, "en tcnti");
break;
case 0x26: /* 2: 0010 0110 */
arg = opram[PC++ - pc];
sprintf(buffer, "jnt0 $%04X", (PC & 0x700) | arg);
break;
case 0x27: /* 1: 0010 0111 */
sprintf(buffer, "clr a");
break;
case 0x28: /* 1: 0010 1rrr */
case 0x29: /* 1: 0010 1rrr */
case 0x2a: /* 1: 0010 1rrr */
case 0x2b: /* 1: 0010 1rrr */
case 0x2c: /* 1: 0010 1rrr */
case 0x2d: /* 1: 0010 1rrr */
case 0x2e: /* 1: 0010 1rrr */
case 0x2f: /* 1: 0010 1rrr */
sprintf(buffer, "xch a,r%d", op&7);
break;
case 0x30: /* 1: 0011 000r */
case 0x31: /* 1: 0011 000r */
sprintf(buffer, "xchd a,@r%d", op&1);
break;
case 0x33: /* 1: 0011 0101 */
sprintf(buffer, "ill");
break;
case 0x35: /* 1: 0000 0101 */
sprintf(buffer, "dis tcnti");
break;
case 0x36: /* 2: 0011 0110 */
arg = opram[PC++ - pc];
sprintf(buffer, "jt0 $%04X", (PC & 0x700) | arg);
break;
case 0x37: /* 1: 0011 0111 */
sprintf(buffer, "cpl a");
break;
case 0x38: /* 2: 0011 10pp */
case 0x39: /* 2: 0011 10pp */
case 0x3a: /* 2: 0011 10pp */
case 0x3b: /* 2: 0011 10pp */
sprintf(buffer, "out p%d,a", op&3);
break;
case 0x3c: /* 2: 0011 11pp */
case 0x3d: /* 2: 0011 11pp */
case 0x3e: /* 2: 0011 11pp */
case 0x3f: /* 2: 0011 11pp */
sprintf(buffer, "movd p%d,a", op&7);
break;
case 0x40: /* 1: 0100 000r */
case 0x41: /* 1: 0100 000r */
sprintf(buffer, "orl a,@r%d", op&1);
break;
case 0x42: /* 1: 0100 0010 */
sprintf(buffer, "mov a,t");
break;
case 0x43: /* 2: 0100 0011 */
sprintf(buffer, "orl a,#$%02X", opram[PC++ - pc]);
break;
case 0x45: /* 1: 0100 0101 */
sprintf(buffer, "strt cnt");
break;
case 0x46: /* 2: 0100 0110 */
arg = opram[PC++ - pc];
sprintf(buffer, "jnt1 $%04X", (PC & 0x700) | arg);
break;
case 0x47: /* 1: 0100 0111 */
sprintf(buffer, "swap a");
break;
case 0x48: /* 1: 0100 1rrr */
case 0x49: /* 1: 0100 1rrr */
case 0x4a: /* 1: 0100 1rrr */
case 0x4b: /* 1: 0100 1rrr */
case 0x4c: /* 1: 0100 1rrr */
case 0x4d: /* 1: 0100 1rrr */
case 0x4e: /* 1: 0100 1rrr */
case 0x4f: /* 1: 0100 1rrr */
sprintf(buffer, "orl a,r%d", op&7);
break;
case 0x50: /* 1: 0101 000r */
case 0x51: /* 1: 0101 000r */
sprintf(buffer, "anl a,@r%d", op&1);
break;
case 0x53: /* 2: 0101 0011 */
sprintf(buffer, "anl a,#$%02X", opram[PC++ - pc]);
break;
case 0x55: /* 1: 0101 0101 */
sprintf(buffer, "strt t");
break;
case 0x56: /* 2: 0101 0110 */
arg = opram[PC++ - pc];
sprintf(buffer, "jt1 $%04X", (PC & 0x700) | arg);
break;
case 0x57: /* 1: 0101 0111 */
sprintf(buffer, "da a");
break;
case 0x58: /* 1: 0101 1rrr */
case 0x59: /* 1: 0101 1rrr */
case 0x5a: /* 1: 0101 1rrr */
case 0x5b: /* 1: 0101 1rrr */
case 0x5c: /* 1: 0101 1rrr */
case 0x5d: /* 1: 0101 1rrr */
case 0x5e: /* 1: 0101 1rrr */
case 0x5f: /* 1: 0101 1rrr */
sprintf(buffer, "anl a,r%d", op&7);
break;
case 0x60: /* 1: 0110 000r */
case 0x61: /* 1: 0110 000r */
sprintf(buffer, "add a,@r%d", op&1);
break;
case 0x62: /* 1: 0110 0010 */
sprintf(buffer, "mov t,a");
break;
case 0x63: /* 1: 0110 0011 */
sprintf(buffer, "ill");
break;
case 0x65: /* 1: 0110 0101 */
sprintf(buffer, "stop tcnt");
break;
case 0x66: /* 1: 0110 0110 */
sprintf(buffer, "ill");
break;
case 0x67: /* 1: 0110 0111 */
sprintf(buffer, "rrc a");
break;
case 0x68: /* 1: 0110 1rrr */
case 0x69: /* 1: 0110 1rrr */
case 0x6a: /* 1: 0110 1rrr */
case 0x6b: /* 1: 0110 1rrr */
case 0x6c: /* 1: 0110 1rrr */
case 0x6d: /* 1: 0110 1rrr */
case 0x6e: /* 1: 0110 1rrr */
case 0x6f: /* 1: 0110 1rrr */
sprintf(buffer, "add a,r%d", op&7);
break;
case 0x70: /* 1: 0111 000r */
case 0x71: /* 1: 0111 000r */
sprintf(buffer, "addc a,@r%d", op&1);
break;
case 0x73: /* 1: 0111 0011 */
sprintf(buffer, "ill");
break;
case 0x75: /* 1: 0111 0101 */
sprintf(buffer, "ill");
break;
case 0x76: /* 2: 0111 0110 */
arg = opram[PC++ - pc];
sprintf(buffer, "jf1 $%04X", (PC & 0x700) | arg);
break;
case 0x77: /* 1: 0111 0111 */
sprintf(buffer, "rl a");
break;
case 0x78: /* 1: 0111 1rrr */
case 0x79: /* 1: 0111 1rrr */
case 0x7a: /* 1: 0111 1rrr */
case 0x7b: /* 1: 0111 1rrr */
case 0x7c: /* 1: 0111 1rrr */
case 0x7d: /* 1: 0111 1rrr */
case 0x7e: /* 1: 0111 1rrr */
case 0x7f: /* 1: 0111 1rrr */
sprintf(buffer, "addc a,r%d", op&7);
break;
case 0x80: /* 1: 1000 0000 */
sprintf(buffer, "ill ");
break;
case 0x81: /* 1: 1000 0001 */
sprintf(buffer, "ill ");
break;
case 0x82: /* 1: 1000 0010 */
sprintf(buffer, "ill ");
break;
case 0x83: /* 2: 1000 0011 */
sprintf(buffer, "ret");
flags = DASMFLAG_STEP_OUT;
break;
case 0x85: /* 1: 1000 0101 */
sprintf(buffer, "clr f0");
break;
case 0x86: /* 2: 1000 0110 */
arg = opram[PC++ - pc];
sprintf(buffer, "jobf $%04X", (PC & 0x700) | arg);
break;
case 0x87: /* 1: 1000 0111 */
sprintf(buffer, "ill");
break;
case 0x88: /* 2: 1000 10pp */
case 0x89: /* 2: 1000 10pp */
case 0x8a: /* 2: 1000 10pp */
case 0x8b: /* 2: 1000 10pp */
sprintf(buffer, "orl p%d,#$%02X", op&3, opram[PC++ - pc]);
break;
case 0x8c: /* 2: 1000 11pp */
case 0x8d: /* 2: 1000 11pp */
case 0x8e: /* 2: 1000 11pp */
case 0x8f: /* 2: 1000 11pp */
sprintf(buffer, "orld p%d,a", op&7);
break;
case 0x90: /* 1: 1001 0000 */
sprintf(buffer, "mov sts,a");
break;
case 0x91: /* 1: 1001 0001 */
sprintf(buffer, "ill");
break;
case 0x93: /* 2: 1001 0011 */
sprintf(buffer, "retr");
flags = DASMFLAG_STEP_OVER;
break;
case 0x95: /* 1: 1001 0101 */
sprintf(buffer, "cpl f0");
break;
case 0x96: /* 2: 1001 0110 */
arg = opram[PC++ - pc];
sprintf(buffer, "jnz $%04X", (PC & 0x700) | arg);
break;
case 0x97: /* 1: 1001 0111 */
sprintf(buffer, "clr c");
break;
case 0x98: /* 2: 1001 10pp */
case 0x99: /* 2: 1001 10pp */
case 0x9a: /* 2: 1001 10pp */
case 0x9b: /* 2: 1001 10pp */
sprintf(buffer, "anl p%d,#$%02X", op&3, opram[PC++ - pc]);
break;
case 0x9c: /* 2: 1001 11pp */
case 0x9d: /* 2: 1001 11pp */
case 0x9e: /* 2: 1001 11pp */
case 0x9f: /* 2: 1001 11pp */
sprintf(buffer, "anld p%d,a", op&7);
break;
case 0xa0: /* 1: 1010 000r */
case 0xa1: /* 1: 1010 000r */
sprintf(buffer, "mov @r%d,a", op&1);
break;
case 0xa2: /* 1: 1010 0010 */
sprintf(buffer, "ill");
break;
case 0xa3: /* 2: 1010 0011 */
sprintf(buffer, "movp a,@a");
break;
case 0xa5: /* 1: 1010 0101 */
sprintf(buffer, "clr f1");
break;
case 0xa6: /* 1: 1010 0110 */
sprintf(buffer, "ill");
break;
case 0xa7: /* 1: 1010 0111 */
sprintf(buffer, "cpl c");
break;
case 0xa8: /* 1: 1010 1rrr */
case 0xa9: /* 1: 1010 1rrr */
case 0xaa: /* 1: 1010 1rrr */
case 0xab: /* 1: 1010 1rrr */
case 0xac: /* 1: 1010 1rrr */
case 0xad: /* 1: 1010 1rrr */
case 0xae: /* 1: 1010 1rrr */
case 0xaf: /* 1: 1010 1rrr */
sprintf(buffer, "mov r%d,a", op&7);
break;
case 0xb0: /* 2: 1011 000r */
case 0xb1: /* 2: 1011 000r */
sprintf(buffer, "mov @r%d,#$%02X", op&1, opram[PC++ - pc]);
break;
case 0xb3: /* 2: 1011 0011 */
sprintf(buffer, "jmpp @a");
break;
case 0xb5: /* 1: 1011 0101 */
sprintf(buffer, "cpl f1");
break;
case 0xb6: /* 2: 1011 0110 */
arg = opram[PC++ - pc];
sprintf(buffer, "jf0 $%04X", (PC & 0x700) | arg);
break;
case 0xb7: /* 1: 1011 0111 */
sprintf(buffer, "ill");
break;
case 0xb8: /* 1: 1011 1rrr */
case 0xb9: /* 1: 1011 1rrr */
case 0xba: /* 1: 1011 1rrr */
case 0xbb: /* 1: 1011 1rrr */
case 0xbc: /* 1: 1011 1rrr */
case 0xbd: /* 1: 1011 1rrr */
case 0xbe: /* 1: 1011 1rrr */
case 0xbf: /* 1: 1011 1rrr */
sprintf(buffer, "mov r%d,#$%02X", op&7, opram[PC++ - pc]);
break;
case 0xc0: /* 1: 1100 0000 */
sprintf(buffer, "ill");
break;
case 0xc1: /* 1: 1100 0001 */
sprintf(buffer, "ill");
break;
case 0xc2: /* 1: 1100 0010 */
sprintf(buffer, "ill");
break;
case 0xc3: /* 1: 1100 0011 */
sprintf(buffer, "ill");
break;
case 0xc5: /* 1: 1100 0101 */
sprintf(buffer, "sel rb0");
break;
case 0xc6: /* 2: 1100 0110 */
arg = opram[PC++ - pc];
sprintf(buffer, "jz $%04X", (PC & 0x700) | arg);
break;
case 0xc7: /* 1: 1100 0111 */
sprintf(buffer, "mov a,psw");
break;
case 0xc8: /* 1: 1100 1rrr */
case 0xc9: /* 1: 1100 1rrr */
case 0xca: /* 1: 1100 1rrr */
case 0xcb: /* 1: 1100 1rrr */
case 0xcc: /* 1: 1100 1rrr */
case 0xcd: /* 1: 1100 1rrr */
case 0xce: /* 1: 1100 1rrr */
case 0xcf: /* 1: 1100 1rrr */
sprintf(buffer, "dec r%d", op&7);
break;
case 0xd0: /* 1: 1101 000r */
case 0xd1: /* 1: 1101 000r */
sprintf(buffer, "xrl a,@r%d", op&1);
break;
case 0xd3: /* 1: 1101 0011 */
sprintf(buffer, "xrl a,#$%02X", opram[PC++ - pc]);
break;
case 0xd5: /* 1: 1101 0101 */
sprintf(buffer, "sel rb1");
break;
case 0xd6: /* 2: 1101 0110 */
arg = opram[PC++ - pc];
sprintf(buffer, "jnibf $%04X", (PC & 0x700) | arg);
break;
case 0xd7: /* 1: 1101 0111 */
sprintf(buffer, "mov psw,a");
break;
case 0xd8: /* 1: 1101 1rrr */
case 0xd9: /* 1: 1101 1rrr */
case 0xda: /* 1: 1101 1rrr */
case 0xdb: /* 1: 1101 1rrr */
case 0xdc: /* 1: 1101 1rrr */
case 0xdd: /* 1: 1101 1rrr */
case 0xde: /* 1: 1101 1rrr */
case 0xdf: /* 1: 1101 1rrr */
sprintf(buffer, "xrl a,r%d", op&7);
break;
case 0xe0: /* 1: 1110 0000 */
sprintf(buffer, "ill");
break;
case 0xe1: /* 1: 1110 0001 */
sprintf(buffer, "ill");
break;
case 0xe2: /* 1: 1110 0010 */
sprintf(buffer, "ill");
break;
case 0xe3: /* 2: 1110 0011 */
sprintf(buffer, "movp3 a,@a");
break;
case 0xe5: /* 1: 1110 0101 */
sprintf(buffer, "en dma");
break;
case 0xe6: /* 2: 1110 0110 */
arg = opram[PC++ - pc];
sprintf(buffer, "jnc $%04X", (PC & 0x700) | arg);
break;
case 0xe7: /* 1: 1110 0111 */
sprintf(buffer, "rl a");
break;
case 0xe8: /* 2: 1110 1rrr */
case 0xe9: /* 2: 1110 1rrr */
case 0xea: /* 2: 1110 1rrr */
case 0xeb: /* 2: 1110 1rrr */
case 0xec: /* 2: 1110 1rrr */
case 0xed: /* 2: 1110 1rrr */
case 0xee: /* 2: 1110 1rrr */
case 0xef: /* 2: 1110 1rrr */
arg = opram[PC++ - pc];
sprintf(buffer, "djnz r%d,$%04X", op&7, (PC & 0x700) | arg);
flags = DASMFLAG_STEP_OVER;
break;
case 0xf0: /* 1: 1111 000r */
case 0xf1: /* 1: 1111 000r */
sprintf(buffer, "mov a,@r%d", op&1);
break;
case 0xf3: /* 1: 1111 0011 */
sprintf(buffer, "ill");
break;
case 0xf5: /* 1: 1111 0101 */
sprintf(buffer, "en flags");
break;
case 0xf6: /* 2: 1111 0110 */
arg = opram[PC++ - pc];
sprintf(buffer, "jc $%04X", (PC & 0x700) | arg);
break;
case 0xf7: /* 1: 1111 0111 */
sprintf(buffer, "rlc a");
break;
case 0xf8: /* 1: 1111 1rrr */
case 0xf9: /* 1: 1111 1rrr */
case 0xfa: /* 1: 1111 1rrr */
case 0xfb: /* 1: 1111 1rrr */
case 0xfc: /* 1: 1111 1rrr */
case 0xfd: /* 1: 1111 1rrr */
case 0xfe: /* 1: 1111 1rrr */
case 0xff: /* 1: 1111 1rrr */
sprintf(buffer, "mov a,r%d", op&7);
break;
}
return (PC - pc) | flags | DASMFLAG_SUPPORTED;
}

File diff suppressed because it is too large Load Diff

View File

@ -1,100 +0,0 @@
/*****************************************************************************
*
* i8x41.h
* Portable UPI-41/8041/8741/8042/8742 emulator interface
*
* Copyright Juergen Buchmueller, all rights reserved.
*
* - This source code is released as freeware for non-commercial purposes.
* - You are free to use and redistribute this code in modified or
* unmodified form, provided you list me in the credits.
* - If you modify this source code, you must add a notice to each modified
* source file that it has been changed. If you're a nice person, you
* will clearly mark each change too. :)
* - If you wish to use this for commercial purposes, please contact me at
* pullmoll@t-online.de
* - The author of this copywritten work reserves the right to change the
* terms of its usage and license at any time, including retroactively
* - This entire notice must remain in the source code.
*
* TLP (10-Jan-2003)
* Added output ports registers to the debug viewer
* Added the Clock Divider
*
*****************************************************************************/
#pragma once
#ifndef __I8X41_H__
#define __I8X41_H__
#include "cpuintrf.h"
/* The i8x41/i8x42 input clock is divided by 15 */
#define I8X41_CLOCK_DIVIDER 15
/* Note:
* I8X41_DATA is A0 = 0 and R/W
* I8X41_CMND is A0 = 1 and W only
* I8X41_STAT is A0 = 1 and R only
*/
/****************************************************************************
* Interrupt constants
*/
#define I8X41_INT_IBF 0 /* input buffer full interrupt */
#define I8X41_INT_TEST1 1 /* test1 line (also counter interrupt; taken on cntr overflow) */
/****************************************************************************
* Use these in the I/O port fields of your driver for the test lines - i.e,
* { I8X41_t0, I8X41_t0, i8041_test0_r },
* { I8X41_t1, I8X41_t1, i8041_test1_r },
* { I8X41_ps, I8X41_ps, i8041_port_strobe_w },
*/
#define I8X41_p1 0x01
#define I8X41_p2 0x02
#define I8X41_t0 0x80 /* TEST0 input port handle */
#define I8X41_t1 0x81 /* TEST1 input port handle */
#define I8X41_ps 0x82 /* Prog pin strobe for expanded port sync */
/****************************************************************************
* The i8x41/i8x42 have 128/256 bytes of internal memory respectively
*/
#define I8X41_intRAM_MASK 0x7f
#define I8X42_intRAM_MASK 0xff
enum
{
I8X41_PC=1, I8X41_SP, I8X41_PSW, I8X41_T, I8X41_DATA, I8X41_DATA_DASM,
I8X41_CMND, I8X41_CMND_DASM, I8X41_STAT, I8X41_P1, I8X41_P2,I8X41_A,
I8X41_R0, I8X41_R1, I8X41_R2, I8X41_R3, I8X41_R4, I8X41_R5, I8X41_R6, I8X41_R7
};
/****************************************************************************
* Public Functions
*/
extern CPU_GET_INFO( i8041 );
extern CPU_GET_INFO( i8741 );
extern CPU_GET_INFO( i8042 );
extern CPU_GET_INFO( i8242 );
extern CPU_GET_INFO( i8742 );
#define CPU_I8041 CPU_GET_INFO_NAME( i8041 )
#define CPU_I8741 CPU_GET_INFO_NAME( i8741 )
#define CPU_I8042 CPU_GET_INFO_NAME( i8042 )
#define CPU_I8242 CPU_GET_INFO_NAME( i8242 )
#define CPU_I8742 CPU_GET_INFO_NAME( i8742 )
extern CPU_DISASSEMBLE( i8x41 );
#endif /* __I8X41_H__ */

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -2,7 +2,7 @@
mcs48.c
Intel MCS-48 Portable Emulator
Intel MCS-48/UPI-41 Portable Emulator
Copyright Mirko Buffoni
Based on the original work Copyright Dan Boris, an 8048 emulator
@ -12,11 +12,12 @@
#pragma once
#ifndef __I8039_H__
#define __I8039_H__
#ifndef __MCS48_H__
#define __MCS48_H__
#include "cpuintrf.h"
/***************************************************************************
CONSTANTS
***************************************************************************/
@ -24,10 +25,11 @@
/* register access indexes */
enum
{
MCS48_PC = 1,
MCS48_PC,
MCS48_PSW,
MCS48_A,
MCS48_TC,
MCS48_TPRE,
MCS48_P1,
MCS48_P2,
MCS48_R0,
@ -38,7 +40,14 @@ enum
MCS48_R5,
MCS48_R6,
MCS48_R7,
MCS48_EA
MCS48_EA,
MCS48_STS, /* UPI-41 systems only */
MCS48_DBBO, /* UPI-41 systems only */
MCS48_DBBI, /* UPI-41 systems only */
MCS48_GENPC = REG_GENPC,
MCS48_GENSP = REG_GENSP,
MCS48_GENPCBASE = REG_GENPCBASE
};
@ -46,6 +55,7 @@ enum
enum
{
MCS48_INPUT_IRQ = 0,
UPI41_INPUT_IBF = 0,
MCS48_INPUT_EA
};
@ -62,7 +72,18 @@ enum
MCS48_PORT_P7 = 0x107,
MCS48_PORT_T0 = 0x110,
MCS48_PORT_T1 = 0x111,
MCS48_PORT_BUS = 0x120
MCS48_PORT_BUS = 0x120,
MCS48_PORT_PROG = 0x121 /* PROG line to 8243 expander */
};
/* 8243 expander operations */
enum
{
MCS48_EXPANDER_OP_READ = 0,
MCS48_EXPANDER_OP_WRITE = 1,
MCS48_EXPANDER_OP_OR = 2,
MCS48_EXPANDER_OP_AND = 3
};
@ -71,7 +92,7 @@ enum
FUNCTION PROTOTYPES
***************************************************************************/
/* variants with 64 bytes of internal RAM and up to 1k of internal ROM */
/* MCS-48 variants with 64 bytes of internal RAM and up to 1k of internal ROM */
CPU_GET_INFO( i8035 );
CPU_GET_INFO( i8048 );
CPU_GET_INFO( i8648 );
@ -86,7 +107,7 @@ CPU_GET_INFO( n7751 );
#define CPU_MB8884 CPU_GET_INFO_NAME( mb8884 )
#define CPU_N7751 CPU_GET_INFO_NAME( n7751 )
/* variants with 128 bytes of internal RAM and up to 2k of internal ROM */
/* MCS-48 variants with 128 bytes of internal RAM and up to 2k of internal ROM */
CPU_GET_INFO( i8039 );
CPU_GET_INFO( i8049 );
CPU_GET_INFO( i8749 );
@ -97,7 +118,32 @@ CPU_GET_INFO( m58715 );
#define CPU_I8749 CPU_GET_INFO_NAME( i8749 )
#define CPU_M58715 CPU_GET_INFO_NAME( m58715 )
/* disassembler */
CPU_DISASSEMBLE( mcs48 );
#endif /* __I8039_H__ */
/* UPI-41 variants with 128 bytes of internal RAM and up to 1k of internal ROM */
CPU_GET_INFO( i8041 );
CPU_GET_INFO( i8741 );
#define CPU_I8041 CPU_GET_INFO_NAME( i8041 )
#define CPU_I8741 CPU_GET_INFO_NAME( i8741 )
/* UPI-41 variants with 256 bytes of internal RAM and up to 2k of internal ROM */
CPU_GET_INFO( i8042 );
CPU_GET_INFO( i8242 );
CPU_GET_INFO( i8742 );
#define CPU_I8042 CPU_GET_INFO_NAME( i8042 )
#define CPU_I8242 CPU_GET_INFO_NAME( i8242 )
#define CPU_I8742 CPU_GET_INFO_NAME( i8742 )
/* functions for talking to the input/output buffers on the UPI41-class chips */
UINT8 upi41_master_r(const device_config *device, UINT8 a0);
void upi41_master_w(const device_config *device, UINT8 a0, UINT8 data);
/* disassemblers */
CPU_DISASSEMBLE( mcs48 );
CPU_DISASSEMBLE( upi41 );
#endif /* __MCS48_H__ */

View File

@ -1,303 +1,310 @@
/****************************************************************************
*
* mcs48 disassembler
*
* This file is Copyright Michael Cuddy, Fen's Ende Sofware.
* Redistribution is allowed in source and binary form as long as both
* forms are distributed together with the file 'README'. This copyright
* notice must also accompany the files.
*
* This software should be considered a small token to all of the
* emulator authors for thier dilligence in preserving our Arcade and
* Computer history.
*
* Michael Cuddy, Fen's Ende Software.
* 11/25/1996
*
* Adapted by Andrea Mazzoleni for use with MAME
*
***************************************************************************/
/***************************************************************************
#include <ctype.h>
mcs48dsm.c
Simple MCS-48/UPI-41 disassembler.
Written by Aaron Giles
***************************************************************************/
#include "cpuintrf.h"
#define mame_printf_debug printf
typedef unsigned char byte;
#define FMT(a,b) a, b
#define PTRS_PER_FORMAT 2
static const char *const Formats[] = {
FMT("00000011dddddddd", "add a,#$%X"),
FMT("01101rrr", "add a,%R"),
FMT("0110000r", "add a,@%R"),
FMT("00010011dddddddd", "adc a,#$%X"),
FMT("01111rrr", "adc a,%R"),
FMT("0111000r", "adc a,@%R"),
FMT("01010011dddddddd", "anl a,#$%X"),
FMT("01011rrr", "anl a,%R"),
FMT("0101000r", "anl a,@%R"),
FMT("10011000dddddddd", "anl bus,#$%X"),
FMT("10011001dddddddd", "anl p1,#$%X"),
FMT("10011010dddddddd", "anl p2,#$%X"),
FMT("100111pp", "anld %P,a"),
FMT("aaa10100aaaaaaaa", "!call %A"),
FMT("00100111", "clr a"),
FMT("10010111", "clr c"),
FMT("10100101", "clr f1"),
FMT("10000101", "clr f0"),
FMT("00110111", "cpl a"),
FMT("10100111", "cpl c"),
FMT("10010101", "cpl f0"),
FMT("10110101", "cpl f1"),
FMT("01010111", "da a"),
FMT("00000111", "dec a"),
FMT("11001rrr", "dec %R"),
FMT("00010101", "dis i"),
FMT("00110101", "dis tcnti"),
FMT("11101rrraaaaaaaa", "!djnz %R,%J"),
FMT("00000101", "en i"),
FMT("00100101", "en tcnti"),
FMT("01110101", "ent0 clk"),
FMT("00001001", "in a,p1"),
FMT("00001010", "in a,p2"),
FMT("00010111", "inc a"),
FMT("00011rrr", "inc %R"),
FMT("0001000r", "inc @%R"),
FMT("00001000", "ins a,bus"),
FMT("0001 0110aaaaaaaa", "jtf %J"),
FMT("0010 0110aaaaaaaa", "jnt0 %J"),
FMT("0011 0110aaaaaaaa", "jt0 %J"),
FMT("0100 0110aaaaaaaa", "jnt1 %J"),
FMT("0101 0110aaaaaaaa", "jt1 %J"),
FMT("0111 0110aaaaaaaa", "jf1 %J"),
FMT("1000 0110aaaaaaaa", "jni %J"),
FMT("1001 0110aaaaaaaa", "jnz %J"),
FMT("1011 0110aaaaaaaa", "jf0 %J"),
FMT("1100 0110aaaaaaaa", "jz %J"),
FMT("1110 0110aaaaaaaa", "jnc %J"),
FMT("1111 0110aaaaaaaa", "jc %J"),
FMT("bbb10010aaaaaaaa", "jb%B %J"),
FMT("aaa00100aaaaaaaa", "jmp %A"),
FMT("10110011", "jmpp @a"),
FMT("00100011dddddddd", "mov a,#$%X"),
FMT("11111rrr", "mov a,%R"),
FMT("1111000r", "mov a,@%R"),
FMT("11000111", "mov a,psw"),
FMT("10111rrrdddddddd", "mov %R,#$%X"),
FMT("10101rrr", "mov %R,a"),
FMT("1010000r", "mov @%R,a"),
FMT("1011000rdddddddd", "mov @%R,#$%X"),
FMT("11010111", "mov psw,a"),
FMT("000011pp", "movd a,%P"),
FMT("001111pp", "movd %P,a"),
FMT("01000010", "mov a,t"),
FMT("01100010", "mov t,a"),
FMT("11100011", "movp3 a,@a"),
FMT("10100011", "movp a,@a"),
FMT("1000000r", "movx a,@%R"),
FMT("1001000r", "movx @%R,a"),
FMT("0100 1rrr", "orl a,%R"),
FMT("0100 000r", "orl a,@%R"),
FMT("0100 0011dddddddd", "orl a,#$%X"),
FMT("1000 1000dddddddd", "orl bus,#$%X"),
FMT("1000 1001dddddddd", "orl p1,#$%X"),
FMT("1000 1010dddddddd", "orl p2,#$%X"),
FMT("1000 11pp", "orld %P,a"),
FMT("00000010", "outl bus,a"),
FMT("001110pp", "outl %P,a"),
FMT("10000011", "^ret"),
FMT("10010011", "^retr"),
FMT("11100111", "rl a"),
FMT("11110111", "rlc a"),
FMT("01110111", "rr a"),
FMT("01100111", "rrc a"),
FMT("11100101", "sel mb0"),
FMT("11110101", "sel mb1"),
FMT("11000101", "sel rb0"),
FMT("11010101", "sel rb1"),
FMT("01100101", "stop tcnt"),
FMT("01000101", "strt cnt"),
FMT("01010101", "strt t"),
FMT("01000111", "swap a"),
FMT("00101rrr", "xch a,%R"),
FMT("0010000r", "xch a,@%R"),
FMT("0011000r", "xchd a,@%R"),
FMT("1101 0011dddddddd", "xrl a,#$%X"),
FMT("1101 1rrr", "xrl a,%R"),
FMT("1101 000r", "xrl a,@%R"),
FMT("00000000", "nop"),
NULL
};
#define MAX_OPS (((sizeof(Formats) / sizeof(Formats[0])) - 1) / PTRS_PER_FORMAT)
typedef struct opcode {
byte mask; /* instruction mask */
byte bits; /* constant bits */
char extcode; /* value that gets extension code */
const char *parse; /* how to parse bits */
const char *fmt; /* instruction format */
unsigned long flags;
} M48Opcode;
static M48Opcode Op[MAX_OPS+1];
static int OpInizialized = 0;
static void InitDasm8039(void)
static UINT32 common_dasm(const device_config *device, char *buffer, offs_t pc, const UINT8 *oprom, const UINT8 *opram, int upi41)
{
const char *p;
const char *const *ops;
byte mask, bits;
int bit;
int i;
const UINT8 *startram = opram;
UINT32 flags = 0;
ops = Formats; i = 0;
while (*ops) {
unsigned long flags = 0;
p = *ops;
mask = 0; bits = 0; bit = 7;
while (*p && bit >= 0) {
switch (*p++) {
case '1': mask |= 1<<bit; bits |= 1<<bit; bit--; break;
case '0': mask |= 1<<bit; bit--; break;
case ' ': break;
case 'b':
case 'a': case 'r': case 'd': case 'p':
bit --;
break;
default:
fatalerror("Invalid instruction encoding '%s %s'\n", ops[0],ops[1]);
break;
}
}
if (bit != -1 ) {
fatalerror("not enough bits in encoding '%s %s' %d\n", ops[0],ops[1],bit);
break;
}
while (isspace(*p)) p++;
if (*p) Op[i].extcode = *p;
Op[i].bits = bits;
Op[i].mask = mask;
Op[i].fmt = ops[1];
Op[i].parse = ops[0];
if (Op[i].fmt[0] == '!')
opram++;
switch (*oprom++)
{
flags |= DASMFLAG_STEP_OVER;
Op[i].fmt++;
}
if (Op[i].fmt[0] == '^')
{
flags |= DASMFLAG_STEP_OUT;
Op[i].fmt++;
}
Op[i].flags = flags;
ops += PTRS_PER_FORMAT;
i++;
case 0x00: sprintf(buffer, "nop"); break;
case 0x02: if (!upi41)
sprintf(buffer, "out bus,a");
else
sprintf(buffer, "out dbb,a"); break;
case 0x03: sprintf(buffer, "add a,#$%02X", *opram++); break;
case 0x04: sprintf(buffer, "jmp $0%02X", *opram++); break;
case 0x05: sprintf(buffer, "en i"); break;
case 0x07: sprintf(buffer, "dec a"); break;
case 0x08: if (!upi41)
sprintf(buffer, "in a,bus");
else
sprintf(buffer, "illegal"); break;
case 0x09: sprintf(buffer, "in a,p1"); break;
case 0x0a: sprintf(buffer, "in a,p2"); break;
case 0x0c: sprintf(buffer, "movd a,p4"); break;
case 0x0d: sprintf(buffer, "movd a,p5"); break;
case 0x0e: sprintf(buffer, "movd a,p6"); break;
case 0x0f: sprintf(buffer, "movd a,p7"); break;
case 0x10: sprintf(buffer, "inc @r0"); break;
case 0x11: sprintf(buffer, "inc @r1"); break;
case 0x12: sprintf(buffer, "jb0 $%03X", (pc & 0xf00) | *opram++); break;
case 0x13: sprintf(buffer, "addc a,#$%02X", *opram++); break;
case 0x14: sprintf(buffer, "call $0%02X", *opram++); flags = DASMFLAG_STEP_OVER; break;
case 0x15: sprintf(buffer, "dis i"); break;
case 0x16: sprintf(buffer, "jtf $%03X", (pc & 0xf00) | *opram++); break;
case 0x17: sprintf(buffer, "inc a"); break;
case 0x18: sprintf(buffer, "inc r0"); break;
case 0x19: sprintf(buffer, "inc r1"); break;
case 0x1a: sprintf(buffer, "inc r2"); break;
case 0x1b: sprintf(buffer, "inc r3"); break;
case 0x1c: sprintf(buffer, "inc r4"); break;
case 0x1d: sprintf(buffer, "inc r5"); break;
case 0x1e: sprintf(buffer, "inc r6"); break;
case 0x1f: sprintf(buffer, "inc r7"); break;
case 0x20: sprintf(buffer, "xch a,@r0"); break;
case 0x21: sprintf(buffer, "xch a,@r1"); break;
case 0x22: if (!upi41)
sprintf(buffer, "illegal");
else
sprintf(buffer, "in a,dbb"); break;
case 0x23: sprintf(buffer, "mov a,#$%02X", *opram++); break;
case 0x24: sprintf(buffer, "jmp $1%02X", *opram++); break;
case 0x25: sprintf(buffer, "en tcnti"); break;
case 0x26: sprintf(buffer, "jnt0 $%03X", (pc & 0xf00) | *opram++); break;
case 0x27: sprintf(buffer, "clr a"); break;
case 0x28: sprintf(buffer, "xch a,r0"); break;
case 0x29: sprintf(buffer, "xch a,r1"); break;
case 0x2a: sprintf(buffer, "xch a,r2"); break;
case 0x2b: sprintf(buffer, "xch a,r3"); break;
case 0x2c: sprintf(buffer, "xch a,r4"); break;
case 0x2d: sprintf(buffer, "xch a,r5"); break;
case 0x2e: sprintf(buffer, "xch a,r6"); break;
case 0x2f: sprintf(buffer, "xch a,r7"); break;
case 0x30: sprintf(buffer, "xchd a,@r0"); break;
case 0x31: sprintf(buffer, "xchd a,@r1"); break;
case 0x32: sprintf(buffer, "jb1 $%03X", (pc & 0xf00) | *opram++); break;
case 0x34: sprintf(buffer, "call $1%02X", *opram++); flags = DASMFLAG_STEP_OVER; break;
case 0x35: sprintf(buffer, "dis tcnti"); break;
case 0x36: sprintf(buffer, "jt0 $%03X", (pc & 0xf00) | *opram++); break;
case 0x37: sprintf(buffer, "cpl a"); break;
case 0x39: sprintf(buffer, "outl p1,a"); break;
case 0x3a: sprintf(buffer, "outl p2,a"); break;
case 0x3c: sprintf(buffer, "movd p4,a"); break;
case 0x3d: sprintf(buffer, "movd p5,a"); break;
case 0x3e: sprintf(buffer, "movd p6,a"); break;
case 0x3f: sprintf(buffer, "movd p7,a"); break;
case 0x40: sprintf(buffer, "orl a,@r0"); break;
case 0x41: sprintf(buffer, "orl a,@r1"); break;
case 0x42: sprintf(buffer, "mov a,t"); break;
case 0x43: sprintf(buffer, "orl a,#$%02X", *opram++); break;
case 0x44: sprintf(buffer, "jmp $2%02X", *opram++); break;
case 0x45: sprintf(buffer, "strt cnt"); break;
case 0x46: sprintf(buffer, "jnt1 $%03X", (pc & 0xf00) | *opram++); break;
case 0x47: sprintf(buffer, "swap a"); break;
case 0x48: sprintf(buffer, "orl a,r0"); break;
case 0x49: sprintf(buffer, "orl a,r1"); break;
case 0x4a: sprintf(buffer, "orl a,r2"); break;
case 0x4b: sprintf(buffer, "orl a,r3"); break;
case 0x4c: sprintf(buffer, "orl a,r4"); break;
case 0x4d: sprintf(buffer, "orl a,r5"); break;
case 0x4e: sprintf(buffer, "orl a,r6"); break;
case 0x4f: sprintf(buffer, "orl a,r7"); break;
case 0x50: sprintf(buffer, "anl a,@r0"); break;
case 0x51: sprintf(buffer, "anl a,@r1"); break;
case 0x52: sprintf(buffer, "jb2 $%03X", (pc & 0xf00) | *opram++); break;
case 0x53: sprintf(buffer, "anl a,#$%02X", *opram++); break;
case 0x54: sprintf(buffer, "call $2%02X", *opram++); flags = DASMFLAG_STEP_OVER; break;
case 0x55: sprintf(buffer, "strt t"); break;
case 0x56: sprintf(buffer, "jt1 $%03X", (pc & 0xf00) | *opram++); break;
case 0x57: sprintf(buffer, "da a"); break;
case 0x58: sprintf(buffer, "anl a,r0"); break;
case 0x59: sprintf(buffer, "anl a,r1"); break;
case 0x5a: sprintf(buffer, "anl a,r2"); break;
case 0x5b: sprintf(buffer, "anl a,r3"); break;
case 0x5c: sprintf(buffer, "anl a,r4"); break;
case 0x5d: sprintf(buffer, "anl a,r5"); break;
case 0x5e: sprintf(buffer, "anl a,r6"); break;
case 0x5f: sprintf(buffer, "anl a,r7"); break;
case 0x60: sprintf(buffer, "add a,@r0"); break;
case 0x61: sprintf(buffer, "add a,@r1"); break;
case 0x62: sprintf(buffer, "mov t,a"); break;
case 0x64: sprintf(buffer, "jmp $3%02X", *opram++); break;
case 0x65: sprintf(buffer, "stop tcnt"); break;
case 0x67: sprintf(buffer, "rrc a"); break;
case 0x68: sprintf(buffer, "add a,r0"); break;
case 0x69: sprintf(buffer, "add a,r1"); break;
case 0x6a: sprintf(buffer, "add a,r2"); break;
case 0x6b: sprintf(buffer, "add a,r3"); break;
case 0x6c: sprintf(buffer, "add a,r4"); break;
case 0x6d: sprintf(buffer, "add a,r5"); break;
case 0x6e: sprintf(buffer, "add a,r6"); break;
case 0x6f: sprintf(buffer, "add a,r7"); break;
case 0x70: sprintf(buffer, "addc a,@r0"); break;
case 0x71: sprintf(buffer, "addc a,@r1"); break;
case 0x72: sprintf(buffer, "jb3 $%03X", (pc & 0xf00) | *opram++); break;
case 0x74: sprintf(buffer, "call $3%02X", *opram++); flags = DASMFLAG_STEP_OVER; break;
case 0x75: if (!upi41)
sprintf(buffer, "ent0 clk");
else
sprintf(buffer, "illegal"); break;
case 0x76: sprintf(buffer, "jf1 $%03X", (pc & 0xf00) | *opram++); break;
case 0x77: sprintf(buffer, "rr a"); break;
case 0x78: sprintf(buffer, "addc a,r0"); break;
case 0x79: sprintf(buffer, "addc a,r1"); break;
case 0x7a: sprintf(buffer, "addc a,r2"); break;
case 0x7b: sprintf(buffer, "addc a,r3"); break;
case 0x7c: sprintf(buffer, "addc a,r4"); break;
case 0x7d: sprintf(buffer, "addc a,r5"); break;
case 0x7e: sprintf(buffer, "addc a,r6"); break;
case 0x7f: sprintf(buffer, "addc a,r7"); break;
case 0x80: if (!upi41)
sprintf(buffer, "movx a,@r0");
else
sprintf(buffer, "illegal"); break;
case 0x81: if (!upi41)
sprintf(buffer, "movx a,@r1");
else
sprintf(buffer, "illegal"); break;
case 0x83: sprintf(buffer, "ret"); flags = DASMFLAG_STEP_OUT; break;
case 0x84: sprintf(buffer, "jmp $4%02X", *opram++); break;
case 0x85: sprintf(buffer, "clr f0"); break;
case 0x86: if (!upi41)
sprintf(buffer, "jni $%03X", (pc & 0xf00) | *opram++);
else
sprintf(buffer, "jobf $%03X", (pc & 0xf00) | *opram++); break;
case 0x88: if (!upi41)
sprintf(buffer, "orl bus,#$%02X", *opram++);
else
sprintf(buffer, "illegal"); break;
case 0x89: sprintf(buffer, "orl p1,#$%02X", *opram++); break;
case 0x8a: sprintf(buffer, "orl p2,#$%02X", *opram++); break;
case 0x8c: sprintf(buffer, "orld p4,a"); break;
case 0x8d: sprintf(buffer, "orld p5,a"); break;
case 0x8e: sprintf(buffer, "orld p6,a"); break;
case 0x8f: sprintf(buffer, "orld p7,a"); break;
case 0x90: if (!upi41)
sprintf(buffer, "movx @r0,a");
else
sprintf(buffer, "mov sts,a"); break;
case 0x91: if (!upi41)
sprintf(buffer, "movx @r1,a");
else
sprintf(buffer, "illegal"); break;
case 0x92: sprintf(buffer, "jb4 $%03X", (pc & 0xf00) | *opram++); break;
case 0x93: sprintf(buffer, "retr"); flags = DASMFLAG_STEP_OUT; break;
case 0x94: sprintf(buffer, "call $4%02X", *opram++); flags = DASMFLAG_STEP_OVER; break;
case 0x95: sprintf(buffer, "cpl f0"); break;
case 0x96: sprintf(buffer, "jnz $%03X", (pc & 0xf00) | *opram++); break;
case 0x97: sprintf(buffer, "clr c"); break;
case 0x98: if (!upi41)
sprintf(buffer, "anl bus,#$%02X", *opram++);
else
sprintf(buffer, "illegal"); break;
case 0x99: sprintf(buffer, "anl p1,#$%02X", *opram++); break;
case 0x9a: sprintf(buffer, "anl p2,#$%02X", *opram++); break;
case 0x9c: sprintf(buffer, "anld p4,a"); break;
case 0x9d: sprintf(buffer, "anld p5,a"); break;
case 0x9e: sprintf(buffer, "anld p6,a"); break;
case 0x9f: sprintf(buffer, "anld p7,a"); break;
case 0xa0: sprintf(buffer, "mov @r0,a"); break;
case 0xa1: sprintf(buffer, "mov @r1,a"); break;
case 0xa3: sprintf(buffer, "movp a,@a"); break;
case 0xa4: sprintf(buffer, "jmp $5%02X", *opram++); break;
case 0xa5: sprintf(buffer, "clr f1"); break;
case 0xa7: sprintf(buffer, "cpl c"); break;
case 0xa8: sprintf(buffer, "mov r0,a"); break;
case 0xa9: sprintf(buffer, "mov r1,a"); break;
case 0xaa: sprintf(buffer, "mov r2,a"); break;
case 0xab: sprintf(buffer, "mov r3,a"); break;
case 0xac: sprintf(buffer, "mov r4,a"); break;
case 0xad: sprintf(buffer, "mov r5,a"); break;
case 0xae: sprintf(buffer, "mov r6,a"); break;
case 0xaf: sprintf(buffer, "mov r7,a"); break;
case 0xb0: sprintf(buffer, "mov @r0,#$%02X", *opram++); break;
case 0xb1: sprintf(buffer, "mov @r1,#$%02X", *opram++); break;
case 0xb2: sprintf(buffer, "jb5 $%03X", (pc & 0xf00) | *opram++); break;
case 0xb3: sprintf(buffer, "jmpp @a"); break;
case 0xb4: sprintf(buffer, "call $5%02X", *opram++); flags = DASMFLAG_STEP_OVER; break;
case 0xb5: sprintf(buffer, "cpl f1"); break;
case 0xb6: sprintf(buffer, "jf0 $%03X", (pc & 0xf00) | *opram++); break;
case 0xb8: sprintf(buffer, "mov r0,#$%02X", *opram++); break;
case 0xb9: sprintf(buffer, "mov r1,#$%02X", *opram++); break;
case 0xba: sprintf(buffer, "mov r2,#$%02X", *opram++); break;
case 0xbb: sprintf(buffer, "mov r3,#$%02X", *opram++); break;
case 0xbc: sprintf(buffer, "mov r4,#$%02X", *opram++); break;
case 0xbd: sprintf(buffer, "mov r5,#$%02X", *opram++); break;
case 0xbe: sprintf(buffer, "mov r6,#$%02X", *opram++); break;
case 0xbf: sprintf(buffer, "mov r7,#$%02X", *opram++); break;
case 0xc4: sprintf(buffer, "jmp $6%02X", *opram++); break;
case 0xc5: sprintf(buffer, "sel rb0"); break;
case 0xc6: sprintf(buffer, "jz $%03X", (pc & 0xf00) | *opram++); break;
case 0xc7: sprintf(buffer, "mov a,psw"); break;
case 0xc8: sprintf(buffer, "dec r0"); break;
case 0xc9: sprintf(buffer, "dec r1"); break;
case 0xca: sprintf(buffer, "dec r2"); break;
case 0xcb: sprintf(buffer, "dec r3"); break;
case 0xcc: sprintf(buffer, "dec r4"); break;
case 0xcd: sprintf(buffer, "dec r5"); break;
case 0xce: sprintf(buffer, "dec r6"); break;
case 0xcf: sprintf(buffer, "dec r7"); break;
case 0xd0: sprintf(buffer, "xrl a,@r0"); break;
case 0xd1: sprintf(buffer, "xrl a,@r1"); break;
case 0xd2: sprintf(buffer, "jb6 $%03X", (pc & 0xf00) | *opram++); break;
case 0xd3: sprintf(buffer, "xrl a,#$%02X", *opram++); break;
case 0xd4: sprintf(buffer, "call $6%02X", *opram++); flags = DASMFLAG_STEP_OVER; break;
case 0xd5: sprintf(buffer, "sel rb1"); break;
case 0xd6: if (!upi41)
sprintf(buffer, "illegal");
else
sprintf(buffer, "jnibf $%03X", (pc & 0xf00) | *opram++); break;
case 0xd7: sprintf(buffer, "mov psw,a"); break;
case 0xd8: sprintf(buffer, "xrl a,r0"); break;
case 0xd9: sprintf(buffer, "xrl a,r1"); break;
case 0xda: sprintf(buffer, "xrl a,r2"); break;
case 0xdb: sprintf(buffer, "xrl a,r3"); break;
case 0xdc: sprintf(buffer, "xrl a,r4"); break;
case 0xdd: sprintf(buffer, "xrl a,r5"); break;
case 0xde: sprintf(buffer, "xrl a,r6"); break;
case 0xdf: sprintf(buffer, "xrl a,r7"); break;
case 0xe3: sprintf(buffer, "movp3 a,@a"); break;
case 0xe4: sprintf(buffer, "jmp $7%02X", *opram++); break;
case 0xe5: if (!upi41)
sprintf(buffer, "sel mb0");
else
sprintf(buffer, "en dma"); break;
case 0xe6: sprintf(buffer, "jnc $%03X", (pc & 0xf00) | *opram++); break;
case 0xe7: sprintf(buffer, "rl a"); break;
case 0xe8: sprintf(buffer, "djnz r0,$%03X", (pc & 0xf00) | *opram++); flags = DASMFLAG_STEP_OVER; break;
case 0xe9: sprintf(buffer, "djnz r1,$%03X", (pc & 0xf00) | *opram++); flags = DASMFLAG_STEP_OVER; break;
case 0xea: sprintf(buffer, "djnz r2,$%03X", (pc & 0xf00) | *opram++); flags = DASMFLAG_STEP_OVER; break;
case 0xeb: sprintf(buffer, "djnz r3,$%03X", (pc & 0xf00) | *opram++); flags = DASMFLAG_STEP_OVER; break;
case 0xec: sprintf(buffer, "djnz r4,$%03X", (pc & 0xf00) | *opram++); flags = DASMFLAG_STEP_OVER; break;
case 0xed: sprintf(buffer, "djnz r5,$%03X", (pc & 0xf00) | *opram++); flags = DASMFLAG_STEP_OVER; break;
case 0xee: sprintf(buffer, "djnz r6,$%03X", (pc & 0xf00) | *opram++); flags = DASMFLAG_STEP_OVER; break;
case 0xef: sprintf(buffer, "djnz r7,$%03X", (pc & 0xf00) | *opram++); flags = DASMFLAG_STEP_OVER; break;
case 0xf0: sprintf(buffer, "mov a,@r0"); break;
case 0xf1: sprintf(buffer, "mov a,@r1"); break;
case 0xf2: sprintf(buffer, "jb7 $%03X", (pc & 0xf00) | *opram++); break;
case 0xf4: sprintf(buffer, "call $7%02X", *opram++); flags = DASMFLAG_STEP_OVER; break;
case 0xf5: if (!upi41)
sprintf(buffer, "sel mb1");
else
sprintf(buffer, "en flags"); break;
case 0xf6: sprintf(buffer, "jc $%03X", (pc & 0xf00) | *opram++); break;
case 0xf7: sprintf(buffer, "rlc a"); break;
case 0xf8: sprintf(buffer, "mov a,r0"); break;
case 0xf9: sprintf(buffer, "mov a,r1"); break;
case 0xfa: sprintf(buffer, "mov a,r2"); break;
case 0xfb: sprintf(buffer, "mov a,r3"); break;
case 0xfc: sprintf(buffer, "mov a,r4"); break;
case 0xfd: sprintf(buffer, "mov a,r5"); break;
case 0xfe: sprintf(buffer, "mov a,r6"); break;
case 0xff: sprintf(buffer, "mov a,r7"); break;
}
OpInizialized = 1;
return (opram - startram) | flags | DASMFLAG_SUPPORTED;
}
CPU_DISASSEMBLE( mcs48 )
{
int b, a, d, r, p; /* these can all be filled in by parsing an instruction */
int i;
int op;
int cnt = 1;
int code, bit;
const char *cp;
if (!OpInizialized) InitDasm8039();
code = oprom[0];
op = -1; /* no matching opcode */
for ( i = 0; i < MAX_OPS; i++)
{
if( (code & Op[i].mask) == Op[i].bits )
{
if (op != -1)
{
fprintf(stderr, "Error: opcode %02X matches %d (%s) and %d (%s)\n",
code,i,Op[i].fmt,op,Op[op].fmt);
}
op = i;
}
}
if (op == -1)
{
sprintf(buffer,"db %2.2x",code);
return cnt | DASMFLAG_SUPPORTED;
}
if (Op[op].extcode)
{
cnt++;
code <<= 8;
code |= opram[1];
bit = 15;
}
else
{
bit = 7;
}
/* shift out operands */
cp = Op[op].parse;
b = a = d = r = p = 0;
while (bit >= 0)
{
/* mame_printf_debug("{%c/%d}",*cp,bit); */
switch(*cp)
{
case 'a': a <<=1; a |= ((code & (1<<bit)) ? 1 : 0); bit--; break;
case 'b': b <<=1; b |= ((code & (1<<bit)) ? 1 : 0); bit--; break;
case 'd': d <<=1; d |= ((code & (1<<bit)) ? 1 : 0); bit--; break;
case 'r': r <<=1; r |= ((code & (1<<bit)) ? 1 : 0); bit--; break;
case 'p': p <<=1; p |= ((code & (1<<bit)) ? 1 : 0); bit--; break;
case ' ': break;
case '1': case '0': bit--; break;
case '\0': fatalerror("premature end of parse string, opcode %x, bit = %d\n",code,bit); break;
}
cp++;
}
/* now traverse format string */
cp = Op[op].fmt;
while (*cp)
{
if (*cp == '%')
{
char num[10], *q;
cp++;
switch (*cp++)
{
case 'A': sprintf(num,"$%03X",a); break;
case 'J': sprintf(num,"$%03X",((pc+1) & 0xf00) | a); break;
case 'B': sprintf(num,"%d",b); break;
case 'D': sprintf(num,"%d",d); break;
case 'X': sprintf(num,"%X",d); break;
case 'R': sprintf(num,"r%d",r); break;
case 'P': sprintf(num,"p%d",p); break;
default:
fatalerror("illegal escape character in format '%s'\n",Op[op].fmt);
break;
}
q = num; while (*q) *buffer++ = *q++;
*buffer = '\0';
}
else
{
*buffer++ = *cp++;
*buffer = '\0';
}
}
return cnt | Op[op].flags | DASMFLAG_SUPPORTED;
return common_dasm(device, buffer, pc, oprom, opram, FALSE);
}
CPU_DISASSEMBLE( upi41 )
{
return common_dasm(device, buffer, pc, oprom, opram, TRUE);
}

View File

@ -62,19 +62,74 @@ A few notes:
***************************************************************************/
#include "driver.h"
#include "deprecat.h"
#include "cpu/m6502/m6502.h"
#include "sound/ay8910.h"
#include "includes/btime.h"
#define MASTER_CLOCK (XTAL_12MHz)
#define MASTER_CLOCK XTAL_12MHz
#define HCLK (MASTER_CLOCK/2)
#define HCLK1 (HCLK/2)
#define HCLK2 (HCLK1/2)
#define HCLK4 (HCLK2/2)
enum
{
AUDIO_ENABLE_NONE,
AUDIO_ENABLE_DIRECT, /* via direct address in memory map */
AUDIO_ENABLE_AY8910 /* via ay-8910 port A */
};
static WRITE8_HANDLER( audio_command_w );
static READ8_HANDLER( audio_command_r );
static UINT8 *decrypted;
static UINT8 *rambase;
static UINT8 *audio_rambase;
static UINT8 audio_nmi_enable_type;
static UINT8 audio_nmi_enabled;
static UINT8 audio_nmi_state;
static MACHINE_START( btime )
{
/* by default, the audio NMI is disabled, except for bootlegs which don't use the enable */
audio_nmi_enabled = (audio_nmi_enable_type == AUDIO_ENABLE_NONE);
}
static WRITE8_HANDLER( audio_nmi_enable_w )
{
/* for most games, this serves as the NMI enable for the audio CPU; however,
lnc and disco use bit 0 of the first AY-8910's port A instead; many other
games also write there in addition to this address */
if (audio_nmi_enable_type == AUDIO_ENABLE_DIRECT)
{
audio_nmi_enabled = data & 1;
cpu_set_input_line(space->machine->cpu[1], INPUT_LINE_NMI, (audio_nmi_enabled && audio_nmi_state) ? ASSERT_LINE : CLEAR_LINE);
}
}
static WRITE8_HANDLER( ay_audio_nmi_enable_w )
{
/* port A bit 0, when 1, inhibits the NMI */
if (audio_nmi_enable_type == AUDIO_ENABLE_AY8910)
{
audio_nmi_enabled = ~data & 1;
cpu_set_input_line(space->machine->cpu[1], INPUT_LINE_NMI, (audio_nmi_enabled && audio_nmi_state) ? ASSERT_LINE : CLEAR_LINE);
}
}
static TIMER_DEVICE_CALLBACK( audio_nmi_gen )
{
int scanline = param;
audio_nmi_state = scanline & 8;
cpu_set_input_line(timer->machine->cpu[1], INPUT_LINE_NMI, (audio_nmi_enabled && audio_nmi_state) ? ASSERT_LINE : CLEAR_LINE);
}
INLINE UINT8 swap_bits_5_6(UINT8 data)
@ -119,7 +174,7 @@ static WRITE8_HANDLER( lnc_w )
else if (offset >= 0x3c00 && offset <= 0x3fff) { lnc_videoram_w(space,offset - 0x3c00,data); return; }
else if (offset >= 0x7c00 && offset <= 0x7fff) { lnc_mirrorvideoram_w(space,offset - 0x7c00,data); return; }
else if (offset == 0x8000) { return; } /* SMH_NOP */
else if (offset == 0x8001) { lnc_video_control_w(space,0,data); return; }
else if (offset == 0x8001) { bnj_video_control_w(space,0,data); return; }
else if (offset == 0x8003) ;
else if (offset == 0x9000) { return; } /* SMH_NOP */
else if (offset == 0x9002) { audio_command_w(space,0,data); return; }
@ -137,7 +192,7 @@ static WRITE8_HANDLER( mmonkey_w )
if (offset <= 0x3bff) ;
else if (offset >= 0x3c00 && offset <= 0x3fff) { lnc_videoram_w(space,offset - 0x3c00,data); return; }
else if (offset >= 0x7c00 && offset <= 0x7fff) { lnc_mirrorvideoram_w(space,offset - 0x7c00,data); return; }
else if (offset == 0x8001) { lnc_video_control_w(space,0,data); return; }
else if (offset == 0x8001) { bnj_video_control_w(space,0,data); return; }
else if (offset == 0x8003) ;
else if (offset == 0x9000) { return; } /* SMH_NOP */
else if (offset == 0x9002) { audio_command_w(space,0,data); return; }
@ -303,7 +358,7 @@ static ADDRESS_MAP_START( lnc_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x7800, 0x7bff) AM_WRITE(SMH_RAM) AM_BASE(&btime_colorram) /* this is just here to initialize the pointer */
AM_RANGE(0x7c00, 0x7fff) AM_READWRITE(btime_mirrorvideoram_r, lnc_mirrorvideoram_w)
AM_RANGE(0x8000, 0x8000) AM_READ_PORT("DSW1") AM_WRITENOP /* ??? */
AM_RANGE(0x8001, 0x8001) AM_READ_PORT("DSW2") AM_WRITE(lnc_video_control_w)
AM_RANGE(0x8001, 0x8001) AM_READ_PORT("DSW2") AM_WRITE(bnj_video_control_w)
AM_RANGE(0x8003, 0x8003) AM_WRITE(SMH_RAM) AM_BASE(&lnc_charbank)
AM_RANGE(0x9000, 0x9000) AM_READ_PORT("P1") AM_WRITENOP /* IRQ ack??? */
AM_RANGE(0x9001, 0x9001) AM_READ_PORT("P2")
@ -320,7 +375,7 @@ static ADDRESS_MAP_START( mmonkey_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x7800, 0x7bff) AM_WRITE(SMH_RAM) AM_BASE(&btime_colorram) /* this is just here to initialize the pointer */
AM_RANGE(0x7c00, 0x7fff) AM_READWRITE(btime_mirrorvideoram_r, lnc_mirrorvideoram_w)
AM_RANGE(0x8000, 0x8000) AM_READ_PORT("DSW1")
AM_RANGE(0x8001, 0x8001) AM_READ_PORT("DSW2") AM_WRITE(lnc_video_control_w)
AM_RANGE(0x8001, 0x8001) AM_READ_PORT("DSW2") AM_WRITE(bnj_video_control_w)
AM_RANGE(0x8003, 0x8003) AM_WRITE(SMH_RAM) AM_BASE(&lnc_charbank)
AM_RANGE(0x9000, 0x9000) AM_READ_PORT("P1") AM_WRITENOP /* IRQ ack??? */
AM_RANGE(0x9001, 0x9001) AM_READ_PORT("P2")
@ -365,16 +420,16 @@ static ADDRESS_MAP_START( disco_map, ADDRESS_SPACE_PROGRAM, 8 )
ADDRESS_MAP_END
static ADDRESS_MAP_START( audio_map, ADDRESS_SPACE_PROGRAM, 8 )
AM_RANGE(0x0000, 0x03ff) AM_RAM AM_BASE(&audio_rambase)
AM_RANGE(0x0400, 0x0fff) AM_ROM AM_REGION("audio", 0xf400)
AM_RANGE(0x2000, 0x2fff) AM_WRITE(ay8910_write_port_0_w)
AM_RANGE(0x4000, 0x4fff) AM_WRITE(ay8910_control_port_0_w)
AM_RANGE(0x6000, 0x6fff) AM_WRITE(ay8910_write_port_1_w)
AM_RANGE(0x8000, 0x8fff) AM_WRITE(ay8910_control_port_1_w)
AM_RANGE(0xa000, 0xafff) AM_READ(soundlatch_r)
AM_RANGE(0xc000, 0xcfff) AM_WRITE(interrupt_enable_w)
AM_RANGE(0xf000, 0xffff) AM_ROM
AM_RANGE(0x0000, 0x03ff) AM_MIRROR(0x1c00) AM_RAM AM_BASE(&audio_rambase)
AM_RANGE(0x2000, 0x3fff) AM_WRITE(ay8910_write_port_0_w)
AM_RANGE(0x4000, 0x5fff) AM_WRITE(ay8910_control_port_0_w)
AM_RANGE(0x6000, 0x7fff) AM_WRITE(ay8910_write_port_1_w)
AM_RANGE(0x8000, 0x9fff) AM_WRITE(ay8910_control_port_1_w)
AM_RANGE(0xa000, 0xbfff) AM_READ(audio_command_r)
AM_RANGE(0xc000, 0xdfff) AM_WRITE(audio_nmi_enable_w)
AM_RANGE(0xe000, 0xefff) AM_MIRROR(0x1000) AM_ROM
ADDRESS_MAP_END
static ADDRESS_MAP_START( disco_audio_map, ADDRESS_SPACE_PROGRAM, 8 )
@ -409,7 +464,13 @@ static INPUT_CHANGED( coin_inserted_nmi_lo )
static WRITE8_HANDLER( audio_command_w )
{
soundlatch_w(space,offset,data);
cpu_set_input_line(space->machine->cpu[1], 0, HOLD_LINE);
cpu_set_input_line(space->machine->cpu[1], 0, ASSERT_LINE);
}
static READ8_HANDLER( audio_command_r )
{
cpu_set_input_line(space->machine->cpu[1], 0, CLEAR_LINE);
return soundlatch_r(space,offset);
}
@ -1085,12 +1146,12 @@ INPUT_PORTS_END
static const gfx_layout tile8layout =
{
8,8, /* 8*8 characters */
8,8,
RGN_FRAC(1,3),
3,
{ RGN_FRAC(2,3), RGN_FRAC(1,3), RGN_FRAC(0,3) },
{ 0, 1, 2, 3, 4, 5, 6, 7 },
{ 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 },
{ STEP8(0,1) },
{ STEP8(0,8) },
8*8
};
@ -1098,15 +1159,13 @@ static const gfx_layout tile8layout =
static const gfx_layout tile16layout =
{
16,16, /* 16*16 sprites */
RGN_FRAC(1,3), /* 64 characters */
3, /* 3 bits per pixel */
{ RGN_FRAC(2,3), RGN_FRAC(1,3), RGN_FRAC(0,3) }, /* the bitplanes are separated */
{ 16*8+0, 16*8+1, 16*8+2, 16*8+3, 16*8+4, 16*8+5, 16*8+6, 16*8+7,
0, 1, 2, 3, 4, 5, 6, 7 },
{ 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8,
8*8, 9*8, 10*8, 11*8, 12*8, 13*8, 14*8, 15*8 },
32*8 /* every sprite takes 32 consecutive bytes */
16,16,
RGN_FRAC(1,3),
3,
{ RGN_FRAC(2,3), RGN_FRAC(1,3), RGN_FRAC(0,3) },
{ STEP8(16*8,1), STEP8(0,1) },
{ STEP16(0,8) },
32*8
};
@ -1117,10 +1176,8 @@ static const gfx_layout bnj_tile16layout =
RGN_FRAC(1,2),
3,
{ RGN_FRAC(1,2)+4, RGN_FRAC(0,2)+0, RGN_FRAC(0,2)+4 },
{ 3*16*8+0, 3*16*8+1, 3*16*8+2, 3*16*8+3, 2*16*8+0, 2*16*8+1, 2*16*8+2, 2*16*8+3,
16*8+0, 16*8+1, 16*8+2, 16*8+3, 0, 1, 2, 3 },
{ 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8,
8*8, 9*8, 10*8, 11*8, 12*8, 13*8, 14*8, 15*8 },
{ STEP4(3*16*8,1), STEP4(2*16*8,1), STEP4(1*16*8,1), STEP4(0*16*8,1) },
{ STEP16(0,8) },
64*8
};
@ -1160,23 +1217,29 @@ GFXDECODE_END
static const ay8910_interface ay1_intf =
{
AY8910_LEGACY_OUTPUT,
AY8910_DEFAULT_LOADS,
NULL, NULL, ay_audio_nmi_enable_w, NULL
};
static MACHINE_DRIVER_START( btime )
/* basic machine hardware */
MDRV_CPU_ADD("main", M6502, 1500000)
MDRV_CPU_ADD("main", M6502, HCLK2) /* seletable between H2/H4 via jumper */
MDRV_CPU_PROGRAM_MAP(btime_map,0)
MDRV_CPU_ADD("audio", M6502, 500000)
MDRV_CPU_ADD("audio", M6502, HCLK1/3/2)
MDRV_CPU_PROGRAM_MAP(audio_map,0)
MDRV_CPU_VBLANK_INT_HACK(nmi_line_pulse,16)
MDRV_TIMER_ADD_SCANLINE("audionmi", audio_nmi_gen, "main", 0, 8)
/* video hardware */
MDRV_SCREEN_ADD("main", RASTER)
MDRV_SCREEN_REFRESH_RATE(57)
MDRV_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(3072))
MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
MDRV_SCREEN_SIZE(32*8, 32*8)
MDRV_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1)
MDRV_SCREEN_RAW_PARAMS(HCLK, 384, 8, 248, 272, 8, 248)
MDRV_MACHINE_START(btime)
MDRV_GFXDECODE(btime)
MDRV_PALETTE_LENGTH(16)
@ -1188,10 +1251,11 @@ static MACHINE_DRIVER_START( btime )
/* audio hardware */
MDRV_SPEAKER_STANDARD_MONO("mono")
MDRV_SOUND_ADD("ay1", AY8910, 1500000)
MDRV_SOUND_ADD("ay1", AY8910, HCLK2)
MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.23)
MDRV_SOUND_CONFIG(ay1_intf)
MDRV_SOUND_ADD("ay2", AY8910, 1500000)
MDRV_SOUND_ADD("ay2", AY8910, HCLK2)
MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.23)
MACHINE_DRIVER_END
@ -1221,9 +1285,6 @@ static MACHINE_DRIVER_START( lnc )
MDRV_CPU_MODIFY("main")
MDRV_CPU_PROGRAM_MAP(lnc_map,0)
MDRV_CPU_MODIFY("audio")
MDRV_CPU_VBLANK_INT_HACK(lnc_sound_interrupt,16)
MDRV_MACHINE_RESET(lnc)
/* video hardware */
@ -1239,8 +1300,6 @@ static MACHINE_DRIVER_START( wtennis )
/* basic machine hardware */
MDRV_IMPORT_FROM(lnc)
MDRV_CPU_MODIFY("audio")
MDRV_CPU_VBLANK_INT_HACK(nmi_line_pulse,16)
/* video hardware */
MDRV_VIDEO_UPDATE(eggs)
@ -1260,7 +1319,7 @@ static MACHINE_DRIVER_START( bnj )
/* basic machine hardware */
MDRV_IMPORT_FROM(btime)
MDRV_CPU_REPLACE("main", M6502, 750000)
MDRV_CPU_REPLACE("main", M6502, HCLK4)
MDRV_CPU_PROGRAM_MAP(bnj_map,0)
/* video hardware */
@ -1291,7 +1350,7 @@ static MACHINE_DRIVER_START( disco )
/* basic machine hardware */
MDRV_IMPORT_FROM(btime)
MDRV_CPU_REPLACE("main", M6502, 750000)
MDRV_CPU_REPLACE("main", M6502, HCLK4)
MDRV_CPU_PROGRAM_MAP(disco_map,0)
MDRV_CPU_MODIFY("audio")
@ -1331,7 +1390,7 @@ ROM_START( btime )
ROM_LOAD( "aa07.15b", 0xf000, 0x1000, CRC(086440ad) SHA1(4a32bc92f8ff5fbe112f56e62d2c03da8851a7b9) )
ROM_REGION( 0x10000, "audio", 0 )
ROM_LOAD( "ab14.12h", 0xf000, 0x1000, CRC(f55e5211) SHA1(27940026d0c6212d1138d2fd88880df697218627) )
ROM_LOAD( "ab14.12h", 0xe000, 0x1000, CRC(f55e5211) SHA1(27940026d0c6212d1138d2fd88880df697218627) )
ROM_REGION( 0x6000, "gfx1", ROMREGION_DISPOSE )
ROM_LOAD( "aa12.7k", 0x0000, 0x1000, CRC(c4617243) SHA1(24204d591aa2c264a852ee9ba8c4be63efd97728) ) /* charset #1 */
@ -1359,7 +1418,7 @@ ROM_START( btime2 )
ROM_LOAD( "aa07.15b", 0xf000, 0x1000, CRC(086440ad) SHA1(4a32bc92f8ff5fbe112f56e62d2c03da8851a7b9) )
ROM_REGION( 0x10000, "audio", 0 )
ROM_LOAD( "ab14.12h", 0xf000, 0x1000, CRC(f55e5211) SHA1(27940026d0c6212d1138d2fd88880df697218627) )
ROM_LOAD( "ab14.12h", 0xe000, 0x1000, CRC(f55e5211) SHA1(27940026d0c6212d1138d2fd88880df697218627) )
ROM_REGION( 0x6000, "gfx1", ROMREGION_DISPOSE )
ROM_LOAD( "aa12.7k", 0x0000, 0x1000, CRC(c4617243) SHA1(24204d591aa2c264a852ee9ba8c4be63efd97728) ) /* charset #1 */
@ -1387,7 +1446,7 @@ ROM_START( btimem )
ROM_LOAD( "ab07.15b", 0xf000, 0x1000, CRC(a142f862) SHA1(39d7ef172d18874885f1b1542e885cc4287dc344) )
ROM_REGION( 0x10000, "audio", 0 )
ROM_LOAD( "ab14.12h", 0xf000, 0x1000, CRC(f55e5211) SHA1(27940026d0c6212d1138d2fd88880df697218627) )
ROM_LOAD( "ab14.12h", 0xe000, 0x1000, CRC(f55e5211) SHA1(27940026d0c6212d1138d2fd88880df697218627) )
ROM_REGION( 0x6000, "gfx1", ROMREGION_DISPOSE )
ROM_LOAD( "ab12.7k", 0x0000, 0x1000, CRC(6c79f79f) SHA1(338009199b5889621693833d88c35abb8e9e38a2) ) /* charset #1 */
@ -1414,7 +1473,7 @@ ROM_START( cookrace )
ROM_LOAD( "2k", 0xffe0, 0x0020, CRC(e2553b3d) SHA1(0a38929cdb3f37c6e4bacc5c3f94c049b4352858) ) /* reset/interrupt vectors */
ROM_REGION( 0x10000, "audio", 0 )
ROM_LOAD( "6f.6", 0xf000, 0x1000, CRC(6b8e0272) SHA1(372a891b7b357aea0297ba9bcae752c3c9d8c1be) ) /* starts at 0000, not f000; 0000-01ff is RAM */
ROM_LOAD( "6f.6", 0xe000, 0x1000, CRC(6b8e0272) SHA1(372a891b7b357aea0297ba9bcae752c3c9d8c1be) ) /* starts at 0000, not f000; 0000-01ff is RAM */
ROM_REGION( 0x6000, "gfx1", ROMREGION_DISPOSE )
ROM_LOAD( "m8.7", 0x0000, 0x2000, CRC(a1a0d5a6) SHA1(e9583320e9c303407abfe02988b95403e5209c52) ) /* charset #1 */
@ -1447,7 +1506,7 @@ ROM_START( tisland )
ROM_LOAD( "t-09.b14", 0xf000, 0x1000, CRC(5b26771a) SHA1(31d86acba4b6549fc08a3947d6d6d1a470fcb9da) )
ROM_REGION( 0x10000, "audio", 0 )
ROM_LOAD( "t-0a.j11", 0xf000, 0x1000, CRC(807e1652) SHA1(ccfee616dc0e34d10a0e62b9864fd987291bf176) )
ROM_LOAD( "t-0a.j11", 0xe000, 0x1000, CRC(807e1652) SHA1(ccfee616dc0e34d10a0e62b9864fd987291bf176) )
ROM_REGION( 0x3000, "gfx1", ROMREGION_DISPOSE )
ROM_LOAD( "t-13.k14", 0x0000, 0x1000, CRC(95bdec2f) SHA1(201b9c53ea53a25535b619231d0d14e08c206ecf) )
@ -1483,7 +1542,7 @@ ROM_START( lnc )
ROM_LOAD( "s0-3a", 0xf000, 0x1000, CRC(beb4b1fc) SHA1(166a96b5757946231f3619844366218065412935) )
ROM_REGION( 0x10000, "audio", 0 )
ROM_LOAD( "sa-1h", 0xf000, 0x1000, CRC(379387ec) SHA1(29d37f04c64ed53a2573962dfa9c0623b89e0045) )
ROM_LOAD( "sa-1h", 0xe000, 0x1000, CRC(379387ec) SHA1(29d37f04c64ed53a2573962dfa9c0623b89e0045) )
ROM_REGION( 0x6000, "gfx1", ROMREGION_DISPOSE )
ROM_LOAD( "s4-11l", 0x0000, 0x1000, CRC(a2162a9e) SHA1(2729cef805c8e863af540424faa1aca82d3525e2) )
@ -1527,7 +1586,7 @@ ROM_START( wtennis )
ROM_LOAD( "t2", 0xf000, 0x1000, CRC(d2f9dd30) SHA1(1faa088806e8627b5e561d8b99054d295045dcfb) )
ROM_REGION( 0x10000, "audio", 0 )
ROM_LOAD( "t1", 0xf000, 0x1000, CRC(40737ea7) SHA1(27e8474028385574035d3982f9c576bb9bb3facd) ) /* starts at 0000, not f000; 0000-01ff is RAM */
ROM_LOAD( "t1", 0xe000, 0x1000, CRC(40737ea7) SHA1(27e8474028385574035d3982f9c576bb9bb3facd) ) /* starts at 0000, not f000; 0000-01ff is RAM */
ROM_REGION( 0x6000, "gfx1", ROMREGION_DISPOSE )
ROM_LOAD( "t7", 0x0000, 0x1000, CRC(aa935169) SHA1(965f41a9fcf35ac7c899e79acd0a85ab588d5831) )
@ -1550,7 +1609,7 @@ ROM_START( mmonkey )
ROM_LOAD( "mmonkey.a4", 0xf000, 0x1000, CRC(f7d3d1e3) SHA1(ff650a833e5e8975fe5b4a644ce6c35de5e04740) )
ROM_REGION( 0x10000, "audio", 0 )
ROM_LOAD( "mmonkey.h1", 0xf000, 0x1000, CRC(5bcb2e81) SHA1(60fb8fd83c83b278e3aaf96f0b6dbefbc1eef0f7) )
ROM_LOAD( "mmonkey.h1", 0xe000, 0x1000, CRC(5bcb2e81) SHA1(60fb8fd83c83b278e3aaf96f0b6dbefbc1eef0f7) )
ROM_REGION( 0x6000, "gfx1", ROMREGION_DISPOSE )
ROM_LOAD( "mmonkey.l11", 0x0000, 0x1000, CRC(b6aa8566) SHA1(bc90d4cfa9a221477d1989fea532621ce3e76439) )
@ -1572,7 +1631,7 @@ ROM_START( brubber )
ROM_LOAD( "brubber.12d", 0xe000, 0x2000, CRC(b2ce51f5) SHA1(5e38ea24bcafef1faba023def96532abd6f97d38) )
ROM_REGION( 0x10000, "audio", 0 )
ROM_LOAD( "bnj6c.bin", 0xf000, 0x1000, CRC(8c02f662) SHA1(1279d564e65fd3ccac25b1f9fbb40d910de2b544) )
ROM_LOAD( "bnj6c.bin", 0xe000, 0x1000, CRC(8c02f662) SHA1(1279d564e65fd3ccac25b1f9fbb40d910de2b544) )
ROM_REGION( 0x6000, "gfx1", ROMREGION_DISPOSE )
ROM_LOAD( "bnj4e.bin", 0x0000, 0x2000, CRC(b864d082) SHA1(cacf71fa6c0f7121d077381a0ff6222f534295ab) )
@ -1591,7 +1650,7 @@ ROM_START( bnj )
ROM_LOAD( "bnj12d.bin", 0xe000, 0x2000, CRC(b88bc99e) SHA1(08a4ddea4037f9e14d0d9f4262a1746b0a3a140c) )
ROM_REGION( 0x10000, "audio", 0 )
ROM_LOAD( "bnj6c.bin", 0xf000, 0x1000, CRC(8c02f662) SHA1(1279d564e65fd3ccac25b1f9fbb40d910de2b544) )
ROM_LOAD( "bnj6c.bin", 0xe000, 0x1000, CRC(8c02f662) SHA1(1279d564e65fd3ccac25b1f9fbb40d910de2b544) )
ROM_REGION( 0x6000, "gfx1", ROMREGION_DISPOSE )
ROM_LOAD( "bnj4e.bin", 0x0000, 0x2000, CRC(b864d082) SHA1(cacf71fa6c0f7121d077381a0ff6222f534295ab) )
@ -1610,7 +1669,7 @@ ROM_START( caractn )
ROM_LOAD( "c6.12d", 0xe000, 0x2000, CRC(1d6957c4) SHA1(bd30f00187e56eef9adcc167dd752a3bb616454c) )
ROM_REGION( 0x10000, "audio", 0 )
ROM_LOAD( "c5.6c", 0xf000, 0x1000, CRC(8c02f662) SHA1(1279d564e65fd3ccac25b1f9fbb40d910de2b544) )
ROM_LOAD( "c5.6c", 0xe000, 0x1000, CRC(8c02f662) SHA1(1279d564e65fd3ccac25b1f9fbb40d910de2b544) )
ROM_REGION( 0x6000, "gfx1", ROMREGION_DISPOSE )
ROM_LOAD( "c0.4e", 0x0000, 0x2000, CRC(bf3ea732) SHA1(d98970b2dda8c3435506656909e5e3aa70d45652) )
@ -1632,12 +1691,12 @@ ROM_END
ROM_START( zoar )
ROM_REGION( 0x10000, "main", 0 )
ROM_LOAD( "zoar15", 0xd000, 0x1000, BAD_DUMP CRC(1f0cfdb7) SHA1(ce7e871f17c52b6eaf99cfb721e702e4f0e6bb25) )
ROM_LOAD( "zoar15", 0xd000, 0x1000, CRC(1f0cfdb7) SHA1(ce7e871f17c52b6eaf99cfb721e702e4f0e6bb25) )
ROM_LOAD( "zoar16", 0xe000, 0x1000, CRC(7685999c) SHA1(fabe38d71e797ae0b04b5d3aba228b4c85d96185) )
ROM_LOAD( "zoar17", 0xf000, 0x1000, CRC(619ea867) SHA1(0a3735384f03a1052d54ab799b5e37038d8ece2a) )
ROM_REGION( 0x10000, "audio", 0 )
ROM_LOAD( "zoar09", 0xf000, 0x1000, CRC(18d96ff1) SHA1(671d934a451e0b042450ea86d24c3751a39b38f8) )
ROM_LOAD( "zoar09", 0xe000, 0x1000, CRC(18d96ff1) SHA1(671d934a451e0b042450ea86d24c3751a39b38f8) )
ROM_REGION( 0x6000, "gfx1", ROMREGION_DISPOSE )
ROM_LOAD( "zoar00", 0x0000, 0x1000, CRC(fd2dcb64) SHA1(1a49a6ec6ffd354d872b1af83d55ec96e8215b2b) )
@ -1710,7 +1769,7 @@ ROM_START( sdtennis )
ROM_LOAD( "ao_06.12d", 0xe000, 0x2000, CRC(413c984c) SHA1(1431df4db52d621ba39fd47dbd49da103b5c0bcf) )
ROM_REGION( 0x10000, "audio", 0 )
ROM_LOAD( "ao_05.6c", 0xf000, 0x1000, CRC(46833e38) SHA1(420831149a566199d6a3c74ef3df0687b4ddcbe4) )
ROM_LOAD( "ao_05.6c", 0xe000, 0x1000, CRC(46833e38) SHA1(420831149a566199d6a3c74ef3df0687b4ddcbe4) )
ROM_REGION( 0x6000, "gfx1", ROMREGION_DISPOSE )
ROM_LOAD( "ao_00.4e", 0x0000, 0x2000, CRC(f4e0cbd6) SHA1(a2ede0ce4a26957a5d3b62872a42b8979f5000aa) )
@ -1769,6 +1828,7 @@ static void init_rom1(running_machine *machine)
static DRIVER_INIT( btime )
{
init_rom1(machine);
audio_nmi_enable_type = AUDIO_ENABLE_DIRECT;
}
static DRIVER_INIT( zoar )
@ -1782,6 +1842,7 @@ static DRIVER_INIT( zoar )
memset(&rom[0xd50a],0xea,8);
init_rom1(machine);
audio_nmi_enable_type = AUDIO_ENABLE_AY8910;
}
static DRIVER_INIT( tisland )
@ -1795,46 +1856,74 @@ static DRIVER_INIT( tisland )
memset(&rom[0xa2b6],0x24,1);
init_rom1(machine);
audio_nmi_enable_type = AUDIO_ENABLE_DIRECT;
}
static DRIVER_INIT( lnc )
{
decrypt_C10707_cpu(machine, "main");
audio_nmi_enable_type = AUDIO_ENABLE_AY8910;
}
static DRIVER_INIT( bnj )
{
decrypt_C10707_cpu(machine, "main");
audio_nmi_enable_type = AUDIO_ENABLE_DIRECT;
}
static DRIVER_INIT( disco )
{
DRIVER_INIT_CALL(btime);
audio_nmi_enable_type = AUDIO_ENABLE_AY8910;
}
static DRIVER_INIT( cookrace )
{
memcpy(&audio_rambase[0x200], memory_region(machine, "audio") + 0xf200, 0x200);
decrypt_C10707_cpu(machine, "main");
memory_install_read8_handler(cpu_get_address_space(machine->cpu[1], ADDRESS_SPACE_PROGRAM), 0x0200, 0x0fff, 0, 0, SMH_BANK10);
memory_set_bankptr(machine, 10, memory_region(machine, "audio") + 0xe200);
audio_nmi_enable_type = AUDIO_ENABLE_DIRECT;
}
static DRIVER_INIT( protennb )
{
DRIVER_INIT_CALL(btime);
audio_nmi_enable_type = AUDIO_ENABLE_AY8910;
}
static DRIVER_INIT( wtennis )
{
memcpy(&audio_rambase[0x200], memory_region(machine, "audio") + 0xf200, 0x200);
memory_install_read8_handler(cpu_get_address_space(machine->cpu[0], ADDRESS_SPACE_PROGRAM), 0xc15f, 0xc15f, 0, 0, wtennis_reset_hack_r);
decrypt_C10707_cpu(machine, "main");
memory_install_read8_handler(cpu_get_address_space(machine->cpu[0], ADDRESS_SPACE_PROGRAM), 0xc15f, 0xc15f, 0, 0, wtennis_reset_hack_r);
memory_install_read8_handler(cpu_get_address_space(machine->cpu[1], ADDRESS_SPACE_PROGRAM), 0x0200, 0x0fff, 0, 0, SMH_BANK10);
memory_set_bankptr(machine, 10, memory_region(machine, "audio") + 0xe200);
audio_nmi_enable_type = AUDIO_ENABLE_DIRECT;
}
static DRIVER_INIT( sdtennis )
{
decrypt_C10707_cpu(machine, "main");
decrypt_C10707_cpu(machine, "audio");
audio_nmi_enable_type = AUDIO_ENABLE_DIRECT;
}
GAME( 1982, btime, 0, btime, btime, btime, ROT270, "Data East Corporation", "Burger Time (Data East set 1)", 0 )
GAME( 1982, btime2, btime, btime, btime, btime, ROT270, "Data East Corporation", "Burger Time (Data East set 2)", 0 )
GAME( 1982, btimem, btime, btime, btime, btime, ROT270, "Data East (Bally Midway license)", "Burger Time (Midway)", 0 )
GAME( 1982, cookrace, btime, cookrace, cookrace, cookrace,ROT270, "bootleg", "Cook Race", 0 )
GAME( 1982, cookrace, btime, cookrace, cookrace, cookrace, ROT270, "bootleg", "Cook Race", 0 )
GAME( 1981, tisland, 0, tisland, btime, tisland, ROT270, "Data East Corporation", "Treasure Island", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS )
GAME( 1981, lnc, 0, lnc, lnc, lnc, ROT270, "Data East Corporation", "Lock'n'Chase", 0 )
GAME( 1982, protennb, 0, disco, disco, btime, ROT270, "bootleg", "Tennis (bootleg of Pro Tennis)", 0 )
GAME( 1982, protennb, 0, disco, disco, protennb, ROT270, "bootleg", "Tennis (bootleg of Pro Tennis)", 0 )
GAME( 1982, wtennis, 0, wtennis, wtennis, wtennis, ROT270, "bootleg", "World Tennis", 0 )
GAME( 1982, mmonkey, 0, mmonkey, mmonkey, lnc, ROT270, "Technos + Roller Tron", "Minky Monkey", 0 )
GAME( 1982, brubber, 0, bnj, bnj, lnc, ROT270, "Data East", "Burnin' Rubber", 0 )
GAME( 1982, bnj, brubber, bnj, bnj, lnc, ROT270, "Data East USA (Bally Midway license)", "Bump 'n' Jump", 0 )
GAME( 1982, caractn, brubber, bnj, bnj, lnc, ROT270, "bootleg", "Car Action", 0 )
GAME( 1982, brubber, 0, bnj, bnj, bnj, ROT270, "Data East", "Burnin' Rubber", 0 )
GAME( 1982, bnj, brubber, bnj, bnj, bnj, ROT270, "Data East USA (Bally Midway license)", "Bump 'n' Jump", 0 )
GAME( 1982, caractn, brubber, bnj, bnj, bnj, ROT270, "bootleg", "Car Action", 0 )
GAME( 1982, zoar, 0, zoar, zoar, zoar, ROT270, "Data East USA", "Zoar", 0 )
GAME( 1982, disco, 0, disco, disco, btime, ROT270, "Data East", "Disco No.1", 0 )
GAME( 1982, discof, disco, disco, disco, btime, ROT270, "Data East", "Disco No.1 (Rev.F)", 0 )
GAME( 1983, sdtennis, 0, bnj, sdtennis, sdtennis,ROT270, "Data East Corporation", "Super Doubles Tennis", 0 )
GAME( 1982, disco, 0, disco, disco, disco, ROT270, "Data East", "Disco No.1", 0 )
GAME( 1982, discof, disco, disco, disco, disco, ROT270, "Data East", "Disco No.1 (Rev.F)", 0 )
GAME( 1983, sdtennis, 0, bnj, sdtennis, sdtennis, ROT270, "Data East Corporation", "Super Doubles Tennis", 0 )

View File

@ -54,10 +54,17 @@
#include "driver.h"
#include "cpu/m6502/m6502.h"
#include "cpu/i8x41/i8x41.h"
#include "cpu/mcs48/mcs48.h"
#include "machine/decocass.h"
#include "sound/ay8910.h"
#define MASTER_CLOCK XTAL_12MHz
#define HCLK (MASTER_CLOCK/2)
#define HCLK1 (HCLK/2)
#define HCLK2 (HCLK1/2)
#define HCLK4 (HCLK2/2)
static UINT8 *decocass_rambase;
static UINT8 *decrypted;
@ -142,8 +149,8 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( decocass_mcu_portmap, ADDRESS_SPACE_IO, 8 )
AM_RANGE(0x01, 0x01) AM_READWRITE(i8041_p1_r, i8041_p1_w)
AM_RANGE(0x02, 0x02) AM_READWRITE(i8041_p2_r, i8041_p2_w)
AM_RANGE(MCS48_PORT_P1, MCS48_PORT_P1) AM_READWRITE(i8041_p1_r, i8041_p1_w)
AM_RANGE(MCS48_PORT_P2, MCS48_PORT_P2) AM_READWRITE(i8041_p2_r, i8041_p2_w)
ADDRESS_MAP_END
static INPUT_PORTS_START( decocass )
@ -268,65 +275,47 @@ INPUT_PORTS_END
static const gfx_layout charlayout =
{
8,8, /* 8*8 characters */
1024, /* 1024 characters */
3, /* 3 bits per pixel */
{ 2*1024*8*8, 1024*8*8, 0 }, /* the bitplanes are separated */
{ 0, 1, 2, 3, 4, 5, 6, 7 },
{ 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 },
8*8 /* every char takes 8 consecutive bytes */
8,8,
1024,
3,
{ 2*1024*8*8, 1*1024*8*8, 0*1024*8*8 },
{ STEP8(0,1) },
{ STEP8(0,8) },
8*8
};
static const gfx_layout spritelayout =
{
16,16, /* 16*16 sprites */
256, /* 256 sprites */
3, /* 3 bits per pixel */
{ 2*256*16*16, 256*16*16, 0 }, /* the bitplanes are separated */
{ 16*8+0, 16*8+1, 16*8+2, 16*8+3, 16*8+4, 16*8+5, 16*8+6, 16*8+7,
0, 1, 2, 3, 4, 5, 6, 7 },
{ 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8,
8*8, 9*8, 10*8, 11*8, 12*8, 13*8, 14*8, 15*8 },
32*8 /* every sprite takes 32 consecutive bytes */
16,16,
256,
3,
{ 2*256*16*16, 1*256*16*16, 0*256*16*16 },
{ STEP8(16*8,1), STEP8(0*8,1) },
{ STEP16(0,8) },
32*8
};
static const gfx_layout tilelayout =
{
16,16, /* 16*16 characters */
16,16,
16+1, /* 16 tiles (+1 empty tile used in the half-width bg tilemaps) */
3, /* 3 bits per pixel */
3,
{ 2*16*16*16+4, 2*16*16*16+0, 4 },
{ 3*16*8+0, 3*16*8+1, 3*16*8+2, 3*16*8+3,
2*16*8+0, 2*16*8+1, 2*16*8+2, 2*16*8+3,
16*8+0, 16*8+1, 16*8+2, 16*8+3,
0, 1, 2, 3 },
{ 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8,
8*8, 9*8,10*8,11*8,12*8,13*8,14*8,15*8 },
2*16*16 /* every tile takes 64 consecutive bytes */
{ STEP4(3*16*8,1), STEP4(2*16*8,1), STEP4(1*16*8,1), STEP4(0*16*8,1) },
{ STEP16(0,8) },
2*16*16
};
static const UINT32 objlayout_xoffset[64] =
{
7*8+0,7*8+1,7*8+2,7*8+3,7*8+4,7*8+5,7*8+6,7*8+7,
6*8+0,6*8+1,6*8+2,6*8+3,6*8+4,6*8+5,6*8+6,6*8+7,
5*8+0,5*8+1,5*8+2,5*8+3,5*8+4,5*8+5,5*8+6,5*8+7,
4*8+0,4*8+1,4*8+2,4*8+3,4*8+4,4*8+5,4*8+6,4*8+7,
3*8+0,3*8+1,3*8+2,3*8+3,3*8+4,3*8+5,3*8+6,3*8+7,
2*8+0,2*8+1,2*8+2,2*8+3,2*8+4,2*8+5,2*8+6,2*8+7,
1*8+0,1*8+1,1*8+2,1*8+3,1*8+4,1*8+5,1*8+6,1*8+7,
0*8+0,0*8+1,0*8+2,0*8+3,0*8+4,0*8+5,0*8+6,0*8+7
STEP8(7*8,1), STEP8(6*8,1), STEP8(5*8,1), STEP8(4*8,1),
STEP8(3*8,1), STEP8(2*8,1), STEP8(1*8,1), STEP8(0*8,1)
};
static const UINT32 objlayout_yoffset[64] =
{
63*2*64,62*2*64,61*2*64,60*2*64,59*2*64,58*2*64,57*2*64,56*2*64,
55*2*64,54*2*64,53*2*64,52*2*64,51*2*64,50*2*64,49*2*64,48*2*64,
47*2*64,46*2*64,45*2*64,44*2*64,43*2*64,42*2*64,41*2*64,40*2*64,
39*2*64,38*2*64,37*2*64,36*2*64,35*2*64,34*2*64,33*2*64,32*2*64,
31*2*64,30*2*64,29*2*64,28*2*64,27*2*64,26*2*64,25*2*64,24*2*64,
23*2*64,22*2*64,21*2*64,20*2*64,19*2*64,18*2*64,17*2*64,16*2*64,
15*2*64,14*2*64,13*2*64,12*2*64,11*2*64,10*2*64, 9*2*64, 8*2*64,
7*2*64, 6*2*64, 5*2*64, 4*2*64, 3*2*64, 2*2*64, 1*2*64, 0*2*64
STEP32(63*2*64, -1*2*64),
STEP32(31*2*64, -1*2*64)
};
static const gfx_layout objlayout =
@ -381,26 +370,27 @@ static PALETTE_INIT( decocass )
static MACHINE_DRIVER_START( decocass )
/* basic machine hardware */
MDRV_CPU_ADD("main", M6502,750000)
MDRV_CPU_ADD("main", M6502, HCLK4)
MDRV_CPU_PROGRAM_MAP(decocass_map,0)
MDRV_CPU_ADD("audio", M6502,500000) /* 500 kHz */
MDRV_CPU_ADD("audio", M6502, HCLK1/3/2)
MDRV_CPU_PROGRAM_MAP(decocass_sound_map,0)
MDRV_TIMER_ADD_SCANLINE("audionmi", decocass_audio_nmi_gen, "main", 0, 8)
MDRV_CPU_ADD("mcu", I8041,500000*15) /* 500 kHz ( I doubt it is 400kHz Al! )*/
MDRV_CPU_ADD("mcu", I8041, HCLK)
MDRV_CPU_IO_MAP(decocass_mcu_portmap,0)
MDRV_QUANTUM_TIME(HZ(4200)) /* interleave CPUs */
MDRV_MACHINE_START(decocass)
MDRV_MACHINE_RESET(decocass)
MDRV_DECOCASS_TAPE_ADD("cassette")
/* video hardware */
MDRV_SCREEN_ADD("main", RASTER)
MDRV_SCREEN_REFRESH_RATE(57)
MDRV_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(3072) /* frames per second, vblank duration */)
MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
MDRV_SCREEN_SIZE(32*8, 32*8)
MDRV_SCREEN_VISIBLE_AREA(1*8, 31*8-1, 1*8, 31*8-1)
MDRV_SCREEN_RAW_PARAMS(HCLK, 384, 8, 248, 272, 8, 248)
MDRV_GFXDECODE(decocass)
MDRV_PALETTE_LENGTH(32+2*8+2*4)
@ -412,10 +402,10 @@ static MACHINE_DRIVER_START( decocass )
/* sound hardware */
MDRV_SPEAKER_STANDARD_MONO("mono")
MDRV_SOUND_ADD("ay1", AY8910, 1500000)
MDRV_SOUND_ADD("ay1", AY8910, HCLK2)
MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.40)
MDRV_SOUND_ADD("ay2", AY8910, 1500000)
MDRV_SOUND_ADD("ay2", AY8910, HCLK2)
MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.40)
MACHINE_DRIVER_END
@ -692,41 +682,41 @@ ROM_END
ROM_START( ctsttape )
DECOCASS_COMMON_ROMS
ROM_REGION( 0x00020, "user1", 0 ) /* dongle data */
ROM_REGION( 0x00020, "dongle", 0 ) /* dongle data */
ROM_LOAD( "de-0061.pro", 0x0000, 0x0020, CRC(e09ae5de) SHA1(7dec067d0739a6dad2607132641b66880a5b7751) )
ROM_REGION( 0x10000, "user2", 0 ) /* (max) 64k for cassette image */
ROM_REGION( 0x10000, "cassette", 0 ) /* (max) 64k for cassette image */
ROM_LOAD( "testtape.cas", 0x0000, 0x2000, CRC(4f9d8efb) SHA1(5b77747dad1033e5703f06c0870441b54b4256c5) )
ROM_END
ROM_START( chwy )
DECOCASS_COMMON_ROMS
ROM_REGION( 0x00020, "user1", 0 ) /* dongle data */
ROM_REGION( 0x00020, "dongle", 0 ) /* dongle data */
/* The dongle data is reverse engineered from manual decryption */
ROM_LOAD( "chwy.pro", 0x0000, 0x0020, BAD_DUMP CRC(2fae678e) SHA1(4a7de851442d4c1d690de03262f0e136a52fca35) )
ROM_REGION( 0x10000, "user2", 0 ) /* (max) 64k for cassette image */
ROM_REGION( 0x10000, "cassette", 0 ) /* (max) 64k for cassette image */
ROM_LOAD( "chwy.cas", 0x0000, 0x8000, CRC(68a48064) SHA1(7e389737972fd0c54f398d296159c561f5ec3a93) )
ROM_END
ROM_START( clocknch )
DECOCASS_COMMON_ROMS
ROM_REGION( 0x00020, "user1", 0 ) /* dongle data */
ROM_REGION( 0x00020, "dongle", 0 ) /* dongle data */
ROM_LOAD( "de-0061.pro", 0x0000, 0x0020, CRC(e09ae5de) SHA1(7dec067d0739a6dad2607132641b66880a5b7751) )
ROM_REGION( 0x10000, "user2", 0 ) /* (max) 64k for cassette image */
ROM_REGION( 0x10000, "cassette", 0 ) /* (max) 64k for cassette image */
ROM_LOAD( "clocknch.cas", 0x0000, 0x8000, CRC(c9d163a4) SHA1(3ef55a8d8f603059e263776c08eb81f2cf18b75c) )
ROM_END
ROM_START( ctisland )
DECOCASS_COMMON_ROMS
ROM_REGION( 0x00020, "user1", 0 ) /* dongle data */
ROM_REGION( 0x00020, "dongle", 0 ) /* dongle data */
ROM_LOAD( "de-0061.pro", 0x0000, 0x0020, CRC(e09ae5de) SHA1(7dec067d0739a6dad2607132641b66880a5b7751) )
ROM_REGION( 0x10000, "user2", 0 ) /* (max) 64k for cassette image */
ROM_REGION( 0x10000, "cassette", 0 ) /* (max) 64k for cassette image */
ROM_LOAD( "ctisland.cas", 0x0000, 0x8000, CRC(3f63b8f8) SHA1(2fd0679ef9750a228ebb098672ab6091fda75804) )
ROM_REGION( 0x4000, "user3", 0 ) /* roms from the overlay pcb */
@ -739,10 +729,10 @@ ROM_END
ROM_START( ctislnd2 )
DECOCASS_COMMON_ROMS
ROM_REGION( 0x00020, "user1", 0 ) /* dongle data */
ROM_REGION( 0x00020, "dongle", 0 ) /* dongle data */
ROM_LOAD( "de-0061.pro", 0x0000, 0x0020, CRC(e09ae5de) SHA1(7dec067d0739a6dad2607132641b66880a5b7751) )
ROM_REGION( 0x10000, "user2", 0 ) /* (max) 64k for cassette image */
ROM_REGION( 0x10000, "cassette", 0 ) /* (max) 64k for cassette image */
ROM_LOAD( "ctislnd2.cas", 0x0000, 0x8000, CRC(2854b4c0) SHA1(d3b4e0031dbb2340fbbe396a1ff9b8fbfd63663e) )
ROM_REGION( 0x4000, "user3", 0 ) /* roms from the overlay pcb */
@ -755,10 +745,10 @@ ROM_END
ROM_START( ctislnd3 )
DECOCASS_COMMON_ROMS
ROM_REGION( 0x00020, "user1", 0 ) /* dongle data */
ROM_REGION( 0x00020, "dongle", 0 ) /* dongle data */
ROM_LOAD( "de-0061.pro", 0x0000, 0x0020, CRC(e09ae5de) SHA1(7dec067d0739a6dad2607132641b66880a5b7751) )
ROM_REGION( 0x10000, "user2", 0 ) /* (max) 64k for cassette image */
ROM_REGION( 0x10000, "cassette", 0 ) /* (max) 64k for cassette image */
ROM_LOAD( "ctislnd3.cas", 0x0000, 0x8000, CRC(45464e1e) SHA1(03275694d963c7ab0e0f5525e248e69da5f9b591) )
ROM_REGION( 0x4000, "user3", 0 ) /* roms from the overlay pcb */
@ -771,51 +761,51 @@ ROM_END
ROM_START( csuperas )
DECOCASS_COMMON_ROMS
ROM_REGION( 0x00020, "user1", 0 ) /* dongle data */
ROM_REGION( 0x00020, "dongle", 0 ) /* dongle data */
ROM_LOAD( "de-0061.pro", 0x0000, 0x0020, CRC(e09ae5de) SHA1(7dec067d0739a6dad2607132641b66880a5b7751) )
ROM_REGION( 0x10000, "user2", 0 ) /* (max) 64k for cassette image */
ROM_REGION( 0x10000, "cassette", 0 ) /* (max) 64k for cassette image */
ROM_LOAD( "csuperas.cas", 0x0000, 0x8000, CRC(fabcd07f) SHA1(4070c668ad6725f0710cf7fe6df0d5f80272a449) )
ROM_END
ROM_START( castfant )
DECOCASS_COMMON_ROMS
ROM_REGION( 0x00020, "user1", 0 ) /* dongle data */
ROM_REGION( 0x00020, "dongle", 0 ) /* dongle data */
ROM_LOAD( "de-0061.pro", 0x0000, 0x0020, CRC(e09ae5de) SHA1(7dec067d0739a6dad2607132641b66880a5b7751) )
ROM_REGION( 0x10000, "user2", 0 ) /* (max) 64k for cassette image */
ROM_REGION( 0x10000, "cassette", 0 ) /* (max) 64k for cassette image */
ROM_LOAD( "castfant.cas", 0x0000, 0x8000, CRC(6d77d1b5) SHA1(821bd65fbe887cbeac9281a2ad3f88595918f886) )
ROM_END
ROM_START( cluckypo )
DECOCASS_COMMON_ROMS
ROM_REGION( 0x00020, "user1", 0 ) /* dongle data */
ROM_REGION( 0x00020, "dongle", 0 ) /* dongle data */
ROM_LOAD( "de-0061.pro", 0x0000, 0x0020, CRC(e09ae5de) SHA1(7dec067d0739a6dad2607132641b66880a5b7751) )
ROM_REGION( 0x10000, "user2", 0 ) /* (max) 64k for cassette image */
ROM_REGION( 0x10000, "cassette", 0 ) /* (max) 64k for cassette image */
ROM_LOAD( "cluckypo.cas", 0x0000, 0x8000, CRC(2070c243) SHA1(cd3af309af8eb27937756c1fe6fd0504be5aaaf5) )
ROM_END
ROM_START( cterrani )
DECOCASS_COMMON_ROMS
ROM_REGION( 0x00020, "user1", 0 ) /* dongle data */
ROM_REGION( 0x00020, "dongle", 0 ) /* dongle data */
ROM_LOAD( "de-0061.pro", 0x0000, 0x0020, CRC(e09ae5de) SHA1(7dec067d0739a6dad2607132641b66880a5b7751) )
ROM_REGION( 0x10000, "user2", 0 ) /* (max) 64k for cassette image */
ROM_REGION( 0x10000, "cassette", 0 ) /* (max) 64k for cassette image */
ROM_LOAD( "cterrani.cas", 0x0000, 0x8000, CRC(eb71adbc) SHA1(67becfde39c034d4b8edc2eb100050de102773da) )
ROM_END
ROM_START( cexplore )
DECOCASS_COMMON_ROMS
ROM_REGION( 0x00020, "user1", 0 ) /* dongle data */
ROM_REGION( 0x00020, "dongle", 0 ) /* dongle data */
/* The dongle data is reverse engineered by table analysis */
ROM_LOAD( "cexplore.pro", 0x0000, 0x0020, BAD_DUMP CRC(c7a9ac8f) SHA1(b0a566d948f71a4eddcde0dd5e9e69ca96f71c36) )
ROM_REGION( 0x10000, "user2", 0 ) /* (max) 64k for cassette image */
ROM_REGION( 0x10000, "cassette", 0 ) /* (max) 64k for cassette image */
ROM_LOAD( "cexplore.cas", 0x0000, 0x8000, CRC(fae49c66) SHA1(4ae69e2f706fdf30204f0aa1277619395cacc21b) )
ROM_REGION( 0x4000, "user3", 0 ) /* roms from the overlay pcb */
@ -825,10 +815,10 @@ ROM_END
ROM_START( cprogolf )
DECOCASS_COMMON_ROMS
ROM_REGION( 0x00020, "user1", 0 ) /* dongle data */
ROM_REGION( 0x00020, "dongle", 0 ) /* dongle data */
ROM_LOAD( "de-0061.pro", 0x0000, 0x0020, CRC(e09ae5de) SHA1(7dec067d0739a6dad2607132641b66880a5b7751) )
ROM_REGION( 0x10000, "user2", 0 ) /* (max) 64k for cassette image */
ROM_REGION( 0x10000, "cassette", 0 ) /* (max) 64k for cassette image */
ROM_LOAD( "cprogolf.cas", 0x0000, 0x8000, CRC(02123cd1) SHA1(e4c630ed293725f23d539cb43beb97953558dabd) )
ROM_END
@ -838,50 +828,50 @@ ROM_END
ROM_START( cmissnx )
DECOCASS_COMMON_ROMS
ROM_REGION( 0x00800, "user1", 0 ) /* dongle data */
ROM_REGION( 0x00800, "dongle", 0 ) /* dongle data */
ROM_LOAD( "cmissnx.pro", 0x0000, 0x0800, CRC(8a41c071) SHA1(7b16d933707bf21d25dcd11db6a6c28834b11c5b) )
ROM_REGION( 0x10000, "user2", 0 ) /* (max) 64k for cassette image */
ROM_REGION( 0x10000, "cassette", 0 ) /* (max) 64k for cassette image */
ROM_LOAD( "cmissnx.cas", 0x0000, 0x8000, CRC(3a094e11) SHA1(c355fe14838187cbde19a799e5c60083c82615ac) )
ROM_END
ROM_START( cdiscon1 )
DECOCASS_COMMON_ROMS
ROM_REGION( 0x00800, "user1", 0 ) /* dongle data */
ROM_REGION( 0x00800, "dongle", 0 ) /* dongle data */
ROM_LOAD( "cdiscon1.pro", 0x0000, 0x0800, CRC(0f793fab) SHA1(331f1b1b482fcd10f42c388a503f9af62d705401) )
ROM_REGION( 0x10000, "user2", 0 ) /* (max) 64k for cassette image */
ROM_REGION( 0x10000, "cassette", 0 ) /* (max) 64k for cassette image */
ROM_LOAD( "cdiscon1.cas", 0x0000, 0x8000, CRC(1429a397) SHA1(12f9e03fcda31dc6161a39bf5c3315a1e9e94565) )
ROM_END
ROM_START( csweetht )
DECOCASS_COMMON_ROMS
ROM_REGION( 0x00800, "user1", 0 ) /* dongle data */
ROM_REGION( 0x00800, "dongle", 0 ) /* dongle data */
ROM_LOAD( "cdiscon1.pro", 0x0000, 0x0800, CRC(0f793fab) SHA1(331f1b1b482fcd10f42c388a503f9af62d705401) )
ROM_REGION( 0x10000, "user2", 0 ) /* (max) 64k for cassette image */
ROM_REGION( 0x10000, "cassette", 0 ) /* (max) 64k for cassette image */
ROM_LOAD( "csweetht.cas", 0x0000, 0x8000, CRC(175ef706) SHA1(49b86233f69d0daf54a6e59b86e69b8159e8f6cc) )
ROM_END
ROM_START( cptennis )
DECOCASS_COMMON_ROMS
ROM_REGION( 0x00800, "user1", 0 ) /* dongle data */
ROM_REGION( 0x00800, "dongle", 0 ) /* dongle data */
ROM_LOAD( "cptennis.pro", 0x0000, 0x0800, CRC(59b8cede) SHA1(514861a652b5256a11477fc357bc01dfd87f712b) )
ROM_REGION( 0x10000, "user2", 0 ) /* (max) 64k for cassette image */
ROM_REGION( 0x10000, "cassette", 0 ) /* (max) 64k for cassette image */
ROM_LOAD( "cptennis.cas", 0x0000, 0x8000, CRC(6bb257fe) SHA1(7554bf1996bc9e9c04a276aab050708d70103f54) )
ROM_END
ROM_START( ctornado )
DECOCASS_COMMON_ROMS
ROM_REGION( 0x00800, "user1", 0 ) /* dongle data */
ROM_REGION( 0x00800, "dongle", 0 ) /* dongle data */
ROM_LOAD( "ctornado.pro", 0x0000, 0x0800, CRC(c9a91697) SHA1(3f7163291edbdf1a596e3cd2b7a16bbb140ffb36) )
ROM_REGION( 0x10000, "user2", 0 ) /* (max) 64k for cassette image */
ROM_REGION( 0x10000, "cassette", 0 ) /* (max) 64k for cassette image */
ROM_LOAD( "ctornado.cas", 0x0000, 0x8000, CRC(e4e36ce0) SHA1(48a11823121fb2e3de31ae08e453c0124fc4f7f3) )
ROM_END
@ -891,150 +881,150 @@ ROM_END
ROM_START( cburnrub )
DECOCASS_COMMON_ROMS
ROM_REGION( 0x01000, "user1", 0 ) /* dongle data */
ROM_REGION( 0x01000, "dongle", 0 ) /* dongle data */
ROM_LOAD( "cburnrub.pro", 0x0000, 0x1000, CRC(9f396832) SHA1(0e302fd094474ac792882948a018c73ce76e0759) )
ROM_REGION( 0x10000, "user2", 0 ) /* (max) 64k for cassette image */
ROM_REGION( 0x10000, "cassette", 0 ) /* (max) 64k for cassette image */
ROM_LOAD( "cburnrub.cas", 0x0000, 0x8000, CRC(4528ac22) SHA1(dc0fcc5e5fd21c1c858a90f43c175e36a24b3c3d) )
ROM_END
ROM_START( cburnrb2 )
DECOCASS_COMMON_ROMS
ROM_REGION( 0x01000, "user1", 0 ) /* dongle data */
ROM_REGION( 0x01000, "dongle", 0 ) /* dongle data */
ROM_LOAD( "cburnrub.pro", 0x0000, 0x1000, CRC(9f396832) SHA1(0e302fd094474ac792882948a018c73ce76e0759) )
ROM_REGION( 0x10000, "user2", 0 ) /* (max) 64k for cassette image */
ROM_REGION( 0x10000, "cassette", 0 ) /* (max) 64k for cassette image */
ROM_LOAD( "cburnrb2.cas", 0x0000, 0x8000, CRC(84a9ed66) SHA1(a9c536e46b89fc6b9c6271776292fed1241d2f3f) )
ROM_END
ROM_START( cbnj )
DECOCASS_COMMON_ROMS
ROM_REGION( 0x01000, "user1", 0 ) /* dongle data */
ROM_REGION( 0x01000, "dongle", 0 ) /* dongle data */
ROM_LOAD( "cburnrub.pro", 0x0000, 0x1000, CRC(9f396832) SHA1(0e302fd094474ac792882948a018c73ce76e0759) )
ROM_REGION( 0x10000, "user2", 0 ) /* (max) 64k for cassette image */
ROM_REGION( 0x10000, "cassette", 0 ) /* (max) 64k for cassette image */
ROM_LOAD( "cbnj.cas", 0x0000, 0x8000, CRC(eed41560) SHA1(85d5df76efac33cd10427f659c4259afabb3daaf) )
ROM_END
ROM_START( cbtime )
DECOCASS_COMMON_ROMS
ROM_REGION( 0x01000, "user1", 0 ) /* dongle data */
ROM_REGION( 0x01000, "dongle", 0 ) /* dongle data */
ROM_LOAD( "cbtime.pro", 0x0000, 0x1000, CRC(25bec0f0) SHA1(9fb1f9699f37937421e26d4fb8fdbcd21a5ddc5c) )
ROM_REGION( 0x10000, "user2", 0 ) /* (max) 64k for cassette image */
ROM_REGION( 0x10000, "cassette", 0 ) /* (max) 64k for cassette image */
ROM_LOAD( "cbtime.cas", 0x0000, 0x8000, CRC(56d7dc58) SHA1(34b2513c9ca7ab40f532b6d6d911aa3012113632) )
ROM_END
ROM_START( cgraplop )
DECOCASS_COMMON_ROMS
ROM_REGION( 0x01000, "user1", 0 ) /* dongle data */
ROM_REGION( 0x01000, "dongle", 0 ) /* dongle data */
ROM_LOAD( "cgraplop.pro", 0x0000, 0x1000, CRC(ee93787d) SHA1(0c753d62fdce2fdbd5b329a5aa259a967d07a651) )
ROM_REGION( 0x10000, "user2", 0 ) /* (max) 64k for cassette image */
ROM_REGION( 0x10000, "cassette", 0 ) /* (max) 64k for cassette image */
ROM_LOAD( "cgraplop.cas", 0x0000, 0x8000, CRC(d2c1c1bb) SHA1(db67304caa11540363735e7d4bf03507ccbe9980) )
ROM_END
ROM_START( cgraplp2 )
DECOCASS_COMMON_ROMS
ROM_REGION( 0x01000, "user1", 0 ) /* dongle data */
ROM_REGION( 0x01000, "dongle", 0 ) /* dongle data */
ROM_LOAD( "cgraplop.pro", 0x0000, 0x1000, CRC(ee93787d) SHA1(0c753d62fdce2fdbd5b329a5aa259a967d07a651) ) /* is this right for this set? */
ROM_REGION( 0x10000, "user2", 0 ) /* (max) 64k for cassette image */
ROM_REGION( 0x10000, "cassette", 0 ) /* (max) 64k for cassette image */
ROM_LOAD( "cgraplp2.cas", 0x0000, 0x8000, CRC(2e728981) SHA1(83ba90d95858d647315a1c311b8643672afea5f7) )
ROM_END
ROM_START( clapapa )
DECOCASS_COMMON_ROMS
ROM_REGION( 0x01000, "user1", 0 ) /* dongle data */
ROM_REGION( 0x01000, "dongle", 0 ) /* dongle data */
ROM_LOAD( "clapapa.pro", 0x0000, 0x1000, CRC(e172819a) SHA1(3492775f4f0a0b31ce5a1a998076829b3f264e98) )
ROM_REGION( 0x10000, "user2", 0 ) /* (max) 64k for cassette image */
ROM_REGION( 0x10000, "cassette", 0 ) /* (max) 64k for cassette image */
ROM_LOAD( "clapapa.cas", 0x0000, 0x8000, CRC(4ffbac24) SHA1(1ec0d7ac1886d4b430dc12be27f387e9d952d235) )
ROM_END
ROM_START( clapapa2 )
DECOCASS_COMMON_ROMS
ROM_REGION( 0x01000, "user1", 0 ) /* dongle data */
ROM_REGION( 0x01000, "dongle", 0 ) /* dongle data */
ROM_LOAD( "clapapa.pro", 0x0000, 0x1000, CRC(e172819a) SHA1(3492775f4f0a0b31ce5a1a998076829b3f264e98) )
ROM_REGION( 0x10000, "user2", 0 ) /* (max) 64k for cassette image */
ROM_REGION( 0x10000, "cassette", 0 ) /* (max) 64k for cassette image */
ROM_LOAD( "clapapa2.cas", 0x0000, 0x8000, CRC(069dd3c4) SHA1(5a19392c7ac5aea979187c96267e73bf5126307e) )
ROM_END
ROM_START( cfghtice )
DECOCASS_COMMON_ROMS
ROM_REGION( 0x01000, "user1", 0 ) /* dongle data */
ROM_REGION( 0x01000, "dongle", 0 ) /* dongle data */
ROM_LOAD( "cfghtice.pro", 0x0000, 0x1000, CRC(5abd27b5) SHA1(2ab1c171adffd491759036d6ce2433706654aad2) )
ROM_REGION( 0x10000, "user2", 0 ) /* (max) 64k for cassette image */
ROM_REGION( 0x10000, "cassette", 0 ) /* (max) 64k for cassette image */
ROM_LOAD( "cfghtice.cas", 0x0000, 0x10000, CRC(906dd7fb) SHA1(894a7970d5476ed035edd15656e5cf10d6ddcf57) )
ROM_END
ROM_START( cprobowl )
DECOCASS_COMMON_ROMS
ROM_REGION( 0x01000, "user1", 0 ) /* dongle data */
ROM_REGION( 0x01000, "dongle", 0 ) /* dongle data */
ROM_LOAD( "cprobowl.pro", 0x0000, 0x1000, CRC(e3a88e60) SHA1(e6e9a2e5ab26e0463c63201a15f7d5a429ec836e) )
ROM_REGION( 0x10000, "user2", 0 ) /* (max) 64k for cassette image */
ROM_REGION( 0x10000, "cassette", 0 ) /* (max) 64k for cassette image */
ROM_LOAD( "cprobowl.cas", 0x0000, 0x8000, CRC(cb86c5e1) SHA1(66c467418cff2ed6d7c121a8b1650ee97ae48fe9) )
ROM_END
ROM_START( cnightst )
DECOCASS_COMMON_ROMS
ROM_REGION( 0x01000, "user1", 0 ) /* dongle data */
ROM_REGION( 0x01000, "dongle", 0 ) /* dongle data */
ROM_LOAD( "cnightst.pro", 0x0000, 0x1000, CRC(553b0fbc) SHA1(2cdf4560992b62e59b6de760d7996be4ed25f505) )
ROM_REGION( 0x10000, "user2", 0 ) /* (max) 64k for cassette image */
ROM_REGION( 0x10000, "cassette", 0 ) /* (max) 64k for cassette image */
ROM_LOAD( "cnightst.cas", 0x0000, 0x8000, CRC(c6f844cb) SHA1(5fc6154c20ee4e2f4049a78df6f3cacbb96b0dc0) )
ROM_END
ROM_START( cnights2 )
DECOCASS_COMMON_ROMS
ROM_REGION( 0x01000, "user1", 0 ) /* dongle data */
ROM_REGION( 0x01000, "dongle", 0 ) /* dongle data */
ROM_LOAD( "cnightst.pro", 0x0000, 0x1000, CRC(553b0fbc) SHA1(2cdf4560992b62e59b6de760d7996be4ed25f505) )
ROM_REGION( 0x10000, "user2", 0 ) /* (max) 64k for cassette image */
ROM_REGION( 0x10000, "cassette", 0 ) /* (max) 64k for cassette image */
ROM_LOAD( "cnights2.cas", 0x0000, 0x8000, CRC(1a28128c) SHA1(4b620a1919d02814f734aba995115c09dc2db930) )
ROM_END
ROM_START( cprosocc )
DECOCASS_COMMON_ROMS
ROM_REGION( 0x01000, "user1", 0 ) /* dongle data */
ROM_REGION( 0x01000, "dongle", 0 ) /* dongle data */
ROM_LOAD( "cprosocc.pro", 0x0000, 0x1000, CRC(919fabb2) SHA1(3d6a0676cea7b0be0fe69d06e04ca08c36b2851a) )
ROM_REGION( 0x10000, "user2", 0 ) /* (max) 64k for cassette image */
ROM_REGION( 0x10000, "cassette", 0 ) /* (max) 64k for cassette image */
ROM_LOAD( "cprosocc.cas", 0x0000, 0x10000, CRC(76b1ad2c) SHA1(6188667e5bc001dfdf83deaf7251eae794de4702) )
ROM_END
ROM_START( cppicf )
DECOCASS_COMMON_ROMS
ROM_REGION( 0x01000, "user1", 0 ) /* dongle data */
ROM_REGION( 0x01000, "dongle", 0 ) /* dongle data */
ROM_LOAD( "cppicf.pro", 0x0000, 0x1000, CRC(0b1a1ecb) SHA1(2106da6837c78812c102b0eaaa1127fcc21ea780) )
ROM_REGION( 0x10000, "user2", 0 ) /* (max) 64k for cassette image */
ROM_REGION( 0x10000, "cassette", 0 ) /* (max) 64k for cassette image */
ROM_LOAD( "cppicf.cas", 0x0000, 0x8000, CRC(8c02f160) SHA1(03430dd8d4b2e6ca931986dac4d39be6965ffa6f) )
ROM_END
ROM_START( cppicf2 )
DECOCASS_COMMON_ROMS
ROM_REGION( 0x01000, "user1", 0 ) /* dongle data */
ROM_REGION( 0x01000, "dongle", 0 ) /* dongle data */
ROM_LOAD( "cppicf.pro", 0x0000, 0x1000, CRC(0b1a1ecb) SHA1(2106da6837c78812c102b0eaaa1127fcc21ea780) )
ROM_REGION( 0x10000, "user2", 0 ) /* (max) 64k for cassette image */
ROM_REGION( 0x10000, "cassette", 0 ) /* (max) 64k for cassette image */
ROM_LOAD( "cppicf2.cas", 0x0000, 0x8000, CRC(78ffa1bc) SHA1(d15f2a240ae7b45885d32b5f507243f82e820d4b) )
ROM_END
@ -1044,20 +1034,20 @@ ROM_END
ROM_START( cscrtry )
DECOCASS_COMMON_ROMS
ROM_REGION( 0x08000, "user1", 0 ) /* dongle data */
ROM_REGION( 0x08000, "dongle", 0 ) /* dongle data */
ROM_LOAD( "cscrtry.pro", 0x0000, 0x8000, CRC(7bc3460b) SHA1(7c5668ff9a5073e27f4a83b02d79892eb4df6b92) )
ROM_REGION( 0x10000, "user2", 0 ) /* (max) 64k for cassette image */
ROM_REGION( 0x10000, "cassette", 0 ) /* (max) 64k for cassette image */
ROM_LOAD( "cscrtry.cas", 0x0000, 0x8000, CRC(5625f0ca) SHA1(f4b0a6f2ca908880386838f06b626479b4b74134) )
ROM_END
ROM_START( cscrtry2 )
DECOCASS_COMMON_ROMS
ROM_REGION( 0x08000, "user1", 0 ) /* dongle data */
ROM_REGION( 0x08000, "dongle", 0 ) /* dongle data */
ROM_LOAD( "cscrtry.pro", 0x0000, 0x8000, CRC(7bc3460b) SHA1(7c5668ff9a5073e27f4a83b02d79892eb4df6b92) )
ROM_REGION( 0x10000, "user2", 0 ) /* (max) 64k for cassette image */
ROM_REGION( 0x10000, "cassette", 0 ) /* (max) 64k for cassette image */
ROM_LOAD( "cscrtry2.cas", 0x0000, 0x8000, CRC(04597842) SHA1(7f1fc3e06b61df880debe9056bdfbbb8600af739) )
ROM_END
@ -1067,10 +1057,10 @@ ROM_END
ROM_START( cbdash )
DECOCASS_COMMON_ROMS
/* ROM_REGION( 0x01000, "user1", 0 ) */ /* (max) 4k for dongle data */
/* ROM_REGION( 0x01000, "dongle", 0 ) */ /* (max) 4k for dongle data */
/* no proms */
ROM_REGION( 0x10000, "user2", 0 ) /* (max) 64k for cassette image */
ROM_REGION( 0x10000, "cassette", 0 ) /* (max) 64k for cassette image */
ROM_LOAD( "cbdash.cas", 0x0000, 0x8000, CRC(cba4c1af) SHA1(5d163d8e31c58b20679c6be06b1aa02df621822b) )
ROM_END
@ -1081,7 +1071,7 @@ ROM_START( cflyball )
/* no dongle data */
ROM_REGION( 0x10000, "user2", 0 ) /* (max) 64k for cassette image */
ROM_REGION( 0x10000, "cassette", 0 ) /* (max) 64k for cassette image */
ROM_LOAD( "cflyball.cas", 0x0000, 0x10000, CRC(cb40d043) SHA1(57698bac7e0d552167efa99d08116bf19a3b29c9) )
ROM_END
@ -1091,10 +1081,10 @@ ROM_END
ROM_START( czeroize )
DECOCASS_COMMON_ROMS
ROM_REGION( 0x01000, "user1", 0 ) /* dongle data */
ROM_REGION( 0x01000, "dongle", 0 ) /* dongle data */
ROM_LOAD( "czeroize.pro", 0x0000, 0x1000, NO_DUMP )
ROM_REGION( 0x10000, "user2", 0 ) /* (max) 64k for cassette image */
ROM_REGION( 0x10000, "cassette", 0 ) /* (max) 64k for cassette image */
ROM_LOAD( "czeroize.cas", 0x0000, 0x10000, CRC(3ef0a406) SHA1(645b34cd477e0bb5539c8fe937a7a2dbd8369003) )
ROM_END
@ -1185,4 +1175,4 @@ static DRIVER_INIT( decocrom )
/* 39 */ GAME( 1984, cppicf2, cppicf, cppicf, decocass, decocass, ROT270, "Data East Corporation", "Peter Pepper's Ice Cream Factory (Cassette, set 2)", 0 )
/* 40 */ GAME( 1984, cfghtice, decocass, cfghtice, decocass, decocass, ROT270, "Data East Corporation", "Fighting Ice Hockey (Cassette)", 0 )
/* 44 */ GAME( 1985, cbdash, decocass, cbdash, decocass, decocass, ROT270, "Data East Corporation", "Boulder Dash (Cassette)", 0 )
GAME( 1985, cflyball, decocass, cflyball, decocass, decocass, ROT270, "Data East Corporation", "Flying Ball (Cassette)", GAME_NO_SOUND )
GAME( 1985, cflyball, decocass, cflyball, decocass, decocass, ROT270, "Data East Corporation", "Flying Ball (Cassette)", 0 )

View File

@ -622,7 +622,7 @@ Driver by Takahiro Nogi (nogi@kt.rim.or.jp) 1999/11/06
#include "driver.h"
#include "cpu/z80/z80.h"
#include "taitoipt.h"
#include "cpu/i8x41/i8x41.h"
#include "cpu/mcs48/mcs48.h"
#include "sound/2203intf.h"
#include "sound/dac.h"
#include "sound/samples.h"
@ -894,11 +894,10 @@ static ADDRESS_MAP_START( tnzsb_io_map, ADDRESS_SPACE_IO, 8 )
ADDRESS_MAP_END
static ADDRESS_MAP_START( i8742_io_map, ADDRESS_SPACE_IO, 8 )
AM_RANGE(0x02, 0x02) AM_WRITE(tnzs_port2_w)
AM_RANGE(I8X41_p1, I8X41_p1) AM_READ(tnzs_port1_r)
AM_RANGE(I8X41_p2, I8X41_p2) AM_READ(tnzs_port2_r)
AM_RANGE(I8X41_t0, I8X41_t0) AM_READ_PORT("COIN1")
AM_RANGE(I8X41_t1, I8X41_t1) AM_READ_PORT("COIN2")
AM_RANGE(MCS48_PORT_P1, MCS48_PORT_P1) AM_READ(tnzs_port1_r)
AM_RANGE(MCS48_PORT_P2, MCS48_PORT_P2) AM_READWRITE(tnzs_port2_r, tnzs_port2_w)
AM_RANGE(MCS48_PORT_T0, MCS48_PORT_T0) AM_READ_PORT("COIN1")
AM_RANGE(MCS48_PORT_T1, MCS48_PORT_T1) AM_READ_PORT("COIN2")
ADDRESS_MAP_END

View File

@ -48,7 +48,4 @@ WRITE8_HANDLER( deco_charram_w );
WRITE8_HANDLER( zoar_video_control_w );
WRITE8_HANDLER( btime_video_control_w );
WRITE8_HANDLER( bnj_video_control_w );
WRITE8_HANDLER( lnc_video_control_w );
WRITE8_HANDLER( disco_video_control_w );
INTERRUPT_GEN( lnc_sound_interrupt );

File diff suppressed because it is too large Load Diff

View File

@ -1,19 +1,25 @@
/* Set this to 1 to display current tape position */
#define TAPE_UI_DISPLAY 0
#ifdef MAME_DEBUG
#define LOGLEVEL 3
#define LOGLEVEL 5
#else
#define LOGLEVEL 0
#endif
#define LOG(n,x) do { if (LOGLEVEL >= n) logerror x; } while (0)
#define DECOCASS_TAPE DEVICE_GET_INFO_NAME(decocass_tape)
DEVICE_GET_INFO( decocass_tape );
#define MDRV_DECOCASS_TAPE_ADD(_tag) \
MDRV_DEVICE_ADD(_tag, DECOCASS_TAPE, 0)
extern WRITE8_HANDLER( decocass_coin_counter_w );
extern WRITE8_HANDLER( decocass_sound_command_w );
extern READ8_HANDLER( decocass_sound_data_r );
extern READ8_HANDLER( decocass_sound_ack_r );
extern WRITE8_HANDLER( decocass_sound_data_w );
extern READ8_HANDLER( decocass_sound_command_r );
extern TIMER_DEVICE_CALLBACK( decocass_audio_nmi_gen );
extern WRITE8_HANDLER( decocass_sound_nmi_enable_w );
extern READ8_HANDLER( decocass_sound_nmi_enable_r );
extern READ8_HANDLER( decocass_sound_data_ack_reset_r );
@ -22,11 +28,6 @@ extern WRITE8_HANDLER( decocass_nmi_reset_w );
extern WRITE8_HANDLER( decocass_quadrature_decoder_reset_w );
extern WRITE8_HANDLER( decocass_adc_w );
extern READ8_HANDLER( decocass_input_r );
extern int tape_dir;
extern int tape_speed;
extern attotime tape_time0;
extern emu_timer *tape_timer;
attotime decocass_adjust_tape_time(attotime tape_time);
extern WRITE8_HANDLER( decocass_reset_w );
@ -35,6 +36,7 @@ extern WRITE8_HANDLER( decocass_e5xx_w );
extern WRITE8_HANDLER( decocass_de0091_w );
extern WRITE8_HANDLER( decocass_e900_w );
extern MACHINE_START( decocass );
extern MACHINE_RESET( decocass );
extern MACHINE_RESET( ctsttape );
extern MACHINE_RESET( chwy );

View File

@ -13,7 +13,7 @@
***************************************************************************/
#include "driver.h"
#include "cpu/i8x41/i8x41.h"
#include "cpu/mcs48/mcs48.h"
#include "includes/tnzs.h"
static int mcu_type;
@ -44,16 +44,8 @@ static READ8_HANDLER( mcu_tnzs_r )
{
UINT8 data;
if (offset == 0)
{
data = cpu_get_reg(space->machine->cpu[2], I8X41_DATA);
data = upi41_master_r(space->machine->cpu[2], offset & 1);
cpu_yield(space->cpu);
}
else
{
data = cpu_get_reg(space->machine->cpu[2], I8X41_STAT);
cpu_yield(space->cpu);
}
// logerror("PC %04x: read %02x from mcu $c00%01x\n", cpu_get_previouspc(space->cpu), data, offset);
@ -64,10 +56,7 @@ static WRITE8_HANDLER( mcu_tnzs_w )
{
// logerror("PC %04x: write %02x to mcu $c00%01x\n", cpu_get_previouspc(space->cpu), data, offset);
if (offset == 0)
cpu_set_reg(space->machine->cpu[2], I8X41_DATA, data);
else
cpu_set_reg(space->machine->cpu[2], I8X41_CMND, data);
upi41_master_w(space->machine->cpu[2], offset & 1, data);
}

View File

@ -67,11 +67,6 @@ CPUS += V35
CPUS += V60
CPUS += V70
CPUS += MCS48
CPUS += I8041
CPUS += I8741
CPUS += I8042
CPUS += I8242
CPUS += I8742
CPUS += I8031
CPUS += I8032
CPUS += I8051

View File

@ -21,14 +21,12 @@ UINT8 *zoar_scrollram;
UINT8 *deco_charram;
size_t bnj_backgroundram_size;
static int sprite_dirty[256];
static int char_dirty[1024];
static UINT8 btime_palette = 0;
static UINT8 bnj_scroll1 = 0;
static UINT8 bnj_scroll2 = 0;
static bitmap_t *background_bitmap;
static UINT8 lnc_sound_interrupt_enabled = 0;
static UINT8 *sprite_dirty, *char_dirty;
/***************************************************************************
@ -142,14 +140,20 @@ VIDEO_START( btime )
bnj_scroll1 = 0;
bnj_scroll2 = 0;
btime_palette = 0;
sprite_dirty = auto_malloc(256 * sizeof(*sprite_dirty));
memset(sprite_dirty, 1, 256 * sizeof(*sprite_dirty));
char_dirty = auto_malloc(1024 * sizeof(*char_dirty));
memset(char_dirty, 1, 1024 * sizeof(*char_dirty));
}
VIDEO_START( bnj )
{
/* the background area is twice as wide as the screen */
int width = video_screen_get_width(machine->primary_screen);
int height = video_screen_get_height(machine->primary_screen);
int width = 256;
int height = 256;
bitmap_format format = video_screen_get_format(machine->primary_screen);
background_bitmap = auto_bitmap_alloc(2*width, height, format);
@ -297,15 +301,6 @@ WRITE8_HANDLER( bnj_video_control_w )
btime_video_control_w(space, offset, data);
}
WRITE8_HANDLER( lnc_video_control_w )
{
// I have a feeling that this only works by coincidence. I couldn't
// figure out how NMI's are disabled by the sound processor
lnc_sound_interrupt_enabled = data & 0x08;
bnj_video_control_w(space, offset, data & 0x01);
}
WRITE8_HANDLER( disco_video_control_w )
{
btime_palette = (data >> 2) & 0x03;
@ -317,13 +312,6 @@ WRITE8_HANDLER( disco_video_control_w )
}
INTERRUPT_GEN( lnc_sound_interrupt )
{
if (lnc_sound_interrupt_enabled)
cpu_set_input_line(device, INPUT_LINE_NMI, PULSE_LINE);
}
static void draw_chars(running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect, UINT8 transparency, UINT8 color, int priority)
{
offs_t offs;
@ -341,7 +329,7 @@ static void draw_chars(running_machine *machine, bitmap_t *bitmap, const rectang
if (flip_screen_get(machine))
{
x = 31 - x;
y = 31 - y;
y = 33 - y;
}
drawgfx(bitmap,machine->gfx[0],
@ -377,7 +365,7 @@ static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const recta
if (flip_screen_get(machine))
{
x = 240 - x;
y = 240 - y + sprite_y_adjust_flip_screen;
y = 256 - y + sprite_y_adjust_flip_screen;
flipx = !flipx;
flipy = !flipy;
@ -429,7 +417,7 @@ static void draw_background(running_machine *machine, bitmap_t *bitmap, const re
if (flip_screen_get(machine))
{
x = 240 - x;
y = 240 - y;
y = 256 - y;
}
drawgfx(bitmap, machine->gfx[2],
@ -565,7 +553,7 @@ VIDEO_UPDATE( bnj )
if (flip_screen_get(screen->machine))
{
sx = 496 - sx;
sy = 240 - sy;
sy = 256 - sy;
}
drawgfx(background_bitmap, screen->machine->gfx[2],
@ -612,7 +600,7 @@ VIDEO_UPDATE( cookrace )
if (flip_screen_get(screen->machine))
{
sx = 31 - sx;
sy = 31 - sy;
sy = 33 - sy;
}
drawgfx(bitmap, screen->machine->gfx[2],

View File

@ -213,8 +213,6 @@ WRITE8_HANDLER( decocass_paletteram_w )
WRITE8_HANDLER( decocass_charram_w )
{
if (data == decocass_charram[offset])
return;
decocass_charram[offset] = data;
/* dirty sprite */
sprite_dirty[(offset >> 5) & 255] = 1;
@ -245,8 +243,6 @@ static void mark_bg_tile_dirty(offs_t offset)
WRITE8_HANDLER( decocass_tileram_w )
{
if (data == decocass_tileram[offset])
return;
decocass_tileram[offset] = data;
/* dirty tile (64 bytes per tile) */
tile_dirty[(offset / 64) & 15] = 1;
@ -257,8 +253,6 @@ WRITE8_HANDLER( decocass_tileram_w )
WRITE8_HANDLER( decocass_objectram_w )
{
if (data == decocass_objectram[offset])
return;
decocass_objectram[offset] = data;
/* dirty the object */
object_dirty = 1;
@ -266,8 +260,6 @@ WRITE8_HANDLER( decocass_objectram_w )
WRITE8_HANDLER( decocass_bgvideoram_w )
{
if (data == decocass_bgvideoram[offset])
return;
decocass_bgvideoram[offset] = data;
mark_bg_tile_dirty( offset );
}
@ -592,10 +584,10 @@ VIDEO_START( decocass )
tilemap_set_transparent_pen( fg_tilemap, 0 );
bg_tilemap_l_clip = *video_screen_get_visible_area(machine->primary_screen);
bg_tilemap_l_clip.max_y = video_screen_get_height(machine->primary_screen) / 2;
bg_tilemap_l_clip.max_y = 256 / 2;
bg_tilemap_r_clip = *video_screen_get_visible_area(machine->primary_screen);
bg_tilemap_r_clip.min_y = video_screen_get_height(machine->primary_screen) / 2;
bg_tilemap_r_clip.min_y = 256 / 2;
/* background videroam bits D0-D3 are shared with the tileram */
decocass_bgvideoram = decocass_tileram;
@ -615,18 +607,6 @@ VIDEO_UPDATE( decocass )
else if (watchdog_count-- > 0)
watchdog_reset(screen->machine);
#if TAPE_UI_DISPLAY
if (tape_timer)
{
attotime tape_time = decocass_adjust_tape_time(tape_time0);
popmessage("%c%c [%05.1fs] %c%c",
(tape_dir < 0 && tape_speed) ? '<' : ' ',
(tape_dir < 0) ? '<' : ' ',
attotime_to_double(tape_time),
(tape_dir > 0) ? '>' : ' ',
(tape_dir > 0 && tape_speed) ? '>' : ' ');
}
#endif
#ifdef MAME_DEBUG
{
static int showmsg;