Mercurial > repos > blastem
diff z80.cpu @ 2053:3414a4423de1 segacd
Merge from default
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Sat, 15 Jan 2022 13:15:21 -0800 |
parents | 1dc718581aac |
children | 338c78da3fff |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/z80.cpu Sat Jan 15 13:15:21 2022 -0800 @@ -0,0 +1,2539 @@ +info + prefix z80_ + opcode_size 8 + extra_tables cb ed dded fded ddcb fdcb dd fd + body z80_run_op + sync_cycle z80_sync_cycle + interrupt z80_interrupt + include z80_util.c + header z80.h + +declare + void init_z80_opts(z80_options * options, memmap_chunk const * chunks, uint32_t num_chunks, memmap_chunk const * io_chunks, uint32_t num_io_chunks, uint32_t clock_divider, uint32_t io_address_mask); + z80_context * init_z80_context(z80_options *options); + void z80_run(z80_context *context, uint32_t target_cycle); + void z80_assert_reset(z80_context * context, uint32_t cycle); + void z80_clear_reset(z80_context * context, uint32_t cycle); + void z80_assert_busreq(z80_context * context, uint32_t cycle); + void z80_clear_busreq(z80_context * context, uint32_t cycle); + void z80_assert_nmi(z80_context *context, uint32_t cycle); + uint8_t z80_get_busack(z80_context * context, uint32_t cycle); + void z80_invalidate_code_range(z80_context *context, uint32_t start, uint32_t end); + void z80_adjust_cycles(z80_context * context, uint32_t deduction); + void z80_serialize(z80_context *context, serialize_buffer *buf); + void z80_deserialize(deserialize_buffer *buf, void *vcontext); + void zinsert_breakpoint(z80_context * context, uint16_t address, uint8_t * bp_handler); + void zremove_breakpoint(z80_context * context, uint16_t address); + void z80_options_free(z80_options *opts); + void z80_sync_cycle(z80_context *context, uint32_t target_cycle); + +regs + main 8 b c d e h l f a + alt 8 b' c' d' e' h' l' f' a' + i 8 + r 8 + rhigh 8 + iff1 8 + iff2 8 + imode 8 + sp 16 + ix 16 + iy 16 + pc 16 + wz 16 + nflag 8 + last_flag_result 8 + pvflag 8 + chflags 8 + zflag 8 + scratch1 16 + scratch2 16 + busreq 8 + busack 8 + reset 8 + io_map ptrmemmap_chunk + io_chunks 32 + io_mask 32 + int_cycle 32 + int_end_cycle 32 + int_value 8 + nmi_cycle 32 + system ptrvoid + fastread ptr8 64 + fastwrite ptr8 64 + mem_pointers ptr8 4 + +flags + register f + S 7 sign last_flag_result.7 + Z 6 zero zflag + Y 5 bit-5 last_flag_result.5 + H 4 half-carry chflags.3 + P 2 parity pvflag + V 2 overflow pvflag + X 3 bit-3 last_flag_result.3 + N 1 none nflag + C 0 carry chflags.7 + + +z80_op_fetch + cycles 1 + add 1 r r + mov pc scratch1 + ocall read_8 + add 1 pc pc + +z80_run_op + #printf "Z80: %X @ %d\n" pc cycles + #printf "Z80: %X - A: %X, B: %X, C: %X D: %X, E: %X, H: %X, L: %X, SP: %X, IX: %X, IY: %X @ %d\n" pc a b c d e h l sp ix iy cycles + z80_op_fetch + dispatch scratch1 + +z80_interrupt + cmp int_cycle cycles + if >=U + + mov 0 iff1 + mov 0 iff2 + cycles 6 + update_sync + + switch imode + case 0 + dispatch int_value + + case 1 + dispatch 0xFF + + case 2 + lsl i 8 pc + or int_value pc pc + #CD is call + dispatch 0xCD + end + + else + + cmp nmi_cycle cycles + if >=U + + mov 0xFFFFFFFF nmi_cycle + mov 0 iff1 + local pch 8 + lsr pc 8 pch + meta high pch + meta low pc + z80_push + mov 0x66 pc + update_sync + + end + end + + +11001011 cb_prefix + z80_op_fetch + dispatch scratch1 cb + +11011101 dd_prefix + z80_op_fetch + dispatch scratch1 dd + +11101101 ed_prefix + z80_op_fetch + dispatch scratch1 ed + +11111101 fd_prefix + z80_op_fetch + dispatch scratch1 fd + +dd 11001011 ddcb_prefix + z80_calc_index ix + cycles 2 + mov pc scratch1 + ocall read_8 + add 1 pc pc + dispatch scratch1 ddcb + +fd 11001011 fdcb_prefix + z80_calc_index iy + cycles 2 + mov pc scratch1 + ocall read_8 + add 1 pc pc + dispatch scratch1 fdcb + +z80_check_cond + arg cond 8 + local invert 8 + switch cond + case 0 + meta istrue invert + lnot zflag invert + + case 1 + meta istrue zflag + + case 2 + meta istrue invert + not chflags invert + and 0x80 invert invert + + case 3 + meta istrue invert + and 0x80 chflags invert + + case 4 + meta istrue invert + lnot pvflag invert + + case 5 + meta istrue pvflag + + case 6 + meta istrue invert + not last_flag_result invert + and 0x80 invert invert + + case 7 + meta istrue invert + and 0x80 last_flag_result invert + + end + +z80_fetch_hl + lsl h 8 scratch1 + or l scratch1 scratch1 + ocall read_8 + +z80_store_hl + lsl h 8 scratch2 + or l scratch2 scratch2 + ocall write_8 + +z80_fetch_immed + mov pc scratch1 + ocall read_8 + add 1 pc pc + +z80_fetch_immed16 + mov pc scratch1 + ocall read_8 + mov scratch1 wz + add 1 pc pc + mov pc scratch1 + ocall read_8 + add 1 pc pc + lsl scratch1 8 scratch1 + or scratch1 wz wz + +z80_fetch_immed_reg16 + mov pc scratch1 + ocall read_8 + mov scratch1 low + add 1 pc pc + mov pc scratch1 + ocall read_8 + mov scratch1 high + add 1 pc pc + +z80_fetch_immed_to_reg16 + mov pc scratch1 + ocall read_8 + mov scratch1 reg + add 1 pc pc + mov pc scratch1 + ocall read_8 + add 1 pc pc + lsl scratch1 8 scratch1 + or scratch1 reg reg + +01RRR110 ld_from_hl + z80_fetch_hl + mov scratch1 main.R + +01DDDSSS ld_from_reg + mov main.S main.D + +dd 01DDD100 ld_from_ixh + invalid D 6 + lsr ix 8 main.D + +dd 01100SSS ld_to_ixh + invalid S 6 + local tmp 16 + and 0xFF ix ix + lsl main.S 8 tmp + or tmp ix ix + +dd 0110D10S ld_ixb_to_ixb + +dd 01DDD101 ld_from_ixl + invalid D 6 + mov ix main.D + +dd 01101SSS ld_to_ixl + invalid S 6 + and 0xFF00 ix ix + or main.S ix ix + +dd 01100101 ld_ixl_to_ixh + local tmp 16 + lsl ix 8 tmp + and 0xFF ix ix + or tmp ix ix + +dd 01101100 ld_ixh_to_ixl + local tmp 16 + lsr ix 8 tmp + and 0xFF00 ix ix + or tmp ix ix + +fd 01DDD100 ld_from_iyh + invalid D 6 + lsr iy 8 main.D + +fd 01100SSS ld_to_iyh + invalid S 6 + local tmp 16 + and 0xFF iy iy + lsl main.S 8 tmp + or tmp iy iy + +fd 0110D10S ld_iyb_to_iyb + +fd 01DDD101 ld_from_iyl + invalid D 6 + mov iy main.D + +fd 01101SSS ld_to_iyl + invalid S 6 + and 0xFF00 iy iy + or main.S iy iy + +fd 01100101 ld_iyl_to_iyh + local tmp 16 + lsl iy 8 tmp + and 0xFF iy iy + or tmp iy iy + +fd 01101100 ld_iyh_to_iyl + local tmp 16 + lsr iy 8 tmp + and 0xFF00 iy iy + or tmp iy iy + +z80_calc_index + arg index 16 + mov index wz + z80_fetch_immed + sext 16 scratch1 scratch1 + add scratch1 wz wz + +z80_fetch_index + arg index 16 + z80_calc_index index + mov wz scratch1 + cycles 5 + ocall read_8 + +z80_store_index + mov wz scratch2 + ocall write_8 + +dd 01RRR110 ld_from_ix + z80_fetch_index ix + mov scratch1 main.R + +fd 01RRR110 ld_from_iy + z80_fetch_index iy + mov scratch1 main.R + +00RRR110 ld_immed + z80_fetch_immed + mov scratch1 main.R + +dd 00100110 ld_immed_ixh + z80_fetch_immed + lsl scratch1 8 scratch1 + and 0xFF ix ix + or scratch1 ix ix + +dd 00101110 ld_immed_ixl + z80_fetch_immed + and 0xFF00 ix ix + or scratch1 ix ix + +fd 00100110 ld_immed_iyh + z80_fetch_immed + lsl scratch1 8 scratch1 + and 0xFF iy iy + or scratch1 iy iy + +fd 00101110 ld_immed_iyl + z80_fetch_immed + and 0xFF00 iy iy + or scratch1 iy iy + +01110RRR ld_to_hl + mov main.R scratch1 + z80_store_hl + +dd 01110RRR ld_to_ix + z80_calc_index ix + mov wz scratch2 + mov main.R scratch1 + cycles 5 + ocall write_8 + +fd 01110RRR ld_to_iy + z80_calc_index iy + mov wz scratch2 + mov main.R scratch1 + cycles 5 + ocall write_8 + +00110110 ld_to_hl_immed + z80_fetch_immed + z80_store_hl + +dd 00110110 ld_to_ixd_immed + z80_calc_index ix + z80_fetch_immed + cycles 2 + mov wz scratch2 + ocall write_8 + +fd 00110110 ld_to_iyd_immed + z80_calc_index iy + z80_fetch_immed + cycles 2 + mov wz scratch2 + ocall write_8 + +00001010 ld_a_from_bc + lsl b 8 wz + or c wz wz + mov wz scratch1 + add 1 wz wz + ocall read_8 + mov scratch1 a + +00011010 ld_a_from_de + lsl d 8 wz + or e wz wz + mov wz scratch1 + add 1 wz wz + ocall read_8 + mov scratch1 a + +00111010 ld_a_from_immed + z80_fetch_immed16 + mov wz scratch1 + add 1 wz wz + ocall read_8 + mov scratch1 a + +00000010 ld_a_to_bc + local tmp 8 + lsl b 8 scratch2 + or c scratch2 scratch2 + mov a scratch1 + add c 1 tmp + lsl a 8 wz + or tmp wz wz + ocall write_8 + +00010010 ld_a_to_de + local tmp 8 + lsl d 8 scratch2 + or e scratch2 scratch2 + mov a scratch1 + add e 1 tmp + lsl a 8 wz + or tmp wz wz + ocall write_8 + +00110010 ld_a_to_immed + local tmp 16 + z80_fetch_immed16 + mov wz scratch2 + mov a scratch1 + add 1 wz wz + ocall write_8 + and 0xFF wz wz + lsl a 8 tmp + or tmp wz wz + +ed 01000111 ld_i_a + mov a i + cycles 1 + +ed 01001111 ld_r_a + mov a r + and 0x80 a rhigh + cycles 1 + +ed 01011111 ld_a_r + cycles 1 + and 0x7F r a + or rhigh a a + update_flags SZYH0XN0 + mov iff2 pvflag + +ed 01010111 ld_a_i + cycles 1 + mov i a + update_flags SZYH0XN0 + mov iff2 pvflag + +00000001 ld_bc_immed + meta high b + meta low c + z80_fetch_immed_reg16 + +00010001 ld_de_immed + meta high d + meta low e + z80_fetch_immed_reg16 + +00100001 ld_hl_immed + meta high h + meta low l + z80_fetch_immed_reg16 + +00110001 ld_sp_immed + meta reg sp + z80_fetch_immed_to_reg16 + +dd 00100001 ld_ix_immed + meta reg ix + z80_fetch_immed_to_reg16 + +fd 00100001 ld_iy_immed + meta reg iy + z80_fetch_immed_to_reg16 + +z80_fetch16_from_immed + z80_fetch_immed16 + mov wz scratch1 + ocall read_8 + mov scratch1 low + add 1 wz wz + mov wz scratch1 + ocall read_8 + mov scratch1 high + add 1 wz wz + +00101010 ld_hl_from_immed + meta low l + meta high h + z80_fetch16_from_immed + +ed 01001011 ld_bc_from_immed + meta low c + meta high b + z80_fetch16_from_immed + +ed 01011011 ld_de_from_immed + meta low e + meta high d + z80_fetch16_from_immed + +ed 01101011 ld_hl_from_immed_slow + meta low l + meta high h + z80_fetch16_from_immed + +z80_fetch_reg16_from_immed + z80_fetch_immed16 + mov wz scratch1 + ocall read_8 + mov scratch1 reg + add 1 wz wz + mov wz scratch1 + ocall read_8 + lsl scratch1 8 scratch1 + or scratch1 reg reg + add 1 wz wz + +ed 01111011 ld_sp_from_immed + meta reg sp + z80_fetch_reg16_from_immed + +dd 00101010 ld_ix_from_immed + meta reg ix + z80_fetch_reg16_from_immed + +fd 00101010 ld_iy_from_immed + meta reg iy + z80_fetch_reg16_from_immed + +00100010 ld_hl_to_immed + z80_fetch_immed16 + mov wz scratch2 + mov l scratch1 + ocall write_8 + add 1 wz wz + mov wz scratch2 + mov h scratch1 + ocall write_8 + add 1 wz wz + +dd 00100010 ld_ix_to_immed + z80_fetch_immed16 + mov wz scratch2 + mov ix scratch1 + ocall write_8 + add 1 wz wz + mov wz scratch2 + lsr ix 8 scratch1 + ocall write_8 + add 1 wz wz + +fd 00100010 ld_iy_to_immed + z80_fetch_immed16 + mov wz scratch2 + mov iy scratch1 + ocall write_8 + add 1 wz wz + mov wz scratch2 + lsr iy 8 scratch1 + ocall write_8 + add 1 wz wz + +z80_regpair_to_immed + z80_fetch_immed16 + mov wz scratch2 + mov low scratch1 + ocall write_8 + add 1 wz wz + mov high scratch1 + mov wz scratch2 + ocall write_8 + add 1 wz wz + +ed 01000011 ld_bc_to_immed + meta low c + meta high b + z80_regpair_to_immed + +ed 01010011 ld_de_to_immed + meta low e + meta high d + z80_regpair_to_immed + +ed 01100011 ld_hl_to_immed_slow + meta low l + meta high h + z80_regpair_to_immed + +ed 01110011 ld_sp_to_immed + meta low sp + local sph 8 + lsr sp 8 sph + meta high sph + z80_regpair_to_immed + +11111001 ld_sp_hl + cycles 2 + lsl h 8 sp + or l sp sp + +dd 11111001 ld_sp_ix + cycles 2 + mov ix sp + +fd 11111001 ld_sp_iy + cycles 2 + mov iy sp + +z80_push + cycles 1 + sub 1 sp sp + mov sp scratch2 + mov high scratch1 + ocall write_8 + sub 1 sp sp + mov sp scratch2 + mov low scratch1 + ocall write_8 + +11000101 push_bc + meta high b + meta low c + z80_push + +11010101 push_de + meta high d + meta low e + z80_push + +11100101 push_hl + meta high h + meta low l + z80_push + +11110101 push_af + meta high a + meta low f + z80_push + +dd 11100101 push_ix + local ixh 8 + lsr ix 8 ixh + meta high ixh + meta low ix + z80_push + +fd 11100101 push_iy + local iyh 8 + lsr iy 8 iyh + meta high iyh + meta low iy + z80_push + +z80_pop + mov sp scratch1 + ocall read_8 + add 1 sp sp + mov scratch1 low + mov sp scratch1 + ocall read_8 + add 1 sp sp + mov scratch1 high + +11000001 pop_bc + meta high b + meta low c + z80_pop + +11010001 pop_de + meta high d + meta low e + z80_pop + +11100001 pop_hl + meta high h + meta low l + z80_pop + +11110001 pop_af + meta high a + meta low f + z80_pop + +dd 11100001 pop_ix + local ixh 16 + meta high ixh + meta low ix + z80_pop + lsl ixh 8 ixh + or ixh ix ix + +fd 11100001 pop_iy + local iyh 16 + meta high iyh + meta low iy + z80_pop + lsl iyh 8 iyh + or iyh iy iy + +11101011 ex_de_hl + xchg e l + xchg d h + +00001000 ex_af_af + xchg a a' + xchg f f' + +11011001 exx + xchg b b' + xchg c c' + xchg d d' + xchg e e' + xchg h h' + xchg l l' + +11100011 ex_sp_hl + mov sp scratch1 + ocall read_8 + xchg l scratch1 + cycles 1 + mov sp scratch2 + ocall write_8 + add 1 sp scratch1 + ocall read_8 + xchg h scratch1 + cycles 2 + add 1 sp scratch2 + ocall write_8 + lsl h 8 wz + or l wz wz + +dd 11100011 ex_sp_ix + mov sp scratch1 + ocall read_8 + mov scratch1 wz + mov ix scratch1 + cycles 1 + mov sp scratch2 + ocall write_8 + add 1 sp scratch1 + ocall read_8 + lsl scratch1 8 scratch1 + or scratch1 wz wz + lsr ix 8 scratch1 + cycles 2 + add 1 sp scratch2 + ocall write_8 + mov wz ix + +fd 11100011 ex_sp_iy + mov sp scratch1 + ocall read_8 + mov scratch1 wz + mov iy scratch1 + cycles 1 + mov sp scratch2 + ocall write_8 + add 1 sp scratch1 + ocall read_8 + lsl scratch1 8 scratch1 + or scratch1 wz wz + lsr iy 8 scratch1 + cycles 2 + add 1 sp scratch2 + ocall write_8 + mov wz iy + +10000RRR add_reg + add a main.R a + update_flags SZYHVXN0C + +dd 10000100 add_ixh + lsr ix 8 scratch1 + add a scratch1 a + update_flags SZYHVXN0C + +dd 10000101 add_ixl + and ix 0xFF scratch1 + add a scratch1 a + update_flags SZYHVXN0C + +fd 10000100 add_iyh + lsr iy 8 scratch1 + add a scratch1 a + update_flags SZYHVXN0C + +fd 10000101 add_iyl + and iy 0xFF scratch1 + add a scratch1 a + update_flags SZYHVXN0C + +10000110 add_hl + z80_fetch_hl + add a scratch1 a + update_flags SZYHVXN0C + +dd 10000110 add_ixd + z80_fetch_index ix + add a scratch1 a + update_flags SZYHVXN0C + +fd 10000110 add_iyd + z80_fetch_index iy + add a scratch1 a + update_flags SZYHVXN0C + +11000110 add_immed + z80_fetch_immed + add a scratch1 a + update_flags SZYHVXN0C + +z80_add16_hl + arg src 16 + lsl h 8 hlt + or l hlt hlt + add 1 hlt wz + add src hlt hlt + update_flags YHXN0C + mov hlt l + lsr hlt 8 h + cycles 7 + +00001001 add_hl_bc + local hlw 16 + local bcw 16 + meta hlt hlw + lsl b 8 bcw + or c bcw bcw + z80_add16_hl bcw + +00011001 add_hl_de + local hlw 16 + local dew 16 + meta hlt hlw + lsl d 8 dew + or e dew dew + z80_add16_hl dew + +00101001 add_hl_hl + local hlw 16 + meta hlt hlw + z80_add16_hl hlw + +00111001 add_hl_sp + local hlw 16 + meta hlt hlw + z80_add16_hl sp + +dd 00001001 add_ix_bc + lsl b 8 scratch1 + or c scratch1 scratch1 + add scratch1 ix ix + update_flags YHXN0C + cycles 7 + +dd 00011001 add_ix_de + lsl d 8 scratch1 + or e scratch1 scratch1 + add scratch1 ix ix + update_flags YHXN0C + cycles 7 + +dd 00101001 add_ix_ix + add ix ix ix + update_flags YHXN0C + cycles 7 + +dd 00111001 add_ix_sp + add sp ix ix + update_flags YHXN0C + cycles 7 + +fd 00001001 add_iy_bc + lsl b 8 scratch1 + or c scratch1 scratch1 + add scratch1 iy iy + update_flags YHXN0C + cycles 7 + +fd 00011001 add_iy_de + lsl d 8 scratch1 + or e scratch1 scratch1 + add scratch1 iy iy + update_flags YHXN0C + cycles 7 + +fd 00101001 add_iy_iy + add iy iy iy + update_flags YHXN0C + cycles 7 + +fd 00111001 add_iy_sp + add sp iy iy + update_flags YHXN0C + cycles 7 + +10001RRR adc_reg + adc a main.R a + update_flags SZYHVXN0C + +dd 10001100 adc_ixh + lsr ix 8 scratch1 + adc a scratch1 a + update_flags SZYHVXN0C + +dd 10001101 adc_ixl + and ix 0xFF scratch1 + adc a scratch1 a + update_flags SZYHVXN0C + +fd 10001100 adc_iyh + lsr iy 8 scratch1 + adc a scratch1 a + update_flags SZYHVXN0C + +fd 10001101 adc_iyl + and iy 0xFF scratch1 + adc a scratch1 a + update_flags SZYHVXN0C + +10001110 adc_hl + z80_fetch_hl + adc a scratch1 a + update_flags SZYHVXN0C + +dd 10001110 adc_ixd + z80_fetch_index ix + adc a scratch1 a + update_flags SZYHVXN0C + +fd 10001110 adc_iyd + z80_fetch_index iy + adc a scratch1 a + update_flags SZYHVXN0C + +11001110 adc_immed + z80_fetch_immed + adc a scratch1 a + update_flags SZYHVXN0C + +z80_adc16_hl + arg src 16 + lsl h 8 hlt + or l hlt hlt + add 1 hlt wz + adc src hlt hlt + update_flags SZYHVXN0C + mov hlt l + lsr hlt 8 h + cycles 7 + +ed 01001010 adc_hl_bc + local hlw 16 + local bcw 16 + meta hlt hlw + lsl b 8 bcw + or c bcw bcw + z80_adc16_hl bcw + +ed 01011010 adc_hl_de + local hlw 16 + local dew 16 + meta hlt hlw + lsl d 8 dew + or e dew dew + z80_adc16_hl dew + +ed 01101010 adc_hl_hl + local hlw 16 + meta hlt hlw + z80_adc16_hl hlw + + +ed 01111010 adc_hl_sp + local hlw 16 + meta hlt hlw + z80_adc16_hl sp + +10010RRR sub_reg + sub main.R a a + update_flags SZYHVXN1C + +dd 10010100 sub_ixh + lsr ix 8 scratch1 + sub scratch1 a a + update_flags SZYHVXN1C + +dd 10010101 sub_ixl + and ix 0xFF scratch1 + sub scratch1 a a + update_flags SZYHVXN1C + +fd 10010100 sub_iyh + lsr iy 8 scratch1 + sub scratch1 a a + update_flags SZYHVXN1C + +fd 10010101 sub_iyl + and iy 0xFF scratch1 + sub scratch1 a a + update_flags SZYHVXN1C + +10010110 sub_hl + z80_fetch_hl + sub scratch1 a a + update_flags SZYHVXN1C + +dd 10010110 sub_ixd + z80_fetch_index ix + sub scratch1 a a + update_flags SZYHVXN1C + +fd 10010110 sub_iyd + z80_fetch_index iy + sub scratch1 a a + update_flags SZYHVXN1C + +11010110 sub_immed + z80_fetch_immed + sub scratch1 a a + update_flags SZYHVXN1C + +10011RRR sbc_reg + sbc main.R a a + update_flags SZYHVXN1C + +dd 10011100 sbc_ixh + lsr ix 8 scratch1 + sbc scratch1 a a + update_flags SZYHVXN1C + +dd 10011101 sbc_ixl + and ix 0xFF scratch1 + sbc scratch1 a a + update_flags SZYHVXN1C + +fd 10011100 sbc_iyh + lsr iy 8 scratch1 + sbc scratch1 a a + update_flags SZYHVXN1C + +fd 10011101 sbc_iyl + and iy 0xFF scratch1 + sbc scratch1 a a + update_flags SZYHVXN1C + + +10011110 sbc_hl + z80_fetch_hl + sbc scratch1 a a + update_flags SZYHVXN1C + +dd 10011110 sbc_ixd + z80_fetch_index ix + sbc scratch1 a a + update_flags SZYHVXN1C + +fd 10011110 sbc_iyd + z80_fetch_index iy + sbc scratch1 a a + update_flags SZYHVXN1C + +11011110 sbc_immed + z80_fetch_immed + sbc scratch1 a a + update_flags SZYHVXN1C + +z80_sbc16_hl + arg src 16 + lsl h 8 hlt + or l hlt hlt + add 1 hlt wz + sbc src hlt hlt + update_flags SZYHVXN1C + mov hlt l + lsr hlt 8 h + cycles 7 + +ed 01000010 sbc_hl_bc + local hlw 16 + local bcw 16 + meta hlt hlw + lsl b 8 bcw + or c bcw bcw + z80_sbc16_hl bcw + +ed 01010010 sbc_hl_de + local hlw 16 + local dew 16 + meta hlt hlw + lsl d 8 dew + or e dew dew + z80_sbc16_hl dew + +ed 01100010 sbc_hl_hl + local hlw 16 + meta hlt hlw + z80_sbc16_hl hlw + + +ed 01110010 sbc_hl_sp + local hlw 16 + meta hlt hlw + z80_sbc16_hl sp + +10100RRR and_reg + and a main.R a + update_flags SZYH1PXN0C0 + +dd 10100100 and_ixh + lsr ix 8 scratch1 + and scratch1 a a + update_flags SZYH1PXN0C0 + +dd 10100101 and_ixl + and ix a a + update_flags SZYH1PXN0C0 + +fd 10100100 and_iyh + lsr iy 8 scratch1 + and scratch1 a a + update_flags SZYH1PXN0C0 + +fd 10100101 and_iyl + and iy a a + update_flags SZYH1PXN0C0 + +10100110 and_hl + z80_fetch_hl + and a scratch1 a + update_flags SZYH1PXN0C0 + +dd 10100110 and_ixd + z80_fetch_index ix + and a scratch1 a + update_flags SZYH1PXN0C0 + +fd 10100110 and_iyd + z80_fetch_index iy + and a scratch1 a + update_flags SZYH1PXN0C0 + +11100110 and_immed + z80_fetch_immed + and a scratch1 a + update_flags SZYH1PXN0C0 + +10110RRR or_reg + or a main.R a + update_flags SZYH0PXN0C0 + +dd 10110100 or_ixh + lsr ix 8 scratch1 + or scratch1 a a + update_flags SZYH0PXN0C0 + +dd 10110101 or_ixl + or ix a a + update_flags SZYH0PXN0C0 + +fd 10110100 or_iyh + lsr iy 8 scratch1 + or scratch1 a a + update_flags SZYH0PXN0C0 + +fd 10110101 or_iyl + or iy a a + update_flags SZYH0PXN0C0 + +10110110 or_hl + z80_fetch_hl + or a scratch1 a + update_flags SZYH0PXN0C0 + +dd 10110110 or_ixd + z80_fetch_index ix + or a scratch1 a + update_flags SZYH0PXN0C0 + +fd 10110110 or_iyd + z80_fetch_index iy + or a scratch1 a + update_flags SZYH0PXN0C0 + +11110110 or_immed + z80_fetch_immed + or a scratch1 a + update_flags SZYH0PXN0C0 + +10101RRR xor_reg + xor a main.R a + update_flags SZYH0PXN0C0 + +dd 10101100 xor_ixh + lsr ix 8 scratch1 + xor scratch1 a a + update_flags SZYH0PXN0C0 + +dd 10101101 xor_ixl + xor ix a a + update_flags SZYH0PXN0C0 + +fd 10101100 xor_iyh + lsr iy 8 scratch1 + xor scratch1 a a + update_flags SZYH0PXN0C0 + +fd 10101101 xor_iyl + xor iy a a + update_flags SZYH0PXN0C0 + +10101110 xor_hl + z80_fetch_hl + xor a scratch1 a + update_flags SZYH0PXN0C0 + +dd 10101110 xor_ixd + z80_fetch_index ix + xor a scratch1 a + update_flags SZYH0PXN0C0 + +fd 10101110 xor_iyd + z80_fetch_index iy + xor a scratch1 a + update_flags SZYH0PXN0C0 + +11101110 xor_immed + z80_fetch_immed + xor a scratch1 a + update_flags SZYH0PXN0C0 + +10111RRR cp_reg + mov main.R last_flag_result + cmp main.R a + update_flags SZHVN1C + +dd 10111100 cp_ixh + local tmp 8 + lsr ix 8 tmp + mov tmp last_flag_result + cmp tmp a + update_flags SZHVN1C + +dd 10111101 cp_ixl + local tmp 8 + mov ix tmp + mov ix last_flag_result + cmp tmp a + update_flags SZHVN1C + +fd 10111100 cp_iyh + local tmp 8 + lsr iy 8 tmp + mov tmp last_flag_result + cmp tmp a + update_flags SZHVN1C + +fd 10111101 cp_iyl + local tmp 8 + mov iy tmp + mov iy last_flag_result + cmp tmp a + update_flags SZHVN1C + +10111110 cp_hl + local tmp 8 + z80_fetch_hl + mov scratch1 tmp + mov scratch1 last_flag_result + cmp tmp a + update_flags SZHVN1C + +dd 10111110 cp_ixd + local tmp 8 + z80_fetch_index ix + mov scratch1 tmp + mov scratch1 last_flag_result + cmp tmp a + update_flags SZHVN1C + +fd 10111110 cp_iyd + local tmp 8 + z80_fetch_index iy + mov scratch1 tmp + mov scratch1 last_flag_result + cmp tmp a + update_flags SZHVN1C + +11111110 cp_immed + local tmp 8 + z80_fetch_immed + mov scratch1 tmp + mov scratch1 last_flag_result + cmp tmp a + update_flags SZHVN1C + +00RRR100 inc_reg + add 1 main.R main.R + update_flags SZYHVXN0 + +dd 00100100 inc_ixh + add 0x100 ix ix + update_flags SZYHVXN0 + +dd 00101100 inc_ixl + local tmp 8 + mov ix tmp + add 1 tmp tmp + update_flags SZYHVXN0 + and 0xFF00 ix ix + or tmp ix ix + +fd 00100100 inc_iyh + add 0x100 iy iy + update_flags SZYHVXN0 + +fd 00101100 inc_iyl + local tmp 8 + mov iy tmp + add 1 tmp tmp + update_flags SZYHVXN0 + and 0xFF00 iy iy + or tmp iy iy + +00110100 inc_hl + local tmp 8 + z80_fetch_hl + #TODO: Either make DSL compiler smart enough to optimize these unnecessary moves out + #or add some syntax to force a certain size on an operation so they are unnecessary + mov scratch1 tmp + add 1 tmp tmp + update_flags SZYHVXN0 + mov tmp scratch1 + cycles 1 + z80_store_hl + +dd 00110100 inc_ixd + local tmp 8 + z80_fetch_index ix + #TODO: Either make DSL compiler smart enough to optimize these unnecessary moves out + #or add some syntax to force a certain size on an operation so they are unnecessary + mov scratch1 tmp + add 1 tmp tmp + update_flags SZYHVXN0 + mov tmp scratch1 + cycles 1 + z80_store_index + +fd 00110100 inc_iyd + local tmp 8 + z80_fetch_index iy + #TODO: Either make DSL compiler smart enough to optimize these unnecessary moves out + #or add some syntax to force a certain size on an operation so they are unnecessary + mov scratch1 tmp + add 1 tmp tmp + update_flags SZYHVXN0 + mov tmp scratch1 + cycles 1 + z80_store_index + +z80_inc_pair + arg high 8 + arg low 8 + cycles 2 + local word 16 + lsl high 8 word + or low word word + add 1 word word + mov word low + lsr word 8 high + +00000011 inc_bc + z80_inc_pair b c + +00010011 inc_de + z80_inc_pair d e + +00100011 inc16_hl + z80_inc_pair h l + +00110011 inc_sp + add 1 sp sp + +dd 00100011 inc_ix + add 1 ix ix + +fd 00100011 inc_iy + add 1 iy iy + +00RRR101 dec_reg + sub 1 main.R main.R + update_flags SZYHVXN1 + +dd 00100101 dec_ixh + sub 0x100 ix ix + update_flags SZYHVXN1 + +dd 00101101 dec_ixl + local tmp 8 + mov ix tmp + sub 1 tmp tmp + update_flags SZYHVXN1 + and 0xFF00 ix ix + or tmp ix ix + +fd 00100101 dec_iyh + sub 0x100 iy iy + update_flags SZYHVXN1 + +fd 00101101 dec_iyl + local tmp 8 + mov iy tmp + sub 1 tmp tmp + update_flags SZYHVXN1 + and 0xFF00 iy iy + or tmp iy iy + +00110101 dec_hl + local tmp 8 + z80_fetch_hl + #TODO: Either make DSL compiler smart enough to optimize these unnecessary moves out + #or add some syntax to force a certain size on an operation so they are unnecessary + mov scratch1 tmp + sub 1 tmp tmp + update_flags SZYHVXN1 + mov tmp scratch1 + cycles 1 + z80_store_hl + +dd 00110101 dec_ixd + local tmp 8 + z80_fetch_index ix + #TODO: Either make DSL compiler smart enough to optimize these unnecessary moves out + #or add some syntax to force a certain size on an operation so they are unnecessary + mov scratch1 tmp + sub 1 tmp tmp + update_flags SZYHVXN1 + mov tmp scratch1 + cycles 1 + z80_store_index + +fd 00110101 dec_iyd + local tmp 8 + z80_fetch_index iy + #TODO: Either make DSL compiler smart enough to optimize these unnecessary moves out + #or add some syntax to force a certain size on an operation so they are unnecessary + mov scratch1 tmp + sub 1 tmp tmp + update_flags SZYHVXN1 + mov tmp scratch1 + cycles 1 + z80_store_index + +z80_dec_pair + arg high 8 + arg low 8 + local word 16 + lsl high 8 word + or low word word + sub 1 word word + mov word low + lsr word 8 high + cycles 2 + +00001011 dec_bc + z80_dec_pair b c + +00011011 dec_de + z80_dec_pair d e + +00101011 dec16_hl + z80_dec_pair h l + +00111011 dec_sp + sub 1 sp sp + +dd 00101011 dec_ix + sub 1 ix ix + +fd 00101011 dec_iy + sub 1 iy iy + +00101111 cpl + not a a + update_flags YH1XN1 + +ed 01DDD100 neg + neg a a + update_flags SZYHVXN1C + +00111111 ccf + local tmp 8 + and 0x80 last_flag_result last_flag_result + and 0x7F a tmp + or tmp last_flag_result last_flag_result + and 0x80 chflags chflags + lsr chflags 4 tmp + or tmp chflags chflags + xor 0x80 chflags chflags + update_flags N0 + +00110111 scf + local tmp 8 + and 0x80 last_flag_result last_flag_result + and 0x7F a tmp + or tmp last_flag_result last_flag_result + update_flags H0N0C1 + +00000000 nop + +01110110 halt + cmp nmi_cycle cycles + if >=U + + else + cmp int_cycle cycles + if >=U + + if iff1 + else + sub 1 pc pc + end + + else + sub 1 pc pc + end + end + +11110011 di + mov 0 iff1 + mov 0 iff2 + update_sync + +11111011 ei + mov 1 iff1 + mov 1 iff2 + update_sync + cmp int_cycle cycles + if >=U + + add 1 cycles int_cycle + + end + +ed 01D00110 im0 + mov 0 imode + +ed 01D10110 im1 + mov 1 imode + +ed 01D11110 im2 + mov 2 imode + +ed 01D01110 im3 + #some sources call this mode 0/1, but unclear + #if the behavior is really different from im 0 + mov 0 imode + +11000011 jp + z80_fetch_immed16 + mov wz pc + +11101001 jp_hl + lsl h 8 pc + or l pc pc + +dd 11101001 jp_ix + mov ix pc + +fd 11101001 jp_iy + mov iy pc + +11CCC010 jp_cc + z80_check_cond C + z80_fetch_immed16 + if istrue + + mov wz pc + + end + +00011000 jr + z80_fetch_immed + #TODO: determine if this updates wz + sext 16 scratch1 scratch1 + add scratch1 pc pc + cycles 5 + +001CC000 jr_cc + z80_check_cond C + z80_fetch_immed + + if istrue + + sext 16 scratch1 scratch1 + add scratch1 pc pc + cycles 5 + + end + +00010000 djnz + cycles 1 + z80_fetch_immed + sub 1 b b + + if b + + sext 16 scratch1 scratch1 + add scratch1 pc pc + cycles 5 + + end + + +11001101 call_uncond + z80_fetch_immed16 + local pch 8 + lsr pc 8 pch + meta high pch + meta low pc + z80_push + mov wz pc + +11CCC100 call_cond + local pch 8 + z80_fetch_immed16 + z80_check_cond C + + if istrue + + lsr pc 8 pch + meta high pch + meta low pc + z80_push + mov wz pc + + end + +11TTT111 rst + local pch 8 + lsr pc 8 pch + meta high pch + meta low pc + z80_push + lsl T 3 scratch1 + mov scratch1 pc + +11001001 ret + local pch 16 + meta high pch + meta low pc + z80_pop + lsl pch 8 pch + or pch pc pc + +ed 01001101 reti + local pch 16 + cycles 1 + meta high pch + meta low pc + z80_pop + lsl pch 8 pch + or pch pc pc + +ed 01NN1101 retn + mov iff2 iff1 + local pch 16 + cycles 1 + meta high pch + meta low pc + z80_pop + lsl pch 8 pch + or pch pc pc + +11CCC000 ret_cond + local pch 16 + cycles 1 + z80_check_cond C + if istrue + + meta high pch + meta low pc + z80_pop + lsl pch 8 pch + or pch pc pc + + end + +11011011 in_abs + z80_fetch_immed + ocall io_read8 + mov scratch1 a + +ed 01RRR000 in_bc + lsl b 8 scratch1 + or c scratch1 scratch1 + ocall io_read8 + mov scratch1 main.R + +z80_ini_ind + arg change 16 + local tmp 8 + cycles 1 + + lsl 8 b wz + or c wz wz + add change wz wz + + sub 1 b b + update_flags SZYX + + lsl b 8 scratch1 + or c scratch1 scratch1 + ocall io_read8 + + and 0x80 scratch1 nflag + + mov wz tmp + add tmp scratch1 tmp + update_flags C + + z80_store_hl + + lsl h 8 scratch2 + or l scratch2 scratch2 + add change scratch2 scratch2 + mov scratch2 l + lsr scratch2 8 h + + and 7 tmp tmp + xor b tmp tmp + update_flags P + lsr chflags 4 tmp + or tmp chflags chflags + +ed 10100010 ini + z80_ini_ind 1 + +ed 10110010 inir + z80_ini_ind 1 + if zflag + else + sub 2 pc pc + cycles 5 + end + +ed 10101010 ind + z80_ini_ind -1 + +ed 10111010 indr + z80_ini_ind -1 + if zflag + else + sub 2 pc pc + cycles 5 + end + +11010011 out_abs + z80_fetch_immed + mov scratch1 scratch2 + mov a scratch1 + ocall io_write8 + +ed 01RRR001 out_bc + lsl b 8 scratch2 + or c scratch2 scratch2 + mov main.R scratch1 + ocall io_write8 + +z80_outi_outd + arg change 16 + local tmp 8 + cycles 1 + z80_fetch_hl + + and 0x80 scratch1 nflag + + lsl h 8 scratch2 + or l scratch2 scratch2 + add change scratch2 scratch2 + mov scratch2 l + lsr scratch2 8 h + + add l scratch1 tmp + update_flags C + and 7 tmp tmp + + lsl b 8 scratch2 + or c scratch2 scratch2 + ocall io_write8 + + sub 1 b b + update_flags SZYX + + lsl 8 b wz + or c wz wz + add change wz wz + + xor b tmp tmp + update_flags P + lsr chflags 4 tmp + or tmp chflags chflags + +ed 10100011 outi + z80_outi_outd 1 + +ed 10110011 otir + z80_outi_outd 1 + if zflag + else + sub 2 pc pc + cycles 5 + end + +ed 10101011 outd + z80_outi_outd -1 + +ed 10111011 otdr + z80_outi_outd -1 + if zflag + else + sub 2 pc pc + cycles 5 + end + +00000111 rlca + rol a 1 a + update_flags YH0XN0C + +00010111 rla + rlc a 1 a + update_flags YH0XN0C + +00001111 rrca + ror a 1 a + update_flags YH0XN0C + +00011111 rra + rrc a 1 a + update_flags YH0XN0C + +cb 00000RRR rlc + rol main.R 1 main.R + update_flags SZYH0PXN0C + +cb 00000110 rlc_hl + local tmp 8 + z80_fetch_hl + mov scratch1 tmp + rol tmp 1 tmp + update_flags SZYH0PXN0C + mov tmp scratch1 + z80_store_hl + +z80_rlc_index + arg tmp 8 + mov wz scratch1 + ocall read_8 + cycles 1 + mov scratch1 tmp + rol tmp 1 tmp + update_flags SZYH0PXN0C + mov tmp scratch1 + z80_store_index + +ddcb 00000110 rlc_ixd + local tmp 8 + z80_rlc_index tmp + +ddcb 00000RRR rlc_ixd_reg + z80_rlc_index main.R + +fdcb 00000110 rlc_iyd + local tmp 8 + z80_rlc_index tmp + +fdcb 00000RRR rlc_iyd_reg + z80_rlc_index main.R + +cb 00010RRR rl + rlc main.R 1 main.R + update_flags SZYH0PXN0C + +cb 00010110 rl_hl + local tmp 8 + z80_fetch_hl + mov scratch1 tmp + rlc tmp 1 tmp + update_flags SZYH0PXN0C + mov tmp scratch1 + z80_store_hl + +z80_rl_index + arg tmp 8 + mov wz scratch1 + ocall read_8 + cycles 1 + mov scratch1 tmp + rlc tmp 1 tmp + update_flags SZYH0PXN0C + mov tmp scratch1 + z80_store_index + +ddcb 00010110 rl_ixd + local tmp 8 + z80_rl_index tmp + +fdcb 00010110 rl_iyd + local tmp 8 + z80_rl_index tmp + + +ddcb 00010RRR rl_ixd_reg + z80_rl_index main.R + +fdcb 00010RRR rl_iyd_reg + z80_rl_index main.R + +cb 00001RRR rrc + ror main.R 1 main.R + update_flags SZYH0PXN0C + +cb 00001110 rrc_hl + local tmp 8 + z80_fetch_hl + mov scratch1 tmp + ror tmp 1 tmp + update_flags SZYH0PXN0C + mov tmp scratch1 + z80_store_hl + +z80_rrc_index + arg tmp 8 + mov wz scratch1 + ocall read_8 + cycles 1 + mov scratch1 tmp + ror tmp 1 tmp + update_flags SZYH0PXN0C + mov tmp scratch1 + z80_store_index + +ddcb 00001110 rrc_ixd + local tmp 8 + z80_rrc_index tmp + +ddcb 00001RRR rrc_ixd_reg + z80_rrc_index main.R + +fdcb 00001110 rrc_iyd + local tmp 8 + z80_rrc_index tmp + +fdcb 00001RRR rrc_iyd_reg + z80_rrc_index main.R + +cb 00011RRR rr + rrc main.R 1 main.R + update_flags SZYH0PXN0C + +cb 00011110 rr_hl + local tmp 8 + z80_fetch_hl + mov scratch1 tmp + rrc tmp 1 tmp + update_flags SZYH0PXN0C + mov tmp scratch1 + z80_store_hl + +z80_rr_index + arg tmp 8 + mov wz scratch1 + ocall read_8 + cycles 1 + mov scratch1 tmp + rrc tmp 1 tmp + update_flags SZYH0PXN0C + mov tmp scratch1 + z80_store_index + +ddcb 00011110 rr_ixd + local tmp 8 + z80_rr_index tmp + +ddcb 00011RRR rr_ixd_reg + z80_rr_index main.R + +fdcb 00011110 rr_iyd + local tmp 8 + z80_rr_index tmp + +fdcb 00011RRR rr_iyd_reg + z80_rr_index main.R + +cb 00100RRR sla + lsl main.R 1 main.R + update_flags SZYH0PXN0C + +cb 00100110 sla_hl + local tmp 8 + z80_fetch_hl + mov scratch1 tmp + lsl tmp 1 tmp + update_flags SZYH0PXN0C + mov tmp scratch1 + z80_store_hl + +z80_sla_index + arg tmp 8 + mov wz scratch1 + ocall read_8 + cycles 1 + mov scratch1 tmp + lsl tmp 1 tmp + update_flags SZYH0PXN0C + mov tmp scratch1 + z80_store_index + +ddcb 00100110 sla_ixd + local tmp 8 + z80_sla_index tmp + +ddcb 00100RRR sla_ixd_reg + z80_sla_index main.R + +fdcb 00100110 sla_iyd + local tmp 8 + z80_sla_index tmp + +fdcb 00100RRR sla_iyd_reg + z80_sla_index main.R + +cb 00101RRR sra + asr main.R 1 main.R + update_flags SZYH0PXN0C + +cb 00101110 sra_hl + local tmp 8 + z80_fetch_hl + mov scratch1 tmp + asr tmp 1 tmp + update_flags SZYH0PXN0C + mov tmp scratch1 + z80_store_hl + +z80_sra_index + arg tmp 8 + mov wz scratch1 + ocall read_8 + cycles 1 + mov scratch1 tmp + asr tmp 1 tmp + update_flags SZYH0PXN0C + mov tmp scratch1 + z80_store_index + +ddcb 00101110 sra_ixd + local tmp 8 + z80_sra_index tmp + +ddcb 00101RRR sra_ixd_reg + z80_sra_index main.R + +fdcb 00101110 sra_iyd + local tmp 8 + z80_sra_index tmp + +fdcb 00101RRR sra_iyd_reg + z80_sra_index main.R + +cb 00110RRR sll + lsl main.R 1 main.R + update_flags SZ0YH0XN0C + or 1 main.R main.R + update_flags P + +cb 00110110 sll_hl + local tmp 8 + z80_fetch_hl + mov scratch1 tmp + lsl tmp 1 tmp + update_flags SZ0YH0XN0C + or 1 tmp tmp + update_flags P + mov tmp scratch1 + z80_store_hl + +z80_sll_index + arg tmp 8 + mov wz scratch1 + ocall read_8 + cycles 1 + mov scratch1 tmp + lsl tmp 1 tmp + update_flags SZ0YH0XN0C + or 1 tmp tmp + update_flags P + mov tmp scratch1 + z80_store_index + +ddcb 00110110 sll_ixd + local tmp 8 + z80_sll_index tmp + +ddcb 00110RRR sll_ixd_reg + z80_sll_index main.R + +fdcb 00110110 sll_iyd + local tmp 8 + z80_sll_index tmp + +fdcb 00110RRR sll_iyd_reg + z80_sll_index main.R + +cb 00111RRR srl + lsr main.R 1 main.R + update_flags SZYH0PXN0C + +cb 00111110 srl_hl + local tmp 8 + z80_fetch_hl + mov scratch1 tmp + lsr tmp 1 tmp + update_flags SZYH0PXN0C + mov tmp scratch1 + z80_store_hl + +z80_srl_index + arg tmp 8 + mov wz scratch1 + ocall read_8 + cycles 1 + mov scratch1 tmp + lsr tmp 1 tmp + update_flags SZYH0PXN0C + mov tmp scratch1 + z80_store_index + +ddcb 00111110 srl_ixd + local tmp 8 + z80_srl_index tmp + +ddcb 00111RRR srl_ixd_reg + z80_srl_index main.R + +fdcb 00111110 srl_iyd + local tmp 8 + z80_srl_index tmp + +fdcb 00111RRR srl_iyd_reg + z80_srl_index main.R + +cb 01BBBRRR bit_reg + local tmp 8 + lsl 1 B tmp + mov main.R last_flag_result + and main.R tmp tmp + update_flags SZH1PN0 + +cb 01BBB110 bit_hl + local tmp 8 + z80_fetch_hl + cycles 1 + lsl 1 B tmp + lsr wz 8 last_flag_result + and scratch1 tmp tmp + update_flags SZH1PN0 + + +ddcb 01BBBRRR bit_ixd + local tmp 8 + mov wz scratch1 + ocall read_8 + cycles 1 + lsl 1 B tmp + lsr wz 8 last_flag_result + and scratch1 tmp tmp + update_flags SZH1PN0 + +fdcb 01BBBRRR bit_iyd + local tmp 8 + mov wz scratch1 + ocall read_8 + cycles 1 + lsl 1 B tmp + lsr wz 8 last_flag_result + and scratch1 tmp tmp + update_flags SZH1PN0 + +cb 10BBBRRR res_reg + local tmp 8 + lsl 1 B tmp + not tmp tmp + and main.R tmp main.R + +cb 10BBB110 res_hl + z80_fetch_hl + cycles 1 + local tmp 8 + lsl 1 B tmp + not tmp tmp + and scratch1 tmp scratch1 + z80_store_hl + +z80_res_index + arg bit 8 + arg tmp 8 + lsl 1 bit tmp + not tmp tmp + mov wz scratch1 + ocall read_8 + cycles 1 + and scratch1 tmp tmp + mov tmp scratch1 + z80_store_index + +ddcb 10BBB110 res_ixd + local tmp 8 + z80_res_index B tmp + +ddcb 10BBBRRR res_ixd_reg + z80_res_index B main.R + +fdcb 10BBB110 res_iyd + local tmp 8 + z80_res_index B tmp + +fdcb 10BBBRRR res_iyd_reg + z80_res_index B main.R + +cb 11BBBRRR set_reg + local tmp 8 + lsl 1 B tmp + or main.R tmp main.R + +cb 11BBB110 set_hl + z80_fetch_hl + cycles 1 + local tmp 8 + lsl 1 B tmp + or scratch1 tmp scratch1 + z80_store_hl + +z80_set_index + arg bit 8 + arg tmp 8 + lsl 1 bit tmp + mov wz scratch1 + ocall read_8 + cycles 1 + or scratch1 tmp tmp + mov tmp scratch1 + z80_store_index + +ddcb 11BBB110 set_ixd + local tmp 8 + z80_set_index B tmp + +ddcb 11BBBRRR set_ixd_reg + z80_set_index B main.R + +fdcb 11BBB110 set_iyd + local tmp 8 + z80_set_index B tmp + +fdcb 11BBBRRR set_iyd_reg + z80_set_index B main.R + +z80_fetch_mod_hl + local tmp 16 + arg change 16 + lsl h 8 tmp + or l tmp tmp + mov tmp scratch1 + add change tmp tmp + mov tmp l + lsr tmp 8 h + ocall read_8 + cycles 2 + +z80_ldd_ldi + arg change 16 + local tmp 16 + local tmp8 8 + z80_fetch_mod_hl change + + add a scratch1 tmp8 + update_flags H0XN0 + + and 0x2 tmp8 tmp8 + lsl tmp8 4 tmp8 + and 0x88 last_flag_result last_flag_result + or tmp8 last_flag_result last_flag_result + + lsl d 8 tmp + or e tmp tmp + mov tmp scratch2 + add change tmp tmp + mov tmp e + lsr tmp 8 d + ocall write_8 + + lsl b 8 tmp + or c tmp tmp + sub 1 tmp tmp + + mov tmp c + lsr tmp 8 b + mov c pvflag + or b pvflag pvflag + + +ed 10100000 ldi + z80_ldd_ldi 1 + +ed 10101000 ldd + z80_ldd_ldi -1 + +ed 10110000 ldir + z80_ldd_ldi 1 + if pvflag + + add 1 pc wz + sub 2 pc pc + cycles 5 + + end + +ed 10111000 lddr + z80_ldd_ldi -1 + if pvflag + + add 1 pc wz + sub 2 pc pc + cycles 5 + + end + +z80_cpd_cpi + local tmp 16 + local tmp8 8 + local hf 8 + arg change 16 + + z80_fetch_mod_hl change + sub scratch1 a tmp8 + update_flags SZHN1 + + lsr chflags 3 hf + and 1 hf hf + + sub hf tmp8 tmp8 + update_flags X + + and 0x2 tmp8 tmp8 + lsl tmp8 4 tmp8 + and 0x88 last_flag_result last_flag_result + or tmp8 last_flag_result last_flag_result + + lsl b 8 tmp + or c tmp tmp + sub 1 tmp tmp + + mov tmp c + lsr tmp 8 b + mov c pvflag + or b pvflag pvflag + + cycles 5 + +ed 10100001 cpi + z80_cpd_cpi 1 + +ed 10101001 cpd + z80_cpd_cpi -1 + +ed 10110001 cpir + z80_cpd_cpi 1 + if pvflag + + if zflag + + else + + add 1 pc wz + sub 2 pc pc + cycles 5 + + end + end + +ed 10111001 cpdr + z80_cpd_cpi -1 + if pvflag + + if zflag + + else + + add 1 pc wz + sub 2 pc pc + cycles 5 + + end + end + +00100111 daa + local diff 8 + local tmp 8 + local low 8 + and 0xF a low + and 0x8 chflags tmp + if tmp + + mov 6 diff + + else + + cmp 0xA low + if >=U + mov 6 diff + else + mov 0 diff + end + + end + + and 0x80 chflags tmp + if tmp + + or 0x60 diff diff + update_flags C1 + + else + + cmp 0x9A a + if >=U + or 0x60 diff diff + update_flags C1 + else + update_flags C0 + end + end + + if nflag + + sub diff a a + update_flags SZYHPX + + else + + add diff a a + update_flags SZYHPX + + end + +dd OOOOOOOO dd_normal + dispatch O + +fd OOOOOOOO fd_normal + dispatch O + +ed 01101111 rld + local tmp 8 + local tmp2 8 + z80_fetch_hl + cycles 4 + + lsr scratch1 4 tmp + + lsl scratch1 4 scratch1 + + and 0xF a tmp2 + or tmp2 scratch1 scratch1 + + and 0xF0 a a + or tmp a a + update_flags SZYH0XPN0 + z80_store_hl + +ed 01100111 rrd + local tmp 8 + local tmp2 8 + z80_fetch_hl + cycles 4 + + and 0xF scratch1 tmp + lsr scratch1 4 scratch1 + + lsl a 4 tmp2 + or tmp2 scratch1 scratch1 + + and 0xF0 a a + or tmp a a + update_flags SZYH0XPN0 + z80_store_hl + \ No newline at end of file