; TODOs:
; - Table effect for returning scroller...
;
; 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_SINETABLE_SUPPORT        = 1 ; enable creation of 1024 entries sin/cos table
FW_SCRIPTING_SUPPORT        = 0 ; enable simple timed scripting functions
FW_PALETTE_LERP_SUPPORT     = 0 ; enable basic palette fading functions
FW_YIELD_FROM_MAIN_TOO      = 0 ; adds additional code that copes with Yield being called from main code instead of task
FW_VBL_IRQ_SUPPORT          = 0 ; enable custom VBL IRQ routine
FW_COPPER_IRQ_SUPPORT       = 0 ; enable copper IRQ routine support
FW_AUDIO_IRQ_SUPPORT        = 0 ; enable audio IRQ support (unimplemented)
FW_VBL_MUSIC_IRQ            = 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

STHAM_WIDTH     = 320
STHAM_HEIGHT    = 180
STHAM_PLANES    = 6

BENTFONT_WIDTH  = 32
BENTFONT_HEIGHT = 32

BENTSCROLLER_WIDTH  = 128
BENTSCROLLER_HEIGHT = 180+2

BENTSPRITE_WIDTH    = 128
BENTSPRITE_HEIGHT   = 180

NUM_BARS    = 10
BAR_HEIGHT  = 18

CURTAIN_WIDTH   = 21    ; in words

COP_PREAMBLE_INST   = 200 ; bplptrs
COP_POST_INST       = 16 ; wait
COP_INST_PER_LINE   = 1+8+8+1 ; wait, 8 sprxctl, 8 sprxpos, 1 color
COP_CURTAIN_INST_PER_LINE = 8+1+CURTAIN_WIDTH ; 8 init pos, wait, 21 sprite pos
COP_LIST_SIZE       = (COP_PREAMBLE_INST+COP_CURTAIN_INST_PER_LINE*STHAM_HEIGHT+COP_POST_INST)*4

SPRITES_BUFFER_SIZE = (BENTSPRITE_WIDTH/16)*((BENTSPRITE_HEIGHT+2)*2*2)

CHIPMEM_SIZE = COP_LIST_SIZE*2+(BENTSCROLLER_WIDTH/8)*BENTSCROLLER_HEIGHT*3+SPRITES_BUFFER_SIZE*2+(CURTAIN_WIDTH*(CURTAIN_WIDTH+2)*16+2)*4
FASTMEM_SIZE = 4

        IFND    DEBUG_DETAIL
DEBUG_DETAIL    SET     10
        ENDC

NEWAGE_DEBUG    = 1

        include "framework.i"


; Memory use:
; Playfields:
; - 320 x 180 x 24     = 172800 (6x2 db, 2 draw, 2 fill, 6 original, 2 spare)
;
; Scroller mapping:
; - Scroller texture (W*H): 16 Bit offsets
; - Table mapping texture: tx/ty, screen x/y, mask (pixel width)
;
;  move.w (a0)+,d0
;  move.w (a0)+,d1
;  move.w (a1,d0.w),d0
;  and.w  (a0)+,d0
;  or.w   d0,(a2,d1.w)
;

        STRUCTURE BarData,0
        WORD    bd_Delay
        LONG    bd_YPos
        WORD    bd_YSpeed
        LABEL   bd_SIZEOF

        STRUCTURE PartData,fw_SIZEOF
        APTR    pd_CurrPlanesPtr
        APTR    pd_LastPlanesPtr
        APTR    pd_CurrCopListPtr
        APTR    pd_LastCopListPtr
        APTR    pd_CurrScrollerPtr
        APTR    pd_LastScrollerPtr
        APTR    pd_CurrBentSpritesPtr
        UBYTE   pd_DbToggle
        ALIGNWORD

        UWORD   pd_PartCountDown

        UWORD   pd_CopperChunkyOffset

        APTR    pd_CopperList1
        APTR    pd_CopperList2

        UWORD   pd_LetterOffset
        UWORD   pd_LetterCountDown
        APTR    pd_ScrollTextPtr
        UWORD   pd_LetterOrOffset
        UWORD   pd_LetterOrCountDown

        UWORD   pd_CurtainOffset1
        UWORD   pd_CurtainOffset2
        LONG    pd_CurtainPos

        APTR    pd_CurtainDataPtr

        APTR    pd_HamphreyBuffer
        APTR    pd_BentScrollerBuffer1
        APTR    pd_BentScrollerBuffer2
        APTR    pd_BentScrollerTemp
        STRUCT  pd_DummyBarTop,bd_SIZEOF
        STRUCT  pd_Bars,NUM_BARS*bd_SIZEOF
        STRUCT  pd_DummyBarBottom,bd_SIZEOF
        STRUCT  pd_BentSprites1Ptrs,8*4
        STRUCT  pd_BentSprites2Ptrs,8*4
        STRUCT  pd_PreparationTask,ft_SIZEOF

        STRUCT  pd_BQBuffer,1000

        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   sth_init

        lea     sth_copperlist,a0
        CALLFW  SetCopper

        lea     sth_hamphrey_palette+2(pc),a1
        moveq.l #15-1,d7
        lea     color+2(a5),a0
.blloop
        move.w  (a1)+,(a0)+
        dbra    d7,.blloop

        lea     .preptask(pc),a0
        lea     pd_PreparationTask(a6),a1
        CALLFW  AddTask

        bsr     sth_intro
        bsr     sth_main
        bsr     sth_curtain

        CALLFW  SetBaseCopper

        rts

.preptask
        IFD     FW_DEMO_PART
        move.l  fw_GlobalUserData(a6),a0
        move.l  pd_HamphreyBuffer(a6),a1
        PUTMSG  10,<"%d: Decrunching from %p to %p">,fw_FrameCounter-2(a6),a0,a1
        CALLFW  DecompressZX0
        PUTMSG  10,<"%d: Image decrunched until %p">,fw_FrameCounter-2(a6),a1
        clr.l   fw_GlobalUserData(a6)
        ENDC
        bsr     sth_create_curtain
        rts

;--------------------------------------------------------------------

sth_init:
        bsr     sth_init_vars
        bsr     sth_clear_sprites
        bsr     sth_clear_bent_buffer

        rts

;--------------------------------------------------------------------

sth_init_vars:
        move.l  #sth_scrolltext,pd_ScrollTextPtr(a6)
        move.w  #-1,pd_LetterOrCountDown(a6)

        IFND    FW_DEMO_PART
        move.l  #sth_hamphrey_pic,pd_HamphreyBuffer(a6)
        ELSE
        move.l  #(STHAM_WIDTH/8)*STHAM_HEIGHT*STHAM_PLANES*2,d0
        CALLFW  AllocChip
        move.l  a0,pd_HamphreyBuffer(a6)
        ENDC
        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  #(BENTSCROLLER_WIDTH/8)*BENTSCROLLER_HEIGHT*3,d0
        CALLFW  AllocChip
        PUTMSG  10,<"BentScrollerBuffer 1 %p">,a0
        move.l  a0,pd_BentScrollerBuffer1(a6)
        move.l  a0,pd_CurrScrollerPtr(a6)
        lea     (BENTSCROLLER_WIDTH/8)*BENTSCROLLER_HEIGHT(a0),a0
        PUTMSG  10,<"BentScrollerBuffer 2 %p">,a0
        move.l  a0,pd_BentScrollerBuffer2(a6)
        move.l  a0,pd_LastScrollerPtr(a6)
        lea     (BENTSCROLLER_WIDTH/8)*BENTSCROLLER_HEIGHT(a0),a0
        PUTMSG  10,<"BentScrollerTemp %p">,a0
        move.l  a0,pd_BentScrollerTemp(a6)

        move.l  #SPRITES_BUFFER_SIZE*2,d0
        CALLFW  AllocChip
        PUTMSG  10,<"BentSprites1Ptrs 1 %p">,a0
        lea     pd_BentSprites1Ptrs(a6),a1
        move.l  a1,pd_CurrBentSpritesPtr(a6)

        REPT    (BENTSPRITE_WIDTH/16)
        move.l  a0,(a1)+
        lea     ((BENTSPRITE_HEIGHT+2)*2*2)(a0),a0
        ENDR
        PUTMSG  10,<"BentSprites1Ptrs 2 %p">,a0
        REPT    (BENTSPRITE_WIDTH/16)
        move.l  a0,(a1)+
        lea     ((BENTSPRITE_HEIGHT+2)*2*2)(a0),a0
        ENDR

        ; curtain (<31KB)
        move.l  #(CURTAIN_WIDTH*(CURTAIN_WIDTH+2)*16+2)*4,d0
        CALLFW  AllocChip
        move.l  a0,pd_CurtainDataPtr(a6)

        lea     pd_DummyBarTop(a6),a1
        move.w  #-(NUM_BARS+1)*BAR_HEIGHT-256,d0
        move.w  d0,bd_YPos(a1)
        move.w  #(NUM_BARS-1)*10,d1
        moveq.l #10,d2
        moveq.l #NUM_BARS-1,d7
.barloop
        addq.l  #bd_SIZEOF,a1
        add.w   #BAR_HEIGHT,d0
        move.w  d1,bd_Delay(a1)
        move.w  d0,bd_YPos(a1)
        move.w  #100,bd_YSpeed(a1)
        sub.w   d2,d1
        addq.w  #5,d2
        dbra    d7,.barloop
        move.w  #STHAM_HEIGHT,bd_YPos+bd_SIZEOF(a1)
        rts

;--------------------------------------------------------------------

sth_intro:
        IFD     FW_DEMO_PART
        PUTMSG  10,<"%d: Intro part started (%d music frames)">,fw_FrameCounter-2(a6),fw_MusicFrameCount-2(a6)
        ELSE
        PUTMSG  10,<"%d: Intro part started">,fw_FrameCounter-2(a6)
        move.w  #400,pd_PartCountDown(a6)
        ENDC

.loop   CALLFW  VSyncWithTask
        bsr     sth_flip_db_frame

        bsr     sth_drop_bars
        bsr     sth_create_intro_copperlist

        bsr     sth_update_copper_list_pointers

        IFD     FW_DEMO_PART
        cmp.w   #3072,fw_MusicFrameCount(a6)
        blt.s   .loop
        ELSE
        subq.w  #1,pd_PartCountDown(a6)
        bne     .loop
        ENDC

        rts

