X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=cpu%2FDrZ80%2Fdrz80.s;h=846c6362b2640f3056e80b720c8157523dfd6635;hb=fcf94fcc20e7bdd527a28fe8e1b265862b616016;hp=ee140130b06845ada79e6da2336f0520cf75be7f;hpb=b542be4686241c9e0722ff8e452980f9ac2b4d7c;p=picodrive.git diff --git a/cpu/DrZ80/drz80.s b/cpu/DrZ80/drz80.s index ee14013..846c636 100644 --- a/cpu/DrZ80/drz80.s +++ b/cpu/DrZ80/drz80.s @@ -24,7 +24,7 @@ .extern PicoRead8 .extern Pico .extern z80_write - .extern ym2612_st + .extern ym2612_read_local_z80 .endif DrZ80Ver: .long 0x0001 @@ -106,21 +106,6 @@ DrZ80Ver: .long 0x0001 .if DRZ80_FOR_PICODRIVE -.macro YM2612Read_and_ret8 - ldr r0, =ym2612_st - ldr r0, [r0] - ldrb r0, [r0, #0x11] ;@ ym2612_st->status - bx lr -.endm - -.macro YM2612Read_and_ret16 - ldr r0, =ym2612_st - ldr r0, [r0] - ldrb r0, [r0, #0x11] ;@ ym2612_st->status - orr r0,r0,r0,lsl #8 - bx lr -.endm - pico_z80_read8: @ addr cmp r0,#0x2000 @ Z80 RAM ldrlt r1,[cpucontext,#z80sp_base] @@ -139,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 @@ -197,7 +185,11 @@ pico_z80_read16: @ addr 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 @@ -218,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} @@ -231,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 @@ -366,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} @@ -1378,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 @@ -1420,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 @@ -1432,10 +1430,9 @@ DoInterrupt: strb r0,[cpucontext,#z80if] ;@ now check int mode - tst r1,#1 - bne DoInterrupt_mode1 - tst r1,#2 - bne DoInterrupt_mode2 + cmp r1,#1 + beq DoInterrupt_mode1 + bgt DoInterrupt_mode2 DoInterrupt_mode0: ;@ get 3 byte vector @@ -1465,6 +1462,7 @@ DoInterrupt_mode0: ;@ rebase new pc rebasepc + eatcycles 13 b DoInterrupt_end 1: @@ -1479,6 +1477,7 @@ DoInterrupt_mode0: ;@ rebase new pc rebasepc + eatcycles 13 b DoInterrupt_end DoInterrupt_mode1: @@ -1488,6 +1487,7 @@ DoInterrupt_mode1: mov r0,#0x38 rebasepc + eatcycles 13 b DoInterrupt_end DoInterrupt_mode2: @@ -1524,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 @@ -4574,7 +4575,7 @@ opcode_3_8: tst z80f,#1<