89 lines
3.0 KiB
ArmAsm
89 lines
3.0 KiB
ArmAsm
.arm
|
|
//.align 2
|
|
|
|
.text
|
|
//.section .text, "ax", %progbits
|
|
.global main
|
|
main:
|
|
mov r0, #0x04000000
|
|
mov r1, #0x0003
|
|
orr r1, #0x0400
|
|
str r1, [r0]
|
|
|
|
letters:
|
|
ldr r0, .VID_MEM // r0 := &(video memory)
|
|
mov r1, #0x001F // r1 == Color::red => color to draw pixels in
|
|
|
|
mov r4, #0 // r4 => table offset for the letter
|
|
|
|
mov r5, #8 // r5 == 8 => letter column counter
|
|
mov r6, #8 // r6 == 8 => letter row counter
|
|
|
|
mov r7, #0x1C // r7 == 30 => screen column counter
|
|
mov r8, #0x7F // r8 == 28 => letter number counter
|
|
// /\
|
|
// ||
|
|
// (0x7f for all letters, which won't fit the screen or the VID_MEM)
|
|
|
|
ldr r2, =.NESfont // r2 => &(font table)
|
|
|
|
ldrb r3, [r2, r4] // r3 := first row of pixels
|
|
|
|
1:
|
|
tst r3, #0b10000000 // \ \ \ \ if (leftmost bit of bitfield is set)
|
|
beq 2f
|
|
|
|
strh r1, [r0] // | | | | draw pixel with color
|
|
// | | | /
|
|
|
|
2:
|
|
lsl r3, r3, #1 // | | | r3 := next letter column
|
|
add r0, #2 // | | | r0 := next pixel
|
|
|
|
subs r5, #1 // | | |
|
|
bne 1b // | | / while (r5 > 0 => columns to process)
|
|
|
|
add r4, r4, #1 // | | \ next letter row
|
|
ldrb r3, [r2, r4] // | | /
|
|
|
|
subs r6, #1 // | |
|
|
beq 3f // | | break
|
|
|
|
add r0, r0, #464 // | | r0 += row - letter width (8x2) => next screen row, first box column
|
|
mov r5, #8 // | | reset column counter
|
|
|
|
b 1b // | / while (r6 > 0)
|
|
|
|
3:
|
|
mov r5, #8 // | reset column counter
|
|
mov r6, #8 // | reset row counter
|
|
|
|
subs r8, #1 // | => one letter done
|
|
beq infin // | > return if (last letter)
|
|
|
|
subs r7, #1 // | => one screen column used
|
|
beq 4f // | => screen row full
|
|
|
|
ldr r9, =0x0D1F // | r9 == 0x0D1E + (1 apparently?!)
|
|
sub r0, r0, r9 // | r0 := next box
|
|
|
|
b 1b
|
|
|
|
4:
|
|
mov r7, #0x1C // | reset screen column counter
|
|
add r0, #5 // | r0 := 2 => next pixel (wraps around to next row) + pixel left empty at the right of the screen
|
|
|
|
b 1b // / while (r8 > 0)
|
|
|
|
|
|
|
|
infin:
|
|
b infin
|
|
|
|
.VID_MEM:
|
|
.long 0x06000000 // &(video memory)
|
|
|
|
// Local Variables:
|
|
// mode: asm
|
|
// End:
|