.syntax unified
.cpu arm7tdmi
.arm
.equ VRAM, 0x06000000
.equ VCOUNT, 0x04000006
.equ KEYINPUT, 0x04000130
.section .header, "ax"
.global _start
_start:
    b boot
    .space 188
.section .text
boot:
    msr cpsr_c, #0xdf
    ldr sp, =0x03007f00
    ldr r0, =0x04000000
    ldr r1, =0x0483
    strh r1, [r0]
    ldr r0, =__bss_start
    ldr r1, =__bss_end
    mov r2, #0
clear_bss:
    cmp r0, r1
    strlo r2, [r0], #4
    blo clear_bss
    mov r0, #0
    mov r1, #0
    mov r2, #240
    mov r3, #160
    mov r4, #0
    bl fill_rect
    mov r0, #104
    mov r1, #64
    mov r2, #32
    mov r3, #32
    ldr r4, =0x03e0
    bl fill_rect
    ldr r0, =0x04000000
    ldr r1, =0x0403
    strh r1, [r0]
stop:
    b stop

@ snippet: pixels
@ r0=x, r1=y, r2=width, r3=height, r4=color.
@ Requires positive width/height and a rectangle entirely inside the screen.
fill_rect:
    push {r5-r8, lr}
    mov r5, #240
    mul r6, r1, r5
    add r6, r6, r0
    ldr r5, =VRAM
    add r5, r5, r6, lsl #1
    rsb r7, r2, #240
    mov r7, r7, lsl #1
    mov r6, r3
row:
    mov r8, r2
pixel:
    strh r4, [r5], #2
    subs r8, r8, #1
    bne pixel
    add r5, r5, r7
    subs r6, r6, #1
    bne row
    pop {r5-r8, lr}
    bx lr
@ end: pixels

.ltorg
.section .bss
.balign 4
