home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format 8 / af008.adf / DaveJones / scroll.s < prev   
Text File  |  1978-01-07  |  22KB  |  728 lines

  1. *****************************************************************************
  2. *                                            *
  3. *    Amiga system takeover framework                            *
  4. *    1988 Dave Jones, DMA Design                            *
  5. *                                            *
  6. * Allows killing of system, allowing changing of all display & blitter        *
  7. * hardware, restoring to normal after exiting.                        *
  8. * Memory must still be properly allocated/deallocated upon entry/exit       *
  9. * DOS routines for loading must be called BEFORE killing the system           *
  10. *                                            *
  11. * Written using Devpac2                                    *
  12. *                                            *
  13. *****************************************************************************
  14.  
  15.     section    Framework,code_c    
  16.  
  17. *****************************************************************************
  18. * Conditional Code (as last month) to make source code compatible with 
  19. * Argonaut`s ArgAsm. If you have a meg, this code may have to be assembled
  20. * using the CLI-based version of the Arg assembler, due to memory constraints
  21. *                            - Jason
  22. *****************************************************************************
  23.  
  24.     ifd    __ArgAsm
  25.  
  26.     incdir    "include:"
  27.     include     exec/funcdef.i
  28. _SysBase    equ    $04
  29.  
  30.     elseif
  31.  
  32.     incdir    "include/"
  33.  
  34.     endc
  35.  
  36. * End of conditional block
  37.  
  38.  
  39.     include     libraries/dos_lib.i
  40.     include     exec/exec_lib.i
  41.     include     hardware/custom.i
  42.  
  43. Hardware        equ    $dff000
  44. SystemCopper1        equ    $26
  45. SystemCopper2        equ    $32
  46. PortA            equ    $bfe001
  47. ICRA            equ    $bfed01
  48. LeftMouse        equ    6
  49.  
  50. BackgroundWidth        equ    100    100 bytes wide
  51. ForegroundWidth        equ    92    92  bytes wide
  52. ScreenHeight        equ    192    playing area 192 lines high (12 blocks)
  53. NumberPlanes        equ    3    3 planes in each playfield
  54.  
  55. BytesPerBackPlane    equ    BackgroundWidth*ScreenHeight
  56. BytesPerForePlane    equ    ForegroundWidth*ScreenHeight
  57. BackgroundMemory    equ    2*NumberPlanes*BytesPerBackPlane
  58. ForegroundMemory    equ    NumberPlanes*BytesPerForePlane
  59. MemNeeded        equ    BackgroundMemory+ForegroundMemory
  60.  
  61. *******************************************************************************
  62.  
  63. start    lea    GraphicsName(pc),a1    open the graphics library purely
  64.     move.l    _SysBase,a6        to find the system copper
  65.     clr.l    d0
  66.     jsr    _LVOOpenLibrary(a6)
  67.     move.l    d0,GraphicsBase
  68.     lea    DOSName(pc),a1        open the DOS library to allow
  69.     clr.l    d0            the loading of data before
  70.     jsr    _LVOOpenLibrary(a6)    killing the system
  71.     move.l    d0,DOSBase
  72.  
  73.     move.l    #MemNeeded,d0        properly allocate some chip
  74.     moveq.l    #2,d1            memory for screens etc.
  75.     jsr    _LVOAllocMem(a6)    d1 = 2, specifies chip memory
  76.     tst.l    d0            where screens,samples etc
  77.     beq    MemError        must be (bottom 512K)
  78.     move.l    d0,MemBase
  79.  
  80. *******************************************************************************
  81.  
  82.     lea    variables(pc),a5    a5 is the variables pointer
  83.     lea    rasters(a5),a0
  84.     lea    displayraster(a5),a1
  85.     move.l    d0,(a0)+        calculate the address of each plane
  86.     move.l    d0,(a1)+        store them in the variables area,
  87.     add.l    #BytesPerBackPlane,d0    twice for the background as it is
  88.     move.l    d0,(a0)+        double buffered            
  89.     move.l    d0,(a1)+
  90.     add.l    #BytesPerBackPlane,d0
  91.     move.l    d0,(a0)+            
  92.     move.l    d0,(a1)+
  93.     add.l    #BytesPerBackPlane,d0
  94.     move.l    d0,(a0)+            
  95.     add.l    #BytesPerForePlane,d0
  96.     move.l    d0,(a0)+            
  97.     add.l    #BytesPerForePlane,d0
  98.     move.l    d0,(a0)+            
  99.     add.l    #BytesPerForePlane,d0
  100.     move.l    d0,(a0)+            
  101.     move.l    d0,(a1)+
  102.     add.l    #BytesPerBackPlane,d0
  103.     move.l    d0,(a0)+            
  104.     move.l    d0,(a1)+
  105.     add.l    #BytesPerBackPlane,d0
  106.     move.l    d0,(a0)+            
  107.     move.l    d0,(a1)+
  108.  
  109.     move.l    #Hardware,a6
  110.     jsr    TakeSystem
  111.  
  112. *******************************************************************************
  113.  
  114.     move.l    #$dff000,a6        a6 ALWAYS point to base of
  115.     move.l    #-1,bltafwm(a6)        custom chips
  116.     bsr    GameInit
  117.     move.l    #clist,cop1lc(a6)
  118.     move.w    #$87e0,dmacon(a6)    enable copper,sprite,blitter
  119.     move.w    #$7fff,intreq(a6)    clear all int request flags
  120.  
  121. *******************************************************************************
  122.  
  123. * Main game loop with the routines we are yet to cover commented out
  124.  
  125. *******************************************************************************
  126.  
  127. vloop    bsr    waitline223        interrupt set at vertical 
  128.     not.b    vcount(a5)        position 223 (panel start)
  129.     beq    twoblanks        alternate every frame
  130.  
  131.     lea    copperlist(pc),a1    set up registers for routine
  132.     move.w    pf2scroll(a5),d0    checkpf2
  133.     move.w    pf1scroll(a5),d1
  134.     bsr    checkpf2        and branch to it
  135. *    bsr    moveship    
  136. *    bsr    check.collision
  137. *    bsr    erase.missiles
  138. *    bsr    levels.code
  139. *    bsr    update.missiles
  140.     bsr    drawfgnds
  141. *    bsr    print.score
  142. *    bsr    check.keys
  143. *    bsr    check.path
  144.     bra    vloop
  145. twoblanks    
  146.     bsr    checkpf1        the following routines are only
  147.     bsr    flipbgnd        executed every second frame
  148. *    bsr    moveship
  149. *    bsr    restorebgnds
  150. *    bsr    process.aliens
  151. *    bsr    save.aliens
  152. *    bsr    draw.aliens
  153.  
  154.     btst    #LeftMouse,PortA    lest mouse button to exit
  155.     bne    vloop
  156.     bra    finished    
  157.  
  158. **************************************************************************
  159.  
  160. waitline223
  161.     btst    #4,intreqr+1(a6)    wait for vertical line 223
  162.     beq    waitline223        interrupt set by the
  163.     move.w    #$10,intreq(a6)        copperlist
  164. return    rts
  165.  
  166. **************************************************************************
  167.  
  168. checkpf1
  169.     cmp.w    #3,level.end(a5)    level.end = 3 means 
  170.     beq    return            guardian on, so no scroll
  171.     lea    copperlist(pc),a1
  172.     move.w    pf2scroll(a5),d0    d0 = pf2 scroll value (0-15)
  173.     move.w    pf1scroll(a5),d1    d1 = pf1 scroll value (0-15)
  174.     subq.w    #1,d1            scroll a pixel
  175.     bcs    resetpf1        reset back to 15
  176. checkpf2
  177.     cmp.w    #3,level.end(a5)    as above
  178.     beq    return
  179.     subq.w    #1,d0            scroll a pixel
  180.     bcs    resetpf2        reset to 15 and update pointers
  181. storescroll                    
  182.     move.w    d1,pf1scroll(a5)    resave the values
  183.     move.w    d0,pf2scroll(a5)
  184.     move.w    pf1count(a5),d2
  185.     subq.w    #1,d2            check if at the end of the two
  186.     or.w    d1,d2            screens and flag for the sprite
  187.     move.w    d2,screenend(a5)    routine if true    
  188.     lsl.w    #4,d0
  189.     or.w    d0,d1
  190.     move.w    d1,54(a1)        put the new scroll value into 
  191.     rts                the copper list
  192.  
  193. resetpf1
  194.     moveq    #$f,d1            reset scroll to 15
  195.     subq.w    #1,pf1count(a5)        decrement words scrolled
  196.     bne    storepf1        carry on if not zero
  197.     move.w    #23,pf1count(a5)    otherwise reset the number of
  198.     lea    rasters(a5),a4        words to scroll and reset the 
  199.     lea    displayraster(a5),a3    display planes back to the very
  200.     move.l    (a4)+,(a3)+        start.
  201.     move.l    (a4)+,(a3)+
  202.     move.l    (a4)+,(a3)+        six planes in all
  203.     add.w    #12,a4
  204.     move.l    (a4)+,(a3)+
  205.     move.l    (a4)+,(a3)+
  206.     move.l    (a4)+,(a3)+
  207.     bra    checkpf2        now check pf2
  208. storepf1
  209.     lea    displayraster(a5),a3    increment the plane pointers
  210.     addq.l    #2,(a3)            by a word each
  211.     addq.l    #2,4(a3)        these are background planes
  212.     addq.l    #2,8(a3)        and are therefore double
  213.     addq.l    #2,12(a3)        buffered
  214.     addq.l    #2,16(a3)
  215.     addq.l    #2,20(a3)
  216.     bra    checkpf2
  217.  
  218. resetpf2
  219.     lea    rasters(a5),a4
  220.     moveq    #$f,d0            reset scroll back to 15
  221.     subq.w    #1,pf2count(a5)        decrement the word scroll
  222.     bne    respf2            value and reset if zero
  223.     move.w    #23,pf2count(a5)
  224.     clr.w    pf2offset(a5)        offset is reverse of pf2count
  225.     cmp.w    #1,level.end(a5)    and is used for the copper
  226.     bne    respf2            level.end = 1 when map finished
  227.     addq.w    #1,level.end(a5)    so start to draw guardian
  228. *    bsr    change.colours        setup the guardian colours
  229. *    move.w    #6*72,guard.offset(a5)    changes the missiles
  230. respf2 
  231.     move.l    12(a4),d2        get the foreground plane 
  232.     move.l    16(a4),d3        pointers and add the offset to
  233.     move.l    20(a4),d4        them
  234.     addq.w    #2,pf2offset(a5)
  235.     add.w    pf2offset(a5),d2    store these in the copper list
  236.     add.w    pf2offset(a5),d3
  237.     add.w    pf2offset(a5),d4
  238. storepf2
  239.     move.w    d2,30(a1)
  240.     move.w    d3,38(a1)
  241.     move.w    d4,46(a1)
  242.     bra    storescroll
  243.  
  244. **************************************************************************
  245.  
  246. flipbgnd    
  247.     lea    copperlist(pc),a1    swap the background displays
  248.     lea    displayraster(a5),a3    every second frame
  249.     move.l    (a3),d4
  250.     move.l    4(a3),d5
  251.     move.l    8(a3),d6
  252.     move.l    12(a3),(a3)
  253.     move.l    16(a3),4(a3)
  254.     move.l    20(a3),8(a3)
  255.     move.l    d4,12(a3)
  256.     move.l    d5,16(a3)
  257.     move.l    d6,20(a3)
  258.     addq    #4,d4            add 4 bytes (32 pixels) to the
  259.     addq    #4,d5            pointers so that clipping can
  260.     addq    #4,d6            be carried out on the left
  261.     move.w    d4,6(a1)        hand side
  262.     swap    d4
  263.     move.w    d4,2(a1)        store the new ones in the copper
  264.     move.w    d5,14(a1)        list
  265.     swap    d5
  266.     move.w    d5,10(a1)
  267.     move.w    d6,22(a1)
  268.     swap    d6
  269.     move.w    d6,18(a1)
  270.     not.b    screen.num(a5)
  271.     rts
  272.  
  273. **************************************************************************
  274.  
  275. drawfgnds
  276.     cmp.w    #3,level.end(a5)    3 for guardian fully on
  277.     beq    return
  278.     cmp.w    #2,level.end(a5)    2 for drawing guardian
  279.     beq    return
  280.     tst.w    pf2scroll(a5)        every 16 pixels a new strip
  281.     beq    drawbegin        of foreground graphics are
  282.     cmp.w    #$e,pf2scroll(a5)    drawn into a hidden part
  283.     beq    drawend            of the screen
  284.     rts
  285. drawbegin
  286.     bsr    setupblit
  287.     clr.l    d6            d6 = offset into the screen
  288.     move.l    fgndpointer(a5),a0    for the start of the screen
  289.     bsr    drawfgnd        this will be zero
  290.     subq    #1,a0
  291.     move.l    a0,fgndpointer(a5)
  292.     rts
  293.  
  294. drawend
  295.     bsr    setupblit
  296.     moveq    #46,d6            as the screen is 46 bytes
  297.     move.l    fgndpointer(a5),a0    wide, this is the offset
  298.     cmp.b    #$ff,(a0)        at which to draw the strip
  299.     bne    drawfgnd
  300.     sub.w    #12,a0            the end of map is flagged
  301.     move.l    a0,fgndpointer(a5)    by an FF block number
  302.     move.w    #1,level.end(a5)    flag the end of the map
  303.  
  304. drawfgnd
  305.     clr.l    d0
  306.     move.b    (a0)+,d0        d0 = block number (0-254)
  307.     lea    rasters(a5),a4        get the current foreground
  308.     move.l    12(a4),d1        plane pointers in d1,d2,d3
  309.     move.l    16(a4),d2
  310.     move.l    20(a4),d3
  311.     add.l    d6,d1            add the offset passed
  312.     add.l    d6,d2
  313.     add.l    d6,d3
  314.     add.w    pf2offset(a5),d1    add the scrolled words
  315.     add.w    pf2offset(a5),d2    offset to each plane
  316.     add.w    pf2offset(a5),d3
  317.     moveq    #11,d7            12 blocks in height
  318.     move.l    #graphics,a4        a4 = base address of the graphics
  319. fgndloop                    
  320.     move.l    a4,d4
  321.     mulu    #96,d0            96 bytes per graphic blocks
  322.     ext.l    d0            (2 bytes wide x 16 high
  323.     add.l    d0,d4             x 3 planes)
  324.     bsr    blitfgnd
  325.     add.l    #ForegroundWidth*16,d1    work out address of 16 scanlines
  326.     add.l    #ForegroundWidth*16,d2    down 
  327.     add.l    #ForegroundWidth*16,d3
  328.     clr.l    d0
  329.     move.b    (a0)+,d0        get next block number
  330.     dbf    d7,fgndloop        and repeat for all 12
  331.     rts
  332.  
  333. blitfgnd
  334.     move.l    d1,bltdpt(a6)        blit a 16x16 pixel block
  335.     move.l    d4,bltapt(a6)        into the foreground screen
  336.     move.w    #$0401,bltsize(a6)    unmasked with no shift
  337.     add.l    #32,d4
  338.     move.l    d2,bltdpt(a6)
  339.     move.l    d4,bltapt(a6)
  340.     move.w    #$0401,bltsize(a6)
  341.     add.l    #32,d4
  342.     move.l    d3,bltdpt(a6)
  343.     move.l    d4,bltapt(a6)
  344.     move.w    #$0401,bltsize(a6)
  345.     rts
  346.  
  347. setupblit
  348.     move.w    #$09f0,bltcon0(a6)        minterm for D = A
  349.     clr.w    bltcon1(a6)
  350.     clr.w    bltamod(a6)            data is stored sequentially
  351.     move.w    #ForegroundWidth-2,bltdmod(a6)
  352.     rts
  353.  
  354. **************************************************************************
  355.  
  356. buildbackgnd
  357.     lea    rasters(a5),a0
  358.     move.l    (a0),a1            get the background plane pointers
  359.     move.l    4(a0),a2        in a1-a4 (double buffered so 2 sets)
  360.     move.l    24(a0),a3        background graphics are only 4 colour
  361.     move.l    28(a0),a4        (2 planes) so third plane is ignored
  362.     addq    #4,a1            skip the hidden words used for
  363.     addq    #4,a2            clipping
  364.     addq    #4,a3
  365.     addq    #4,a4
  366.     move.l    #backgroundtable,a0    a0 = the background map
  367.     move.w    level.number(a5),d0
  368.     mulu    #144,d0            144 bytes per background map
  369.     add.w    d0,a0
  370.     moveq    #11,d0            12 blocks high
  371. build1    moveq    #11,d1            24 blocks across
  372.     movem.l    a1-a4,-(sp)
  373. build2    move.b    (a0),d2            this loop draws 2 across
  374.     lsr.b    #4,d2            block number stored in 4 bits
  375.     bsr    drawback
  376.     move.b    (a0)+,d2
  377.     and.b    #$f,d2
  378.     tst.w    d1
  379.     beq    skipit
  380.     bsr    drawback
  381. skipit    dbf    d1,build2        do all 24 across
  382.     movem.l    (sp)+,a1-a4
  383.     add.l    #BackgroundWidth*16,a1    next block down the way
  384.     add.l    #BackgroundWidth*16,a2
  385.     add.l    #BackgroundWidth*16,a3
  386.     add.l    #BackgroundWidth*16,a4
  387.     dbf    d0,build1        do all 12 high
  388.     move.l    #$dff000,a6
  389.     rts
  390.  
  391. drawback
  392.     lea    backgrounds,a6        a6 = the background graphics
  393.     move.w    level.number(a5),d3
  394.     mulu    #1024,d3        1024 bytes per level of background
  395.     add.w    d3,a6            graphics (16 blocks)
  396.     and.w    #$f,d2
  397.     mulu    #64,d2            64 bytes per block
  398.     add.l    d2,a6            (2 bytes x 16 high x 2 planes)
  399.     movem.l    a1-a4,-(sp)
  400.     moveq    #15,d3
  401. drawb1    move.w    (a6),(a1)        draw into both the screens
  402.     move.w    (a6),(a3)
  403.     move.w    (a6),46(a1)        
  404.     move.w    (a6),46(a3)
  405.     move.w    32(a6),(a2)
  406.     move.w    32(a6),(a4)
  407.     move.w    32(a6),46(a4)
  408.     move.w    32(a6),46(a2)
  409.     add.w    #BackgroundWidth,a1
  410.     add.w    #BackgroundWidth,a2
  411.     add.w    #BackgroundWidth,a3
  412.     add.w    #BackgroundWidth,a4
  413.     addq    #2,a6
  414.     dbf    d3,drawb1
  415.     movem.l    (sp)+,a1-a4
  416.     addq    #2,a1            next block along
  417.     addq    #2,a2
  418.     addq    #2,a3
  419.     addq    #2,a4
  420.     rts
  421.  
  422. **************************************************************************
  423.  
  424. GameInit
  425.     lea    map(pc),a0
  426.     move.l    a0,fgndpointer(a5)    set up the map index
  427.     move.w    #23,pf1count(a5)    width of the foreground in words
  428.     move.w    #24,pf2count(a5)    width of the background in words
  429.     move.w    #15,pf1scroll(a5)    initial scroll value
  430.     move.w    #15,pf2scroll(a5)
  431.  
  432.     lea    copperlist(pc),a1
  433.     lea    rasters(a5),a0
  434.     move.w    (a0),2(a1)        copy the plane adresses into the
  435.     move.w    2(a0),6(a1)        copperlist
  436.     move.w    4(a0),10(a1)
  437.     move.w    6(a0),14(a1)
  438.     move.w    8(a0),18(a1)
  439.     move.w    10(a0),22(a1)
  440.     move.w    12(a0),26(a1)
  441.     move.w    14(a0),30(a1)
  442.     move.w    16(a0),34(a1)
  443.     move.w    18(a0),38(a1)
  444.     move.w    20(a0),42(a1)
  445.     move.w    22(a0),46(a1)
  446.     addq.w    #4,6(a1)        skip the hidden words in the
  447.     addq.w    #4,14(a1)        background
  448.     addq.w    #4,22(a1)
  449.     lea    scroll.value(pc),a0
  450.     move.w    #$ff,2(a0)
  451.  
  452.     move.l    #panel+32,d0        put the address of the panel
  453.     lea    rastersplit2(pc),a1    graphics into the copper
  454.     moveq    #3,d1            the panel is 4 planes
  455. setup1    move.w    d0,6(a1)
  456.     swap    d0
  457.     move.w    d0,2(a1)
  458.     swap    d0
  459.     add.l    #1408,d0        panel size is 352x32 (1408 bytes
  460.     addq    #8,a1            per plane)
  461.     dbf    d1,setup1
  462.  
  463.     lea    level.colours(pc),a0    copy the level colours into the
  464.     lea    colours(pc),a1        copperlist
  465.     moveq    #31,d0
  466. .copy    move.w    (a0)+,2(a1)
  467.     addq    #4,a1
  468.     dbf    d0,.copy
  469.  
  470.     lea    panel.colours(pc),a0    copy the panel colours into the
  471.     lea    colours2(pc),a1        copperlist
  472.     moveq    #15,d0
  473. .copy2    move.w    (a0)+,2(a1)
  474.     addq    #4,a1
  475.     dbf    d0,.copy2
  476.  
  477.     bsr    clear.screen
  478.     bsr    buildbackgnd        and draw the background
  479.     rts
  480.  
  481.  
  482. clear.screen
  483.     move.l    rasters(a5),a0        clear all the screen memory
  484.     move.w    #MemNeeded/4-1,d0
  485. clear.scr1
  486.     clr.l    (a0)+
  487.     dbf    d0,clear.scr1
  488.     rts
  489.  
  490. **************************************************************************
  491.  
  492.  
  493. clist        DC.W    $0A01,$FF00
  494. copperlist    DC.W    bplpt+0,$0000,bplpt+2,$0000
  495.         DC.W    bplpt+8,$0000,bplpt+10,$0000
  496.         DC.W    bplpt+16,$0000,bplpt+18,$0000
  497.         DC.W    bplpt+4,$0000,bplpt+6,$0000
  498.         DC.W    bplpt+12,$0000,bplpt+14,$0000
  499.         DC.W    bplpt+20,$0000,bplpt+22,$0000
  500.         DC.W    bplcon0,$6600
  501. scroll.value    DC.W    bplcon1,$00FF,bpl1mod,$0036
  502.         DC.W    bpl2mod,$002E,bplcon2,$0044
  503.         DC.W    ddfstrt,$0028,ddfstop,$00D8
  504.         DC.W    diwstrt,$1F78,diwstop,$FFC6
  505. colours        DC.W    color+0,$0000,color+2,$0000
  506.         DC.W    color+4,$0000,color+6,$0000
  507.         DC.W    color+8,$0000,color+10,$0000
  508.         DC.W    color+12,$0000,color+14,$0000
  509.         DC.W    color+16,$0000,color+18,$0000
  510.         DC.W    color+20,$0000,color+22,$0000
  511.         DC.W    color+24,$0000,color+26,$0000
  512.         DC.W    color+28,$0000,color+30,$0000
  513.         DC.W    color+32,$0000,color+34,$0000
  514.         DC.W    color+36,$0000,color+38,$0000
  515.         DC.W    color+40,$0000,color+42,$0000
  516.         DC.W    color+44,$0000,color+46,$0000
  517.         DC.W    color+48,$0000,color+50,$0000
  518.         DC.W    color+52,$0000,color+54,$0000
  519.         DC.W    color+56,$0000,color+58,$0000
  520.         DC.W    color+60,$0000,color+62,$0000
  521.  
  522. sprite        DC.W    sprpt+0,$0000,sprpt+2,$0000
  523.         DC.W    sprpt+4,$0000,sprpt+6,$0000
  524.         DC.W    sprpt+8,$0000,sprpt+10,$0000
  525.         DC.W    sprpt+12,$0000,sprpt+14,$0000
  526.         DC.W    sprpt+16,$0000,sprpt+18,$0000
  527.         DC.W    sprpt+20,$0000,sprpt+22,$0000
  528.         DC.W    sprpt+24,$0000,sprpt+26,$0000
  529.         DC.W    sprpt+28,$0000,sprpt+30,$0000
  530.  
  531.         DC.W    $DF01,$FF00
  532.         DC.W    bplcon1,$0000,bplcon0,$4200,ddfstrt,$0030
  533. rastersplit2    DC.W    bplpt+0,$0000,bplpt+2,$0000
  534.         DC.W    bplpt+4,$0000,bplpt+6,$0000
  535.         DC.W    bplpt+8,$0000,bplpt+10,$0000
  536.         DC.W    bplpt+12,$0000,bplpt+14,$0000
  537. colours2    DC.W    color+20,$0000,color+30,$0000
  538.         DC.W    color+2,$0000,color+4,$0000
  539.         DC.W    color+6,$0000,color+8,$0000
  540.         DC.W    color+10,$0000,color+12,$0000
  541.         DC.W    color+14,$0000,color+16,$0000
  542.         DC.W    color+18,$0000,color+22,$0000
  543.         DC.W    color+24,$0000,color+26,$0000
  544.         DC.W    color+28,$0000,color+0,$0000
  545.         DC.W    bpl1mod,$0000,bpl2mod,$0000
  546.         DC.W    $DF01,$FF00,intreq,$8010
  547.         DC.W    $FFFF,$FFFE
  548.  
  549.  
  550. panel.colours    DC.W    $0600,$0333,$0fb3,$0d00,$0b00,$0720,$0fc2,$0c90
  551.         DC.W    $0a40,$0eb0,$0eca,$0456,$0577,$0252,$0444,$0000
  552.  
  553.     rsreset
  554. screen.num    RS.B    1    
  555. vcount        RS.B    1    vertcal blank counter
  556.  
  557. pf1count    RS.W    1    number of background words to scroll
  558. pf2count    RS.W    1    number of foreground words to scroll
  559. pf1scroll    RS.W    1    pixel scroll value (0-15) background
  560. pf2scroll    RS.W    1    pixel scroll value (0-15) foreground
  561. pf1scroll2    RS.W    1
  562. pf2offset    RS.W    1
  563. screenend    RS.W    1
  564. level.end    RS.W    1
  565. level.number    RS.W    1
  566.  
  567. fgndpointer    RS.L    1    foreground map pointer
  568. displayraster    RS.L    6    holds the addresses of the planes
  569. rasters     RS.L    9    updated plane addresses
  570.  
  571. vars.length    RS.B    0
  572. variables    DS.B    vars.length
  573.  
  574. backgroundtable    DC.W    $0123,$0123,$0123,$0123,$0123,$0123 background
  575.         DC.W    $4567,$4567,$4567,$4567,$4567,$4567 map
  576.         DC.W    $89AB,$89AB,$89AB,$89AB,$89AB,$89AB
  577.         DC.W    $0123,$0123,$0123,$0123,$0123,$0123
  578.         DC.W    $4567,$4567,$4567,$4567,$4567,$4567
  579.         DC.W    $89AB,$89AB,$89AB,$89AB,$89AB,$89AB
  580.         DC.W    $0123,$0123,$0123,$0123,$0123,$0123
  581.         DC.W    $4567,$4567,$4567,$4567,$4567,$4567
  582.         DC.W    $89AB,$89AB,$89AB,$89AB,$89AB,$89AB
  583.         DC.W    $0123,$0123,$0123,$0123,$0123,$0123
  584.         DC.W    $4567,$4567,$4567,$4567,$4567,$4567
  585.         DC.W    $89AB,$89AB,$89AB,$89AB,$89AB,$89AB
  586.  
  587. backgrounds    DC.W  $1430,$0C30,$0C10,$0413,$8403,$4442,$2142,$3120
  588.         DC.W  $3110,$2810,$141C,$1417,$140B,$0C71,$0A00,$DC08
  589.         DC.W  $8A08,$9208,$0229,$8208,$4244,$2221,$12A1,$0891
  590.         DC.W  $0888,$148A,$0A03,$2A48,$8A44,$9208,$8524,$2204
  591.  
  592.         DC.W  $0210,$0230,$1118,$0118,$8128,$414C,$314C,$10CA
  593.         DC.W  $1005,$1013,$5103,$31C3,$5023,$D011,$3018,$6304
  594.         DC.W  $0129,$0908,$0884,$0884,$4294,$22A2,$08A2,$0825
  595.         DC.W  $0842,$0908,$2880,$C824,$2890,$2808,$0904,$1092
  596.  
  597.         DC.W  $0300,$4220,$0461,$0451,$0850,$08C8,$38C8,$1848
  598.         DC.W  $0848,$0848,$0848,$08C8,$0148,$1050,$E060,$4041
  599.         DC.W  $2084,$2110,$2210,$0228,$0429,$1424,$0424,$0424
  600.         DC.W  $8424,$8424,$8424,$8424,$80A4,$8828,$1011,$2420
  601.  
  602.         DC.W  $1430,$0C08,$0800,$0413,$8083,$4442,$2242,$2120
  603.         DC.W  $2110,$2810,$040C,$1487,$104B,$0C71,$0A10,$D908
  604.         DC.W  $8A08,$9000,$042D,$8008,$4244,$2221,$1121,$0091
  605.         DC.W  $0888,$048A,$0A03,$2240,$8220,$9208,$8124,$2004
  606.  
  607.         DC.W  $7028,$6218,$8218,$C208,$C210,$C210,$6420,$2420
  608.         DC.W  $4820,$4820,$8843,$0882,$108C,$2118,$2220,$4421
  609.         DC.W  $0914,$1104,$4104,$2504,$2508,$2508,$9250,$1250
  610.         DC.W  $2450,$2410,$4420,$8441,$0840,$1080,$1110,$A210
  611.  
  612.         DC.W  $C60C,$C60A,$4609,$2209,$A201,$A223,$9011,$901F
  613.         DC.W  $900C,$8C18,$0620,$060F,$0213,$0404,$1405,$1419
  614.         DC.W  $2102,$2105,$2104,$5104,$5124,$5110,$4908,$4900
  615.         DC.W  $4902,$4204,$8912,$0900,$2508,$0212,$4A02,$EA04
  616.  
  617.         DC.W  $0080,$0100,$0110,$0918,$0A14,$0A33,$8A31,$0621
  618.         DC.W  $0220,$8204,$8204,$860D,$860A,$8A0C,$0108,$0101
  619.         DC.W  $4940,$0888,$8888,$8484,$852A,$8508,$4508,$8110
  620.         DC.W  $4911,$4902,$490A,$4102,$4905,$4502,$8084,$9088
  621.  
  622.         DC.W  $7028,$4318,$8298,$C248,$8250,$C210,$6120,$20A0
  623.         DC.W  $5820,$4820,$8813,$188A,$108C,$2100,$2220,$4421
  624.         DC.W  $0914,$1004,$4144,$2504,$4528,$2528,$9290,$1010
  625.         DC.W  $2010,$2410,$4428,$8405,$0842,$1080,$1100,$A210
  626.  
  627.         DC.W  $8820,$0440,$0204,$1202,$8221,$8220,$8300,$8410
  628.         DC.W  $C080,$0180,$20C0,$6040,$7060,$31A1,$2820,$2820
  629.         DC.W  $4410,$8A24,$0122,$8921,$4910,$4110,$4090,$4208
  630.         DC.W  $2448,$8048,$1020,$1220,$0910,$0850,$9492,$1412
  631.  
  632.         DC.W  $CE02,$4A02,$5402,$0442,$0844,$9048,$E148,$4150
  633.         DC.W  $23A0,$31C4,$3185,$3842,$2820,$11A0,$23A0,$6322
  634.         DC.W  $0101,$2501,$2A01,$9221,$9422,$68A4,$10A4,$A0A8
  635.         DC.W  $1050,$0822,$0842,$04A1,$1412,$8850,$5051,$1091
  636.  
  637.         DC.W  $3100,$11C0,$10C1,$10E1,$4862,$8850,$9850,$88F0
  638.         DC.W  $E830,$7031,$0028,$8248,$4088,$4018,$2018,$3018
  639.         DC.W  $0881,$0821,$0820,$0810,$2411,$5429,$44A9,$4408
  640.         DC.W  $0408,$0808,$8114,$4124,$2144,$2104,$1224,$0844
  641.  
  642.         DC.W  $C820,$4440,$2204,$1002,$8225,$8224,$8308,$8418
  643.         DC.W  $C980,$1188,$20C4,$6040,$6260,$2121,$2820,$2820
  644.         DC.W  $0410,$AA24,$1122,$8921,$4912,$0110,$4094,$4380
  645.         DC.W  $2448,$8844,$1020,$1220,$0110,$0850,$9492,$1412
  646.  
  647. level.colours
  648.         DC.W    $0332,$0055,$0543,$0000,$0000,$0000,$0000,$0000
  649.         DC.W    $0000,$0F55,$0B05,$0700,$08A7,$0182,$0065,$0055
  650.         DC.W    $0000,$0FF6,$0000,$0FD0,$0A00,$0BDF,$06AF,$004F
  651.         DC.W    $0FFF,$0CDD,$0ABB,$0798,$0587,$0465,$0243,$0E32
  652.  
  653.  
  654. *******************************************************************************
  655. *******************************************************************************
  656.  
  657. finished
  658.     bsr    FreeSystem
  659.  
  660. MemError    move.l    _SysBase,a6
  661.     move.l    MemBase,a1
  662.     move.l    #MemNeeded,d0        free the memory we took
  663.     jsr    _LVOFreeMem(a6)
  664.     move.l    GraphicsBase,a1    
  665.     jsr    _LVOCloseLibrary(a6)
  666.     move.l    DOSBase,a1        finally close the 
  667.     jsr    _LVOCloseLibrary(a6)    libraries
  668.     clr.l    d0
  669.     rts
  670.  
  671. *******************************************************************************
  672.  
  673. TakeSystem
  674.     move.w    intenar(a6),SystemInts        save system interupts
  675.     move.w    dmaconr(a6),SystemDMA        and DMA settings
  676.     move.w    #$7fff,intena(a6)        kill everything!
  677.     move.w    #$7fff,dmacon(a6)
  678.     move.b    #%01111111,ICRA            kill keyboard
  679.     move.l    $68,Level2Vector        save these interrupt vectors
  680.     move.l    $6c,Level3Vector        as we will use our own 
  681.     rts                    keyboard & vblank routines
  682.  
  683. FreeSystem
  684.     move.l    Level2Vector,$68    restore the system vectors
  685.     move.l    Level3Vector,$6c        and interrupts and DMA
  686.     move.l    GraphicsBase,a1            and replace the system
  687.     move.l    SystemCopper1(a1),Hardware+cop1lc    copper list
  688.     move.l    SystemCopper2(a1),Hardware+cop2lc
  689.     move.w    SystemInts,d0
  690.     or.w    #$c000,d0
  691.     move.w    d0,intena(a6)
  692.     move.w    SystemDMA,d0
  693.     or.w    #$8100,d0
  694.     move.w    d0,dmacon(a6)
  695.     move.b    #%10011011,ICRA    keyboard etc back on
  696.     rts
  697.  
  698. *******************************************************************************
  699.  
  700. Level2Vector        dc.l    0
  701. Level3Vector        dc.l    0
  702. SystemInts        dc.w    0
  703. SystemDMA        dc.w    0
  704. MemBase            dc.l    0
  705. DOSBase            dc.l    0
  706. GraphicsBase        dc.l    0
  707.  
  708.     even
  709. GraphicsName    dc.b    'graphics.library',0
  710.     even
  711. DOSName        dc.b    'dos.library',0
  712.  
  713.  
  714. *******************************************************************************
  715. * The following incbin`s read the raw Menace graphics in from the current
  716. * directory. They will need changing if the Menace graphics are within a 
  717. * different directory. If you are assembling from our coverdisk, add the
  718. * pathname `CoverDisk#08:DaveJones/` to the start of each.
  719. *                                - Jason
  720. *******************************************************************************
  721.  
  722. graphics    incbin    foregrounds
  723. map        incbin    map
  724. panel        incbin    panel
  725.  
  726.     end
  727.  
  728.