908 lines
24 KiB
NASM
908 lines
24 KiB
NASM
; Framework settings
|
|
|
|
IFD FW_DEMO_PART
|
|
IFD FW_HD_DEMO_PART
|
|
include "hdtrackmo_settings.i"
|
|
ELSE
|
|
include "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 = 1 ; 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 = 1 ; 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 = 17
|
|
|
|
ENDC
|
|
|
|
HEXAGON_WIDTH = 320
|
|
HEXAGON_HEIGHT = 254
|
|
|
|
COP_LIST_SIZE = 4000*4
|
|
|
|
HEXCHUNKY_WIDTH = 22
|
|
HEXCHUNKY_HEIGHT = 25
|
|
|
|
WINNER_WIDTH = 128
|
|
WINNER_HEIGHT = 128
|
|
|
|
CHIPMEM_SIZE = 100000
|
|
FASTMEM_SIZE = 2*4096*2
|
|
|
|
IFND DEBUG_DETAIL
|
|
DEBUG_DETAIL SET 10
|
|
ENDC
|
|
|
|
NEWAGE_DEBUG = 1
|
|
|
|
include "framework.i"
|
|
|
|
STRUCTURE PartData,fw_SIZEOF
|
|
APTR pd_CurrPlanesPtr
|
|
APTR pd_LastPlanesPtr
|
|
APTR pd_CurrChunkyPtr
|
|
APTR pd_LastChunkyPtr
|
|
APTR pd_CurrCopListPtr
|
|
APTR pd_LastCopListPtr
|
|
UBYTE pd_CopListToggle
|
|
UBYTE pd_DbToggle
|
|
ALIGNWORD
|
|
|
|
APTR pd_CopperList1
|
|
APTR pd_CopperList2
|
|
UWORD pd_ChunkyCopperListOffset
|
|
|
|
UWORD pd_Angle
|
|
UWORD pd_WinnerKilled
|
|
UWORD pd_WinnerXPos
|
|
UWORD pd_WinnerYPos
|
|
UWORD pd_WinnerXDir
|
|
|
|
ULONG pd_StartLineuu00VVvv
|
|
UWORD pd_StartLineUU
|
|
ULONG pd_EvenToOddLineuu00VVvvInc
|
|
UWORD pd_EvenToOddLineUUInc
|
|
ULONG pd_OddToEvenLineuu00VVvvInc
|
|
UWORD pd_OddToEvenLineUUInc
|
|
|
|
APTR pd_TexturePtr
|
|
APTR pd_ChunkyBuffer1
|
|
APTR pd_ChunkyBuffer2
|
|
APTR pd_ShadeTableXor
|
|
APTR pd_ShadeTableAdd1
|
|
|
|
STRUCT pd_PreparationTask,ft_SIZEOF
|
|
STRUCT pd_HexPalette,16*cl_SIZEOF
|
|
STRUCT pd_WinnerSprites,8*4
|
|
|
|
LABEL pd_SIZEOF
|
|
|
|
IFND FW_DEMO_PART
|
|
include "framework.asm"
|
|
ENDC
|
|
|
|
entrypoint:
|
|
IFD FW_DEMO_PART
|
|
move.l #pd_SIZEOF,d0
|
|
CALLFW InitPart
|
|
ENDC
|
|
|
|
bsr hex_init
|
|
|
|
lea hex_copperlist,a0
|
|
CALLFW SetCopper
|
|
|
|
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
|
|
IFD PART_MUSIC_START_POS
|
|
moveq.l #PART_MUSIC_START_POS,d0
|
|
CALLFW MusicSetPosition
|
|
move.w #6336,fw_MusicFrameCount(a6)
|
|
ENDC
|
|
ENDC
|
|
ENDC
|
|
|
|
bsr hex_main
|
|
|
|
CALLFW StopMusic
|
|
|
|
lea pd_PreparationTask(a6),a1
|
|
CALLFW RemTask
|
|
|
|
CALLFW SetBaseCopper
|
|
|
|
rts
|
|
|
|
;--------------------------------------------------------------------
|
|
|
|
hex_init:
|
|
bsr hex_init_vars
|
|
bsr hex_fill_chunky_buffers
|
|
|
|
lea .backgroundtasks(pc),a0
|
|
lea pd_PreparationTask(a6),a1
|
|
CALLFW AddTask
|
|
|
|
rts
|
|
|
|
.backgroundtasks
|
|
bsr hex_init_shade_table
|
|
rts
|
|
|
|
;--------------------------------------------------------------------
|
|
|
|
hex_init_vars:
|
|
IFD FW_DEMO_PART
|
|
move.l fw_GlobalUserData(a6),pd_TexturePtr(a6)
|
|
ELSE
|
|
move.l #hex_kaleidoscope_texture,pd_TexturePtr(a6)
|
|
ENDC
|
|
move.l #COP_LIST_SIZE,d0
|
|
CALLFW AllocChip64KB
|
|
move.l a0,pd_CopperList1(a6)
|
|
move.l a0,pd_CurrCopListPtr(a6)
|
|
|
|
move.l #COP_LIST_SIZE,d0
|
|
CALLFW AllocChip64KB
|
|
move.l a0,pd_CopperList2(a6)
|
|
move.l a0,pd_LastCopListPtr(a6)
|
|
|
|
move.l #HEXCHUNKY_WIDTH*HEXCHUNKY_HEIGHT*2*2,d0
|
|
CALLFW AllocChip
|
|
PUTMSG 10,<"ChunkyBuffer1 %p">,a0
|
|
move.l a0,pd_ChunkyBuffer1(a6)
|
|
move.l a0,pd_CurrChunkyPtr(a6)
|
|
lea HEXCHUNKY_WIDTH*HEXCHUNKY_HEIGHT*2(a0),a0
|
|
move.l a0,pd_ChunkyBuffer2(a6)
|
|
move.l a0,pd_LastChunkyPtr(a6)
|
|
|
|
move.l #2*4096*2,d0
|
|
CALLFW AllocFast
|
|
move.l a0,pd_ShadeTableXor(a6)
|
|
PUTMSG 10,<"ShadeTableXor %p">,a0
|
|
lea 4096*2(a0),a0
|
|
move.l a0,pd_ShadeTableAdd1(a6)
|
|
PUTMSG 10,<"ShadeTableAdd1 %p">,a0
|
|
|
|
|
|
lea pd_WinnerSprites(a6),a1
|
|
lea hex_winners_sprites,a3
|
|
move.l a3,a2
|
|
moveq.l #(WINNER_WIDTH/16)-1,d7
|
|
.sprloop
|
|
move.l a3,a0
|
|
adda.w (a2)+,a0
|
|
move.l d0,(a0)
|
|
move.l a0,(a1)+
|
|
dbra d7,.sprloop
|
|
|
|
move.w #HEXAGON_WIDTH,pd_WinnerXPos(a6)
|
|
move.w #0,pd_WinnerYPos(a6)
|
|
rts
|
|
|
|
;--------------------------------------------------------------------
|
|
|
|
hex_init_shade_table:
|
|
move.l pd_ShadeTableXor(a6),a0
|
|
move.l a0,a1
|
|
moveq.l #0,d0
|
|
.xorloop
|
|
moveq.l #$11,d3
|
|
moveq.l #15,d1
|
|
cmp.b d1,d0
|
|
bhi.s .upperset
|
|
and.b d1,d3
|
|
.upperset
|
|
and.b d0,d1
|
|
bne.s .lowerset
|
|
subq.b #1,d3
|
|
.lowerset
|
|
move.w d3,(a0)+
|
|
addq.b #1,d0
|
|
bne.s .xorloop
|
|
|
|
moveq.l #15-1,d7
|
|
move.l #$01000100,d3
|
|
.xoroloop
|
|
move.l a1,a2
|
|
move.w #128-1,d6
|
|
.xor2loop
|
|
move.l (a2)+,d0
|
|
add.l d3,d0
|
|
move.l d0,(a0)+
|
|
dbra d6,.xor2loop
|
|
dbra d7,.xoroloop
|
|
|
|
move.l pd_ShadeTableAdd1(a6),a1
|
|
moveq.l #0,d0
|
|
move.w #4096-1,d7
|
|
.sub1loop
|
|
move.w d0,d1
|
|
add.w -(a0),d1
|
|
move.w d1,(a1)+
|
|
addq.w #1,d0
|
|
dbra d7,.sub1loop
|
|
|
|
rts
|
|
|
|
;--------------------------------------------------------------------
|
|
|
|
hex_main:
|
|
PUTMSG 10,<"%d: Main part started (%d music frames)">,fw_FrameCounter-2(a6),fw_MusicFrameCount-2(a6)
|
|
|
|
move.w #2,copcon(a5) ; enable copper danger (copper controlled blitter)
|
|
|
|
REPT 2
|
|
bsr hex_flip_copperlists
|
|
|
|
move.l pd_CurrCopListPtr(a6),a0
|
|
bsr hex_hexagonchunky_create_copperlist
|
|
; offset is not known in first run!
|
|
move.l pd_CurrCopListPtr(a6),a0
|
|
bsr hex_hexagonchunky_create_copper_blittercopy
|
|
ENDR
|
|
|
|
move.w #$fff,d0
|
|
move.w d0,color+17*2(a5)
|
|
move.w d0,color+21*2(a5)
|
|
move.w d0,color+25*2(a5)
|
|
move.w d0,color+29*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)
|
|
|
|
moveq.l #16,d0
|
|
move.w #$346,d1
|
|
lea pd_HexPalette(a6),a1
|
|
CALLFW InitPaletteLerpSameColor
|
|
|
|
moveq.l #16,d0
|
|
moveq.l #64,d1
|
|
lea hex_hexgrid_palette(pc),a0
|
|
lea pd_HexPalette(a6),a1
|
|
CALLFW FadePaletteTo
|
|
|
|
lea .script(pc),a0
|
|
CALLFW InstallScript
|
|
|
|
lea .musicscript(pc),a0
|
|
CALLFW InstallMusicScript
|
|
|
|
PUTMSG 10,<"Chunky %p">,a0
|
|
.loop
|
|
bsr hex_flip_copperlists
|
|
|
|
moveq.l #16,d0
|
|
lea pd_HexPalette(a6),a1
|
|
CALLFW DoFadePaletteStep
|
|
|
|
lea pd_HexPalette(a6),a1
|
|
REPT 16
|
|
move.w pd_HexPalette+REPTN*cl_SIZEOF+cl_Color(a6),color+REPTN*4(a5)
|
|
ENDR
|
|
|
|
CALLFW CheckScript
|
|
CALLFW CheckMusicScript
|
|
|
|
bsr hex_update_winner_sprites
|
|
|
|
bsr hex_do_rotozoomer
|
|
|
|
bsr hex_update_copper_list_pointers
|
|
|
|
CALLFW VSyncWithTask
|
|
|
|
move.w fw_LspMusicLength+2(a6),d0
|
|
subq.w #2,d0
|
|
cmp.w fw_MusicFrameCount(a6),d0
|
|
bge.s .loop
|
|
|
|
rts
|
|
|
|
.script
|
|
dc.w 120,.move_winner_left-*
|
|
dc.w 120+WINNER_WIDTH,.stop_winner-*
|
|
dc.w 400,.move_winner_right-*
|
|
dc.w 400+WINNER_WIDTH/2,.stop_and_kill_winner-*
|
|
dc.w 0
|
|
|
|
.musicscript
|
|
dc.w 6720,.flash-*
|
|
dc.w 6720+16*6,.startdarken-*
|
|
dc.w 6720+32*6,.fadeout-*
|
|
dc.w 0
|
|
|
|
.move_winner_left
|
|
move.w #-1,pd_WinnerXDir(a6)
|
|
rts
|
|
.stop_and_kill_winner
|
|
st pd_WinnerKilled(a6)
|
|
.stop_winner
|
|
clr.w pd_WinnerXDir(a6)
|
|
rts
|
|
.move_winner_right
|
|
move.w #2,pd_WinnerXDir(a6)
|
|
rts
|
|
|
|
.flash
|
|
PUTMSG 10,<"Flash!">
|
|
moveq.l #16,d0
|
|
move.w #$fff,d1
|
|
lea pd_HexPalette(a6),a1
|
|
CALLFW InitPaletteLerpSameColor
|
|
|
|
moveq.l #16,d0
|
|
moveq.l #32,d1
|
|
lea hex_hexgrid_palette(pc),a0
|
|
lea pd_HexPalette(a6),a1
|
|
CALLFW FadePaletteTo
|
|
rts
|
|
|
|
.startdarken
|
|
PUTMSG 10,<"Start darken">
|
|
lea pd_PreparationTask(a6),a1
|
|
move.b #-20,LN_PRI(a1)
|
|
lea .brightentextureloop(pc),a0
|
|
CALLFW AddTask
|
|
rts
|
|
|
|
.fadeout
|
|
moveq.l #16,d0
|
|
moveq.l #64,d1
|
|
lea hex_hexgrid_black_palette(pc),a0
|
|
lea pd_HexPalette(a6),a1
|
|
CALLFW FadePaletteTo
|
|
rts
|
|
|
|
.brightentextureloop
|
|
move.w fw_MusicFrameCount(a6),d6
|
|
add.w #15,d6
|
|
moveq.l #16-1,d7
|
|
.brloop
|
|
PUSHM d6/d7
|
|
bsr hex_brighten_tc_data
|
|
POPM
|
|
.retry
|
|
cmp.w fw_MusicFrameCount(a6),d6
|
|
blt.s .contbr
|
|
PUTMSG 10,<"Yielding">
|
|
CALLFW Yield
|
|
bra.s .retry
|
|
.contbr
|
|
add.w #15,d6
|
|
dbra d7,.brloop
|
|
|
|
rts
|
|
|
|
;--------------------------------------------------------------------
|
|
|
|
hex_flip_copperlists:
|
|
move.l pd_CurrCopListPtr(a6),pd_LastCopListPtr(a6)
|
|
move.l pd_CurrChunkyPtr(a6),pd_LastChunkyPtr(a6)
|
|
not.b pd_CopListToggle(a6)
|
|
beq.s .selb1
|
|
move.l pd_CopperList2(a6),pd_CurrCopListPtr(a6)
|
|
move.l pd_ChunkyBuffer2(a6),pd_CurrChunkyPtr(a6)
|
|
rts
|
|
.selb1
|
|
move.l pd_CopperList1(a6),pd_CurrCopListPtr(a6)
|
|
move.l pd_ChunkyBuffer1(a6),pd_CurrChunkyPtr(a6)
|
|
rts
|
|
|
|
;--------------------------------------------------------------------
|
|
|
|
hex_update_copper_list_pointers:
|
|
lea hex_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
|
|
|
|
;--------------------------------------------------------------------
|
|
|
|
hex_update_winner_sprites:
|
|
lea pd_WinnerSprites(a6),a2
|
|
|
|
moveq.l #0,d0
|
|
moveq.l #0,d4
|
|
tst.w pd_WinnerKilled(a6)
|
|
bne.s .filldata
|
|
|
|
move.w pd_WinnerXPos(a6),d4
|
|
add.w pd_WinnerXDir(a6),d4
|
|
move.w d4,pd_WinnerXPos(a6)
|
|
move.w pd_WinnerYPos(a6),d1
|
|
|
|
add.w #128,d4
|
|
add.w #$52,d1
|
|
|
|
move.w d1,d2
|
|
add.w #WINNER_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
|
|
or.w d1,d4 ; sv7-sv0, sh8-sh1 in d4
|
|
;tas d0 ; att TAS sets bit 7
|
|
.filldata
|
|
REPT (WINNER_WIDTH/16)
|
|
move.l (a2)+,a0
|
|
move.w d4,(a0)+
|
|
move.w d0,(a0)+
|
|
addq.w #8,d4
|
|
ENDR
|
|
rts
|
|
|
|
;--------------------------------------------------------------------
|
|
|
|
hex_fill_chunky_buffers:
|
|
BLTHOGON
|
|
BLTWAIT
|
|
|
|
BLTCON_SET D,BLT_C,0,0
|
|
move.w #0,bltdmod(a5)
|
|
move.w #$346^$fff,bltcdat(a5)
|
|
move.l pd_ChunkyBuffer1(a6),bltdpt(a5)
|
|
move.w #(HEXCHUNKY_WIDTH*2)|((HEXCHUNKY_HEIGHT)<<6),bltsize(a5)
|
|
|
|
rts
|
|
|
|
;--------------------------------------------------------------------
|
|
|
|
hex_brighten_tc_data:
|
|
move.l pd_TexturePtr(a6),a0
|
|
move.l a0,a2
|
|
add.l #256*256*2,a2
|
|
move.l pd_ShadeTableAdd1(a6),a1
|
|
.loop movem.w (a0),d0-d7
|
|
add.w d0,d0
|
|
add.w d1,d1
|
|
add.w d2,d2
|
|
add.w d3,d3
|
|
add.w d4,d4
|
|
add.w d5,d5
|
|
add.w d6,d6
|
|
add.w d7,d7
|
|
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)+
|
|
move.w (a1,d6.w),(a0)+
|
|
move.w (a1,d7.w),(a0)+
|
|
cmp.l a0,a2
|
|
bne.s .loop
|
|
rts
|
|
|
|
;--------------------------------------------------------------------
|
|
|
|
hex_do_rotozoomer:
|
|
add.w #$074,pd_StartLineuu00VVvv+2(a6)
|
|
addq.b #1,pd_StartLineUU(a6)
|
|
add.b #44,pd_StartLineuu00VVvv(a6)
|
|
|
|
move.l fw_SinTable(a6),a0
|
|
move.l fw_CosTable(a6),a1
|
|
move.w pd_Angle(a6),d0
|
|
addq.w #4,d0
|
|
move.w d0,pd_Angle(a6)
|
|
and.w #1023*2,d0
|
|
move.w d0,d1
|
|
lsr.w #1,d1
|
|
and.w #1023*2,d1
|
|
move.w (a0,d1.w),d3 ; zoom
|
|
lsr.w #2,d3
|
|
add.w #64,d3
|
|
|
|
move.w (a1,d0.w),d4 ; acos (U)
|
|
move.w (a0,d0.w),d5 ; asin (V)
|
|
; scale
|
|
muls d3,d4
|
|
muls d3,d5
|
|
swap d4 ; UUuu
|
|
swap d5 ; VVvv
|
|
PUTMSG 40,<"UUuu = %x, VVvv = %x">,d4,d5
|
|
|
|
; even to odd increment
|
|
move.w d4,d0
|
|
asr.w #1,d0
|
|
add.w d5,d0
|
|
neg.w d0 ; -asin - (acos / 2)
|
|
move.b d0,pd_EvenToOddLineuu00VVvvInc(a6)
|
|
move.w d0,pd_EvenToOddLineUUInc(a6)
|
|
move.w d5,d0
|
|
asr.w #1,d0
|
|
neg.w d0
|
|
add.w d4,d0 ; acos - (asin / 2)
|
|
move.w d0,pd_EvenToOddLineuu00VVvvInc+2(a6)
|
|
|
|
; odd to even increment
|
|
move.w d5,d0
|
|
neg.w d0
|
|
add.w d4,d0 ; -asin + acos
|
|
move.b d0,pd_OddToEvenLineuu00VVvvInc(a6)
|
|
move.w d0,pd_OddToEvenLineUUInc(a6)
|
|
|
|
move.w d5,d0
|
|
add.w d4,d0
|
|
move.w d0,pd_OddToEvenLineuu00VVvvInc+2(a6)
|
|
|
|
swap d5
|
|
move.b d4,-(sp)
|
|
move.w (sp)+,d5
|
|
clr.b d5
|
|
swap d5 ; uu__VVvv
|
|
move.w d4,-(sp)
|
|
move.b (sp)+,d4 ; xxxxxxUU
|
|
|
|
move.l pd_StartLineuu00VVvv(a6),d2 ; startuu00VVvv
|
|
move.b pd_StartLineUU(a6),d3 ; start______UU
|
|
|
|
move.l pd_CurrChunkyPtr(a6),a0
|
|
move.l pd_TexturePtr(a6),a1
|
|
|
|
moveq.l #(HEXCHUNKY_HEIGHT/2)-1,d7
|
|
.yloop
|
|
move.w d7,-(sp)
|
|
|
|
; even line
|
|
move.l d2,d0 ; uu__VVvv
|
|
move.w d3,d1 ; ______UU
|
|
|
|
moveq.l #HEXCHUNKY_WIDTH-1,d7
|
|
.xloop1
|
|
moveq.l #0,d6
|
|
move.w d0,d6
|
|
move.b d1,d6
|
|
add.l d6,d6
|
|
move.w (a1,d6.l),(a0)+
|
|
add.l d5,d0
|
|
addx.b d4,d1
|
|
dbra d7,.xloop1
|
|
|
|
move.b pd_OddToEvenLineUUInc(a6),d6
|
|
add.l pd_OddToEvenLineuu00VVvvInc(a6),d2
|
|
addx.b d6,d3
|
|
|
|
; odd line
|
|
move.l d2,d0 ; uu__VVvv
|
|
move.w d3,d1 ; ______UU
|
|
|
|
moveq.l #HEXCHUNKY_WIDTH-1,d7
|
|
.xloop2
|
|
moveq.l #0,d6
|
|
move.w d0,d6
|
|
move.b d1,d6
|
|
add.l d6,d6
|
|
move.w (a1,d6.l),(a0)+
|
|
add.l d5,d0
|
|
addx.b d4,d1
|
|
dbra d7,.xloop2
|
|
|
|
move.b pd_EvenToOddLineUUInc(a6),d6
|
|
add.l pd_EvenToOddLineuu00VVvvInc(a6),d2
|
|
addx.b d6,d3
|
|
|
|
move.w (sp)+,d7
|
|
dbra d7,.yloop
|
|
|
|
; even line
|
|
move.l d2,d0 ; uu__VVvv
|
|
move.w d3,d1 ; ______UU
|
|
|
|
moveq.l #HEXCHUNKY_WIDTH-1,d7
|
|
.xloop3
|
|
moveq.l #0,d6
|
|
move.w d0,d6
|
|
move.b d1,d6
|
|
add.l d6,d6
|
|
move.w (a1,d6.l),(a0)+
|
|
add.l d5,d0
|
|
addx.b d4,d1
|
|
dbra d7,.xloop3
|
|
|
|
rts
|
|
|
|
;--------------------------------------------------------------------
|
|
|
|
SKIPLINESNOOVR MACRO
|
|
lsl.w #8,d1
|
|
add.w d1,d0
|
|
move.w d0,(a0)+
|
|
move.w d3,(a0)+
|
|
ENDM
|
|
|
|
; 256*9 + 43*2 instructions (plus a about 40 other insts) around 2500, plus 43*25 (plus two empty ones) insts = 1118
|
|
|
|
hex_hexagonchunky_create_copper_blittercopy:
|
|
COPIMOVE DMAF_RASTER,dmacon ; disable display DMA
|
|
COPBLITWAIT
|
|
COPIMOVE BLTEN_AD|((BLT_A^BLT_C)&$ff),bltcon0
|
|
COPIMOVE 0,bltcon1
|
|
COPIMOVE $ffff,bltafwm
|
|
COPIMOVE $ffff,bltalwm
|
|
COPIMOVE $fff,bltcdat
|
|
COPIMOVE 0,bltamod
|
|
COPIMOVE 6,bltdmod
|
|
|
|
move.l pd_LastChunkyPtr(a6),a1
|
|
COPPTMOVE a1,bltapt,d0
|
|
move.l pd_CurrCopListPtr(a6),a1
|
|
adda.w pd_ChunkyCopperListOffset(a6),a1
|
|
COPPTMOVE a1,bltdpt,d0
|
|
COPIMOVE (1|(HEXCHUNKY_WIDTH*HEXCHUNKY_HEIGHT)<<6),bltsize
|
|
rts
|
|
|
|
;--------------------------------------------------------------------
|
|
|
|
hex_hexagonchunky_create_copperlist:
|
|
bsr hex_hexagonchunky_create_copper_blittercopy
|
|
moveq.l #-2,d3
|
|
|
|
lea pd_WinnerSprites(a6),a1
|
|
move.w #sprpt,d1
|
|
moveq.l #(WINNER_WIDTH/16)*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 $6200,bplcon0
|
|
|
|
move.w #$00df,d0
|
|
moveq.l #$2c,d1
|
|
SKIPLINESNOOVR
|
|
|
|
lea hex_hexgrid_data(pc),a2
|
|
|
|
lea 4+8+4+2(a0),a1
|
|
move.l a1,d1
|
|
swap d1
|
|
COPRMOVE d1,cop1lc
|
|
|
|
lea 2500*4(a0),a4
|
|
|
|
move.l a4,a1
|
|
suba.l pd_CurrCopListPtr(a6),a1
|
|
lea 6+HEXCHUNKY_WIDTH*2*4(a1),a1 ; first line is ignored
|
|
move.w a1,pd_ChunkyCopperListOffset(a6)
|
|
|
|
move.l a4,a3
|
|
|
|
move.l #(bpldat<<16),d2
|
|
move.l #((color+16*2)<<16)|$253,d1
|
|
;move.l #((color)<<16)|$253,d1
|
|
moveq.l #(25+2)-2,d6
|
|
.chloop
|
|
moveq.l #((HEXAGON_WIDTH+16)/16)-1,d7
|
|
.xloop
|
|
move.l d2,(a3)+
|
|
move.l d1,(a3)+
|
|
add.w #$423,d1
|
|
dbra d7,.xloop
|
|
move.l #copjmp1<<16,(a3)+
|
|
move.l #$1fe<<16,(a3)+
|
|
dbra d6,.chloop
|
|
|
|
move.l a4,a3
|
|
COPRMOVE a3,cop2lc+2
|
|
|
|
moveq.l #2-1,d7
|
|
.iloop
|
|
move.w (a2)+,d2 ; unused
|
|
move.w #bpldat+1*2,(a0)+
|
|
move.w (a2)+,(a0)+
|
|
move.w #bpldat+2*2,(a0)+
|
|
move.w (a2)+,(a0)+
|
|
move.w #bpldat+3*2,(a0)+
|
|
move.w (a2)+,(a0)+
|
|
move.w #bpldat+4*2,(a0)+
|
|
move.w (a2)+,(a0)+
|
|
move.w #bpldat+5*2,(a0)+
|
|
move.w (a2)+,(a0)+
|
|
|
|
lea 8+4(a0),a1
|
|
COPRMOVE a1,cop1lc+2
|
|
|
|
move.b #$2f,d0
|
|
add.w #$100,d0
|
|
move.w d0,(a0)+
|
|
move.w d3,(a0)+
|
|
move.l #copjmp2<<16,(a0)+
|
|
|
|
dbra d7,.iloop
|
|
|
|
moveq.l #12-1,d6
|
|
.drloop
|
|
lea 44*4(a4),a4
|
|
lea 8(a4),a3
|
|
COPRMOVE a3,cop2lc+2
|
|
|
|
moveq.l #10-1,d7
|
|
.y1loop
|
|
move.w (a2)+,d2 ; unused
|
|
move.w #bpldat+1*2,(a0)+
|
|
move.w (a2)+,(a0)+
|
|
move.w #bpldat+2*2,(a0)+
|
|
move.w (a2)+,(a0)+
|
|
move.w #bpldat+3*2,(a0)+
|
|
move.w (a2)+,(a0)+
|
|
move.w #bpldat+4*2,(a0)+
|
|
move.w (a2)+,(a0)+
|
|
move.w #bpldat+5*2,(a0)+
|
|
move.w (a2)+,(a0)+
|
|
|
|
lea 8+4(a0),a1
|
|
COPRMOVE a1,cop1lc+2
|
|
|
|
move.b #$33,d0
|
|
add.w #$100,d0
|
|
move.w d0,(a0)+
|
|
move.w d3,(a0)+
|
|
move.l #copjmp2<<16,(a0)+
|
|
|
|
dbra d7,.y1loop
|
|
|
|
lea 44*4(a4),a4
|
|
move.l a4,a3
|
|
COPRMOVE a3,cop2lc+2
|
|
moveq.l #10-1,d7
|
|
.y2loop
|
|
move.w (a2)+,d2 ; unused
|
|
move.w #bpldat+1*2,(a0)+
|
|
move.w (a2)+,(a0)+
|
|
move.w #bpldat+2*2,(a0)+
|
|
move.w (a2)+,(a0)+
|
|
move.w #bpldat+3*2,(a0)+
|
|
move.w (a2)+,(a0)+
|
|
move.w #bpldat+4*2,(a0)+
|
|
move.w (a2)+,(a0)+
|
|
move.w #bpldat+5*2,(a0)+
|
|
move.w (a2)+,(a0)+
|
|
|
|
lea 8+4(a0),a1
|
|
COPRMOVE a1,cop1lc+2
|
|
|
|
move.b #$2f,d0
|
|
add.w #$100,d0
|
|
move.w d0,(a0)+
|
|
move.w d3,(a0)+
|
|
move.l #copjmp2<<16,(a0)+
|
|
|
|
dbra d7,.y2loop
|
|
|
|
;lea -20*2*6(a2),a2
|
|
dbra d6,.drloop
|
|
|
|
lea 44*4(a4),a4
|
|
lea 8(a4),a3
|
|
COPRMOVE a3,cop2lc+2
|
|
|
|
moveq.l #12-1,d7
|
|
.y3loop
|
|
move.w (a2)+,d2 ; unused
|
|
move.w #bpldat+1*2,(a0)+
|
|
move.w (a2)+,(a0)+
|
|
move.w #bpldat+2*2,(a0)+
|
|
move.w (a2)+,(a0)+
|
|
move.w #bpldat+3*2,(a0)+
|
|
move.w (a2)+,(a0)+
|
|
move.w #bpldat+4*2,(a0)+
|
|
move.w (a2)+,(a0)+
|
|
move.w #bpldat+5*2,(a0)+
|
|
move.w (a2)+,(a0)+
|
|
|
|
lea 8+4(a0),a1
|
|
COPRMOVE a1,cop1lc+2
|
|
|
|
move.b #$33,d0
|
|
add.w #$100,d0
|
|
move.w d0,(a0)+
|
|
move.w d3,(a0)+
|
|
move.l #copjmp2<<16,(a0)+
|
|
|
|
dbra d7,.y3loop
|
|
|
|
lea hex_copperlist,a1
|
|
COPPTMOVE a1,cop1lc,d1
|
|
|
|
move.l d3,(a0)
|
|
rts
|
|
|
|
;--------------------------------------------------------------------
|
|
|
|
hex_hexgrid_palette:
|
|
dc.w $000,$ccc,$aaa,$888
|
|
dc.w $666,$9ac,$57a,$357
|
|
dc.w $0f0,$eee,$eee,$cc8
|
|
dc.w $884,$aa6,$a40,$620
|
|
|
|
hex_hexgrid_black_palette:
|
|
REPT 16
|
|
dc.w $000
|
|
ENDR
|
|
|
|
hex_hexgrid_data:
|
|
incbin "data/hexagon/hexagon_reg16x254.EHB"
|
|
|
|
section "hex_copper",data,chip
|
|
|
|
hex_copperlist:
|
|
COP_MOVE dmacon,DMAF_RASTER|DMAF_BLITHOG ; disable blitter hogging to avoid interrupt latency
|
|
COP_MOVE diwstrt,$2c81 ; window start
|
|
COP_MOVE diwstop,$2cc1 ; window stop
|
|
COP_MOVE ddfstrt,$0038 ; bitplane start
|
|
COP_MOVE ddfstop,$00d0 ; bitplane stop
|
|
|
|
COP_MOVE bplcon3,$0c00
|
|
COP_MOVE fmode,$0000 ; fixes the aga modulo problem
|
|
COP_MOVE bplcon0,$0200
|
|
|
|
hex_extra_copperlist_ptr:
|
|
COP_MOVE cop2lc,0
|
|
COP_MOVE cop2lc+2,0
|
|
COP_MOVE $1fe,0
|
|
COP_END
|
|
|
|
hex_winners_sprites:
|
|
incbin "data/hexagon/winners128x128x4.SPR"
|
|
|
|
IFND FW_DEMO_PART
|
|
section "hex_kaleidoscope_texture",data
|
|
hex_kaleidoscope_texture:
|
|
incbin "data/hexagon/kaleitc.raw"
|
|
|
|
IFD ENABLE_PART_MUSIC
|
|
section "part_music_samples",data,chip ; section for music playback
|
|
part_music_smp:
|
|
incbin "data/music/desire_demo_68k_v6.lsbank"
|
|
|
|
section "part_music_data",data ; section for music playback
|
|
part_music_data:
|
|
incbin "data/music/desire_demo_68k_v6.lsmusic"
|
|
ENDC
|
|
ENDC
|
|
|
|
END |