	.title Sean Riddle's Williams Emulation Test Suite
	;www.seanriddle.com
	;assembled with as6809
		;del willyemutest.bin
		;del willyemutest.rel
		;del willyemutest.s19
		;as6809 -l -o -s willyemutest.asm
		;aslink -s -m -u -b _CODED000=0xD000 -b _CODEE800=0xE800 -b _VECTORS=0xfff0 willyemutest.rel
		;srec_cat willyemutest.s19 -o willyemutest.bin -binary

	;2/8/2012 SKR created 
	;2/12/2012 V0.1 posted 	- 6809 instruction tests, 6 blitter speed tests
	;2/12/2012 V0.2 posted 	- added 5 more blitter speed tests from MAME log file
	;2/14/2012 V0.3 posted 	- normalized number of blitter loops to make each test about 1 minute
	;						- moved variables in memory
	;2/18/2012 V0.4 posted	- added instruction timing, changed a few blitter loop counts
	;						- added blit validation; does various blits, CRCs RAM to check
	;						- expanded to 12K: 0xD000-0xFFFF

	;game hardware
	screen_end = 0x9800				;screen memory from $0000-$97FF
	ram_end = 0xc000				;RAM from $0000-$BFFF

	color_registers = 0xC000
	COLOR_BLUE = 0xc0
	COLOR_WHITE = 0xff

	widget_pia_dataa = 0xC804		;control panel
	widget_pia_ctrla = 0xC805
	widget_pia_datab = 0xC806
	widget_pia_ctrlb = 0xC807

	rom_pia_dataa = 0xC80C			;coin door and sound board
	rom_pia_ctrla = 0xC80D
	rom_pia_datab = 0xC80E
	rom_pia_ctrlb = 0xC80F

	rom_enable_scr_ctrl = 0xC900	;when D0=1, reads come from ROM, not RAM

	start_blitter = 0xCA00			;special chip registers
	blitter_mask = 0xCA01
	blitter_source = 0xCA02
	blitter_dest = 0xCA04
	blitter_w_h = 0xCA06

	vidctrs = 0xcb00				;beam position
	
	watchdog = 0xCBFF
	watchdog_data = 0x39

	stack = 0xbf00					;stack pointer

	EXTREG =   0xa000				;for 6809 test suite
	
	curpos = 0xb000					;cursor position for PSTRNG 2 bytes
	
	;for blitter speed test
	tmp_blitter_source = 0xb002		;2 bytes
	tmp_blitter_dest = 0xb004		;2 bytes
	tmp_blitter_w_h = 0xb006		;2 bytes
	tmp_blitter_mask = 0xb008		;1 byte
	tmp_start_blitter = 0xb009		;1 byte
	tmp_blitter_loops = 0xb00a		;1 byte
	
	failed_6809 = 0xb00a			;1 byte flag indicating 6809 test suite failed
	
	bigindx = 0xb00b				;2 bytes index for instruction timing loops

	crca = 0xb010					;4 bytes
	addra = 0xb014					;2 bytes
	numa = 0xb016					;2 bytes

	crcerr = 0xb018					;1 byte	
	tmp = 0xb019					;1 byte

	crcb = 0xbff8					;4 bytes
	addrb = 0xbffc					;2 bytes
	numb = 0xbffe					;2 bytes
	
		
	.area	_CODED000				;this area will link at $D000
	
reset:
	orcc	#0xff
	lds		#stack					;set up stack pointer
	ldb		#watchdog_data
	stb		watchdog

	clr		rom_pia_ctrla			;setup ROM PIA
	clr		rom_pia_dataa
	lda		#0x3c
	sta		rom_pia_ctrla
	clr		rom_pia_ctrlb
	lda		#0xff
	sta		rom_pia_datab
	lda		#0x35
	sta		rom_pia_ctrlb
	lda		#0x3f
	sta		rom_pia_datab

	ldb		#0x00
	jsr		set_LED
	
	clr		widget_pia_ctrla		;setup widget PIA
	clr		widget_pia_ctrlb
	clr		widget_pia_dataa
	clr		widget_pia_datab
	lda		#0x34
	sta		widget_pia_ctrla
	lda		#0x3c					;select B controls for joystick
	sta		widget_pia_ctrlb

	lda		#0x01					;enable ROM
	sta		rom_enable_scr_ctrl

	ldb		#0x01
	jsr		set_LED

	jsr		clear_screen
	jsr		load_palette_graybkg

	ldx		#0x1c88
	stx		curpos
	LDX		#TITLEM1
	JSR		PSTRNG

	ldb		#watchdog_data
	jsr		delay_ffff
	jsr		delay_ffff
	jsr		delay_ffff
	jsr		clear_screen
	
	jsr		test6809	

	ldb		failed_6809
	bne		nosuccess

	ldb		#0x03
	jsr		set_LED
	
	jsr		load_palette_greenbkg

	ldx		#0x1c88
	stx		curpos
	LDX   	#PASSM1
	JSR   	PSTRNG
	
	ldb		#watchdog_data
	jsr		delay_ffff
	jsr		delay_ffff
	jsr		delay_ffff

nosuccess:	
	jsr		fadeout

;blitter validation
	jsr		clear_screen
	jsr		load_palette_bluebkg

	lda		#0x01
	sta		crcerr

	ldx		#0x1c88
	stx		curpos
	LDX		#BLITM1
	JSR		PSTRNG
	ldb		#watchdog_data
	jsr		delay_ffff

	ldy		#blit_test_start

blittest:

;set all colors to blue
	ldx		#color_registers
lp2a$:
	lda		vidctrs
	anda	#0xfc
	bne		lp2a$
lp1a$:
	lda		#COLOR_BLUE
	sta		,x+
	cmpx	#color_registers+0x10
	bne		lp1a$
	
	ldb		#watchdog_data
	jsr		delay_ffff

;first, clear all of memory so we can check for bad blits
;no subroutine calls after here so stack won't change memory contents

	lda		#0x00			;first 1/4 to 00
	ldx		#0x0000
1$:
	sta		,x+
	stb		watchdog
	cmpx	#0x3000
	bne		1$

	lda		#0xFF			;second 1/4 to FF
	ldx		#0x3000
2$:
	sta		,x+
	stb		watchdog
	cmpx	#0x6000
	bne		2$

	lda		#0xA5			;third 1/4 to A5
	ldx		#0x6000
3$:
	sta		,x+
	stb		watchdog
	cmpx	#0x9000
	bne		3$

	lda		#0x5A			;fourth 1/4 to 5A
	ldx		#0x9000
4$:
	sta		,x+
	stb		watchdog
	cmpx	#ram_end
	bne		4$

;set all colors to white
	ldx		#color_registers
lp2b$:
	lda		vidctrs
	anda	#0xfc
	bne		lp2b$
lp1b$:
	lda		#COLOR_WHITE
	sta		,x+
	cmpx	#color_registers+0x10
	bne		lp1b$
	
;now do blits and compare the CRC
	ldu		,y++				;# blits for this pass
	
timeloop:	
	lda		,y+
	sta		rom_enable_scr_ctrl
	ldx		,y++
	stx		blitter_source
	lda		,y+
	sta		blitter_mask
	ldx		,y++
	stx		blitter_dest
	ldx		,y++
	stx		blitter_w_h
	lda		,y+
	sta		start_blitter	

	leau	-1,u
	cmpu	#0x0000
	bne		timeloop
		
	lda		#0x00					;enable RAM
	sta		rom_enable_scr_ctrl

	ldx 	#0
	stx		addrb
	ldx		#0xffff
	stx 	crcb+0
	stx 	crcb+2
	ldx 	#0xbff8			;CRC nearly all of RAM (except 8 bytes CRC uses)
	stx		numb

;from http://mdfs.net/Info/Comp/Comms/CRC32.htm
; On entry, crc..crc+3   =  incoming CRC (0xFFFFFFFF)
;           addr..addr+1 => start address of data
;           num..num+1   =  number of bytes
; On exit,  crc..crc+3   =  updated CRC
;           addr..addr+1 => end of data+1
;           num..num+1   =  0

bytelp:
	ldb		#watchdog_data
	stb		watchdog
	LDX 	#8				;rotate CRC 8 bits
	LDA 	[addrb]			;get data byte

	;update the CRC with the byte in A	
	EORA 	crcb+0			;EOR byte into CRC lo byte
rotlp:
	LSR 	crcb+3			;rotate CRC clearing bit 31
	ROR 	crcb+2
	ROR 	crcb+1
	RORA
	BCC 	clear			;if bit 0 is 0, skip
	TFR 	a,b
	LDA 	crcb+3			;CRC ^= 0xEDB88320
	EORA 	#0xED
	STA 	crcb+3
	LDA 	crcb+2
	EORA 	#0xB8
	STA 	crcb+2
	LDA 	crcb+1
	EORA 	#0x83
	STA 	crcb+1
	TFR 	b,a
	EORA 	#0x20
clear:
	DEX
	BNE 	rotlp			;loop for 8 bits
	
	INC 	addrb+1			;next byte of data
	BNE 	next
	INC 	addrb+0
next:
	STA 	crcb+0			;store CRC low byte
	LDA 	numb+1			;subtract one from byte count
	BNE 	skip
	DEC 	numb+0
skip:
	DEC 	numb+1
	BNE 	bytelp
	LDA 	numb+0
	BNE 	bytelp
	
passdone:
;compare CRCs
	lda		crcb+0
	cmpa	,y+
	bne		badcrc0
	lda		crcb+1
	cmpa	,y+
	bne		badcrc1
	lda		crcb+2
	cmpa	,y+
	bne		badcrc2
	lda		crcb+3
	cmpa	,y+
	bne		badcrc3

resumeblittest:
	cmpy	#blit_test_end	
	lblt	blittest
	
	bra		blitsok

badcrc0:
	lda		,y+
badcrc1:
	lda		,y+
badcrc2:	
	lda		,y+
badcrc3:
	sty		numb
	lda		#0x01
	sta		crcerr
	ldb		#0x04
	jsr		set_LED

	jsr		clear_screen
	jsr		load_palette_redbkg
	ldx		#0x1c88
	stx		curpos
	LDX		#CRCBADM1
	JSR		PSTRNG

	ldx		#0x3c99
	stx		curpos
	lda 	crcb+0
	jsr		PHEX
	lda 	crcb+1
	jsr		PHEX
	lda 	crcb+2
	jsr		PHEX
	lda 	crcb+3
	jsr		PHEX

	ldb		#watchdog_data
	jsr		delay_ffff
	jsr		delay_ffff
	jsr		delay_ffff
	jsr		delay_ffff
	jsr		delay_ffff
	jsr		delay_ffff
	ldy		numb
	bra		resumeblittest
			
blitsok:
	lda		#0x01					;enable ROM
	sta		rom_enable_scr_ctrl

	lda		crcerr
	bne		blittiming
	jsr		clear_screen
	jsr		load_palette_greenbkg

	ldx		#0x1c88
	stx		curpos
	LDX		#CRCOKM1
	JSR		PSTRNG
	ldb		#watchdog_data
	jsr		delay_ffff

blittiming:
	jsr		clear_screen
	jsr		load_palette_bluebkg

	ldx		#0x1c88
	stx		curpos
	LDX		#BLITM2
	JSR		PSTRNG
	ldb		#watchdog_data
	jsr		delay_ffff

;blitter timing tests
	ldy		#blit_time_start
blitloop:
	pshs	y
	jsr		load_palette_allwhite
	puls	y

	ldx		,y++
	stx		tmp_blitter_source
	lda		,y+
	sta		tmp_blitter_mask
	ldx		,y++
	stx		tmp_blitter_dest
	ldx		,y++
	stx		tmp_blitter_w_h
	lda		,y+
	sta		tmp_start_blitter	
	lda		,y+	
	sta		tmp_blitter_loops	;this many loops of 65535...
	ldx		,y++				;...plus this many more loops

	ldb		#watchdog_data
1$:
	stb		watchdog
	pshs	x					;loops remaining
	
	ldx		tmp_blitter_source
	stx		blitter_source
	lda		tmp_blitter_mask
	sta		blitter_mask
	ldx		tmp_blitter_dest
	stx		blitter_dest
	ldx		tmp_blitter_w_h
	stx		blitter_w_h
	lda		tmp_start_blitter
	sta		start_blitter	
	
	puls	x
	leax	0xffff,x
	bne		1$
	
	lda		tmp_blitter_loops
	beq		blitter_pass_done
	
	suba	#0x01
	sta		tmp_blitter_loops
	
	ldx		#0xffff
	
	bra		1$

blitter_pass_done:
	pshs	y
	jsr		load_palette_allblue

	ldb		#watchdog_data
	jsr		delay_ffff

	puls	y
	cmpy	#blit_time_end	
	blt		blitloop

skipblits:
	jsr		clear_screen
	jsr		load_palette_purplebkg

	ldx		#0x1c88
	stx		curpos
	LDX		#INSTM1
	JSR		PSTRNG
	ldb		#watchdog_data
	jsr		delay_ffff


;instruction timing tests
	ldy		#inst_paras_start
instloop:
	pshs	y
	jsr		load_palette_allwhite
	puls	y
	ldx		#0xb100
	lda		,y+
	ldb		#watchdog_data
	stb		watchdog

instloop1:
	sta		,x+
	cmpx	#0xb200
	bne		instloop1	
	lda		#0x39		;RTS
	sta		0xb200	
	ldx		,y++
	stx		bigindx
	ldx		,y++

instloop2:
	pshs	x
	jsr		0xb100
	ldb		#watchdog_data
	stb		watchdog
	puls	x
	leax	-1,x
	bne		instloop2

	ldx		bigindx
	beq		inst_pass_done
	leax	-1,x
	stx		bigindx
	ldx		#0xffff
	bra		instloop2
	
inst_pass_done:
	pshs	y
	jsr		load_palette_allpurple

	ldb		#watchdog_data
	jsr		delay_ffff

	puls	y
	cmpy	#inst_paras_end	
	blt		instloop

	jsr		clear_screen
	jsr		load_palette_greenbkg

	
spin:
	ldb		#watchdog_data
	stb		watchdog
	bra		spin


