From 8feda43b1322aa983f9ca36774f8e10149f578ce Mon Sep 17 00:00:00 2001 From: Vince Weaver Date: Mon, 17 Sep 2018 13:51:53 -0400 Subject: [PATCH] megademo: re-use some infrastructure from fireworks demo --- megademo/Makefile | 2 +- megademo/falling_apple.s | 94 ++-------------------------------------- megademo/gr_copy.s | 2 +- megademo/gr_hline.s | 34 +++++++++++++++ megademo/megademo.s | 3 ++ megademo/vapor_lock.s | 58 +++++++++++++++++++++++++ 6 files changed, 100 insertions(+), 93 deletions(-) create mode 100644 megademo/gr_hline.s create mode 100644 megademo/vapor_lock.s diff --git a/megademo/Makefile b/megademo/Makefile index 6db7871b..c14a690b 100644 --- a/megademo/Makefile +++ b/megademo/Makefile @@ -21,7 +21,7 @@ MEGADEMO: megademo.o megademo.o: megademo.s \ zp.inc hardware.inc \ - gr_offsets.s \ + gr_hline.s gr_offsets.s vapor_lock.s \ c64_opener.s c64.img.lz4 \ falling_apple.s apple_40_96.inc ca65 -o megademo.o megademo.s -l megademo.lst diff --git a/megademo/falling_apple.s b/megademo/falling_apple.s index ed9bf9e6..99e3f3b7 100644 --- a/megademo/falling_apple.s +++ b/megademo/falling_apple.s @@ -73,62 +73,11 @@ falling_apple: ; 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 vapor_lock ; 6? jsr gr_copy_to_current ; 6+ 9292 - ; 10193 - 9298 = 895 - ; Fudge factor (unknown) -30 = 865 + ; 10193 - 9298 = 889 + ; Fudge factor (unknown) -24 = 865 ; GR part bit LORES ; 4 @@ -237,43 +186,6 @@ loop2: 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 - - .include "../asm_routines/gr_unrle.s" .include "gr_copy.s" diff --git a/megademo/gr_copy.s b/megademo/gr_copy.s index acd83f6f..f03ed362 100644 --- a/megademo/gr_copy.s +++ b/megademo/gr_copy.s @@ -4,7 +4,7 @@ ; copy 0xc00 to DRAW_PAGE ; ; 45 + 2 + 120*(8*9 + 5) -1 + 6 = 9292 - +.align $100 gr_copy_to_current: lda DRAW_PAGE ; 3 diff --git a/megademo/gr_hline.s b/megademo/gr_hline.s new file mode 100644 index 00000000..a509b419 --- /dev/null +++ b/megademo/gr_hline.s @@ -0,0 +1,34 @@ + ;================================== + ; 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 diff --git a/megademo/megademo.s b/megademo/megademo.s index aa0f0c34..6c3a9a91 100644 --- a/megademo/megademo.s +++ b/megademo/megademo.s @@ -36,3 +36,6 @@ loop_forever: .include "c64_opener.s" .include "falling_apple.s" .include "gr_offsets.s" + .include "gr_hline.s" + .include "vapor_lock.s" + diff --git a/megademo/vapor_lock.s b/megademo/vapor_lock.s new file mode 100644 index 00000000..6d6d1343 --- /dev/null +++ b/megademo/vapor_lock.s @@ -0,0 +1,58 @@ + ;============================== + ; setup graphics for vapor lock + ;============================== +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 + + rts + + +