diff options
author | Ian C <ianc@noddybox.co.uk> | 2006-09-06 23:35:58 +0000 |
---|---|---|
committer | Ian C <ianc@noddybox.co.uk> | 2006-09-06 23:35:58 +0000 |
commit | 3e2e62d3966f4620674e51a424c7c2e734e05235 (patch) | |
tree | d32da044922666a28cf5b587b1493324b7c14525 /z80.c | |
parent | 3261fd65167abc52aefa288ac71a1dc14b82ad16 (diff) |
Updated to use a function-based memory interface.
Diffstat (limited to 'z80.c')
-rw-r--r-- | z80.c | 24 |
1 files changed, 16 insertions, 8 deletions
@@ -112,10 +112,11 @@ static void Z80_CheckInterrupt(Z80 *cpu) /* ---------------------------------------- INTERFACES */ -Z80 *Z80Init(Z80Memory memory, - Z80MemoryControl memcontrol, +Z80 *Z80Init(Z80ReadMemory read_memory, + Z80WriteMemory write_memory, + Z80ReadPort read_port, Z80WritePort write_port, - Z80ReadPort read_port) + Z80ReadMemory read_disassem) { Z80 *cpu; int f; @@ -123,17 +124,18 @@ Z80 *Z80Init(Z80Memory memory, InitTables(); - if (!memory || !memcontrol) + if (!read_memory || !write_memory) return NULL; cpu=malloc(sizeof *cpu); if (cpu) { - cpu->memory=memory; - cpu->memctrl=memcontrol; + cpu->mread=read_memory; + cpu->mwrite=write_memory; cpu->pread=read_port; cpu->pwrite=write_port; + cpu->disread=read_disassem; for(f=0;f<eZ80_NO_CALLBACK;f++) for(r=0;r<MAX_PER_CALLBACK;r++) @@ -199,11 +201,13 @@ int Z80LodgeCallback(Z80 *cpu, Z80CallbackReason reason, Z80Callback callback) int f; for(f=0;f<MAX_PER_CALLBACK;f++) + { if (!cpu->callback[reason][f]) { cpu->callback[reason][f]=callback; return TRUE; } + } return FALSE; } @@ -236,6 +240,8 @@ void Z80NMI(Z80 *cpu) int Z80SingleStep(Z80 *cpu) { + Z80Byte opcode; + cpu->last_cb=TRUE; cpu->shift=0; @@ -245,7 +251,9 @@ int Z80SingleStep(Z80 *cpu) INC_R; - Z80_Decode(cpu,cpu->memory[cpu->PC++]); + opcode=FETCH_BYTE; + + Z80_Decode(cpu,opcode); return cpu->last_cb; } @@ -342,7 +350,7 @@ const char *Z80Disassemble(Z80 *cpu, Z80Word *pc) strcat(s,Z80_Dis_Printf("%-40s ;",Z80_Dis_GetArg())); for(f=0;f<5 && opc!=npc;f++) - strcat(s,Z80_Dis_Printf(" %.2x",(int)cpu->memory[opc++])); + strcat(s,Z80_Dis_Printf(" %.2x",(int)cpu->disread(cpu,opc++))); if (opc!=npc) for(f=1;f<3;f++) |