view z80.cpu @ 2488:bfd09d3367ba

Fix crash when enabling VGM recording while running Pico or Copera software
author Michael Pavone <pavone@retrodev.com>
date Mon, 15 Apr 2024 23:07:18 -0700
parents 461fffc226e0
children
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
	r += 1
	scratch1 = pc
	ocall read_8
	pc += 1
	
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
	if cycles >=U int_cycle
	
		iff1 = 0
		iff2 = 0
		cycles 6
		update_sync
		
		switch imode
		case 0
			dispatch int_value
		
		case 1
			dispatch 0xFF
		
		case 2
			pc = i << 8
			pc |= int_value
			#CD is call
			dispatch 0xCD
		end
		
	else
		if cycles >=U nmi_cycle
		
			nmi_cycle = 0xFFFFFFFF
			iff1 = 0
			local pch 8
			pch = pc >> 8
			meta high pch
			meta low pc
			z80_push
			pc = 0x66
			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
	scratch1 = pc
	ocall read_8
	pc += 1
	dispatch scratch1 ddcb
	
fd 11001011 fdcb_prefix
	z80_calc_index iy
	cycles 2
	scratch1 = pc
	ocall read_8
	pc += 1
	dispatch scratch1 fdcb
	
z80_check_cond
	arg cond 8
	local invert 8
	switch cond
	case 0
		meta istrue invert
		invert = !zflag
	
	case 1
		meta istrue zflag
	
	case 2
		meta istrue invert
		invert = ~chflags
		invert &= 0x80
	
	case 3
		meta istrue invert
		invert = chflags & 0x80
	
	case 4
		meta istrue invert
		invert = !pvflag
	
	case 5
		meta istrue pvflag
	
	case 6
		meta istrue invert
		invert = ~last_flag_result
		invert &= 0x80
	
	case 7
		meta istrue invert
		invert = 0x80 & last_flag_result	
	end
	
z80_fetch_hl
	scratch1 = h << 8
	scratch1 |= l
	ocall read_8
	
z80_store_hl
	scratch2 = h << 8
	scratch2 |= l
	ocall write_8

z80_fetch_immed
	scratch1 = pc
	ocall read_8
	pc += 1
	
z80_fetch_immed16
	scratch1 = pc
	ocall read_8
	wz = scratch1
	pc += 1
	scratch1 = pc
	ocall read_8
	pc += 1
	scratch1 <<= 8
	wz |= scratch1

z80_fetch_immed_reg16
	scratch1 = pc
	ocall read_8
	low = scratch1
	pc += 1
	scratch1 = pc
	ocall read_8
	high = scratch1
	pc += 1
	
z80_fetch_immed_to_reg16
	scratch1 = pc
	ocall read_8
	reg = scratch1
	pc += 1
	scratch1 = pc
	ocall read_8
	pc += 1
	scratch1 <<= 8
	reg |= scratch1

01RRR110 ld_from_hl
	z80_fetch_hl
	main.R = scratch1

01DDDSSS ld_from_reg
	main.D = main.S
	
dd 01DDD100 ld_from_ixh
	invalid D 6
	main.D = ix >> 8
	
dd 01100SSS ld_to_ixh
	invalid S 6
	local tmp 16
	ix &= 0xFF
	tmp = main.S << 8
	ix |= tmp
	
dd 0110D10S ld_ixb_to_ixb

dd 01DDD101 ld_from_ixl
	invalid D 6
	main.D = ix
	
dd 01101SSS ld_to_ixl
	invalid S 6
	ix &= 0xFF00
	ix |= main.S
	
dd 01100101 ld_ixl_to_ixh
	local tmp 16
	tmp = ix << 8
	ix &= 0xFF
	ix |= tmp
	
dd 01101100 ld_ixh_to_ixl
	local tmp 16
	tmp = ix >> 8
	ix &= 0xFF00
	ix |= tmp
	
fd 01DDD100 ld_from_iyh
	invalid D 6
	main.D = iy >> 8
	
fd 01100SSS ld_to_iyh
	invalid S 6
	local tmp 16
	iy &= 0xFF
	tmp = main.S << 8
	iy |= tmp
	
fd 0110D10S ld_iyb_to_iyb

fd 01DDD101 ld_from_iyl
	invalid D 6
	main.D = iy
	
fd 01101SSS ld_to_iyl
	invalid S 6
	iy &= 0xFF00
	iy |= main.S
	
fd 01100101 ld_iyl_to_iyh
	local tmp 16
	tmp = iy << 8
	iy &= 0xFF
	iy |= tmp
	
fd 01101100 ld_iyh_to_iyl
	local tmp 16
	tmp = iy >> 8
	iy &= 0xFF00
	iy |= tmp
	
z80_calc_index
	arg index 16
	wz = index
	z80_fetch_immed
	sext 16 scratch1 scratch1
	wz += scratch1

z80_fetch_index
	arg index 16
	z80_calc_index index
	scratch1 = wz
	cycles 5
	ocall read_8
	