;blitter validation parameters
blit_test_start:
			;source	1=ROM				mask	dest		w/h			flags
	.byte	0,192									;# of blits in this pass
	
	;0x0000 - pre-filled with 00
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x00,0x00,	0x14,0x14,	0x00	;various w/h, all 1024 bytes
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x01,0x00,	0x24,0x0c,	0x00
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x02,0x00,	0x44,0x00,	0x00
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x03,0x00,	0x84,0x06,	0x00
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x04,0x00,	0x0c,0x24,	0x00
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x05,0x00,	0x00,0x44,	0x00
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x06,0x00,	0x06,0x84,	0x00
	
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x07,0x00,	0x14,0x14,	0x08	;various flags
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x08,0x00,	0x14,0x14,	0x10
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x09,0x00,	0x14,0x14,	0x20
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x0a,0x00,	0x14,0x14,	0x40
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x0b,0x00,	0x14,0x14,	0x80
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x0c,0x00,	0x14,0x14,	0xb8
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x0d,0x00,	0x14,0x14,	0x78
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x0e,0x00,	0x14,0x14,	0x04
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x0f,0x00,	0x14,0x14,	0x88

	.byte	1,	>#blitdata, <#blitdata,	0x00,	0x10,0x00,	0x14,0x14,	0x10	;various masks
	.byte	1,	>#blitdata, <#blitdata,	0x11,	0x11,0x00,	0x14,0x14,	0x10
	.byte	1,	>#blitdata, <#blitdata,	0x22,	0x12,0x00,	0x14,0x14,	0x10
	.byte	1,	>#blitdata, <#blitdata,	0x33,	0x13,0x00,	0x14,0x14,	0x10
	.byte	1,	>#blitdata, <#blitdata,	0x44,	0x14,0x00,	0x14,0x14,	0x10
	.byte	1,	>#blitdata, <#blitdata,	0x55,	0x15,0x00,	0x14,0x14,	0x10
	.byte	1,	>#blitdata, <#blitdata,	0x66,	0x16,0x00,	0x14,0x14,	0x10
	.byte	1,	>#blitdata, <#blitdata,	0x77,	0x17,0x00,	0x14,0x14,	0x10
	.byte	1,	>#blitdata, <#blitdata,	0x88,	0x18,0x00,	0x14,0x14,	0x10
	.byte	1,	>#blitdata, <#blitdata,	0x99,	0x19,0x00,	0x14,0x14,	0x10
	.byte	1,	>#blitdata, <#blitdata,	0xaa,	0x1a,0x00,	0x14,0x14,	0x10
	.byte	1,	>#blitdata, <#blitdata,	0xbb,	0x1b,0x00,	0x14,0x14,	0x10
	.byte	1,	>#blitdata, <#blitdata,	0xcc,	0x1c,0x00,	0x14,0x14,	0x10
	.byte	1,	>#blitdata, <#blitdata,	0xdd,	0x1d,0x00,	0x14,0x14,	0x10
	.byte	1,	>#blitdata, <#blitdata,	0xee,	0x1e,0x00,	0x14,0x14,	0x10
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x1f,0x00,	0x14,0x14,	0x10

	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x20,0x00,	0x04,0x04,	0x08	;various w/h, different sizes
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x21,0x00,	0x04,0x05,	0x08
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x22,0x00,	0x04,0x06,	0x08
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x23,0x00,	0x04,0x07,	0x08
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x24,0x00,	0x05,0x04,	0x08
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x25,0x00,	0x05,0x05,	0x08
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x26,0x00,	0x05,0x06,	0x08
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x27,0x00,	0x05,0x07,	0x08
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x28,0x00,	0x06,0x04,	0x08
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x29,0x00,	0x06,0x05,	0x08
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x2a,0x00,	0x06,0x06,	0x08
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x2b,0x00,	0x06,0x07,	0x08
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x2c,0x00,	0x07,0x04,	0x08
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x2d,0x00,	0x07,0x05,	0x08
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x2e,0x00,	0x07,0x06,	0x08
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x2f,0x00,	0x07,0x07,	0x08


			;source 1=ROM				mask	dest		w/h			flags
	;0x3000 - pre-filled with ff
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x30,0x00,	0x14,0x14,	0x00	;various w/h, all 1024 bytes
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x31,0x00,	0x24,0x0c,	0x00
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x32,0x00,	0x44,0x00,	0x00
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x33,0x00,	0x84,0x06,	0x00
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x34,0x00,	0x0c,0x24,	0x00
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x35,0x00,	0x00,0x44,	0x00
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x36,0x00,	0x06,0x84,	0x00
	
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x37,0x00,	0x14,0x14,	0x08	;various flags
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x38,0x00,	0x14,0x14,	0x10
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x39,0x00,	0x14,0x14,	0x20
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x3a,0x00,	0x14,0x14,	0x40
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x3b,0x00,	0x14,0x14,	0x80
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x3c,0x00,	0x14,0x14,	0xb8
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x3d,0x00,	0x14,0x14,	0x78
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x3e,0x00,	0x14,0x14,	0x04
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x3f,0x00,	0x14,0x14,	0x88

	.byte	1,	>#blitdata, <#blitdata,	0x00,	0x40,0x00,	0x14,0x14,	0x10	;various masks
	.byte	1,	>#blitdata, <#blitdata,	0x11,	0x41,0x00,	0x14,0x14,	0x10
	.byte	1,	>#blitdata, <#blitdata,	0x22,	0x42,0x00,	0x14,0x14,	0x10
	.byte	1,	>#blitdata, <#blitdata,	0x33,	0x43,0x00,	0x14,0x14,	0x10
	.byte	1,	>#blitdata, <#blitdata,	0x44,	0x44,0x00,	0x14,0x14,	0x10
	.byte	1,	>#blitdata, <#blitdata,	0x55,	0x45,0x00,	0x14,0x14,	0x10
	.byte	1,	>#blitdata, <#blitdata,	0x66,	0x46,0x00,	0x14,0x14,	0x10
	.byte	1,	>#blitdata, <#blitdata,	0x77,	0x47,0x00,	0x14,0x14,	0x10
	.byte	1,	>#blitdata, <#blitdata,	0x88,	0x48,0x00,	0x14,0x14,	0x10
	.byte	1,	>#blitdata, <#blitdata,	0x99,	0x49,0x00,	0x14,0x14,	0x10
	.byte	1,	>#blitdata, <#blitdata,	0xaa,	0x4a,0x00,	0x14,0x14,	0x10
	.byte	1,	>#blitdata, <#blitdata,	0xbb,	0x4b,0x00,	0x14,0x14,	0x10
	.byte	1,	>#blitdata, <#blitdata,	0xcc,	0x4c,0x00,	0x14,0x14,	0x10
	.byte	1,	>#blitdata, <#blitdata,	0xdd,	0x4d,0x00,	0x14,0x14,	0x10
	.byte	1,	>#blitdata, <#blitdata,	0xee,	0x4e,0x00,	0x14,0x14,	0x10
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x4f,0x00,	0x14,0x14,	0x10
	
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x50,0x00,	0x04,0x04,	0x08	;various w/h, different sizes
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x51,0x00,	0x04,0x05,	0x08
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x52,0x00,	0x04,0x06,	0x08
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x53,0x00,	0x04,0x07,	0x08
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x54,0x00,	0x05,0x04,	0x08
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x55,0x00,	0x05,0x05,	0x08
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x56,0x00,	0x05,0x06,	0x08
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x57,0x00,	0x05,0x07,	0x08
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x58,0x00,	0x06,0x04,	0x08
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x59,0x00,	0x06,0x05,	0x08
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x5a,0x00,	0x06,0x06,	0x08
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x5b,0x00,	0x06,0x07,	0x08
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x5c,0x00,	0x07,0x04,	0x08
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x5d,0x00,	0x07,0x05,	0x08
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x5e,0x00,	0x07,0x06,	0x08
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x5f,0x00,	0x07,0x07,	0x08

			;source 1=ROM				mask	dest		w/h			flags
	;0x6000 - pre-filled with A5
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x60,0x00,	0x14,0x14,	0x00	;various w/h, all 1024 bytes
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x61,0x00,	0x24,0x0c,	0x00
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x62,0x00,	0x44,0x00,	0x00
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x63,0x00,	0x84,0x06,	0x00
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x64,0x00,	0x0c,0x24,	0x00
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x65,0x00,	0x00,0x44,	0x00
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x66,0x00,	0x06,0x84,	0x00
	
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x67,0x00,	0x14,0x14,	0x08	;various flags
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x68,0x00,	0x14,0x14,	0x10
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x69,0x00,	0x14,0x14,	0x20
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x6a,0x00,	0x14,0x14,	0x40
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x6b,0x00,	0x14,0x14,	0x80
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x6c,0x00,	0x14,0x14,	0xb8
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x6d,0x00,	0x14,0x14,	0x78
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x6e,0x00,	0x14,0x14,	0x04
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x6f,0x00,	0x14,0x14,	0x88

	.byte	1,	>#blitdata, <#blitdata,	0x00,	0x70,0x00,	0x14,0x14,	0x10	;various masks
	.byte	1,	>#blitdata, <#blitdata,	0x11,	0x71,0x00,	0x14,0x14,	0x10
	.byte	1,	>#blitdata, <#blitdata,	0x22,	0x72,0x00,	0x14,0x14,	0x10
	.byte	1,	>#blitdata, <#blitdata,	0x33,	0x73,0x00,	0x14,0x14,	0x10
	.byte	1,	>#blitdata, <#blitdata,	0x44,	0x74,0x00,	0x14,0x14,	0x10
	.byte	1,	>#blitdata, <#blitdata,	0x55,	0x75,0x00,	0x14,0x14,	0x10
	.byte	1,	>#blitdata, <#blitdata,	0x66,	0x76,0x00,	0x14,0x14,	0x10
	.byte	1,	>#blitdata, <#blitdata,	0x77,	0x77,0x00,	0x14,0x14,	0x10
	.byte	1,	>#blitdata, <#blitdata,	0x88,	0x78,0x00,	0x14,0x14,	0x10
	.byte	1,	>#blitdata, <#blitdata,	0x99,	0x79,0x00,	0x14,0x14,	0x10
	.byte	1,	>#blitdata, <#blitdata,	0xaa,	0x7a,0x00,	0x14,0x14,	0x10
	.byte	1,	>#blitdata, <#blitdata,	0xbb,	0x7b,0x00,	0x14,0x14,	0x10
	.byte	1,	>#blitdata, <#blitdata,	0xcc,	0x7c,0x00,	0x14,0x14,	0x10
	.byte	1,	>#blitdata, <#blitdata,	0xdd,	0x7d,0x00,	0x14,0x14,	0x10
	.byte	1,	>#blitdata, <#blitdata,	0xee,	0x7e,0x00,	0x14,0x14,	0x10
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x7f,0x00,	0x14,0x14,	0x10

	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x80,0x00,	0x04,0x04,	0x08	;various w/h, different sizes
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x81,0x00,	0x04,0x05,	0x08
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x82,0x00,	0x04,0x06,	0x08
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x83,0x00,	0x04,0x07,	0x08
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x84,0x00,	0x05,0x04,	0x08
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x85,0x00,	0x05,0x05,	0x08
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x86,0x00,	0x05,0x06,	0x08
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x87,0x00,	0x05,0x07,	0x08
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x88,0x00,	0x06,0x04,	0x08
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x89,0x00,	0x06,0x05,	0x08
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x8a,0x00,	0x06,0x06,	0x08
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x8b,0x00,	0x06,0x07,	0x08
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x8c,0x00,	0x07,0x04,	0x08
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x8d,0x00,	0x07,0x05,	0x08
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x8e,0x00,	0x07,0x06,	0x08
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x8f,0x00,	0x07,0x07,	0x08

			;source 1=ROM				mask	dest		w/h			flags
	;0x9000 - pre-filled with 5A
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x90,0x00,	0x14,0x14,	0x00	;various w/h, all 1024 bytes
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x91,0x00,	0x24,0x0c,	0x00
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x92,0x00,	0x44,0x00,	0x00
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x93,0x00,	0x84,0x06,	0x00
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x94,0x00,	0x0c,0x24,	0x00
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x95,0x00,	0x00,0x44,	0x00
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x96,0x00,	0x06,0x84,	0x00
	
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x97,0x00,	0x14,0x14,	0x08	;various flags
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x98,0x00,	0x14,0x14,	0x10
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x99,0x00,	0x14,0x14,	0x20
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x9a,0x00,	0x14,0x14,	0x40
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x9b,0x00,	0x14,0x14,	0x80
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x9c,0x00,	0x14,0x14,	0xb8
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x9d,0x00,	0x14,0x14,	0x78
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x9e,0x00,	0x14,0x14,	0x04
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x9f,0x00,	0x14,0x14,	0x88

	.byte	1,	>#blitdata, <#blitdata,	0x00,	0xa0,0x00,	0x14,0x14,	0x10	;various masks
	.byte	1,	>#blitdata, <#blitdata,	0x11,	0xa1,0x00,	0x14,0x14,	0x10
	.byte	1,	>#blitdata, <#blitdata,	0x22,	0xa2,0x00,	0x14,0x14,	0x10
	.byte	1,	>#blitdata, <#blitdata,	0x33,	0xa3,0x00,	0x14,0x14,	0x10
	.byte	1,	>#blitdata, <#blitdata,	0x44,	0xa4,0x00,	0x14,0x14,	0x10
	.byte	1,	>#blitdata, <#blitdata,	0x55,	0xa5,0x00,	0x14,0x14,	0x10
	.byte	1,	>#blitdata, <#blitdata,	0x66,	0xa6,0x00,	0x14,0x14,	0x10
	.byte	1,	>#blitdata, <#blitdata,	0x77,	0xa7,0x00,	0x14,0x14,	0x10
	.byte	1,	>#blitdata, <#blitdata,	0x88,	0xa8,0x00,	0x14,0x14,	0x10
	.byte	1,	>#blitdata, <#blitdata,	0x99,	0xa9,0x00,	0x14,0x14,	0x10
	.byte	1,	>#blitdata, <#blitdata,	0xaa,	0xaa,0x00,	0x14,0x14,	0x10
	.byte	1,	>#blitdata, <#blitdata,	0xbb,	0xab,0x00,	0x14,0x14,	0x10
	.byte	1,	>#blitdata, <#blitdata,	0xcc,	0xac,0x00,	0x14,0x14,	0x10
	.byte	1,	>#blitdata, <#blitdata,	0xdd,	0xad,0x00,	0x14,0x14,	0x10
	.byte	1,	>#blitdata, <#blitdata,	0xee,	0xae,0x00,	0x14,0x14,	0x10
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0xaf,0x00,	0x14,0x14,	0x10

	.byte	1,	>#blitdata, <#blitdata,	0xff,	0xb0,0x00,	0x04,0x04,	0x08	;various w/h, different sizes
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0xb1,0x00,	0x04,0x05,	0x08
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0xb2,0x00,	0x04,0x06,	0x08
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0xb3,0x00,	0x04,0x07,	0x08
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0xb4,0x00,	0x05,0x04,	0x08
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0xb5,0x00,	0x05,0x05,	0x08
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0xb6,0x00,	0x05,0x06,	0x08
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0xb7,0x00,	0x05,0x07,	0x08
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0xb8,0x00,	0x06,0x04,	0x08
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0xb9,0x00,	0x06,0x05,	0x08
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0xba,0x00,	0x06,0x06,	0x08
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0xbb,0x00,	0x06,0x07,	0x08
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0xbc,0x00,	0x07,0x04,	0x08
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0xbd,0x00,	0x07,0x05,	0x08
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0xbe,0x00,	0x07,0x06,	0x08
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0xbf,0x00,	0x07,0x07,	0x08

	.byte	0x86,0x4d,0x82,0x98						;CRC for this pass

	.byte	0,21									;# of blits in this pass
			;source 1=ROM				mask	dest		w/h			flags
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0xff,0xf0,	0x14,0x14,	0x00	;wraps FFF0-00EF
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x01,0x01,	0x14,0x14,	0x00	;odd dest address
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x03,0x00,	0x0b,0x0b,	0x00	;odd w/h
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x04,0x00,	0x14,0x14,	0x00	;normal
	.byte	0,	0x04,0x00,				0xff,	0x04,0x80,	0x14,0x14,	0x04	;sync overlapping source/dest
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x06,0x00,	0x14,0x14,	0x00	;normal
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x07,0x00,	0x14,0x14,	0x00	;normal
	.byte	0,	0x06,0x80,				0xff,	0x06,0x00,	0x14,0x14,	0x04	;sync overlapping source/dest
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x08,0x00,	0xfb,0x04,	0x00	;256x1
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x09,0x00,	0x04,0xfb,	0x00	;1x256
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x10,0x00,	0x14,0x14,	0x02	;screen dest
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x20,0x00,	0x14,0x14,	0x1a	;solid FG screen dest
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x30,0x00,	0x14,0x14,	0x0a	;FG screen dest
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x40,0x00,	0x14,0x14,	0x2a	;shifted FG screen dest
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x50,0x00,	0x14,0x14,	0x56	;even solid sync screen dest
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x60,0x00,	0x14,0x14,	0x46	;even sync screen dest
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x70,0x00,	0x14,0x14,	0x02	;screen dest
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x80,0x00,	0x14,0x14,	0x1a	;solid FG screen dest
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0x90,0x00,	0x14,0x14,	0x0a	;FG screen dest
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0xa0,0x00,	0x14,0x14,	0x2a	;shifted FG screen dest
	.byte	1,	>#blitdata, <#blitdata,	0xff,	0xb0,0x00,	0x14,0x14,	0x56	;even solid sync screen dest	

	.byte	0x1e,0xc7,0xa2,0x52						;CRC for this pass

	.byte	0,1										;# of blits in this pass
			;source	1=ROM	mask	dest		w/h			flags
	.byte	0,	0x00, 0x00,	0xff,	0x01,0x01,	0xd9,0xd9,	0x04	;RAM big blit 48841 bytes
	
	.byte	0x11,0xc7,0x71,0x75						;CRC for this pass
