From 46da45ccb7c38fc1cf140f5254fb8248c35f33a9 Mon Sep 17 00:00:00 2001 From: Vince Weaver Date: Sat, 23 Dec 2023 23:56:36 -0500 Subject: [PATCH] xmas2023: add snowflakes --- demos/xmas_2023/Makefile | 2 +- demos/xmas_2023/fireplace.s | 4 +- demos/xmas_2023/graphics/Makefile | 9 +- demos/xmas_2023/graphics/snow_sprite.png | Bin 0 -> 5504 bytes demos/xmas_2023/hgr_clear_screen.s | 89 ++++++++++ demos/xmas_2023/hgr_page_flip.s | 18 ++ demos/xmas_2023/hgr_sprite_big.s | 205 +++++++++++++++++++++++ demos/xmas_2023/snowflakes.s | 115 +++++++++++++ demos/xmas_2023/xmas.s | 8 +- 9 files changed, 446 insertions(+), 4 deletions(-) create mode 100644 demos/xmas_2023/graphics/snow_sprite.png create mode 100644 demos/xmas_2023/hgr_clear_screen.s create mode 100644 demos/xmas_2023/hgr_page_flip.s create mode 100644 demos/xmas_2023/hgr_sprite_big.s create mode 100644 demos/xmas_2023/snowflakes.s diff --git a/demos/xmas_2023/Makefile b/demos/xmas_2023/Makefile index c8cd8d84..c584316c 100644 --- a/demos/xmas_2023/Makefile +++ b/demos/xmas_2023/Makefile @@ -126,7 +126,7 @@ XMAS: xmas.o xmas.o: xmas.s plasma_tree.s fireplace.s \ zp.inc hardware.inc qload.inc \ vapor_lock.s gr_scroll.s draw_blocks.s \ - regular_tree.s \ + regular_tree.s snowflakes.s \ graphics/merry.hgr.zx02 \ graphics/tree01.gr.zx02 \ graphics/greets.raw.zx02 diff --git a/demos/xmas_2023/fireplace.s b/demos/xmas_2023/fireplace.s index b25906eb..d1068978 100644 --- a/demos/xmas_2023/fireplace.s +++ b/demos/xmas_2023/fireplace.s @@ -7,6 +7,8 @@ fireplace_restart: sta FRAMEL sta FRAMEH + bit LORES + bit PAGE2 lda #4 @@ -419,7 +421,7 @@ frame_noflo2: no_music2: lda FRAMEH - cmp #2 + cmp #1 beq totally_done_fireplace done_music2: diff --git a/demos/xmas_2023/graphics/Makefile b/demos/xmas_2023/graphics/Makefile index dcd9f6dc..f153ef7e 100644 --- a/demos/xmas_2023/graphics/Makefile +++ b/demos/xmas_2023/graphics/Makefile @@ -3,6 +3,7 @@ include ../../../Makefile.inc ZX02 = ~/research/6502_compression/zx02.git/build/zx02 -f PNG_TO_HGR = ../../../utils/hgr-utils/png2hgr PNG2GR = ../../../utils/gr-utils/png2gr +HGR_SPRITE = ../../../utils/hgr-utils/hgr_make_sprite all: tree01.gr.zx02 tree03.gr.zx02 \ tree05.gr.zx02 tree07.gr.zx02 \ @@ -12,11 +13,17 @@ all: tree01.gr.zx02 tree03.gr.zx02 \ tree06.gr.zx02 tree08.gr.zx02 \ tree10.gr.zx02 tree12.gr.zx02 \ tree14.gr.zx02 tree16.gr.zx02 \ - merry.hgr.zx02 \ + merry.hgr.zx02 snow.inc \ greets.raw.zx02 credits.raw.zx02 #### +snow.inc: snow_sprite.png + $(HGR_SPRITE) -s -l snow_sprite snow_sprite.png 0 0 41 23 > snow.inc + + + +### greets.raw.zx02: greets.raw $(ZX02) greets.raw greets.raw.zx02 diff --git a/demos/xmas_2023/graphics/snow_sprite.png b/demos/xmas_2023/graphics/snow_sprite.png new file mode 100644 index 0000000000000000000000000000000000000000..dea0d3428bad2e6cc13074c3fb5257a433e95f4f GIT binary patch literal 5504 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 literal 0 HcmV?d00001 diff --git a/demos/xmas_2023/hgr_clear_screen.s b/demos/xmas_2023/hgr_clear_screen.s new file mode 100644 index 00000000..aa0805ab --- /dev/null +++ b/demos/xmas_2023/hgr_clear_screen.s @@ -0,0 +1,89 @@ +hgr_clear_screen: + lda DRAW_PAGE + beq hgr_page1_clearscreen + lda #0 + beq hgr_page2_clearscreen + +hgr_page1_clearscreen: + + ldy #0 +hgr_page1_cls_loop: + sta $2000,Y + sta $2100,Y + sta $2200,Y + sta $2300,Y + sta $2400,Y + sta $2500,Y + sta $2600,Y + sta $2700,Y + sta $2800,Y + sta $2900,Y + sta $2A00,Y + sta $2B00,Y + sta $2C00,Y + sta $2D00,Y + sta $2E00,Y + sta $2F00,Y + sta $3000,Y + sta $3100,Y + sta $3200,Y + sta $3300,Y + sta $3400,Y + sta $3500,Y + sta $3600,Y + sta $3700,Y + sta $3800,Y + sta $3900,Y + sta $3A00,Y + sta $3B00,Y + sta $3C00,Y + sta $3D00,Y + sta $3E00,Y + sta $3F00,Y + iny + bne hgr_page1_cls_loop + + rts + + +hgr_page2_clearscreen: + + ldy #0 +hgr_page2_cls_loop: + sta $4000,Y + sta $4100,Y + sta $4200,Y + sta $4300,Y + sta $4400,Y + sta $4500,Y + sta $4600,Y + sta $4700,Y + sta $4800,Y + sta $4900,Y + sta $4A00,Y + sta $4B00,Y + sta $4C00,Y + sta $4D00,Y + sta $4E00,Y + sta $4F00,Y + sta $5000,Y + sta $5100,Y + sta $5200,Y + sta $5300,Y + sta $5400,Y + sta $5500,Y + sta $5600,Y + sta $5700,Y + sta $5800,Y + sta $5900,Y + sta $5A00,Y + sta $5B00,Y + sta $5C00,Y + sta $5D00,Y + sta $5E00,Y + sta $5F00,Y + iny + bne hgr_page2_cls_loop + + rts + diff --git a/demos/xmas_2023/hgr_page_flip.s b/demos/xmas_2023/hgr_page_flip.s new file mode 100644 index 00000000..4a1487da --- /dev/null +++ b/demos/xmas_2023/hgr_page_flip.s @@ -0,0 +1,18 @@ + +hgr_page_flip: + lda DRAW_PAGE + beq flip_to_page1 + +flip_to_page2: + bit PAGE2 + lda #0 + beq done_hgr_page_flip ; bra + +flip_to_page1: + bit PAGE1 + lda #$20 + +done_hgr_page_flip: + sta DRAW_PAGE + + rts diff --git a/demos/xmas_2023/hgr_sprite_big.s b/demos/xmas_2023/hgr_sprite_big.s new file mode 100644 index 00000000..e25645eb --- /dev/null +++ b/demos/xmas_2023/hgr_sprite_big.s @@ -0,0 +1,205 @@ + ;=========================================== + ; hgr draw sprite (only at 7-bit boundaries) + ;=========================================== + ; can handle sprites bigger than a 256 byte page + + ; Note this is optimized for blue/orange sprites + ; it treats black0 as transparent + + ; SPRITE in INL/INH + ; Location at SPRITE_X SPRITE_Y + + ; xsize, ysize in first two bytes + + ; sprite AT INL/INH + + + ; orange = color5 1 101 0101 1 010 1010 + +hgr_draw_sprite_big: + lda SPRITE_X + ror + bcs hgr_draw_sprite_big_odd + +hgr_draw_sprite_big_even: + ldy #0 + lda (INL),Y ; load xsize + clc + adc SPRITE_X + sta big_sprite_width_end_smc+1 ; self modify for end of line + + iny ; load ysize + lda (INL),Y + sta big_sprite_ysize_smc+1 ; self modify + + ; point smc to sprite + lda INL ; 16-bit add + sta big_sprite_smc1+1 + lda INH + sta big_sprite_smc1+2 + + + ldx #0 ; X is pointer offset + stx CURRENT_ROW ; actual row + + ldx #2 + +hgr_big_sprite_yloop: + + lda CURRENT_ROW ; row + + clc + adc SPRITE_Y ; add in cursor_y + + ; calc GBASL/GBASH + + tay ; get output ROW into GBASL/H + lda hposn_low,Y + sta GBASL + lda hposn_high,Y + + clc + adc DRAW_PAGE + sta GBASH + + ldy SPRITE_X + +big_sprite_inner_loop: + + +big_sprite_smc1: + lda $f000,X ; load sprite data + beq big_sprite_transparent + sta (GBASL),Y ; store to screen + +big_sprite_transparent: + inx ; increment sprite offset + + ; if > 1 page + bne big_sprite_no_page_cross + inc big_sprite_smc1+2 + +big_sprite_no_page_cross: + iny ; increment output position + + +big_sprite_width_end_smc: + cpy #6 ; see if reached end of row + bne big_sprite_inner_loop ; if not, loop + + + inc CURRENT_ROW ; row + lda CURRENT_ROW ; row + +big_sprite_ysize_smc: + cmp #31 ; see if at end + bne hgr_big_sprite_yloop ; if not, loop + + rts + + + +hgr_draw_sprite_big_odd: + ldy #0 + lda (INL),Y ; load xsize + clc + adc SPRITE_X + sta osprite_width_end_smc+1 ; self modify for end of line + + iny ; load ysize + lda (INL),Y + sta osprite_ysize_smc+1 ; self modify + + ; point smc to sprite + lda INL ; 16-bit add + sta osprite_smc1+1 + lda INH + sta osprite_smc1+2 + + + ldx #0 ; X is pointer offset + stx CURRENT_ROW ; actual row + + ldx #2 + +ohgr_sprite_yloop: + + lda CURRENT_ROW ; row + + clc + adc SPRITE_Y ; add in cursor_y + + ; calc GBASL/GBASH + + tay ; get output ROW into GBASL/H + lda hposn_low,Y + sta GBASL + lda hposn_high,Y + + clc + adc DRAW_PAGE + sta GBASH + + ldy SPRITE_X + + clc + php ; store 0 carry on stack + +osprite_inner_loop: + + +osprite_smc1: + lda $f000,X ; load sprite data + + bne osprite_not_transparent + + ; we can't just skip if 0 because we might shift a bit in + ; from previous byte + + plp + bcs osprite_oops + clc + php + bcc osprite_transparent_done + +osprite_not_transparent: + plp ; restore carry from last +osprite_oops: + rol ; rotate in carry + asl ; one more time, bit6 in carry + php ; save on stack + sec ; assume blur/orange + ror ; rotate it back down + + sta (GBASL),Y ; store to screen + + +osprite_transparent_done: + inx ; increment sprite offset + + ; if > 1 page + bne osprite_no_page_cross + inc osprite_smc1+2 + +osprite_no_page_cross: + + iny ; increment output position + + + +osprite_width_end_smc: + cpy #6 ; see if reached end of row + bne osprite_inner_loop ; if not, loop + + + plp ; restore stack + + inc CURRENT_ROW ; row + lda CURRENT_ROW ; row + +osprite_ysize_smc: + cmp #31 ; see if at end + bne ohgr_sprite_yloop ; if not, loop + + rts + diff --git a/demos/xmas_2023/snowflakes.s b/demos/xmas_2023/snowflakes.s new file mode 100644 index 00000000..cc647c94 --- /dev/null +++ b/demos/xmas_2023/snowflakes.s @@ -0,0 +1,115 @@ +do_snow: + bit HIRES + bit PAGE1 + + lda #0 + sta FRAMEL + sta FRAMEH + sta DRAW_PAGE + + lda #8 + sta XPOS + lda #100 + sta YPOS + +do_snow_loop: + ;====================== + ; update frame count + + inc FRAMEL ; 5 + lda FRAMEL ; 3 + and #$3f ; 2 + sta FRAMEL ; 3 + bne frame_noflo8 ; 2/3 + inc FRAMEH ; 5 +frame_noflo8: + + lda KEYPRESS + bmi done_do_snow + + ; wait for_pattern / end + + lda SOUND_STATUS + and #SOUND_MOCKINGBOARD + beq no_music8 + +; lda #1 +; cmp current_pattern_smc+1 +; bcc totally_done_fireplace +; beq totally_done_fireplace +; jmp done_music4 + +no_music8: + lda FRAMEH + cmp #6 + beq done_do_snow + +done_music8: + + jsr hgr_clear_screen + +; 0123456789012345678901234567890123456789 +; XXXXXX XXXXXX XXXXXX + + lda #2 + sta SPRITE_X + ldy YPOS + lda sin2,Y + sta SPRITE_Y + lda #snow_sprite + sta INH + jsr hgr_draw_sprite_big + + lda #17 + sta SPRITE_X + ldy YPOS + lda sin1,Y + sta SPRITE_Y + lda #snow_sprite + sta INH + jsr hgr_draw_sprite_big + + lda #32 + sta SPRITE_X + ldy YPOS + lda sin2,Y + sta SPRITE_Y + lda #snow_sprite + sta INH + jsr hgr_draw_sprite_big + + + + jsr hgr_page_flip + +; lda #128 +; jsr wait + + inc YPOS +; lda YPOS +; cmp #150 +; bcc ypos_ok + +; lda #100 +; sta YPOS + +;ypos_ok: + + + jmp do_snow_loop + +done_do_snow: + rts + +.include "hgr_sprite_big.s" +.include "hgr_clear_screen.s" +.include "hgr_page_flip.s" + +.include "graphics/snow.inc" + diff --git a/demos/xmas_2023/xmas.s b/demos/xmas_2023/xmas.s index 818ac021..286920ce 100644 --- a/demos/xmas_2023/xmas.s +++ b/demos/xmas_2023/xmas.s @@ -40,6 +40,12 @@ repeat: jsr plasma_tree + ;====================================== + ; snowflakes + ;====================================== + + jsr do_snow + ;====================================== ; fireplace without vapor lock @@ -58,4 +64,4 @@ finished: .include "plasma_tree.s" .include "fireplace.s" .include "regular_tree.s" - +.include "snowflakes.s"