From 08b0ab894ded3e6eb8d0b03cf788151a7a519968 Mon Sep 17 00:00:00 2001 From: Vince Weaver Date: Tue, 4 Sep 2018 21:43:07 -0400 Subject: [PATCH] firework: work on background --- fireworks/Makefile | 18 +- fireworks/background.png | Bin 0 -> 3180 bytes fireworks/background_final.png | Bin 0 -> 2875 bytes fireworks/fireworks.s | 351 +++++++++++++++++++++++++++++++++ fireworks/gr_copy.s | 58 ++++++ 5 files changed, 426 insertions(+), 1 deletion(-) create mode 100644 fireworks/background.png create mode 100644 fireworks/background_final.png create mode 100644 fireworks/fireworks.s create mode 100644 fireworks/gr_copy.s diff --git a/fireworks/Makefile b/fireworks/Makefile index a5b8dbff..b6cb6d72 100644 --- a/fireworks/Makefile +++ b/fireworks/Makefile @@ -2,13 +2,29 @@ include ../Makefile.inc DOS33 = ../dos33fs-utils/dos33 B2D = ../bmp2dhr/b2d +PNG_TO_40x48D = ../gr-utils/png_to_40x48d all: fireworks.dsk -fireworks.dsk: FIREWORKS.BAS +fireworks.dsk: FIREWORKS.BAS FIREWORKS + $(DOS33) -y fireworks.dsk BSAVE -a 0x1000 FIREWORKS $(DOS33) -y fireworks.dsk SAVE A FIREWORKS.BAS +#### + +FIREWORKS: fireworks.o + ld65 -o FIREWORKS fireworks.o -C ../linker_scripts/apple2_1000.inc + +fireworks.o: fireworks.s gr_copy.s \ + background_final.inc + ca65 -o fireworks.o fireworks.s -l fireworks.lst + + +background_final.inc: background_final.png + $(PNG_TO_40x48D) asm background_final.png bg_final > background_final.inc + + #### FIREWORKS.BAS: fireworks.bas diff --git a/fireworks/background.png b/fireworks/background.png new file mode 100644 index 0000000000000000000000000000000000000000..e4c242875c794b6bffb749de5b2aafef28e2a327 GIT binary patch literal 3180 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 a6VE1XG^vhV-~Rz@5hg}g4GEW=BmN6-&+sPz literal 0 HcmV?d00001 diff --git a/fireworks/fireworks.s b/fireworks/fireworks.s new file mode 100644 index 00000000..760265ac --- /dev/null +++ b/fireworks/fireworks.s @@ -0,0 +1,351 @@ +; Display fancy Fireworks + +; Uses the 40x48d page1/page2 every-1-scanline pageflip mode + +; by deater (Vince Weaver) + +; Zero Page +FRAMEBUFFER = $00 ; $00 - $0F +YPOS = $10 +YPOS_SIN = $11 +CH = $24 +CV = $25 +GBASL = $26 +GBASH = $27 +BASL = $28 +BASH = $29 +FRAME = $60 +BLARGH = $69 +DRAW_PAGE = $EE +LASTKEY = $F1 +PADDLE_STATUS = $F2 +TEMP = $FA +WHICH = $FB + +; Soft Switches +KEYPRESS= $C000 +KEYRESET= $C010 +SET_GR = $C050 ; Enable graphics +FULLGR = $C052 ; Full screen, no text +PAGE0 = $C054 ; Page0 +PAGE1 = $C055 ; Page1 +LORES = $C056 ; Enable LORES graphics +PADDLE_BUTTON0 = $C061 +PADDL0 = $C064 +PTRIG = $C070 + +; ROM routines + +TEXT = $FB36 ;; Set text mode +HOME = $FC58 ;; Clear the text screen +WAIT = $FCA8 ;; delay 1/2(26+27A+5A^2) us + +MAX = 3 + + lda #$ff + sta WHICH + +start_over: + inc WHICH + lda WHICH + cmp #MAX + bne in_range + lda #0 + sta WHICH + +in_range: + + ;=================== + ; init screen + jsr TEXT + jsr HOME + bit KEYRESET + + ;=================== + ; init vars + + lda #0 + sta DRAW_PAGE + + ;============================= + ; Load graphic page0 + + lda #$0c + sta BASH + lda #$00 + sta BASL ; load image to $c00 + + lda WHICH + asl + asl ; which*4 + tay + + lda pictures,Y + sta GBASL + lda pictures+1,Y + sta GBASH + jsr load_rle_gr + + lda #4 + sta DRAW_PAGE + + jsr gr_copy_to_current ; copy to page1 + + ; GR part + bit PAGE1 + bit LORES ; 4 + bit SET_GR ; 4 + bit FULLGR ; 4 + + jsr wait_until_keypressed + + + ;============================= + ; Load graphic page1 + + lda #$0c + sta BASH + lda #$00 + sta BASL ; load image to $c00 + + lda WHICH + asl + asl ; which*4 + tay + + lda pictures+2,Y + sta GBASL + lda pictures+3,Y + sta GBASH + jsr load_rle_gr + + lda #0 + sta DRAW_PAGE + + jsr gr_copy_to_current + + ; GR part + bit PAGE0 + + jsr wait_until_keypressed + + + ;============================== + ; setup graphics for vapor lock + ;============================== + + ; Clear Page0 + lda #$0 + sta DRAW_PAGE + lda #$44 + jsr clear_gr + + ; Make screen half green + lda #$11 + ldy #24 + jsr clear_page_loop + + + ;===================================================== + ; attempt vapor lock + ; by reading the "floating bus" we can see most recently + ; written value of the display + ; we look for $55 (which is the grey line) + ;===================================================== + ; See: + ; Have an Apple Split by Bob Bishop + ; Softalk, October 1982 + + ; Challenges: each scan line scans 40 bytes. + ; The blanking happens at the *beginning* + ; So 65 bytes are scanned, starting at adress of the line - 25 + + ; the scan takes 8 cycles, look for 4 repeats of the value + ; to avoid false positive found if the horiz blanking is mirroring + ; the line (max 3 repeats in that case) + +vapor_lock_loop: ; first make sure we have all zeroes + LDA #$11 +zxloop: + LDX #$04 +wiloop: + CMP $C051 + BNE zxloop + DEX + BNE wiloop + + LDA #$44 ; now look for our border color (4 times) +zloop: + LDX #$04 +qloop: + CMP $C051 + BNE zloop + DEX + BNE qloop + + ; found first line of black after green, at up to line 26 on screen + ; so we want roughly 22 lines * 4 = 88*65 = 5720 + 4550 = 10270 + ; - 65 (for the scanline we missed) = 10205 - 12 = 10193 + + jsr gr_copy_to_current ; 6+ 9292 + ; 10193 - 9298 = 895 + ; Fudge factor (unknown) -30 = 865 + + ; GR part + bit LORES ; 4 + bit SET_GR ; 4 + bit FULLGR ; 4 + + ; Try X=88 Y=2 cycles=893 R2 + + nop + ldy #2 ; 2 +loopA: + ldx #88 ; 2 +loopB: + dex ; 2 + bne loopB ; 2nt/3 + + dey ; 2 + bne loopA ; 2nt/3 + + jmp display_loop +.align $100 + + + ;================================================ + ; Display Loop + ;================================================ + ; each scan line 65 cycles + ; 1 cycle each byte (40cycles) + 25 for horizontal + ; Total of 12480 cycles to draw screen + ; Vertical blank = 4550 cycles (70 scan lines) + ; Total of 17030 cycles to get back to where was + + ; We want to alternate between page1 and page2 every 65 cycles + ; vblank = 4550 cycles to do scrolling + + + ; 2 + 48*( (4+2+25*(2+3)) + (4+2+23*(2+3)+4+5)) + 9) + ; 48*[(6+125)-1] + [(6+115+10)-1] + +display_loop: + + ldy #96 ; 2 + +outer_loop: + + bit PAGE0 ; 4 + ldx #12 ; 65 cycles with PAGE0 ; 2 +page0_loop: ; delay 61+bit + dex ; 2 + bne page0_loop ; 2/3 + + + ; bit(4) -1(fallthrough) + loop*5 -1(fallthrouh)+4 extra = 61 + ; 5L = 55 + + bit PAGE1 ; 4 + ldx #11 ; 65 cycles with PAGE1 ; 2 + ; +page1_loop: ; delay 115+(7 loop)+4 (bit)+4(extra) + dex ; 2 + bne page1_loop ; 2/3 + + dey ; 2 + bne outer_loop ; 2/3 + + + + ;====================================================== + ; We have 4550 cycles in the vblank, use them wisely + ;====================================================== + ; do_nothing should be 4550+1 -2-9 -7= 4533 + + jsr do_nothing ; 6 + + lda KEYPRESS ; 4 + bpl no_keypress ; 3 + jmp start_over +no_keypress: + + jmp display_loop ; 3 + + + + ;================================= + ; do nothing + ;================================= + ; and take 4533-6 = 4527 cycles to do it +do_nothing: + + ; Try X=4 Y=174 cycles=4525 R2 + + nop ; 2 + + ldy #174 ; 2 +loop1: + ldx #4 ; 2 +loop2: + dex ; 2 + bne loop2 ; 2nt/3 + + dey ; 2 + bne loop1 ; 2nt/3 + + + rts ; 6 + + + + ;================================== + ; HLINE + ;================================== + + ; Color in A + ; Y has which line +hline: + pha ; 3 + ldx gr_offsets,y ; 4+ + stx hline_loop+1 ; 4 + lda gr_offsets+1,y ; 4+ + clc ; 2 + adc DRAW_PAGE ; 3 + sta hline_loop+2 ; 4 + pla ; 4 + ldx #39 ; 2 +hline_loop: + sta $5d0,X ; 38 ; 5 + dex ; 2 + bpl hline_loop ; 2nt/3 + rts ; 6 + + ;========================== + ; Clear gr screen + ;========================== + ; Color in A +clear_gr: + ldy #46 +clear_page_loop: + jsr hline + dey + dey + bpl clear_page_loop + rts + +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 + + +.include "../asm_routines/gr_unrle.s" +.include "../asm_routines/keypress.s" +.include "gr_copy.s" + +pictures: + .word bg_final_low,bg_final_high + +.include "background_final.inc" + + diff --git a/fireworks/gr_copy.s b/fireworks/gr_copy.s new file mode 100644 index 00000000..acd83f6f --- /dev/null +++ b/fireworks/gr_copy.s @@ -0,0 +1,58 @@ + ;========================================================= + ; gr_copy_to_current, 40x48 version + ;========================================================= + ; copy 0xc00 to DRAW_PAGE + ; + ; 45 + 2 + 120*(8*9 + 5) -1 + 6 = 9292 + +gr_copy_to_current: + + lda DRAW_PAGE ; 3 + clc ; 2 + adc #$4 ; 2 + sta gr_copy_line+5 ; 4 + sta gr_copy_line+11 ; 4 + adc #$1 ; 2 + sta gr_copy_line+17 ; 4 + sta gr_copy_line+23 ; 4 + adc #$1 ; 2 + sta gr_copy_line+29 ; 4 + sta gr_copy_line+35 ; 4 + adc #$1 ; 2 + sta gr_copy_line+41 ; 4 + sta gr_copy_line+47 ; 4 + ;=========== + ; 45 + + ldy #119 ; for early ones, copy 120 bytes ; 2 + +gr_copy_line: + lda $C00,Y ; load a byte (self modified) ; 4 + sta $400,Y ; store a byte (self modified) ; 5 + + lda $C80,Y ; load a byte (self modified) ; 4 + sta $480,Y ; store a byte (self modified) ; 5 + + lda $D00,Y ; load a byte (self modified) ; 4 + sta $500,Y ; store a byte (self modified) ; 5 + + lda $D80,Y ; load a byte (self modified) ; 4 + sta $580,Y ; store a byte (self modified) ; 5 + + lda $E00,Y ; load a byte (self modified) ; 4 + sta $600,Y ; store a byte (self modified) ; 5 + + lda $E80,Y ; load a byte (self modified) ; 4 + sta $680,Y ; store a byte (self modified) ; 5 + + lda $F00,Y ; load a byte (self modified) ; 4 + sta $700,Y ; store a byte (self modified) ; 5 + + lda $F80,Y ; load a byte (self modified) ; 4 + sta $780,Y ; store a byte (self modified) ; 5 + + dey ; decrement pointer ; 2 + bpl gr_copy_line ; ; 2nt/3 + + rts ; 6 +