;--------------------------------------------------------------------

sth_main:
        IFD     FW_DEMO_PART
        PUTMSG  10,<"%d: Main part started (%d music frames)">,fw_FrameCounter-2(a6),fw_MusicFrameCount-2(a6)
        ELSE
        PUTMSG  10,<"%d: Main part started">,fw_FrameCounter-2(a6)
        ENDC
        move.w  #800,pd_PartCountDown(a6)
        CALLFW  SetBlitterQueueSingleFrame

        move.w  #$000,color(a5)
        REPT    2
        CALLFW  VSyncWithTask
        bsr     sth_flip_db_frame
        bsr     sth_create_sham_copperlist
        bsr     sth_update_copper_list_pointers
        ENDR

.loop   CALLFW  VSyncWithTask
        bsr     sth_flip_db_frame

        lea     pd_BQBuffer(a6),a4

        move.l  pd_BentScrollerTemp(a6),a0
        move.l  pd_LastScrollerPtr(a6),a2
        bsr     sth_scroll_buffer

        move.l  pd_CurrScrollerPtr(a6),a0
        move.l  pd_BentScrollerTemp(a6),a2
        bsr     sth_scroll_buffer

        bsr     sth_convert_scroller_to_sprites

        bsr     sth_push_in_letter

        TERMINATE_BLITTER_QUEUE

        BLTHOGON
        BLTWAIT
        lea     pd_BQBuffer(a6),a0
        CALLFW  TriggerCustomBlitterQueue

        CALLFW  JoinBlitterQueue

        bsr     sth_update_copper_list_pointers

        subq.w  #1,pd_PartCountDown(a6)
        bne     .loop

        rts

;--------------------------------------------------------------------

sth_curtain:
        IFD     FW_DEMO_PART
        PUTMSG  10,<"%d: Curtain part started (%d music frames)">,fw_FrameCounter-2(a6),fw_MusicFrameCount-2(a6)
        ELSE
        PUTMSG  10,<"%d: Curtain part started">,fw_FrameCounter-2(a6)
        ENDC
        move.w  #186,pd_PartCountDown(a6)
        CALLFW  SetBlitterQueueSingleFrame

        move.l  #482*CURTAIN_WIDTH*4,pd_CurtainPos(a6)

        REPT    1
        CALLFW  VSyncWithTask
        bsr     sth_flip_db_frame
        bsr     sth_create_simple_copperlist
        bsr     sth_update_copper_list_pointers
        ENDR

        REPT    2
        CALLFW  VSyncWithTask
        bsr     sth_flip_db_frame
        bsr     sth_create_curtain_copperlist
        move.l  a0,pd_CurrCopListPtr(a6)
        bsr     sth_create_simple_copperlist
        bsr     sth_update_copper_list_pointers
        ENDR

        move.w  #$000,color(a5)
        move.w  #$000,color+17*2(a5)
        move.w  #$311,color+21*2(a5)
        move.w  #$621,color+22*2(a5)
        move.w  #$a64,color+23*2(a5)
        move.w  #$da7,color+25*2(a5)
        move.w  #$cca,color+26*2(a5)
        move.w  #$bed,color+27*2(a5)
        move.w  #$3df,color+29*2(a5)
        move.w  #$6ef,color+30*2(a5)
        move.w  #$aff,color+31*2(a5)

.loop   CALLFW  VSyncWithTask
        bsr     sth_flip_db_frame

        bsr     sth_draw_curtain

        bsr     sth_update_copper_list_pointers

        subq.w  #1,pd_PartCountDown(a6)
        bne     .loop

        rts

;--------------------------------------------------------------------

sth_flip_db_frame:
        move.l  pd_CurrPlanesPtr(a6),pd_LastPlanesPtr(a6)
        move.l  pd_CurrCopListPtr(a6),pd_LastCopListPtr(a6)
        move.l  pd_CurrScrollerPtr(a6),pd_LastScrollerPtr(a6)
        move.l  pd_HamphreyBuffer(a6),a0
        not.b   pd_DbToggle(a6)
        beq.s   .selb1
        lea     (STHAM_WIDTH/8)*STHAM_PLANES(a0),a0
        move.l  a0,pd_CurrPlanesPtr(a6)
        move.l  pd_CopperList2(a6),pd_CurrCopListPtr(a6)
        move.l  pd_BentScrollerBuffer2(a6),pd_CurrScrollerPtr(a6)
        lea     pd_BentSprites2Ptrs(a6),a0
        move.l  a0,pd_CurrBentSpritesPtr(a6)
        rts
.selb1
        move.l  a0,pd_CurrPlanesPtr(a6)
        move.l  pd_CopperList1(a6),pd_CurrCopListPtr(a6)
        move.l  pd_BentScrollerBuffer1(a6),pd_CurrScrollerPtr(a6)
        lea     pd_BentSprites1Ptrs(a6),a0
        move.l  a0,pd_CurrBentSpritesPtr(a6)
        rts

;--------------------------------------------------------------------

sth_update_copper_list_pointers:
        lea     sth_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

;--------------------------------------------------------------------

sth_clear_sprites:
        lea     pd_BentSprites1Ptrs(a6),a0
        BLTHOGON
        BLTWAIT
        BLTCON_SET D,0,0,0
        move.w  #0,bltdmod(a5)
        move.l  (a0),bltdpt(a5)
        move.w  #((BENTSPRITE_WIDTH)>>4)|(((BENTSPRITE_HEIGHT+2)*2*2)<<6),bltsize(a5)

        move.l  #(($52<<8)|0)<<16|(((($52+BENTSPRITE_HEIGHT)&$ff)<<8)|1),d0
        BLTWAIT
        moveq.l #8-1,d7
.loop   move.l  (a0)+,a1
        move.l  d0,(a1)
        dbra    d7,.loop
        rts

;--------------------------------------------------------------------

sth_clear_bent_buffer:
        BLTHOGON
        BLTWAIT
        BLTCON_SET D,0,0,0
        move.w  #0,bltdmod(a5)
        move.l  pd_BentScrollerBuffer1(a6),bltdpt(a5)
        move.w  #((BENTSCROLLER_WIDTH)>>4)|((BENTSCROLLER_HEIGHT*3)<<6),bltsize(a5)
        rts

;--------------------------------------------------------------------

sth_push_in_letter:
        subq.w  #2,pd_LetterCountDown(a6)
        bpl.s   .nonew
        move.w  pd_LetterOffset(a6),pd_LetterOrOffset(a6)
        move.w  #44-28,pd_LetterOrCountDown(a6)
        move.w  #28,pd_LetterCountDown(a6)
        move.l  pd_ScrollTextPtr(a6),a0
        move.b  (a0)+,d0
        bne.s   .nowrap
        move.l  pd_ScrollTextPtr(a6),a0
        move.b  (a0)+,d0
.nowrap
        move.l  a0,pd_ScrollTextPtr(a6)
        sub.b   #'A',d0
        ext.w   d0
        lsl.w   #2+4,d0
        move.w  d0,d1
        add.w   d0,d0
        add.w   d1,d0
        move.w  d0,pd_LetterOffset(a6)
.nonew
        move.l  pd_LastScrollerPtr(a6),a1
        lea     (BENTSPRITE_HEIGHT)*(BENTSCROLLER_WIDTH/8)(a1),a1

        lea     sth_font_data(pc),a0
        move.w  pd_LetterOffset(a6),d0
        bmi.s   .clear
        adda.w  d0,a0
        addq.w  #8,d0
        move.w  d0,pd_LetterOffset(a6)

        move.l  #$88888888,d6
        REPT    2
        movem.l (a0)+,d0

        REPT    4
        move.l  d0,d4
        and.l   d6,d4
        move.l  d4,d5
        lsr.l   #1,d5
        or.l    d5,d4
        move.l  d4,d5
        lsr.l   #2,d5
        or.l    d5,d4
        move.l  d4,(a1)+
        rol.l   #1,d0
        ENDR
        ENDR

.second
        subq.w  #2,pd_LetterOrCountDown(a6)
        bmi.s   .skip
        move.w  pd_LetterOrOffset(a6),d0
        bmi.s   .skip
        move.l  pd_LastScrollerPtr(a6),a1
        lea     (BENTSPRITE_HEIGHT)*(BENTSCROLLER_WIDTH/8)(a1),a1

        lea     sth_font_data(pc),a0
        adda.w  d0,a0
        addq.w  #8,d0
        move.w  d0,pd_LetterOrOffset(a6)

        REPT    2
        movem.l (a0)+,d0

        REPT    4
        move.l  d0,d4
        and.l   d6,d4
        move.l  d4,d5
        lsr.l   #1,d5
        or.l    d5,d4
        move.l  d4,d5
        lsr.l   #2,d5
        or.l    d5,d4
        or.l    d4,(a1)+
        rol.l   #1,d0
        ENDR
        ENDR

.skip
        rts
.clear
        moveq.l #0,d0
        REPT    8
        move.l  d0,(a1)+
        ENDR
        move.l  #$88888888,d6
        bra.s   .second

;--------------------------------------------------------------------

