Mercurial > repos > blastem
view z80.cpu @ 1905:1ec6931d0a49
Fix fm setting for Model 3 VA2
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Wed, 26 Feb 2020 22:41:10 -0800 |
parents | 1dc718581aac |
children | 338c78da3fff |
line wrap: on
line source
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