@ armwrestler.asm
@ mic, 2004-2006 | micol972@gmail.com

@ Runs ARM instructions and checks for valid results. Useful for people developing ARM emulators
@ Assemble with arm-elf-as

.global main
.global forever

.equ VARBASE,	0x2200000
.equ TESTNUM,	(VARBASE+8)
.equ CURSEL,	(VARBASE+16)

.equ MENU, 	10

.equ BAD_Rd,	0x10
.equ BAD_Rn,	0x20

.global main

main:

mov	r0, #0x04000000			@ IME = 0;
add	r0, r0, #0x208
strh	r0, [r0]

ldr 	r0,=0x11340
mov 	r1,#0x4000000
str 	r0,[r1]

@ Turn on both screens
ldr 	r0,=0x830F
ldr 	r1,=0x4000304
str 	r0,[r1]

@ Map vram banks A and B to LCDC
mov 	r0,#0x80
ldr 	r1,=0x4000240
strb 	r0,[r1],#1
strb 	r0,[r1],#1

mov 	r0,#0		
ldr 	r1,=(VARBASE+0x10)
str 	r0,[r1],#-4		@ Menu item selection
str 	r0,[r1],#-4		@ Used in CheckKeys
mov 	r0,#MENU
str 	r0,[r1],#-4		@ The test number
mov 	r0,#2
str 	r0,[r1]

mov 	r10,#0

@ Set VRAM display mode (bank A)
mov 	r0,#0x20000
mov 	r1,#0x4000000
str 	r0,[r1]	

forever:
	bl	VSync

	mov 	r8,#16
	mov 	r9,#0

	@ Do we need to clear the screen?
	cmp 	r10,#1
	moveq 	r10,#0
	bleq 	ClearScreen
	
	@ Load the test number
	ldr 	r0,=TESTNUM
	ldr 	r1,[r0]
	
	@ Run it
	bl 	RunTest

	ldr 	r0,=TESTNUM
	ldr 	r1,[r0]
	cmp 	r1,#MENU
	beq 	handle_menu
		ldr 	r0,=szStart
		mov 	r1,#20+8
		mov 	r2,#180
		mov 	r3,#5
		bl 	DrawText	
		ldr 	r0,=szNext
		mov 	r1,#76+8
		mov 	r2,#180
		mov 	r3,#4
		bl 	DrawText	
		ldr 	r0,=szSelect2
		mov 	r1,#132+8
		mov 	r2,#180
		mov 	r3,#5
		bl 	DrawText	
		ldr 	r0,=szMenu
		mov 	r1,#192+8
		mov 	r2,#180
		mov 	r3,#4
		bl 	DrawText	

		bl 	CheckKeys

		tsts 	r2,#0x8
		beq 	not_start
			ldr 	r4,=TESTNUM
			ldrb 	r3,[r4]
			add 	r3,r3,#1
			cmp 	r3,#5
			movge 	r3,#MENU
			mov 	r10,#1
			strb 	r3,[r4]
		not_start:

		tsts 	r2,#0x4
		beq 	not_select
			ldr 	r4,=TESTNUM
			mov 	r10,#1
			mov 	r3,#MENU
			strb 	r3,[r4]
		not_select:
		
		b 	forever
		
	handle_menu:
		ldr 	r0,=szSelect
		mov 	r1,#4+4
		mov 	r2,#180
		mov 	r3,#4
		bl 	DrawText	
		ldr 	r0,=szStart2
		mov 	r1,#196+8
		mov 	r2,#180
		mov 	r3,#5
		bl 	DrawText	

		bl 	CheckKeys
		
		tsts 	r2,#0x8
		beq 	menu_not_start
			ldr 	r0,=menulinks
			ldr 	r4,=(VARBASE+0x10)
			ldrb	r3,[r4]
			sub 	r4,r4,#8
			add 	r0,r0,r3,lsl#2
			ldr 	r5,[r0]
			mov 	r10,#1
			strb 	r5,[r4]
			b 	forever
		menu_not_start:
		
		@ Check up/down
		mov 	r5,#0

		ldr 	r4,=(VARBASE+0x10)
		ldrb 	r3,[r4]
		mov 	r6,r3
		tsts 	r2,#0x40
		beq 	not_up
			subs 	r3,r3,#1
			movmi 	r3,#0
			movpl 	r5,#1
		not_up:
		tsts 	r2,#0x80
		beq 	not_down
			add 	r3,r3,#1
			cmp 	r3,#6
			movgt 	r3,#6
			movle 	r5,#1
		not_down:
		strb 	r3,[r4]

		cmp 	r5,#1
		bne no_erase
			ldr 	r0,=szSpace
			mov 	r1,#44+8
			mov 	r2,r6,lsl#3
			add 	r2,r2,#64+8
			mov 	r3,#5
			bl 	DrawText
		no_erase:
		
		b 	forever



VSync:
  stmfd sp!,{r0-r1}
  mov 	r0,#0x4000000
  add 	r0,r0,#4		@ DISPCNT+4 = DISPSTAT
  vs_loop1:
    	ldrh 	r1,[r0]
    	ands 	r1,r1,#1
  	bne 	vs_loop1
  vs_loop2:
    	ldrh 	r1,[r0]
    	ands 	r1,r1,#1
  	beq 	vs_loop2
  ldmfd sp!,{r0-r1}
  mov 	pc,lr



DrawText:
@ r0: lpszText
@ r1: x
@ r2: y
@ r3: color
	stmfd 	sp!,{r4-r10}

	ldr 	r10,=palette
	mov 	r3,r3,lsl#1
	ldrh 	r3,[r10,r3]
	
	mov 	r9,r2,lsl#9
	add 	r9,r9,r1,lsl#1
	add 	r9,r9,#0x6800000
	
dt_cloop:	
	ldr 	r10,=font
	ldrb 	r4,[r0],#1
	cmp 	r4,#0
	beq 	dt_null
	cmp 	r4,#32
	moveq 	r4,#0
	subne 	r4,r4,#37
	add 	r10,r10,r4,lsl#6
	
	mov 	r7,r9
	add 	r9,r9,#16
	mov 	r5,#8
dt_vloop:
	mov 	r6,#8
dt_hloop:
	ldrb 	r1,[r10],#1
	@mov 	r2,r1,lsr#8
	ands 	r1,r1,#0xFF 
	movne 	r1,r3
	@ands 	r2,r2,#0xFF
	@movne 	r2,r3
	@orr 	r1,r1,r2,lsl#8
	strh 	r1,[r7],#2
	subs 	r6,r6,#1
	bne 	dt_hloop
	
	add 	r7,r7,#496
	subs 	r5,r5,#1
	bne 	dt_vloop
	
	b 	dt_cloop
dt_null:
	ldmfd 	sp!,{r4-r10}
	mov 	pc,lr

.pool
.align


DrawHex:
@ r0: value
@ r1: x
@ r2: y
@ r3: color
	stmfd 	sp!,{r4-r10}

	ldr 	r10,=palette
	mov 	r3,r3,lsl#1
	ldrh 	r3,[r10,r3]
	
	mov 	r9,r2,lsl#9
	add 	r9,r9,r1,lsl#1
	add 	r9,r9,#0x6800000
	mov 	r8,#8
	
dh_cloop:	
	ldr 	r10,=font
	mov 	r0,r0,ror#28
	and 	r4,r0,#0xF
	cmp	r4,#9
	add 	r4,r4,#11
	addhi	r4,r4,#7	
	add 	r10,r10,r4,lsl#6
	
	mov 	r7,r9
	add 	r9,r9,#16
	mov 	r5,#8
dh_vloop:
	mov 	r6,#8
dh_hloop:
	ldrb 	r1,[r10],#1
	ands 	r1,r1,#0xFF 
	movne 	r1,r3
	strh 	r1,[r7],#2
	subs 	r6,r6,#1
	bne 	dh_hloop
	
	add 	r7,r7,#496
	subs 	r5,r5,#1
	bne 	dh_vloop
	
	subs 	r8,r8,#1
	bne 	dh_cloop
	ldmfd 	sp!,{r4-r10}
	mov 	pc,lr
.pool
.align


DrawResult:
@ r0: lpszText
@ r1: bitmask
	stmfd 	sp!,{r0-r5,lr}

	mov 	r4,r1
	mov 	r5,r2
	
	mov 	r1,#16
	mov 	r2,r8
	mov 	r3,#3
	bl 	DrawText
	
	mov 	r2,r5

	mov 	r5,#72

	tsts 	r4,#0x80000000
	beq 	dt_not_ldr
		ldr 	r0,=szLDRtype
		add 	r0,r0,r2,lsl#2
		add 	r0,r0,r2
		mov 	r1,#64
		mov 	r2,r8
		mov 	r3,#3
		bl 	DrawText
		mov 	r5,#104
	dt_not_ldr:

	tsts 	r4,#0x40000000
	beq 	dt_not_ldm
		ldr 	r0,=szLDMtype
		add 	r0,r0,r2,lsl#2
		add 	r0,r0,r2
		mov 	r1,#40
		mov 	r2,r8
		mov 	r3,#3
		bl 	DrawText
		mov 	r5,#80
	dt_not_ldm:


	tsts 	r4,#0xFF
	beq 	dr_ok

	ldr 	r0,=szBad
	mov 	r1,r5
	mov 	r2,r8
	mov 	r3,#2
	bl 	DrawText
	add 	r5,r5,#32

	tsts 	r4,#0x40000000
	bne 	skip_flags
	
	tsts 	r4,#1
	beq 	dr_c_ok
	ldr 	r0,=szC
	mov 	r1,r5
	mov 	r2,r8
	mov 	r3,#2
	bl 	DrawText
	add 	r5,r5,#8
dr_c_ok:

	tsts 	r4,#2
	beq 	dr_n_ok
	ldr 	r0,=szN
	mov 	r1,r5
	mov 	r2,r8
	mov 	r3,#2
	bl 	DrawText
	add 	r5,r5,#8
dr_n_ok:

	tsts 	r4,#4
	beq 	dr_v_ok
	ldr 	r0,=szV
	mov 	r1,r5
	mov 	r2,r8
	mov 	r3,#2
	bl 	DrawText
	add 	r5,r5,#8
dr_v_ok:

	tsts 	r4,#8
	beq 	dr_z_ok
	ldr 	r0,=szZ
	mov 	r1,r5
	mov 	r2,r8
	mov 	r3,#2
	bl 	DrawText
	add 	r5,r5,#16
dr_z_ok:

	tsts 	r4,#0x40
	beq 	dr_q_ok
	ldr 	r0,=szQ
	mov 	r1,r5
	mov 	r2,r8
	mov 	r3,#2
	bl 	DrawText
	add 	r5,r5,#16
dr_q_ok:

skip_flags:
	tsts 	r4,#BAD_Rd
	beq 	dr_rd_ok
	ldr 	r0,=szRd
	mov 	r1,r5
	mov 	r2,r8
	mov 	r3,#2
	bl 	DrawText
	add 	r5,r5,#16