sth_scroll_buffer:
        lea     1*(BENTSCROLLER_WIDTH/8)(a2),a2

        SAFE_ADD_TO_BLITTER_QUEUE a4,a3
        addq.w  #4,a4
        move.l  #.bq_simple_shift_up,(a4)+
        move.l  #(((BENTSCROLLER_WIDTH-32)/8)<<16)|((BENTSCROLLER_WIDTH-32)/8),(a4)+
        move.l  a2,(a4)+
        move.l  a0,(a4)+
        move.w  #(32>>4)|(30<<6),(a4)+

        lea     (90-1)*(BENTSCROLLER_WIDTH/8)+(48/8)-2(a0),a0
        lea     (90-1)*(BENTSCROLLER_WIDTH/8)+(48/8)-2(a2),a2
        lea     sth_scroller_shift_1_bitmap+(90-30-1)*(BENTSCROLLER_WIDTH/8)+(48/8)-2,a1

        FAST_ADD_TO_BLITTER_QUEUE a4,a3
        addq.w  #4,a4
        move.l  #.bq_shift_1,(a4)+
        move.l  #(((BENTSCROLLER_WIDTH-48)/8)<<16)|((BENTSCROLLER_WIDTH-48)/8),d0
        move.l  d0,(a4)+
        move.l  d0,(a4)+
        move.l  a1,(a4)+            ; bltcpt
        move.l  a2,(a4)+            ; bltbpt
        move.l  a2,(a4)+            ; bltapt
        move.l  a0,(a4)+            ; bltdpt
        move.w  #(48>>4)|((90-30)<<6),(a4)+

        lea     ((144-1)-(90-1))*(BENTSCROLLER_WIDTH/8)+(80/8)-(48/8)(a0),a0
        lea     ((144-1)-(90-1))*(BENTSCROLLER_WIDTH/8)+(80/8)-(48/8)(a2),a2
        lea     sth_scroller_shift_1_bitmap+(144-30-1)*(BENTSCROLLER_WIDTH/8)+(80/8)-2,a1

        FAST_ADD_TO_BLITTER_QUEUE a4,a3
        addq.w  #4,a4
        move.l  #.bq_shift_1,(a4)+
        move.l  #(((BENTSCROLLER_WIDTH-80)/8)<<16)|((BENTSCROLLER_WIDTH-80)/8),d0
        move.l  d0,(a4)+
        move.l  d0,(a4)+
        move.l  a1,(a4)+            ; bltcpt
        move.l  a2,(a4)+            ; bltbpt
        move.l  a2,(a4)+            ; bltapt
        move.l  a0,(a4)+            ; bltdpt
        move.w  #(80>>4)|((144-90)<<6),(a4)+

        lea     (BENTSPRITE_HEIGHT-144+2)*(BENTSCROLLER_WIDTH/8)-(80/8)(a0),a0
        lea     (BENTSPRITE_HEIGHT-144+2)*(BENTSCROLLER_WIDTH/8)-(80/8)(a2),a2
        lea     sth_scroller_shift_1_bitmap+(BENTSPRITE_HEIGHT-30-1+2)*(BENTSCROLLER_WIDTH/8)-2,a1

        FAST_ADD_TO_BLITTER_QUEUE a4,a3
        addq.w  #4,a4
        move.l  #.bq_shift_1,(a4)+
        moveq.l #0,d0
        move.l  d0,(a4)+
        move.l  d0,(a4)+
        move.l  a1,(a4)+            ; bltcpt
        move.l  a2,(a4)+            ; bltbpt
        move.l  a2,(a4)+            ; bltapt
        move.l  a0,(a4)+            ; bltdpt
        move.w  #(BENTSCROLLER_WIDTH>>4)|((BENTSPRITE_HEIGHT-144-1+2)<<6),(a4)+

        lea     -2*(BENTSCROLLER_WIDTH/8)(a0),a0
        lea     -2*(BENTSCROLLER_WIDTH/8)(a2),a2
        lea     sth_scroller_shift_2_bitmap+(BENTSPRITE_HEIGHT-157-1)*(80/8)-2,a1

        LAST_ADD_TO_BLITTER_QUEUE a4,a3
        addq.w  #4,a4
        move.l  #.bq_shift_2,(a4)+
        move.l  #0|((BENTSCROLLER_WIDTH-80)/8),(a4)+
        move.l  #(((BENTSCROLLER_WIDTH-80)/8)<<16)|((BENTSCROLLER_WIDTH-80)/8),(a4)+
        move.l  a1,(a4)+            ; bltcpt
        move.l  a0,(a4)+            ; bltbpt
        move.l  a2,(a4)+            ; bltapt
        move.l  a0,(a4)+            ; bltdpt
        move.w  #(80>>4)|((BENTSPRITE_HEIGHT-157-1)<<6),(a4)+

        rts

.bq_simple_shift_up
        BLTHOGOFF
        BLTCON_SET AD,BLT_A,0,0
        moveq.l #-1,d0
        move.l  d0,bltafwm(a5)
        move.l  (a0)+,bltamod(a5) ; and bltdmod
        lea     bltapt(a5),a1
        move.l  (a0)+,(a1)+     ; bltapt
        move.l  (a0)+,(a1)+     ; bltdpt
        move.w  (a0)+,(a1)+     ; bltsize
        rts

.bq_shift_1
        BLTCON_SET_X ABCD,(BLT_A&BLT_C)|(BLT_B&~BLT_C),1,0,BLTCON1F_DESC
        ;BLTCON_SET_X CD,BLT_C,1,0,BLTCON1F_DESC
        move.l  (a0)+,bltcmod(a5) ; and bltbmod
        move.l  (a0)+,bltamod(a5) ; and bltdmod
        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_shift_2
        BLTCON_SET_X ABCD,(BLT_A&BLT_C)|(BLT_B&~BLT_C),2,0,BLTCON1F_DESC
        ;BLTCON_SET_X CD,BLT_C,2,0,BLTCON1F_DESC
        move.l  (a0)+,bltcmod(a5) ; and bltbmod
        move.l  (a0)+,bltamod(a5) ; and bltdmod
        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

;--------------------------------------------------------------------

sth_convert_scroller_to_sprites:
        PREP_ADD_TO_BLITTER_QUEUE a3
        move.w  #(16>>4)|(BENTSPRITE_HEIGHT<<6),d3
        move.l  #.bq_generic_ad_with_all,d4
        move.l  #.bq_generic_ad,d5
        move.l  pd_CurrScrollerPtr(a6),a2
        move.l  pd_CurrBentSpritesPtr(a6),a0
        moveq.l #(BENTSPRITE_WIDTH/16)-1,d7
.sprloop
        FAST_ADD_TO_BLITTER_QUEUE a4,a3
        clr.l   (a4)+
        move.l  d4,(a4)+
        move.l  (a0)+,d0
        addq.l  #4,d0
        move.l  a2,(a4)+
        move.l  d0,(a4)+
        move.w  d3,(a4)+
        addq.w  #2,a2

        move.l  d5,d4

        dbra    d7,.sprloop

        TERM_ADD_TO_BLITTER_QUEUE a3
        rts

.bq_generic_ad_with_all
        BLTHOGOFF
        move.l  #(BLTEN_AD+BLT_A)<<16,bltcon0(a5)
        moveq.l #-1,d0
        move.l  d0,bltafwm(a5)
        move.l  #(((BENTSCROLLER_WIDTH-16)/8)<<16)|2,bltamod(a5)
.bq_generic_ad
        lea     bltapt(a5),a1
        move.l  (a0)+,(a1)+         ; bltapt
        move.l  (a0)+,(a1)+         ; bltdpt
        move.w  (a0)+,(a1)+         ; bltsize
        rts

;--------------------------------------------------------------------

sth_drop_bars:
        lea     pd_Bars(a6),a1
        moveq.l #NUM_BARS-1,d7
.gravloop
        subq.w  #1,bd_Delay(a1)
        bpl.s   .skip
        move.l  bd_YPos(a1),d0
        move.w  bd_YSpeed(a1),d1
        add.w   #52,d1
        move.w  d1,bd_YSpeed(a1)
        ext.l   d1
        lsl.l   #6,d1
        add.l   d1,d0
        move.l  d0,bd_YPos(a1)
.skip
        lea     bd_SIZEOF(a1),a1
        dbra    d7,.gravloop

        moveq.l #NUM_BARS-1,d7
        moveq.l #BAR_HEIGHT,d2
.collloop
        lea     -bd_SIZEOF(a1),a1
        tst.w   bd_Delay(a1)
        bpl.s   .skip2

        move.w  bd_YPos(a1),d0
        move.w  bd_YSpeed(a1),d3
        asr.w   #1,d3
        move.w  d0,d1
        sub.w   d2,d1
        cmp.w   bd_YPos-bd_SIZEOF(a1),d1
        bge.s  .notopcoll
        move.w  bd_YPos-bd_SIZEOF(a1),d0
        add.w   d2,d0
        move.w  d0,bd_YPos(a1)
        move.w  d3,d1
        neg.w   d1
        move.w  d1,bd_YSpeed(a1)
        ;asr.w   #1,d1
        ;neg.w   d1
        add.w   d3,bd_YSpeed-bd_SIZEOF(a1)
.notopcoll
        move.w  d0,d1
        add.w   d2,d1
        cmp.w   bd_YPos+bd_SIZEOF(a1),d1
        blt.s   .nobottomcoll
        move.w  bd_YPos+bd_SIZEOF(a1),d0
        sub.w   d2,d0
        move.w  d0,bd_YPos(a1)
        move.w  d3,d1
        neg.w   d1
        move.w  d1,bd_YSpeed(a1)
        ;asr.w   #1,d1
        ;neg.w   d1
        add.w   d3,bd_YSpeed+bd_SIZEOF(a1)
.nobottomcoll
.skip2
        dbra    d7,.collloop

        rts

;--------------------------------------------------------------------

sth_create_curtain:
        move.l  pd_CurtainDataPtr(a6),a0
        PUTMSG  10,<"%d: Curtain %p">,fw_FrameCounter-2(a6),a0

        move.l  #(spr+0*sd_SIZEOF+sd_pos)<<16,d4
        move.l  #$1fe<<16,d3
        move.w  #(CURTAIN_WIDTH+2)*16,d7
.lineloop
        moveq.l #15,d0
        and.w   d7,d0
        lsr.w   #1,d0
        eor.w   #7,d0
        move.w  #($50<<8)|(64),d4
        sub.w   d0,d4

        moveq.l #CURTAIN_WIDTH,d5
        moveq.l #1,d1
        and.w   d7,d1
        lsl.w   #3,d1
        move.w  d7,d6
        lsr.w   #4,d6
        subq.w  #1,d6
        bmi.s   .tilem1
        subq.w  #1,d6
        bmi.s   .tilem2
        subq.w  #1,d6
        bmi.s   .tilem3
.blackloop
        subq.w  #1,d5
        move.l  d4,(a0)+
        addq.w  #8,d4
        dbra    d6,.blackloop

.tilem3
        subq.w  #1,d5
        bmi.s   .skipwhite
        move.w  d1,d2
        add.w   #spr+2*sd_SIZEOF+sd_pos,d2
        move.w  d2,(a0)+
        move.w  d4,(a0)+
        addq.w  #8,d4

.tilem2
        subq.w  #1,d5
        bmi.s   .skipwhite
        move.w  d1,d2
        add.w   #spr+4*sd_SIZEOF+sd_pos,d2
        move.w  d2,(a0)+
        move.w  d4,(a0)+
        addq.w  #8,d4

