From 3fcb3f683d684f70f3bbabd68edc9addc526e562 Mon Sep 17 00:00:00 2001 From: Vince Weaver Date: Tue, 2 Oct 2018 23:13:17 -0400 Subject: [PATCH] add mode7 code --- megademo/gr_scroll.s | 195 +++++++++++++++++++++++++++++++++++++++++++ megademo/mode7.s | 15 ++-- 2 files changed, 205 insertions(+), 5 deletions(-) create mode 100644 megademo/gr_scroll.s diff --git a/megademo/gr_scroll.s b/megademo/gr_scroll.s new file mode 100644 index 00000000..e30f1668 --- /dev/null +++ b/megademo/gr_scroll.s @@ -0,0 +1,195 @@ +;.ifndef scroll_row1 +;scroll_row1 EQU $8A00 +;scroll_row2 EQU $8B00 +;scroll_row3 EQU $8C00 +;scroll_row4 EQU $8D00 +;.endif + +SCROLL_LENGTH = $61 +;OFFSET = $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 + diff --git a/megademo/mode7.s b/megademo/mode7.s index 2b53a27e..94b6882e 100644 --- a/megademo/mode7.s +++ b/megademo/mode7.s @@ -69,6 +69,14 @@ mode7_flying: jsr init_multiply_tables + ; initialize + lda #>sky_background + sta INH + lda #