Hamazing/source/gouraud/gouraud.asm

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 "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
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