.tilem1
        subq.w  #1,d5
        bmi.s   .skipwhite
        move.w  d1,d2
        add.w   #spr+6*sd_SIZEOF+sd_pos,d2
        move.w  d2,(a0)+
        move.w  d4,(a0)+

.skipspecial
        subq.w  #1,d5
        bmi.s   .skipwhite
.whiteloop
        move.l  d3,(a0)+
        dbra    d5,.whiteloop
.skipwhite
        dbra    d7,.lineloop

        moveq.l #CURTAIN_WIDTH-1,d7
.emptylineloop
        move.l  d3,(a0)+
        dbra    d7,.emptylineloop

        PUTMSG  10,<"%d: Curtain done">,fw_FrameCounter-2(a6)
        rts

;--------------------------------------------------------------------

sth_draw_curtain:
        move.l  pd_CurrCopListPtr(a6),a1
        adda.w  pd_CopperChunkyOffset(a6),a1

        BLTHOGON
        BLTWAIT
        BLTHOGOFF
        BLTCON_SET AD,BLT_A,0,0
        moveq.l #-1,d0
        move.l  d0,bltafwm(a5)      ; also fills bltalwm
        moveq.l #0,d0
        move.l  d0,bltamod(a5)

        lea     sth_curtainsines(pc),a2
        lea     sth_curtainsines+256(pc),a3
        lea     sth_curtainsines+512(pc),a4
        move.w  #(CURTAIN_WIDTH*2)|((1)<<6),d3

        move.l  pd_CurtainDataPtr(a6),a0
        move.w  pd_CurtainOffset1(a6),d2
        addq.w  #2,d2
        move.w  d2,pd_CurtainOffset1(a6)
        move.w  pd_CurtainOffset2(a6),d5
        subq.w  #3,d5
        move.w  d5,pd_CurtainOffset2(a6)
        move.w  d5,d0
        add.w   d2,d0
        add.w   d2,d0
        lsr.w   #2,d0
        add.w   d2,d2
        add.w   d5,d5

        and.w   #254,d2
        and.w   #254,d5
        and.w   #254,d0

        move.l  pd_CurtainPos(a6),d4
        sub.l   #3*(CURTAIN_WIDTH*4),d4
        move.l  d4,pd_CurtainPos(a6)
        move.l  #(CURTAIN_WIDTH*4)*(((CURTAIN_WIDTH+2)*16)+1),d6
        move.w  #STHAM_HEIGHT-1,d7
        moveq.l #0,d1
.lineloop
        suba.w  d1,a0
        addq.b  #3*2,d2
        move.w  (a3,d2.w),d1

        subq.b  #2*2,d0
        add.w   (a3,d0.w),d1

        subq.b  #4*2,d5
        add.w   (a4,d5.w),d1

        ext.l   d1
        add.l   d4,d1
        bpl.s   .nocutoff
        moveq.l #0,d1
        bra.s   .nooverfl2
.nocutoff
        cmp.l   d6,d1
        blt.s   .nooverfl
        move.w  d6,d1
.nooverfl
        adda.w  d1,a0
.nooverfl2
        BLTWAIT
        movem.l a0/a1,bltapt(a5)        ; bltapt = a0, bltdpt = a1
        move.w  d3,bltsize(a5)
        lea     COP_CURTAIN_INST_PER_LINE*4(a1),a1
        dbra    d7,.lineloop
        rts

;--------------------------------------------------------------------

sth_create_sham_copperlist:
        move.l  pd_CurrCopListPtr(a6),a0

        move.l  pd_CurrBentSpritesPtr(a6),a1
        move.w  #sprpt,d1
        moveq.l #(BENTSPRITE_WIDTH/16)*2-1,d7
.sprloop
        move.w  d1,(a0)+
        move.w  (a1)+,(a0)+
        addq.w  #2,d1
        dbra    d7,.sprloop

        COPIMOVE DMAF_SETCLR|DMAF_SPRITE,dmacon ; enable sprite dma

        move.l  pd_CurrPlanesPtr(a6),d0
        moveq.l #6-1,d7
        move.w  #bplpt,d1
        moveq.l #(STHAM_WIDTH)/8,d2
.bplloop
        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,.bplloop

        COPIMOVE $6a00,bplcon0

        moveq.l #-2,d3
        move.w  #$51b5,d0
        move.w  #$100,d2

        lea     sth_sprite_xpos(pc),a1
        move.w  #$5200,d1
        move.w  #BENTSPRITE_HEIGHT-1,d7
        lea     sth_scroller_gradient(pc),a2
        moveq.l #-1,d5
        moveq.l #-1,d6
.cprloop
        move.w  #((($52+BENTSPRITE_HEIGHT)&$ff)<<7)|1,d4
        move.b  (a1)+,d1
        cmp.b   d5,d1
        beq.s   .skippos
        move.b  d1,d5

        move.w  d0,(a0)+
        move.w  d3,(a0)+

        lsr.b   #1,d1
        roxl.w  d4
        add.b   #$40,d1

        REPT    8
        COPRMOVE d4,spr+sd_ctl+REPTN*sd_SIZEOF
        ENDR
        REPT    8
        COPRMOVE d1,spr+sd_pos+REPTN*sd_SIZEOF
        addq.b  #8,d1
        ENDR
        bra.s   .addcol

.skippos
        move.w  d0,d1
        move.b  #$d5,d1
        move.w  d1,(a0)+
        move.w  d3,(a0)+
.addcol
        cmp.w   (a2),d6
        beq.s   .nocol
        move.w  (a2),d6
        COPRMOVE d6,color+17*2
        cmp.w   #BENTSPRITE_HEIGHT-1-31,d7
        bgt.s   .nocol
        sub.w   #$011,d6
        COPRMOVE d6,color+21*2
        cmp.w   #BENTSPRITE_HEIGHT-1-124,d7
        bgt.s   .nocol
        sub.w   #$011,d6
        COPRMOVE d6,color+25*2
        cmp.w   #BENTSPRITE_HEIGHT-1-160,d7
        bgt.s   .nocol
        sub.w   #$011,d6
        COPRMOVE d6,color+29*2
.nocol
        add.w   d2,d0
        addq.w  #2,a2

        dbra    d7,.cprloop

        move.l  d3,(a0)+
        rts

;--------------------------------------------------------------------

sth_create_intro_copperlist:
        move.l  pd_CurrCopListPtr(a6),a0

        moveq.l #0,d5
        move.l  pd_CurrPlanesPtr(a6),d0
        lea     pd_Bars(a6),a1
        moveq.l #BAR_HEIGHT,d6
        moveq.l #NUM_BARS-1,d7
.findtopbar
        move.w  bd_YPos(a1),d4
        PUTMSG  40,<"%d: YPos %d">,d7,d4
        add.w   d6,d4
        bgt.s   .foundtopbar
        add.l   #BAR_HEIGHT*(2*(STHAM_WIDTH)/8)*STHAM_PLANES,d0
        addq.l  #bd_SIZEOF,a1
        dbra    d7,.findtopbar
        moveq.l #1,d5           ; no bar visible
        moveq.l #0,d6           ; zero height for first bar
        bra.s   .noaddsplit
.foundtopbar
        sub.w   d6,d4
        bpl.s   .noaddsplit
        add.w   d4,d6
        move.w  d4,d2
        neg.w   d2
        PUTMSG  30,<"Adding %d">,d2
        muls    #(2*(STHAM_WIDTH)/8)*STHAM_PLANES,d2
        add.l   d2,d0
        moveq.l #0,d4
.noaddsplit

        PUTMSG  20,<"Top Y %d, Height %d">,d4,d6
        moveq.l #6-1,d7
        move.w  #bplpt,d1
        moveq.l #(STHAM_WIDTH)/8,d2
.bplloop
        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,.bplloop

        moveq.l #-2,d3
        move.w  #$5207,d0
        move.w  #$100,d2
        moveq.l #0,d7

        tst.w   d5
        bne.s   .allempty
        lea     sth_midbar_gradient(pc),a2
        tst.w   d4
        beq.s   .startbar

        COPIMOVE $0000,color
        COPIMOVE $0200,bplcon0
        add.w   d4,d7

        move.w  bd_YPos(a1),d1
        sub.w   bd_YPos-bd_SIZEOF(a1),d1
        sub.w   #BAR_HEIGHT,d1
        move.w  d1,d6
        move.w  d4,-(sp)
        sub.w   d4,d1

        move.w  d6,d4
        add.w   d4,d4
        moveq.l #0,d5
        subq.w  #1,d1
        bmi.s   .skipspecial
.firstloop
        sub.w   d2,d6
        bpl.s   .cont2
.again2
        addq.w  #2,d5
        add.w   d4,d6
        bmi.s   .again2
.cont2
        dbra    d1,.firstloop
.skipspecial
        move.w  (sp)+,d1
        subq.w  #1,d1
        beq.s   .oneline
        subq.w  #1,d1
        bra.s   .whiteloop

.startbar
        COPIMOVE $0000,color
        COPIMOVE $6a00,bplcon0

.barloop
        PUTMSG  30,<"Barloop at %d">,d7
        add.w   d6,d7
        move.w  d6,d1
        lsl.w   #8,d1
        add.w   d1,d0
        bcc.s   .no255
        move.w  #$ffdf,(a0)+
        move.w  d3,(a0)+
.no255
        move.w  d0,(a0)+
        move.w  d3,(a0)+

        addq.l  #bd_SIZEOF,a1
        move.w  bd_YPos(a1),d1
        sub.w   d7,d1
        beq.s   .nextbar

        COPIMOVE $0200,bplcon0
        cmp.w   #STHAM_HEIGHT,bd_YPos(a1)
        bge.s   .lastbar
.startfirstwhite
        PUTMSG  40,<"White dist %d">,d1
        add.w   d1,d7
        move.w  d1,d6
        move.w  d1,d4
        add.w   d4,d4
        moveq.l #0,d5
        subq.w  #1,d1
        beq.s   .oneline
        subq.w  #1,d1
.whiteloop
        add.w   d2,d0
        bcc.s   .no255b
        move.w  #$ffdf,(a0)+
        move.w  d3,(a0)+
