diff --git a/mode7/Makefile b/mode7/Makefile index c7fb501b..5a53a11f 100644 --- a/mode7/Makefile +++ b/mode7/Makefile @@ -65,7 +65,11 @@ SCROLL_DEMO: scroll_demo.o ld65 -o SCROLL_DEMO scroll_demo.o -C ./apple2_1000.inc scroll_demo.o: scroll_demo.s \ - deater_scroll.inc + deater_scroll.inc \ + ../asm_routines/hlin_clearscreen.s \ + ../asm_routines/gr_scroll.s \ + ../asm_routines/pageflip.s \ + ../asm_routines/gr_setpage.s ca65 -o scroll_demo.o scroll_demo.s -l scroll_demo.lst scroller: scroller.o diff --git a/mode7/mode7.dsk b/mode7/mode7.dsk index 0a0a9d0c..e1f763ce 100644 Binary files a/mode7/mode7.dsk and b/mode7/mode7.dsk differ diff --git a/mode7/scroll_demo.s b/mode7/scroll_demo.s index bdd0c1d0..2bf81ce8 100644 --- a/mode7/scroll_demo.s +++ b/mode7/scroll_demo.s @@ -1,13 +1,6 @@ .include "zp.inc" -scroll_row1 EQU $8A00 -scroll_row2 EQU $8B00 -scroll_row3 EQU $8C00 -scroll_row4 EQU $8D00 - -SCROLL_LENGTH EQU $E6 - ;================================ ; Clear screen and setup graphics ;================================ @@ -20,178 +13,33 @@ SCROLL_LENGTH EQU $E6 ;=============== lda #0 sta DISP_PAGE - sta ANGLE ;======================= ; decompress scroll text ;======================= + + lda #10 + sta CV + +scroll_forever: lda #>deater_scroll sta INH lda #scroll_row1 - sta OUTH - -decompress_scroll_loop: - jsr 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_special - - pla ; note, PLA sets flags! - - ldx #$1 ; only want to print 1 - bne decompress_run - -decompress_special: - pla - - and #$0f ; check if was A0 - - bne decompress_color ; if A0 need to read run, color - -decompress_large: - jsr load_and_increment ; get run length - -decompress_color: - tax ; put runlen into X - jsr load_and_increment ; get color - -decompress_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_run - - beq decompress_scroll_loop ; get next run - -done_decompress_scroll: - rts - - -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 - +;=============================================== +; Routines +;=============================================== +.include "../asm_routines/hlin_clearscreen.s" +.include "../asm_routines/gr_scroll.s" +.include "../asm_routines/pageflip.s" +.include "../asm_routines/gr_setpage.s" ;=============================================== ; Variables @@ -199,253 +47,3 @@ load_and_increment: .include "deater_scroll.inc" -;===================================================================== -;= ROUTINES -;===================================================================== - - -clear_screens: - ;=================================== - ; Clear top/bottom of page 0 - ;=================================== - - lda #$0 - sta DRAW_PAGE - jsr clear_top - jsr clear_bottom - - ;=================================== - ; Clear top/bottom of page 1 - ;=================================== - - lda #$4 - sta DRAW_PAGE - jsr clear_top - jsr clear_bottom - - rts - - ;========== - ; page_flip - ;========== - -page_flip: -; lda $c019 ; wait for vertical refresh -; bmi page_flip - - lda DISP_PAGE ; 3 - beq page_flip_show_1 ; 2nt/3 -page_flip_show_0: - bit PAGE0 ; 4 - lda #4 ; 2 - sta DRAW_PAGE ; DRAW_PAGE=1 ; 3 - lda #0 ; 2 - sta DISP_PAGE ; DISP_PAGE=0 ; 3 - rts ; 6 -page_flip_show_1: - bit PAGE1 ; 4 - sta DRAW_PAGE ; DRAW_PAGE=0 ; 3 - lda #1 ; 2 - sta DISP_PAGE ; DISP_PAGE=1 ; 3 - rts ; 6 - ;==================== - ; DISP_PAGE=0 26 - ; DISP_PAGE=1 24 - - - - ;========================================================== - ; set_gr_page0 - ;========================================================== - ; -set_gr_page0: - ;lda #4 - ;sta GR_PAGE - bit PAGE0 ; set page 0 - bit LORES ; Lo-res graphics - bit TEXTGR ; mixed gr/text mode - bit SET_GR ; set graphics - rts - - - - ;================================ - ; hlin_setup - ;================================ - ; put address in GBASL/GBASH - ; Ycoord in A, Xcoord in Y -hlin_setup: - sty TEMPY ; 3 - tay ; y=A ; 2 - lda gr_offsets,Y ; lookup low-res memory address ; 4 - clc ; 2 - adc TEMPY ; 3 - sta GBASL ; 3 - iny ; 2 - - lda gr_offsets,Y ; 4 - adc DRAW_PAGE ; add in draw page offset ; 3 - sta GBASH ; 3 - rts ; 6 - ;=========== - ; 35 - ;================================ - ; hlin_double: - ;================================ - ; HLIN Y, V2 AT A - ; Y, X, A trashed - ; start at Y, draw up to and including X -hlin_double: -;int hlin_double(int page, int x1, int x2, int at) { - - jsr hlin_setup ; 41 - - sec ; 2 - lda V2 ; 3 - sbc TEMPY ; 3 - - tax ; 2 - inx ; 2 - ;=========== - ; 53 - ; fallthrough - - ;================================= - ; hlin_double_continue: width - ;================================= - ; width in X - -hlin_double_continue: - - ldy #0 ; 2 - lda COLOR ; 3 -hlin_double_loop: - sta (GBASL),Y ; 6 - inc GBASL ; 5 - dex ; 2 - bne hlin_double_loop ; 2nt/3 - - rts ; 6 - ;============= - ; 53+5+X*16+5 - - ;================================ - ; hlin_single: - ;================================ - ; HLIN Y, V2 AT A - ; Y, X, A trashed -hlin_single: - - jsr hlin_setup - - sec - lda V2 - sbc TEMPY - - tax - - ; fallthrough - - ;================================= - ; hlin_single_continue: width - ;================================= - ; width in X - -hlin_single_continue: - -hlin_single_top: - lda COLOR - and #$f0 - sta COLOR - -hlin_single_top_loop: - ldy #0 - lda (GBASL),Y - and #$0f - ora COLOR - sta (GBASL),Y - inc GBASL - dex - bne hlin_single_top_loop - - rts - -hlin_single_bottom: - - lda COLOR - and #$0f - sta COLOR - -hlin_single_bottom_loop: - ldy #0 - lda (GBASL),Y - and #$f0 - sta (GBASL),Y - inc GBASL - dex - bne hlin_single_bottom_loop - - rts - - - ;============================= - ; clear_top - ;============================= -clear_top: - lda #$00 - - ;============================= - ; clear_top_a - ;============================= -clear_top_a: - - sta COLOR - - ; VLIN Y, V2 AT A - - lda #40 - sta V2 - - lda #0 - -clear_top_loop: - ldy #0 - pha - - jsr hlin_double - - pla - clc - adc #$2 - cmp #40 - bne clear_top_loop - - rts - -clear_bottom: - lda #$a0 ; NORMAL space - sta COLOR - - lda #40 - sta V2 - -clear_bottom_loop: - ldy #0 - pha - - jsr hlin_double - - pla - clc - adc #$2 - cmp #48 - bne clear_bottom_loop - - rts - - - ; move these to zero page for slight speed increase? -gr_offsets: - .word $400,$480,$500,$580,$600,$680,$700,$780 - .word $428,$4a8,$528,$5a8,$628,$6a8,$728,$7a8 - .word $450,$4d0,$550,$5d0,$650,$6d0,$750,$7d0