blit_test_end:

	;Bit 0 =linear/screen source	1
	;Bit 1 =linear/screen dest		2
	;Bit 2 sync for blits from RAM, slowing 	4
	;Bit 3 tells the blitter only to blit the foreground	8
	;Bit 4 is 'solid' mode.	10
	;Bit 5 shifts the image one pixel to the right	20
	;Bit 6 says even only, bit 7 says odd only	40/80

;blitter timing parameters
blit_time_start:

			;source addr,	mask, 	dest addr, 	w/ht,		mode,	#loops
	.byte	0xf0, 0x00, 	0xff,	0x3c,0x99,	0x24,0x24,	0x02,	0x00,0xd0,0x68
			;ROM-RAM, lin src, scr dst - 60.2s actual, 60.2s in MAME0145 64-bit
			
	.byte	0x00, 0x00, 	0xff,	0x3c,0x99,	0x24,0x24,	0x06,	0x00,0x6d,0x2a
			;RAM-RAM, RAM, lin src, scr dst - 60.4s actual, 32.0s in MAME0145 64-bit
			
	.byte	0x00, 0x00, 	0xff,	0x3c,0x99,	0x24,0x24,	0x07,	0x00,0x6d,0x2a
			;RAM-RAM, RAM, scr src, scr dst - 60.4s actual, 32.0s in MAME0145 64-bit
			
	.byte	0xd0, 0x00, 	0xff,	0x3c,0x99,	0x24,0x24,	0x02,	0x00,0xd0,0x68
			;Sin SRAM-RAM, lin src, scr dst - 60.2s actual, 60.2s in MAME0145 64-bit
			
	.byte	0xd0, 0x00, 	0xff,	0x3c,0x99,	0x24,0x24,	0x03,	0x00,0xd0,0x68
			;Sin SRAM-RAM, scr src, scr dst - 60.2s actual, 60.2s in MAME0145 64-bit
			
	.byte	0xf0, 0x00, 	0x11,	0x3c,0x99,	0x24,0x24,	0x02,	0x00,0xd0,0x68
			;ROM-RAM, lin src, scr dst - 60.2s actual, 60.2s in MAME0145 64-bit

;the following masks, widths/heights and modes are taken from a MAME log for a Robotron game
;so they should be a representative sample

			;source addr,	mask, 	dest addr, 	w/ht,		mode,	#loops
	.byte	0xf0, 0x00, 	0x99,	0x3c,0x99,	0x07,0x02,	0x1a,	0x08,0x9a,0xa4
			;ROM-RAM, solid FG, lin src, scr dst - 60.2s actual, 60.2s MAME0145 64-bit
	
	.byte	0xf0, 0x00, 	0x00,	0x3c,0x99,	0x01,0x09,	0x0a,	0x05,0xf3,0xc8
			;ROM-RAM, FG, lin src, scr dst - 60.2s actual, 60.2s in MAME0145 64-bit
	
	.byte	0xf0, 0x00, 	0x00,	0x3c,0x99,	0x0c,0x0b,	0x2a,	0x04,0x5d,0x01
			;ROM-RAM, Shift FG, lin src, scr dst - 60.2s actual, 60.2s MAME0145 64-bit
														
	.byte	0x00, 0x00, 	0x00,	0x3c,0x99,	0x05,0x09,	0x56,	0x08,0x06,0xa2
			;RAM-RAM, Even Solid RAM, lin src, scr dst - 60.2s actual, 54.5s MAME0145 64-bit
														
	.byte	0x00, 0x00, 	0x46,	0x3c,0x99,	0x05,0x08,	0x46,	0x08,0x44,0x8b
			;RAM-RAM, Even RAM, lin src, scr dst - 60.2s actual, 54.5s in MAME0145 64-bit
	
blit_time_end:


;instruction timing parameters
inst_paras_start:
			;opcode	#loops
	.byte	0x12,	0x00,0x01,0x9f,0x8e		;NOP	59.8s actual, 59.9 in MAME0145 64-bit
	.byte	0x4f,	0x00,0x01,0x9f,0x8e		;CLRA	59.8s actual, 59.9 in MAME0145 64-bit
	.byte	0x43,	0x00,0x01,0x9f,0x8e		;COMA	59.8s actual, 59.9 in MAME0145 64-bit
	.byte	0x19,	0x00,0x01,0x9f,0x8e		;DAA	59.8s actual, 59.9 in MAME0145 64-bit
	.byte	0x4d,	0x00,0x01,0x9f,0x8e		;TSTA	59.8s actual, 59.9 in MAME0145 64-bit
	
inst_paras_end:


	;subroutines

crctestdata:
	.fcc "123456789"

testcrc32:
	ldx #crctestdata
	stx	addra
	ldx	#0xffff
	stx crca+0
	stx crca+2
	ldx #9
	stx	numa
	jmp	crc32


crc32:	;from http://mdfs.net/Info/Comp/Comms/CRC32.htm
; On entry, crc..crc+3   =  incoming CRC (0xFFFFFFFF)
;           addr..addr+1 => start address of data
;           num..num+1   =  number of bytes
; On exit,  crc..crc+3   =  updated CRC
;           addr..addr+1 => end of data+1
;           num..num+1   =  0

bytelp2:
	LDX #8				;rotate CRC 8 bits
	LDA [addra]			;get data byte

	;update the CRC with the byte in A	
	EORA crca+0			;EOR byte into CRC lo byte
rotlp2:
	LSR crca+3			;rotate CRC clearing bit 31
	ROR crca+2
	ROR crca+1
	RORA
	BCC clear2			;if bit 0 is 0, skip
	TFR a,b
	LDA crca+3			;CRC ^= 0xEDB88320
	EORA #0xED
	STA crca+3
	LDA crca+2
	EORA #0xB8
	STA crca+2
	LDA crca+1
	EORA #0x83
	STA crca+1
	TFR b,a
	EORA #0x20
clear2:
	DEX
	BNE rotlp2			;loop for 8 bits
	
	INC addra+1			;next byte of data
	BNE next2
	INC addra+0
next2:
	STA crca+0			;store CRC low byte
	LDA numa+1			;subtract one from byte count
	BNE skip2
	DEC numa+0
skip2:
	DEC numa+1
	BNE bytelp2
	LDA numa+0
	BNE bytelp2
	RTS					;return if all bytes done


;delays - must ldb #watchdog_data before calling
delay_ffff:
	ldx		#0xffff
	bra		delay_x
delay_600:
	ldx		#0x0600
	bra		delay_x
delay_300:
	ldx		#0x0300
delay_x:
	stb		watchdog
	leax	0xffff,x
	bne		delay_x
	rts


draw_gfx:							;blit block onto screen - x holds starting address
	stx		blitter_source
	lda		#0xff					;replace the current contents
	sta		blitter_mask
	ldx		#0x3c99					;destination x=120, y=153
	stx		blitter_dest
	ldx		#0x2424					;width and height XOR 0x04 - 32 x 32 bytes = 64 x 32 pixels
	stx		blitter_w_h
	lda		#0x02					;start blit linear to screen layout
	sta		start_blitter
	rts

	;Bit 0 =linear/screen source
	;Bit 1 =linear/screen dest
	;Bit 2 sync for blits from RAM, slowing 
	;Bit 3 tells the blitter only to blit the foreground
	;Bit 4 is 'solid' mode.
	;Bit 5 shifts the image one pixel to the right
	;Bit 6 says even only, bit 7 says odd only
	

clear_screen:						;write 0x00 to 0x0000-0x97ff
	lda		#0x00
fill_screen:
	ldx		#0x0000
1$:
	sta		,x+
	stb		watchdog
	cmpx	#screen_end
	bne		1$
	rts


load_palette_allblack:
	ldy		#allblack
load_palette:						;load palette from y
	ldx		#color_registers
2$:
	lda		vidctrs
	anda	#0xfc
	bne		2$
1$:
	lda		,y+
	sta		,x+
	cmpx	#color_registers+0x10
	bne		1$
	rts
			
load_mypalette:
	ldy		#mypalette
	bra		load_palette

load_dimpalette:
	ldy		#dimpalette
	bra		load_palette

load_palette2:
	ldy		#palette2
	bra		load_palette

load_palette_redbkg:
	ldy		#redbkg
	bra		load_palette

load_palette_bluebkg:
	ldy		#bluebkg
	bra		load_palette

load_palette_purplebkg:
	ldy		#purplebkg
	bra		load_palette

load_palette_allpurple:
	ldy		#allpurple
	bra		load_palette

load_palette_greenbkg:
	ldy		#greenbkg
	bra		load_palette

load_palette_graybkg:
	ldy		#graybkg
	bra		load_palette

load_palette_allgreen:
	ldy		#allgreen
	bra		load_palette

load_palette_allblue:
	ldy		#allblue
	bra		load_palette

load_palette_allwhite:
	ldy		#allwhite
	bra		load_palette


;colors are BB GGG RRR
fadein:								;mask with 00, 09, 52, 5b, a4, ad, f6 and ff
	ldb		#0x00
2$:
	ldy		#mypalette
	ldx		#color_registers
6$:
	lda		vidctrs					;sync to video vert blank
	anda	#0xfc
	bne		6$
1$:
	tfr		b,a
	anda	,y+
	sta		,x+
	cmpx	#color_registers+0x10
	bne		1$
	tfr		b,a
	ldb		#watchdog_data
	jsr		delay_300
	tfr		a,b
	cmpb	#0xff
	beq		5$
	cmpb	#0x09
	beq		3$
	cmpb	#0x5b
	beq		3$
	cmpb	#0xad
	bne		4$
3$:
	addb	#0x40
4$:
	addb	#0x09
	bra 	2$
5$:
	ldb		#watchdog_data
	rts

	
fadeout:							;mask with ff, f6, ad, a4, 5b, 52, 09 and 00
	ldb		#0xff
2$:
	ldy		#mypalette
	ldx		#color_registers
6$:
	lda		vidctrs					;sync to video vert blank
	anda	#0xfc
	bne		6$
1$:
	tfr		b,a
	anda	,y+
	sta		,x+
	cmpx	#color_registers+0x10
	bne		1$
	tfr		b,a
	ldb		#watchdog_data
	jsr		delay_300
	tfr		a,b
	cmpb	#0x00
	beq		5$
	cmpb	#0xf6
	beq		3$
	cmpb	#0xa4
	beq		3$
	cmpb	#0x52
	bne		4$
3$:
	subb	#0x40
4$:
	subb	#0x09
	bra 	2$
5$:
	ldb		#watchdog_data
	rts


set_LED:
	andb	#0x0f
	tfr		b,a
	lsla
	lsla
	lsla
	lsla
	lsla
	lsla
	sta		rom_pia_datab			;set bits A & B
	tfr		b,a
	anda	#0x08
	ora		#0x34					;select Cx2 as output
	sta		rom_pia_ctrla			;set bit D
	tfr		b,a
	lsla
	anda	#0x08
	ora		#0x34
	sta		rom_pia_ctrlb			;set bit C
	ldb		#watchdog_data
	rts


PSTRNG:			;print string in X terminated with null
$1:
	lda		,x+
	beq		$2
	pshs 	x
	jsr		pchar
	puls	x
	bra		$1
$2:
	rts


PHEX:			;print value in A in hex
	sta		tmp
	rora		
	rora		
	rora		
	rora		
	anda	#0x0f
	cmpa	#0x0a
	blt		$1a
	adda	#0x07
$1a:
	adda	#0x30
	jsr		pchar
	
	lda		tmp
	anda	#0x0f
	cmpa	#0x0a
	blt		$2a
	adda	#0x07
$2a:
	adda	#0x30
	jmp		pchar


pchar:			;a=ascii char to print, from space to underscore
	cmpa	#0x20
	blt		badchar
	cmpa	#0x60
	blt		goodchar

badchar:
	ldx		#badfont
	bra		blitchar
	
