X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=cpu%2FDrZ80%2Fdrz80.s;h=846c6362b2640f3056e80b720c8157523dfd6635;hb=b2451ac666326a748e1c7174416a3baacd09e6b1;hp=16f09afb7b09443f274259f631f5a0d907d48965;hpb=f02439758ee681130093e689d4d8a4b377ca462f;p=picodrive.git diff --git a/cpu/DrZ80/drz80.s b/cpu/DrZ80/drz80.s index 16f09af..846c636 100644 --- a/cpu/DrZ80/drz80.s +++ b/cpu/DrZ80/drz80.s @@ -21,14 +21,10 @@ .endif .if DRZ80_FOR_PICODRIVE -.include "port_config.s" - .extern YM2612Read_ -.if EXTERNAL_YM2612 - .extern YM2612Read_940 -.endif .extern PicoRead8 .extern Pico .extern z80_write + .extern ym2612_read_local_z80 .endif DrZ80Ver: .long 0x0001 @@ -110,40 +106,6 @@ DrZ80Ver: .long 0x0001 .if DRZ80_FOR_PICODRIVE -.macro YM2612Read_and_ret8 - stmfd sp!,{r3,r12,lr} -.if EXTERNAL_YM2612 - ldr r1,=PicoOpt - ldr r1,[r1] - tst r1,#0x200 - ldrne r2, =YM2612Read_940 - ldreq r2, =YM2612Read_ - mov lr,pc - bx r2 -.else - bl YM2612Read_ -.endif - ldmfd sp!,{r3,r12,pc} -.endm - -.macro YM2612Read_and_ret16 - stmfd sp!,{r3,r12,lr} -.if EXTERNAL_YM2612 - ldr r0,=PicoOpt - ldr r0,[r0] - tst r0,#0x200 - ldrne r2, =YM2612Read_940 - ldreq r2, =YM2612Read_ - mov lr,pc - bx r2 - orr r0,r0,r0,lsl #8 -.else - bl YM2612Read_ - orr r0,r0,r0,lsl #8 -.endif - ldmfd sp!,{r3,r12,pc} -.endm - pico_z80_read8: @ addr cmp r0,#0x2000 @ Z80 RAM ldrlt r1,[cpucontext,#z80sp_base] @@ -162,15 +124,18 @@ pico_z80_read8: @ addr eorlt r0,r0,#1 @ our ROM is byteswapped ldrltb r0,[r1,r0] bxlt lr - stmfd sp!,{r3,r12,lr} + stmfd sp!,{r3,r12,lr} bl PicoRead8 - ldmfd sp!,{r3,r12,pc} + ldmfd sp!,{r3,r12,pc} 1: mov r1,r0,lsr #13 cmp r1,#2 @ YM2612 (0x4000-0x5fff) bne 0f and r0,r0,#3 - YM2612Read_and_ret8 + stmfd sp!,{r3,r12,lr} + str z80_icount,[cpucontext,#cycles_pointer] + bl ym2612_read_local_z80 + ldmfd sp!,{r3,r12,pc} 0: cmp r0,#0x4000 movge r0,#0xff @@ -214,13 +179,17 @@ pico_z80_read16: @ addr add r0,r4,#1 bl PicoRead8 orr r0,r5,r0,lsl #8 - ldmfd sp!,{r3-r5,r12,pc} + ldmfd sp!,{r3-r5,r12,pc} 1: mov r1,r0,lsr #13 cmp r1,#2 @ YM2612 (0x4000-0x5fff) bne 0f and r0,r0,#3 - YM2612Read_and_ret16 + 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 @@ -241,6 +210,7 @@ pico_z80_write8: @ data, addr bx lr 1: stmfd sp!,{r3,r12,lr} + str z80_icount,[cpucontext,#cycles_pointer] bl z80_write ldmfd sp!,{r3,r12,pc} @@ -254,14 +224,15 @@ pico_z80_write16: @ data, addr strb r0,[r2,#1] bx lr 1: - stmfd sp!,{r3-r5,r12,lr} + stmfd sp!,{r3-r5,r12,lr} + str z80_icount,[cpucontext,#cycles_pointer] mov r4,r0 mov r5,r1 - bl z80_write + bl z80_write mov r0,r4,lsr #8 add r1,r5,#1 - bl z80_write - ldmfd sp!,{r3-r5,r12,pc} + bl z80_write + ldmfd sp!,{r3-r5,r12,pc} .pool .endif @@ -389,8 +360,8 @@ pico_z80_write16: @ data, addr str z80pc,[cpucontext,#z80pc_pointer] .endif .if DRZ80_FOR_PICODRIVE - bic r0,r0,#0xfe000 ldr r1,[cpucontext,#z80pc_base] + bic r0,r0,#0xfe000 add z80pc,r1,r0 .else stmfd sp!,{r3,r12} @@ -1401,30 +1372,32 @@ DrZ80Run: mov z80_icount,r1 ;@ setup number of Tstates to execute .if INTERRUPT_MODE == 0 - ldrh r0,[cpucontext,#z80irq] @ 0x4C + ldrh r0,[cpucontext,#z80irq] @ 0x4C, irq and IFF bits .endif ldmia cpucontext,{z80pc-z80sp} ;@ load Z80 registers .if INTERRUPT_MODE == 0 ;@ check ints - tst r0,#1 - movnes r0,r0,lsr #8 - blne DoInterrupt + tst r0,#0xff + movne r0,r0,lsr #8 + tstne r0,#1 + blne DoInterrupt .endif - ldrb r0,[z80pc],#1 ;@ get first op code ldr opcodes,MAIN_opcodes_POINTER2 - ldr pc,[opcodes,r0, lsl #2] ;@ execute op code -MAIN_opcodes_POINTER2: .word MAIN_opcodes + cmp z80_icount,#0 ;@ irq might have used all cycles + ldrplb r0,[z80pc],#1 + ldrpl pc,[opcodes,r0, lsl #2] z80_execute_end: ;@ save registers in CPU context stmia cpucontext,{z80pc-z80sp} ;@ save Z80 registers - mov r0,z80_icount + mov r0,z80_icount ldmia sp!,{r4-r12,pc} ;@ restore registers from stack and return to C code +MAIN_opcodes_POINTER2: .word MAIN_opcodes .if INTERRUPT_MODE Interrupt_local: .word Interrupt .endif @@ -1443,6 +1416,8 @@ DoInterrupt: ldmia cpucontext,{z80pc-z80sp} ;@ load Z80 registers mov pc,lr ;@ return .else + + ;@ r0 == z80if stmfd sp!,{lr} tst r0,#4 ;@ check halt @@ -1455,11 +1430,9 @@ DoInterrupt: strb r0,[cpucontext,#z80if] ;@ now check int mode - tst r1,#1 - bne DoInterrupt_mode1 - tst r1,#2 - bne DoInterrupt_mode2 - b DoInterrupt_mode0 + cmp r1,#1 + beq DoInterrupt_mode1 + bgt DoInterrupt_mode2 DoInterrupt_mode0: ;@ get 3 byte vector @@ -1489,6 +1462,7 @@ DoInterrupt_mode0: ;@ rebase new pc rebasepc + eatcycles 13 b DoInterrupt_end 1: @@ -1503,6 +1477,7 @@ DoInterrupt_mode0: ;@ rebase new pc rebasepc + eatcycles 13 b DoInterrupt_end DoInterrupt_mode1: @@ -1512,6 +1487,7 @@ DoInterrupt_mode1: mov r0,#0x38 rebasepc + eatcycles 13 b DoInterrupt_end DoInterrupt_mode2: @@ -1548,18 +1524,19 @@ DoInterrupt_mode2: ldmfd sp!,{r3,r12} mov z80pc,r0 .endif + eatcycles 17 DoInterrupt_end: ;@ interupt accepted so callback irq interface ldr r0,[cpucontext, #z80irqcallback] tst r0,r0 + streqb r0,[cpucontext,#z80irq] ;@ default handling ldmeqfd sp!,{pc} stmfd sp!,{r3,r12} mov lr,pc mov pc,r0 ;@ call callback function ldmfd sp!,{r3,r12} ldmfd sp!,{pc} ;@ return - .endif .data @@ -4598,7 +4575,7 @@ opcode_3_8: tst z80f,#1<