static unsigned char mole_protection_r(unsigned char offset) { switch (offset) { case 0x08: // random mole placement return 0xb0; case 0x26: if (m6502_get_reg(M6502_REG_PC) == 0x53d7) { return 0x06; // bonus round } else // pc == 0x515b, 0x5162 { return 0xc6; // game start } case 0x86: // game over return 0x91; case 0xae: // coinage return 0x32; } return 0x00; }
/***************************************************************************** * Disassemble a single opcode starting at pc *****************************************************************************/ static unsigned internal_m6502_dasm(const struct op6502_info *opinfo, char *buffer, offs_t pc, UINT8 *oprom, UINT8 *opram, int bytes) { char *dst = buffer; const char *symbol; INT8 offset; INT16 offset16; unsigned PC = pc; UINT16 addr; UINT8 op, opc, arg, access, value; UINT32 flags; int pos = 0; op = oprom[pos++]; pc++; opc = opinfo[op].opc; arg = opinfo[op].arg; access = opinfo[op].access; /* determine dasmflags */ switch(opc) { case jsr: case bsr: flags = DASMFLAG_SUPPORTED | DASMFLAG_STEP_OVER; break; case rts: case rti: case rtn: flags = DASMFLAG_SUPPORTED | DASMFLAG_STEP_OUT; break; default: flags = DASMFLAG_SUPPORTED; break; } dst += sprintf(dst, "%-5s", token[opc]); if( opc == bbr || opc == bbs || opc == rmb || opc == smb ) dst += sprintf(dst, "%d,", (op >> 3) & 7); switch(arg) { case imp: break; case acc: dst += sprintf(dst,"a"); break; case rel: offset = (INT8) opram[pos++]; pc++; dst += sprintf(dst, "$%04X", (pc + offset) & 0xFFFF); break; case rw2: offset16 = (opram[pos] | (opram[pos+1] << 8)) -1; pos += 2; pc += 2; dst += sprintf(dst, "$%04X", (pc + offset16) & 0xFFFF); break; case imm: value = opram[pos++]; pc++; symbol = set_ea_info( 0, value, EA_UINT8, access ); dst += sprintf(dst,"#%s", symbol); break; case zpg: addr = opram[pos++]; pc++; symbol = set_ea_info( 0, addr, EA_UINT8, access ); dst += sprintf(dst,"$%02X", addr); break; case zpx: addr = opram[pos++]; pc++; dst += sprintf(dst,"$%02X,x", addr); break; case zpy: addr = opram[pos++]; pc++; dst += sprintf(dst,"$%02X,y", addr); break; case idx: addr = opram[pos++]; pc++; dst += sprintf(dst,"($%02X,x)", addr); break; case idy: addr = opram[pos++]; pc++; dst += sprintf(dst,"($%02X),y", addr); break; case zpi: addr = opram[pos++]; pc++; dst += sprintf(dst,"($%02X)", addr); break; case zpb: addr = opram[pos++]; pc++; symbol = set_ea_info( 0, addr, EA_UINT8, access ); dst += sprintf(dst,"$%02X", addr); offset = (INT8) opram[pos++]; pc++; symbol = set_ea_info( 1, pc, offset, BRA ); dst += sprintf(dst,",%s", symbol); break; case adr: addr = (opram[pos] | (opram[pos+1] << 8)); pos += 2; pc += 2; dst += sprintf(dst, "$%04X", addr); break; case aba: addr = (opram[pos] | (opram[pos+1] << 8)); pos += 2; pc += 2; dst += sprintf(dst, "$%04X", addr); break; case abx: addr = (opram[pos] | (opram[pos+1] << 8)); pos += 2; pc += 2; dst += sprintf(dst,"$%04X,x", addr); break; case aby: addr = (opram[pos] | (opram[pos+1] << 8)); pos += 2; pc += 2; dst += sprintf(dst,"$%04X,y", addr); break; case ind: addr = (opram[pos] | (opram[pos+1] << 8)); pos += 2; pc += 2; dst += sprintf(dst,"($%04X)", addr); break; case iax: addr = (opram[pos] | (opram[pos+1] << 8)); pos += 2; pc += 2; pos += 2; pc += 2; dst += sprintf(dst,"($%04X),X", addr); break; case iw2: addr = (opram[pos] | (opram[pos+1] << 8)); pos += 2; pc += 2; dst += sprintf(dst,"#%04X", addr); break; case iw3: addr = (opram[pos] | (opram[pos+1] << 8) | (opram[pos+2] << 16)); pos += 3; pc += 3; dst += sprintf(dst,"#%06x", addr); break; case idz: addr = (INT8) opram[pos++]; pc++; dst += sprintf(dst,"($%02X),z", addr); break; case isy: op = opram[pos++]; pc++; addr = op + m6502_get_reg(opinfo, M6502_S); pos += 2; pc += 2; dst += sprintf(dst,"(s,$%02X),y", addr); break; default: dst += sprintf(dst,"$%02X", op); break; } return (pc - PC) | flags; }
/***************************************************************************** * Disassemble a single opcode starting at pc *****************************************************************************/ unsigned Dasm6502(char *buffer, unsigned pc) { char *dst = buffer; const char *symbol; INT8 offset; INT16 offset16; unsigned PC = pc; UINT16 addr, ea; UINT8 op, opc, arg, access, value; op = OPCODE(pc++); switch ( m6502_get_reg(M6502_SUBTYPE) ) { #if (HAS_M65C02) case SUBTYPE_65C02: opc = op65c02[op][0]; arg = op65c02[op][1]; access = op65c02[op][2]; break; #endif #if (HAS_M65SC02) case SUBTYPE_65SC02: opc = op65sc02[op][0]; arg = op65sc02[op][1]; access = op65sc02[op][2]; break; #endif #if (HAS_M6510) case SUBTYPE_6510: opc = op6510[op][0]; arg = op6510[op][1]; access = op6510[op][2]; break; #endif #if (HAS_DECO16) case SUBTYPE_DECO16: opc = opdeco16[op][0]; arg = opdeco16[op][1]; access = opdeco16[op][2]; break; #endif default: opc = op6502[op][0]; arg = op6502[op][1]; access = op6502[op][2]; break; } dst += sprintf(dst, "%-5s", token[opc]); if( opc == bbr || opc == bbs || opc == rmb || opc == smb ) dst += sprintf(dst, "%d,", (op >> 3) & 7); switch(arg) { case imp: break; case acc: dst += sprintf(dst,"a"); break; case rel: offset = (INT8)ARGBYTE(pc++); symbol = set_ea_info( 0, pc, offset, access ); dst += sprintf(dst,"%s", symbol); break; case rw2: offset16 = ARGWORD(pc)-1; pc += 2; symbol = set_ea_info( 0, pc, offset16, access ); dst += sprintf(dst,"%s", symbol); break; case imm: value = ARGBYTE(pc++); symbol = set_ea_info( 0, value, EA_UINT8, access ); dst += sprintf(dst,"#%s", symbol); break; case zpg: addr = ARGBYTE(pc++); symbol = set_ea_info( 0, addr, EA_UINT8, access ); dst += sprintf(dst,"$%02X", addr); break; case zpx: addr = ARGBYTE(pc++); ea = (addr + m6502_get_reg(M6502_X)) & 0xff; symbol = set_ea_info( 0, ea, EA_UINT8, access ); dst += sprintf(dst,"$%02X,x", addr); break; case zpy: addr = ARGBYTE(pc++); ea = (addr + m6502_get_reg(M6502_Y)) & 0xff; symbol = set_ea_info( 0, ea, EA_UINT8, access ); dst += sprintf(dst,"$%02X,y", addr); break; case idx: addr = ARGBYTE(pc++); ea = (addr + m6502_get_reg(M6502_X)) & 0xff; ea = RDMEM(ea) + (RDMEM((ea+1) & 0xff) << 8); symbol = set_ea_info( 0, ea, EA_UINT16, access ); dst += sprintf(dst,"($%02X,x)", addr); break; case idy: addr = ARGBYTE(pc++); ea = (RDMEM(addr) + (RDMEM((addr+1) & 0xff) << 8) + m6502_get_reg(M6502_Y)) & 0xffff; symbol = set_ea_info( 0, ea, EA_UINT16, access ); dst += sprintf(dst,"($%02X),y", addr); break; case zpi: addr = ARGBYTE(pc++); ea = RDMEM(addr) + (RDMEM((addr+1) & 0xff) << 8); symbol = set_ea_info( 0, ea, EA_UINT16, access ); dst += sprintf(dst,"($%02X)", addr); break; case zpb: addr = ARGBYTE(pc++); symbol = set_ea_info( 0, addr, EA_UINT8, access ); dst += sprintf(dst,"$%02X", addr); offset = (INT8)ARGBYTE(pc++); symbol = set_ea_info( 1, pc, offset, BRA ); dst += sprintf(dst,",%s", symbol); break; case adr: addr = ARGWORD(pc); pc += 2; symbol = set_ea_info( 0, addr, EA_UINT16, access ); dst += sprintf(dst,"%s", symbol); break; case aba: addr = ARGWORD(pc); pc += 2; symbol = set_ea_info( 0, addr, EA_UINT16, access ); dst += sprintf(dst,"%s", symbol); break; case abx: addr = ARGWORD(pc); pc += 2; ea = (addr + m6502_get_reg(M6502_X)) & 0xffff; symbol = set_ea_info( 0, ea, EA_UINT16, access ); dst += sprintf(dst,"$%04X,x", addr); break; case aby: addr = ARGWORD(pc); pc += 2; ea = (addr + m6502_get_reg(M6502_Y)) & 0xffff; symbol = set_ea_info( 0, ea, EA_UINT16, access ); dst += sprintf(dst,"$%04X,y", addr); break; case ind: addr = ARGWORD(pc); pc += 2; ea = ARGWORD(addr); symbol = set_ea_info( 0, ea, EA_UINT16, access ); dst += sprintf(dst,"($%04X)", addr); break; case iax: addr = ARGWORD(pc); pc += 2; ea = (ARGWORD(addr) + m6502_get_reg(M6502_X)) & 0xffff; symbol = set_ea_info( 0, ea, EA_UINT16, access ); dst += sprintf(dst,"($%04X),X", addr); break; default: dst += sprintf(dst,"$%02X", op); } return pc - PC; }