*********************************************************************
*              SCROLL_D.S     Scroll display
*********************************************************************

               MODULE         scroll_d.s

               INCLUDE        "c:\headers.s\amiga\exec\types.i"
               INCLUDE        "c:\headers.s\amiga\hardware\custom.i"
               INCLUDE        "c:\headers.s\amiga\hardware\blit.i"
               INCLUDE        "c:\headers.s\amiga\hardware\dmabits.i"
               INCLUDE        "d:\gameed\gameed.i"

planes         EQU            64
scrolldata     EQU            68
copperlist     EQU            72

               CODE
               XDEF           _scroll_display
               XREF           _custom,_GfxBase

_scroll_display
               movem.l        d0-d7/a0-a6,-(sp)
               lea            _custom,a0
* disable copper and bitplane DMA
               move.w         #%0000000110100000,dmacon(a0)
               move.w         #%0100000000000000,intena(a0)
* start our copper list
               move.l         copperlist(sp),cop1lc(a0)
               move.w         #0,copjmp1(a0)
* reenable copper and bitplane DMA, blitter nasty on
               move.w         #%1000010110000000,dmacon(a0)
*              -------------------------------------------------------------
               move.w         #30000,d7
frameloop      move.l         scrolldata(sp),a1
*              -------------------------------------------------------------
bandloop       move.w         (a1)+,d0        playfield
               bmi.s          nextframe
*              -------------------------------------------------------------
               lsl.w          #2,d0           byte offset into planes
               move.l         planes(sp),a2   copy of planes
               add.w          d0,a2           offset ready for blitscroll
               move.l         (a1)+,a6        band structure pointer
               move.w         blockheight(a6),d0
               mulu           bandheight(a6),d0       size of band in lines
               move.w         ycoord(a6),d1
               move.w         d0,d2
               add.w          d1,d2                   line after band
               bsr            waitforbeam
               mulu           #82,d1                  offset to band
               move.w         velocitybits(a6),d2     scroll speed
               beq.s          bandloop
               bsr            blitscroll
               bra.s          bandloop
*              -------------------------------------------------------------
nextframe      dbra           d7,frameloop
*              -------------------------------------------------------------
               move.w         #%0000010000000000,dmacon(a0)  blitnasty off
               move.w         #%1100000000000000,intena(a0)
               move.l         _GfxBase,a1
               move.l         $32(a1),cop1lc(a0)      reset copper list
               move.w         d0,copjmp1(a0)
               movem.l        (sp)+,d0-d7/a0-a6
               rts
*
waitforbeam    move.l         vposr(a0),d3
               and.l          #%00000000000000011111111100000000,d3
               lsr.l          #8,d3
               cmp.b          d2,d3
               bhi.s          waitforbeam
               rts
*---------------------------------------------------------------------------
blitscroll     move.w         d2,d3
               moveq          #12,d4
               lsl.w          d4,d3               scroll speed at bit 12
               add.w          #SRCA+DEST+$f0,d3   bltcon0
               neg.w          d2
               add.w          #16,d2          16-scroll speed
               moveq          #-1,d6
               lsl.w          d2,d6
               not.w          d6              edge mask
*              -------------------------------------------------------------
               move.w         d0,d4           copy of no. lines
               lsl.w          #6,d4
               add.w          #21,d4          bltsize
*              -------------------------------------------------------------
               move.l         0(a2),a3
               add.l          d1,a3
               bsr            waitblit
               bsr            storeedge
               bsr            waitblit
               bsr            blitit
               bsr            waitblit
               bsr            restoreedge
*              -------------------------------------------------------------
               move.l         8(a2),a3
               add.l          d1,a3
               bsr            waitblit
               bsr            storeedge
               bsr            waitblit
               bsr            blitit
               bsr            waitblit
               bsr            restoreedge
*              -------------------------------------------------------------
               move.l         16(a2),a3
               add.l          d1,a3
               bsr            waitblit
               bsr            storeedge
               bsr            waitblit
               bsr            blitit
               bsr            waitblit
               bsr            restoreedge
*              -------------------------------------------------------------
               rts
*---------------------------------------------------------------------------
waitblit       btst           #DMAB_BLTDONE-8,dmaconr(a0)
               bne            waitblit
               rts
*
storeedge      lea            40(a3),a4       last word of line
               move.l         a4,bltapt(a0)
               move.l         #storage,bltdpt(a0)
               move.w         #80,bltamod(a0)
               move.w         #80,bltdmod(a0)
               move.w         #SRCA+DEST+$f0,bltcon0(a0)
               move.w         #0,bltcon1(a0)
               move.w         #$ffff,bltafwm(a0)
               move.w         #$ffff,bltalwm(a0)
               move.w         d0,d5           copy of no. lines
               lsl.w          #6,d5
               add.w          #1,d5           bltsize
               move.w         d5,bltsize(a0)  n lines with 1 word
               rts
*---------------------------------------------------------------------------
restoreedge    move.l         #storage,bltapt(a0)
               move.l         a3,bltdpt(a0)
               move.w         #80,bltamod(a0)
               move.w         #80,bltdmod(a0)
               move.w         #SRCA+DEST+$f0,bltcon0(a0)
               move.w         #0,bltcon1(a0)
               move.w         #$ffff,bltafwm(a0)
               move.w         #$ffff,bltalwm(a0)
               move.w         d0,d5           copy of no. lines
               lsl.w          #6,d5
               add.w          #1,d5           bltsize
               move.w         d5,bltsize(a0)  n lines with 1 word
               rts
*---------------------------------------------------------------------------
blitit         move.l         a3,bltapt(a0)
               move.l         a3,bltdpt(a0)
               move.w         #40,bltamod(a0)
               move.w         #40,bltdmod(a0)
               move.w         d3,bltcon0(a0)
               move.w         #0,bltcon1(a0)
               move.w         #$ffff,bltafwm(a0)
               move.w         #$ffff,bltalwm(a0)
               move.w         d4,bltsize(a0)  n lines with 21 words
               rts
*---------------------------------------------------------------------------
storage        DS.W           200

               END