z80_store_index
	scratch2 = wz
	ocall write_8
	
dd 01RRR110 ld_from_ix
	z80_fetch_index ix
	main.R = scratch1

fd 01RRR110 ld_from_iy
	z80_fetch_index iy
	main.R = scratch1

00RRR110 ld_immed
	z80_fetch_immed
	main.R = scratch1
	
dd 00100110 ld_immed_ixh
	z80_fetch_immed
	scratch1 <<= 8
	ix &= 0xFF
	ix |= scratch1
	
dd 00101110 ld_immed_ixl
	z80_fetch_immed
	ix &= 0xFF00
	ix |= scratch1
	
fd 00100110 ld_immed_iyh
	z80_fetch_immed
	scratch1 <<= 8
	iy &= 0xFF
	iy |= scratch1
	
fd 00101110 ld_immed_iyl
	z80_fetch_immed
	iy &= 0xFF00
	iy |= scratch1

01110RRR ld_to_hl
	scratch1 = main.R
	z80_store_hl

dd 01110RRR ld_to_ix
	z80_calc_index ix
	scratch2 = wz
	scratch1 = main.R
	cycles 5
	ocall write_8

fd 01110RRR ld_to_iy
	z80_calc_index iy
	scratch2 = wz
	scratch1 = main.R
	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
	scratch2 = wz
	ocall write_8
	
fd 00110110 ld_to_iyd_immed
	z80_calc_index iy
	z80_fetch_immed
	cycles 2
	scratch2 = wz
	ocall write_8

00001010 ld_a_from_bc
	wz = b << 8
	wz |= c
	scratch1 = wz
	wz += 1
	ocall read_8
	a = scratch1

00011010 ld_a_from_de
	wz = d << 8
	wz |= e
	scratch1 = wz
	wz += 1
	ocall read_8
	a = scratch1

00111010 ld_a_from_immed
	z80_fetch_immed16
	scratch1 = wz
	wz += 1
	ocall read_8
	a = scratch1
	
00000010 ld_a_to_bc
	local tmp 8
	scratch2 = b << 8
	scratch2 |= c
	scratch1 = a
	tmp = c + 1
	wz = a << 8
	wz |= tmp
	ocall write_8
	
00010010 ld_a_to_de
	local tmp 8
	scratch2 = d << 8
	scratch2 |= e
	scratch1 = a
	tmp = e + 1
	wz = a << 8
	wz |= tmp
	ocall write_8

00110010 ld_a_to_immed
	local tmp 16
	z80_fetch_immed16
	scratch2 = wz
	scratch1 = a
	wz += 1
	ocall write_8
	wz &= 0xFF
	tmp = a << 8
	wz |= tmp

ed 01000111 ld_i_a
	i = a
	cycles 1

ed 01001111 ld_r_a
	r = a
	rhigh = 0x80 & a
	cycles 1

ed 01011111 ld_a_r
	cycles 1
	a = 0x7F & r
	a |= rhigh
	update_flags SZYH0XN0
	pvflag = iff2
	
ed 01010111 ld_a_i
	cycles 1
	a = i
	update_flags SZYH0XN0
	pvflag = iff2

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
	scratch1 = wz
	ocall read_8
	low = scratch1
	wz += 1
	scratch1 = wz
	ocall read_8
	high = scratch1
	wz += 1

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
	scratch1 = wz
	ocall read_8
	reg = scratch1
	wz += 1
	scratch1 = wz
	ocall read_8
	scratch1 <<= 8
	reg |= scratch1
	wz += 1

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
	scratch2 = wz
	scratch1 = l
	ocall write_8
	wz += 1
	scratch2 = wz
	scratch1 = h
	ocall write_8
	wz += 1
	
dd 00100010 ld_ix_to_immed
	z80_fetch_immed16
	scratch2 = wz
	scratch1 = ix
	ocall write_8
	wz += 1
	scratch2 = wz
	scratch1 = ix >> 8
	ocall write_8
	wz += 1
	
fd 00100010 ld_iy_to_immed
	z80_fetch_immed16
	scratch2 = wz
	scratch1 = iy
	ocall write_8
	wz += 1
	scratch2 = wz
	scratch1 = iy >> 8
	ocall write_8
	wz += 1
	
z80_regpair_to_immed
	z80_fetch_immed16
	scratch2 = wz
	scratch1 = low
	ocall write_8
	wz += 1
	scratch1 = high
	scratch2 = wz
	ocall write_8
	wz += 1
	
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
	sph = sp >> 8
	meta high sph
	z80_regpair_to_immed

11111001 ld_sp_hl
	cycles 2
	sp = h << 8
	sp |= l
	
dd 11111001 ld_sp_ix
	cycles 2
	sp = ix

fd 11111001 ld_sp_iy
	cycles 2
	sp = iy

z80_push
	cycles 1
	sp -= 1
	scratch2 = sp
	scratch1 = high
	ocall write_8
	sp -= 1
	scratch2 = sp
	scratch1 = low
	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
	ixh = ix >> 8
	meta high ixh
	meta low ix
	z80_push

