. = 0x8c010000 VIDBEG = 0xa520a000 VIDSTRIDE = 640 * 4 DOTWD = 16 ; bytes (implicitly known in putdot) DOTHT = 5 ; lines XDOT = VIDSTRIDE / DOTWD XCHAR = XDOT / 8 YCHAR = 8 .entry . stacktop: mov.l initstack,r15 bsr clearall nop 1: nop bra 1b nop .align 4 initstack: .long stacktop clearall: mov #YCHAR-1,r1 2: mov #XCHAR-1,r2 1: mov #' ,r0 mov.l r2,@-r15 mov.l r1,@-r15 mov.l r0,@-r15 bsr storechar nop dt r2 bf/s 1b add #1,r0 dt r1 bf 2b rts nop storechar: mov.l r0,@-r15 mov.l r1,@-r15 mov.l r2,@-r15 mov.l @(16,r15),r0 mov.l @(20,r15),r1 mov.l @(24,r15),r2 mov.l r3,@-r15 mov.l r4,@-r15 mov.l r5,@-r15 mov.l r6,@-r15 sts.l pr,@-r15 SHLL #3,r2,r6 SHLL #3,r1,r6 SHLL #3,r0,r6 mov.l fontptr,r3 add r0,r3 mov #8,r4 2: mov.b @r3+,r0 SHLL #24,r0,r6 mov #8,r5 1: mov.l r2,@-r15 mov.l r1,@-r15 shll r0 rotcl r6 bsr putdot mov.l r6,@-r15 dt r5 bf/s 1b add #1,r2 add #-8,r2 dt r4 bf/s 2b add #1,r1 lds.l @r15+,pr mov.l @r15+,r6 mov.l @r15+,r5 mov.l @r15+,r4 mov.l @r15+,r3 mov.l @r15+,r2 mov.l @r15+,r1 mov.l @r15+,r0 rts add #12,r15 .align 4 fontptr: .long font putdot: mov.l r0,@-r15 mov.l r1,@-r15 mov.l r2,@-r15 mov.l @(16,r15),r0 mov.l @(20,r15),r1 mov.l @(24,r15),r2 mov.l r3,@-r15 sts.l pr,@-r15 mov #DOTWD,r3 mul.l r2,r3 sts macl,r2 mov.l 9f,r3 mul.l r1,r3 sts macl,r1 add r2,r1 mov.l vidbeg,r3 add r3,r1 shlr r0 bt 1f bra 2f mov #0,r0 1: mov #-1,r0 2: mov #DOTHT,r3 mov.l vidstride,r2 3: ; This sequence knows DOTWD is 16 mov.l r0,@r3 mov.l r0,@(4,r3) mov.l r0,@(8,r3) mov.l r0,@(12,r3) dt r3 bf/s 3b add r2,r3 lds.l @r15+,pr mov.l @r15+,r3 mov.l @r15+,r2 mov.l @r15+,r1 mov.l @r15+,r0 rts add #12,r15 .align 4 9: .long DOTHT * VIDSTRIDE .align 4 vidbeg: .long VIDBEG vidstride: .long VIDSTRIDE .include "font.s"