.no255b
        move.b  #$3f,d0
        move.w  d0,(a0)+
        move.w  d3,(a0)+
        ;sub.w   #128*2,d6
        sub.w   d2,d6
        bpl.s   .cont
.again
        addq.w  #2,d5
        add.w   d4,d6
        bmi.s   .again
.cont
        COPRMOVE (a2,d5.w),color
        move.b  #$3f+(STHAM_WIDTH/2),d0
        move.w  d0,(a0)+
        move.w  d3,(a0)+
        COPIMOVE $0000,color
        dbra    d1,.whiteloop
        move.b  #$07,d0

.oneline
        add.w   d2,d0
        bcc.s   .no255e
        move.w  #$ffdf,(a0)+
        move.w  d3,(a0)+
.no255e
        move.w  d0,(a0)+
        move.w  d3,(a0)+
        ;COPIMOVE $0000,color

.nextbar
        cmp.w   #STHAM_HEIGHT,bd_YPos(a1)
        bge.s   .done
        COPIMOVE $6a00,bplcon0
        moveq.l #BAR_HEIGHT,d6
        bra.s   .barloop
.done
        move.l  d3,(a0)+
        rts
.lastbar
        lea     sth_bar_gradient(pc),a2
        move.w  d1,d7
        subq.w  #1,d7
        moveq.l #0,d5
        bra.s   .allloop
.allempty
        lea     sth_bar_gradient(pc),a2
        COPIMOVE $0200,bplcon0
        move.w  d4,d5
        neg.w   d5
        add.w   d5,d5
        move.w  #STHAM_HEIGHT-1,d7
.allloop
        COPRMOVE (a2,d5.w),color
        add.w   d2,d0
        bcc.s   .no255c
        move.w  #$ffdf,(a0)+
        move.w  d3,(a0)+
.no255c
        move.w  d0,(a0)+
        move.w  d3,(a0)+
        addq.w  #2,d5
        dbra    d7,.allloop

        move.l  d3,(a0)+
        rts

;--------------------------------------------------------------------

sth_create_simple_copperlist:
        move.l  pd_CurrCopListPtr(a6),a0
        COPIMOVE DMAF_SPRITE,dmacon ; disable sprite dma

        move.l  pd_CurrPlanesPtr(a6),d0
        moveq.l #6-1,d7
        move.w  #bplpt,d1
        moveq.l #(STHAM_WIDTH)/8,d2
.bplloop
        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,.bplloop

        COPIMOVE $6a00,bplcon0

        moveq.l #-2,d3
        move.l  d3,(a0)+
        rts

;--------------------------------------------------------------------

sth_create_curtain_copperlist:
        move.l  pd_CurrCopListPtr(a6),a0
        move.l  a0,a2

        COPIMOVE DMAF_SPRITE,dmacon ; disable sprite dma

        COPIMOVE ($6<<8)|(0<<2)|(1<<1),spr+0*sd_SIZEOF+sd_ctl
        COPIMOVE ($6<<8)|(0<<2)|(1<<1),spr+1*sd_SIZEOF+sd_ctl
        COPIMOVE ($6<<8)|(0<<2)|(1<<1),spr+2*sd_SIZEOF+sd_ctl
        COPIMOVE ($6<<8)|(0<<2)|(1<<1),spr+3*sd_SIZEOF+sd_ctl
        COPIMOVE ($6<<8)|(0<<2)|(1<<1),spr+4*sd_SIZEOF+sd_ctl
        COPIMOVE ($6<<8)|(0<<2)|(1<<1),spr+5*sd_SIZEOF+sd_ctl
        COPIMOVE ($6<<8)|(0<<2)|(1<<1),spr+6*sd_SIZEOF+sd_ctl
        COPIMOVE ($6<<8)|(0<<2)|(1<<1),spr+7*sd_SIZEOF+sd_ctl

        COPIMOVE %0000000000000000,spr+0*sd_SIZEOF+sd_dataB
        COPIMOVE %0000000000000000,spr+1*sd_SIZEOF+sd_dataB
        COPIMOVE %0010110111111111,spr+2*sd_SIZEOF+sd_dataB
        COPIMOVE %0001011011111111,spr+3*sd_SIZEOF+sd_dataB
        COPIMOVE %0010110111111111,spr+4*sd_SIZEOF+sd_dataB
        COPIMOVE %0001011011111111,spr+5*sd_SIZEOF+sd_dataB
        COPIMOVE %1110110100000000,spr+6*sd_SIZEOF+sd_dataB
        COPIMOVE %1111011010000000,spr+7*sd_SIZEOF+sd_dataB

        COPIMOVE %1111111111111111,spr+0*sd_SIZEOF+sd_dataa
        COPIMOVE %1111111111111111,spr+1*sd_SIZEOF+sd_dataa
        COPIMOVE %1101001001011011,spr+2*sd_SIZEOF+sd_dataa
        COPIMOVE %1110100100101101,spr+3*sd_SIZEOF+sd_dataa
        COPIMOVE %1101001001011011,spr+4*sd_SIZEOF+sd_dataa
        COPIMOVE %1110100100101101,spr+5*sd_SIZEOF+sd_dataa
        COPIMOVE %1100100000100010,spr+6*sd_SIZEOF+sd_dataa
        COPIMOVE %1110010000010001,spr+7*sd_SIZEOF+sd_dataa

        move.l  pd_CurrPlanesPtr(a6),d0
        moveq.l #6-1,d7
        move.w  #bplpt,d1
        moveq.l #(STHAM_WIDTH)/8,d2
.bplloop
        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,.bplloop

        COPIMOVE $6a00,bplcon0

        moveq.l #-2,d3
        move.w  #$5237,d0
        move.w  #$100,d2

        move.w  #$51d7,(a0)+
        move.w  d3,(a0)+

        move.l  a0,d1
        sub.l   a2,d1
        add.w   #8*4+4,d1
        move.w  d1,pd_CopperChunkyOffset(a6)

        move.w  #BENTSPRITE_HEIGHT-1,d7
.cprloop

        COPIMOVE ($50<<8)|(64-32),spr+0*sd_SIZEOF+sd_pos
        COPIMOVE ($50<<8)|(64-32),spr+1*sd_SIZEOF+sd_pos
        COPIMOVE ($50<<8)|(64-32),spr+2*sd_SIZEOF+sd_pos
        COPIMOVE ($50<<8)|(64-32),spr+3*sd_SIZEOF+sd_pos
        COPIMOVE ($50<<8)|(64-32),spr+4*sd_SIZEOF+sd_pos
        COPIMOVE ($50<<8)|(64-32),spr+5*sd_SIZEOF+sd_pos
        COPIMOVE ($50<<8)|(64-32),spr+6*sd_SIZEOF+sd_pos
        COPIMOVE ($50<<8)|(64-32),spr+7*sd_SIZEOF+sd_pos

        move.w  d0,(a0)+
        move.w  d3,(a0)+
        add.w   d2,d0

        move.l  #$1fe<<16,d1
        REPT    CURTAIN_WIDTH
        move.l  d1,(a0)+
        ENDR

        dbra    d7,.cprloop

        move.l  d3,(a0)+
        rts

;********************************************************************

sth_scrolltext:
        ;dc.b    "HAMPHREY B IS REALLY LOOKING  HAMAZING  TODAY"
        dc.b    "HAMAZING    IT EVEN IMPRESSES HAMPHREY BOGART"
        dc.b    "                                "
        dc.b    0
        even

sth_curtainsines:
        incbin  "data/stham/curtainsine.bin"

sth_hamphrey_palette:
        include "data/stham/PLT_HAMph_path_2_test08b_ham.pal.asm"

; https://gradient-blaster-grahambates.vercel.app/?points=cff@0,09a@171&steps=256&blendMode=oklab&ditherMode=errorDiffusion&target=amigaOcs&ditherAmount=55
sth_scroller_gradient:
        dc.w    $cff,$dff,$cff,$cff,$cff,$cff,$cff,$cff
        dc.w    $cff,$cfe,$cff,$cff,$cfe,$cff,$bee,$cff
        dc.w    $cee,$bff,$bef,$cff,$aef,$bff,$aef,$bff
        dc.w    $aff,$bee,$aef,$bee,$bef,$aee,$aef,$bee
        dc.w    $aee,$aee,$aee,$aee,$aee,$aee,$aee,$ade
        dc.w    $aee,$aee,$aee,$aee,$ade,$9ee,$ade,$aee
        dc.w    $9de,$aee,$9dd,$ade,$9dd,$ade,$9dd,$aee
        dc.w    $9dd,$9dd,$9dd,$9de,$9dd,$9dd,$9dd,$9dd
        dc.w    $9dd,$9dd,$9dd,$9dd,$9cd,$9dd,$9cd,$9dd
        dc.w    $8dd,$8cd,$8dd,$7cd,$8dd,$8cd,$7dd,$8cd
        dc.w    $7cd,$8cd,$7cd,$7cd,$8cd,$7cd,$7cc,$7cd
        dc.w    $7cd,$7cd,$7cd,$7cc,$7cd,$7cc,$7cc,$7cd
        dc.w    $7cc,$7cc,$7bc,$6cc,$7bc,$7cc,$7bc,$7cc
        dc.w    $6bc,$7bc,$6cc,$7cc,$6bc,$7bc,$6bc,$6bb
        dc.w    $6bc,$6bc,$7bc,$7bc,$6bb,$6bc,$6bb,$6bc
        dc.w    $6bb,$6bc,$6ab,$6bb,$6bb,$5ab,$5bc,$5bb
        dc.w    $5ab,$5bb,$4ac,$4bb,$4ac,$4bb,$4ab,$4ab
        dc.w    $4ac,$4bb,$4ab,$4ab,$4ab,$4ab,$3ab,$4ab
        dc.w    $4ab,$4ab,$3ab,$4ab,$4ab,$3ab,$4ab,$3ab
        dc.w    $39a,$3ab,$3aa,$3ab,$3aa,$39b,$3aa,$39b
        dc.w    $39b,$3aa,$39a,$3ab,$29a,$39a,$29a,$39a
        dc.w    $39a,$29a,$29a,$09a,$09a,$09a,$09a,$09a
        dc.w    $09a,$09a,$09a,$09a,$09a

