; 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