#include "rom.h"
#include "ram.h"
+unsigned char dbg_rom_get_byte(unsigned short offset);
+unsigned short dbg_rom_get_short(unsigned short offset);
+unsigned char dbg_ram_get_byte(unsigned short offset);
+unsigned short dbg_ram_get_short(unsigned short offset);
+
struct cpu_pin {
unsigned int rw :1; /*assert on write.*/
unsigned int nmi :1; /*input*/
#define IO_APU_MASK 0x001F
#define ROM_MASK 0x7FFF
+unsigned char dbg_get_byte(unsigned short addr) {
+ if (addr & ROM_BIT) {
+ return dbg_rom_get_byte(addr & ROM_MASK);
+ }
+ else if (addr & IO_APU_BIT) {
+ return 0;
+ }
+ else if (addr & IO_PPU_BIT) {
+ return 0;
+ }
+ else {
+ return dbg_ram_get_byte(addr & ROM_MASK);
+ }
+}
+unsigned short dbg_get_short(unsigned short addr) {
+ if (addr & ROM_BIT) {
+ return dbg_rom_get_short(addr & ROM_MASK);
+ }
+ else if (addr & IO_APU_BIT) {
+ return 0;
+ }
+ else if (addr & IO_PPU_BIT) {
+ return 0;
+ }
+ else {
+ return dbg_ram_get_short(addr & ROM_MASK);
+ }
+}
+
+
void release_bus(void) {
pin_status.ready = 1;
sem_post(&sem_bus_wait);
}
void disasm(const char* mnemonic, int addr_mode, unsigned short pc) {
- unsigned char dbg_rom_get_byte(unsigned short addr);
- unsigned short dbg_rom_get_short(unsigned short addr);
+ unsigned char dbg_get_byte(unsigned short addr);
+ unsigned short dbg_get_short(unsigned short addr);
switch(addr_mode) {
case ADDR_MODE_ZP:
- printf("%04x: %-5s $%02x\n", pc, mnemonic, dbg_rom_get_byte(pc + 1));
+ printf("%04x: %-5s $%02x\n", pc, mnemonic, dbg_get_byte(pc + 1));
break;
case ADDR_MODE_ZP_X:
- printf("%04x: %-5s $%02x, x\n", pc, mnemonic, dbg_rom_get_byte(pc + 1));
+ printf("%04x: %-5s $%02x, x\n", pc, mnemonic, dbg_get_byte(pc + 1));
break;
case ADDR_MODE_ZP_Y:
- printf("%04x: %-5s $%02x, y\n", pc, mnemonic, dbg_rom_get_byte(pc + 1));
+ printf("%04x: %-5s $%02x, y\n", pc, mnemonic, dbg_get_byte(pc + 1));
break;
case ADDR_MODE_ABS:
- printf("%04x: %-5s $%04x\n", pc, mnemonic, dbg_rom_get_short(pc + 1));
+ printf("%04x: %-5s $%04x\n", pc, mnemonic, dbg_get_short(pc + 1));
break;
case ADDR_MODE_ABS_X:
- printf("%04x: %-5s $%04x, x\n", pc, mnemonic, dbg_rom_get_short(pc + 1));
+ printf("%04x: %-5s $%04x, x\n", pc, mnemonic, dbg_get_short(pc + 1));
break;
case ADDR_MODE_ABS_Y:
- printf("%04x: %-5s $%04x, y\n", pc, mnemonic, dbg_rom_get_short(pc + 1));
+ printf("%04x: %-5s $%04x, y\n", pc, mnemonic, dbg_get_short(pc + 1));
break;
case ADDR_MODE_IND:
- printf("%04x: %-5s ($%04x), y\n", pc, mnemonic, dbg_rom_get_short(pc + 1));
+ printf("%04x: %-5s ($%04x), y\n", pc, mnemonic, dbg_get_short(pc + 1));
break;
case ADDR_MODE_IMP:
case ADDR_MODE_ACC:
break;
case ADDR_MODE_IMM:
case ADDR_MODE_REL:
- printf("%04x: %-5s #$%02x\n", pc, mnemonic, dbg_rom_get_byte(pc + 1));
+ printf("%04x: %-5s #$%02x\n", pc, mnemonic, dbg_get_byte(pc + 1));
break;
case ADDR_MODE_INDEX_INDIR:
- printf("%04x: %-5s ($%02x, x), y\n", pc, mnemonic, dbg_rom_get_byte(pc + 1));
+ printf("%04x: %-5s ($%02x, x), y\n", pc, mnemonic, dbg_get_byte(pc + 1));
break;
case ADDR_MODE_INDIR_INDEX:
- printf("%04x: %-5s ($%02x), y\n", pc, mnemonic, dbg_rom_get_byte(pc + 1));
+ printf("%04x: %-5s ($%02x), y\n", pc, mnemonic, dbg_get_byte(pc + 1));
break;
}
}
static sem_t rom_sem_id;
#define ROM_32K 0x8000
-#define ROM_START 0x8000
static unsigned char * rom_buffer;
-unsigned char dbg_rom_get_byte(unsigned short addr) {
- return rom_buffer[addr - ROM_START];
+unsigned char dbg_rom_get_byte(unsigned short offset) {
+ return rom_buffer[offset];
}
-unsigned short dbg_rom_get_short(unsigned short addr) {
+unsigned short dbg_rom_get_short(unsigned short offset) {
unsigned short ret;
- ret = rom_buffer[addr - ROM_START];
- ret |= (rom_buffer[addr + 1 - ROM_START]) << 8;
+ ret = rom_buffer[offset];
+ ret |= (rom_buffer[offset + 1] << 8);
return ret;
}