; https://gradient-blaster-grahambates.vercel.app/?points=000@0,719@64,fff@255&steps=256&blendMode=oklab&ditherMode=shuffle&target=amigaOcs&shuffleCount=2
sth_bar_gradient:
        dc.w    $000,$000,$000,$000,$000,$000,$000,$000
        dc.w    $000,$000,$101,$000,$101,$001,$101,$001
        dc.w    $102,$101,$102,$101,$102,$101,$203,$102
        dc.w    $203,$202,$203,$202,$203,$304,$203,$304
        dc.w    $204,$304,$204,$405,$304,$405,$304,$405
        dc.w    $304,$405,$405,$406,$405,$516,$406,$516
        dc.w    $406,$517,$506,$517,$507,$517,$507,$608
        dc.w    $618,$608,$618,$608,$709,$608,$719,$709
        dc.w    $709,$719,$719,$729,$719,$729,$719,$82a
        dc.w    $719,$82a,$729,$82a,$729,$83a,$73a,$83a
        dc.w    $83a,$83a,$83a,$83a,$83a,$83a,$83a,$84a
        dc.w    $83a,$84a,$83a,$84a,$83a,$84a,$84a,$84a
        dc.w    $84a,$95a,$84a,$95a,$84b,$95a,$84b,$95b
        dc.w    $95a,$95b,$95a,$95b,$95a,$95b,$95b,$96b
        dc.w    $95b,$96b,$95b,$96b,$95b,$96b,$96b,$a6b
        dc.w    $96b,$a6b,$96b,$a6b,$96b,$a6b,$a6b,$a7c
        dc.w    $a6b,$a7c,$a7b,$a7c,$a7b,$a7c,$a7b,$a7c
        dc.w    $a7c,$a7c,$a7c,$b8c,$a7c,$b8c,$a7c,$b8c
        dc.w    $a7c,$a8c,$b8c,$b8c,$b8c,$b8c,$b8c,$b8c
        dc.w    $b8c,$b8c,$b8c,$b9d,$b8c,$b9d,$b8c,$b9d
        dc.w    $b8c,$b9d,$b9d,$b9d,$b9c,$b9d,$c9d,$cad
        dc.w    $c9d,$cad,$c9d,$cad,$c9d,$cad,$cad,$cad
        dc.w    $cad,$cad,$cad,$cad,$cad,$cad,$cad,$dbd
        dc.w    $cad,$dbd,$cad,$dbe,$cad,$dbe,$dbd,$dbe
        dc.w    $dbd,$dbe,$dbe,$dce,$dbe,$dce,$dbe,$dce
        dc.w    $dbe,$dce,$dce,$dce,$dce,$dce,$dce,$dce
        dc.w    $dce,$dce,$ece,$dce,$ede,$ece,$ede,$dce
        dc.w    $ede,$dce,$ede,$ede,$edf,$ede,$edf,$ede
        dc.w    $edf,$ede,$edf,$eef,$edf,$eef,$edf,$eef
        dc.w    $edf,$eef,$fef,$eef,$fef,$fef,$fef,$fef
        dc.w    $fff,$fef,$fff,$fef,$fff,$fef,$fff,$fff
        dc.w    $fff,$fff,$fff,$fff,$fff,$fff,$fff,$fff

        blk.w   180,$fff

sth_midbar_gradient:
; https://gradient-blaster-grahambates.vercel.app/?points=000@0,578@35,fff@43,984@52,000@128&steps=256&blendMode=oklab&ditherMode=blueNoise&target=amigaOcs&ditherAmount=82
        dc.w    $000,$000,$000,$000,$000,$000,$010,$001
        dc.w    $011,$011,$011,$112,$111,$122,$122,$223
        dc.w    $222,$233,$233,$234,$243,$234,$334,$245
        dc.w    $344,$345,$355,$455,$356,$466,$457,$567
        dc.w    $467,$568,$567,$578,$789,$79a,$8aa,$acc
        dc.w    $bcc,$cde,$efe,$fff,$efe,$edd,$ddb,$dcb
        dc.w    $cb9,$cb8,$a96,$a95,$984,$984,$984,$983
        dc.w    $874,$884,$873,$883,$873,$773,$863,$774
        dc.w    $763,$773,$663,$763,$763,$662,$662,$653
        dc.w    $652,$663,$553,$653,$652,$652,$542,$652
        dc.w    $542,$542,$541,$542,$541,$442,$432,$442
        dc.w    $431,$431,$431,$431,$321,$331,$331,$331
        dc.w    $221,$321,$320,$221,$321,$220,$220,$221
        dc.w    $211,$111,$210,$211,$110,$110,$110,$110
        dc.w    $100,$111,$100,$100,$010,$000,$000,$100
        dc.w    $000,$000,$000,$000,$000,$000,$000,$000

sth_sprite_xpos:
        ; XPos
        dc.b    77,74,70,68,64,62,60,58,56,53,52,50,49,48,46,45
        dc.b    44,43,42,41,39,39,38,37,36,35,34,33,33,32,32,31
        dc.b    30,30,29,29,28,27,27,26,26,25,25,24,24,23,23,22
        dc.b    22,22,21,21,21,20,20,20,19,19,19,19,18,18,18,18
        dc.b    18,17,17,17,17,17,17,16,16,16,16,16,16,16,16,16
        dc.b    16,16,16,16,15,16,16,16,16,16,16,16,16,16,16,16
        dc.b    17,17,17,17,17,17,18,18,18,19,19,19,19,20,20,21
        dc.b    21,22,22,23,23,24,24,25,25,26,27,27,28,29,29,30
        dc.b    31,31,32,33,34,35,36,37,38,39,40,42,43,44,45,46
        dc.b    48,49,50,52,54,55,56,57,60,62,63,65,67,68,71,73
        dc.b    75,77,80,82,84,86,88,90,93,96,99,101,104,107,110,113
        dc.b    116,119,122,125,128

sth_sprite_widths:
        ; Width (49 at 90, 81 at 144)
        dc.b    32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32     ;  0
        dc.b    32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,33     ; 16
        dc.b    33,33,33,33,34,34,34,34,34,35,35,35,35,35,36,36     ; 32
        dc.b    36,36,37,37,37,37,38,38,38,38,38,39,39,39,40,40     ; 48
        dc.b    40,40,41,41,41,42,42,42,42,43,43,43,44,44,44,45     ; 64
        dc.b    45,45,46,46,46,47,47,47,48,48,48,49,49,50,50,50     ; 80
        dc.b    51,51,52,52,52,53,53,54,54,55,55,56,56,57,57,58     ; 96
        dc.b    58,59,59,60,60,61,61,62,62,63,64,64,65,66,66,67     ; 112
        dc.b    68,68,69,69,70,71,72,72,73,74,75,76,76,77,78,79     ; 128
        dc.b    80,81,82,83,84,85,86,87,88,89,90,91,92,93,95,96     ; 144
        dc.b    97,98,100,101,102,104,105,106,107,109,111,112,114,116,117,119
        dc.b    121,123,125,126,128

sth_sprite_y_offsets:
        dc.w    0       ; 16
        dc.w    0       ; 32
        dc.w    31      ; 48
        dc.w    90      ; 64
        dc.w    124     ; 80
        dc.w    144     ; 96
        dc.w    160     ; 112
        dc.w    172     ; 128

