diff --git a/res/fx.conf b/res/fx.conf index dc1de9992..7adb76242 100644 --- a/res/fx.conf +++ b/res/fx.conf @@ -1 +1 @@ -RIPPLE STARWHITE SOFT.DIAGONAL STAGGERWHITE.UD RADIAL STAGGER.LR SOFT.UD BIT.FIZZLE MEETINTHEMIDDLE CRYSTAL DIAGONAL R.BY.PIXEL SUNRISE SOFT.L SUNSET CORNER.CIRCLE DIAGONAL2 RIPPLE2 RADIAL2 SPLIT.UD.INTRO HALF.FIZZLE RADIAL3 DIAGONAL3 BAR.DISSOLVE FOURSPIRAL IRIS CASCADE AND CHECKERBOARD LR.BY.PIXEL RADIAL4 STAGGERWHITE.LR SOFT.UD.OUT ONESQUARE FIZZLE STAR DIAMOND TWOPASS.LR HALF.MOSAIC RADIAL5 FOURSQUARE DIAGONAL4 STAGGER.UD INTERLOCK.LR SOFT.UD.IN BLOCK.MOSAIC INTERLOCK.UD BLOCK.FIZZLE SPIRAL [eof] # # transition effects for HGR slideshows # # Each Mega-Attract Module that is an HGR slideshow (see attract.conf) # will use a single transition effect for the length of the module. # Transition effects are loaded in the order listed in this file. Each line # of this file is a filename (not including comments, like this one). The # name of the next transition effect is stored in the global prefs, so this # file should not contain duplicates. # # Transition effects are binary files loaded at $6000 and called with # hi-res page 1 showing and the next HGR graphic already loaded at $4000. # A transition effect has full use of main memory, including zero page and # text page if needed. LC RAM banks 1 and 2 are reserved for the launcher. # # Important: LC RAM bank 1 will be read/write on entry and must be read/write # on exit. If you need ROM routines, you are responsible for switching to ROM # then switching back to RAM bank 1 (read/write) before returning. # \ No newline at end of file +RIPPLE STARWHITE SOFT.DIAGONAL STAGGERWHITE.UD RADIAL STAGGER.LR SOFT.UD BIT.FIZZLE MEETINTHEMIDDLE CRYSTAL DIAGONAL R.BY.PIXEL SUNRISE SOFT.L SUNSET CORNER.CIRCLE DIAGONAL2 RIPPLE2 RADIAL2 SPLIT.UD.INTRO HALF.FIZZLE RADIAL3 DIAGONAL3 BAR.DISSOLVE FOURSPIRAL SOFT.R IRIS CASCADE AND CHECKERBOARD LR.BY.PIXEL RADIAL4 STAGGERWHITE.LR SOFT.UD.OUT ONESQUARE FIZZLE STAR DIAMOND TWOPASS.LR HALF.MOSAIC RADIAL5 FOURSQUARE DIAGONAL4 STAGGER.UD INTERLOCK.LR SOFT.UD.IN BLOCK.MOSAIC INTERLOCK.UD BLOCK.FIZZLE SPIRAL [eof] # # transition effects for HGR slideshows # # Each Mega-Attract Module that is an HGR slideshow (see attract.conf) # will use a single transition effect for the length of the module. # Transition effects are loaded in the order listed in this file. Each line # of this file is a filename (not including comments, like this one). The # name of the next transition effect is stored in the global prefs, so this # file should not contain duplicates. # # Transition effects are binary files loaded at $6000 and called with # hi-res page 1 showing and the next HGR graphic already loaded at $4000. # A transition effect has full use of main memory, including zero page and # text page if needed. LC RAM banks 1 and 2 are reserved for the launcher. # # Important: LC RAM bank 1 will be read/write on entry and must be read/write # on exit. If you need ROM routines, you are responsible for switching to ROM # then switching back to RAM bank 1 (read/write) before returning. # \ No newline at end of file diff --git a/src/fx/fx.hgr.soft.r.a b/src/fx/fx.hgr.soft.r.a new file mode 100644 index 000000000..665fec6c9 --- /dev/null +++ b/src/fx/fx.hgr.soft.r.a @@ -0,0 +1,255 @@ +;license:MIT +;(c) 2019 by 4am +; +!cpu 6502 +!to "build/FX/SOFT.R",plain +*=$6000 + +y = $fc +row = $fd +col = $fe +counter = $ff + + !source "src/fx/macros.a" + +; must LDY or INY or DEY or TYA or something immediately before this +!macro IS_Y_OFFSCREEN { + bpl + + sec + bcs ++ ++ cpy #40 +++ +} + + +INIT_MASKS sourcemasks1, copymasks1 + +INIT_MASKS sourcemasks2, copymasks2 + +INIT_MASKS sourcemasks3, copymasks3 + +INIT_MASKS sourcemasks4, copymasks4 + +INIT_MASKS sourcemasks5, copymasks5 + +INIT_MASKS sourcemasks6, copymasks6 + + lda #(40+7-1) ; columns + blocks per row - 1 + sta counter + + lda #0 + sta col +ColLoop + lda #23 + sta row +RowLoop + ; [speedopt] calculate HGR base addresses once per row + lda row + asl + asl + asl + +HGR_CALC + + ldy col + +IS_Y_OFFSCREEN + bcs @block2 + + ; [speedopt] HGRBlockCopyWithMask but hardcoded for this block's masks + ldx #7 +- lda ($26),y + and sourcemasks1,x + sta $00 + lda ($3c),y + and copymasks1,x + ora $00 + sta ($26),y + clc + +HGR_INC_WITHIN_BLOCK + dex + bpl - + + ; [speedopt] reset HGR base addresses instead of recalculating them from scratch + +RESET_HGR_CALC +@block2 + dey + +IS_Y_OFFSCREEN + bcs @block3 + + ldx #7 +- lda ($26),y + and sourcemasks2,x + sta $00 + lda ($3c),y + and copymasks2,x + ora $00 + sta ($26),y + clc + +HGR_INC_WITHIN_BLOCK + dex + bpl - + + +RESET_HGR_CALC +@block3 + dey + +IS_Y_OFFSCREEN + bcs @block4 + + ldx #7 +- lda ($26),y + and sourcemasks3,x + sta $00 + lda ($3c),y + and copymasks3,x + ora $00 + sta ($26),y + clc + +HGR_INC_WITHIN_BLOCK + dex + bpl - + + +RESET_HGR_CALC +@block4 + dey + +IS_Y_OFFSCREEN + bcs @block5 + + ldx #7 +- lda ($26),y + and sourcemasks4,x + sta $00 + lda ($3c),y + and copymasks4,x + ora $00 + sta ($26),y + clc + +HGR_INC_WITHIN_BLOCK + dex + bpl - + + +RESET_HGR_CALC +@block5 + dey + +IS_Y_OFFSCREEN + bcs @block6 + + ldx #7 +- lda ($26),y + and sourcemasks5,x + sta $00 + lda ($3c),y + and copymasks5,x + ora $00 + sta ($26),y + clc + +HGR_INC_WITHIN_BLOCK + dex + bpl - + + +RESET_HGR_CALC +@block6 + dey + +IS_Y_OFFSCREEN + bcs @block7 + + ldx #7 +- lda ($26),y + and sourcemasks6,x + sta $00 + lda ($3c),y + and copymasks6,x + ora $00 + sta ($26),y + clc + +HGR_INC_WITHIN_BLOCK + dex + bpl - + + +RESET_HGR_CALC +@block7 + dey + +IS_Y_OFFSCREEN + bcs @nextrow + + ; [speedopt] HGRBlockCopy but inlined + ldx #7 +- lda ($3c),y + sta ($26),y + clc + +HGR_INC_WITHIN_BLOCK + dex + bpl - + + ; don't need RESET_HGR_CALC here because we're done with this row +@nextrow + dec row + +LBPL RowLoop + lda $c000 + bmi @exit + inc col + dec counter + +LBNE ColLoop +@exit rts + +sourcemasks1 + !byte 0,0,0,0,0,0,0,0 ; SMC +sourcemasks2 + !byte 0,0,0,0,0,0,0,0 ; SMC +sourcemasks3 + !byte 0,0,0,0,0,0,0,0 ; SMC +sourcemasks4 + !byte 0,0,0,0,0,0,0,0 ; SMC +sourcemasks5 + !byte 0,0,0,0,0,0,0,0 ; SMC +sourcemasks6 + !byte 0,0,0,0,0,0,0,0 ; SMC +copymasks1 + !byte %10000000 + !byte %10000000 + !byte %10000000 + !byte %10001000 + !byte %10001000 + !byte %10000000 + !byte %10000000 + !byte %10000000 +copymasks2 + !byte %10000000 + !byte %10000000 + !byte %10010100 + !byte %10001000 + !byte %10001000 + !byte %10010100 + !byte %10000000 + !byte %10000000 +copymasks3 + !byte %10000000 + !byte %10000000 + !byte %10011100 + !byte %10011100 + !byte %10011100 + !byte %10011100 + !byte %10000000 + !byte %10000000 +copymasks4 + !byte %10000000 + !byte %10101010 + !byte %10011100 + !byte %10111110 + !byte %10011100 + !byte %10011100 + !byte %10101010 + !byte %10000000 +copymasks5 + !byte %10000000 + !byte %10111110 + !byte %10111110 + !byte %10111110 + !byte %10111110 + !byte %10111110 + !byte %10111110 + !byte %10000000 +copymasks6 + !byte %11010101 + !byte %10111110 + !byte %11111111 + !byte %10111110 + !byte %11111111 + !byte %10111110 + !byte %10111110 + !byte %11010101 + + !source "src/wait.a" + !source "src/fx/fx.hgr.common.a"