chrisly42
9c48c11cd1
- 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
3013 lines
84 KiB
NASM
Executable File
3013 lines
84 KiB
NASM
Executable File
; TODOs:
|
|
; - Fix pixel errors at border
|
|
;
|
|
; 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
|
|
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 = 300 ; 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 = 0
|
|
PART_MUSIC_START_POS = 0
|
|
|
|
ENDC
|
|
|
|
GOURAUD_WIDTH = 128
|
|
GOURAUD_PLANES = 4
|
|
|
|
BENDIT_WIDTH = 128
|
|
BENDIT_HEIGHT = 128
|
|
|
|
CUBE_PRECALC_NUM = 16
|
|
|
|
NUM_RUBBER_FRAMES = 33
|
|
|
|
CUBE_WIDTH = 128
|
|
CUBE_HEIGHT = 128
|
|
CUBE_PLANES = 4
|
|
CUBE_X_OFFSET = 0
|
|
CUBE_Y_OFFSET = 0
|
|
CUBE_Y_CLIP = 0
|
|
|
|
CUBE_MAX_SIZE = 6400
|
|
GOURAUD_Z_DIST = 182
|
|
CULLING_EXT = 128
|
|
GOURAUD_Z_ADD = 8192+1000 ; 8192 is currently safe lower limit, 2*8192 is safe upper limit
|
|
|
|
CUBE_BUF_WIDTH = 128
|
|
|
|
gouraudColShift = 10
|
|
gouraudErrShift = 6
|
|
|
|
NUM_BQ_LINES = 64
|
|
|
|
COP_PREAMBLE_INST = 2 ; wait and bplcon0
|
|
COP_POST_INST = 3 ; wait, 8x(sprctl + sprpos)
|
|
COP_INST_PER_LINE = 2 ; bplptl, cop2lc, cop2lc, wait, 40 colors, skip, copjmp
|
|
COP_LIST_SIZE = (500)*4
|
|
|
|
CHIPMEM_SIZE = ((CUBE_BUF_WIDTH/8)*CUBE_HEIGHT*CUBE_PLANES*3)+((CUBE_WIDTH/8)*CUBE_HEIGHT*CUBE_PLANES*NUM_RUBBER_FRAMES)+COP_LIST_SIZE*2
|
|
FASTMEM_SIZE = CUBE_PRECALC_NUM*cd_SIZEOF
|
|
|
|
IFND DEBUG_DETAIL
|
|
DEBUG_DETAIL SET 10
|
|
ENDC
|
|
|
|
NEWAGE_DEBUG = 1
|
|
|
|
; - CHIP BSS 2 x 128 x 128 x 4 = 16384 (DB)
|
|
; - CHIP BSS 3 x 128 x 128 x 4 = 24576 (3 line buffers for cube)
|
|
; - CHIP BSS 32 x 128 x 128 x 4 = 262144 (Rubber buffers)
|
|
;
|
|
; - FAST BSS 32 x 1424 = 45568 (Cube preprocessing) 12+3*3*2*2+8*3*2+8*2*2+12*(11*4+4+8*2)
|
|
|
|
|
|
include "framework.i"
|
|
|
|
STRUCTURE BQLine,bq_SIZEOF
|
|
ULONG bql_BltCon01
|
|
APTR bql_BltCPt
|
|
UWORD bql_BltBMod
|
|
UWORD bql_BltAMod
|
|
UWORD bql_BltAPtLo
|
|
APTR bql_BltDPt
|
|
UWORD bql_BltSize
|
|
LABEL bql_SIZEOF
|
|
|
|
STRUCTURE BQFillCube,bq_SIZEOF
|
|
ULONG bqfc_BltCon01
|
|
UWORD bqfc_BltAMod
|
|
UWORD bqfc_BltDMod
|
|
APTR bqfc_BltAPt
|
|
APTR bqfc_BltDPt
|
|
UWORD bqfc_BltSize
|
|
LABEL bqfc_SIZEOF
|
|
|
|
STRUCTURE BQClear,bq_SIZEOF
|
|
ULONG bqc_BltCon01
|
|
APTR bqc_BltDPt
|
|
UWORD bqc_BltDMod
|
|
UWORD bqc_BltCDat
|
|
UWORD bqc_BltSize
|
|
LABEL bqc_SIZEOF
|
|
|
|
STRUCTURE CubeData,0
|
|
ULONG cd_PlanesToDraw
|
|
UWORD cd_LinesToDraw
|
|
UWORD cd_InnerLines
|
|
STRUCT cd_CubeNormals,3*3*2*2
|
|
STRUCT cd_Coords,8*3*2
|
|
STRUCT cd_ProjCoords,8*2*2
|
|
STRUCT cd_IntCubeLines,12*il_SIZEOF
|
|
LABEL cd_SIZEOF
|
|
|
|
STRUCTURE IntCubeLine,0
|
|
STRUCT il_Coords,22*4 ; must be first
|
|
UWORD il_NumCoords
|
|
UBYTE il_Flipped
|
|
UBYTE il_DzNeg
|
|
|
|
UWORD il_FromCoord
|
|
UWORD il_ToCoord
|
|
UWORD il_FromX
|
|
UWORD il_FromY
|
|
UWORD il_ToX
|
|
UWORD il_ToY
|
|
UWORD il_FromZ
|
|
UWORD il_ToZ
|
|
LABEL il_SIZEOF
|
|
|
|
STRUCTURE PartData,fw_SIZEOF
|
|
APTR pd_CurrPlanesPtr
|
|
APTR pd_LastPlanesPtr
|
|
APTR pd_CurrTransPtr
|
|
APTR pd_LastTransPtr
|
|
APTR pd_CurrCubeLinePtr
|
|
APTR pd_LastCubeLinePtr
|
|
APTR pd_LastLastCubeLinePtr
|
|
APTR pd_CurrCopListPtr
|
|
APTR pd_LastCopListPtr
|
|
UBYTE pd_CopListToggle
|
|
UBYTE pd_DbToggle
|
|
UBYTE pd_CubeBufToggle
|
|
ALIGNWORD
|
|
|
|
UWORD pd_PartCountDown
|
|
|
|
APTR pd_CopperList1
|
|
APTR pd_CopperList2
|
|
APTR pd_RubberBuffer
|
|
APTR pd_CubeLineBuffer1 ; ds.w (CUBE_BUF_WIDTH/16)*CUBE_HEIGHT*CUBE_PLANES
|
|
APTR pd_CubeLineBuffer2 ; ds.w (CUBE_BUF_WIDTH/16)*CUBE_HEIGHT*CUBE_PLANES
|
|
APTR pd_CubeLineBuffer3 ; ds.w (CUBE_BUF_WIDTH/16)*CUBE_HEIGHT*CUBE_PLANES
|
|
|
|
UWORD pd_ScreenSinXOffset
|
|
UWORD pd_ScreenSinYOffset
|
|
WORD pd_ScreenX
|
|
WORD pd_ScreenY
|
|
|
|
ULONG pd_IntroFrameOffset
|
|
ULONG pd_RubberFrameOffset
|
|
UWORD pd_NumRubberFrames
|
|
|
|
UWORD pd_BenditYPos
|
|
BOOL pd_BenditKilled
|
|
|
|
WORD pd_Ax ; order may not be changed! (movem)
|
|
WORD pd_Ay
|
|
WORD pd_Az
|
|
WORD pd_AxSpeed
|
|
WORD pd_AySpeed
|
|
WORD pd_AzSpeed
|
|
UWORD pd_CubeSize
|
|
WORD pd_CubeSizeDir
|
|
|
|
BOOL pd_QuitAsyncTask
|
|
UWORD pd_CubeSinePos
|
|
UWORD pd_CubeCosPos
|
|
UWORD pd_CubeCullingValue
|
|
|
|
APTR pd_CubeSceneRoutinePtr
|
|
APTR pd_CubeDataReadPtr
|
|
APTR pd_CubeDataWritePtr
|
|
UWORD pd_CalculatedCubeFrames
|
|
UWORD pd_PrecalculatedFrames
|
|
APTR pd_CubeScriptPointer
|
|
|
|
APTR pd_CubeDataPtr
|
|
APTR pd_CubePrecalcBuffer ; ds.b cd_SIZEOF*CUBE_PRECALC_NUM
|
|
APTR pd_CubePrecalcBufferEnd
|
|
|
|
STRUCT pd_BQLineInit,bq_SIZEOF
|
|
STRUCT pd_BQLines,NUM_BQ_LINES*bql_SIZEOF
|
|
STRUCT pd_BQFillCube,bqfc_SIZEOF
|
|
STRUCT pd_BQClearLineBuffer,bqc_SIZEOF
|
|
|
|
STRUCT pd_RubberPalette,32*cl_SIZEOF
|
|
STRUCT pd_BenditSprites,8*4
|
|
|
|
STRUCT pd_CubeCalcTask,ft_SIZEOF
|
|
|
|
STRUCT pd_LinesFromBuffer,NUM_BQ_LINES*2*2
|
|
STRUCT pd_LinesToBuffer,NUM_BQ_LINES*2*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
|
|
|
|
move.w #$000,color(a5)
|
|
bsr gou_init
|
|
|
|
lea gou_async_calc_task(pc),a0
|
|
lea pd_CubeCalcTask(a6),a1
|
|
CALLFW AddTask
|
|
|
|
lea gou_copperlist,a0
|
|
CALLFW SetCopper
|
|
|
|
bsr gou_clear_cube_line_buffer
|
|
|
|
REPT 2
|
|
bsr gou_flip_db_frame
|
|
bsr gou_clear_cube_line_buffer
|
|
ENDR
|
|
|
|
bsr gou_clear_rubber_buffers
|
|
|
|
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
|
|
ELSE
|
|
CALLFW StartMusic
|
|
ENDC
|
|
|
|
bsr gou_intro
|
|
bsr gou_main
|
|
|
|
CALLFW SetBaseCopper
|
|
|
|
lea pd_CubeCalcTask(a6),a1
|
|
CALLFW RemTask
|
|
rts
|
|
|
|
;--------------------------------------------------------------------
|
|
|
|
gou_init:
|
|
bsr gou_init_vars
|
|
bsr gou_init_blitter_queue
|
|
|
|
CALLFW SetBlitterQueueSingleFrame
|
|
|
|
rts
|
|
|
|
;--------------------------------------------------------------------
|
|
|
|
gou_init_vars:
|
|
move.l #gou_cube_advance_scene_standard_movement,pd_CubeSceneRoutinePtr(a6)
|
|
move.w #4*2,pd_AxSpeed(a6)
|
|
move.w #-5*2,pd_AySpeed(a6)
|
|
move.w #-7*2,pd_AzSpeed(a6)
|
|
move.w #CUBE_MAX_SIZE,pd_CubeSize(a6)
|
|
move.w #((CUBE_MAX_SIZE*CUBE_MAX_SIZE)>>8)/GOURAUD_Z_DIST+CULLING_EXT,pd_CubeCullingValue(a6)
|
|
|
|
move.w #237*2,pd_Ax(a6)
|
|
move.w #32*2,pd_Ay(a6)
|
|
move.w #128*2,pd_Az(a6)
|
|
|
|
move.w #300,pd_CubeCosPos(a6)
|
|
|
|
move.l #CUBE_PRECALC_NUM*cd_SIZEOF,d0
|
|
CALLFW AllocFast
|
|
move.l a0,pd_CubePrecalcBuffer(a6)
|
|
move.l a0,pd_CubeDataWritePtr(a6)
|
|
move.l a0,pd_CubeDataReadPtr(a6)
|
|
move.l a0,pd_CubeDataPtr(a6)
|
|
|
|
add.l #CUBE_PRECALC_NUM*cd_SIZEOF,a0
|
|
move.l a0,pd_CubePrecalcBufferEnd(a6)
|
|
|
|
move.l #(COP_LIST_SIZE*2),d0
|
|
CALLFW AllocChip
|
|
move.l a0,pd_CopperList1(a6)
|
|
move.l a0,pd_CurrCopListPtr(a6)
|
|
lea COP_LIST_SIZE(a0),a0
|
|
move.l a0,pd_CopperList2(a6)
|
|
move.l a0,pd_LastCopListPtr(a6)
|
|
|
|
move.l #(CUBE_WIDTH/8)*CUBE_HEIGHT*CUBE_PLANES*NUM_RUBBER_FRAMES,d0
|
|
CALLFW AllocChip
|
|
move.l a0,pd_RubberBuffer(a6)
|
|
|
|
move.l #((CUBE_BUF_WIDTH/8)*CUBE_HEIGHT*CUBE_PLANES)*3,d0
|
|
CALLFW AllocChip
|
|
move.l a0,pd_CubeLineBuffer1(a6)
|
|
move.l a0,pd_CurrCubeLinePtr(a6)
|
|
|
|
lea ((CUBE_BUF_WIDTH/8)*CUBE_HEIGHT*CUBE_PLANES)(a0),a0
|
|
move.l a0,pd_CubeLineBuffer2(a6)
|
|
move.l a0,pd_LastCubeLinePtr(a6)
|
|
|
|
lea ((CUBE_BUF_WIDTH/8)*CUBE_HEIGHT*CUBE_PLANES)(a0),a0
|
|
move.l a0,pd_CubeLineBuffer3(a6)
|
|
move.l a0,pd_LastLastCubeLinePtr(a6)
|
|
|
|
lea gou_gray_shuffle(pc),a2
|
|
lea gou_gray_palette(pc),a0
|
|
lea gou_sorted_palette(pc),a1
|
|
moveq.l #16-1,d7
|
|
.palloop
|
|
move.w (a2)+,d0
|
|
move.w (a1)+,(a0,d0.w)
|
|
dbra d7,.palloop
|
|
|
|
lea gou_gray_shuffle(pc),a2
|
|
lea gou_gray_zebra_palette(pc),a0
|
|
lea gou_zebra_palette(pc),a1
|
|
moveq.l #16-1,d7
|
|
.palloop2
|
|
move.w (a2)+,d0
|
|
move.w (a1)+,(a0,d0.w)
|
|
dbra d7,.palloop2
|
|
|
|
lea pd_BenditSprites(a6),a1
|
|
lea gou_bendit_sprite,a3
|
|
move.l a3,a2
|
|
moveq.l #(BENDIT_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 #BENDIT_HEIGHT,pd_BenditYPos(a6)
|
|
|
|
rts
|
|
|
|
;--------------------------------------------------------------------
|
|
|
|
gou_init_blitter_queue:
|
|
lea gou_bq_InitLineDraw(pc),a0
|
|
move.l a0,pd_BQLineInit+bq_Routine(a6)
|
|
|
|
lea gou_bq_LineDraw(pc),a0
|
|
lea pd_BQLines(a6),a1
|
|
moveq.l #NUM_BQ_LINES-1,d7
|
|
.bqlloop
|
|
move.l a0,bq_Routine(a1)
|
|
move.l #blitter_temp_output_word,bql_BltDPt(a1)
|
|
lea bql_SIZEOF(a1),a1
|
|
dbra d7,.bqlloop
|
|
|
|
lea pd_BQFillCube(a6),a1
|
|
lea gou_bq_FillCube(pc),a0
|
|
move.l a0,bq_Routine(a1)
|
|
move.l #((BLTEN_AD|BLT_A)<<16)|BLTCON1F_EFE|BLTCON1F_DESC,bqfc_BltCon01(a1)
|
|
;move.l #((BLTEN_AD|(~BLT_A&$ff))<<16)|BLTCON1F_EFE|BLTCON1F_DESC,bqfc_BltCon01(a1)
|
|
move.l #(((CUBE_BUF_WIDTH-CUBE_WIDTH)/8)<<16)|((GOURAUD_WIDTH-CUBE_WIDTH)/8),bqfc_BltAMod(a1)
|
|
move.w #((CUBE_WIDTH)>>4)|(((CUBE_HEIGHT-2*CUBE_Y_CLIP)*CUBE_PLANES)<<6),bqfc_BltSize(a1)
|
|
|
|
lea pd_BQClearLineBuffer(a6),a1
|
|
lea gou_bq_Clear(pc),a0
|
|
move.l a0,bq_Routine(a1)
|
|
move.l #((BLTEN_D|BLT_C)<<16),bqc_BltCon01(a1)
|
|
move.w #(CUBE_BUF_WIDTH-CUBE_WIDTH)/8,bqc_BltDMod(a1)
|
|
clr.w bqc_BltCDat(a1)
|
|
move.w #((CUBE_WIDTH)>>4)|(((CUBE_HEIGHT-2*CUBE_Y_CLIP)*CUBE_PLANES)<<6),bqc_BltSize(a1)
|
|
|
|
rts
|
|
|
|
;--------------------------------------------------------------------
|
|
|
|
gou_intro:
|
|
move.w #1,pd_PartCountDown(a6)
|
|
|
|
lea .script(pc),a0
|
|
CALLFW InstallMusicScript
|
|
|
|
PUTMSG 10,<"Main Frame Start %ld">,fw_FrameCounter-2(a6)
|
|
|
|
.loop
|
|
BLTWAIT
|
|
CALLFW TriggerBlitterQueue
|
|
|
|
bsr gou_flip_copperlists
|
|
bsr gou_flip_db_frame
|
|
bsr gou_flip_cube_buffer
|
|
|
|
bsr gou_update_screen_pos
|
|
|
|
move.l pd_CubeDataPtr(a6),a1
|
|
bsr gou_interpolate_outer_cube_lines
|
|
|
|
moveq.l #16,d0
|
|
lea pd_RubberPalette(a6),a1
|
|
CALLFW DoFadePaletteStep
|
|
|
|
move.l pd_CurrCopListPtr(a6),a0
|
|
move.l pd_IntroFrameOffset(a6),d4
|
|
bsr gou_create_main_copperlist_nosprites
|
|
|
|
CALLFW JoinBlitterQueue
|
|
|
|
bsr gou_create_blitter_queue
|
|
CALLFW TerminateBlitterQueue
|
|
|
|
bsr gou_update_copper_list_pointers
|
|
|
|
CALLFW CheckMusicScript
|
|
|
|
CALLFW VSyncWithTask
|
|
tst.w pd_PartCountDown(a6)
|
|
bne .loop
|
|
|
|
add.l #$012302d3,pd_ScreenSinXOffset(a6)
|
|
rts
|
|
|
|
.script
|
|
dc.w 0*6,.flash-*
|
|
dc.w 4*6,.flash-*
|
|
dc.w 8*6,.quitintro-*
|
|
dc.w 0
|
|
|
|
.flash
|
|
add.l #$015102d3,pd_ScreenSinXOffset(a6)
|
|
moveq.l #16,d0
|
|
lea gou_gray_palette(pc),a0
|
|
lea pd_RubberPalette(a6),a1
|
|
CALLFW InitPaletteLerp
|
|
|
|
moveq.l #16,d0
|
|
moveq.l #16,d1
|
|
lea gou_mauve_palette(pc),a0
|
|
lea pd_RubberPalette(a6),a1
|
|
CALLFW FadePaletteTo
|
|
|
|
move.l pd_RubberFrameOffset(a6),pd_IntroFrameOffset(a6)
|
|
|
|
rts
|
|
|
|
.quitintro
|
|
clr.w pd_PartCountDown(a6)
|
|
rts
|
|
|
|
;--------------------------------------------------------------------
|
|
|
|
gou_main:
|
|
move.w #1,pd_PartCountDown(a6)
|
|
|
|
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)
|
|
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)
|
|
|
|
st pd_BenditKilled(a6)
|
|
|
|
moveq.l #16,d0
|
|
lea gou_gray_palette(pc),a0
|
|
lea pd_RubberPalette(a6),a1
|
|
CALLFW InitPaletteLerp
|
|
|
|
lea .script(pc),a0
|
|
CALLFW InstallMusicScript
|
|
|
|
.loop
|
|
BLTWAIT
|
|
CALLFW TriggerBlitterQueue
|
|
|
|
bsr gou_flip_copperlists
|
|
bsr gou_flip_db_frame
|
|
bsr gou_flip_cube_buffer
|
|
|
|
bsr gou_update_screen_pos
|
|
|
|
cmp.w #NUM_RUBBER_FRAMES,pd_NumRubberFrames(a6)
|
|
beq.s .norubadd
|
|
addq.w #1,pd_NumRubberFrames(a6)
|
|
.norubadd
|
|
|
|
move.l pd_CubeDataPtr(a6),a1
|
|
bsr gou_interpolate_outer_cube_lines
|
|
|
|
bsr gou_update_bendit_sprites
|
|
|
|
moveq.l #16,d0
|
|
lea pd_RubberPalette(a6),a1
|
|
CALLFW DoFadePaletteStep
|
|
|
|
move.l pd_CurrCopListPtr(a6),a0
|
|
move.l pd_RubberFrameOffset(a6),d4
|
|
bsr gou_create_main_copperlist
|
|
|
|
CALLFW JoinBlitterQueue
|
|
|
|
bsr gou_create_blitter_queue
|
|
CALLFW TerminateBlitterQueue
|
|
|
|
bsr gou_update_copper_list_pointers
|
|
|
|
CALLFW CheckMusicScript
|
|
|
|
CALLFW VSyncWithTask
|
|
tst pd_PartCountDown(a6)
|
|
bne .loop
|
|
|
|
st pd_QuitAsyncTask(a6)
|
|
rts
|
|
|
|
.script
|
|
dc.w 48+32*6,.benditon-*
|
|
dc.w 432,.benditoff-*
|
|
dc.w 432+32*6,.fadezebra-*
|
|
dc.w (8+3*64)*6-32-15,.startclearing-*
|
|
dc.w (8+3*64)*6-15,.quitmain-*
|
|
dc.w 0
|
|
|
|
.benditon
|
|
clr.w pd_BenditKilled(a6)
|
|
rts
|
|
|
|
.benditoff
|
|
st pd_BenditKilled(a6)
|
|
rts
|
|
|
|
.fadezebra
|
|
move.w #-9*2,pd_AxSpeed(a6)
|
|
move.w #-5*2,pd_AySpeed(a6)
|
|
move.w #6*2,pd_AzSpeed(a6)
|
|
|
|
moveq.l #16,d0
|
|
moveq.l #16,d1
|
|
lea gou_gray_zebra_palette(pc),a0
|
|
lea pd_RubberPalette(a6),a1
|
|
CALLFW FadePaletteTo
|
|
rts
|
|
|
|
.startclearing
|
|
move.l #((BLTEN_D)<<16)|BLTCON1F_DESC,pd_BQFillCube+bqfc_BltCon01(a6)
|
|
moveq.l #16,d0
|
|
moveq.l #32,d1
|
|
lea gou_black_palette(pc),a0
|
|
lea pd_RubberPalette(a6),a1
|
|
CALLFW FadePaletteTo
|
|
rts
|
|
|
|
.quitmain
|
|
clr.w pd_PartCountDown(a6)
|
|
rts
|
|
|
|
;--------------------------------------------------------------------
|
|
|
|
gou_update_screen_pos:
|
|
move.l fw_SinTable(a6),a0
|
|
move.w pd_ScreenSinXOffset(a6),d0
|
|
move.w pd_ScreenSinYOffset(a6),d1
|
|
addq.w #8,d0
|
|
add.w #11,d1
|
|
move.w d0,pd_ScreenSinXOffset(a6)
|
|
move.w d1,pd_ScreenSinYOffset(a6)
|
|
and.w #1023*2,d0
|
|
and.w #1023*2,d1
|
|
move.w (a0,d0.w),d0
|
|
move.w (a0,d1.w),d1
|
|
muls #176*2,d0
|
|
muls #52*2,d1
|
|
swap d0
|
|
swap d1
|
|
move.w d0,pd_ScreenX(a6)
|
|
move.b d1,pd_ScreenY(a6)
|
|
rts
|
|
|
|
;--------------------------------------------------------------------
|
|
|
|
gou_update_bendit_sprites:
|
|
lea pd_BenditSprites(a6),a2
|
|
|
|
moveq.l #0,d0
|
|
moveq.l #0,d1
|
|
tst.w pd_BenditKilled(a6)
|
|
bne.s .filldata
|
|
|
|
move.w #128+160-(BENDIT_WIDTH/2),d4
|
|
sub.w pd_ScreenX(a6),d4
|
|
move.b pd_ScreenY(a6),d1
|
|
ext.w d1
|
|
|
|
add.w #$6c,d1
|
|
|
|
move.w d1,d2
|
|
add.w #BENDIT_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 (BENDIT_WIDTH/16)
|
|
move.l (a2)+,a0
|
|
move.w d1,(a0)+
|
|
move.w d0,(a0)+
|
|
addq.w #8,d1
|
|
ENDR
|
|
rts
|
|
|
|
;--------------------------------------------------------------------
|
|
|
|
gou_create_blitter_queue:
|
|
lea pd_BQClearLineBuffer(a6),a0
|
|
move.l pd_LastCubeLinePtr(a6),a1
|
|
lea CUBE_Y_CLIP*(CUBE_BUF_WIDTH/8)*CUBE_PLANES(a1),a1
|
|
move.l a1,bqc_BltDPt(a0)
|
|
CALLFW AddToBlitterQueue
|
|
|
|
clr.l pd_BQLineInit+bq_Next(a6)
|
|
move.l pd_CubeDataPtr(a6),a1
|
|
bsr gou_draw_inner_lines
|
|
|
|
lea pd_BQFillCube(a6),a0
|
|
move.l pd_LastPlanesPtr(a6),a1
|
|
add.l #((CUBE_X_OFFSET+CUBE_WIDTH-16)/8)+(CUBE_Y_OFFSET+CUBE_HEIGHT-CUBE_Y_CLIP-1)*(GOURAUD_WIDTH/8)*GOURAUD_PLANES+(GOURAUD_WIDTH/8)*(GOURAUD_PLANES-1),a1
|
|
move.l a1,bqfc_BltDPt(a0)
|
|
|
|
move.l pd_CurrCubeLinePtr(a6),a1
|
|
lea (CUBE_WIDTH-16)/8+(CUBE_HEIGHT-CUBE_Y_CLIP-1)*(CUBE_BUF_WIDTH/8)*CUBE_PLANES+(CUBE_BUF_WIDTH/8)*(CUBE_PLANES-1)(a1),a1
|
|
move.l a1,bqfc_BltAPt(a0)
|
|
CALLFW AddToBlitterQueue
|
|
.skip
|
|
rts
|
|
|
|
;--------------------------------------------------------------------
|
|
|
|
gou_flip_copperlists:
|
|
move.l pd_CurrCopListPtr(a6),pd_LastCopListPtr(a6)
|
|
not.b pd_CopListToggle(a6)
|
|
beq.s .selb1
|
|
move.l pd_CopperList2(a6),pd_CurrCopListPtr(a6)
|
|
rts
|
|
.selb1
|
|
move.l pd_CopperList1(a6),pd_CurrCopListPtr(a6)
|
|
rts
|
|
|
|
gou_flip_db_frame:
|
|
move.l pd_CurrPlanesPtr(a6),pd_LastPlanesPtr(a6)
|
|
move.l pd_LastCubeLinePtr(a6),pd_LastLastCubeLinePtr(a6)
|
|
move.l pd_CurrCubeLinePtr(a6),pd_LastCubeLinePtr(a6)
|
|
move.l pd_RubberBuffer(a6),a0
|
|
not.b pd_DbToggle(a6)
|
|
move.l pd_RubberFrameOffset(a6),d0
|
|
add.l #(CUBE_WIDTH/8)*CUBE_HEIGHT*CUBE_PLANES,d0
|
|
cmp.l #((CUBE_WIDTH/8)*CUBE_HEIGHT*CUBE_PLANES*NUM_RUBBER_FRAMES),d0
|
|
bne.s .goodframe
|
|
moveq.l #0,d0
|
|
.goodframe
|
|
move.l d0,pd_RubberFrameOffset(a6)
|
|
adda.l d0,a0
|
|
move.l a0,pd_CurrPlanesPtr(a6)
|
|
|
|
move.b pd_CubeBufToggle(a6),d0
|
|
subq.b #1,d0
|
|
bmi.s .cb2
|
|
beq.s .cb1
|
|
.cb3
|
|
move.l pd_CubeLineBuffer3(a6),pd_CurrCubeLinePtr(a6)
|
|
move.b d0,pd_CubeBufToggle(a6)
|
|
rts
|
|
.cb2
|
|
move.l pd_CubeLineBuffer2(a6),pd_CurrCubeLinePtr(a6)
|
|
move.b #2,pd_CubeBufToggle(a6)
|
|
rts
|
|
.cb1
|
|
move.b d0,pd_CubeBufToggle(a6)
|
|
move.l pd_CubeLineBuffer1(a6),pd_CurrCubeLinePtr(a6)
|
|
rts
|
|
|
|
;--------------------------------------------------------------------
|
|
|
|
gou_update_copper_list_pointers:
|
|
lea gou_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
|
|
|
|
;--------------------------------------------------------------------
|
|
|
|
gou_create_main_copperlist:
|
|
lea pd_BenditSprites(a6),a1
|
|
move.w #sprpt,d1
|
|
moveq.l #(BENDIT_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
|
|
|
|
gou_create_main_copperlist_nosprites:
|
|
lea pd_RubberPalette(a6),a1
|
|
moveq.l #16-1,d7
|
|
move.w #color,d1
|
|
.palloop
|
|
move.w d1,(a0)+
|
|
move.w cl_Color(a1),(a0)+
|
|
lea cl_SIZEOF(a1),a1
|
|
addq.w #2,d1
|
|
dbra d7,.palloop
|
|
|
|
COPIMOVE $4200,bplcon0
|
|
|
|
move.l pd_RubberBuffer(a6),a1
|
|
|
|
move.w pd_ScreenX(a6),d0
|
|
moveq.l #16,d2
|
|
moveq.l #15,d1
|
|
sub.w d0,d2
|
|
and.w d1,d2 ; lower 4 bit
|
|
move.w d2,d5
|
|
lsl.w #4,d5
|
|
or.w d5,d2
|
|
COPRMOVE d2,bplcon1
|
|
add.w d1,d0
|
|
asr.w #4,d0
|
|
lsl.w #3,d0
|
|
neg.w d0
|
|
|
|
add.w #$68,d0
|
|
COPRMOVE d0,ddfstrt
|
|
add.w #$a0-$68,d0
|
|
COPRMOVE d0,ddfstop
|
|
|
|
move.w #$6c81,d0
|
|
move.w pd_ScreenY(a6),d1
|
|
add.w d1,d0
|
|
COPRMOVE d0,diwstrt
|
|
add.w #(CUBE_HEIGHT<<8)|($c1-$81),d0
|
|
COPRMOVE d0,diwstop
|
|
|
|
moveq.l #-2,d3
|
|
moveq.l #CUBE_WIDTH/8,d2
|
|
move.l #((CUBE_WIDTH/8)*CUBE_HEIGHT*CUBE_PLANES*NUM_RUBBER_FRAMES),d5
|
|
move.l #(CUBE_WIDTH/8)*(CUBE_HEIGHT+4)*CUBE_PLANES,d6
|
|
sub.w #((CUBE_HEIGHT)<<8)-($07-$c1),d0
|
|
;move.w #$6bd5,d0
|
|
move.w pd_NumRubberFrames(a6),d7
|
|
.cprloop
|
|
lea (a1,d4.l),a2
|
|
COPPTMOVE a2,bplpt+0*4,d1
|
|
adda.l d2,a2
|
|
COPPTMOVE a2,bplpt+1*4,d1
|
|
adda.l d2,a2
|
|
COPPTMOVE a2,bplpt+2*4,d1
|
|
adda.l d2,a2
|
|
COPPTMOVE a2,bplpt+3*4,d1
|
|
|
|
add.l d6,d4
|
|
cmp.l d5,d4
|
|
blt.s .nowrap
|
|
sub.l d5,d4
|
|
.nowrap
|
|
add.w #$400,d0
|
|
bcc.s .no255
|
|
move.l #$ffdffffe,(a0)+
|
|
.no255
|
|
move.w d0,(a0)+
|
|
move.w d3,(a0)+
|
|
dbra d7,.cprloop
|
|
|
|
move.b #$38,d0
|
|
move.w #$100,d2
|
|
|
|
move.l d3,(a0)
|
|
rts
|
|
|
|
;--------------------------------------------------------------------
|
|
|
|
gou_clear_cube_line_buffer:
|
|
moveq.l #-1,d2
|
|
|
|
BLTHOGON
|
|
BLTWAIT
|
|
BLTHOGOFF
|
|
BLTCON_SET D,0,0,0
|
|
move.w #0,bltdmod(a5)
|
|
move.l pd_CurrCubeLinePtr(a6),bltdpt(a5)
|
|
move.w #((CUBE_BUF_WIDTH)>>4)|(((CUBE_HEIGHT)*CUBE_PLANES)<<6),bltsize(a5)
|
|
rts
|
|
|
|
;--------------------------------------------------------------------
|
|
|
|
gou_clear_rubber_buffers:
|
|
BLTHOGON
|
|
BLTWAIT
|
|
BLTHOGOFF
|
|
BLTCON_SET D,0,0,0
|
|
move.w #0,bltdmod(a5)
|
|
move.l pd_RubberBuffer(a6),bltdpt(a5)
|
|
move.w #(((CUBE_WIDTH*8)&1023)>>4)|(((CUBE_HEIGHT*CUBE_PLANES*2)&1023)<<6),bltsize(a5)
|
|
CALLFW VSyncWithTask
|
|
CALLFW VSyncWithTask
|
|
BLTWAIT
|
|
move.w #(((CUBE_WIDTH*8)&1023)>>4)|(((CUBE_HEIGHT*CUBE_PLANES*2)&1023)<<6),bltsize(a5)
|
|
CALLFW VSyncWithTask
|
|
CALLFW VSyncWithTask
|
|
rts
|
|
|
|
;--------------------------------------------------------------------
|
|
|
|
gou_flip_cube_buffer:
|
|
move.l pd_CubeDataReadPtr(a6),a0
|
|
move.l a0,pd_CubeDataPtr(a6)
|
|
|
|
lea cd_SIZEOF(a0),a1
|
|
cmp.l pd_CubePrecalcBufferEnd(a6),a1
|
|
bne.s .nowrap
|
|
move.l pd_CubePrecalcBuffer(a6),a1
|
|
.nowrap
|
|
move.l a1,pd_CubeDataReadPtr(a6)
|
|
|
|
IF DEBUG_DETAIL
|
|
move.w pd_PrecalculatedFrames(a6),d0
|
|
cmp.w #10,d0
|
|
bgt.s .okay
|
|
PUTMSG 10,<"pd_PrecalculatedFrames=%d">,d0
|
|
.okay
|
|
ENDC
|
|
subq.w #1,pd_PrecalculatedFrames(a6)
|
|
rts
|
|
|
|
;--------------------------------------------------------------------
|
|
|
|
gou_async_calc_task:
|
|
PUTMSG 10,<"%d: async_calc_task">,fw_FrameCounter-2(a6)
|
|
move.l pd_CubeDataPtr(a6),a1
|
|
moveq.l #CUBE_PRECALC_NUM-1,d7
|
|
.cdloop
|
|
lea cd_IntCubeLines(a1),a0
|
|
PUTMSG 20,<"IntCubeLines %p (%ld)">,a0,#il_SIZEOF
|
|
lea gou_cube_lines(pc),a2
|
|
moveq.l #12-1,d6
|
|
.icloop move.l (a2)+,il_FromCoord(a0) ; and il_ToCoord
|
|
lea il_SIZEOF(a0),a0
|
|
dbra d6,.icloop
|
|
lea cd_SIZEOF(a1),a1
|
|
dbra d7,.cdloop
|
|
|
|
.loop
|
|
.fillup
|
|
move.w pd_CalculatedCubeFrames(a6),d0
|
|
cmp.w #CUBE_PRECALC_NUM-1,pd_PrecalculatedFrames(a6)
|
|
bge.s .skipprecalc
|
|
addq.w #1,d0
|
|
move.w d0,pd_CalculatedCubeFrames(a6)
|
|
move.l pd_CubeDataWritePtr(a6),a0
|
|
lea cd_SIZEOF(a0),a1
|
|
cmp.l pd_CubePrecalcBufferEnd(a6),a1
|
|
bne.s .nowrap
|
|
move.l pd_CubePrecalcBuffer(a6),a1
|
|
.nowrap
|
|
PUTMSG 40,<"Precalcing frame %p">,pd_CubeDataWritePtr(a6)
|
|
PUSHM a1
|
|
move.l pd_CubeSceneRoutinePtr(a6),a0
|
|
jsr (a0)
|
|
move.l pd_CubeDataWritePtr(a6),a1
|
|
bsr gou_calculate_cube_stuff
|
|
bsr gou_interpolate_inner_cube_lines
|
|
POPM
|
|
|
|
move.l a1,pd_CubeDataWritePtr(a6)
|
|
addq.w #1,pd_PrecalculatedFrames(a6)
|
|
bra .fillup
|
|
.skipprecalc
|
|
.bufferfull
|
|
|
|
CALLFW Yield
|
|
|
|
tst.w pd_QuitAsyncTask(a6)
|
|
beq .loop
|
|
|
|
PUTMSG 10,<"Async-Task terminates...">
|
|
rts
|
|
|
|
;--------------------------------------------------------------------
|
|
|
|
MaxVerts = 8
|
|
MaxPlanes = 6
|
|
MaxLines = 12
|
|
|
|
PERSP2D MACRO ;final projection from world to screen coords
|
|
neg.w d2 ;world +z is forward,screen perspective is away
|
|
move.w d2,-(sp)
|
|
move.b (sp)+,d2 ; shift d2 8 bits down
|
|
ext.w d2
|
|
add.w #GOURAUD_Z_DIST,d2 ; 78 and eye Z determines Field of View.
|
|
divs d2,d0
|
|
divs d2,d1
|
|
add.w #CUBE_WIDTH/2,d0 ;center horizontally on the screen
|
|
;asr.w #1,d0
|
|
add.w #CUBE_HEIGHT/2,d1 ;center vertically
|
|
;asr.w #1,d1
|
|
ENDM
|
|
|
|
gou_calculate_cube_stuff:
|
|
PUTMSG 50,<"Out CD %p">,a1
|
|
; rotate 3D object
|
|
bsr gou_rotate_cube
|
|
|
|
lea cd_CubeNormals-6+4(a1),a2
|
|
lea gou_cube_plane_coords(pc),a3 ; calculate which planes use which coords
|
|
moveq.l #-1,d1
|
|
lea cd_PlanesToDraw(a1),a0
|
|
move.l d1,(a0)
|
|
move.w pd_CubeCullingValue(a6),d5
|
|
moveq.l #0,d1 ; coords in use
|
|
moveq.l #0,d2 ; lines in use
|
|
moveq.l #0,d3 ; inner lines
|
|
moveq.l #MaxPlanes-1,d7
|
|
.planeloop1
|
|
addq.w #6,a2
|
|
move.l (a3)+,d0
|
|
cmp.w (a2),d5
|
|
dbmi d7,.planeloop1
|
|
bpl .doneculling
|
|
move.b d7,(a0)+ ; write down first plane number (5 and decreasing)
|
|
move.w d0,d1 ; coordinates used for first plane
|
|
swap d0
|
|
move.w d0,d2
|
|
subq.w #1,d7
|
|
bmi .doneculling
|
|
|
|
.planeloop2
|
|
addq.w #6,a2
|
|
move.l (a3)+,d0
|
|
cmp.w (a2),d5
|
|
dbmi d7,.planeloop2
|
|
bpl .doneculling
|
|
move.b d7,(a0)+ ; write down second plane number (4 and decreasing)
|
|
or.w d0,d1 ; or coordinates used for second plane
|
|
swap d0
|
|
move.w d0,d4
|
|
and.w d2,d4
|
|
or.w d4,d3 ; inner lines
|
|
or.w d0,d2 ; used lines
|
|
subq.w #1,d7
|
|
bmi.s .doneculling
|
|
|
|
.planeloop3
|
|
addq.w #6,a2
|
|
move.l (a3)+,d0
|
|
cmp.w (a2),d5
|
|
dbmi d7,.planeloop3
|
|
bpl.s .doneculling
|
|
move.b d7,(a0)+ ; write down third plane number (3 and decreasing)
|
|
|
|
or.w d0,d1 ; or coordinates used for third plane
|
|
swap d0
|
|
move.w d0,d4
|
|
and.w d2,d4
|
|
or.w d4,d3 ; inner lines
|
|
or.w d0,d2 ; used lines
|
|
|
|
.doneculling
|
|
move.w d2,cd_LinesToDraw(a1)
|
|
move.w d3,cd_InnerLines(a1)
|
|
move.w d1,d7 ; save coordinate mask for loop below
|
|
|
|
; do projection on required coordinates
|
|
lea cd_Coords(a1),a0 ; rotated vertices
|
|
lea cd_ProjCoords(a1),a2 ; projected coords
|
|
bra.s .vertexl
|
|
.skip
|
|
beq.s .done
|
|
addq.w #6,a0
|
|
addq.w #4,a2
|
|
.vertexl
|
|
lsr.w #1,d7
|
|
bcc.s .skip
|
|
movem.w (a0)+,d0-d2 ; x0,y0,z0
|
|
PERSP2D ; d0/d1 result, d2 trashed
|
|
PUTMSG 50,<"Proj %d,%d">,d0,d1
|
|
move.w d0,(a2)+
|
|
move.w d1,(a2)+
|
|
bra.s .vertexl
|
|
.done rts
|
|
|
|
;--------------------------------------------------------------------
|
|
|
|
SETGRAYCOL0 MACRO
|
|
; 0
|
|
ENDM
|
|
|
|
SETGRAYCOL1 MACRO
|
|
; 1
|
|
bchg d7,(a4)
|
|
ENDM
|
|
|
|
SETGRAYCOL2 MACRO
|
|
; 3
|
|
bchg d7,(a4)
|
|
bchg d7,1*(CUBE_BUF_WIDTH/8)(a4)
|
|
ENDM
|
|
|
|
SETGRAYCOL3 MACRO
|
|
; 7
|
|
bchg d7,(a4)
|
|
bchg d7,1*(CUBE_BUF_WIDTH/8)(a4)
|
|
bchg d7,2*(CUBE_BUF_WIDTH/8)(a4)
|
|
ENDM
|
|
|
|
SETGRAYCOL4 MACRO
|
|
; 15
|
|
bchg d7,(a4)
|
|
bchg d7,1*(CUBE_BUF_WIDTH/8)(a4)
|
|
bchg d7,2*(CUBE_BUF_WIDTH/8)(a4)
|
|
bchg d7,3*(CUBE_BUF_WIDTH/8)(a4)
|
|
ENDM
|
|
|
|
SETGRAYCOL5 MACRO
|
|
; 11
|
|
bchg d7,(a4)
|
|
bchg d7,1*(CUBE_BUF_WIDTH/8)(a4)
|
|
bchg d7,3*(CUBE_BUF_WIDTH/8)(a4)
|
|
ENDM
|
|
|
|
SETGRAYCOL6 MACRO
|
|
; 9
|
|
bchg d7,(a4)
|
|
bchg d7,3*(CUBE_BUF_WIDTH/8)(a4)
|
|
ENDM
|
|
|
|
SETGRAYCOL7 MACRO
|
|
; 8
|
|
bchg d7,3*(CUBE_BUF_WIDTH/8)(a4)
|
|
ENDM
|
|
|
|
SETGRAYCOL8 MACRO
|
|
; 12
|
|
bchg d7,2*(CUBE_BUF_WIDTH/8)(a4)
|
|
bchg d7,3*(CUBE_BUF_WIDTH/8)(a4)
|
|
ENDM
|
|
|
|
SETGRAYCOL9 MACRO
|
|
; 13
|
|
bchg d7,0*(CUBE_BUF_WIDTH/8)(a4)
|
|
bchg d7,2*(CUBE_BUF_WIDTH/8)(a4)
|
|
bchg d7,3*(CUBE_BUF_WIDTH/8)(a4)
|
|
ENDM
|
|
|
|
SETGRAYCOL10 MACRO
|
|
; 5
|
|
bchg d7,0*(CUBE_BUF_WIDTH/8)(a4)
|
|
bchg d7,2*(CUBE_BUF_WIDTH/8)(a4)
|
|
ENDM
|
|
|
|
SETGRAYCOL11 MACRO
|
|
; 4
|
|
bchg d7,2*(CUBE_BUF_WIDTH/8)(a4)
|
|
ENDM
|
|
|
|
SETGRAYCOL12 MACRO
|
|
; 6
|
|
bchg d7,1*(CUBE_BUF_WIDTH/8)(a4)
|
|
bchg d7,2*(CUBE_BUF_WIDTH/8)(a4)
|
|
ENDM
|
|
|
|
SETGRAYCOL13 MACRO
|
|
; 14
|
|
bchg d7,1*(CUBE_BUF_WIDTH/8)(a4)
|
|
bchg d7,2*(CUBE_BUF_WIDTH/8)(a4)
|
|
bchg d7,3*(CUBE_BUF_WIDTH/8)(a4)
|
|
ENDM
|
|
|
|
SETGRAYCOL14 MACRO
|
|
; 10
|
|
bchg d7,1*(CUBE_BUF_WIDTH/8)(a4)
|
|
bchg d7,3*(CUBE_BUF_WIDTH/8)(a4)
|
|
ENDM
|
|
|
|
SETGRAYCOL15 MACRO
|
|
; 2
|
|
bchg d7,1*(CUBE_BUF_WIDTH/8)(a4)
|
|
ENDM
|
|
|
|
LINEDRAWSELECT MACRO
|
|
add.w d1,d1 ; 2*dx
|
|
move.w d2,d0 ; dy will become loopcount
|
|
subq.w #1,d0 ; loopcount
|
|
bmi .linedone
|
|
ENDM
|
|
|
|
LINEDRAW MACRO
|
|
.enter\1
|
|
PUTMSG 50,<"dtdz=%lx, dcol=%lx, zerror=%lx">,d5,a3,d6
|
|
move.l d5,a1 ; dtdz
|
|
move.w d2,d5 ; error = dy
|
|
add.w d2,d2 ; 2*dy
|
|
subq.w #1,d4
|
|
.yloop\@
|
|
PUTMSG 50,<"dtdz=%lx, dcol=%lx, zerror=%lx x=%d, y=%d">,a1,a3,d6,d3,d4
|
|
lea (CUBE_BUF_WIDTH/8)*CUBE_PLANES(a4),a4
|
|
addq.w #1,d4 ; !!!!! ypos++
|
|
|
|
sub.w d1,d5 ; error -= 2 * dx
|
|
bpl.s .nox\@
|
|
sub.l a3,d6 ; zerror -= dcol (for y movement)
|
|
.morex\@
|
|
IFGT \3
|
|
addq.w #1,d3 ; !!!!! xpos++
|
|
subq.w #1,d7 ; bitpos
|
|
bpl.s .noai\@
|
|
moveq.l #7,d7
|
|
addq.w #1,a4
|
|
ELSE
|
|
subq.w #1,d3 ; !!!!! xpos--
|
|
addq.w #1,d7 ; bitpos
|
|
bne.s .noai\@
|
|
moveq.l #-8,d7
|
|
subq.w #1,a4
|
|
ENDC
|
|
.noai\@
|
|
|
|
sub.l a3,d6 ; zerror -= dcol (for x movement)
|
|
bpl.s .nozm\@
|
|
add.w d2,d5 ; error += 2 * dy
|
|
.morez\1
|
|
.morez\@
|
|
PUTMSG 40,<"\1 ->> \2 LinePoint %d,%d %lx">,d3,d4,d6
|
|
move.w d4,(a2)+ ; add line point ypos
|
|
move.w d3,(a2)+ ; add line point xpos
|
|
add.l a1,d6 ; zerror += dtdz
|
|
bmi.s .morez\2
|
|
tst.w d5
|
|
bra.s .nozm\2
|
|
.nozm\@ add.w d2,d5 ; error += 2 * dy
|
|
.nozm\1
|
|
bmi.s .morex\@
|
|
bra.s .ldone\@
|
|
.nox\@
|
|
sub.l a3,d6 ; zerror -= dcol (for y movement)
|
|
bmi.s .morez\@
|
|
.ldone\@
|
|
SETGRAYCOL\4
|
|
|
|
dbra d0,.yloop\@
|
|
bra .linedone
|
|
ENDM
|
|
|
|
LINEDRAW_SC MACRO
|
|
.enter\1
|
|
move.w d2,d5 ; error = dy
|
|
add.w d2,d2 ; 2*dy
|
|
.yloop\@
|
|
lea (CUBE_BUF_WIDTH/8)*CUBE_PLANES(a4),a4
|
|
sub.w d1,d5 ; error -= 2 * dx
|
|
bpl.s .ldone\@
|
|
.morex\@
|
|
IFGT \2
|
|
subq.w #1,d7 ; bitpos
|
|
bpl.s .noai\@
|
|
moveq.l #7,d7
|
|
addq.w #1,a4
|
|
ELSE
|
|
addq.w #1,d7 ; bitpos
|
|
bne.s .noai\@
|
|
moveq.l #-8,d7
|
|
subq.w #1,a4
|
|
ENDC
|
|
.noai\@
|
|
add.w d2,d5 ; error += 2 * dy
|
|
bmi.s .morex\@
|
|
.ldone\@
|
|
SETGRAYCOL\3
|
|
|
|
dbra d0,.yloop\@
|
|
bra .linedone
|
|
ENDM
|
|
|
|
|
|
ZEROIPOL MACRO
|
|
subq.w #1,d1 ; loopcount
|
|
.xloop\@
|
|
IFGT \1
|
|
addq.w #1,d3 ; !!!!! xpos++
|
|
ELSE
|
|
subq.w #1,d3 ; !!!!! xpos--
|
|
ENDC
|
|
sub.l d0,d6 ; zerror -= dcol (for y movement)
|
|
dbmi d1,.xloop\@
|
|
bpl .linedone
|
|
.morez\@
|
|
PUTMSG 40,<"LinePoint %d,%d">,d3,d4
|
|
move.w d4,(a2)+ ; add line point ypos
|
|
move.w d3,(a2)+ ; add line point xpos
|
|
add.l d5,d6 ; zerror += dtdz
|
|
dbmi d1,.xloop\@
|
|
bmi.s .morez\@
|
|
bra .linedone
|
|
ENDM
|
|
|
|
|
|
;--------------------------------------------------------------------
|
|
; a1 = cubedata
|
|
gou_interpolate_outer_cube_lines:
|
|
PUTMSG 20,<"%d: ----- gou_interpolate_outer_cube_lines">,fw_FrameCounter-2(a6)
|
|
move.w cd_LinesToDraw(a1),d7
|
|
sub.w cd_InnerLines(a1),d7
|
|
bne.s .cont
|
|
rts
|
|
.cont
|
|
lea cd_IntCubeLines(a1),a0
|
|
lea cd_ProjCoords(a1),a2
|
|
lea cd_Coords(a1),a3 ; z coords
|
|
move.l pd_CurrCubeLinePtr(a6),a4
|
|
.loop
|
|
PUTMSG 20,<"Line %x">,d7
|
|
lsr.w #1,d7
|
|
bcc .skipline
|
|
|
|
PUSHM d7/a1-a4
|
|
|
|
PUTMSG 40,<"%p/%p/%p/%p From/To %d - %d">,a0,a1,a2,a3,il_FromCoord-2(a0),il_ToCoord-2(a0)
|
|
|
|
move.w #GOURAUD_Z_ADD,d2
|
|
move.w il_FromCoord(a0),d0
|
|
move.l (a2,d0.w),il_FromX(a0)
|
|
lsr.w #1,d0
|
|
add.w il_FromCoord(a0),d0
|
|
move.w 2*2(a3,d0.w),d0
|
|
add.w d2,d0
|
|
move.w d0,il_FromZ(a0)
|
|
|
|
move.w il_ToCoord(a0),d1
|
|
move.l (a2,d1.w),il_ToX(a0)
|
|
lsr.w #1,d1
|
|
add.w il_ToCoord(a0),d1
|
|
move.w 2*2(a3,d1.w),d1
|
|
add.w d2,d1
|
|
move.w d1,il_ToZ(a0)
|
|
|
|
move.w d0,d2
|
|
eor.w d1,d2
|
|
cmp.w #1<<gouraudColShift,d2
|
|
blt .samecolorspecialcase
|
|
|
|
PUTMSG 40,<"Z from %d to %d">,d0,d1
|
|
|
|
lea il_Coords(a0),a2
|
|
|
|
move.w d0,d6 ; will become zpos
|
|
|
|
sub.w d1,d0 ; deltaz
|
|
neg.w d0
|
|
|
|
move.w il_ToX(a0),d1
|
|
move.w il_FromX(a0),d3 ; startx
|
|
sub.w d3,d1 ; deltax
|
|
move.w il_ToY(a0),d2
|
|
move.w il_FromY(a0),d4
|
|
sub.w d4,d2 ; deltay
|
|
smi il_Flipped(a0)
|
|
beq .zerody
|
|
bpl.s .noflipy
|
|
neg.w d0 ; flip deltaz
|
|
neg.w d1 ; flip deltax
|
|
neg.w d2 ; flip deltay
|
|
move.w il_ToX(a0),d3 ; swap startx
|
|
move.w il_ToY(a0),d4 ; swap starty
|
|
move.w il_ToZ(a0),d6 ; swap zpos
|
|
.noflipy
|
|
PUTMSG 40,<"X/Y/Z=%d,%d,%d, DX/DY/DZ = %d/%d/%d">,d3,d4,d6,d1,d2,d0
|
|
move.w d6,d7
|
|
lsr.w #8,d7
|
|
lsr.w #16-(gouraudErrShift+8),d7 ; col
|
|
lsl.w #gouraudErrShift,d6 ; zpos
|
|
|
|
tst.w d0 ; deltaz
|
|
smi il_DzNeg(a0)
|
|
bmi.s .noflipz
|
|
not.w d6 ; $ffff - zpos
|
|
neg.w d0 ; deltaz now negative
|
|
.noflipz
|
|
neg.w d0 ; abs(deltaz)
|
|
ext.l d0
|
|
lsl.l #gouraudErrShift,d0 ; dcol
|
|
|
|
PUTMSG 40,<"Col=%d, dcol=%ld, zpos=%x">,d7,d0,d6
|
|
|
|
moveq.l #0,d5 ; dtdz
|
|
move.w d1,d5
|
|
bpl.s .noabsx
|
|
neg.w d5 ; abs(dx)
|
|
.noabsx
|
|
add.w d2,d5 ; abs(dx)+dy (dy always positive)
|
|
|
|
mulu d5,d6 ; zerror = (dtdz>>16)*zpos
|
|
swap d5 ; now really dtdz
|
|
|
|
lsl.w #2,d7 ; calculate color start routine
|
|
move.w d7,a1
|
|
|
|
move.l d0,a3
|
|
move.w d4,d0
|
|
lsl.w #6,d0 ; replaced mulu by shift
|
|
;mulu #(CUBE_BUF_WIDTH/8)*CUBE_PLANES,d0
|
|
adda.w d0,a4 ; start pos y
|
|
|
|
moveq.l #7,d7
|
|
and.w d3,d7
|
|
move.w d3,d0
|
|
lsr.w #3,d0
|
|
adda.w d0,a4
|
|
|
|
tst.w d1 ; dx?
|
|
bmi .downleft
|
|
|
|
.downright
|
|
; d0.w = loopcount.w
|
|
; d1.w = dx -> 2*dx.w
|
|
; d2.w = dy -> 2*dy.w
|
|
; d3.w = xpos -> xpos.w
|
|
; d4.w = ypos -> ypos.w
|
|
; d5.l = dtdz -> error.w
|
|
; d6.l = zerror.l
|
|
; d7.l = bitpos
|
|
; a1.l = dtdz.l
|
|
; a2.l = line output pointer
|
|
; a3.l = dcol.l
|
|
; a4.l = bitplane pointer
|
|
|
|
eor.w #7,d7
|
|
|
|
tst.b il_DzNeg(a0)
|
|
bmi.s .downright_neg
|
|
|
|
LINEDRAWSELECT
|
|
jmp .ruptab(pc,a1.w)
|
|
.ruptab
|
|
bra.w .enterrupm3
|
|
bra.w .enterrupm2
|
|
bra.w .enterrupm1
|
|
bra.w .enterrup0
|
|
bra.w .enterrup1
|
|
bra.w .enterrup2
|
|
bra.w .enterrup3
|
|
bra.w .enterrup4
|
|
bra.w .enterrup5
|
|
bra.w .enterrup6
|
|
bra.w .enterrup7
|
|
bra.w .enterrup8
|
|
bra.w .enterrup9
|
|
bra.w .enterrup10
|
|
bra.w .enterrup11
|
|
bra.w .enterrup12
|
|
bra.w .enterrup13
|
|
bra.w .enterrup14
|
|
bra.w .enterrup15
|
|
bra.w .enterrup15
|
|
bra.w .enterrup15
|
|
bra.w .enterrup15
|
|
bra.w .enterrup15
|
|
bra.w .enterrup15
|
|
|
|
.downright_neg
|
|
LINEDRAWSELECT
|
|
jmp .rdowntab(pc,a1.w)
|
|
.rdowntab
|
|
bra.w .enterrdown0
|
|
bra.w .enterrdown0
|
|
bra.w .enterrdown0
|
|
bra.w .enterrdown0
|
|
bra.w .enterrdown1
|
|
bra.w .enterrdown2
|
|
bra.w .enterrdown3
|
|
bra.w .enterrdown4
|
|
bra.w .enterrdown5
|
|
bra.w .enterrdown6
|
|
bra.w .enterrdown7
|
|
bra.w .enterrdown8
|
|
bra.w .enterrdown9
|
|
bra.w .enterrdown10
|
|
bra.w .enterrdown11
|
|
bra.w .enterrdown12
|
|
bra.w .enterrdown13
|
|
bra.w .enterrdown14
|
|
bra.w .enterrdown15
|
|
bra.w .enterrdown16
|
|
bra.w .enterrdown17
|
|
bra.w .enterrdown18
|
|
bra.w .enterrdown19
|
|
bra.w .enterrdown20
|
|
|
|
.downleft
|
|
neg.w d1
|
|
not.w d7
|
|
|
|
tst.b il_DzNeg(a0)
|
|
bmi.s .downleft_neg
|
|
|
|
LINEDRAWSELECT
|
|
jmp .luptab(pc,a1.w)
|
|
.luptab
|
|
bra.w .enterlupm3
|
|
bra.w .enterlupm2
|
|
bra.w .enterlupm1
|
|
bra.w .enterlup0
|
|
bra.w .enterlup1
|
|
bra.w .enterlup2
|
|
bra.w .enterlup3
|
|
bra.w .enterlup4
|
|
bra.w .enterlup5
|
|
bra.w .enterlup6
|
|
bra.w .enterlup7
|
|
bra.w .enterlup8
|
|
bra.w .enterlup9
|
|
bra.w .enterlup10
|
|
bra.w .enterlup11
|
|
bra.w .enterlup12
|
|
bra.w .enterlup13
|
|
bra.w .enterlup14
|
|
bra.w .enterlup15
|
|
bra.w .enterlup15
|
|
bra.w .enterlup15
|
|
bra.w .enterlup15
|
|
bra.w .enterlup15
|
|
bra.w .enterlup15
|
|
|
|
.downleft_neg
|
|
LINEDRAWSELECT
|
|
jmp .ldowntab(pc,a1.w)
|
|
.ldowntab
|
|
bra.w .enterldown0
|
|
bra.w .enterldown0
|
|
bra.w .enterldown0
|
|
bra.w .enterldown0
|
|
bra.w .enterldown1
|
|
bra.w .enterldown2
|
|
bra.w .enterldown3
|
|
bra.w .enterldown4
|
|
bra.w .enterldown5
|
|
bra.w .enterldown6
|
|
bra.w .enterldown7
|
|
bra.w .enterldown8
|
|
bra.w .enterldown9
|
|
bra.w .enterldown10
|
|
bra.w .enterldown11
|
|
bra.w .enterldown12
|
|
bra.w .enterldown13
|
|
bra.w .enterldown14
|
|
bra.w .enterldown15
|
|
bra.w .enterldown16
|
|
bra.w .enterldown17
|
|
bra.w .enterldown18
|
|
bra.w .enterldown19
|
|
bra.w .enterldown20
|
|
|
|
.zerodydx
|
|
PUTMSG 40,<"Zero DX/DY">
|
|
moveq.l #0,d7
|
|
moveq.l #0,d6
|
|
move.b il_FromZ(a0),d7
|
|
lsr.w #gouraudColShift-8,d7
|
|
move.b il_ToZ(a0),d6
|
|
lsr.w #gouraudColShift-8,d6
|
|
sub.w d6,d7
|
|
beq.s .linedone
|
|
bpl.s .noflipdz
|
|
neg.w d7
|
|
.noflipdz
|
|
subq.w #1,d7
|
|
.loopspotcols
|
|
move.w d4,(a2)+ ; add line point ypos
|
|
move.w d3,(a2)+ ; add line point xpos
|
|
dbra d7,.loopspotcols
|
|
bra.s .linedone
|
|
.zerody
|
|
PUTMSG 40,<"Zero DY">
|
|
tst.w d1
|
|
beq.s .zerodydx
|
|
lsl.w #gouraudErrShift,d6 ; zpos
|
|
tst.w d0 ; deltaz
|
|
smi il_DzNeg(a0)
|
|
bmi.s .noflipz2
|
|
not.w d6 ; $ffff - zpos
|
|
neg.w d0 ; deltaz now negative
|
|
.noflipz2
|
|
neg.w d0 ; abs(deltaz)
|
|
ext.l d0
|
|
lsl.l #gouraudErrShift,d0 ; dcol
|
|
moveq.l #0,d5 ; dtdz
|
|
move.w d1,d5
|
|
bmi.s .plainleft
|
|
|
|
; d0.l = dcol.l
|
|
; d1.w = dx -> loopcount.w
|
|
; d3.w = xpos.w
|
|
; d3.w = ypos.w
|
|
; d5.l = dtdz.l
|
|
; d6.l = zerror.l
|
|
|
|
.plainright
|
|
mulu d5,d6 ; zerror = (dtdz>>16)*zpos
|
|
swap d5 ; now really dtdz
|
|
ZEROIPOL 1
|
|
|
|
.plainleft
|
|
neg.w d5 ; abs(dx)
|
|
mulu d5,d6 ; zerror = (dtdz>>16)*zpos
|
|
swap d5 ; now really dtdz
|
|
|
|
neg.w d1
|
|
ZEROIPOL -1
|
|
|
|
.linedone
|
|
suba.l a0,a2
|
|
move.w a2,d0
|
|
lsr.w #2,d0
|
|
move.w d0,il_NumCoords(a0)
|
|
|
|
POPM
|
|
|
|
.skipline
|
|
lea il_SIZEOF(a0),a0
|
|
tst.w d7
|
|
bne .loop
|
|
|
|
rts
|
|
|
|
.samecolorspecialcase
|
|
PUTMSG 40,<"Same color special case from %d to %d">,d0,d1
|
|
|
|
lea il_Coords(a0),a2
|
|
|
|
move.w il_ToX(a0),d1
|
|
move.w il_FromX(a0),d3 ; startx
|
|
sub.w d3,d1 ; deltax
|
|
move.w il_ToY(a0),d2
|
|
move.w il_FromY(a0),d4
|
|
sub.w d4,d2 ; deltay
|
|
smi il_Flipped(a0)
|
|
beq.s .linedone
|
|
bpl.s .noflipy_sc
|
|
neg.w d1 ; flip deltax
|
|
neg.w d2 ; flip deltay
|
|
move.w il_ToX(a0),d3 ; swap startx
|
|
move.w il_ToY(a0),d4 ; swap starty
|
|
.noflipy_sc
|
|
PUTMSG 50,<"X/Y=%d,%d, DX/DY = %d/%d">,d3,d4,d1,d2
|
|
move.w d0,d7
|
|
;rol.w #(gouraudErrShift+2),d7
|
|
asr.w #8,d7
|
|
asr.w #16-(gouraudErrShift+8),d7 ; col
|
|
|
|
PUTMSG 50,<"Col=%d">,d7
|
|
|
|
lsl.w #2,d7 ; calculate color start routine
|
|
move.w d7,a1
|
|
|
|
lsl.w #6,d4 ; replaced mulu by shift
|
|
;mulu #(CUBE_BUF_WIDTH/8)*CUBE_PLANES,d4
|
|
adda.w d4,a4 ; start pos y
|
|
|
|
moveq.l #7,d7
|
|
and.w d3,d7
|
|
move.w d3,d0
|
|
lsr.w #3,d0
|
|
adda.w d0,a4
|
|
|
|
tst.w d1 ; dx?
|
|
bmi .downleft_sc
|
|
|
|
.downright_sc
|
|
; d0.w = loopcount.w
|
|
; d1.w = dx -> 2*dx.w
|
|
; d2.w = dy -> 2*dy.w
|
|
; d3.w = xpos -> xpos.w
|
|
; d4.w = ypos -> ypos.w
|
|
; d7.l = bitpos
|
|
; a4.l = bitplane pointer
|
|
|
|
eor.w #7,d7
|
|
|
|
tst.b il_DzNeg(a0)
|
|
bmi.s .downright_neg_sc
|
|
|
|
LINEDRAWSELECT
|
|
jmp .ruptab_sc(pc,a1.w)
|
|
.ruptab_sc
|
|
bra.w .enterrup_sc0
|
|
bra.w .enterrup_sc0
|
|
bra.w .enterrup_sc0
|
|
bra.w .enterrup_sc0
|
|
bra.w .enterrup_sc1
|
|
bra.w .enterrup_sc2
|
|
bra.w .enterrup_sc3
|
|
bra.w .enterrup_sc4
|
|
bra.w .enterrup_sc5
|
|
bra.w .enterrup_sc6
|
|
bra.w .enterrup_sc7
|
|
bra.w .enterrup_sc8
|
|
bra.w .enterrup_sc9
|
|
bra.w .enterrup_sc10
|
|
bra.w .enterrup_sc11
|
|
bra.w .enterrup_sc12
|
|
bra.w .enterrup_sc13
|
|
bra.w .enterrup_sc14
|
|
bra.w .enterrup_sc15
|
|
bra.w .enterrup_sc15
|
|
bra.w .enterrup_sc15
|
|
bra.w .enterrup_sc15
|
|
bra.w .enterrup_sc15
|
|
bra.w .enterrup_sc15
|
|
|
|
.downright_neg_sc
|
|
LINEDRAWSELECT
|
|
jmp .rdowntab_sc(pc,a1.w)
|
|
.rdowntab_sc
|
|
bra.w .enterrdown_sc0
|
|
bra.w .enterrdown_sc0
|
|
bra.w .enterrdown_sc0
|
|
bra.w .enterrdown_sc0
|
|
bra.w .enterrdown_sc1
|
|
bra.w .enterrdown_sc2
|
|
bra.w .enterrdown_sc3
|
|
bra.w .enterrdown_sc4
|
|
bra.w .enterrdown_sc5
|
|
bra.w .enterrdown_sc6
|
|
bra.w .enterrdown_sc7
|
|
bra.w .enterrdown_sc8
|
|
bra.w .enterrdown_sc9
|
|
bra.w .enterrdown_sc10
|
|
bra.w .enterrdown_sc11
|
|
bra.w .enterrdown_sc12
|
|
bra.w .enterrdown_sc13
|
|
bra.w .enterrdown_sc14
|
|
bra.w .enterrdown_sc15
|
|
bra.w .enterrdown_sc15
|
|
bra.w .enterrdown_sc15
|
|
bra.w .enterrdown_sc15
|
|
bra.w .enterrdown_sc15
|
|
bra.w .enterrdown_sc15
|
|
|
|
.downleft_sc
|
|
neg.w d1
|
|
not.w d7
|
|
|
|
tst.b il_DzNeg(a0)
|
|
bmi.s .downleft_neg_sc
|
|
|
|
LINEDRAWSELECT
|
|
jmp .luptab_sc(pc,a1.w)
|
|
.luptab_sc
|
|
bra.w .enterlup_sc0
|
|
bra.w .enterlup_sc0
|
|
bra.w .enterlup_sc0
|
|
bra.w .enterlup_sc0
|
|
bra.w .enterlup_sc1
|
|
bra.w .enterlup_sc2
|
|
bra.w .enterlup_sc3
|
|
bra.w .enterlup_sc4
|
|
bra.w .enterlup_sc5
|
|
bra.w .enterlup_sc6
|
|
bra.w .enterlup_sc7
|
|
bra.w .enterlup_sc8
|
|
bra.w .enterlup_sc9
|
|
bra.w .enterlup_sc10
|
|
bra.w .enterlup_sc11
|
|
bra.w .enterlup_sc12
|
|
bra.w .enterlup_sc13
|
|
bra.w .enterlup_sc14
|
|
bra.w .enterlup_sc15
|
|
bra.w .enterlup_sc15
|
|
bra.w .enterlup_sc15
|
|
bra.w .enterlup_sc15
|
|
bra.w .enterlup_sc15
|
|
bra.w .enterlup_sc15
|
|
|
|
.downleft_neg_sc
|
|
LINEDRAWSELECT
|
|
jmp .ldowntab_sc(pc,a1.w)
|
|
.ldowntab_sc
|
|
bra.w .enterldown_sc0
|
|
bra.w .enterldown_sc0
|
|
bra.w .enterldown_sc0
|
|
bra.w .enterldown_sc0
|
|
bra.w .enterldown_sc1
|
|
bra.w .enterldown_sc2
|
|
bra.w .enterldown_sc3
|
|
bra.w .enterldown_sc4
|
|
bra.w .enterldown_sc5
|
|
bra.w .enterldown_sc6
|
|
bra.w .enterldown_sc7
|
|
bra.w .enterldown_sc8
|
|
bra.w .enterldown_sc9
|
|
bra.w .enterldown_sc10
|
|
bra.w .enterldown_sc11
|
|
bra.w .enterldown_sc12
|
|
bra.w .enterldown_sc13
|
|
bra.w .enterldown_sc14
|
|
bra.w .enterldown_sc15
|
|
bra.w .enterldown_sc15
|
|
bra.w .enterldown_sc15
|
|
bra.w .enterldown_sc15
|
|
bra.w .enterldown_sc15
|
|
bra.w .enterldown_sc15
|
|
|
|
LINEDRAW rupm3,rupm2,1,0
|
|
LINEDRAW rupm2,rupm1,1,0
|
|
LINEDRAW rupm1,rup0,1,0
|
|
LINEDRAW rup0,rup1,1,0
|
|
LINEDRAW rup1,rup2,1,1
|
|
LINEDRAW rup2,rup3,1,2
|
|
LINEDRAW rup3,rup4,1,3
|
|
LINEDRAW rup4,rup5,1,4
|
|
LINEDRAW rup5,rup6,1,5
|
|
LINEDRAW rup6,rup7,1,6
|
|
LINEDRAW rup7,rup8,1,7
|
|
LINEDRAW rup8,rup9,1,8
|
|
LINEDRAW rup9,rup10,1,9
|
|
LINEDRAW rup10,rup11,1,10
|
|
LINEDRAW rup11,rup12,1,11
|
|
LINEDRAW rup12,rup13,1,12
|
|
LINEDRAW rup13,rup14,1,13
|
|
LINEDRAW rup14,rup15,1,14
|
|
LINEDRAW rup15,rup15,1,15
|
|
|
|
LINEDRAW lupm3,lupm2,-1,0
|
|
LINEDRAW lupm2,lupm1,-1,0
|
|
LINEDRAW lupm1,lup0,-1,0
|
|
LINEDRAW lup0,lup1,-1,0
|
|
LINEDRAW lup1,lup2,-1,1
|
|
LINEDRAW lup2,lup3,-1,2
|
|
LINEDRAW lup3,lup4,-1,3
|
|
LINEDRAW lup4,lup5,-1,4
|
|
LINEDRAW lup5,lup6,-1,5
|
|
LINEDRAW lup6,lup7,-1,6
|
|
LINEDRAW lup7,lup8,-1,7
|
|
LINEDRAW lup8,lup9,-1,8
|
|
LINEDRAW lup9,lup10,-1,9
|
|
LINEDRAW lup10,lup11,-1,10
|
|
LINEDRAW lup11,lup12,-1,11
|
|
LINEDRAW lup12,lup13,-1,12
|
|
LINEDRAW lup13,lup14,-1,13
|
|
LINEDRAW lup14,lup15,-1,14
|
|
LINEDRAW lup15,lup15,-1,15
|
|
|
|
LINEDRAW rdown0,rdown0,1,0
|
|
LINEDRAW rdown1,rdown0,1,1
|
|
LINEDRAW rdown2,rdown1,1,2
|
|
LINEDRAW rdown3,rdown2,1,3
|
|
LINEDRAW rdown4,rdown3,1,4
|
|
LINEDRAW rdown5,rdown4,1,5
|
|
LINEDRAW rdown6,rdown5,1,6
|
|
LINEDRAW rdown7,rdown6,1,7
|
|
LINEDRAW rdown8,rdown7,1,8
|
|
LINEDRAW rdown9,rdown8,1,9
|
|
LINEDRAW rdown10,rdown9,1,10
|
|
LINEDRAW rdown11,rdown10,1,11
|
|
LINEDRAW rdown12,rdown11,1,12
|
|
LINEDRAW rdown13,rdown12,1,13
|
|
LINEDRAW rdown14,rdown13,1,14
|
|
LINEDRAW rdown15,rdown14,1,15
|
|
LINEDRAW rdown16,rdown15,1,15
|
|
LINEDRAW rdown17,rdown16,1,15
|
|
LINEDRAW rdown18,rdown17,1,15
|
|
LINEDRAW rdown19,rdown18,1,15
|
|
LINEDRAW rdown20,rdown19,1,15
|
|
|
|
LINEDRAW ldown0,ldown0,-1,0
|
|
LINEDRAW ldown1,ldown0,-1,1
|
|
LINEDRAW ldown2,ldown1,-1,2
|
|
LINEDRAW ldown3,ldown2,-1,3
|
|
LINEDRAW ldown4,ldown3,-1,4
|
|
LINEDRAW ldown5,ldown4,-1,5
|
|
LINEDRAW ldown6,ldown5,-1,6
|
|
LINEDRAW ldown7,ldown6,-1,7
|
|
LINEDRAW ldown8,ldown7,-1,8
|
|
LINEDRAW ldown9,ldown8,-1,9
|
|
LINEDRAW ldown10,ldown9,-1,10
|
|
LINEDRAW ldown11,ldown10,-1,11
|
|
LINEDRAW ldown12,ldown11,-1,12
|
|
LINEDRAW ldown13,ldown12,-1,13
|
|
LINEDRAW ldown14,ldown13,-1,14
|
|
LINEDRAW ldown15,ldown14,-1,15
|
|
LINEDRAW ldown16,ldown15,-1,15
|
|
LINEDRAW ldown17,ldown16,-1,15
|
|
LINEDRAW ldown18,ldown17,-1,15
|
|
LINEDRAW ldown19,ldown18,-1,15
|
|
LINEDRAW ldown20,ldown19,-1,15
|
|
|
|
LINEDRAW_SC rup_sc0,1,0
|
|
LINEDRAW_SC rup_sc1,1,1
|
|
LINEDRAW_SC rup_sc2,1,2
|
|
LINEDRAW_SC rup_sc3,1,3
|
|
LINEDRAW_SC rup_sc4,1,4
|
|
LINEDRAW_SC rup_sc5,1,5
|
|
LINEDRAW_SC rup_sc6,1,6
|
|
LINEDRAW_SC rup_sc7,1,7
|
|
LINEDRAW_SC rup_sc8,1,8
|
|
LINEDRAW_SC rup_sc9,1,9
|
|
LINEDRAW_SC rup_sc10,1,10
|
|
LINEDRAW_SC rup_sc11,1,11
|
|
LINEDRAW_SC rup_sc12,1,12
|
|
LINEDRAW_SC rup_sc13,1,13
|
|
LINEDRAW_SC rup_sc14,1,14
|
|
LINEDRAW_SC rup_sc15,1,15
|
|
|
|
LINEDRAW_SC lup_sc0,-1,0
|
|
LINEDRAW_SC lup_sc1,-1,1
|
|
LINEDRAW_SC lup_sc2,-1,2
|
|
LINEDRAW_SC lup_sc3,-1,3
|
|
LINEDRAW_SC lup_sc4,-1,4
|
|
LINEDRAW_SC lup_sc5,-1,5
|
|
LINEDRAW_SC lup_sc6,-1,6
|
|
LINEDRAW_SC lup_sc7,-1,7
|
|
LINEDRAW_SC lup_sc8,-1,8
|
|
LINEDRAW_SC lup_sc9,-1,9
|
|
LINEDRAW_SC lup_sc10,-1,10
|
|
LINEDRAW_SC lup_sc11,-1,11
|
|
LINEDRAW_SC lup_sc12,-1,12
|
|
LINEDRAW_SC lup_sc13,-1,13
|
|
LINEDRAW_SC lup_sc14,-1,14
|
|
LINEDRAW_SC lup_sc15,-1,15
|
|
|
|
LINEDRAW_SC rdown_sc0,1,0
|
|
LINEDRAW_SC rdown_sc1,1,1
|
|
LINEDRAW_SC rdown_sc2,1,2
|
|
LINEDRAW_SC rdown_sc3,1,3
|
|
LINEDRAW_SC rdown_sc4,1,4
|
|
LINEDRAW_SC rdown_sc5,1,5
|
|
LINEDRAW_SC rdown_sc6,1,6
|
|
LINEDRAW_SC rdown_sc7,1,7
|
|
LINEDRAW_SC rdown_sc8,1,8
|
|
LINEDRAW_SC rdown_sc9,1,9
|
|
LINEDRAW_SC rdown_sc10,1,10
|
|
LINEDRAW_SC rdown_sc11,1,11
|
|
LINEDRAW_SC rdown_sc12,1,12
|
|
LINEDRAW_SC rdown_sc13,1,13
|
|
LINEDRAW_SC rdown_sc14,1,14
|
|
LINEDRAW_SC rdown_sc15,1,15
|
|
|
|
LINEDRAW_SC ldown_sc0,-1,0
|
|
LINEDRAW_SC ldown_sc1,-1,1
|
|
LINEDRAW_SC ldown_sc2,-1,2
|
|
LINEDRAW_SC ldown_sc3,-1,3
|
|
LINEDRAW_SC ldown_sc4,-1,4
|
|
LINEDRAW_SC ldown_sc5,-1,5
|
|
LINEDRAW_SC ldown_sc6,-1,6
|
|
LINEDRAW_SC ldown_sc7,-1,7
|
|
LINEDRAW_SC ldown_sc8,-1,8
|
|
LINEDRAW_SC ldown_sc9,-1,9
|
|
LINEDRAW_SC ldown_sc10,-1,10
|
|
LINEDRAW_SC ldown_sc11,-1,11
|
|
LINEDRAW_SC ldown_sc12,-1,12
|
|
LINEDRAW_SC ldown_sc13,-1,13
|
|
LINEDRAW_SC ldown_sc14,-1,14
|
|
LINEDRAW_SC ldown_sc15,-1,15
|
|
|
|
|
|
;--------------------------------------------------------------------
|
|
|
|
LINEIPOL MACRO
|
|
move.w d2,d7 ; error (=dy)
|
|
add.w d1,d1 ; 2*dx
|
|
move.w d2,d0
|
|
add.w d2,d2 ; 2*dy
|
|
subq.w #1,d0 ; loopcount (top word)
|
|
bmi .linedone
|
|
.yloop\@
|
|
addq.w #1,d4 ; !!!!! ypos++
|
|
|
|
sub.w d1,d7 ; error -= 2 * dx
|
|
bpl.s .nox\@
|
|
sub.l a3,d6 ; zerror -= dcol (for y movement)
|
|
.morex\@
|
|
IFGT \1
|
|
addq.w #1,d3 ; !!!!! xpos++
|
|
ELSE
|
|
subq.w #1,d3 ; !!!!! xpos--
|
|
ENDC
|
|
|
|
add.w d2,d7 ; error += 2 * dy
|
|
sub.l a3,d6 ; zerror -= dcol (for x movement)
|
|
bpl.s .nozm\@
|
|
.morez\@
|
|
|
|
PUTMSG 40,<"LinePoint %d,%d">,d3,d4
|
|
move.w d4,(a2)+ ; add line point (ypos)
|
|
move.w d3,(a2)+ ; add line point (xpos)
|
|
add.l d5,d6 ; zerror += dtdz
|
|
bmi.s .morez\@
|
|
.nozm\@ tst.w d7
|
|
bmi.s .morex\@
|
|
|
|
dbra d0,.yloop\@
|
|
bra .linedone
|
|
.nox\@
|
|
sub.l a3,d6 ; zerror -= dcol (for y movement)
|
|
bpl.s .ldone\@
|
|
.zmin\@
|
|
PUTMSG 40,<"LinePoint %d,%d">,d3,d4
|
|
move.w d4,(a2)+ ; add line point (ypos)
|
|
move.w d3,(a2)+ ; add line point (xpos)
|
|
add.l d5,d6 ; zerror += dtdz
|
|
bmi.s .zmin\@
|
|
.ldone\@
|
|
dbra d0,.yloop\@
|
|
bra .linedone
|
|
ENDM
|
|
|
|
;--------------------------------------------------------------------
|
|
; a1 = cubedata
|
|
gou_interpolate_inner_cube_lines:
|
|
PUTMSG 20,<"%d: ----- gou_interpolate_inner_cube_lines">,fw_FrameCounter-2(a6)
|
|
move.w cd_InnerLines(a1),d7
|
|
bne.s .cont
|
|
rts
|
|
.cont
|
|
lea cd_IntCubeLines(a1),a0
|
|
lea cd_ProjCoords(a1),a2
|
|
lea cd_Coords(a1),a3 ; z coords
|
|
.loop
|
|
PUTMSG 50,<"Line %x">,d7
|
|
lsr.w #1,d7
|
|
bcc .skipline
|
|
|
|
PUSHM d7/a2-a3
|
|
|
|
PUTMSG 40,<"%p/%p/%p/%p From/To %d - %d">,a0,a1,a2,a3,il_FromCoord-2(a0),il_ToCoord-2(a0)
|
|
|
|
move.w #GOURAUD_Z_ADD,d2
|
|
move.w il_FromCoord(a0),d0
|
|
move.l (a2,d0.w),il_FromX(a0)
|
|
lsr.w #1,d0
|
|
add.w il_FromCoord(a0),d0
|
|
move.w 2*2(a3,d0.w),d0
|
|
add.w d2,d0
|
|
move.w d0,il_FromZ(a0)
|
|
|
|
move.w il_ToCoord(a0),d1
|
|
move.l (a2,d1.w),il_ToX(a0)
|
|
lsr.w #1,d1
|
|
add.w il_ToCoord(a0),d1
|
|
move.w 2*2(a3,d1.w),d1
|
|
add.w d2,d1
|
|
move.w d1,il_ToZ(a0)
|
|
|
|
PUTMSG 40,<"Z from %d to %d">,d0,d1
|
|
|
|
lea il_Coords(a0),a2
|
|
move.l a2,a3
|
|
|
|
move.w d0,d6 ; will become zpos
|
|
|
|
sub.w d1,d0 ; deltaz
|
|
neg.w d0
|
|
|
|
move.w il_ToX(a0),d1
|
|
move.w il_FromX(a0),d3 ; startx
|
|
sub.w d3,d1 ; deltax
|
|
move.w il_ToY(a0),d2
|
|
move.w il_FromY(a0),d4
|
|
sub.w d4,d2 ; deltay
|
|
smi il_Flipped(a0)
|
|
bpl.s .noflipy
|
|
neg.w d0 ; flip deltaz
|
|
neg.w d1 ; flip deltax
|
|
neg.w d2 ; flip deltay
|
|
move.w il_ToX(a0),d3 ; swap startx
|
|
move.w il_ToY(a0),d4 ; swap starty
|
|
move.w il_ToZ(a0),d6 ; swap zpos
|
|
.noflipy
|
|
PUTMSG 40,<"X/Y/Z=%d,%d,%d, DX/DY/DZ = %d/%d/%d">,d3,d4,d6,d1,d2,d0
|
|
lsl.w #gouraudErrShift,d6 ; zpos
|
|
|
|
tst.w d0 ; deltaz
|
|
smi il_DzNeg(a0)
|
|
bmi.s .noflipz
|
|
not.w d6 ; $ffff - zpos
|
|
neg.w d0 ; deltaz now negative
|
|
.noflipz
|
|
neg.w d0 ; abs(deltaz)
|
|
ext.l d0
|
|
lsl.l #gouraudErrShift,d0 ; dcol
|
|
|
|
PUTMSG 40,<"dcol=%ld, zpos=%x">,d0,d6
|
|
|
|
moveq.l #0,d5 ; dtdz
|
|
move.w d1,d5
|
|
bpl.s .noabsx
|
|
neg.w d5 ; abs(dx)
|
|
.noabsx add.w d2,d5 ; abs(dx)+dy (dy always positive)
|
|
mulu d5,d6 ; zerror = (dtdz>>16)*zpos
|
|
swap d5 ; now really dtdz
|
|
|
|
tst.w d2
|
|
beq .contzerody
|
|
|
|
move.l d0,a3
|
|
|
|
tst.w d1 ; dx?
|
|
bmi .downleft
|
|
|
|
.downright
|
|
; d0.w = loopcount.w
|
|
; d1.w = dx -> 2*dx.w
|
|
; d2.w = dy -> 2*dy.w
|
|
; d3.w = xpos -> xpos.w
|
|
; d4.w = ypos -> ypos.w
|
|
; d5.l = dtdz.l
|
|
; d6.l = zerror.l
|
|
; d7.l = error.w
|
|
; a3.l = dcol.l
|
|
;
|
|
LINEIPOL 1
|
|
|
|
.downleft
|
|
neg.w d1
|
|
|
|
LINEIPOL -1
|
|
|
|
.zerodydx
|
|
PUTMSG 40,<"Zero DX/DY (inner)">
|
|
moveq.l #0,d7
|
|
moveq.l #0,d6
|
|
move.b il_FromZ(a0),d7
|
|
lsr.w #gouraudColShift-8,d7
|
|
move.b il_ToZ(a0),d6
|
|
lsr.w #gouraudColShift-8,d6
|
|
sub.w d6,d7
|
|
beq.s .linedone
|
|
bpl.s .noflipdz
|
|
neg.w d7
|
|
.noflipdz
|
|
subq.w #1,d7
|
|
.loopspotcols
|
|
move.w d4,(a2)+ ; add line point ypos
|
|
move.w d3,(a2)+ ; add line point xpos
|
|
dbra d7,.loopspotcols
|
|
bra.s .linedone
|
|
.contzerody
|
|
; d0.l = dcol.l
|
|
; d1.w = dx -> loopcount.w
|
|
; d3.w = xpos.w
|
|
; d3.w = ypos.w
|
|
; d5.l = dtdz.l
|
|
; d6.l = zerror.l
|
|
|
|
tst.w d1 ; dx?
|
|
beq.s .zerodydx
|
|
bmi .plainleft
|
|
.plainright
|
|
ZEROIPOL 1
|
|
.plainleft
|
|
neg.w d1
|
|
ZEROIPOL -1
|
|
|
|
.linedone
|
|
suba.l a0,a2
|
|
move.w a2,d0
|
|
lsr.w #2,d0
|
|
move.w d0,il_NumCoords(a0)
|
|
|
|
POPM
|
|
|
|
.skipline
|
|
lea il_SIZEOF(a0),a0
|
|
tst.w d7
|
|
bne .loop
|
|
|
|
rts
|
|
|
|
;--------------------------------------------------------------------
|
|
|
|
COPYLINEDATA MACRO
|
|
move.w il_NumCoords(\1),d4
|
|
beq.s .lcskip\@
|
|
btst #\2,d5
|
|
IF \3
|
|
beq.s .lcrev\@
|
|
ELSE
|
|
bne.s .lcrev\@
|
|
ENDC
|
|
PUTMSG 50,<"\2 %d coords fwd">,d4
|
|
subq.w #1,d4
|
|
.lcloop\@
|
|
move.l (\1)+,(\4)+ ; write left part 1 (in order)
|
|
dbra d4,.lcloop\@
|
|
bra.s .lcskip\@
|
|
.lcrev\@
|
|
PUTMSG 50,<"\2 %d coords bkw">,d4
|
|
adda.w d4,\1
|
|
adda.w d4,\1
|
|
adda.w d4,\1
|
|
adda.w d4,\1
|
|
subq.w #1,d4
|
|
.lcrloop\@
|
|
move.l -(\1),(\4)+ ; write left part 1 (in order)
|
|
dbra d4,.lcrloop\@
|
|
.lcskip\@
|
|
ENDM
|
|
|
|
; a1 = cubedata
|
|
gou_draw_inner_lines:
|
|
moveq.l #0,d7
|
|
move.b cd_PlanesToDraw(a1),d7
|
|
bpl.s .cont
|
|
.done
|
|
rts
|
|
.cont
|
|
PUTMSG 40,<"Plane Number: %d">,d7
|
|
PUSHM a1
|
|
lea pd_BQLineInit(a6),a0
|
|
CALLFW AddToBlitterQueue
|
|
POPM
|
|
lea pd_BQLines(a6),a4
|
|
bsr.s .doit
|
|
moveq.l #0,d7
|
|
move.b cd_PlanesToDraw+1(a1),d7
|
|
bmi.s .done
|
|
bsr.s .doit
|
|
moveq.l #0,d7
|
|
move.b cd_PlanesToDraw+2(a1),d7
|
|
bmi.s .done
|
|
.doit
|
|
PUSHM a1/a4
|
|
lsl.w #3,d7
|
|
|
|
move.l a1,a4
|
|
lea gou_cube_planes_to_lines(pc),a0
|
|
movem.w (a0,d7.w),a0-a3
|
|
|
|
adda.l a4,a0
|
|
adda.l a4,a1
|
|
adda.l a4,a2
|
|
adda.l a4,a3
|
|
|
|
PUTMSG 40,<"%p Lines %lx,%lx,%lx,%lx">,a1,il_FromCoord(a0),il_FromCoord(a1),il_FromCoord(a2),il_FromCoord(a3)
|
|
|
|
move.l il_FromCoord(a0),d4 ; and il_ToCoord (0)
|
|
move.l il_FromCoord(a1),d5 ; and il_ToCoord (1)
|
|
cmp.w d4,d5 ; to_0 == to_1 ?
|
|
beq.s .l1l_l2r_l3r_l4l ; l1 linear, l2 reversed
|
|
swap d4
|
|
cmp.w d4,d5 ; from_0 == to_1 ?
|
|
beq .l1r_l2r_l3l_l4l ; l1 reversed, l2 reversed
|
|
|
|
.l1l_l2l_l3l_l4r
|
|
move.w il_FromZ(a0),d4
|
|
sub.w il_FromZ(a2),d4
|
|
move.w d4,d6
|
|
bpl.s .nofl0
|
|
neg.w d6
|
|
.nofl0
|
|
move.w il_FromZ(a1),d5
|
|
sub.w il_ToZ(a3),d5
|
|
move.w d5,d7
|
|
bpl.s .nofr0
|
|
neg.w d7
|
|
.nofr0 cmp.w d7,d6
|
|
blt.s .l1l_l2l_l3l_l4r_dz13 ; abs(dz02) < abs(dz13)
|
|
; dz02 dominant
|
|
move.b il_FromZ(a2),d6 ; startZ = coord 2
|
|
moveq.l #0+0+0+8+0+0,d7
|
|
tst.w d4
|
|
bpl .contl
|
|
moveq.l #0+0+0+8+0+32,d7
|
|
move.b il_FromZ(a0),d6 ; startZ = coord 0
|
|
bra .contl
|
|
|
|
.l1l_l2l_l3l_l4r_dz13
|
|
; dz13 dominant
|
|
move.b il_FromZ(a1),d6 ; startZ = coord 1
|
|
moveq.l #0+0+0+8+16+0,d7
|
|
tst.w d5
|
|
bmi .contl
|
|
move.b il_ToZ(a3),d6 ; startZ = reversed coord 3
|
|
moveq.l #0+0+0+8+16+32,d7
|
|
bra .contl
|
|
|
|
.l1l_l2r_l3r_l4l
|
|
move.w il_FromZ(a0),d4
|
|
sub.w il_ToZ(a2),d4
|
|
move.w d4,d6
|
|
bpl.s .nofl1
|
|
neg.w d6
|
|
.nofl1
|
|
move.w il_ToZ(a1),d5
|
|
sub.w il_FromZ(a3),d5
|
|
move.w d5,d7
|
|
bpl.s .nofr1
|
|
neg.w d7
|
|
.nofr1 cmp.w d7,d6
|
|
blt.s .l1l_l2r_l3r_l4l_dz13 ; abs(dz02) < abs(dz13)
|
|
; dz02 dominant
|
|
move.b il_ToZ(a2),d6 ; startZ = reversed coord 2
|
|
moveq.l #0+2+4+0+0+0,d7
|
|
tst.w d4
|
|
bpl.s .contl
|
|
moveq.l #0+2+4+0+0+32,d7
|
|
move.b il_FromZ(a0),d6 ; startZ = coord 0
|
|
bra.s .contl
|
|
|
|
.l1l_l2r_l3r_l4l_dz13
|
|
; dz13 dominant
|
|
move.b il_ToZ(a1),d6 ; startZ = reversed coord 1
|
|
moveq.l #0+2+4+0+16+0,d7
|
|
tst.w d5
|
|
bmi.s .contl
|
|
move.b il_FromZ(a3),d6 ; startZ = coord 3
|
|
moveq.l #0+2+4+0+16+32,d7
|
|
bra.s .contl
|
|
|
|
.l1r_l2r_l3l_l4l
|
|
move.w il_ToZ(a0),d4
|
|
sub.w il_FromZ(a2),d4
|
|
move.w d4,d6
|
|
bpl.s .nofl2
|
|
neg.w d6
|
|
.nofl2
|
|
move.w il_ToZ(a1),d5
|
|
sub.w il_FromZ(a3),d5
|
|
move.w d5,d7
|
|
bpl.s .nofr2
|
|
neg.w d7
|
|
.nofr2 cmp.w d7,d6
|
|
blt.s .l1r_l2r_l3l_l4l_dz13 ; abs(dz02) < abs(dz13)
|
|
; dz02 dominant
|
|
move.b il_FromZ(a2),d6 ; startZ = coord 2
|
|
moveq.l #1+2+0+0+0+0,d7
|
|
tst.w d4
|
|
bpl.s .contl
|
|
move.b il_ToZ(a0),d6 ; startZ = reversed coord 0
|
|
moveq.l #1+2+0+0+0+32,d7
|
|
bra.s .contl
|
|
|
|
.l1r_l2r_l3l_l4l_dz13
|
|
; dz13 dominant
|
|
move.b il_ToZ(a1),d6 ; startZ = reversed coord 1
|
|
moveq.l #1+2+0+0+16+0,d7
|
|
tst.w d5
|
|
bmi.s .contl
|
|
move.b il_FromZ(a3),d6 ; startZ = coord 3
|
|
moveq.l #1+2+0+0+16+32,d7
|
|
|
|
.contl
|
|
moveq.l #0,d5
|
|
sub.b il_Flipped(a3),d5
|
|
add.b d5,d5
|
|
sub.b il_Flipped(a2),d5
|
|
add.b d5,d5
|
|
sub.b il_Flipped(a1),d5
|
|
add.b d5,d5
|
|
sub.b il_Flipped(a0),d5
|
|
PUTMSG 50,<"copymode=%x/%x">,d5,d7
|
|
eor.w d7,d5
|
|
|
|
and.w #16+32,d7
|
|
jmp .jmptab(pc,d7.w)
|
|
.jmptab
|
|
bra .dz02dom_pl
|
|
ds.b (.jmptab+16)-*
|
|
bra.s .dz13dom_pl
|
|
ds.b (.jmptab+32)-*
|
|
bra .dz02dom_mi
|
|
ds.b (.jmptab+48)-*
|
|
bra .dz13dom_mi
|
|
|
|
.dz13dom_pl
|
|
PUTMSG 40,<"DZ13 PL">
|
|
lea pd_LinesFromBuffer(a6),a4
|
|
COPYLINEDATA a0,0,1,a4
|
|
COPYLINEDATA a3,3,1,a4
|
|
clr.w (a4)+
|
|
PUTMSG 50,<"Right">
|
|
lea pd_LinesToBuffer(a6),a4
|
|
COPYLINEDATA a1,1,0,a4
|
|
COPYLINEDATA a2,2,0,a4
|
|
clr.w (a4)+
|
|
bra .drawnow
|
|
|
|
.dz02dom_pl
|
|
PUTMSG 40,<"DZ02 PL">
|
|
lea pd_LinesFromBuffer(a6),a4
|
|
COPYLINEDATA a1,1,1,a4
|
|
COPYLINEDATA a0,0,1,a4
|
|
clr.w (a4)+
|
|
PUTMSG 50,<"Right">
|
|
lea pd_LinesToBuffer(a6),a4
|
|
COPYLINEDATA a2,2,0,a4
|
|
COPYLINEDATA a3,3,0,a4
|
|
clr.w (a4)+
|
|
bra .drawnow
|
|
|
|
.dz13dom_mi
|
|
PUTMSG 40,<"DZ13 MI">
|
|
lea pd_LinesFromBuffer(a6),a4
|
|
COPYLINEDATA a3,3,0,a4
|
|
COPYLINEDATA a0,0,0,a4
|
|
clr.w (a4)+
|
|
PUTMSG 50,<"Right">
|
|
lea pd_LinesToBuffer(a6),a4
|
|
COPYLINEDATA a2,2,1,a4
|
|
COPYLINEDATA a1,1,1,a4
|
|
clr.w (a4)+
|
|
bra .drawnow
|
|
|
|
.dz02dom_mi
|
|
PUTMSG 40,<"DZ02 MI">
|
|
lea pd_LinesFromBuffer(a6),a4
|
|
COPYLINEDATA a0,0,0,a4
|
|
COPYLINEDATA a1,1,0,a4
|
|
clr.w (a4)+
|
|
PUTMSG 50,<"Right">
|
|
lea pd_LinesToBuffer(a6),a4
|
|
COPYLINEDATA a3,3,1,a4
|
|
COPYLINEDATA a2,2,1,a4
|
|
clr.w (a4)+
|
|
;bra .drawnow
|
|
|
|
.drawnow
|
|
POPM
|
|
lea pd_LinesFromBuffer(a6),a0
|
|
lea pd_LinesToBuffer(a6),a2
|
|
ext.w d6
|
|
asr.w #gouraudColShift-8,d6
|
|
add.w d6,d6
|
|
.drawloop
|
|
move.w (a0)+,d1
|
|
beq.s .end
|
|
move.w (a0)+,d0
|
|
move.w (a2)+,d3
|
|
beq.s .end
|
|
move.w (a2)+,d2
|
|
PUTMSG 40,<"%d: line %d,%d to %d,%d">,d6,d0,d1,d2,d3
|
|
|
|
move.w .graycodebits(pc,d6.w),d4
|
|
bmi.s .skipdraw
|
|
PUSHM a0/a1
|
|
move.l pd_CurrCubeLinePtr(a6),a0
|
|
adda.w d4,a0
|
|
bsr gou_draw_singledot_line_bq
|
|
POPM
|
|
.skipdraw
|
|
addq.w #2,d6
|
|
bra.s .drawloop
|
|
.end
|
|
;clr.l -bql_SIZEOF+bq_Next(a4)
|
|
rts
|
|
|
|
; val grayCode3Bits = arrayOf(0, 1, 0, 2, 0, 1, 0, 2) -> 1,0,2,0,1,0
|
|
; val grayCode3Index = arrayOf(0, 1, 3, 2, 6, 7, 5, 4)
|
|
|
|
; val grayCode4Bits = arrayOf(0, 1, 2, 3, 2, 1, 0, 2, 0, 3, 0, 1, 3, 2, 3, 1) -> 1,2,3,2,1,0 ,2,0,3,0,1,3,2,3
|
|
; val grayCode4Index = arrayOf(0, 1, 3, 7, 15, 11, 9, 8, 12, 13, 5, 4, 6, 14, 10, 2)
|
|
|
|
.graycodebits
|
|
dc.w -1,-1,-1,0*(CUBE_BUF_WIDTH/8)
|
|
dc.w 1*(CUBE_BUF_WIDTH/8),2*(CUBE_BUF_WIDTH/8),3*(CUBE_BUF_WIDTH/8),2*(CUBE_BUF_WIDTH/8),1*(CUBE_BUF_WIDTH/8),0*(CUBE_BUF_WIDTH/8)
|
|
dc.w 2*(CUBE_BUF_WIDTH/8),0*(CUBE_BUF_WIDTH/8),3*(CUBE_BUF_WIDTH/8),0*(CUBE_BUF_WIDTH/8),1*(CUBE_BUF_WIDTH/8),3*(CUBE_BUF_WIDTH/8)
|
|
dc.w 2*(CUBE_BUF_WIDTH/8),3*(CUBE_BUF_WIDTH/8)
|
|
dc.w -1,-1,-1,-1,-1
|
|
dc.w -1,-1,-1,-1
|
|
dc.w -1,-1,-1,-1,-1
|
|
dc.w -1,-1,-1,-1
|
|
|
|
;----------------------------------------------------------------------------------
|
|
; Draw regular blitter line to blitter queue
|
|
;
|
|
; in d0.w x0
|
|
; d1.w y0
|
|
; d2.w x1
|
|
; d3.w y1
|
|
; a0 bitplane
|
|
; a4 blitterqueue struct
|
|
|
|
gou_draw_singledot_line_bq:
|
|
cmp.w d1,d3
|
|
bgt.s .downward
|
|
bne.s .cont
|
|
rts
|
|
.cont exg d0,d2
|
|
exg d1,d3
|
|
.downward
|
|
move.w d1,d5
|
|
lsl.w #6,d5 ; replaced mulu by shift (CUBE_BUF_WIDTH)
|
|
;mulu d4,d5
|
|
adda.w d5,a0
|
|
|
|
moveq.l #-16,d4
|
|
and.w d0,d4
|
|
lsr.w #3,d4
|
|
add.w d4,a0
|
|
|
|
moveq.l #15,d4
|
|
and.w d0,d4
|
|
ror.w #4,d4
|
|
or.w #BLTCON0F_USEA|BLTCON0F_USEC|BLTCON0F_USED|(BLT_A&BLT_B^BLT_C),d4
|
|
swap d4
|
|
|
|
sub.w d0,d2
|
|
bpl.s .positiveDX
|
|
neg.w d2
|
|
addq.w #1,d4
|
|
.positiveDX
|
|
sub.w d1,d3
|
|
cmp.w d2,d3
|
|
bls.s .absDyLessThanAbsDx
|
|
exg d2,d3
|
|
addq.w #4,d4
|
|
.absDyLessThanAbsDx
|
|
move.b .octants(pc,d4.w),d4
|
|
|
|
add.w d3,d3 ; 2 * dy
|
|
move.w d3,d5
|
|
sub.w d2,d5 ; 2 * dy - dx
|
|
bpl.s .positiveGradient
|
|
or.w #BLTCON1F_SIGN,d4
|
|
.positiveGradient
|
|
add.w d5,d5 ; 4 * dy - 2 * dx
|
|
;cmp.w #20,d2
|
|
;sgt bql_LongLine(a4)
|
|
add.w d2,d2 ; 2 * dx
|
|
add.w d2,d2 ; 4 * dx
|
|
add.w d3,d3 ; 4 * dy
|
|
|
|
move.w d3,d0
|
|
sub.w d2,d3 ; 4 * (dy - dx)
|
|
|
|
addq.w #4,d2 ; extra word height
|
|
lsl.w #4,d2
|
|
addq.w #2,d2 ; width == 2
|
|
|
|
move.l d4,bql_BltCon01(a4)
|
|
movem.w d0/d3/d5,bql_BltBMod(a4) ; 4 * dy
|
|
;move.w d3,bql_BltAMod(a4) ; 4 * (dy - dx)
|
|
;move.w d5,bql_BltAPtLo(a4) ; 4 * dy - 2 * dx
|
|
move.l a0,bql_BltCPt(a4)
|
|
move.w d2,bql_BltSize(a4)
|
|
move.l a4,a0
|
|
CALLFW AddToBlitterQueue
|
|
lea bql_SIZEOF(a4),a4
|
|
rts
|
|
|
|
.octants
|
|
dc.b BLTCON1F_SING|BLTCON1F_LINE|BLTCON1F_SUD ; octant 7
|
|
dc.b BLTCON1F_SING|BLTCON1F_LINE|BLTCON1F_SUD|BLTCON1F_AUL ; octant 4
|
|
dc.b BLTCON1F_SING|BLTCON1F_LINE|BLTCON1F_SUD|BLTCON1F_SUL ; octant 0
|
|
dc.b BLTCON1F_SING|BLTCON1F_LINE|BLTCON1F_SUD|BLTCON1F_SUL|BLTCON1F_AUL ; octant 3
|
|
dc.b BLTCON1F_SING|BLTCON1F_LINE|0 ; octant 6
|
|
dc.b BLTCON1F_SING|BLTCON1F_LINE|BLTCON1F_SUL ; octant 5
|
|
dc.b BLTCON1F_SING|BLTCON1F_LINE|BLTCON1F_AUL ; octant 1
|
|
dc.b BLTCON1F_SING|BLTCON1F_LINE|BLTCON1F_SUL|BLTCON1F_AUL ; octant 2
|
|
|
|
;--------------------------------------------------------------------
|
|
|
|
gou_bq_InitLineDraw:
|
|
PUTMSG 40,<"InitLineDraw">
|
|
moveq.l #-1,d0
|
|
move.w #BLTCON1F_LINE,bltcon1(a5)
|
|
move.w #$8000,bltadat(a5)
|
|
move.l d0,bltafwm(a5)
|
|
move.w d0,bltbdat(a5)
|
|
move.w #(CUBE_BUF_WIDTH/8)*CUBE_PLANES,bltcmod(a5)
|
|
BLTHOGON
|
|
moveq.l #0,d0
|
|
rts
|
|
|
|
gou_bq_LineDraw:
|
|
PUTMSG 40,<"LineDraw %p">,a0
|
|
move.l (a0)+,bltcon0(a5)
|
|
move.l (a0)+,bltcpt(a5)
|
|
move.l (a0)+,bltbmod(a5)
|
|
move.l (a0)+,bltapt+2(a5)
|
|
move.l (a0)+,bltdpt+2(a5)
|
|
rts
|
|
|
|
gou_bq_FillCube:
|
|
PUTMSG 40,<"FillCube">
|
|
moveq.l #-1,d0
|
|
lea bltcon0(a5),a1
|
|
move.l (a0)+,(a1)+ ; bltcon0
|
|
move.l d0,(a1)+ ; bltafwm
|
|
move.l (a0)+,bltamod(a5)
|
|
addq.l #8,a1
|
|
move.l (a0)+,(a1)+ ; bltapt
|
|
move.l (a0)+,(a1)+ ; bltdpt
|
|
move.w (a0)+,(a1) ; bltsize
|
|
rts
|
|
|
|
gou_bq_Clear:
|
|
PUTMSG 40,<"Clear">
|
|
move.l (a0)+,bltcon0(a5)
|
|
move.l (a0)+,bltdpt(a5)
|
|
move.w (a0)+,bltdmod(a5)
|
|
move.w (a0)+,bltcdat(a5)
|
|
move.w (a0)+,bltsize(a5)
|
|
rts
|
|
|
|
gou_bq_InPlaceModify:
|
|
PUTMSG 40,<"InPlaceModify">
|
|
BLTHOGON
|
|
moveq.l #-1,d0
|
|
lea bltcon0(a5),a1
|
|
move.l (a0)+,(a1)+ ; bltcon0
|
|
move.l d0,(a1)+ ; bltafwm
|
|
move.l (a0)+,d0
|
|
addq.l #8,a1 ; skip bltcpt/bltbpt
|
|
move.l d0,(a1)+ ; bltapt
|
|
move.l d0,(a1)+ ; bltdpt(a5)
|
|
move.w (a0)+,d0
|
|
move.w d0,bltamod(a5)
|
|
move.w d0,bltdmod(a5)
|
|
move.w (a0)+,bltcdat(a5)
|
|
move.w (a0)+,(a1)
|
|
BLTWAIT
|
|
rts
|
|
|
|
gou_bq_ADCopy:
|
|
PUTMSG 40,<"ADCopy">
|
|
BLTHOGON
|
|
lea bltcon0(a5),a1
|
|
move.l (a0)+,(a1)+ ; bltcon0
|
|
move.l (a0)+,(a1)+ ; bltafwm
|
|
move.l (a0)+,bltamod(a5)
|
|
addq.l #8,a1
|
|
move.l (a0)+,(a1)+ ; bltapt
|
|
move.l (a0)+,(a1)+ ; bltdpt
|
|
move.w (a0)+,(a1) ; bltsize
|
|
BLTWAIT
|
|
rts
|
|
|
|
|
|
;--------------------------------------------------------------------
|
|
;--------------------------------------------------------------------
|
|
|
|
SinScale MACRO
|
|
muls (a5,\1.w),\2
|
|
add.l \2,\2
|
|
add.l \2,\2
|
|
swap \2
|
|
ENDM
|
|
|
|
CosScale MACRO
|
|
muls (a0,\1.w),\2
|
|
add.l \2,\2
|
|
add.l \2,\2
|
|
swap \2
|
|
ENDM
|
|
|
|
SinScaleK MACRO
|
|
move.w (a5,\1.w),\3
|
|
muls \3,\2
|
|
add.l \2,\2
|
|
add.l \2,\2
|
|
swap \2
|
|
ENDM
|
|
|
|
CosScaleK MACRO
|
|
move.w (a0,\1.w),\3
|
|
muls \3,\2
|
|
add.l \2,\2
|
|
add.l \2,\2
|
|
swap \2
|
|
ENDM
|
|
|
|
ScalePrev MACRO
|
|
muls \1,\2
|
|
add.l \2,\2
|
|
add.l \2,\2
|
|
swap \2
|
|
ENDM
|
|
|
|
gou_rotate_cube: ; a1 = CubeData
|
|
DISABLE_INTS
|
|
PUSHM a1/a5
|
|
lea cd_CubeNormals+3*3*2(a1),a1
|
|
move.w pd_CubeSize(a6),d7
|
|
|
|
move.l fw_SinTable(a6),a5
|
|
move.l fw_CosTable(a6),a0 ; suppress M68kDeadWrite
|
|
movem.w pd_Ax(a6),a2-a4 ;ax,ay,az
|
|
|
|
; --- original formula ---
|
|
; x1 = x0*cos(az) - y0*sin(az)
|
|
; y1 = x0*sin(az) + y0*cos(az)
|
|
; z1 = z1
|
|
|
|
; x2 = x1
|
|
; y2 = y1*cos(ax) - z1*sin(ax)
|
|
; z2 = y1*sin(ax) + z1*cos(ax)
|
|
|
|
; x3 = z2*sin(ay) + x2*cos(ay)
|
|
; y3 = y2
|
|
; z3 = z2*cos(ay) - x2*sin(ay)
|
|
; ----
|
|
|
|
; x1 = sx*cos(az) - sy*sin(az)
|
|
; y1 = sx*sin(az) + sy*cos(az)
|
|
|
|
; z2 = y1*sin(ax) + sz*cos(ax)
|
|
; y3 = y1*cos(ax) - sz*sin(ax)
|
|
|
|
; x3 = z2*sin(ay) + x1*cos(ay)
|
|
; z3 = z2*cos(ay) - x1*sin(ay)
|
|
|
|
; for z-normal vector (0, 0, 1)
|
|
|
|
; z2 = s*cos(ax)
|
|
; y3 = -s*sin(ax)
|
|
|
|
; x3 = z2*sin(ay)
|
|
; z3 = z2*cos(ay)
|
|
|
|
move.w d7,d3
|
|
move.w d7,d2
|
|
SinScale a2,d2 ;d2 = -y = s*sin(ax)
|
|
neg.w d2
|
|
|
|
CosScale a2,d3 ;d3 = z2 = s*cos(ax)
|
|
move.w d3,d1
|
|
SinScale a3,d1 ;d1 = x = z2*sin(ay) = s*cos(ax) * sin(ay)
|
|
CosScale a3,d3 ;d3 = z = z2*cos(ay) = s*cos(ax) * cos(ay)
|
|
|
|
movem.w d1-d3,-(a1) ;x/y/z
|
|
|
|
; for y-normal vector (0, 1, 0)
|
|
; x1 = s*sin(az) ; also used in x-normal
|
|
; y1 = s*cos(az) ; also used in x-normal
|
|
|
|
; z2 = y1*sin(ax)
|
|
; y3 = y1*cos(ax) = s*cos(az)*cos(ax)
|
|
|
|
; x3 = z2*sin(ay) - x1*cos(ay) = y1*sin(ax)*sin(ay) - x1*cos(ay) = s*cos(az)*sin(ax)*sin(ay) - s*sin(az)*cos(ay)
|
|
; z3 = z2*cos(ay) + x1*sin(ay) = y1*sin(ax)*cos(ay) + x1*sin(ay) = s*cos(az)*sin(ax)*cos(ay) + s*sin(az)*sin(ay)
|
|
|
|
move.w d7,d6
|
|
SinScale a4,d7 ;d7 = x1 = s*sin(az)
|
|
CosScale a4,d6 ;d6 = y1 = s*cos(az)
|
|
|
|
move.w d6,d3
|
|
move.w d3,d2
|
|
CosScaleK a2,d2,d5 ;d2 = y = y1*cos(ax) = s*cos(az) * cos(ax)
|
|
swap d5 ;keep cos(ax) in upper word for later
|
|
SinScaleK a2,d3,d0 ;d3 = z2 = y1*sin(ax) = s*cos(az) * sin(ax)
|
|
swap d0 ;keep sin(ax) in upper word for later
|
|
|
|
move.w d3,d1
|
|
SinScaleK a3,d1,d5 ;d1 = z2*sin(ay) (keep sin(ay) in d5)
|
|
move.w d7,d4
|
|
ScalePrev d5,d4 ;d4 = x1*sin(ay)
|
|
|
|
CosScaleK a3,d3,d0 ;d3 = z2*cos(ay) (keep cos(ay) in d0)
|
|
add.w d4,d3 ;d3 = z = z2*cos(ay) + x1*sin(ay) = s*cos(az)*sin(ax)*cos(ay) + s*sin(az)*sin(ay)
|
|
|
|
move.w d7,d4
|
|
ScalePrev d0,d4 ;d4 = x1*cos(ay)
|
|
sub.w d4,d1 ;d1 = x = z2*sin(ay) - x1*cos(ay) = s*cos(az)*sin(ax)*sin(ay) - s*sin(az)*cos(ay)
|
|
|
|
movem.w d1-d3,-(a1) ;x/y/z
|
|
|
|
; for x-normal vector (1, 0, 0)
|
|
; x1 = s*cos(az)
|
|
; y1 = s*sin(az)
|
|
|
|
; z2 = y1*sin(ax)
|
|
; y3 = y1*cos(ax) = s*sin(az)*cos(ax)
|
|
|
|
; x3 = z2*sin(ay) + x1*cos(ay) = y1*sin(ax)*sin(ay) + x1*cos(ay) = s*sin(az)*sin(ax)*sin(ay) + s*cos(az)*cos(ay)
|
|
; z3 = z2*cos(ay) - x1*sin(ay) = y1*sin(ax)*cos(ay) - x1*sin(ay) = s*sin(az)*sin(ax)*cos(ay) - s*cos(az)*sin(ay)
|
|
|
|
swap d5 ; d5 = cos(ax)
|
|
move.w d7,d2
|
|
ScalePrev d5,d2 ; d2 = y = s*sin(az) * cos(ax)
|
|
|
|
swap d0 ; d0 = sin(ax)
|
|
ScalePrev d0,d7 ; d7 = z2 = s*sin(az) * sin(ax)
|
|
|
|
swap d5 ; d5 = sin(ay)
|
|
move.w d7,d1
|
|
ScalePrev d5,d1 ; d1 = z2*sin(ay) = s*sin(az) * sin(ax) * sin(ay)
|
|
|
|
swap d0 ; d0 = cos(ay)
|
|
move.w d6,d4
|
|
ScalePrev d0,d4 ; d4 = x1*cos(ay) = s*cos(az)*cos(ay)
|
|
add.w d4,d1 ; d1 = x = z2*sin(ay) + x1*cos(ay) = s*sin(az)*sin(ax)*sin(ay) + s*cos(az)*cos(ay)
|
|
|
|
ScalePrev d5,d6 ; d6 = x1*sin(ay) = s*cos(az)*sin(ay)
|
|
|
|
move.w d7,d3
|
|
ScalePrev d0,d3 ; d3 = z2*cos(ay) = s*sin(az) * sin(ax) * cos(ay)
|
|
sub.w d6,d3 ; d3 = z = z2*cos(ay) - x1*sin(ay) = s*sin(az)*sin(ax)*cos(ay) - s*cos(az)*sin(ay)
|
|
|
|
movem.w d1-d3,-(a1) ;x/y/z
|
|
|
|
move.w d1,d0
|
|
add.w d0,d0
|
|
move.w d2,a2
|
|
add.w d2,a2
|
|
move.w d3,d7
|
|
add.w d7,d7
|
|
|
|
movem.w 3*2(a1),d4-d6
|
|
|
|
add.w d4,d1
|
|
add.w d5,d2
|
|
add.w d6,d3
|
|
|
|
lea 12(a1),a3
|
|
|
|
add.w (a3)+,d1
|
|
add.w (a3)+,d2
|
|
add.w (a3)+,d3
|
|
move.l a1,a3
|
|
POPM
|
|
ENABLE_INTS
|
|
|
|
movem.w d1-d3,cd_Coords+6*3*2(a1)
|
|
|
|
neg.w d1
|
|
neg.w d2
|
|
neg.w d3
|
|
movem.w d1-d3,cd_Coords+0*3*2(a1) ; 0*3*2(a1)
|
|
|
|
add.w d0,d1
|
|
add.w a2,d2
|
|
add.w d7,d3
|
|
movem.w d1-d3,cd_Coords+1*3*2(a1)
|
|
|
|
neg.w d1
|
|
neg.w d2
|
|
neg.w d3
|
|
movem.w d1-d3,cd_Coords+7*3*2(a1)
|
|
|
|
sub.w d4,d1
|
|
sub.w d4,d1
|
|
sub.w d5,d2
|
|
sub.w d5,d2
|
|
sub.w d6,d3
|
|
sub.w d6,d3
|
|
movem.w d1-d3,cd_Coords+3*3*2(a1)
|
|
|
|
neg.w d1
|
|
neg.w d2
|
|
neg.w d3
|
|
movem.w d1-d3,cd_Coords+5*3*2(a1)
|
|
|
|
sub.w d0,d1
|
|
sub.w a2,d2
|
|
sub.w d7,d3
|
|
movem.w d1-d3,cd_Coords+4*3*2(a1)
|
|
|
|
neg.w d1
|
|
neg.w d2
|
|
neg.w d3
|
|
movem.w d1-d3,cd_Coords+2*3*2(a1)
|
|
|
|
; create flipped normals
|
|
movem.w (a3)+,d0-d7/a0
|
|
neg.w d0
|
|
neg.w d1
|
|
neg.w d2
|
|
neg.w d3
|
|
neg.w d4
|
|
neg.w d5
|
|
neg.w d6
|
|
neg.w d7
|
|
exg d0,a0
|
|
neg.w d0
|
|
exg d0,a0
|
|
movem.w d0-d7/a0,(a3)
|
|
rts
|
|
|
|
;--------------------------------------------------------------------
|
|
|
|
gou_cube_advance_scene_standard_movement:
|
|
move.w #1023*2,d6
|
|
movem.w pd_Ax(a6),d0-d5
|
|
add.w d3,d0
|
|
add.w d4,d1
|
|
add.w d5,d2
|
|
and.w d6,d0
|
|
and.w d6,d1
|
|
and.w d6,d2
|
|
movem.w d0-d2,pd_Ax(a6)
|
|
rts
|
|
|
|
;********************************************************************
|
|
|
|
gou_gray_palette:
|
|
ds.w 16
|
|
|
|
gou_gray_zebra_palette:
|
|
ds.w 16
|
|
|
|
; https://gradient-blaster-grahambates.vercel.app/?points=000@0,379@5,dc6@9,fff@16&steps=256&blendMode=oklab&ditherMode=off&target=amigaOcs
|
|
gou_sorted_palette:
|
|
dc.w $413,$002,$023,$035,$257,$379,$589,$8a8
|
|
dc.w $bb8,$dc6,$dd7,$ed9,$eea,$eec,$ffd,$fff
|
|
|
|
gou_zebra_palette:
|
|
dc.w $134,$112,$011,$145,$022,$379,$123,$49a
|
|
dc.w $133,$4bb,$244,$6dc,$354,$aed,$455,$dfe
|
|
|
|
gou_gray_shuffle:
|
|
dc.w 0*2,1*2,3*2,7*2,15*2,11*2,9*2,8*2,12*2,13*2,5*2,4*2,6*2,14*2,10*2,2*2
|
|
|
|
gou_mauve_palette:
|
|
REPT 16
|
|
dc.w $413
|
|
ENDR
|
|
|
|
gou_black_palette:
|
|
ds.w 16
|
|
|
|
PLANELINEMASK MACRO
|
|
dc.w ((1<<\1)|(1<<\2)|(1<<\3)|(1<<\4))
|
|
ENDM
|
|
|
|
PLANECOORDMASK MACRO
|
|
dc.w (1<<\1)|(1<<\2)|(1<<\3)|(1<<\4)
|
|
ENDM
|
|
|
|
PROJPLANE MACRO
|
|
dc.w (\1)*4,(\2)*4,(\3)*4,(\4)*4
|
|
ENDM
|
|
|
|
ROTATEDPLANE MACRO
|
|
dc.w (\1)*6,(\2)*6,(\3)*6,(\4)*6
|
|
ENDM
|
|
|
|
PLANELINES MACRO
|
|
dc.w cd_IntCubeLines+(\1)*il_SIZEOF
|
|
dc.w cd_IntCubeLines+(\2)*il_SIZEOF
|
|
dc.w cd_IntCubeLines+(\3)*il_SIZEOF
|
|
dc.w cd_IntCubeLines+(\4)*il_SIZEOF
|
|
ENDM
|
|
|
|
gou_cube_plane_coords:
|
|
PLANELINEMASK 5,10,1,9
|
|
PLANECOORDMASK 5,6,2,1
|
|
|
|
PLANELINEMASK 4,5,6,7
|
|
PLANECOORDMASK 4,5,6,7
|
|
|
|
PLANELINEMASK 6,11,2,10
|
|
PLANECOORDMASK 6,7,3,2
|
|
|
|
PLANELINEMASK 7,8,3,11
|
|
PLANECOORDMASK 7,4,0,3
|
|
|
|
PLANELINEMASK 0,1,2,3
|
|
PLANECOORDMASK 0,1,2,3
|
|
|
|
PLANELINEMASK 4,9,0,8
|
|
PLANECOORDMASK 4,5,1,0
|
|
|
|
;
|
|
; 0_____________1
|
|
; /| /|
|
|
; /_|__________/ |
|
|
; |3 | |2 |
|
|
; | | | |
|
|
; | | | |
|
|
; | 4|_________|__|5
|
|
; | / | /
|
|
;7|/___________|/6
|
|
;
|
|
; lines:
|
|
; 0: 0 <-> 1
|
|
; 1: 1 <-> 2
|
|
; 2: 2 <-> 3
|
|
; 3: 3 <-> 0
|
|
; 4: 4 <-> 5
|
|
; 5: 5 <-> 6
|
|
; 6: 6 <-> 7
|
|
; 7: 7 <-> 4
|
|
; 8: 0 <-> 4
|
|
; 9: 1 <-> 5
|
|
; 10: 2 <-> 6
|
|
; 11: 3 <-> 7
|
|
gou_proj_cube_planes:
|
|
; attention, inverse order as plane number is counted backwards
|
|
PROJPLANE 4,5,1,0
|
|
PROJPLANE 0,1,2,3
|
|
PROJPLANE 7,4,0,3
|
|
PROJPLANE 6,7,3,2
|
|
PROJPLANE 4,5,6,7
|
|
PROJPLANE 5,6,2,1
|
|
|
|
gou_rotated_cube_planes:
|
|
; attention, inverse order as plane number is counted backwards
|
|
ROTATEDPLANE 4,5,1,0
|
|
ROTATEDPLANE 0,1,2,3
|
|
ROTATEDPLANE 7,4,0,3
|
|
ROTATEDPLANE 6,7,3,2
|
|
ROTATEDPLANE 4,5,6,7
|
|
ROTATEDPLANE 5,6,2,1
|
|
|
|
gou_cube_planes_to_lines:
|
|
; attention, inverse order as plane number is counted backwards
|
|
PLANELINES 4,9,0,8
|
|
PLANELINES 0,1,2,3
|
|
PLANELINES 7,8,3,11
|
|
PLANELINES 6,11,2,10
|
|
PLANELINES 4,5,6,7
|
|
PLANELINES 5,10,1,9
|
|
|
|
gou_cube_lines:
|
|
dc.w 0*4,1*4 ; 0 -> 01
|
|
dc.w 1*4,2*4 ; 1 -> 12
|
|
dc.w 2*4,3*4 ; 2 -> 23
|
|
dc.w 0*4,3*4 ; 3 -> 30
|
|
|
|
dc.w 4*4,5*4 ; 4 -> 45
|
|
dc.w 5*4,6*4 ; 5 -> 56
|
|
dc.w 6*4,7*4 ; 6 -> 67
|
|
dc.w 4*4,7*4 ; 7 -> 74
|
|
|
|
dc.w 0*4,4*4 ; 4 -> 04
|
|
dc.w 1*4,5*4 ; 5 -> 15
|
|
dc.w 2*4,6*4 ; 6 -> 26
|
|
dc.w 3*4,7*4 ; 7 -> 37
|
|
|
|
;--------------------------------------------------------------------
|
|
|
|
section "gou_copper",data,chip
|
|
|
|
gou_copperlist:
|
|
COP_MOVE dmacon,DMAF_BLITHOG ; disable blitter hogging to avoid interrupt latency
|
|
|
|
COP_MOVE bplcon3,$0c00
|
|
|
|
COP_MOVE fmode,$0000 ; fixes the aga modulo problem
|
|
COP_MOVE bplcon0,$0200
|
|
COP_MOVE bplcon2,$0024
|
|
COP_MOVE bpl1mod,(CUBE_WIDTH/8)*(CUBE_PLANES-1)
|
|
COP_MOVE bpl2mod,(CUBE_WIDTH/8)*(CUBE_PLANES-1)
|
|
|
|
gou_extra_copperlist_ptr:
|
|
COP_MOVE cop2lc,0
|
|
COP_MOVE cop2lc+2,0
|
|
COP_MOVE $1fe,0
|
|
COP_END
|
|
|
|
gou_bendit_sprite:
|
|
incbin "data/gouraud/bendit128x128x4.SPR"
|
|
|
|
blitter_temp_output_word:
|
|
dc.w 0
|
|
|
|
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 |