view z80.cpu @ 1971:80920c21bb52

Add an event log soft flush and call it twice per frame in between hard flushes to netplay latency when there are insufficient hardware updates to flush packets in the middle of a frame
author Michael Pavone <pavone@retrodev.com>
date Fri, 08 May 2020 11:40:30 -0700
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