home *** CD-ROM | disk | FTP | other *** search
/ No Fragments Archive 10: Diskmags / nf_archive_10.iso / MAGS / STFORMAT / STF23.MSA / SIDE_2_MOLYNEU2_SPRITES.S < prev    next >
Text File  |  1991-04-05  |  21KB  |  786 lines

  1. *****************************************************************************
  2. *     oo                        SPRITE AND JOYSTICK DEMO                  oo    *
  3. *  \(  )/           GLENN CORPES BULLFROG PRODUCTIONS 5/4/91         \(  )/    *
  4. *  ^ ^^ ^           SET YOUR TAB SIZE TO 4 !!!!!!!!!!!!             ^ ^^ ^  *
  5. *          OTHERWISE IT WILL LOOK LIKE A TOTAL MESS !!!!!!!!!!!                *
  6. *****************************************************************************
  7. *                    Hardware Regs & system variables                       *
  8. *****************************************************************************
  9. REZ            equ    $ffff8260                resolution
  10. H_PAL          equ $ffff8240                palette
  11. KB_CONTROL    equ    $fffffc00                keyboard control
  12. KB_DATA        equ $fffffc02                keyboard data
  13.  
  14. VBI            equ    $70                        vertical blank interupt
  15.  
  16. KB_SPACE    equ $39                        key code for space
  17. *****************************************************************************
  18. *                              Dos functions                                *
  19. *****************************************************************************
  20. PRINTLINE    equ    $9
  21. FOPEN        equ $3d
  22. FCLOSE        equ    $3e
  23. FREAD        equ    $3f
  24. *****************************************************************************
  25. *                              sprite stuff                                 *
  26. *****************************************************************************
  27. QUIF_LEFT_START        equ    0
  28. QUIF_LEFT_END        equ 3
  29. QUIF_RIGHT_START    equ 4
  30. QUIF_RIGHT_END        equ 7
  31. QUIF_DEATH_START    equ    8
  32. QUIF_DEATH_END        equ    15
  33. GUMBO_LEFT_START    equ 16
  34. GUMBO_LEFT_END        equ 19
  35. GUMBO_RIGHT_START    equ 20
  36. GUMBO_RIGHT_END        equ 23
  37. TEDDY_LEFT_START    equ    24
  38. TEDDY_LEFT_END        equ    27
  39. TEDDY_RIGHT_START    equ    28
  40. TEDDY_RIGHT_END        equ 31
  41. EXPLODE1_START        equ    32
  42. EXPLODE1_END        equ    35
  43. EXPLODE2_START        equ    36
  44. EXPLODE2_END        equ    39
  45.  
  46. MAX_SPEED            equ 16
  47. *****************************************************************************
  48. *            This is about the cleanest startup I can think of              *
  49. *****************************************************************************
  50. start
  51.     clr.l    -(sp)                        OS startup stuff
  52.     move.w    #$20,-(sp)
  53.     trap    #1                           stick it in supervisor mode
  54.     addq.l    #6,sp
  55.     move.l    d0,old_ssp
  56.     move.w    #3,-(sp)                    logbase to find the screen
  57.     trap    #14
  58.     addq.l    #2,sp
  59.     move.l    d0,_d_screen                currently displayed screen
  60.     move.l    d0,old_screen
  61.     move.l    #w_screen,d0
  62.     addi.l    #256,d0                        ensure it's on a 256 byte boundry
  63.     andi.l    #$ffffff00,d0
  64.     move.l    d0,_w_screen                and you have another screen
  65.     move.l  VBI,old_vbi                    back up the old vbi
  66.     move.l    #_vbi,VBI                    patch in the new one
  67.  
  68.     move.w    #34,-(sp)
  69.     trap    #14                            get system vectors
  70.     addq.l  #2,sp
  71.  
  72.     move.l    d0,a0                        address of system vectors
  73.     lea        24(a0),a0                    move to joystick vector
  74.     move.l  a0,j_pack_address            store the address of the vector
  75.     move.l    (a0),old_j_pack                store the old vector
  76.     move.l    #_joy_handler,(a0)            patch in the new one
  77.  
  78. js_loop
  79.     btst.b    #1,KB_CONTROL                is keyboard ready for command
  80.     beq.s   js_loop                     no, loop
  81.     move.b    #$15,KB_DATA                set joysick to, must request a packet mode
  82.  
  83.     bsr        _main                        yer actual program
  84.  
  85. jrs_loop
  86.     btst.b    #1,KB_CONTROL                is keyboard ready for command
  87.     beq.s   jrs_loop                    no, loop
  88.     move.b    #$8,KB_DATA                    set mouse relative mode
  89.  
  90.     move.l    j_pack_address,a0
  91.     move.l    old_j_pack,(a0)                put the old joystick handler back
  92.  
  93.     move.l  old_vbi,VBI
  94.     move.l    old_ssp,sp                    clean exit
  95.  
  96.     move.w    #-1,-(sp)                    res
  97.     move.l    old_screen,-(sp)            reset the screen pos
  98.     move.l    old_screen,-(sp)
  99.     move.w    #5,-(sp)
  100.     trap    #14
  101.     lea        12(sp),sp
  102.     clr.w    -(sp)
  103.     trap    #1
  104. *****************************************************************************
  105. *           Do the disc access and call _display if it was ok,              *
  106. *                   otherwise end with an error message                     *
  107. *****************************************************************************
  108. _main
  109.     lea        spr32_fname,a0                the sprite file name
  110.     lea        _spr_32,a1                    the address to load the file to
  111.     move.l    #256*10*32,d0                the size of the file
  112.     jsr     _load_file                    read 32*32 sprites
  113.     blt.s    error_end
  114.  
  115.         move.b  REZ,old_rez                store the old resolution
  116.         move.b    #0,REZ                    whack it into lo rez
  117.         movem.l    H_PAL,d0-d7
  118.         movem.l    d0-d7,old_pal
  119.         movem.l    palette,d0-d7            how to set the palette in 2 instructions
  120.         movem.l    d0-d7,H_PAL                but remember, it trashes all data regs
  121.  
  122.         bsr        _display                the main game loop
  123.  
  124.            movem.l    old_pal,d0-d7
  125.         movem.l    d0-d7,H_PAL
  126.         move.b    old_rez,REZ                stick it back in original mode
  127.  
  128. error_end
  129.     rts
  130. *****************************************************************************
  131. *                      The main loop of the program                         *
  132. *****************************************************************************
  133. _display
  134.     bsr        _init_player
  135. disploop
  136.         bsr        _wait_vbi                wait for the vbi
  137.         move.l    _w_screen,a0
  138.         bsr        _clear_screen            clear the screen
  139.  
  140. **************************** draw the sprites *******************************
  141.  
  142. ;        bsr        _draw_sprites
  143.         movem.w    player_xy,d0/d1
  144.         asr.w    #2,d0
  145.         asr.w    #2,d1
  146.         move.w    player_frame,d2
  147.         bsr     _spr3232
  148.  
  149. ****************************** flip screens *********************************
  150.  
  151.         bsr        _swap_screens
  152.  
  153. *********** now do any non graphic work like moving the sprites *************
  154.  
  155.         bsr        _move_player
  156.  
  157.         cmp.b    #KB_SPACE,KB_DATA            is space bar pressed ?
  158.         beq.s   exit_display                yes, exit!
  159.  
  160. ******************* force a joystick interupt to occur **********************
  161. jr_loop
  162.         btst.b    #1,KB_CONTROL                is keyboard ready for command
  163.         beq.s   jr_loop                     no, loop
  164.         move.b    #$16,KB_DATA                request a joystick packet
  165.         bra        disploop
  166.  
  167. exit_display
  168.     rts
  169. *****************************************************************************
  170. _init_player
  171.     move.w    #GUMBO_RIGHT_START,player_frame
  172.     rts
  173. *****************************************************************************
  174. _move_player
  175.     movem.w    dxy_joy,d0/d1                        get joystick directions
  176.     movem.w    player_data,d2/d3/d4/d5/d6
  177.     moveq    #0,d7                               clear animation flag
  178.  
  179. ; d2 = x, d3 = y, d4 = vx, d5 = vy, d6 = frame
  180. ;
  181. ;    x & y coordinates are stored *4 to make the momentum work
  182. ;
  183.     tst.w    d0                                    joystick x moving?
  184.     bne.s    xjoy_moving                            yes
  185.  
  186.     tst.w    d4                                    any x vel?
  187.     beq.s    p_xmove_done                        no, so dont move
  188.     bpl.s    p_xvpos
  189.         addq.w    #2,d4                            negative slowdown
  190. p_xvpos
  191.         subq.w    #1,d4                           slow down
  192.  
  193. xjoy_moving
  194.         add.w    d0,d4                           adjust x vel
  195.         cmp.w    #MAX_SPEED,d4
  196.         ble.s    p_xv_adj_done                    dont go above max right speed
  197.             moveq    #MAX_SPEED,d4
  198.             bra.s    p_xadj_done
  199. p_xv_adj_done
  200.         cmp.w    #-MAX_SPEED,d4
  201.         bge.s    p_xadj_done                        dont go above max left speed
  202.             moveq    #-MAX_SPEED,d4
  203. p_xadj_done
  204.         moveq    #1,d7                            set animation flag
  205. p_xmove
  206.         add.w    d4,d2                            adjust x
  207. p_xmove_done
  208.     tst.w    d1                                    joystick y moving?
  209.     bne.s    yjoy_moving                            yes
  210.  
  211.     tst.w    d5                                    any y vel?
  212.     beq.s    p_ymove_done                        no, so dont move
  213.     bpl.s    p_yvpos
  214.         addq.w    #2,d5                            negative slowdown
  215. p_yvpos
  216.         subq.w    #1,d5                           slow down
  217.  
  218. yjoy_moving
  219.         add.w    d1,d5                           adjust y vel
  220.         cmp.w    #MAX_SPEED,d5
  221.         ble.s    p_yv_adj_done                    dont go above max down speed
  222.             moveq    #MAX_SPEED,d5
  223.             bra.s    p_yadj_done
  224. p_yv_adj_done
  225.         cmp.w    #-MAX_SPEED,d5
  226.         bge.s    p_yadj_done                        dont go above max up speed
  227.             moveq    #-MAX_SPEED,d5
  228. p_yadj_done
  229.         moveq    #1,d7                            set animation flag
  230. p_ymove
  231.         add.w    d5,d3                            adjust y
  232. p_ymove_done
  233.  
  234.     tst.w    d0                                    joy x
  235.     beq.s    no_reframe
  236.     bmi.s   reframe_left
  237.         and.w   #%11,d6                            just keep animation count
  238.         or.w    #GUMBO_RIGHT_START,d6            face right
  239.         bra.s    no_reframe
  240. reframe_left
  241.         and.w   #%11,d6                            just keep animation count
  242.         or.w    #GUMBO_LEFT_START,d6
  243. no_reframe
  244.     tst.w    d7
  245.     beq.s    p_no_anim
  246.         move.w  player_delay,d7
  247.         addq.w    #1,d7
  248.         and.w    #%11,d7
  249.         move.w    d7,player_delay
  250.         tst.w    d7
  251.         bne        p_no_anim
  252.             move.w    d6,d7
  253.             addq.w    #1,d7                            inc anim
  254.             and.w    #%00000011,d7
  255.             and.w    #%11111100,d6
  256.             or.w    d7,d6
  257. p_no_anim
  258.     tst.w    d2                                    keep x coord on screen
  259.     bpl.s    xnotneg
  260.         moveq    #0,d2
  261. xnotneg
  262.     cmp.w    #(320-32)*4,d2
  263.     ble.s    xnotpos
  264.         move.w    #(320-32)*4,d2
  265. xnotpos
  266.     tst.w    d3                                    keep y coord on screen
  267.     bpl.s    ynotneg
  268.         moveq    #0,d3
  269. ynotneg
  270.     cmp.w    #(200-32)*4,d3
  271.     ble.s    ynotpos
  272.         move.w    #(200-32)*4,d3
  273. ynotpos
  274.     movem.w        d2/d3/d4/d5/d6,player_data        put the data back
  275.     rts
  276. *****************************************************************************
  277. ; a0-> screen to clear, this is the quickest way I can think of to clear screen
  278. ; if you can think of a better way, please tell me!
  279. _clear_screen
  280.  
  281. ;   move to end of screen, as 'movem.l d1-d7/a1-a6,(a0)+' is an illegal
  282. ;    addressing mode we have to clear the screen backwards!
  283.  
  284.     lea        32000(a0),a0
  285.     moveq    #0,d1            clear 13 registers
  286.     moveq    #0,d2
  287.     moveq    #0,d3
  288.     moveq    #0,d4
  289.     moveq    #0,d5
  290.     moveq    #0,d6
  291.     moveq    #0,d7
  292.     move.l    d1,a1
  293.     move.l    d1,a2
  294.     move.l    d1,a3
  295.     move.l    d1,a4
  296.     move.l    d1,a5
  297.     move.l    d1,a6
  298. ;    we can clear 13*4   (52) bytes in one go
  299. ;    615 * 52 is 31980,  20 bytes short of the screen size
  300. ;    615/3 = 205            as we are gonna do 3 in the loop
  301.     move.w    #205-1,d0        loop counter, -1 coz of the way dbra works
  302. cs_loop
  303.         movem.l    d1-d7/a1-a6,-(a0)    do it
  304.         movem.l    d1-d7/a1-a6,-(a0)   3 times for a
  305.         movem.l    d1-d7/a1-a6,-(a0)    very minor speedup
  306.         dbra    d0,cs_loop
  307.     movem.l d1-d5,-(a0)        do the odd 20 bytes (5 regs)
  308.     rts
  309. *****************************************************************************
  310. ; this routine waits until the vertical blank interupt has occured
  311. _wait_vbi
  312.     tst.b    _vbi_done
  313.     beq.s   _wait_vbi
  314.     rts
  315. *****************************************************************************
  316. ; very simple vertical blank routine, it just flags that it has happened
  317. _vbi
  318.     st        _vbi_done
  319.     rte
  320. *****************************************************************************
  321. _joy_handler
  322.     move.w    d0,-(sp)
  323.     clr.w    d0
  324. ;    move.b    (a0),d0            include this line if you want 2 joysticks
  325.     move.b    1(a0),d0        F...RLDU
  326.     add.b    d0,d0            ...RLDU.    *2 for the lookup table
  327.     scs        fire            set fire to true if it bit 7 was set
  328.     add.b    d0,d0            ..RLDU..
  329.     move.l    jlt(pc,d0.w),dxy_joy
  330.     move.w    (sp)+,d0
  331.     rts
  332. ;            dx dy            the bits    imposible cases
  333. jlt    dc.w     0,0            ..0000..
  334.     dc.w     0,-1            ..000U..
  335.     dc.w     0,1            ..00D0..
  336.     dc.w     0,0            ..00DU..    *
  337.     dc.w    -1,0            ..0L00..
  338.     dc.w    -1,-1            ..0L0U..
  339.     dc.w    -1,1            ..0LD0..
  340.     dc.w    -1,0            ..0LDU..    *
  341.     dc.w     1,0            ..R000..
  342.     dc.w     1,-1            ..R00U..
  343.     dc.w     1,1            ..R0D0..
  344.     dc.w     1,0            ..R0DU..    *
  345.     dc.w     0,0            ..RL00..    *
  346.     dc.w     0,-1            ..RL0U..    *
  347.     dc.w     0,1            ..RLD0..    *
  348.     dc.w     0,0            ..RLDU..    *
  349. *****************************************************************************
  350. _swap_screens
  351.     move.l    _w_screen,d0            d0 = screen address
  352.     move.l    _d_screen,_w_screen
  353.     move.l    d0,_d_screen            d0 = xxxx high low    0000
  354.  
  355.     lsr.w    #8,d0
  356.     move.l    d0,$ffff8200.w            d0 = xxxx high xxxx low
  357.     sf        _vbi_done
  358.     rts
  359. *****************************************************************************
  360. ; d0 = x, d1 = y, d2 = sprite number
  361. _spr3232
  362.     move.l    _w_screen,a0        draw on _w_screen
  363.     lea        _spr_32,a1
  364.     mulu    #640,d2                size of a 32*32 sprite
  365.     add.w    d2,a1
  366.     moveq    #32,d2
  367.     bsr        _s32_draw
  368.     rts
  369. *****************************************************************************
  370. *    16 pixel wide sprite draw                                                *
  371. *    d0.w = QX                                                                *
  372. *    d1.w = QY                                                                *
  373. *    d2.w = sprite height                                                    *
  374. *   a0 -> screen                                                             *
  375. *    a1    -> the sprite data                                                    *
  376. *****************************************************************************
  377. LINES_HIGH    set    200
  378. _s16_draw
  379.     tst.w    d1                    is y less than 0
  380.     bge.s    y_not_minus_16        no, ok.
  381. *****************************************************************************
  382. *    QY is negative
  383.     neg.w    d1
  384.     sub.w    d1,d2                do we see any of it ?
  385.     ble        not_drawn_16        no, dont draw it at all
  386. ; a 16 pixel wide sprite has 10 bytes a line, so we have to multiply by 10
  387.     add.w    d1,d1                *2
  388.     move.w    d1,d7
  389.     add.w    d1,d1                *4
  390.     add.w    d1,d1                *8
  391.     add.w    d7,d1                In2Data and QY are the same reg
  392.     adda.w    d1,a1                move into the source the required no. of line
  393.     bra.s    y_clipped_16
  394. *********
  395. y_not_minus_16
  396.     moveq    #256-LINES_HIGH,d6
  397.     neg.b    d6                    quicker than move.w #LINES_HIGH,d6
  398.     cmp.w    d6,d1
  399.     bge     not_drawn_16
  400.     move.w    d1,d7
  401.     add.w    d7,d7                *2
  402.     add.w    d7,d7                *4
  403.     add.w    d1,d7                *5
  404.     lsl.w    #5,d7                *5*32 (28 clock cycles, less than 70 for *160
  405.     adda.w    d7,a0                move down the screen
  406.     add.w    d2,d1
  407.     subi.w    #LINES_HIGH,d1
  408.     blt.s    y_clipped_16
  409.     sub.w    d1,d2                adjust height of sprite to fit it on
  410. y_clipped_16
  411. *****************************************************************************
  412. *    I suppose I better do the QX stuff now
  413.     tst.w    d0
  414.     bge.s    x_not_minus_16        x ok, well at least it isn't negative!
  415.     cmpi.w    #-16,d0
  416.     ble.s    not_drawn_16        it is off screen
  417.     moveq    #0,d1
  418.     bra        _left_16
  419. x_not_minus_16
  420.     move.w    d0,d7
  421.     andi.w    #$f,d0                QX and QShift are the same Reg
  422.  
  423. * we want . . . 0-15 ->0, 16-31->8 etc.........
  424.  
  425.     andi.w    #$fff0,d7
  426.     lsr.w    #1,d7
  427.     moveq    #256-160,d6
  428.     neg.b    d6
  429.     cmp.w    d6,d7                is it off the right side of the screen ?
  430.     bge.s    not_drawn_16        yes
  431.     adda.w    d7,a0                adjust destination
  432.     subq.w    #8,d6
  433.     cmp.w    d6,d7
  434.     bne        _all_16
  435.  
  436. *    right hand only case
  437.  
  438.     moveq    #0,d1
  439.     bra        _right_16
  440. not_drawn_16
  441.     rts
  442.  
  443. *****************************************************************************
  444. *    32 pixel wide sprite draw                                                *
  445. *    d0.w = QX                                                                *
  446. *    d1.w = QY                                                                *
  447. *    d2.w = sprite height                                                    *
  448. *   a0 -> screen                                                             *
  449. *    a1    -> the sprite data                                                    *
  450. *****************************************************************************
  451. _s32_draw
  452.     tst.w    d1                    is y less than 0
  453.     bge.s    y_not_minus_32        no, ok.
  454. *****************************************************************************
  455. *    QY is negative
  456.     neg.w    d1
  457.     sub.w    d1,d2                do we see any of it ?
  458.     ble        not_drawn_32        no, dont draw it at all
  459. ; a 32 pixel wide sprite has 20 bytes a line, so we have to multiply by 20
  460.     move.w    d1,d7
  461.     add.w    d1,d1                *2
  462.     add.w    d1,d1                *4
  463.     add.w    d7,d1                *5
  464.     add.w    d1,d1                *10
  465.     add.w    d1,d1                *20
  466.     adda.w    d1,a1                move into the source the required no. of line
  467.     bra.s    y_clipped_32
  468. *********
  469. y_not_minus_32
  470.     moveq    #256-LINES_HIGH,d6
  471.     neg.b    d6                    quicker than move.w #LINES_HIGH,d6
  472.     cmp.w    d6,d1
  473.     bge     not_drawn_32
  474.     move.w    d1,d7
  475.     add.w    d7,d7                *2
  476.     add.w    d7,d7                *4
  477.     add.w    d1,d7                *5
  478.     lsl.w    #5,d7                *5*32 (28 clock cycles, less than 70 for *160
  479.     adda.w    d7,a0                move down the screen
  480.     add.w    d2,d1
  481.     subi.w    #LINES_HIGH,d1
  482.     blt.s    y_clipped_32
  483.     sub.w    d1,d2                adjust height of sprite to fit it on
  484. y_clipped_32
  485. *****************************************************************************
  486. *    I suppose I better do the QX stuff now
  487.     tst.w    d0
  488.     bge.s    x_not_minus_32        x ok, well at least it isn't negative!
  489.     cmpi.w    #-16,d0
  490.     ble.s    may_be_32
  491.     moveq    #0,d1
  492.     bra        _left_32
  493. may_be_32
  494.     cmpi.w    #-32,d0
  495.     ble.s    not_drawn_32
  496.     moveq    #10,d1
  497.     bra        _left_16
  498. x_not_minus_32
  499.     move.w    d0,d7
  500.     andi.w    #$f,d0                QX and QShift are the same Reg
  501.  
  502. * we want . . . 0-15 ->0, 16-31->8 etc.........
  503.  
  504.     andi.w    #$fff0,d7
  505.     lsr.w    #1,d7
  506.     moveq    #256-(160-16),d6
  507.     neg.b    d6
  508.     adda.w    d7,a0                adjust destination
  509.     cmp.w    d6,d7                is it definately on screen ?
  510.     bmi        _all_32                yes
  511.     addq.w    #8,d6
  512.     moveq    #0,d1
  513.     cmp.w    d6,d7
  514.     bmi        _right_32
  515.     addq.w    #8,d6
  516.     moveq    #10,d1
  517.     cmp.w    d6,d7
  518.     bmi        _right_16
  519. not_drawn_32
  520.     rts
  521. *****************************************************************************
  522. *    The low level routines, may be useful for other stuff at some stage..    *
  523. *****************************************************************************
  524. DO_RIGHT    macro
  525.     moveq    #-1,d3
  526.     move.w    (a1)+,d3            get the QTemplate
  527.     ror.l    d0,d3                rotate it
  528.  
  529.     moveq    #0,d4
  530.     move.w    (a1)+,d4            get QPlane 0
  531.     ror.l    d0,d4                rotate it
  532.     move.w    (a0)+,d5
  533.     and.w    d3,d5
  534.     or.w    d5,d4                QPlane 0 made
  535.  
  536.     moveq    #0,d5
  537.     move.w    (a1)+,d5            get QPlane 1
  538.     ror.l    d0,d5                rotate it
  539.     move.w    (a0)+,d6
  540.     and.w    d3,d6
  541.     or.w    d6,d5                QPlane 1 made
  542.  
  543.     moveq    #0,d6
  544.     move.w    (a1)+,d6            get QPlane 2
  545.     ror.l    d0,d6                rotate it
  546.     move.w    (a0)+,d7
  547.     and.w    d3,d7
  548.     or.w    d7,d6                QPlane 0 made
  549.  
  550.     moveq    #0,d7
  551.     move.w    (a1)+,d7            get QPlane 3
  552.     ror.l    d0,d7                rotate it
  553.     and.w    (a0)+,d3            may as well corrupt the QTemplate this time
  554.     or.w    d3,d7                QPlane 3 made
  555.     endm
  556. *************
  557. DO_LEFTM    macro
  558.     swap    d3
  559.     swap    d4
  560.     move.w    (a0)+,d5
  561.     and.w    d3,d5
  562.     or.w    d5,d4                QPlane 0 made
  563.  
  564.     swap    d5
  565.     move.w    (a0)+,d6
  566.     and.w    d3,d6
  567.     or.w    d6,d5                QPlane 1 made
  568.  
  569.     swap    d6
  570.     move.w    (a0)+,d7
  571.     and.w    d3,d7
  572.     or.w    d7,d6                QPlane 2 made
  573.  
  574.     swap    d7
  575.     and.w    (a0)+,d3            corrupting QTemplate
  576.     or.w    d3,d7                QPlane 3 made
  577.     endm
  578. *******
  579. DO_LEFT macro
  580.     moveq    #-1,d3
  581.     move.w    (a1)+,d3            get the QTemplate
  582.     rol.l    d0,d3                rotate it
  583.  
  584.     move.w    (a1)+,d4            get QPlane 0
  585.     lsl.w    d0,d4                rotate it
  586.     move.w    (a0)+,d5
  587.     and.w    d3,d5
  588.     or.w    d5,d4                QPlane 0 made
  589.  
  590.     move.w    (a1)+,d5            get QPlane 1
  591.     lsl.w    d0,d5                rotate it
  592.     move.w    (a0)+,d6
  593.     and.w    d3,d6
  594.     or.w    d6,d5                QPlane 1 made
  595.  
  596.     move.w    (a1)+,d6            get QPlane 2
  597.     lsl.w    d0,d6                rotate it
  598.     move.w    (a0)+,d7
  599.     and.w    d3,d7
  600.     or.w    d7,d6                QPlane 0 made
  601.  
  602.     move.w    (a1)+,d7            get QPlane 3
  603.     lsl.w    d0,d7                rotate it
  604.     and.w    (a0)+,d3            may as well corrupt the QTemplate this time
  605.     or.w    d3,d7                QPlane 3 made
  606.     ENDM
  607. *****************************************************************************
  608. _all_16
  609. ; A0 = QSource, A1 = QDest, D0 = QShift, D2 = Height
  610.  
  611.     moveq    #256-(160-16),d1
  612.     neg.b    d1
  613.     subq.w    #1,d2                for dbra
  614. a16_loop
  615.     DO_RIGHT
  616.     movem.w d4-d7,-8(a0)        i had to get a movem in there somewhere
  617.     DO_LEFTM
  618.     movem.w d4-d7,-8(a0)        another one
  619.     adda.w    d1,a0
  620.     dbra    d2,a16_loop
  621.     rts
  622. ********************************************************************
  623. _left_16
  624. ; A0 = QSource, A1 = QDest, D0 = QShift, D1 = QSkip, D2 = Height
  625.     subq.w    #1,d2
  626.     neg.w    d0
  627.     andi.w    #$f,d0
  628. l16_loop
  629.     adda.w    d1,a1
  630.     DO_LEFT
  631.     movem.w d4-d7,-8(a0)        i had to get a movem in there somewhere
  632.     lea        160-8(a0),a0
  633.     dbra    d2,l16_loop
  634.     rts
  635. ********************************************************************
  636. _right_16
  637. ; A0 = QSource, A1 = QDest, D0 = QShift, D1 = QSkip, D2 = Height
  638.     subq.w    #1,d2
  639. r16_loop
  640.     DO_RIGHT
  641.     movem.w d4-d7,-8(a0)        i had to get a movem in there somewhere
  642.     lea        160-8(a0),a0
  643.     adda.w    d1,a1
  644.     dbra    d2,r16_loop
  645.     rts
  646.  
  647. *****************************************************************************
  648. _all_32
  649. ; A0 = QSource, A1 = QDest, D0 = QShift, D2 = Height
  650.  
  651.     moveq    #256-(160-24),d1
  652.     neg.b    d1
  653.     subq.w    #1,d2                for dbra
  654. a32_loop
  655.     DO_RIGHT
  656.     movem.w d4-d7,-8(a0)        i had to get a movem in there somewhere
  657.     DO_LEFTM
  658.     subq.l    #8,a0
  659.     movem.w d4-d7,(a0)             another one
  660.     DO_RIGHT
  661.     movem.w d4-d7,-8(a0)        i had to get a movem in there somewhere
  662.     DO_LEFTM
  663.     movem.w d4-d7,-8(a0)        another one
  664.     adda.w    d1,a0
  665.     dbra    d2,a32_loop
  666.     rts
  667. *****************************************************************************
  668. _left_32
  669. ; A0 = a1, A1 = QDest, D0 = QShift, D1 = QSkip, D2 = Height
  670.     subq.w    #1,d2
  671.     move.w    d0,d4
  672.     neg.w    d4
  673.     moveq    #$f,d5
  674.     and.w    d5,d4
  675.     and.w    d5,d0
  676.     swap    d0
  677.     move.w    d4,d0
  678. l32_loop
  679.     adda.w    d1,a1
  680.     DO_LEFT
  681.     subq.l    #8,a0
  682.     movem.w d4-d7,(a0)             i had to get a movem in there somewhere
  683.     swap    d0
  684.     DO_RIGHT
  685.     movem.w d4-d7,-8(a0)        i had to get a movem in there somewhere
  686.     DO_LEFTM
  687.     movem.w d4-d7,-8(a0)        another one
  688.     swap    d0
  689.     lea        160-16(a0),a0
  690.     dbra    d2,l32_loop
  691.     rts
  692. *****************************************************************************
  693. _right_32
  694. ; A0 = QSource, A1 = QDest, D0 = QShift, D1 = QSkip, D2 = Height
  695.     subq.w    #1,d2
  696.     andi.w    #$f,d0
  697. r32_loop
  698.     DO_RIGHT
  699.     movem.w d4-d7,-8(a0)        i had to get a movem in there somewhere
  700.     DO_LEFTM
  701.     subq.l    #8,a0
  702.     movem.w d4-d7,(a0)             another one
  703.     DO_RIGHT
  704.     movem.w d4-d7,-8(a0)        i had to get a movem in there somewhere
  705.     lea        160-16(a0),a0
  706.     adda.w    d1,a1
  707.     dbra    d2,r32_loop
  708.     rts
  709. *****************************************************************************
  710. ; a0-> filename a1-> destination d0 = length
  711. ; on return d0 = file length actually read or -1 if read failed
  712. _load_file
  713.     move.l    d0,d6
  714.     clr.w    -(sp)               read
  715.     move.l    a0,-(sp)            -> filename
  716.     move.w    #FOPEN,-(sp)
  717.     trap    #1                    open the file
  718.     addq.l    #8,sp                readjust the stack
  719.     move.w    d0,d7                handle
  720.     ble.s   file_not_found
  721. *
  722.     move.l  a1,-(sp)            destination memory
  723.     move.l    d6,-(sp)
  724.     move.w    d7,-(sp)            file handle
  725.     move.w    #FREAD,-(sp)
  726.     trap    #1                    read the file
  727.     lea        12(sp),sp            the quick way of adding 12 to the stack
  728.     move.l    d0,d6                length read
  729. *
  730.     move.w    d7,-(sp)            file handle
  731.     move.w    #FCLOSE,-(sp)
  732.     trap    #1                    close the file
  733.     addq.l    #4,sp
  734.     move.l    d6,d0                so we can return the file length
  735.     rts
  736. file_not_found
  737.     pea        fnf_msg(pc)            address of the error message
  738.     move.w    #PRINTLINE,-(sp)
  739.     trap    #1                    print it
  740.     addq.l    #6,sp
  741.     moveq    #-1,d0
  742.     rts
  743. *****************************************************************************
  744. fnf_msg        dc.b    7,'FILE NOT FOUND',10,13,7,0
  745. spr16_fname    dc.b    'sprite16.dat',0
  746. spr32_fname    dc.b    'sprite32.dat',0
  747.     even
  748. palette        dc.w    $000,$321,$432,$543,$400,$520,$630,$651
  749.             dc.w    $331,$441,$551,$661,$013,$034,$345,$555
  750. *****************************************************************************
  751.     IFD        __G2        am i using devpac 2?
  752.     section    bss            if so use this line, it saves a lot of disk space
  753.     ENDC
  754. old_rez            ds.b    1
  755. _vbi_done        ds.b    1
  756. fire            ds.b    1
  757.     even
  758. old_vbi            ds.l    1
  759. old_ssp            ds.l    1
  760. old_screen        ds.l    1
  761. _d_screen        ds.l    1
  762. _w_screen        ds.l    1
  763. j_pack_address    ds.l    1
  764. old_j_pack        ds.l    1
  765. dxy_joy
  766. dx_joy            ds.w    1
  767. dy_joy            ds.w    1
  768.  
  769. player_data
  770. player_xy
  771. player_x        ds.w    1
  772. player_y        ds.w    1
  773. player_vx        ds.w    1
  774. player_vy        ds.w    1
  775. player_frame    ds.w    1
  776. player_delay    ds.w    1
  777.  
  778. seed            ds.w    1
  779.  
  780. old_pal            ds.w    16
  781. w_screen        ds.b    32000+256    screen has to be on a 256 byte boundry
  782. _spr_32            ds.b    640*40        for 40 32*32 sprites
  783.  
  784. *
  785.  
  786.