goodchar:
	ldx		#font
	suba	#0x20					;space is first char
	ldb		#0x0a
	mul								;index into font table; 2 bytes wide, 5 bytes tall = 10 bytes per char
	leax	d,x
	
blitchar:
	stx		blitter_source
	lda		#0xff					;replace the current contents
	sta		blitter_mask
	ldx		curpos
	stx		blitter_dest
	ldx		#0x0601					;width and height XOR 0x04 - 2 x 5 bytes = 4 x 5 pixels, 3x5 active w/spaces
	stx		blitter_w_h
	lda		#0x1a					;start blit solid, foreground, linear to screen layout
	sta		start_blitter
	ldx 	curpos
	leax	0x0300,x				;move cursor right 1 char
	stx		curpos
	rts


	;data
	
	;color palettes

mypalette:							;normal palette
	.byte 0x00,0xff,0x07,0x05,0x38,0xc7,0xc0,0x80,0xa4,0xe8,0x14,0x90,0x3f,0x51,0x0a,0x67
	;		k	w	R	 dk.r   G  purp blue dkbl gray skbl brn  slt   yel dkslt dkbrn salmon

dimpalette:							;darker colors
	.byte 0x00,0xa4,0x04,0x03,0x20,0x84,0x80,0x40,0x52,0x98,0x0a,0x48,0x24,0x08,0x01,0x14

palette2:							;other colors
	.byte 0x00,0x02,0x10,0x40,0x04,0x20,0x80,0xff,0xf6,0xa4,0x52,0x3f,0xc7,0xf8,0xa7,0xbc

allred:
	.byte 0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07
	
redbkg:
	.byte 0x07,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff

bluebkg:
	.byte 0xc0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff

greenbkg:
	.byte 0x38,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff

purplebkg:
	.byte 0xc7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff

graybkg:
	.byte 0xa4,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff

allgreen:
	.byte 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38

allblack:
	.byte 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00

allwhite:
	.byte 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff

allblue:
	.byte 0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0,0xc0

allpurple:
	.byte 0xc7,0xc7,0xc7,0xc7,0xc7,0xc7,0xc7,0xc7,0xc7,0xc7,0xc7,0xc7,0xc7,0xc7,0xc7,0xc7


font:
	.byte 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00	;space
	.byte 0x01,0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x01,0x00	;!
	.byte 0x10,0x10,0x10,0x10,0x00,0x00,0x00,0x00,0x00,0x00	;"
	.byte 0x10,0x10,0x11,0x10,0x10,0x10,0x11,0x10,0x10,0x10	;#
	.byte 0x11,0x10,0x11,0x00,0x11,0x10,0x01,0x10,0x11,0x10	;$
	.byte 0x10,0x00,0x00,0x10,0x01,0x00,0x10,0x00,0x00,0x10	;%
	.byte 0x01,0x10,0x10,0x00,0x01,0x00,0x10,0x10,0x01,0x00	;&
	.byte 0x01,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00	;'
	.byte 0x00,0x10,0x01,0x00,0x01,0x00,0x01,0x00,0x00,0x10	;(
	.byte 0x10,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x10,0x00	;)
	.byte 0x01,0x00,0x10,0x10,0x01,0x00,0x10,0x10,0x00,0x00	;*
	.byte 0x00,0x00,0x01,0x00,0x11,0x10,0x01,0x00,0x00,0x00	;+
	.byte 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x10,0x00	;,
	.byte 0x00,0x00,0x00,0x00,0x11,0x10,0x00,0x00,0x00,0x00	;-
	.byte 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00	;.
	.byte 0x00,0x10,0x00,0x10,0x01,0x00,0x10,0x00,0x10,0x00	;/

	.byte 0x11,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x11,0x10	;0
	.byte 0x01,0x00,0x11,0x00,0x01,0x00,0x01,0x00,0x11,0x10
	.byte 0x11,0x10,0x00,0x10,0x11,0x10,0x10,0x00,0x11,0x10
	.byte 0x11,0x10,0x00,0x10,0x11,0x10,0x00,0x10,0x11,0x10 
	.byte 0x10,0x10,0x10,0x10,0x11,0x10,0x00,0x10,0x00,0x10
	.byte 0x11,0x10,0x10,0x00,0x11,0x10,0x00,0x10,0x11,0x10	;5
	.byte 0x11,0x10,0x10,0x00,0x11,0x10,0x10,0x10,0x11,0x10
	.byte 0x11,0x10,0x00,0x10,0x01,0x00,0x01,0x00,0x01,0x00 
	.byte 0x11,0x10,0x10,0x10,0x11,0x10,0x10,0x10,0x11,0x10
	.byte 0x11,0x10,0x10,0x10,0x11,0x10,0x00,0x10,0x00,0x10	;9
	
	.byte 0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00	;:
	.byte 0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x10,0x00	;;
	.byte 0x00,0x10,0x01,0x00,0x10,0x00,0x01,0x00,0x00,0x10	;<
	.byte 0x00,0x00,0x11,0x10,0x00,0x00,0x11,0x10,0x00,0x00	;=
	.byte 0x10,0x00,0x01,0x00,0x00,0x10,0x01,0x00,0x10,0x00	;>
	.byte 0x01,0x00,0x10,0x10,0x00,0x10,0x01,0x00,0x01,0x00	;?
	.byte 0x01,0x00,0x10,0x10,0x11,0x00,0x10,0x00,0x01,0x10	;@
	
	.byte 0x11,0x10,0x10,0x10,0x11,0x10,0x10,0x10,0x10,0x10 ;A
	.byte 0x11,0x10,0x10,0x10,0x11,0x00,0x10,0x10,0x11,0x10
	.byte 0x11,0x10,0x10,0x00,0x10,0x00,0x10,0x00,0x11,0x10
	.byte 0x11,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x11,0x00
	.byte 0x11,0x10,0x10,0x00,0x11,0x00,0x10,0x00,0x11,0x10 
	.byte 0x11,0x10,0x10,0x00,0x11,0x00,0x10,0x00,0x10,0x00 
	.byte 0x11,0x10,0x10,0x00,0x10,0x10,0x10,0x10,0x11,0x10
	.byte 0x10,0x10,0x10,0x10,0x11,0x10,0x10,0x10,0x10,0x10
	.byte 0x11,0x10,0x01,0x00,0x01,0x00,0x01,0x00,0x11,0x10
	.byte 0x00,0x10,0x00,0x10,0x00,0x10,0x10,0x10,0x11,0x10
	.byte 0x10,0x10,0x10,0x10,0x11,0x00,0x10,0x10,0x10,0x10
	.byte 0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x11,0x10	;L
	.byte 0x11,0x10,0x11,0x10,0x11,0x10,0x10,0x10,0x10,0x10	;my skinny M
	.byte 0x11,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10
	.byte 0x11,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x11,0x10	;O same as 0
	.byte 0x11,0x10,0x10,0x10,0x11,0x10,0x10,0x00,0x10,0x00
	.byte 0x11,0x10,0x10,0x10,0x10,0x10,0x01,0x00,0x00,0x10
	.byte 0x11,0x10,0x10,0x10,0x11,0x00,0x10,0x10,0x10,0x10
	.byte 0x11,0x10,0x10,0x00,0x11,0x10,0x00,0x10,0x11,0x10	;S same as 5
	.byte 0x11,0x10,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00
	.byte 0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x11,0x10
	.byte 0x10,0x10,0x10,0x10,0x10,0x10,0x01,0x00,0x01,0x00 
	.byte 0x10,0x10,0x10,0x10,0x11,0x10,0x11,0x10,0x11,0x10 ;my skinny W	 
	.byte 0x10,0x10,0x10,0x10,0x01,0x00,0x10,0x10,0x10,0x10
	.byte 0x10,0x10,0x10,0x10,0x11,0x10,0x01,0x00,0x01,0x00
	.byte 0x11,0x10,0x00,0x10,0x01,0x00,0x10,0x00,0x11,0x10	;Z

	.byte 0x11,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x11,0x00	;[
	.byte 0x10,0x00,0x10,0x00,0x01,0x00,0x00,0x10,0x00,0x10	;\
	.byte 0x01,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x01,0x10	;]
	.byte 0x01,0x00,0x10,0x10,0x00,0x00,0x00,0x00,0x00,0x00	;^
	.byte 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x10	;_
	
badfont:
	.byte 0x11,0x10,0x00,0x00,0x11,0x10,0x00,0x00,0x11,0x10	;lines
	
blitdata:
	.byte 00,01,02,03,04,05,06,07,08,09,10,11,12,13,14,15
	.byte 16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31
	.byte 32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47
	.byte 48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63
	.byte 64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79
	.byte 80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95
	.byte 96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111
	.byte 112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127
	.byte 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143
	.byte 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159
	.byte 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175
	.byte 176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191
	.byte 192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207
	.byte 208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223
	.byte 224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239
	.byte 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255
	
	
	.area	_CODEE800				;this area will link at E800
	
;  MC6809 CPU Emulation Validation
;
; Tested on an SGS Thomson EF6809P Processor
;
; W. Schwotzer                     20.07.2003
;

	EOT =   0x00		;end of text

test6809:
	ldb		#0x00
	stb		failed_6809

; Test Addressing modes
	ldb		#watchdog_data
	stb		watchdog
       JSR  TAD1
	ldb		#watchdog_data
	stb		watchdog
       JSR  TAD2
	ldb		#watchdog_data
	stb		watchdog
       JSR  TAD3
	ldb		#watchdog_data
	stb		watchdog
       JSR  TAD4
	ldb		#watchdog_data
	stb		watchdog
       JSR  TAD5
	ldb		#watchdog_data
	stb		watchdog
       JSR  TAD6
	ldb		#watchdog_data
	stb		watchdog
       JSR  TAD7
	ldb		#watchdog_data
	stb		watchdog
       JSR  TAD8
	ldb		#watchdog_data
	stb		watchdog
       JSR  TAD9
	ldb		#watchdog_data
	stb		watchdog
       JSR  TADA
	ldb		#watchdog_data
	stb		watchdog
       JSR  TADB
	ldb		#watchdog_data
	stb		watchdog
       JSR  TADI1
	ldb		#watchdog_data
	stb		watchdog
       JSR  TADI3
	ldb		#watchdog_data
	stb		watchdog
       JSR  TADI5
	ldb		#watchdog_data
	stb		watchdog
       JSR  TADI6
	ldb		#watchdog_data
	stb		watchdog
       JSR  TADI7
	ldb		#watchdog_data
	stb		watchdog
       JSR  TADI8
	ldb		#watchdog_data
	stb		watchdog
       JSR  TADI9
	ldb		#watchdog_data
	stb		watchdog
       JSR  TADIA
	ldb		#watchdog_data
	stb		watchdog
       JSR  TADIB
	ldb		#watchdog_data
	stb		watchdog
       JSR  TADIC

; Test Instructions
	ldb		#watchdog_data
	stb		watchdog
       JSR   TNEG
	ldb		#watchdog_data
	stb		watchdog
       JSR   TCOM
	ldb		#watchdog_data
	stb		watchdog
       JSR   TDEC
	ldb		#watchdog_data
	stb		watchdog
       JSR   TINC
	ldb		#watchdog_data
	stb		watchdog
       JSR   TCLR
	ldb		#watchdog_data
	stb		watchdog
       JSR   TADD
	ldb		#watchdog_data
	stb		watchdog
       JSR   TADDD
	ldb		#watchdog_data
	stb		watchdog
       JSR   TADC
	ldb		#watchdog_data
	stb		watchdog
       JSR   TMUL
	ldb		#watchdog_data
	stb		watchdog
       JSR   TSEX
	ldb		#watchdog_data
	stb		watchdog
       JSR   TSUB
	ldb		#watchdog_data
	stb		watchdog
       JSR   TSUBD
	ldb		#watchdog_data
	stb		watchdog
       JSR   TSBC
	ldb		#watchdog_data
	stb		watchdog
       JSR   TDAA
	ldb		#watchdog_data
	stb		watchdog
       JSR   TCMP
	ldb		#watchdog_data
	stb		watchdog
       JSR   TCMPD
	ldb		#watchdog_data
	stb		watchdog
       JSR   TTST
	ldb		#watchdog_data
	stb		watchdog
       JSR   TBIT
	ldb		#watchdog_data
	stb		watchdog
       JSR   TLSR
	ldb		#watchdog_data
	stb		watchdog
       JSR   TLSL
	ldb		#watchdog_data
	stb		watchdog
       JSR   TASR
	ldb		#watchdog_data
	stb		watchdog
       JSR   TROL
	ldb		#watchdog_data
	stb		watchdog
       JSR   TROR
	ldb		#watchdog_data
	stb		watchdog
       JSR   TLD
	ldb		#watchdog_data
	stb		watchdog
       JSR   TST
	ldb		#watchdog_data
	stb		watchdog
       JSR   TLDD
	ldb		#watchdog_data
	stb		watchdog
       JSR   TSTD
	ldb		#watchdog_data
	stb		watchdog
       JSR   TLEA
	ldb		#watchdog_data
	stb		watchdog
       JSR   TTFR
	ldb		#watchdog_data
	stb		watchdog
       JSR   TEXG
	ldb		#watchdog_data
	stb		watchdog
       
       rts
;end of 6809 test suite


;**************************************************
; Test MUL
;**************************************************
TMUL:   LDU   #LMUL
       LDX   #TBMUL
TMUL1:  LDD   ,X++
       MUL
       TFR   CC,DP
       CMPD  ,X++
       LBNE  OUTERR
       TFR   DP,B
       ANDB  #0x05   ; Only check Bits ZC
       CMPB  ,X+
       LBNE  OUTERR
       CMPX  #LMUL
       LBNE  TMUL1
       RTS

TBMUL:  .FDB   0x0000,0x0000
       .FCB   0x04
       .FDB   0x8080,0x4000
       .FCB   0x00
       .FDB   0x01FF,0x00FF
       .FCB   0x01
       .FDB   0xFF01,0x00FF
       .FCB   0x01
       .FDB   0x7F81,0x3FFF
       .FCB   0x01
       .FDB   0x817F,0x3FFF
       .FCB   0x01
       .FDB   0xC040,0x3000
       .FCB   0x00
       .FDB   0x40C0,0x3000
       .FCB   0x00
       .FDB   0xFFFF,0xFE01
       .FCB   0x00
       .FDB   0x7F7F,0x3F01
       .FCB   0x00
       .FDB   0x0101,0x0001
       .FCB   0x00
LMUL:   .FCC   'MUL'
		.FCB	EOT

;**************************************************
; Test SEX
;**************************************************
TSEX:   LDU   #LSEX
       LDX   #TBSEX
