Hamazing/source/bulb/bulb.asm

3616 lines
100 KiB
NASM

; TODOs:
; - fix stray unfilled pixels in text panel gfx?
; - fix bugs in outro (top line, right hand side diagonal line problem)
;
; 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 = 0
FW_MUSIC_PLAYER_CHOICE = 0 ; 0 = None, 1 = LSP, 2 = LSP_CIA, 3 = P61A, 4 = Pretracker (CPU DMA wait), 5 = Pretracker Turbo (Copper wait)
FW_LMB_EXIT_SUPPORT = 1 ; allows abortion of intro with LMB
FW_MULTIPART_SUPPORT = 0 ; DO NOT CHANGE (not supported for standalone mode)
FW_DYNAMIC_MEMORY_SUPPORT = 1 ; enable dynamic memory allocation. Otherwise, use fw_ChipMemStack/End etc fields.
FW_MAX_MEMORY_STATES = 4 ; the amount of memory states
FW_TOP_BOTTOM_MEM_SECTIONS = 0 ; allow allocations from both sides of the memory
FW_64KB_PAGE_MEMORY_SUPPORT = 0 ; allow allocation of chip memory that doesn't cross the 64 KB page boundary
FW_MULTITASKING_SUPPORT = 1 ; enable multitasking
FW_ROUNDROBIN_MT_SUPPORT = 0 ; enable fair scheduling among tasks with same priority
FW_BLITTERTASK_MT_SUPPORT = 0 ; enable single parallel task during large blits
FW_MAX_VPOS_FOR_BG_TASK = 308 ; max vpos that is considered to be worth switching to a background task, if any
FW_SCRIPTING_SUPPORT = 0 ; enable simple timed scripting functions
FW_SINETABLE_SUPPORT = 1 ; enable creation of 1024 entries sin/cos table
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 = 1 ; 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 = 1 ; 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
ENDC
KNIGHTS_WIDTH = 320
KNIGHTS_HEIGHT = 180
KNIGHTS_BPLSIZE = (KNIGHTS_WIDTH*KNIGHTS_HEIGHT)/8
KNIGHTS_SLICE_WIDTH = 32
KNIGHTS_MOD = (2*KNIGHTS_WIDTH)/8
KNIGHTS_BUF_WIDTH = 8*KNIGHTS_WIDTH
KNIGHTS_BUF_MOD = (KNIGHTS_BUF_WIDTH/8)
KNIGHTS_TMP_BUFFER_SIZE = 3*(KNIGHTS_SLICE_WIDTH/8)*KNIGHTS_HEIGHT
NUM_LAMP_ROTATIONS = 41
LAMP_WIDTH = 48
LAMP_HEIGHT = 32
LAMP_PLANES = 4
TITLETEXT_WIDTH = 128
TITLETEXT_HEIGHT = 80
TITLETEXT_PLANES = 2
TITLETEXT_Y_POS = 88
TITLETEXT_X_POS = 96
BQ_SIZE = 6000
NUM_BQ_AHEAD_BUFFERS = 12
SWING_FRAMES = 256
PAINT_FRAMES = 258
ALL_SWING_FRAMES = SWING_FRAMES+48
ALL_PAINT_FRAMES = PAINT_FRAMES+48
COP_PREAMBLE_INST = 16 ; bplptrs
COP_POST_INST = 16 ; wait
COP_INST_PER_LINE = 1+4+1 ; wait, 4 colors, aux
COP_LIST_SIZE = (COP_PREAMBLE_INST+COP_INST_PER_LINE*KNIGHTS_HEIGHT+COP_POST_INST)*4
CHIPMEM_SIZE = (KNIGHTS_BPLSIZE*16)+COP_LIST_SIZE*2+KNIGHTS_TMP_BUFFER_SIZE+NUM_BQ_AHEAD_BUFFERS*(KNIGHTS_HEIGHT*4*2)+NUM_LAMP_ROTATIONS*(LAMP_WIDTH/8)*(LAMP_HEIGHT+2)*LAMP_PLANES+(TITLETEXT_WIDTH/8)*(TITLETEXT_HEIGHT+1)*TITLETEXT_PLANES*2
FASTMEM_SIZE = KNIGHTS_WIDTH*KNIGHTS_HEIGHT*2+NUM_BQ_AHEAD_BUFFERS*BQ_SIZE+(ALL_SWING_FRAMES+ALL_PAINT_FRAMES+PAINT_FRAMES)*4+4096*2
IFND DEBUG_DETAIL
DEBUG_DETAIL SET 10
ENDC
NEWAGE_DEBUG = 1
include "framework.i"
; Memory use:
; - CHIP DATA: 320 x 180 x 6 = 43200 (6 original, planar, scrambled as 4+2)
; - CHIP DATA: 128 x 65 x 2 x 2 = 4160 (text sprites)
;
; - CHIP BSS : 320 x 180 x 8 x 2 = 115200 (4x2 db / 2x2 db, 2 draw, 2 fill, interleaved)
; - CHIP BSS : 2 x 180 x 4 x 2 = 2880 (4 line colors, db)
; - CHIP BSS : 48 x 34 x 4 x 41 = 33456 (lamp rotations)
;
; Total: 202 KB
;
; Fast memory use:
; - FAST DATA: 48 x 32 x 8 = 1536 (lamp chunky)
;
; - FAST BSS : 320 x 180 x 2 = 115200 (True color buffer)
; - FAST BSS : 6000 x 8 = 48000 (Blitterqueues)
;
; Algorithm:
; - mark all blocks as darkest
; - restore left hand side color via blitter
; - for both line pairs lines:
; - draw blitter lines in single bitplane
; - fill stripes according to stripe information to separate bitplanes
; - clear blitter lines in single bitplane
; - redraw dirty stripes
; - mode:
; - plain: just copy (darkest only needs 2 planes copy + 1-2 planes black)
; - darkest/dark: copy directly with mask (may overlap dark/bright)
; - dark/bright: copy directly with mask
; - darkest/dark/bright: copy with mask from existing background
; - draw blitter line in lower four bitplanes with color pattern
; - stops at left hand side edge
; - call precalculated line color copying
; - if left hand side edge is reached, continues to overwrite left hand side color
; - draw blitter line in upper two bitplanes with zero to make index color
; - blit colors with shifting into copperlists
;
; Memory layout:
; a1-b1-a2-b2-a3-b3-a4-b4 = 8*320*180 = 57600
; a5-b5-a6-b6-d1-f1-d2-f2 = 8*320*180 = 57600
; p1-p2-p3-p4 = 4*320*180 = 28800
; p5-p6 = 2*320*180 = 14400
;
; Per frame:
; 4+2+4 lines, 9-12 fill blits, 130-200 paint blits
STRUCTURE RayData,0
UWORD rd_StartY12
UWORD rd_StartX1
UWORD rd_EndY1
UWORD rd_EndX1
UWORD rd_StartX2
UWORD rd_EndY2
UWORD rd_EndX2
LABEL rd_SIZEOF
STRUCTURE PartData,fw_SIZEOF
APTR pd_CurrDbPlanesP1234Ptr
APTR pd_CurrDbPlanesP56Ptr
APTR pd_LastDbPlanesP1234Ptr
APTR pd_LastDbPlanesP56Ptr
APTR pd_CurrLineColorsPtr
APTR pd_CurrCopListPtr
APTR pd_LastCopListPtr
APTR pd_CurrTextSpritesPtr
APTR pd_LastTextSpritesPtr
APTR pd_SpriteDataPtr
UBYTE pd_DbToggle
UBYTE pd_AsyncDbToggle
ALIGNWORD
UWORD pd_PartCountDown
BOOL pd_LampIsOn
UWORD pd_CopperLinesFixupOffset
UWORD pd_CopperLogoColorOffset
UWORD pd_SwingFrameNum
UWORD pd_PaintFrameNum
UWORD pd_LampFrameNum
UWORD pd_PullDownYPos
UWORD pd_NextQueueTriggerFrame
UWORD pd_CurrBlitSize
UWORD pd_LampYOffset
BOOL pd_PrecalcDone
APTR pd_CopperList1
APTR pd_CopperList2
APTR pd_DbBufferP1234
APTR pd_DbBufferP56
APTR pd_OriginalBufferP1234
APTR pd_OriginalBufferP56
APTR pd_MiddleMaskBuffer
APTR pd_RightMaskBuffer
APTR pd_BothLinesMaskBuffer
APTR pd_LineColorsBuffer
APTR pd_LampSpriteBuffer
APTR pd_TextSpriteBuffer
APTR pd_BqBuffer
APTR pd_BqDataReadPtr
APTR pd_BqDataWritePtr
APTR pd_BqDataEndPtr
UWORD pd_PrecalculatedFrames
LABEL pd_LampChunkyBuffer
APTR pd_TrueColorImage
APTR pd_SwingDataPtr
APTR pd_TextPaintDataPtr
APTR pd_TextPanelsPtr
APTR pd_SourcePanelPtr
UWORD pd_SourcePanelNum
APTR pd_FillBrightBuffer
APTR pd_FillDarkBuffer
APTR pd_DrawBrightBuffer
APTR pd_DrawDarkBuffer
APTR pd_SwingScriptFramesPtrs
APTR pd_PaintScriptFramesPtrs
APTR pd_TextPaintScriptFramesPtrs
APTR pd_ShadeTableXor
STRUCT pd_LampSprites,8*4
STRUCT pd_TextSprites,2*(TITLETEXT_WIDTH/16)*4
STRUCT pd_XSheer1,LAMP_HEIGHT
STRUCT pd_XSheer2,LAMP_HEIGHT
STRUCT pd_YSheer,LAMP_WIDTH
STRUCT pd_LampPalette,15*cl_SIZEOF
STRUCT pd_KnightsPalette,16*2
STRUCT pd_PreparationTask,ft_SIZEOF
LABEL pd_SIZEOF
IFND FW_DEMO_PART
include "framework.asm"
ENDC
entrypoint:
IFD FW_DEMO_PART
move.l #pd_SIZEOF,d0
CALLFW InitPart
ENDC
bsr.s blb_init
move.w #DMAF_SETCLR|DMAF_SPRITE,dmacon(a5) ; enable sprite dma
lea blb_copperlist,a0
CALLFW SetCopper
bsr blb_intro
bsr blb_main
bsr blb_brighten
bsr blb_outro
CALLFW SetBaseCopper
rts
;--------------------------------------------------------------------
blb_init:
bsr blb_init_vars
bsr blb_init_lamp_sprite_pointers
bsr blb_rearrange_buffers
bsr blb_clear_mask_buffers
bsr blb_init_colors
lea .backgroundtasks(pc),a0
lea pd_PreparationTask(a6),a1
CALLFW AddTask
rts
.backgroundtasks
bsr blb_do_lamp_rotations
bsr blb_calc_true_color_image
bsr blb_calc_scene_pointers
st pd_PrecalcDone(a6)
bsr blb_init_shade_table
rts
;--------------------------------------------------------------------
blb_init_vars:
tst.w fw_AgaChipset(a6)
beq.s .noaga
move.w #$00a0,blb_ddfstop+2 ; FIXME
move.w #$0003,blb_fmode+2
.noaga
lea blb_text_panels(pc),a0
move.l a0,pd_TextPanelsPtr(a6)
move.l #(COP_LIST_SIZE*2),d0
CALLFW AllocChip
PUTMSG 10,<"Copperlist 1 %p">,a0
move.l a0,pd_CopperList1(a6)
move.l a0,pd_CurrCopListPtr(a6)
lea COP_LIST_SIZE(a0),a0
PUTMSG 10,<"Copperlist 2 %p">,a0
move.l a0,pd_CopperList2(a6)
move.l a0,pd_LastCopListPtr(a6)
move.l #(KNIGHTS_BPLSIZE*16),d0
CALLFW AllocChip
PUTMSG 10,<"DbBufferP1234 %p">,a0
move.l a0,pd_DbBufferP1234(a6)
move.l a0,pd_CurrDbPlanesP1234Ptr(a6)
lea 1*KNIGHTS_WIDTH/8(a0),a1
move.l a1,pd_LastDbPlanesP1234Ptr(a6)
adda.l #8*KNIGHTS_BPLSIZE,a0
PUTMSG 10,<"DbBufferP56 %p">,a0
move.l a0,pd_DbBufferP56(a6)
move.l a0,pd_CurrDbPlanesP56Ptr(a6)
lea 1*KNIGHTS_WIDTH/8(a0),a1
move.l a1,pd_LastDbPlanesP56Ptr(a6)
lea 4*KNIGHTS_WIDTH/8(a0),a0
move.l a0,pd_DrawBrightBuffer(a6)
lea 1*KNIGHTS_WIDTH/8(a0),a0
move.l a0,pd_FillBrightBuffer(a6)
lea 1*KNIGHTS_WIDTH/8(a0),a0
move.l a0,pd_DrawDarkBuffer(a6)
lea 1*KNIGHTS_WIDTH/8(a0),a0
move.l a0,pd_FillDarkBuffer(a6)
lea blb_bulb_pic,a0
move.l a0,pd_OriginalBufferP1234(a6)
PUTMSG 10,<"OriginalBufferP1234 %p">,a0
lea 4*KNIGHTS_BPLSIZE(a0),a0
PUTMSG 10,<"OriginalBufferP56 %p">,a0
move.l a0,pd_OriginalBufferP56(a6)
move.l #KNIGHTS_TMP_BUFFER_SIZE,d0
CALLFW AllocChip
move.l a0,pd_MiddleMaskBuffer(a6)
lea (KNIGHTS_SLICE_WIDTH/8)*KNIGHTS_HEIGHT(a0),a0
move.l a0,pd_RightMaskBuffer(a6)
lea (KNIGHTS_SLICE_WIDTH/8)*KNIGHTS_HEIGHT(a0),a0
move.l a0,pd_BothLinesMaskBuffer(a6)
move.l #NUM_LAMP_ROTATIONS*(LAMP_WIDTH/8)*(LAMP_HEIGHT+2)*LAMP_PLANES,d0
CALLFW AllocChip
PUTMSG 10,<"LampSpriteBuffer %p">,a0
move.l a0,pd_LampSpriteBuffer(a6)
move.l #(TITLETEXT_WIDTH/8)*(TITLETEXT_HEIGHT+1)*TITLETEXT_PLANES*2,d0
CALLFW AllocChip
PUTMSG 10,<"TextSpriteBuffer %p">,a0
move.l a0,pd_TextSpriteBuffer(a6)
lea pd_TextSprites(a6),a1
move.l a1,pd_CurrTextSpritesPtr(a6)
moveq.l #2*(TITLETEXT_WIDTH/16)-1,d7
.tsprloop
move.l a0,(a1)+
clr.l TITLETEXT_HEIGHT*2*TITLETEXT_PLANES(a0)
lea (TITLETEXT_HEIGHT+1)*2*TITLETEXT_PLANES(a0),a0
dbra d7,.tsprloop
move.l #NUM_BQ_AHEAD_BUFFERS*KNIGHTS_HEIGHT*4*2,d0
CALLFW AllocChip
PUTMSG 10,<"LineColorsBuffer %p">,a0
move.l a0,pd_LineColorsBuffer(a6)
move.l a0,pd_CurrLineColorsPtr(a6)
move.l #(KNIGHTS_WIDTH*KNIGHTS_HEIGHT*2),d0
CALLFW AllocFast
PUTMSG 10,<"TrueColorImage %p">,a0
move.l a0,pd_TrueColorImage(a6)
move.l #NUM_BQ_AHEAD_BUFFERS*BQ_SIZE,d0
CALLFW AllocFast
PUTMSG 10,<"BqBuffers %p">,a0
addq.l #4,a0 ; extra longwords for blitsize & lamp on
move.l a0,pd_BqDataReadPtr(a6)
move.l a0,pd_BqDataWritePtr(a6)
move.l a0,pd_BqBuffer(a6)
add.l #NUM_BQ_AHEAD_BUFFERS*BQ_SIZE,a0
move.l a0,pd_BqDataEndPtr(a6)
move.l #(ALL_SWING_FRAMES+ALL_PAINT_FRAMES+PAINT_FRAMES)*4,d0
CALLFW AllocFast
PUTMSG 10,<"ScriptFramesPtrs %p">,a0
move.l a0,pd_SwingScriptFramesPtrs(a6)
lea ALL_SWING_FRAMES*4(a0),a0
move.l a0,pd_PaintScriptFramesPtrs(a6)
lea ALL_PAINT_FRAMES*4(a0),a0
move.l a0,pd_TextPaintScriptFramesPtrs(a6)
move.l #4096*2,d0
CALLFW AllocFast
move.l a0,pd_ShadeTableXor(a6)
PUTMSG 10,<"ShadeTableXor %p">,a0
rts
;--------------------------------------------------------------------
blb_init_lamp_sprite_pointers:
lea blb_coppersprites+2,a0
lea fw_EmptySprite(a6),a1
moveq.l #8-1,d7
.sprloop
move.w (a1),(a0)
move.w 2(a1),4(a0)
addq.w #8,a0
dbra d7,.sprloop
rts
;--------------------------------------------------------------------
blb_init_colors:
lea color(a5),a1
lea blb_bulb_palette_expanded(pc),a0
moveq.l #(16/2)-1,d7
.ploop
move.l (a0)+,(a1)+
dbra d7,.ploop
addq.w #2,a1
lea blb_lamp_off_palette(pc),a0
moveq.l #15-1,d7
.palloop
move.w (a0)+,(a1)+
dbra d7,.palloop
moveq.l #15,d0
lea blb_lamp_off_palette(pc),a0
lea pd_LampPalette(a6),a1
CALLFW InitPaletteLerp
rts
;--------------------------------------------------------------------
blb_init_shade_table:
move.l pd_ShadeTableXor(a6),a0
PUTMSG 10,<"%d: Init Shade Table %p">,fw_FrameCounter-2(a6),a0
move.l a0,a1
moveq.l #0,d0
.xorloop
moveq.l #$11,d3
moveq.l #15,d1
cmp.b d1,d0
bhi.s .upperset
and.b d1,d3
.upperset
and.b d0,d1
bne.s .lowerset
subq.b #1,d3
.lowerset
move.w d3,(a0)+
addq.b #1,d0
bne.s .xorloop
moveq.l #15-1,d7
move.l #$01000100,d3
.xoroloop
move.l a1,a2
move.w #128-1,d6
.xor2loop
move.l (a2)+,d0
add.l d3,d0
move.l d0,(a0)+
dbra d6,.xor2loop
dbra d7,.xoroloop
rts
;--------------------------------------------------------------------
blb_intro:
bsr blb_flip_db_frame
bsr blb_intro_fill_low_brightness
bsr blb_flip_db_frame
bsr blb_intro_fill_low_brightness
move.w #320,pd_LampFrameNum(a6)
move.w #-80,pd_LampYOffset(a6)
IFD FW_DEMO_PART
CALLFW StartMusic
ENDC
.loop
CALLFW VSyncWithTask
bsr blb_flip_copper_frame
bsr blb_update_lamp_sprite
move.w pd_LampYOffset(a6),d0
beq.s .skipdown
addq.w #1,d0
move.w d0,pd_LampYOffset(a6)
.skipdown
bsr blb_create_intro_copperlist
bsr blb_update_copper_list_pointers
tst.w pd_LampYOffset(a6)
bne.s .loop
tst.w pd_PrecalcDone(a6)
beq.s .loop
move.b pd_AsyncDbToggle(a6),d0
cmp.b pd_DbToggle(a6),d0
bne.s .loop
rts
;--------------------------------------------------------------------
blb_main:
move.w #5*256+32,pd_PartCountDown(a6)
CALLFW SetBlitterQueueMultiFrame
move.w #-1,pd_CurrBlitSize(a6)
PUTMSG 10,<"%d: Main!">,fw_FrameCounter-2(a6)
lea .vblstuff(pc),a0
move.l a0,fw_VBlankIRQ(a6)
bsr blb_flip_db_frame
bsr blb_create_bulb_copperlist
bsr blb_patch_in_text_sprites_to_copperlist
bsr blb_update_copper_list_pointers
CALLFW VSyncWithTask
PUTMSG 10,<"%d: Main 2">,fw_FrameCounter-2(a6)
bsr blb_flip_db_frame
bsr blb_create_bulb_copperlist
bsr blb_patch_in_text_sprites_to_copperlist
bsr blb_update_copper_list_pointers
.loop
bsr blb_flip_db_frame
CALLFW JoinBlitterQueue
bsr blb_swing_around
move.l pd_BqDataWritePtr(a6),a4
move.l -4(a1),-4(a4)
move.w #KNIGHTS_BUF_WIDTH/8,d4
bsr blb_blitter_line_init_bq
bsr blb_draw_rays
bsr blb_create_terminal_bq_node
bsr blb_add_branch_on_second_bq_node
move.l pd_DrawDarkBuffer(a6),a3
move.l pd_FillDarkBuffer(a6),a2
bsr blb_fill_rays
move.l pd_DrawBrightBuffer(a6),a3
move.l pd_FillBrightBuffer(a6),a2
bsr blb_fill_rays
bsr blb_do_bresenham_rays_color_fixup
cmp.w #17000,pd_CurrBlitSize(a6)
blt.s .donthog
PUTMSG 20,<"Hogging frame %d">,pd_CurrBlitSize-2(a6)
CALLFW JoinBlitterQueue
.donthog
bsr blb_paint_around
bsr blb_paint_slices
bsr blb_draw_fixup_rays
bsr blb_paint_text_slices
move.l pd_BqDataWritePtr(a6),a0
bsr blb_add_execute_twice_bq_node
bsr blb_create_nop_bq_node
ADD_TO_BLITTER_QUEUE a0,a2
sub.l pd_BqDataWritePtr(a6),a4
PUTMSG 20,<"Queue size %ld">,a4
TERMINATE_BLITTER_QUEUE
.waitforbqspaceloop
move.l pd_BqDataWritePtr(a6),a0
move.l pd_CurrLineColorsPtr(a6),a2
lea KNIGHTS_HEIGHT*4*2(a2),a2
lea BQ_SIZE(a0),a1
cmp.l pd_BqDataEndPtr(a6),a1
bne.s .nowrapbqwrite
move.l pd_BqBuffer(a6),a1
move.l pd_LineColorsBuffer(a6),a2
.nowrapbqwrite
cmp.l pd_BqDataReadPtr(a6),a1
bne.s .nowait
PUTMSG 40,<"%d: Waiting for space Read: %p Write: %p">,fw_FrameCounter-2(a6),pd_BqDataReadPtr(a6),pd_BqDataWritePtr(a6)
CALLFW JoinBlitterQueue
CALLFW VSyncWithTask
bra.s .waitforbqspaceloop
.nowait
move.l a1,pd_BqDataWritePtr(a6)
move.l a2,pd_CurrLineColorsPtr(a6)
PUTMSG 40,<"%d: Done a frame Read: %p Write: %p">,fw_FrameCounter-2(a6),pd_BqDataReadPtr(a6),pd_BqDataWritePtr(a6)
subq.w #1,pd_PartCountDown(a6)
bne .loop
rts
.vblstuff
bsr blb_update_lamp_sprite
tst.b pd_LampFrameNum+1(a6)
bne.s .nonextpanel
move.l pd_TextPanelsPtr(a6),a0
move.l (a0)+,pd_SourcePanelPtr(a6)
move.l a0,pd_TextPanelsPtr(a6)
move.w pd_SourcePanelNum(a6),d0
bne.s .notfirst
move.w d0,pd_CurrBlitSize(a6)
.notfirst
addq.w #1,d0
move.w d0,pd_SourcePanelNum(a6)
subq.w #4,d0
beq.s .insidelogo
subq.w #2,d0
bne.s .nonextpanel
move.w blb_lamp_palette+1*2(pc),d0
bra.s .fixcolor
.insidelogo
move.w #$f88,d0
.fixcolor
move.l pd_CurrCopListPtr(a6),a0
add.w pd_CopperLogoColorOffset(a6),a0
move.w d0,(a0)
move.w d0,COP_INST_PER_LINE*4(a0)
move.l pd_LastCopListPtr(a6),a0
add.w pd_CopperLogoColorOffset(a6),a0
move.w d0,(a0)
move.w d0,COP_INST_PER_LINE*4(a0)
.nonextpanel
tst.w pd_CurrBlitSize(a6)
bne.s .nop
move.l pd_BqDataReadPtr(a6),a0
cmp.l pd_BqDataWritePtr(a6),a0
beq.s .nop
move.w fw_FrameCounter(a6),d0
cmp.w pd_NextQueueTriggerFrame(a6),d0
blt.s .nop
beq.s .nodrop
tst.w pd_NextQueueTriggerFrame(a6)
beq.s .nodrop
subq.w #1,pd_LampFrameNum(a6)
PUTMSG 10,<"%d: Framedrop %d vs %d!">,fw_FrameCounter-2(a6),pd_NextQueueTriggerFrame-2(a6),d0
.nodrop
addq.w #2,d0
move.w d0,pd_NextQueueTriggerFrame(a6)
PUTMSG 20,<"%d: Triggering queue %p">,fw_FrameCounter-2(a6),a0
move.w -4(a0),pd_CurrBlitSize(a6)
BLTWAIT
CALLFW TriggerCustomBlitterQueue
rts
.nop
PUTMSG 20,<"%d: Ignoring">,fw_FrameCounter-2(a6)
rts
;--------------------------------------------------------------------
blb_brighten:
move.w #48,pd_PartCountDown(a6)
moveq.l #15,d0
move.w #64,d1
lea blb_lamp_white_palette(pc),a0
lea pd_LampPalette(a6),a1
CALLFW FadePaletteTo
PUTMSG 10,<"%d: Brighten!">,fw_FrameCounter-2(a6)
move.w #SWING_FRAMES*4,pd_SwingFrameNum(a6)
move.w #PAINT_FRAMES*4,pd_PaintFrameNum(a6)
.loop
bsr blb_flip_db_frame
CALLFW JoinBlitterQueue
bsr blb_swing_around_brighten
move.l pd_BqDataWritePtr(a6),a4
move.l -4(a1),-4(a4)
move.w #KNIGHTS_BUF_WIDTH/8,d4
bsr blb_blitter_line_init_bq
bsr blb_draw_rays
bsr blb_create_terminal_bq_node
bsr blb_add_branch_on_second_bq_node
move.l pd_DrawDarkBuffer(a6),a3
move.l pd_FillDarkBuffer(a6),a2
bsr blb_fill_rays
move.l pd_DrawBrightBuffer(a6),a3
move.l pd_FillBrightBuffer(a6),a2
bsr blb_fill_rays
bsr blb_do_bresenham_rays_color_fixup
cmp.w #17000,pd_CurrBlitSize(a6)
blt.s .donthog
PUTMSG 20,<"Hogging frame %d">,pd_CurrBlitSize-2(a6)
CALLFW JoinBlitterQueue
.donthog
bsr blb_paint_around_brighten
bsr blb_paint_slices
bsr blb_draw_fixup_rays
move.l pd_BqDataWritePtr(a6),a0
bsr blb_add_execute_twice_bq_node
bsr blb_create_nop_bq_node
ADD_TO_BLITTER_QUEUE a0,a2
sub.l pd_BqDataWritePtr(a6),a4
PUTMSG 20,<"Queue size %ld">,a4
TERMINATE_BLITTER_QUEUE
.waitforbqspaceloop
move.l pd_BqDataWritePtr(a6),a0
move.l pd_CurrLineColorsPtr(a6),a2
lea KNIGHTS_HEIGHT*4*2(a2),a2
lea BQ_SIZE(a0),a1
cmp.l pd_BqDataEndPtr(a6),a1
bne.s .nowrapbqwrite
move.l pd_BqBuffer(a6),a1
move.l pd_LineColorsBuffer(a6),a2
.nowrapbqwrite
cmp.l pd_BqDataReadPtr(a6),a1
bne.s .nowait
PUTMSG 40,<"%d: Waiting for space Read: %p Write: %p">,fw_FrameCounter-2(a6),pd_BqDataReadPtr(a6),pd_BqDataWritePtr(a6)
CALLFW JoinBlitterQueue
CALLFW VSyncWithTask
bra.s .waitforbqspaceloop
.nowait
move.l a1,pd_BqDataWritePtr(a6)
move.l a2,pd_CurrLineColorsPtr(a6)
PUTMSG 40,<"%d: Done a frame Read: %p Write: %p">,fw_FrameCounter-2(a6),pd_BqDataReadPtr(a6),pd_BqDataWritePtr(a6)
subq.w #1,pd_PartCountDown(a6)
bne .loop
.waitloop
CALLFW JoinBlitterQueue
CALLFW VSyncWithTask
move.l pd_BqDataReadPtr(a6),a0
cmp.l pd_BqDataWritePtr(a6),a0
bne.s .waitloop
clr.l fw_VBlankIRQ(a6)
CALLFW JoinBlitterQueue
CALLFW VSyncWithTask
rts
;--------------------------------------------------------------------
blb_outro:
move.w #16,pd_PartCountDown(a6)
bsr blb_prep_p5p6_mask
lea pd_KnightsPalette(a6),a1
lea blb_bulb_palette_expanded(pc),a0
moveq.l #(16/2)-1,d7
.palloop
move.l (a0)+,(a1)+
dbra d7,.palloop
lea .vblstuff(pc),a0
move.l a0,fw_VBlankIRQ(a6)
.loop
bsr blb_flip_db_frame
bsr blb_fade_step_to_white
bsr blb_palette_fade_step_to_white
bsr blb_create_outro_copperlist
bsr blb_update_copper_list_pointers
CALLFW VSyncWithTask
subq.w #1,pd_PartCountDown(a6)
bne .loop
rts
.vblstuff
PUSHM d4
bsr blb_update_lamp_sprite
moveq.l #15,d0
lea pd_LampPalette(a6),a1
CALLFW DoFadePaletteStep
BLTHOGON
POPM
rts
;--------------------------------------------------------------------
blb_flip_db_frame:
move.l pd_CurrDbPlanesP1234Ptr(a6),pd_LastDbPlanesP1234Ptr(a6)
move.l pd_CurrDbPlanesP56Ptr(a6),pd_LastDbPlanesP56Ptr(a6)
move.l pd_CurrCopListPtr(a6),pd_LastCopListPtr(a6)
move.l pd_CurrTextSpritesPtr(a6),pd_LastTextSpritesPtr(a6)
move.l pd_DbBufferP1234(a6),a0
move.l pd_DbBufferP56(a6),a1
not.b pd_DbToggle(a6)
beq.s .selb1
lea (KNIGHTS_WIDTH/8)(a0),a0
lea (KNIGHTS_WIDTH/8)(a1),a1
move.l a0,pd_CurrDbPlanesP1234Ptr(a6)
move.l a1,pd_CurrDbPlanesP56Ptr(a6)
move.l pd_CopperList2(a6),pd_CurrCopListPtr(a6)
lea pd_TextSprites+(TITLETEXT_WIDTH/16)*4(a6),a0
move.l a0,pd_CurrTextSpritesPtr(a6)
rts
.selb1
move.l a0,pd_CurrDbPlanesP1234Ptr(a6)
move.l a1,pd_CurrDbPlanesP56Ptr(a6)
move.l pd_CopperList1(a6),pd_CurrCopListPtr(a6)
lea pd_TextSprites(a6),a0
move.l a0,pd_CurrTextSpritesPtr(a6)
rts
blb_flip_copper_frame:
move.l pd_CurrCopListPtr(a6),pd_LastCopListPtr(a6)
not.b pd_AsyncDbToggle(a6)
beq.s .selb1
move.l pd_CopperList2(a6),pd_CurrCopListPtr(a6)
rts
.selb1
move.l pd_CopperList1(a6),pd_CurrCopListPtr(a6)
rts
blb_flip_async_db_frame:
not.b pd_AsyncDbToggle(a6)
beq.s .selb1
move.l pd_CopperList2(a6),a0
move.w pd_CopperList2(a6),blb_extra_copperlist_ptr+2
move.w a0,blb_extra_copperlist_ptr+6
rts
.selb1
move.l pd_CopperList1(a6),a0
move.w pd_CopperList1(a6),blb_extra_copperlist_ptr+2
move.w a0,blb_extra_copperlist_ptr+6
rts
;--------------------------------------------------------------------
blb_update_copper_list_pointers:
lea blb_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
;--------------------------------------------------------------------
blb_palette_fade_step_to_white:
lea pd_KnightsPalette(a6),a1
move.l pd_ShadeTableXor(a6),a0
move.w #$fff,d2
moveq.l #16-1,d7
.loop move.w (a1),d0
move.w d0,d1
eor.w d2,d1
add.w d1,d1
add.w (a0,d1.w),d0
move.w d0,(a1)+
dbra d7,.loop
rts
;--------------------------------------------------------------------
blb_calc_scene_pointers:
lea blb_swing_data,a1
move.l pd_SwingScriptFramesPtrs(a6),a0
move.w #ALL_SWING_FRAMES-1,d7
.swingloop
move.l a1,(a0)+
addq.l #4,a1
lea 2*rd_SIZEOF(a1),a1
bsr.s blb_silent_fill_rays
bsr.s blb_silent_fill_rays
dbra d7,.swingloop
lea blb_paint_data,a1
move.l pd_PaintScriptFramesPtrs(a6),a0
move.w #ALL_PAINT_FRAMES-1,d7
.paintloop
move.l a1,(a0)+
bsr.s blb_silent_paint_slices
dbra d7,.paintloop
lea blb_textpaint_data,a1
move.l pd_TextPaintScriptFramesPtrs(a6),a0
move.w #PAINT_FRAMES-1,d7
.textpaintloop
move.l a1,(a0)+
.loop tst.w (a1)+
beq.s .finished
addq.w #6,a1
bra.s .loop
.finished
dbra d7,.textpaintloop
rts
;--------------------------------------------------------------------
blb_silent_fill_rays:
blb_silent_paint_slices:
.loop
tst.b (a1)+
beq.s .finished
addq.w #3,a1
bra.s .loop
.finished
addq.w #1,a1
rts
;--------------------------------------------------------------------
blb_swing_around:
move.l pd_SwingScriptFramesPtrs(a6),a0
move.w pd_SwingFrameNum(a6),d0
move.l (a0,d0.w),a1
addq.l #4,a1
move.l a1,pd_SwingDataPtr(a6)
addq.w #4,d0
and.w #(SWING_FRAMES-1)*4,d0
move.w d0,pd_SwingFrameNum(a6)
rts
;--------------------------------------------------------------------
blb_swing_around_brighten:
move.l pd_SwingScriptFramesPtrs(a6),a0
move.w pd_SwingFrameNum(a6),d0
move.l (a0,d0.w),a1
addq.l #4,a1
move.l a1,pd_SwingDataPtr(a6)
addq.w #4,d0
move.w d0,pd_SwingFrameNum(a6)
rts
;--------------------------------------------------------------------
blb_paint_around:
move.l pd_PaintScriptFramesPtrs(a6),a0
move.l pd_TextPaintScriptFramesPtrs(a6),a1
move.w pd_PaintFrameNum(a6),d0
move.l (a1,d0.w),pd_TextPaintDataPtr(a6)
move.l (a0,d0.w),a1
addq.w #4,d0
cmp.w #PAINT_FRAMES*4,d0
bne.s .noreset
moveq.l #2*4,d0
.noreset
move.w d0,pd_PaintFrameNum(a6)
rts
;--------------------------------------------------------------------
blb_paint_around_brighten:
move.l pd_PaintScriptFramesPtrs(a6),a0
move.l pd_TextPaintScriptFramesPtrs(a6),a1
move.w pd_PaintFrameNum(a6),d0
move.l (a0,d0.w),a1
addq.w #4,d0
move.w d0,pd_PaintFrameNum(a6)
rts
;--------------------------------------------------------------------
blb_update_lamp_sprite:
move.w pd_LampFrameNum(a6),d2
lea blb_lamp_pos_table,a0
adda.w d2,a0
adda.w d2,a0
moveq.l #0,d0
moveq.l #0,d1
move.b (a0)+,d0
move.b (a0)+,d1
lea blb_lamp_angle_table,a0
moveq.l #0,d3
move.b (a0,d2.w),d3
add.b #NUM_LAMP_ROTATIONS/2,d3
addq.w #1,d2
and.w #SWING_FRAMES*2-1,d2
move.w d2,pd_LampFrameNum(a6)
mulu #(LAMP_WIDTH/8)*(LAMP_HEIGHT+2)*LAMP_PLANES,d3
move.l pd_LampSpriteBuffer(a6),a0
adda.l d3,a0
add.w #128-(LAMP_WIDTH/2),d0
add.w #$52-(LAMP_HEIGHT/2),d1
add.w pd_LampYOffset(a6),d1
move.w d1,d2
add.w #LAMP_HEIGHT,d2
moveq.l #0,d3
lsl.w #8,d1 ; sv7-sv0 in d1
addx.w d3,d3 ; sv8
lsl.w #8,d2 ; ev7-ev0 in d2
addx.w d3,d3 ; ev8
lsr.w #1,d0 ; sh8-sh1 in d0
addx.w d3,d3 ; sh0
or.w d2,d3 ; ev7-ev0, sv8, ev8, sh0 in d3
or.w d1,d0 ; sv7-sv0, sh8-sh1 in d0
tas d3 ; att TAS sets bit 7
lea blb_coppersprites+2,a1
REPT 3
move.l a0,d1
swap d1
move.w d1,(a1)
move.w a0,4(a1)
move.w d0,(a0)+
move.w d3,(a0)+
lea (LAMP_HEIGHT+1)*LAMP_PLANES(a0),a0
move.l a0,d1
addq.w #8,a1
swap d1
move.w d1,(a1)
move.w a0,4(a1)
move.w d0,(a0)+
move.w d3,(a0)+
lea (LAMP_HEIGHT+1)*LAMP_PLANES(a0),a0
addq.w #8,d0
addq.w #8,a1
ENDR
rts
;--------------------------------------------------------------------
blb_add_execute_twice_bq_node:
ADD_TO_BLITTER_QUEUE a4,a2
clr.l (a4)+
move.l #.bq_rout,(a4)+
clr.w (a4)+ ; initial state
move.l a0,(a4)+
rts
.bq_rout
not.w (a0)+
beq.s .secondtime
move.l (a0)+,fw_BlitterQueueReadPtr(a6)
moveq.l #0,d0
.secondtime
rts
blb_add_branch_on_second_bq_node:
ADD_TO_BLITTER_QUEUE a4,a2
clr.l (a4)+
move.l #.bq_rout,(a4)+
move.w #-1,(a4)+ ; initial state
move.l a0,(a4)+
rts
.bq_rout
not.w (a0)+
beq.s .secondtime
move.l (a0)+,fw_BlitterQueueReadPtr(a6)
moveq.l #0,d0
.secondtime
rts
blb_create_nop_bq_node:
move.l a4,a0
clr.l (a4)+
move.l #.bq_nop,(a4)+
rts
.bq_nop
moveq.l #0,d0
rts
blb_create_terminal_bq_node:
move.l a4,a0
clr.l (a4)+
move.l #.bq_nop,(a4)+
rts
.bq_nop
PUTMSG 40,<"BQ terminated">
PUSHM d1-d4
move.l pd_BqDataReadPtr(a6),a0
move.w -2(a0),d0
beq.s .lampoff
cmp.w #2,d0
bne.s .noup
subq.w #1,pd_LampYOffset(a6)
.noup
tst.w pd_LampIsOn(a6)
bne.s .nochange
move.w d0,pd_LampIsOn(a6)
moveq.l #15,d0
lea blb_lamp_palette(pc),a0
lea pd_LampPalette(a6),a1
CALLFW InitPaletteLerp
bra.s .reloada0
.lampoff
tst.w pd_LampIsOn(a6)
beq.s .nochange
move.w d0,pd_LampIsOn(a6)
moveq.l #15,d0
moveq.l #4,d1
lea blb_lamp_off_palette(pc),a0
lea pd_LampPalette(a6),a1
CALLFW FadePaletteTo
.reloada0
move.l pd_BqDataReadPtr(a6),a0
.nochange
lea BQ_SIZE(a0),a1
cmp.l pd_BqDataEndPtr(a6),a1
bne.s .nowrapbq
move.l pd_BqBuffer(a6),a1
.nowrapbq
move.l a1,pd_BqDataReadPtr(a6)
moveq.l #15,d0
lea pd_LampPalette(a6),a1
CALLFW DoFadePaletteStep
bsr blb_flip_async_db_frame
lea pd_LampPalette(a6),a1
moveq.l #15-1,d0
addq.w #2,a0
.cploop move.w cl_Color(a1),(a0)
addq.w #4,a0
lea cl_SIZEOF(a1),a1
dbra d0,.cploop
clr.w pd_CurrBlitSize(a6)
POPM
rts
;--------------------------------------------------------------------
blb_clear_mask_buffers:
BLTHOGON
BLTWAIT
BLTCON_SET D,0,0,0
move.w #0,bltdmod(a5)
move.l pd_MiddleMaskBuffer(a6),bltdpt(a5)
move.w #(KNIGHTS_SLICE_WIDTH>>4)|((KNIGHTS_HEIGHT*3)<<6),bltsize(a5)
BLTWAIT
move.l pd_TextSpriteBuffer(a6),bltdpt(a5)
move.w #((TITLETEXT_WIDTH)>>4)|(((TITLETEXT_HEIGHT+1)*TITLETEXT_PLANES*2)<<6),bltsize(a5)
;NUM_LAMP_ROTATIONS*(LAMP_WIDTH/8)*(LAMP_HEIGHT+2)*LAMP_PLANES
BLTWAIT
move.l pd_LampSpriteBuffer(a6),bltdpt(a5)
move.w #((NUM_LAMP_ROTATIONS*LAMP_WIDTH/2)>>4)|(((LAMP_HEIGHT+2)*LAMP_PLANES*2)<<6),bltsize(a5)
rts
;--------------------------------------------------------------------
blb_rearrange_buffers:
moveq.l #-1,d2
; make a backup of picture to rearrange planes
moveq.l #0,d0
move.w #((KNIGHTS_WIDTH*2)>>4)|((KNIGHTS_HEIGHT*3)<<6),d3
BLTHOGON
BLTWAIT
BLTCON_SET AD,BLT_A,0,0
move.l d2,bltafwm(a5) ; also fills bltalwm
move.w d0,bltamod(a5)
move.w d0,bltdmod(a5)
move.l #blb_bulb_pic,bltapt(a5)
move.l pd_DbBufferP1234(a6),bltdpt(a5)
move.w d3,bltsize(a5)
move.l pd_DbBufferP1234(a6),a0
move.l pd_OriginalBufferP1234(a6),a1
move.w #(KNIGHTS_WIDTH*6-KNIGHTS_WIDTH)/8,d0
move.w #(KNIGHTS_WIDTH*4-KNIGHTS_WIDTH)/8,d1
move.w #((KNIGHTS_WIDTH)>>4)|((KNIGHTS_HEIGHT)<<6),d3
BLTWAIT
; plane 1
BLTCON_SET AD,BLT_A,0,0
move.w d0,bltamod(a5)
move.w d1,bltdmod(a5)
move.l a0,bltapt(a5)
move.l a1,bltdpt(a5)
move.w d3,bltsize(a5)
REPT 3
lea KNIGHTS_WIDTH/8(a0),a0
lea KNIGHTS_WIDTH/8(a1),a1
BLTWAIT
; plane 2/3/4
move.l a0,bltapt(a5)
move.l a1,bltdpt(a5)
move.w d3,bltsize(a5)
ENDR
move.w #(KNIGHTS_WIDTH*6-KNIGHTS_WIDTH)/8,d0
move.w #(KNIGHTS_WIDTH*2-KNIGHTS_WIDTH)/8,d1
move.l pd_OriginalBufferP56(a6),a1
lea KNIGHTS_WIDTH/8(a0),a0
BLTWAIT
; plane 5
move.w d0,bltamod(a5)
move.w d1,bltdmod(a5)
move.l a0,bltapt(a5)
move.l a1,bltdpt(a5)
move.w d3,bltsize(a5)
lea KNIGHTS_WIDTH/8(a0),a0
lea KNIGHTS_WIDTH/8(a1),a1
BLTWAIT
; plane 6
move.l a0,bltapt(a5)
move.l a1,bltdpt(a5)
move.w d3,bltsize(a5)
; clear all buffers
moveq.l #0,d0
move.w #((KNIGHTS_WIDTH*2)>>4)|((KNIGHTS_HEIGHT*4)<<6),d3
BLTWAIT
BLTCON_SET D,BLT_C,0,0
move.w d0,bltcdat(a5)
move.w d0,bltdmod(a5)
move.l pd_DbBufferP1234(a6),bltdpt(a5)
move.w d3,bltsize(a5)
move.l pd_OriginalBufferP56(a6),a0
move.l pd_DbBufferP56(a6),a1
BLTWAIT
move.l a1,bltdpt(a5)
move.w d3,bltsize(a5)
move.w #(KNIGHTS_WIDTH*2-KNIGHTS_WIDTH)/8,d0
move.w #(KNIGHTS_BUF_WIDTH-KNIGHTS_WIDTH)/8,d1
move.w #((KNIGHTS_WIDTH)>>4)|((KNIGHTS_HEIGHT)<<6),d3
BLTWAIT
; Original to DB 5 (1)
BLTCON_SET AD,BLT_A,0,0
move.w d0,bltamod(a5)
move.w d1,bltdmod(a5)
move.l a0,bltapt(a5)
move.l a1,bltdpt(a5)
move.w d3,bltsize(a5)
lea KNIGHTS_WIDTH/8(a1),a1
BLTWAIT
; Original to DB 5 (2)
move.l a0,bltapt(a5)
move.l a1,bltdpt(a5)
move.w d3,bltsize(a5)
lea KNIGHTS_WIDTH/8(a0),a0
lea KNIGHTS_WIDTH/8(a1),a1
BLTWAIT
; Original to DB 6 (1)
move.l a0,bltapt(a5)
move.l a1,bltdpt(a5)
move.w d3,bltsize(a5)
lea KNIGHTS_WIDTH/8(a1),a1
BLTWAIT
BLTHOGOFF
; Original to DB 6 (2)
move.l a0,bltapt(a5)
move.l a1,bltdpt(a5)
move.w d3,bltsize(a5)
rts
;--------------------------------------------------------------------
blb_prep_p5p6_mask:
move.l pd_LastDbPlanesP56Ptr(a6),a0
lea KNIGHTS_MOD(a0),a1
move.l pd_DbBufferP56(a6),a2
lea 2*KNIGHTS_MOD(a2),a2
moveq.l #-1,d0
move.l #(((KNIGHTS_BUF_WIDTH-KNIGHTS_WIDTH)/8)<<16)|((KNIGHTS_BUF_WIDTH-KNIGHTS_WIDTH)/8),d1
move.w #(KNIGHTS_WIDTH>>4)|(KNIGHTS_HEIGHT<<6),d3
BLTHOGON
BLTWAIT
BLTHOGOFF
BLTCON_SET ACD,BLT_A|BLT_C,0,0
move.l d0,bltafwm(a5)
move.w d1,bltcmod(a5)
move.l d1,bltamod(a5)
move.l a0,bltapt(a5)
move.l a1,bltcpt(a5)
move.l a2,bltdpt(a5)
move.w d3,bltsize(a5)
rts
;--------------------------------------------------------------------
blb_fade_step_to_white:
move.l pd_LastDbPlanesP1234Ptr(a6),a0 ; source p1
move.l pd_CurrDbPlanesP1234Ptr(a6),a4
move.l pd_DbBufferP56(a6),a1
lea 2*KNIGHTS_MOD(a1),a1 ; p5|p6 mask
move.l a1,d5
lea 3*KNIGHTS_MOD(a4),a1
move.l a1,d4 ; target p4 as temp mask
lea KNIGHTS_MOD(a0),a1 ; source p2
lea KNIGHTS_MOD(a1),a2 ; source p3
lea KNIGHTS_MOD(a2),a3 ; source p4
moveq.l #-1,d0
move.l #(((KNIGHTS_BUF_WIDTH-KNIGHTS_WIDTH)/8)<<16)|((KNIGHTS_BUF_WIDTH-KNIGHTS_WIDTH)/8),d1
move.w #(KNIGHTS_WIDTH>>4)|(KNIGHTS_HEIGHT<<6),d3
; create mask -- all bits, that are NOT all 1s
BLTHOGON
BLTWAIT
BLTCON_SET ABCD,~(BLT_A&BLT_B&BLT_C),0,0
move.l d0,bltafwm(a5)
move.l d1,bltcmod(a5)
move.l d1,bltamod(a5)
move.l a0,bltapt(a5)
move.l a1,bltbpt(a5)
move.l a2,bltcpt(a5)
move.l d4,bltdpt(a5)
move.w d3,bltsize(a5)
BLTWAIT
BLTCON0_SET ABCD,(~(~BLT_A&BLT_C))&BLT_B,0
move.l d4,bltapt(a5)
move.l d5,bltbpt(a5)
move.l a3,bltcpt(a5)
move.l d4,bltdpt(a5)
move.w d3,bltsize(a5)
; plane 1: p1n = p1o ^ mask
BLTWAIT
BLTCON0_SET ACD,BLT_A^BLT_C,0
move.l d4,bltapt(a5)
move.l a0,bltcpt(a5)
move.l a4,bltdpt(a5)
move.w d3,bltsize(a5)
; update mask: mask = p1o & mask
BLTWAIT
BLTCON0_SET ACD,BLT_A&BLT_C,0
move.l d4,bltapt(a5)
move.l a0,bltcpt(a5)
move.l d4,bltdpt(a5)
move.w d3,bltsize(a5)
; plane 2: p2n = p2o ^ mask
lea KNIGHTS_MOD(a4),a4
BLTWAIT
BLTCON0_SET ACD,BLT_A^BLT_C,0
move.l d4,bltapt(a5)
move.l a1,bltcpt(a5)
move.l a4,bltdpt(a5)
move.w d3,bltsize(a5)
; update mask: mask = p2o & mask
BLTWAIT
BLTCON0_SET ACD,BLT_A&BLT_C,0
move.l d4,bltapt(a5)
move.l a1,bltcpt(a5)
move.l d4,bltdpt(a5)
move.w d3,bltsize(a5)
; plane 3: p3n = p3o ^ mask
lea KNIGHTS_MOD(a4),a4
BLTWAIT
BLTCON0_SET ACD,BLT_A^BLT_C,0
move.l d4,bltapt(a5)
move.l a2,bltcpt(a5)
move.l a4,bltdpt(a5)
move.w d3,bltsize(a5)
; plane 4: p4n = p4o ^ (p3o & mask)
BLTWAIT
BLTHOGOFF
BLTCON0_SET ABCD,BLT_C^(BLT_A&BLT_B),0
move.l d4,bltapt(a5)
move.l a2,bltbpt(a5)
move.l a3,bltcpt(a5)
move.l d4,bltdpt(a5)
move.w d3,bltsize(a5)
rts
;--------------------------------------------------------------------
blb_intro_fill_low_brightness:
move.l pd_OriginalBufferP1234(a6),a0
lea 3*(KNIGHTS_WIDTH/8)(a0),a0
move.l pd_CurrDbPlanesP1234Ptr(a6),a1
move.w #(KNIGHTS_WIDTH*4-KNIGHTS_WIDTH)/8,d0
move.w #(KNIGHTS_BUF_WIDTH-KNIGHTS_WIDTH)/8,d1
move.w #((KNIGHTS_WIDTH)>>4)|((KNIGHTS_HEIGHT)<<6),d3
BLTHOGON
BLTWAIT
BLTHOGOFF
; Plane 4 to DB 1 (1)
BLTCON_SET AD,BLT_A,0,0
move.w d0,bltamod(a5)
move.w d1,bltdmod(a5)
move.l a0,bltapt(a5)
move.l a1,bltdpt(a5)
move.w d3,bltsize(a5)
rts
;--------------------------------------------------------------------
blb_create_intro_copperlist:
move.l pd_CurrCopListPtr(a6),a0
moveq.l #-2,d3
COPIMOVE $6a00,bplcon0
move.w pd_PullDownYPos(a6),d0
addq.w #8,d0
cmp.w #KNIGHTS_HEIGHT,d0
ble.s .notrunc
move.w #KNIGHTS_HEIGHT,d0
.notrunc
move.w d0,pd_PullDownYPos(a6)
move.w #KNIGHTS_HEIGHT,d4
sub.w d0,d4
moveq.l #$52,d5
add.w d0,d5
mulu #KNIGHTS_BUF_MOD,d4
move.l pd_CurrDbPlanesP1234Ptr(a6),d0
add.l d4,d0
moveq.l #4-1,d7
move.w #bplpt,d1
moveq.l #KNIGHTS_MOD,d2
.bplloop1234
move.w d1,(a0)+
swap d0
move.w d0,(a0)+
addq.w #2,d1
move.w d1,(a0)+
swap d0
move.w d0,(a0)+
addq.w #2,d1
add.l d2,d0
dbra d7,.bplloop1234
move.l pd_CurrDbPlanesP56Ptr(a6),d0
add.l d4,d0
moveq.l #2-1,d7
.bplloop56
move.w d1,(a0)+
swap d0
move.w d0,(a0)+
addq.w #2,d1
move.w d1,(a0)+
swap d0
move.w d0,(a0)+
addq.w #2,d1
add.l d2,d0
dbra d7,.bplloop56
lsl.w #8,d5
bcc.s .no255
move.w #$ffdf,(a0)+
move.w d3,(a0)+
.no255
move.b #$07,d5
move.w d5,(a0)+
move.w d3,(a0)+
COPIMOVE $0200,bplcon0
move.l d3,(a0)+
rts
;--------------------------------------------------------------------
blb_create_outro_copperlist:
move.l pd_CurrCopListPtr(a6),a0
lea pd_KnightsPalette(a6),a1
moveq.l #16-1,d7
move.w #color,d0
.palloop
move.w d0,(a0)+
move.w (a1)+,(a0)+
addq.w #2,d0
dbra d7,.palloop
addq.w #2,d0
lea pd_LampPalette(a6),a1
moveq.l #15-1,d7
.cploop
move.w d0,(a0)+
move.w cl_Color(a1),(a0)+
addq.w #2,d0
lea cl_SIZEOF(a1),a1
dbra d7,.cploop
moveq.l #-2,d3
COPIMOVE $6a00,bplcon0
move.l pd_CurrDbPlanesP1234Ptr(a6),d0
moveq.l #4-1,d7
move.w #bplpt,d1
moveq.l #KNIGHTS_MOD,d2
.bplloop1234
move.w d1,(a0)+
swap d0
move.w d0,(a0)+
addq.w #2,d1
move.w d1,(a0)+
swap d0
move.w d0,(a0)+
addq.w #2,d1
add.l d2,d0
dbra d7,.bplloop1234
move.l pd_CurrDbPlanesP56Ptr(a6),d0
moveq.l #2-1,d7
.bplloop56
move.w d1,(a0)+
swap d0
move.w d0,(a0)+
addq.w #2,d1
move.w d1,(a0)+
swap d0
move.w d0,(a0)+
addq.w #2,d1
add.l d2,d0
dbra d7,.bplloop56
move.l d3,(a0)+
rts
;--------------------------------------------------------------------
blb_patch_in_text_sprites_to_copperlist:
move.l pd_CurrCopListPtr(a6),a0
move.l a0,a2
adda.w pd_CopperLinesFixupOffset(a6),a0
lea 36*COP_INST_PER_LINE*4+4*4-2(a0),a0
moveq.l #COP_INST_PER_LINE*4-4,d0
move.l pd_CurrTextSpritesPtr(a6),a1
move.w #sprpt+0*4+0,d4
moveq.l #(TITLETEXT_WIDTH/16)-1,d7
.ptloop
move.w d4,(a0)+
move.w (a1)+,(a0)+
addq.w #2,d4
adda.l d0,a0
move.w d4,(a0)+
move.w (a1)+,(a0)+
addq.w #2,d4
adda.l d0,a0
dbra d7,.ptloop
REPT 8
move.l #((spr+REPTN*sd_SIZEOF+sd_pos)<<16)|(($52+TITLETEXT_Y_POS)<<8)|((TITLETEXT_X_POS+128+REPTN*16)/2),(a0)+
adda.l d0,a0
move.l #((spr+REPTN*sd_SIZEOF+sd_ctl)<<16)|(($52+TITLETEXT_Y_POS+TITLETEXT_HEIGHT)<<8)|(1<<7),(a0)+
adda.l d0,a0
ENDR
move.l a0,d1
sub.l a2,d1
addq.w #2,d1
move.w d1,pd_CopperLogoColorOffset(a6)
lea blb_lamp_palette(pc),a1
COPRMOVE 1*2(a1),color+18*2
adda.l d0,a0
COPRMOVE 7*2(a1),color+24*2
adda.l d0,a0
COPIMOVE $0d00,color+19*2
adda.l d0,a0
COPIMOVE $0d00,color+28*2
move.l pd_CurrCopListPtr(a6),a0
adda.w pd_CopperLinesFixupOffset(a6),a0
lea 175*COP_INST_PER_LINE*4+4*4-2(a0),a0
COPRMOVE 1*2(a1),color+18*2
adda.l d0,a0
COPRMOVE 7*2(a1),color+24*2
adda.l d0,a0
COPRMOVE 2*2(a1),color+19*2
adda.l d0,a0
COPRMOVE 11*2(a1),color+28*2
rts
;--------------------------------------------------------------------
blb_create_bulb_copperlist:
move.l pd_CurrCopListPtr(a6),a0
move.l a0,a2
lea pd_LampPalette(a6),a1
move.w #color+17*2,d0
moveq.l #15-1,d7
.blloop
move.w d0,(a0)+
move.w cl_Color(a1),(a0)+
lea cl_SIZEOF(a1),a1
addq.w #2,d0
dbra d7,.blloop
COPIMOVE $6a00,bplcon0
move.l pd_CurrDbPlanesP1234Ptr(a6),d0
moveq.l #4-1,d7
move.w #bplpt,d1
moveq.l #KNIGHTS_MOD,d2
.bplloop1234
move.w d1,(a0)+
swap d0
move.w d0,(a0)+
addq.w #2,d1
move.w d1,(a0)+
swap d0
move.w d0,(a0)+
addq.w #2,d1
add.l d2,d0
dbra d7,.bplloop1234
move.l pd_CurrDbPlanesP56Ptr(a6),d0
moveq.l #2-1,d7
.bplloop56
move.w d1,(a0)+
swap d0
move.w d0,(a0)+
addq.w #2,d1
move.w d1,(a0)+
swap d0
move.w d0,(a0)+
addq.w #2,d1
add.l d2,d0
dbra d7,.bplloop56
move.l pd_TrueColorImage(a6),a1
moveq.l #-2,d3
move.w #$51d5,d0
move.w #KNIGHTS_HEIGHT-1,d7
move.w #$100,d2
move.l a0,d1
sub.l a2,d1
addq.w #4+2,d1
move.w d1,pd_CopperLinesFixupOffset(a6)
.cprloop
move.w d0,(a0)+
move.w d3,(a0)+
move.w #(color+8*2),(a0)+
addq.w #2,a0
move.w #(color+10*2),(a0)+
addq.w #2,a0
move.w #(color+12*2),(a0)+
addq.w #2,a0
move.w #(color+14*2),(a0)+
addq.w #2,a0
move.l #$01fe0000,(a0)+
add.w d2,d0
dbra d7,.cprloop
move.l d3,(a0)+
rts
;--------------------------------------------------------------------
blb_calc_true_color_image:
move.l pd_OriginalBufferP1234(a6),a0
move.l pd_OriginalBufferP56(a6),a3
move.l pd_TrueColorImage(a6),a1
PUTMSG 10,<"TC Image %p">,a1
lea blb_bulb_palette_expanded(pc),a2
move.w #KNIGHTS_HEIGHT,-(sp)
.lineloop
moveq.l #(KNIGHTS_WIDTH/16)-1,d7
move.w (a2),d6 ; background color
swap d6
.wordloop
move.w 3*(KNIGHTS_WIDTH/8)(a0),d3
move.w 2*(KNIGHTS_WIDTH/8)(a0),d2
move.w 1*(KNIGHTS_WIDTH/8)(a0),d1
move.w (a0)+,d0
move.w 1*(KNIGHTS_WIDTH/8)(a3),d5
move.w (a3)+,d4
swap d7
move.w #15,d7
.pixelloop
clr.w d6
add.w d3,d3
addx.w d6,d6
add.w d2,d2
addx.w d6,d6
add.w d1,d1
addx.w d6,d6
add.w d0,d0
addx.w d6,d6
add.w d5,d5
bcs.s .greenOrRed
add.w d4,d4
bcs.s .blue
PUTMSG 50,<"Idx %d">,d6
add.w d6,d6
move.w (a2,d6.w),d6
move.w d6,(a1)+
bra.s .contloop
.greenOrRed
add.w d4,d4
bcs.s .green
.red
PUTMSG 50,<"Red %d">,d6
move.b d6,(a1)
swap d6
move.b d6,1(a1)
move.w (a1)+,d6
bra.s .contloop
.green
PUTMSG 50,<"Green %d">,d6
move.w d7,a4
move.w d6,d7
lsl.w #4,d7
swap d6
and.w #$f0f,d6
or.w d7,d6
move.w d6,(a1)+
move.w a4,d7
bra.s .contloop
.blue
PUTMSG 50,<"Blue %d">,d6
move.w d7,a4
move.w d6,d7
swap d6
and.w #$ff0,d6
or.w d7,d6
move.w d6,(a1)+
move.w a4,d7
.contloop
swap d6
dbra d7,.pixelloop
swap d7
dbra d7,.wordloop
.nextline
lea 3*(KNIGHTS_WIDTH/8)(a0),a0
lea 1*(KNIGHTS_WIDTH/8)(a3),a3
subq.w #1,(sp)
bne .lineloop
addq.w #2,sp
rts
;--------------------------------------------------------------------
blb_draw_rays:
move.w #KNIGHTS_BUF_WIDTH/8,d4
move.w #BLT_A&BLT_B^BLT_C,d5
move.w rd_EndY1(a1),d3
cmp.w #30,d3
blt.s .skipray1
move.l pd_DrawDarkBuffer(a6),a0
move.w rd_StartY12(a1),d1
move.w rd_StartX1(a1),d0
move.w rd_EndX1(a1),d2
PUSHM d1/d4/d5/a0/a1
bsr blb_draw_blitter_line_bq
POPM
move.w rd_StartX2(a1),d0
move.w rd_EndX2(a1),d2
move.w rd_EndY2(a1),d3
PUSHM d1/d4/d5/a0/a1
bsr blb_draw_blitter_line_bq
POPM
.skipray1
lea rd_SIZEOF(a1),a1
move.w rd_EndY1(a1),d3
cmp.w #30,d3
blt.s .skipray2
move.l pd_DrawBrightBuffer(a6),a0
move.w rd_StartY12(a1),d1
move.w rd_StartX1(a1),d0
move.w rd_EndX1(a1),d2
PUSHM d1/d4/d5/a0/a1
bsr blb_draw_blitter_line_bq
POPM
move.w rd_StartX2(a1),d0
move.w rd_EndX2(a1),d2
move.w rd_EndY2(a1),d3
PUSHM d1/d4/d5/a0/a1
bsr blb_draw_blitter_line_bq
POPM
.skipray2
lea rd_SIZEOF(a1),a1
rts
;--------------------------------------------------------------------
blb_draw_fixup_rays:
move.w #KNIGHTS_BUF_WIDTH/8,d4
bsr blb_blitter_line_init_bq
move.l pd_SwingDataPtr(a6),a1
move.w #(BLT_A&BLT_B)|BLT_C,d5
move.l pd_CurrDbPlanesP1234Ptr(a6),a0
lea KNIGHTS_MOD*2(a0),a0
cmp.w #30,rd_EndY1(a1)
blt.s .skipray1
move.w rd_StartY12(a1),d1
move.w rd_StartX2(a1),d0
move.w rd_EndX2(a1),d2
move.w rd_EndY2(a1),d3
PUSHM d4/d5/a0/a1
bsr blb_draw_blitter_line_bq
POPM
.skipray1
lea rd_SIZEOF(a1),a1
cmp.w #30,rd_EndY1(a1)
blt.s .skipray2
move.w rd_StartY12(a1),d1
move.w rd_StartX2(a1),d0
move.w rd_EndX2(a1),d2
move.w rd_EndY2(a1),d3
bsr blb_draw_blitter_line_bq
.skipray2
rts
;--------------------------------------------------------------------
blb_do_bresenham_rays_color_fixup:
move.l pd_SwingDataPtr(a6),a2
move.w rd_StartY12(a2),d1
move.w rd_StartX1(a2),d0
move.w rd_EndX1(a2),d2
move.w rd_EndY1(a2),d3
move.l pd_CurrLineColorsPtr(a6),a1
bsr blb_bresenham_line_draw
move.w rd_StartY12(a2),d1
move.w rd_StartX2(a2),d0
move.w rd_EndX2(a2),d2
move.w rd_EndY2(a2),d3
move.l pd_CurrLineColorsPtr(a6),a1
lea 3*KNIGHTS_HEIGHT*2(a1),a1
bsr blb_bresenham_line_draw
lea rd_SIZEOF(a2),a2
move.w rd_StartY12(a2),d1
move.w rd_StartX1(a2),d0
move.w rd_EndX1(a2),d2
move.w rd_EndY1(a2),d3
move.l pd_CurrLineColorsPtr(a6),a1
lea 1*KNIGHTS_HEIGHT*2(a1),a1
bsr blb_bresenham_line_draw
move.w rd_StartY12(a2),d1
move.w rd_StartX2(a2),d0
move.w rd_EndX2(a2),d2
move.w rd_EndY2(a2),d3
move.l pd_CurrLineColorsPtr(a6),a1
lea 2*KNIGHTS_HEIGHT*2(a1),a1
bsr blb_bresenham_line_draw
PREP_ADD_TO_BLITTER_QUEUE a0
FAST_ADD_TO_BLITTER_QUEUE a4,a0
addq.l #4,a4
move.l #.bq_linecopy1,(a4)+
move.l pd_CurrLineColorsPtr(a6),(a4)+
move.l pd_CurrCopListPtr(a6),a1
adda.w pd_CopperLinesFixupOffset(a6),a1
move.l a1,(a4)+
FAST_ADD_TO_BLITTER_QUEUE a4,a0
addq.l #4,a4
move.l #.bq_linecopy2,(a4)+
move.l pd_CurrLineColorsPtr(a6),a1
lea 2*KNIGHTS_HEIGHT*2(a1),a1
move.l a1,(a4)+
move.l pd_CurrCopListPtr(a6),a1
adda.w pd_CopperLinesFixupOffset(a6),a1
lea 12(a1),a1
move.l a1,(a4)+
FAST_ADD_TO_BLITTER_QUEUE a4,a0
addq.l #4,a4
move.l #.bq_linecopy3,(a4)+
move.l pd_CurrLineColorsPtr(a6),a1
lea 3*KNIGHTS_HEIGHT*2(a1),a1
move.l a1,(a4)+
move.l pd_CurrCopListPtr(a6),a1
adda.w pd_CopperLinesFixupOffset(a6),a1
addq.l #8,a1
move.l a1,(a4)+
LAST_ADD_TO_BLITTER_QUEUE a4,a0
clr.l (a4)+
move.l #.bq_linecopy4,(a4)+
move.l pd_CurrLineColorsPtr(a6),a1
lea 1*KNIGHTS_HEIGHT*2(a1),a1
move.l a1,(a4)+
move.l pd_CurrCopListPtr(a6),a1
adda.w pd_CopperLinesFixupOffset(a6),a1
addq.l #4,a1
move.l a1,(a4)+
rts
.bq_linecopy1
BLTCON_SET AD,BLT_A&BLT_C,1,0
moveq.l #-1,d0
move.l d0,bltafwm(a5)
moveq.l #COP_INST_PER_LINE*4-2,d0
move.l d0,bltamod(a5)
move.w #$777,bltcdat(a5)
move.l (a0)+,bltapt(a5)
move.l (a0)+,bltdpt(a5)
move.w #(KNIGHTS_HEIGHT<<6)|1,bltsize(a5)
rts
.bq_linecopy2
move.l (a0)+,bltapt(a5)
move.l (a0)+,bltdpt(a5)
move.w #(KNIGHTS_HEIGHT<<6)|1,bltsize(a5)
rts
.bq_linecopy3
BLTCON_SET AD,BLT_A&BLT_C,2,0
move.w #$333,bltcdat(a5)
move.l (a0)+,bltapt(a5)
move.l (a0)+,bltdpt(a5)
move.w #(KNIGHTS_HEIGHT<<6)|1,bltsize(a5)
rts
.bq_linecopy4
BLTCON_SET AD,BLT_A,0,0
move.l (a0)+,bltapt(a5)
move.l (a0)+,bltdpt(a5)
move.w #(KNIGHTS_HEIGHT<<6)|1,bltsize(a5)
rts
;--------------------------------------------------------------------
blb_fill_rays:
tst.b (a1)
bne.s .cont
addq.l #2,a1
rts
.cont
PREP_ADD_TO_BLITTER_QUEUE a0
FAST_ADD_TO_BLITTER_QUEUE a4,a0
addq.l #4,a4
move.l #.bq_fillinit,(a4)+
moveq.l #0,d0
moveq.l #10,d5
move.l #.bq_fill,d6
.loop
moveq.l #0,d1
move.b (a1)+,d1
beq.s .finished
moveq.l #0,d3
move.b (a1)+,d3
move.w (a1)+,d0 ; offset
;PUTMSG 10,<"Height %d, Offset %ld">,d3,d0
move.l a3,d2
move.l a2,d4
add.l d0,d2
add.l d0,d4
lsl.w #6,d3
addq.w #KNIGHTS_SLICE_WIDTH/16,d3 ; bltsize
FAST_ADD_TO_BLITTER_QUEUE a4,a0
addq.l #4,a4
move.l d6,(a4)+
move.w d1,(a4)+ ; bltcon1
move.l d2,(a4)+ ; bltapt
move.l d4,(a4)+ ; bltdpt
move.w d3,(a4)+ ; bltsize
bra.s .loop
.finished
TERM_ADD_TO_BLITTER_QUEUE a0
addq.l #1,a1
rts
.bq_fillinit
BLTCON_SET AD,BLT_A,0,0
moveq.l #-1,d0
move.l d0,bltafwm(a5)
move.w #(KNIGHTS_BUF_WIDTH-KNIGHTS_SLICE_WIDTH)/8,d0
move.w d0,bltamod(a5)
move.w d0,bltdmod(a5)
BLTHOGOFF
moveq.l #0,d0
rts
.bq_fill
move.w (a0)+,bltcon1(a5)
lea bltapt(a5),a1
move.l (a0)+,(a1)+ ; bltapt
move.l (a0)+,(a1)+ ; bltdpt
move.w (a0)+,(a1)+ ; bltsize
rts
;--------------------------------------------------------------------
blb_paint_slices:
tst.b (a1)
bne.s .cont
addq.l #2,a1
rts
.cont
ADD_TO_BLITTER_QUEUE a4,a0
addq.l #4,a4
move.l #.bq_paintinit,(a4)+
.loop
moveq.l #0,d0 ; x pos
move.b (a1)+,d0
beq.s .finished
moveq.l #7,d1
and.b d0,d1 ; control
and.w #$f8,d0 ; xpos * 4
IF KNIGHTS_SLICE_WIDTH == 32
lsr.w #1,d0
ELSE
lsr.w #2,d0
ENDC
moveq.l #0,d3
move.b (a1)+,d3
moveq.l #0,d2
move.w (a1)+,d2
PUTMSG 40,<"%d: x=%d, yo=%lx, h=%d">,d1,d0,d2,d3
lsl.w #6,d3
addq.w #KNIGHTS_SLICE_WIDTH/16,d3
move.l pd_CurrDbPlanesP1234Ptr(a6),a2
adda.l d2,a2
adda.w d0,a2
move.l pd_CurrDbPlanesP56Ptr(a6),a3
adda.l d2,a3
adda.w d0,a3
add.w d1,d1
move.w .table(pc,d1.w),d1
jmp .table(pc,d1.w)
.finished
addq.l #1,a1
rts
.table dc.w .nop-.table
dc.w .filldarkest-.table ; 1
dc.w .filldark-.table ; 2
dc.w .fillbright-.table ; 3
dc.w .nop-.table
dc.w .darkestlinedark-.table ; 5
dc.w .darklinebright-.table ; 6
dc.w .bothmixedlines-.table ; 7
.nop bra.s .loop
; fill darkest
.filldarkest
move.l pd_OriginalBufferP1234(a6),a0
lsr.w #1,d2
lea 2*(KNIGHTS_WIDTH/8)(a0,d2.w),a0
adda.w d0,a0
move.l pd_OriginalBufferP56(a6),d4
lsr.w #1,d2
add.l d2,d4
add.l d0,d4
moveq.l #KNIGHTS_WIDTH/8,d7
move.l a0,d2
PREP_ADD_TO_BLITTER_QUEUE a0
; plane 1
FAST_ADD_TO_BLITTER_QUEUE a4,a0
addq.l #4,a4
move.l #.bq_copy1,(a4)+
move.l d2,(a4)+ ; bltapt
move.l a2,(a4)+ ; bltdpt
move.w d3,(a4)+ ; bltsize
add.l d7,d2
lea KNIGHTS_MOD(a2),a2
; plane 2
FAST_ADD_TO_BLITTER_QUEUE a4,a0
addq.l #4,a4
move.l #.bq_copy1f,(a4)+
move.l d2,(a4)+ ; bltapt
move.l a2,(a4)+ ; bltdpt
move.w d3,(a4)+ ; bltsize
lea KNIGHTS_MOD(a2),a2
; plane 5
FAST_ADD_TO_BLITTER_QUEUE a4,a0
addq.l #4,a4
move.l #.bq_copy56,(a4)+
move.l d4,(a4)+ ; bltapt
move.l a3,(a4)+ ; bltdpt
move.w d3,(a4)+ ; bltsize
lea KNIGHTS_MOD(a3),a3
add.l d7,d4
; plane 6
FAST_ADD_TO_BLITTER_QUEUE a4,a0
addq.l #4,a4
move.l #.bq_copy56f,(a4)+
move.l d4,(a4)+ ; bltapt
move.l a3,(a4)+ ; bltdpt
move.w d3,(a4)+ ; bltsize
; plane 3
FAST_ADD_TO_BLITTER_QUEUE a4,a0
addq.l #4,a4
move.l #.bq_clr1,(a4)+
move.l a2,(a4)+ ; bltdpt
move.w d3,(a4)+ ; bltsize
lea KNIGHTS_MOD(a2),a2
; plane 4
LAST_ADD_TO_BLITTER_QUEUE a4,a0
addq.l #4,a4
move.l #.bq_clr1f,(a4)+
move.l a2,(a4)+ ; bltdpt
move.w d3,(a4)+ ; bltsize
bra .loop
.darkestlinedark
move.l pd_DrawDarkBuffer(a6),d5
add.l d2,d5
add.l d0,d5
move.l pd_FillDarkBuffer(a6),d6
add.l d2,d6
add.l d0,d6
move.l pd_OriginalBufferP1234(a6),a0
lsr.w #1,d2
lea 1*(KNIGHTS_WIDTH/8)(a0,d2.w),a0
adda.w d0,a0
move.l pd_OriginalBufferP56(a6),d4
lsr.w #1,d2
add.l d2,d4
add.l d0,d4
moveq.l #KNIGHTS_WIDTH/8,d7
move.l a0,d2
PREP_ADD_TO_BLITTER_QUEUE a0
; plane 1 dark
FAST_ADD_TO_BLITTER_QUEUE a4,a0
addq.l #4,a4
move.l #.bq_copy2,(a4)+
move.w #(BLTEN_ABCD+(((BLT_A&BLT_C)&~BLT_B)&$ff)),(a4)+ ; copy (A) where mask (C) is, but not where line (B) is
move.l d6,(a4)+ ; bltcpt
move.l d5,(a4)+ ; bltbpt
move.l d2,(a4)+ ; bltapt
move.l a2,(a4)+ ; bltdpt
move.w d3,(a4)+ ; bltsize
add.l d7,d2
move.l #.bq_generic_abcd,d1
; plane 2 darkest
FAST_ADD_TO_BLITTER_QUEUE a4,a0
addq.l #4,a4
move.l d1,(a4)+
move.w #(BLTEN_ABCD+(((BLT_A&~BLT_C)|BLT_B)&$ff)),(a4)+ ; copy (A) where mask (C) is NOT and merge with existing (B)
move.l d6,(a4)+ ; bltcpt
move.l a2,(a4)+ ; bltbpt
move.l d2,(a4)+ ; bltapt
move.l a2,(a4)+ ; bltdpt
move.w d3,(a4)+ ; bltsize
lea KNIGHTS_MOD(a2),a2
; plane 2 dark
FAST_ADD_TO_BLITTER_QUEUE a4,a0
addq.l #4,a4
move.l d1,(a4)+
move.w #(BLTEN_ABCD+(((BLT_A&BLT_C)&~BLT_B)&$ff)),(a4)+ ; copy (A) where mask (C) is, but not where line (B) is
move.l d6,(a4)+ ; bltcpt
move.l d5,(a4)+ ; bltbpt
move.l d2,(a4)+ ; bltapt
move.l a2,(a4)+ ; bltdpt
move.w d3,(a4)+ ; bltsize
add.l d7,d2
; plane 3 darkest
FAST_ADD_TO_BLITTER_QUEUE a4,a0
addq.l #4,a4
move.l d1,(a4)+
move.w #(BLTEN_ABCD+(((BLT_A&~BLT_C)|BLT_B)&$ff)),(a4)+ ; copy (A) where mask (C) is NOT and merge with existing (B)
move.l d6,(a4)+ ; bltcpt
move.l a2,(a4)+ ; bltbpt
move.l d2,(a4)+ ; bltapt
move.l a2,(a4)+ ; bltdpt
move.w d3,(a4)+ ; bltsize
lea KNIGHTS_MOD(a2),a2
; plane 3 dark
FAST_ADD_TO_BLITTER_QUEUE a4,a0
addq.l #4,a4
move.l d1,(a4)+
move.w #(BLTEN_ABCD+(((BLT_A&BLT_C)&~BLT_B)&$ff)),(a4)+ ; copy (A) where mask (C) is, but not where line (B) is
move.l d6,(a4)+ ; bltcpt
move.l d5,(a4)+ ; bltbpt
move.l d2,(a4)+ ; bltapt
move.l a2,(a4)+ ; bltdpt
move.w d3,(a4)+ ; bltsize
lea KNIGHTS_MOD(a2),a2
; plane 4
FAST_ADD_TO_BLITTER_QUEUE a4,a0
addq.l #4,a4
move.l #.bq_copy3,(a4)+
move.l d5,(a4)+ ; bltapt
move.l a2,(a4)+ ; bltdpt
move.w d3,(a4)+ ; bltsize
; plane 5
FAST_ADD_TO_BLITTER_QUEUE a4,a0
addq.l #4,a4
move.l #.bq_copy56b,(a4)+
move.l d5,(a4)+ ; bltcpt
move.l d4,(a4)+ ; bltapt
move.l a3,(a4)+ ; bltdpt
move.w d3,(a4)+ ; bltsize
lea KNIGHTS_MOD(a3),a3
add.l d7,d4
; plane 6
; copy (A) where line (B) is NOT
LAST_ADD_TO_BLITTER_QUEUE a4,a0
addq.l #4,a4
move.l #.bq_copy56bf,(a4)+
move.l d5,(a4)+ ; bltcpt
move.l d4,(a4)+ ; bltapt
move.l a3,(a4)+ ; bltdpt
move.w d3,(a4)+ ; bltsize
bra .loop
.filldark
move.l pd_OriginalBufferP1234(a6),a0
lsr.w #1,d2
lea (KNIGHTS_WIDTH/8)(a0,d2.w),a0
adda.w d0,a0
move.l pd_OriginalBufferP56(a6),d4
lsr.w #1,d2
add.l d2,d4
add.l d0,d4
moveq.l #KNIGHTS_WIDTH/8,d7
move.l a0,d2
PREP_ADD_TO_BLITTER_QUEUE a0
; plane 1
FAST_ADD_TO_BLITTER_QUEUE a4,a0
addq.l #4,a4
move.l #.bq_copy1,(a4)+
move.l d2,(a4)+ ; bltapt
move.l a2,(a4)+ ; bltdpt
move.w d3,(a4)+ ; bltsize
add.l d7,d2
lea KNIGHTS_MOD(a2),a2
; plane 2
FAST_ADD_TO_BLITTER_QUEUE a4,a0
addq.l #4,a4
move.l #.bq_copy1f,(a4)+
move.l d2,(a4)+ ; bltapt
move.l a2,(a4)+ ; bltdpt
move.w d3,(a4)+ ; bltsize
add.l d7,d2
lea KNIGHTS_MOD(a2),a2
; plane 3
FAST_ADD_TO_BLITTER_QUEUE a4,a0
addq.l #4,a4
move.l #.bq_copy1f,(a4)+
move.l d2,(a4)+ ; bltapt
move.l a2,(a4)+ ; bltdpt
move.w d3,(a4)+ ; bltsize
lea KNIGHTS_MOD(a2),a2
; plane 5
FAST_ADD_TO_BLITTER_QUEUE a4,a0
addq.l #4,a4
move.l #.bq_copy56,(a4)+
move.l d4,(a4)+ ; bltapt
move.l a3,(a4)+ ; bltdpt
move.w d3,(a4)+ ; bltsize
lea KNIGHTS_MOD(a3),a3
add.l d7,d4
; plane 6
FAST_ADD_TO_BLITTER_QUEUE a4,a0
addq.l #4,a4
move.l #.bq_copy56f,(a4)+
move.l d4,(a4)+ ; bltapt
move.l a3,(a4)+ ; bltdpt
move.w d3,(a4)+ ; bltsize
; plane 4
LAST_ADD_TO_BLITTER_QUEUE a4,a0
addq.l #4,a4
move.l #.bq_clr1,(a4)+
move.l a2,(a4)+ ; bltdpt
move.w d3,(a4)+ ; bltsize
bra .loop
.darklinebright
move.l pd_DrawBrightBuffer(a6),d5
add.l d2,d5
add.l d0,d5
move.l pd_FillBrightBuffer(a6),d6
add.l d2,d6
add.l d0,d6
move.l pd_OriginalBufferP1234(a6),a0
lsr.w #1,d2
adda.w d2,a0
adda.w d0,a0
move.l pd_OriginalBufferP56(a6),d4
lsr.w #1,d2
add.l d2,d4
add.l d0,d4
moveq.l #KNIGHTS_WIDTH/8,d7
move.l a0,d2
PREP_ADD_TO_BLITTER_QUEUE a0
; plane 1 bright
FAST_ADD_TO_BLITTER_QUEUE a4,a0
addq.l #4,a4
move.l #.bq_copy2,(a4)+
move.w #(BLTEN_ABCD+(((BLT_A&BLT_C)&~BLT_B)&$ff)),(a4)+ ; copy (A) where mask (C) is, but not where line (B) is
move.l d6,(a4)+ ; bltcpt
move.l d5,(a4)+ ; bltbpt
move.l d2,(a4)+ ; bltapt
move.l a2,(a4)+ ; bltdpt
move.w d3,(a4)+ ; bltsize
add.l d7,d2
move.l #.bq_generic_abcd,d1
; plane 1 dark
FAST_ADD_TO_BLITTER_QUEUE a4,a0
addq.l #4,a4
move.l d1,(a4)+
move.w #(BLTEN_ABCD+(((BLT_A&~BLT_C)|BLT_B)&$ff)),(a4)+ ; copy (A) where mask (C) is NOT and merge with existing (B)
move.l d6,(a4)+ ; bltcpt
move.l a2,(a4)+ ; bltbpt
move.l d2,(a4)+ ; bltapt
move.l a2,(a4)+ ; bltdpt
move.w d3,(a4)+ ; bltsize
lea KNIGHTS_MOD(a2),a2
; plane 2 bright
FAST_ADD_TO_BLITTER_QUEUE a4,a0
addq.l #4,a4
move.l d1,(a4)+
move.w #(BLTEN_ABCD+(((BLT_A&BLT_C)|BLT_B)&$ff)),(a4)+ ; copy (A) where mask (C) is OR where line (B) is
move.l d6,(a4)+ ; bltcpt
move.l d5,(a4)+ ; bltbpt
move.l d2,(a4)+ ; bltapt
move.l a2,(a4)+ ; bltdpt
move.w d3,(a4)+ ; bltsize
add.l d7,d2
; plane 2 dark
FAST_ADD_TO_BLITTER_QUEUE a4,a0
addq.l #4,a4
move.l d1,(a4)+
move.w #(BLTEN_ABCD+(((BLT_A&~BLT_C)|BLT_B)&$ff)),(a4)+ ; copy (A) where mask (C) is NOT and merge with existing (B)
move.l d6,(a4)+ ; bltcpt
move.l a2,(a4)+ ; bltbpt
move.l d2,(a4)+ ; bltapt
move.l a2,(a4)+ ; bltdpt
move.w d3,(a4)+ ; bltsize
lea KNIGHTS_MOD(a2),a2
; plane 3 bright
FAST_ADD_TO_BLITTER_QUEUE a4,a0
addq.l #4,a4
move.l d1,(a4)+
move.w #(BLTEN_ABCD+(((BLT_A&BLT_C)&~BLT_B)&$ff)),(a4)+ ; copy (A) where mask (C) is, but not where line (B) is
move.l d6,(a4)+ ; bltcpt
move.l d5,(a4)+ ; bltbpt
move.l d2,(a4)+ ; bltapt
move.l a2,(a4)+ ; bltdpt
move.w d3,(a4)+ ; bltsize
add.l d7,d2
; plane 3 dark
FAST_ADD_TO_BLITTER_QUEUE a4,a0
addq.l #4,a4
move.l d1,(a4)+
move.w #(BLTEN_ABCD+(((BLT_A&~BLT_C)|BLT_B)&$ff)),(a4)+ ; copy (A) where mask (C) is NOT and merge with existing (B)
move.l d6,(a4)+ ; bltcpt
move.l a2,(a4)+ ; bltbpt
move.l d2,(a4)+ ; bltapt
move.l a2,(a4)+ ; bltdpt
move.w d3,(a4)+ ; bltsize
lea KNIGHTS_MOD(a2),a2
; plane 4 bright
FAST_ADD_TO_BLITTER_QUEUE a4,a0
addq.l #4,a4
move.l d1,(a4)+
move.w #(BLTEN_ABCD+(((BLT_A&BLT_C)|BLT_B)&$ff)),(a4)+ ; copy (A) where mask (C) is OR where line (B) is
move.l d6,(a4)+ ; bltcpt
move.l d5,(a4)+ ; bltbpt
move.l d2,(a4)+ ; bltapt
move.l a2,(a4)+ ; bltdpt
move.w d3,(a4)+ ; bltsize
add.l d7,d2
; plane 5
FAST_ADD_TO_BLITTER_QUEUE a4,a0
addq.l #4,a4
move.l #.bq_copy56b,(a4)+
move.l d5,(a4)+ ; bltcpt
move.l d4,(a4)+ ; bltapt
move.l a3,(a4)+ ; bltdpt
move.w d3,(a4)+ ; bltsize
lea KNIGHTS_MOD(a3),a3
add.l d7,d4
; plane 6
; copy (A) where line (B) is NOT
LAST_ADD_TO_BLITTER_QUEUE a4,a0
addq.l #4,a4
move.l #.bq_copy56bf,(a4)+
move.l d5,(a4)+ ; bltcpt
move.l d4,(a4)+ ; bltapt
move.l a3,(a4)+ ; bltdpt
move.w d3,(a4)+ ; bltsize
bra .loop
.fillbright
move.l pd_OriginalBufferP1234(a6),a0
lsr.w #1,d2
adda.w d2,a0
adda.w d0,a0
move.l pd_OriginalBufferP56(a6),d4
lsr.w #1,d2
add.l d2,d4
add.l d0,d4
move.w d3,d1
lsl.w #2,d1
subq.w #3*(KNIGHTS_SLICE_WIDTH/16),d1
moveq.l #KNIGHTS_WIDTH/8,d7
move.l a0,d2
PREP_ADD_TO_BLITTER_QUEUE a0
; plane 1-4
FAST_ADD_TO_BLITTER_QUEUE a4,a0
addq.l #4,a4
move.l #.bq_copy7,(a4)+
move.l d2,(a4)+ ; bltapt
move.l a2,(a4)+ ; bltdpt
move.w d1,(a4)+ ; bltsize
; plane 5
FAST_ADD_TO_BLITTER_QUEUE a4,a0
addq.l #4,a4
move.l #.bq_copy7b,(a4)+
move.l d4,(a4)+ ; bltapt
move.l a3,(a4)+ ; bltdpt
move.w d3,(a4)+ ; bltsize
lea KNIGHTS_MOD(a3),a3
add.l d7,d4
; plane 6
LAST_ADD_TO_BLITTER_QUEUE a4,a0
addq.l #4,a4
move.l #.bq_copy56f,(a4)+
move.l d4,(a4)+ ; bltapt
move.l a3,(a4)+ ; bltdpt
move.w d3,(a4)+ ; bltsize
bra .loop
; middleMaskNoL = (fillDark & ~fillBright) & ~drawDark (has no lines)
; rightMaskNoL = fillBright & ~drawBright (has no lines)
; bothLines = (drawDark || darkBright)
; 1: (origDarkest &~fillDark) || (origDark & middleMaskNoL) || (origBright & rightMaskNoL)
; -> d = (origDarkest &~fillDark); d = d || (origDark & middleMaskNoL); d = d || (origBright & rightMaskNoL)
; 2: (origDarkest &~fillDark) || (origDark & middleMaskNoL) || (origBright & rightMaskNoL) || drawBright
; -> d = (origDarkest &~fillDark) || drawBright; d = d || (origDark & middleMaskNoL); d = d || (origBright & rightMaskNoL)
; 3: (origDark & middleMaskNoL) || (origBright & rightMaskNoL)
; -> d = (origDark & middleMaskNoL); d = d || (origBright & rightMaskNoL)
; 4: (origBright & rightMaskNoL) || bothLines
; -> d = (origBright & rightMaskNoL) || bothLines
; 5: (orig & ~bothLines)
; 6: (orig & ~bothLines)
.bothmixedlines
move.l pd_DrawBrightBuffer(a6),d5
add.l d2,d5
add.l d0,d5
move.l pd_FillBrightBuffer(a6),d6
add.l d2,d6
add.l d0,d6
move.l pd_DrawDarkBuffer(a6),a0
add.l d2,a0
add.l d0,a0
move.l a0,-(sp)
move.l pd_FillDarkBuffer(a6),d7
add.l d2,d7
add.l d0,d7
move.l pd_OriginalBufferP1234(a6),a0
lsr.w #1,d2
adda.w d2,a0
adda.w d0,a0
move.l pd_OriginalBufferP56(a6),d4
lsr.w #1,d2
add.l d2,d4
add.l d0,d4
move.l a0,d2
PREP_ADD_TO_BLITTER_QUEUE a0
; create MiddleMask: dark and NOT bright and not line
FAST_ADD_TO_BLITTER_QUEUE a4,a0
addq.l #4,a4
move.l #.bq_createmask1,(a4)+
move.l d6,(a4)+ ; bltcpt
move.l (sp),(a4)+ ; bltbpt
move.l d7,(a4)+ ; bltapt
move.l pd_MiddleMaskBuffer(a6),(a4)+ ; bltdpt
move.w d3,(a4)+ ; bltsize
; create RightMask: dark and NOT bright and not line
FAST_ADD_TO_BLITTER_QUEUE a4,a0
addq.l #4,a4
move.l #.bq_createmask2,(a4)+
move.l d5,(a4)+ ; bltcpt
move.l d6,(a4)+ ; bltapt
move.l pd_RightMaskBuffer(a6),(a4)+ ; bltdpt
move.w d3,(a4)+ ; bltsize
; create BothLines: dark and NOT bright and not line
FAST_ADD_TO_BLITTER_QUEUE a4,a0
addq.l #4,a4
move.l #.bq_createmask3,(a4)+
move.l d5,(a4)+ ; bltcpt
move.l (sp)+,(a4)+ ; bltapt
move.l pd_BothLinesMaskBuffer(a6),(a4)+ ; bltdpt
move.w d3,(a4)+ ; bltsize
add.l #2*KNIGHTS_WIDTH/8,d2 ; p3
; plane 1
FAST_ADD_TO_BLITTER_QUEUE a4,a0
addq.l #4,a4
move.l #.bq_copy9,(a4)+
move.l d7,(a4)+ ; bltcpt
move.l d2,(a4)+ ; bltapt
move.l a2,(a4)+ ; bltdpt
move.w d3,(a4)+ ; bltsize
sub.l #KNIGHTS_WIDTH/8,d2 ; p2
; d = d || (origDark & middleMaskNoL)
FAST_ADD_TO_BLITTER_QUEUE a4,a0
addq.l #4,a4
move.l #.bq_mixit1,(a4)+
move.l pd_MiddleMaskBuffer(a6),(a4)+ ; bltcpt
move.l a2,(a4)+ ; bltbpt
move.l d2,(a4)+ ; bltapt
move.l a2,(a4)+ ; bltdpt
move.w d3,(a4)+ ; bltsize
sub.l #KNIGHTS_WIDTH/8,d2 ; p1
move.l #.bq_generic_abcd,d1
; d = d || (origBright & rightMaskNoL)
FAST_ADD_TO_BLITTER_QUEUE a4,a0
addq.l #4,a4
move.l d1,(a4)+
move.w #(BLTEN_ABCD+(((BLT_A&BLT_C)|BLT_B)&$ff)),(a4)+ ; d = d || (origBright & rightMaskNoL)
move.l pd_RightMaskBuffer(a6),(a4)+ ; bltcpt
move.l a2,(a4)+ ; bltbpt
move.l d2,(a4)+ ; bltapt
move.l a2,(a4)+ ; bltdpt
move.w d3,(a4)+ ; bltsize
add.l #3*KNIGHTS_WIDTH/8,d2 ; p4
lea KNIGHTS_MOD(a2),a2
; plane 2
; d = (origDarkest &~fillDark) || drawBright
FAST_ADD_TO_BLITTER_QUEUE a4,a0
addq.l #4,a4
move.l #.bq_mixit2,(a4)+
move.l d7,(a4)+ ; bltcpt
move.l d5,(a4)+ ; bltbpt
move.l d2,(a4)+ ; bltapt
move.l a2,(a4)+ ; bltdpt
move.w d3,(a4)+ ; bltsize
sub.l #KNIGHTS_WIDTH/8,d2 ; p3
; d = d || (origDark & middleMaskNoL)
FAST_ADD_TO_BLITTER_QUEUE a4,a0
addq.l #4,a4
move.l #.bq_mixit1,(a4)+
move.l pd_MiddleMaskBuffer(a6),(a4)+ ; bltcpt
move.l a2,(a4)+ ; bltbpt
move.l d2,(a4)+ ; bltapt
move.l a2,(a4)+ ; bltdpt
move.w d3,(a4)+ ; bltsize
sub.l #KNIGHTS_WIDTH/8,d2 ; p2
; d = d || (origBright & rightMaskNoL)
FAST_ADD_TO_BLITTER_QUEUE a4,a0
addq.l #4,a4
move.l d1,(a4)+
move.w #(BLTEN_ABCD+(((BLT_A&BLT_C)|BLT_B)&$ff)),(a4)+ ; d = d || (origBright & rightMaskNoL)
move.l pd_RightMaskBuffer(a6),(a4)+ ; bltcpt
move.l a2,(a4)+ ; bltbpt
move.l d2,(a4)+ ; bltapt
move.l a2,(a4)+ ; bltdpt
move.w d3,(a4)+ ; bltsize
add.l #2*KNIGHTS_WIDTH/8,d2 ; p4
lea KNIGHTS_MOD(a2),a2
; plane 3
; d = (origDark & middleMaskNoL)
FAST_ADD_TO_BLITTER_QUEUE a4,a0
addq.l #4,a4
move.l #.bq_mixit1b,(a4)+
move.l pd_MiddleMaskBuffer(a6),(a4)+ ; bltcpt
move.l d2,(a4)+ ; bltapt
move.l a2,(a4)+ ; bltdpt
move.w d3,(a4)+ ; bltsize
sub.l #KNIGHTS_WIDTH/8,d2 ; p3
; d = d || (origBright & rightMaskNoL)
FAST_ADD_TO_BLITTER_QUEUE a4,a0
addq.l #4,a4
move.l d1,(a4)+
move.w #(BLTEN_ABCD+(((BLT_A&BLT_C)|BLT_B)&$ff)),(a4)+ ; d = d || (origBright & rightMaskNoL)
move.l pd_RightMaskBuffer(a6),(a4)+ ; bltcpt
move.l a2,(a4)+ ; bltbpt
move.l d2,(a4)+ ; bltapt
move.l a2,(a4)+ ; bltdpt
move.w d3,(a4)+ ; bltsize
add.l #KNIGHTS_WIDTH/8,d2 ; p4
lea KNIGHTS_MOD(a2),a2
; plane 4
; d = (origBright & rightMaskNoL) || bothLines
FAST_ADD_TO_BLITTER_QUEUE a4,a0
addq.l #4,a4
move.l #.bq_mixit3,(a4)+
move.l pd_RightMaskBuffer(a6),(a4)+ ; bltcpt
move.l pd_BothLinesMaskBuffer(a6),(a4)+ ; bltbpt
move.l d2,(a4)+ ; bltapt
move.l a2,(a4)+ ; bltdpt
move.w d3,(a4)+ ; bltsize
; plane 5
; copy (A) where both lines (B) are NOT
FAST_ADD_TO_BLITTER_QUEUE a4,a0
addq.l #4,a4
move.l #.bq_copy56c,(a4)+
move.l pd_BothLinesMaskBuffer(a6),(a4)+ ; bltcpt
move.l d4,(a4)+ ; bltapt
move.l a3,(a4)+ ; bltdpt
move.w d3,(a4)+ ; bltsize
lea KNIGHTS_MOD(a3),a3
add.l #KNIGHTS_WIDTH/8,d4
; plane 6
; copy (A) where both lines (B) are NOT
FAST_ADD_TO_BLITTER_QUEUE a4,a0
addq.l #4,a4
move.l #.bq_copy56bf,(a4)+
move.l pd_BothLinesMaskBuffer(a6),(a4)+ ; bltcpt
move.l d4,(a4)+ ; bltapt
move.l a3,(a4)+ ; bltdpt
move.w d3,(a4)+ ; bltsize
LAST_ADD_TO_BLITTER_QUEUE a4,a0
addq.l #4,a4
move.l #.bq_restorecmod,(a4)+
bra .loop
.bq_paintinit
BLTCON_SET AD,BLT_A,0,0
moveq.l #-1,d0
move.l d0,bltafwm(a5)
move.w #(KNIGHTS_BUF_WIDTH-KNIGHTS_SLICE_WIDTH)/8,d0
lea bltcmod(a5),a1
move.w d0,(a1)+ ; bltcmod
move.w d0,(a1)+ ; bltbmod
move.w d0,(a1)+ ; bltamod
move.w d0,(a1)+ ; bltdmod
BLTHOGOFF
moveq.l #0,d0
move.w d0,(a1)+ ; bltcdat
rts
.bq_copy1
BLTCON0_SET AD,BLT_A,0
move.w #(4*KNIGHTS_WIDTH-KNIGHTS_SLICE_WIDTH)/8,bltamod(a5)
.bq_copy1f
lea bltapt(a5),a1
move.l (a0)+,(a1)+ ; bltapt
move.l (a0)+,(a1)+ ; bltdpt
move.w (a0)+,(a1)+ ; bltsize
rts
.bq_copy2
move.w #(4*KNIGHTS_WIDTH-KNIGHTS_SLICE_WIDTH)/8,bltamod(a5)
.bq_generic_abcd
move.w (a0)+,bltcon0(a5)
lea bltcpt(a5),a1
move.l (a0)+,(a1)+ ; bltcpt
move.l (a0)+,(a1)+ ; bltbpt
move.l (a0)+,(a1)+ ; bltapt
move.l (a0)+,(a1)+ ; bltdpt
move.w (a0)+,(a1)+ ; bltsize
rts
.bq_copy3
BLTCON0_SET AD,BLT_A,0 ; copy line (A)
move.w #(KNIGHTS_BUF_WIDTH-KNIGHTS_SLICE_WIDTH)/8,bltamod(a5)
lea bltapt(a5),a1
move.l (a0)+,(a1)+ ; bltapt
move.l (a0)+,(a1)+ ; bltdpt
move.w (a0)+,(a1)+ ; bltsize
rts
.bq_copy56
BLTCON0_SET AD,BLT_A,0
move.w #(2*KNIGHTS_WIDTH-KNIGHTS_SLICE_WIDTH)/8,bltamod(a5)
.bq_copy56f
lea bltapt(a5),a1
move.l (a0)+,(a1)+ ; bltapt
move.l (a0)+,(a1)+ ; bltdpt
move.w (a0)+,(a1)+ ; bltsize
rts
.bq_copy56c
move.w #(KNIGHTS_BUF_WIDTH-KNIGHTS_SLICE_WIDTH)/8,bltbmod(a5)
.bq_copy56b
BLTCON0_SET ACD,BLT_A&~BLT_C,0 ; copy (A) where line (B) is NOT
move.w #(2*KNIGHTS_WIDTH-KNIGHTS_SLICE_WIDTH)/8,bltamod(a5)
.bq_copy56bf
lea bltcpt(a5),a1
move.l (a0)+,(a1)+ ; bltcpt
addq.l #4,a1 ; bltbpt
move.l (a0)+,(a1)+ ; bltapt
move.l (a0)+,(a1)+ ; bltdpt
move.w (a0)+,(a1)+ ; bltsize
rts
.bq_clr1
BLTCON0_SET D,0,0
.bq_clr1f
move.l (a0)+,bltdpt(a5)
move.w (a0)+,bltsize(a5)
rts
.bq_copy7
BLTCON0_SET AD,BLT_A,0
move.l #(((KNIGHTS_WIDTH-KNIGHTS_SLICE_WIDTH)/8)<<16)|((2*KNIGHTS_WIDTH-KNIGHTS_SLICE_WIDTH)/8),bltamod(a5)
lea bltapt(a5),a1
move.l (a0)+,(a1)+ ; bltapt
move.l (a0)+,(a1)+ ; bltdpt
move.w (a0)+,(a1)+ ; bltsize
rts
.bq_copy7b
move.l #(((2*KNIGHTS_WIDTH-KNIGHTS_SLICE_WIDTH)/8)<<16)|((KNIGHTS_BUF_WIDTH-KNIGHTS_SLICE_WIDTH)/8),bltamod(a5)
lea bltapt(a5),a1
move.l (a0)+,(a1)+ ; bltapt
move.l (a0)+,(a1)+ ; bltdpt
move.w (a0)+,(a1)+ ; bltsize
rts
.bq_createmask1
BLTCON0_SET ABCD,(BLT_A&~BLT_C)&~BLT_B,0 ; create MiddleMask: dark and NOT bright and not line
move.l #((KNIGHTS_BUF_WIDTH-KNIGHTS_SLICE_WIDTH)/8)<<16,bltamod(a5)
lea bltcpt(a5),a1
move.l (a0)+,(a1)+ ; bltcpt
move.l (a0)+,(a1)+ ; bltbpt
move.l (a0)+,(a1)+ ; bltapt
move.l (a0)+,(a1)+ ; bltdpt
move.w (a0)+,(a1)+ ; bltsize
rts
.bq_createmask2
BLTCON0_SET ACD,(BLT_A&~BLT_C),0 ; create RightMask: dark and NOT bright and not line
lea bltcpt(a5),a1
move.l (a0)+,(a1)+ ; bltcpt
addq.l #4,a1 ; bltbpt
move.l (a0)+,(a1)+ ; bltapt
move.l (a0)+,(a1)+ ; bltdpt
move.w (a0)+,(a1)+ ; bltsize
rts
.bq_createmask3
BLTCON0_SET ACD,(BLT_A|BLT_C),0 ; create BothLines: dark and NOT bright and not line
lea bltcpt(a5),a1
move.l (a0)+,(a1)+ ; bltcpt
addq.l #4,a1 ; bltbpt
move.l (a0)+,(a1)+ ; bltapt
move.l (a0)+,(a1)+ ; bltdpt
move.w (a0)+,(a1)+ ; bltsize
rts
.bq_copy9
BLTCON0_SET ACD,(BLT_A&~BLT_C),0 ; d = (origDarkest &~fillDark)
move.l #(((4*KNIGHTS_WIDTH-KNIGHTS_SLICE_WIDTH)/8)<<16)|((KNIGHTS_BUF_WIDTH-KNIGHTS_SLICE_WIDTH)/8),bltamod(a5)
lea bltcpt(a5),a1
move.l (a0)+,(a1)+ ; bltcpt
addq.l #4,a1 ; bltbpt
move.l (a0)+,(a1)+ ; bltapt
move.l (a0)+,(a1)+ ; bltdpt
move.w (a0)+,(a1)+ ; bltsize
rts
.bq_mixit1
BLTCON0_SET ABCD,(BLT_A&BLT_C)|BLT_B,0 ; d = d || (origDark & middleMaskNoL)
move.w #0,bltcmod(a5)
lea bltcpt(a5),a1
move.l (a0)+,(a1)+ ; bltcpt
move.l (a0)+,(a1)+ ; bltbpt
move.l (a0)+,(a1)+ ; bltapt
move.l (a0)+,(a1)+ ; bltdpt
move.w (a0)+,(a1)+ ; bltsize
rts
.bq_mixit1b
BLTCON0_SET ACD,(BLT_A&BLT_C),0 ; d = (origDark & middleMaskNoL)
move.w #0,bltcmod(a5)
lea bltcpt(a5),a1
move.l (a0)+,(a1)+ ; bltcpt
addq.l #4,a1 ; bltbpt
move.l (a0)+,(a1)+ ; bltapt
move.l (a0)+,(a1)+ ; bltdpt
move.w (a0)+,(a1)+ ; bltsize
rts
.bq_mixit2
BLTCON0_SET ABCD,(BLT_A&~BLT_C)|BLT_B,0 ; d = (origDarkest &~fillDark) || drawBright
move.w #(KNIGHTS_BUF_WIDTH-KNIGHTS_SLICE_WIDTH)/8,bltcmod(a5)
lea bltcpt(a5),a1
move.l (a0)+,(a1)+ ; bltcpt
move.l (a0)+,(a1)+ ; bltbpt
move.l (a0)+,(a1)+ ; bltapt
move.l (a0)+,(a1)+ ; bltdpt
move.w (a0)+,(a1)+ ; bltsize
rts
.bq_mixit3
BLTCON0_SET ABCD,(BLT_A&BLT_C)|BLT_B,0 ; d = (origBright & rightMaskNoL) || bothLines
moveq.l #0,d0
move.l d0,bltcmod(a5)
lea bltcpt(a5),a1
move.l (a0)+,(a1)+ ; bltcpt
move.l (a0)+,(a1)+ ; bltbpt
move.l (a0)+,(a1)+ ; bltapt
move.l (a0)+,(a1)+ ; bltdpt
move.w (a0)+,(a1)+ ; bltsize
rts
.bq_restorecmod
move.w #(KNIGHTS_BUF_WIDTH-KNIGHTS_SLICE_WIDTH)/8,bltcmod(a5)
moveq.l #0,d0
rts
;--------------------------------------------------------------------
blb_paint_text_slices:
move.l pd_TextPaintDataPtr(a6),a1
tst.w (a1)
bne.s .cont
rts
.cont
PREP_ADD_TO_BLITTER_QUEUE a0
.loop
move.w (a1)+,d3
beq.s .finished
FAST_ADD_TO_BLITTER_QUEUE a4,a0
addq.l #4,a4
; sprite offset, source offset, mask offset
movem.w (a1)+,d0-d2
move.l a1,d7
move.l pd_CurrTextSpritesPtr(a6),a1
move.l (a1),a1
adda.w d0,a1
move.l pd_SourcePanelPtr(a6),d4
beq.s .emptysource
tst.w d2
beq.s .plaincopy
move.l d4,a2
adda.w d1,a2
move.l pd_FillBrightBuffer(a6),a3
lea (KNIGHTS_BUF_WIDTH/8)*TITLETEXT_Y_POS(a3),a3
adda.w d2,a3
; plane 1
move.l #.bq_mask,(a4)+
move.l a3,(a4)+ ; bltcpt
move.l a1,(a4)+ ; bltbpt
move.l a2,(a4)+ ; bltapt
move.l a1,(a4)+ ; bltdpt
move.w d3,(a4)+ ; bltsize
addq.w #2,a1
lea (TITLETEXT_WIDTH/8)(a2),a2
; plane 2
FAST_ADD_TO_BLITTER_QUEUE a4,a0
addq.l #4,a4
move.l #.bq_mask_more,(a4)+
move.l a3,(a4)+ ; bltcpt
move.l a1,(a4)+ ; bltbpt
move.l a2,(a4)+ ; bltapt
move.l a1,(a4)+ ; bltdpt
move.w d3,(a4)+ ; bltsize
move.l d7,a1
bra.s .loop
.plaincopy
tst.w d1
beq.s .dbcopy
move.l d4,a2
adda.w d1,a2
move.l #.bq_copy,(a4)+
move.l a2,(a4)+ ; bltapt
move.l a1,(a4)+ ; bltdpt
move.w d3,(a4)+ ; bltsize
move.l d7,a1
bra.s .loop
.dbcopy
move.l pd_LastTextSpritesPtr(a6),a2
move.l (a2),a2
adda.w d0,a2
move.l #.bq_dbcopy,(a4)+
move.l a2,(a4)+ ; bltapt
move.l a1,(a4)+ ; bltdpt
move.w d3,(a4)+ ; bltsize
move.l d7,a1
bra .loop
.emptysource
tst.w d2
beq.s .clearall
move.l pd_FillBrightBuffer(a6),a3
lea (KNIGHTS_BUF_WIDTH/8)*TITLETEXT_Y_POS(a3),a3
adda.w d2,a3
; plane 1
move.l #.bq_mask_clear,(a4)+
move.l a3,(a4)+ ; bltcpt
move.l a1,(a4)+ ; bltapt
move.l a1,(a4)+ ; bltdpt
move.w d3,(a4)+ ; bltsize
addq.w #2,a1
lea (TITLETEXT_WIDTH/8)(a2),a2
; plane 2
FAST_ADD_TO_BLITTER_QUEUE a4,a0
addq.l #4,a4
move.l #.bq_mask_clear_more,(a4)+
move.l a3,(a4)+ ; bltcpt
move.l a1,(a4)+ ; bltapt
move.l a1,(a4)+ ; bltdpt
move.w d3,(a4)+ ; bltsize
move.l d7,a1
bra .loop
.clearall
tst.w d1
beq.s .dbcopy
move.l #.bq_clear,(a4)+
move.l a1,(a4)+ ; bltdpt
move.w d3,(a4)+ ; bltsize
move.l d7,a1
bra .loop
.finished
;clr.l (a0)
TERM_ADD_TO_BLITTER_QUEUE a0
rts
.bq_mask
BLTCON_SET ABCD,(BLT_A&BLT_C)|(BLT_B&~BLT_C),0,0
moveq.l #-1,d0
move.l d0,bltafwm(a5)
move.l #(((KNIGHTS_BUF_WIDTH-16)/8)<<16)|(2),bltcmod(a5)
move.l #(((TITLETEXT_WIDTH*TITLETEXT_PLANES-16)/8)<<16)|(2),bltamod(a5)
.bq_mask_more
lea bltcpt(a5),a1
move.l (a0)+,(a1)+ ; bltcpt
move.l (a0)+,(a1)+ ; bltbpt
move.l (a0)+,(a1)+ ; bltapt
move.l (a0)+,(a1)+ ; bltdpt
move.w (a0)+,(a1)+ ; bltsize
rts
.bq_mask_clear
BLTCON_SET ACD,(BLT_A&~BLT_C),0,0
moveq.l #-1,d0
move.l d0,bltafwm(a5)
move.w #((KNIGHTS_BUF_WIDTH-16)/8),bltcmod(a5)
move.l #((2)<<16)|(2),bltamod(a5)
.bq_mask_clear_more
lea bltcpt(a5),a1
move.l (a0)+,(a1)+ ; bltcpt
addq.l #4,a1
move.l (a0)+,(a1)+ ; bltapt
move.l (a0)+,(a1)+ ; bltdpt
move.w (a0)+,(a1)+ ; bltsize
rts
.bq_clear
BLTCON_SET D,0,0,0
move.w #0,bltdmod(a5)
move.l (a0)+,bltdpt(a5)
move.w (a0)+,bltsize(a5)
rts
.bq_copy
BLTCON_SET AD,BLT_A,0,0
moveq.l #-1,d0
move.l d0,bltafwm(a5)
move.l #(((TITLETEXT_WIDTH-16)/8)<<16)|0,bltamod(a5)
lea bltapt(a5),a1
move.l (a0)+,(a1)+ ; bltapt
move.l (a0)+,(a1)+ ; bltdpt
move.w (a0)+,(a1)+ ; bltsize
rts
.bq_dbcopy
BLTCON_SET AD,BLT_A,0,0
moveq.l #-1,d0
move.l d0,bltafwm(a5)
moveq.l #0,d0
move.l d0,bltamod(a5)
lea bltapt(a5),a1
move.l (a0)+,(a1)+ ; bltapt
move.l (a0)+,(a1)+ ; bltdpt
move.w (a0)+,(a1)+ ; bltsize
rts
;--------------------------------------------------------------------
; a0: linedraw buffer
; a1: line result buffer
; d0-d3: x1,y1 - x2,y2
; d7 high word not trashed
blb_bresenham_line_draw:
adda.w d1,a1
adda.w d1,a1
move.l pd_TrueColorImage(a6),a0
move.w d1,d4 ; offset in true color image
mulu #KNIGHTS_WIDTH*2,d4
add.w d0,d4
add.w d0,d4
adda.l d4,a0
sub.w d1,d3
;beq .done
sub.w d0,d2
beq .straightdown
bmi .leftwards
.rightwards
move.w #KNIGHTS_WIDTH*2,d0
.rightwards_dy_greater_than_dx
move.w d3,d1 ; error term
move.w d3,d7
add.w d2,d2 ; dx * 2
add.w d3,d3 ; dy * 2
.lineloop1
move.w (a0),(a1)+
adda.w d0,a0
sub.w d2,d1
dbmi d7,.lineloop1
add.w d3,d1
addq.w #2,a0
subq.w #1,d7
bpl.s .lineloop1
.done1
rts
.leftwards
move.w #KNIGHTS_WIDTH*2,d0
neg.w d2
.leftwards_dy_greater_than_dx
move.w d3,d1 ; error term
move.w d3,d7
add.w d2,d2 ; dx * 2
add.w d3,d3 ; dy * 2
.lineloop2
move.w (a0),(a1)+
adda.w d0,a0
sub.w d2,d1
dbmi d7,.lineloop2
add.w d3,d1
subq.w #2,a0
subq.w #1,d7
bpl.s .lineloop2
.done2
rts
.straightdown
move.w #KNIGHTS_WIDTH*2,d0
.lineloopstd
move.w (a0),(a1)+
adda.w d0,a0
dbra d7,.lineloopstd
rts
;--------------------------------------------------------------------
blb_do_lamp_rotations:
move.l pd_LampSpriteBuffer(a6),a4
move.w #NUM_LAMP_ROTATIONS-1,d7
moveq.l #-NUM_LAMP_ROTATIONS/2,d1
.loop
PUTMSG 40,<"%d: Rotation %d to %p">,fw_FrameCounter-2(a6),d1,a4
PUSHM d1/d7
bsr blb_calc_sheers
bsr blb_rotate_chunky
PUTMSG 40,<"%d: C2P">,fw_FrameCounter-2(a6)
lea pd_LampSprites(a6),a3
REPT 3
move.l a4,a1
move.l a1,(a3)+
clr.l (a1)+
clr.l 2*2*LAMP_HEIGHT(a1)
lea 2*2*(LAMP_HEIGHT+2)(a4),a2
move.l a2,(a3)+
clr.l (a2)+
clr.l 2*2*LAMP_HEIGHT(a2)
move.l pd_LampChunkyBuffer(a6),a0
lea REPTN*16(a0),a0
bsr blb_c2p_line
lea 2*2*2*(LAMP_HEIGHT+2)(a4),a4
ENDR
POPM
addq.w #1,d1
dbra d7,.loop
rts
;--------------------------------------------------------------------
blb_calc_sheers:
moveq.l #0,d0 ; tan increment
moveq.l #0,d3 ; sin increment
lea blb_tan_table(pc),a1
lea blb_sin_table(pc),a2
add.w d1,d1
bmi.s .negtan
move.w (a1,d1.w),d0
move.w (a2,d1.w),d3
neg.l d3
bra.s .conttan
.negtan neg.w d1
move.w (a1,d1.w),d0
move.w (a2,d1.w),d3
neg.l d0
.conttan
lea pd_XSheer1(a6),a0
moveq.l #LAMP_HEIGHT/2,d1
moveq.l #LAMP_HEIGHT,d2
moveq.l #0,d4
bsr blb_calc_sheer
lea pd_XSheer2(a6),a0
moveq.l #LAMP_HEIGHT/2,d1
moveq.l #LAMP_HEIGHT,d2
move.l #$8000,d4
bsr blb_calc_sheer
lea pd_YSheer(a6),a0
move.l d3,d0
moveq.l #LAMP_WIDTH/2,d1
moveq.l #LAMP_WIDTH,d2
move.l #$8000,d4
bsr blb_calc_sheer
rts
;--------------------------------------------------------------------
blb_rotate_chunky:
PUSHM a4
move.l pd_LampChunkyBuffer(a6),a0
lea blb_lamp_chunky(pc),a1
lea pd_XSheer1(a6),a2
lea pd_YSheer(a6),a3
lea pd_XSheer2(a6),a4
moveq.l #LAMP_HEIGHT-1,d7
moveq.l #0,d1 ; y
moveq.l #0,d2 ; x2/saxy
.yloop
move.b (a2,d1.w),d2 ; x2 = saxy
moveq.l #LAMP_WIDTH-1,d6
.xloop
moveq.l #0,d0
cmp.b #LAMP_WIDTH,d1
bhs.s .skippix
move.w d1,d3
add.b (a3,d2.w),d3 ; y3 = y + say[x2]
cmp.b #LAMP_HEIGHT,d3
bhs.s .skippix
move.w d2,d4
add.b (a4,d3.w),d4 ; x3 = x2 + sax[y3]
cmp.b #LAMP_WIDTH,d4
bhs.s .skippix
lsl.w #4,d3
add.w d3,d4
add.w d3,d4
add.w d3,d4
move.b (a1,d4.w),d0
.skippix
move.b d0,(a0)+
addq.b #1,d2 ; x2
dbra d6,.xloop
addq.b #1,d1
dbra d7,.yloop
POPM
rts
;--------------------------------------------------------------------
; a0 = sheer table
; d0.l = increment
; d1.w = center
; d2.w = height
; d4.l = startoffset
blb_calc_sheer:
PUTMSG 40,<"Calc Sheer %p, %lx, %d, %d">,a0,d0,d1,d2
lea (a0,d1.w),a0
lea 1(a0),a1
move.w d1,d6
move.w d2,d7
sub.w d1,d7
subq.w #1,d7
move.l d4,d1
move.l d1,d2
.plusloop
swap d1
move.b d1,(a0)+
swap d1
add.l d0,d1
dbra d7,.plusloop
.minusloop
swap d2
move.b d2,-(a1)
swap d2
sub.l d0,d2
dbra d6,.minusloop
rts
;--------------------------------------------------------------------
blb_c2p_line:
move.l #$55555555,d3
move.l #$33333333,d4
move.l #$00ff00ff,d5
moveq.l #LAMP_HEIGHT-1,d7
.loop
move.l (a0)+,d0
lsl.l #4,d0
or.l (a0)+,d0
move.l (a0)+,d1
lsl.l #4,d1
or.l (a0)+,d1
; a3a2a1a0e3e2e1e0 b3b2b1b0f3f2f1f0 c3c2c1c0g3g2g1g0 d3d2d1d0h3h2h1h0
; i3i2i1i0m3m2m1m0 j3j2j1j0n3n2n1n0 k3k2k1k0o3o2o1o0 l3l2l1l0p3p2p1p0
move.l d1,d2
lsr.l #8,d2
eor.l d0,d2
and.l d5,d2
eor.l d2,d0
lsl.l #8,d2
eor.l d2,d1
; a3a2a1a0e3e2e1e0 i3i2i1i0m3m2m1m0 c3c2c1c0g3g2g1g0 k3k2k1k0o3o2o1o0
; b3b2b1b0f3f2f1f0 j3j2j1j0n3n2n1n0 d3d2d1d0h3h2h1h0 l3l2l1l0p3p2p1p0
move.l d1,d2
lsr.l #1,d2
eor.l d0,d2
and.l d3,d2
eor.l d2,d0
add.l d2,d2
eor.l d2,d1
; a3b3a1b1e3f3e1f1 i3j3i1j1m3n3m1n1 c3d3c1d1g3h3g1h1 k3l3k1l1o3p3o1p1
; a2b2a0b0e2f2f0f0 i2j2i0j0m2n2m0n0 c2d2c0d0g2h2g0h0 k2l2k0l0o2p2o0p0
move.w d1,d2
move.w d0,d1
swap d1
move.w d1,d0
move.w d2,d1
; a3b3a1b1e3f3e1f1 i3j3i1j1m3n3m1n1 a2b2a0b0e2f2f0f0 i2j2i0j0m2n2m0n0
; c3d3c1d1g3h3g1h1 k3l3k1l1o3p3o1p1 c2d2c0d0g2h2g0h0 k2l2k0l0o2p2o0p0
move.l d1,d2
lsr.l #2,d2
eor.l d0,d2
and.l d4,d2
eor.l d2,d0
lsl.l #2,d2
eor.l d2,d1
; a3b3c3d3e3f3g3h3 i3j3k3l3m3n3o3p3 a2b2c2d2e2f2g2h2 i2j2k2l2m2n2o2p2
; a1b1c1d1e1f1g1h1 i1j1k1l1m1n1o1p1 a0b0c0d0e0f0g0h0 i0j0k0l0m0n0o0p0
swap d1
move.l d1,(a1)+
swap d0
move.l d0,(a2)+
lea LAMP_WIDTH-16(a0),a0
dbra d7,.loop
rts
;--------------------------------------------------------------------
include "blitterline_bq.asm"
;********************************************************************
blb_text_panels:
dc.l 0
dc.l blb_text_1_data
dc.l 0
dc.l blb_text_2_data
dc.l 0
dc.l blb_text_3_data
dc.l blb_text_4_data
dc.l blb_text_5_data
dc.l 0
dc.l 0
dc.l 0
blb_lamp_palette:
incbin "data/bulb/lamp_64x32x16.PAL"
blb_lamp_off_palette:
incbin "data/bulb/lamp_off_64x32x16.PAL"
blb_lamp_white_palette:
REPT 15
dc.w $fff
ENDR
blb_bulb_palette_expanded:
dc.w $0000,$0111,$0332,$0322,$0665,$0764,$0542,$0654
dc.w $0f0f,$0ddb,$0f0f,$0ec9,$0f0f,$0a85,$0f0f,$0cb8
blb_sin_table:
include "sintable.asm"
blb_tan_table:
include "tantable.asm"
blb_lamp_pos_table:
include "lamppostable.asm"
blb_lamp_angle_table:
include "langletable.asm"
blb_lamp_chunky:
incbin "data/bulb/lamp_48x32x16.chk"
section "blb_anim",data
blb_swing_data:
include "swing2.asm"
blb_paint_data:
include "paint2.asm"
blb_textpaint_data:
include "textpaint.asm"
;********************************************************************
;--------------------------------------------------------------------
section "blb_copper",data,chip
blb_copperlist:
COP_MOVE dmacon,DMAF_BLITHOG ; disable blitter hogging to avoid interrupt latency
COP_MOVE diwstrt,$5281 ; window start
COP_MOVE diwstop,$06c1 ; window stop
COP_MOVE ddfstrt,$0038 ; bitplane start
blb_ddfstop:
COP_MOVE ddfstop,$00d0 ; bitplane stop
COP_MOVE bplcon3,$0c00
blb_fmode:
COP_MOVE fmode,$0000 ; fixes the aga modulo problem
COP_MOVE bplcon0,$0200
COP_MOVE bplcon1,$0000
COP_MOVE bplcon2,$0024 ; turn off all bitplanes, set scroll values to 0, sprites in front
COP_MOVE bpl1mod,(KNIGHTS_BUF_WIDTH-KNIGHTS_WIDTH)/8
COP_MOVE bpl2mod,(KNIGHTS_BUF_WIDTH-KNIGHTS_WIDTH)/8
blb_coppersprites:
COP_MOVE sprpt,0
COP_MOVE sprpt+2,0
COP_MOVE sprpt+4,0
COP_MOVE sprpt+6,0
COP_MOVE sprpt+8,0
COP_MOVE sprpt+10,0
COP_MOVE sprpt+12,0
COP_MOVE sprpt+14,0
COP_MOVE sprpt+16,0
COP_MOVE sprpt+18,0
COP_MOVE sprpt+20,0
COP_MOVE sprpt+22,0
COP_MOVE sprpt+24,0
COP_MOVE sprpt+26,0
COP_MOVE sprpt+28,0
COP_MOVE sprpt+30,0
blb_extra_copperlist_ptr:
COP_MOVE cop2lc,0
COP_MOVE cop2lc+2,0
COP_MOVE $1fe,0
COP_END
blb_bulb_pic:
incbin "data/bulb/PLT_Lampscene_ham.raw"
blb_text_1_data:
;blk.b 2560,255
incbin "data/bulb/text1.BPL"
blb_text_2_data:
;blk.b 2560,255
incbin "data/bulb/text2.BPL"
blb_text_3_data:
;blk.b 2560,255
incbin "data/bulb/text3.BPL"
blb_text_4_data:
;blk.b 2560,255
incbin "data/bulb/text4.BPL"
blb_text_5_data:
;blk.b 2560,255
incbin "data/bulb/text5.BPL"
END