2786 lines
44 KiB
ArmAsm
2786 lines
44 KiB
ArmAsm
@ 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
|