@ 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