dr_rd_ok:

	tsts 	r4,#0x80
	beq 	dr_mem_ok
	ldr 	r0,=szMem
	mov 	r1,r5
	mov 	r2,r8
	mov 	r3,#2
	bl 	DrawText
	add 	r5,r5,#24
	ldr 	r0,=memVal
	ldr 	r0,[r0]
	mov 	r1,r5
	add 	r1,r1,#32
	mov 	r2,r8
	mov 	r3,#2
	bl 	DrawHex
	b 	dr_done
dr_mem_ok:

	tsts 	r4,#BAD_Rn
	beq 	dr_rn_ok
	ldr 	r0,=szRn
	mov 	r1,r5
	mov 	r2,r8
	mov 	r3,#2
	bl 	DrawText
	ldr 	r0,=rnVal
	ldr 	r0,[r0]
	mov 	r1,r5
	add 	r1,r1,#32
	mov 	r2,r8
	mov 	r3,#2
	bl 	DrawHex
dr_rn_ok:
	
	b 	dr_done
dr_ok:
	ldr 	r0,=szOK
	mov 	r1,r5
	mov 	r2,r8
	mov 	r3,#1
	bl 	DrawText

dr_done:
	ldmfd 	sp!,{r0-r5,lr}
	mov 	pc,lr
	
.pool
.align



ClearScreen:	
	mov 	r0,#0x6800000
	mov 	r4,#0
	ldr 	r5,=24576
	cs_repeat:
		str 	r4,[r0],#4
		subs 	r5,r5,#1
		bne 	cs_repeat
	mov 	pc,lr
	

CheckKeys:
	mov 	r0,#0x4000000
	add 	r0,r0,#0x130
	ldrh 	r2,[r0]
	ldr 	r0,=(VARBASE+12)
	ldrh 	r3,[r0]
	and 	r2,r2,#0xff

	eor 	r2,r2,#0xff
	strh 	r2,[r0]
	cmp 	r2,#0 
	eorne 	r2,r2,r3
	mov 	pc,lr
.pool
.align



RunTest:
@ r1: test number
	mov 	r1,r1,lsl#2	@ r1 *= sizeof(word)
	ldr 	r0,=jumptable
	add 	r0,r0,r1
	ldr 	r1,[r0]		@ r1 = jumptable[test_number]
	mov 	pc,r1		@ Branch to the code
	


Menu:
	stmfd 	sp!,{lr}

	ldr 	r0,=szAsterixes
	mov 	r1,#0
	mov 	r2,#0
	mov 	r3,#4
	bl 	DrawText
	ldr 	r0,=szAster2
	mov 	r1,#0
	mov 	r2,#8
	mov 	r3,#4
	bl 	DrawText
	ldr 	r0,=szArmwrestler
	mov 	r1,#0
	mov 	r2,#16
	mov 	r3,#4
	bl 	DrawText
	ldr 	r0,=szAster2
	mov 	r1,#0
	mov 	r2,#24
	mov 	r3,#4
	bl 	DrawText
	ldr 	r0,=szAuthor
	mov 	r1,#0
	mov 	r2,#32
	mov 	r3,#4
	bl 	DrawText
	ldr 	r0,=szAster2
	mov 	r1,#0
	mov 	r2,#40
	mov 	r3,#4
	bl 	DrawText
	ldr 	r0,=szAsterixes
	mov 	r1,#0
	mov 	r2,#48
	mov 	r3,#4
	bl 	DrawText


	ldr 	r5,=menuitems
	mov 	r4,#64+8
	draw_menuitems:
		mov 	r1,#56+8
		mov 	r2,r4
		mov 	r3,#3
		ldr 	r0,[r5],#4
		bl 	DrawText
		add 	r4,r4,#8
		cmp 	r4,#128
		bne 	draw_menuitems

	ldr 	r0,=szMarker
	mov 	r1,#44+8
	ldr 	r4,=CURSEL
	ldrb	r2,[r4]

	mov 	r2,r2,lsl#3
	add 	r2,r2,#64+8
	mov 	r3,#5
	bl 	DrawText
		
	ldmfd 	sp!,{lr}
	mov 	pc,lr
	
	

Test0:
	stmfd sp!,{lr}
	
	ldr r0,=szALU1
	mov r1,#56
	mov r2,#1
	mov r3,#4
	bl DrawText
	

	@ ADC
	mov 	r1,#0
	mov 	r2,#0x80000000
	mov 	r3,#0xF
	adds 	r9,r9,r9	@ clear carry
	adcs 	r2,r2,r3
	orrcs 	r1,r1,#1
	orrpl 	r1,r1,#2
	orrvs 	r1,r1,#4
	orreq 	r1,r1,#8
	adcs 	r2,r2,r2	
	orrcc 	r1,r1,#1
	orrmi 	r1,r1,#2
	adc 	r3,r3,r3
	cmp 	r3,#0x1F
	orrne 	r1,r1,#BAD_Rd
	
	adds 	r9,r9,r9	@ clear carry
	mov 	r0,#0
	mov 	r2,#1
	adc 	r0,r0,r2,lsr#1
	cmp 	r0,#1
	@orrne 	r1,r1,#BAD_Rd
	
	ldr 	r0,=szADC
	bl 	DrawResult
	add 	r8,r8,#8

	@ ADD
	mov 	r1,#0
	ldr 	r2,=0xFFFFFFFE
	mov 	r3,#1
	adds 	r2,r2,r3
	orrcs 	r1,r1,#1
	orrpl 	r1,r1,#2
	orrvs 	r1,r1,#4
	orreq 	r1,r1,#8
	adds 	r2,r2,r3	
	orrcc 	r1,r1,#1
	orrmi 	r1,r1,#2
	orrvs 	r1,r1,#4

	orrne 	r1,r1,#8
	ldr 	r0,=szADD
	bl 	DrawResult
	add 	r8,r8,#8

	

	@ AND
	mov 	r1,#0
	mov 	r2,#2
	mov 	r3,#5
	ands 	r2,r2,r3,lsr#1
	orrcc 	r1,r1,#1
	orreq 	r1,r1,#8
	cmp 	r2,#2
	orrne 	r1,r1,#BAD_Rd
	mov 	r2,#0xC00
	mov 	r3,r2

	mov 	r4,#0x80000000
	ands 	r2,r2,r4,asr#32
	orrcc 	r1,r1,#1
	orrmi 	r1,r1,#2
	orreq 	r1,r1,#8
	cmp 	r2,r3
	orrne 	r1,r1,#BAD_Rd
	ldr 	r0,=szAND
	bl 	DrawResult
	add 	r8,r8,#8


	@ BIC
	mov 	r1,#0
	adds 	r9,r9,r9 @ clear carry
	ldr 	r2,=0xFFFFFFFF
	ldr 	r3,=0xC000000D
	bics 	r2,r2,r3,asr#1
	orrcc 	r1,r1,#1
	orrmi 	r1,r1,#2	
	orreq 	r1,r1,#8
	ldr 	r3,=0x1FFFFFF9
	cmp 	r2,r3
	orrne 	r1,r1,#16
	ldr 	r0,=szBIC
	bl 	DrawResult
	add 	r8,r8,#8
	
	@ CMN
	mov 	r1,#0
	adds 	r9,r9,r9 @ clear carry
	ldr 	r2,=0x7FFFFFFF
	ldr 	r3,=0x70000000
	cmns 	r2,r3
	orrcs 	r1,r1,#1
	orrpl 	r1,r1,#2
	orrvc 	r1,r1,#4
	orreq 	r1,r1,#8
	ldr 	r3,=0x7FFFFFFF
	cmp 	r2,r3
	orrne 	r1,r1,#16
	ldr 	r0,=szCMN
	bl 	DrawResult
	add 	r8,r8,#8

	
	@ EOR
	mov 	r1,#0
	mov 	r2,#1
	mov 	r3,#3
	eors 	r2,r2,r3,lsl#31
	eors 	r2,r2,r3,lsl#0
	orrcc 	r1,r1,#1
	orrpl 	r1,r1,#2
	orreq 	r1,r1,#8
	ldr 	r4,=0x80000002
	cmp 	r4,r2
	orrne 	r1,r1,#BAD_Rd
	ldr 	r0,=szEOR
	bl 	DrawResult
	add 	r8,r8,#8

	
	@ MOV
	mov 	r1,#0
	ldr 	r2,=labelone
	mov 	r3,r15
	cmp 	r2,r3
labelone:
	orrne 	r1,r1,#BAD_Rd
	ldr 	r2,=labeltwo
	mov 	r3,#0
	movs 	r4,r15,lsl r3	@ 0
	orreq 	r1,r1,#8	@ 4
	cmp 	r4,r2		@ 8
labeltwo: 			@ 12	
	orrne 	r1,r1,#BAD_Rd
	ldr 	r2,=0x80000001
	movs 	r3,r2,lsr#32
	orrcc 	r1,r1,#1
	orrmi 	r1,r1,#2
	
	orrne 	r1,r1,#8
	cmp 	r3,#0
	orrne 	r1,r1,#BAD_Rd

	@ Test ASR by reg==0
	mov 	r3,#3
	movs 	r4,r3,lsr#1	@ set carry 	
	mov 	r2,#0
	movs 	r3,r4,asr r2
	orrcc 	r1,r1,#1
	cmp 	r3,#1
	orrne 	r1,r1,#16

	@ Test ASR by reg==33
	ldr 	r2,=0x80000000
	mov 	r3,#33
	movs 	r2,r2,asr r3
	orrcc 	r1,r1,#1
	ldr 	r4,=0xFFFFFFFF
	cmp 	r2,r4
	orrne 	r1,r1,#16
	
	ldr 	r0,=szMOV
	bl 	DrawResult
	add 	r8,r8,#8


	@ MVN
	mov 	r1,#0
	ldr 	r2,=labelthree	
	ldr 	r3,=0xFFFFFFFF
	eor 	r2,r2,r3
	mvn 	r3,r15
	cmp 	r3,r2
labelthree:	
	orrne 	r1,r1,#BAD_Rd
	ldr 	r0,=szMVN
	bl 	DrawResult
	add 	r8,r8,#8
	
	@ ORR
	mov 	r1,#0
	mov 	r2,#2
	mov 	r3,#3
	movs 	r4,r3,lsr#1	@ set carry 
	orrs 	r3,r3,r2,rrx
	orrcs 	r1,r1,#1
	orrpl 	r1,r1,#2
	orreq 	r1,r1,#8
	ldr 	r4,=0x80000003
	cmp 	r4,r3
	orrne 	r1,r1,#BAD_Rd
	ldr 	r0,=szORR
	bl 	DrawResult
	add 	r8,r8,#8
	
	
	@ RSC
	mov 	r1,#0
	mov 	r2,#2
	mov 	r3,#3
	adds 	r9,r9,r9	@ clear carry
	rscs 	r3,r2,r3
	orrcc 	r1,r1,#1
	orrmi 	r1,r1,#2
	orrne 	r1,r1,#8
	cmp 	r2,#2
	orrne 	r1,r1,#BAD_Rd
	ldr 	r0,=szRSC
	bl 	DrawResult
	add 	r8,r8,#8

	
	@ SBC
	mov 	r1,#0
	ldr 	r2,=0xFFFFFFFF
	adds 	r3,r2,r2	@ set carry
	sbcs 	r2,r2,r2
	orrcc 	r1,r1,#1
	orrmi 	r1,r1,#2
	orrne 	r1,r1,#8
	adds 	r9,r9,r9	@ clear carry
	sbcs 	r2,r2,#0
	orreq 	r1,r1,#8
	orrcs 	r1,r1,#1
	orrpl 	r1,r1,#2
	ldr 	r0,=szSBC
	bl 	DrawResult
	add 	r8,r8,#8
	

	@ MLA
	mov 	r1,#0
	ldr 	r2,=0xFFFFFFF6
	mov 	r3,#0x14
	ldr 	r4,=0xD0
	mlas 	r2,r3,r2,r4
	orrmi 	r1,r1,#2
	orreq 	r1,r1,#8
	cmp 	r2,#8
	orrne 	r1,r1,#16
	ldr 	r0,=szMLA
	bl 	DrawResult
	add 	r8,r8,#8


	@ MUL
	mov 	r1,#0
	ldr 	r2,=0xFFFFFFF6
	mov 	r3,#0x14
	ldr 	r4,=0xFFFFFF38
	muls 	r2,r3,r2
	orrpl 	r1,r1,#2
	orreq 	r1,r1,#8
	cmp 	r2,r4
	orrne 	r1,r1,#16
	ldr 	r0,=szMUL
	bl 	DrawResult
	add 	r8,r8,#8

	
	@ UMULL
	mov 	r1,#0
	ldr 	r2,=0x80000000
	mov 	r3,#8
	umulls 	r4,r5,r2,r3
	orrmi 	r1,r1,#2
	orreq 	r1,r1,#8
	mov 	r2,#4
	cmp 	r2,r5
	orrne 	r1,r1,#BAD_Rd
	ldr 	r0,=szUMULL
	bl 	DrawResult
	add 	r8,r8,#8

	@ SMULL
	mov 	r1,#0
	ldr 	r2,=0x80000000
	mov 	r3,#8
	smulls 	r4,r5,r2,r3
	orrpl 	r1,r1,#2
	orreq 	r1,r1,#8
	ldr 	r2,=0xFFFFFFFC
	cmp 	r2,r5
	orrne 	r1,r1,#BAD_Rd
	ldr 	r0,=szSMULL
	bl 	DrawResult
	add 	r8,r8,#8
	
	ldmfd 	sp!,{lr}
	mov 	pc,lr
.pool
.align

	
Test1:
	stmfd 	sp!,{lr}
	
	ldr 	r0,=szALU2
	mov 	r1,#60
	mov 	r2,#1
	mov 	r3,#4
	bl 	DrawText

	
	mov 	r1,#0
	ldr 	r2,=0x80000000
	mov 	r3,#8
	mov 	r5,#1
	mov 	r4,#2
	umlals 	r4,r5,r2,r3
	orrmi 	r1,r1,#2
	orreq 	r1,r1,#8
	cmp 	r4,#2
	orrne 	r1,r1,#BAD_Rd
	cmp 	r5,#5	
	orrne 	r1,r1,#BAD_Rd
	ldr 	r0,=szUMLAL
	bl 	DrawResult
	add 	r8,r8,#8

	@ SMLAL
	mov 	r1,#0
	ldr 	r2,=0x80000001
	mov 	r3,#8
	mov 	r5,#5
	ldr 	r4,=0xfffffff8
	smlals 	r4,r5,r2,r3
	orrmi 	r1,r1,#2
	orreq 	r1,r1,#8
	cmp 	r5,#2
	orrne 	r1,r1,#BAD_Rd
	cmp 	r4,#0
	orrne 	r1,r1,#BAD_Rd
	ldr 	r0,=szSMLAL
	bl 	DrawResult
	add 	r8,r8,#8

	@ SWP
	mov 	r1,#0
	adds 	r1,r1,#1		@ Clear C,N,V,Z
	mov 	r1,#0
	ldr 	r5,=(VARBASE+0x100)
	str 	r1,[r5]
	mov 	r0,#0xC0000000
	swp 	r0,r0,[r5]
	orrcs 	r1,r1,#1
	orrmi 	r1,r1,#2
	orrvs 	r1,r1,#4
	orreq 	r1,r1,#8
	cmp 	r0,#0
	orrne 	r1,r1,#BAD_Rd
	ldr 	r0,[r5]
	cmp 	r0,#0xC0000000
	orrne 	r1,r1,#BAD_Rd
	ldr 	r0,=szSWP
	bl 	DrawResult
	add 	r8,r8,#8
	
	@ SWPB
	mov 	r1,#0
	adds 	r1,r1,#0		@ Clear C,N,V
	ldr 	r5,=(VARBASE+0x100)
	mov 	r4,#0xff
	add 	r4,r4,#0x80
	str 	r4,[r5]
	mov 	r0,#0xC0000000
	orr 	r0,r0,#0x80
	swpb 	r0,r0,[r5]
	orrcs 	r1,r1,#1
	orrmi 	r1,r1,#2
	orrvs 	r1,r1,#4
	orrne 	r1,r1,#8
	cmp 	r0,#0x7f
	orrne 	r1,r1,#BAD_Rd
	ldr 	r0,[r5]
	cmp 	r0,#0x180
	orrne 	r1,r1,#BAD_Rd
	ldr 	r0,=szSWPB
	bl 	DrawResult
	add 	r8,r8,#8

	
	@ MRS
	mov 	r1,#0
	mov 	r0,#0xC0000000
	adds 	r0,r0,r0		@ Z=0, C=1, V=0, N=1
	mov 	r2,#0x50000000
	mrs 	r2,cpsr
	tsts 	r2,#0x20000000
	orreq 	r1,r1,#1
	tsts 	r2,#0x80000000
	orreq 	r1,r1,#2
	tsts 	r2,#0x10000000
	orrne 	r1,r1,#4
	tsts 	r2,#0x40000000
	orrne 	r1,r1,#8
	ldr 	r0,=szMRS
	bl 	DrawResult
	add 	r8,r8,#8
	
	
	@ MSR
	mov 	r1,#0
	movs 	r2,#0
	msr 	cpsr_flg,#0x90000000
	orrcs 	r1,r1,#1
	orrpl 	r1,r1,#2
	orrvc 	r1,r1,#4
	orreq 	r1,r1,#8
	mov 	r11,#1
	mrs 	r2,cpsr
	bic 	r2,r2,#0x1f
	orr 	r2,r2,#0x11	
	msr 	cpsr,r2		@ Set FIQ mode
	mov 	r11,#2
	orr 	r2,r2,#0x1f
	msr 	cpsr,r2		@ Set System mode
	cmp 	r11,#1
	orrne 	r1,r1,#BAD_Rd
	ldr 	r0,=szMSR
	bl 	DrawResult
	add 	r8,r8,#8
	
	
	ldmfd 	sp!,{lr}
	mov 	pc,lr	
.pool
.align



