mirror of
https://github.com/RaySollium99/picodrive.git
synced 2025-09-05 15:27:46 -04:00
converting drZ80 to use xmap (new mem handling)
git-svn-id: file:///home/notaz/opt/svn/PicoDrive@754 be3aeb3a-fb24-0410-a615-afba39da0efa
This commit is contained in:
parent
b2451ac666
commit
ee05564fc7
2 changed files with 155 additions and 179 deletions
|
@ -11,29 +11,28 @@
|
|||
.global DrZ80Run
|
||||
.global DrZ80Ver
|
||||
|
||||
.equiv INTERRUPT_MODE, 0 ;@0 = Use internal int handler, 1 = Use Mames int handler
|
||||
.equiv FAST_Z80SP, 1 ;@0 = Use mem functions for stack pointer, 1 = Use direct mem pointer
|
||||
.equiv UPDATE_CONTEXT, 0
|
||||
.equiv DRZ80_FOR_PICODRIVE, 1
|
||||
.equiv INTERRUPT_MODE, 0 ;@0 = Use internal int handler, 1 = Use Mames int handler
|
||||
.equiv FAST_Z80SP, 1 ;@0 = Use mem functions for stack pointer, 1 = Use direct mem pointer
|
||||
.equiv UPDATE_CONTEXT, 0
|
||||
.equiv DRZ80_FOR_PICODRIVE, 1
|
||||
.equiv DRZ80_XMAP, 1
|
||||
.equiv DRZ80_XMAP_MORE_INLINE, 1
|
||||
|
||||
.if DRZ80_XMAP
|
||||
.equ Z80_MEM_SHIFT, 13
|
||||
.endif
|
||||
|
||||
.if INTERRUPT_MODE
|
||||
.extern Interrupt
|
||||
.endif
|
||||
|
||||
.if DRZ80_FOR_PICODRIVE
|
||||
.extern PicoRead8
|
||||
.extern Pico
|
||||
.extern z80_write
|
||||
.extern ym2612_read_local_z80
|
||||
.endif
|
||||
|
||||
DrZ80Ver: .long 0x0001
|
||||
|
||||
;@ --------------------------- Defines ----------------------------
|
||||
;@ Make sure that regs/pointers for z80pc to z80sp match up!
|
||||
|
||||
opcodes .req r3
|
||||
z80_icount .req r4
|
||||
z80_icount .req r3
|
||||
opcodes .req r4
|
||||
cpucontext .req r5
|
||||
z80pc .req r6
|
||||
z80a .req r7
|
||||
|
@ -104,139 +103,101 @@ DrZ80Ver: .long 0x0001
|
|||
|
||||
.text
|
||||
|
||||
.if DRZ80_FOR_PICODRIVE
|
||||
.if DRZ80_XMAP
|
||||
|
||||
pico_z80_read8: @ addr
|
||||
cmp r0,#0x2000 @ Z80 RAM
|
||||
ldrlt r1,[cpucontext,#z80sp_base]
|
||||
ldrltb r0,[r1,r0]
|
||||
bxlt lr
|
||||
z80_xmap_read8: @ addr
|
||||
ldr r1,[cpucontext,#z80_read8]
|
||||
mov r2,r0,lsr #Z80_MEM_SHIFT
|
||||
ldr r1,[r1,r2,lsl #2]
|
||||
movs r1,r1,lsl #1
|
||||
ldrccb r0,[r1,r0]
|
||||
bxcc lr
|
||||
|
||||
cmp r0,#0x8000 @ 68k bank
|
||||
blt 1f
|
||||
ldr r2,=(Pico+0x22212)
|
||||
ldrh r1,[r2]
|
||||
bic r0,r0,#0x3f8000
|
||||
orr r0,r0,r1,lsl #15
|
||||
ldr r1,[r2,#-0xe] @ ROM size
|
||||
cmp r0,r1
|
||||
ldrlt r1,[r2,#-0x12] @ ROM
|
||||
eorlt r0,r0,#1 @ our ROM is byteswapped
|
||||
ldrltb r0,[r1,r0]
|
||||
bxlt lr
|
||||
stmfd sp!,{r3,r12,lr}
|
||||
bl PicoRead8
|
||||
ldmfd sp!,{r3,r12,pc}
|
||||
1:
|
||||
mov r1,r0,lsr #13
|
||||
cmp r1,#2 @ YM2612 (0x4000-0x5fff)
|
||||
bne 0f
|
||||
and r0,r0,#3
|
||||
stmfd sp!,{r3,r12,lr}
|
||||
z80_xmap_read8_handler: @ addr, func
|
||||
str z80_icount,[cpucontext,#cycles_pointer]
|
||||
bl ym2612_read_local_z80
|
||||
ldmfd sp!,{r3,r12,pc}
|
||||
0:
|
||||
cmp r0,#0x4000
|
||||
movge r0,#0xff
|
||||
bxge lr
|
||||
ldr r1,[cpucontext,#z80sp_base]
|
||||
bic r0,r0,#0x0fe000 @ Z80 RAM (mirror)
|
||||
ldrb r0,[r1,r0]
|
||||
bx lr
|
||||
stmfd sp!,{r12,lr}
|
||||
mov lr,pc
|
||||
bx r1
|
||||
ldr z80_icount,[cpucontext,#cycles_pointer]
|
||||
ldmfd sp!,{r12,pc}
|
||||
|
||||
pico_z80_read16: @ addr
|
||||
cmp r0,#0x2000 @ Z80 RAM
|
||||
bge 2f
|
||||
ldr r1,[cpucontext,#z80sp_base]
|
||||
z80_xmap_write8: @ data, addr
|
||||
ldr r2,[cpucontext,#z80_write8]
|
||||
add r2,r2,r1,lsr #Z80_MEM_SHIFT-2
|
||||
bic r2,r2,#3
|
||||
ldr r2,[r2]
|
||||
movs r2,r2,lsl #1
|
||||
strccb r0,[r2,r1]
|
||||
bxcc lr
|
||||
|
||||
z80_xmap_write8_handler: @ data, addr, func
|
||||
str z80_icount,[cpucontext,#cycles_pointer]
|
||||
mov r3,r0
|
||||
mov r0,r1
|
||||
mov r1,r3
|
||||
stmfd sp!,{r12,lr}
|
||||
mov lr,pc
|
||||
bx r2
|
||||
ldr z80_icount,[cpucontext,#cycles_pointer]
|
||||
ldmfd sp!,{r12,pc}
|
||||
|
||||
z80_xmap_read16: @ addr
|
||||
@ check if we cross bank boundary
|
||||
add r1,r0,#1
|
||||
eor r1,r0,r0
|
||||
tst r1,#1<<Z80_MEM_SHIFT
|
||||
bne 0f
|
||||
|
||||
ldr r1,[cpucontext,#z80_read8]
|
||||
mov r2,r0,lsr #Z80_MEM_SHIFT
|
||||
ldr r1,[r1,r2,lsl #2]
|
||||
movs r1,r1,lsl #1
|
||||
bcs 0f
|
||||
ldrb r0,[r1,r0]!
|
||||
ldrb r1,[r1,#1]
|
||||
orr r0,r0,r1,lsl #8
|
||||
bx lr
|
||||
|
||||
2:
|
||||
cmp r0,#0x8000 @ 68k bank
|
||||
blt 1f
|
||||
ldr r2,=(Pico+0x22212)
|
||||
ldrh r1,[r2]
|
||||
bic r0,r0,#0x1f8000
|
||||
orr r0,r0,r1,lsl #15
|
||||
ldr r1,[r2,#-0xe] @ ROM size
|
||||
cmp r0,r1
|
||||
ldr r1,[r2,#-0x12] @ ROM
|
||||
tst r0,#1
|
||||
eor r0,r0,#1
|
||||
ldrb r0,[r1,r0]!
|
||||
ldreqb r1,[r1,#-1]
|
||||
ldrneb r1,[r1,#3] @ this is due to byteswapped ROM
|
||||
orr r0,r0,r1,lsl #8
|
||||
bx lr
|
||||
3:
|
||||
stmfd sp!,{r3-r5,r12,lr}
|
||||
0:
|
||||
@ z80_xmap_read8 will save r3 and r12 for us
|
||||
stmfd sp!,{r4,r5,lr}
|
||||
mov r4,r0
|
||||
bl PicoRead8
|
||||
bl z80_xmap_read8
|
||||
mov r5,r0
|
||||
add r0,r4,#1
|
||||
bl PicoRead8
|
||||
bl z80_xmap_read8
|
||||
orr r0,r5,r0,lsl #8
|
||||
ldmfd sp!,{r3-r5,r12,pc}
|
||||
1:
|
||||
mov r1,r0,lsr #13
|
||||
cmp r1,#2 @ YM2612 (0x4000-0x5fff)
|
||||
ldmfd sp!,{r4,r5,pc}
|
||||
|
||||
z80_xmap_write16: @ data, addr
|
||||
add r2,r1,#1
|
||||
eor r2,r1,r1
|
||||
tst r2,#1<<Z80_MEM_SHIFT
|
||||
bne 0f
|
||||
and r0,r0,#3
|
||||
stmfd sp!,{r3,r12,lr}
|
||||
str z80_icount,[cpucontext,#cycles_pointer]
|
||||
bl ym2612_read_local_z80
|
||||
orr r0,r0,r0,lsl #8
|
||||
ldmfd sp!,{r3,r12,pc}
|
||||
0:
|
||||
cmp r0,#0x4000
|
||||
movge r0,#0xff
|
||||
bxge lr
|
||||
ldr r1,[cpucontext,#z80sp_base]
|
||||
bic r0,r0,#0x0fe000 @ Z80 RAM (mirror)
|
||||
ldrb r0,[r1,r0]!
|
||||
ldrb r1,[r1,#1]
|
||||
orr r0,r0,r1,lsl #8
|
||||
bx lr
|
||||
|
||||
pico_z80_write8: @ data, addr
|
||||
cmp r1,#0x4000
|
||||
bge 1f
|
||||
ldr r2,[cpucontext,#z80sp_base]
|
||||
bic r1,r1,#0x0fe000 @ Z80 RAM
|
||||
strb r0,[r2,r1]
|
||||
bx lr
|
||||
1:
|
||||
stmfd sp!,{r3,r12,lr}
|
||||
str z80_icount,[cpucontext,#cycles_pointer]
|
||||
bl z80_write
|
||||
ldmfd sp!,{r3,r12,pc}
|
||||
|
||||
pico_z80_write16: @ data, addr
|
||||
cmp r1,#0x4000
|
||||
bge 1f
|
||||
ldr r2,[cpucontext,#z80sp_base]
|
||||
bic r1,r1,#0x0fe000 @ Z80 RAM
|
||||
ldr r2,[cpucontext,#z80_read8]
|
||||
add r2,r2,r1,lsr #Z80_MEM_SHIFT-2
|
||||
bic r2,r2,#3
|
||||
ldr r2,[r2]
|
||||
movs r2,r2,lsl #1
|
||||
bcs 0f
|
||||
strb r0,[r2,r1]!
|
||||
mov r0,r0,lsr #8
|
||||
strb r0,[r2,#1]
|
||||
bx lr
|
||||
1:
|
||||
stmfd sp!,{r3-r5,r12,lr}
|
||||
str z80_icount,[cpucontext,#cycles_pointer]
|
||||
|
||||
0:
|
||||
stmfd sp!,{r4,r5,lr}
|
||||
mov r4,r0
|
||||
mov r5,r1
|
||||
bl z80_write
|
||||
bl z80_xmap_write8
|
||||
mov r0,r4,lsr #8
|
||||
add r1,r5,#1
|
||||
bl z80_write
|
||||
ldmfd sp!,{r3-r5,r12,pc}
|
||||
|
||||
.pool
|
||||
bl z80_xmap_write8
|
||||
ldmfd sp!,{r4,r5,pc}
|
||||
.endif
|
||||
|
||||
|
||||
.macro fetch cycs
|
||||
subs z80_icount,z80_icount,#\cycs
|
||||
.if UPDATE_CONTEXT
|
||||
|
@ -262,9 +223,18 @@ pico_z80_write16: @ data, addr
|
|||
.if UPDATE_CONTEXT
|
||||
str z80pc,[cpucontext,#z80pc_pointer]
|
||||
.endif
|
||||
.if DRZ80_FOR_PICODRIVE
|
||||
bl pico_z80_read8
|
||||
.if DRZ80_XMAP
|
||||
.if !DRZ80_XMAP_MORE_INLINE
|
||||
ldr r1,[cpucontext,#z80_read8]
|
||||
mov r2,r0,lsr #Z80_MEM_SHIFT
|
||||
ldr r1,[r1,r2,lsl #2]
|
||||
movs r1,r1,lsl #1
|
||||
ldrccb r0,[r1,r0]
|
||||
blcs z80_xmap_read8_handler
|
||||
.else
|
||||
bl z80_xmap_read8
|
||||
.endif
|
||||
.else ;@ if !DRZ80_XMAP
|
||||
stmfd sp!,{r3,r12}
|
||||
mov lr,pc
|
||||
ldr pc,[cpucontext,#z80_read8] ;@ r0 = addr - data returned in r0
|
||||
|
@ -281,8 +251,8 @@ pico_z80_write16: @ data, addr
|
|||
.if UPDATE_CONTEXT
|
||||
str z80pc,[cpucontext,#z80pc_pointer]
|
||||
.endif
|
||||
.if DRZ80_FOR_PICODRIVE
|
||||
bl pico_z80_read16
|
||||
.if DRZ80_XMAP
|
||||
bl z80_xmap_read16
|
||||
.else
|
||||
stmfd sp!,{r3,r12}
|
||||
mov lr,pc
|
||||
|
@ -295,9 +265,18 @@ pico_z80_write16: @ data, addr
|
|||
.if UPDATE_CONTEXT
|
||||
str z80pc,[cpucontext,#z80pc_pointer]
|
||||
.endif
|
||||
.if DRZ80_FOR_PICODRIVE
|
||||
bl pico_z80_write8
|
||||
.if DRZ80_XMAP
|
||||
.if DRZ80_XMAP_MORE_INLINE
|
||||
ldr r2,[cpucontext,#z80_write8]
|
||||
mov lr,r1,lsr #Z80_MEM_SHIFT
|
||||
ldr r2,[r2,lr,lsl #2]
|
||||
movs r2,r2,lsl #1
|
||||
strccb r0,[r2,r1]
|
||||
blcs z80_xmap_write8_handler
|
||||
.else
|
||||
bl z80_xmap_write8
|
||||
.endif
|
||||
.else ;@ if !DRZ80_XMAP
|
||||
stmfd sp!,{r3,r12}
|
||||
mov lr,pc
|
||||
ldr pc,[cpucontext,#z80_write8] ;@ r0=data r1=addr
|
||||
|
@ -319,8 +298,8 @@ pico_z80_write16: @ data, addr
|
|||
.if UPDATE_CONTEXT
|
||||
str z80pc,[cpucontext,#z80pc_pointer]
|
||||
.endif
|
||||
.if DRZ80_FOR_PICODRIVE
|
||||
bl pico_z80_write16
|
||||
.if DRZ80_XMAP
|
||||
bl z80_xmap_write16
|
||||
.else
|
||||
stmfd sp!,{r3,r12}
|
||||
mov lr,pc
|
||||
|
@ -334,19 +313,16 @@ pico_z80_write16: @ data, addr
|
|||
str z80pc,[cpucontext,#z80pc_pointer]
|
||||
.endif
|
||||
mov r0,z80hl, lsr #16
|
||||
.if DRZ80_FOR_PICODRIVE
|
||||
bl pico_z80_read8
|
||||
.if DRZ80_XMAP
|
||||
bl z80_xmap_read8
|
||||
.else
|
||||
stmfd sp!,{r3,r12}
|
||||
mov lr,pc
|
||||
ldr pc,[cpucontext,#z80_read8] ;@ r0 = addr - data returned in r0
|
||||
.endif
|
||||
.if UPDATE_CONTEXT
|
||||
str z80pc,[cpucontext,#z80pc_pointer]
|
||||
.endif
|
||||
mov r1,z80de, lsr #16
|
||||
.if DRZ80_FOR_PICODRIVE
|
||||
bl pico_z80_write8
|
||||
.if DRZ80_XMAP
|
||||
bl z80_xmap_write8
|
||||
.else
|
||||
mov lr,pc
|
||||
ldr pc,[cpucontext,#z80_write8] ;@ r0=data r1=addr
|
||||
|
@ -829,14 +805,13 @@ pico_z80_write16: @ data, addr
|
|||
;@---------------------------------------
|
||||
|
||||
.macro opRESmemHL bit
|
||||
.if DRZ80_FOR_PICODRIVE
|
||||
mov r0,z80hl, lsr #16
|
||||
bl pico_z80_read8
|
||||
.if DRZ80_XMAP
|
||||
bl z80_xmap_read8
|
||||
bic r0,r0,#1<<\bit
|
||||
mov r1,z80hl, lsr #16
|
||||
bl pico_z80_write8
|
||||
bl z80_xmap_write8
|
||||
.else
|
||||
mov r0,z80hl, lsr #16
|
||||
stmfd sp!,{r3,r12}
|
||||
mov lr,pc
|
||||
ldr pc,[cpucontext,#z80_read8] ;@ r0 = addr - data returned in r0
|
||||
|
@ -851,12 +826,12 @@ pico_z80_write16: @ data, addr
|
|||
;@---------------------------------------
|
||||
|
||||
.macro opRESmem bit
|
||||
.if DRZ80_FOR_PICODRIVE
|
||||
.if DRZ80_XMAP
|
||||
stmfd sp!,{r0} ;@ save addr as well
|
||||
bl pico_z80_read8
|
||||
bl z80_xmap_read8
|
||||
bic r0,r0,#1<<\bit
|
||||
ldmfd sp!,{r1} ;@ restore addr into r1
|
||||
bl pico_z80_write8
|
||||
bl z80_xmap_write8
|
||||
.else
|
||||
stmfd sp!,{r3,r12}
|
||||
stmfd sp!,{r0} ;@ save addr as well
|
||||
|
@ -1111,14 +1086,13 @@ pico_z80_write16: @ data, addr
|
|||
;@---------------------------------------
|
||||
|
||||
.macro opSETmemHL bit
|
||||
.if DRZ80_FOR_PICODRIVE
|
||||
mov r0,z80hl, lsr #16
|
||||
bl pico_z80_read8
|
||||
.if DRZ80_XMAP
|
||||
bl z80_xmap_read8
|
||||
orr r0,r0,#1<<\bit
|
||||
mov r1,z80hl, lsr #16
|
||||
bl pico_z80_write8
|
||||
bl z80_xmap_write8
|
||||
.else
|
||||
mov r0,z80hl, lsr #16
|
||||
stmfd sp!,{r3,r12}
|
||||
mov lr,pc
|
||||
ldr pc,[cpucontext,#z80_read8] ;@ r0 = addr - data returned in r0
|
||||
|
@ -1133,12 +1107,12 @@ pico_z80_write16: @ data, addr
|
|||
;@---------------------------------------
|
||||
|
||||
.macro opSETmem bit
|
||||
.if DRZ80_FOR_PICODRIVE
|
||||
.if DRZ80_XMAP
|
||||
stmfd sp!,{r0} ;@ save addr as well
|
||||
bl pico_z80_read8
|
||||
bl z80_xmap_read8
|
||||
orr r0,r0,#1<<\bit
|
||||
ldmfd sp!,{r1} ;@ restore addr into r1
|
||||
bl pico_z80_write8
|
||||
bl z80_xmap_write8
|
||||
.else
|
||||
stmfd sp!,{r3,r12}
|
||||
stmfd sp!,{r0} ;@ save addr as well
|
||||
|
@ -1502,23 +1476,18 @@ DoInterrupt_mode2:
|
|||
orr r0,r0,r1,lsr#16
|
||||
|
||||
;@ read new pc from vector address
|
||||
.if DRZ80_FOR_PICODRIVE
|
||||
bl pico_z80_read16
|
||||
bic r0,r0,#0xfe000
|
||||
ldr r1,[cpucontext,#z80pc_base]
|
||||
add z80pc,r1,r0
|
||||
.if UPDATE_CONTEXT
|
||||
str z80pc,[cpucontext,#z80pc_pointer]
|
||||
.endif
|
||||
.if DRZ80_XMAP
|
||||
bl z80_xmap_read16
|
||||
rebasepc
|
||||
.else
|
||||
stmfd sp!,{r3,r12}
|
||||
mov lr,pc
|
||||
ldr pc,[cpucontext,#z80_read16]
|
||||
|
||||
;@ rebase new pc
|
||||
.if UPDATE_CONTEXT
|
||||
str z80pc,[cpucontext,#z80pc_pointer]
|
||||
.endif
|
||||
mov lr,pc
|
||||
ldr pc,[cpucontext,#z80_rebasePC] ;@ r0=new pc - external function sets z80pc_base and returns new z80pc in r0
|
||||
ldmfd sp!,{r3,r12}
|
||||
|
|
49
pico/z80if.c
49
pico/z80if.c
|
@ -63,20 +63,7 @@ int mz80_run(int cycles)
|
|||
#endif
|
||||
|
||||
#ifdef _USE_DRZ80
|
||||
|
||||
struct DrZ80 drZ80;
|
||||
|
||||
static unsigned int DrZ80_rebasePC(unsigned short a)
|
||||
{
|
||||
drZ80.Z80PC_BASE = (unsigned int) Pico.zram;
|
||||
return drZ80.Z80PC_BASE + a;
|
||||
}
|
||||
|
||||
static unsigned int DrZ80_rebaseSP(unsigned short a)
|
||||
{
|
||||
drZ80.Z80SP_BASE = (unsigned int) Pico.zram;
|
||||
return drZ80.Z80SP_BASE + a;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
|
@ -101,8 +88,8 @@ PICO_INTERNAL void z80_init(void)
|
|||
#endif
|
||||
#ifdef _USE_DRZ80
|
||||
memset(&drZ80, 0, sizeof(drZ80));
|
||||
drZ80.z80_rebasePC=DrZ80_rebasePC;
|
||||
drZ80.z80_rebaseSP=DrZ80_rebaseSP;
|
||||
drZ80.z80_rebasePC=NULL; // unused, handled by xmap
|
||||
drZ80.z80_rebaseSP=NULL;
|
||||
drZ80.z80_read8 =(void *)z80_read_map;
|
||||
drZ80.z80_read16 =NULL;
|
||||
drZ80.z80_write8 =(void *)z80_write_map;
|
||||
|
@ -130,8 +117,9 @@ PICO_INTERNAL void z80_reset(void)
|
|||
drZ80.Z80IY = 0xFFFF << 16;
|
||||
drZ80.Z80IM = 0; // 1?
|
||||
drZ80.z80irqvector = 0xff0000; // RST 38h
|
||||
drZ80.Z80PC = drZ80.z80_rebasePC(0);
|
||||
drZ80.Z80SP = drZ80.z80_rebaseSP(0x2000); // 0xf000 ?
|
||||
drZ80.Z80PC_BASE = drZ80.Z80PC = z80_read_map[0] << 1;
|
||||
drZ80.Z80SP_BASE = z80_read_map[0] << 1;
|
||||
// drZ80.Z80SP = drZ80.z80_rebaseSP(0x2000); // 0xf000 ?
|
||||
#endif
|
||||
#ifdef _USE_CZ80
|
||||
Cz80_Reset(&CZ80);
|
||||
|
@ -142,6 +130,7 @@ PICO_INTERNAL void z80_reset(void)
|
|||
Pico.m.z80_fakeval = 0; // for faking when Z80 is disabled
|
||||
}
|
||||
|
||||
// XXX TODO: should better use universal z80 save format
|
||||
PICO_INTERNAL void z80_pack(unsigned char *data)
|
||||
{
|
||||
#if defined(_USE_MZ80)
|
||||
|
@ -151,8 +140,8 @@ PICO_INTERNAL void z80_pack(unsigned char *data)
|
|||
memcpy(data+4, &mz80.z80clockticks, sizeof(mz80)-5*4); // don't save base&memhandlers
|
||||
#elif defined(_USE_DRZ80)
|
||||
*(int *)data = 0x015A7244; // "DrZ" v1
|
||||
drZ80.Z80PC = drZ80.z80_rebasePC(drZ80.Z80PC-drZ80.Z80PC_BASE);
|
||||
drZ80.Z80SP = drZ80.z80_rebaseSP(drZ80.Z80SP-drZ80.Z80SP_BASE);
|
||||
// drZ80.Z80PC = drZ80.z80_rebasePC(drZ80.Z80PC-drZ80.Z80PC_BASE);
|
||||
// drZ80.Z80SP = drZ80.z80_rebaseSP(drZ80.Z80SP-drZ80.Z80SP_BASE);
|
||||
memcpy(data+4, &drZ80, 0x54);
|
||||
#elif defined(_USE_CZ80)
|
||||
*(int *)data = 0x00007a43; // "Cz"
|
||||
|
@ -175,10 +164,28 @@ PICO_INTERNAL void z80_unpack(unsigned char *data)
|
|||
}
|
||||
#elif defined(_USE_DRZ80)
|
||||
if (*(int *)data == 0x015A7244) { // "DrZ" v1 save?
|
||||
int pc, sp;
|
||||
memcpy(&drZ80, data+4, 0x54);
|
||||
pc = (drZ80.Z80PC - drZ80.Z80PC_BASE) & 0xffff;
|
||||
sp = (drZ80.Z80SP - drZ80.Z80SP_BASE) & 0xffff;
|
||||
// update bases
|
||||
drZ80.Z80PC = drZ80.z80_rebasePC(drZ80.Z80PC-drZ80.Z80PC_BASE);
|
||||
drZ80.Z80SP = drZ80.z80_rebaseSP(drZ80.Z80SP-drZ80.Z80SP_BASE);
|
||||
drZ80.Z80PC_BASE = z80_read_map[pc >> Z80_MEM_SHIFT];
|
||||
if (drZ80.Z80PC & (1<<31)) {
|
||||
elprintf(EL_STATUS|EL_ANOMALY, "bad PC in z80 save: %04x", pc);
|
||||
drZ80.Z80PC_BASE = drZ80.Z80PC = z80_read_map[0];
|
||||
} else {
|
||||
drZ80.Z80PC_BASE <<= 1;
|
||||
drZ80.Z80PC = drZ80.Z80PC_BASE + pc;
|
||||
}
|
||||
drZ80.Z80SP_BASE = z80_read_map[sp >> Z80_MEM_SHIFT];
|
||||
if (drZ80.Z80SP & (1<<31)) {
|
||||
elprintf(EL_STATUS|EL_ANOMALY, "bad SP in z80 save: %04x", sp);
|
||||
drZ80.Z80SP_BASE = z80_read_map[0];
|
||||
drZ80.Z80SP = drZ80.Z80SP_BASE + (1 << Z80_MEM_SHIFT);
|
||||
} else {
|
||||
drZ80.Z80SP_BASE <<= 1;
|
||||
drZ80.Z80SP = drZ80.Z80SP_BASE + sp;
|
||||
}
|
||||
} else {
|
||||
z80_reset();
|
||||
drZ80.Z80IM = 1;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue