289 lines
11 KiB
Text
289 lines
11 KiB
Text
.equ CursorX,0x02000000
|
|
.equ CursorY,0x02000001
|
|
ProgramStart:
|
|
mov sp,#0x03000000 ;Init Stack Pointer
|
|
|
|
mov r4,#0x04000000 ;DISPCNT -LCD Control
|
|
mov r2,#0x403 ;4= Layer 2 on / 3= ScreenMode 3
|
|
str r2,[r4] ;now the screen is visible
|
|
bl ResetTextCursors ;set text cursors to top left of screen
|
|
|
|
mov r2,#32
|
|
mov r3,#32+20 ;screen height is 20 chars
|
|
mov r5,#0 ;column spacer
|
|
mov r6,#5
|
|
|
|
;R0 = Character to print (working copy)
|
|
;R2 = real copy
|
|
;R3 = compare factor
|
|
loop_printAscii:
|
|
mov r0,r2
|
|
bl ShowHex
|
|
|
|
mov r0,#32
|
|
bl PrintChar
|
|
|
|
mov r0,r2
|
|
bl PrintChar
|
|
|
|
bl CustomNewLine
|
|
add r2,r2,#1
|
|
|
|
cmp r2,#128
|
|
beq forever ;exit early
|
|
|
|
cmp r2,r3
|
|
bne loop_printAscii
|
|
|
|
|
|
add r3,r3,#20 ;next section
|
|
|
|
;inc to next column
|
|
add r5,r5,#5
|
|
mov r0,r5
|
|
mov r1,#0
|
|
bl SetTextCursors
|
|
subs r6,r6,#1
|
|
bne loop_printAscii
|
|
|
|
|
|
|
|
|
|
forever:
|
|
b forever
|
|
|
|
|
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
;;;;; INPUT/OUTPUT SUBROUTINES - CREATED BY KEITH OF CHIBIAKUMAS.COM
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
|
|
PrintString: ;Print 255 terminated string
|
|
STMFD sp!,{r0-r12, lr}
|
|
PrintStringAgain:
|
|
ldrB r0,[r1],#1
|
|
cmp r0,#255
|
|
beq PrintStringDone ;Repeat until 255
|
|
bl printchar ;Print Char
|
|
b PrintStringAgain
|
|
PrintStringDone:
|
|
LDMFD sp!,{r0-r12, pc}
|
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
PrintChar:
|
|
STMFD sp!,{r0-r12, lr}
|
|
mov r4,#0
|
|
mov r5,#0
|
|
|
|
mov r3,#CursorX
|
|
ldrB r4,[r3] ;X pos
|
|
mov r3,#CursorY
|
|
ldrB r5,[r3] ;Y pos
|
|
|
|
mov r3,#0x06000000 ;VRAM base
|
|
|
|
mov r6,#8*2 ;Xpos, 2 bytes per pixel, 8 bytes per char
|
|
mul r2,r4,r6
|
|
add r3,r3,r2
|
|
|
|
mov r4,#240*8*2 ;Ypos, 240 pixels per line,
|
|
mul r2,r5,r4 ;2 bytes per pixel, 8 lines per char
|
|
add r3,r3,r2
|
|
|
|
adr r4,BitmapFont ;Font source
|
|
|
|
sub r0,r0,#32 ;First Char is 32 (space)
|
|
add r4,r4,r0,asl #3 ;8 bytes per char
|
|
|
|
mov r1,#8 ;8 lines
|
|
DrawLine:
|
|
mov r7,#8 ;8 pixels per line
|
|
ldrb r8,[r4],#1 ;Load Letter
|
|
mov r9,#0b100000000 ;Mask
|
|
|
|
mov r2, #0b1111111101000000; Color: ABBBBBGGGGGRRRRR A=Alpha
|
|
DrawPixel:
|
|
tst r8,r9 ;Is bit 1?
|
|
strneh r2,[r3] ;Yes? then fill pixel (HalfWord)
|
|
add r3,r3,#2
|
|
mov r9,r9,ror #1 ;Bitshift Mask
|
|
subs r7,r7,#1
|
|
bne DrawPixel ;Next Hpixel
|
|
|
|
add r3,r3,#480-16 ;Move Down a line (240 pixels *2 bytes)
|
|
subs r1,r1,#1 ;-1 char (16 px)
|
|
bne DrawLine ;Next Vline
|
|
|
|
LineDone:
|
|
mov r3,#CursorX
|
|
ldrB r0,[r3]
|
|
add r0,r0,#1 ;Move across screen
|
|
strB r0,[r3]
|
|
mov r10,#30
|
|
cmp r0,r10
|
|
bleq NewLine
|
|
LDMFD sp!,{r0-r12, pc}
|
|
|
|
NewLine:
|
|
STMFD sp!,{r0-r12, lr}
|
|
mov r3,#CursorX
|
|
mov r0,#0
|
|
strB r0,[r3]
|
|
mov r4,#CursorY
|
|
ldrB r0,[r4]
|
|
add r0,r0,#1
|
|
strB r0,[r4]
|
|
LDMFD sp!,{r0-r12, pc}
|
|
|
|
CustomNewLine:
|
|
STMFD sp!,{r0-r12, lr}
|
|
mov r3,#CursorX
|
|
mov r0,r5
|
|
strB r0,[r3]
|
|
mov r4,#CursorY
|
|
ldrB r0,[r4]
|
|
add r0,r0,#1
|
|
strB r0,[r4]
|
|
LDMFD sp!,{r0-r12, pc}
|
|
|
|
ResetTextCursors:
|
|
STMFD sp!,{r4-r6,lr}
|
|
mov r4,#0
|
|
mov r5,#CursorX
|
|
mov r6,#CursorY
|
|
strB r4,[r5]
|
|
strB r4,[r6]
|
|
LDMFD sp!,{r4-r6,lr}
|
|
bx lr
|
|
|
|
SetTextCursors:
|
|
;input: R0 = new X
|
|
; R1 = new Y
|
|
STMFD sp!,{r5-r6}
|
|
mov r5,#CursorX
|
|
mov r6,#CursorY
|
|
strB r0,[r5]
|
|
strB r1,[r6]
|
|
LDMFD sp!,{r5-r6}
|
|
bx lr
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
|
|
ShowHex:
|
|
STMFD sp!,{r0-r12, lr}
|
|
mov r2,r0,ror #4
|
|
bl ShowHexChar
|
|
mov r2,r0
|
|
bl ShowHexChar
|
|
LDMFD sp!,{r0-r12, pc}
|
|
|
|
ShowHexChar:
|
|
STMFD sp!,{r0-r12, lr}
|
|
;mov r3,
|
|
and r0,r2,#0x0F ; r3
|
|
cmp r0,#10
|
|
addge r0,r0,#7 ;if 10 or greater convert to alphabet letters a-f
|
|
add r0,r0,#48
|
|
bl PrintChar
|
|
LDMFD sp!,{r0-r12, pc}
|
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
|
|
BitmapFont:
|
|
;each byte represents a row of 8 pixels. This is a 1BPP font that is converted to the GBA's 16bpp screen format at runtime
|
|
.byte 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; 20
|
|
.byte 0x10,0x18,0x18,0x18,0x18,0x00,0x18,0x00 ; 21
|
|
.byte 0x28,0x6C,0x28,0x00,0x00,0x00,0x00,0x00 ; 22
|
|
.byte 0x00,0x28,0x7C,0x28,0x7C,0x28,0x00,0x00 ; 23
|
|
.byte 0x18,0x3E,0x48,0x3C,0x12,0x7C,0x18,0x00 ; 24
|
|
.byte 0x02,0xC4,0xC8,0x10,0x20,0x46,0x86,0x00 ; 25
|
|
.byte 0x10,0x28,0x28,0x72,0x94,0x8C,0x72,0x00 ; 26
|
|
.byte 0x0C,0x1C,0x30,0x00,0x00,0x00,0x00,0x00 ; 27
|
|
.byte 0x18,0x18,0x30,0x30,0x30,0x18,0x18,0x00 ; 28
|
|
.byte 0x18,0x18,0x0C,0x0C,0x0C,0x18,0x18,0x00 ; 29
|
|
.byte 0x08,0x49,0x2A,0x1C,0x14,0x22,0x41,0x00 ; 2A
|
|
.byte 0x00,0x18,0x18,0x7E,0x18,0x18,0x00,0x00 ; 2B
|
|
.byte 0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x30 ; 2C
|
|
.byte 0x00,0x00,0x00,0x7E,0x7E,0x00,0x00,0x00 ; 2D
|
|
.byte 0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00 ; 2E
|
|
.byte 0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x00 ; 2F
|
|
.byte 0x7C,0xC6,0xD6,0xD6,0xD6,0xC6,0x7C,0x00 ; 30
|
|
.byte 0x10,0x18,0x18,0x18,0x18,0x18,0x08,0x00 ; 31
|
|
.byte 0x3C,0x7E,0x06,0x3C,0x60,0x7E,0x3C,0x00 ; 32
|
|
.byte 0x3C,0x7E,0x06,0x1C,0x06,0x7E,0x3C,0x00 ; 33
|
|
.byte 0x18,0x3C,0x64,0xCC,0x7C,0x0C,0x08,0x00 ; 34
|
|
.byte 0x3C,0x7E,0x60,0x7C,0x06,0x7E,0x3E,0x00 ; 35
|
|
.byte 0x3C,0x7E,0x60,0x7C,0x66,0x66,0x3C,0x00 ; 36
|
|
.byte 0x3C,0x7E,0x06,0x0C,0x18,0x18,0x10,0x00 ; 37
|
|
.byte 0x3C,0x66,0x66,0x3C,0x66,0x66,0x3C,0x00 ; 38
|
|
.byte 0x3C,0x66,0x66,0x3E,0x06,0x7E,0x3C,0x00 ; 39
|
|
.byte 0x00,0x00,0x18,0x18,0x00,0x18,0x18,0x00 ; 3A
|
|
.byte 0x00,0x00,0x18,0x18,0x00,0x18,0x18,0x30 ; 3B
|
|
.byte 0x0C,0x1C,0x38,0x60,0x38,0x1C,0x0C,0x00 ; 3C
|
|
.byte 0x00,0x00,0x7E,0x00,0x00,0x7E,0x00,0x00 ; 3D
|
|
.byte 0x60,0x70,0x38,0x0C,0x38,0x70,0x60,0x00 ; 3E
|
|
.byte 0x3C,0x76,0x06,0x1C,0x00,0x18,0x18,0x00 ; 3F
|
|
.byte 0x7C,0xCE,0xA6,0xB6,0xC6,0xF0,0x7C,0x00 ; 40 @
|
|
.byte 0x18,0x3C,0x66,0x66,0x7E,0x66,0x24,0x00 ; 41 A
|
|
.byte 0x3C,0x66,0x66,0x7C,0x66,0x66,0x3C,0x00 ; 42 B
|
|
.byte 0x38,0x7C,0xC0,0xC0,0xC0,0x7C,0x38,0x00 ; 43 C
|
|
.byte 0x3C,0x64,0x66,0x66,0x66,0x64,0x38,0x00 ; 44 D
|
|
.byte 0x3C,0x7E,0x60,0x78,0x60,0x7E,0x3C,0x00 ; 45 E
|
|
.byte 0x38,0x7C,0x60,0x78,0x60,0x60,0x20,0x00 ; 46 F
|
|
.byte 0x3C,0x66,0xC0,0xC0,0xCC,0x66,0x3C,0x00 ; 47 G
|
|
.byte 0x24,0x66,0x66,0x7E,0x66,0x66,0x24,0x00 ; 48 H
|
|
.byte 0x10,0x18,0x18,0x18,0x18,0x18,0x08,0x00 ; 49 I
|
|
.byte 0x08,0x0C,0x0C,0x0C,0x4C,0xFC,0x78,0x00 ; 4A J
|
|
.byte 0x24,0x66,0x6C,0x78,0x6C,0x66,0x24,0x00 ; 4B K
|
|
.byte 0x20,0x60,0x60,0x60,0x60,0x7E,0x3E,0x00 ; 4C L
|
|
.byte 0x44,0xEE,0xFE,0xD6,0xD6,0xD6,0x44,0x00 ; 4D M
|
|
.byte 0x44,0xE6,0xF6,0xDE,0xCE,0xC6,0x44,0x00 ; 4E N
|
|
.byte 0x38,0x6C,0xC6,0xC6,0xC6,0x6C,0x38,0x00 ; 4F O
|
|
.byte 0x38,0x6C,0x64,0x7C,0x60,0x60,0x20,0x00 ; 50 P
|
|
.byte 0x38,0x6C,0xC6,0xC6,0xCA,0x74,0x3A,0x00 ; 51 Q
|
|
.byte 0x3C,0x66,0x66,0x7C,0x6C,0x66,0x26,0x00 ; 52 R
|
|
.byte 0x3C,0x7E,0x60,0x3C,0x06,0x7E,0x3C,0x00 ; 53 S
|
|
.byte 0x3C,0x7E,0x18,0x18,0x18,0x18,0x08,0x00 ; 54 T
|
|
.byte 0x24,0x66,0x66,0x66,0x66,0x66,0x3C,0x00 ; 55 U
|
|
.byte 0x24,0x66,0x66,0x66,0x66,0x3C,0x18,0x00 ; 56 V
|
|
.byte 0x44,0xC6,0xD6,0xD6,0xFE,0xEE,0x44,0x00 ; 57 W
|
|
.byte 0xC6,0x6C,0x38,0x38,0x6C,0xC6,0x44,0x00 ; 58 X
|
|
.byte 0x24,0x66,0x66,0x3C,0x18,0x18,0x08,0x00 ; 59 Y
|
|
.byte 0x7C,0xFC,0x0C,0x18,0x30,0x7E,0x7C,0x00 ; 5A Z
|
|
.byte 0x1C,0x30,0x30,0x30,0x30,0x30,0x1C,0x00 ; 5B [
|
|
.byte 0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x00 ; 5C Backslash
|
|
.byte 0x38,0x0C,0x0C,0x0C,0x0C,0x0C,0x38,0x00 ; 5D ]
|
|
.byte 0x10,0x28,0x44,0x00,0x00,0x00,0x00,0x00 ; 5E ^
|
|
.byte 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C ; 5F _
|
|
.byte 0x10,0x08,0x00,0x00,0x00,0x00,0x00,0x00 ; 60 `
|
|
.byte 0x00,0x00,0x38,0x0C,0x7C,0xCC,0x78,0x00 ; 61
|
|
.byte 0x20,0x60,0x7C,0x66,0x66,0x66,0x3C,0x00 ; 62
|
|
.byte 0x00,0x00,0x3C,0x66,0x60,0x66,0x3C,0x00 ; 63
|
|
.byte 0x08,0x0C,0x7C,0xCC,0xCC,0xCC,0x78,0x00 ; 64
|
|
.byte 0x00,0x00,0x3C,0x66,0x7E,0x60,0x3C,0x00 ; 65
|
|
.byte 0x1C,0x36,0x30,0x38,0x30,0x30,0x10,0x00 ; 66
|
|
.byte 0x00,0x00,0x3C,0x66,0x66,0x3E,0x06,0x3C ; 67
|
|
.byte 0x20,0x60,0x6C,0x76,0x66,0x66,0x24,0x00 ; 68
|
|
.byte 0x18,0x00,0x18,0x18,0x18,0x18,0x08,0x00 ; 69
|
|
.byte 0x06,0x00,0x04,0x06,0x06,0x26,0x66,0x3C ; 6A
|
|
.byte 0x20,0x60,0x66,0x6C,0x78,0x6C,0x26,0x00 ; 6B
|
|
.byte 0x10,0x18,0x18,0x18,0x18,0x18,0x08,0x00 ; 6C
|
|
.byte 0x00,0x00,0x6C,0xFE,0xD6,0xD6,0xC6,0x00 ; 6D
|
|
.byte 0x00,0x00,0x3C,0x66,0x66,0x66,0x24,0x00 ; 6E
|
|
.byte 0x00,0x00,0x3C,0x66,0x66,0x66,0x3C,0x00 ; 6F
|
|
.byte 0x00,0x00,0x3C,0x66,0x66,0x7C,0x60,0x20 ; 70
|
|
.byte 0x00,0x00,0x78,0xCC,0xCC,0x7C,0x0C,0x08 ; 71
|
|
.byte 0x00,0x00,0x38,0x7C,0x60,0x60,0x20,0x00 ; 72
|
|
.byte 0x00,0x00,0x3C,0x60,0x3C,0x06,0x7C,0x00 ; 73
|
|
.byte 0x10,0x30,0x3C,0x30,0x30,0x3E,0x1C,0x00 ; 74
|
|
.byte 0x00,0x00,0x24,0x66,0x66,0x66,0x3C,0x00 ; 75
|
|
.byte 0x00,0x00,0x24,0x66,0x66,0x3C,0x18,0x00 ; 76
|
|
.byte 0x00,0x00,0x44,0xD6,0xD6,0xFE,0x6C,0x00 ; 77
|
|
.byte 0x00,0x00,0xC6,0x6C,0x38,0x6C,0xC6,0x00 ; 78
|
|
.byte 0x00,0x00,0x24,0x66,0x66,0x3E,0x06,0x7C ; 79
|
|
.byte 0x00,0x00,0x7E,0x0C,0x18,0x30,0x7E,0x00 ; 7A
|
|
.byte 0x10,0x20,0x20,0x40,0x40,0x20,0x20,0x10 ; 7B {
|
|
.byte 0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10 ; 7C |
|
|
.byte 0x08,0x04,0x04,0x02,0x02,0x04,0x04,0x08 ; 7D }
|
|
.byte 0x00,0x00,0x00,0x20,0x52,0x0C,0x00,0x00 ; 7E ~
|
|
.byte 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ; 7F
|
|
.byte 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF ; 80
|