Hamazing/source/virgillbars/virgillbars.asm
chrisly42 9c48c11cd1 Big "squashed" update to latest version of Framework.
- Bugfix: WaitForFrame was completely broken. Now also caters for race-condition that would have waited one extra frame.
- Bugfix: InitPart would overwrite innocent memory (reported by Gigabates and Losso)
- Bugfix: Palette LERP had wrong bias.
- Removed extra paths in include statement, use default include paths instead
- Added Raspberry Casket no-jitter background calc mode (FW_MUSIC_PLAYER_CHOICE = 6)
- Updated Raspberry Casket to V2.0 presto branch (WIP)
- Removed fw_FrameCounterLong, use fw_FrameCounter-2 for debug purposes
- Support for blue noise palette LERPing (like in Is Real). Provide your own blue noise table (4 KB), stuff it into fw_BlueNoiseTablePtr, set FW_PALETTE_LERP_SUPPORT to 2
- Music tick routine is now replaceable during runtime (fw_MusicTickRoutine)
- Support for softints and audio interrupts
- LMB exit can also be disabled dynamically when using FW_LMB_EXIT_SUPPORT = 2 and fw_DisableLMBExit != 0
- Added LSP Micro support and LSP Nano (custom format that uses note pitches instead of periods)
- Minor other things
2024-09-15 17:43:33 +02:00

3307 lines
90 KiB
NASM

