gbz80 equ 1

;Fake registers at FFFx-
r_ixl equ &DFF0	
r_ixh equ &DFF1
	
r_ix  equ &DFF0
	
r_iyl equ &DFF2
r_iyh equ &DFF3
	
r_iy  equ &DFF2

r_r   equ &DFF4

;Shadow Regs
rs_a  equ &DFF5
rs_f  equ &DFF6

rs_b  equ &DFF7
rs_c  equ &DFF8

rs_d  equ &DFF9
rs_e  equ &DFFA

rs_h  equ &DFFB
rs_l  equ &DFFC


	macro z_ex_sphl		;ex (SP),HL
		push de
			ld d,h
			ld e,l
			
			inc sp
			inc sp
			
			pop hl
			push de
			
			dec sp
			dec sp
		pop de
	endm
	
	macro z_ex_dehl
		push hl
		push de
		pop hl
		pop de
	endm
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	macro z_ldi
	push af
		ld a,(hl)
		ld (de),a
		inc hl
		inc de
		dec bc
	pop af
	endm
	
	macro z_ldir
	push af
 \@Ldirb:
		ld a,(hl)
		ld (de),a
		inc hl
		inc de
		dec bc
		ld a,b
		or c
		jr nz, \@Ldirb
	pop af
	endm
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	;BUG:When interrupts are disabled with DI, HALT will not lock the cpu... GBZ80 skips it, but The instruction immediately following the  HALT instruction is "skipped" on all except the GBC. As a result, always put a NOP after the HALT instruction.
	macro z_halt
		halt
		nop
	endm	
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	macro z_or_ixl
		push hl
			ld hl,r_ixl
			or (hl)
		pop hl
	endm
	macro z_or_ixh
		push hl
			ld hl,r_ixh
			or (hl)
		pop hl
	endm
	macro z_or_iyl
		push hl
			ld hl,r_iyl
			or (hl)
		pop hl
	endm
	macro z_or_iyh
		push hl
			ld hl,r_iyh
			or (hl)
		pop hl
	endm
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
		macro z_ld_iy_plusn_a,aoffset
			push hl
			push de
				push af
					ld a,(r_iyl)
					ld l,a
					ld a,(r_iyh)
					ld h,a
					ld de,\aoffset
					add hl,de
				pop af
				ld (hl),a 				;ld (iy + \aoffset),a
			pop de
			pop hl
		endm
		
		macro z_ld_iy_plusn_n,aoffset,aval
			
			push hl
			push de
				push af
					ld a,(r_iyl)
					ld l,a
					ld a,(r_iyh)
					ld h,a
					ld de,\aoffset
					add hl,de
				pop af
				ld (hl),\aval 				;ld (iy + \aoffset),\aval
			pop de
			pop hl

		endm
		
		macro z_ld_iy_plusn_h,aoffset
			push af
			push de
				push hl
					ld a,h
					push af
						ld a,(r_iyl)
						ld l,a
						ld a,(r_iyh)
						ld h,a
						ld de,\aoffset
						add hl,de
					pop af
					ld (hl),a	;ld (iy + \aoffset),h
				pop hl
			pop de
			pop af
			
		endm
		macro z_ld_iy_plusn_l,aoffset
			push af
			push de
				push hl
					ld a,l
					push af
						ld a,(r_iyl)
						ld l,a
						ld a,(r_iyh)
						ld h,a
						ld de,\aoffset
						add hl,de
					pop af
					ld (hl),a	;ld (iy + \aoffset),l
				pop hl
			pop de
			pop af
		endm		
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	macro z_djnz,addr
		dec b
		jp nz,\addr
	endm
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	macro z_ld_a_r
		LD a,(r_r)
		inc a
		xor h
		xor l
		rlca
		xor b
		xor c
		rlca
		xor d
		xor e
		ld (r_r),a
	endm
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	macro z_ld_a_iyl
		LD a,(r_iyl)
	endm
	macro z_ld_a_iyh
		LD a,(r_iyh)
	endm
	
	macro z_ld_a_ixl
		LD a,(r_ixl)
	endm
	macro z_ld_a_ixh
		LD a,(r_ixh)
	endm
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	macro z_ld_iyl_a
		LD (r_iyl),a
	endm
	macro z_ld_iyh_a
		LD (r_iyh),a
	endm
	
	macro z_ld_ixl_a
		LD (r_ixl),a
	endm
	macro z_ld_ixh_a
		LD (r_ixh),a
	endm
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	macro z_cp_iyl
		push hl
			ld hl,r_iyl
			cp (hl)
		pop hl
	endm
	macro z_cp_iyh
		push hl
			ld hl,r_iyh
			cp (hl)
		pop hl
	endm
	
	macro z_cp_ixl
		push hl
			ld hl,r_ixl
			cp (hl)
		pop hl
	endm
	macro z_cp_ixh
		push hl
			ld hl,r_ixh
			cp (hl)
		pop hl
	endm
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	macro z_inc_ixl
		push hl
			ld hl,r_ixl
			inc (hl)
		pop hl
	endm
	macro z_inc_ixh
		push hl
			ld hl,r_ixh
			inc (hl)
		pop hl
	endm
	macro z_inc_iyl
		push hl
			ld hl,r_iyl
			inc (hl)
		pop hl
	endm
	macro z_inc_iyh
		push hl
			ld hl,r_iyh
			inc (hl)
		pop hl
	endm
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	macro z_dec_ixl
		push hl
		
			ld hl,r_ixl
			dec (hl)
		pop hl
	endm
	macro z_dec_ixh
		push hl
			ld hl,r_ixh
			dec (hl)
		pop hl
	endm
	macro z_dec_iyl
		push hl
			ld hl,r_iyl
			dec (hl)
		pop hl
	endm
	macro z_dec_iyh
		push hl
			ld hl,r_iyh
			dec (hl)
		pop hl
	endm
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;	
	macro z_inc_iy
		push de
		push hl
			ld hl,r_iy
			ld e,(hl)
			inc hl
			ld d,(hl)
			inc de
			ld (hl),d
			dec hl
			ld (hl),e
		pop hl
		pop de
	endm	
	macro z_dec_iy
		push de
		push hl
			ld hl,r_iy
			ld e,(hl)
			inc hl
			ld d,(hl)
			dec de
			ld (hl),d
			dec hl
			ld (hl),e
		pop hl
		pop de
	endm	
		macro z_inc_ix
		push de
		push hl
			ld hl,r_ix
			ld e,(hl)
			inc hl
			ld d,(hl)
			inc de
			ld (hl),d
			dec hl
			ld (hl),e
		pop hl
		pop de
	endm	
	macro z_dec_ix
		push de
		push hl
			ld hl,r_ix
			ld e,(hl)
			inc hl
			ld d,(hl)
			dec de
			ld (hl),d
			dec hl
			ld (hl),e
		pop hl
		pop de
	endm	
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	macro z_sbc_hl_de
	
	push de
		push af
			ld a,d
			cpl
			ld d,a
			ld a,e
			cpl
			ld e,a
		pop af
		push af
			jr c, \@z_sbc_hl_de	
			inc de
 \@z_sbc_hl_de:
			add hl,de
		pop af
	pop de 
	
	endm
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	macro z_sbc_hl_bc
	push bc
		push af
			ld a,b
			cpl
			ld b,a
			ld a,c
			cpl
			ld c,a
		pop af
		jr c,.z_sbc_hl_de	
		inc bc