fd 11100101 push_iy
	local iyh 8
	iyh = iy >> 8
	meta high iyh
	meta low iy
	z80_push

z80_pop
	mov sp scratch1
	ocall read_8
	sp += 1
	low = scratch1
	scratch1 = sp
	ocall read_8
	sp += 1
	high = scratch1

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
	ixh <<= 8
	ix |= ixh

fd 11100001 pop_iy
	local iyh 16
	meta high iyh
	meta low iy
	z80_pop
	iyh <<= 8
	iy |= iyh

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
	scratch1 = sp
	ocall read_8
	xchg l scratch1
	cycles 1
	scratch2 = sp
	ocall write_8
	scratch1 = sp + 1
	ocall read_8
	xchg h scratch1
	cycles 2
	scratch2 = sp + 1
	ocall write_8
	wz = h << 8
	wz |= l
	
dd 11100011 ex_sp_ix
	scratch1 = sp
	ocall read_8
	wz = scratch1
	scratch1 = ix
	cycles 1
	scratch2 = sp
	ocall write_8
	scratch1 = sp + 1
	ocall read_8
	scratch1 <<= 8
	wz |= scratch1
	scratch1 = ix >> 8
	cycles 2
	scratch2 = sp + 1
	ocall write_8
	ix = wz
	
fd 11100011 ex_sp_iy
	scratch1 = sp
	ocall read_8
	wz = scratch1
	scratch1 = iy
	cycles 1
	scratch2 = sp
	ocall write_8
	scratch1 = sp + 1
	ocall read_8
	scratch1 <<= 8
	wz |= scratch1
	scratch1 = iy >> 8
	cycles 2
	scratch2 = sp + 1
	ocall write_8
	iy = wz

10000RRR add_reg
	a += main.R
	update_flags SZYHVXN0C
	
dd 10000100 add_ixh
	scratch1 = ix >> 8
	a += scratch1
	update_flags SZYHVXN0C
	
dd 10000101 add_ixl
	scratch1 = ix & 0xFF
	a += scratch1
	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
	a = ~a
	update_flags YH1XN1

ed 01DDD100 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 cycles >=U nmi_cycle
	
	else
		if cycles >=U int_cycle
		
			if iff1
			else
				pc -= 1
			end
		
		else
			pc -= 1
		end
	end

11110011 di
	iff1 = 0
	iff2 = 0
	update_sync

11111011 ei
	iff1 = 1
	iff2 = 1
	update_sync
	
	if cycles >=U int_cycle
		int_cycle = cycles + 1
	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
		pc = wz
	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
		pc += scratch1
		cycles 5
	end
	
00010000 djnz
	cycles 1
	z80_fetch_immed
	b -= 1
	
	if b
		sext 16 scratch1 scratch1
		pc += scratch1
		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
		pch = pc >> 8
		meta high pch
		meta low pc
		z80_push
		pc = wz
	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
		pch = pch << 8
		pc |= pch
	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
		pc -= 2
		cycles 5
	end
	
ed 10101010 ind
	z80_ini_ind -1
	
ed 10111010 indr
	z80_ini_ind -1
	if zflag
	else
		pc -= 2
		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
		pc -= 2
		cycles 5
	end
	
ed 10101011 outd
	z80_outi_outd -1
	
ed 10111011 otdr
	z80_outi_outd -1
	if zflag
	else
		pc -= 2
		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
	tmp = 1 << B
	tmp = ~tmp
	main.R &= tmp
	
cb 10BBB110 res_hl
	z80_fetch_hl
	cycles 1
	local tmp 8
	tmp = 1 << B
	tmp = ~tmp
	scratch1 &= tmp
	z80_store_hl
	
z80_res_index
	arg bit 8
	arg tmp 8
	tmp = 1 << bit
	tmp = ~tmp
	scratch1 = wz
	ocall read_8
	cycles 1
	tmp &= scratch1
	scratch1 = tmp
	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
		wz = pc + 1
		pc -= 2
		cycles 5
	end

ed 10111000 lddr
	z80_ldd_ldi -1
	if pvflag
		wz = pc + 1
		pc -= 2
		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
			wz = pc + 1
			pc -= 2
			cycles 5
		end
	end
	
ed 10111001 cpdr
	z80_cpd_cpi -1
	if pvflag
		if zflag
		else
			wz = pc + 1
			pc -= 2
			cycles 5
		end
	end

00100111 daa
	local diff 8
	local tmp 8
	local low 8
	low = a & 0xF
	tmp = chflags & 8
	if tmp
		diff = 6
	else
		if low >=U 0xA
			diff = 6
		else
			diff = 0
		end
	end
	
	tmp = chflags & 0x80
	if tmp
		diff |= 0x60
		update_flags C1
	else	
		if a >=U 0x9A
			diff |= 0x60
			update_flags C1
		else
			update_flags C0
		end
	end
	
	if nflag
		a -= diff
		update_flags SZYHPX
	else
		a += diff
		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