TSEX1:  LDB   ,X+
       SEX
       TFR   CC,DP
       CMPD  ,X++
       LBNE  OUTERR
       TFR   DP,B
       ANDB  #0x0C   ; Only check Bits NZ
       CMPB  ,X+
       LBNE  OUTERR
       CMPX  #LSEX
       LBNE  TSEX1
       RTS


TBSEX:  .FCB   0x00
       .FDB   0x0000
       .FCB   0x04
       .FCB   0x01
       .FDB   0x0001
       .FCB   0x00
       .FCB   0x7F
       .FDB   0x007F
       .FCB   0x00
       .FCB   0x80
       .FDB   0xFF80
       .FCB   0x08
       .FCB   0xFF
       .FDB   0xFFFF
       .FCB   0x08
LSEX:  .FCC   'SEX'
		.FCB	EOT


;**************************************************
; Test TST
;**************************************************
TTST:   LDU   #LTST
       LDX   #TBTST
TTST1:  LDA   ,X+
       TSTA
       TFR   CC,B
       ANDB  #0x0E   ; Only check Bits NZV
       CMPB  ,X+
       LBNE  OUTERR
       CMPX  #LTST
       LBNE  TTST1
       RTS

TBTST:  .FCB   0x00,0x04
       .FCB   0x80,0x08
       .FCB   0x01,0x00
       .FCB   0xFF,0x08
       .FCB   0x7F,0x00
       .FCB   0x81,0x08
       .FCB   0xC0,0x08
       .FCB   0x40,0x00
LTST:   .FCC   'TST'
		.FCB	EOT


;**************************************************
; Test LD
;**************************************************
TLD:    LDU   #LLD
       LDX   #TBTST
TLD1:   LDA   ,X+
       TFR   CC,B
       ANDB  #0x0E   ; Only check Bits NZV
       CMPB  ,X+
       LBNE  OUTERR
       CMPX  #LTST
       LBNE  TLD1
       RTS
LLD:    .FCC   'LD'
		.FCB	EOT


;**************************************************
; Test ST
;**************************************************
TST:    LDU   #LST
       LDX   #TBTST
TST1:   LDA   ,X+
       STA   EXTREG
       TFR   CC,B
       ANDB  #0x0E   ; Only check Bits NZV
       CMPB  ,X+
       LBNE  OUTERR
       CMPX  #LTST
       LBNE  TST1
       RTS
LST:    .FCC   'ST'
		.FCB	EOT


;**************************************************
; Test LDD
;**************************************************
TLDD:   LDU   #LLDD
       LDX   #TBLDD
TLDD1:  LDD   ,X++
       TFR   CC,B
       ANDB  #0x0E   ; Only check Bits NZV
       CMPB  ,X+
       LBNE  OUTERR
       CMPX  #LLDD
       LBNE  TLDD1
       RTS
TBLDD:  .FDB   0x0000
       .FCB   0x04
       .FDB   0x8000
       .FCB   0x08
       .FDB   0x0001
       .FCB   0x00
       .FDB   0xFFFF
       .FCB   0x08
       .FDB   0x7FFF
       .FCB   0x00
       .FDB   0x8001
       .FCB   0x08
       .FDB   0xC000
       .FCB   0x08
       .FDB   0x4000
       .FCB   0x00
LLDD:   .FCC   'LDD'
		.FCB	EOT


;**************************************************
; Test STD
;**************************************************
TSTD:   LDU   #LSTD
       LDX   #TBLDD
TSTD1:  LDD   ,X++
       STD   EXTREG
       TFR   CC,B
       ANDB  #0x0E   ; Only check Bits NZV
       CMPB  ,X+
       LBNE  OUTERR
       CMPX  #LLDD
       LBNE  TSTD1
       RTS
LSTD:   .FCC   'STD'
		.FCB	EOT


;**************************************************
; Test LEA
;**************************************************
TLEA:   LDU   #LLEA
       LDX   #TBLEA
TLEA1:  LDY   ,X++
       LEAY  ,Y
       TFR   CC,B
       ANDB  #0x04   ; Only check Bit Z
       CMPB  ,X+
       LBNE  OUTERR
       CMPX  #LLEA
       LBNE  TLEA1
       RTS

TBLEA:  .FDB   0x0000
       .FCB   0x04
       .FDB   0x0001
       .FCB   0x00
       .FDB   0xFFFF
       .FCB   0x00
       .FDB   0x7FFF
       .FCB   0x00
       .FDB   0x8000
       .FCB   0x00
       .FDB   0x8001
       .FCB   0x00
LLEA:   .FCC   'LEA'
		.FCB	EOT


;**************************************************
; Test BIT
;**************************************************
TBIT:   LDU   #LBIT
       LDX   #TBBIT
TBIT1:  LDA   ,X+
       BITA  ,X+
       TFR   CC,B
       ANDB  #0x0E   ; Only check Bits NZV
       CMPB  ,X+
       LBNE  OUTERR
       CMPX  #LBIT
       LBNE  TBIT1
       RTS

TBBIT:  .FCB   0x00,0x00,0x04
       .FCB   0xAA,0x55,0x04
       .FCB   0xAA,0xAA,0x08
       .FCB   0x55,0x55,0x00
       .FCB   0xFF,0xFF,0x08
       .FCB   0xFF,0x80,0x08
       .FCB   0x81,0x80,0x08
       .FCB   0xFF,0x7F,0x00
       .FCB   0xFF,0x01,0x00
       .FCB   0xF0,0x0F,0x04
LBIT:   .FCC   'BIT'
		.FCB	EOT



;**************************************************
; Test DAA
;**************************************************
TDAA:  LDU   #LDAA
       LDX   #TBDAA
TDAA1:  LDA   ,X+
       TFR   CC,B
       ANDB  ,X+
       ORB   ,X+
       TFR   B,CC
       DAA
       TFR   CC,B
       CMPA  ,X+
       LBNE  OUTERR
       ANDB  #0x0D   ; Only check Bits NZC
       CMPB  ,X+
       LBNE  OUTERR
       CMPX  #LDAA
       LBNE  TDAA1
       RTS

TBDAA:
; Carry: 0, Halfcarry: 0
       .byte   0x00,0xDE,0x00,0x00,0x04
       .byte   0x01,0xDE,0x00,0x01,0x00
       .byte   0x09,0xDE,0x00,0x09,0x00
       .byte   0x0A,0xDE,0x00,0x10,0x00
       .byte   0x0F,0xDE,0x00,0x15,0x00
       .byte   0x10,0xDE,0x00,0x10,0x00
       .byte   0x4A,0xDE,0x00,0x50,0x00
       .byte   0x79,0xDE,0x00,0x79,0x00
       .byte   0x7A,0xDE,0x00,0x80,0x08
       .byte   0x7F,0xDE,0x00,0x85,0x08
       .byte   0x81,0xDE,0x00,0x81,0x08
       .byte   0x99,0xDE,0x00,0x99,0x08
       .byte   0xA0,0xDE,0x00,0x00,0x05
       .byte   0xBF,0xDE,0x00,0x25,0x01
       .byte   0xF0,0xDE,0x00,0x50,0x01
       .byte   0xFF,0xDE,0x00,0x65,0x01
; Carry: 1, Halfcarry: 0
       .byte   0x00,0xDF,0x01,0x60,0x01
       .byte   0x01,0xDF,0x01,0x61,0x01
       .byte   0x09,0xDF,0x01,0x69,0x01
       .byte   0x0A,0xDF,0x01,0x70,0x01
       .byte   0x0F,0xDF,0x01,0x75,0x01
       .byte   0x10,0xDF,0x01,0x70,0x01
       .byte   0x4A,0xDF,0x01,0xB0,0x09
       .byte   0x79,0xDF,0x01,0xD9,0x09
       .byte   0x7A,0xDF,0x01,0xE0,0x09
       .byte   0x7F,0xDF,0x01,0xe5,0x09
       .byte   0x81,0xDF,0x01,0xE1,0x09
       .byte   0x99,0xDF,0x01,0xF9,0x09
       .byte   0xA0,0xDF,0x01,0x00,0x05
       .byte   0xBF,0xDF,0x01,0x25,0x01
       .byte   0xF0,0xDF,0x01,0x50,0x01
       .byte   0xFF,0xDF,0x01,0x65,0x01
; Carry: 0, Halfcarry: 1
       .byte   0x00,0xFE,0x20,0x06,0x00
       .byte   0x01,0xFE,0x20,0x07,0x00
       .byte   0x09,0xFE,0x20,0x0F,0x00
       .byte   0x0A,0xFE,0x20,0x10,0x00
       .byte   0x0F,0xFE,0x20,0x15,0x00
       .byte   0x10,0xFE,0x20,0x16,0x00
       .byte   0x4A,0xFE,0x20,0x50,0x00
       .byte   0x79,0xFE,0x20,0x7F,0x00
       .byte   0x7A,0xFE,0x20,0x80,0x08
       .byte   0x7F,0xFE,0x20,0x85,0x08
       .byte   0x81,0xFE,0x20,0x87,0x08
       .byte   0x99,0xFE,0x20,0x9F,0x08
       .byte   0xA0,0xFE,0x20,0x06,0x01
       .byte   0xBF,0xFE,0x20,0x25,0x01
       .byte   0xF0,0xFE,0x20,0x56,0x01
       .byte   0xFF,0xFE,0x20,0x65,0x01
; Carry: 1, Halfcarry: 1
       .byte   0x00,0xFF,0x21,0x66,0x01
       .byte   0x01,0xFF,0x21,0x67,0x01
       .byte   0x09,0xFF,0x21,0x6F,0x01
       .byte   0x0A,0xFF,0x21,0x70,0x01
       .byte   0x0F,0xFF,0x21,0x75,0x01
       .byte   0x10,0xFF,0x21,0x76,0x01
       .byte   0x4A,0xFF,0x21,0xB0,0x09
       .byte   0x79,0xFF,0x21,0xDF,0x09
       .byte   0x7A,0xFF,0x21,0xE0,0x09
       .byte   0x7F,0xFF,0x21,0xE5,0x09
       .byte   0x81,0xFF,0x21,0xE7,0x09
       .byte   0x99,0xFF,0x21,0xFF,0x09
       .byte   0xA0,0xFF,0x21,0x06,0x01
       .byte   0xBF,0xFF,0x21,0x25,0x01
       .byte   0xF0,0xFF,0x21,0x56,0x01
       .byte   0xFF,0xFF,0x21,0x65,0x01
LDAA:  .FCC   'DAA'
		.byte  EOT

;*************************************************
; Test NEG
;*************************************************
TNEG:   LDU   #LNEG
       LDX   #TBNEG
TNEG1:  LDA   ,X+
       NEGA
       TFR   CC,B
       CMPA  ,X+
       LBNE  OUTERR
       ANDB  #0x0F   ; Only check Bits NZVC
       CMPB  ,X+
       LBNE  OUTERR
       CMPX  #LNEG
       LBNE  TNEG1
       RTS

TBNEG:  .FCB   0x00,0x00,0x04
       .FCB   0x80,0x80,0x0B
       .FCB   0x01,0xFF,0x09
       .FCB   0xFF,0x01,0x01
       .FCB   0x7F,0x81,0x09
       .FCB   0x81,0x7F,0x01
       .FCB   0xC0,0x40,0x01
       .FCB   0x40,0xC0,0x09
LNEG:   .FCC   'NEG'
       .FCB   EOT

;**************************************************
; Test COM
;**************************************************
TCOM:   LDU   #LCOM
       LDX   #TBCOM
TCOM1:  LDA   ,X+
       COMA
       TFR   CC,B
       CMPA  ,X+
       LBNE  OUTERR
       ANDB  #0x0F   ; Only check Bits NZVC
       CMPB  ,X+
       LBNE  OUTERR
       CMPX  #LCOM
       BNE   TCOM1
       RTS


TBCOM:  .FCB   0x00,0xFF,0x09
       .FCB   0xFF,0x00,0x05
       .FCB   0xF0,0x0F,0x01
       .FCB   0x0F,0xF0,0x09
       .FCB   0x55,0xAA,0x09
       .FCB   0xAA,0x55,0x01
       .FCB   0x01,0xFE,0x09
       .FCB   0xFE,0x01,0x01
       .FCB   0x80,0x7F,0x01
       .FCB   0x7F,0x80,0x09
LCOM:   .FCC   'COM'
       .FCB   EOT

;**************************************************
; Test LSR
;**************************************************
TLSR:   LDU   #LLSR
       LDX   #TBLSR
TLSR1:  LDA   ,X+
       LSRA
       TFR   CC,B
       CMPA  ,X+
       LBNE  OUTERR
       ANDB  #0x0F   ; Only check Bits NZVC
       CMPB  ,X+
       LBNE  OUTERR
       CMPX  #LLSR
       BNE   TLSR1
       RTS


TBLSR:  .FCB   0x00,0x00,0x04
       .FCB   0xFF,0x7F,0x01
       .FCB   0x7F,0x3F,0x01
       .FCB   0x3F,0x1F,0x01
       .FCB   0x1F,0x0F,0x01
       .FCB   0x0F,0x07,0x01
       .FCB   0x07,0x03,0x01
       .FCB   0x03,0x01,0x01
       .FCB   0x01,0x00,0x05
       .FCB   0x55,0x2A,0x01
       .FCB   0xAA,0x55,0x00
       .FCB   0x80,0x40,0x00
       .FCB   0x10,0x08,0x00
       .FCB   0xC0,0x60,0x00
       .FCB   0xE0,0x70,0x00
       .FCB   0xF0,0x78,0x00
       .FCB   0xF8,0x7C,0x00
       .FCB   0xFC,0x7E,0x00
       .FCB   0xFE,0x7F,0x00
LLSR:   .FCC   'LSR'
       .FCB   EOT

;**************************************************
; Test LSL
;**************************************************
TLSL:   LDU   #LLSL
       LDX   #TBLSL
TLSL1:  LDA   ,X+
       LSLA
       TFR   CC,B
       CMPA  ,X+
       LBNE  OUTERR
       ANDB  #0x0F   ; Only check Bits NZVC
       CMPB  ,X+
;       LBNE  OUTERR		;!!! was commented in orig code
       CMPX  #LLSL
       BNE   TLSL1
       RTS


TBLSL:  .FCB   0x00,0x00,0x04
       .FCB   0xFF,0xFE,0x01
       .FCB   0x7F,0xFE,0x01
       .FCB   0x3F,0x7E,0x01
       .FCB   0x1F,0x3E,0x00
       .FCB   0x0F,0x1E,0x00
       .FCB   0x07,0x0E,0x00
       .FCB   0x03,0x06,0x00
       .FCB   0x01,0x02,0x00
       .FCB   0x55,0xAA,0x00
       .FCB   0xAA,0x54,0x00
       .FCB   0x80,0x00,0x01
       .FCB   0x10,0x20,0x01
       .FCB   0xC0,0x80,0x01
       .FCB   0xE0,0xC0,0x01
       .FCB   0xF0,0xE0,0x01
       .FCB   0xF8,0xF0,0x01
       .FCB   0xFC,0xF8,0x01
       .FCB   0xFE,0xFC,0x01