Test2:
	stmfd 	sp!,{lr}

	ldr 	r0,=szLS1
	mov 	r1,#52
	mov 	r2,#1
	mov 	r3,#4
	bl 	DrawText


	@ LDR
	
	@ +#]
	mov 	r1,#0
	ldr 	r0,=romvar
	sub 	r2,r0,#3
	mov 	r3,r2
	ldr 	r0,[r0,#0]
	cmp 	r0,#0x80
	orrne 	r1,r1,#BAD_Rd
	ldr 	r0,[r2,#3]
	cmp 	r0,#0x80
	orrne 	r1,r1,#BAD_Rd
	cmp 	r2,r3
	orrne 	r1,r1,#BAD_Rn
	@ Test non word-aligned load
	ldr 	r0,=romvar2
	ldr 	r0,[r0,#1]
	ldr 	r2,=0x00ff008f
	cmp 	r0,r2
	orrne 	r1,r1,#BAD_Rd
	ldr 	r0,=romvar2
	ldr 	r0,[r0,#2]
	ldr 	r2,=0x8f00ff00
	cmp 	r0,r2
	orrne 	r1,r1,#BAD_Rd
	ldr 	r0,=romvar2
	ldr 	r0,[r0,#3]
	ldr 	r2,=0x008f00ff
	cmp 	r0,r2
	orrne 	r1,r1,#BAD_Rd

	mov 	r2,#0
	orr 	r1,r1,#0x80000000
	ldr 	r0,=szLDR
	bl 	DrawResult
	add 	r8,r8,#8


	@ -#]
	mov 	r1,#0
	ldr 	r0,=romvar
	mov 	r2,r0
	mov 	r3,r2
	add 	r0,r0,#206
	ldr 	r0,[r0,#-206]
	cmp 	r0,#0x80
	orrne 	r1,r1,#BAD_Rd
	ldr 	r0,[r2,#-0]
	cmp 	r0,#0x80
	orrne 	r1,r1,#BAD_Rd
	cmp 	r2,r3
	orrne 	r1,r1,#BAD_Rn
	@ Test non word-aligned load
	ldr 	r0,=romvar2+4
	ldr 	r0,[r0,#-2]
	ldr 	r2,=0x8f00ff00
	cmp 	r0,r2
	orrne 	r1,r1,#BAD_Rd

	mov 	r2,#1
	orr 	r1,r1,#0x80000000
	ldr 	r0,=szLDR
	bl 	DrawResult
	add 	r8,r8,#8


	@ +#]!
	mov 	r1,#0
	ldr 	r0,=romvar
	sub 	r2,r0,#3
	mov 	r3,r0
	ldr 	r0,[r0,#0]!
	cmp 	r0,#0x80
	orrne 	r1,r1,#BAD_Rd
	ldr 	r0,[r2,#3]!
	cmp 	r0,#0x80
	orrne 	r1,r1,#BAD_Rd
	cmp 	r2,r3
	orrne 	r1,r1,#BAD_Rn
	@ Test non word-aligned load
	ldr 	r0,=romvar2
	ldr 	r0,[r0,#2]!
	ldr 	r2,=0x8f00ff00
	cmp 	r0,r2
	orrne 	r1,r1,#BAD_Rd
	
	mov 	r2,#2
	orr 	r1,r1,#0x80000000
	ldr 	r0,=szLDR
	bl 	DrawResult
	add 	r8,r8,#8


	@ -#]!
	mov 	r1,#0
	ldr 	r0,=romvar
	add 	r2,r0,#1
	mov 	r3,r0
	add 	r0,r0,#206
	ldr 	r0,[r0,#-206]!
	cmp 	r0,#0x80
	orrne 	r1,r1,#BAD_Rd
	ldr 	r0,[r2,#-1]!
	cmp 	r0,#0x80
	orrne 	r1,r1,#BAD_Rd
	cmp 	r2,r3
	orrne 	r1,r1,#BAD_Rn
	@ Test non word-aligned load
	ldr 	r0,=romvar2+4
	ldr 	r0,[r0,#-2]!
	ldr 	r2,=0x8f00ff00
	cmp 	r0,r2
	orrne 	r1,r1,#BAD_Rd
	
	mov 	r2,#3
	orr 	r1,r1,#0x80000000
	ldr 	r0,=szLDR
	bl 	DrawResult
	add 	r8,r8,#8


	@ +R]
	mov 	r1,#0
	ldr 	r0,=romvar
	sub 	r2,r0,#8
	sub 	r0,r0,#1
	mov 	r3,r2
	mov 	r4,#2
	ldr 	r0,[r0,r4, lsr #1]
	cmp 	r0,#0x80
	orrne 	r1,r1,#BAD_Rd
	ldr 	r0,[r2,r4, lsl #2]
	cmp 	r0,#0x80
	orrne 	r1,r1,#BAD_Rd
	cmp 	r2,r3
	orrne 	r1,r1,#BAD_Rn

	ldr 	r2,=romvar
	mov 	r2,r2,lsr#1
	mov 	r3,#0xC0000000
	ldr 	r0,[r2,r2]
	cmp 	r0,#0x80
	orrne 	r1,r1,#BAD_Rd

	ldr 	r2,=romvar
	mov 	r3,#0x8
	ldr 	r0,[r2,r3, lsr #32]
	cmp 	r0,#0x80
	orrne 	r1,r1,#BAD_Rd
	
	ldr 	r2,=romvar
	add 	r2,r2,#1
	mov 	r3,#0xC0000000
	ldr 	r0,[r2,r3, asr #32]
	cmp 	r0,#0x80
	orrne 	r1,r1,#BAD_Rd

	ldr 	r2,=romvar
	add 	r2,r2,#2
	ldr 	r3,=0xfffffffc
	adds 	r4,r3,r3		@ set carry
	ldr 	r0,[r2,r3, rrx]
	orrcc 	r1,r1,#1
	cmp 	r0,#0x80
	orrne 	r1,r1,#BAD_Rd

	@ Test non word-aligned load
	ldr 	r0,=romvar2
	mov 	r2,#2
	ldr 	r0,[r0,r2]
	ldr 	r2,=0x8f00ff00
	cmp 	r0,r2
	orrne 	r1,r1,#BAD_Rd
	
	mov 	r2,#4
	orr 	r1,r1,#0x80000000
	ldr 	r0,=szLDR
	bl 	DrawResult
	add 	r8,r8,#8


	@ -R]
	mov 	r1,#0
	ldr 	r0,=romvar
	add 	r2,r0,#8
	add 	r0,r0,#1
	mov 	r3,r2
	mov 	r4,#2
	ldr 	r0,[r0,-r4, lsr #1]
	cmp 	r0,#0x80
	orrne 	r1,r1,#BAD_Rd
	ldr 	r0,[r2,-r4, lsl #2]
	cmp 	r0,#0x80
	orrne 	r1,r1,#BAD_Rd
	cmp 	r2,r3
	orrne 	r1,r1,#BAD_Rn

	ldr 	r2,=romvar
	mov 	r3,#0x8
	ldr 	r0,[r2,-r3, lsr #32]
	cmp 	r0,#0x80
	orrne 	r1,r1,#BAD_Rd

	ldr 	r2,=romvar
	sub 	r2,r2,#1
	mov 	r3,#0x80000000
	ldr 	r0,[r2,-r3, asr #32]
	cmp 	r0,#0x80
	orrne 	r1,r1,#BAD_Rd
	
	ldr 	r2,=romvar
	sub 	r2,r2,#4
	ldr 	r3,=0xfffffff8
	adds 	r4,r3,r3		@ set carry
	ldr 	r0,[r2,-r3, rrx]
	orrcc 	r1,r1,#1
	cmp 	r0,#0x80
	orrne 	r1,r1,#BAD_Rd

	@ Test non word-aligned load
	ldr 	r0,=romvar2+4
	mov 	r2,#1
	ldr 	r0,[r0,-r2, lsl #1]
	ldr 	r2,=0x8f00ff00
	cmp 	r0,r2
	orrne 	r1,r1,#BAD_Rd
	
	mov 	r2,#5
	orr 	r1,r1,#0x80000000
	ldr 	r0,=szLDR
	bl 	DrawResult
	add 	r8,r8,#8
	

	@ +R]!
	mov 	r1,#0
	ldr 	r0,=romvar
	mov 	r3,r0
	sub 	r2,r0,#8
	sub 	r0,r0,#1
	mov 	r4,#2
	ldr 	r0,[r0,r4, lsr #1]!
	cmp 	r0,#0x80
	orrne 	r1,r1,#BAD_Rd
	ldr 	r0,[r2,r4, lsl #2]!
	cmp 	r0,#0x80
	orrne 	r1,r1,#BAD_Rd
	cmp 	r2,r3
	orrne 	r1,r1,#BAD_Rn

	ldr 	r2,=romvar
	mov 	r4,r2
	mov 	r2,r2,lsr#1
	mov 	r3,#0xC0000000
	ldr 	r0,[r2,r2]!
	cmp 	r0,#0x80
	orrne 	r1,r1,#BAD_Rd
	cmp 	r2,r4
	orrne 	r1,r1,#BAD_Rn
	
	ldr 	r2,=romvar
	mov 	r4,r2
	add 	r2,r2,#1
	mov 	r3,#0xC0000000
	ldr 	r0,[r2,r3, asr #32]!
	cmp 	r0,#0x80
	orrne 	r1,r1,#BAD_Rd
	cmp 	r2,r4
	orrne 	r1,r1,#BAD_Rn

	ldr 	r2,=romvar
	mov 	r5,r2
	add 	r2,r2,#2
	ldr 	r3,=0xfffffffc
	adds 	r4,r3,r3		@ set carry
	ldr 	r0,[r2,r3, rrx]!
	orrcc 	r1,r1,#1
	cmp 	r0,#0x80
	orrne 	r1,r1,#BAD_Rd
	cmp 	r2,r5
	orrne 	r1,r1,#BAD_Rn

	@ Test non word-aligned load
	ldr 	r0,=romvar2
	mov 	r2,#2
	ldr 	r0,[r0,r2]!
	ldr 	r2,=0x8f00ff00
	cmp 	r0,r2
	orrne 	r1,r1,#BAD_Rd
	
	mov 	r2,#6
	orr 	r1,r1,#0x80000000
	ldr 	r0,=szLDR
	bl 	DrawResult
	add 	r8,r8,#8


	@ -R]!
	mov 	r1,#0
	ldr 	r0,=romvar
	mov 	r3,r0
	add 	r2,r0,#8
	add 	r0,r0,#1
	mov 	r4,#2
	ldr 	r0,[r0,-r4, lsr #1]!
	cmp 	r0,#0x80
	orrne 	r1,r1,#BAD_Rd
	ldr 	r0,[r2,-r4, lsl #2]!
	cmp 	r0,#0x80
	orrne 	r1,r1,#BAD_Rd
	cmp 	r2,r3
	orrne 	r1,r1,#BAD_Rn

	ldr 	r2,=romvar
	mov 	r4,r2
	sub 	r2,r2,#1
	mov 	r3,#0x80000000
	ldr 	r0,[r2,-r3, asr #32]!
	cmp 	r0,#0x80
	orrne 	r1,r1,#BAD_Rd
	cmp 	r2,r4
	orrne 	r1,r1,#BAD_Rn
	
	ldr 	r2,=romvar
	mov 	r5,r2
	sub 	r2,r2,#4
	ldr 	r3,=0xfffffff8
	adds 	r4,r3,r3		@ set carry
	ldr 	r0,[r2,-r3, rrx]!
	orrcc 	r1,r1,#1
	cmp 	r0,#0x80
	orrne 	r1,r1,#BAD_Rd
	cmp 	r2,r5
	orrne 	r1,r1,#BAD_Rn

	@ Test non word-aligned load
	ldr 	r0,=romvar2+4
	mov 	r2,#2
	ldr 	r0,[r0,-r2]!
	ldr 	r2,=0x8f00ff00
	cmp 	r0,r2
	orrne 	r1,r1,#BAD_Rd
	
	mov 	r2,#7
	orr 	r1,r1,#0x80000000
	ldr 	r0,=szLDR
	bl 	DrawResult
	add 	r8,r8,#8
	

	@ ]+#
	mov 	r1,#0
	ldr 	r0,=romvar
	add 	r3,r0,#3
	mov 	r2,r0
	ldr 	r0,[r0],#3
	cmp 	r0,#0x80
	orrne 	r1,r1,#BAD_Rd
	ldr 	r0,[r2],#3
	cmp 	r0,#0x80
	orrne 	r1,r1,#BAD_Rd
	cmp 	r2,r3
	orrne 	r1,r1,#BAD_Rn
	@ Test non word-aligned load
	ldr 	r0,=romvar2+2
	ldr 	r0,[r0],#5
	ldr 	r2,=0x8f00ff00
	cmp 	r0,r2
	orrne 	r1,r1,#BAD_Rd
	mov 	r2,#8
	orr 	r1,r1,#0x80000000
	ldr 	r0,=szLDR
	bl 	DrawResult
	add 	r8,r8,#8

	@ ]-#
	mov 	r1,#0
	ldr 	r0,=romvar
	mov 	r2,r0
	sub 	r3,r0,#0xff
	ldr 	r0,[r0],#-0xff
	cmp 	r0,#0x80
	orrne 	r1,r1,#BAD_Rd
	ldr 	r0,[r2],#-0xff
	cmp 	r0,#0x80
	orrne 	r1,r1,#BAD_Rd
	cmp 	r2,r3
	orrne 	r1,r1,#BAD_Rn
	@ Test non word-aligned load
	ldr 	r0,=romvar2+2
	ldr 	r0,[r0],#-5
	ldr 	r2,=0x8f00ff00
	cmp 	r0,r2
	orrne 	r1,r1,#BAD_Rd
	mov 	r2,#9
	orr 	r1,r1,#0x80000000
	ldr 	r0,=szLDR
	bl 	DrawResult
	add 	r8,r8,#8


	@ ]+R
	mov 	r1,#0
	ldr 	r0,=romvar
	mov 	r2,r0
	add 	r5,r0,#8
	mov 	r3,r0
	mov 	r4,#2
	ldr 	r0,[r0],r4, lsr #1
	cmp 	r0,#0x80
	orrne 	r1,r1,#BAD_Rd
	ldr 	r0,[r2],r4, lsl #2
	cmp 	r0,#0x80
	orrne 	r1,r1,#BAD_Rd
	cmp 	r2,r5
	orrne 	r1,r1,#BAD_Rn

	ldr 	r2,=romvar
	mov 	r0,#123
	add 	r3,r2,r0
	ldr 	r0,[r2],r0
	cmp 	r0,#0x80
	orrne 	r1,r1,#BAD_Rd
	cmp 	r2,r3
	orrne 	r1,r1,#BAD_Rn
	
	ldr 	r2,=romvar
	sub 	r4,r2,#1
	mov 	r3,#0xC0000000
	ldr 	r0,[r2],r3, asr #32
	cmp 	r0,#0x80
	orrne 	r1,r1,#BAD_Rd
	cmp 	r2,r4
	orrne 	r1,r1,#BAD_Rn

	ldr 	r2,=romvar
	sub 	r4,r2,#2
	ldr 	r3,=0xfffffffc
	adds 	r5,r3,r3		@ set carry
	ldr 	r0,[r2],r3, rrx
	orrcc 	r1,r1,#1
	cmp 	r0,#0x80
	orrne 	r1,r1,#BAD_Rd
	cmp 	r2,r4
	orrne 	r1,r1,#BAD_Rn

	@ Test non word-aligned load
	ldr 	r0,=romvar2+2
	mov 	r2,#1
	ldr 	r0,[r0],r2
	ldr 	r2,=0x8f00ff00
	cmp 	r0,r2
	orrne 	r1,r1,#BAD_Rd
	
	mov 	r2,#10
	orr 	r1,r1,#0x80000000
	ldr 	r0,=szLDR
	bl 	DrawResult
	add 	r8,r8,#8


	@ ]-R
	mov 	r1,#0
	ldr 	r0,=romvar
	mov 	r2,r0
	sub 	r5,r0,#16
	mov 	r3,r0
	mov 	r4,#2
	ldr 	r0,[r0],-r4, lsr #1
	cmp 	r0,#0x80
	orrne 	r1,r1,#BAD_Rd
	ldr 	r0,[r2],-r4, lsl #3
	cmp 	r0,#0x80
	orrne 	r1,r1,#BAD_Rd
	cmp 	r2,r5
	orrne 	r1,r1,#BAD_Rn

	ldr	r2,=romvar
	mov 	r0,#123
	sub 	r3,r2,r0
	ldr 	r0,[r2],-r0
	cmp 	r0,#0x80
	orrne 	r1,r1,#BAD_Rd
	cmp 	r2,r3
	orrne 	r1,r1,#BAD_Rn
	
	ldr 	r2,=romvar
	add 	r4,r2,#1
	mov 	r3,#0xC0000000
	ldr 	r0,[r2],-r3, asr #32
	cmp 	r0,#0x80
	orrne 	r1,r1,#BAD_Rd
	cmp 	r2,r4
	orrne 	r1,r1,#BAD_Rn

	ldr 	r2,=romvar
	add 	r4,r2,#2
	ldr 	r3,=0xfffffffc
	adds 	r5,r3,r3		@ set carry
	ldr 	r0,[r2],-r3, rrx
	orrcc 	r1,r1,#1
	cmp 	r0,#0x80
	orrne 	r1,r1,#BAD_Rd
	cmp 	r2,r4
	orrne 	r1,r1,#BAD_Rn

	@ Test non word-aligned load
	ldr 	r0,=romvar2+2
	mov 	r2,#5
	ldr 	r0,[r0],-r2
	ldr 	r2,=0x8f00ff00
	cmp 	r0,r2
	orrne 	r1,r1,#BAD_Rd
	
	mov 	r2,#11
	orr 	r1,r1,#0x80000000
	ldr 	r0,=szLDR
	bl 	DrawResult
	add 	r8,r8,#8
	
	
	
	@ LDRH
	
	@ +#]
	mov 	r1,#0
	ldr 	r0,=romvar2
	sub 	r0,r0,#1
	sub 	r2,r0,#3
	mov 	r3,r2
	ldrh 	r0,[r0,#1]
	ldr 	r5,=0x00008f00
	cmp 	r0,r5
	orrne 	r1,r1,#BAD_Rd
	ldrh 	r0,[r2,#4]
	cmp 	r0,r5
	orrne 	r1,r1,#BAD_Rd
	cmp 	r2,r3
	orrne 	r1,r1,#BAD_Rn
	mov 	r2,#0
	orr 	r1,r1,#0x80000000
	ldr 	r0,=szLDRH
	bl 	DrawResult
	add 	r8,r8,#8

	@ -#]
	mov 	r1,#0
	ldr 	r0,=romvar2
	add 	r0,r0,#1
	add 	r2,r0,#3
	mov 	r3,r2
	ldrh 	r0,[r0,#-1]
	ldr 	r5,=0x00008f00
	cmp 	r0,r5
	orrne 	r1,r1,#BAD_Rd
	ldrh 	r0,[r2,#-4]
	cmp 	r0,r5
	orrne 	r1,r1,#BAD_Rd
	cmp 	r2,r3
	orrne 	r1,r1,#BAD_Rn
	mov 	r2,#1
	orr 	r1,r1,#0x80000000
	ldr 	r0,=szLDRH
	bl 	DrawResult
	add 	r8,r8,#8

	@ +#]!
	mov 	r1,#0
	ldr 	r0,=romvar2
	mov 	r3,r0
	sub 	r0,r0,#1
	sub 	r2,r0,#3
	ldrh 	r0,[r0,#1]!
	ldr 	r5,=0x00008f00
	cmp 	r0,r5
	orrne 	r1,r1,#BAD_Rd
	ldrh 	r0,[r2,#4]!
	cmp 	r0,r5
	orrne 	r1,r1,#BAD_Rd
	cmp 	r2,r3
	orrne 	r1,r1,#BAD_Rn
	mov 	r2,#2
	orr 	r1,r1,#0x80000000
	ldr 	r0,=szLDRH
	bl 	DrawResult
	add 	r8,r8,#8

	@ -#]!
	mov 	r1,#0
	ldr 	r0,=romvar2
	mov 	r3,r0
	add 	r0,r0,#1
	add 	r2,r0,#3
	ldrh 	r0,[r0,#-1]!
	ldr 	r5,=0x00008f00
	cmp 	r0,r5
	orrne 	r1,r1,#BAD_Rd
	ldrh 	r0,[r2,#-4]!
	cmp 	r0,r5
	orrne 	r1,r1,#BAD_Rd
	cmp 	r2,r3
	orrne 	r1,r1,#BAD_Rn
	mov 	r2,#3
	orr 	r1,r1,#0x80000000
	ldr 	r0,=szLDRH
	bl 	DrawResult
	add 	r8,r8,#8
	
	ldmfd 	sp!,{lr}
	mov 	pc,lr
.pool
.align



Test3:
	stmfd 	sp!,{lr}

	ldr 	r0,=szLS2
	mov 	r1,#52
	mov 	r2,#1
	mov 	r3,#4
	bl 	DrawText


	@ LDRH
	
	@ +#]
	mov 	r1,#0
	ldr 	r0,=romvar2
	sub 	r0,r0,#1
	sub 	r2,r0,#3
	mov 	r3,r2
	mov 	r4,#1
	ldrh 	r0,[r0,r4]
	ldr 	r5,=0x00008f00
	cmp 	r0,r5
	orrne 	r1,r1,#BAD_Rd
	mov 	r4,#4
	ldrh 	r0,[r2,r4]
	cmp 	r0,r5
	orrne 	r1,r1,#BAD_Rd
	cmp 	r2,r3
	orrne 	r1,r1,#BAD_Rn
	mov 	r2,#4
	orr 	r1,r1,#0x80000000
	ldr 	r0,=szLDRH
	bl 	DrawResult
	add 	r8,r8,#8

	@ -#]
	mov 	r1,#0
	ldr 	r0,=romvar2
	add 	r0,r0,#1
	add 	r2,r0,#3
	mov 	r3,r2
	mov 	r4,#1
	ldrh 	r0,[r0,-r4]
	ldr 	r5,=0x00008f00
	cmp 	r0,r5
	orrne 	r1,r1,#BAD_Rd
	mov 	r4,#4
	ldrh 	r0,[r2,-r4]
	cmp 	r0,r5
	orrne 	r1,r1,#BAD_Rd
	cmp 	r2,r3
	orrne 	r1,r1,#BAD_Rn
	mov 	r2,#5
	orr 	r1,r1,#0x80000000
	ldr 	r0,=szLDRH
	bl 	DrawResult
	add 	r8,r8,#8
	
	
	@ LDRB
	
	@ +#]
	mov 	r1,#0
	ldr 	r0,=romvar2
	sub 	r2,r0,#1
	mov 	r3,r2
	ldrb 	r0,[r0,#3]
	cmp 	r0,#0xff
	orrne 	r1,r1,#BAD_Rd
	ldrb 	r0,[r2,#3]
	cmp 	r0,#0
	orrne 	r1,r1,#BAD_Rd
	cmp 	r2,r3
	orrne 	r1,r1,#BAD_Rn
	mov 	r2,#0
	orr 	r1,r1,#0x80000000
	ldr 	r0,=szLDRB
	bl 	DrawResult
	add 	r8,r8,#8

	@ -#]
	mov 	r1,#0
	ldr 	r0,=romvar2
	add 	r0,r0,#4
	add 	r2,r0,#1
	mov 	r3,r2
	ldrb 	r0,[r0,#-1]
	cmp 	r0,#0xff
	orrne 	r1,r1,#BAD_Rd
	ldrb 	r0,[r2,#-3]
	cmp 	r0,#0
	orrne 	r1,r1,#BAD_Rd
	cmp 	r2,r3
	orrne 	r1,r1,#BAD_Rn
	mov 	r2,#1
	orr 	r1,r1,#0x80000000
	ldr 	r0,=szLDRB
	bl 	DrawResult
	add 	r8,r8,#8

	@ +#]!
	mov 	r1,#0
	ldr 	r0,=romvar2
	add 	r3,r0,#2
	sub 	r2,r0,#3
	ldrb 	r0,[r0,#3]!
	cmp 	r0,#0xff
	orrne 	r1,r1,#BAD_Rd
	ldrb 	r0,[r2,#5]!
	cmp 	r0,#0
	orrne 	r1,r1,#BAD_Rd
	cmp 	r2,r3
	orrne 	r1,r1,#BAD_Rn
	mov 	r2,#2
	orr 	r1,r1,#0x80000000
	ldr 	r0,=szLDRB
	bl 	DrawResult
	add 	r8,r8,#8

	@ -#]!
	mov 	r1,#0
	ldr 	r0,=romvar2
	add 	r3,r0,#2
	add 	r0,r0,#4
	add 	r2,r0,#1
	ldrb 	r0,[r0,#-1]!
	cmp 	r0,#0xff
	orrne 	r1,r1,#BAD_Rd
	ldrb 	r0,[r2,#-3]!
	cmp 	r0,#0
	orrne 	r1,r1,#BAD_Rd
	cmp 	r2,r3
	orrne 	r1,r1,#BAD_Rn
	mov 	r2,#3
	orr 	r1,r1,#0x80000000
	ldr 	r0,=szLDRB
	bl 	DrawResult
	add 	r8,r8,#8
	

	@ LDRSB
	
	@ +#]
	mov 	r1,#0
	ldr 	r0,=romvar3
	sub 	r2,r0,#3
	mov 	r3,r2
	ldrsb 	r0,[r0,#0]
	ldr 	r5,=0xffffff80
	cmp 	r0,r5
	orrne 	r1,r1,#BAD_Rd
	ldrsb 	r0,[r2,#4]
	cmp 	r0,#0x7f
	orrne 	r1,r1,#BAD_Rd
	cmp 	r2,r3
	orrne 	r1,r1,#BAD_Rn
	mov 	r2,#0
	orr 	r1,r1,#0x80000000
	ldr 	r0,=szLDRSB
	bl 	DrawResult
	add 	r8,r8,#8


	@ -#]
	mov 	r1,#0
	ldr 	r0,=romvar3
	add 	r2,r0,#3
	add 	r0,r0,#1
	mov 	r3,r2
	ldrsb 	r0,[r0,#-1]
	ldr 	r5,=0xffffff80
	cmp 	r0,r5
	orrne 	r1,r1,#BAD_Rd
	ldrsb 	r0,[r2,#-2]
	cmp 	r0,#0x7f
	orrne 	r1,r1,#BAD_Rd
	cmp 	r2,r3
	orrne 	r1,r1,#BAD_Rn
	mov 	r2,#1
	orr 	r1,r1,#0x80000000
	ldr 	r0,=szLDRSB
	bl 	DrawResult
	add 	r8,r8,#8

	@ +R]
	mov 	r1,#0
	ldr 	r0,=romvar3
	sub 	r2,r0,#3
	mov 	r3,r2
	mov 	r4,#4
	ldrsb 	r0,[r0,r9]
	ldr 	r5,=0xffffff80
	cmp 	r0,r5
	orrne 	r1,r1,#BAD_Rd
	ldrsb 	r0,[r2,r4]
	cmp 	r0,#0x7f
	orrne 	r1,r1,#BAD_Rd
	cmp 	r2,r3
	orrne 	r1,r1,#BAD_Rn
	mov 	r2,#4
	orr 	r1,r1,#0x80000000
	ldr 	r0,=szLDRSB
	bl 	DrawResult
	add 	r8,r8,#8


	@ -R]
	mov 	r1,#0
	ldr 	r0,=romvar3
	add 	r2,r0,#3
	add 	r0,r0,#1
	mov 	r3,r2
	mov 	r4,#1
	ldrsb 	r0,[r0,-r4]
	ldr 	r5,=0xffffff80
	cmp 	r0,r5
	orrne 	r1,r1,#BAD_Rd
	add 	r4,r4,r4
	ldrsb 	r0,[r2,-r4]
	cmp 	r0,#0x7f
	orrne 	r1,r1,#BAD_Rd
	cmp 	r2,r3
	orrne 	r1,r1,#BAD_Rn
	mov 	r2,#5
	orr 	r1,r1,#0x80000000
	ldr 	r0,=szLDRSB
	bl 	DrawResult
	add 	r8,r8,#8
	
	
	ldmfd 	sp!,{lr}
	mov 	pc,lr
.pool
.align



Test4:
	stmfd 	sp!,{lr}

	ldr 	r0,=szLDM1
	mov 	r1,#52
	mov 	r2,#1
	mov 	r3,#4
	bl 	DrawText

	@ LDMIB!
	mov 	r1,#0
	ldr 	r3,=var64
	sub 	r3,r3,#4
	ldmib 	r3!,{r4,r5}
	ldr 	r0,=var64+4
	cmp 	r3,r0
	orrne 	r1,r1,#BAD_Rn
	mov 	r4,#5

	@ Test writeback for when the base register is included in the

	@ register list.

	ldr 	r3,=var64
	sub 	r3,r3,#4
	ldmib 	r3!,{r2,r3}
	ldr 	r0,=var64+4
	mov 	r5,r2
	ldr 	r2,[r0]
	cmp 	r3,r2
	orrne 	r1,r1,#BAD_Rn
	ldrne 	r2,=rnVal
	strne 	r3,[r2]

	ldr 	r3,=var64
	sub 	r3,r3,#4
	ldmib 	r3!,{r3,r5}
	ldr 	r2,=var64+4
	cmp 	r3,r2
	orrne 	r1,r1,#BAD_Rn
	ldrne 	r2,=rnVal
	strne 	r3,[r2]
	
	ldr 	r2,[r0]
	cmp 	r5,r2
	orrne 	r1,r1,#BAD_Rd
	cmp 	r4,#5
	orrne 	r1,r1,#BAD_Rd
	mov 	r2,#0
	orr 	r1,r1,#0x40000000
	ldr 	r0,=szLDM
	bl 	DrawResult
	add 	r8,r8,#8


	@ LDMIA!
	mov 	r1,#0
	ldr 	r3,=var64
	ldmia 	r3!,{r4,r5}
	ldr 	r0,=var64+8
	cmp 	r3,r0
	orrne 	r1,r1,#BAD_Rn
	mov 	r4,#5

	@ Test writeback for when the base register is included in the
	@ register list.
	ldr 	r3,=var64
	ldmia 	r3!,{r2,r3}
	ldr 	r0,=var64+4
	mov 	r5,r2
	ldr 	r2,[r0]
	cmp 	r3,r2
	orrne 	r1,r1,#BAD_Rn
	ldrne 	r2,=rnVal
	strne 	r3,[r2]

	ldr 	r3,=var64
	ldmia 	r3!,{r3,r5}
	ldr 	r2,=var64+8
	cmp 	r3,r2
	orrne 	r1,r1,#BAD_Rn
	ldrne 	r2,=rnVal
	strne 	r3,[r2]
	
	ldr 	r2,[r0]
	cmp 	r5,r2
	orrne 	r1,r1,#BAD_Rd
	cmp 	r4,#5
	orrne 	r1,r1,#BAD_Rd
	mov 	r2,#1
	orr 	r1,r1,#0x40000000
	ldr 	r0,=szLDM
	bl 	DrawResult
	add 	r8,r8,#8


	@ LDMDB!
	mov 	r1,#0
	ldr 	r3,=var64+8
	ldmdb 	r3!,{r4,r5}
	ldr 	r0,=var64
	cmp 	r3,r0
	orrne 	r1,r1,#BAD_Rn
	mov 	r4,#5

	@ Test writeback for when the base register is included in the
	@ register list.
	ldr 	r3,=var64+8
	ldmdb 	r3!,{r2,r3}
	ldr 	r0,=var64+4
	mov 	r5,r2
	ldr 	r2,[r0]
	cmp 	r3,r2
	orrne 	r1,r1,#BAD_Rn
	ldrne 	r2,=rnVal
	strne 	r3,[r2]

	ldr 	r3,=var64+8
	ldmdb 	r3!,{r3,r5}
	ldr 	r2,=var64
	cmp 	r3,r2
	orrne 	r1,r1,#BAD_Rn
	ldrne 	r2,=rnVal
	strne 	r3,[r2]
	
	ldr 	r2,[r0]
	cmp 	r5,r2
	orrne 	r1,r1,#BAD_Rd
	cmp 	r4,#5
	orrne 	r1,r1,#BAD_Rd
	mov 	r2,#2
	orr 	r1,r1,#0x40000000
	ldr 	r0,=szLDM
	bl 	DrawResult
	add 	r8,r8,#8
	

	@ LDMDA!
	mov 	r1,#0
	ldr 	r3,=var64+4
	ldmda 	r3!,{r4,r5}
	ldr 	r0,=var64-4
	cmp 	r3,r0
	orrne 	r1,r1,#BAD_Rn
	mov 	r4,#5

	@ Test writeback for when the base register is included in the
	@ register list.
	ldr 	r3,=var64+4
	ldmda 	r3!,{r2,r3}
	ldr 	r0,=var64+4
	mov 	r5,r2
	ldr 	r2,[r0]
	cmp 	r3,r2
	orrne 	r1,r1,#BAD_Rn	@ r3 should contain the value loaded from memory
	ldrne 	r2,=rnVal
	strne 	r3,[r2]

	ldr 	r3,=var64+4
	ldmda 	r3!,{r3,r5}
	ldr 	r2,=var64-4
	cmp 	r3,r2
	orrne 	r1,r1,#BAD_Rn	@ r3 should contain the updated base
	ldrne 	r2,=rnVal
	strne 	r3,[r2]
	
	ldr 	r2,[r0]
	cmp 	r5,r2
	orrne 	r1,r1,#BAD_Rd
	cmp 	r4,#5
	orrne 	r1,r1,#BAD_Rd	@ Make sure that the LDM didn't touch other registers
	mov 	r2,#3
	orr 	r1,r1,#0x40000000
	ldr 	r0,=szLDM
	bl 	DrawResult
	add 	r8,r8,#8

	
	@ LDMIBS!
	mov	r0, #0x12	@ Switch to IRQ mode
	msr	cpsr, r0
	mov	r1,#0
	mov	r14,#123
	ldr	r0,=var64-4
	ldmib	r0!,{r3,r14}^
	ldr	r2,=var64+4
	cmp	r0,r2
	orrne	r1,r1,#BAD_Rn
	ldrne 	r5,=rnVal
	strne 	r0,[r5]
	sub	r2,r2,#4
	ldr	r2,[r2]
	cmp	r2,r3
	orrne	r1,r1,#BAD_Rd
	cmp	r14,#123
	orrne	r1,r1,#BAD_Rd
	mov 	r2,#4
	mov	r0, #0x1F	@ Switch to user mode
	msr	cpsr, r0
	orr 	r1,r1,#0x40000000
	ldr 	r0,=szLDM
	bl 	DrawResult
	add 	r8,r8,#8

	@ LDMIAS!
	mov	r0, #0x12	@ Switch to IRQ mode
	msr	cpsr, r0
	mov	r1,#0
	mov	r14,#123
	ldr	r0,=var64
	ldmia	r0!,{r3,r14}^
	ldr	r2,=var64+8
	cmp	r0,r2
	orrne	r1,r1,#BAD_Rn
	ldrne 	r5,=rnVal
	strne 	r0,[r5]
	sub	r2,r2,#8
	ldr	r2,[r2]
	cmp	r2,r3
	orrne	r1,r1,#BAD_Rd
	cmp	r14,#123
	orrne	r1,r1,#BAD_Rd
	mov 	r2,#5
	mov	r0, #0x1F	@ Switch to user mode
	msr	cpsr, r0
	orr 	r1,r1,#0x40000000
	ldr 	r0,=szLDM
	bl 	DrawResult
	add 	r8,r8,#8

	@ LDMDBS!
	mov	r0, #0x12	@ Switch to IRQ mode
	msr	cpsr, r0
	mov	r1,#0
	mov	r14,#123
	ldr	r0,=var64+8
	ldmdb	r0!,{r3,r14}^
	ldr	r2,=var64
	cmp	r0,r2
	orrne	r1,r1,#BAD_Rn
	ldrne 	r5,=rnVal
	strne 	r0,[r5]
	ldr	r2,[r2]
	cmp	r2,r3
	orrne	r1,r1,#BAD_Rd
	cmp	r14,#123
	orrne	r1,r1,#BAD_Rd
	mov 	r2,#6
	mov	r0, #0x1F	@ Switch to user mode
	msr	cpsr, r0
	orr 	r1,r1,#0x40000000
	ldr 	r0,=szLDM
	bl 	DrawResult
	add 	r8,r8,#8

	@ LDMDAS!
	mov	r0, #0x12	@ Switch to IRQ mode
	msr	cpsr, r0
	mov	r1,#0
	mov	r14,#123
	ldr	r0,=var64+4
	ldmda	r0!,{r3,r14}^
	ldr	r2,=var64-4
	cmp	r0,r2
	orrne	r1,r1,#BAD_Rn
	ldrne 	r5,=rnVal
	strne 	r0,[r5]
	add	r2,r2,#4
	ldr	r2,[r2]
	cmp	r2,r3
	orrne	r1,r1,#BAD_Rd
	cmp	r14,#123
	orrne	r1,r1,#BAD_Rd
	mov 	r2,#7
	mov	r0, #0x1F	@ Switch to user mode
	msr	cpsr, r0
	orr 	r1,r1,#0x40000000
	ldr 	r0,=szLDM
	bl 	DrawResult
	add 	r8,r8,#8
	
	@ STMIB!
	mov 	r1,#0
	ldr 	r3,=(VARBASE+0x1FC)
	mov 	r4,#5
	stmib 	r3!,{r3,r4,r5}
	ldr 	r0,=(VARBASE+0x208)
	cmp 	r3,r0
	orrne 	r1,r1,#BAD_Rn
	ldrne 	r5,=rnVal
	strne 	r3,[r5]
	sub 	r0,r0,#8
	ldr 	r2,[r0]
	sub 	r0,r0,#4
	cmp 	r2,r0
	@orrne 	r1,r1,#0x80
	@ldrne	r0,=memVal
	@strne	r2,[r0]

	ldr 	r3,=(VARBASE+0x1FC)
	mov 	r4,#5
	stmib 	r3!,{r2,r3,r4}
	ldr 	r0,=(VARBASE+0x208)
	cmp 	r3,r0
	orrne 	r1,r1,#BAD_Rn
	ldrne 	r5,=rnVal
	strne 	r3,[r5]
	ldr	r2,[r0]
	cmp	r4,r2
	orrne	r1,r1,#0x80
	ldrne	r0,=memVal
	strne	r4,[r0] @r2,[r0]
	

	@ldr 	r0,=(VARBASE+0x204)
	@ldr 	r2,[r0]
	@ldr	r3,=(VARBASE+0x208)
	@cmp 	r3,r2
	@orrne 	r1,r1,#0x80
	@ldrne	r0,=memVal
	@strne	r2,[r0]
	
	mov 	r2,#0
	orr 	r1,r1,#0x40000000
	ldr 	r0,=szSTM
	bl 	DrawResult
	add 	r8,r8,#8
	
	@ STMIA!
	mov 	r1,#0
	ldr 	r3,=(VARBASE+0x200)
	mov 	r4,#5
	stmia 	r3!,{r3,r4,r5}
	ldr 	r0,=(VARBASE+0x20C)
	cmp 	r3,r0
	orrne 	r1,r1,#BAD_Rn
	ldrne 	r5,=rnVal
	strne 	r3,[r5]
	sub 	r0,r0,#0xC
	ldr 	r2,[r0]
	cmp 	r2,r0
	orrne 	r1,r1,#0x80
	ldrne	r4,=memVal
	strne	r0,[r4] @r2,[r4]

	ldr 	r3,=(VARBASE+0x200)
	mov 	r4,#5
	stmia 	r3!,{r2,r3,r4}
	ldr 	r0,=(VARBASE+0x20C)
	cmp 	r3,r0
	orrne 	r1,r1,#BAD_Rn
	ldrne 	r5,=rnVal
	strne 	r3,[r5]
	ldr 	r0,=(VARBASE+0x208)
	ldr	r2,[r0]
	cmp	r4,r2
	@orrne	r1,r1,#0x80
	@ldrne	r0,=memVal
	@strne	r2,[r0]
	

	@ldr 	r0,=(VARBASE+0x204)
	@ldr 	r2,[r0]
	@ldr	r3,=(VARBASE+0x20C)
	@cmp 	r3,r2
	@orrne 	r1,r1,#0x80
	@ldrne	r0,=memVal
	@strne	r2,[r0]
	
	mov 	r2,#1
	orr 	r1,r1,#0x40000000
	ldr 	r0,=szSTM
	bl 	DrawResult
	add 	r8,r8,#8	


	@ STMDB!
	mov 	r1,#0
	ldr 	r3,=(VARBASE+0x20C)
	mov 	r4,#5
	stmdb 	r3!,{r3,r4,r5}
	ldr 	r0,=(VARBASE+0x200)
	cmp 	r3,r0
	orrne 	r1,r1,#BAD_Rn
	ldrne 	r5,=rnVal
	strne 	r3,[r5]
	ldr 	r2,[r0]
	add	r0,r0,#0xC
	cmp 	r2,r0
	orrne 	r1,r1,#0x80
	ldrne	r0,=memVal
	strne	r2,[r0]

	ldr 	r3,=(VARBASE+0x20C)
	mov 	r4,#5
	stmdb 	r3!,{r2,r3,r4}
	ldr 	r0,=(VARBASE+0x200)
	cmp 	r3,r0
	orrne 	r1,r1,#BAD_Rn
	ldrne 	r5,=rnVal
	strne 	r3,[r5]
	add	r0,r0,#8
	ldr	r2,[r0]
	cmp	r4,r2
	orrne	r1,r1,#0x80
	ldrne	r0,=memVal
	strne	r2,[r0]
	@ldr 	r0,=(VARBASE+0x204)
	@ldr 	r2,[r0]
	@ldr	r3,=(VARBASE+0x200)
	@cmp 	r3,r2
	@orrne 	r1,r1,#0x80
	@ldrne	r0,=memVal
	@strne	r2,[r0]
	
	mov 	r2,#2
	orr 	r1,r1,#0x40000000
	ldr 	r0,=szSTM
	bl 	DrawResult
	add 	r8,r8,#8


	@ STMDA!
	mov 	r1,#0
	ldr 	r3,=(VARBASE+0x208)
	mov 	r4,#5
	stmda 	r3!,{r3,r4,r5}
	ldr 	r0,=(VARBASE+0x1FC)
	cmp 	r3,r0
	orrne 	r1,r1,#BAD_Rn
	ldrne 	r5,=rnVal
	strne 	r3,[r5]
	add	r0,r0,#4
	ldr 	r2,[r0]
	add	r0,r0,#8
	cmp 	r2,r0
	orrne 	r1,r1,#0x80
	ldrne	r0,=memVal
	strne	r2,[r0]

	ldr 	r3,=(VARBASE+0x208)
	mov 	r4,#5
	stmda 	r3!,{r2,r3,r4}
	ldr 	r0,=(VARBASE+0x1FC)
	cmp 	r3,r0
	orrne 	r1,r1,#BAD_Rn
	ldrne 	r5,=rnVal
	strne 	r3,[r5]
	add	r0,r0,#0xC
	ldr	r2,[r0]
	cmp	r4,r2
	orrne	r1,r1,#0x80
	ldrne	r0,=memVal
	strne	r2,[r0]
	@ldr 	r0,=(VARBASE+0x204)
	@ldr 	r2,[r0]
	@ldr	r3,=(VARBASE+0x1FC)
	@cmp 	r3,r2
	@orrne 	r1,r1,#0x80
	@ldrne	r0,=memVal
	@strne	r2,[r0]
	
	mov 	r2,#3
	orr 	r1,r1,#0x40000000
	ldr 	r0,=szSTM
	bl 	DrawResult
	add 	r8,r8,#8
	
	ldmfd sp!,{lr}
	mov pc,lr
.pool
.align



	
Test5:
	stmfd sp!,{lr}
	
	ldr r0,=szAV5
	mov r1,#64
	mov r2,#1
	mov r3,#4
	bl DrawText
	

	@ CLZ
	mov 	r1,#0
	mov 	r2,#0x80000000
	mov 	r3,#0x1F
	mov 	r4,#0
	clz 	r0,r2
	cmp 	r0,#0
	orrne 	r1,r1,#BAD_Rd
	clz 	r0,r3
	cmp 	r0,#27
	orrne 	r1,r1,#BAD_Rd
	clz 	r0,r4
	cmp 	r0,#32
	orrne 	r1,r1,#BAD_Rd
	ldr 	r0,=szCLZ
	bl 	DrawResult
	add 	r8,r8,#8

	@ LDRD
	mov 	r1,#0
	ldr 	r0,=var64
	mov 	r2,#0

	mov 	r3,#0
	ldrd 	r2,[r0],#-1
	ldr 	r4,=0x11223344
	ldr 	r5,=0x55667788
	cmp 	r2,r4
	orrne 	r1,r1,#BAD_Rd
	cmp 	r3,r5
	orrne 	r1,r1,#BAD_Rd
	ldr 	r4,=var64 - 1
	cmp 	r0,r4
	orrne 	r1,r1,#BAD_Rn
	ldr 	r0,=szLDRD
	bl 	DrawResult
	add 	r8,r8,#8
	
	
	@ MRC
	mrc 	p15,0,r2,c0,c0,1	@ Get cache type
	mov 	r1,#0
	ldr 	r3,=0x0F0D2112
	cmp 	r2,r3
	orrne 	r1,r1,#BAD_Rd		@ Harvard, 4k data 4-way, 8k instr 4-way	
	ldr 	r0,=szMRC
	bl 	DrawResult
	add 	r8,r8,#8


	@ QADD
	mov 	r1,#0
	msr 	cpsr_f,#0
	mov 	r2,#0x70000000
	qadd 	r3,r2,r2
	ldr 	r4,=0x7FFFFFFF
	cmp 	r3,r4
	orrne 	r1,r1,#BAD_Rd
	mrs 	r3,cpsr
	and 	r3,r3,#0x08000000	@0xF8000000
	cmp 	r3,#0x08000000
	orrne 	r1,r1,#0x40
	ldr 	r0,=szQADD
	bl 	DrawResult
	add 	r8,r8,#8

	@ SMLABB
	mov 	r1,#0
	msr 	cpsr_f,#0
	mov 	r2,#0x7000
	mov 	r3,#0x7000
	mov 	r4,#0x50000000
	smlabb	r5,r2,r3,r4
	@ldr 	r4,=0x7FFFFFFF
	ldr 	r4,=0x81000000
	cmp 	r5,r4
	orrne 	r1,r1,#BAD_Rd
	mrs 	r3,cpsr
	and 	r3,r3,#0x08000000
	cmp 	r3,#0x08000000
	orrne 	r1,r1,#0x40
	mov 	r3,#0x7000
	mov 	r4,#0
	smlabb 	r5,r2,r3,r4
	ldr 	r4,=0x31000000
	cmp 	r5,r4
	orrne 	r1,r1,#BAD_Rd
	mrs 	r3,cpsr
	and 	r3,r3,#0x08000000
	cmp 	r3,#0x08000000
	orrne 	r1,r1,#0x40
	ldr 	r0,=szSMLABB
	bl 	DrawResult
	add 	r8,r8,#8


	@ SMLABT
	mov 	r1,#0
	msr 	cpsr_f,#0
	mov 	r2,#0x00007000
	mov 	r3,#0x70000000
	mov 	r4,#0x50000000
	smlabt 	r5,r2,r3,r4
	@ldr 	r4,=0x7FFFFFFF
	ldr 	r4,=0x81000000
	cmp 	r5,r4
	orrne 	r1,r1,#BAD_Rd
	mrs 	r3,cpsr
	and 	r3,r3,#0x08000000
	cmp 	r3,#0x08000000
	orrne 	r1,r1,#0x40
	mov 	r3,#0x70000000
	mov 	r4,#0
	smlabt 	r5,r2,r3,r4
	ldr 	r4,=0x31000000
	cmp 	r5,r4
	orrne 	r1,r1,#BAD_Rd
	mrs 	r3,cpsr
	and 	r3,r3,#0x08000000
	cmp 	r3,#0x08000000
	orrne 	r1,r1,#0x40
	ldr 	r0,=szSMLABT
	bl 	DrawResult
	add 	r8,r8,#8

	@ SMLATB
	mov 	r1,#0
	msr 	cpsr_f,#0
	mov 	r2,#0x00007000
	mov 	r3,#0x70000000
	mov 	r4,#0x50000000
	smlatb 	r5,r3,r2,r4
	@ldr 	r4,=0x7FFFFFFF
	ldr 	r4,=0x81000000
	cmp 	r5,r4
	orrne 	r1,r1,#BAD_Rd
	mrs 	r3,cpsr
	and 	r3,r3,#0x08000000
	cmp 	r3,#0x08000000
	orrne 	r1,r1,#0x40
	mov 	r3,#0x70000000
	mov 	r4,#0
	smlatb 	r5,r3,r2,r4
	ldr 	r4,=0x31000000
	cmp 	r5,r4
	orrne 	r1,r1,#BAD_Rd
	mrs 	r3,cpsr
	and 	r3,r3,#0x08000000
	cmp 	r3,#0x08000000
	orrne 	r1,r1,#0x40
	ldr 	r0,=szSMLATB
	bl 	DrawResult
	add 	r8,r8,#8

	@ SMLATT
	mov 	r1,#0
	msr 	cpsr_f,#0
	mov 	r2,#0x70000000
	mov 	r3,#0x70000000
	mov 	r4,#0x50000000
	smlatt 	r5,r2,r3,r4
	@ldr 	r4,=0x7FFFFFFF
	ldr 	r4,=0x81000000
	cmp 	r5,r4
	orrne 	r1,r1,#BAD_Rd
	mrs 	r3,cpsr
	and 	r3,r3,#0x08000000
	cmp 	r3,#0x08000000
	orrne 	r1,r1,#0x40
	mov 	r3,#0x70000000
	mov 	r4,#0
	smlatt 	r5,r2,r3,r4
	ldr 	r4,=0x31000000
	cmp 	r5,r4
	orrne 	r1,r1,#BAD_Rd
	mrs 	r3,cpsr
	and 	r3,r3,#0x08000000
	cmp 	r3,#0x08000000
	orrne 	r1,r1,#0x40
	ldr 	r0,=szSMLATT
	bl 	DrawResult
	add 	r8,r8,#8

	ldmfd 	sp!,{lr}
	mov 	pc,lr
.pool
.align


Test6:
Test7:
Test8:
Test9:

TestTmb:
	mov r8,#0
	mov r9,#3
	ldr r11,=0xFFFFFFFF

	ldr r0,=menulinks
	ldr r4,=CURSEL
	ldrb r3,[r4]
	sub r4,r4,#8
	add r0,r0,r3,lsl#2
	ldr r5,[r0]
	sub r5,r5,#11
	str r5,[r4]
	
	ldr r0,=_tmbmain
	add r0,r0,#1
	bx r0

.pool
.align


.align 2
.global romvar
.global romvar2
.global romvar3
.global palette

romvar:  	.byte 0x80,0,0,0
romvar2: 	.byte 0x00,0x8f,0,0xff
romvar3: 	.byte 0x80,0x7f,0,0


.align 3
var64:		.word 0x11223344,0x55667788

rdVal:		.word 0
rnVal:		.word 0
memVal:		.word 0

palette:
		.hword 0x0000,0x0300,0x0018,0x7fff,0x7318,0x0E1F

menuitems:	.word szArm1,szArm2,szArm3
		.word szTmb1,szTmb2,szTmb3
		.word szArm4

menulinks:	.word 0,2,4
		.word 11,12,13
		.word 5
		
jumptable: 	.word Test0,Test1,Test2,Test3
	   	.word Test4,Test5,Test6,Test7
	   	.word Test8,Test9,Menu,TestTmb,TestTmb,TestTmb
	   	
.global font
font:		.incbin "../data/font8x8.pat"

szADC:		.asciz "ADC"
szADD:		.asciz "ADD"
szAND:		.asciz "AND"
szBIC:		.asciz "BIC"
szCMN:		.asciz "CMN"
szCMP:		.asciz "CMP"
szEOR:		.asciz "EOR"
szMOV:		.asciz "MOV"
szMVN:		.asciz "MVN"
szORR:		.asciz "ORR"
szRSB:		.asciz "RSB"
szRSC:		.asciz "RSC"
szSBC:		.asciz "SBC"
szSUB:		.asciz "SUB"
szTEQ:		.asciz "TEQ"
szTST:		.asciz "TST"

szMLA:		.asciz "MLA"
szMUL:		.asciz "MUL"
szUMULL: 	.asciz "UMULL"
szUMLAL: 	.asciz "UMLAL"
szSMULL: 	.asciz "SMULL"
szSMLAL:	.asciz "SMLAL"

szSWP:		.asciz "SWP"
szSWPB:		.asciz "SWPB"

szMRS:		.asciz "MRS"
szMSR:		.asciz "MSR"

szLDR:		.asciz "LDR"
szLDRH:		.asciz "LDRH"
szLDRB:		.asciz "LDRB"
szLDRSH:	.asciz "LDRSH"
szLDRSB:	.asciz "LDRSB"
szSTR:		.asciz "STR"
szSTRH:		.asciz "STRH"
szSTRB:		.asciz "STRB"

szLDM:		.asciz "LDM"
szSTM:		.asciz "STM"

szCLZ:		.asciz "CLZ"
szLDRD:		.asciz "LDRD"
szMRC:		.asciz "MRC"
szQADD:		.asciz "QADD"
szSMLABB:	.asciz "SMLABB"
szSMLABT:	.asciz "SMLABT"
szSMLATB:	.asciz "SMLATB"
szSMLATT:	.asciz "SMLATT"
szSMULBB:	.asciz "SMULBB"
szSMULBT:	.asciz "SMULBT"
szSMULTB:	.asciz "SMULTB"
szSMULTT:	.asciz "SMULTT"


.global szLDRtype
szLDRtype:	.ascii "&\\] "
		.byte 0
	  	.ascii "'\\] "
		.byte 0
	  	.ascii "&\\])"
		.byte 0
	  	.ascii "'\\])"
		.byte 0
	  	.ascii "&R] "
		.byte 0
	  	.ascii "'R] "
		.byte 0
	  	.ascii "&R])"
		.byte 0
	  	.ascii "'R])"
		.byte 0
	  	.ascii "]&\\ "
		.byte 0
	  	.ascii "]'\\ "
		.byte 0
	  	.ascii "]&R "
		.byte 0
	  	.ascii "]'R "
		.byte 0

szLDMtype:	.ascii "IB) "
		.byte 0
		.ascii "IA) "
		.byte 0
		.ascii "DB) "
		.byte 0
		.ascii "DA) "
		.byte 0
		.ascii "IBS)"
		.byte 0
		.ascii "IAS)"
		.byte 0
		.ascii "DBS)"
		.byte 0
		.ascii "DBA)"
		.byte 0
		
szOK:		.asciz "OK"
szBad:		.asciz "BAD"
szRd:		.asciz "R^"
szRn:		.asciz "R_"
szC:		.asciz "C"
szN:		.asciz "N"
szV:		.asciz "V"
szZ:		.asciz "Z"
szQ:		.asciz "Q"
szSel:		.asciz "`"
szMem:		.asciz "MEM"

szAsterixes:	.asciz "jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj"
szAster2:	.asciz "j                              j"
szArmwrestler:	.asciz "j        ARMWRESTLER DS        j"
szAuthor:	.asciz "j          Micg 2006           j"

szArm1:		.asciz "ARM ALU"
szArm2:		.asciz "ARM LDR/STR"
szArm3:		.asciz "ARM LDM/STM"
szTmb1:		.asciz "THUMB ALU"
szTmb2:		.asciz "THUMB LDR/STR"
szTmb3:		.asciz "THUMB LDM/STM"
szArm4:		.asciz "ARM V5TE"
szMarker:	.asciz "`"
szSelect:	.asciz "SELECT A TEST AND PRESS"

szALU1:		.asciz  "ALU TESTS PART 1"
szALU2:		.asciz  "ALU PT 2 / MISC"
szLS1: 		.asciz   "LOAD TESTS PART 1"
szLS2: 		.asciz   "LOAD TESTS PART 2"
szLS3: 		.asciz   "LOAD TESTS PART 3"
szLS4: 		.asciz   "LOAD TESTS PART 4"
szLS5: 		.asciz   "LOAD TESTS PART 5"
szLS6: 		.asciz   "LOAD TESTS PART 6"
szLS7: 		.asciz   "LOAD TESTS PART 7"
szLS8: 		.asciz   "LOAD TESTS PART 8"
szLDM1:		.asciz 	"LDM/STM TESTS 1"
szAV5:		.asciz  "ARM V5TE TESTS"

.global szSelect2
.global szNext
.global szStart
.global szMenu

szPressStart: 	.asciz "PRESS START"
szSelect2:	.asciz "SELECT:"
szNext:		.asciz "Nextg"
szStart:	.asciz "START:"
szStart2:	.asciz "START"
szMenu:		.asciz "Menu"
szSpace:	.asciz " "

szRomMsg:	.asciz "Message from ROM"

szHexNum:	.asciz "00000000"

.align
.pool
@.end