INCLUDE z80a.inc INCLUDE z80a_mn.inc INCLUDE z80a_s.inc EXPORT z80a_sb IMPORT iocore_out IMPORT iocore_inp IMPORT mem_read16 IMPORT mem_write16 IMPORT ievent_eoi AREA .text, CODE, READONLY _ld_nop mov pc, r11 _im_0 bic r6, r6, #(&ff << 16) mov pc, r11 _im_1 bic r6, r6, #(&ff << 16) orr r6, r6, #(&01 << 16) mov pc, r11 _im_2 bic r6, r6, #(&ff << 16) orr r6, r6, #(&02 << 16) mov pc, r11 _out_c_b OUTR8 CPU_B _out_c_c OUTR8 CPU_C _out_c_d OUTR8 CPU_D _out_c_e OUTR8 CPU_E _out_c_h OUTR8 CPU_H _out_c_l OUTR8 CPU_L _out_c_0 mov r1, #0 OUT8 _out_c_a mov r1, r8, lsr #8 OUT8 _in_b_c INPR8 CPU_B _in_c_c INPR8 CPU_C _in_d_c INPR8 CPU_D _in_e_c INPR8 CPU_E _in_h_c INPR8 CPU_H _in_l_c INPR8 CPU_L _in_0_c INP8 mov pc, r11 _in_a_c ldrh r0, [r7, #CPU_BC] str r10, [r7, #CPU_REMCLOCK] bl iocore_inp and r2, r8, #C_FLAG ldrb r1, [r0, r7] orr r3, r2, r0, lsl #8 ldr r10, [r7, #CPU_REMCLOCK] orr r8, r3, r1 mov pc, r11 _ld_i_a and r0, r8, #&ff00 bic r6, r6, #&ff00 orr r6, r6, r0 mov pc, r11 _ld_a_i and r0, r6, #&ff00 and r1, r8, #C_FLAG orr r8, r8, r0 movs r1, r0, lsl #16 orreq r8, r8, #Z_FLAG orrmi r8, r8, #S_FLAG tst r6, #(1 << IFF_IFLAG) orreq r8, r8, #V_FLAG mov pc, r11 _ld_r_a mov r0, r8, lsr #8 bic r6, r6, #&ff000000 strb r0, [r7, #CPU_R2] orr r6, r6, r0, lsl #24 mov pc, r11 _ld_a_r ldrb r0, [r7, #CPU_R2] and r1, r6, #&7f000000 and r2, r8, #C_FLAG tst r0, #&80 adds r1, r1, #&80000000 orreq r2, r2, #Z_FLAG orrmi r2, r2, #S_FLAG tst r6, #(1 << IFF_IFLAG) orreq r2, r2, #V_FLAG orr r8, r2, r1, lsr #16 mov pc, r11 _ld_xword_bc LDx16 CPU_BC _ld_xword_de LDx16 CPU_DE _ld_xword_hl LDx16 CPU_HL _ld_bc_xword LD16x CPU_BC _ld_de_xword LD16x CPU_DE _ld_hl_xword LD16x CPU_HL _adc_hl_bc MADC16 CPU_BC _adc_hl_de MADC16 CPU_DE _adc_hl_hl MADCHL2 _adc_hl_sp MADCSP _sbc_hl_bc MSBC16 CPU_BC _sbc_hl_de MSBC16 CPU_DE _sbc_hl_hl MSBCHL2 _sbc_hl_sp MSBCSP _ld_xword_sp GETPC16 mov r1, r9 mov lr, r11 b mem_write16 _ld_sp_xword GETPC16 mov r9, r9, lsr #16 bl mem_read16 orr r9, r0, r9, lsl #16 mov pc, r11 _rrd ldrh r0, [r7, #CPU_HL] and r1, r8, #&0f00 MEMLEA8 r0, r2, r3 ldrb r12, [r2, r0] mov r1, r1, lsr #4 and r2, r12, #&0f bic r8, r8, #&0f00 orr r8, r8, r2, lsl #8 orr r1, r1, r12, lsr #4 bic r12, r8, #(&ff - C_FLAG) ldrb r8, [r7, r8 lsr #8] strb r1, [r3, r0] orr r8, r8, r12 mov pc, r11 _rld ldrh r0, [r7, #CPU_HL] and r1, r8, #&0f00 MEMLEA8 r0, r2, r3 ldrb r12, [r2, r0] mov r1, r1, lsr #8 and r2, r12, #&f0 bic r8, r8, #&0f00 orr r8, r8, r2, lsl #4 orr r1, r1, r12, lsl #4 bic r12, r8, #(&ff - C_FLAG) ldrb r8, [r7, r8 lsr #8] strb r1, [r3, r0] orr r8, r8, r12 mov pc, r11 _neg and r0, r8, #&ff00 mov r1, #0 subs r2, r1, r0, lsl #16 orr r3, r2, #(N_FLAG << 16) eor r1, r2, r0, lsl #16 orrcc r3, r3, #(C_FLAG << 16) orrvs r3, r3, #(V_FLAG << 16) orreq r3, r3, #(Z_FLAG << 16) orrmi r3, r3, #(S_FLAG << 16) tst r1, #(H_FLAG << 24) mov r8, r3, lsr #16 orrne r8, r8, #H_FLAG mov pc, r11 _retn bic r8, r8, #(1 << IFF_NMI) MRET _reti str r10, [r7, #CPU_REMCLOCK] bl ievent_eoi ldr r10, [r7, #CPU_REMCLOCK] MRET _ldi ldrh r0, [r7, #CPU_HL] ldrh r1, [r7, #CPU_DE] ldrh r2, [r7, #CPU_BC] MEMRD8 r3, r0 MEMWR8 r1, r3 add r0, r0, #1 add r1, r1, #1 subs r2, r2, #1 strh r0, [r7, #CPU_HL] strh r1, [r7, #CPU_DE] strh r2, [r7, #CPU_BC] bic r8, r8, #(&ff - &e9) orrne r8, r8, #V_FLAG mov pc, r11 _ldd ldrh r0, [r7, #CPU_HL] ldrh r1, [r7, #CPU_DE] ldrh r2, [r7, #CPU_BC] MEMRD8 r3, r0 MEMWR8 r1, r3 sub r0, r0, #1 sub r1, r1, #1 subs r2, r2, #1 strh r0, [r7, #CPU_HL] strh r1, [r7, #CPU_DE] strh r2, [r7, #CPU_BC] bic r8, r8, #(&ff - &e9) orrne r8, r8, #V_FLAG mov pc, r11 _ldir ldrh r0, [r7, #CPU_HL] ldrh r1, [r7, #CPU_DE] ldrh r2, [r7, #CPU_BC] MEMRD8 r3, r0 MEMWR8 r1, r3 add r0, r0, #1 add r1, r1, #1 subs r2, r2, #1 strh r0, [r7, #CPU_HL] strh r1, [r7, #CPU_DE] strh r2, [r7, #CPU_BC] bic r8, r8, #(&ff - &e9) orrne r8, r8, #V_FLAG subne r9, r9, #&20000 subne r10, r10, #5 mov pc, r11 _lddr ldrh r0, [r7, #CPU_HL] ldrh r1, [r7, #CPU_DE] ldrh r2, [r7, #CPU_BC] MEMRD8 r3, r0 MEMWR8 r1, r3 sub r0, r0, #1 sub r1, r1, #1 subs r2, r2, #1 strh r0, [r7, #CPU_HL] strh r1, [r7, #CPU_DE] strh r2, [r7, #CPU_BC] bic r8, r8, #(&ff - &e9) orrne r8, r8, #V_FLAG subne r9, r9, #&20000 subne r10, r10, #5 mov pc, r11 _outi ldrh r2, [r7, #CPU_HL] ldrh r0, [r7, #CPU_BC] MEMRD8 r1, r2 add r2, r2, #1 subs r0, r0, #&100 addcc r0, r0, #&10000 strh r2, [r7, #CPU_HL] strh r0, [r7, #CPU_BC] and r8, r8, #&ff00 tst r0, #&ff00 orr r8, r8, #N_FLAG orreq r8, r8, #Z_FLAG str r10, [r7, #CPU_REMCLOCK] bl iocore_out ldr r10, [r7, #CPU_REMCLOCK] mov pc, r11 _outd ldrh r2, [r7, #CPU_HL] ldrh r0, [r7, #CPU_BC] MEMRD8 r1, r2 sub r2, r2, #1 subs r0, r0, #&100 addcc r0, r0, #&10000 strh r2, [r7, #CPU_HL] strh r0, [r7, #CPU_BC] and r8, r8, #&ff00 tst r0, #&ff00 orr r8, r8, #N_FLAG orreq r8, r8, #Z_FLAG str r10, [r7, #CPU_REMCLOCK] bl iocore_out ldr r10, [r7, #CPU_REMCLOCK] mov pc, r11 _otir ldrh r2, [r7, #CPU_HL] ldrh r0, [r7, #CPU_BC] MEMRD8 r1, r2 add r2, r2, #1 subs r0, r0, #&100 addcc r0, r0, #&10000 strh r2, [r7, #CPU_HL] strh r0, [r7, #CPU_BC] and r8, r8, #&ff00 tst r0, #&ff00 orr r8, r8, #N_FLAG subeq r10, r10, #5 orreq r8, r8, #Z_FLAG subeq r9, r9, #&20000 str r10, [r7, #CPU_REMCLOCK] bl iocore_out ldr r10, [r7, #CPU_REMCLOCK] mov pc, r11 _otdr ldrh r2, [r7, #CPU_HL] ldrh r0, [r7, #CPU_BC] MEMRD8 r1, r2 sub r2, r2, #1 subs r0, r0, #&100 addcc r0, r0, #&10000 strh r2, [r7, #CPU_HL] strh r0, [r7, #CPU_BC] and r8, r8, #&ff00 tst r0, #&ff00 orr r8, r8, #N_FLAG subeq r10, r10, #5 orreq r8, r8, #Z_FLAG subeq r9, r9, #&20000 str r10, [r7, #CPU_REMCLOCK] bl iocore_out ldr r10, [r7, #CPU_REMCLOCK] mov pc, r11 _ini ldrh r0, [r7, #CPU_BC] bl iocore_inp ldrh r1, [r7, #CPU_HL] ldrb r2, [r7, #CPU_B] MEMWR8 r1, r0 add r1, r1, #1 subs r2, r2, #1 strh r1, [r7, #CPU_HL] strb r2, [r7, #CPU_B] and r8, r8, #&ff00 orr r8, r8, #N_FLAG orreq r8, r8, #Z_FLAG mov pc, r11 _ind ldrh r0, [r7, #CPU_BC] bl iocore_inp ldrh r1, [r7, #CPU_HL] ldrb r2, [r7, #CPU_B] MEMWR8 r1, r0 sub r1, r1, #1 subs r2, r2, #1 strh r1, [r7, #CPU_HL] strb r2, [r7, #CPU_B] and r8, r8, #&ff00 orr r8, r8, #N_FLAG orreq r8, r8, #Z_FLAG mov pc, r11 _inir ldrh r0, [r7, #CPU_BC] bl iocore_inp ldrh r1, [r7, #CPU_HL] ldrb r2, [r7, #CPU_B] MEMWR8 r1, r0 add r1, r1, #1 subs r2, r2, #1 strh r1, [r7, #CPU_HL] strb r2, [r7, #CPU_B] and r8, r8, #&ff00 orr r8, r8, #N_FLAG orreq r8, r8, #Z_FLAG subeq r9, r9, #&20000 subeq r10, r10, #5 mov pc, r11 _indr ldrh r0, [r7, #CPU_BC] bl iocore_inp ldrh r1, [r7, #CPU_HL] ldrb r2, [r7, #CPU_B] MEMWR8 r1, r0 sub r1, r1, #1 subs r2, r2, #1 strh r1, [r7, #CPU_HL] strb r2, [r7, #CPU_B] and r8, r8, #&ff00 orr r8, r8, #N_FLAG orreq r8, r8, #Z_FLAG subeq r9, r9, #&20000 subeq r10, r10, #5 mov pc, r11 _cpi ldrh r0, [r7, #CPU_HL] MEMRD8 r1, r0 ; T add r0, r0, #1 mov r2, r8, lsr #8 ; A strh r0, [r7, #CPU_HL] subs r3, r2, r1 bic r8, r8, #(&ff - C_FLAG) eor r0, r3, r2 orreq r8, r8, #Z_FLAG eor r0, r0, r1 and r2, r3, #&80 and r0, r0, #H_FLAG orr r8, r8, r2 ldrh r1, [r7, #CPU_BC] orr r0, r0, #N_FLAG subs r1, r1, #1 orr r8, r0, r8 strh r1, [r7, #CPU_BC] orrne r8, r8, #V_FLAG mov pc, r11 _cpd ldrh r0, [r7, #CPU_HL] MEMRD8 r1, r0 ; T sub r0, r0, #1 mov r2, r8, lsr #8 ; A strh r0, [r7, #CPU_HL] subs r3, r2, r1 bic r8, r8, #(&ff - C_FLAG) eor r0, r3, r2 orreq r8, r8, #Z_FLAG eor r0, r0, r1 and r2, r3, #&80 and r0, r0, #H_FLAG orr r8, r8, r2 ldrh r1, [r7, #CPU_BC] orr r0, r0, #N_FLAG subs r1, r1, #1 orr r8, r0, r8 strh r1, [r7, #CPU_BC] orrne r8, r8, #V_FLAG mov pc, r11 _cpir ldrh r0, [r7, #CPU_HL] MEMRD8 r1, r0 ; T add r0, r0, #1 mov r2, r8, lsr #8 ; A strh r0, [r7, #CPU_HL] subs r3, r2, r1 eor r0, r3, r2 bic r8, r8, #(&ff - C_FLAG) eor r0, r0, r1 orr r8, r8, #N_FLAG and r0, r0, #H_FLAG ldrh r1, [r7, #CPU_BC] orr r8, r0, r8 beq __cpir0 and r2, r3, #&80 subs r1, r1, #1 orr r8, r8, r2 strh r1, [r7, #CPU_BC] orrne r8, r8, #V_FLAG mov pc, r11 __cpir0 orr r8, r8, #Z_FLAG subs r1, r1, #1 orrne r8, r8, #V_FLAG strh r1, [r7, #CPU_BC] mov pc, r11 _cpdr ldrh r0, [r7, #CPU_HL] MEMRD8 r1, r0 ; T sub r0, r0, #1 mov r2, r8, lsr #8 ; A strh r0, [r7, #CPU_HL] subs r3, r2, r1 eor r0, r3, r2 bic r8, r8, #(&ff - C_FLAG) eor r0, r0, r1 orr r8, r8, #N_FLAG and r0, r0, #H_FLAG ldrh r1, [r7, #CPU_BC] orr r8, r0, r8 beq __cpdr0 and r2, r3, #&80 subs r1, r1, #1 orr r8, r8, r2 strh r1, [r7, #CPU_BC] orrne r8, r8, #V_FLAG mov pc, r11 __cpdr0 orr r8, r8, #Z_FLAG subs r1, r1, #1 orrne r8, r8, #V_FLAG strh r1, [r7, #CPU_BC] mov pc, r11 ; ---- z80a_sb GETPC8 adr r1, clktbl adr r2, optbl ldrb r3, [r1, r0] ldr r1, [r2, r0, lsl #2] rsb r10, r3, r10 add r6, r6, #(1 << 24) mov pc, r1 clktbl dcb 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 dcb 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 dcb 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 dcb 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 dcb 12,12,15,20, 8, 8, 8, 9,12,12,15,20, 8, 8, 8, 9 dcb 12,12,15,20, 8, 8, 8, 9,12,12,15,20, 8, 8, 8, 9 dcb 12,12,15,20, 8, 8, 8,18,12,12,15,20, 8, 8, 8,18 dcb 12,12,15,20, 8, 8, 8, 0,12,12,15,20, 8, 8, 8, 0 dcb 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 dcb 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 dcb 16,16,16,16, 0, 0, 0, 0,16,16,16,16, 0, 0, 0, 0 dcb 16,16,16,16, 0, 0, 0, 0,16,16,16,16, 0, 0, 0, 0 dcb 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 dcb 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 dcb 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 dcb 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 optbl dcd _ld_nop, _ld_nop, _ld_nop, _ld_nop dcd _ld_nop, _ld_nop, _ld_nop, _ld_nop dcd _ld_nop, _ld_nop, _ld_nop, _ld_nop dcd _ld_nop, _ld_nop, _ld_nop, _ld_nop dcd _ld_nop, _ld_nop, _ld_nop, _ld_nop dcd _ld_nop, _ld_nop, _ld_nop, _ld_nop dcd _ld_nop, _ld_nop, _ld_nop, _ld_nop dcd _ld_nop, _ld_nop, _ld_nop, _ld_nop dcd _ld_nop, _ld_nop, _ld_nop, _ld_nop dcd _ld_nop, _ld_nop, _ld_nop, _ld_nop dcd _ld_nop, _ld_nop, _ld_nop, _ld_nop dcd _ld_nop, _ld_nop, _ld_nop, _ld_nop dcd _ld_nop, _ld_nop, _ld_nop, _ld_nop dcd _ld_nop, _ld_nop, _ld_nop, _ld_nop dcd _ld_nop, _ld_nop, _ld_nop, _ld_nop dcd _ld_nop, _ld_nop, _ld_nop, _ld_nop dcd _in_b_c, _out_c_b, _sbc_hl_bc, _ld_xword_bc dcd _neg, _retn, _im_0, _ld_i_a dcd _in_c_c, _out_c_c, _adc_hl_bc, _ld_bc_xword dcd _neg, _reti, _im_0, _ld_r_a dcd _in_d_c, _out_c_d, _sbc_hl_de, _ld_xword_de dcd _neg, _retn, _im_1, _ld_a_i dcd _in_e_c, _out_c_e, _adc_hl_de, _ld_de_xword dcd _neg, _reti, _im_2, _ld_a_r dcd _in_h_c, _out_c_h, _sbc_hl_hl, _ld_xword_hl dcd _neg, _retn, _im_0, _rrd dcd _in_l_c, _out_c_l, _adc_hl_hl, _ld_hl_xword dcd _neg, _reti, _im_0, _rld dcd _in_0_c, _out_c_0, _sbc_hl_sp, _ld_xword_sp dcd _neg, _retn, _im_1, _ld_nop dcd _in_a_c, _out_c_a, _adc_hl_sp, _ld_sp_xword dcd _neg, _reti, _im_2, _ld_nop dcd _ld_nop, _ld_nop, _ld_nop, _ld_nop dcd _ld_nop, _ld_nop, _ld_nop, _ld_nop dcd _ld_nop, _ld_nop, _ld_nop, _ld_nop dcd _ld_nop, _ld_nop, _ld_nop, _ld_nop dcd _ld_nop, _ld_nop, _ld_nop, _ld_nop dcd _ld_nop, _ld_nop, _ld_nop, _ld_nop dcd _ld_nop, _ld_nop, _ld_nop, _ld_nop dcd _ld_nop, _ld_nop, _ld_nop, _ld_nop dcd _ldi, _cpi, _ini, _outi dcd _ld_nop, _ld_nop, _ld_nop, _ld_nop dcd _ldd, _cpd, _ind, _outd dcd _ld_nop, _ld_nop, _ld_nop, _ld_nop dcd _ldir, _cpir, _inir, _otir dcd _ld_nop, _ld_nop, _ld_nop, _ld_nop dcd _lddr, _cpdr, _indr, _otdr dcd _ld_nop, _ld_nop, _ld_nop, _ld_nop dcd _ld_nop, _ld_nop, _ld_nop, _ld_nop dcd _ld_nop, _ld_nop, _ld_nop, _ld_nop dcd _ld_nop, _ld_nop, _ld_nop, _ld_nop dcd _ld_nop, _ld_nop, _ld_nop, _ld_nop dcd _ld_nop, _ld_nop, _ld_nop, _ld_nop dcd _ld_nop, _ld_nop, _ld_nop, _ld_nop dcd _ld_nop, _ld_nop, _ld_nop, _ld_nop dcd _ld_nop, _ld_nop, _ld_nop, _ld_nop dcd _ld_nop, _ld_nop, _ld_nop, _ld_nop dcd _ld_nop, _ld_nop, _ld_nop, _ld_nop dcd _ld_nop, _ld_nop, _ld_nop, _ld_nop dcd _ld_nop, _ld_nop, _ld_nop, _ld_nop dcd _ld_nop, _ld_nop, _ld_nop, _ld_nop dcd _ld_nop, _ld_nop, _ld_nop, _ld_nop dcd _ld_nop, _ld_nop, _ld_nop, _ld_nop dcd _ld_nop, _ld_nop, _ld_nop, _ld_nop END