150 lines
3.1 KiB
Text
150 lines
3.1 KiB
Text
.org 0x08000000
|
|
|
|
b ProgramStart
|
|
|
|
;cartridge header goes here
|
|
|
|
|
|
;
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
; Program Start
|
|
|
|
.equ ramarea, 0x02000000
|
|
.equ CursorX,ramarea
|
|
.equ CursorY,ramarea+1
|
|
.equ hailstoneram,0x02000004
|
|
|
|
|
|
ProgramStart:
|
|
mov sp,#0x03000000 ;Init Stack Pointer
|
|
|
|
mov r4,#0x04000000 ;DISPCNT - LCD Video Controller
|
|
mov r2,#0x403 ;4= Layer 2 on / 3= ScreenMode 3
|
|
str r2,[r4] ;now the user can see the screen
|
|
|
|
bl ResetTextCursors ;set text cursors to top left of screen. This routine, as well as the other I/O
|
|
; routines, were omitted to keep this entry short.
|
|
mov r0,#27
|
|
adr r1,HailStoneMessage_Init
|
|
bl PrintString
|
|
bl NewLine
|
|
bl ShowHex32
|
|
bl NewLine
|
|
bl NewLine
|
|
|
|
|
|
bl Hailstone
|
|
|
|
;function is complete, return the output
|
|
adr r1,HailStoneMessage_0
|
|
bl PrintString
|
|
bl NewLine
|
|
ldr r1,HailStoneRam_Mirror ;mov r2,0x02000004
|
|
|
|
|
|
ldr r0,[r1],#4
|
|
bl ShowHex32
|
|
bl NewLine
|
|
|
|
ldr r0,[r1],#4
|
|
bl ShowHex32
|
|
bl NewLine
|
|
|
|
ldr r0,[r1],#4
|
|
bl ShowHex32
|
|
bl NewLine
|
|
|
|
ldr r0,[r1],#4
|
|
bl ShowHex32
|
|
bl NewLine
|
|
bl NewLine
|
|
|
|
adr r1,HailStoneMessage_1
|
|
bl PrintString
|
|
bl NewLine
|
|
|
|
ldr r0,[r2],#4
|
|
bl ShowHex32
|
|
bl NewLine
|
|
|
|
ldr r0,[r2],#4
|
|
bl ShowHex32
|
|
bl NewLine
|
|
|
|
ldr r0,[r2],#4
|
|
bl ShowHex32
|
|
bl NewLine
|
|
|
|
ldr r0,[r2],#4
|
|
bl ShowHex32
|
|
bl NewLine
|
|
bl NewLine
|
|
|
|
adr r1,HailStoneMessage_2
|
|
bl PrintString
|
|
bl NewLine
|
|
mov r0,r3
|
|
bl ShowHex32
|
|
|
|
forever:
|
|
b forever ;we're done, so trap the program counter.
|
|
|
|
Hailstone:
|
|
;input: R0 = n.
|
|
;out: r2 = pointer to last 4 entries
|
|
; r3 = length of sequence
|
|
|
|
|
|
;reg usage:
|
|
;R1 = scratchpad
|
|
;R3 = counter for entries in the sequence.
|
|
;R5 = pointer to output ram
|
|
stmfd sp!,{r4-r12,lr}
|
|
|
|
mov r5,#0x02000000
|
|
add r5,r5,#4
|
|
str r0,[r5],#4 ;store in hailstone ram and post-inc by 4
|
|
mov r3,#0
|
|
loop_hailstone:
|
|
add r3,r3,#1 ;represents number of entries in the sequence
|
|
cmp r0,#1
|
|
beq hailstone_end
|
|
tst r0,#1
|
|
;;;; executes only if r0 was even
|
|
moveq r0,r0,lsr #1 ;divide
|
|
|
|
;;;; executes only if r0 was odd
|
|
movne r1,r0
|
|
movne r0,r0,lsl #1
|
|
addne r0,r1,r0
|
|
addne r0,r0,#1
|
|
|
|
str r0,[r5],#4 ;store in hailstone ram, post inc by 4
|
|
|
|
b loop_hailstone
|
|
|
|
|
|
hailstone_end:
|
|
sub r5,r5,#16 ;subtract 16 to get pointer to last 4 entries.
|
|
mov r2,r5 ;output ptr to last 4 entries to r2.
|
|
;pointer to first 4 entries is 0x02000004
|
|
ldmfd sp!,{r4-r12,pc}
|
|
|
|
HailStoneRam_Mirror:
|
|
.long 0x02000004
|
|
HailstoneMessage_Init:
|
|
.byte "Your input was:",255
|
|
.align 4
|
|
HailstoneMessage_0:
|
|
.byte "First 4 numbers are:",255
|
|
.align 4
|
|
HailstoneMessage_1:
|
|
.byte "Last 4 numbers are:",255
|
|
.align 4
|
|
HailstoneMessage_2:
|
|
.byte "Sequence length is:",255
|
|
.align 4
|
|
|
|
;;;;;;;;;;; EVERYTHING PAST THIS POINT IS JUST I/O ROUTINES FOR PRINTING NUMBERS AND WORDS TO THE GAME BOY ADVANCE'S SCREEN
|
|
;;;;;;;;;;; I ASSURE YOU THAT ALL OF IT WORKS BUT CHANCES ARE YOU DIDN'T COME HERE TO SEE THAT.
|
|
;;;;;;;;;;; THANKS TO KEITH OF CHIBIAKUMAS.COM FOR WRITING THEM!
|