├── .gitattributes ├── LICENSE ├── README.md └── source ├── entrypoint.asm ├── exception └── retAddr │ ├── main.asm │ └── retAddr.gba ├── header.asm ├── inc ├── memory.inc ├── mmio.inc └── psr.inc ├── lib ├── font.asm ├── memcpy.asm └── print.asm └── misc ├── helloAudio ├── audioL.bin ├── audioR.bin ├── helloAudio.gba └── main.asm └── helloWorld ├── helloWorld.gba └── main.asm /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Michelle-Marie Schiller 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # **GBA Test Collection** 2 | TODO... 3 | -------------------------------------------------------------------------------- /source/entrypoint.asm: -------------------------------------------------------------------------------- 1 | ;------------------------------------------------------------------------------ 2 | ; GBA Test Collection - GBA test ROMs written in ARM assembly. 3 | ; Copyright (C) 2021 Michelle-Marie Schiller 4 | ;------------------------------------------------------------------------------ 5 | ; entrypoint.asm - Entry point. 6 | ;------------------------------------------------------------------------------ 7 | 8 | include 'inc/memory.inc' 9 | include 'inc/mmio.inc' 10 | include 'inc/psr.inc' 11 | 12 | ;------------------------------------------------------------------------------ 13 | ; Function list: 14 | ;------------------------------------------------------------------------------ 15 | ; Address | Function 16 | ;------------------------------------------------------------------------------ 17 | ; 3000000h | MemCpy32() 18 | ; 3000020h | MemSet32() 19 | ;------------------------------------------------------------------------------ 20 | Addr_MemCpy32 = MEM_IRAM + 0x00 21 | Addr_MemSet32 = MEM_IRAM + 0x20 22 | 23 | ;------------------------------------------------------------------------------ 24 | ; void EntryPoint() 25 | ;------------------------------------------------------------------------------ 26 | ; Description: Initializes CPU registers and system memory. 27 | ; Copies MemCpy32 and MemSet32 to IWRAM. 28 | ;------------------------------------------------------------------------------ 29 | ; Parameters: 30 | ; None. 31 | ;------------------------------------------------------------------------------ 32 | ; Returns: 33 | ; No return. 34 | ;------------------------------------------------------------------------------ 35 | EntryPoint: 36 | adr r12, .Pool 37 | 38 | ; initialize IRQ mode stack pointer and SPSR 39 | msr cpsr, PSR_MIRQ 40 | mov lr, 0 41 | msr spsr, lr 42 | ldr sp, [r12] 43 | 44 | ; initialize SVC mode stack pointer and SPSR 45 | msr cpsr, PSR_MSVC 46 | mov lr, 0 47 | msr spsr, lr 48 | ldr sp, [r12, 4] 49 | 50 | ; initialize SYS mode stack pointer 51 | msr cpsr, PSR_MSYS 52 | ldr sp, [r12, 8] 53 | 54 | ; initialize WAITCNT 55 | mov r0, MEM_MMIO 56 | ldr r1, [r12, 0xC] 57 | str r1, [r0, REG_WAITCNT] 58 | 59 | ; copy MemCpy32() to IWRAM + 00h 60 | add r0, r12, 0x10 61 | ldmia r0, {r0-r2} 62 | bl MemCpy32 63 | 64 | ; copy MemSet32() to IWRAM + 20h 65 | add r0, r12, 0x1C 66 | ldmia r0, {r0-r2} 67 | bl MemCpy32 68 | 69 | ldr r11, [r12, 0x28] 70 | 71 | ; clear EWRAM 72 | add r0, r12, 0x2C 73 | ldmia r0, {r0-r2} 74 | mov lr, pc 75 | bx r11 76 | 77 | ; clear IWRAM 78 | add r0, r12, 0x38 79 | ldmia r0, {r0-r2} 80 | mov lr, pc 81 | bx r11 82 | 83 | ; clear Palette RAM 84 | add r0, r12, 0x44 85 | ldmia r0, {r0-r2} 86 | mov lr, pc 87 | bx r11 88 | 89 | ; clear Video RAM 90 | add r0, r12, 0x50 91 | ldmia r0, {r0-r2} 92 | mov lr, pc 93 | bx r11 94 | 95 | ; clear Object RAM 96 | add r0, r12, 0x5C 97 | ldmia r0, {r0-r2} 98 | mov lr, pc 99 | bx r11 100 | 101 | ; jump to Main() 102 | bl Main 103 | 104 | .Loop: 105 | b .Loop 106 | 107 | .Pool: 108 | ; stack pointers (IRQ, SVC, SYS) [0x00] 109 | dw MEM_IRAM + 0x7FA0, MEM_IRAM + 0x7FE0, MEM_IRAM + 0x7F00 110 | ; WAITCNT [0x0C] 111 | dw 0x4317 112 | ; MemCpy32 - copies MemCpy32 to IWRAM + 00h [0x10] 113 | dw MEM_IRAM + 0x00, MEM_ROM0 + MemCpy32, Size_MemCpy32 / 4 114 | ; MemCpy32 - copies MemSet32 to IWRAM + 20h [0x1C] 115 | dw MEM_IRAM + 0x20, MEM_ROM0 + MemSet32, Size_MemSet32 / 4 116 | ; MemSet32 address [0x28] 117 | dw Addr_MemSet32 118 | ; MemSet32 - clear EWRAM [0x2C] 119 | dw MEM_ERAM, 0, Size_MEM_ERAM / 4 120 | ; MemSet32 - clear IWRAM [0x38] 121 | dw Addr_MemSet32 + Size_MemSet32, 0, (Size_MEM_IRAM - (Size_MemCpy32 + Size_MemSet32)) / 4 122 | ; MemSet32 - clear PRAM [0x44] 123 | dw MEM_PRAM, 0, Size_MEM_PRAM / 4 124 | ; MemSet32 - clear VRAM [0x50] 125 | dw MEM_VRAM, 0, Size_MEM_VRAM / 4 126 | ; MemSet32 - clear ORAM [0x5C] 127 | dw MEM_ORAM, 0, Size_MEM_ORAM / 4 128 | 129 | .Includes: 130 | include 'lib/memcpy.asm' 131 | 132 | End_EntryPoint: 133 | ;------------------------------------------------------------------------------ 134 | 135 | ;------------------------------------------------------------------------------ 136 | ;------------------------------------------------------------------------------ 137 | -------------------------------------------------------------------------------- /source/exception/retAddr/main.asm: -------------------------------------------------------------------------------- 1 | ;------------------------------------------------------------------------------ 2 | ; GBA Test Collection - GBA test ROMs written in ARM assembly. 3 | ; Copyright (C) 2021 Michelle-Marie Schiller 4 | ;------------------------------------------------------------------------------ 5 | ; main.asm - Checks IRQ return addresses. 6 | ;------------------------------------------------------------------------------ 7 | 8 | format binary as 'gba' 9 | 10 | include '../../inc/memory.inc' 11 | include '../../inc/mmio.inc' 12 | include '../../inc/psr.inc' 13 | 14 | include '../../header.asm' 15 | include '../../entrypoint.asm' 16 | 17 | ; null-terminated string macro 18 | macro m_STR msg 19 | { 20 | db msg 21 | db 0 22 | align 4 23 | } 24 | 25 | ; TODO: use fixed ROM addresses to verify the return addresses. 26 | 27 | ;------------------------------------------------------------------------------ 28 | ; void Main() 29 | ;------------------------------------------------------------------------------ 30 | ; Description: Main function. 31 | ;------------------------------------------------------------------------------ 32 | ; Parameters: 33 | ; None. 34 | ;------------------------------------------------------------------------------ 35 | ; Returns: 36 | ; Nothing. 37 | ;------------------------------------------------------------------------------ 38 | Main: 39 | push {r12, lr} 40 | adr r12, .Pool 41 | 42 | mov r4, MEM_MMIO 43 | mov r5, MEM_ERAM 44 | mov r11, MEM_IRAM 45 | 46 | ; initialize print library 47 | mov r0, 0 48 | mvn r1, r0 49 | bl InitPrint 50 | 51 | ; print test strings 52 | mov r0, r12 53 | ldmia r0, {r0-r2} 54 | bl PrintStr 55 | add r0, r12, 0xC 56 | ldmia r0, {r0-r2} 57 | bl PrintStr 58 | 59 | ; copy and install IRQ handler 60 | add r0, r12, 0x30 61 | ldmia r0, {r0-r2} 62 | mov lr, pc 63 | bx r11 64 | add r0, r11, 0x100 65 | str r0, [r4, -4] 66 | 67 | ; enable VBLANK IRQ generation 68 | mov r0, DISPSTAT_VBLANK_IRQ 69 | strh r0, [r4, REG_DISPSTAT] 70 | 71 | ; acknowledge all IRQs, disable IRQs, enable interrupts 72 | mvn r0, 0 73 | mov r0, r0, lsl 16 74 | str r0, [r4, REG_IE] 75 | mov r0, 1 76 | str r0, [r4, REG_IME] 77 | 78 | ; run tests 79 | 80 | ; test #1 - ARM state IRQ return address 81 | bl VBLANKWait 82 | ldr r11, [r12, 0x3C] 83 | mov lr, pc 84 | bx r11 85 | 86 | ; test #2 - Thumb state IRQ return address 87 | bl VBLANKWait 88 | mov r1, 0x200 89 | ldr r11, [r12, 0x40] 90 | mov lr, pc 91 | bx r11 92 | 93 | ; print out results 94 | mov r7, 0 95 | 96 | .Loop: 97 | ; get return address offset 98 | ldr r6, [r5, r7, lsl 2] 99 | movs r6, r6 ; if r6 == 0, the return address is correct 100 | adreq r0, Str_OK 101 | adrne r0, Str_NG 102 | mov r1, 13 103 | mov r2, 3 104 | mul r2, r7 105 | add r2, 1 106 | bl PrintStr 107 | movs r6, r6 108 | beq .Check 109 | 110 | ; print out error message 111 | adr r0, Str_Error 112 | mov r1, 1 113 | mov r2, 3 114 | mul r2, r7 115 | add r2, 2 116 | bl PrintStr 117 | 118 | ; get sign of offset 119 | movs r6, r6 120 | negmi r6, r6 121 | movmi r0, '+' 122 | movpl r0, '-' 123 | mov r1, 18 124 | mov r2, 3 125 | mul r2, r7 126 | add r2, 2 127 | bl PrintChar 128 | 129 | ; print offset (255 bytes max) 130 | mov r0, r6 131 | mov r1, 2 132 | mov r2, 19 133 | mov r3, 3 134 | mul r3, r7 135 | add r3, 2 136 | bl PrintHex 137 | 138 | .Check: 139 | cmp r7, 1 140 | beq .Return 141 | add r7, 1 142 | b .Loop 143 | 144 | .Return: 145 | pop {r12, pc} 146 | 147 | .Pool: 148 | ; Test string #1 - ARM state IRQ [0x00] 149 | dw MEM_ROM0 + Str_IRQARM, 1, 1 150 | ; Test string #2 - Thumb state IRQ [0x0C] 151 | dw MEM_ROM0 + Str_IRQThumb, 1, 4 152 | ; Test string #3 - ARM state SWI [0x18] (UNUSED) 153 | dw MEM_ROM0 + Str_SWIARM, 1, 7 154 | ; Test string #4 - Thumb state SWI [0x24] (UNUSED) 155 | dw MEM_ROM0 + Str_SWIThumb, 1, 10 156 | ; MemCpy32 - IRQ handler [0x30] 157 | dw MEM_IRAM + 0x100, MEM_ROM0 + IRQHandler, (End_IRQHandler - IRQHandler) / 4 158 | ; Test #1 - Address [0x3C] 159 | dw MEM_ROM0 + Test1 160 | ; Test #2 - Address [0x40] 161 | dw MEM_ROM0 + Test2 + 1 162 | 163 | End_Main: 164 | ;------------------------------------------------------------------------------ 165 | 166 | ;------------------------------------------------------------------------------ 167 | ; void VBLANKWait() 168 | ;------------------------------------------------------------------------------ 169 | ; Description: Busy waits for the vertical blanking period. 170 | ;------------------------------------------------------------------------------ 171 | ; Parameters: 172 | ; None. 173 | ;------------------------------------------------------------------------------ 174 | ; Returns: 175 | ; Nothing. 176 | ;------------------------------------------------------------------------------ 177 | VBLANKWait: 178 | .Loop1: 179 | ; this routine is always called from Main(), which means that r4 is a valid pointer to the MMIO region 180 | ldrh r0, [r4, REG_DISPSTAT] 181 | tst r0, DISPSTAT_VBLANK 182 | beq .Loop1 183 | 184 | .Loop2: 185 | ldrh r0, [r4, REG_DISPSTAT] 186 | tst r0, DISPSTAT_VBLANK 187 | bne .Loop2 188 | 189 | bx lr 190 | 191 | End_VBLANKWait: 192 | ;------------------------------------------------------------------------------ 193 | 194 | ; tests ARM state IRQ return address 195 | Test1: 196 | push {r6, lr} 197 | 198 | adr r6, .Pool 199 | ldr r6, [r6] 200 | add r6, 4 201 | 202 | ; enable VBLANK IRQs 203 | mov r0, IE_VBLANK 204 | str r0, [r4, REG_IE] 205 | 206 | .Loop: 207 | ; wait for an interrupt 208 | b .Loop 209 | 210 | ; write return address offset to EWRAM 211 | adr r0, .Pool 212 | ldr r0, [r0] 213 | sub r0, r6 214 | str r0, [r5] 215 | 216 | pop {r6, pc} 217 | 218 | .Pool: 219 | ; correct lr_irq return address 220 | dw MEM_ROM0 + .Loop + 4 221 | 222 | End_Test1: 223 | 224 | ; tests Thumb state IRQ return address 225 | Test2: 226 | CODE16 227 | push {r6, lr} 228 | 229 | adr r6, .Pool 230 | ldr r6, [r6] 231 | add r6, 2 232 | 233 | ; enable VBLANK IRQs 234 | mov r0, IE_VBLANK 235 | str r0, [r4, r1] 236 | 237 | .Loop: 238 | ; wait for an interrupt 239 | b .Loop 240 | 241 | ; switch to ARM state 242 | adr r0, .SwitchState 243 | bx r0 244 | align 4 245 | 246 | .SwitchState: 247 | 248 | CODE32 249 | 250 | ; write return address offset to EWRAM 251 | adr r0, .Pool 252 | ldr r0, [r0] 253 | sub r0, r6 254 | str r0, [r5, 4] 255 | 256 | pop {r6, pc} 257 | 258 | .Pool: 259 | ; correct lr_irq return address 260 | dw MEM_ROM0 + .Loop + 4 261 | 262 | End_Test2: 263 | 264 | IRQHandler: 265 | ; acknowledge and disable VBLANK IRQ 266 | mov r0, IE_VBLANK shl 16 267 | str r0, [r4, REG_IE] 268 | 269 | ; adjust return address 270 | add r0, sp, 0x14 271 | swp r6, r6, [r0] 272 | 273 | bx lr 274 | 275 | End_IRQHandler: 276 | 277 | ; test strings 278 | Str_IRQARM: 279 | m_STR "IRQ (ARM)" 280 | 281 | Str_IRQThumb: 282 | m_STR "IRQ (Thumb)" 283 | 284 | Str_SWIARM: 285 | m_STR "SWI (ARM)" 286 | 287 | Str_SWIThumb: 288 | m_STR "SWI (Thumb)" 289 | 290 | ; result strings 291 | Str_OK: 292 | m_STR "- OK!" 293 | 294 | Str_NG: 295 | m_STR "- NG!" 296 | 297 | Str_Error: 298 | m_STR "Result is off by h bytes." ; I hope no one manages to break this. 299 | 300 | Includes_Print: 301 | include '../../lib/print.asm' 302 | 303 | ;------------------------------------------------------------------------------ 304 | ;------------------------------------------------------------------------------ 305 | -------------------------------------------------------------------------------- /source/exception/retAddr/retAddr.gba: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ladystarbreeze/GBA-Test-Collection/61527ece54b5dea8344d3723e4f6cac1ce3e73d4/source/exception/retAddr/retAddr.gba -------------------------------------------------------------------------------- /source/header.asm: -------------------------------------------------------------------------------- 1 | ;------------------------------------------------------------------------------ 2 | ; GBA Test Collection - GBA test ROMs written in ARM assembly. 3 | ; Copyright (C) 2021 Michelle-Marie Schiller 4 | ;------------------------------------------------------------------------------ 5 | ; header.asm - GBA ROM header. 6 | ;------------------------------------------------------------------------------ 7 | 8 | ROMHeader: 9 | dw 0xEA00002E ; branch to entry point 80000C0h 10 | 11 | ; compressed Nintendo logo - BIOS will reject programs without this data! 12 | db 0x24, 0xFF, 0xAE, 0x51, 0x69, 0x9A, 0xA2, 0x21, 0x3D, 0x84 13 | db 0x82, 0x0A, 0x84, 0xE4, 0x09, 0xAD, 0x11, 0x24, 0x8B, 0x98 14 | db 0xC0, 0x81, 0x7F, 0x21, 0xA3, 0x52, 0xBE, 0x19, 0x93, 0x09 15 | db 0xCE, 0x20, 0x10, 0x46, 0x4A, 0x4A, 0xF8, 0x27, 0x31, 0xEC 16 | db 0x58, 0xC7, 0xE8, 0x33, 0x82, 0xE3, 0xCE, 0xBF, 0x85, 0xF4 17 | db 0xDF, 0x94, 0xCE, 0x4B, 0x09, 0xC1, 0x94, 0x56, 0x8A, 0xC0 18 | db 0x13, 0x72, 0xA7, 0xFC, 0x9F, 0x84, 0x4D, 0x73, 0xA3, 0xCA 19 | db 0x9A, 0x61, 0x58, 0x97, 0xA3, 0x27, 0xFC, 0x03, 0x98, 0x76 20 | db 0x23, 0x1D, 0xC7, 0x61, 0x03, 0x04, 0xAE, 0x56, 0xBF, 0x38 21 | db 0x84, 0x00, 0x40, 0xA7, 0x0E, 0xFD, 0xFF, 0x52, 0xFE, 0x03 22 | db 0x6F, 0x95, 0x30, 0xF1, 0x97, 0xFB, 0xC0, 0x85, 0x60, 0xD6 23 | db 0x80, 0x25, 0xA9, 0x63, 0xBE, 0x03, 0x01, 0x4E, 0x38, 0xE2 24 | db 0xF9, 0xA2, 0x34, 0xFF, 0xBB, 0x3E, 0x03, 0x44, 0x78, 0x00 25 | db 0x90, 0xCB, 0x88, 0x11, 0x3A, 0x94, 0x65, 0xC0, 0x7C, 0x63 26 | db 0x87, 0xF0, 0x3C, 0xAF, 0xD6, 0x25, 0xE4, 0x8B, 0x38, 0x0A 27 | db 0xAC, 0x72, 0x21, 0xD4, 0xF8, 0x07 28 | 29 | db "MARIMOD", 0, 0, 0, 0, 0 ; Game Title 30 | db "CMMP" ; Game Code 31 | db "00" ; Maker Code 32 | db 0x96 ; 96h 33 | db 0 ; Unit Code 34 | db 0, 0, 0, 0, 0, 0, 0, 0 ; Device Type and 7x 0 35 | db 0 ; Software Version 36 | db 0xBB ; Header Checksum 37 | db 0, 0 ; 2x 0 38 | 39 | ;------------------------------------------------------------------------------ 40 | ;------------------------------------------------------------------------------ 41 | -------------------------------------------------------------------------------- /source/inc/memory.inc: -------------------------------------------------------------------------------- 1 | ;------------------------------------------------------------------------------ 2 | ; GBA Test Collection - GBA test ROMs written in ARM assembly. 3 | ; Copyright (C) 2021 Michelle-Marie Schiller 4 | ;------------------------------------------------------------------------------ 5 | ; memory.inc - Useful memory addresses and sizes. 6 | ;------------------------------------------------------------------------------ 7 | 8 | MEM_BIOS = 0x00000000 9 | MEM_ERAM = 0x02000000 10 | MEM_IRAM = 0x03000000 11 | MEM_MMIO = 0x04000000 12 | MEM_PRAM = 0x05000000 13 | MEM_VRAM = 0x06000000 14 | MEM_ORAM = 0x07000000 15 | MEM_ROM0 = 0x08000000 16 | MEM_SRAM = 0x0E000000 17 | 18 | Size_MEM_BIOS = 0x04000 19 | Size_MEM_ERAM = 0x40000 20 | Size_MEM_IRAM = 0x08000 21 | Size_MEM_PRAM = 0x00400 22 | Size_MEM_VRAM = 0x18000 23 | Size_MEM_ORAM = 0x00400 24 | Size_MEM_SRAM = 0x10000 25 | 26 | ;------------------------------------------------------------------------------ 27 | ;------------------------------------------------------------------------------ 28 | -------------------------------------------------------------------------------- /source/inc/mmio.inc: -------------------------------------------------------------------------------- 1 | ;------------------------------------------------------------------------------ 2 | ; GBA Test Collection - GBA test ROMs written in ARM assembly. 3 | ; Copyright (C) 2021 Michelle-Marie Schiller 4 | ;------------------------------------------------------------------------------ 5 | ; mmio.inc - Useful register definitions. 6 | ;------------------------------------------------------------------------------ 7 | 8 | ; LCD Control 9 | REG_DISPCNT = 0x000 10 | REG_DISPSTAT = 0x004 11 | REG_VCOUNT = 0x006 12 | 13 | ; Display Control 14 | DISPCNT_MODE0 = 0 15 | DISPCNT_MODE1 = 1 16 | DISPCNT_MODE2 = 2 17 | DISPCNT_MODE3 = 3 18 | DISPCNT_MODE4 = 4 19 | DISPCNT_MODE5 = 5 20 | DISPCNT_MODE6 = 6 21 | DISPCNT_MODE7 = 7 22 | DISPCNT_FRAME0 = 0 shl 4 23 | DISPCNT_FRAME1 = 1 shl 4 24 | DISPCNT_OAM_2D = 0 shl 6 25 | DISPCNT_OAM_1D = 1 shl 6 26 | DISPCNT_OFF = 1 shl 7 27 | DISPCNT_ON = 0 shl 7 28 | DISPCNT_BG0_ON = 1 shl 8 29 | DISPCNT_BG1_ON = 1 shl 9 30 | DISPCNT_BG2_ON = 1 shl 10 31 | DISPCNT_BG3_ON = 1 shl 11 32 | DISPCNT_OBJ_ON = 1 shl 12 33 | DISPCNT_WN0_ON = 1 shl 13 34 | DISPCNT_WN1_ON = 1 shl 14 35 | DISPCNT_OWN_ON = 1 shl 15 36 | 37 | ; Display Status 38 | DISPSTAT_VBLANK = 1 39 | DISPSTAT_HBLANK = 2 40 | DISPSTAT_VCOUNTER = 4 41 | DISPSTAT_VBLANK_IRQ = 1 shl 3 42 | DISPSTAT_HBLANK_IRQ = 1 shl 4 43 | DISPSTAT_VCOUNTER_IRQ = 1 shl 5 44 | 45 | ; Sound Control 46 | REG_SOUND1CNT_L = 0x060 47 | REG_SOUND1CNT_H = 0x062 48 | REG_SOUND1CNT_X = 0x064 49 | REG_SOUND2CNT_L = 0x068 50 | REG_SOUND2CNT_X = 0x06C 51 | REG_SOUND3CNT_L = 0x070 52 | REG_SOUND3CNT_H = 0x072 53 | REG_SOUND3CNT_X = 0x074 54 | REG_SOUND4CNT_L = 0x078 55 | REG_SOUND4CNT_X = 0x07C 56 | REG_SOUNDCNT_L = 0x080 57 | REG_SOUNDCNT_H = 0x082 58 | REG_SOUNDCNT_X = 0x084 59 | REG_SOUNDBIAS = 0x088 60 | REG_FIFOA = 0x0A0 61 | REG_FIFOB = 0x0A4 62 | 63 | ; SOUNDCNT_L 64 | SOUNDCNT_L_1R = 1 shl 8 65 | SOUNDCNT_L_2R = 1 shl 9 66 | SOUNDCNT_L_3R = 1 shl 10 67 | SOUNDCNT_L_4R = 1 shl 11 68 | SOUNDCNT_L_1L = 1 shl 12 69 | SOUNDCNT_L_2L = 1 shl 13 70 | SOUNDCNT_L_3L = 1 shl 14 71 | SOUNDCNT_L_4L = 1 shl 15 72 | 73 | ; SOUNDCNT_H 74 | SOUNDCNT_H_PSG_V25 = 0 75 | SOUNDCNT_H_PSG_V50 = 1 76 | SOUNDCNT_H_PSG_V100 = 2 77 | SOUNDCNT_H_DMAA_V50 = 0 shl 2 78 | SOUNDCNT_H_DMAA_V100 = 1 shl 2 79 | SOUNDCNT_H_DMAB_V50 = 0 shl 3 80 | SOUNDCNT_H_DMAB_V100 = 1 shl 3 81 | SOUNDCNT_H_DMAA_R = 1 shl 8 82 | SOUNDCNT_H_DMAA_L = 2 shl 8 83 | SOUNDCNT_H_DMAA_LR = 3 shl 8 84 | SOUNDCNT_H_DMAA_T0 = 0 shl 10 85 | SOUNDCNT_H_DMAA_T1 = 1 shl 10 86 | SOUNDCNT_H_DMAA_RESET = 1 shl 11 87 | SOUNDCNT_H_DMAB_R = 1 shl 12 88 | SOUNDCNT_H_DMAB_L = 2 shl 12 89 | SOUNDCNT_H_DMAB_LR = 3 shl 12 90 | SOUNDCNT_H_DMAB_T0 = 0 shl 14 91 | SOUNDCNT_H_DMAB_T1 = 1 shl 14 92 | SOUNDCNT_H_DMAB_RESET = 1 shl 15 93 | 94 | ; SOUNDCNT_X 95 | SOUNDCNT_X_OFF = 0 shl 7 96 | SOUNDCNT_X_ON = 1 shl 7 97 | 98 | ; SOUNDBIAS 99 | SOUNDBIAS_32KHZ = 0 shl 14 100 | SOUNDBIAS_65KHZ = 1 shl 14 101 | SOUNDBIAS_131KHZ = 2 shl 14 102 | SOUNDBIAS_262KHZ = 3 shl 14 103 | 104 | ; Direct Memory Access 105 | REG_DMA0SAD = 0x0B0 106 | REG_DMA0DAD = 0x0B4 107 | REG_DMA0CNT = 0x0B8 108 | REG_DMA1SAD = 0x0BC 109 | REG_DMA1DAD = 0x0C0 110 | REG_DMA1CNT = 0x0C4 111 | REG_DMA2SAD = 0x0C8 112 | REG_DMA2DAD = 0x0CC 113 | REG_DMA2CNT = 0x0D0 114 | REG_DMA3SAD = 0x0D4 115 | REG_DMA3DAD = 0x0D8 116 | REG_DMA3CNT = 0x0DC 117 | 118 | ; DMA Control 119 | DMACNT_DST_INCREMENT = 0 shl 5 120 | DMACNT_DST_DECREMENT = 1 shl 5 121 | DMACNT_DST_FIXED = 2 shl 5 122 | DMACNT_DST_INCRELOAD = 3 shl 5 123 | DMACNT_SRC_INCREMENT = 0 shl 7 124 | DMACNT_SRC_DECREMENT = 1 shl 7 125 | DMACNT_SRC_FIXED = 2 shl 7 126 | DMACNT_SRC_PROHIBITED = 3 shl 7 ; = DMACNT_SRC_FIXED 127 | DMACNT_REPEAT = 1 shl 9 128 | DMACNT_HALFWORD = 0 shl 10 129 | DMACNT_WORD = 1 shl 10 130 | DMACNT_DRQ = 1 shl 11 131 | DMACNT_IMMEDIATE = 0 shl 12 132 | DMACNT_VBLANK = 1 shl 12 133 | DMACNT_HBLANK = 2 shl 12 134 | DMACNT_SPECIAL = 3 shl 12 135 | DMACNT_IRQ = 1 shl 14 136 | DMACNT_ON = 1 shl 15 137 | 138 | ; Timers 139 | REG_TM0CNT = 0x100 140 | REG_TM1CNT = 0x104 141 | REG_TM2CNT = 0x108 142 | REG_TM3CNT = 0x10C 143 | 144 | ; Timer Control 145 | TMCNT_CASCADE = 4 146 | TMCNT_IRQ = 1 shl 6 147 | TMCNT_ON = 1 shl 7 148 | 149 | ; System Control 150 | REG_IE = 0x200 151 | REG_WAITCNT = 0x204 152 | REG_IME = 0x208 153 | 154 | ; Interrupt Enable 155 | IE_VBLANK = 1 shl 0 156 | IE_HBLANK = 1 shl 1 157 | IE_VCOUNTER = 1 shl 2 158 | IE_TIMER0 = 1 shl 3 159 | IE_TIMER1 = 1 shl 4 160 | IE_TIMER2 = 1 shl 5 161 | IE_TIMER3 = 1 shl 6 162 | IE_SERIAL = 1 shl 7 163 | IE_DMA0 = 1 shl 8 164 | IE_DMA1 = 1 shl 9 165 | IE_DMA2 = 1 shl 10 166 | IE_DMA3 = 1 shl 11 167 | IE_KEYPAD = 1 shl 12 168 | IE_CART = 1 shl 13 169 | 170 | ;------------------------------------------------------------------------------ 171 | ;------------------------------------------------------------------------------ 172 | -------------------------------------------------------------------------------- /source/inc/psr.inc: -------------------------------------------------------------------------------- 1 | ;------------------------------------------------------------------------------ 2 | ; GBA Test Collection - GBA test ROMs written in ARM assembly. 3 | ; Copyright (C) 2021 Michelle-Marie Schiller 4 | ;------------------------------------------------------------------------------ 5 | ; psr.inc - Useful Program Status Register definitions. 6 | ;------------------------------------------------------------------------------ 7 | 8 | ; condition code flags 9 | PSR_V = 1 shl 28 10 | PSR_C = 1 shl 29 11 | PSR_Z = 1 shl 30 12 | PSR_N = 1 shl 31 13 | 14 | ; control flags 15 | PSR_T = 1 shl 5 16 | PSR_F = 1 shl 6 17 | PSR_I = 1 shl 7 18 | 19 | ; mode flags 20 | PSR_MUSR = 0x10 21 | PSR_MFIQ = 0x11 22 | PSR_MIRQ = 0x12 23 | PSR_MSVC = 0x13 24 | PSR_MABT = 0x17 25 | PSR_MUND = 0x1B 26 | PSR_MSYS = 0x1F 27 | 28 | ;------------------------------------------------------------------------------ 29 | ;------------------------------------------------------------------------------ 30 | -------------------------------------------------------------------------------- /source/lib/font.asm: -------------------------------------------------------------------------------- 1 | ;------------------------------------------------------------------------------ 2 | ; GBA Test Collection - GBA test ROMs written in ARM assembly. 3 | ; Copyright (C) 2021 Michelle-Marie Schiller 4 | ;------------------------------------------------------------------------------ 5 | ; font.asm - 8BPP font. 6 | ;------------------------------------------------------------------------------ 7 | 8 | Size_Data_Font = End_Data_Font - Data_Font ; size of Data_Font (in Bytes) 9 | 10 | Data_Font: 11 | ; ' ' 12 | db 0, 0, 0, 0, 0, 0, 0, 0 13 | db 0, 0, 0, 0, 0, 0, 0, 0 14 | db 0, 0, 0, 0, 0, 0, 0, 0 15 | db 0, 0, 0, 0, 0, 0, 0, 0 16 | db 0, 0, 0, 0, 0, 0, 0, 0 17 | db 0, 0, 0, 0, 0, 0, 0, 0 18 | db 0, 0, 0, 0, 0, 0, 0, 0 19 | db 0, 0, 0, 0, 0, 0, 0, 0 20 | ; ' ! ' 21 | db 0, 0, 0, 0, 0, 0, 0, 0 22 | db 0, 0, 0, 0, 1, 0, 0, 0 23 | db 0, 0, 0, 0, 1, 0, 0, 0 24 | db 0, 0, 0, 0, 1, 0, 0, 0 25 | db 0, 0, 0, 0, 1, 0, 0, 0 26 | db 0, 0, 0, 0, 0, 0, 0, 0 27 | db 0, 0, 0, 0, 1, 0, 0, 0 28 | db 0, 0, 0, 0, 0, 0, 0, 0 29 | ; ' " ' 30 | db 0, 0, 0, 0, 0, 0, 0, 0 31 | db 0, 0, 1, 1, 0, 1, 1, 0 32 | db 0, 0, 0, 1, 0, 0, 1, 0 33 | db 0, 0, 1, 0, 0, 1, 0, 0 34 | db 0, 0, 0, 0, 0, 0, 0, 0 35 | db 0, 0, 0, 0, 0, 0, 0, 0 36 | db 0, 0, 0, 0, 0, 0, 0, 0 37 | db 0, 0, 0, 0, 0, 0, 0, 0 38 | ; ' # ' 39 | db 0, 0, 0, 0, 0, 0, 0, 0 40 | db 0, 0, 0, 1, 0, 1, 0, 0 41 | db 0, 0, 1, 1, 1, 1, 1, 0 42 | db 0, 0, 0, 1, 0, 1, 0, 0 43 | db 0, 0, 0, 1, 0, 1, 0, 0 44 | db 0, 0, 1, 1, 1, 1, 1, 0 45 | db 0, 0, 0, 1, 0, 1, 0, 0 46 | db 0, 0, 0, 0, 0, 0, 0, 0 47 | ; ' $ ' 48 | db 0, 0, 0, 0, 0, 0, 0, 0 49 | db 0, 0, 0, 0, 1, 0, 0, 0 50 | db 0, 0, 0, 1, 1, 1, 1, 0 51 | db 0, 0, 1, 0, 0, 0, 0, 0 52 | db 0, 0, 0, 1, 1, 1, 0, 0 53 | db 0, 0, 0, 0, 0, 0, 1, 0 54 | db 0, 0, 1, 1, 1, 1, 0, 0 55 | db 0, 0, 0, 0, 1, 0, 0, 0 56 | ; ' % ' 57 | db 0, 0, 1, 0, 0, 0, 0, 0 58 | db 0, 1, 0, 1, 0, 0, 1, 0 59 | db 0, 0, 1, 0, 0, 1, 0, 0 60 | db 0, 0, 0, 0, 1, 0, 0, 0 61 | db 0, 0, 0, 1, 0, 0, 0, 0 62 | db 0, 0, 1, 0, 0, 1, 0, 0 63 | db 0, 1, 0, 0, 1, 0, 1, 0 64 | db 0, 0, 0, 0, 0, 1, 0, 0 65 | ; ' & ' 66 | db 0, 0, 0, 0, 0, 0, 0, 0 67 | db 0, 0, 1, 1, 0, 0, 0, 0 68 | db 0, 1, 0, 0, 0, 0, 0, 0 69 | db 0, 0, 1, 1, 0, 1, 1, 0 70 | db 0, 1, 0, 0, 0, 1, 0, 0 71 | db 0, 1, 0, 0, 0, 1, 0, 0 72 | db 0, 0, 1, 1, 1, 0, 0, 0 73 | db 0, 0, 0, 0, 0, 0, 0, 0 74 | ; ' ' ' 75 | db 0, 0, 0, 0, 0, 0, 0, 0 76 | db 0, 0, 0, 0, 1, 1, 0, 0 77 | db 0, 0, 0, 0, 0, 1, 0, 0 78 | db 0, 0, 0, 0, 1, 0, 0, 0 79 | db 0, 0, 0, 0, 0, 0, 0, 0 80 | db 0, 0, 0, 0, 0, 0, 0, 0 81 | db 0, 0, 0, 0, 0, 0, 0, 0 82 | db 0, 0, 0, 0, 0, 0, 0, 0 83 | ; ' ( ' 84 | db 0, 0, 0, 0, 0, 0, 0, 0 85 | db 0, 0, 0, 0, 0, 1, 0, 0 86 | db 0, 0, 0, 0, 1, 0, 0, 0 87 | db 0, 0, 0, 0, 1, 0, 0, 0 88 | db 0, 0, 0, 0, 1, 0, 0, 0 89 | db 0, 0, 0, 0, 1, 0, 0, 0 90 | db 0, 0, 0, 0, 1, 0, 0, 0 91 | db 0, 0, 0, 0, 0, 1, 0, 0 92 | ; ' ) ' 93 | db 0, 0, 0, 0, 0, 0, 0, 0 94 | db 0, 0, 0, 1, 0, 0, 0, 0 95 | db 0, 0, 0, 0, 1, 0, 0, 0 96 | db 0, 0, 0, 0, 1, 0, 0, 0 97 | db 0, 0, 0, 0, 1, 0, 0, 0 98 | db 0, 0, 0, 0, 1, 0, 0, 0 99 | db 0, 0, 0, 0, 1, 0, 0, 0 100 | db 0, 0, 0, 1, 0, 0, 0, 0 101 | ; ' * ' 102 | db 0, 0, 0, 0, 0, 0, 0, 0 103 | db 0, 0, 0, 0, 0, 0, 0, 0 104 | db 0, 0, 0, 1, 0, 1, 0, 0 105 | db 0, 0, 0, 0, 1, 0, 0, 0 106 | db 0, 0, 1, 1, 1, 1, 1, 0 107 | db 0, 0, 0, 0, 1, 0, 0, 0 108 | db 0, 0, 0, 1, 0, 1, 0, 0 109 | db 0, 0, 0, 0, 0, 0, 0, 0 110 | ; ' + ' 111 | db 0, 0, 0, 0, 0, 0, 0, 0 112 | db 0, 0, 0, 0, 0, 0, 0, 0 113 | db 0, 0, 0, 0, 1, 0, 0, 0 114 | db 0, 0, 0, 0, 1, 0, 0, 0 115 | db 0, 0, 1, 1, 1, 1, 1, 0 116 | db 0, 0, 0, 0, 1, 0, 0, 0 117 | db 0, 0, 0, 0, 1, 0, 0, 0 118 | db 0, 0, 0, 0, 0, 0, 0, 0 119 | ; ' , ' 120 | db 0, 0, 0, 0, 0, 0, 0, 0 121 | db 0, 0, 0, 0, 0, 0, 0, 0 122 | db 0, 0, 0, 0, 0, 0, 0, 0 123 | db 0, 0, 0, 0, 0, 0, 0, 0 124 | db 0, 0, 0, 0, 0, 0, 0, 0 125 | db 0, 0, 0, 0, 1, 1, 0, 0 126 | db 0, 0, 0, 0, 0, 1, 0, 0 127 | db 0, 0, 0, 0, 1, 0, 0, 0 128 | ; ' - ' 129 | db 0, 0, 0, 0, 0, 0, 0, 0 130 | db 0, 0, 0, 0, 0, 0, 0, 0 131 | db 0, 0, 0, 0, 0, 0, 0, 0 132 | db 0, 0, 0, 0, 0, 0, 0, 0 133 | db 0, 0, 1, 1, 1, 1, 1, 0 134 | db 0, 0, 0, 0, 0, 0, 0, 0 135 | db 0, 0, 0, 0, 0, 0, 0, 0 136 | db 0, 0, 0, 0, 0, 0, 0, 0 137 | ; ' . ' 138 | db 0, 0, 0, 0, 0, 0, 0, 0 139 | db 0, 0, 0, 0, 0, 0, 0, 0 140 | db 0, 0, 0, 0, 0, 0, 0, 0 141 | db 0, 0, 0, 0, 0, 0, 0, 0 142 | db 0, 0, 0, 0, 0, 0, 0, 0 143 | db 0, 0, 0, 0, 0, 0, 0, 0 144 | db 0, 0, 0, 0, 0, 1, 0, 0 145 | db 0, 0, 0, 0, 0, 1, 0, 0 146 | ; ' / ' 147 | db 0, 0, 0, 0, 0, 0, 0, 0 148 | db 0, 0, 0, 0, 0, 0, 1, 0 149 | db 0, 0, 0, 0, 0, 1, 0, 0 150 | db 0, 0, 0, 0, 1, 0, 0, 0 151 | db 0, 0, 0, 1, 0, 0, 0, 0 152 | db 0, 0, 1, 0, 0, 0, 0, 0 153 | db 0, 1, 0, 0, 0, 0, 0, 0 154 | db 0, 0, 0, 0, 0, 0, 0, 0 155 | ; ' 0 ' 156 | db 0, 0, 0, 0, 0, 0, 0, 0 157 | db 0, 0, 0, 1, 1, 1, 0, 0 158 | db 0, 0, 1, 0, 0, 0, 1, 0 159 | db 0, 0, 1, 0, 1, 0, 1, 0 160 | db 0, 0, 1, 0, 1, 0, 1, 0 161 | db 0, 0, 1, 0, 0, 0, 1, 0 162 | db 0, 0, 0, 1, 1, 1, 0, 0 163 | db 0, 0, 0, 0, 0, 0, 0, 0 164 | ; ' 1 ' 165 | db 0, 0, 0, 0, 0, 0, 0, 0 166 | db 0, 0, 0, 0, 1, 0, 0, 0 167 | db 0, 0, 1, 1, 1, 0, 0, 0 168 | db 0, 0, 0, 0, 1, 0, 0, 0 169 | db 0, 0, 0, 0, 1, 0, 0, 0 170 | db 0, 0, 0, 0, 1, 0, 0, 0 171 | db 0, 0, 1, 1, 1, 1, 1, 0 172 | db 0, 0, 0, 0, 0, 0, 0, 0 173 | ; ' 2 ' 174 | db 0, 0, 0, 0, 0, 0, 0, 0 175 | db 0, 0, 0, 1, 1, 1, 0, 0 176 | db 0, 0, 1, 0, 0, 0, 1, 0 177 | db 0, 0, 0, 0, 0, 0, 1, 0 178 | db 0, 0, 0, 1, 1, 1, 0, 0 179 | db 0, 0, 1, 0, 0, 0, 0, 0 180 | db 0, 0, 1, 1, 1, 1, 1, 0 181 | db 0, 0, 0, 0, 0, 0, 0, 0 182 | ; ' 3 ' 183 | db 0, 0, 0, 0, 0, 0, 0, 0 184 | db 0, 0, 0, 1, 1, 1, 0, 0 185 | db 0, 0, 1, 0, 0, 0, 1, 0 186 | db 0, 0, 0, 0, 1, 1, 0, 0 187 | db 0, 0, 0, 0, 0, 0, 1, 0 188 | db 0, 0, 1, 0, 0, 0, 1, 0 189 | db 0, 0, 0, 1, 1, 1, 0, 0 190 | db 0, 0, 0, 0, 0, 0, 0, 0 191 | ; ' 4 ' 192 | db 0, 0, 0, 0, 0, 0, 0, 0 193 | db 0, 0, 0, 0, 1, 1, 0, 0 194 | db 0, 0, 0, 1, 0, 1, 0, 0 195 | db 0, 0, 0, 1, 0, 1, 0, 0 196 | db 0, 0, 1, 0, 0, 1, 0, 0 197 | db 0, 0, 1, 1, 1, 1, 1, 0 198 | db 0, 0, 0, 0, 0, 1, 0, 0 199 | db 0, 0, 0, 0, 0, 0, 0, 0 200 | ; ' 5 ' 201 | db 0, 0, 0, 0, 0, 0, 0, 0 202 | db 0, 0, 1, 1, 1, 1, 1, 0 203 | db 0, 0, 1, 0, 0, 0, 0, 0 204 | db 0, 0, 1, 1, 1, 1, 0, 0 205 | db 0, 0, 0, 0, 0, 0, 1, 0 206 | db 0, 0, 1, 0, 0, 0, 1, 0 207 | db 0, 0, 0, 1, 1, 1, 0, 0 208 | db 0, 0, 0, 0, 0, 0, 0, 0 209 | ; ' 6 ' 210 | db 0, 0, 0, 0, 0, 0, 0, 0 211 | db 0, 0, 0, 1, 1, 1, 0, 0 212 | db 0, 0, 1, 0, 0, 0, 0, 0 213 | db 0, 0, 1, 1, 1, 1, 0, 0 214 | db 0, 0, 1, 0, 0, 0, 1, 0 215 | db 0, 0, 1, 0, 0, 0, 1, 0 216 | db 0, 0, 0, 1, 1, 1, 0, 0 217 | db 0, 0, 0, 0, 0, 0, 0, 0 218 | ; ' 7 ' 219 | db 0, 0, 0, 0, 0, 0, 0, 0 220 | db 0, 0, 1, 1, 1, 1, 1, 0 221 | db 0, 0, 0, 0, 0, 0, 1, 0 222 | db 0, 0, 0, 0, 0, 1, 0, 0 223 | db 0, 0, 0, 0, 0, 1, 0, 0 224 | db 0, 0, 0, 0, 1, 0, 0, 0 225 | db 0, 0, 0, 0, 1, 0, 0, 0 226 | db 0, 0, 0, 0, 0, 0, 0, 0 227 | ; ' 8 ' 228 | db 0, 0, 0, 0, 0, 0, 0, 0 229 | db 0, 0, 0, 1, 1, 1, 0, 0 230 | db 0, 0, 1, 0, 0, 0, 1, 0 231 | db 0, 0, 0, 1, 1, 1, 0, 0 232 | db 0, 0, 1, 0, 0, 0, 1, 0 233 | db 0, 0, 1, 0, 0, 0, 1, 0 234 | db 0, 0, 0, 1, 1, 1, 0, 0 235 | db 0, 0, 0, 0, 0, 0, 0, 0 236 | ; ' 9 ' 237 | db 0, 0, 0, 0, 0, 0, 0, 0 238 | db 0, 0, 0, 1, 1, 1, 0, 0 239 | db 0, 0, 1, 0, 0, 0, 1, 0 240 | db 0, 0, 1, 0, 0, 0, 1, 0 241 | db 0, 0, 0, 1, 1, 1, 1, 0 242 | db 0, 0, 0, 0, 0, 0, 1, 0 243 | db 0, 0, 0, 1, 1, 1, 0, 0 244 | db 0, 0, 0, 0, 0, 0, 0, 0 245 | ; ' : ' 246 | db 0, 0, 0, 0, 0, 0, 0, 0 247 | db 0, 0, 0, 0, 0, 0, 0, 0 248 | db 0, 0, 0, 0, 1, 0, 0, 0 249 | db 0, 0, 0, 0, 1, 0, 0, 0 250 | db 0, 0, 0, 0, 0, 0, 0, 0 251 | db 0, 0, 0, 0, 1, 0, 0, 0 252 | db 0, 0, 0, 0, 1, 0, 0, 0 253 | db 0, 0, 0, 0, 0, 0, 0, 0 254 | ; ' ; ' 255 | db 0, 0, 0, 0, 0, 0, 0, 0 256 | db 0, 0, 0, 0, 0, 0, 0, 0 257 | db 0, 0, 0, 0, 1, 0, 0, 0 258 | db 0, 0, 0, 0, 1, 0, 0, 0 259 | db 0, 0, 0, 0, 0, 0, 0, 0 260 | db 0, 0, 0, 1, 1, 0, 0, 0 261 | db 0, 0, 0, 0, 1, 0, 0, 0 262 | db 0, 0, 0, 1, 0, 0, 0, 0 263 | ; ' < ' 264 | db 0, 0, 0, 0, 0, 0, 0, 0 265 | db 0, 0, 0, 0, 0, 0, 0, 0 266 | db 0, 0, 0, 0, 0, 1, 0, 0 267 | db 0, 0, 0, 0, 1, 0, 0, 0 268 | db 0, 0, 0, 1, 0, 0, 0, 0 269 | db 0, 0, 0, 0, 1, 0, 0, 0 270 | db 0, 0, 0, 0, 0, 1, 0, 0 271 | db 0, 0, 0, 0, 0, 0, 0, 0 272 | ; ' = ' 273 | db 0, 0, 0, 0, 0, 0, 0, 0 274 | db 0, 0, 0, 0, 0, 0, 0, 0 275 | db 0, 0, 0, 0, 0, 0, 0, 0 276 | db 0, 0, 1, 1, 1, 1, 1, 0 277 | db 0, 0, 0, 0, 0, 0, 0, 0 278 | db 0, 0, 1, 1, 1, 1, 1, 0 279 | db 0, 0, 0, 0, 0, 0, 0, 0 280 | db 0, 0, 0, 0, 0, 0, 0, 0 281 | ; ' > ' 282 | db 0, 0, 0, 0, 0, 0, 0, 0 283 | db 0, 0, 0, 0, 0, 0, 0, 0 284 | db 0, 0, 0, 1, 0, 0, 0, 0 285 | db 0, 0, 0, 0, 1, 0, 0, 0 286 | db 0, 0, 0, 0, 0, 1, 0, 0 287 | db 0, 0, 0, 0, 1, 0, 0, 0 288 | db 0, 0, 0, 1, 0, 0, 0, 0 289 | db 0, 0, 0, 0, 0, 0, 0, 0 290 | ; ' ? ' 291 | db 0, 0, 0, 0, 0, 0, 0, 0 292 | db 0, 0, 0, 1, 1, 1, 0, 0 293 | db 0, 0, 0, 0, 0, 0, 1, 0 294 | db 0, 0, 0, 0, 0, 1, 0, 0 295 | db 0, 0, 0, 0, 1, 0, 0, 0 296 | db 0, 0, 0, 0, 0, 0, 0, 0 297 | db 0, 0, 0, 0, 1, 0, 0, 0 298 | db 0, 0, 0, 0, 0, 0, 0, 0 299 | ; ' @ ' 300 | db 0, 0, 0, 0, 0, 0, 0, 0 301 | db 0, 0, 0, 1, 1, 1, 0, 0 302 | db 0, 0, 1, 0, 0, 0, 1, 0 303 | db 0, 1, 0, 0, 1, 0, 0, 1 304 | db 0, 1, 0, 1, 0, 1, 0, 1 305 | db 0, 1, 0, 0, 1, 1, 1, 0 306 | db 0, 0, 1, 0, 0, 0, 0, 0 307 | db 0, 0, 0, 1, 1, 1, 1, 0 308 | ; ' A ' 309 | db 0, 0, 0, 0, 0, 0, 0, 0 310 | db 0, 0, 0, 1, 1, 1, 0, 0 311 | db 0, 0, 1, 0, 0, 0, 1, 0 312 | db 0, 0, 1, 0, 0, 0, 1, 0 313 | db 0, 0, 1, 1, 1, 1, 1, 0 314 | db 0, 0, 1, 0, 0, 0, 1, 0 315 | db 0, 0, 1, 0, 0, 0, 1, 0 316 | db 0, 0, 0, 0, 0, 0, 0, 0 317 | ; ' B ' 318 | db 0, 0, 0, 0, 0, 0, 0, 0 319 | db 0, 0, 1, 1, 1, 1, 0, 0 320 | db 0, 0, 1, 0, 0, 0, 1, 0 321 | db 0, 0, 1, 1, 1, 1, 0, 0 322 | db 0, 0, 1, 0, 0, 0, 1, 0 323 | db 0, 0, 1, 0, 0, 0, 1, 0 324 | db 0, 0, 1, 1, 1, 1, 0, 0 325 | db 0, 0, 0, 0, 0, 0, 0, 0 326 | ; ' C ' 327 | db 0, 0, 0, 0, 0, 0, 0, 0 328 | db 0, 0, 0, 1, 1, 1, 0, 0 329 | db 0, 0, 1, 0, 0, 0, 1, 0 330 | db 0, 0, 1, 0, 0, 0, 0, 0 331 | db 0, 0, 1, 0, 0, 0, 0, 0 332 | db 0, 0, 1, 0, 0, 0, 1, 0 333 | db 0, 0, 0, 1, 1, 1, 0, 0 334 | db 0, 0, 0, 0, 0, 0, 0, 0 335 | ; ' D ' 336 | db 0, 0, 0, 0, 0, 0, 0, 0 337 | db 0, 0, 1, 1, 1, 1, 0, 0 338 | db 0, 0, 1, 0, 0, 0, 1, 0 339 | db 0, 0, 1, 0, 0, 0, 1, 0 340 | db 0, 0, 1, 0, 0, 0, 1, 0 341 | db 0, 0, 1, 0, 0, 0, 1, 0 342 | db 0, 0, 1, 1, 1, 1, 0, 0 343 | db 0, 0, 0, 0, 0, 0, 0, 0 344 | ; ' E ' 345 | db 0, 0, 0, 0, 0, 0, 0, 0 346 | db 0, 0, 1, 1, 1, 1, 0, 0 347 | db 0, 0, 1, 0, 0, 0, 0, 0 348 | db 0, 0, 1, 1, 1, 1, 0, 0 349 | db 0, 0, 1, 0, 0, 0, 0, 0 350 | db 0, 0, 1, 0, 0, 0, 0, 0 351 | db 0, 0, 1, 1, 1, 1, 0, 0 352 | db 0, 0, 0, 0, 0, 0, 0, 0 353 | ; ' F ' 354 | db 0, 0, 0, 0, 0, 0, 0, 0 355 | db 0, 0, 1, 1, 1, 1, 0, 0 356 | db 0, 0, 1, 0, 0, 0, 0, 0 357 | db 0, 0, 1, 0, 0, 0, 0, 0 358 | db 0, 0, 1, 1, 1, 1, 0, 0 359 | db 0, 0, 1, 0, 0, 0, 0, 0 360 | db 0, 0, 1, 0, 0, 0, 0, 0 361 | db 0, 0, 0, 0, 0, 0, 0, 0 362 | ; ' G ' 363 | db 0, 0, 0, 0, 0, 0, 0, 0 364 | db 0, 0, 0, 1, 1, 1, 0, 0 365 | db 0, 0, 1, 0, 0, 0, 1, 0 366 | db 0, 0, 1, 0, 0, 0, 0, 0 367 | db 0, 0, 1, 0, 0, 1, 1, 0 368 | db 0, 0, 1, 0, 0, 0, 1, 0 369 | db 0, 0, 0, 1, 1, 1, 0, 0 370 | db 0, 0, 0, 0, 0, 0, 0, 0 371 | ; ' H ' 372 | db 0, 0, 0, 0, 0, 0, 0, 0 373 | db 0, 0, 1, 0, 0, 0, 1, 0 374 | db 0, 0, 1, 0, 0, 0, 1, 0 375 | db 0, 0, 1, 1, 1, 1, 1, 0 376 | db 0, 0, 1, 0, 0, 0, 1, 0 377 | db 0, 0, 1, 0, 0, 0, 1, 0 378 | db 0, 0, 1, 0, 0, 0, 1, 0 379 | db 0, 0, 0, 0, 0, 0, 0, 0 380 | ; ' I ' 381 | db 0, 0, 0, 0, 0, 0, 0, 0 382 | db 0, 0, 0, 1, 1, 1, 0, 0 383 | db 0, 0, 0, 0, 1, 0, 0, 0 384 | db 0, 0, 0, 0, 1, 0, 0, 0 385 | db 0, 0, 0, 0, 1, 0, 0, 0 386 | db 0, 0, 0, 0, 1, 0, 0, 0 387 | db 0, 0, 0, 1, 1, 1, 0, 0 388 | db 0, 0, 0, 0, 0, 0, 0, 0 389 | ; ' J ' 390 | db 0, 0, 0, 0, 0, 0, 0, 0 391 | db 0, 0, 0, 0, 0, 0, 1, 0 392 | db 0, 0, 0, 0, 0, 0, 1, 0 393 | db 0, 0, 0, 0, 0, 0, 1, 0 394 | db 0, 0, 1, 0, 0, 0, 1, 0 395 | db 0, 0, 1, 0, 0, 0, 1, 0 396 | db 0, 0, 0, 1, 1, 1, 0, 0 397 | db 0, 0, 0, 0, 0, 0, 0, 0 398 | ; ' K ' 399 | db 0, 0, 0, 0, 0, 0, 0, 0 400 | db 0, 0, 1, 0, 0, 0, 1, 0 401 | db 0, 0, 1, 0, 0, 1, 0, 0 402 | db 0, 0, 1, 0, 1, 0, 0, 0 403 | db 0, 0, 1, 1, 1, 0, 0, 0 404 | db 0, 0, 1, 0, 0, 1, 0, 0 405 | db 0, 0, 1, 0, 0, 0, 1, 0 406 | db 0, 0, 0, 0, 0, 0, 0, 0 407 | ; ' L ' 408 | db 0, 0, 0, 0, 0, 0, 0, 0 409 | db 0, 0, 1, 0, 0, 0, 0, 0 410 | db 0, 0, 1, 0, 0, 0, 0, 0 411 | db 0, 0, 1, 0, 0, 0, 0, 0 412 | db 0, 0, 1, 0, 0, 0, 0, 0 413 | db 0, 0, 1, 0, 0, 0, 0, 0 414 | db 0, 0, 1, 1, 1, 1, 0, 0 415 | db 0, 0, 0, 0, 0, 0, 0, 0 416 | ; ' M ' 417 | db 0, 0, 0, 0, 0, 0, 0, 0 418 | db 0, 0, 1, 0, 0, 0, 1, 0 419 | db 0, 0, 1, 1, 0, 1, 1, 0 420 | db 0, 0, 1, 0, 1, 0, 1, 0 421 | db 0, 0, 1, 0, 0, 0, 1, 0 422 | db 0, 0, 1, 0, 0, 0, 1, 0 423 | db 0, 0, 1, 0, 0, 0, 1, 0 424 | db 0, 0, 0, 0, 0, 0, 0, 0 425 | ; ' N ' 426 | db 0, 0, 0, 0, 0, 0, 0, 0 427 | db 0, 0, 1, 0, 0, 0, 1, 0 428 | db 0, 0, 1, 1, 0, 0, 1, 0 429 | db 0, 0, 1, 0, 1, 0, 1, 0 430 | db 0, 0, 1, 0, 0, 1, 1, 0 431 | db 0, 0, 1, 0, 0, 0, 1, 0 432 | db 0, 0, 1, 0, 0, 0, 1, 0 433 | db 0, 0, 0, 0, 0, 0, 0, 0 434 | ; ' O ' 435 | db 0, 0, 0, 0, 0, 0, 0, 0 436 | db 0, 0, 0, 1, 1, 1, 0, 0 437 | db 0, 0, 1, 0, 0, 0, 1, 0 438 | db 0, 0, 1, 0, 0, 0, 1, 0 439 | db 0, 0, 1, 0, 0, 0, 1, 0 440 | db 0, 0, 1, 0, 0, 0, 1, 0 441 | db 0, 0, 0, 1, 1, 1, 0, 0 442 | db 0, 0, 0, 0, 0, 0, 0, 0 443 | ; ' P ' 444 | db 0, 0, 0, 0, 0, 0, 0, 0 445 | db 0, 0, 0, 1, 1, 1, 0, 0 446 | db 0, 0, 1, 0, 0, 0, 1, 0 447 | db 0, 0, 1, 0, 0, 0, 1, 0 448 | db 0, 0, 1, 1, 1, 1, 0, 0 449 | db 0, 0, 1, 0, 0, 0, 0, 0 450 | db 0, 0, 1, 0, 0, 0, 0, 0 451 | db 0, 0, 0, 0, 0, 0, 0, 0 452 | ; ' Q ' 453 | db 0, 0, 0, 0, 0, 0, 0, 0 454 | db 0, 0, 0, 1, 1, 1, 0, 0 455 | db 0, 0, 1, 0, 0, 0, 1, 0 456 | db 0, 0, 1, 0, 0, 0, 1, 0 457 | db 0, 0, 1, 0, 0, 0, 1, 0 458 | db 0, 0, 1, 0, 0, 0, 1, 0 459 | db 0, 0, 0, 1, 1, 1, 0, 0 460 | db 0, 0, 0, 0, 0, 1, 1, 0 461 | ; ' R ' 462 | db 0, 0, 0, 0, 0, 0, 0, 0 463 | db 0, 0, 1, 1, 1, 1, 0, 0 464 | db 0, 0, 1, 0, 0, 0, 1, 0 465 | db 0, 0, 1, 0, 0, 0, 1, 0 466 | db 0, 0, 1, 1, 1, 1, 0, 0 467 | db 0, 0, 1, 0, 0, 1, 0, 0 468 | db 0, 0, 1, 0, 0, 0, 1, 0 469 | db 0, 0, 0, 0, 0, 0, 0, 0 470 | ; ' S ' 471 | db 0, 0, 0, 0, 0, 0, 0, 0 472 | db 0, 0, 0, 1, 1, 1, 0, 0 473 | db 0, 0, 1, 0, 0, 0, 0, 0 474 | db 0, 0, 0, 1, 1, 1, 0, 0 475 | db 0, 0, 0, 0, 0, 0, 1, 0 476 | db 0, 0, 1, 0, 0, 0, 1, 0 477 | db 0, 0, 0, 1, 1, 1, 0, 0 478 | db 0, 0, 0, 0, 0, 0, 0, 0 479 | ; ' T ' 480 | db 0, 0, 0, 0, 0, 0, 0, 0 481 | db 0, 0, 1, 1, 1, 1, 1, 0 482 | db 0, 0, 0, 0, 1, 0, 0, 0 483 | db 0, 0, 0, 0, 1, 0, 0, 0 484 | db 0, 0, 0, 0, 1, 0, 0, 0 485 | db 0, 0, 0, 0, 1, 0, 0, 0 486 | db 0, 0, 0, 0, 1, 0, 0, 0 487 | db 0, 0, 0, 0, 0, 0, 0, 0 488 | ; ' U ' 489 | db 0, 0, 0, 0, 0, 0, 0, 0 490 | db 0, 0, 1, 0, 0, 0, 1, 0 491 | db 0, 0, 1, 0, 0, 0, 1, 0 492 | db 0, 0, 1, 0, 0, 0, 1, 0 493 | db 0, 0, 1, 0, 0, 0, 1, 0 494 | db 0, 0, 1, 0, 0, 0, 1, 0 495 | db 0, 0, 0, 1, 1, 1, 0, 0 496 | db 0, 0, 0, 0, 0, 0, 0, 0 497 | ; ' V ' 498 | db 0, 0, 0, 0, 0, 0, 0, 0 499 | db 0, 0, 1, 0, 0, 0, 1, 0 500 | db 0, 0, 1, 0, 0, 0, 1, 0 501 | db 0, 0, 0, 1, 0, 1, 0, 0 502 | db 0, 0, 0, 1, 0, 1, 0, 0 503 | db 0, 0, 0, 0, 1, 0, 0, 0 504 | db 0, 0, 0, 0, 1, 0, 0, 0 505 | db 0, 0, 0, 0, 0, 0, 0, 0 506 | ; ' W ' 507 | db 0, 0, 0, 0, 0, 0, 0, 0 508 | db 0, 0, 1, 0, 0, 0, 1, 0 509 | db 0, 0, 1, 0, 0, 0, 1, 0 510 | db 0, 0, 1, 0, 1, 0, 1, 0 511 | db 0, 0, 1, 0, 1, 0, 1, 0 512 | db 0, 0, 1, 0, 1, 0, 1, 0 513 | db 0, 0, 0, 1, 0, 1, 0, 0 514 | db 0, 0, 0, 0, 0, 0, 0, 0 515 | ; ' X ' 516 | db 0, 0, 0, 0, 0, 0, 0, 0 517 | db 0, 0, 1, 0, 0, 0, 1, 0 518 | db 0, 0, 0, 1, 0, 1, 0, 0 519 | db 0, 0, 0, 0, 1, 0, 0, 0 520 | db 0, 0, 0, 0, 1, 0, 0, 0 521 | db 0, 0, 0, 1, 0, 1, 0, 0 522 | db 0, 0, 1, 0, 0, 0, 1, 0 523 | db 0, 0, 0, 0, 0, 0, 0, 0 524 | ; ' Y ' 525 | db 0, 0, 0, 0, 0, 0, 0, 0 526 | db 0, 0, 1, 0, 0, 0, 1, 0 527 | db 0, 0, 1, 0, 0, 0, 1, 0 528 | db 0, 0, 0, 1, 0, 1, 0, 0 529 | db 0, 0, 0, 0, 1, 0, 0, 0 530 | db 0, 0, 0, 0, 1, 0, 0, 0 531 | db 0, 0, 0, 0, 1, 0, 0, 0 532 | db 0, 0, 0, 0, 0, 0, 0, 0 533 | ; ' Z ' 534 | db 0, 0, 0, 0, 0, 0, 0, 0 535 | db 0, 0, 1, 1, 1, 1, 1, 0 536 | db 0, 0, 0, 0, 0, 0, 1, 0 537 | db 0, 0, 0, 0, 0, 1, 0, 0 538 | db 0, 0, 0, 1, 1, 0, 0, 0 539 | db 0, 0, 1, 0, 0, 0, 0, 0 540 | db 0, 0, 1, 1, 1, 1, 1, 0 541 | db 0, 0, 0, 0, 0, 0, 0, 0 542 | ; ' [ ' 543 | db 0, 0, 0, 0, 0, 0, 0, 0 544 | db 0, 0, 0, 1, 1, 0, 0, 0 545 | db 0, 0, 0, 1, 0, 0, 0, 0 546 | db 0, 0, 0, 1, 0, 0, 0, 0 547 | db 0, 0, 0, 1, 0, 0, 0, 0 548 | db 0, 0, 0, 1, 0, 0, 0, 0 549 | db 0, 0, 0, 1, 0, 0, 0, 0 550 | db 0, 0, 0, 1, 1, 0, 0, 0 551 | ; ' \ ' 552 | db 0, 0, 0, 0, 0, 0, 0, 0 553 | db 0, 1, 0, 0, 0, 0, 0, 0 554 | db 0, 0, 1, 0, 0, 0, 0, 0 555 | db 0, 0, 0, 1, 0, 0, 0, 0 556 | db 0, 0, 0, 0, 1, 0, 0, 0 557 | db 0, 0, 0, 0, 0, 1, 0, 0 558 | db 0, 0, 0, 0, 0, 0, 1, 0 559 | db 0, 0, 0, 0, 0, 0, 0, 0 560 | ; ' ] ' 561 | db 0, 0, 0, 0, 0, 0, 0, 0 562 | db 0, 0, 0, 0, 1, 1, 0, 0 563 | db 0, 0, 0, 0, 0, 1, 0, 0 564 | db 0, 0, 0, 0, 0, 1, 0, 0 565 | db 0, 0, 0, 0, 0, 1, 0, 0 566 | db 0, 0, 0, 0, 0, 1, 0, 0 567 | db 0, 0, 0, 0, 0, 1, 0, 0 568 | db 0, 0, 0, 0, 1, 1, 0, 0 569 | ; ' ^ ' 570 | db 0, 0, 0, 0, 0, 0, 0, 0 571 | db 0, 0, 0, 0, 1, 0, 0, 0 572 | db 0, 0, 0, 1, 0, 1, 0, 0 573 | db 0, 0, 1, 0, 0, 0, 1, 0 574 | db 0, 0, 0, 0, 0, 0, 0, 0 575 | db 0, 0, 0, 0, 0, 0, 0, 0 576 | db 0, 0, 0, 0, 0, 0, 0, 0 577 | db 0, 0, 0, 0, 0, 0, 0, 0 578 | ; ' _ ' 579 | db 0, 0, 0, 0, 0, 0, 0, 0 580 | db 0, 0, 0, 0, 0, 0, 0, 0 581 | db 0, 0, 0, 0, 0, 0, 0, 0 582 | db 0, 0, 0, 0, 0, 0, 0, 0 583 | db 0, 0, 0, 0, 0, 0, 0, 0 584 | db 0, 0, 0, 0, 0, 0, 0, 0 585 | db 0, 0, 0, 0, 0, 0, 0, 0 586 | db 0, 0, 1, 1, 1, 1, 1, 0 587 | ; ' ` ' 588 | db 0, 0, 0, 0, 0, 0, 0, 0 589 | db 0, 0, 0, 0, 1, 1, 0, 0 590 | db 0, 0, 0, 1, 0, 0, 0, 0 591 | db 0, 0, 1, 1, 1, 1, 0, 0 592 | db 0, 0, 0, 1, 0, 0, 0, 0 593 | db 0, 0, 0, 1, 0, 0, 0, 0 594 | db 0, 0, 1, 1, 1, 1, 1, 0 595 | db 0, 0, 0, 0, 0, 0, 0, 0 596 | ; ' a ' 597 | db 0, 0, 0, 0, 0, 0, 0, 0 598 | db 0, 0, 0, 0, 0, 0, 0, 0 599 | db 0, 0, 0, 1, 1, 1, 0, 0 600 | db 0, 0, 0, 0, 0, 0, 1, 0 601 | db 0, 0, 0, 1, 1, 1, 1, 0 602 | db 0, 0, 1, 0, 0, 0, 1, 0 603 | db 0, 0, 0, 1, 1, 1, 1, 0 604 | db 0, 0, 0, 0, 0, 0, 0, 0 605 | ; ' b ' 606 | db 0, 0, 0, 0, 0, 0, 0, 0 607 | db 0, 0, 1, 0, 0, 0, 0, 0 608 | db 0, 0, 1, 0, 1, 1, 0, 0 609 | db 0, 0, 1, 1, 0, 0, 1, 0 610 | db 0, 0, 1, 0, 0, 0, 1, 0 611 | db 0, 0, 1, 0, 0, 0, 1, 0 612 | db 0, 0, 1, 1, 1, 1, 0, 0 613 | db 0, 0, 0, 0, 0, 0, 0, 0 614 | ; ' c ' 615 | db 0, 0, 0, 0, 0, 0, 0, 0 616 | db 0, 0, 0, 0, 0, 0, 0, 0 617 | db 0, 0, 0, 1, 1, 1, 0, 0 618 | db 0, 0, 1, 0, 0, 0, 0, 0 619 | db 0, 0, 1, 0, 0, 0, 0, 0 620 | db 0, 0, 1, 0, 0, 0, 1, 0 621 | db 0, 0, 0, 1, 1, 1, 0, 0 622 | db 0, 0, 0, 0, 0, 0, 0, 0 623 | ; ' d ' 624 | db 0, 0, 0, 0, 0, 0, 0, 0 625 | db 0, 0, 0, 0, 0, 0, 1, 0 626 | db 0, 0, 0, 1, 1, 0, 1, 0 627 | db 0, 0, 1, 0, 0, 1, 1, 0 628 | db 0, 0, 1, 0, 0, 0, 1, 0 629 | db 0, 0, 1, 0, 0, 0, 1, 0 630 | db 0, 0, 0, 1, 1, 1, 1, 0 631 | db 0, 0, 0, 0, 0, 0, 0, 0 632 | ; ' e ' 633 | db 0, 0, 0, 0, 0, 0, 0, 0 634 | db 0, 0, 0, 0, 0, 0, 0, 0 635 | db 0, 0, 0, 1, 1, 1, 0, 0 636 | db 0, 0, 1, 0, 0, 0, 1, 0 637 | db 0, 0, 1, 1, 1, 1, 1, 0 638 | db 0, 0, 1, 0, 0, 0, 0, 0 639 | db 0, 0, 0, 1, 1, 1, 0, 0 640 | db 0, 0, 0, 0, 0, 0, 0, 0 641 | ; ' f ' 642 | db 0, 0, 0, 0, 0, 0, 0, 0 643 | db 0, 0, 0, 0, 0, 1, 1, 0 644 | db 0, 0, 0, 0, 1, 0, 0, 0 645 | db 0, 0, 0, 1, 1, 1, 1, 0 646 | db 0, 0, 0, 0, 1, 0, 0, 0 647 | db 0, 0, 0, 0, 1, 0, 0, 0 648 | db 0, 0, 0, 0, 1, 0, 0, 0 649 | db 0, 0, 0, 0, 0, 0, 0, 0 650 | ; ' g ' 651 | db 0, 0, 0, 0, 0, 0, 0, 0 652 | db 0, 0, 0, 0, 0, 0, 0, 0 653 | db 0, 0, 0, 1, 1, 1, 1, 0 654 | db 0, 0, 1, 0, 0, 0, 1, 0 655 | db 0, 0, 1, 0, 0, 1, 1, 0 656 | db 0, 0, 0, 1, 1, 0, 1, 0 657 | db 0, 0, 0, 0, 0, 0, 1, 0 658 | db 0, 0, 0, 1, 1, 1, 0, 0 659 | ; ' h ' 660 | db 0, 0, 0, 0, 0, 0, 0, 0 661 | db 0, 0, 1, 0, 0, 0, 0, 0 662 | db 0, 0, 1, 0, 1, 1, 0, 0 663 | db 0, 0, 1, 1, 0, 0, 1, 0 664 | db 0, 0, 1, 0, 0, 0, 1, 0 665 | db 0, 0, 1, 0, 0, 0, 1, 0 666 | db 0, 0, 1, 0, 0, 0, 1, 0 667 | db 0, 0, 0, 0, 0, 0, 0, 0 668 | ; ' i ' 669 | db 0, 0, 0, 0, 0, 0, 0, 0 670 | db 0, 0, 0, 0, 0, 1, 0, 0 671 | db 0, 0, 0, 0, 0, 0, 0, 0 672 | db 0, 0, 0, 0, 1, 1, 0, 0 673 | db 0, 0, 0, 0, 0, 1, 0, 0 674 | db 0, 0, 0, 0, 0, 1, 0, 0 675 | db 0, 0, 0, 0, 0, 1, 0, 0 676 | db 0, 0, 0, 0, 0, 0, 0, 0 677 | ; ' j ' 678 | db 0, 0, 0, 0, 0, 0, 0, 0 679 | db 0, 0, 0, 0, 0, 1, 0, 0 680 | db 0, 0, 0, 0, 0, 0, 0, 0 681 | db 0, 0, 0, 0, 1, 1, 0, 0 682 | db 0, 0, 0, 0, 0, 1, 0, 0 683 | db 0, 0, 1, 0, 0, 1, 0, 0 684 | db 0, 0, 0, 1, 1, 0, 0, 0 685 | db 0, 0, 0, 0, 0, 0, 0, 0 686 | ; ' k ' 687 | db 0, 0, 0, 0, 0, 0, 0, 0 688 | db 0, 0, 1, 0, 0, 0, 0, 0 689 | db 0, 0, 1, 0, 0, 0, 0, 0 690 | db 0, 0, 1, 0, 0, 1, 0, 0 691 | db 0, 0, 1, 0, 1, 0, 0, 0 692 | db 0, 0, 1, 1, 0, 0, 0, 0 693 | db 0, 0, 1, 0, 1, 1, 0, 0 694 | db 0, 0, 0, 0, 0, 0, 0, 0 695 | ; ' l ' 696 | db 0, 0, 0, 0, 0, 0, 0, 0 697 | db 0, 0, 1, 0, 0, 0, 0, 0 698 | db 0, 0, 1, 0, 0, 0, 0, 0 699 | db 0, 0, 1, 0, 0, 0, 0, 0 700 | db 0, 0, 1, 0, 0, 0, 0, 0 701 | db 0, 0, 1, 0, 0, 1, 0, 0 702 | db 0, 0, 0, 1, 1, 0, 0, 0 703 | db 0, 0, 0, 0, 0, 0, 0, 0 704 | ; ' m ' 705 | db 0, 0, 0, 0, 0, 0, 0, 0 706 | db 0, 0, 0, 0, 0, 0, 0, 0 707 | db 0, 1, 1, 1, 0, 1, 1, 0 708 | db 0, 1, 0, 0, 1, 0, 0, 1 709 | db 0, 1, 0, 0, 1, 0, 0, 1 710 | db 0, 1, 0, 0, 1, 0, 0, 1 711 | db 0, 1, 0, 0, 1, 0, 0, 1 712 | db 0, 0, 0, 0, 0, 0, 0, 0 713 | ; ' n ' 714 | db 0, 0, 0, 0, 0, 0, 0, 0 715 | db 0, 0, 0, 0, 0, 0, 0, 0 716 | db 0, 0, 1, 0, 1, 1, 0, 0 717 | db 0, 0, 1, 1, 0, 0, 1, 0 718 | db 0, 0, 1, 0, 0, 0, 1, 0 719 | db 0, 0, 1, 0, 0, 0, 1, 0 720 | db 0, 0, 1, 0, 0, 0, 1, 0 721 | db 0, 0, 0, 0, 0, 0, 0, 0 722 | ; ' o ' 723 | db 0, 0, 0, 0, 0, 0, 0, 0 724 | db 0, 0, 0, 0, 0, 0, 0, 0 725 | db 0, 0, 0, 1, 1, 1, 0, 0 726 | db 0, 0, 1, 0, 0, 0, 1, 0 727 | db 0, 0, 1, 0, 0, 0, 1, 0 728 | db 0, 0, 1, 0, 0, 0, 1, 0 729 | db 0, 0, 0, 1, 1, 1, 0, 0 730 | db 0, 0, 0, 0, 0, 0, 0, 0 731 | ; ' p ' 732 | db 0, 0, 0, 0, 0, 0, 0, 0 733 | db 0, 0, 0, 0, 0, 0, 0, 0 734 | db 0, 0, 1, 0, 1, 1, 0, 0 735 | db 0, 0, 1, 1, 0, 0, 1, 0 736 | db 0, 0, 1, 0, 0, 0, 1, 0 737 | db 0, 0, 1, 1, 1, 1, 0, 0 738 | db 0, 0, 1, 0, 0, 0, 0, 0 739 | db 0, 0, 0, 0, 0, 0, 0, 0 740 | ; ' q ' 741 | db 0, 0, 0, 0, 0, 0, 0, 0 742 | db 0, 0, 0, 0, 0, 0, 0, 0 743 | db 0, 0, 0, 1, 1, 1, 1, 0 744 | db 0, 0, 1, 0, 0, 0, 1, 0 745 | db 0, 0, 1, 0, 0, 1, 1, 0 746 | db 0, 0, 0, 1, 1, 0, 1, 0 747 | db 0, 0, 0, 0, 0, 0, 1, 0 748 | db 0, 0, 0, 0, 0, 0, 0, 0 749 | ; ' r ' 750 | db 0, 0, 0, 0, 0, 0, 0, 0 751 | db 0, 0, 0, 0, 0, 0, 0, 0 752 | db 0, 0, 0, 1, 0, 1, 1, 0 753 | db 0, 0, 0, 1, 1, 0, 0, 0 754 | db 0, 0, 0, 1, 0, 0, 0, 0 755 | db 0, 0, 0, 1, 0, 0, 0, 0 756 | db 0, 0, 0, 1, 0, 0, 0, 0 757 | db 0, 0, 0, 0, 0, 0, 0, 0 758 | ; ' s ' 759 | db 0, 0, 0, 0, 0, 0, 0, 0 760 | db 0, 0, 0, 0, 0, 0, 0, 0 761 | db 0, 0, 0, 1, 1, 1, 0, 0 762 | db 0, 0, 1, 0, 0, 0, 0, 0 763 | db 0, 0, 0, 1, 1, 1, 0, 0 764 | db 0, 0, 0, 0, 0, 0, 1, 0 765 | db 0, 0, 1, 1, 1, 1, 0, 0 766 | db 0, 0, 0, 0, 0, 0, 0, 0 767 | ; ' t ' 768 | db 0, 0, 0, 0, 0, 0, 0, 0 769 | db 0, 0, 0, 1, 0, 0, 0, 0 770 | db 0, 0, 1, 1, 1, 1, 0, 0 771 | db 0, 0, 0, 1, 0, 0, 0, 0 772 | db 0, 0, 0, 1, 0, 0, 0, 0 773 | db 0, 0, 0, 1, 0, 0, 1, 0 774 | db 0, 0, 0, 0, 1, 1, 0, 0 775 | db 0, 0, 0, 0, 0, 0, 0, 0 776 | ; ' u ' 777 | db 0, 0, 0, 0, 0, 0, 0, 0 778 | db 0, 0, 0, 0, 0, 0, 0, 0 779 | db 0, 0, 1, 0, 0, 0, 1, 0 780 | db 0, 0, 1, 0, 0, 0, 1, 0 781 | db 0, 0, 1, 0, 0, 0, 1, 0 782 | db 0, 0, 1, 0, 0, 1, 1, 0 783 | db 0, 0, 0, 1, 1, 0, 1, 0 784 | db 0, 0, 0, 0, 0, 0, 0, 0 785 | ; ' v ' 786 | db 0, 0, 0, 0, 0, 0, 0, 0 787 | db 0, 0, 0, 0, 0, 0, 0, 0 788 | db 0, 0, 1, 0, 0, 0, 1, 0 789 | db 0, 0, 1, 0, 0, 0, 1, 0 790 | db 0, 0, 0, 1, 0, 1, 0, 0 791 | db 0, 0, 0, 1, 0, 1, 0, 0 792 | db 0, 0, 0, 0, 1, 0, 0, 0 793 | db 0, 0, 0, 0, 0, 0, 0, 0 794 | ; ' w ' 795 | db 0, 0, 0, 0, 0, 0, 0, 0 796 | db 0, 0, 0, 0, 0, 0, 0, 0 797 | db 0, 1, 0, 0, 0, 0, 0, 1 798 | db 0, 1, 0, 0, 1, 0, 0, 1 799 | db 0, 1, 0, 0, 1, 0, 0, 1 800 | db 0, 1, 0, 0, 1, 0, 0, 1 801 | db 0, 0, 1, 1, 0, 1, 1, 0 802 | db 0, 0, 0, 0, 0, 0, 0, 0 803 | ; ' x ' 804 | db 0, 0, 0, 0, 0, 0, 0, 0 805 | db 0, 0, 0, 0, 0, 0, 0, 0 806 | db 0, 0, 1, 0, 0, 0, 1, 0 807 | db 0, 0, 0, 1, 0, 1, 0, 0 808 | db 0, 0, 0, 0, 1, 0, 0, 0 809 | db 0, 0, 0, 1, 0, 1, 0, 0 810 | db 0, 0, 1, 0, 0, 0, 1, 0 811 | db 0, 0, 0, 0, 0, 0, 0, 0 812 | ; ' y ' 813 | db 0, 0, 0, 0, 0, 0, 0, 0 814 | db 0, 0, 0, 0, 0, 0, 0, 0 815 | db 0, 0, 1, 0, 0, 0, 1, 0 816 | db 0, 0, 1, 0, 0, 0, 1, 0 817 | db 0, 0, 0, 1, 0, 1, 0, 0 818 | db 0, 0, 0, 1, 0, 1, 0, 0 819 | db 0, 0, 0, 0, 1, 0, 0, 0 820 | db 0, 0, 1, 1, 0, 0, 0, 0 821 | ; ' z ' 822 | db 0, 0, 0, 0, 0, 0, 0, 0 823 | db 0, 0, 0, 0, 0, 0, 0, 0 824 | db 0, 0, 1, 1, 1, 1, 1, 0 825 | db 0, 0, 0, 0, 0, 1, 0, 0 826 | db 0, 0, 0, 0, 1, 0, 0, 0 827 | db 0, 0, 0, 1, 0, 0, 0, 0 828 | db 0, 0, 1, 1, 1, 1, 1, 0 829 | db 0, 0, 0, 0, 0, 0, 0, 0 830 | ; ' { ' 831 | db 0, 0, 0, 0, 0, 0, 0, 0 832 | db 0, 0, 0, 0, 0, 1, 0, 0 833 | db 0, 0, 0, 0, 1, 0, 0, 0 834 | db 0, 0, 0, 0, 1, 0, 0, 0 835 | db 0, 0, 0, 1, 0, 0, 0, 0 836 | db 0, 0, 0, 0, 1, 0, 0, 0 837 | db 0, 0, 0, 0, 1, 0, 0, 0 838 | db 0, 0, 0, 0, 0, 1, 0, 0 839 | ; ' | ' 840 | db 0, 0, 0, 0, 0, 0, 0, 0 841 | db 0, 0, 0, 0, 1, 0, 0, 0 842 | db 0, 0, 0, 0, 1, 0, 0, 0 843 | db 0, 0, 0, 0, 1, 0, 0, 0 844 | db 0, 0, 0, 0, 1, 0, 0, 0 845 | db 0, 0, 0, 0, 1, 0, 0, 0 846 | db 0, 0, 0, 0, 1, 0, 0, 0 847 | db 0, 0, 0, 0, 1, 0, 0, 0 848 | ; ' } ' 849 | db 0, 0, 0, 0, 0, 0, 0, 0 850 | db 0, 0, 1, 0, 0, 0, 0, 0 851 | db 0, 0, 0, 1, 0, 0, 0, 0 852 | db 0, 0, 0, 1, 0, 0, 0, 0 853 | db 0, 0, 0, 0, 1, 0, 0, 0 854 | db 0, 0, 0, 1, 0, 0, 0, 0 855 | db 0, 0, 0, 1, 0, 0, 0, 0 856 | db 0, 0, 1, 0, 0, 0, 0, 0 857 | 858 | End_Data_Font: 859 | 860 | ;---------------------------------------------------------------------------------- 861 | ;---------------------------------------------------------------------------------- 862 | -------------------------------------------------------------------------------- /source/lib/memcpy.asm: -------------------------------------------------------------------------------- 1 | ;------------------------------------------------------------------------------ 2 | ; GBA Test Collection - GBA test ROMs written in ARM assembly. 3 | ; Copyright (C) 2021 Michelle-Marie Schiller 4 | ;------------------------------------------------------------------------------ 5 | ; memcpy.asm - Memory copy and set routines. 6 | ;------------------------------------------------------------------------------ 7 | 8 | Size_MemCpy32 = End_MemCpy32 - MemCpy32 ; size of MemCpy32 (in Bytes) 9 | Size_MemSet32 = End_MemSet32 - MemSet32 ; size of MemSet32 (in Bytes) 10 | 11 | ;------------------------------------------------------------------------------ 12 | ; void MemCpy32(u32 *pDst, u32 *pSrc, u32 nWords) 13 | ;------------------------------------------------------------------------------ 14 | ; Description: 32-bit memory copy operation. 15 | ;------------------------------------------------------------------------------ 16 | ; Parameters: 17 | ; r0 - Destination pointer. (has to be aligned to a word boundary) 18 | ; r1 - Source pointer. (has to be aligned to a word boundary) 19 | ; r2 - Number of 32-bit words to copy. 20 | ;------------------------------------------------------------------------------ 21 | ; Returns: 22 | ; Nothing. 23 | ;------------------------------------------------------------------------------ 24 | MemCpy32: 25 | ; return if nWords == 0 26 | movs r2, r2 27 | bxeq lr 28 | 29 | ; pEnd = pDst + nWords * 4 30 | add r3, r0, r2, lsl 2 31 | 32 | .Loop: 33 | ; *pDst++ = *pSrc++ 34 | ldr r2, [r1], 4 35 | str r2, [r0], 4 36 | 37 | ; if (pDst != pEnd) goto .Loop_MemCpy32 38 | cmp r0, r3 39 | bne .Loop 40 | 41 | bx lr 42 | 43 | End_MemCpy32: 44 | ;------------------------------------------------------------------------------ 45 | 46 | ;------------------------------------------------------------------------------ 47 | ; void MemSet32(u32 *pDst, u32 data, u32 nWords) 48 | ;------------------------------------------------------------------------------ 49 | ; Description: 32-bit memory set operation. 50 | ;------------------------------------------------------------------------------ 51 | ; Parameters: 52 | ; r0 - Destination pointer. (has to be aligned to a word boundary) 53 | ; r1 - Memory set data. 54 | ; r2 - Number of 32-bit words to set. 55 | ;------------------------------------------------------------------------------ 56 | ; Returns: 57 | ; Nothing. 58 | ;------------------------------------------------------------------------------ 59 | MemSet32: 60 | ; return if nWords == 0 61 | movs r2, r2 62 | bxeq lr 63 | 64 | ; pEnd = pDst + nWords * 4 65 | add r3, r0, r2, lsl 2 66 | 67 | .Loop: 68 | ; *pDst = data 69 | str r1, [r0], 4 70 | 71 | ; if (pDst != pEnd) goto .Loop_MemCpy32 72 | cmp r0, r3 73 | bne .Loop 74 | 75 | bx lr 76 | 77 | End_MemSet32: 78 | ;------------------------------------------------------------------------------ 79 | 80 | ;------------------------------------------------------------------------------ 81 | ;------------------------------------------------------------------------------ 82 | -------------------------------------------------------------------------------- /source/lib/print.asm: -------------------------------------------------------------------------------- 1 | ;------------------------------------------------------------------------------ 2 | ; GBA Test Collection - GBA test ROMs written in ARM assembly. 3 | ; Copyright (C) 2021 Michelle-Marie Schiller 4 | ;------------------------------------------------------------------------------ 5 | ; print.asm - Text printing routines. 6 | ;------------------------------------------------------------------------------ 7 | 8 | include '../inc/memory.inc' 9 | include '../inc/mmio.inc' 10 | 11 | ;------------------------------------------------------------------------------ 12 | ; void InitPrint(u16 cBg, u16 cText) 13 | ;------------------------------------------------------------------------------ 14 | ; Description: 15 | ; Initializes text colors and the display mode. 16 | ;------------------------------------------------------------------------------ 17 | ; Parameters: 18 | ; r0 - Background color. 19 | ; r1 - Text color. 20 | ;------------------------------------------------------------------------------ 21 | ; Returns: 22 | ; Nothing. 23 | ;------------------------------------------------------------------------------ 24 | InitPrint: 25 | ; initialize text colors 26 | orr r1, r0, r1, lsl 16 27 | mov r0, MEM_PRAM 28 | str r1, [r0] 29 | 30 | ; initialize display mode 31 | mov r0, MEM_MMIO 32 | mov r1, DISPCNT_MODE4 33 | orr r1, DISPCNT_BG2_ON 34 | strh r1, [r0] 35 | 36 | bx lr 37 | 38 | End_InitPrint: 39 | ;------------------------------------------------------------------------------ 40 | 41 | ;------------------------------------------------------------------------------ 42 | ; void PrintStr(const char *pStr, int x, int y) 43 | ;------------------------------------------------------------------------------ 44 | ; Description: 45 | ; Prints a string to the screen. 46 | ;------------------------------------------------------------------------------ 47 | ; Parameters: 48 | ; r0 - Pointer to string to print. 49 | ; r1 - Initial X coordinate (8px steps). 50 | ; r2 - Initial Y coordinate (8px steps). 51 | ;------------------------------------------------------------------------------ 52 | ; Returns: 53 | ; Nothing. 54 | ;------------------------------------------------------------------------------ 55 | PrintStr: 56 | push {r4-r6, lr} 57 | 58 | ; save arguments 59 | mov r4, r0 60 | mov r5, r1 61 | mov r6, r2 62 | 63 | .Loop: 64 | ; get next character 65 | ldrb r0, [r4], 1 66 | 67 | ; return if char == 0 68 | movs r0, r0 69 | beq .Return 70 | 71 | ; set up PrintChar arguments 72 | mov r1, r5 73 | mov r2, r6 74 | 75 | bl PrintChar 76 | 77 | add r5, 1 ; increment X coordinate 78 | b .Loop 79 | 80 | .Return: 81 | pop {r4-r6, pc} 82 | 83 | End_PrintStr: 84 | ;------------------------------------------------------------------------------ 85 | 86 | ;------------------------------------------------------------------------------ 87 | ; void PrintHex(u32 x, int n, int x, int y) 88 | ;------------------------------------------------------------------------------ 89 | ; Description: 90 | ; Prints n hex digits of number x. 91 | ;------------------------------------------------------------------------------ 92 | ; Parameters: 93 | ; r0 - Number to print. 94 | ; r1 - Number of digits to print. 95 | ; r2 - Initial X coordinate (8px steps). 96 | ; r3 - Initial Y coordinate (8px steps). 97 | ;------------------------------------------------------------------------------ 98 | ; Returns: 99 | ; Nothing. 100 | ;------------------------------------------------------------------------------ 101 | PrintHex: 102 | push {r4-r7, lr} 103 | 104 | ; save arguments 105 | mov r4, r0 106 | mov r5, r1 107 | mov r6, r2 108 | mov r7, r3 109 | 110 | .Loop: 111 | sub r5, 1 ; decrement n 112 | 113 | ; get next hex digit and right-shift x by 4 114 | and r0, r4, 0xF 115 | mov r4, r4, lsr 4 116 | 117 | ; get character 118 | cmp r0, 9 119 | addls r0, 0x30 120 | addhi r0, 0x37 121 | 122 | ; set up PrintChar arguments 123 | add r1, r6, r5 124 | mov r2, r7 125 | 126 | bl PrintChar 127 | 128 | ; return if n == 0 129 | movs r5, r5 130 | bne .Loop 131 | 132 | pop {r4-r7, pc} 133 | End_PrintHex: 134 | ;------------------------------------------------------------------------------ 135 | 136 | ;------------------------------------------------------------------------------ 137 | ; void PrintChar(char c, int x, int y) 138 | ;------------------------------------------------------------------------------ 139 | ; Description: 140 | ; Prints a single character to the screen. 141 | ;------------------------------------------------------------------------------ 142 | ; Parameters: 143 | ; r0 - Character to print. 144 | ; r1 - X coordinate (8px steps). 145 | ; r2 - Y coordinate (8px steps). 146 | ;------------------------------------------------------------------------------ 147 | ; Returns: 148 | ; Nothing. 149 | ;------------------------------------------------------------------------------ 150 | PrintChar: 151 | push {r4-r5, lr} 152 | 153 | mov r4, MEM_VRAM 154 | sub r0, 0x20 155 | 156 | ; get pixel offset (x * 4, y * 8) 157 | mov r1, r1, lsl 2 158 | mov r2, r2, lsl 3 159 | 160 | ; compute VRAM start address (MEM_VRAM + (y * 240) + x) 161 | mov r3, 240 162 | mul r3, r2, r3 163 | add r4, r3 164 | add r4, r1 165 | 166 | ; get font offset (Data_Font + (c * 64)) 167 | adr r3, Data_Font 168 | add r0, r3, r0, lsl 6 169 | 170 | mov r2, 8 ; initialize loop counter 171 | 172 | .Loop: 173 | subs r2, 1 174 | 175 | ; pixel16 = (pixel8L + (pixel8H << 8)) 176 | ldrb r3, [r0], 1 177 | ldrb r5, [r0], 1 178 | orr r3, r3, r5, lsl 8 179 | strh r3, [r4, r1] 180 | add r1, 2 181 | 182 | ; pixel16 = (pixel8L + (pixel8H << 8)) 183 | ldrb r3, [r0], 1 184 | ldrb r5, [r0], 1 185 | orr r3, r3, r5, lsl 8 186 | strh r3, [r4, r1] 187 | add r1, 2 188 | 189 | ; pixel16 = (pixel8L + (pixel8H << 8)) 190 | ldrb r3, [r0], 1 191 | ldrb r5, [r0], 1 192 | orr r3, r3, r5, lsl 8 193 | strh r3, [r4, r1] 194 | add r1, 2 195 | 196 | ; pixel16 = (pixel8L + (pixel8H << 8)) 197 | ldrb r3, [r0], 1 198 | ldrb r5, [r0], 1 199 | orr r3, r3, r5, lsl 8 200 | strh r3, [r4, r1] 201 | add r1, 2 202 | 203 | beq .Return 204 | 205 | add r4, 240 ; increment VRAM address by 240 206 | sub r1, 8 ; decrement loop counter 207 | b .Loop 208 | 209 | .Return: 210 | pop {r4-r5, pc} 211 | 212 | End_PrintChar: 213 | ;------------------------------------------------------------------------------ 214 | 215 | include 'font.asm' 216 | align 4 217 | 218 | ;------------------------------------------------------------------------------ 219 | ;------------------------------------------------------------------------------ 220 | -------------------------------------------------------------------------------- /source/misc/helloAudio/audioL.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ladystarbreeze/GBA-Test-Collection/61527ece54b5dea8344d3723e4f6cac1ce3e73d4/source/misc/helloAudio/audioL.bin -------------------------------------------------------------------------------- /source/misc/helloAudio/audioR.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ladystarbreeze/GBA-Test-Collection/61527ece54b5dea8344d3723e4f6cac1ce3e73d4/source/misc/helloAudio/audioR.bin -------------------------------------------------------------------------------- /source/misc/helloAudio/helloAudio.gba: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ladystarbreeze/GBA-Test-Collection/61527ece54b5dea8344d3723e4f6cac1ce3e73d4/source/misc/helloAudio/helloAudio.gba -------------------------------------------------------------------------------- /source/misc/helloAudio/main.asm: -------------------------------------------------------------------------------- 1 | ;------------------------------------------------------------------------------ 2 | ; GBA Test Collection - GBA test ROMs written in ARM assembly. 3 | ; Copyright (C) 2021 Michelle-Marie Schiller 4 | ;------------------------------------------------------------------------------ 5 | ; main.asm - Simple audio demo. 6 | ;------------------------------------------------------------------------------ 7 | 8 | format binary as 'gba' 9 | 10 | include '../../inc/memory.inc' 11 | include '../../inc/mmio.inc' 12 | include '../../inc/psr.inc' 13 | 14 | include '../../header.asm' 15 | include '../../entrypoint.asm' 16 | 17 | ; null-terminated string macro 18 | macro m_STR msg 19 | { 20 | db msg 21 | db 0 22 | align 4 23 | } 24 | 25 | ; 16-byte aligned audio stream 26 | macro m_AUDIO stream 27 | { 28 | file stream 29 | align 16 30 | } 31 | 32 | ;------------------------------------------------------------------------------ 33 | ; void Main() 34 | ;------------------------------------------------------------------------------ 35 | ; Description: Main function. 36 | ;------------------------------------------------------------------------------ 37 | ; Parameters: 38 | ; None. 39 | ;------------------------------------------------------------------------------ 40 | ; Returns: 41 | ; Nothing. 42 | ;------------------------------------------------------------------------------ 43 | Main: 44 | push {r12, lr} 45 | mov r4, MEM_MMIO 46 | adr r12, .Pool 47 | 48 | ; initialize print library 49 | mov r0, 0 50 | mvn r1, r0 51 | bl InitPrint 52 | 53 | ; print "Hello, Audio." message 54 | mov r0, r12 55 | ldmia r0, {r0-r2} 56 | bl PrintStr 57 | 58 | ; enable sound circuit 59 | mov r0, SOUNDCNT_X_ON 60 | strh r0, [r4, REG_SOUNDCNT_X] 61 | 62 | ; set panning, reset audio FIFOs 63 | ldr r0, [r12, 0xC] 64 | strh r0, [r4, REG_SOUNDCNT_H] 65 | 66 | ; write dummy byte to audio FIFOs 67 | mov r0, 0 68 | strb r0, [r4, REG_FIFOA] 69 | strb r0, [r4, REG_FIFOB] 70 | 71 | ; set up DMA1 and DMA2 registers 72 | add r0, r12, 0x10 73 | ldmia r0, {r0-r3} 74 | stmia r0, {r1-r3} 75 | add r0, r12, 0x20 76 | ldmia r0, {r0-r3} 77 | stmia r0, {r1-r3} 78 | 79 | ldr r5, [r12, 0x30] ; sample counter 80 | 81 | ; enable DMA2 IRQs, clear IF 82 | mov r6, IE_DMA2 83 | orr r6, r6, lsl 16 84 | str r6, [r4, REG_IE] 85 | 86 | ; start Timer 0 87 | ldr r0, [r12, 0x34] 88 | str r0, [r4, REG_TM0CNT] 89 | 90 | .Loop: 91 | ; clear IF, call SWI Halt() 92 | str r6, [r4, REG_IE] 93 | swi 0x20000 94 | 95 | ; decrement sample counter 96 | subs r5, 1 97 | bne .Loop 98 | 99 | ; restart DMA channels, reset sample counter 100 | mov r0, 0 101 | ldr r1, [r12, 0x1C] 102 | ldr r2, [r12, 0x2C] 103 | str r0, [r4, REG_DMA1CNT] 104 | str r0, [r4, REG_DMA2CNT] 105 | str r1, [r4, REG_DMA1CNT] 106 | str r2, [r4, REG_DMA2CNT] 107 | ldr r5, [r12, 0x30] 108 | 109 | b .Loop 110 | 111 | pop {r12, pc} 112 | 113 | .Pool: 114 | ; PrintStr - Hello World message [0x00] 115 | dw MEM_ROM0 + Str_HelloWorld, 1, 1 116 | ; SOUNDCNT_H [0x0C] 117 | dw SOUNDCNT_H_DMAB_RESET + SOUNDCNT_H_DMAB_R + SOUNDCNT_H_DMAA_RESET + SOUNDCNT_H_DMAA_L 118 | ; DMA1SAD/DAD/CNT [0x10] 119 | dw MEM_MMIO + REG_DMA1SAD 120 | dw MEM_ROM0 + Data_AudioL, MEM_MMIO + REG_FIFOA 121 | dh 4, DMACNT_ON + DMACNT_SPECIAL + DMACNT_WORD + DMACNT_REPEAT + DMACNT_DST_FIXED 122 | ; DMA2SAD/DAD/CNT [0x20] 123 | dw MEM_MMIO + REG_DMA2SAD 124 | dw MEM_ROM0 + Data_AudioR, MEM_MMIO + REG_FIFOB 125 | dh 4, DMACNT_ON + DMACNT_IRQ + DMACNT_SPECIAL + DMACNT_WORD + DMACNT_REPEAT + DMACNT_DST_FIXED 126 | ; audio stream length [0x30] 127 | dw (End_Data_AudioL - Data_AudioL) / 16 128 | ; Timer 0 [0x34] 129 | dh 0x10000 - 256, TMCNT_ON 130 | 131 | End_Main: 132 | ;------------------------------------------------------------------------------ 133 | 134 | Str_HelloWorld: 135 | m_STR "Hello, Audio." 136 | 137 | Includes_Print: 138 | include '../../lib/print.asm' 139 | 140 | Data_AudioL: 141 | m_AUDIO 'audioL.bin' 142 | 143 | End_Data_AudioL: 144 | 145 | Data_AudioR: 146 | m_AUDIO 'audioR.bin' 147 | 148 | End_Data_AudioR: 149 | 150 | ;------------------------------------------------------------------------------ 151 | ;------------------------------------------------------------------------------ 152 | -------------------------------------------------------------------------------- /source/misc/helloWorld/helloWorld.gba: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ladystarbreeze/GBA-Test-Collection/61527ece54b5dea8344d3723e4f6cac1ce3e73d4/source/misc/helloWorld/helloWorld.gba -------------------------------------------------------------------------------- /source/misc/helloWorld/main.asm: -------------------------------------------------------------------------------- 1 | ;------------------------------------------------------------------------------ 2 | ; GBA Test Collection - GBA test ROMs written in ARM assembly. 3 | ; Copyright (C) 2021 Michelle-Marie Schiller 4 | ;------------------------------------------------------------------------------ 5 | ; main.asm - Hello World. 6 | ;------------------------------------------------------------------------------ 7 | 8 | format binary as 'gba' 9 | 10 | include '../../inc/memory.inc' 11 | include '../../inc/mmio.inc' 12 | include '../../inc/psr.inc' 13 | 14 | include '../../header.asm' 15 | include '../../entrypoint.asm' 16 | 17 | ; null-terminated string macro 18 | macro m_STR msg 19 | { 20 | db msg 21 | db 0 22 | align 4 23 | } 24 | 25 | ;------------------------------------------------------------------------------ 26 | ; void Main() 27 | ;------------------------------------------------------------------------------ 28 | ; Description: Main function. 29 | ;------------------------------------------------------------------------------ 30 | ; Parameters: 31 | ; None. 32 | ;------------------------------------------------------------------------------ 33 | ; Returns: 34 | ; Nothing. 35 | ;------------------------------------------------------------------------------ 36 | Main: 37 | push {r12, lr} 38 | adr r12, .Pool 39 | 40 | ; initialize print library 41 | mov r0, 0 42 | mvn r1, r0 43 | bl InitPrint 44 | 45 | ; print "Hello, World." message 46 | mov r0, r12 47 | ldmia r0, {r0-r2} 48 | bl PrintStr 49 | 50 | pop {r12, pc} 51 | 52 | .Pool: 53 | ; PrintStr - Hello World message [0x00] 54 | dw MEM_ROM0 + Str_HelloWorld, 1, 1 55 | 56 | End_Main: 57 | ;------------------------------------------------------------------------------ 58 | 59 | Str_HelloWorld: 60 | m_STR "Hello, World." 61 | 62 | Includes_Print: 63 | include '../../lib/print.asm' 64 | 65 | ;------------------------------------------------------------------------------ 66 | ;------------------------------------------------------------------------------ 67 | --------------------------------------------------------------------------------