sth_font_data:
        ; Font
        dc.l    $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$11202022
        dc.l    $33226266,$7766e6ee,$776eeeee,$776eeeee,$776eeeee,$776eeeee,$574eeeee,$556eaaaa,$466e2a2a,$6666222a,$6666224c,$6666204c,$6666444c,$6664444c,$6644444c,$4444444c
        dc.l    $4444444c,$44444488,$44444888,$44448888,$44088888,$44088888,$00088888,$00088888,$00088800,$00088000,$00080000,$00000000,$00000000,$00000000,$00000000,$00000000
        dc.l    $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$11000000,$11000022,$11002222,$11222222,$33222222,$33222266,$33226666,$33666666,$77666666
        dc.l    $776644ee,$7744ccee,$754cccee,$754cccee,$754c8cee,$75088cee,$31088cee,$31088cee,$31088eee,$3108aeee,$332aaeee,$322aaeee,$222aaeee,$222aeeee,$222aeecc,$626eeecc
        dc.l    $666ecccc,$464cccc8,$444ccc88,$444ccc88,$444ccc88,$444c8888,$444c8888,$44008888,$00000808,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000
        dc.l    $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00202220,$32222222,$32222266,$33226666,$33666666,$33666666
        dc.l    $77666666,$77466666,$554446ee,$554446aa,$55440aaa,$55008aaa,$55008aaa,$51008aaa,$11088aaa,$00088aaa,$00088a88,$00088888,$00088888,$00088888,$40088888,$40088888
        dc.l    $44488888,$444c8888,$444c8888,$44488888,$44008888,$44000888,$40000008,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000
        dc.l    $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$11000000,$11000022,$11002222,$11222222,$33222222,$33222266,$33226666,$33666666,$77666666
        dc.l    $776646ee,$7744ceee,$554cceee,$554cceaa,$554c8aaa,$55088aaa,$11088aaa,$11088aaa,$11088aaa,$1108aaaa,$1008aaaa,$100aaaaa,$002aaaaa,$222aaaaa,$222aaaec,$622aeecc
        dc.l    $666eeecc,$666ecccc,$666ccccc,$664ccccc,$444ccccc,$4444cc88,$44440888,$00000008,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000
        dc.l    $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$11000000,$11000022,$11002222,$11222222,$33222222,$33222266,$33226666,$33666666,$77666666
        dc.l    $776646ee,$7744ceee,$754cceee,$754cceee,$754c8eee,$75088eee,$31088eee,$31088eee,$31088eee,$31088eee,$31088eee,$31088eee,$00088eee,$00088e88,$00088888,$00088888
        dc.l    $00088888,$00088888,$00088888,$00088888,$00088888,$00088888,$00088888,$00088888,$00088888,$00088800,$00080000,$00000000,$00000000,$00000000,$00000000,$00000000
        dc.l    $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$11000000,$11000022,$11002222,$11222222,$33222222,$33222266,$33226666,$33666666,$77666666
        dc.l    $776646ee,$7744ceee,$754cceee,$754cceee,$754c8eee,$75088eee,$31088eee,$31088e66,$31080666,$31000666,$31000666,$11000666,$11000622,$11000222,$11000222,$11000222
        dc.l    $00000222,$00000200,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000
        dc.l    $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00202220,$32222222,$32222266,$33226666,$33666666,$33666666
        dc.l    $77666666,$7746666e,$554446ee,$554446aa,$55440aaa,$55008aaa,$55008aaa,$51008aaa,$11008aaa,$11088aaa,$000888cc,$0008cccc,$0008cccc,$0008cccc,$0008cccc,$0008cccc
        dc.l    $0008cccc,$404ccccc,$444ccccc,$444ccccc,$44cccccc,$44cccc88,$44cc8888,$44888888,$00888888,$00888800,$00880000,$00000000,$00000000,$00000000,$00000000,$00000000
        dc.l    $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$11000000,$11000022,$11002222,$11222222,$33222222,$33222266,$33226666,$22666666,$66666644
        dc.l    $666644cc,$6644cccc,$664ccccc,$664ccccc,$664ccccc,$6608cccc,$2208cccc,$2208cc44,$22084444,$33004444,$33004466,$33006666,$33226666,$33226666,$33226666,$33226666
        dc.l    $22666666,$66666644,$666644cc,$6644cccc,$444ccccc,$444ccc88,$444c8888,$44088888,$00088888,$00088800,$00080000,$00000000,$00000000,$00000000,$00000000,$00000000
        dc.l    $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$11000000,$11000022,$11000022,$11000022,$11000022,$11000022,$11000022,$11000022
        dc.l    $11000022,$110000a2,$1100aaa2,$112aaaa2,$332aaaa2,$332aaae6,$332aeee6,$336eeee6,$776eeee6,$776eccee,$774cccee,$554cccee,$554cccaa,$554c88aa,$550888aa,$110888aa
        dc.l    $000888a2,$00088880,$00088880,$00088880,$00088880,$00088880,$00088880,$00088880,$00088880,$00088800,$00080000,$00000000,$00000000,$00000000,$00000000,$00000000
        dc.l    $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00400000,$44400000
        dc.l    $44400008,$44400088,$44400888,$44408888,$44408888,$44008888,$44088888,$40088888,$00188888,$11188888,$111888aa,$1118aaaa,$113aaaaa,$333aaaaa,$333aaaee,$332aeeee
        dc.l    $626eeeee,$666eeecc,$666ecccc,$664ccccc,$444ccccc,$444ccc88,$44448888,$44000888,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000
        dc.l    $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$11000000,$11000022,$11002222,$11222222,$33222222,$33222266,$33226666,$22666666,$66666644
        dc.l    $666644cc,$6644cccc,$644ccccc,$666ccccc,$666eeccc,$666eeeec,$766eeeee,$376eee66,$332e6666,$33226666,$33266666,$33666666,$15466666,$55444666,$5544440a,$45444488
        dc.l    $44440888,$44448888,$44088888,$44088888,$00088888,$00088888,$00088800,$00088800,$00080000,$00080000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000
        dc.l    $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$11000000,$11000022,$11002222,$11222222,$33222222,$33222266,$33226666,$22666666,$66666644
        dc.l    $666644cc,$6644cccc,$444ccccc,$444ccc88,$444c8888,$44088888,$40088888,$40088888,$40088888,$40088888,$40088888,$40088888,$40088888,$40088888,$40088888,$40088888
        dc.l    $40088888,$40088888,$40088888,$40088888,$40088888,$40088888,$40088888,$40088888,$40088888,$00088888,$00088800,$00080000,$00000000,$00000000,$00000000,$00000000
        dc.l    $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$11000000,$11000022,$11002222,$11222222,$33222222,$33222266,$33226666,$33666666,$77666666
        dc.l    $764466ee,$4466eeee,$446eee88,$666eaa88,$662a888c,$222888cc,$3208cc44,$31286666,$33666666,$37666666,$37666666,$37666666,$15446626,$15222222,$33222222,$33222266
        dc.l    $22226666,$22666644,$66664444,$664444cc,$4444cccc,$444ccc88,$444c8888,$44088888,$00088888,$00088800,$00080000,$00000000,$00000000,$00000000,$00000000,$00000000
        dc.l    $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$11000000,$11000022,$11002222,$11222222,$33222222,$33222266,$33226666,$32666666,$66666666
        dc.l    $666666ee,$6666eeec,$666eeecc,$666eeecc,$666ea8cc,$662a8ccc,$222acccc,$2228cc44,$220c4444,$22444444,$31444444,$15444466,$55446666,$55666662,$7766662a,$776666ee
        dc.l    $666666ee,$66666ecc,$6666cccc,$6644cccc,$444ccccc,$444ccc88,$444c8888,$44088888,$00088888,$00088800,$00080000,$00000000,$00000000,$00000000,$00000000,$00000000
        dc.l    $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00202220,$32222222,$32222266,$33226666,$33666666,$37666666
        dc.l    $77666666,$7746666e,$554446ee,$554446aa,$55440aaa,$55008aaa,$55008aaa,$51008aaa,$11088aaa,$1108aaaa,$1008aaaa,$100aaaaa,$002aaaaa,$222aaaaa,$222aaaec,$622aeecc
        dc.l    $666eeecc,$666ecccc,$666ccccc,$664ccccc,$4444cccc,$44444c88,$44440008,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000
        dc.l    $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$11000000,$11000022,$11002222,$11222222,$33222222,$33222266,$33226666,$33666666,$77666666
        dc.l    $776644ee,$7744ccee,$55ccccee,$55ccccee,$55ccccee,$5588ccee,$1188ccee,$1188cc66,$11884466,$11004466,$11004666,$11006666,$30226666,$32226666,$22226666,$22226666
        dc.l    $22226644,$22226644,$22220444,$22000444,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000
        dc.l    $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00202220,$32222222,$32222266,$33226666,$33666666,$37666666
        dc.l    $77666666,$774666ee,$554446ee,$55444eaa,$55448aaa,$55008aaa,$55008aaa,$51088aaa,$11088aaa,$1108aaaa,$1008aaaa,$100aaaaa,$002aaaaa,$222aaaaa,$222aaaec,$622aeecc
        dc.l    $666eeecc,$666ecccc,$666ccccc,$6644cccc,$4444cccc,$4444cc88,$444c8888,$04888888,$00888880,$08888800,$00088800,$00000000,$00000000,$00000000,$00000000,$00000000
        dc.l    $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$11000000,$11000022,$11002222,$11222222,$33222222,$33222266,$33226666,$33666666,$77666666
        dc.l    $776644ee,$7744ccee,$554cccee,$554cccee,$554cccee,$5508ccee,$1108ccee,$1108cc66,$11084666,$11006666,$31266666,$32666666,$22666666,$26666666,$66666644,$6666664c
        dc.l    $666644cc,$66440ccc,$44448888,$44488888,$44088888,$40088888,$00088888,$00088880,$00088800,$00088000,$00080000,$00000000,$00000000,$00000000,$00000000,$00000000
        dc.l    $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$10002222,$10222222,$13222222,$33222222,$33622222,$77622226
        dc.l    $7762222e,$776202ee,$776008ee,$774088ee,$774088ee,$770088ee,$730888ee,$330888ee,$330888ee,$220888ee,$220888cc,$220888cc,$220888cc,$220888cc,$22088ccc,$2008cccc
        dc.l    $604ccccc,$644ccccc,$444ccccc,$444ccccc,$444ccc88,$444ccc88,$44448888,$44000888,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000
        dc.l    $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$11000000,$11000022,$11000222,$11000222,$11000222,$11000222,$11000222,$11000222,$11000222
        dc.l    $11000222,$11000222,$11002222,$11222222,$33222222,$33222266,$33226666,$33666666,$77666666,$776666ee,$7744eeee,$554ceeee,$554ceeaa,$554caaaa,$5508aaaa,$1108aaaa
        dc.l    $0008aa22,$00082200,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000
        dc.l    $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$11000000,$11000022,$11002222,$11222222,$33222222,$33222266,$33226666,$22666666,$26666644
        dc.l    $66664444,$6644444c,$444444cc,$44444488,$44440888,$44008888,$44008888,$40008888,$00088888,$11088888,$110888aa,$1108aaaa,$112aaaaa,$332aaaaa,$332aaaee,$732aeeee
        dc.l    $666eeeee,$666eeecc,$666ecccc,$664ccccc,$444ccccc,$4444cc88,$44440888,$04000008,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000
        dc.l    $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$11000000,$11000002,$11000022,$11000222,$11002222,$11022222,$11222222,$32222222,$22222222
        dc.l    $22222244,$22222244,$22224444,$22244444,$22444444,$04444444,$44444444,$44444488,$54444088,$5564aaaa,$7762eaee,$776eeeee,$776eeeee,$776eeeee,$776eeeee,$776eeeee
        dc.l    $664ecece,$040c8888,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000
        dc.l    $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$11000000,$11000022,$11002222,$11222222,$33222222,$33222266,$22226666,$22666644,$66664444
        dc.l    $664444cc,$4444cccc,$444ccc88,$444c8888,$642a8888,$626acccc,$666ecccc,$666ecccc,$666ecccc,$664ccccc,$3108cccc,$114c4466,$11446622,$55666622,$776622aa,$776222ee
        dc.l    $6622eeee,$626eeecc,$666ecccc,$664ccccc,$444ccccc,$444ccc88,$444c8888,$44088888,$00088888,$00088800,$00080000,$00000000,$00000000,$00000000,$00000000,$00000000
        dc.l    $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$01000000,$11000000,$11000002,$11000022,$11000222,$11002222,$11022222,$10222222
        dc.l    $02222222,$22222220,$22222204,$666eeccc,$666ecccc,$666ccccc,$664ccccc,$766cecec,$776eeeee,$776eeeee,$33266666,$33666666,$33666666,$77666666,$47464606,$44444488
        dc.l    $44440088,$44448888,$44008888,$44088888,$00088888,$00088888,$00088800,$00088800,$00080000,$00080000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000
        dc.l    $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$01000000,$11000000,$11000002,$11000022,$11000222,$11002222,$11022222,$10222222,$02222222
        dc.l    $22222220,$22222204,$22222044,$22220444,$22204444,$22044444,$20444444,$04444444,$74646464,$776666ee,$7766eeee,$776eeeee,$776eeeee,$776eeeee,$776eeeee,$070e8e8e
        dc.l    $00088800,$00080000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000
        dc.l    $00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$00000000,$11000000,$11000022,$11000022,$11000022,$11000022,$11000022,$11000022,$510000aa
        dc.l    $554088aa,$554cc8aa,$554cccea,$754cccee,$776cccee,$776eecee,$776eeeee,$776eeeee,$376eeeee,$332eeeee,$332aaeee,$332aaaae,$132aaaaa,$110aaaaa,$00088aaa,$00088888
        dc.l    $00088888,$00088888,$00088888,$00088888,$00088888,$00088888,$00088888,$00088888,$00088888,$00088800,$00080000,$00000000,$00000000,$00000000,$00000000,$00000000

