;;; 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+1 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