.z_sbc_hl_de
		add hl,bc
	pop bc
	endm
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	macro z_ld_bc_from,addr
	push hl
		ld hl,\addr
		ld c,(hl)
		inc hl
		ld b,(hl)
	pop hl
	endm
	macro z_ld_de_from,addr
	push hl
		ld hl,\addr
		ld e,(hl)
		inc hl
		ld d,(hl)
	pop hl
	endm
	macro z_ld_hl_from,addr
	push af
		ld hl,\addr
		ld a,(hl)
		inc hl
		ld h,(hl)
		ld l,a
	pop af
	endm
	
		macro z_ld_ix_from,addr
			push af
				ld a,(\addr)
				ld (r_ixl),a
				ld a,(\addr+1)
				ld (r_ixh),a
				
			pop af
		endm
		macro z_ld_iy_from,addr
			push af
				ld a,(\addr)
				ld (r_iyl),a
				ld a,(\addr+1)
				ld (r_iyh),a
			pop af
		endm
	
	
	macro z_ld_bc_to,addr
		push hl
			ld hl,\addr
			ld (hl),c
			inc hl
			ld (hl),b
		pop hl
	endm
	macro z_ld_de_to,addr
		push hl
			ld hl,\addr
			ld (hl),e
			inc hl
			ld (hl),d
		pop hl
	endm
	macro z_ld_hl_to,addr
		push af
		push de
			ld de,\addr
			ld a,l
			ld (de),a
			inc de
			ld a,h
			ld (de),a
		pop de
		pop af
	endm
	
		macro z_ld_ix_to,addr
			push af
				ld a,(r_ixl)
				ld (\addr),a
				ld a,(r_ixh)
				ld (\addr+1),a
			pop af
		endm
		macro z_ld_iy_to,addr
			push af
				ld a,(r_iyl)
				ld (\addr),a
				ld a,(r_iyh)
				ld (\addr+1),a
			pop af
		endm
		macro z_ld_ix,valu
			push af
			push hl
				ld hl,\valu
				ld a,l
				ld (r_ixl),a
				ld a,h
				ld (r_ixh),a
			pop hl
			pop af
		endm
		macro z_ld_iy,valu
			push af
			push hl
				ld hl,\valu
				ld a,l
				ld (r_iyl),a
				ld a,h
				ld (r_iyh),a
			pop hl
			pop af
		endm
		macro z_ld_ixl,valu
			push af
				ld a,\valu
				ld (r_ixl),a
			pop af
		endm
		macro z_ld_ixh,valu
			push af
				ld a,\valu
				ld (r_ixh),a
			pop af
		endm
		macro z_ld_iyl,valu
			push af
				ld a,\valu
				ld (r_iyl),a
			pop af
		endm
		macro z_ld_iyh,valu
			push af
				ld a,\valu
				ld (r_iyh),a
			pop af
		endm
		
		
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;	
	macro z_ld_b_ixl
		push af
			ld a,(r_ixl)
			ld b,a
		pop af
	endm
	macro z_ld_c_ixl
		push af
			ld a,(r_ixl)
			ld c,a
		pop af
	endm
	macro z_ld_d_ixl
		push af
			ld a,(r_ixl)
			ld d,a
		pop af
	endm
	macro z_ld_e_ixl
		push af
			ld a,(r_ixl)
			ld e,a
		pop af
	endm
	macro z_ld_h_ixl
		push af
			ld a,(r_ixl)
			ld h,a
		pop af
	endm
	macro z_ld_l_ixl
		push af
			ld a,(r_ixl)
			ld l,a
		pop af
	endm
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;	
	macro z_ld_b_ixh
		push af
			ld a,(r_ixh)
			ld b,a
		pop af
	endm
	macro z_ld_c_ixh
		push af
			ld a,(r_ixh)
			ld c,a
		pop af
	endm
	macro z_ld_d_ixh
		push af
			ld a,(r_ixh)
			ld d,a
		pop af
	endm
	macro z_ld_e_ixh
		push af
			ld a,(r_ixh)
			ld e,a
		pop af
	endm
	macro z_ld_h_ixh
		push af
			ld a,(r_ixh)
			ld h,a
		pop af
	endm
	macro z_ld_l_ixh
		push af
			ld a,(r_ixh)
			ld l,a
		pop af
	endm
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;	
	macro z_ld_ixl_b
		push af
			ld a,b
			ld (r_ixl),a
		pop af
	endm
	macro z_ld_ixl_c
		push af
			ld a,c
			ld (r_ixl),a
		pop af
	endm
	macro z_ld_ixl_d
		push af
			ld a,d
			ld (r_ixl),a
		pop af
	endm
	macro z_ld_ixl_e
		push af
			ld a,e
			ld (r_ixl),a
		pop af
	endm
	macro z_ld_ixl_h
		push af
			ld a,h
			ld (r_ixl),a
		pop af
	endm
	macro z_ld_ixl_l
		push af
			ld a,l
			ld (r_ixl),a
		pop af
	endm
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;	
	macro z_ld_ixh_b
		push af
			ld a,b
			ld (r_ixh),a
		pop af
	endm
	macro z_ld_ixh_c
		push af
			ld a,c
			ld (r_ixh),a
		pop af
	endm
	macro z_ld_ixh_d
		push af
			ld a,d
			ld (r_ixh),a
		pop af
	endm
	macro z_ld_ixh_e
		push af
			ld a,e
			ld (r_ixh),a
		pop af
	endm	
	macro z_ld_ixh_h
		push af
			ld a,h
			ld (r_ixh),a
		pop af
	endm
	macro z_ld_ixh_l
		push af
			ld a,l
			ld (r_ixh),a
		pop af
	endm
	
	
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	macro gb_swap_a
		swap a
	endm
	macro gb_swap_b
		swap b
	endm
	macro gb_swap_c
		swap c
	endm
	macro gb_swap_d
		swap d
	endm
	macro gb_swap_e
		swap e
	endm
	macro gb_swap_f
		swap f
	endm
	macro gb_swap_h
		swap h
	endm
	macro gb_swap_l
		swap l
	endm
	macro gb_swap_hl
		swap (hl)
	endm
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	macro z_ex_af_afs
		push bc
		push de
			push af
			pop de
			
			ld a,(rs_a)
			ld b,a
			ld a,(rs_f)
			ld c,a
			
			ld a,d
			ld (rs_a),a
			ld a,e
			ld (rs_f),a
			
			push bc
			pop af
			
		pop de
		pop bc
	endm
	macro z_exx
		push af
		push bc
			ld b,h
			ld c,l
			
			ld a,(rs_h)
			ld h,a
			ld a,(rs_l)
			ld l,a
			
			ld a,b
			ld (rs_h),a
			ld a,c
			ld (rs_l),a
			;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
			ld b,d
			ld c,e
			
			ld a,(rs_d)
			ld d,a
			ld a,(rs_e)
			ld e,a
			
			ld a,b
			ld (rs_d),a
			ld a,c
			ld (rs_e),a
		pop bc
		push hl
			ld h,b
			ld l,c
			
			ld a,(rs_b)
			ld b,a
			ld a,(rs_c)
			ld c,a
			
			ld a,h
			ld (rs_b),a
			ld a,l
			ld (rs_c),a
		pop hl
		pop af
	endm
;;;;;;;;;;;;;;;;;;;;;;;;;;;;; there seems to be a bug in VASM - it thinks the GBZ80 doesn't support SRL, but it does! --- FIXED IN LATEST VERSION
;	macro z_srl_a
		;db &CB,&3F
	;endm
;	macro z_srl_h
		;db &CB,&3C
	;endm