;********************************************************************

;--------------------------------------------------------------------

        section "sth_copper",data,chip

sth_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
sth_ddfstop:
        COP_MOVE ddfstop,$00d0          ; bitplane stop

        COP_MOVE bplcon3,$0c00
sth_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,((STHAM_WIDTH*2)*STHAM_PLANES-STHAM_WIDTH)/8
        COP_MOVE bpl2mod,((STHAM_WIDTH*2)*STHAM_PLANES-STHAM_WIDTH)/8

sth_extra_copperlist_ptr:
        COP_MOVE cop2lc,0
        COP_MOVE cop2lc+2,0
        COP_MOVE $1fe,0
        COP_END

; Bitmap 1 (y offset = 30)
sth_scroller_shift_1_bitmap:
        dc.w    $0,$7fff,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0
        dc.w    $0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0
        dc.w    $0,$0,$0,$0,$0,$0,$0,$0,$7f,$803f,$8000,$0,$0,$0,$0,$0
        dc.w    $0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0
        dc.w    $0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0
        dc.w    $380,$3fc3,$c000,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0
        dc.w    $0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0
        dc.w    $0,$0,$0,$0,$0,$0,$0,$0,$403,$c1fc,$e000,$0,$0,$0,$0,$0
        dc.w    $0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0
        dc.w    $0,$0,$0,$0,$0,$0,$0,$0,$80c,$1e3f,$3000,$0,$0,$0,$0,$0
        dc.w    $0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0
        dc.w    $0,$0,$0,$0,$0,$0,$0,$0,$30,$e1c7,$d800,$0,$0,$0,$0,$0
        dc.w    $0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0
        dc.w    $0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0
        dc.w    $1043,$e39,$e400,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0
        dc.w    $0,$0,$0,$0,$0,$0,$0,$0,$84,$31ce,$7a00,$0,$0,$0,$0,$0
        dc.w    $0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0
        dc.w    $0,$0,$0,$0,$0,$0,$0,$0,$108,$c633,$9d00,$0,$0,$0,$0,$0
        dc.w    $0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0
        dc.w    $11,$18cc,$ee80,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0
        dc.w    $0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0
        dc.w    $2222,$2333,$3300,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0
        dc.w    $0,$0,$0,$0,$0,$0,$0,$0,$4,$44cc,$ddc0,$0,$0,$0,$0,$0
        dc.w    $0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0
        dc.w    $40,$8933,$66e0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0
        dc.w    $0,$0,$0,$0,$0,$0,$0,$0,$409,$124c,$9b30,$0,$0,$0,$0,$0
        dc.w    $0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0
        dc.w    $90,$2493,$64d8,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0
        dc.w    $0,$0,$0,$0,$0,$0,$0,$0,$2,$4924,$9b6c,$0,$0,$0,$0,$0
        dc.w    $0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0
        dc.w    $4,$9249,$25b6,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0
        dc.w    $120,$492,$da4b,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0
        dc.w    $0,$0,$0,$0,$0,$0,$0,$0,$1,$2125,$25b5,$8000,$0,$0,$0,$0
        dc.w    $0,$0,$0,$0,$0,$0,$0,$0,$808,$484a,$4a5a,$4000,$0,$0,$0,$0
        dc.w    $0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0
        dc.w    $42,$1290,$94a5,$a000,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0
        dc.w    $0,$8425,$295a,$d000,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0
        dc.w    $210,$210a,$52a5,$2800,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0
        dc.w    $4,$850,$a54a,$d400,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0
        dc.w    $81,$285,$a95,$2a00,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0
        dc.w    $0,$5028,$542a,$d500,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0
        dc.w    $20,$502,$a155,$2a80,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0
        dc.w    $a,$54,$aa8,$5540,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0
        dc.w    $0,$a801,$5502,$aaa0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0
        dc.w    $0,$2aa,$55,$5550,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0
        dc.w    $0,$0,$aaaa,$aaa8,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0
        dc.w    $0,$0,$0,$0,$0,$0,$0,$0,$5555,$5555,$5555,$5555,$0,$0,$0,$0
        dc.w    $0,$0,$2aaa,$aaaa,$8000,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0
        dc.w    $0,$aa,$8005,$5555,$4000,$0,$0,$0,$0,$2a00,$1550,$aaa,$a000,$0,$0,$0
        dc.w    $0,$0,$0,$0,$0,$0,$0,$0,$2,$8005,$402a,$a055,$5000,$0,$0,$0
        dc.w    $0,$0,$0,$0,$0,$0,$0,$0,$8,$50,$a81,$550a,$a800,$0,$0,$0
        dc.w    $0,$500,$a054,$aa5,$5400,$0,$0,$0,$20,$100a,$502,$a150,$aa00,$0,$0,$0
        dc.w    $0,$0,$0,$0,$0,$0,$0,$0,$0,$4020,$5028,$542a,$5500,$0,$0,$0
        dc.w    $81,$81,$285,$a85,$a80,$0,$0,$0,$0,$204,$850,$a152,$a540,$0,$0,$0
        dc.w    $4,$810,$a102,$1428,$52a0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0,$0
        dc.w    $200,$2042,$428,$4285,$2850,$0,$0,$0,$0,$108,$1085,$852,$9528,$0,$0,$0
        dc.w    $10,$8000,$4210,$a528,$4294,$0,$0,$0,$0,$421,$842,$1085,$294a,$0,$0,$0
        dc.w    $0,$84,$2108,$4212,$94a5,$0,$0,$0,$2,$1000,$8421,$948,$4252,$8000,$0,$0
        dc.w    $40,$210,$1084,$2421,$2909,$4000,$0,$0,$0,$4002,$210,$9094,$84a4,$a000,$0,$0
        dc.w    $0,$40,$4042,$4242,$5252,$5000,$0,$0,$808,$808,$809,$909,$909,$800,$0,$0
        dc.w    $0,$101,$120,$2424,$24a4,$a400,$0,$0,$1,$20,$2404,$8090,$9212,$5200,$0,$0
        dc.w    $0,$2004,$90,$1242,$4849,$2900,$0,$0,$100,$400,$9002,$4809,$2124,$8480,$0,$0
        dc.w    $0,$90,$248,$124,$492,$5240,$0,$0,$20,$2,$4001,$2480,$9249,$920,$0,$0
        dc.w    $4,$0,$924,$12,$4924,$2490,$0,$0,$0,$9249,$2492,$9249,$2492,$4920,$0,$0
        dc.w    $0,$0,$0,$4924,$9249,$2492,$0,$0,$0,$0,$0,$2492,$4924,$9249,$0,$0
        dc.w    $0,$24,$9249,$0,$12,$4924,$8000,$0,$2,$4900,$124,$9248,$9249,$2449,$0,$0
        dc.w    $10,$0,$4800,$924,$124,$9204,$9000,$0,$0,$12,$12,$4002,$4802,$4922,$4800,$0
        dc.w    $80,$480,$2481,$2489,$2449,$2249,$1000,$0,$0,$2001,$48,$240,$1204,$9024,$8900,$0
        dc.w    $0,$8,$200,$9004,$8120,$4912,$4480,$0,$401,$40,$1004,$120,$4812,$481,$2040,$0
        dc.w    $0,$200,$8120,$4891,$2448,$9224,$4900,$0,$8,$1024,$812,$2448,$9122,$4891,$2240,$0
        dc.w    $0,$0,$4081,$204,$810,$2448,$9122,$0,$0,$8102,$408,$9122,$4448,$9122,$4448,$0
        dc.w    $40,$10,$2244,$891,$1224,$4488,$9122,$0,$0,$801,$20,$4408,$102,$2044,$891,$1000
        dc.w    $4,$80,$1102,$2044,$4889,$1112,$2244,$4000,$0,$4008,$8011,$1222,$2444,$4488,$8911,$1000
        dc.w    $0,$400,$888,$8111,$1122,$2222,$2444,$4400,$0,$44,$4440,$888,$8888,$9111,$1111,$1100
        dc.w    $0,$0,$4,$4444,$0,$888,$8888,$8888,$0,$0,$0,$0,$4444,$4444,$4444,$4444

        REPT    16
        dc.l    0
        ENDR

sth_scroller_shift_2_bitmap:
        ; Bitmap 2 (y offset = 157, x = 48, width = 80)
        dc.w    $0,$0,$9248,$0,$0
        dc.w    $0,$0,$0,$0,$0
        dc.w    $0,$0,$0,$0,$0
        dc.w    $0,$0,$0,$0,$0
        dc.w    $1,$2480,$92,$4000,$0
        dc.w    $0,$0,$0,$0,$0
        dc.w    $0,$0,$0,$0,$0
        dc.w    $10,$90,$490,$2400,$0
        dc.w    $0,$0,$0,$0,$0
        dc.w    $0,$0,$0,$0,$0
        dc.w    $0,$0,$0,$0,$0
        dc.w    $2,$81,$2048,$9220,$0
        dc.w    $0,$204,$102,$488,$0
        dc.w    $0,$0,$0,$0,$0
        dc.w    $0,$81,$204,$891,$0
        dc.w    $0,$2000,$811,$2204,$4000
        dc.w    $0,$0,$0,$0,$0
        dc.w    $0,$8010,$220,$4408,$8800
        dc.w    $0,$0,$8801,$1022,$2200
        dc.w    $0,$200,$44,$4088,$8880
        dc.w    $0,$11,$0,$222,$2220
        dc.w    $0,$0,$0,$0,$0
        dc.w    $0,$0,$0,$0,$0

        IFND    FW_DEMO_PART
sth_hamphrey_pic:
        incbin  "data/stham/PLT_HAMph_path_2_test08b_ham.raw"
        ENDC

        END