LLSL:   .FCC   'LSL'
       .FCB   EOT

;**************************************************
; Test ASR
;**************************************************
TASR:   LDU   #LASR
       LDX   #TBASR
TASR1:  LDA   ,X+
       ASRA
       TFR   CC,B
       CMPA  ,X+
       LBNE  OUTERR
       ANDB  #0x0D   ; Only check Bits NZC
       CMPB  ,X+
       LBNE  OUTERR
       CMPX  #LASR
       BNE   TASR1
       RTS


TBASR:  .FCB   0x00,0x00,0x04
       .FCB   0xFF,0xFF,0x09
       .FCB   0x7F,0x3F,0x01
       .FCB   0x3F,0x1F,0x01
       .FCB   0x1F,0x0F,0x01
       .FCB   0x0F,0x07,0x01
       .FCB   0x07,0x03,0x01
       .FCB   0x03,0x01,0x01
       .FCB   0x01,0x00,0x05
       .FCB   0x55,0x2A,0x01
       .FCB   0xAA,0xD5,0x08
       .FCB   0x80,0xC0,0x08
       .FCB   0x10,0x08,0x00
       .FCB   0xC0,0xE0,0x08
       .FCB   0xE0,0xF0,0x08
       .FCB   0xF0,0xF8,0x08
       .FCB   0xF8,0xFC,0x08
       .FCB   0xFC,0xFE,0x08
       .FCB   0xFE,0xFF,0x08
LASR:   .FCC   'ASR'
       .FCB   EOT

;**************************************************
; Test ROR
;**************************************************
TROR:   LDU   #LROR
       LDX   #TBROR
TROR1:  LDA   ,X+
       TFR   CC,B
       ANDB  ,X+
       ORB   ,X+
       TFR   B,CC
       RORA
       TFR   CC,B
       CMPA  ,X+
       LBNE  OUTERR
       ANDB  #0x0D   ; Only check Bits NZC
       CMPB  ,X+
       LBNE  OUTERR
       CMPX  #LROR
       BNE   TROR1
       RTS

TBROR:  .FCB   0x00,0xFE,0x00,0x00,0x04
       .FCB   0x01,0xFE,0x00,0x00,0x05
       .FCB   0x0F,0xFE,0x00,0x07,0x01
       .FCB   0x10,0xFE,0x00,0x08,0x00
       .FCB   0x7F,0xFE,0x00,0x3F,0x01
       .FCB   0x80,0xFE,0x00,0x40,0x00
       .FCB   0xFE,0xFE,0x00,0x7F,0x00
       .FCB   0xFF,0xFE,0x00,0x7F,0x01
       .FCB   0x00,0xFF,0x01,0x80,0x08
       .FCB   0x01,0xFF,0x01,0x80,0x09
       .FCB   0x0F,0xFF,0x01,0x87,0x09
       .FCB   0x10,0xFF,0x01,0x88,0x08
       .FCB   0x7F,0xFF,0x01,0xBF,0x09
       .FCB   0x80,0xFF,0x01,0xC0,0x08
       .FCB   0xFE,0xFF,0x01,0xFF,0x08
       .FCB   0xFF,0xFF,0x01,0xFF,0x09
LROR:   .FCC   'ROR'
       .FCB   EOT

;**************************************************
; Test ROL
;**************************************************
TROL:   LDU   #LROL
       LDX   #TBROL
TROL1:  LDA   ,X+
       TFR   CC,B
       ANDB  ,X+
       ORB   ,X+
       TFR   B,CC
       ROLA
       TFR   CC,B
       CMPA  ,X+
       LBNE  OUTERR
       ANDB  #0x0D   ; Only check Bits NZC
       CMPB  ,X+
;       LBNE  OUTERR		;!!! was commented in orig code
       CMPX  #LROL
       BNE   TROL1
       RTS

TBROL:  .FCB   0x00,0xFE,0x00,0x00,0x04
       .FCB   0x01,0xFE,0x00,0x02,0x00
       .FCB   0x0F,0xFE,0x00,0x1E,0x00
       .FCB   0x08,0xFE,0x00,0x10,0x00
       .FCB   0x7F,0xFE,0x00,0xFE,0x08
       .FCB   0x80,0xFE,0x00,0x00,0x05
       .FCB   0xFE,0xFE,0x00,0xFC,0x09
       .FCB   0xFF,0xFE,0x00,0xFE,0x09
       .FCB   0x00,0xFF,0x01,0x01,0x00
       .FCB   0x01,0xFF,0x01,0x03,0x00
       .FCB   0x0F,0xFF,0x01,0x1F,0x00
       .FCB   0x08,0xFF,0x01,0x11,0x00
       .FCB   0x7F,0xFF,0x01,0xFF,0x08
       .FCB   0x80,0xFF,0x01,0x01,0x01
       .FCB   0xFE,0xFF,0x01,0xFD,0x09
       .FCB   0xFF,0xFF,0x01,0xFF,0x09
LROL:   .FCC   'ROL'
       .FCB   EOT

;**************************************************
; Test DEC
;**************************************************
TDEC:   LDU   #LDEC
       LDX   #TBDEC
TDEC1:  LDA   ,X+
       DECA
       TFR   CC,B
       CMPA  ,X+
       LBNE  OUTERR
       ANDB  #0x0E   ; Only check Bits NZV
       CMPB  ,X+
       LBNE  OUTERR
       CMPX  #LDEC
       BNE   TDEC1
       RTS

TBDEC:  .FCB   0x01,0x00,0x04
       .FCB   0x00,0xFF,0x08
       .FCB   0xFF,0xFE,0x08
       .FCB   0x80,0x7F,0x02
       .FCB   0x7F,0x7E,0x00
       .FCB   0x10,0x0F,0x00
       .FCB   0x0F,0x0E,0x00
LDEC:   .FCC   'DEC'
       .FCB   EOT

;**************************************************
; Test INC
;**************************************************
TINC:   LDU   #LINC
       LDX   #TBINC
TINC1:  LDA   ,X+
       INCA
       TFR   CC,B
       CMPA  ,X+
       LBNE  OUTERR
       ANDB  #0x0E   ; Only check Bits NZV
       CMPB  ,X+
       LBNE  OUTERR
       CMPX  #LINC
       BNE   TINC1
       RTS

TBINC:  .FCB   0x00,0x01,0x00
       .FCB   0xFE,0xFF,0x08
       .FCB   0xFF,0x00,0x04
       .FCB   0x7F,0x80,0x0A
       .FCB   0x80,0x81,0x08
       .FCB   0x0F,0x10,0x00
       .FCB   0x10,0x11,0x00
LINC:   .FCC   'INC'
       .FCB   EOT


;**************************************************
; Test CLR
;**************************************************
TCLR:   LDU   #LCLR
       LDX   #TBCLR
TCLR1:  LDA   ,X+
       CLRA
       TFR   CC,B
       CMPA  ,X+
       LBNE  OUTERR
       ANDB  #0x0F   ; Only check Bits NZVC
       CMPB  ,X+
;       LBNE  OUTERR		;!!! was commented in orig code
       CMPX  #LCLR
       BNE   TCLR1
       RTS

TBCLR:  .FCB   0x01,0x00,0x04
       .FCB   0x00,0x00,0x04
       .FCB   0xFF,0x00,0x04
       .FCB   0x80,0x00,0x04
       .FCB   0x7F,0x00,0x04
       .FCB   0x10,0x00,0x04
       .FCB   0x0F,0x00,0x04
LCLR:   .FCC   'CLR'
       .FCB   EOT


;**************************************************
; Test ADDD
;**************************************************
TADDD:  LDU   #LADDD
       LDX   #TBADDD
TADDD1: LDD   ,X++
       ADDD  ,X++
       TFR   CC,DP
       CMPD  ,X++
       LBNE  OUTERR
       TFR   DP,A
       ANDA  #0x0F   ; Only check Bits NZVC
       CMPA  ,X+
       LBNE  OUTERR
       CMPX  #LADDD
       BNE   TADDD1
       RTS

TBADDD: .FDB   0x0000,0x0000,0x0000
       .FCB   0x04
       .FDB   0x0000,0x0001,0x0001
       .FCB   0x00
       .FDB   0x4000,0x4000,0x8000
       .FCB   0x0A
       .FDB   0x0000,0x8000,0x8000
       .FCB   0x08
       .FDB   0x8000,0x8000,0x0000
       .FCB   0x07
       .FDB   0x4000,0x8000,0xC000
       .FCB   0x08
       .FDB   0x7FFF,0x7FFF,0xFFFE
       .FCB   0x0A
       .FDB   0x7FFF,0x8000,0xFFFF
       .FCB   0x08
       .FDB   0x7FFF,0x0001,0x8000
       .FCB   0x0A
       .FDB   0x8000,0x0001,0x8001
       .FCB   0x08
       .FDB   0x4000,0xC000,0x0000
       .FCB   0x05
       .FDB   0x4000,0xC001,0x0001
       .FCB   0x01
       .FDB   0xFFFF,0xFFFF,0xFFFE
       .FCB   0x09
       .FDB   0x8001,0x8000,0x0001
       .FCB   0x03
LADDD:  .FCC   'ADDD'
       .FCB   EOT


;**************************************************
; Test ADD
;**************************************************
TADD:   LDU   #LADD
       LDX   #TBADD
TADD1:  LDB   ,X+
       ADDB  ,X+
       TFR   CC,A
       CMPB  ,X+
       LBNE  OUTERR
       ANDA  #0x2F   ; Only check Bits HNZVC
       CMPA  ,X+
       LBNE  OUTERR
       CMPX  #LADD
       BNE   TADD1
       RTS

TBADD:  .FCB   0x00,0x00,0x00,0x04
       .FCB   0x00,0x01,0x01,0x00
       .FCB   0x40,0x40,0x80,0x0A
       .FCB   0x00,0x80,0x80,0x08
       .FCB   0x80,0x80,0x00,0x07
       .FCB   0x40,0x80,0xC0,0x08
       .FCB   0x7F,0x7F,0xFE,0x2A
       .FCB   0x7F,0x80,0xFF,0x08
       .FCB   0x80,0x7F,0xFF,0x08
       .FCB   0x7F,0x01,0x80,0x2A
       .FCB   0x80,0x01,0x81,0x08
       .FCB   0x40,0xC0,0x00,0x05
       .FCB   0x40,0xC1,0x01,0x01
       .FCB   0xFF,0xFF,0xFE,0x29
       .FCB   0x81,0x80,0x01,0x03
LADD:   .FCC   'ADD'
       .FCB   EOT


;**************************************************
; Test ADC
;**************************************************
TADC:   LDU   #LADC
       LDX   #TBADC
TADC1:  LDA   ,X+
       TFR   CC,B
       ANDB  ,X+
       ORB   ,X+
       TFR   B,CC
       ADCA  ,X+
       TFR   CC,B
       CMPA  ,X+
       LBNE  OUTERR
       ANDB  #0x2F   ; Only check Bits HNZVC
       CMPB  ,X+
       LBNE  OUTERR
       CMPX  #LADC
       BNE   TADC1
       RTS

TBADC:  .FCB   0x00,0xFE,0x00,0x00,0x00,0x04
       .FCB   0x00,0xFE,0x00,0x01,0x01,0x00
       .FCB   0x40,0xFE,0x00,0x40,0x80,0x0A
       .FCB   0x00,0xFE,0x00,0x80,0x80,0x08
       .FCB   0x80,0xFE,0x00,0x80,0x00,0x07
       .FCB   0x40,0xFE,0x00,0x80,0xC0,0x08
       .FCB   0x7F,0xFE,0x00,0x7F,0xFE,0x2A
       .FCB   0x7F,0xFE,0x00,0x80,0xFF,0x08
       .FCB   0x80,0xFE,0x00,0x7F,0xFF,0x08
       .FCB   0x7F,0xFE,0x00,0x01,0x80,0x2A
       .FCB   0x80,0xFE,0x00,0x01,0x81,0x08
       .FCB   0x40,0xFE,0x00,0xC0,0x00,0x05
       .FCB   0x40,0xFE,0x00,0xC1,0x01,0x01
       .FCB   0xFF,0xFE,0x00,0xFF,0xFE,0x29
       .FCB   0x81,0xFE,0x00,0x80,0x01,0x03
       .FCB   0x00,0xFF,0x01,0x00,0x01,0x00
       .FCB   0x00,0xFF,0x01,0x01,0x02,0x00
       .FCB   0x40,0xFF,0x01,0x40,0x81,0x0A
       .FCB   0x00,0xFF,0x01,0x80,0x81,0x08
       .FCB   0x80,0xFF,0x01,0x80,0x01,0x03
       .FCB   0x40,0xFF,0x01,0x80,0xC1,0x08
       .FCB   0x7F,0xFF,0x01,0x7F,0xFF,0x2A
       .FCB   0x7F,0xFF,0x01,0x80,0x00,0x25
       .FCB   0x80,0xFF,0x01,0x7F,0x00,0x25
       .FCB   0x7F,0xFF,0x01,0x01,0x81,0x2A
       .FCB   0x80,0xFF,0x01,0x01,0x82,0x08
       .FCB   0x40,0xFF,0x01,0xC0,0x01,0x01
       .FCB   0x40,0xFF,0x01,0xC1,0x02,0x01
       .FCB   0xFF,0xFF,0x01,0xFF,0xFF,0x29
       .FCB   0x81,0xFF,0x01,0x80,0x02,0x03
LADC:   .FCC   'ADC'
       .FCB   EOT


;**************************************************
; Test CMP
;**************************************************
TCMP:   LDU   #LCMP
       LDX   #TBSUB
TCMP1:  LDB   ,X+
       CMPB  ,X+
       TFR   CC,A
       LEAX  1,X    ; Skip result Byte
       ANDA  #0x0F   ; Only check Bits NZVC
       CMPA  ,X+
       LBNE  OUTERR
       CMPX  #LSUB
       BNE   TCMP1
       RTS

LCMP:   .FCC   'CMP'
       .FCB   EOT

;**************************************************
; Test SUB
;**************************************************
TSUB:   LDU   #LSUB
       LDX   #TBSUB
TSUB1:  LDB   ,X+
       SUBB  ,X+
       TFR   CC,A
       CMPB  ,X+
       LBNE  OUTERR
       ANDA  #0x0F   ; Only check Bits NZVC
       CMPA  ,X+
       LBNE  OUTERR
       CMPX  #LSUB
       BNE   TSUB1
       RTS

