.endif\r
\r
.if DRZ80_FOR_PICODRIVE\r
-.include "port_config.s"\r
- .extern YM2612Read_\r
-.if EXTERNAL_YM2612\r
- .extern YM2612Read_940\r
-.endif\r
.extern PicoRead8\r
.extern Pico\r
.extern z80_write\r
+ .extern ym2612_read_local_z80\r
.endif\r
\r
DrZ80Ver: .long 0x0001\r
\r
.if DRZ80_FOR_PICODRIVE\r
\r
-.macro YM2612Read_and_ret8\r
- stmfd sp!,{r3,r12,lr}\r
-.if EXTERNAL_YM2612\r
- ldr r1,=PicoOpt\r
- ldr r1,[r1]\r
- tst r1,#0x200\r
- bne 10f\r
- bl YM2612Read_\r
- ldmfd sp!,{r3,r12,pc}\r
-10:\r
- bl YM2612Read_940\r
-.else\r
- bl YM2612Read_\r
-.endif\r
- ldmfd sp!,{r3,r12,pc}\r
-.endm\r
-\r
-.macro YM2612Read_and_ret16\r
- stmfd sp!,{r3,r12,lr}\r
-.if EXTERNAL_YM2612\r
- ldr r0,=PicoOpt\r
- ldr r0,[r0]\r
- tst r0,#0x200\r
- bne 10f\r
- bl YM2612Read_\r
- orr r0,r0,r0,lsl #8\r
- ldmfd sp!,{r3,r12,pc}\r
-10:\r
- bl YM2612Read_940\r
- orr r0,r0,r0,lsl #8\r
-.else\r
- bl YM2612Read_\r
- orr r0,r0,r0,lsl #8\r
-.endif\r
- ldmfd sp!,{r3,r12,pc}\r
-.endm\r
-\r
pico_z80_read8: @ addr\r
cmp r0,#0x2000 @ Z80 RAM\r
ldrlt r1,[cpucontext,#z80sp_base]\r
eorlt r0,r0,#1 @ our ROM is byteswapped\r
ldrltb r0,[r1,r0]\r
bxlt lr\r
- stmfd sp!,{r3,r12,lr}\r
+ stmfd sp!,{r3,r12,lr}\r
bl PicoRead8\r
- ldmfd sp!,{r3,r12,pc}\r
+ ldmfd sp!,{r3,r12,pc}\r
1:\r
mov r1,r0,lsr #13\r
cmp r1,#2 @ YM2612 (0x4000-0x5fff)\r
bne 0f\r
and r0,r0,#3\r
- YM2612Read_and_ret8\r
+ stmfd sp!,{r3,r12,lr}\r
+ str z80_icount,[cpucontext,#cycles_pointer]\r
+ bl ym2612_read_local_z80\r
+ ldmfd sp!,{r3,r12,pc}\r
0:\r
cmp r0,#0x4000\r
movge r0,#0xff\r
add r0,r4,#1\r
bl PicoRead8\r
orr r0,r5,r0,lsl #8\r
- ldmfd sp!,{r3-r5,r12,pc}\r
+ ldmfd sp!,{r3-r5,r12,pc}\r
1:\r
mov r1,r0,lsr #13\r
cmp r1,#2 @ YM2612 (0x4000-0x5fff)\r
bne 0f\r
and r0,r0,#3\r
- YM2612Read_and_ret16\r
+ stmfd sp!,{r3,r12,lr}\r
+ str z80_icount,[cpucontext,#cycles_pointer]\r
+ bl ym2612_read_local_z80\r
+ orr r0,r0,r0,lsl #8\r
+ ldmfd sp!,{r3,r12,pc}\r
0:\r
cmp r0,#0x4000\r
movge r0,#0xff\r
bx lr\r
1:\r
stmfd sp!,{r3,r12,lr}\r
+ str z80_icount,[cpucontext,#cycles_pointer]\r
bl z80_write\r
ldmfd sp!,{r3,r12,pc}\r
\r
strb r0,[r2,#1]\r
bx lr\r
1:\r
- stmfd sp!,{r3-r5,r12,lr}\r
+ stmfd sp!,{r3-r5,r12,lr}\r
+ str z80_icount,[cpucontext,#cycles_pointer]\r
mov r4,r0\r
mov r5,r1\r
- bl z80_write\r
+ bl z80_write\r
mov r0,r4,lsr #8\r
add r1,r5,#1\r
- bl z80_write\r
- ldmfd sp!,{r3-r5,r12,pc}\r
+ bl z80_write\r
+ ldmfd sp!,{r3-r5,r12,pc}\r
\r
.pool\r
.endif\r
str z80pc,[cpucontext,#z80pc_pointer]\r
.endif\r
.if DRZ80_FOR_PICODRIVE\r
- bic r0,r0,#0xfe000\r
ldr r1,[cpucontext,#z80pc_base]\r
+ bic r0,r0,#0xfe000\r
add z80pc,r1,r0\r
.else\r
stmfd sp!,{r3,r12}\r
mov z80_icount,r1 ;@ setup number of Tstates to execute\r
\r
.if INTERRUPT_MODE == 0\r
- ldrh r0,[cpucontext,#z80irq] @ 0x4C\r
+ ldrh r0,[cpucontext,#z80irq] @ 0x4C, irq and IFF bits\r
.endif\r
ldmia cpucontext,{z80pc-z80sp} ;@ load Z80 registers\r
\r
.if INTERRUPT_MODE == 0\r
;@ check ints\r
- tst r0,#1\r
- movnes r0,r0,lsr #8\r
- blne DoInterrupt\r
+ tst r0,#0xff\r
+ movne r0,r0,lsr #8\r
+ tstne r0,#1\r
+ blne DoInterrupt\r
.endif\r
\r
- ldrb r0,[z80pc],#1 ;@ get first op code\r
ldr opcodes,MAIN_opcodes_POINTER2\r
- ldr pc,[opcodes,r0, lsl #2] ;@ execute op code\r
\r
-MAIN_opcodes_POINTER2: .word MAIN_opcodes\r
+ cmp z80_icount,#0 ;@ irq might have used all cycles\r
+ ldrplb r0,[z80pc],#1\r
+ ldrpl pc,[opcodes,r0, lsl #2]\r
\r
\r
z80_execute_end:\r
;@ save registers in CPU context\r
stmia cpucontext,{z80pc-z80sp} ;@ save Z80 registers\r
- mov r0,z80_icount\r
+ mov r0,z80_icount\r
ldmia sp!,{r4-r12,pc} ;@ restore registers from stack and return to C code\r
\r
+MAIN_opcodes_POINTER2: .word MAIN_opcodes\r
.if INTERRUPT_MODE\r
Interrupt_local: .word Interrupt\r
.endif\r
ldmia cpucontext,{z80pc-z80sp} ;@ load Z80 registers\r
mov pc,lr ;@ return\r
.else\r
+\r
+ ;@ r0 == z80if\r
stmfd sp!,{lr}\r
\r
tst r0,#4 ;@ check halt\r
strb r0,[cpucontext,#z80if]\r
\r
;@ now check int mode\r
- tst r1,#1\r
- bne DoInterrupt_mode1\r
- tst r1,#2\r
- bne DoInterrupt_mode2\r
- b DoInterrupt_mode0\r
+ cmp r1,#1\r
+ beq DoInterrupt_mode1\r
+ bgt DoInterrupt_mode2\r
\r
DoInterrupt_mode0:\r
;@ get 3 byte vector\r
;@ rebase new pc\r
rebasepc\r
\r
+ eatcycles 13\r
b DoInterrupt_end\r
\r
1:\r
;@ rebase new pc\r
rebasepc\r
\r
+ eatcycles 13\r
b DoInterrupt_end\r
\r
DoInterrupt_mode1:\r
mov r0,#0x38\r
rebasepc\r
\r
+ eatcycles 13\r
b DoInterrupt_end\r
\r
DoInterrupt_mode2:\r
ldmfd sp!,{r3,r12}\r
mov z80pc,r0 \r
.endif\r
+ eatcycles 17\r
\r
DoInterrupt_end:\r
;@ interupt accepted so callback irq interface\r
ldr r0,[cpucontext, #z80irqcallback]\r
tst r0,r0\r
+ streqb r0,[cpucontext,#z80irq] ;@ default handling\r
ldmeqfd sp!,{pc}\r
stmfd sp!,{r3,r12}\r
mov lr,pc\r
mov pc,r0 ;@ call callback function\r
ldmfd sp!,{r3,r12}\r
ldmfd sp!,{pc} ;@ return\r
-\r
.endif\r
\r
.data\r
tst z80f,#1<<CFlag\r
bne opcode_1_8\r
add z80pc,z80pc,#1\r
- fetch 8\r
+ fetch 7\r
;@ADD HL,SP\r
opcode_3_9:\r
.if FAST_Z80SP\r
orr r0,r0,r1, lsl #8\r
readmem8\r
mov z80a,r0, lsl #24\r
- fetch 11\r
+ fetch 13\r
;@DEC SP\r
opcode_3_B:\r
sub z80sp,z80sp,#1\r
ldrb r0,[cpucontext,#z80if]\r
orr r0,r0,#Z80_HALT\r
strb r0,[cpucontext,#z80if]\r
+ mov z80_icount,#0\r
b z80_execute_end\r
;@LD (HL),A\r
opcode_7_7:\r
;@RET NZ\r
opcode_C_0:\r
tst z80f,#1<<ZFlag\r
- beq opcode_C_9 ;@unconditional RET\r
+ beq opcode_C_9_cond ;@unconditional RET\r
fetch 5\r
\r
;@POP BC\r
;@RET Z\r
opcode_C_8:\r
tst z80f,#1<<ZFlag\r
- bne opcode_C_9 ;@unconditional RET\r
+ bne opcode_C_9_cond ;@unconditional RET\r
fetch 5\r
+\r
+opcode_C_9_cond:\r
+ eatcycles 1\r
;@RET\r
opcode_C_9:\r
opPOP\r
;@RET NC\r
opcode_D_0:\r
tst z80f,#1<<CFlag\r
- beq opcode_C_9 ;@unconditional RET\r
+ beq opcode_C_9_cond ;@unconditional RET\r
fetch 5\r
;@POP DE\r
opcode_D_1:\r
;@RET C\r
opcode_D_8:\r
tst z80f,#1<<CFlag\r
- bne opcode_C_9 ;@unconditional RET\r
+ bne opcode_C_9_cond ;@unconditional RET\r
fetch 5\r
;@EXX\r
opcode_D_9:\r
;@RET PO\r
opcode_E_0:\r
tst z80f,#1<<VFlag\r
- beq opcode_C_9 ;@unconditional RET\r
+ beq opcode_C_9_cond ;@unconditional RET\r
fetch 5\r
;@POP HL\r
opcode_E_1:\r
;@RET PE\r
opcode_E_8:\r
tst z80f,#1<<VFlag\r
- bne opcode_C_9 ;@unconditional RET\r
+ bne opcode_C_9_cond ;@unconditional RET\r
fetch 5\r
;@JP (HL)\r
opcode_E_9:\r
;@RET P\r
opcode_F_0:\r
tst z80f,#1<<SFlag\r
- beq opcode_C_9 ;@unconditional RET\r
+ beq opcode_C_9_cond ;@unconditional RET\r
fetch 5\r
;@POP AF\r
opcode_F_1:\r
;@RET M\r
opcode_F_8:\r
tst z80f,#1<<SFlag\r
- bne opcode_C_9 ;@unconditional RET\r
+ bne opcode_C_9_cond ;@unconditional RET\r
fetch 5\r
;@LD SP,HL\r
opcode_F_9:\r
.else\r
mov z80sp,z80hl, lsr #16\r
.endif\r
- fetch 4\r
+ fetch 6\r
;@JP M,$+3\r
opcode_F_A:\r
tst z80f,#1<<SFlag\r
;@EI\r
opcode_F_B:\r
ldrb r1,[cpucontext,#z80if]\r
- tst r1,#Z80_IF1\r
- bne ei_return_exit\r
-\r
+ mov r2,opcodes\r
orr r1,r1,#(Z80_IF1)|(Z80_IF2)\r
strb r1,[cpucontext,#z80if]\r
\r
- mov r2,opcodes\r
+ ldrb r0,[z80pc],#1\r
+ eatcycles 4\r
ldr opcodes,EI_DUMMY_opcodes_POINTER\r
ldr pc,[r2,r0, lsl #2]\r
\r
;@point that program returns from EI to check interupts\r
;@an interupt can not be taken directly after a EI opcode\r
;@ reset z80pc and opcode pointer\r
- ldrh r0,[cpucontext,#z80irq] @ 0x4C\r
+ ldrh r0,[cpucontext,#z80irq] @ 0x4C, irq and IFF bits\r
sub z80pc,z80pc,#1\r
ldr opcodes,MAIN_opcodes_POINTER\r
;@ check ints\r
- tst r0,#1\r
- movnes r0,r0,lsr #8\r
- blne DoInterrupt\r
+ tst r0,#0xff\r
+ movne r0,r0,lsr #8\r
+ tstne r0,#1\r
+ blne DoInterrupt\r
+\r
;@ continue\r
-ei_return_exit:\r
- fetch 4\r
+ fetch 0\r
\r
;@CALL M,NN\r
opcode_F_C:\r
;@ mov r0,#0xFD00\r
;@ orr r0,r0,r1\r
;@ b end_loop\r
+\r
opcode_DD_NF2:\r
- mov r0,#0xDD0000\r
- orr r0,r0,#0xCB00\r
- orr r0,r0,r1\r
- b end_loop\r
+ fetch 23\r
+;@ notaz: we don't want to deadlock here\r
+;@ mov r0,#0xDD0000\r
+;@ orr r0,r0,#0xCB00\r
+;@ orr r0,r0,r1\r
+;@ b end_loop\r
\r
;@ADD IX,BC\r
opcode_DD_09:\r
;@from the DD location but the address of the IY reg is passed instead\r
;@of IX\r
\r
-end_loop:\r
- b end_loop\r
-\r
+;@end_loop:\r
+;@ b end_loop\r
\r
+;@ vim:filetype=armasm\r
\r