; TODOs:
; - Limit bar pos left and right depending on size
;
; Framework settings
IFD FW_DEMO_PART
IFD FW_HD_DEMO_PART
include "../hamazing/hdtrackmo_settings.i"
ELSE
include "../hamazing/trackmo_settings.i"
ENDC
ELSE
FW_STANDALONE_FILE_MODE = 1 ; enable standalone (part testing)
FW_HD_TRACKMO_MODE = 0 ; DO NOT CHANGE (not supported for standalone mode)
FW_MUSIC_SUPPORT = 1
FW_MUSIC_PLAYER_CHOICE = 2 ; 0 = None, 1 = LSP, 2 = LSP_CIA, 3 = P61A, 4 = Pretracker (CPU DMA wait), 5 = Pretracker Turbo (Copper wait)
FW_LMB_EXIT_SUPPORT = 1 ; allows abortion of intro with LMB
FW_MULTIPART_SUPPORT = 0 ; DO NOT CHANGE (not supported for standalone mode)
FW_DYNAMIC_MEMORY_SUPPORT = 1 ; enable dynamic memory allocation. Otherwise, use fw_ChipMemStack/End etc fields.
FW_MAX_MEMORY_STATES = 4 ; the amount of memory states
FW_TOP_BOTTOM_MEM_SECTIONS = 0 ; allow allocations from both sides of the memory
FW_64KB_PAGE_MEMORY_SUPPORT = 0 ; allow allocation of chip memory that doesn't cross the 64 KB page boundary
FW_MULTITASKING_SUPPORT = 1 ; enable multitasking
FW_ROUNDROBIN_MT_SUPPORT = 0 ; enable fair scheduling among tasks with same priority
FW_BLITTERTASK_MT_SUPPORT = 0 ; enable single parallel task during large blits
FW_MAX_VPOS_FOR_BG_TASK = 308 ; max vpos that is considered to be worth switching to a background task, if any
FW_SINETABLE_SUPPORT = 1 ; enable creation of 1024 entries sin/cos table
FW_SCRIPTING_SUPPORT = 1 ; enable simple timed scripting functions
FW_PALETTE_LERP_SUPPORT = 0 ; enable basic palette fading functions
FW_YIELD_FROM_MAIN_TOO = 0 ; adds additional code that copes with Yield being called from main code instead of task
FW_VBL_IRQ_SUPPORT = 0 ; enable custom VBL IRQ routine
FW_COPPER_IRQ_SUPPORT = 0 ; enable copper IRQ routine support
FW_AUDIO_IRQ_SUPPORT = 0 ; enable audio IRQ support (unimplemented)
FW_VBL_MUSIC_IRQ = 0 ; enable calling of VBL based music ticking (disable, if using CIA timing!)
FW_BLITTERQUEUE_SUPPORT = 1 ; enable blitter queue support
FW_A5_A6_UNTOUCHED = 1 ; speed up blitter queue if registers a5/a6 are never changed in main code
FW_LZ4_SUPPORT = 0 ; compile in LZ4 decruncher
FW_DOYNAX_SUPPORT = 0 ; compile in doynax decruncher
FW_ZX0_SUPPORT = 0 ; compile in ZX0 decruncher
FW_DO_FANCY_WORKBENCH_STUFF = 0 ; enable pre- and post-hook (os startup only)
ENABLE_PART_MUSIC = 1
PART_MUSIC_START_POS = 4
ENDC
VGBARS_WIDTH = 320
VGBARS_HEIGHT = 180
VGBARS_PLANES = 6
CAT_WIDTH = 64
CAT_HEIGHT = 128
AOLD_WIDTH = 96
AOLD_HEIGHT = 112
LIGHTBREAK_WIDTH = 128
LIGHTBREAK_HEIGHT = 128
STAYBROKEN_WIDTH = 128
STAYBROKEN_HEIGHT = 128
MODSHIFT_SIZE = (VGBARS_HEIGHT*(2+2))
BARLINE_WIDTH = 1024
NUM_HISTORY_BUFS = 128
ROT_ANGLES = 124
COP_PREAMBLE_INST = 128 ; bplptrs, sprite pointers
COP_POST_INST = 16 ; wait
COP_INST_PER_LINE = 1+3+1+2 ; wait, bplcon1, bpl1mod, bpl2mod, wait, line 0 color, line 0 color
COP_WOBBLE_INST_PER_LINE = 2+2 ; 2 waits, bpl1mod, bpl2mod
COP_LIST_SIZE = (COP_PREAMBLE_INST+COP_INST_PER_LINE*VGBARS_HEIGHT+COP_POST_INST)*4
INTRO_COP_LIST_SIZE = 100*4
NUM_CHUNKY_PIXELS = 512
NUM_AHEAD_FRAMES = 18
AHEAD_CHIP_BUF_SIZE = 3*NUM_CHUNKY_PIXELS*2+(NUM_CHUNKY_PIXELS*2+920)+VGBARS_HEIGHT*2+NUM_CHUNKY_PIXELS+(BARLINE_WIDTH/8)*VGBARS_PLANES
NUM_BARS = 7
BAR_WIDTH = 32
CHIPMEM_SIZE = 2*COP_LIST_SIZE+2*INTRO_COP_LIST_SIZE+(BARLINE_WIDTH/8)*VGBARS_PLANES*2+NUM_CHUNKY_PIXELS*2*17+2*ROT_ANGLES*MODSHIFT_SIZE
FASTMEM_SIZE = 2*4096+65536+NUM_CHUNKY_PIXELS*2+2*ROT_ANGLES*VGBARS_HEIGHT*2+(NUM_BARS*(2*BAR_WIDTH)*BAR_WIDTH*3*2)
IFND DEBUG_DETAIL
DEBUG_DETAIL SET 10
ENDC
NEWAGE_DEBUG = 1
include "framework.i"
; Process:
;
; 1. CPU: Draw interpolated bars with adds
; In : pd_CurrChunkyPtr
; Out: pd_CurrChunkyPtr
;
; 2. Blitter: Saturate and convert with blitter
; In : pd_CurrChunkyPtr
; Out: pd_CurrChunkyResultPtr
;
; 3. CPU: Take rotation offsets and calc left edge color
; In : pd_CurrChunkyResultPtr
; Out: pd_ChunkyLeftEdgeRGBPtr
;
; 4. Blitter: Copy precalculated bplcon1/mods and edge color to copperlist
; In : pd_ChunkyLeftEdgeRGBPtr
; Out: pd_CurrCopListPtr
; Out: pd_FirstLineOffset
;
; 4b. CPU: Update first line pos
; In : pd_FirstLineOffset
; Out: pd_CurrCopListPtr
;
; 5. CPU: Convert to HAM pixels (and draw to p5/p6)
; In : pd_CurrChunkyResultPtr
; Out: pd_ChunkyHamPtr
; Out: pd_CurrPlanesPtr (p5/p6)
;
; 6. CPU: C2P of HAM pixels
; In : pd_ChunkyHamPtr
; Out: pd_CurrPlanesPtr (p1-p4)
;
; 7. Blitter: Fill chunky data with dither pattern
; In : -
; Out: pd_CurrChunkyPtr
;
; Pipelined:
; 2. T-1: Blitter: Saturate and convert with blitter (idle cycles)
; 7. T-1: Blitter: Fill chunky data with dither pattern (idle cycles)
; --
; 4. T-2: Blitter: Copy precalculated bplcon1/mods and edge color to copperlist
; --
; 1. T+0: CPU: Draw interpolated bars with adds
; 3. T+1: CPU: Take rotation offsets and calc left edge color
; 5. T-3: CPU: Convert to HAM pixels (and draw to p5/p6)
; 6. T-3: CPU: C2P of HAM pixels
;
; Precalculate bar widths 32 to 63
; Between angle 171-214: 2x ham width
; Between angle 215-235: 4x ham width
; Between angle 236-245: 8x ham width
; Between angle 246-250: 16x ham width
STRUCTURE BarData,0
UWORD bd_Phase
UWORD bd_NomWidth
UWORD bd_PhaseSpeed
UWORD bd_Dist
UWORD bd_CurrXPos
UWORD bd_CurrWidth
UWORD bd_BarNum
UWORD bd_ColRed
UWORD bd_ColGreen
UWORD bd_ColBlue
WORD bd_FadePos
ULONG bd_IncRed
ULONG bd_IncGreen
ULONG bd_IncBlue
LABEL bd_SIZEOF
STRUCTURE PartData,fw_SIZEOF
APTR pd_CurrPlanesPtr
APTR pd_CurrChunkyPtr
APTR pd_LastChunkyPtr
APTR pd_CurrChunkyResultPtr
APTR pd_LastChunkyResultPtr
APTR pd_CurrCopListPtr
APTR pd_LastCopListPtr
UBYTE pd_DbToggle
UBYTE pd_CopperToggle
ALIGNWORD
UWORD pd_PartCountDown
UWORD pd_SudokuDitherPos
UWORD pd_CopperSkewOffset
UWORD pd_CopperBplOffset
UWORD pd_OverlayXPos
UWORD pd_OverlayYPos
UWORD pd_OverlayXDir
UWORD pd_OverlayYDir
BOOL pd_OverlayKilled
UWORD pd_Angle
UWORD pd_LastAngle
UWORD pd_AnglePhase
UWORD pd_AngleWidth
BOOL pd_DecAngleWidth
WORD pd_FirstLineOffset
UWORD pd_HistoryNum
UWORD pd_HistorySub
UWORD pd_Wobble1Pos
UWORD pd_Wobble2Pos
BOOL pd_FadeOutWobble
UWORD pd_NextBeatFrame
UWORD pd_BeatZoom
UWORD pd_BeatSize
APTR pd_CopperList1
APTR pd_CopperList2
APTR pd_IntroCopperList1
APTR pd_IntroCopperList2
APTR pd_DbBuffer
APTR pd_HistoryBuffer
APTR pd_ChunkyArray1Ptr
APTR pd_ChunkyArray2Ptr
APTR pd_ChunkySatPtr
APTR pd_ChunkySatRPtr
APTR pd_ChunkySatGPtr
APTR pd_ChunkySatBPtr
APTR pd_ChunkyResultRPtr
APTR pd_ChunkyResultGPtr
APTR pd_ChunkyResultBPtr
APTR pd_ChunkyResultRGB1Ptr
APTR pd_ChunkyResultRGB2Ptr
APTR pd_ChunkyLeftEdgeRGBPtr
APTR pd_ChunkyHamPtr
APTR pd_OneColorChangeTable ; ds.b 4096
APTR pd_RedBlueTable ; ds.b 4096
APTR pd_DiffTable ; ds.b 65536
APTR pd_XPosBufferPtr
APTR pd_PreCalcedBarsPtr
APTR pd_WobbleDataPtr
APTR pd_ModShiftDataPtr
STRUCT pd_BQBuffer,1000
STRUCT pd_OverlaySprites,8*4
STRUCT pd_BarData,NUM_BARS*bd_SIZEOF
STRUCT pd_PreparationTask,ft_SIZEOF
STRUCT pd_CotTable,ROT_ANGLES*2
STRUCT pd_Mod40TableNeg,VGBARS_HEIGHT*2
STRUCT pd_Mod40TablePos,VGBARS_HEIGHT*2
LABEL pd_SIZEOF
IFND FW_DEMO_PART
include "framework.asm"
ENDC
entrypoint:
IFD FW_DEMO_PART
move.l #pd_SIZEOF,d0
CALLFW InitPart
ENDC
IFND FW_DEMO_PART
IFD ENABLE_PART_MUSIC
move.l #part_music_data,fw_MusicData(a6)
move.l #part_music_smp,fw_MusicSamples(a6)
CALLFW StartMusic
ENDC
IFD PART_MUSIC_START_POS
moveq.l #PART_MUSIC_START_POS,d0
CALLFW MusicSetPosition
move.w #1200,fw_MusicFrameCount(a6)
ENDC
ENDC
bsr.s vgb_init
lea vgb_copperlist,a0
CALLFW SetCopper
bsr vgb_intro
bsr vgb_main
bsr vgb_wobble
CALLFW SetBaseCopper
rts
;--------------------------------------------------------------------
vgb_init:
bsr vgb_init_vars
bsr vgb_clear_chunky_buffers
bsr vgb_init_one_color_change_table
bsr vgb_init_red_blue_table
; needs to be done now, because copperlist will not be updated afterwards
bsr vgb_load_aold_sprites
bsr vgb_flip_db_frame
bsr vgb_flip_copper_frame
bsr vgb_create_main_copperlist
bsr vgb_fill_line_with_default
bsr vgb_flip_db_frame
bsr vgb_flip_copper_frame
bsr vgb_create_main_copperlist
bsr vgb_fill_line_with_default
lea .backgroundtasks(pc),a0
lea pd_PreparationTask(a6),a1
CALLFW AddTask
rts
.backgroundtasks
bsr vgb_init_diff_table
bsr vgb_init_cot_table
bsr vgb_precalc_bars
bsr vgb_init_modshift_table
bsr vgb_init_mod40_table
rts
;--------------------------------------------------------------------
vgb_init_vars:
move.l #(INTRO_COP_LIST_SIZE*2),d0
CALLFW AllocChip
PUTMSG 10,<"Intro Copperlist 1 %p">,a0
move.l a0,pd_IntroCopperList1(a6)
lea INTRO_COP_LIST_SIZE(a0),a0
PUTMSG 10,<"Intro Copperlist 2 %p">,a0
move.l a0,pd_IntroCopperList2(a6)
move.l #(COP_LIST_SIZE*2),d0
CALLFW AllocChip
PUTMSG 10,<"Copperlist 1 %p">,a0
move.l a0,pd_CopperList1(a6)
move.l a0,pd_CurrCopListPtr(a6)
lea COP_LIST_SIZE(a0),a0
PUTMSG 10,<"Copperlist 2 %p">,a0
move.l a0,pd_CopperList2(a6)
move.l a0,pd_LastCopListPtr(a6)
move.l #(2*BARLINE_WIDTH/8)*VGBARS_PLANES,d0
CALLFW AllocChip
PUTMSG 10,<"DbBuffer %p">,a0
move.l a0,pd_DbBuffer(a6)
move.l a0,pd_CurrPlanesPtr(a6)
move.l #(NUM_BARS*(2*BAR_WIDTH)*BAR_WIDTH*3*2),d0
CALLFW AllocFast
move.l a0,pd_PreCalcedBarsPtr(a6)
PUTMSG 10,<"pd_PreCalcedBarsPtr %p">,a0
move.l #2*ROT_ANGLES*VGBARS_HEIGHT*2,d0
CALLFW AllocFast
move.l a0,pd_XPosBufferPtr(a6)
PUTMSG 10,<"pd_XPosBufferPtr %p">,a0
move.l #2*ROT_ANGLES*MODSHIFT_SIZE,d0
CALLFW AllocChip
move.l a0,pd_ModShiftDataPtr(a6)
PUTMSG 10,<"pd_ModShiftDataPtr %p">,a0
move.l a0,pd_HistoryBuffer(a6)
lea (VGBARS_WIDTH/8)*VGBARS_PLANES*NUM_HISTORY_BUFS(a0),a0
move.l a0,pd_WobbleDataPtr(a6)
move.l #NUM_CHUNKY_PIXELS*2*17,d0
CALLFW AllocChip
move.l a0,pd_ChunkyArray1Ptr(a6)
move.w #NUM_CHUNKY_PIXELS*2,d2
move.l a0,pd_CurrChunkyPtr(a6)
PUTMSG 10,<"Chunky Array Ptr %p">,a0
adda.w d2,a0
adda.w d2,a0
adda.w d2,a0
move.l a0,pd_ChunkyArray2Ptr(a6)
move.l a0,pd_LastChunkyPtr(a6)
adda.w d2,a0
adda.w d2,a0
adda.w d2,a0
move.l a0,pd_ChunkySatPtr(a6)
move.l a0,pd_ChunkySatRPtr(a6)
PUTMSG 10,<"Chunky Sat Ptr %p">,a0
adda.w d2,a0
move.l a0,pd_ChunkySatGPtr(a6)
adda.w d2,a0
move.l a0,pd_ChunkySatBPtr(a6)
adda.w d2,a0
move.l a0,pd_ChunkyResultRPtr(a6)
PUTMSG 10,<"Chunky R Ptr %p">,a0
adda.w d2,a0
move.l a0,pd_ChunkyResultGPtr(a6)
PUTMSG 10,<"Chunky G Ptr %p">,a0
adda.w d2,a0
move.l a0,pd_ChunkyResultBPtr(a6)
PUTMSG 10,<"Chunky B Ptr %p">,a0
adda.w d2,a0
lea NUM_CHUNKY_PIXELS(a0),a1
move.l a1,pd_ChunkyResultRGB1Ptr(a6)
move.l a1,pd_CurrChunkyResultPtr(a6)
PUTMSG 10,<"Chunky RGB Ptr 1 %p">,a0
adda.w d2,a0
adda.w d2,a0
lea NUM_CHUNKY_PIXELS(a0),a1
move.l a1,pd_ChunkyResultRGB2Ptr(a6)
move.l a1,pd_LastChunkyResultPtr(a6)
PUTMSG 10,<"Chunky RGB Ptr 2 %p">,a0
adda.w d2,a0
adda.w d2,a0
move.l a0,pd_ChunkyLeftEdgeRGBPtr(a6)
PUTMSG 10,<"Chunky Left Edge RGB Ptr %p">,a0
move.l #2*4096+65536,d0
CALLFW AllocFast
move.w #4096,d0
move.l a0,pd_OneColorChangeTable(a6)
adda.w d0,a0
move.l a0,pd_RedBlueTable(a6)
adda.w d0,a0
move.l a0,pd_DiffTable(a6)
move.l #NUM_CHUNKY_PIXELS*2,d0
CALLFW AllocFast
move.l a0,pd_ChunkyHamPtr(a6)
PUTMSG 10,<"Chunky Ham Ptr %p">,a0
lea pd_BarData(a6),a1
lea vgb_bars_colors(pc),a0
lea vgb_bars_dists(pc),a2
moveq.l #0,d0
moveq.l #0,d1
moveq.l #0,d2
moveq.l #39,d3
moveq.l #NUM_BARS-1,d7
.bloop
move.w d0,(a1)+ ; bd_Phase
add.w #333,d0
move.w #BAR_WIDTH*256,(a1)+ ; bd_NomWidth
move.w d3,(a1)+ ; bd_PhaseSpeed
addq.w #7,d3
move.w (a2)+,(a1)+ ; bd_Dist
clr.l (a1)+ ; bd_CurrXPos/bd_CurrWidth
move.w d2,(a1)+ ; bd_BarNum
move.w (a0)+,(a1)+ ; bd_ColRed
move.w (a0)+,(a1)+ ; bd_ColGreen
move.w (a0)+,(a1)+ ; bd_ColBlue
move.w d1,(a1)+ ; bd_FadePos
lea 3*4(a1),a1 ; bd_IncRed/bd_IncGreen/bd_IncBlue
sub.w #5461,d1
addq.w #1,d2
dbra d7,.bloop
rts
;--------------------------------------------------------------------
vgb_init_cot_table:
move.l fw_CosTable(a6),a1
lea pd_CotTable(a6),a0
PUTMSG 10,<"%d: CotTable %p">,fw_FrameCounter-2(a6),a0
moveq.l #(ROT_ANGLES-1)-1,d7
moveq.l #0,d0
moveq.l #0,d5
subq.w #1,d5
.loop move.l #256<<14,d1
divu (a1),d1
move.w d1,(a0)+
addq.l #2*2,a1
dbra d7,.loop
PUTMSG 10,<"%d: CotTable done">,fw_FrameCounter-2(a6)
rts
;--------------------------------------------------------------------
vgb_init_modshift_table:
PUTMSG 10,<"%d: Calc modshift table">,fw_FrameCounter-2(a6)
move.l pd_ModShiftDataPtr(a6),a1
move.l pd_XPosBufferPtr(a6),a0
moveq.l #ROT_ANGLES-1,d7
moveq.l #0,d0
.loop1 PUSHM d0/d7/a0/a1
bsr vgb_calc_skew
POPM
PUSHM d0/d7/a0/a1
bsr vgb_calc_modshift
POPM
lea MODSHIFT_SIZE(a1),a1
lea (VGBARS_HEIGHT*2)(a0),a0
addq.w #2,d0
dbra d7,.loop1
moveq.l #(ROT_ANGLES-1)-1,d7
moveq.l #-2,d0
.loop2 PUSHM d0/d7/a0/a1
bsr vgb_calc_skew
POPM
PUSHM d0/d7/a0/a1
bsr vgb_calc_modshift
POPM
lea MODSHIFT_SIZE(a1),a1
lea (VGBARS_HEIGHT*2)(a0),a0
subq.w #2,d0
dbra d7,.loop2
PUTMSG 10,<"%d: Calc modshift table done">,fw_FrameCounter-2(a6)
rts
;--------------------------------------------------------------------
vgb_init_one_color_change_table:
move.l pd_OneColorChangeTable(a6),a0
PUTMSG 10,<"%d: pd_OneColorChangeTable %p">,fw_FrameCounter-2(a6),a0
moveq.l #1,d0
move.w #$f00,d4
move.w #$0f0,d5
clr.b (a0)+ ; all colors the same
move.w #4095-1,d7
.loop
move.w d0,d1
and.w d4,d1 ; d1 = red (and $f00)
moveq.l #$f,d3
and.w d0,d3 ; d3 = blue
move.w d0,d2
and.w d5,d2 ; d2 = green (and $0f0)
bne.s .gdiff ; at least green diffs
; green does not differ
tst.w d1
bne.s .rdiff ; at least red diffs
move.b #1*2,(a0)+ ; blue only diff
bra.s .good
.rdiff tst.w d3
bne.s .rbdiffnotg ; red and blue diff, not green
move.b #4*2,(a0)+ ; red only diffs
bra.s .good
.gdiff
tst.w d1
bne.s .grdiff ; at least green and red diff
; red does not differ
tst.w d3
bne.s .gbdiffnotr ; green and blue diff, red same
move.b #2*2,(a0)+ ; green only diff
bra.s .good
.rbdiffnotg
move.b #(1+4)*2,(a0)+ ; only red and blue diff
bra.s .good
.gbdiffnotr
move.b #(1+2)*2,(a0)+ ; only green and blue diff
bra.s .good
.grdiff tst.w d3
bne.s .rgbdiff ; all colors diff
; blue does not differ
.rgdiffnotb
move.b #(2+4)*2,(a0)+ ; only green and red diff
bra.s .good
.rgbdiff
move.b #(1+2+4)*2,(a0)+ ; all colors diff
.good
addq.w #1,d0
dbra d7,.loop
PUTMSG 10,<"%d: pd_OneColorChangeTable done">,fw_FrameCounter-2(a6)
rts
;--------------------------------------------------------------------
vgb_init_red_blue_table:
move.l pd_RedBlueTable(a6),a0
PUTMSG 10,<"%d: pd_RedBlueTable %p">,fw_FrameCounter-2(a6),a0
moveq.l #0,d0
move.w #4096-1,d7
.loop
moveq.l #15,d2
and.w d0,d2
move.w d0,d1
lsr.w #4,d1
and.w #$f0,d1
or.w d1,d2
move.b d2,(a0)+
addq.w #1,d0
dbra d7,.loop
PUTMSG 10,<"%d: pd_RedBlueTable done">,fw_FrameCounter-2(a6)
rts
;--------------------------------------------------------------------
vgb_init_diff_table:
move.l pd_DiffTable(a6),a0
PUTMSG 10,<"%d: pd_DiffTable %p">,fw_FrameCounter-2(a6),a0
add.l #$10000,a0
move.w #256-1,d7
.oloop
moveq.l #$f,d0
and.w d7,d0 ; low of upper
move.w d7,d1
lsr.w #4,d1 ; high of upper
move.w #256-1,d6
.loop
moveq.l #$f,d3
and.w d6,d3 ; low of lower
move.w d6,d4
lsr.w #4,d4 ; high of lower
sub.w d0,d3 ; calc lower dist
bpl.s .noflip1
neg.w d3
.noflip1
sub.w d1,d4 ; calc upper dist
bpl.s .noflip2
neg.w d4
.noflip2
cmp.w d4,d3
bgt.s .takelow
neg.w d4
move.b d4,-(a0)
dbra d6,.loop
dbra d7,.oloop
PUTMSG 10,<"%d: pd_DiffTable done">,fw_FrameCounter-2(a6)
rts
.takelow
move.b d3,-(a0)
dbra d6,.loop
dbra d7,.oloop
rts
;--------------------------------------------------------------------
vgb_init_mod40_table:
lea pd_Mod40TablePos(a6),a0
PUTMSG 10,<"%d: pd_Mod40TablePos %p">,fw_FrameCounter-2(a6),a0
move.l a0,a1
move.w #(VGBARS_WIDTH/8)*VGBARS_PLANES,d2
moveq.l #0,d0
moveq.l #0,d1
move.w #VGBARS_HEIGHT-1,d7
.loop
move.w d0,(a0)+
add.w d2,d0
sub.w d2,d1
move.w d1,-(a1)
dbra d7,.loop
PUTMSG 10,<"%d: pd_Mod40TablePos done">,fw_FrameCounter-2(a6)
rts
;--------------------------------------------------------------------
vgb_intro:
move.w #250,pd_PartCountDown(a6)
CALLFW SetBlitterQueueSingleFrame
bsr vgb_load_cat_sprites
CALLFW VSyncWithTask
lea .script(pc),a0
CALLFW InstallMusicScript
move.w fw_MusicFrameCount(a6),d0
moveq.l #4*6,d2
move.w d2,pd_BeatSize(a6)
move.w d0,d1
divu d2,d0
swap d0
sub.w d0,d1
add.w d2,d1
move.w d1,pd_NextBeatFrame(a6)
move.w #0,pd_Angle(a6)
move.w #0,pd_LastAngle(a6)
.loop
; ----------- Frame 1
bsr vgb_flip_db_frame
bsr vgb_flip_intro_copper_frame
bsr vgb_check_beat
CALLFW CheckMusicScript
bsr vgb_update_cat_sprite
move.l pd_ChunkyHamPtr(a6),a0
lea 96(a0),a0
move.l pd_LastChunkyResultPtr(a6),a1
lea 96*2(a1),a1
move.w #4*(BARLINE_WIDTH/8)+96/8+((BARLINE_WIDTH-NUM_CHUNKY_PIXELS)/2)/8,d0
moveq.l #(VGBARS_WIDTH/16)-1,d7
bsr vgb_calc_ham_pixels
move.l pd_ChunkyHamPtr(a6),a0
lea 96(a0),a0
move.l pd_CurrPlanesPtr(a6),a1
lea ((BARLINE_WIDTH-NUM_CHUNKY_PIXELS)/2+96)/8(a1),a1
lea (BARLINE_WIDTH/8)(a1),a2
lea (BARLINE_WIDTH/8)(a2),a3
lea (BARLINE_WIDTH/8)(a3),a4
moveq.l #(VGBARS_WIDTH/16)-1,d7
bsr vgb_c2p_line
bsr vgb_create_intro_copperlist
bsr vgb_update_copper_list_pointers
CALLFW VSyncWithTask
; ----------- Frame 2
bsr vgb_flip_intro_copper_frame
bsr vgb_check_beat
CALLFW CheckMusicScript
bsr vgb_update_cat_sprite
lea pd_BQBuffer(a6),a4
bsr vgb_blitter_saturate_and_merge_320
TERMINATE_BLITTER_QUEUE
BLTWAIT
lea pd_BQBuffer(a6),a0
CALLFW TriggerCustomBlitterQueue
bsr vgb_calc_intro_bar_pos
bsr vgb_calc_realtime_bar_data
bsr vgb_draw_realtime_bars ; draws bars with current angle
bsr vgb_fade_in_bars
CALLFW JoinBlitterQueue ; now the saturate is ready for left edge fixing
bsr vgb_create_intro_copperlist
bsr vgb_update_copper_list_pointers
CALLFW VSyncWithTask
subq.w #1,pd_PartCountDown(a6)
bne .loop
rts
.script
dc.w 1200+36*6,.move_cat_up-*
dc.w 1200+47*6,.changebeatto3syncope-*
dc.w 1200+53*6,.changebeatto2syncope-*
dc.w 1200+55*6,.changebeatto8syncope-*
dc.w 1200+36*6+1+((CAT_HEIGHT)*128)/125,.stop_cat-*
dc.w 1200+60*6,.changebeattonormal-*
dc.w 1584,.move_cat_down-*
dc.w 1584+1+((CAT_HEIGHT/2)*128)/125,.stop_and_kill_cat-*
dc.w 0
.changebeatto3syncope
move.w #3*6,pd_BeatSize(a6)
rts
.changebeatto2syncope
move.w #2*6,pd_BeatSize(a6)
rts
.changebeatto8syncope
move.w #8*6,pd_BeatSize(a6)
rts
.changebeattonormal
move.w #4*6,pd_BeatSize(a6)
rts
.move_cat_up
clr.w pd_OverlayKilled(a6)
move.w #-1,pd_OverlayYDir(a6)
rts
.stop_and_kill_cat
st pd_OverlayKilled(a6)
.stop_cat
clr.w pd_OverlayYDir(a6)
rts
.move_cat_down
move.w #2,pd_OverlayYDir(a6)
rts
;--------------------------------------------------------------------
vgb_main:
CALLFW SetBlitterQueueSingleFrame
bsr vgb_load_aold_sprites
lea .script(pc),a0
CALLFW InstallMusicScript
.loop
; ----------- Frame 1
bsr vgb_flip_db_frame
bsr vgb_flip_copper_frame
bsr vgb_check_beat
CALLFW CheckMusicScript
bsr vgb_update_aold_sprite
move.l pd_ChunkyHamPtr(a6),a0
move.l pd_LastChunkyResultPtr(a6),a1
move.w #4*(BARLINE_WIDTH/8)+((BARLINE_WIDTH-NUM_CHUNKY_PIXELS)/2)/8,d0
moveq.l #(NUM_CHUNKY_PIXELS/16)-1,d7
bsr vgb_calc_ham_pixels
move.l pd_ChunkyHamPtr(a6),a0
move.l pd_CurrPlanesPtr(a6),a1
lea ((BARLINE_WIDTH-NUM_CHUNKY_PIXELS)/2)/8(a1),a1
lea (BARLINE_WIDTH/8)(a1),a2
lea (BARLINE_WIDTH/8)(a2),a3
lea (BARLINE_WIDTH/8)(a3),a4
moveq.l #(NUM_CHUNKY_PIXELS/16)-1,d7
bsr vgb_c2p_line
bsr vgb_calc_new_angle
bsr vgb_fix_left_edge
lea pd_BQBuffer(a6),a4
bsr vgb_blitter_update_skew_and_left_edge
TERMINATE_BLITTER_QUEUE
BLTWAIT
lea pd_BQBuffer(a6),a0
CALLFW TriggerCustomBlitterQueue
CALLFW JoinBlitterQueue
bsr vgb_update_skew_to_copperlist
bsr vgb_update_copper_list_pointers
CALLFW VSyncWithTask
; ----------- Frame 2
bsr vgb_flip_copper_frame
bsr vgb_calc_new_angle
bsr vgb_check_beat
CALLFW CheckMusicScript
bsr vgb_update_aold_sprite
lea pd_BQBuffer(a6),a4
bsr vgb_blitter_saturate_and_merge
TERMINATE_BLITTER_QUEUE
BLTWAIT
lea pd_BQBuffer(a6),a0
CALLFW TriggerCustomBlitterQueue
bsr vgb_calc_bar_pos
bsr vgb_draw_precalced_bars ; draws bars with current angle
CALLFW JoinBlitterQueue ; now the saturate is ready for left edge fixing
bsr vgb_fix_left_edge
lea pd_BQBuffer(a6),a4
bsr vgb_blitter_update_skew_and_left_edge ; prior angle image is done
TERMINATE_BLITTER_QUEUE
BLTWAIT
lea pd_BQBuffer(a6),a0
CALLFW TriggerCustomBlitterQueue
bsr vgb_update_skew_to_copperlist
CALLFW JoinBlitterQueue
bsr vgb_update_copper_list_pointers
;PUTMSG 10,<"Alt frame">
CALLFW VSyncWithTask
cmp.w #2736-8*6,fw_MusicFrameCount(a6)
blt.s .noinvert
PUTMSG 20,<"%d: Flipping!">,fw_MusicFrameCount-2(a6)
st pd_DecAngleWidth(a6)
.noinvert
cmp.w #3120,fw_MusicFrameCount(a6)
blt .loop
rts
.script
dc.w 1968,.move_overlay_left-*
dc.w 1968+32*6,.stop_overlay-*
dc.w 2352,.move_overlay_down-*
dc.w 2352+32*6,.stop_and_kill_overlay-*
dc.w 0
.move_overlay_left
clr.w pd_OverlayKilled(a6)
move.w #-1,pd_OverlayXDir(a6)
rts
.stop_and_kill_overlay
st pd_OverlayKilled(a6)
.stop_overlay
clr.l pd_OverlayXDir(a6)
rts
.move_overlay_down
move.w #1,pd_OverlayYDir(a6)
rts
;--------------------------------------------------------------------
vgb_wobble:
CALLFW SetBlitterQueueSingleFrame
bsr vgb_load_light_break_sprites
move.w #$6000,pd_HistorySub(a6)
move.w #8,pd_BeatZoom(a6)
lea .script(pc),a0
CALLFW InstallMusicScript
; ----------- Frame 1
bsr vgb_flip_history_frame
bsr vgb_flip_copper_frame
CALLFW CheckMusicScript
bsr vgb_update_wobble_sprite
move.l pd_ChunkyHamPtr(a6),a0
lea 96(a0),a0
move.l pd_LastChunkyResultPtr(a6),a1
lea 96*2(a1),a1
move.w #4*(VGBARS_WIDTH/8),d0
moveq.l #(VGBARS_WIDTH/16)-1,d7
bsr vgb_calc_ham_pixels_wobble
move.l pd_ChunkyHamPtr(a6),a0
lea 96(a0),a0
move.l pd_CurrPlanesPtr(a6),a1
lea (VGBARS_WIDTH/8)(a1),a2
lea (VGBARS_WIDTH/8)(a2),a3
lea (VGBARS_WIDTH/8)(a3),a4
moveq.l #(VGBARS_WIDTH/16)-1,d7
bsr vgb_c2p_line
bsr vgb_create_wobble_copperlist
bsr vgb_update_copper_list_pointers
CALLFW VSyncWithTask
; ----------- Frame 2
bsr vgb_flip_copper_frame
CALLFW CheckMusicScript
bsr vgb_update_wobble_sprite
lea pd_BQBuffer(a6),a4
bsr vgb_blitter_saturate_and_merge_320
TERMINATE_BLITTER_QUEUE
BLTWAIT
lea pd_BQBuffer(a6),a0
CALLFW TriggerCustomBlitterQueue
bsr vgb_calc_intro_bar_pos
bsr vgb_calc_realtime_bar_data
bsr vgb_draw_realtime_bars ; draws bars with current angle
;bsr vgb_draw_precalced_bars ; draws bars with current angle
CALLFW JoinBlitterQueue
bsr vgb_create_wobble_copperlist
bsr vgb_update_copper_list_pointers
CALLFW VSyncWithTask
.loop
; ----------- Frame 1
bsr vgb_flip_history_frame
bsr vgb_flip_copper_frame
CALLFW CheckMusicScript
bsr vgb_update_wobble_sprite
moveq.l #0,d5
bsr vgb_calc_wobble
lea pd_BQBuffer(a6),a4
bsr vgb_blitter_update_wobble_modulos
TERMINATE_BLITTER_QUEUE
BLTWAIT
lea pd_BQBuffer(a6),a0
CALLFW TriggerCustomBlitterQueue
move.l pd_ChunkyHamPtr(a6),a0
lea 96(a0),a0
move.l pd_LastChunkyResultPtr(a6),a1
lea 96*2(a1),a1
move.w #4*(VGBARS_WIDTH/8),d0
moveq.l #(VGBARS_WIDTH/16)-1,d7
bsr vgb_calc_ham_pixels_wobble
move.l pd_ChunkyHamPtr(a6),a0
lea 96(a0),a0
move.l pd_CurrPlanesPtr(a6),a1
lea (VGBARS_WIDTH/8)(a1),a2
lea (VGBARS_WIDTH/8)(a2),a3
lea (VGBARS_WIDTH/8)(a3),a4
moveq.l #(VGBARS_WIDTH/16)-1,d7
bsr vgb_c2p_line
CALLFW JoinBlitterQueue
bsr vgb_update_wobble_offset_to_copperlist
bsr vgb_update_copper_list_pointers
CALLFW VSyncWithTask
; ----------- Frame 2
bsr vgb_flip_copper_frame
CALLFW CheckMusicScript
bsr vgb_update_wobble_sprite
lea pd_BQBuffer(a6),a4
bsr vgb_blitter_saturate_and_merge_320
TERMINATE_BLITTER_QUEUE
BLTWAIT
lea pd_BQBuffer(a6),a0
CALLFW TriggerCustomBlitterQueue
bsr vgb_calc_intro_bar_pos
bsr vgb_calc_realtime_bar_data
moveq.l #1,d5
bsr vgb_calc_wobble
bsr vgb_fade_fancy_bars
CALLFW JoinBlitterQueue
lea pd_BQBuffer(a6),a4
bsr vgb_blitter_update_wobble_modulos
TERMINATE_BLITTER_QUEUE
BLTWAIT
lea pd_BQBuffer(a6),a0
CALLFW TriggerCustomBlitterQueue
bsr vgb_draw_realtime_bars ; draws bars with current angle
;bsr vgb_draw_precalced_bars ; draws bars with current angle
CALLFW JoinBlitterQueue
bsr vgb_update_wobble_offset_to_copperlist
bsr vgb_update_copper_list_pointers
CALLFW VSyncWithTask
cmp.w #3504+28*6,fw_MusicFrameCount(a6)
blt.s .nofadeout
st pd_FadeOutWobble(a6)
move.w #4,pd_BeatZoom(a6)
.nofadeout
cmp.w #3888-4*6,fw_MusicFrameCount(a6)
blt.s .loop
rts
.script
dc.w 3120+32*6,.move_overlay_right-*
dc.w 3120+56*6,.stop_overlay-*
dc.w 3504,vgb_load_stay_broken_sprites-*
dc.w 3504,vgb_load_stay_broken_sprites-*
dc.w 3504+32*6,.move_overlay_left-*
dc.w 3504+56*6,.stop_and_kill_overlay-*
dc.w 0
.move_overlay_right
clr.w pd_OverlayKilled(a6)
move.w #1,pd_OverlayXDir(a6)
rts
.stop_and_kill_overlay
st pd_OverlayKilled(a6)
.stop_overlay
clr.l pd_OverlayXDir(a6)
rts
.move_overlay_left
move.w #-1,pd_OverlayXDir(a6)
rts
;--------------------------------------------------------------------
vgb_flip_db_frame:
move.l pd_CurrChunkyPtr(a6),pd_LastChunkyPtr(a6)
move.l pd_CurrChunkyResultPtr(a6),pd_LastChunkyResultPtr(a6)
not.b pd_DbToggle(a6)
beq.s .selb1
move.l pd_DbBuffer(a6),a0
lea (BARLINE_WIDTH/8)*VGBARS_PLANES(a0),a0
move.l a0,pd_CurrPlanesPtr(a6)
move.l pd_ChunkyArray2Ptr(a6),pd_CurrChunkyPtr(a6)
move.l pd_ChunkyResultRGB2Ptr(a6),pd_CurrChunkyResultPtr(a6)
rts
.selb1
move.l pd_DbBuffer(a6),pd_CurrPlanesPtr(a6)
move.l pd_ChunkyArray1Ptr(a6),pd_CurrChunkyPtr(a6)
move.l pd_ChunkyResultRGB1Ptr(a6),pd_CurrChunkyResultPtr(a6)
rts
;--------------------------------------------------------------------
vgb_flip_history_frame:
move.l pd_CurrChunkyPtr(a6),pd_LastChunkyPtr(a6)
move.l pd_CurrChunkyResultPtr(a6),pd_LastChunkyResultPtr(a6)
move.l pd_HistoryBuffer(a6),a0
move.w pd_HistoryNum(a6),d0
addq.w #2,d0
and.w #(NUM_HISTORY_BUFS-1)*2,d0
move.w d0,pd_HistoryNum(a6)
lea pd_Mod40TablePos(a6),a1
adda.w (a1,d0.w),a0
move.l a0,pd_CurrPlanesPtr(a6)
not.b pd_DbToggle(a6)
beq.s .selb1
move.l pd_ChunkyArray2Ptr(a6),pd_CurrChunkyPtr(a6)
move.l pd_ChunkyResultRGB2Ptr(a6),pd_CurrChunkyResultPtr(a6)
rts
.selb1
move.l pd_ChunkyArray1Ptr(a6),pd_CurrChunkyPtr(a6)
move.l pd_ChunkyResultRGB1Ptr(a6),pd_CurrChunkyResultPtr(a6)
rts
;--------------------------------------------------------------------
vgb_flip_copper_frame:
move.l pd_CurrCopListPtr(a6),pd_LastCopListPtr(a6)
not.b pd_CopperToggle(a6)
beq.s .selb1
move.l pd_CopperList2(a6),pd_CurrCopListPtr(a6)
rts
.selb1
move.l pd_CopperList1(a6),pd_CurrCopListPtr(a6)
rts
;--------------------------------------------------------------------
vgb_flip_intro_copper_frame:
move.l pd_CurrCopListPtr(a6),pd_LastCopListPtr(a6)
not.b pd_CopperToggle(a6)
beq.s .selb1
move.l pd_IntroCopperList2(a6),pd_CurrCopListPtr(a6)
rts
.selb1
move.l pd_IntroCopperList1(a6),pd_CurrCopListPtr(a6)
rts
;--------------------------------------------------------------------
vgb_update_copper_list_pointers:
lea vgb_extra_copperlist_ptr+2,a0
move.w pd_CurrCopListPtr(a6),(a0)
move.w pd_CurrCopListPtr+2(a6),4(a0)
move.w #copjmp2,6(a0)
rts
;--------------------------------------------------------------------
vgb_clear_chunky_buffers:
BLTHOGON
BLTWAIT
BLTCON_SET D,0,0,0
move.w #0,bltdmod(a5)
move.l pd_ChunkyArray1Ptr(a6),bltdpt(a5)
move.w #(17)|((NUM_CHUNKY_PIXELS)<<6),bltsize(a5)
rts
;--------------------------------------------------------------------
vgb_fill_line_with_default:
move.l pd_CurrPlanesPtr(a6),a0
moveq.l #((BARLINE_WIDTH&1023)>>4)|((1)<<6),d3
BLTHOGON
BLTWAIT
BLTCON_SET D,255,0,0
move.l a0,bltdpt(a5)
move.w d3,bltsize(a5)
REPT 5
lea (BARLINE_WIDTH)/8(a0),a0
BLTWAIT
BLTCON_SET D,0,0,0
move.l a0,bltdpt(a5)
move.w d3,bltsize(a5)
ENDR
rts
;--------------------------------------------------------------------
vgb_check_beat:
move.w fw_MusicFrameCount(a6),d0
move.w pd_NextBeatFrame(a6),d1
cmp.w d1,d0
blt.s .nobeat
PUTMSG 10,<"Beat at %d/%d, next size %d">,d0,d1,pd_BeatSize-2(a6)
add.w pd_BeatSize(a6),d1
move.w d1,pd_NextBeatFrame(a6)
move.w #16,pd_BeatZoom(a6)
.nop
rts
.nobeat move.w pd_BeatZoom(a6),d0
beq.s .nop
subq.w #1,d0
move.w d0,pd_BeatZoom(a6)
rts
;--------------------------------------------------------------------
vgb_calc_new_angle:
tst.w pd_DecAngleWidth(a6)
beq.s .inc
move.w pd_AngleWidth(a6),d1
beq.s .cont
subq.w #1,d1
move.w d1,pd_AngleWidth(a6)
bra.s .cont
.inc
move.w pd_AngleWidth(a6),d1
cmp.w #100*4,d1
bge.s .noinc
addq.w #1,d1
move.w d1,pd_AngleWidth(a6)
.noinc
.cont
move.w pd_Angle(a6),pd_LastAngle(a6)
move.l fw_SinTable(a6),a2
move.w pd_AnglePhase(a6),d0
addq.w #7,d0
move.w d0,pd_AnglePhase(a6)
and.w #1023*2,d0
move.w (a2,d0.w),d0
muls d1,d0
swap d0
add.w d0,d0
;moveq.l #0,d0
move.w d0,pd_Angle(a6)
;PUTMSG 10,<"Angle %d">,d0
rts
;--------------------------------------------------------------------
vgb_calc_bar_pos:
move.w #256,d6
move.w pd_Angle(a6),d0
beq.s .standardwidth
bpl.s .noneg
neg.w d0
.noneg
; xw = w / cos(a)
; ci = m / xw = m / (w / cos(a)) = (m / w) * cos(a)
lea pd_CotTable(a6),a2
move.w (a2,d0.w),d6
.standardwidth
move.l fw_SinTable(a6),a2
moveq.l #NUM_BARS-1,d7
lea pd_BarData(a6),a1
.bloop movem.w bd_Phase(a1),d0-d4
add.w d2,d0 ; bd_Phase += bd_PhaseSpeed
move.w d0,bd_Phase(a1)
lsr.w #2,d0
and.w #1023*2,d0
move.w (a2,d0.w),d0
muls d3,d0
swap d0
add.w #(NUM_CHUNKY_PIXELS)/2,d0
move.w d0,bd_CurrXPos(a1)
mulu d6,d1
swap d1
move.w d1,bd_CurrWidth(a1)
lea bd_SIZEOF(a1),a1
dbra d7,.bloop
rts
;--------------------------------------------------------------------
vgb_calc_intro_bar_pos:
move.l fw_SinTable(a6),a2
moveq.l #NUM_BARS-1,d7
lea pd_BarData(a6),a1
.bloop movem.w bd_Phase(a1),d0-d4
move.w bd_FadePos(a1),d6
add.w d6,d6
not.w d6
add.w d2,d0 ; bd_Phase += bd_PhaseSpeed
move.w d0,bd_Phase(a1)
lsr.w #2,d0
and.w #1023*2,d0
move.w (a2,d0.w),d0
muls d3,d0
swap d0
add.w #(NUM_CHUNKY_PIXELS)/2,d0
move.w d0,bd_CurrXPos(a1)
mulu d6,d1
swap d1
lsr.w #8,d1
add.w #BAR_WIDTH,d1
move.w d1,bd_CurrWidth(a1)
lea bd_SIZEOF(a1),a1
dbra d7,.bloop
rts
;--------------------------------------------------------------------
vgb_fade_in_bars:
lea pd_BarData(a6),a1
move.w #256,d1
moveq.l #NUM_BARS-1,d7
.bloop move.w bd_FadePos(a1),d0
add.w d1,d0
bvc.s .noover
move.w #$7fff,d0
.noover
move.w d0,bd_FadePos(a1)
lea bd_SIZEOF(a1),a1
dbra d7,.bloop
rts
;--------------------------------------------------------------------
vgb_fade_fancy_bars:
lea pd_BarData(a6),a1
move.l fw_SinTable(a6),a2
moveq.l #NUM_BARS-1,d7
tst.w pd_FadeOutWobble(a6)
bne.s .fadeout
.bloop move.w bd_Phase(a1),d0
add.w bd_ColRed(a1),d0
sub.w bd_ColBlue(a1),d0
and.w #1023*2,d0
move.w (a2,d0.w),d0
asr.w #1,d0
add.w #$5ffe,d0
cmp.w #$7fff,bd_FadePos(a1)
bne.s .overwrite
cmp.w #$7c00,d0
blt.s .wait
.overwrite
move.w d0,bd_FadePos(a1)
.wait
lea bd_SIZEOF(a1),a1
dbra d7,.bloop
rts
.fadeout
.floop move.w bd_FadePos(a1),d0
sub.w #$200,d0
bcc.s .nozero
moveq.l #0,d0
.nozero
move.w d0,bd_FadePos(a1)
lea bd_SIZEOF(a1),a1
dbra d7,.floop
rts
;--------------------------------------------------------------------
vgb_draw_precalced_bars:
lea pd_BarData(a6),a3
moveq.l #NUM_BARS-1,d6
.bloop movem.w bd_CurrXPos(a3),d0-d2
add.w pd_BeatZoom(a6),d1
bsr vgb_add_precalced_bar
lea bd_SIZEOF(a3),a3
dbra d6,.bloop
rts
;--------------------------------------------------------------------
vgb_calc_realtime_bar_data:
lea pd_BarData(a6),a3
moveq.l #NUM_BARS-1,d6
moveq.l #0,d0
subq.w #1,d0
.bloop movem.w bd_ColRed(a3),d2-d5
tst.w d5
ble.s .skip
movem.w bd_CurrWidth(a3),d1
add.w d5,d5
mulu d5,d2
lsr.l #4,d2
mulu d5,d3
lsr.l #4,d3
mulu d5,d4
lsr.l #4,d4
divu d1,d2
divu d1,d3
divu d1,d4
and.l d0,d2
and.l d0,d3
and.l d0,d4
lsl.l #4,d2
lsl.l #4,d3
lsl.l #4,d4
movem.l d2-d4,bd_IncRed(a3)
.skip
lea bd_SIZEOF(a3),a3
dbra d6,.bloop
rts
;--------------------------------------------------------------------
vgb_draw_realtime_bars:
lea pd_BarData(a6),a3
moveq.l #NUM_BARS-1,d6
.bloop tst.w bd_FadePos(a3)
ble .skip
move.w bd_CurrXPos(a3),d0
move.w bd_CurrWidth(a3),d1
movem.l bd_IncRed(a3),d2-d4
move.l pd_CurrChunkyPtr(a6),a1
add.w d0,d0
adda.w d0,a1 ; go to x center
add.w pd_BeatZoom(a6),d1
move.w d1,d7
subq.w #1,d7
add.w d1,d1
lea (a1,d1.w),a2 ; right
suba.w d1,a1 ; left
moveq.l #0,d0
moveq.l #0,d1
moveq.l #0,d5
.loop add.l d2,d0
add.l d3,d1
add.l d4,d5
swap d0
swap d1
swap d5
add.w d0,-(a2)
add.w d5,2*NUM_CHUNKY_PIXELS*2(a1)
add.w d5,2*NUM_CHUNKY_PIXELS*2(a2)
add.w d1,1*NUM_CHUNKY_PIXELS*2(a1)
add.w d1,1*NUM_CHUNKY_PIXELS*2(a2)
add.w d0,(a1)+
swap d0
swap d1
swap d5
dbra d7,.loop
.skip
lea bd_SIZEOF(a3),a3
dbra d6,.bloop
rts
;--------------------------------------------------------------------
vgb_calc_wobble:
move.l pd_WobbleDataPtr(a6),a3
lea vgb_wobble_table(pc),a1
lea pd_Mod40TablePos(a6),a4
moveq.l #0,d4
move.w pd_Wobble2Pos(a6),d4
addq.w #7,d4
move.w d4,pd_Wobble2Pos(a6)
and.w #$3fe,d4
lea (a1,d4.w),a2
moveq.l #0,d4
move.w pd_Wobble1Pos(a6),d4
addq.w #2,d4
move.w d4,pd_Wobble1Pos(a6)
and.w #$3fe,d4
adda.w d4,a1
move.w #(NUM_HISTORY_BUFS-1)*2,d1
moveq.l #0,d3
move.w #VGBARS_HEIGHT-1,d7
move.w pd_HistoryNum(a6),d4
add.w d5,d4
moveq.l #(VGBARS_WIDTH/8),d6
move.w pd_HistorySub(a6),d5
.yloop
move.w (a1)+,d0
lsr.w #1,d0
add.w -(a2),d0
sub.w d5,d0
bpl.s .notrunc
moveq.l #0,d0
.notrunc
move.w d0,-(sp)
move.w d4,d0
sub.b (sp)+,d0
and.w d1,d0
exg d3,d0
sub.w d3,d0
neg.w d0
move.w (a4,d0.w),d0
move.w d0,d2
sub.w d6,d2
move.w d2,(a3)+
dbra d7,.yloop
sub.w #$100,d5
bcs.s .skipmax
move.w d5,pd_HistorySub(a6)
.skipmax
rts
;--------------------------------------------------------------------
vgb_calc_skew:
moveq.l #(VGBARS_HEIGHT/2),d3
move.w d3,d1 ; error term
add.w d3,d3 ; xDec
move.w d3,d7
subq.w #1,d7 ; loop count
lea vgb_xpos_table(pc),a3
tst.w d0
bpl.s .rotright
neg.w d0
move.w (a3,d0.w),d2
add.w d2,d2 ; xInc
move.w d2,d0
.lineloopleft
move.w d0,(a0)+
sub.w d2,d1
dble d7,.lineloopleft
.extraleft
subq.w #2,d0
add.w d3,d1
ble.s .extraleft
subq.w #1,d7
bpl.s .lineloopleft
rts
.rotright
move.w (a3,d0.w),d2
add.w d2,d2 ; xInc
move.w d2,d0
neg.w d0
.lineloopright
move.w d0,(a0)+
sub.w d2,d1
dble d7,.lineloopright
.extraright
addq.w #2,d0
add.w d3,d1
ble.s .extraright
subq.w #1,d7
bpl.s .lineloopright
rts
;--------------------------------------------------------------------
; o0 = 0 -> adr0 = 0, mod = -42 + 2 loopmod = -42
; o1 = 2 -> adr0 = 2, mod = -42
; o2 = 2 -> adr
;
vgb_calc_modshift:
move.w #((BARLINE_WIDTH-VGBARS_WIDTH)-1)*2,d3
move.w #VGBARS_HEIGHT-1,d7
moveq.l #0,d2
.yloop
move.w #(BARLINE_WIDTH-VGBARS_WIDTH),d0
add.w (a0)+,d0
bpl.s .noclipleft
moveq.l #0,d0
.noclipleft
cmp.w d3,d0
ble.s .noclipright
move.w d3,d0
.noclipright
asr.w #1,d0
moveq.l #15,d1
moveq.l #16,d4
sub.w d0,d4
and.w d1,d4 ; lower 4 bit
move.w d4,d5
lsl.w #4,d5
or.w d5,d4
move.w d4,(a1)+
add.w d0,d1
asr.w #4,d1
add.w d1,d1
;subq.w #2,d1
moveq.l #-(VGBARS_WIDTH+16)/8,d6
add.w d1,d6
sub.w d2,d6
move.w d1,d2
move.w d6,(a1)+
dbra d7,.yloop
rts
;--------------------------------------------------------------------
vgb_add_precalced_bar:
move.w d1,d7
lsr.w #1,d7
subq.w #1,d7
move.l pd_PreCalcedBarsPtr(a6),a0
lsl.w #5,d2 ; log2(BAR_WIDTH)
sub.w #BAR_WIDTH,d1
cmp.w #BAR_WIDTH,d1
bge.s .ext2
add.w d2,d1
mulu #(2*BAR_WIDTH)*3*2,d1
adda.l d1,a0
move.l pd_CurrChunkyPtr(a6),a1
add.w d0,d0
adda.w d0,a1 ; go to x center
move.l a1,a2
.nloop1
movem.l (a0)+,d0-d5
add.l d2,2*NUM_CHUNKY_PIXELS*2(a1)
add.l d1,1*NUM_CHUNKY_PIXELS*2(a1)
add.l d0,(a1)+
swap d0
swap d1
swap d2
add.l d0,-(a2)
add.l d1,1*NUM_CHUNKY_PIXELS*2(a2)
add.l d2,2*NUM_CHUNKY_PIXELS*2(a2)
dbra d7,.nloop2
rts
.nloop2
add.l d5,2*NUM_CHUNKY_PIXELS*2(a1)
add.l d4,1*NUM_CHUNKY_PIXELS*2(a1)
add.l d3,(a1)+
swap d3
swap d4
swap d5
add.l d3,-(a2)
add.l d4,1*NUM_CHUNKY_PIXELS*2(a2)
add.l d5,2*NUM_CHUNKY_PIXELS*2(a2)
dbra d7,.nloop1
rts
.ext2
sub.w #BAR_WIDTH,d1
lsr.w #1,d1
lsr.w #1,d7
add.w d2,d1
mulu #(2*BAR_WIDTH)*3*2,d1
adda.l d1,a0
move.l pd_CurrChunkyPtr(a6),a1
add.w d0,d0
adda.w d0,a1 ; go to x center
move.l a1,a2
.ex2loop1
movem.l (a0)+,d0-d5
add.l d2,2*NUM_CHUNKY_PIXELS*2(a1)
add.l d1,1*NUM_CHUNKY_PIXELS*2(a1)
add.l d0,(a1)+
add.l d2,2*NUM_CHUNKY_PIXELS*2(a1)
add.l d1,1*NUM_CHUNKY_PIXELS*2(a1)
add.l d0,(a1)+
swap d0
swap d1
swap d2
add.l d0,-(a2)
add.l d1,1*NUM_CHUNKY_PIXELS*2(a2)
add.l d2,2*NUM_CHUNKY_PIXELS*2(a2)
add.l d0,-(a2)
add.l d1,1*NUM_CHUNKY_PIXELS*2(a2)
add.l d2,2*NUM_CHUNKY_PIXELS*2(a2)
dbra d7,.ex2loop3
rts
.ex2loop3
add.l d5,2*NUM_CHUNKY_PIXELS*2(a1)
add.l d4,1*NUM_CHUNKY_PIXELS*2(a1)
add.l d3,(a1)+
add.l d5,2*NUM_CHUNKY_PIXELS*2(a1)
add.l d4,1*NUM_CHUNKY_PIXELS*2(a1)
add.l d3,(a1)+
swap d3
swap d4
swap d5
add.l d3,-(a2)
add.l d4,1*NUM_CHUNKY_PIXELS*2(a2)
add.l d5,2*NUM_CHUNKY_PIXELS*2(a2)
add.l d3,-(a2)
add.l d4,1*NUM_CHUNKY_PIXELS*2(a2)
add.l d5,2*NUM_CHUNKY_PIXELS*2(a2)
dbra d7,.ex2loop1
rts
;--------------------------------------------------------------------
vgb_precalc_bars:
lea vgb_bars_colors(pc),a4
move.l pd_PreCalcedBarsPtr(a6),a2
moveq.l #NUM_BARS-1,d7
.barloop
swap d7
moveq.l #BAR_WIDTH-1,d6
.wloop
move.w #BAR_WIDTH*2-1,d7
sub.w d6,d7
moveq.l #0,d2
subq.w #1,d2
movem.w (a4),d3-d5
PUTMSG 40,<"RGB %lx %lx %lx">,d3,d4,d5
swap d3
swap d4
swap d5
lsr.l #4,d3
divu d7,d3
and.l d2,d3
lsl.l #4,d3
lsr.l #4,d4
divu d7,d4
and.l d2,d4
lsl.l #4,d4
lsr.l #4,d5
divu d7,d5
and.l d2,d5
lsl.l #4,d5
PUTMSG 40,<"%d: %lx %lx %lx">,d7,d3,d4,d5
addq.w #1,d7
and.w #-2,d7
move.w d7,d0
add.w d0,d0
add.w d7,d0
add.w d0,d0
lea (a2,d0.w),a1
moveq.l #0,d0
moveq.l #0,d1
moveq.l #0,d2
lsr.w #1,d7
subq.w #1,d7
.xloop
add.l d3,d0
add.l d4,d1
add.l d5,d2
swap d0
swap d1
swap d2
movem.l d0-d2,-(a1)
swap d0
swap d1
swap d2
add.l d3,d0
add.l d4,d1
add.l d5,d2
swap d0
swap d1
swap d2
move.w d0,(a1)
move.w d1,4(a1)
move.w d2,8(a1)
swap d0
swap d1
swap d2
dbra d7,.xloop
lea (2*BAR_WIDTH)*3*2(a2),a2
dbra d6,.wloop
swap d7
addq.l #6,a4
dbra d7,.barloop
rts
;--------------------------------------------------------------------
vgb_c2p_line:
move.l #$55555555,d3
move.l #$33333333,d4
move.l #$00ff00ff,d5
.loop
move.l (a0)+,d0
lsl.l #4,d0
or.l (a0)+,d0
move.l (a0)+,d1
lsl.l #4,d1
or.l (a0)+,d1
; a3a2a1a0e3e2e1e0 b3b2b1b0f3f2f1f0 c3c2c1c0g3g2g1g0 d3d2d1d0h3h2h1h0
; i3i2i1i0m3m2m1m0 j3j2j1j0n3n2n1n0 k3k2k1k0o3o2o1o0 l3l2l1l0p3p2p1p0
move.l d1,d2
lsr.l #8,d2
eor.l d0,d2
and.l d5,d2
eor.l d2,d0
lsl.l #8,d2
eor.l d2,d1
; a3a2a1a0e3e2e1e0 i3i2i1i0m3m2m1m0 c3c2c1c0g3g2g1g0 k3k2k1k0o3o2o1o0
; b3b2b1b0f3f2f1f0 j3j2j1j0n3n2n1n0 d3d2d1d0h3h2h1h0 l3l2l1l0p3p2p1p0
move.l d1,d2
lsr.l #1,d2
eor.l d0,d2
and.l d3,d2
eor.l d2,d0
add.l d2,d2
eor.l d2,d1
; a3b3a1b1e3f3e1f1 i3j3i1j1m3n3m1n1 c3d3c1d1g3h3g1h1 k3l3k1l1o3p3o1p1
; a2b2a0b0e2f2f0f0 i2j2i0j0m2n2m0n0 c2d2c0d0g2h2g0h0 k2l2k0l0o2p2o0p0
move.w d1,d2
move.w d0,d1
swap d1
move.w d1,d0
move.w d2,d1
; a3b3a1b1e3f3e1f1 i3j3i1j1m3n3m1n1 a2b2a0b0e2f2f0f0 i2j2i0j0m2n2m0n0
; c3d3c1d1g3h3g1h1 k3l3k1l1o3p3o1p1 c2d2c0d0g2h2g0h0 k2l2k0l0o2p2o0p0
move.l d1,d2
lsr.l #2,d2
eor.l d0,d2
and.l d4,d2
eor.l d2,d0
lsl.l #2,d2
eor.l d2,d1
; a3b3c3d3e3f3g3h3 i3j3k3l3m3n3o3p3 a2b2c2d2e2f2g2h2 i2j2k2l2m2n2o2p2
; a1b1c1d1e1f1g1h1 i1j1k1l1m1n1o1p1 a0b0c0d0e0f0g0h0 i0j0k0l0m0n0o0p0
move.w d1,(a1)+
swap d1
move.w d1,(a2)+
move.w d0,(a3)+
swap d0
move.w d0,(a4)+
dbra d7,.loop
rts
;--------------------------------------------------------------------
vgb_fix_left_edge:
move.l pd_XPosBufferPtr(a6),a2
move.w pd_LastAngle(a6),d0
bpl.s .noflip
neg.w d0
add.w #((ROT_ANGLES-1)*2),d0
.noflip mulu #(VGBARS_HEIGHT*2)/2,d0
adda.l d0,a2
move.l pd_LastChunkyResultPtr(a6),a1
;lea ((BARLINE_WIDTH-NUM_CHUNKY_PIXELS)/2)*2-64*2(a1),a1
;FIXME offset or something else is wrong here
lea 96*2(a1),a1
move.l pd_ChunkyLeftEdgeRGBPtr(a6),a0
moveq.l #(VGBARS_HEIGHT/12)-1,d7
.loop
REPT 2
movem.w (a2)+,d0-d5
move.w (a1,d0.w),(a0)+
move.w (a1,d1.w),(a0)+
move.w (a1,d2.w),(a0)+
move.w (a1,d3.w),(a0)+
move.w (a1,d4.w),(a0)+
move.w (a1,d5.w),(a0)+
ENDR
dbra d7,.loop
rts
;--------------------------------------------------------------------
vgb_calc_ham_pixels:
move.l pd_OneColorChangeTable(a6),a2
move.l pd_DiffTable(a6),a3
move.l pd_CurrPlanesPtr(a6),a4
adda.w d0,a4
moveq.l #$000,d0 ; last color
moveq.l #0,d3
.xloop
moveq.l #16-1,d6
.loop add.w d4,d4
add.w d5,d5
move.w (a1)+,d1 ; new color
eor.w d1,d0
beq.s .setblue
moveq.l #0,d2
move.b (a2,d0.w),d2
jmp .jmptab(pc,d2.w)
.setblue
move.w d1,d0 ; 4
and.w #15,d1 ; 4
move.b d1,(a0)+ ; 8
addq.w #1,d4 ; 4
; 20
dbra d6,.loop
bra .done
.setgreen
move.w d1,d0 ; 4
lsr.b #4,d1 ; 14
move.b d1,(a0)+ ; 8
addq.w #1,d4 ; 4
addq.w #1,d5 ; 4
; 34
dbra d6,.loop
bra .done
.setred
move.w d1,d0 ; 4
move.b -2(a1),(a0)+ ; 24
addq.w #1,d5 ; 4
; 32
dbra d6,.loop
bra .done
.jmptab
bra.s .setblue ; 0
bra.s .setblue ; 1
bra.s .setgreen ; 2
bra.s .pickgb ; 3
bra.s .setred ; 4
bra.s .pickrb ; 5
bra.s .pickrg ; 6
.slowpick ; 7
eor.w d1,d0
PUTMSG 50,<"Slow pick to %x from %x!">,d1,d0
move.b d0,-(sp)
move.w (sp)+,d2 ; gbxx
move.b d1,d2 ; gbGB
tst.b (a3,d2.l) ; if delta green < delta blue -> positive
bpl.s .pickrb2
bra.s .pickrg2
.pickgb
eor.w d1,d0
move.b d0,-(sp)
move.w (sp)+,d2 ; gbxx
move.b d1,d2 ; gbGB
tst.b (a3,d2.l) ; if delta green < delta blue -> positive
bpl.s .prefblue
.prefgreen
and.w #$0f0,d1
and.w #$f0f,d0
or.w d1,d0
lsr.b #4,d1
move.b d1,(a0)+
addq.w #1,d4
addq.w #1,d5
dbra d6,.loop
bra .done
.pickrg
eor.w d1,d0
.pickrg2
move.w d0,d2
lsl.w #4,d2 ; rg00
move.w d1,d3
lsr.w #4,d3 ; 00RG
move.b d3,d2 ; rgRG
tst.b (a3,d2.l) ; if delta red < delta green -> positive
bpl.s .prefgreen
bra.s .prefred
.pickrb eor.w d1,d0
.pickrb2
move.l pd_RedBlueTable(a6),a3
move.b (a3,d0.w),-(sp)
move.w (sp)+,d2 ; rbxx
move.b (a3,d1.w),d2 ; rbRB
move.l pd_DiffTable(a6),a3
tst.b (a3,d2.l) ; if delta red < delta blue -> positive
bpl.s .prefblue
.prefred
IF 1
move.w d1,-(sp) ; 8
move.b d0,1(sp) ; 12
move.w (sp),d0 ; 8
move.b (sp)+,(a0)+ ; 20
; 48
ELSE
and.w #$f00,d1 ; 8
and.w #$0ff,d0 ; 8
or.w d1,d0 ; 4
move.w d1,-(sp) ; 8
move.b (sp)+,(a0)+ ; 20
; 48
ENDC
addq.w #1,d5
dbra d6,.loop
bra .done
.prefblue
and.w #$00f,d1 ; 8
and.w #$ff0,d0 ; 8
or.w d1,d0 ; 4
move.b d1,(a0)+ ; 8
; 28
addq.w #1,d4
dbra d6,.loop
.done
move.w d5,1*(BARLINE_WIDTH/8)(a4)
move.w d4,(a4)+
dbra d7,.xloop
rts
;--------------------------------------------------------------------
vgb_calc_ham_pixels_wobble:
move.l pd_OneColorChangeTable(a6),a2
move.l pd_DiffTable(a6),a3
move.l pd_CurrPlanesPtr(a6),a4
adda.w d0,a4
moveq.l #$000,d0 ; last color
moveq.l #0,d3
.xloop
moveq.l #16-1,d6
.loop add.w d4,d4
add.w d5,d5
move.w (a1)+,d1 ; new color
eor.w d1,d0
beq.s .setblue
moveq.l #0,d2
move.b (a2,d0.w),d2
jmp .jmptab(pc,d2.w)
.setblue
move.w d1,d0 ; 4
and.w #15,d1 ; 4
move.b d1,(a0)+ ; 8
addq.w #1,d4 ; 4
; 20
dbra d6,.loop
bra .done
.setgreen
move.w d1,d0 ; 4
lsr.b #4,d1 ; 14
move.b d1,(a0)+ ; 8
addq.w #1,d4 ; 4
addq.w #1,d5 ; 4
; 34
dbra d6,.loop
bra .done
.setred
move.w d1,d0 ; 4
move.b -2(a1),(a0)+ ; 24
addq.w #1,d5 ; 4
; 32
dbra d6,.loop
bra .done
.jmptab
bra.s .setblue ; 0
bra.s .setblue ; 1
bra.s .setgreen ; 2
bra.s .pickgb ; 3
bra.s .setred ; 4
bra.s .pickrb ; 5
bra.s .pickrg ; 6
.slowpick ; 7
eor.w d1,d0
PUTMSG 50,<"Slow pick to %x from %x!">,d1,d0
move.b d0,-(sp)
move.w (sp)+,d2 ; gbxx
move.b d1,d2 ; gbGB
tst.b (a3,d2.l) ; if delta green < delta blue -> positive
bpl.s .pickrb2
bra.s .pickrg2
.pickgb
eor.w d1,d0
move.b d0,-(sp)
move.w (sp)+,d2 ; gbxx
move.b d1,d2 ; gbGB
tst.b (a3,d2.l) ; if delta green < delta blue -> positive
bpl.s .prefblue
.prefgreen
and.w #$0f0,d1
and.w #$f0f,d0
or.w d1,d0
lsr.b #4,d1
move.b d1,(a0)+
addq.w #1,d4
addq.w #1,d5
dbra d6,.loop
bra .done
.pickrg
eor.w d1,d0
.pickrg2
move.w d0,d2
lsl.w #4,d2 ; rg00
move.w d1,d3
lsr.w #4,d3 ; 00RG
move.b d3,d2 ; rgRG
tst.b (a3,d2.l) ; if delta red < delta green -> positive
bpl.s .prefgreen
bra.s .prefred
.pickrb eor.w d1,d0
.pickrb2
move.l pd_RedBlueTable(a6),a3
move.b (a3,d0.w),-(sp)
move.w (sp)+,d2 ; rbxx
move.b (a3,d1.w),d2 ; rbRB
move.l pd_DiffTable(a6),a3
tst.b (a3,d2.l) ; if delta red < delta blue -> positive
bpl.s .prefblue
.prefred
move.w d1,-(sp) ; 8
move.b d0,1(sp) ; 12
move.w (sp),d0 ; 8
move.b (sp)+,(a0)+ ; 20
; 48
addq.w #1,d5
dbra d6,.loop
bra .done
.prefblue
and.w #$00f,d1 ; 8
and.w #$ff0,d0 ; 8
or.w d1,d0 ; 4
move.b d1,(a0)+ ; 8
; 28
addq.w #1,d4
dbra d6,.loop
.done
move.w d5,1*(VGBARS_WIDTH/8)(a4)
move.w d4,(a4)+
dbra d7,.xloop
rts
;--------------------------------------------------------------------
vgb_create_intro_copperlist:
move.l pd_CurrCopListPtr(a6),a0
lea pd_OverlaySprites(a6),a1
move.w #sprpt,d1
moveq.l #8*2-1,d7
.sprloop
move.w d1,(a0)+
move.w (a1)+,(a0)+
addq.w #2,d1
dbra d7,.sprloop
COPIMOVE DMAF_SETCLR|DMAF_SPRITE,dmacon ; enable sprite dma
COPIMOVE $6a00,bplcon0
COPIMOVE 0,bplcon1
COPIMOVE $0038,ddfstrt
COPIMOVE (-VGBARS_WIDTH)/8,bpl1mod
COPIMOVE (-VGBARS_WIDTH)/8,bpl2mod
move.l pd_CurrPlanesPtr(a6),a1
lea ((BARLINE_WIDTH-VGBARS_WIDTH)/2)/8(a1),a1
moveq.l #VGBARS_PLANES-1,d7
move.w #bplpt,d1
.bplloop
move.l a1,d0
swap d0
move.w d1,(a0)+
move.w d0,(a0)+
addq.w #2,d1
move.w d1,(a0)+
move.w a1,(a0)+
addq.w #2,d1
lea (BARLINE_WIDTH)/8(a1),a1
dbra d7,.bplloop
moveq.l #-2,d3
move.l d3,(a0)+
rts
;--------------------------------------------------------------------
vgb_create_wobble_copperlist:
move.l pd_CurrCopListPtr(a6),a0
move.l a0,a2
lea pd_OverlaySprites(a6),a1
move.w #sprpt,d1
moveq.l #8*2-1,d7
.sprloop
move.w d1,(a0)+
move.w (a1)+,(a0)+
addq.w #2,d1
dbra d7,.sprloop
COPIMOVE DMAF_SETCLR|DMAF_SPRITE,dmacon ; enable sprite dma
COPIMOVE $6a00,bplcon0
COPIMOVE 0,bplcon1
COPIMOVE $0038,ddfstrt
move.l a0,d1
sub.l a2,d1
addq.w #2,d1
move.w d1,pd_CopperBplOffset(a6)
move.l pd_CurrPlanesPtr(a6),a1
moveq.l #VGBARS_PLANES-1,d7
move.w #bplpt,d1
.bplloop
move.l a1,d0
swap d0
move.w d1,(a0)+
move.w d0,(a0)+
addq.w #2,d1
move.w d1,(a0)+
move.w a1,(a0)+
addq.w #2,d1
lea (VGBARS_WIDTH/8)(a1),a1
dbra d7,.bplloop
move.l a0,d1
sub.l a2,d1
add.w #8+2,d1
move.w d1,pd_CopperSkewOffset(a6)
moveq.l #-2,d3
move.w #$5137,d0
move.w #$100,d2
move.w #VGBARS_HEIGHT-1,d7
move.w #-VGBARS_WIDTH/8,d4
.yloop move.w d0,d1
move.b #$df,d1
move.w d1,(a0)+
move.w d3,(a0)+
add.w d2,d0
move.w d0,(a0)+
move.w d3,(a0)+
COPRMOVE d4,bpl1mod
COPRMOVE d4,bpl2mod
dbra d7,.yloop
move.l d3,(a0)+
rts
;--------------------------------------------------------------------
vgb_create_main_copperlist:
move.l pd_CurrCopListPtr(a6),a0
move.l a0,a2
move.l pd_CurrPlanesPtr(a6),a1
moveq.l #VGBARS_PLANES-1,d7
move.w #bplpt,d1
.bplloop
move.l a1,d0
swap d0
move.w d1,(a0)+
move.w d0,(a0)+
addq.w #2,d1
move.w d1,(a0)+
move.w a1,(a0)+
addq.w #2,d1
lea (BARLINE_WIDTH)/8(a1),a1
dbra d7,.bplloop
COPIMOVE $6a00,bplcon0
lea pd_OverlaySprites(a6),a1
move.w #sprpt,d1
moveq.l #8*2-1,d7
.sprloop
move.w d1,(a0)+
move.w (a1)+,(a0)+
addq.w #2,d1
dbra d7,.sprloop
COPIMOVE DMAF_SETCLR|DMAF_SPRITE,dmacon ; enable sprite dma
move.l a0,d1
sub.l a2,d1
addq.w #4+2,d1
move.w d1,pd_CopperSkewOffset(a6)
moveq.l #-2,d3
move.w #$51d5,d0
move.w #$100,d2
move.w #VGBARS_HEIGHT-1,d7
.cprloop
move.w d0,(a0)+
move.w d3,(a0)+
COPIMOVE (-VGBARS_WIDTH-16)/8,bpl1mod
COPIMOVE (-VGBARS_WIDTH-16)/8,bpl2mod
COPIMOVE 0,bplcon1
add.w d2,d0
move.w d0,d1
move.b #$3b,d1
move.w d1,(a0)+
move.w d3,(a0)+
COPIMOVE $000,color
COPIMOVE $000,color
dbra d7,.cprloop
move.l d3,(a0)+
rts
;--------------------------------------------------------------------
vgb_load_cat_sprites:
lea vgb_cat_sprite_palette(pc),a1
lea color+17*2(a5),a0
moveq.l #15-1,d7
.catpalloop
move.w (a1)+,(a0)+
dbra d7,.catpalloop
lea pd_OverlaySprites(a6),a1
lea vgb_cat_sprite,a3
move.l a3,a2
moveq.l #(CAT_WIDTH/16)*2-1,d7
.sprloop2
move.l a3,a0
adda.w (a2)+,a0
move.l d0,(a0)
move.l a0,(a1)+
dbra d7,.sprloop2
move.w #VGBARS_WIDTH-CAT_WIDTH-2,pd_OverlayXPos(a6)
move.w #VGBARS_HEIGHT,pd_OverlayYPos(a6)
clr.l pd_OverlayXDir(a6)
st pd_OverlayKilled(a6)
rts
;--------------------------------------------------------------------
vgb_update_cat_sprite:
lea pd_OverlaySprites(a6),a2
moveq.l #0,d0
moveq.l #0,d1
tst.w pd_OverlayKilled(a6)
bne.s .filldata
move.w pd_OverlayXPos(a6),d4
move.w pd_OverlayYPos(a6),d1
add.w pd_OverlayYDir(a6),d1
move.w d1,pd_OverlayYPos(a6)
add.w #128,d4
add.w #$52,d1
move.w d1,d2
add.w #CAT_HEIGHT,d2
moveq.l #0,d0
lsl.w #8,d1 ; sv7-sv0 in d1
addx.w d0,d0 ; sv8
lsl.w #8,d2 ; ev7-ev0 in d2
addx.w d0,d0 ; ev8
lsr.w #1,d4 ; sh8-sh1 in d4
addx.w d0,d0 ; sh0
or.w d2,d0 ; ev7-ev0, sv8, ev8, sh0 in d0
move.b d4,d1 ; sv7-sv0, sh8-sh1 in d4
tas d0 ; att TAS sets bit 7
.filldata
REPT (CAT_WIDTH/16)
move.l (a2)+,a0
move.w d1,(a0)+
move.w d0,(a0)+
move.l (a2)+,a0
move.w d1,(a0)+
move.w d0,(a0)+
addq.w #8,d1
ENDR
rts
;--------------------------------------------------------------------
vgb_load_aold_sprites:
move.w #$ddd,color+17*2(a5)
move.w #$fff,color+21*2(a5)
move.w #$eee,color+25*2(a5)
;move.w #$888,d0
;move.w d0,color+18*2(a5)
;move.w d0,color+22*2(a5)
;move.w d0,color+26*2(a5)
;move.w d0,color+30*2(a5)
moveq.l #0,d0
move.w d0,color+19*2(a5)
move.w d0,color+23*2(a5)
move.w d0,color+27*2(a5)
lea pd_OverlaySprites(a6),a1
lea vgb_add_of_light_div_sprite,a3
move.l a3,a2
moveq.l #(AOLD_WIDTH/16)-1,d7
.sprloop2
move.l a3,a0
adda.w (a2)+,a0
move.l d0,(a0)
move.l a0,(a1)+
dbra d7,.sprloop2
move.l fw_EmptySprite(a6),(a1)+
move.l fw_EmptySprite(a6),(a1)+
move.w #VGBARS_WIDTH,pd_OverlayXPos(a6)
move.w #VGBARS_HEIGHT-AOLD_HEIGHT-1,pd_OverlayYPos(a6)
clr.l pd_OverlayXDir(a6)
st pd_OverlayKilled(a6)
rts
;--------------------------------------------------------------------
vgb_update_aold_sprite:
lea pd_OverlaySprites(a6),a2
moveq.l #0,d0
moveq.l #0,d1
tst.w pd_OverlayKilled(a6)
bne.s .filldata
move.w pd_OverlayXPos(a6),d4
add.w pd_OverlayXDir(a6),d4
move.w d4,pd_OverlayXPos(a6)
move.w pd_OverlayYPos(a6),d1
add.w pd_OverlayYDir(a6),d1
move.w d1,pd_OverlayYPos(a6)
add.w #128,d4
add.w #$52,d1
move.w d1,d2
add.w #AOLD_HEIGHT,d2
moveq.l #0,d0
lsl.w #8,d1 ; sv7-sv0 in d1
addx.w d0,d0 ; sv8
lsl.w #8,d2 ; ev7-ev0 in d2
addx.w d0,d0 ; ev8
lsr.w #1,d4 ; sh8-sh1 in d4
addx.w d0,d0 ; sh0
or.w d2,d0 ; ev7-ev0, sv8, ev8, sh0 in d0
move.b d4,d1 ; sv7-sv0, sh8-sh1 in d4
;tas d0 ; att TAS sets bit 7
.filldata
REPT (AOLD_WIDTH/16)
move.l (a2)+,a0
move.w d1,(a0)+
move.w d0,(a0)+
addq.w #8,d1
ENDR
rts
;--------------------------------------------------------------------
vgb_load_light_break_sprites:
move.w #$999,color+17*2(a5)
move.w #$bbb,color+21*2(a5)
move.w #$ddd,color+25*2(a5)
move.w #$fff,color+29*2(a5)
move.w #$888,d0
move.w d0,color+18*2(a5)
move.w d0,color+22*2(a5)
move.w d0,color+26*2(a5)
move.w d0,color+30*2(a5)
moveq.l #0,d0
move.w d0,color+19*2(a5)
move.w d0,color+23*2(a5)
move.w d0,color+27*2(a5)
move.w d0,color+31*2(a5)
lea pd_OverlaySprites(a6),a1
lea vgb_light_break_sprite,a3
move.l a3,a2
moveq.l #(LIGHTBREAK_WIDTH/16)-1,d7
.sprloop2
move.l a3,a0
adda.w (a2)+,a0
move.l d0,(a0)
move.l a0,(a1)+
dbra d7,.sprloop2
move.w #-LIGHTBREAK_WIDTH,pd_OverlayXPos(a6)
move.w #1,pd_OverlayYPos(a6)
clr.l pd_OverlayXDir(a6)
st pd_OverlayKilled(a6)
rts
;--------------------------------------------------------------------
vgb_load_stay_broken_sprites:
move.w #$fff,color+17*2(a5)
move.w #$ddd,color+21*2(a5)
move.w #$bbb,color+25*2(a5)
move.w #$999,color+29*2(a5)
lea pd_OverlaySprites(a6),a1
lea vgb_stay_broken_sprite,a3
move.l a3,a2
moveq.l #(STAYBROKEN_WIDTH/16)-1,d7
.sprloop2
move.l a3,a0
adda.w (a2)+,a0
move.l d0,(a0)
move.l a0,(a1)+
dbra d7,.sprloop2
move.l pd_CurrCopListPtr(a6),a0
lea pd_OverlaySprites(a6),a1
move.w #sprpt,d1
moveq.l #8*2-1,d7
.sprloop
move.w d1,(a0)+
move.w (a1)+,(a0)+
addq.w #2,d1
dbra d7,.sprloop
rts
;--------------------------------------------------------------------
vgb_update_wobble_sprite:
lea pd_OverlaySprites(a6),a2
moveq.l #0,d0
moveq.l #0,d1
tst.w pd_OverlayKilled(a6)
bne.s .filldata
move.w pd_OverlayXPos(a6),d4
add.w pd_OverlayXDir(a6),d4
move.w d4,pd_OverlayXPos(a6)
move.w pd_OverlayYPos(a6),d1
add.w pd_OverlayYDir(a6),d1
move.w d1,pd_OverlayYPos(a6)
add.w #128,d4
add.w #$52,d1
move.w d1,d2
add.w #LIGHTBREAK_HEIGHT,d2
moveq.l #0,d0
lsl.w #8,d1 ; sv7-sv0 in d1
addx.w d0,d0 ; sv8
lsl.w #8,d2 ; ev7-ev0 in d2
addx.w d0,d0 ; ev8
lsr.w #1,d4 ; sh8-sh1 in d4
addx.w d0,d0 ; sh0
or.w d2,d0 ; ev7-ev0, sv8, ev8, sh0 in d0
move.b d4,d1 ; sv7-sv0, sh8-sh1 in d4
;tas d0 ; att TAS sets bit 7
.filldata
REPT (LIGHTBREAK_WIDTH/16)
move.l (a2)+,a0
move.w d1,(a0)+
move.w d0,(a0)+
addq.w #8,d1
ENDR
rts
;--------------------------------------------------------------------
vgb_update_wobble_offset_to_copperlist:
move.l pd_CurrCopListPtr(a6),a0
adda.w pd_CopperBplOffset(a6),a0
move.l pd_WobbleDataPtr(a6),a3
move.l pd_HistoryBuffer(a6),a1
adda.w (a3)+,a1
move.l a1,d0
moveq.l #(VGBARS_WIDTH/8),d1
moveq.l #VGBARS_PLANES-1,d7
.bplloop
add.l d1,d0
swap d0
move.w d0,(a0)
swap d0
move.w d0,4(a0)
addq.l #8,a0
dbra d7,.bplloop
rts
;--------------------------------------------------------------------
vgb_update_skew_to_copperlist:
move.l pd_CurrCopListPtr(a6),a0
addq.w #2,a0
move.l pd_CurrPlanesPtr(a6),a1
lea ((BARLINE_WIDTH-VGBARS_WIDTH)/2)/8-4(a1),a1
adda.w pd_FirstLineOffset(a6),a1
moveq.l #VGBARS_PLANES-1,d7
move.w #bplpt,d1
.bplloop
move.l a1,d0
swap d0
move.w d0,(a0)
move.w a1,4(a0)
addq.w #8,a0
lea (BARLINE_WIDTH)/8(a1),a1
dbra d7,.bplloop
rts
;--------------------------------------------------------------------
vgb_blitter_update_wobble_modulos:
move.l pd_WobbleDataPtr(a6),a2
addq.w #2,a2
move.l pd_CurrCopListPtr(a6),a0
adda.w pd_CopperSkewOffset(a6),a0
SAFE_ADD_TO_BLITTER_QUEUE a4,a3
addq.l #4,a4
move.l #.bq_copy,(a4)+
move.l a2,(a4)+
move.l a0,(a4)+
addq.l #4,a0
LAST_ADD_TO_BLITTER_QUEUE a4,a3
clr.l (a4)+
move.l #.bq_copy_more,(a4)+
move.l a2,(a4)+
move.l a0,(a4)+
rts
.bq_copy
BLTHOGOFF
BLTCON_SET AD,BLT_A,0,0
moveq.l #-1,d0
move.l d0,bltafwm(a5)
move.l #(0<<16)|(COP_WOBBLE_INST_PER_LINE*4-2),bltamod(a5) ; and bltdmod
.bq_copy_more
lea bltapt(a5),a1
move.l (a0)+,(a1)+ ; bltapt
move.l (a0)+,(a1)+ ; bltdpt
move.w #(1|((VGBARS_HEIGHT-1)<<6)),(a1)+ ; bltsize
rts
;--------------------------------------------------------------------
vgb_blitter_update_skew_and_left_edge:
move.l pd_ModShiftDataPtr(a6),a2
move.w pd_LastAngle(a6),d0
bpl.s .noflip
neg.w d0
add.w #((ROT_ANGLES-1)*2),d0
.noflip mulu #MODSHIFT_SIZE/2,d0
adda.l d0,a2
move.w 2(a2),pd_FirstLineOffset(a6)
move.l pd_CurrCopListPtr(a6),a0
adda.w pd_CopperSkewOffset(a6),a0
addq.w #8,a0
SAFE_ADD_TO_BLITTER_QUEUE a4,a3
addq.l #4,a4
move.l #.bq_copy,(a4)+
move.l a2,(a4)+
move.l a0,(a4)+
move.w #(1|(VGBARS_HEIGHT<<6)),(a4)+
addq.w #6,a2
subq.w #4,a0
move.w #(1|((VGBARS_HEIGHT-1)<<6)),d3
FAST_ADD_TO_BLITTER_QUEUE a4,a3
addq.l #4,a4
move.l #.bq_copy_more,(a4)+
move.l a2,(a4)+
move.l a0,(a4)+
move.w d3,(a4)+
subq.w #4,a0
FAST_ADD_TO_BLITTER_QUEUE a4,a3
addq.l #4,a4
move.l #.bq_copy_more,(a4)+
move.l a2,(a4)+
move.l a0,(a4)+
move.w d3,(a4)+
lea 16(a0),a0
LAST_ADD_TO_BLITTER_QUEUE a4,a3
clr.l (a4)+
move.l #.bq_copy_edge,(a4)+
move.l pd_ChunkyLeftEdgeRGBPtr(a6),(a4)+
move.l a0,(a4)+
move.w #(1|(VGBARS_HEIGHT<<6)),(a4)+
rts
.bq_copy
BLTHOGOFF
BLTCON_SET AD,BLT_A,0,0
moveq.l #-1,d0
move.l d0,bltafwm(a5)
move.l #(2<<16)|(COP_INST_PER_LINE*4-2),bltamod(a5) ; and bltdmod
.bq_copy_more
lea bltapt(a5),a1
move.l (a0)+,(a1)+ ; bltapt
move.l (a0)+,(a1)+ ; bltdpt
move.w (a0)+,(a1)+ ; bltsize
rts
.bq_copy_edge
move.w #0,bltamod(a5)
lea bltapt(a5),a1
move.l (a0)+,(a1)+ ; bltapt
move.l (a0)+,(a1)+ ; bltdpt
move.w (a0)+,(a1)+ ; bltsize
rts
;--------------------------------------------------------------------
vgb_blitter_saturate_and_merge:
move.l pd_LastChunkyPtr(a6),a2
move.l pd_ChunkySatPtr(a6),a1
lea ((NUM_CHUNKY_PIXELS*3))*2-2(a2),a2
lea ((NUM_CHUNKY_PIXELS*3))*2(a1),a1
move.w #(1|(NUM_CHUNKY_PIXELS<<6)),d3
FIRST_ADD_TO_BLITTER_QUEUE a4,a3
addq.l #4,a4
move.l #.bq_saturate_all,(a4)+
move.l a2,(a4)+ ; bltapt
move.l a1,(a4)+ ; bltdpt
move.w d3,(a4)+ ; bltsize
REPT 2
lea -NUM_CHUNKY_PIXELS*2(a2),a2
lea -NUM_CHUNKY_PIXELS*2(a1),a1
FAST_ADD_TO_BLITTER_QUEUE a4,a3
addq.l #4,a4
move.l #.bq_saturate_more,(a4)+
move.l a2,(a4)+ ; bltapt
move.l a1,(a4)+ ; bltdpt
move.w d3,(a4)+ ; bltsize
ENDR
move.l pd_LastChunkyPtr(a6),a0
move.l pd_ChunkyResultRPtr(a6),a1
move.l pd_ChunkySatRPtr(a6),a2
addq.l #2,a0
addq.l #2,a2
;move.w #(1)|((NUM_CHUNKY_PIXELS)<<6),d3
FAST_ADD_TO_BLITTER_QUEUE a4,a3
addq.l #4,a4
move.l #.bq_extract_rgb,(a4)+
move.l #((BLTEN_ABD+(((BLT_A|BLT_B)&BLT_C)&$ff))<<16)|(12<<28)|(12<<12),(a4)+
move.w #$0f00,(a4)+ ; bltcdat
move.l a2,(a4)+ ; bltbpt
move.l a0,(a4)+ ; bltapt
move.l a1,(a4)+ ; bltdpt
move.w d3,(a4)+ ; bltsize
lea NUM_CHUNKY_PIXELS*2-2(a0),a0
move.l pd_ChunkyResultGPtr(a6),a1
move.l pd_ChunkySatGPtr(a6),a2
FAST_ADD_TO_BLITTER_QUEUE a4,a3
addq.l #4,a4
move.l #.bq_extract_rgb,(a4)+
move.l #((BLTEN_ABD+(((BLT_A|BLT_B)&BLT_C)&$ff))<<16)|(0<<28)|(0<<12),(a4)+
move.w #$00f0,(a4)+ ; bltcdat
move.l a2,(a4)+ ; bltbpt
move.l a0,(a4)+ ; bltapt
move.l a1,(a4)+ ; bltdpt
move.w d3,(a4)+ ; bltsize
lea NUM_CHUNKY_PIXELS*2(a0),a0
move.l pd_ChunkyResultBPtr(a6),a1
move.l pd_ChunkySatBPtr(a6),a2
FAST_ADD_TO_BLITTER_QUEUE a4,a3
addq.l #4,a4
move.l #.bq_extract_rgb,(a4)+
move.l #((BLTEN_ABD+(((BLT_A|BLT_B)&BLT_C)&$ff))<<16)|(4<<28)|(4<<12),(a4)+
move.w #$000f,(a4)+ ; bltcdat
move.l a2,(a4)+ ; bltbpt
move.l a0,(a4)+ ; bltapt
move.l a1,(a4)+ ; bltdpt
move.w d3,(a4)+ ; bltsize
;move.w #(1)|((NUM_CHUNKY_PIXELS)<<6),d3
FAST_ADD_TO_BLITTER_QUEUE a4,a3
addq.l #4,a4
move.l #.bq_merge_rgb,(a4)+
move.l pd_ChunkyResultRPtr(a6),(a4)+
move.l pd_ChunkyResultGPtr(a6),(a4)+
move.l pd_ChunkyResultBPtr(a6),(a4)+
move.l pd_CurrChunkyResultPtr(a6),(a4)+
move.w d3,(a4)+
lea vgb_sudoku_dither(pc),a1
move.w pd_SudokuDitherPos(a6),d0
sub.w #9*2,d0
bpl.s .noresetdither
moveq.l #2*9*2,d0
.noresetdither
move.w d0,pd_SudokuDitherPos(a6)
adda.w d0,a1
move.w #(1)|((NUM_CHUNKY_PIXELS/3)<<6),d3
move.w #(1)|(((NUM_CHUNKY_PIXELS+1)/3)<<6),d2
; pixel 1, red
move.l pd_LastChunkyPtr(a6),a0
FAST_ADD_TO_BLITTER_QUEUE a4,a3
addq.l #4,a4
move.l #.bq_dither,(a4)+
move.w (a1)+,(a4)+
move.l a0,(a4)+
move.w d3,(a4)+
; pixel 2, red
addq.w #2,a0
FAST_ADD_TO_BLITTER_QUEUE a4,a3
addq.l #4,a4
move.l #.bq_dither_more,(a4)+
move.w (a1)+,(a4)+
move.l a0,(a4)+
move.w d2,(a4)+
; pixel 3, red
addq.w #2,a0
FAST_ADD_TO_BLITTER_QUEUE a4,a3
addq.l #4,a4
move.l #.bq_dither_more,(a4)+
move.w (a1)+,(a4)+
move.l a0,(a4)+
move.w d2,(a4)+
; pixel 1, green
lea (NUM_CHUNKY_PIXELS-2)*2(a0),a0
FAST_ADD_TO_BLITTER_QUEUE a4,a3
addq.l #4,a4
move.l #.bq_dither_more,(a4)+
move.w (a1)+,(a4)+
move.l a0,(a4)+
move.w d3,(a4)+
; pixel 2, green
addq.w #2,a0
FAST_ADD_TO_BLITTER_QUEUE a4,a3
addq.l #4,a4
move.l #.bq_dither_more,(a4)+
move.w (a1)+,(a4)+
move.l a0,(a4)+
move.w d2,(a4)+
; pixel 3, green
addq.w #2,a0
FAST_ADD_TO_BLITTER_QUEUE a4,a3
addq.l #4,a4
move.l #.bq_dither_more,(a4)+
move.w (a1)+,(a4)+
move.l a0,(a4)+
move.w d2,(a4)+
; pixel 1, blue
lea (NUM_CHUNKY_PIXELS-2)*2(a0),a0
FAST_ADD_TO_BLITTER_QUEUE a4,a3
addq.l #4,a4
move.l #.bq_dither_more,(a4)+
move.w (a1)+,(a4)+
move.l a0,(a4)+
move.w d3,(a4)+
; pixel 2, blue
addq.w #2,a0
FAST_ADD_TO_BLITTER_QUEUE a4,a3
addq.l #4,a4
move.l #.bq_dither_more,(a4)+
move.w (a1)+,(a4)+
move.l a0,(a4)+
move.w d2,(a4)+
; pixel 3, blue
addq.w #2,a0
LAST_ADD_TO_BLITTER_QUEUE a4,a3
clr.l (a4)+
move.l #.bq_dither_more,(a4)+
move.w (a1)+,(a4)+
move.l a0,(a4)+
move.w d2,(a4)+
rts
.bq_saturate_all
BLTHOGOFF
BLTCON_SET_X AD,(BLT_A&BLT_C),8,0,BLTCON1F_DESC|BLTCON1F_IFE
moveq.l #-1,d0
move.l d0,bltafwm(a5)
moveq.l #0,d0
move.l d0,bltcmod(a5) ; and bltbmod
move.l d0,bltamod(a5) ; and bltdmod
move.w #$0007,bltcdat(a5)
.bq_saturate_more
lea bltapt(a5),a1
move.l (a0)+,(a1)+ ; bltapt
move.l (a0)+,(a1)+ ; bltdpt
move.w (a0)+,(a1)+ ; bltsize
rts
.bq_extract_rgb
lea bltcon0(a5),a1
move.l (a0)+,(a1)+ ; bltcon0/bltcon1
move.w (a0)+,bltcdat(a5)
addq.l #8,a1
move.l (a0)+,(a1)+ ; bltbpt
move.l (a0)+,(a1)+ ; bltapt
move.l (a0)+,(a1)+ ; bltdpt
move.w (a0)+,(a1)+ ; bltsize
rts
.bq_merge_rgb
BLTCON_SET ABCD,(BLT_A|BLT_B|BLT_C),0,0
lea bltcpt(a5),a1
move.l (a0)+,(a1)+ ; bltcpt
move.l (a0)+,(a1)+ ; bltbpt
move.l (a0)+,(a1)+ ; bltapt
move.l (a0)+,(a1)+ ; bltdpt
move.w (a0)+,(a1)+ ; bltsize
rts
.bq_dither
BLTCON0_SET D,BLT_C,0
move.w #4,bltdmod(a5)
.bq_dither_more
move.w (a0)+,bltcdat(a5)
move.l (a0)+,bltdpt(a5)
move.w (a0)+,bltsize(a5)
rts
;--------------------------------------------------------------------
vgb_blitter_saturate_and_merge_320:
move.l pd_LastChunkyPtr(a6),a2
move.l pd_ChunkySatPtr(a6),a1
lea ((NUM_CHUNKY_PIXELS*3)-96)*2-2(a2),a2
lea ((NUM_CHUNKY_PIXELS*3)-96)*2(a1),a1
move.w #(1|((VGBARS_WIDTH)<<6)),d3
FIRST_ADD_TO_BLITTER_QUEUE a4,a3
addq.l #4,a4
move.l #.bq_saturate_all,(a4)+
move.l a2,(a4)+ ; bltapt
move.l a1,(a4)+ ; bltdpt
move.w d3,(a4)+ ; bltsize
REPT 2
lea -NUM_CHUNKY_PIXELS*2(a2),a2
lea -NUM_CHUNKY_PIXELS*2(a1),a1
FAST_ADD_TO_BLITTER_QUEUE a4,a3
addq.l #4,a4
move.l #.bq_saturate_more,(a4)+
move.l a2,(a4)+ ; bltapt
move.l a1,(a4)+ ; bltdpt
move.w d3,(a4)+ ; bltsize
ENDR
move.l pd_LastChunkyPtr(a6),a0
move.l pd_ChunkyResultRPtr(a6),a1
move.l pd_ChunkySatRPtr(a6),a2
lea 96*2+2(a0),a0
lea 96*2(a1),a1
lea 96*2+2(a2),a2
;move.w #(1)|((NUM_CHUNKY_PIXELS)<<6),d3
FAST_ADD_TO_BLITTER_QUEUE a4,a3
addq.l #4,a4
move.l #.bq_extract_rgb,(a4)+
move.l #((BLTEN_ABD+(((BLT_A|BLT_B)&BLT_C)&$ff))<<16)|(12<<28)|(12<<12),(a4)+
move.w #$0f00,(a4)+ ; bltcdat
move.l a2,(a4)+ ; bltbpt
move.l a0,(a4)+ ; bltapt
move.l a1,(a4)+ ; bltdpt
move.w d3,(a4)+ ; bltsize
lea NUM_CHUNKY_PIXELS*2-2(a0),a0
move.l pd_ChunkyResultGPtr(a6),a1
move.l pd_ChunkySatGPtr(a6),a2
lea 96*2(a1),a1
lea 96*2(a2),a2
FAST_ADD_TO_BLITTER_QUEUE a4,a3
addq.l #4,a4
move.l #.bq_extract_rgb,(a4)+
move.l #((BLTEN_ABD+(((BLT_A|BLT_B)&BLT_C)&$ff))<<16)|(0<<28)|(0<<12),(a4)+
move.w #$00f0,(a4)+ ; bltcdat
move.l a2,(a4)+ ; bltbpt
move.l a0,(a4)+ ; bltapt
move.l a1,(a4)+ ; bltdpt
move.w d3,(a4)+ ; bltsize
lea NUM_CHUNKY_PIXELS*2(a0),a0
move.l pd_ChunkyResultBPtr(a6),a1
move.l pd_ChunkySatBPtr(a6),a2
lea 96*2(a1),a1
lea 96*2(a2),a2
FAST_ADD_TO_BLITTER_QUEUE a4,a3
addq.l #4,a4
move.l #.bq_extract_rgb,(a4)+
move.l #((BLTEN_ABD+(((BLT_A|BLT_B)&BLT_C)&$ff))<<16)|(4<<28)|(4<<12),(a4)+
move.w #$000f,(a4)+ ; bltcdat
move.l a2,(a4)+ ; bltbpt
move.l a0,(a4)+ ; bltapt
move.l a1,(a4)+ ; bltdpt
move.w d3,(a4)+ ; bltsize
move.l pd_ChunkyResultRPtr(a6),a0
move.l pd_ChunkyResultGPtr(a6),a1
move.l pd_ChunkyResultBPtr(a6),a2
lea 96*2(a0),a0
lea 96*2(a1),a1
lea 96*2(a2),a2
;move.w #(1)|((NUM_CHUNKY_PIXELS)<<6),d3
FAST_ADD_TO_BLITTER_QUEUE a4,a3
addq.l #4,a4
move.l #.bq_merge_rgb,(a4)+
move.l a0,(a4)+
move.l a1,(a4)+
move.l a2,(a4)+
move.l pd_CurrChunkyResultPtr(a6),a0
lea 96*2(a0),a0
move.l a0,(a4)+
move.w d3,(a4)+
lea vgb_sudoku_dither(pc),a1
move.w pd_SudokuDitherPos(a6),d0
sub.w #9*2,d0
bpl.s .noresetdither
moveq.l #2*9*2,d0
.noresetdither
move.w d0,pd_SudokuDitherPos(a6)
adda.w d0,a1
move.w #(1)|(((VGBARS_WIDTH+3)/3)<<6),d3
move.w #(1)|(((VGBARS_WIDTH+4)/3)<<6),d2
; pixel 1, red
move.l pd_LastChunkyPtr(a6),a0
lea 96*2(a0),a0
FAST_ADD_TO_BLITTER_QUEUE a4,a3
addq.l #4,a4
move.l #.bq_dither,(a4)+
move.w (a1)+,(a4)+
move.l a0,(a4)+
move.w d3,(a4)+
; pixel 2, red
addq.w #2,a0
FAST_ADD_TO_BLITTER_QUEUE a4,a3
addq.l #4,a4
move.l #.bq_dither_more,(a4)+
move.w (a1)+,(a4)+
move.l a0,(a4)+
move.w d2,(a4)+
; pixel 3, red
addq.w #2,a0
FAST_ADD_TO_BLITTER_QUEUE a4,a3
addq.l #4,a4
move.l #.bq_dither_more,(a4)+
move.w (a1)+,(a4)+
move.l a0,(a4)+
move.w d2,(a4)+
; pixel 1, green
lea (NUM_CHUNKY_PIXELS-2)*2(a0),a0
FAST_ADD_TO_BLITTER_QUEUE a4,a3
addq.l #4,a4
move.l #.bq_dither_more,(a4)+
move.w (a1)+,(a4)+
move.l a0,(a4)+
move.w d3,(a4)+
; pixel 2, green
addq.w #2,a0
FAST_ADD_TO_BLITTER_QUEUE a4,a3
addq.l #4,a4
move.l #.bq_dither_more,(a4)+
move.w (a1)+,(a4)+
move.l a0,(a4)+
move.w d2,(a4)+
; pixel 3, green
addq.w #2,a0
FAST_ADD_TO_BLITTER_QUEUE a4,a3
addq.l #4,a4
move.l #.bq_dither_more,(a4)+
move.w (a1)+,(a4)+
move.l a0,(a4)+
move.w d2,(a4)+
; pixel 1, blue
lea (NUM_CHUNKY_PIXELS-2)*2(a0),a0
FAST_ADD_TO_BLITTER_QUEUE a4,a3
addq.l #4,a4
move.l #.bq_dither_more,(a4)+
move.w (a1)+,(a4)+
move.l a0,(a4)+
move.w d3,(a4)+
; pixel 2, blue
addq.w #2,a0
FAST_ADD_TO_BLITTER_QUEUE a4,a3
addq.l #4,a4
move.l #.bq_dither_more,(a4)+
move.w (a1)+,(a4)+
move.l a0,(a4)+
move.w d2,(a4)+
; pixel 3, blue
addq.w #2,a0
LAST_ADD_TO_BLITTER_QUEUE a4,a3
clr.l (a4)+
move.l #.bq_dither_more,(a4)+
move.w (a1)+,(a4)+
move.l a0,(a4)+
move.w d2,(a4)+
rts
.bq_saturate_all
BLTHOGOFF
BLTCON_SET_X AD,(BLT_A&BLT_C),8,0,BLTCON1F_DESC|BLTCON1F_IFE
moveq.l #-1,d0
move.l d0,bltafwm(a5)
moveq.l #0,d0
move.l d0,bltcmod(a5) ; and bltbmod
move.l d0,bltamod(a5) ; and bltdmod
move.w #$0007,bltcdat(a5)
.bq_saturate_more
lea bltapt(a5),a1
move.l (a0)+,(a1)+ ; bltapt
move.l (a0)+,(a1)+ ; bltdpt
move.w (a0)+,(a1)+ ; bltsize
rts
.bq_extract_rgb
lea bltcon0(a5),a1
move.l (a0)+,(a1)+ ; bltcon0/bltcon1
move.w (a0)+,bltcdat(a5)
addq.l #8,a1
move.l (a0)+,(a1)+ ; bltbpt
move.l (a0)+,(a1)+ ; bltapt
move.l (a0)+,(a1)+ ; bltdpt
move.w (a0)+,(a1)+ ; bltsize
rts
.bq_merge_rgb
BLTCON_SET ABCD,(BLT_A|BLT_B|BLT_C),0,0
lea bltcpt(a5),a1
move.l (a0)+,(a1)+ ; bltcpt
move.l (a0)+,(a1)+ ; bltbpt
move.l (a0)+,(a1)+ ; bltapt
move.l (a0)+,(a1)+ ; bltdpt
move.w (a0)+,(a1)+ ; bltsize
rts
.bq_dither
BLTCON0_SET D,BLT_C,0
move.w #4,bltdmod(a5)
.bq_dither_more
move.w (a0)+,bltcdat(a5)
move.l (a0)+,bltdpt(a5)
move.w (a0)+,bltsize(a5)
rts
;********************************************************************
vgb_sudoku_dither:
dc.w 5,8,1,7,9,2,3,6,4
dc.w 6,7,2,8,4,3,5,9,1
dc.w 4,3,9,6,5,1,7,8,2
vgb_bars_colors:
dc.w 130,190,240
dc.w 230,60,150
dc.w 120,50,10
dc.w 10,100,70
dc.w 150,200,30
dc.w 10,120,50
dc.w 80,20,130
vgb_bars_dists:
dc.w 130*4
dc.w -80*4
dc.w 90*4
dc.w 100*4
dc.w -140*4
dc.w -40*4
dc.w 150*4
vgb_xpos_table:
dc.w 0,1,3,4,6,7,9,11,12,14,15,17,18,20,22,23
dc.w 25,27,28,30,32,33,35,37,38,40,42,44,45,47,49,51
dc.w 53,54,56,58,60,62,64,66,68,70,72,74,76,78,81,83
dc.w 85,87,90,92,94,97,99,102,105,107,110,113,116,118,121,124
dc.w 128,131,134,137,141,144,148,152,155,159,164,168,172,177,181,186
dc.w 191,196,202,207,213,219,225,232,239,246,254,262,270,279,288,298
dc.w 309,320,331,344,357,372,387,404,421,441,462,485,511,538,570,604
dc.w 643,687,737,795,862,942,1037,1154,1299,1486,1735,2083,2605,3475,5214,10429
vgb_cat_sprite_palette:
incbin "data/virgillbars/PLT_Lolcat64x128x16.PAL"
incbin "data/virgillbars/curtainsine.bin"
vgb_wobble_table:
incbin "data/virgillbars/curtainsine.bin"
incbin "data/virgillbars/curtainsine.bin"
;********************************************************************
;--------------------------------------------------------------------
section "vgb_copper",data,chip
vgb_copperlist:
COP_MOVE dmacon,DMAF_BLITHOG ; disable blitter hogging to avoid interrupt latency
COP_MOVE diwstrt,$5281 ; window start
COP_MOVE diwstop,$06c1 ; window stop
COP_MOVE ddfstrt,$0030 ; bitplane start
vgb_ddfstop:
COP_MOVE ddfstop,$00d0 ; bitplane stop
COP_MOVE bplcon3,$0c00
vgb_fmode:
COP_MOVE fmode,$0000 ; fixes the aga modulo problem
COP_MOVE color+0*2,$000
COP_MOVE color+1*2,$000
COP_MOVE bplcon0,$0200
COP_MOVE bplcon2,$0024 ; sprites in front
vgb_extra_copperlist_ptr:
COP_MOVE cop2lc,0
COP_MOVE cop2lc+2,0
COP_MOVE $1fe,0
COP_END
vgb_cat_sprite:
incbin "data/virgillbars/PLT_Lolcat64x128x16.ASP"
vgb_add_of_light_div_sprite:
incbin "data/virgillbars/additionsprite96x112x4.SPR"
vgb_light_break_sprite:
incbin "data/virgillbars/lightbreak128x128x4.SPR"
vgb_stay_broken_sprite:
incbin "data/virgillbars/staybroken128x128x4.SPR"
IFND FW_DEMO_PART
IFD ENABLE_PART_MUSIC
section "part_music_samples",data,chip ; section for music playback
part_music_smp:
incbin "data/music/dsr_68k_tune_2_v11.lsbank"
section "part_music_data",data ; section for music playback
part_music_data:
incbin "data/music/dsr_68k_tune_2_v11.lsmusic"
ENDC
ENDC
END