TBSUB:  .FCB   0x00,0x00,0x00,0x04
       .FCB   0x00,0x01,0xFF,0x09
       .FCB   0x00,0x7F,0x81,0x09
       .FCB   0x00,0x80,0x80,0x0B
       .FCB   0x00,0xFF,0x01,0x01
       .FCB   0x01,0x00,0x01,0x00
       .FCB   0x01,0x7F,0x82,0x09
       .FCB   0x40,0x41,0xFF,0x09
       .FCB   0x40,0x80,0xC0,0x0B
       .FCB   0x40,0xC0,0x80,0x0B
       .FCB   0x40,0xC1,0x7F,0x01
       .FCB   0x7F,0x00,0x7F,0x00
       .FCB   0x7F,0x01,0x7E,0x00
       .FCB   0x7F,0x7E,0x01,0x00
       .FCB   0x7F,0x7F,0x00,0x04
       .FCB   0x7F,0x80,0xFF,0x0B
       .FCB   0x7F,0xFF,0x80,0x0B
       .FCB   0x80,0x01,0x7F,0x02
       .FCB   0x80,0x40,0x40,0x02
       .FCB   0x80,0x7F,0x01,0x02
       .FCB   0x80,0x80,0x00,0x04
       .FCB   0x80,0x81,0xFF,0x09
       .FCB   0x81,0x80,0x01,0x00
       .FCB   0xFF,0xFF,0x00,0x04
       .FCB   0xFF,0xFE,0x01,0x00
       .FCB   0xFF,0x00,0xFF,0x08
LSUB:   .FCC   'SUB'
       .FCB   EOT


;**************************************************
; Test SBC
;**************************************************
TSBC:   LDU   #LSBC
       LDX   #TBSBC
TSBC1:  LDA   ,X+
       TFR   CC,B
       ANDB  ,X+
       ORB   ,X+
       TFR   B,CC
       SBCA  ,X+
       TFR   CC,B
       CMPA  ,X+
       LBNE  OUTERR
       ANDB  #0x0F   ; Only check Bits NZVC
       CMPB  ,X+
       LBNE  OUTERR
       CMPX  #LSBC
       BNE   TSBC1
       RTS

TBSBC:  .FCB   0x00,0xFE,0x00,0x00,0x00,0x04
       .FCB   0x00,0xFE,0x00,0x01,0xFF,0x09
       .FCB   0x00,0xFE,0x00,0x7F,0x81,0x09
       .FCB   0x00,0xFE,0x00,0x80,0x80,0x0B
       .FCB   0x00,0xFE,0x00,0xFF,0x01,0x01
       .FCB   0x01,0xFE,0x00,0x00,0x01,0x00
       .FCB   0x01,0xFE,0x00,0x7F,0x82,0x09
       .FCB   0x40,0xFE,0x00,0x41,0xFF,0x09
       .FCB   0x40,0xFE,0x00,0x80,0xC0,0x0B
       .FCB   0x40,0xFE,0x00,0xC0,0x80,0x0B
       .FCB   0x40,0xFE,0x00,0xC1,0x7F,0x01
       .FCB   0x7F,0xFE,0x00,0x00,0x7F,0x00
       .FCB   0x7F,0xFE,0x00,0x01,0x7E,0x00
       .FCB   0x7F,0xFE,0x00,0x7E,0x01,0x00
       .FCB   0x7F,0xFE,0x00,0x7F,0x00,0x04
       .FCB   0x7F,0xFE,0x00,0x80,0xFF,0x0B
       .FCB   0x7F,0xFE,0x00,0xFF,0x80,0x0B
       .FCB   0x80,0xFE,0x00,0x01,0x7F,0x02
       .FCB   0x80,0xFE,0x00,0x40,0x40,0x02
       .FCB   0x80,0xFE,0x00,0x7F,0x01,0x02
       .FCB   0x80,0xFE,0x00,0x80,0x00,0x04
       .FCB   0x80,0xFE,0x00,0x81,0xFF,0x09
       .FCB   0x81,0xFE,0x00,0x80,0x01,0x00
       .FCB   0xFF,0xFE,0x00,0xFF,0x00,0x04
       .FCB   0xFF,0xFE,0x00,0xFE,0x01,0x00
       .FCB   0xFF,0xFE,0x00,0x00,0xFF,0x08
       .FCB   0x00,0xFF,0x01,0x00,0xFF,0x09
       .FCB   0x00,0xFF,0x01,0x01,0xFE,0x09
       .FCB   0x00,0xFF,0x01,0x7F,0x80,0x09
       .FCB   0x00,0xFF,0x01,0x80,0x7F,0x01
       .FCB   0x00,0xFF,0x01,0xFF,0x00,0x05
       .FCB   0x01,0xFF,0x01,0x00,0x00,0x04
       .FCB   0x01,0xFF,0x01,0x7F,0x81,0x09
       .FCB   0x40,0xFF,0x01,0x41,0xFE,0x09
       .FCB   0x40,0xFF,0x01,0x80,0xBF,0x0B
       .FCB   0x40,0xFF,0x01,0xC0,0x7F,0x01
       .FCB   0x40,0xFF,0x01,0xC1,0x7E,0x01
       .FCB   0x7F,0xFF,0x01,0x00,0x7E,0x00
       .FCB   0x7F,0xFF,0x01,0x01,0x7D,0x00
       .FCB   0x7F,0xFF,0x01,0x7E,0x00,0x04
       .FCB   0x7F,0xFF,0x01,0x7F,0xFF,0x09
       .FCB   0x7F,0xFF,0x01,0x80,0xFE,0x0B
       .FCB   0x7F,0xFF,0x01,0xFF,0x7F,0x01
       .FCB   0x80,0xFF,0x01,0x01,0x7E,0x02
       .FCB   0x80,0xFF,0x01,0x40,0x3F,0x02
       .FCB   0x80,0xFF,0x01,0x7F,0x00,0x06
       .FCB   0x80,0xFF,0x01,0x80,0xFF,0x09
       .FCB   0x80,0xFF,0x01,0x81,0xFE,0x09
       .FCB   0x81,0xFF,0x01,0x80,0x00,0x04
       .FCB   0xFF,0xFF,0x01,0xFF,0xFF,0x09
       .FCB   0xFF,0xFF,0x01,0xFE,0x00,0x04
       .FCB   0xFF,0xFF,0x01,0x00,0xFE,0x08
LSBC:   .FCC   'SBC'
       .FCB   EOT


;**************************************************
; Test SUBD
;**************************************************
TSUBD:  LDU   #LSUBD
       LDX   #TBSUBD
TSUBD1: LDD   ,X++
       SUBD  ,X++
       TFR   CC,DP
       CMPD  ,X++
       LBNE  OUTERR
       TFR   DP,A
       ANDA  #0x0F   ; Only check Bits NZVC
       CMPA  ,X+
       LBNE  OUTERR
       CMPX  #LSUBD
       BNE   TSUBD1
       RTS

TBSUBD: .FDB   0x0000,0x0000,0x0000
       .FCB   0x04
       .FDB   0x0000,0x0001,0xFFFF
       .FCB   0x09
       .FDB   0x0000,0x7FFF,0x8001
       .FCB   0x09
       .FDB   0x0000,0x8000,0x8000
       .FCB   0x0B
       .FDB   0x0000,0xFFFF,0x0001
       .FCB   0x01
       .FDB   0x0001,0x0000,0x0001
       .FCB   0x00
       .FDB   0x0001,0x7FFF,0x8002
       .FCB   0x09
       .FDB   0x4000,0x4001,0xFFFF
       .FCB   0x09
       .FDB   0x4000,0x8000,0xC000
       .FCB   0x0B
       .FDB   0x4000,0xC000,0x8000
       .FCB   0x0B
       .FDB   0x4000,0xC001,0x7FFF
       .FCB   0x01
       .FDB   0x7FFF,0x0000,0x7FFF
       .FCB   0x00
       .FDB   0x7FFF,0x0001,0x7FFE
       .FCB   0x00
       .FDB   0x7FFF,0x7FFE,0x0001
       .FCB   0x00
       .FDB   0x7FFF,0x7FFF,0x0000
       .FCB   0x04
       .FDB   0x7FFF,0x8000,0xFFFF
       .FCB   0x0B
       .FDB   0x7FFF,0xFFFF,0x8000
       .FCB   0x0B
       .FDB   0x8000,0x0001,0x7FFF
       .FCB   0x02
       .FDB   0x8000,0x4000,0x4000
       .FCB   0x02
       .FDB   0x8000,0x7FFF,0x0001
       .FCB   0x02
       .FDB   0x8000,0x8000,0x0000
       .FCB   0x04
       .FDB   0x8000,0x8001,0xFFFF
       .FCB   0x09
       .FDB   0x8001,0x8000,0x0001
       .FCB   0x00
       .FDB   0xFFFF,0xFFFF,0x0000
       .FCB   0x04
       .FDB   0xFFFF,0xFFFE,0x0001
       .FCB   0x00
       .FDB   0xFFFF,0x0000,0xFFFF
       .FCB   0x08
LSUBD:  .FCC   'SUBD'
       .FCB   EOT


;**************************************************
; Test CMPD
;**************************************************
TCMPD:  LDU   #LCMPD
       LDX   #TBSUBD
TCMPD1: LDD   ,X++
       SUBD  ,X++
       TFR   CC,DP
       LEAX  2,X    ; Skip result Word
       TFR   DP,A
       ANDA  #0x0F   ; Only check Bits NZVC
       CMPA  ,X+
       LBNE  OUTERR
       CMPX  #LSUBD
       BNE   TCMPD1
       RTS

LCMPD:  .FCC   'CMPD'
       .FCB   EOT


;**************************************************
; Test TFR
;**************************************************
TTFR:   LDX   #TBTFR
TTFR1:  PSHS  X
       LDY   ,X
       JSR   ,Y
       PULS  X
       BNE   FTFR
       LEAX  2,X
       CMPX  #LTFR
       BNE   TTFR1
       RTS
FTFR:   LDU   #LTFR
       LBRA  OUTERR

CLRREG: CLRA
       CLRB
       LDX   #0
       LDY   #0
       LDU   #0
       TFR   A,DP
       TFR   A,CC
       RTS
TBTFR1: BSR   CLRREG
       LDD   #0x5678
       TFR   D,X
       CMPX  #0x5678  
       RTS
TBTFR2: BSR   CLRREG
       LDX   #0x1234
       TFR   X,Y
       CMPY  #0x1234  
       RTS
TBTFR3: BSR   CLRREG
       LDY   #0x5500
       TFR   Y,U
       CMPU  #0x5500  
       RTS
TBTFR4: BSR   CLRREG
       LDU   #0xFEFF
       TFR   U,D
       CMPD  #0xFEFF  
       RTS
TBTFR5: BSR   CLRREG
       LDA   #0x55
       TFR   A,B
       CMPB  #0x55  
       RTS
TBTFR6: BSR   CLRREG
       LDB   #0xAA
       TFR   B,DP
       PSHS  DP
       PULS  A
       CMPA  #0xAA
       RTS
TBTFR7: BSR   CLRREG
       LDA   #0x03
       PSHS  A
       CLRA
       PULS  DP
       TFR   DP,CC
       PSHS  CC
       PULS  A
       CMPA  #0x03
       RTS
TBTFR8: BSR   CLRREG
       LDA   #0x01
       PSHS  A
       PULS  CC
       TFR   CC,A
       CMPA  #0x01
       RTS

TBTFR:  .FDB   TBTFR1
       .FDB   TBTFR2
       .FDB   TBTFR3
       .FDB   TBTFR4
       .FDB   TBTFR5
       .FDB   TBTFR6
       .FDB   TBTFR7
       .FDB   TBTFR8
LTFR:   .FCC   'TFR'
       .FCB   EOT


;**************************************************
; Test EXG
;**************************************************
TEXG:   LDX   #TBEXG
TEXG1:  PSHS  X
       LDY   ,X
       JSR   ,Y
       PULS  X
       BNE   FEXG
       LEAX  2,X
       CMPX  #LEXG
       BNE   TEXG1
       RTS
FEXG:   LDU   #LEXG
       LBRA  OUTERR

TBEXG1: LBSR  CLRREG
       LDD   #0x5678
       LDX   #0xA55A
       EXG   D,X
       CMPX  #0x5678
       BNE   TBEXGE
       CMPD  #0xA55A  
TBEXGE: RTS
TBEXG2: LBSR  CLRREG
       LDX   #0x1234
       LDY   #0x0815
       EXG   X,Y
       CMPY  #0x1234
       BNE   TBEXGE
       CMPX  #0x0815
       RTS
TBEXG3: LBSR  CLRREG
       LDY   #0x5500
       LDU   #0x4711
       EXG   Y,U
       CMPU  #0x5500 
       BNE   TBEXGE 
       CMPY  #0x4711  
       RTS
TBEXG4: LBSR  CLRREG
       LDU   #0xFEFF
       LDD   #0x9999
       EXG   U,D
       CMPD  #0xFEFF
       BNE   TBEXGE
       CMPU  #0x9999  
       RTS
TBEXG5: LBSR  CLRREG
       LDA   #0x55
       LDB   #0xAA
       EXG   A,B
       CMPB  #0x55  
       BNE   TBEXGE
       CMPA  #0xAA
       RTS
TBEXG6: LBSR  CLRREG
       LDB   #0xAA
       LDA   #0x44
       PSHS  A
       CLRA
       PULS  DP
       EXG   B,DP
       PSHS  DP
       PULS  A
       CMPA  #0xAA
       BNE   TBEXGE
       CMPB  #0x44
       RTS
TBEXG7: LBSR  CLRREG
       LDA   #0x03
       PSHS  A
       CLRA
       PULS  DP
       LDA   #0x30
       PSHS  A
       CLRA
       PULS  CC
       EXG   DP,CC
       PSHS  CC
       PULS  A
       PSHS  DP
       PULS  B
       CMPA  #0x03
       LBNE  TBEXGE
       CMPB  #0x30
       RTS
TBEXG8: LBSR  CLRREG
       LDA   #0x11
       LDB   #0x99
       PSHS  B
       CLRB
       PULS  CC
       EXG   CC,A
       PSHS  CC
       PULS  B
       CMPA  #0x99
       LBNE  TBEXGE
       CMPB  #0x11
       RTS

TBEXG:  .FDB   TBEXG1
       .FDB   TBEXG2
       .FDB   TBEXG3
       .FDB   TBEXG4
       .FDB   TBEXG5
       .FDB   TBEXG6
       .FDB   TBEXG7
       .FDB   TBEXG8
LEXG:   .FCC   'EXG'

