diff options
Diffstat (limited to 'render.s')
-rw-r--r-- | render.s | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/render.s b/render.s new file mode 100644 index 0000000..867003e --- /dev/null +++ b/render.s @@ -0,0 +1,94 @@ +;;; Subroutine: render +;;; Convert 1px per byte array at pixarray to packed 8px/byte at screen. +; pixarray is 170x170. screen is 256x170 (TODO: fix display list). +; each screen line is: 43 blank px, 170 graphics px, 43 blank. + screenbyte = FR0 + colcount = FR0+1 + +render: + lda #<screen + sta screenptr + lda #>screen + sta screenptr+1 + lda #<pixarray + sta pixptr + lda #>pixarray + sta pixptr+1 + + ldx #0 +rline: + lda #0 + sta colcount + sta screenbyte + +; ; clear 40px on left +; ldy #4 +;lclr: +; sta (screenptr),y +; dey +; bpl lclr +; +; ; clear 40px on right +; ldy #$1b +;rclr: +; sta (screenptr),y +; iny +; cpy #$20 +; bne rclr + +; clear whole line. this is why pixarray is offset from screen by +; one screen line. + ldy #$1f +rclr: + sta (screenptr),y + dey + bpl rclr + + ; first pixels start at column 40, plus... + lda #5 + sta screenbyte + lda #$10 ; ...mask starts out 0001000, 3 more blank px on left + sta pixmask + +rpix: + ldy colcount ; ranges 0 to 169 + lda (pixptr),y + beq notset ; 0 = not set, non-zero = set + ; if we found a set pixel, set it in the bitmap + ldy screenbyte + lda (screenptr),y + ora pixmask + sta (screenptr),y +notset: + ; pixmask >>= 1; if(pixmask == 0) { pixmask = 0x80; screenbyte++; } + lsr pixmask + bne pmok + ;ror pixmask + lda #$80 + sta pixmask + inc screenbyte +pmok: + inc colcount + lda colcount + cmp #$aa + bne rpix + ; pixptr += 0xaa; + clc + adc pixptr + sta pixptr + lda pixptr+1 + adc #0 + sta pixptr+1 + ; screenptr += 0x20; + clc + lda screenptr + adc #$20 + sta screenptr + lda screenptr+1 + adc #0 + sta screenptr+1 + inx + cpx #$aa ; hit last line yet? + bne rline ; if not, go render next line. + + rts |