.ifndef scroll_row1 scroll_row1 EQU $8A00 scroll_row2 EQU $8B00 scroll_row3 EQU $8C00 scroll_row4 EQU $8D00 .endif SCROLL_LENGTH EQU $61 OFFSET EQU $62 ;======================== ; scroll some text ;======================== ; RLE compressed data in INL/INH ; CV is Y position to display at gr_scroll: lda #0 sta OFFSET ;======================= ; decompress scroll text ;======================= jsr decompress_scroll scroll_loop: ldx #0 ldy CV lsr lda gr_offsets,Y ; get position sta sm1+1 lda gr_offsets+2,Y ; get position sta sm2+1 lda gr_offsets+4,Y ; get position sta sm3+1 lda gr_offsets+6,Y ; get position sta sm4+1 iny clc lda gr_offsets,Y ; get position adc DRAW_PAGE sta sm1+2 lda gr_offsets+2,Y ; get position adc DRAW_PAGE sta sm2+2 lda gr_offsets+4,Y ; get position adc DRAW_PAGE sta sm3+2 lda gr_offsets+6,Y ; get position adc DRAW_PAGE sta sm4+2 ldy OFFSET draw_loop: lda scroll_row1,Y sm1: sta $400,X lda scroll_row2,Y sm2: sta $480,X lda scroll_row3,Y sm3: sta $500,X lda scroll_row4,Y sm4: sta $580,X iny inx cpx #40 bne draw_loop ;================== ; flip pages ;================== jsr page_flip ; 6 ;================== ; delay ;================== lda #125 jsr WAIT ;================== ; loop forever ;================== clc lda OFFSET adc #40 cmp SCROLL_LENGTH beq done_scrolling inc OFFSET jmp scroll_loop ; 3 done_scrolling: rts ;======================= ; decompress scroll ;======================= decompress_scroll: ldy #0 jsr scroll_load_and_increment sta SCROLL_LENGTH lda #scroll_row1 sta OUTH decompress_scroll_loop: jsr scroll_load_and_increment ; load compressed value cmp #$A1 ; EOF marker beq done_decompress_scroll ; if EOF, exit pha ; save and #$f0 ; mask cmp #$a0 ; see if special AX beq decompress_scroll_special pla ; note, PLA sets flags! ldx #$1 ; only want to print 1 bne decompress_scroll_run decompress_scroll_special: pla and #$0f ; check if was A0 bne decompress_scroll_color ; if A0 need to read run, color decompress_scroll_large: jsr scroll_load_and_increment ; get run length decompress_scroll_color: tax ; put runlen into X jsr scroll_load_and_increment ; get color decompress_scroll_run: sta (OUTL),Y pha clc ; increment 16-bit pointer lda OUTL adc #$1 sta OUTL lda OUTH adc #$0 sta OUTH pla dex ; repeat for X times bne decompress_scroll_run beq decompress_scroll_loop ; get next run done_decompress_scroll: rts scroll_load_and_increment: lda (INL),Y ; load and increment 16-bit pointer pha clc lda INL adc #$1 sta INL lda INH adc #$0 sta INH pla rts