;**************************************************
; Test Index Addressing modes
;**************************************************
CLRMEM: PSHS  X
       LDX   #EXTREG-128
       CLRA
CLRM1:  CLR   ,X+
       INCA
       BNE   CLRM1
       PULS  X,PC

TAD1:   LDU   #LAD1
       LDX   #EXTREG
; LDA ,X
       BSR   CLRMEM
       LDA   #0x55
       STA   EXTREG
       LDA   ,X
       CMPA  #0x55
       LBNE  OUTERR
; LDA 1,X
       BSR   CLRMEM
       LDA   #0x12
       STA   EXTREG+1
       LDA   1,X
       CMPA  #0x12
       LBNE  OUTERR
; LDA 127,X
       BSR   CLRMEM
       LDA   #0x44
       STA   EXTREG+127
       LDA   127,X
       CMPA  #0x44
       LBNE  OUTERR
; LDA -1,X
       BSR   CLRMEM
       LDA   #0x34
       STA   EXTREG-1
       LDA   -1,X
       CMPA  #0x34
       LBNE  OUTERR
; LDA -128,X
       BSR   CLRMEM
       LDA   #0xAA
       STA   EXTREG-128
       LDA   -128,X
       CMPA  #0xAA
       LBNE  OUTERR
       RTS

; LDA ,X+
TAD2:   LDX   #EXTREG
       LDU   #LAD2
       BSR   CLRMEM
       LDD   #0xA55A
       STD   EXTREG
       LDA   ,X+
       CMPA  #0xA5
       LBNE  OUTERR
       LDA   ,X+
       CMPA  #0x5A
       LBNE  OUTERR
       RTS

; LDD ,X++
TAD3:   LDX   #EXTREG
       LDU   #LAD3
       LBSR  CLRMEM
       LDD   #0xA55A
       STD   EXTREG
       LDD   #0x789A
       STD   EXTREG+2
       LDD   ,X++
       CMPD  #0xA55A
       LBNE  OUTERR
       LDD   ,X++
       CMPD  #0x789A
       LBNE  OUTERR
       RTS

; LDA ,-X
TAD4:   LDX   #EXTREG
       LDU   #LAD4
       LBSR  CLRMEM
       LDD   #0xA55A
       STD   EXTREG-2
       LDA   ,-X
       CMPA  #0x5A
       LBNE  OUTERR
       LDA   ,-X
       CMPA  #0xA5
       LBNE  OUTERR
       RTS

; LDD ,--X
TAD5:   LDX   #EXTREG
       LDU   #LAD5
       LBSR  CLRMEM
       LDD   #0xA55A
       STD   EXTREG-2
       LDD   #0x789A
       STD   EXTREG-4
       LDD   ,--X
       CMPD  #0xA55A
       LBNE  OUTERR
       LDD   ,--X
       CMPD  #0x789A
       LBNE  OUTERR
       RTS

; LDA A,X
TAD6:   LDU   #LAD6
       LDX   #EXTREG
       LBSR  CLRMEM
       LDA   #0x12
       STA   EXTREG+1
       LDA   #1
       LDA   A,X
       CMPA  #0x12
       LBNE  OUTERR
       LBSR  CLRMEM
       LDA   #0x44
       STA   EXTREG+127
       LDA   #127
       LDA   A,X
       CMPA  #0x44
       LBNE  OUTERR
       RTS

; LDA B,Y
TAD7:   LDU   #LAD7
       LDY   #EXTREG
       LBSR  CLRMEM
       LDA   #0x34
       STA   EXTREG-1
       LDB   #-1
       LDA   B,Y
       CMPA  #0x34
       LBNE  OUTERR
       LBSR  CLRMEM
       LDA   #0xAA
       STA   EXTREG-128
       LDB   #-128
       LDA   B,Y
       CMPA  #0xAA
       LBNE  OUTERR
       RTS

; LDD D,X
TAD8:   LDU   #LAD8
       LDX   #0
       LBSR  CLRMEM
       LDD   #0x1289
       STD   EXTREG
       LDD   #EXTREG
       LDD   D,X
       CMPD  #0x1289
       LBNE  OUTERR
       LDX   #EXTREG
       LBSR  CLRMEM
       LDD   #0x2299
       STD   EXTREG
       LDD   #EXTREG-#EXTREG
       LDD   D,X
       CMPD  #0x2299
       LBNE  OUTERR
       RTS

; LDD n16,X
TAD9:   LDU   #LAD9
       LDX   #0
       LBSR  CLRMEM
       LDD   #0x1289
       STD   EXTREG
       LDD   EXTREG,X
       CMPD  #0x1289
       LBNE  OUTERR
       LDX   #EXTREG
       LBSR  CLRMEM
       LDD   #0x2299
       STD   EXTREG
       LDD   EXTREG-#EXTREG,X
       CMPD  #0x2299
       LBNE  OUTERR
       RTS

; LDA n8,PC
REG81:  .FCB   0x13
TADA:   LDU   #LADA
       LBSR  CLRMEM
;       LDA   #0x13
;       STA   REG81			;??? REG81 in ROM
       LDA   <REG81,PCR
       CMPA  #0x13
       LBNE  OUTERR
       LBSR  CLRMEM
;       LDA   #0x23
;       STA   REG82			;??? REG82 in ROM
       LDA   <REG82,PCR
       CMPA  #0x23
       LBNE  OUTERR
       RTS
REG82:  .FCB   0x23

REG161: .FDB   0x9876

; LDA n16,PC
TADB:   LDU   #LADB
       LBSR  CLRMEM
;       LDD   #0x9876
;       STD   REG161			;??? REG161 in ROM
       LDD   >REG161,PCR
       CMPD  #0x9876
       LBNE  OUTERR
       LBSR  CLRMEM
;       LDD   #0x5432
;       STD   REG162			;??? REG162 in ROM
       LDD   >REG162,PCR
       CMPD  #0x5432
       LBNE  OUTERR
       RTS

TADI1:  LDU   #LADI1
       LDX   #EXTREG
; LEAY [,X]
       LBSR  CLRMEM
       LDD   #0x5522
       STD   EXTREG
       LEAY  [,X]
       CMPY  #0x5522
       LBNE  OUTERR
; LEAY [1,X]
       LBSR  CLRMEM
       LDD   #0x1234
       STD   EXTREG+1
       LEAY  [1,X]
       CMPY  #0x1234
       LBNE  OUTERR
; LEAY [127,X]
       LBSR  CLRMEM
       LDD   #0x4444
       STD   EXTREG+127
       LEAY  [127,X]
       CMPY  #0x4444
       LBNE  OUTERR
; LEAY [-1,X]
       LBSR  CLRMEM
       LDD   #0x3456
       STD   EXTREG-1
       LEAY  [-1,X]
       CMPY  #0x3456
       LBNE  OUTERR
; LEAY [-128,X]
       LBSR  CLRMEM
       LDD   #0xAAAA
       STD   EXTREG-128
       LEAY  [-128,X]
       CMPY  #0xAAAA
       LBNE  OUTERR
       RTS

; LEAY [,X++]
TADI3:  LDX   #EXTREG
       LDU   #LADI3
       LBSR  CLRMEM
       LDD   #0xA55A
       STD   EXTREG
       LDD   #0x5AA5
       STD   EXTREG+2
       LEAY  [,X++]
       CMPY  #0xA55A
       LBNE  OUTERR
       LEAY  [,X++]
       CMPY  #0x5AA5
       LBNE  OUTERR
       RTS

; LEAY [,--X]
TADI5:  LDX   #EXTREG
       LDU   #LADI5
       LBSR  CLRMEM
       LDD   #0xA55A
       STD   EXTREG-2
       LDD   #0x789A
       STD   EXTREG-4
       LEAY  [,--X]
       CMPY  #0xA55A
       LBNE  OUTERR
       LEAY  [,--X]
       CMPY  #0x789A
       LBNE  OUTERR
       RTS

; LEAY [A,X]
TADI6:  LDU   #LADI6
       LDX   #EXTREG
       LBSR  CLRMEM
       LDD   #0x1234
       STD   EXTREG+1
       LDA   #1
       LEAY  [A,X]
       CMPY  #0x1234
       LBNE  OUTERR
       LBSR  CLRMEM
       LDD   #0x4444
       STD   EXTREG+127
       LDA   #127
       LEAY  [A,X]
       CMPY  #0x4444
       LBNE  OUTERR
       RTS

; LEAY [B,X]
TADI7:  LDU   #LADI7
       LDX   #EXTREG
       LBSR  CLRMEM
       LDD   #0x3456
       STD   EXTREG-1
       LDB   #-1
       LEAY  [B,X]
       CMPY  #0x3456
       LBNE  OUTERR
       LBSR  CLRMEM
       LDD   #0xAAAA
       STD   EXTREG-128
       LDB   #-128
       LEAY  [B,X]
       CMPY  #0xAAAA
       LBNE  OUTERR
       RTS

; LEAY [D,X]
TADI8:  LDU   #LADI8
       LDX   #0
       LBSR  CLRMEM
       LDD   #0x1289
       STD   EXTREG
       LDD   #EXTREG
       LEAY  [D,X]
       CMPY  #0x1289
       LBNE  OUTERR
       LDX   #EXTREG
       LBSR  CLRMEM
       LDD   #0x2299
       STD   EXTREG
       LDD   #EXTREG-#EXTREG
       LEAY  [D,X]
       CMPY  #0x2299
       LBNE  OUTERR
       RTS

; LEAY [n16,X]
TADI9:  LDU   #LADI9
       LDX   #0
       LBSR  CLRMEM
       LDD   #0x1289
       STD   EXTREG
       LEAY  [EXTREG,X]
       CMPY  #0x1289
       LBNE  OUTERR
       LDX   #EXTREG
       LBSR  CLRMEM
       LDD   #0x2299
       STD   EXTREG
       LEAY  [EXTREG-EXTREG,X]
       CMPY  #0x2299
       LBNE  OUTERR
       RTS

; LEAY [n8,PCR]
REGI81: .FDB   0x1357
TADIA:  LDU   #LADIA
       LBSR  CLRMEM
;       LDD   #0x1357
;       STD   REGI81		;??? REGI81 in ROM
       LEAY  [REGI81,PCR]
       CMPY  #0x1357
       LBNE  OUTERR
       LBSR  CLRMEM
;       LDD   #0x2345
;       STD   REGI82
       LEAY  [REGI82,PCR]	;??? REGI82 in ROM
       CMPY  #0x2345
       LBNE  OUTERR
       RTS
REGI82: .FDB   0x2345

; LEAY [n16,PC]
TADIB:  LDU   #LADIB
       LBSR  CLRMEM
;       LDD   #0x9876
;       STD   REG161			;??? REG161 in ROM
       LEAY  [REG161,PCR]
       CMPY  #0x9876
       LBNE  OUTERR
       LBSR  CLRMEM
;       LDD   #0x5432
;       STD   REG162			; ??? REG162 in ROM
       LEAY  [REG162,PCR]
       CMPY  #0x5432
       LBNE  OUTERR
       RTS

; LEAY [addr]
TADIC:  LDU   #LADIC
       LBSR  CLRMEM
;       LDD   #0x9876
;       STD   REG161			;??? REG161 in ROM
       LEAY  [#REG161]
       CMPY  #0x9876
       LBNE  OUTERR
       LBSR  CLRMEM
;       LDD   #0x5432
;       STD   REG162			;??? REG162 in ROM
       LEAY  [#REG162]
       CMPY  #0x5432
       LBNE  OUTERR
       RTS

REG162: .FDB   0x5432

LAD1:   .FCC   'LDA N8,X'
        .byte EOT
LAD2:   .FCC   'LDA ,X+'
        .byte EOT
LAD3:   .FCC   'LDD ,X++'
        .byte EOT
LAD4:   .FCC   'LDA ,-X'
        .byte EOT
LAD5:   .FCC   'LDD ,--X'
        .byte EOT
LAD6:   .FCC   'LDA A,X'
        .byte EOT
LAD7:   .FCC   'LDA B,Y'
        .byte EOT
LAD8:   .FCC   'LDD D,X'
        .byte EOT
LAD9:   .FCC   'LDD N16,X'
        .byte EOT
LADA:   .FCC   'LDA N8,PC'
        .byte EOT
LADB:   .FCC   'LDD N16,PC'
        .byte EOT
LADI1:  .FCC   'LEAY [n8,X]'
        .byte EOT
LADI3:  .FCC   'LEAY [,X++]'
        .byte EOT
LADI5:  .FCC   'LEAY [,--X]'
        .byte EOT
LADI6:  .FCC   'LEAY [A,X]'
        .byte EOT
LADI7:  .FCC   'LEAY [B,Y]'
        .byte EOT
LADI8:  .FCC   'LEAY [D,X]'
        .byte EOT
LADI9:  .FCC   'LEAY [N16,X]'
        .byte EOT
LADIA:  .FCC   'LEAY [N8,PCR]'
        .byte EOT
LADIB:  .FCC   'LEAY [N16,PCR]'
        .byte EOT
LADIC:  .FCC   'LEAY [ADDR]'
        .byte EOT


;**************************************************
; Print error message for a failed Test
; Parameters:
; U: Pointer to Mnemonic
;**************************************************
OUTERR:
		ldx	#0x3c88
		stx	curpos
		LDX   #ERRM1
		JSR   PSTRNG

		ldx	#0x3c99
		stx	curpos
		TFR   U,X
		JSR   PSTRNG

		ldb		#0x01
		stb		failed_6809

		ldb		#0x02		;did not pass the 6809 test suite
		jsr		set_LED

		;set color to red and loop
		jsr		load_palette_redbkg
	
		ldb		#watchdog_data
		jsr		delay_ffff
		jsr		delay_ffff
		jsr		delay_ffff
		jsr		clear_screen
		rts

	
ERRM1:  .FCC   'FAILED TEST: '
        .byte	EOT
PASSM1: .FCC   '      PASSED 6809 TEST SUITE'
        .byte	EOT
TITLEM1:.FCC   'WILLIAMS EMULATION TEST SUITE V0.4'
        .byte	EOT
BLITM1:	.FCC   '        BLITTER VALIDATION'
        .byte	EOT
INSTM1:	.FCC   '     INSTRUCTION TIMING TESTS'
        .byte	EOT
CRCBADM1:.FCC   '         BAD BLIT CRC'
        .byte	EOT
CRCOKM1:.FCC   '          ALL BLITS OK'
        .byte	EOT
BLITM2:	.FCC   '       BLITTER TIMING TESTS'
        .byte	EOT


;unused space from end of code to FFEF

	.area	_VECTORS				;CPU vectors at FFF0

	.word	#reset,#reset,#reset,#reset,#reset,#reset,#reset,#reset	;point them all to start of code

	.end
