High Noon (Amiga) original source-code. Published 160801.

The source was highlighted using GeSHi © 2004-2007 Nigel McNie, 2007-2010 Benny Baumann, 2008-2009 Milian Wolff
  1.  
  2.                 INCDIR  INCLUDE:
  3.                 INCLUDE HARDWARE/AGA_CUSTOM.I
  4.                 INCLUDE HARDWARE/DMABITS.I
  5.                 INCLUDE GRAPHICS/GFX.I
  6.                 INCDIR  DH1:DEV/RSC/
  7.                 INCLUDE VIDEO.OFFSETS
  8.  
  9. ;DEBUG
  10. ;EXEC
  11.  
  12. ; ---- GFX CONSTANTS ----
  13. SCRWIDTH        = 48
  14. SCRHEIGHT       = 200
  15. PLANE_SIZE      = SCRWIDTH*SCRHEIGHT
  16. NUMPLANES       = 4
  17. BOBHEIGHT       = 22
  18. BOBWIDTH        = 6
  19. BOBPLANE        = (BOBHEIGHT*BOBWIDTH)
  20. BOBSIZE         = (BOBPLANE*NUMPLANES)
  21. BOBSIZEFULL     = (BOBSIZE+BOBPLANE)
  22. MAXBOBS         = 13
  23.  
  24. MAXPLAYERS      = 2
  25. MAXHOOKERS      = 3
  26. MAXOUTLAWS      = 5
  27.  
  28. NUMBOBS         = 157
  29.  
  30. MAXBULLETS      = 10
  31.  
  32. ; ---- DEVICE CONSTANTS ----
  33. dev_joy0        = 0
  34. dev_joy1        = 1*4
  35. dev_cpu         = 2*4
  36. dev_none        = 3*4
  37. ; ---- device directions ----
  38. d_up            = 4
  39. d_upleft        = 8
  40. d_upright       = 12
  41. d_down          = 16
  42. d_downleft      = 20
  43. d_downright     = 24
  44. d_left          = 28
  45. d_right         = 32
  46. ; ---- directions ----
  47. di_up           = 1
  48. di_upleft       = 2
  49. di_upright      = 3
  50. di_down         = 4
  51. di_downleft     = 5
  52. di_downright    = 6
  53. di_left         = 7
  54. di_right        = 8
  55.  
  56. A EQU   %11110000
  57. B  EQU   %11001100
  58. C EQU   %10101010
  59.  
  60. FM_INITREPLAY   = 0
  61. FM_INITSONG     = 4
  62. FM_PLAYSONG     = 8
  63. FM_ENDSONG      = 12
  64. FM_PLAYSTATUS   = 16
  65. FM_PLAYSFX      = 20
  66.  
  67.  
  68. ;               -----------------------------------------------
  69. ;
  70. ;                                   HIGH NOON
  71. ;
  72. ;               -----------------------------------------------
  73. ;
  74. ;                        C64 CONVERSION BY LLOYD ROSEN
  75. ;
  76. ;                     ORIGINAL GAME © 1983 OCEAN SOFTWARE
  77. ;
  78. ;                    AMIGA VERSION © 1997 SEASONS CLASSIC!
  79. ;
  80. ;               -----------------------------------------------
  81.  
  82. ;                           ASSEMBLED WITH ASM-ONE
  83. ;
  84. ;                 DO NOT SPREAD THIS SOURCE OUTSIDE SEASONS!!
  85.  
  86.  
  87. ;               History
  88. ;               v0.10 (APR 25)
  89. ;                       - all initial things done.
  90. ;                       - arena drawn to screen
  91. ;                       - walk behind background okay.
  92. ;               v0.11 (APR 26)
  93. ;                       - zones added.
  94. ;               v0.12 (APR 27)
  95. ;                       - bullets added.
  96. ;               v0.14 (APR 28)
  97. ;                       - door open/close gfx routines added.
  98. ;                       - one outlaw added.
  99. ;               v0.16 (MAY 02)
  100. ;                       - random routine added.
  101. ;                       - the outlaw robs the bank and runs away(!)
  102. ;               v0.17 (MAY 07)
  103. ;                       - the outlaw kidnaps a hooker!
  104. ;               v0.19 (MAY 08)
  105. ;                       - lots of outlaws invades the town..
  106. ;                       - outlaws shoot.
  107. ;               v0.21 (MAY 09)
  108. ;                       - more hookers added.
  109. ;                       - bugs fixed.
  110. ;               v0.22 (MAY 10)
  111. ;                       - outlaws die when shot.
  112. ;               v0.24 (MAY 11)
  113. ;                       - some bugs fixed.
  114. ;                       - sorting routine added.
  115. ;                       - last visible shitty bug removed (located
  116. ;                         and eliminated in restore backgrounds..)
  117. ;                       - obnoxius hooker bug removed (finally! phew!)
  118. ;               v0.25 (MAY 14)
  119. ;                       - different height of bobs allowed.
  120. ;               v0.27 (MAY 18)
  121. ;                       - dynamite maniac added.
  122. ;                       - sheriff can die.
  123. ;               v0.28 (MAY 19)
  124. ;                       - many small bugs removed.
  125. ;                       - horse added.
  126. ;               v0.32 (MAY 20)
  127. ;                       - cleaned up a little - making small bugs go away
  128. ;                       - horsemen rides by
  129. ;                       - ... and shoot
  130. ;                       - snipers added. not very much left!
  131. ;               v0.36 (MAY 21)
  132. ;                       - text routines and number conversion added.
  133. ;                       - wave 5 graphics added.
  134. ;                       - wave 5 outlaws added.
  135. ;                       - even more bugs removed
  136. ;               v0.37 (MAY 22)
  137. ;                       - bonus draw sequence just about complete!
  138. ;               v0.38 (MAY 25)  DEADLINE REACHED!
  139. ;                       - music and sound effects added.
  140. ;                       - scoring, level data, wave data added.
  141. ;                       - start walking sequence added.
  142. ;               v0.39 (MAY 26)  over deadline... :-(
  143. ;                       - the game works great in 1 player mode!
  144. ;               v0.41 (MAY 27)
  145. ;                       - new, more accurate sorting routine added.
  146. ;                       - computer control modified.
  147. ;               v0.43 (MAY 29)
  148. ;                       - scoring for pl2/bugs removed
  149. ;                       - bonus draw for 2 players
  150. ;               v0.44 (MAY 30)
  151. ;                       - chunky background added. (saved lotsa memory!)
  152. ;                       - game works fine. or so it seems..
  153. ;                       - title screens added.
  154. ;               v0.45 (MAY 31)
  155. ;                       - hall of fame complete.
  156. ;                       - extra life checking added.
  157. ;               v0.46 (JUN 02)
  158. ;                       - dynamite checking added.
  159. ;                       - bugs fixed.
  160. ;                       - highscore saving/loading
  161. ;               v0.99 (JUN 02)
  162. ;                       - GAME DONE & EXECUTABLED! Serious playtesting left..
  163.  
  164.  
  165. ; DOS.LIBRARY
  166.  
  167. _LVOOPEN                = -30
  168. _LVOCLOSE               = -36
  169. _LVOREAD                = -42
  170. _LVOWRITE               = -48
  171. _LVOUNLOCK              = -90
  172. _LVOUNLOADSEG           = -156
  173.  
  174. ; EXEC.LIBRARY
  175.  
  176. _LVOFINDTASK            = -294
  177. _LVOSETTASKPRI          = -300
  178. _LVOADDINTSERVER        = -168
  179. _LVOREMINTSERVER        = -174
  180. _LVOOPENLIBRARY         = -552
  181. _LVOCLOSELIBRARY        = -414
  182. _LVOFORBID              = -132
  183. _LVOPERMIT              = -138
  184.  
  185.  
  186. ; GRAPHICS.LIBRARY
  187.  
  188. _LVOWAITBLIT            = -228
  189. _LVOOWNBLITTER          = -456
  190. _LVODISOWNBLITTER       = -462
  191. _LVOALLOCBITMAP         = -918
  192. _LVOFREEBITMAP          = -924
  193.  
  194. ; INTUTION.LIBRARY
  195.  
  196. _LVOCURRENTTIME         = -84
  197.  
  198. CALLVIDEO       MACRO
  199.                 lea     _videoresource(pc),a4
  200.                 jsr     VI_\1(a4)
  201.                 ENDM
  202.  
  203. CALL            MACRO
  204.                 jsr     _LVO\1(a6)
  205.                 ENDM
  206.  
  207. CALLGRAF        MACRO
  208.                 move.l  _gfxbase(pc),a6
  209.                 jsr     _LVO\1(a6)
  210.                 ENDM
  211.  
  212. DBUG            MACRO
  213.                 move    #$f00,$dff180
  214.                 ENDM
  215.  
  216. OUTLAWLIMIT     = MAXOUTLAWS
  217. MAXKIDNAPPERS   = 3
  218. SNIPEDELAY      = 75                    ; delay before disappearing
  219.  
  220.  
  221.                 IFD     EXEC
  222. rb_HunkStart    SUB.L   A1,A1
  223.                 MOVE.L  4.W,A6
  224.                 JSR     -294(A6)        ; FindTask
  225.                 MOVE.L  D0,A4
  226.                 MOVEQ   #0,D0
  227.                 TST.L   $AC(A4)         ; pr_CLI
  228.                 BNE.S   rb_FromCLI
  229.                 LEA     $5C(A4),A0      ; pr_MsgPort
  230.                 JSR     -384(A6)        ; WaitPort
  231.                 LEA     $5C(A4),A0
  232.                 JSR     -372(A6)        ; GetMsg
  233. rb_FromCLI      MOVE.L  D0,D7           ; D7 = WBmsg
  234.                 LEA     rb_DOSname(PC),A1
  235.                 MOVEQ   #0,D0
  236.                 JSR     -552(A6)        ; OpenLibrary
  237.                 TST.L   D0
  238.                 BEQ.S   rb_dexit
  239.                 MOVE.L  d0,dosbase
  240.                 MOVE.L  D0,A5
  241.                 EXG     A5,A6           ; A6=DOS
  242.                 MOVE.L  $98(A4),D1      ; pr_CurrentDir
  243.                 JSR     -96(A6)         ; DupLock
  244.                 MOVE.L  D0,rb_CurrentDir
  245.                 EXG     A5,A6 ; A6=exec
  246.                 JSR     -132(A6) ; Forbid
  247.                 MOVE.L  #rb_ProgName,D1
  248.                 MOVEQ.L #0,D2
  249.                 MOVE.B  9(A4),D2        ; priority
  250.                 LEA     rb_HunkStart-4(PC),A0
  251.                 MOVE.L  (A0),D3         ; Ptr to next segment
  252.                 CLR.L   (A0)            ; Unlink next segment
  253.                 MOVE.L  #4000,D4
  254.                 EXG     A5,A6           ; A6=DOS
  255.                 JSR     -138(A6)        ; CreateProc
  256.                 EXG     A5,A6           ; A6=exec
  257.                 JSR     -138(A6)        ; Permit
  258.                 MOVE.L  A5,A1
  259.                 JSR     -414(A6)        ; CloseLibrary
  260. rb_dexit        TST.L   D7
  261.                 BEQ.S   rb_exit
  262.                 JSR     -132(A6)        ; Forbid
  263.                 MOVE.L  D7,A1
  264.                 JSR     -378(A6)   nbsp;     ; ReplyMsg
  265. rb_exit         MOVEQ   #0,D0
  266.                 RTS
  267.  
  268. rb_DOSname      dc.b    "dos.library",0
  269. rb_progname     dc.b    "High Noon © 1997 Seasons",0
  270.  
  271.  
  272. ; End of runback hunk
  273.  
  274.                 SECTION ptcode,CODE
  275.  
  276. START           MOVE.L  4.W,A6
  277.                 SUB.L   A1,A1
  278.                 CALL    FindTask
  279.                 move.l  sp,_stacksave
  280.                 BSR.S   Main
  281.                 move.l  _stacksave,sp
  282.                 MOVE.L  4.W,A6
  283.                 CALL    Forbid
  284.                 MOVE.L  DOSbase,A6
  285.                 MOVE.L  rb_CurrentDir(PC),D1
  286.                 CALL    UnLock
  287.  
  288.                 LEA     START-4(PC),A0
  289.                 MOVE.L  A0,D1
  290.                 LSR.L   #2,D1
  291.                 CALL    UnLoadSeg
  292.                 MOVEQ   #0,D0
  293.                 RTS
  294.  
  295. rb_currentdir   dc.l    0
  296. ptprocess       dc.l    0
  297. _stacksave      dc.l    0
  298. dosbase         dc.l    0
  299.  
  300. ; ---- MAIN INITIALISATION ----
  301.  
  302.                 ENDIF
  303.  
  304. main            ;move.l sp,_stacksave
  305.                 bsr.w   init_all
  306.                 bsr.w   init_screenswap
  307.                 bsr.w   set_random
  308.                 bsr.w   make_boblookup
  309.                 bsr.w   allocate_bobs
  310.                 cmp     #-5,d0
  311.                 beq.w   quit
  312.                 bsr     read_highscoretable
  313.  
  314.                 lea     _musicdata,a0
  315.                 jsr     FM_INITREPLAY(a0)
  316.  
  317.                 bsr.w   set_vbintserver
  318.  
  319.  
  320.                 CALLVIDEO       HSCREENSTART            ; show hscreen
  321.  
  322.                 IFND    DEBUG
  323.                 CALLGRAF        OwnBlitter
  324.                 ENDIF
  325.  
  326.                 clr     _hiscore
  327.  
  328. go_hiscore      lea     _musicdata,a0
  329.                 moveq   #4,d0
  330.                 moveq   #0,d1
  331.                 jsr     FM_INITSONG(a0)
  332.                 bsr     enter_hiscore
  333.  
  334.                 move.b  #1,_level
  335.  
  336. ; ---- TITLE SCREEN ----
  337.  
  338. go_title        clr.b   _rawkey
  339.                 bsr     draw_title
  340.  
  341.                 lea     _musicdata,a0
  342.                 moveq   #0,d0
  343.                 moveq   #0,d1
  344.                 jsr     FM_INITSONG(a0)
  345.  
  346.                 move    #200,_dispcount
  347.                 clr.b   _titleflag
  348.  
  349.                 bsr     swap_screens
  350.                 bsr     show_screen
  351.  
  352. titlemain       bsr     get_key
  353.                 move.b  _rawkey(pc),d0
  354.                 cmp.b   #$50,d0
  355.                 beq.w   start_1player
  356.                 cmp.b   #$51,d0
  357.                 beq.w   start_2player
  358.                 cmp.b   #$45,d0
  359.                 beq     quit
  360.  
  361.                 lea     _player1(pc),a3
  362.                 bsr     read_joystick1
  363.                 tst.b   p_fire(a3)
  364.                 bne     start_1player
  365.                 lea     _player2(pc),a3
  366.                 bsr     read_joystick0
  367.                 tst.b   p_fire(a3)
  368.                 bne     start_2player
  369.  
  370.                 tst.b   _titleflag
  371.                 bne     .notitle
  372.  
  373.                 lea     _player1(pc),a3
  374.                 cmp.b   #(D_LEFT),p_joystick(a3)
  375.                 beq     decrease_level
  376.                 cmp.b   #(D_RIGHT),p_joystick(a3)
  377.                 beq     increase_level
  378.                 lea     _player2(pc),a3
  379.                 cmp.b   #(D_LEFT),p_joystick(a3)
  380.                 beq     decrease_level
  381.                 cmp.b   #(D_RIGHT),p_joystick(a3)
  382.                 beq     decrease_level
  383.  
  384. .notitle        bsr     wait_sync
  385.  
  386.                 subq    #1,_dispcount
  387.                 beq.b   .swapem
  388.  
  389.                 bra     titlemain
  390.  
  391. .swapem         move    #250,_dispcount
  392.                 bsr     swap_screens
  393.                 bsr     show_screen
  394.                 not.b   _titleflag
  395.                 bra     titlemain
  396.  
  397.  
  398.  
  399. _dispcount      dc      0
  400. _titleflag      dc.b    0,0
  401.  
  402. ; ---- DECREASE LEVEL ----
  403.  
  404. decrease_level  moveq   #10,d0
  405. .1              bsr     wait_sync
  406.                 dbf     d0,.1
  407.                 cmp.b   #1,_level
  408.                 beq.b   _no
  409.                 subq.b  #1,_level
  410.                 bra.b   _ok
  411.  
  412. ; ---- INCREASE LEVEL ----
  413.  
  414. increase_level  moveq   #10,d0
  415. .1              bsr     wait_sync
  416.                 dbf     d0,.1
  417.                 cmp.b   #9,_level
  418.                 beq.b   _no
  419.                 addq.b  #1,_level
  420. _ok             bsr     swap_screens
  421.                 bsr     print_level
  422.                 bsr     swap_screens
  423. _no             bra     titlemain
  424.  
  425. start_1player   lea     _player1(pc),a0
  426.                 move    #3,p_lives(a0)
  427.                 clr.b   _hero1dead
  428.                 st.b    _hero2dead
  429.                 move.b  #1,_numplayers
  430.                 bra.b   start_game
  431.  
  432.  
  433. start_2player   lea     _player1(pc),a0
  434.                 move    #3,p_lives(a0)
  435.                 lea     _player2(pc),a0
  436.                 move    #3,p_lives(a0)
  437.                 clr     _hero1dead
  438.                 move.b  #2,_numplayers
  439.  
  440. start_game      clr.b   _gameover
  441.                 move.b  #1,_wave
  442.                 lea     _player1(pc),a0
  443.                 clr     p_plscore(a0)
  444.                 clr     p_lifescore(a0)
  445.                 lea     _player2(pc),a0
  446.                 clr     p_plscore(a0)
  447.                 clr     p_lifescore(a0)
  448.  
  449.                 bsr.w   init_leveldata
  450.  
  451. new_wave        clr.b   _hasseenwave
  452.  
  453.                 moveq   #6,d0
  454.                 bsr.w   random
  455.                 add     #18,d0                  ; from 18 - 24 outlaws pr. wave
  456.                 move.b  d0,_mustshoot
  457.  
  458.                 bsr.w   set_wavetext
  459.  
  460. start_wave      cmp.b   #5,_wave
  461.                 bne.b   .not5
  462.                 move.b  #5,_mustshoot           ; must shoot 5 outlaws on wav5
  463.  
  464. .not5           bsr.w   init_bobstructures
  465.                 bsr.w   init_allstructs
  466.                 bsr     bullets_inactive
  467.                 bsr.w   init_wavedata
  468.  
  469.                 bsr.w   draw_arena
  470.                 bsr.w   swap_screens
  471.                 bsr.w   draw_arena
  472.  
  473.                 clr.b   _restartwave
  474.  
  475.                 bsr.w   wave_start
  476.  
  477.                 moveq   #100,d0
  478.                 bsr.w   random
  479.                 add     #50,d0
  480.                 move    d0,_outlawtimer
  481.  
  482.                 moveq   #100,d0
  483.                 bsr.w   random
  484.                 add     #50,d0
  485.                 move    d0,_snipertimer
  486.  
  487.                 move    #350,_deadcount
  488.  
  489. ;               -----------------------------------------
  490. ;
  491. ;                                MAIN LOOP
  492. ;
  493. ;               -----------------------------------------
  494.  
  495. main_loop       tst.b   _gameover
  496.                 bne     go_hiscore
  497.  
  498.                 bsr     get_key
  499.                 cmp.b   #$45,_rawkey
  500.                 beq     go_title
  501.  
  502.                 tst.b   _mustshoot
  503.                 bne.b   .ok
  504.                 cmp.b   #5,_wave
  505.                 beq.b   .nono
  506.  
  507.                 tst.b   _numoutlaws
  508.                 bne.b   .ok
  509.                 lea     _player1(pc),a0
  510.                 move.l  p_bob(a0),a0
  511.                 tst.b   bo_maskmade(a0)
  512.                 bne.b   .ok
  513.  
  514. .nono           st.b    _bonusdraw
  515.                 bra.w   bonus_draw
  516.  
  517. .ok             tst.b   _restartwave
  518.                 beq.b   .nores
  519.  
  520.                 lea     _musicdata,a0
  521.                 JSR     FM_PLAYSTATUS(a0)
  522.                 tst.b   d0
  523.                 bne.b   .nores
  524.                 bra     start_wave
  525.  
  526.  
  527. .nores          bsr.w   wait_dead5
  528.  
  529.                 bsr.w   add_outlaws
  530.                 bsr.w   add_snipers
  531.  
  532. ; ---- movements ----
  533.  
  534.                 bsr.w   update_devices
  535.  
  536. ; ---- animations ----
  537.  
  538.                 bsr.w   update_animations
  539.                 bsr.w   animate_dynahorse
  540.  
  541. ; ---- zones ----
  542.  
  543.                 tst.b   _hero1dead
  544.                 bne.b   .dontcheck
  545.                 lea     _player1(pc),a3
  546.                 bsr.w   get_zone
  547.                 bsr.w   check_top
  548.                 bsr.w   set_walklimitations
  549.                 bsr.w   check_walklimitations
  550.  
  551. .dontcheck      cmp.b   #2,_numplayers
  552.                 bne.b   .nonono
  553.                 tst.b   _hero2dead
  554.                 bne.b   .nonono
  555.  
  556.                 lea     _player2(pc),a3
  557.                 bsr.w   get_zone
  558.                 bsr.w   check_top
  559.                 bsr.w   set_walklimitations
  560.                 bsr.w   check_walklimitations
  561.  
  562. ; ---- movements ----
  563.  
  564. .nonono         bsr.w   update_movements
  565.                 bsr.w   update_bullets
  566.                 bsr.w   check_bullethit
  567.                 bsr     check_dynamite
  568.                 bsr.w   check_deadbodies
  569.                 bsr.w   update_snipercount
  570.  
  571. ; ---- shooting ----
  572.  
  573.                 bsr.w   update_shooting
  574.  
  575. ; ---- double buffering ----
  576.  
  577.                 bsr.w   create_masks
  578.  
  579.                 bsr.w   draw_snipers
  580.                 bsr.b   draw_text
  581.                 bsr.w   save_backgrounds
  582.  
  583. ;               bsr.w   init_drawlist
  584.                 bsr.w   horseman_cheat
  585.                 bsr.w   sort_drawlist
  586.                 bsr.w   horseman_cheat2
  587.  
  588.                 bsr.w   draw_bullets
  589.                 bsr.w   draw_bobs
  590.  
  591.                 bsr.w   wait_sync
  592.                 bsr.w   swap_screens
  593.                 bsr.w   show_screen
  594.  
  595.                 bsr.w   clear_bullets
  596.                 bsr.w   restore_backgrounds
  597.                 bsr.w   clear_snipers
  598.                 bra     main_loop
  599.  
  600.  
  601. quit            lea     _musicdata,a0
  602.                 moveq   #0,d0
  603.                 jsr     FM_ENDSONG(a0)
  604.                 bsr.w   reset_vbintserver
  605.                 bsr     write_highscoretable
  606.                 bsr.w   cleanup_all
  607.         ;       move.l  _stacksave(pc),sp
  608.                 rts
  609.  
  610. ; ---- DRAW TEXT TO SCREEN ----
  611.  
  612. draw_text       tst.b   _drawtext
  613.                 bne.b   .istext
  614.                 rts
  615.  
  616. .istext         subq.b  #1,_drawtext
  617.  
  618.                 move.l  _textptr(pc),a1
  619.  
  620. .prt            move.l  (a1)+,d0                ; x pos
  621.                 bmi.b   .done
  622.                 move.l  (a1)+,d1                ; y pos
  623.                 move.l  (a1)+,d2                ; length
  624.                 move.l  (a1)+,a0                ; text
  625.                 bsr.w   print_text2
  626.                 bra.b   .prt
  627. .done           rts
  628.  
  629. _drawtext       dc.b    0,0
  630. _textptr        dc.l    0
  631.  
  632.  
  633. _startwavtxt    dc.l    20,22,7,_wavtxt
  634.                 dc.l    -1
  635.  
  636. _bonusdrawtxt   dc.l    12+4,21,14,_endoftxt
  637.                 dc.l    15+4,23,9,_drawtxt
  638.                 dc.l    -1
  639.  
  640. _cleareoftxt    dc.l    12+4,21,14,_cleartxt
  641.                 dc.l    -1
  642.  
  643. _clearwavtxt    dc.l    20,22,7,_cleartxt
  644.                 dc.l    -1
  645.  
  646. _endoftxt       dc.b    "E"-55,"N"-55,"D"-55,-1,"O"-55,"F"-55,37
  647. _wavtxt         dc.b    0,0,0,0,"W"-55,"A"-55,"V"-55,"E"-55
  648. _drawtxt        dc.b    "B"-55,"O"-55,"N"-55,"U"-55,"S"-55,-1
  649.                 dc.b    "D"-55,"R"-55,"A"-55,"W"-55
  650. _cleartxt       dc.b    37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37
  651.                 even
  652.  
  653.  
  654.  
  655.  
  656. ; ---- DEAD WAIT ON WAVE 5 ----
  657.  
  658. wait_dead5      cmp.b   #5,_wave
  659.                 beq.b   .ok
  660.                 rts
  661.  
  662. .ok             cmp     #$FFFF,_hero1dead
  663.                 beq.b   .count
  664. .bobbo          rts
  665.  
  666. .count          subq    #1,_deadcount
  667.                 beq.b   .leave
  668.                 rts
  669.  
  670. .leave          bra     lose_life
  671.  
  672. _deadcount      dc      0
  673.  
  674.  
  675. _restartwave    dc.b    0
  676. _hasseenwave    dc.b    0
  677.  
  678.  
  679. ; ---- INIT WAVE ----
  680.  
  681. wave_start      clr.b   _swapflag
  682.  
  683.                 lea     _musicdata,a0
  684.                 moveq   #4,d0
  685.               &nnbsp; moveq   #0,d1
  686.                 jsr     FM_INITSONG(a0)
  687.  
  688.                 cmp.b   #5,_wave
  689.                 beq.b   .noopen
  690.  
  691.                 bsr.w   jail_open
  692.  
  693. .noopen         tst.b   _hero1dead
  694.                 bne.b   .no3
  695.  
  696.                 lea     _player1(pc),a0
  697.                 move.l  p_bob(a0),a0
  698.                 move    #90,bo_x(a0)
  699.                 move    #83,bo_y(a0)
  700.                 clr.b   bo_inactive(a0)
  701.                 st.b    bo_firstflag(a0)
  702.                 clr.b   bo_maskmade(a0)
  703.  
  704. .no3            tst.b   _hero2dead
  705.                 bne.b   .no2
  706.                 cmp.b   #2,_numplayers
  707.                 bne.b   .no2
  708.  
  709.                 lea     _player2(pc),a0
  710.                 move.l  p_bob(a0),a0
  711.                 move    #90,bo_x(a0)
  712.                 move    #83,bo_y(a0)
  713.                 clr.b   bo_inactive(a0)
  714.                 st.b    bo_firstflag(a0)
  715.                 clr.b   bo_maskmade(a0)
  716.  
  717. .no2            clr.b   _leaveinit
  718.                 clr.b   _nosfx
  719.                 clr.b   _doorclose
  720.  
  721.                 bsr.w   print_mainline
  722.                 bsr.w   print_score
  723.                 bsr.w   print_hiscore
  724.                 bsr.w   print_lives
  725.  
  726.                 move    _initbonusstore(pc),_bonus
  727.  
  728.                 bsr.w   print_bonus
  729.  
  730.                 move    #100,_textcount
  731.                 move    #100,_deadcount
  732.  
  733.                 tst.b   _hasseenwave
  734.                 bne.b   .noprint
  735.  
  736.                 cmp.b   #5,_wave
  737.                 bne.b   .not5
  738.  
  739.                 clr     _textcolor2
  740.                 bra.b   .fff
  741.  
  742. .not5           clr     _textcolor
  743.  
  744. .fff            move.l  #_startwavtxt,_textptr
  745.                 move.b  #2,_drawtext
  746.                 st.b    _hasseenwave
  747.  
  748. .noprint        bsr.w   init_leavejail
  749.  
  750. ; ---- MAIN LOOP FOR WAVE START ----
  751.  
  752. wavestart_loop  tst.b   _leaveinit
  753.                 bne.b   .leave
  754.  
  755.                 bsr.b   wait_remtext
  756.                 bsr.b   wait_closedoor
  757.  
  758.                 bsr.w   update_devices
  759.                 bsr.w   update_animations
  760.  
  761.                 bsr.w   update_movements
  762.  
  763.                 bsr.w   draw_text
  764.                 bsr.w   save_backgrounds
  765.  
  766.                 bsr.w   sort_drawlist
  767.                 bsr.w   draw_bobs
  768.  
  769.                 bsr.w   wait_sync
  770.                 bsr.w   swap_screens
  771.                 bsr.w   show_screen
  772.  
  773.                 bsr.w   restore_backgrounds
  774.                 bra.b   wavestart_loop
  775.  
  776. .leave          rts
  777.  
  778.  
  779.  
  780. ; ---- WAIT TO REMOVE WAVE TEXT ----
  781.  
  782. wait_remtext    tst     _textcount
  783.                 beq.b   .done
  784.  
  785.                 subq    #1,_textcount
  786.                 beq.b   .rem
  787. .done           rts
  788.  
  789. .rem            cmp.b   #5,_wave
  790.                 beq.b   .is5
  791. ;               DBUG
  792.                 move    #$000C,_textcolor
  793.                 bra.b   rem_wavetext
  794. .is5            move    #$00C0,_textcolor2
  795.  
  796. rem_wavetext    move.l  #_clearwavtxt,_textptr
  797.                 move.b  #2,_drawtext
  798.                 rts
  799.  
  800.  
  801. _textcount      dc      0
  802.  
  803.  
  804. wait_closedoor  tst.b   _doorclose
  805.                 beq.b   .done
  806.                 subq.b  #1,_doorclose
  807.                 bne.b   .close
  808. .done           rts
  809.  
  810. .close          bra.w   jail_close
  811.  
  812. _doorclose      dc.b    0
  813. _leaveinit      dc.b    0
  814.  
  815. ; ---- INIT SHERIFFS TO LEAVE JAIL ----
  816.  
  817. init_leavejail  cmp.b   #2,_numplayers
  818.                 bne.b   .setpl1
  819.  
  820.                 tst.b   _hero1dead
  821.                 bne.b   .setplayer2
  822.  
  823. .setpl1         lea     _player1(pc),a3
  824.                 move.l  #(DEV_CPU),p_device(a3)
  825.  
  826.                 st.b    p_noshoot(a3)
  827.                 clr.b   p_notwalking(a3)
  828.  
  829.                 cmp.b   #5,_wave
  830.                 bne.b   .isnot5
  831.  
  832.                 move.l  p_bob(a3),a1
  833.                 move    #104,bo_y(a1)
  834.                 move    #0,bo_x(a1)
  835.  
  836.                 lea     walkseqcode_enterwave5(pc),a0
  837.                 move.l  a0,p_walkseqcode(a3)
  838.                 lea     _enterwave5sequence(pc),a0
  839.                 bra.b   .setseq
  840.  
  841. .isnot5         lea     walkseqcode_leavejail1(pc),a0
  842.                 move.l  a0,p_walkseqcode(a3)
  843.  
  844.                 lea     _leavejail1sequence(pc),a0
  845. .setseq         lea     p_walksequence(a3),a1
  846.                 moveq   #1,d0
  847. .1              move.l  (a0)+,(a1)+
  848.                 move.l  (a0)+,(a1)+
  849.                 move.l  (a0)+,(a1)+
  850.                 move.l  (a0)+,(a1)+
  851.                 dbf     d0,.1
  852.                 clr     p_walkseqpos(a3)
  853.  
  854.                 cmp.b   #2,_numplayers
  855.                 beq.b   .setplayer2
  856.                 rts
  857.  
  858. .setplayer2     tst.b   _hero2dead
  859.                 bne.b   .no
  860.  
  861.                 lea     _player2(pc),a3
  862.                 move.l  #(DEV_CPU),p_device(a3)
  863.  
  864.                 st.b    p_noshoot(a3)
  865.                 clr.b   p_notwalking(a3)
  866.  
  867.                 cmp.b   #5,_wave
  868.                 bne.b   .isnot51
  869.  
  870.                 move.l  p_bob(a3),a1
  871.                 move    #104,bo_y(a1)
  872.                 move    #0,bo_x(a1)
  873.  
  874.                 lea     walkseqcode_enterwave5(pc),a0
  875.                 move.l  a0,p_walkseqcode(a3)
  876.                 lea     _enterwave52sequence(pc),a0
  877.                 bra.b   .setseqq
  878.  
  879. .isnot51        lea     walkseqcode_leavejail1(pc),a0
  880.                 move.l  a0,p_walkseqcode(a3)
  881.  
  882.                 lea     _leavejail2sequence(pc),a0
  883.                 bra.w   .setseqq
  884. .setseqq        lea     p_walksequence(a3),a1
  885.                 moveq   #1,d0
  886. .3              move.l  (a0)+,(a1)+
  887.                 move.l  (a0)+,(a1)+
  888.                 move.l  (a0)+,(a1)+
  889.                 move.l  (a0)+,(a1)+
  890.                 dbf     d0,.3
  891.                 clr     p_walkseqpos(a3)
  892. .no             rts
  893.  
  894. walkseqcode_enterwave5
  895.                 cmp     #-1,d0
  896.                 beq.b   endof
  897.                 rts
  898.  
  899. walkseqcode_leavejail1
  900.                 cmp     #1,d0
  901.                 beq.b   closedoor
  902.                 cmp     #-1,d0
  903.                 beq.b   endof
  904.                 rts
  905.  
  906. walkseqcode_leavejail2
  907.                 cmp     #-1,d0
  908.                 beq.b   endof
  909.                 rts
  910.  
  911. endof           cmp.b   #(OT_SHERIFF1),p_type(a3)
  912.                 bne.b   .is2
  913.                 move.l  #(DEV_JOY1),p_device(a3)
  914.                 clr.b   p_noshoot(a3)
  915.                 st.b    _leaveinit
  916.                 rts
  917. .is2            move.l  #(DEV_JOY0),p_device(a3)
  918.                 clr.b   p_noshoot(a3)
  919.                 st.b    _leaveinit
  920.                 rts
  921.  
  922.  
  923. closedoor       tst.b   _bonusdraw
  924.                 bne.b   .lee
  925.                 move.b  #3,_doorclose
  926.  
  927.                 move    #$0500,d0
  928.                 moveq   #0,d2
  929.                 bra.w   play_sfx
  930. .lee            st.b    _leaveinit
  931.                 rts
  932.  
  933. _leavejail1sequence
  934.                 dc      90,90,0
  935.                 dc      90,84,1
  936.                 dc      180-24,140,-1
  937.                 dc      0,0,0
  938.                 dc      0,0,0
  939.                 dc      0,0,-1
  940.  
  941. _leavejail2sequence
  942.                 dc      90,90,0
  943.                 dc      90,84,1
  944.                 dc      180+24,140,-1
  945.                 dc      0,0,0
  946.                 dc      0,0,0
  947.                 dc      0,0,-1
  948.  
  949. _enterwave5sequence
  950.                 dc      180-24,140,-1
  951.                 dc      0,0,0
  952.                 dc      0,0,0
  953.                 dc      0,0,0
  954.                 dc      0,0,0
  955.                 dc      0,0,0
  956.  
  957. _enterwave52sequence
  958.                 dc      180+24,140,-1
  959.                 dc      0,0,0
  960.                 dc      0,0,0
  961.                 dc      0,0,0
  962.                 dc      0,0,0
  963.                 dc      0,0,0
  964.  
  965. ; ---- PLAY SOUNDEFFECT ----
  966.  
  967. play_sfx        tst.b   _nosfx
  968.                 bne.b   .no
  969.                 movem.l a0-a6,-(sp)
  970.                 lea     _musicdata,a0
  971.                 jsr     FM_PLAYSFX(a0)
  972.                 movem.l (sp)+,a0-a6
  973. .no             rts
  974.  
  975. _nosfx          dc.b    0,0
  976.  
  977. ; ---- PRINT "WAVE" TEXT ----
  978.  
  979. set_wavetext    moveq   #0,d0
  980.                 move.b  _wave(pc),d0
  981.                 subq.b  #1,d0
  982.                 lea     _wavetxt(pc),a0
  983.                 lsl     #2,d0
  984.                 lea     (a0,d0),a0
  985.                 lea     _wavtxt(pc),a1
  986.                 move.b  (a0)+,(a1)+
  987.                 move.b  (a0)+,(a1)+
  988.                 move.b  (a0)+,(a1)+
  989.                 move.b  (a0)+,(a1)+
  990.                 rts
  991.  
  992.  
  993.  
  994. _outlawtimer    dc      0
  995. _snipertimer    dc      0
  996.  
  997. _shootfrequency dc      300             ; shoot frequency for outlaws (random)
  998. _horseshootfreq dc      150
  999. _outlawmaxtime  dc      100             ; max. time allowed before appearing
  1000. _snipermaxtime  dc      400             ; max. time allowed .... etc.
  1001.  
  1002. _scoresub       dc      10              ; amount to subtract from killscore
  1003. _initkillscore  dc      100             ; initial kill score for outlaws
  1004. _initbonus      dc      100             ; initial bonus
  1005. _killbonus      dc      20              ; bonus for outlaw kill
  1006. _scorecounter   dc      100             ; counter before subtracting
  1007. _initbonusstore dc      0               ; store
  1008.  
  1009. _mustshoot      dc.b    0               ; must shoot this many to clear wave
  1010. _level          dc.b    1               ; level
  1011. _wave           dc.b    4               ; wave
  1012. _bonusdraw      dc.b    0               ; set if bonus draw
  1013. _numplayers     dc.b    1,0             ; number of players
  1014.  
  1015. _hero1dead      dc.b    0
  1016. _hero2dead      dc.b    0
  1017.  
  1018. ; ---- INIT LEVELDATA ----
  1019.  
  1020. init_leveldata  moveq   #0,d0
  1021.                 move.b  _level(pc),d0
  1022.                 subq.b  #1,d0
  1023.                 lsl     #3,d0
  1024.                 lea     _leveldata(pc,d0.l),a0
  1025.                 move    (a0)+,_shootfrequency
  1026.                 move    (a0)+,_horseshootfreq
  1027.                 move    (a0)+,_outlawmaxtime
  1028.                 move    (a0)+,_snipermaxtime
  1029.                 rts
  1030.  
  1031. ; ---- LEVEL DATA ----
  1032.  
  1033.                 ; shootfreq, horseshootfreq, outlawmaxtime, snipermaxtime
  1034. _leveldata      dc      300,150,100,400         ; 1
  1035.                 dc      280,120,090,380         ; 2
  1036.                 dc      260,100,080,360         ; 3
  1037.                 dc      250,090,080,340         ; 4
  1038.                 dc      210,080,070,300         ; 5
  1039.                 dc      180,070,060,290         ; 6
  1040.                 dc      150,050,050,250         ; 7
  1041.                 dc      100,030,040,200         ; 8
  1042.                 dc      050,020,020,150         ; 9
  1043.  
  1044. ; ---- INIT WAVEDATA ----
  1045.  
  1046. init_wavedata   moveq   #0,d0
  1047.                 move.b  _wave(pc),d0
  1048.                 subq.b  #1,d0
  1049.                 mulu    #10,d0
  1050.                 lea     _wavedata(pc,d0.l),a0
  1051.                 move    (a0)+,_scoresub
  1052.                 move    (a0)+,_initkillscore
  1053.                 move    (a0),_initbonusstore
  1054.                 move    (a0)+,_initbonus
  1055.                 move    (a0)+,_killbonus
  1056.                 move    (a0)+,_scorecounter
  1057.                 rts
  1058.  
  1059. ; ---- WAVE DATA ----
  1060.  
  1061.                 ; scoresub, initkillscore, initbonus, killbonus, scorecount
  1062.  
  1063. _wavedata       dc      010,100,100,10,100      ; 1
  1064.                 dc      020,200,200,20,110      ; 2
  1065.                 dc      030,300,300,30,120      ; 3
  1066.                 dc      040,400,400,40,130      ; 4
  1067.                 dc      050,500,500,50,140      ; 5
  1068.  
  1069.  
  1070. _wavetxt        dc.b    1,"S"-55,"T"-55,-1
  1071.                 dc.b    2,"N"-55,"D"-55,-1
  1072.                 dc.b    3,"R"-55,"D"-55,-1
  1073.                 dc.b    4,"T"-55,"H"-55,-1
  1074.                 dc.b    5,"T"-55,"H"-55,-1
  1075.  
  1076.  
  1077.  
  1078.  
  1079. ; ---- BONUS DRAW ----
  1080.  
  1081. BLINKSPEED      = 25
  1082.  
  1083. bonus_draw      bsr.w   init_drawman
  1084.                 bsr.w   init_sheriffdraw
  1085.  
  1086.                 movem.l d0-d2/a0-a3,-(sp)
  1087.                 lea     _musicdata,a0
  1088.                 moveq   #2,d0
  1089.                 moveq   #0,d1
  1090.                 jsr     FM_INITSONG(a0)
  1091.                 movem.l (sp)+,d0-d2/a0-a3
  1092.  
  1093.                 cmp.b   #5,_wave
  1094.                 bne.b   .not5
  1095.  
  1096.                 clr     _textcolor2
  1097.                 bra.b   .gon
  1098.  
  1099. .not5           clr     _textcolor
  1100.  
  1101. .gon            move    #370,_endcount
  1102.  
  1103.                 move    #1,_blinkcount
  1104.                 st.b    _blinkflag
  1105.                 clr.b   _noch
  1106.                 clr.b   _drawok
  1107.                 move.b  #8,_blinkleft
  1108.  
  1109.                 move.l  #_bonusdrawtxt,_textptr
  1110.                 move.b  #2,_drawtext
  1111.  
  1112.  
  1113. drawmain_loop   ;bsr    get_key
  1114.                 ;cmp.b  #$45,_rawkey
  1115.                 ;beq.b  .up
  1116.  
  1117.  
  1118.                 tst.b   _drawok
  1119.                 beq.b   .notdrawn
  1120.  
  1121.                 subq    #1,_endcount
  1122.                 bne.b   .notdrawn
  1123.  
  1124. .up             tst.b   _addbonus
  1125.                 beq.b   .nobonus
  1126.  
  1127.                 tst.b   _hero1dead
  1128.                 bne.b   .nod
  1129.                 lea     _player1(pc),a0
  1130.                 move    _bonus(pc),d0
  1131.                 add     d0,p_plscore(a0)
  1132.                 add     d0,p_lifescore(a0)
  1133.                 bsr     check_extralife
  1134.  
  1135. .nod            tst.b   _hero2dead
  1136.                 bne.b   .nobonus
  1137.                 lea     _player2(pc),a0
  1138.                 move    _bonus(pc),d0
  1139.                 add     d0,p_plscore(a0)
  1140.                 add     d0,p_lifescore(a0)
  1141.                 bsr     check_extralife
  1142.  
  1143. .nobonus        clr.b   _bonusdraw
  1144.                 addq.b  #1,_wave
  1145.                 cmp.b   #5,_wave
  1146.                 ble.b   .ok
  1147.  
  1148.                 move.b  #1,_wave
  1149.                 cmp.b   #9,_level
  1150.                 beq.b   .ok
  1151.                 addq.b  #1,_level
  1152.  
  1153. .ok             bra.w   new_wave
  1154. ;               rts
  1155.  
  1156. .notdrawn       bsr.w   blink_text
  1157.  
  1158.                 bsr.w   wait_for_draw
  1159.                 bsr.w   wait_for_shoot
  1160.  
  1161.                 bsr.w   update_devices
  1162.                 bsr.w   update_animations
  1163.  
  1164.                 bsr.w   update_movements
  1165.  
  1166.                 bsr.w   update_bullets
  1167.                 bsr.w   check_bullethit
  1168.  
  1169.                 bsr.b   check_deads
  1170.  
  1171.                 tst.b   _drawok
  1172.                 beq.b   .nodraw
  1173.  
  1174.                 bsr.w   update_shooting
  1175.  
  1176. .nodraw         bsr.w   draw_text
  1177.                 bsr.w   sort_drawlist
  1178.                 bsr.w   save_backgrounds
  1179.  
  1180.                 bsr.w   draw_bullets
  1181.                 bsr.w   draw_bobs
  1182.  
  1183.                 bsr.w   wait_sync
  1184.                 bsr.w   swap_screens
  1185.                 bsr.w   show_screen
  1186.  
  1187.                 bsr.w   clear_bullets
  1188.                 bsr.w   restore_backgrounds
  1189.                 bra.w   drawmain_loop
  1190.  
  1191. check_extralife cmp     #10000,p_lifescore(a0)
  1192.                 bge.b   .addlife
  1193. .nomore         rts
  1194.  
  1195. .addlife        clr     p_lifescore(a0)
  1196.                 cmp     #9,p_lives(a0)
  1197.                 beq.b   .nomore
  1198.                 addq    #1,p_lives(a0)
  1199.                 bra     print_lives
  1200.  
  1201.  
  1202. check_deads     tst.b   _noch
  1203.                 bne.b   .ff
  1204.  
  1205.                 tst.b   _drawok
  1206.                 bne.b   .chk
  1207. .ff             rts
  1208.  
  1209. .chk            clr.b   _addbonus
  1210.                 tst.b   _hero1dead
  1211.                 bne.b   .nopl1
  1212.                 lea     _player1(pc),a0
  1213.                 tst.b   p_dead(a0)
  1214.                 bne.b   .nobonus
  1215.                 lea     _hookers(pc),a0
  1216.                 tst.b   p_dead(a0)
  1217.                 beq.b   .nobonus
  1218.  
  1219.  
  1220. .nopl1          tst.b   _hero2dead
  1221.                 bne.b   .nono
  1222.                 lea     _player2(pc),a0
  1223.                 tst.b   p_dead(a0)
  1224.                 bne.b   .nobonus
  1225.                 lea     _hookers+bo_sizeof(pc),a0
  1226.                 tst.b   p_dead(a0)
  1227.                 beq.b   .nobonus
  1228.  
  1229. .nono           movem.l d0-d2/a0-a3,-(sp)
  1230.                 lea     _musicdata,a0
  1231.                 moveq   #3,d0
  1232.                 moveq   #0,d1
  1233.                 jsr     FM_INITSONG(a0)
  1234.                 st.b    _nosfx
  1235.                 movem.l (sp)+,d0-d2/a0-a3
  1236.  
  1237.                 st.b    _noch
  1238.                 st.b    _addbonus
  1239. .nobonus        rts
  1240.  
  1241. _addbonus       dc.b    0
  1242. _noch           dc.b    0
  1243.  
  1244.  
  1245. ; ---- BLINK TEXT ----
  1246.  
  1247. blink_text      tst.b   _blinkleft
  1248.                 beq.b   .sk
  1249.  
  1250.                 subq    #1,_blinkcount
  1251.                 beq.b   .okok
  1252. .sk             rts
  1253. .okok           move    #(BLINKSPEED),_blinkcount
  1254.                 subq.b  #1,_blinkleft
  1255.                 beq.b   .clearendof
  1256.                 not.b   _blinkflag
  1257.                 beq.b   .off
  1258.                 cmp.b   #5,_wave
  1259.                 beq.b   .is5
  1260.                 move    #$0CC0,_textcolor
  1261.                 rts
  1262. .is5            move    #$0C0,_textcolor2
  1263.                 rts
  1264.  
  1265. .off            cmp.b   #5,_wave
  1266.                 beq.b   .is52
  1267.                 move    #$0000,_textcolor
  1268.                 rts
  1269. .is52           clr     _textcolor2
  1270.                 rts
  1271.  
  1272. .clearendof     move.l  #_cleareoftxt,_textptr
  1273.                 move.b  #2,_drawtext
  1274.                 rts
  1275.  
  1276.  
  1277.  
  1278. _blinkflag      dc.b    0
  1279. _blinkleft      dc.b    0
  1280. _blinkcount     dc      0
  1281. _endcount       dc      0
  1282.  
  1283. ; ---- INIT SHERIFF TO DRAW ----
  1284.  
  1285. init_sheriffdraw
  1286.                 lea     _player1(pc),a3
  1287.                 lea     _drawshersequence(pc),a0
  1288.                 bsr.b   .setsh
  1289.  
  1290.                 cmp.b   #2,_numplayers
  1291.                 beq.b   .ok
  1292.                 rts
  1293. .ok             tst.b   _hero2dead
  1294.                 beq.b   .ok2
  1295.                 rts
  1296. .ok2            lea     _player2(pc),a3
  1297.                 lea     _drawsher2sequence(pc),a0
  1298.  
  1299. .setsh          move.l  #(DEV_CPU),p_device(a3)
  1300.  
  1301.                 st.b    p_noshoot(a3)
  1302.                 clr.b   p_nomove(a3)
  1303.                 clr.b   p_notwalking(a3)
  1304.  
  1305.                 lea     p_walksequence(a3),a1
  1306.                 moveq   #1,d0
  1307. .1              move.l  (a0)+,(a1)+
  1308.                 move.l  (a0)+,(a1)+
  1309.                 move.l  (a0)+,(a1)+
  1310.                 move.l  (a0)+,(a1)+
  1311.                 dbf     d0,.1
  1312.                 lea     walkseqcode_drawsher(pc),a0
  1313.                 move.l  a0,p_walkseqcode(a3)
  1314.                 clr     p_walkseqpos(a3)
  1315.                 rts
  1316.  
  1317. ; ---- INIT DRAW OPPONENT ----
  1318.  
  1319. init_drawman    lea     _hookers(pc),a3
  1320.                 lea     _drawmansequence(pc),a0
  1321.                 bsr.b   .initdraw
  1322.  
  1323.                 cmp.b   #2,_numplayers
  1324.                 bne.b   .nopl2
  1325.  
  1326.                 tst.b   _hero1dead
  1327.                 bne.b   .1dead
  1328.  
  1329. .nopl2          move.l  p_bob(a3),a0
  1330.                 clr.b   bo_inactive(a0)
  1331.                 clr.b   bo_maskmade(a0)
  1332.                 st.b    bo_firstflag(a0)
  1333.                 move    #352,bo_x(a0)
  1334.                 move    #128,bo_y(a0)
  1335.  
  1336.                 tst.b   _hero2dead
  1337.                 bne.b   .no2
  1338.  
  1339. .1dead          lea     _hookers+p_sizeof(pc),a3
  1340.                 lea     _drawman2sequence(pc),a0
  1341.                 bsr.b   .initdraw
  1342.  
  1343.                 move.l  p_bob(a3),a0
  1344.                 clr.b   bo_inactive(a0)
  1345.                 st.b    bo_firstflag(a0)
  1346.                 move    #352,bo_x(a0)
  1347.                 move    #100,bo_y(a0)
  1348.  
  1349. .no2            move    #100,d0
  1350.                 bsr.w   random
  1351.                 add     #150,d0
  1352.                 move    d0,_drawwait
  1353.                 clr.b   _drawok
  1354.                 clr.b   _oneshot
  1355.                 rts
  1356.  
  1357. .initdraw       lea     p_walksequence(a3),a1
  1358.                 moveq   #1,d0
  1359. .1              move.l  (a0)+,(a1)+
  1360.                 move.l  (a0)+,(a1)+
  1361.                 move.l  (a0)+,(a1)+
  1362.                 move.l  (a0)+,(a1)+
  1363.                 dbf     d0,.1
  1364.                 clr     p_walkseqpos(a3)
  1365.  
  1366.                 lea     walkseqcode_drawman(pc),a0
  1367.                 move.l  a0,p_walkseqcode(a3)
  1368.  
  1369.                 move.l  #_drawmanleft,p_animleft(a3)
  1370.                 move.l  #_drawmandie,p_animdie(a3)
  1371.                 clr.b   p_animpos(a3)
  1372.                 move.b  #1,p_animspdcount(a3)
  1373.                 move.b  #1,p_walkspeed(a3)
  1374.                 move.b  #(DI_LEFT),p_direction(a3)
  1375.                 clr.b   p_lastdirection(a3)
  1376.  
  1377.                 clr.b   p_nomove(a3)
  1378.                 move.b  #(OT_ROBBER),p_type(a3)
  1379.                 clr.b   p_runhome(a3)
  1380.                 clr.b   p_cantdie(a3)
  1381.                 clr.b   p_notwalking(a3)
  1382.                 rts
  1383.  
  1384. _drawwait       dc      0
  1385. _shootwait      dc      0
  1386. _drawok         dc.b    0
  1387. _shootok        dc.b    0
  1388. _oneshot        dc.b    0,0
  1389.  
  1390. ; ---- WAIT TO DRAW GUN ----
  1391.  
  1392. wait_for_draw   tst.b   _blinkleft
  1393.                 bne.b   .sji
  1394.  
  1395.                 tst.b   _oneshot
  1396.                 bne.b   .sji
  1397.  
  1398.                 tst.b   _hero1dead
  1399.                 bne.b   .no22
  1400.                 lea     _player1(pc),a0
  1401.                 tst.b   p_notwalking(a0)
  1402.                 beq.b   .sji
  1403.                 lea     _hookers(pc),a0
  1404.                 tst.b   p_notwalking(a0)
  1405.                 beq.b   .sji
  1406.  
  1407. .no22           cmp.b   #2,_numplayers
  1408.                 bne.b   .okok
  1409.                 tst.b   _hero2dead
  1410.                 bne.b   .okok
  1411.  
  1412.                 lea     _player2(pc),a0
  1413.                 tst.b   p_notwalking(a0)
  1414.                 beq.b   .sji
  1415.                 lea     _hookers+p_sizeof(pc),a0
  1416.                 tst.b   p_notwalking(a0)
  1417.                 beq.b   .sji
  1418.                 bra.b   .okok
  1419. .sji            rts
  1420.  
  1421. .okok           lea     _player1(pc),a0
  1422.                 tst.b   p_fire(a0)
  1423.                 bne.b   .notyet
  1424.  
  1425.                 cmp.b   #2,_numplayers
  1426.                 bne.b   .subc
  1427.                 tst.b   _hero2dead
  1428.                 bne.b   .subc
  1429.  
  1430.                 lea     _player2(pc),a0
  1431.                 tst.b   p_fire(a0)
  1432.                 bne.b   .notyet
  1433.  
  1434. .subc           subq    #1,_drawwait
  1435.                 beq.b   .draw
  1436. .notyet         rts
  1437.  
  1438. .draw           st.b    _drawok
  1439.  
  1440.                 tst.b   _hero1dead
  1441.                 bne.b   .nononono
  1442.  
  1443.                 lea     _hookers(pc),a0
  1444.                 move.l  p_bob(a0),a0
  1445.                 move    #(153),bo_image(a0)
  1446.  
  1447. .nononono       cmp.b   #2,_numplayers
  1448.                 bne.b   .nono
  1449.                 tst.b   _hero2dead
  1450.                 bne.b   .nono
  1451.  
  1452.                 lea     _hookers+p_sizeof(pc),a0
  1453.                 move.l  p_bob(a0),a0
  1454.                 move    #(153),bo_image(a0)
  1455.  
  1456. .nono           moveq   #30,d0
  1457.                 bsr.w   random
  1458.                 add     #40,d0
  1459.                 move    d0,_shootwait
  1460.                 rts
  1461.  
  1462. ; ---- WAIT TO SHOOT ----
  1463.  
  1464. wait_for_shoot  tst.b   _oneshot
  1465.                 bne.b   .nn
  1466.  
  1467.                 tst.b   _drawok
  1468.                 bne.b   .ok
  1469. .nn             rts
  1470.  
  1471. .ok             subq    #1,_shootwait
  1472.                 beq.b   .shoot
  1473.                 rts
  1474.  
  1475. .shoot          tst.b   _hero1dead
  1476.                 bne.b   .nosh
  1477.  
  1478.                 lea     _hookers(pc),a3
  1479.                 tst.b   p_dead(a3)
  1480.                 bne.b   .nosh
  1481.                 st.b    p_nomove(a3)
  1482.                 st.b    _oneshot
  1483.  
  1484.                 bsr.b   .fireshot
  1485.  
  1486. .nosh           cmp.b   #2,_numplayers
  1487.                 bne.b   .nn
  1488.                 tst.b   _hero2dead
  1489.                 bne.b   .nn
  1490.  
  1491.                 lea     _hookers+p_sizeof(pc),a3
  1492.                 tst.b   p_dead(a3)
  1493.                 bne.b   .noshoot
  1494.                 st.b    p_nomove(a3)
  1495.                 st.b    _oneshot
  1496.  
  1497. .fireshot       moveq   #0,d3
  1498.                 move.l  p_bob(a3),a0
  1499.                 movem   bo_x(a0),d0/d1
  1500.                 move.b  #(DI_LEFT),d2
  1501.                 subq    #4,d0
  1502.                 add     #10,d1
  1503.                 bra.w   add_bullet
  1504.  
  1505. .noshoot        rts
  1506.  
  1507. _drawmansequence
  1508.                 dc      212,128,1
  1509.                 dc      0,0,0
  1510.                 dc      0,0,0
  1511.                 dc      0,0,0
  1512.                 dc      0,0,0
  1513.                 dc      0,0,0
  1514.  
  1515. _drawman2sequence
  1516.                 dc      212,100,1
  1517.                 dc      0,0,0
  1518.                 dc      0,0,0
  1519.                 dc      0,0,0
  1520.                 dc      0,0,0
  1521.                 dc      0,0,0
  1522.  
  1523. _drawshersequence
  1524.                 dc      136,128,1
  1525.                 dc      0,0,0
  1526.                 dc      0,0,0
  1527.                 dc      0,0,0
  1528.                 dc      0,0,0
  1529.                 dc      0,0,0
  1530.  
  1531. _drawsher2sequence
  1532.                 dc      136,100,1
  1533.                 dc      0,0,0
  1534.                 dc      0,0,0
  1535.                 dc      0,0,0
  1536.                 dc      0,0,0
  1537.                 dc      0,0,0
  1538.  
  1539. ; ---- WALKSEQCODE FOR DRAW MAN ----
  1540.  
  1541. walkseqcode_drawman
  1542.                 tst.b   p_notwalking(a3)
  1543.                 bne.b   .skip
  1544.  
  1545.                 cmp     #1,d0
  1546.                 beq.b   .ok
  1547.                 rts
  1548.  
  1549. .skip           st.b    p_nomove(a3)
  1550.                 clr     p_walkseqpos(a3)
  1551.                 rts
  1552.  
  1553. .ok             st.b    p_nomove(a3)
  1554.                 move.b  #(DI_LEFT),p_direction(a3)
  1555.                 clr.b   p_lastdirection(a3)
  1556.                 clr     p_walkseqpos(a3)
  1557.                 move.l  p_bob(a3),a0
  1558.                 move    #(152),bo_image(a0)             ; prepare to draw
  1559.                 st.b    p_notwalking(a3)
  1560.                 rts
  1561.  
  1562. ; ---- WALKSEQCODE FOR SHERIFFDRAW ----
  1563.  
  1564. walkseqcode_drawsher
  1565.                 cmp     #1,d0
  1566.                 beq.b   .ok
  1567.                 rts
  1568.  
  1569. .ok             cmp.b   #(OT_SHERIFF1),p_type(a3)
  1570.                 bne.b   .2
  1571.                 move.l  #(DEV_JOY1),p_device(a3)
  1572.                 bra.b   .set
  1573. .2              cmp.b   #(OT_SHERIFF2),p_type(a3)
  1574.                 bne.b   .ff
  1575.                 move.l  #(DEV_JOY0),p_device(a3)
  1576.  
  1577. .set            st.b    p_nomove(a3)
  1578.                 clr.b   p_noshoot(a3)
  1579.                 clr.b   p_direction(a3)
  1580.                 move.b  #(DI_RIGHT),p_lastdirection(a3)
  1581.                 clr     p_walkseqpos(a3)
  1582.                 move.l  p_bob(a3),a0
  1583.                 move    #(9),bo_image(a0)
  1584.                 st.b    p_notwalking(a3)
  1585. .ff             rts
  1586.  
  1587.  
  1588.  
  1589.  
  1590. ; ---- "CHEAT" TO SIT HORSEMAN UPON THE HORSE ----
  1591.  
  1592. horseman_cheat  tst.b   _horseactive
  1593.                 bne.b   .ok
  1594.                 rts
  1595. .ok             move.l  _horseman(pc),a3
  1596.                 move.l  p_bob(a3),a0
  1597.                 add     #43,bo_y(a0)            ; needed to be UPON the horse
  1598.                 rts
  1599.  
  1600. horseman_cheat2 tst.b   _horseactive
  1601.                 bne.b   .ok
  1602.                 rts
  1603. .ok             move.l  _horseman(pc),a3
  1604.                 move.l  p_bob(a3),a0
  1605.                 sub     #43,bo_y(a0)            ; back to normal
  1606.                 rts
  1607.  
  1608.  
  1609. ; ---- CHECK FOR ANY DEAD BODIES ----
  1610.  
  1611. check_deadbodies
  1612.                 cmp.b   #4,_wave
  1613.                 ble.b   .okokok
  1614.                 rts
  1615.  
  1616. .okokok         lea     _rigormortis(pc),a1
  1617.                 move.l  p_bob(a1),a0
  1618.                 tst.b   bo_inactive(a0)
  1619.                 bmi.b   .ok
  1620.                 rts
  1621. &nnbsp;
  1622. .ok             lea     _player1(pc),a3
  1623.                 moveq   #(MAXBOBS-1),d0
  1624. .1              tst.b   p_dead(a3)
  1625.                 bne.b   .isdead
  1626.                 lea     P_SIZEOF(a3),a3
  1627.                 dbf     d0,.1
  1628.                 rts
  1629.  
  1630. .isdead         move.l  p_bob(a3),a0
  1631.                 lea     _deadbodypos(pc),a1
  1632.                 move.l  bo_x(a0),(a1)
  1633.                 lea     _rigormortis(pc),a0
  1634.                 move.l  a3,p_rigorbody(a0)
  1635.  
  1636. ; ---- START RIGOR MORTIS TO DO HIS JOB ----
  1637.  
  1638.                 lea     _rigormortis(pc),a3
  1639.                 move.l  p_bob(a3),a0
  1640.                 clr.b   bo_inactive(a0)
  1641.                 st.b    bo_firstflag(a0)
  1642.                 move    #35*8,bo_x(a0)
  1643.                 move    #82,bo_y(a0)
  1644.  
  1645.                 lea     walkseqcode_rigor(pc),a0
  1646.                 move.l  a0,p_walkseqcode(a3)
  1647.  
  1648.                 bsr.w   reset_pstruct
  1649.  
  1650. .left           lea     _rigorsequence(pc),a0
  1651. .2              lea     p_walksequence(a3),a1
  1652.                 moveq   #1,d0
  1653. .3              move.l  (a0)+,(a1)+
  1654.                 move.l  (a0)+,(a1)+
  1655.                 move.l  (a0)+,(a1)+
  1656.                 move.l  (a0)+,(a1)+
  1657.                 dbf     d0,.3
  1658.                 move.l  (a0)+,(a1)+
  1659.  
  1660.                 clr     p_walkseqpos(a3)
  1661.  
  1662.                 rts
  1663.  
  1664. _rigorsequence  dc      38*8-4,82,0     ; entrance
  1665.                 dc      38*8-4,88,0     ; just outside
  1666. _deadbodypos    dc      0,0,1           ; dead body
  1667.                 dc      38*8-4,88,0     ; just outside
  1668.                 dc      38*8-4,83,0     ; entrance
  1669.                 dc      34*8+5,82,-1    ; inside and done
  1670.  
  1671. walkseqcode_rigor
  1672.                 cmp     #1,d0
  1673.                 beq.b   .fetchbody
  1674.  
  1675.                 cmp     #-1,d0
  1676.                 beq.b   .remrigor
  1677.                 rts
  1678.  
  1679. .fetchbody      move.l  p_rigorbody(a3),a0
  1680.                 st.b    p_rigorgot(a0)
  1681.                 rts
  1682.  
  1683. .remrigor       move.l  p_bob(a3),a0
  1684.                 move.b  #2,bo_inactive(a0)
  1685.                 move.l  p_rigorbody(a3),a0
  1686.                 clr.l   p_rigorbody(a3)
  1687.                 move.l  a0,a3
  1688.  
  1689.                 cmp.b   #(OT_SHERIFF1),p_type(a3)
  1690.                 beq.b   lose_life
  1691.                 cmp.b   #(OT_SHERIFF2),p_type(a3)
  1692.                 beq.b   lose_life
  1693.  
  1694.                 clr.b   p_dead(a3)
  1695.  
  1696.                 bra.w   remove_outlaw
  1697.  
  1698. lose_life       lea     _player1(pc),a0
  1699.                 tst     p_lives(a0)
  1700.                 beq.b   .not1
  1701.                 clr.b   _hero1dead
  1702.                 tst.b   p_dead(a0)
  1703.                 beq.b   .not1
  1704.                 clr.b   p_dead(a0)
  1705.                 subq    #1,p_lives(a0)
  1706.                 bne.b   .not1
  1707.                 st.b    _hero1dead
  1708.                 move.l  p_bob(a0),a0
  1709.                 move.b  #2,bo_inactive(a0)
  1710.  
  1711. .not1           lea     _player2(pc),a0
  1712.                 tst     p_lives(a0)
  1713.                 beq.b   .not2
  1714.                 clr.b   _hero2dead
  1715.                 tst.b   p_dead(a0)
  1716.                 beq.b   .not2
  1717.                 clr.b   p_dead(a0)
  1718.                 subq    #1,p_lives(a0)
  1719.                 bne.b   .not2
  1720.                 st.b    _hero2dead
  1721.                 move.l  p_bob(a0),a0
  1722.                 move.b  #2,bo_inactive(a0)
  1723.  
  1724. .not2           cmp.b   #2,_numplayers
  1725.                 beq.b   .check2
  1726.                 tst.b   _hero1dead
  1727.                 beq.b   .gogo
  1728.                 st.b    _gameover
  1729.                 rts
  1730. .check2         cmp     #$FFFF,_hero1dead
  1731.                 bne.b   .gogo
  1732.                 st.b    _gameover
  1733.                 rts
  1734. .gogo           st.b    _restartwave
  1735.                 rts
  1736.  
  1737. _gameover       dc.b    0,0
  1738.  
  1739.  
  1740. ; ---- ADD OUTLAWS ACCORDING TO RANDOM TIMER ----
  1741.  
  1742. add_outlaws     tst.b   _mustshoot
  1743.                 beq.b   .nono
  1744.  
  1745.                 cmp     #$FFFF,_hero1dead
  1746.                 beq.b   .nono
  1747.  
  1748.                 cmp.b   #5,_wave
  1749.                 beq.b   .olokay
  1750.  
  1751.                 cmp.b   #2,_numplayers
  1752.                 bne.b   .only1
  1753.  
  1754.                 tst.b   _hero2dead
  1755.                 bne.b   .only1
  1756.  
  1757.                 lea     _player2(pc),a0
  1758.                 move.l  p_bob(a0),a0
  1759.                 tst.b   bo_maskmade(a0)
  1760.                 bne.b   .nono
  1761.                 tst.b   _hero1dead
  1762.                 bne.b   .olokay
  1763.  
  1764.  
  1765. .only1          tst.b   _hero1dead
  1766.                 bne.b   .nono
  1767.  
  1768.                 lea     _player1(pc),a0
  1769.                 move.l  p_bob(a0),a0
  1770.                 tst.b   bo_maskmade(a0)         ; no new outlaws if inside bld.
  1771.                 beq.b   .olokay
  1772. .nono           rts
  1773.  
  1774. .olokay         tst     _outlawtimer
  1775.                 beq.b   .addone
  1776.                 subq    #1,_outlawtimer
  1777.                 bne.b   .nono
  1778.  
  1779. .addone         move    _outlawmaxtime(pc),d0
  1780.                 bsr.w   random
  1781.                 move    d0,_outlawtimer
  1782.                 bra.w   add_outlaw
  1783.  
  1784. ; ---- ADD SNIPERS ACCORDING TO RANDOM TIMER ----
  1785.  
  1786. add_snipers     tst.b   _mustshoot
  1787.                 beq.b   .nonew
  1788.  
  1789.                 cmp.b   #4,_wave
  1790.                 beq.b   .ok
  1791.                 rts
  1792.  
  1793. .ok             cmp     #$FFFF,_hero1dead
  1794.                 beq.b   .nonew
  1795.  
  1796.                 lea  nbsp;   _player2(pc),a0
  1797.                 move.l  p_bob(a0),a0
  1798.                 tst.b   bo_maskmade(a0)
  1799.                 bne.b   .nonew
  1800.                 lea     _player1(pc),a0
  1801.                 move.l  p_bob(a0),a0
  1802.                 tst.b   bo_maskmade(a0)
  1803.                 beq.b   .ok2
  1804. .nonew          rts
  1805.  
  1806. .ok2            tst     _snipertimer
  1807.                 beq.b   .addone
  1808.                 subq    #1,_snipertimer
  1809.                 rts
  1810.  
  1811. .addone         move    _snipermaxtime(pc),d0
  1812.                 bsr.w   random
  1813.                 move    d0,_snipertimer
  1814.  
  1815.                 moveq   #2,d0                           ; max. 3 snipers
  1816.                 lea     _snipers+(SN_SIZEOF*2)(pc),a0
  1817. .1              tst.b   sn_counter(a0)
  1818.                 beq.b   .okko
  1819.                 subq    #(SN_SIZEOF),a0
  1820.                 dbf     d0,.1
  1821.                 rts
  1822.  
  1823. .okko           moveq   #5,d0
  1824.                 bsr.w   random
  1825.  
  1826.                 lea     _snipers(pc),a1
  1827.                 cmp.b   sn_number(a1),d0
  1828.                 beq.b   .okko
  1829.                 addq    #(SN_SIZEOF),a1
  1830.                 cmp.b   sn_number(a1),d0
  1831.                 beq.b   .okko
  1832.                 addq    #(SN_SIZEOF),a1
  1833.                 cmp.b   sn_number(a1),d0
  1834.                 beq.b   .okko
  1835.  
  1836.                 move.b  #(SNIPEDELAY),sn_counter(a0)
  1837.                 move.b  d0,sn_number(a0)
  1838.                 move.b  #2,sn_draw(a0)
  1839.  
  1840.                 lea     _sniperxpos(pc),a0
  1841.                 moveq   #0,d2
  1842.                 move.b  (a0,d0),d2
  1843.  
  1844.                 lea     _player1(pc),a0
  1845.                 tst.b   p_dead(a0)
  1846.                 bne.b   .onlypl2
  1847.                 tst.b   _hero1dead
  1848.                 bne.b   .onlypl2
  1849.                 lea     _player2(pc),a0
  1850.                 tst.b   p_dead(a0)
  1851.                 bne.b   .onlypl1
  1852.                 tst.b   _hero2dead
  1853.                 bne.b   .onlypl1
  1854.  
  1855.                 moveq   #2,d0
  1856.                 bsr.w   random                  ; random sheriff
  1857.                 tst     d0
  1858.                 beq.b   .onlypl1
  1859.  
  1860. .onlypl2        lea     _player2(pc),a0
  1861.                 bra.b   .okok
  1862. .onlypl1        lea     _player1(pc),a0
  1863. .okok           move.l  p_bob(a0),a0
  1864.                 move    d2,d0
  1865.                 lsl     #3,d0
  1866.                 move    bo_x(a0),d1
  1867.  
  1868.                 cmp     d0,d1
  1869.                 beq.b   .shootdown
  1870.                 cmp     d0,d1
  1871.                 blo.b   .shootleft
  1872.  
  1873.                 move    d1,d2
  1874.                 sub     d0,d2
  1875.                 cmp     #32,d2
  1876.                 bhi.b   .yes
  1877.                 bra.b   .shootdown
  1878.  
  1879. .yes            moveq   #84,d1
  1880.                 move.b  #(DI_DOWNRIGHT),d2
  1881.                 bra.b   .add_bullet
  1882.  
  1883. .shootdown      moveq   #84,d1
  1884.                 move.b  #(DI_DOWN),d2
  1885.                 bra.b   .add_bullet
  1886.  
  1887. .shootleft      move    d0,d2
  1888.                 sub     d1,d2
  1889.                 cmp     #32,d2
  1890.                 bhi.b   .okk
  1891.                 bra.b   .shootdown
  1892.  
  1893. .okk            moveq   #84,d1
  1894.                 move.b  #(DI_DOWNLEFT),d2
  1895.  
  1896. .add_bullet     movem.l d0-d2,-(sp)
  1897.                 move    #$0501,d0
  1898.                 moveq   #0,d2
  1899.                 bsr.w   play_sfx
  1900.                 movem.l (sp)+,d0-d2
  1901.                 bra.w   add_bullet
  1902.  
  1903.  
  1904.                 RSRESET
  1905. sn_counter      RS.B    1
  1906. sn_number       RS.B    1
  1907. sn_draw         RS.B    2                       ; +is draw  -is clear
  1908. sn_sizeof       RS.B    0
  1909.  
  1910. _snipers        blk.b   (SN_SIZEOF)*3,0
  1911.  
  1912.  
  1913. draw_snipers    cmp.b   #4,_wave
  1914.                 beq.b   .ok
  1915.                 rts
  1916.  
  1917. .ok             moveq   #0,d0                           ; max. 3 snipers
  1918.                 moveq   #2,d2
  1919.                 lea     _snipers+(SN_SIZEOF*2)(pc),a0
  1920. .1              cmp.b   #1,sn_draw(a0)
  1921.                 bge.b   .okko
  1922.                 subq    #(SN_SIZEOF),a0
  1923.                 dbf     d2,.1
  1924.                 rts
  1925.  
  1926. .okko           subq.b  #1,sn_draw(a0)
  1927.                 move.b  sn_number(a0),d0
  1928.                 bra.w   draw_sniper
  1929.  
  1930. clear_snipers   cmp.b   #4,_wave
  1931.                 beq.b   .ok
  1932.                 rts
  1933.  
  1934. .ok             moveq   #0,d0                           ; max. 3 snipers
  1935.                 moveq   #2,d2
  1936.                 lea     _snipers+(SN_SIZEOF*2)(pc),a0
  1937. .1              cmp.b   #-1,sn_draw(a0)
  1938.                 ble.b   .okko
  1939.                 subq    #(SN_SIZEOF),a0
  1940.                 dbf     d2,.1
  1941.                 rts
  1942.  
  1943. .okko           addq.b  #1,sn_draw(a0)
  1944.                 bne.b   .stl
  1945.                 move.b  sn_number(a0),d0
  1946.                 bra.b   .ddd
  1947.                 clr.b   sn_number(a0)
  1948. .stl            move.b  sn_number(a0),d0
  1949. .ddd            bra.w   clear_sniper
  1950.  
  1951. update_snipercount
  1952.                 cmp.b   #4,_wave
  1953.                 beq.b   .ok
  1954.                 rts
  1955.  
  1956. .ok             lea     _snipers+(SN_SIZEOF*2)(pc),a0
  1957.                 moveq   #2,d0
  1958. .1              tst.b   sn_counter(a0)
  1959.                 bhi.b   .okko
  1960. .2              subq    #(SN_SIZEOF),a0
  1961.                 dbf     d0,.1
  1962.                 rts
  1963.  
  1964. .okko           subq.b  #1,sn_counter(a0)
  1965.                 bne.b   .still
  1966.                 move.b  #-2,sn_draw(a0)
  1967. .still          bra.b   .2
  1968.  
  1969. ; ---- CLEAR FIRSTFLAGS ----
  1970.  
  1971. clear_firstflags
  1972.                 lea     _bobstructs(pc),a0
  1973.                 moveq   #(MAXBOBS-1),d0
  1974. .1              clr.b   bo_firstflag(a0)
  1975.                 lea     BO_SIZEOF(a0),a0
  1976.                 dbf     d0,.1
  1977.                 rts
  1978.  
  1979.  
  1980. ; ---- CREATE MASKS ----
  1981.  
  1982. create_masks    cmp.b   #5,_wave
  1983.                 blo.b   .ok
  1984.                 rts
  1985.  
  1986. .ok             lea     _player1(pc),a4
  1987.                 moveq   #(MAXBOBS-1),d4
  1988. .1              move.l  a4,a3
  1989.                 bsr.w   create_mask
  1990.                 lea     P_SIZEOF(a4),a4
  1991.                 dbf     d4,.1
  1992.                 rts
  1993.  
  1994. ; ---- UPDATE SHOOTING ----
  1995.  
  1996. update_shooting
  1997.                 lea     _player1(pc),a3
  1998.                 moveq   #(MAXBOBS-1),d7
  1999. .1              bsr.w   check_shot
  2000.                 lea     P_SIZEOF(a3),a3
  2001.                 dbf     d7,.1
  2002.                 rts
  2003.  
  2004. ; ---- READ DEVICES ----
  2005.  
  2006. update_devices  lea     _player1(pc),a4
  2007.                 moveq   #(MAXBOBS-1),d7
  2008. .1              move.l  a4,a3
  2009.                 bsr.w   read_device
  2010.                 lea     P_SIZEOF(a4),a4
  2011.                 dbf     d7,.1
  2012.                 rts
  2013.  
  2014. ; ---- UPDATE ANIMATIONS ----
  2015.  
  2016. update_animations
  2017.                 lea     _player1(pc),a3
  2018.                 moveq   #(MAXBOBS-1),d7
  2019. .1              bsr.w   animate_actors
  2020.                 lea     P_SIZEOF(a3),a3
  2021.                 dbf     d7,.1
  2022.                 rts
  2023.  
  2024. ; ---- UPDATE MOVEMENTS ----
  2025.  
  2026. update_movements
  2027.                 lea     _player1(pc),a3
  2028.                 moveq   #(MAXBOBS-1),d7
  2029. .1              bsr.w   move_actor
  2030.                 lea     P_SIZEOF(a3),a3
  2031.                 dbf     d7,.1
  2032.                 rts
  2033.  
  2034. _numkidnappers  dc.b    0
  2035. _numoutlaws     dc.b    0
  2036. _numbobs        dc.b    0
  2037.                 EVEN
  2038.  
  2039. ; ---- ADD A HOOKER ----
  2040.  
  2041. add_hooker      lea     _hookers(pc),a3
  2042.                 moveq   #(MAXHOOKERS-1),d7
  2043. .1              move.l  p_bob(a3),a2
  2044.                 tst.b   bo_inactive(a2)
  2045.                 bne.b   .ok2
  2046.                 lea     P_SIZEOF(a3),a3
  2047.                 dbf     d7,.1
  2048.                 moveq   #-1,d0
  2049.                 rts
  2050.  
  2051. .ok2            clr.b   bo_inactive(a2)
  2052.                 st.b    bo_firstflag(a2)
  2053.                 clr.b   p_runhome(a3)
  2054.                 bsr.w   reset_pstruct
  2055.                 st.b    p_noshoot(a3)
  2056.                 moveq   #0,d0
  2057.                 rts
  2058.  
  2059.  
  2060. ; ---- ADD AN OUTLAW ----
  2061.  
  2062. add_outlaw      cmp.b   #(MAXBOBS),_numbobs
  2063.                 beq.b   .no
  2064.  
  2065.                 cmp.b   #(OUTLAWLIMIT),_numoutlaws
  2066.                 blo.b   .ok
  2067. .no             rts
  2068.  
  2069. .ok             lea     _outlaws(pc),a3
  2070.                 moveq   #(MAXOUTLAWS-1),d0
  2071. .1              move.l  p_bob(a3),a2
  2072.                 tst.b   bo_inactive(a2)
  2073.                 bne.b   .ok2
  2074.                 lea     P_SIZEOF(a3),a3
  2075.                 dbf     d0,.1
  2076.                 rts
  2077.  
  2078. .ok2            bsr.w   set_outlawtype
  2079.                 tst     d0
  2080.                 bmi.b   .nothing
  2081.  
  2082.                 moveq   #0,d0
  2083.                 clr.b   bo_inactive(a2)
  2084.                 st.b    bo_firstflag(a2)                ; activate outlaw bob
  2085.  
  2086.                 bsr.w   reset_pstruct
  2087.  
  2088.                 cmp.b   #(OT_HORSEMAN),p_type(a3)
  2089.                 beq.b   .nothing
  2090.  
  2091.                 bsr.w   set_randomposition
  2092.                 bsr.w   set_outlawanimations
  2093.  
  2094. .nothing        rts
  2095.  
  2096. ; ---- REMOVE OUTLAW ----
  2097.  
  2098. remove_outlaw   subq.b  #1,_numoutlaws
  2099.                 move.l  p_bob(a3),a0
  2100.                 move.b  #2,bo_inactive(a0)              ; remove outlaw
  2101.                 clr.b   p_rigorgot(a3)
  2102.                 clr.b   p_joystick(a3)
  2103.                 clr.b   p_xalign(a3)
  2104.                 clr.b   p_dead(a3)
  2105.                 clr.b   p_nomove(a3)
  2106.                 cmp.b   #(OT_KIDNAPPER),p_type(a3)
  2107.                 bne.b   .nohooker
  2108.                 move.l  p_outlawhooker(a3),d0
  2109.                 beq.b   .nohooker
  2110.                 move.l  d0,a0
  2111.                 tst.b   p_runhome(a0)
  2112.                 bne.b   .nohooker
  2113.                 clr.l   p_hookeroutlaw(a0)
  2114.                 move.l  p_bob(a0),a0
  2115.                 move.b  #2,bo_inactive(a0)              ; remove hooker
  2116.  
  2117. .nohooker       cmp.b   #(OT_ROBBER),p_type(a3)
  2118.                 bne.b   .norob
  2119.                 rts
  2120. .norob          cmp.b   #(OT_KIDNAPPER),p_type(a3)
  2121.                 bne.b   .nokid
  2122.                 subq.b  #1,_numkidnappers
  2123.                 rts
  2124. .nokid          cmp.b   #(OT_DYNAMAN),p_type(a3)
  2125.                 bne.b   .nodyn
  2126.                 clr.b   p_nevershoot(a3)
  2127. ;               subq.b  #1,_numoutlaws
  2128.                 clr.b   _dynamiteactive
  2129. .nodyn          rts
  2130.  
  2131. ; ---- RESET PLAYER STRUCTURE (OUTLAW) ----
  2132.  
  2133. reset_pstruct   moveq   #0,d0
  2134.  
  2135.                 move.b  #1,p_walkspdcount(a3)
  2136.                 move.b  #1,p_animspdcount(a3)
  2137.                 clr.b   p_animpos(a3)
  2138.                 move.l  d0,p_hookeroutlaw(a3)
  2139.                 move.l  d0,p_outlawhooker(a3)
  2140.                 move    d0,p_zone(a3)
  2141.                 move    d0,p_building(a3)
  2142.                 move    d0,p_walkseqpos(a3)
  2143.                 clr.b   p_rigorgot(a3)
  2144.                 clr.b   p_nomove(a3)
  2145.                 clr.b   p_noup(a3)
  2146.                 clr.b   p_nodown(a3)
  2147.                 clr.b   p_noleft(a3)
  2148.                 clr.b   p_noright(a3)
  2149.                 clr.b   p_noshoot(a3)
  2150.                 clr.b   p_dead(a3)
  2151.                 clr.b   p_joystick(a3)
  2152.                 move.b  #1,p_direction(a3)
  2153.                 clr.b   p_lastdirection(a3)
  2154.                 move.b  #1,p_shootcounter(a3)
  2155.                 clr.b   p_shooting(a3)
  2156.                 move.b  #1,p_walkcntx(a3)
  2157.                 move.b  #1,p_walkcnty(a3)
  2158.  
  2159.                 cmp.b   #(OT_HORSEMAN),p_type(a3)
  2160.                 beq.b   .noon
  2161.                 move.l  #_outlawshoot,p_shootimages(a3)
  2162.                 move.l  #_outlawdrag,p_dragimages(a3)
  2163.                 move.l  #_outlawdie,p_animdie(a3)
  2164.  
  2165. .noon           move    _initkillscore(pc),p_score(a3)
  2166.                 clr     p_scorecount(a3)
  2167.                 rts
  2168.  
  2169. ; ---- SET OUTLAW ANIMATIONS ----
  2170.  
  2171. set_outlawanimations
  2172.                 lea     _animtableoutlaw(pc),a0
  2173.                 lea     p_animup(a3),a1
  2174.                 moveq   #7,d0
  2175. .2              move.l  (a0)+,(a1)+
  2176.                 dbf     d0,.2
  2177.                 rts
  2178.  
  2179. OT_SHERIFF1     = $40           ; bit 6 identifies sheriff
  2180. OT_SHERIFF2     = $41
  2181. OT_ROBBER       = $81           ; bit 7 identifies outlaw
  2182. OT_KIDNAPPER    = $82
  2183. OT_DYNAMAN      = $83
  2184. OT_HORSEMAN     = $84
  2185. OT_KILLER       = $85
  2186. OT_HOOKER       = 3
  2187. OT_RIGOR        = 4
  2188. OT_DYNA         = 5
  2189. OT_HORSE        = 6
  2190.  
  2191. ; ---- SET OUTLAW TYPE (BANK ROBBER/KIDNAPPER/DYNAMITE MANIAC) ----
  2192.  
  2193. set_outlawtype  cmp.b   #5,_wave
  2194.                 beq.w   type_killer
  2195.  
  2196.                 moveq   #4,d0
  2197.                 bsr.w   random
  2198.                 lsl     #2,d0
  2199.                 jmp     _typeinittable(pc,d0.w)
  2200.  
  2201. _typeinittable  jmp     type_bankrobber(pc)
  2202.                 jmp     type_kidnapper(pc)
  2203.                 jmp     type_dynamiteman(pc)
  2204.                 jmp     type_horseman(pc)
  2205.  
  2206. ; ---- SET TYPE: HORSEMAN ----
  2207.  
  2208. type_horseman   cmp.b   #3,_wave
  2209.                 bge.b   .okokok
  2210.                 moveq   #-1,d0
  2211.                 rts
  2212.  
  2213. .okokok         cmp.b   #5,_wave
  2214.                 beq.b   .no
  2215.  
  2216.                 tst.b   _horseactive
  2217.                 bne.b   .no
  2218.  
  2219.                 cmp.b   #(MAXBOBS-2),_numbobs
  2220.                 ble.b   .ok
  2221. .no             moveq   #-1,d0
  2222.                 rts
  2223.  
  2224. .ok             addq.b  #1,_numoutlaws
  2225.                 move.b  #1,_horsefxcount
  2226.                 st.b    _horseactive
  2227.  
  2228.                 bsr.w   init_horseman
  2229.                 bsr.w   init_horse
  2230.  
  2231.                 moveq   #2,d0
  2232.                 bsr.w   random
  2233.                 tst     d0
  2234.                 beq.b   .left
  2235.  
  2236. .right          move.l  #_horsemanshootright,p_shootimages(a3)
  2237.                 move.l  #_horsemandieright,p_animdie(a3)
  2238.                 move.b  #(DI_RIGHT),p_direction(a3)
  2239.  
  2240.                 moveq   #2,d0
  2241.                 bsr.w   random
  2242.                 lsl     #2,d0
  2243.                 move    _horsestartright(pc,d0.w),bo_x(a0)
  2244.                 move    _horsestartright+2(pc,d0.w),bo_y(a0)
  2245.  
  2246.                 lea     _horse(pc),a0
  2247.                 move.b  #(DI_RIGHT),p_direction(a0)
  2248.                 lea     _animhorseright(pc),a1
  2249.                 bra.b   .setanim
  2250.  
  2251. .left           move.l  #_horsemanshootleft,p_shootimages(a3)
  2252.                 move.l  #_horsemandieleft,p_animdie(a3)
  2253.                 move.b  #(DI_LEFT),p_direction(a3)
  2254.  
  2255.                 moveq   #2,d0
  2256.                 bsr.w   random
  2257.                 lsl     #2,d0
  2258.                 move    _horsestartleft(pc,d0.w),bo_x(a0)
  2259.                 move    _horsestartleft+2(pc,d0.w),bo_y(a0)
  2260.  
  2261.                 lea     _horse(pc),a0
  2262.                 move.b  #(DI_LEFT),p_direction(a0)
  2263.                 lea     _animhorseleft(pc),a1
  2264.  
  2265. .setanim        move    (a1)+,d0
  2266.                 move.b  d0,p_animspeed(a0)      ; first byte is animspeed
  2267.                 move.b  #1,p_animspdcount(a0)
  2268.                 move.l  a1,p_animation(a0)
  2269.                 clr.b   p_animpos(a0)
  2270.                 moveq   #0,d0
  2271.                 rts
  2272.  
  2273. _horsestartright
  2274.                 dc      0,104
  2275.                 dc      0,154
  2276. _horsestartleft
  2277.                 dc      320,104
  2278.                 dc      320,154
  2279.  
  2280.  
  2281. init_horseman   move.b  #(OT_HORSEMAN),p_type(a3)
  2282.                 clr.b   p_noshoot(a3)
  2283.                 clr.b   p_dead(a3)
  2284.                 move    _initkillscore(pc),p_score(a3)
  2285.                 clr     p_scorecount(a3)
  2286.                 move.l  a3,_horseman
  2287.                 lea     _horsemandrag(pc),a0
  2288.                 move.l  a0,p_dragimages(a3)
  2289.                 rts
  2290.  
  2291. init_horse      lea     _horse(pc),a0
  2292.  
  2293.                 move.b  #1,p_walkspdcount(a0)
  2294.                 st.b    p_nomove(a0)
  2295.                 st.b    p_nevershoot(a0)
  2296.  
  2297.                 move.l  p_bob(a0),a0
  2298.                 clr.b   bo_inactive(a0)
  2299.                 st.b    bo_firstflag(a0)                ; activate horse
  2300.                 rts
  2301.  
  2302. _horseactive    dc.b    0,0
  2303. _horseman       dc.l    0
  2304.  
  2305. ; ---- SET TYPE: BANK ROBBER ----
  2306.  
  2307. type_bankrobber addq.b  #1,_numoutlaws
  2308.                 lea     walkseqcode_bankrobbery(pc),a0
  2309.                 move.l  a0,p_walkseqcode(a3)
  2310.  
  2311.                 moveq   #2,d0
  2312.                 bsr.w   random
  2313.                 tst     d0
  2314.                 beq.b   .left
  2315.                 lea     _banksequenceright(pc),a0
  2316.                 bra.b   .2
  2317. .left           lea     _banksequenceleft(pc),a0
  2318. .2              lea     p_walksequence(a3),a1
  2319.                 moveq   #1,d0
  2320. .1              move.l  (a0)+,(a1)+
  2321.                 move.l  (a0)+,(a1)+
  2322.                 move.l  (a0)+,(a1)+
  2323.                 move.l  (a0)+,(a1)+
  2324.                 dbf     d0,.1
  2325.                 bsr.w   get_randomposition
  2326.                 move    (a0)+,-2(a1)                    ; runaway exit
  2327.                 move    (a0)+,(a1)
  2328.                 move    #-1,2(a1)
  2329.                 clr     p_walkseqpos(a3)
  2330.                 move.b  #(OT_ROBBER),p_type(a3)
  2331.                 moveq   #0,d0
  2332.                 rts
  2333.  
  2334. _banksequenceright
  2335.                 dc      29*8-4,86,0     ; bank entrance
  2336.                 dc      29*8-4,82,0     ; inside
  2337.                 dc      33*8-6,82,1     ; inside bank (right)
  2338.                 dc      29*8-4,82,0     ; bank entrance
  2339.                 dc      29*8-4,84,0     ; and down
  2340.                 dc      0,140,-1        ; and run away
  2341.  
  2342. _banksequenceleft
  2343.                 dc      29*8-4,86,0     ; bank entrance
  2344.                 dc      29*8-4,82,0     ; inside
  2345.                 dc      25*8,82,1       ; inside bank (left)
  2346.                 dc      29*8-4,82,0     ; bank entrance
  2347.                 dc      29*8-4,84,0     ; and down
  2348.                 dc      0,140,-1        ; and run away
  2349.  
  2350.  
  2351. ; ---- SET TYPE: KIDNAPPER ----
  2352.  
  2353. type_kidnapper  cmp.b   #(MAXKIDNAPPERS),_numkidnappers
  2354.                 bne.b   .ok
  2355.                 moveq   #-1,d0
  2356.                 rts
  2357.  
  2358. .ok             addq.b  #1,_numkidnappers
  2359.                 addq.b  #1,_numoutlaws
  2360.                 lea     walkseqcode_kidnapping(pc),a0
  2361.                 move.l  a0,p_walkseqcode(a3)
  2362.  
  2363.                 moveq   #2,d0
  2364.                 bsr.w   random
  2365.                 tst     d0
  2366.                 beq.b   .left
  2367.                 lea     _saloonsequenceright(pc),a0
  2368.                 bra.b   .2
  2369.  
  2370. .left           lea     _saloonsequenceleft(pc),a0
  2371. .2              lea     p_walksequence(a3),a1
  2372.                 moveq   #1,d0
  2373. .1              move.l  (a0)+,(a1)+
  2374.                 move.l  (a0)+,(a1)+
  2375.                 move.l  (a0)+,(a1)+
  2376.                 move.l  (a0)+,(a1)+
  2377.                 dbf     d0,.1
  2378.                 bsr.b   get_randomposition
  2379.                 move    (a0)+,-2(a1)                    ; runaway exit
  2380.                 move    (a0)+,(a1)
  2381.                 move    #-1,2(a1)
  2382.                 clr     p_walkseqpos(a3)
  2383.                 move.b  #(OT_KIDNAPPER),p_type(a3)
  2384.                 moveq   #0,d0
  2385.                 rts
  2386.  
  2387.  
  2388. _saloonsequenceleft
  2389.                 dc      19*8-4,83,0     ; sal. entrance
  2390.                 dc      19*8-4,82,0     ; inside
  2391.                 dc      16*8-4,82,1     ; inside saloon left
  2392.                 dc      19*8-4,82,0     ; inside
  2393.                 dc      19*8-4,84,0     ; sal. entrance
  2394.                 dc      0,140,-1        ; and run away
  2395.  
  2396. _saloonsequenceright
  2397.                 dc      19*8-4,83,0     ; sal. entrance
  2398.                 dc      19*8-4,82,0     ; inside
  2399.                 dc      23*8-4,82,1     ; inside saloon right
  2400.                 dc      19*8-4,82,0     ; inside
  2401.                 dc      19*8-4,84,0     ; sal. entrance
  2402.                 dc      0,140,-1        ; and run away
  2403.  
  2404. get_randomposition
  2405.                 moveq   #6,d0
  2406.                 bsr.w   random
  2407.                 lsl     #2,d0
  2408.                 lea     _startpositions(pc),a0
  2409.                 add     d0,a0
  2410.                 rts
  2411.  
  2412. _twoplayers     dc.b    0
  2413. _dynamitepl2    dc.b    0
  2414. _dynamiteactive dc.b    0
  2415. _dynaset        dc.b    0
  2416. _dynamiteinrange
  2417.                 dc.b    0
  2418. _dynablow       dc.b    0
  2419. _dynamiteman    dc.l    0
  2420.  
  2421. ; ---- SET TYPE: DYNAMITE MANIAC ----
  2422.  
  2423. type_dynamiteman
  2424.                 cmp.b   #2,_wave
  2425.                 bge.b   .okokok
  2426.                 moveq   #-1,d0
  2427.                 rts
  2428.  
  2429. .okokok         cmp.b   #5,_wave
  2430.                 beq.b   .nonono
  2431.  
  2432.                 tst.b   _dynaset
  2433.                 beq.b   .ok
  2434. .nonono         moveq   #-1,d0
  2435.                 rts
  2436.  
  2437. .ok             tst.b   _dynamiteactive
  2438.                 beq.b   .ok2
  2439.                 moveq   #-1,d0
  2440.                 rts
  2441.  
  2442. .ok2            cmp.b   #(MAXBOBS-2),_numbobs
  2443.                 blo.b   .ok3
  2444.                 moveq   #-1,d0
  2445.                 rts
  2446.  
  2447. .ok3            addq.b  #1,_numoutlaws
  2448.  
  2449.                 st.b    _dynamiteactive
  2450.                 st.b    p_nevershoot(a3)
  2451.                 move.l  a3,_dynamiteman
  2452.  
  2453.                 lea     walkseqcode_dynamite(pc),a0
  2454.                 move.l  a0,p_walkseqcode(a3)
  2455.  
  2456.                 lea     _dynamitesequence(pc),a0
  2457.  
  2458.                 clr.b   _dynamitepl2
  2459.                 cmp.b   #2,_numplayers
  2460.                 bne.b   .ispl1
  2461.  
  2462.                 tst.b   _hero1dead
  2463.                 bne.b   .ispl2
  2464.                 tst.b   _hero2dead
  2465.                 bne.b   .ispl1
  2466.  
  2467.                 moveq   #2,d0
  2468.                 bsr.w   random
  2469.                 tst     d0
  2470.                 bne.b   .ispl1
  2471. .ispl2          st.b    _dynamitepl2
  2472.  
  2473. .ispl1          lea     p_walksequence(a3),a1
  2474.                 moveq   #1,d0
  2475. .1              move.l  (a0)+,(a1)+
  2476.                 move.l  (a0)+,(a1)+
  2477.                 move.l  (a0)+,(a1)+
  2478.                 move.l  (a0)+,(a1)+
  2479.                 dbf     d0,.1
  2480.                 bsr.w   get_randomposition
  2481.                 clr     p_walkseqpos(a3)
  2482.                 move.b  #(OT_DYNAMAN),p_type(a3)
  2483.                 moveq   #0,d0
  2484.                 rts
  2485.  
  2486.  
  2487. _dynamitesequence
  2488.                 dc      0,0,1           ; hero1 or 2
  2489.                 dc      19*8-4,82,0     ; inside
  2490.                 dc      16*8-4,82,0     ; inside saloon left
  2491.                 dc      19*8-4,82,0     ; inside
  2492.                 dc      19*8-4,84,0     ; sal. entrance
  2493.                 dc      0,140,-1        ; and run away
  2494.  
  2495.  
  2496. ; ---- SET TYPE: KILLER ----
  2497.  
  2498. type_killer     addq.b  #1,_numoutlaws
  2499.                 lea     walkseqcode_killer(pc),a0
  2500.                 move.l  a0,p_walkseqcode(a3)
  2501.  
  2502.                 lea     _killersequence(pc),a0
  2503.                 lea     p_walksequence(a3),a1
  2504.                 moveq   #1,d0
  2505. .1              move.l  (a0)+,(a1)+
  2506.                 move.l  (a0)+,(a1)+
  2507.                 move.l  (a0)+,(a1)+
  2508.                 move.l  (a0)+,(a1)+
  2509.                 dbf     d0,.1
  2510.  
  2511.                 lea     p_walksequence(a3),a0
  2512.  
  2513.                 move.l  #272,d0
  2514.                 bsr.w   random
  2515.                 add     #32,d0
  2516.                 move    d0,(a0)         ; new dest. x
  2517.                 moveq   #83,d0
  2518.                 bsr.w   random
  2519.                 add     #88,d0
  2520.                 move    d0,2(a0)        ; new dest. y
  2521.  
  2522.                 clr     p_walkseqpos(a3)
  2523.                 move.b  #(OT_KILLER),p_type(a3)
  2524.                 moveq   #0,d0
  2525.                 rts
  2526.  
  2527. _killersequence
  2528.                 dc      0,0,1           ; random position
  2529.                 dc      0,0,0
  2530.                 dc      0,0,0
  2531.                 dc      0,0,0
  2532.                 dc      0,0,0
  2533.                 dc      0,0,0
  2534.  
  2535. ; ---- SET A RANDOM START POSITION FOR OUTLAWS ----
  2536.  
  2537. set_randomposition
  2538.                 cmp.b   #5,_wave
  2539.                 bne.b   .nono
  2540.                 moveq   #8,d0
  2541.                 bra.b   .rand
  2542. .nono           moveq   #6,d0
  2543. .rand           bsr.w   random
  2544.                 lsl     #2,d0
  2545.                 cmp.b   #5,_wave
  2546.                 bne.b   .okok
  2547.                 lea     _startpositions5(pc,d0),a0
  2548.                 bra.b   .setpos
  2549.  
  2550. .okok           lea     _startpositions(pc,d0),a0
  2551. .setpos         move    (a0)+,bo_x(a2)          ; set start position
  2552.                 move    (a0)+,bo_y(a2)          ; set start position
  2553.                 rts
  2554.  
  2555. _startpositions dc      0,90
  2556.                 dc      0,150
  2557.                 dc      0,170
  2558.                 dc      352,90
  2559.                 dc      352,150
  2560.                 dc      352,170
  2561.  
  2562. _startpositions5
  2563.                 dc      0,90
  2564.                 dc      0,150
  2565.                 dc      0,170
  2566.                 dc      352,90
  2567.                 dc      352,150
  2568.                 dc      352,170
  2569.                 dc      180,83
  2570.                 dc      180,83
  2571.  
  2572. ; ---- CHECK IF PLAYER SHOOTS ----
  2573.  
  2574. check_shot      tst.b   p_nevershoot(a3)
  2575.                 bne.b   .okok
  2576.                 tst.b   p_dead(a3)
  2577.                 bne.b   .noshot
  2578.                 move.l  p_bob(a3),a0
  2579.                 tst.b   bo_inactive(a0)
  2580.                 beq.b   .isactive
  2581. .okok           rts
  2582.  
  2583. .isactive       tst.b   p_shootcounter(a3)
  2584.                 beq.b   .ok
  2585.                 subq.b  #1,p_shootcounter(a3)
  2586.                 rts
  2587.  
  2588. .ok             tst.b   p_fire(a3)
  2589.                 bne.b   .isshot
  2590. .noshot         clr.b   p_shooting(a3)
  2591.                 clr.b   p_nomove(a3)
  2592.                 rts
  2593.  
  2594. .isshot         tst.b   p_noshoot(a3)
  2595.                 bne.b   .noshot
  2596.  
  2597.                 tst.b   _bonusdraw
  2598.                 bne.b   .isnotout
  2599.  
  2600.                 btst    #7,p_type(a3)
  2601.                 beq.b   .isnotout
  2602.  
  2603.                 cmp     #$FFFF,_hero1dead
  2604.                 beq.b   .noshot
  2605.  
  2606. .noout          bsr.b   set_shootdir
  2607.  
  2608. .isnotout       move    #$0501,d0               ; gunshot
  2609.                 moveq   #0,d2
  2610.                 bsr.w   play_sfx
  2611.  
  2612.                 st.b    p_shooting(a3)
  2613.                 move.b  #1,p_animspdcount(a3)
  2614.                 st.b    p_nomove(a3)
  2615.                 move.b  p_shootdelay(a3),p_shootcounter(a3)
  2616.  
  2617.                 moveq   #0,d3
  2618.                 move.l  p_bob(a3),a0
  2619.                 move    bo_x(a0),d0
  2620.                 move    bo_y(a0),d1
  2621.                 move.b  p_direction(a3),d2
  2622.                 bne.b   .1
  2623.                 move.b  p_lastdirection(a3),d2
  2624. .1              move.b  d2,d3
  2625.                 lsl     #2,d3
  2626.                 add     _bulletstarttable(pc,d3),d0
  2627.                 add     _bulletstarttable+2(pc,d3),d1
  2628.                 bra.w   add_bullet
  2629.  
  2630.  
  2631.  
  2632. ; ---- bullet start offsets -----
  2633.  
  2634. _bulletstarttable
  2635.                 dc.l    0
  2636.                 dc      16,-2   ; up
  2637.                 dc      0,-2    ; upleft
  2638.                 dc      32,0    ; upright
  2639.                 dc      0,23    ; down
  2640.                 dc      -4,16   ; downleft
  2641.                 dc      24,23   ; downright
  2642.                 dc&nbsnbsp;     -4,10   ; left
  2643.                 dc      32,10   ; right
  2644.  
  2645.  
  2646. ; ---- SET SHOOT DIRECTION FOR OUTLAWS ----
  2647.  
  2648. set_shootdir    tst.b   _hero2dead
  2649.                 bne.b   .onlypl1
  2650.                 tst.b   _hero1dead
  2651.                 bne.b   .onlypl2
  2652.  
  2653.                 moveq   #2,d0
  2654.                 bsr.w   random                  ; random sheriff
  2655.                 tst     d0
  2656.                 beq.b   .onlypl1
  2657.  
  2658. .onlypl2        lea     _player2(pc),a0
  2659.                 bra.b   .dothing
  2660.  
  2661. .onlypl1        lea     _player1(pc),a0
  2662. .dothing        move.l  p_bob(a0),a0
  2663.                 move.l  p_bob(a3),a1           
  2664.                 move.b  #1,p_animspdcount(a3)
  2665.                 movem   bo_x(a1),d0-d1
  2666.                 movem   bo_x(a0),d2-d3
  2667.                 clr     d4
  2668.  
  2669.                 cmp     d0,d2
  2670.                 beq.b   .upd
  2671.                 cmp     d0,d2
  2672.                 blo.b   .left
  2673.  
  2674.                 or      #$0100,d4
  2675.                 bra.b   .upd
  2676.  
  2677. .left           or      #$FF00,d4
  2678.  
  2679. .upd            cmp     d1,d3
  2680.                 beq.b   .chk
  2681.                 cmp     d1,d3
  2682.                 blo.b   .up
  2683.                 or      #$0001,d4
  2684.                 bra.b   .chk
  2685. .up             or      #$00FF,d4
  2686.  
  2687. .chk            tst     d4
  2688.                 beq.b   .dontshoot
  2689.  
  2690.                 cmp     #$FF00,d4
  2691.                 beq.b   .shootleft
  2692.                 cmp     #$FF01,d4
  2693.                 beq.b   .shootleftdown
  2694.                 cmp     #$FFFF,d4
  2695.                 beq.b   .shootleftup
  2696.                 cmp     #$0100,d4
  2697.                 beq.b   .shootright
  2698.                 cmp     #$01FF,d4
  2699.                 beq.b   .shootrightup
  2700.                 cmp     #$0101,d4
  2701.                 beq.b   .shootrightdown
  2702. .dontshoot      rts
  2703.  
  2704. .shootleft      move.b  #(DI_LEFT),p_lastdirection(a3)
  2705.                 clr.b   p_direction(a3)
  2706.                 rts
  2707.  
  2708. .shootleftup    moveq   #4,d0
  2709.                 bsr.w   random
  2710.                 subq.b  #1,d0
  2711.                 beq.b   .shootleft
  2712.                 subq.b  #1,d0
  2713.                 beq.b   .shootup
  2714.                 move.b  #(DI_UPLEFT),p_lastdirection(a3)
  2715.                 clr.b   p_direction(a3)
  2716.                 rts
  2717.  
  2718. .shootleftdown
  2719.                 moveq   #4,d0
  2720.                 bsr.w   random
  2721.                 subq.b  #1,d0
  2722.                 beq.b   .shootleft
  2723.                 subq.b  #1,d0
  2724.                 beq.b   .shootdown
  2725.                 move.b  #(DI_DOWNLEFT),p_lastdirection(a3)
  2726.                 clr.b   p_direction(a3)
  2727.                 rts
  2728.  
  2729. .shootright     move.b  #(DI_RIGHT),p_lastdirection(a3)
  2730.                 clr.b   p_direction(a3)
  2731.                 rts
  2732.  
  2733. .shootrightup   moveq   #4,d0
  2734.                 bsr.w   random
  2735.                 subq.b  #1,d0
  2736.                 beq.b   .shootright
  2737.                 subq.b  #1,d0
  2738.                 beq.b   .shootup
  2739.                 move.b  #(DI_UPRIGHT),p_lastdirection(a3)
  2740.                 clr.b   p_direction(a3)
  2741.                 rts
  2742.  
  2743. .shootrightdown moveq   #4,d0
  2744.                 bsr.w   random
  2745.                 subq.b  #1,d0
  2746.                 beq.b   .shootright
  2747.                 subq.b  #1,d0
  2748.                 beq.b   .shootdown
  2749.                 move.b  #(DI_DOWNRIGHT),p_lastdirection(a3)
  2750.                 clr.b   p_direction(a3)
  2751.                 rts
  2752.  
  2753. .shootup        move.b  #(DI_UP),p_lastdirection(a3)
  2754.                 clr.b   p_direction(a3)
  2755.                 rts
  2756.  
  2757. .shootdown      move.b  #(DI_DOWN),p_lastdirection(a3)
  2758.                 clr.b   p_direction(a3)
  2759.                 rts
  2760.  
  2761. ; ---- CHECK IF DYNAMITE KILLS SOMEBODY ----
  2762.  
  2763. check_dynamite  tst.b   _dynablow
  2764.                 bne.b   .test
  2765.                 rts
  2766.  
  2767. .test           lea     _player1(pc),a3
  2768.  
  2769.                 lea     _dynamite(pc),a0
  2770.                 move.l  p_bob(a0),a0
  2771.                 movem   bo_x(a0),d0/d1
  2772.  
  2773.                 moveq   #(MAXBOBS-1),d4
  2774.  
  2775. .loop           tst.b   p_dead(a3)
  2776.                 bne.b   .nxt
  2777.                 tst.b   p_cantdie(a3)
  2778.                 bne.b   .nxt
  2779.  
  2780.                 move.l  p_bob(a3),a0
  2781.                 tst.b   bo_maskmade(a0)
  2782.                 bne.b   .nxt
  2783.                 tst.b   bo_inactive(a0)
  2784.                 bne.b   .nxt
  2785.  
  2786.                 movem   bo_x(a0),d2/d3
  2787.  
  2788.                 sub     #24,d0
  2789.                 cmp     d0,d2
  2790.                 blo.b   .nxt
  2791.                 add     #24+24+24,d0
  2792.                 cmp     d0,d2
  2793.                 bhi.b   .nxt
  2794.                 sub     #22,d1
  2795.                 cmp     d1,d3
  2796.                 blo.b   .nxt
  2797.                 add     #22+22+22,d1
  2798.                 cmp     d1,d3
  2799.                 bhi.b   .nxt
  2800.  
  2801.                 move.b  #1,p_dead(a3)
  2802.  
  2803. .nxt            lea     P_SIZEOF(a3),a3
  2804.                 dbf     d4,.loop
  2805.                 rts
  2806.  
  2807. ; ---- CHECK IF BULLET HIT SOMEBODY ----
  2808.  
  2809.  
  2810. check_bullethit lea     _bullets(pc),a0
  2811.                 moveq   #(MAXBULLETS-1),d7
  2812. .1              tst.b   b_active(a0)
  2813.                 beq.b   .next
  2814.                 moveq   #0,d4
  2815.                 move.b  b_direction(a0),d4
  2816.                 add     d4,d4
  2817.                 add     d4,d4
  2818.  
  2819.                 lea     _player1(pc),a3
  2820.  
  2821.                 moveq   #(MAXBOBS-1),d6
  2822.  
  2823. .2              tst.b   p_dead(a3)
  2824.                 bne.b   .nochk
  2825.                 tst.b   p_cantdie(a3)
  2826.                 bne.b   .nochk
  2827.  
  2828.                 move.l  p_bob(a3),a1
  2829.                 movem   bo_x(a1),d0/d1
  2830.                 cmp.b   #5,_wave
  2831.                 beq.b   .dnn
  2832.                 tst.b   bo_maskmade(a1)
  2833.                 bne.b   .nochk
  2834. .dnn            move    b_x(a0),d2
  2835.                 lsl     #3,d2
  2836.                 move    b_y(a0),d3
  2837.                 jsr     _checkhittable(pc,d4.l)
  2838.  
  2839. .nochk          lea     P_SIZEOF(a3),a3
  2840.                 dbf     d6,.2
  2841.  
  2842. .next           lea     B_SIZEOF(a0),a0
  2843.                 dbf     d7,.1
  2844.                 rts
  2845.  
  2846.                 CNOP    0,4
  2847.  
  2848. _checkhittable  dc.l    0
  2849.                 jmp     chkh_up(pc)
  2850.                 jmp     chkh_upleft(pc)
  2851.                 jmp     chkh_upright(pc)
  2852.                 jmp     chkh_down(pc)
  2853.                 jmp     chkh_downleft(pc)
  2854.                 jmp     chkh_downright(pc)
  2855.                 jmp     chkh_leftright(pc)
  2856.                 jmp     chkh_leftright(pc)
  2857.  
  2858. ; ---- bullet hit somebody ----
  2859.  
  2860. bullet_hit      btst    #7,p_type(a3)
  2861.                 bne.w   .isoutlaw
  2862.  
  2863.                 cmp.b   #(OT_SHERIFF1),p_type(a3)
  2864.                 bne.b   .no3
  2865.                 tst.b   _bonusdraw
  2866.                 bne.b   .wasbonus
  2867.  
  2868.                 btst    #6,b_fromwho(a0)
  2869.                 bne.b   .no3
  2870.                 st.b    _hero1dead
  2871.                 move.b  #1,p_dead(a3)
  2872.                 clr.b   b_active(a0)
  2873.                 bra.b   .playsong
  2874.  
  2875. .wasbonus       move.b  #1,p_dead(a3)
  2876.                 clr.b   b_active(a0)
  2877.                 bra.b   .playsong
  2878.  
  2879. .no3            cmp.b   #(OT_SHERIFF2),p_type(a3)
  2880.                 bne.w   .no2
  2881.  
  2882.                 tst.b   _bonusdraw
  2883.                 bne.b   .wasbonus
  2884.  
  2885.                 btst    #6,b_fromwho(a0)
  2886.                 bne.w   .no2
  2887.                 st.b    _hero2dead
  2888.                 move.b  #1,p_dead(a3)
  2889.                 clr.b   b_active(a0)
  2890.  
  2891. .playsong       movem.l d0-d2/a0-a3,-(sp)
  2892.                 lea     _musicdata,a0
  2893.                 moveq   #1,d0
  2894.                 moveq   #0,d1
  2895.                 jsr     FM_INITSONG(a0)
  2896.                 st.b    _nosfx
  2897.                 movem.l (sp)+,d0-d2/a0-a3
  2898.                 rts
  2899.  
  2900. .isoutlaw       move.b  #1,p_dead(a3)
  2901.                 clr.b   b_active(a0)
  2902.  
  2903.                 tst.b   _bonusdraw
  2904.                 bne.w   .no2
  2905.  
  2906.                 cmp.b   #(OT_SHERIFF1),b_fromwho(a0)
  2907.                 bne.b   .not1
  2908.                 move    p_score(a3),d0
  2909.                 lea     _player1(pc),a2
  2910.                 add     d0,p_plscore(a2)                ; add to score
  2911.                 add     d0,p_lifescore(a2)
  2912.  
  2913.                 move.l  a0,-(sp)
  2914.                 move.l  a2,a0
  2915.                 bsr     check_extralife
  2916.                 move.l  (sp)+,a0
  2917.                 bsr.w   print_score
  2918.                 bra.b   .dobonus
  2919.  
  2920. .not1           cmp.b   #(OT_SHERIFF2),b_fromwho(a0)
  2921.                 bne.b   .not2
  2922.                 lea     _player2(pc),a2
  2923.                 add     d0,p_plscore(a2)                ; add to score
  2924.                 add     d0,p_lifescore(a2)
  2925.  
  2926.                 move.l  a0,-(sp)
  2927.                 move.l  a2,a0
  2928.                 bsr     check_extralife
  2929.                 move.l  (sp)+,a0
  2930.                 bsr.w   print_score
  2931.  
  2932.                 bsr.w   print_score
  2933.  
  2934. .dobonus        move    _killbonus(pc),d0
  2935.                 add     d0,_bonus
  2936.                 bsr.w   print_bonus
  2937.  
  2938. .not2           cmp.b   #5,_wave
  2939.                 beq.b   .is5
  2940.  
  2941.                 btst    #6,b_fromwho(a0)                ; shot by sheriff?
  2942.                 beq.b   .no2
  2943.  
  2944. .is5            tst.b   _mustshoot
  2945.                 beq.b   .no2
  2946.  
  2947.                 lea     _player1(pc),a2
  2948.                 tst.b   p_dead(a2)
  2949.                 bne.b   .no2
  2950.                 lea     _player2(pc),a2
  2951.                 tst.b   p_dead(a2)
  2952.                 bne.b   .no2
  2953.  
  2954.                 subq.b  #1,_mustshoot
  2955.  
  2956. .no2            cmp.b   #(OT_KIDNAPPER),p_type(a3)
  2957.                 bne.b   .no
  2958.                 move.l  p_outlawhooker(a3),d0
  2959.                 beq.b   .no
  2960.                 move.l  d0,a1
  2961.                 clr.l   p_hookeroutlaw(a1)
  2962.                 st.b    p_runhome(a1)
  2963. .no             cmp.b   #(OT_HORSEMAN),p_type(a3)
  2964.                 bne.b   .no4
  2965.  
  2966.                 clr.b   p_nomove(a3)
  2967.  
  2968. .no4            rts
  2969.  
  2970. ; ---- check hit if bullet up ----
  2971.  
  2972. chkh_up         cmp     d1,d3
  2973.                 blo.b   .no
  2974.                 add     #11,d1
  2975.                 cmp     d1,d3
  2976.                 bhi.b   .no
  2977.                 cmp     d0,d2
  2978.                 blo.b   .no
  2979.                 add     #24,d0
  2980.                 cmp     d0,d2
  2981.                 blo.w   bullet_hit
  2982. .no             rts
  2983.  
  2984. ; ---- check hit if bullet upleft ----
  2985.  
  2986. chkh_upleft     cmp     d1,d3
  2987.                 blo.b   .no
  2988.                 add     #11,d1
  2989.                 cmp     d1,d3
  2990.                 bhi.b   .no
  2991.                 cmp     d0,d2
  2992.                 blo.b   .no
  2993.                 add     #12,d0
  2994.                 cmp     d0,d2
  2995.                 blo.w   bullet_hit
  2996. .no             rts
  2997.  
  2998. ; ---- check hit if bullet upright ----
  2999.  
  3000. chkh_upright    cmp     d1,d3
  3001.                 blo.b   .no
  3002.          nbsp;       add     #11,d1
  3003.                 cmp     d1,d3
  3004.                 bhi.b   .no
  3005.                 add     #12,d0
  3006.                 cmp     d0,d2
  3007.                 blo.b   .no
  3008.                 add     #12,d0
  3009.                 cmp     d0,d2
  3010.                 blo.w   bullet_hit
  3011. .no             rts
  3012.  
  3013. ; ---- check hit if bullet down ----
  3014.  
  3015. chkh_down       add     #11,d1
  3016.                 cmp     d1,d3
  3017.                 blo.b   .no
  3018.                 add     #11,d1
  3019.                 cmp     d1,d3
  3020.                 bhi.b   .no
  3021.                 cmp     d0,d2
  3022.                 blo.b   .no
  3023.                 add     #20,d0
  3024.                 cmp     d0,d2
  3025.                 blo.w   bullet_hit
  3026. .no             rts
  3027.  
  3028. ; ---- check hit if bullet downleft ----
  3029.  
  3030. chkh_downleft   add     #11,d1
  3031.                 cmp     d1,d3
  3032.                 blo.b   .no
  3033.                 add     #11,d1
  3034.                 cmp     d1,d3
  3035.                 bhi.b   .no
  3036.                 cmp     d0,d2
  3037.                 blo.b   .no
  3038.                 add     #12,d0
  3039.                 cmp     d0,d2
  3040.                 blo.w   bullet_hit
  3041. .no             rts
  3042.  
  3043. ; ---- check hit if bullet downright ----
  3044.  
  3045. chkh_downright  add     #11,d1
  3046.                 cmp     d1,d3
  3047.                 blo.b   .no
  3048.                 add     #11,d1
  3049.                 cmp     d1,d3
  3050.                 bhi.b   .no
  3051.                 add     #12,d0
  3052.                 cmp     d0,d2
  3053.                 blo.b   .no
  3054.                 add     #12,d0
  3055.                 cmp     d0,d2
  3056.                 blo.w   bullet_hit
  3057. .no             rts
  3058.  
  3059. ; ---- check hit if bullet left or right ----
  3060.  
  3061. chkh_leftright  cmp     d1,d3
  3062.                 blo.b   .no
  3063.                 add     #22,d1
  3064.                 cmp     d1,d3
  3065.                 bhi.b   .no
  3066.                 addq    #8,d0
  3067.                 cmp     d0,d2
  3068.                 blo.b   .no
  3069.                 addq    #8,d0
  3070.                 cmp     d0,d2
  3071.                 blo.w   bullet_hit
  3072. .no             rts
  3073.  
  3074.  
  3075. ; ---- UPDATE BULLETS ----
  3076.  
  3077. update_bullets  subq.b  #1,_bulletspeed
  3078.                 beq.b   .ok
  3079.                 rts
  3080.  
  3081. .ok             move.b  #3,_bulletspeed
  3082.                 bsr.w   move_bullets
  3083.                 bra.b   check_bullets
  3084.  
  3085. _bulletspeed    dc.b    1,0
  3086.  
  3087.  
  3088. ; ---- ADD A BULLET ----
  3089. ; X (D0) Y (D1) DIRECTION (D2)
  3090.  
  3091. add_bullet      lea     _bullets(pc),a0
  3092.                 moveq   #(MAXBULLETS-1),d4
  3093. .1              tst.b   b_active(a0)
  3094.                 beq.b   .ok
  3095.                 add     #(B_SIZEOF),a0
  3096.                 dbf     d4,.1
  3097.                 rts
  3098.  
  3099. .ok             move.b  p_type(a3),b_fromwho(a0)
  3100.                 st.b    b_active(a0)
  3101.                 lsr     #3,d0
  3102.                 move    d0,b_x(a0)
  3103.                 move    d1,b_y(a0)
  3104.                 move.b  d2,b_direction(a0)
  3105.                 rts
  3106.  
  3107. ; ---- CHECK BULLET LIMITS (BORDERS) ----
  3108.  
  3109. check_bullets   lea     _bullets(pc),a0
  3110.                 moveq   #(MAXBULLETS-1),d0
  3111. .1              tst.b   b_active(a0)
  3112.                 beq.b   .next
  3113.                 moveq   #0,d1
  3114.                 move.b  b_direction(a0),d1
  3115.                 lsl     #2,d1
  3116.                 jsr     _checktable(pc,d1.l)
  3117. .next           add     #(B_SIZEOF),a0
  3118.                 dbf     d0,.1
  3119.                 rts
  3120.  
  3121. _checktable     jmp     chkb_none(pc)
  3122.                 jmp     chkb_up(pc)
  3123.                 jmp     chkb_upleft(pc)
  3124.                 jmp     chkb_upright(pc)
  3125.                 jmp     chkb_down(pc)
  3126.                 jmp     chkb_downleft(pc)
  3127.                 jmp     chkb_downright(pc)
  3128.                 jmp     chkb_left(pc)
  3129.                 jmp     chkb_right(pc)
  3130.  
  3131. chkb_none       rts
  3132.  
  3133.  
  3134. BULL_MINY       = 10*8+8
  3135. BULL_MAXY       = 25*8-4
  3136. BULL_MINX       = 4
  3137. BULL_MAXX       = 44
  3138.  
  3139. chkb_up         cmp     #(BULL_MINY),b_y(a0)
  3140.                 ble.b   chkb_clear
  3141.                 rts
  3142.  
  3143. chkb_upleft     cmp     #(BULL_MINY),b_y(a0)
  3144.                 ble.b   chkb_clear
  3145.                 cmp     #(BULL_MINX),b_x(a0)
  3146.                 ble.b   chkb_clear
  3147.                 rts
  3148.  
  3149. chkb_upright    cmp     #(BULL_MINY),b_y(a0)
  3150.                 ble.b   chkb_clear
  3151.                 cmp     #(BULL_MAXX),b_x(a0)
  3152.                 bge.b   chkb_clear
  3153.                 rts
  3154.  
  3155. chkb_down       cmp     #(BULL_MAXY),b_y(a0)
  3156.                 bge.b   chkb_clear
  3157.                 rts
  3158.  
  3159. chkb_downleft   cmp     #(BULL_MAXY),b_y(a0)
  3160.                 bge.b   chkb_clear
  3161.                 cmp     #(BULL_MINX),b_x(a0)
  3162.                 ble.b   chkb_clear
  3163.                 rts
  3164.  
  3165. chkb_downright  cmp     #(BULL_MAXY),b_y(a0)
  3166.                 bge.b   chkb_clear
  3167.                 cmp     #(BULL_MAXX),b_x(a0)
  3168.                 bge.b   chkb_clear
  3169.                 rts
  3170.  
  3171. chkb_left       cmp     #(BULL_MINX),b_x(a0)
  3172.                 ble.b   chkb_clear
  3173.                 rts
  3174.  
  3175. chkb_right      cmp     #(BULL_MAXX),b_x(a0)
  3176.                 bge.b   chkb_clear
  3177.                 rts
  3178.  
  3179. chkb_clear      clr.b   b_active(a0)
  3180.                 rts
  3181.  
  3182. ; ---- MOVE BULLETS ----
  3183.  
  3184. move_bullets    lea     _bullets(pc),a0
  3185.                 moveq   #(MAXBULLETS-1),d0
  3186. .1              tst.b   b_active(a0)
  3187.                 beq.b   .next
  3188.                 moveq   #0,d1
  3189.                 move.b  b_direction(a0),d1
  3190.                 lsl     #2,d1
  3191.                 move    _bulldirtable(pc,d1.l),d2
  3192.                 add     d2,b_x(a0)
  3193.                 move    _bulldirtable+2(pc,d1),d2
  3194.                 add     d2,b_y(a0)
  3195.  
  3196. .next           add     #(B_SIZEOF),a0
  3197.                 dbf     d0,.1
  3198.                 rts
  3199.  
  3200. _bulldirtable   dc.l    0       ; none
  3201.                 dc      0,-4    ; up
  3202.                 dc      -1,-6   ; upleft
  3203.                 dc      1,-6    ; upright
  3204.                 dc      0,4     ; down
  3205.                 dc      -1,6    ; downleft
  3206.                 dc      1,6     ; downright
  3207.                 dc      -1,0    ; left
  3208.                 dc      1,0     ; right
  3209.  
  3210. ; ---- DRAW BULLETS TO SCREEN ----
  3211.  
  3212. draw_bullets    lea     _bullets(pc),a0
  3213.                 moveq   #(MAXBULLETS-1),d2
  3214. .1              tst.b   b_active(a0)
  3215.                 beq.b   .next
  3216.                 bsr.b   set_bullet
  3217. .next           add     #(B_SIZEOF),a0
  3218.                 dbf     d2,.1
  3219.                 rts
  3220.  
  3221. ; ---- CLEAR BULLETS FROM SCREEN ----
  3222.  
  3223. clear_bullets   lea     _bullets(pc),a0
  3224.                 moveq   #(MAXBULLETS-1),d2
  3225. .1              tst.b   b_active(a0)
  3226.                 beq.b   .next
  3227.                 bsr.b   clear_oldbullet
  3228. .next           add     #(B_SIZEOF),a0
  3229.                 dbf     d2,.1
  3230.                 rts
  3231.  
  3232. clear_oldbullet movem   b_oldx(a0),d0/d1
  3233.                 bra.b   set_bull
  3234.  
  3235. set_bullet      clr.b   b_first(a0)
  3236.                 move    b_x(a0),d0
  3237.                 move    d0,b_oldx(a0)
  3238.                 moveq   #0,d1
  3239.                 move    b_y(a0),d1
  3240.                 move    d1,b_oldy(a0)
  3241. set_bull        mulu    #(SCRWIDTH),d1
  3242.                 add     d0,d1
  3243.                 move.l  _dscreen(pc),a1
  3244.                 lea     (a1,d1.w),a1
  3245.                 move.l  _screen(pc),a2
  3246.                 lea     (a2,d1.w),a2
  3247.  
  3248.                 move.b  #%00011000,d0
  3249.  
  3250.                 eor.b   d0,(SCRWIDTH*0)(a1)
  3251.                 eor.b   d0,(SCRWIDTH*1)(a1)
  3252.  
  3253.                 eor.b   d0,(SCRWIDTH*0)(a2)
  3254.                 eor.b   d0,(SCRWIDTH*1)(a2)
  3255.                 rts
  3256.  
  3257.                 RSRESET
  3258. b_x             RS      1       ; bullet x position (:8)
  3259. b_y             RS      1       ; bullet y position
  3260. b_oldx          RS      1       ; old x
  3261. b_oldy          RS      1       ; old y
  3262. b_first         RS.B    1       ; first flag
  3263. b_active        RS.B    1       ; active flag
  3264. b_direction     RS.B    1       ; which direction
  3265. b_fromwho       RS.B    1       ; from who was the bullet fired
  3266. b_sizeof        RS.B    0
  3267.  
  3268. _bullets        blk.b   (B_SIZEOF*MAXBULLETS),0
  3269.  
  3270. ; ---- DRAW ARENA TO SCREEN ----
  3271.  
  3272. draw_arena      cmp.b   #5,_wave
  3273.                 beq.b   .wave5
  3274.  
  3275.                 move.l  #_arena1,_blockptr
  3276.                 move.l  #_arena1map,_mapptr
  3277.                 bra.w   draw_screen
  3278. .wave5          move.l  #_arena2,_blockptr
  3279.                 move.l  #_arena2map,_mapptr
  3280.                 bra.w   draw_screen
  3281.  
  3282. ; ---- DRAW TITLE TO SCREEN/HISCORE TO DSCREEN ----
  3283.  
  3284. draw_title      move.l  #_title,_blockptr
  3285.                 move.l  #_titlemap,_mapptr
  3286.                 bsr.w   draw_screen
  3287.  
  3288.                 bsr     swap_screens
  3289.  
  3290.                 move.l  #_highscore,_blockptr
  3291.                 move.l  #_highscoremap,_mapptr
  3292.                 bsr.w   draw_screen
  3293.  
  3294.                 moveq   #10+4,d0
  3295.                 moveq   #12,d1
  3296.                 moveq   #19,d2
  3297.                 lea     _halltxt(pc),a0
  3298.                 bsr     print_text2             ; print hall of..
  3299.                 bsr     print_hiscoretable
  3300.  
  3301.                 bsr     swap_screens
  3302.  
  3303.                 lea     _hisctxt(pc),a0
  3304.                 moveq   #12+4,d0
  3305.                 moveq   #13,d1
  3306.                 moveq   #15,d2
  3307.                 bsr     print_text2             ; print highscore
  3308.                 lea     _leveltxt(pc),a0
  3309.                 moveq   #16+4,d0
  3310.                 moveq   #15,d1
  3311.                 moveq   #6,d2
  3312.                 bsr     print_text2
  3313.                 lea     _presstxt(pc),a0        ; print "press" stuff
  3314.                 moveq   #5+4,d0
  3315.                 moveq   #21,d1
  3316.                 moveq   #29,d2
  3317.                 bsr     print_text2
  3318.                 lea     _lastsctxt(pc),a0       ; print last score
  3319.                 moveq   #5+4,d0
  3320.                 moveq   #23,d1
  3321.                 moveq   #29,d2
  3322.                 bsr     print_text2
  3323.  
  3324.                 bsr     print_level
  3325.  
  3326.                 lea     _hiscoretable(pc),a0
  3327.                 move    10(a0),_hiscore
  3328.  
  3329.  
  3330.                 move    _hiscore(pc),d0
  3331.                 moveq   #5,d1
  3332.                 lea     _score1txt(pc),a0
  3333.                 bsr.w   numtoasc
  3334.                 moveq   #23+4,d0
  3335.                 moveq   #13,d1
  3336.                 moveq   #4,d2
  3337.                 lea     _score1txt(pc),a0       ; print highscore
  3338.                 bsr.w   print_text2
  3339.                 moveq   #0,d0
  3340.                 lea     _player1(pc),a0
  3341.                 move    p_plscore(a0),d0
  3342.                 moveq   #5,d1
  3343.                 lea     _score1txt(pc),a0
  3344.                 bsr.w   numtoasc
  3345.                 moveq   #21+4,d0
  3346.                 moveq   #23,d1
  3347.                 moveq   #4,d2
  3348.                 lea     _score1txt(pc),a0
  3349.                 bsr.w   print_text2
  3350.                 moveq   #0,d0
  3351.                 lea     _player2(pc),a0
  3352.                 move    p_plscore(a0),d0
  3353.                 moveq   #5,d1
  3354.                 lea     _score1txt(pc),a0
  3355.                 bsr.w   numtoasc
  3356.                 moveq   #30+4,d0
  3357.                 moveq   #23,d1
  3358.                 moveq   #4,d2
  3359.                 lea     _score1txt(pc),a0
  3360.                 bra.w   print_text2
  3361.  
  3362. print_level     moveq   #22+4,d0
  3363.                 moveq   #15,d1
  3364.                 moveq   #0,d2
  3365.                 lea     _level(pc),a0           ; print level
  3366.                 bra     print_text2
  3367.  
  3368. _hisctxt        dc.b    "H"-55,"I"-55,"G"-55,"H"-55,37,"S"-55,"C"-55,"O"-55
  3369.                 dc.b    "R"-55,"E"-55,37,0,0,0,0,0
  3370.  
  3371. _leveltxt       dc.b    "L"-55,"E"-55,"V"-55,"E"-55,"L"-55,37,0
  3372.  
  3373. _presstxt       dc.b    "F"-55,1,37,"O"-55,"N"-55,"E"-55,37
  3374.                 dc.b    "P"-55,"L"-55,"A"-55,"Y"-55,"E"-55,"R"-55,37,36,37
  3375.                 dc.b    "F"-55,2,37,"T"-55,"W"-55,"O"-55,37
  3376.                 dc.b    "P"-55,"L"-55,"A"-55,"Y"-55,"E"-55,"R"-55,"S"-55
  3377.  
  3378. _lastsctxt      dc.b    "L"-55,"A"-55,"S"-55,"T"-55,37,"S"-55,"C"-55,"O"-55
  3379.                 dc.b    "R"-55,"E"-55,"S"-55,37,37,37,1,37,0,0,0,0,0,37,37
  3380.                 dc.b    2,37,0,0,0,0,0
  3381.                 even
  3382.  
  3383. ; ---- PRINT HISCORE TABLE ----
  3384.  
  3385. MAXENTRIES      = 10
  3386.  
  3387. print_hiscoretable
  3388.                 lea     _hiscoretable(pc),a1
  3389.                 moveq   #11+4,d0
  3390.                 moveq   #14,d1                  ; start Y
  3391.  
  3392.                 moveq   #(MAXENTRIES-1),d2
  3393.  
  3394. .loop           movem.l d0-d2/a1,-(sp)
  3395.  
  3396.                 move.l  a1,a0
  3397.                 moveq   #9,d2
  3398.                 bsr     print_text2
  3399.  
  3400.                 move    d0,d3
  3401.                 move    d1,d4
  3402.                 move    10(a1),d0               ; score
  3403.                 moveq   #5,d1
  3404.                 lea     _score1txt(pc),a0
  3405.                 bsr     numtoasc
  3406.                 lea     _score1txt(pc),a0
  3407.                 add     #13,d3
  3408.                 move    d3,d0
  3409.                 move    d4,d1
  3410.                 moveq   #4,d2
  3411.                 bsr     print_text2
  3412.  
  3413.                 movem.l (sp)+,d0-d2/a1
  3414.  
  3415.                 add.l   #12,a1
  3416.  
  3417.                 addq    #1,d1
  3418.                 dbf     d2,.loop
  3419.                 rts
  3420.  
  3421. _halltxt        dc.b    37,37,37,37,"H"-55,"A"-55,"L"-55,"L"-55,37
  3422.                 dc.b    "O"-55,"F"-55,37,"F"-55,"A"-55,"M"-55,"E"-55,37,37,37,37
  3423.                 even
  3424. _entertxt       dc.b    "E"-55,"N"-55,"T"-55,"E"-55,"R"-55,37
  3425.                 dc.b    "Y"-55,"O"-55,"U"-55,"R"-55,37
  3426.                 dc.b    "N"-55,"A"-55,"M"-55,"E"-55,37
  3427.                 dc.b    "P"-55,"L"-55,37
  3428. _enterpl        dc.b    1
  3429.  
  3430.  
  3431.  
  3432. ;ABCDEFGHIJ   00000
  3433.  
  3434.  
  3435. _hiscoretable   dc.b    "S"-55,"E"-55,"A"-55,"S"-55,"O"-55,"N"-55,"S"-55
  3436.                 dc.b    37,37,37
  3437.                 dc      10000
  3438.                 dc.b    "S"-55,"E"-55,"A"-55,"S"-55,"O"-55,"N"-55,"S"-55
  3439.                 dc.b    37,37,37
  3440.                 dc      9000
  3441.                 dc.b    "S"-55,"E"-55,"A"-55,"S"-55,"O"-55,"N"-55,"S"-55
  3442.                 dc.b    37,37,37
  3443.                 dc      8000
  3444.                 dc.b    "S"-55,"E"-55,"A"-55,"S"-55,"O"-55,"N"-55,"S"-55
  3445.                 dc.b    37,37,37
  3446.                 dc      7000
  3447.                 dc.b    "S"-55,"E"-55,"A"-55,"S"-55,"O"-55,"N"-55,"S"-55
  3448.                 dc.b    37,37,37
  3449.                 dc      6000
  3450.                 dc.b    "S"-55,"E"-55,"A"-55,"S"-55,"O"-55,"N"-55,"S"-55
  3451.                 dc.b    37,37,37
  3452.                 dc      5000
  3453.                 dc.b    "S"-55,"E"-55,"A"-55,"S"-55,"O"-55,"N"-55,"S"-55
  3454.                 dc.b    37,37,37
  3455.                 dc      4000
  3456.                 dc.b    "S"-55,"E"-55,"A"-55,"S"-55,"O"-55,"N"-55,"S"-55
  3457.                 dc.b    37,37,37
  3458.                 dc      3000
  3459.                 dc.b    "S"-55,"E"-55,"A"-55,"S"-55,"O"-55,"N"-55,"S"-55
  3460.                 dc.b    37,37,37
  3461.                 dc      2000
  3462.                 dc.b    "S"-55,"E"-55,"A"-55,"S"-55,"O"-55,"N"-55,"S"-55
  3463.                 dc.b    37,37,37
  3464.                 dc      1000
  3465. d
  3466.                 blk.b   12,0            ; safety buffer
  3467.  
  3468.  
  3469. ; ---- ENTER NAME IN HISCORE TABLE ----
  3470.  
  3471. enter_hiscore   bsr     swap_screens
  3472.                 move.l  #_highscore,_blockptr
  3473.                 move.l  #_highscoremap,_mapptr
  3474.                 bsr.w   draw_screen
  3475.                 bsr     print_hiscoretable
  3476.                 moveq   #10+4,d0
  3477.                 moveq   #12,d1
  3478.                 moveq   #19,d2
  3479.                 lea     _halltxt(pc),a0
  3480.                 bsr     print_text2             ; print hall of..
  3481.  
  3482.                 clr     _stringpos
  3483.  
  3484.                 lea     _player1(pc),a0
  3485.                 move    p_plscore(a0),d1
  3486.  
  3487.                 bsr     check_entry
  3488.                 tst     d0
  3489.                 bmi.b   .nopl1
  3490.                 move    d0,_which1
  3491.  
  3492.                 moveq   #10+4,d0
  3493.                 moveq   #12,d1
  3494.                 moveq   #19,d2
  3495.                 lea     _entertxt(pc),a0
  3496.                 move.b  #1,_enterpl
  3497.                 bsr     print_text2             ; print hall of..
  3498.  
  3499.                 move    _which1(pc),d0
  3500.                 move    d0,_which
  3501.                 lea     _player1(pc),a0
  3502.                 move    p_plscore(a0),d1
  3503.                 bsr.b   .doit
  3504.  
  3505. .nopl1          lea     _player2(pc),a0
  3506.                 move    p_plscore(a0),d1
  3507.                 bsr     check_entry
  3508.                 tst     d0
  3509.                 bmi.b   .nothing
  3510.  
  3511.                 move    d0,_which2
  3512.  
  3513.  
  3514.                 moveq   #10+4,d0
  3515.                 moveq   #12,d1
  3516.                 moveq   #19,d2
  3517.                 lea     _entertxt(pc),a0
  3518.                 move.b  #2,_enterpl
  3519.                 bsr     print_text2             ; print hall of..
  3520.  
  3521.                 move    _which2(pc),d0
  3522.                 move    d0,_which
  3523.                 lea     _player2(pc),a0
  3524.                 move    p_plscore(a0),d1
  3525. .doit           bsr     insert_score
  3526.                 bsr     print_hiscoretable
  3527.                 bsr     clear_string
  3528.                 bsr     print_string
  3529.                 clr     _stringpos
  3530.                 bsr     entermainloop
  3531.  
  3532. .nothing        rts
  3533.  
  3534.  
  3535. _nohiscpl1      dc.b    0
  3536. _nohiscpl2      dc.b    0
  3537.  
  3538.  
  3539. entermainloop   bsr     get_key
  3540.  
  3541.                 moveq   #0,d0
  3542.                 move.b  _rawkey(pc),d0
  3543.                 beq.b   entermainloop
  3544.                 cmp.b   #$44,d0                 ; ENTER
  3545.                 beq     outta
  3546.                 cmp.b   #$41,d0                 ; BACKSPACE
  3547.                 bne.b   .nono
  3548.                 tst     _stringpos
  3549.                 beq.b   .nono
  3550.                 subq    #1,_stringpos
  3551.  
  3552.                 move.l  _stringptr(pc),a0
  3553.                 add     _stringpos(pc),a0
  3554.                 move.b  #36,(a0)
  3555.                 move.b  #37,1(a0)
  3556.  
  3557.                 bra.b   .nocurs
  3558.  
  3559. .nono           moveq   #0,d1
  3560.                 move.b  _rawtoascii(pc,d0),d1
  3561.                 bmi.b   entermainloop
  3562.                 move.l  _stringptr(pc),a0
  3563.                 add     _stringpos(pc),a0
  3564.                 move.b  d1,(a0)
  3565.                 cmp     #9,_stringpos
  3566.                 beq.b   .nocurs
  3567.                 addq    #1,_stringpos
  3568.                 move.b  #36,1(a0)
  3569.  
  3570. .nocurs         bsr     print_string
  3571.                 clr.b   _rawkey
  3572.                 bsr     release_key
  3573.                 bra     entermainloop
  3574. outta           clr.b   _rawkey
  3575.                 bsr     release_key
  3576.                 move.l  _stringptr(pc),a0
  3577.                 add     _stringpos(pc),a0
  3578.                 move.b  #37,(a0)
  3579.                 bsr     print_hiscoretable
  3580.                 moveq   #10+4,d0
  3581.                 moveq   #12,d1
  3582.                 moveq   #19,d2
  3583.                 lea     _halltxt(pc),a0
  3584.                 bsr     print_text2             ; print hall of..
  3585.                 rts
  3586.  
  3587.  
  3588. _stringpos      dc      0
  3589. _stringptr      dc.l    0
  3590.  
  3591. _rawtoascii     dc.b    0,1,2,3,4,5,6,7,8,9,0,$FF,$FF,$FF;$d
  3592.                 dc.b    $FF,$FF,"Q"-55,"W"-55,"E"-55,"R"-55,"T"-55,"Y"-55
  3593.                 dc.b    "U"-55,"I"-55,"O"-55,"P"-55,$FF,$FF;$1b
  3594.                 dc.b    $FF,1,2,3,"A"-55,"S"-55,"D"-55,"F"-55
  3595.                 dc.b    "G"-55,"H"-55,"J"-55,"K"-55,"L"-55,$FF,$FF,$FF;$2b
  3596.                 dc.b    $FF,4,5,6,$FF,"Z"-55,"X"-55,"C"-55,"V"-55
  3597.                 dc.b    "B"-55,"N"-55,"M"-55,$FF,$FF,$FF;$3a
  3598.  
  3599.                 dc.b    $FF,$FF,7,8,37,37,$FF,$FF,$FF,$FF,$FF,$FF
  3600.                 dc.b    $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
  3601.                 dc.b    $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
  3602.                 dc.b    $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF
  3603.                 dc.b    $FF,$FF,$FF,$FF,$FF,$FF,$FF
  3604.                 EVEN
  3605.  
  3606.  
  3607. ; ---- INSERT A SCORE ----
  3608.  
  3609. insert_score    moveq   #(MAXENTRIES-1),d3
  3610.                 sub     d0,d3
  3611.                 lea     _hiscoretable+12*(MAXENTRIES-1)(pc),a0
  3612. .nxt            moveq   #11,d2
  3613. .1              move.b  (a0,d2.l),12(a0,d2.l)
  3614.                 dbf     d2,.1
  3615.                 lea     -12(a0),a0
  3616.  
  3617.                 dbf     d3,.nxt
  3618.  
  3619. .okok           mulu    #12,d0
  3620.                 lea     _hiscoretable(pc),a0
  3621.                 lea     (a0,d0.w),a0
  3622.                 lea     _blankscore(pc),a1
  3623.                 moveq   #11,d0
  3624. .2              move.b  (a1)+,(a0)+
  3625.                 dbf     d0,.2
  3626.                 sub     #12,a0
  3627.                 move    d1,10(a0)                       ; insert score
  3628.                 move.l  a0,_stringptr
  3629.                 rts
  3630.  
  3631. ; ---- CHECK IF PLAYER GOT AN ENTRY ----
  3632. ; score (d1)
  3633.  
  3634. check_entry     moveq   #0,d0
  3635.                 lea     _hiscoretable(pc),a0
  3636. .next           cmp     10(a0),d1
  3637.                 bhi.b   .insert
  3638.                 addq    #1,d0
  3639.                 lea     12(a0),a0
  3640.                 cmp     #(MAXENTRIES),d0
  3641.                 bne.b   .next
  3642.                 moveq   #-1,d0
  3643. .insert         rts
  3644.  
  3645.  
  3646. ; ---- PRINT TEXT STRING ----
  3647.  
  3648. print_string    move.l  _stringptr(pc),a0
  3649.                 moveq   #11+4,d0
  3650.                 move    _which(pc),d1
  3651.                 add     #14,d1
  3652.                 moveq   #9,d2
  3653.                 bra     print_text2
  3654.  
  3655. ; ---- CLEAR INPUT STRING ----
  3656.  
  3657. clear_string    lea     _blankscore2(pc),a0
  3658.                 lea     _blankscore(pc),a1
  3659.                 moveq   #9,d0
  3660. .1              move.b  (a0)+,(a1)+
  3661.                 dbf     d0,.1
  3662.                 rts
  3663.  
  3664.  
  3665. _blankscore     dc.b    36,37,37,37,37,37,37,37,37,37
  3666.                 dc      0
  3667. _blankscore2    dc.b    36,37,37,37,37,37,37,37,37,37
  3668.                 dc      0
  3669.  
  3670.  
  3671. _which          dc      0
  3672. _which1         dc      0
  3673. _which2         dc      0
  3674.  
  3675.  
  3676. ; ---- DRAW CHUNKY DISPLAY ----
  3677.  
  3678. draw_screen     move.l  _mapptr(pc),a0
  3679.  
  3680. .draw           moveq   #0,d2
  3681.                 moveq   #0,d1
  3682.  
  3683. .row            moveq   #0,d0
  3684.  
  3685. .line           moveq   #0,d2
  3686.                 move.b  (a0)+,d2
  3687.                 bsr     set_block
  3688.  
  3689.  
  3690.                 addq    #1,d0
  3691.                 cmp     #40,d0
  3692.                 bne.b   .line
  3693.  
  3694.                 addq    #1,d1
  3695.                 cmp     #25,d1
  3696.                 bne.b   .row
  3697.                 rts
  3698.  
  3699. _blockptr       dc.l    0
  3700. _mapptr         dc.l    0
  3701.  
  3702. ; ---- SET A BLOCK TO SCREEN ----
  3703.  
  3704. ; x (d0) y (d1) block (d2)
  3705.  
  3706. set_block       movem.l d0-d2/a0-a1,-(sp)
  3707.                 lsl     #3,d1
  3708.                 mulu    #(SCRWIDTH),d1
  3709.                 add     d0,d1
  3710.                 addq    #4,d1
  3711.                 move.l  _dscreen(pc),a1
  3712.                 lea     (a1,d1.l),a1
  3713.                 move.l  _blockptr(pc),a0
  3714.                 lsl     #5,d2
  3715.                 lea     (a0,d2.l),a0
  3716.  
  3717.                 moveq   #(NUMPLANES-1),d2
  3718. .1              move.b  (a0)+,SCRWIDTH*0(a1)
  3719.                 move.b  (a0)+,SCRWIDTH*1(a1)
  3720.                 move.b  (a0)+,SCRWIDTH*2(a1)
  3721.                 move.b  (a0)+,SCRWIDTH*3(a1)
  3722.                 move.b  (a0)+,SCRWIDTH*4(a1)
  3723.                 move.b  (a0)+,SCRWIDTH*5(a1)
  3724.                 move.b  (a0)+,SCRWIDTH*6(a1)
  3725.                 move.b  (a0)+,SCRWIDTH*7(a1)
  3726.                 lea     PLANE_SIZE(a1),a1
  3727.                 dbf     d2,.1
  3728.                 movem.l (sp)+,d0-d2/a0-a1
  3729.                 rts
  3730.  
  3731. ; ---- DRAW SNIPER TO SCREEN ----
  3732. ; sniper 0-4 (d0)
  3733.  
  3734. draw_sniper     move.l  _dscreen(pc),a1
  3735.                 lea     84*SCRWIDTH(a1),a1
  3736.  
  3737.                 lea     _sniperdata,a0
  3738.                 moveq   #0,d1
  3739.                 move.b  _sniperxpos(pc,d0.l),d1
  3740.                 add     d1,a1
  3741.  
  3742.                 move.l  d0,d1
  3743.  
  3744.                 mulu    #(88),d1
  3745.                 lea     (a0,d1.l),a0                    ; sniper gfx
  3746.  
  3747.                 moveq   #(NUMPLANES-1),d1
  3748. .1              move    (a0)+,SCRWIDTH*0(a1)
  3749.                 move    (a0)+,SCRWIDTH*1(a1)
  3750.                 move    (a0)+,SCRWIDTH*2(a1)
  3751.                 move    (a0)+,SCRWIDTH*3(a1)
  3752.                 move    (a0)+,SCRWIDTH*4(a1)
  3753.                 move    (a0)+,SCRWIDTH*5(a1)
  3754.                 move    (a0)+,SCRWIDTH*6(a1)
  3755.                 move    (a0)+,SCRWIDTH*7(a1)
  3756.                 move    (a0)+,SCRWIDTH*8(a1)
  3757.                 move    (a0)+,SCRWIDTH*9(a1)
  3758.                 move    (a0)+,SCRWIDTH*10(a1)
  3759.                 lea     PLANE_SIZE(a1),a1
  3760.                 dbf     d1,.1
  3761.                 rts
  3762.  
  3763. _sniperxpos     dc.b    5,15,23,25,33
  3764.                 even
  3765.  
  3766. ; ---- CLEAR SNIPER FROM SCREEN ----
  3767. ; sniper 0-4 (d0)
  3768.  
  3769. clear_sniper    move.l  _dscreen(pc),a1
  3770.                 lea     84*SCRWIDTH(a1),a1
  3771.  
  3772.                 lea     _sniperdata+440,a0
  3773.                 moveq   #0,d1
  3774.                 move.b  _sniperxpos(pc,d0.l),d1
  3775.                 add     d1,a1
  3776.  
  3777.                 move.l  d0,d1
  3778.                 mulu    #(88),d1
  3779.                 lea     (a0,d1.l),a0                    ; sniper gfx
  3780.  
  3781.                 moveq   #(NUMPLANES-1),d1
  3782. .1              move    (a0)+,SCRWIDTH*0(a1)
  3783.                 move    (a0)+,SCRWIDTH*1(a1)
  3784.                 move    (a0)+,SCRWIDTH*2(a1)
  3785.                 move    (a0)+,SCRWIDTH*3(a1)
  3786.                 move    (a0)+,SCRWIDTH*4(a1)
  3787.                 move    (a0)+,SCRWIDTH*5(a1)
  3788.                 move    (a0)+,SCRWIDTH*6(a1)
  3789.                 move    (a0)+,SCRWIDTH*7(a1)
  3790.                 move    (a0)+,SCRWIDTH*8(a1)
  3791.                 move    (a0)+,SCRWIDTH*9(a1)
  3792.                 move    (a0)+,SCRWIDTH*10(a1)
  3793.                 lea     PLANE_SIZE(a1),a1
  3794.                 dbf     d1,.1
  3795.                 rts
  3796.  
  3797. ; ---- CHECK TOP OF SCREEN ----
  3798.  
  3799. check_top       cmp.b   #5,_wave
  3800.                 beq.b   check_top5
  3801.  
  3802.                 move.l  p_bob(a3),a0
  3803.                 cmp     #83,bo_y(a0)
  3804.                 beq.b   .checkzone
  3805.  
  3806.                 clr.b   p_noshoot(a3)
  3807.                 cmp     #82,bo_y(a0)
  3808.                 bne.b   .no
  3809.                 st.b    p_noshoot(a3)
  3810.                 st.b    p_noup(a3)
  3811.                 tst     p_zone(a3)
  3812.                 beq.b   .nodown
  3813.                 move    p_zone(a3),p_building(a3)
  3814.                 clr.b   p_nodown(a3)
  3815.                 rts
  3816.  
  3817. .nodown         st.b    p_nodown(a3)
  3818.                 rts
  3819.  
  3820. .no             clr     p_building(a3)
  3821.                 clr.b   p_noup(a3)
  3822.                 clr.b   p_nodown(a3)
  3823.                 rts
  3824.  
  3825. .checkzone      tst     p_zone(a3)
  3826.                 seq     p_noup(a3)
  3827.                 rts
  3828.  
  3829. ; ---- CHECK TOP OF SCREEN FOR WAVE 5 ----
  3830.  
  3831. check_top5      move.l  p_bob(a3),a0
  3832.                 cmp     #83,bo_y(a0)
  3833.                 bge.b   .ok
  3834.                 st.b    p_noup(a3)
  3835.                 rts
  3836.  
  3837. .ok             clr.b   p_noup(a3)
  3838.                 rts
  3839.  
  3840. ; ---- GET ZONE FOR ACTOR ----
  3841.  
  3842. get_zone        move.l  p_bob(a3),a0
  3843.                 move    bo_x(a0),d0
  3844.                 move    bo_y(a0),d1
  3845.                 add     #(BOBHEIGHT),d1
  3846.                 move    d0,d2
  3847.                 moveq   #24,d3
  3848.                 add     d3,d2
  3849.  
  3850.                 moveq   #1,d3                   ; start, zone 1
  3851.  
  3852.                 lea     _zonetable(pc),a0
  3853. .loop           tst     (a0)
  3854.                 bmi.b   .done
  3855.                 cmp     (a0),d1                 ; y
  3856.                 bhi.b   .no
  3857.                 cmp     2(a0),d0                ; x1
  3858.                 blo.b   .no
  3859.                 cmp     4(a0),d2                ; x2
  3860.                 bhi.b   .no
  3861.                 move    d3,p_zone(a3)
  3862.                 rts
  3863.  
  3864. .no             addq    #1,d3
  3865.                 addq    #6,a0
  3866.                 bra.b   .loop
  3867.  
  3868. .done           clr     p_zone(a3)
  3869.                 rts
  3870.  
  3871. _zonetable      dc      (80+25),(116+28),(116+32+28)    ; saloon entrance
  3872.                 dc      (80+25),(196+28),(196+32+28)    ; bank entrance
  3873.                 dc      (80+25),(270+28),(268+32+28)    ; rig.mortis entrance
  3874.                 dc      -1
  3875.  
  3876. ; ---- SET LIMITATIONS FOR WALKING ----
  3877.  
  3878. set_walklimitations
  3879.                 move    p_building(a3),d0
  3880.                 beq.b   .normal
  3881.                 subq    #1,d0
  3882.                 beq.b   .saloon
  3883.                 subq    #1,d0
  3884.                 beq.b   .bank
  3885.  
  3886. .rigmortis      move    #(250+31),p_xlimit1(a3)
  3887.                 move    #(250+32+61),p_xlimit2(a3)
  3888.                 rts
  3889.  
  3890. .saloon         move    #(87+32),p_xlimit1(a3)
  3891.                 move    #(87+32+81),p_xlimit2(a3)
  3892.                 rts
  3893.  
  3894. .bank           move    #(170+32),p_xlimit1(a3)
  3895.                 move    #(170+32+78),p_xlimit2(a3)
  3896.                 rts
  3897.  
  3898. .normal         move    #(32),p_xlimit1(a3)
  3899.                 move    #(32+320),p_xlimit2(a3)
  3900.                 rts
  3901.  
  3902. ; ---- CHECK FOR WALK LIMITATIONS ----
  3903.  
  3904. check_walklimitations
  3905.                 move.l  p_bob(a3),a0
  3906.                 move    bo_x(a0),d0
  3907.                 move    d0,d1
  3908.                 moveq   #24,d2
  3909.                 add     d2,d1
  3910.                 move    bo_y(a0),d2
  3911.  
  3912.                 cmp     p_xlimit1(a3),d0        ; x1
  3913.                 slo.b   p_noleft(a3)
  3914.                 cmp     p_xlimit2(a3),d1        ; x2
  3915.                 shi.b   p_noright(a3)
  3916.  
  3917.                 cmp     #173,d2                 ; bottom of screen?
  3918.                 bne.b   .ok
  3919.                 st.b    p_nodown(a3)
  3920. .ok             rts
  3921.  
  3922.  
  3923.  
  3924.  
  3925. ; ---- SET SALOON DOOR OPEN ----
  3926.  
  3927. saloon_open     tst.b   _swapflag
  3928.                 bne.b   .1
  3929.  
  3930.                 moveq   #9,d0
  3931.                 moveq   #80,d1
  3932.                 moveq   #24,d2
  3933.                 lea     _doordata+480,a0
  3934.                 bsr.w   blit_block
  3935.                 bra.b   .mask
  3936.  
  3937. .1
  3938.                 moveq   #9,d0
  3939.                 moveq   #80,d1
  3940.                 moveq   #24,d2
  3941.                 lea     _doordata+480,a0
  3942.                 bsr.w   swap_screens
  3943.                 bsr.w   blit_block
  3944. ;               bsr     blit_block
  3945.                 bsr.w   swap_screens
  3946. .mask           lea     _doordata+480+384+4*2,a0
  3947.                 moveq   #7,d0
  3948.                 moveq   #0,d1
  3949.                 moveq   #22,d2
  3950.                 bra.w   blit_mask
  3951.  
  3952. ; ---- SET JAIL DOOR OPEN ----
  3953.  
  3954. jail_open       moveq   #5,d0
  3955.                 moveq   #78,d1
  3956.                 moveq   #26,d2
  3957.                 lea     _doordata+480*2,a0
  3958.                 bsr.w   blit_block
  3959.  
  3960.                 bsr.w   swap_screens
  3961.  
  3962.                 moveq   #5,d0
  3963.                 moveq   #78,d1
  3964.                 moveq   #26,d2
  3965.                 lea     _doordata+480*2,a0
  3966.                 bsr.w   blit_block
  3967.                 bsr.w   swap_screens
  3968.                 rts
  3969.  
  3970. ; ---- SET JAIL DOOR CLOSED ----
  3971.  
  3972. jail_close      movem.l d0-d2/a0,-(sp)
  3973.                 moveq   #5,d0
  3974.                 moveq   #78,d1
  3975.                 moveq   #26,d2
  3976.                 lea     _doordata+480*2+520,a0
  3977.                 bsr.w   blit_block
  3978.                 movem.l (sp)+,d0-d2/a0
  3979.                 rts
  3980.  
  3981. ; ---- SET SALOON DOOR CLOSED ----
  3982.  
  3983. saloon_close    moveq   #9,d0
  3984.                 moveq   #80,d1
  3985.                 moveq   #24,d2
  3986.                 lea     _doordata,a0
  3987.                 bsr.w   blit_block
  3988.                 bsr.w   swap_screens
  3989.                 bsr.w   blit_block
  3990.                 bsr.w   swap_screens
  3991.                 lea     _doordata+384+4*2,a0
  3992.                 moveq   #7,d0
  3993.                 moveq   #0,d1
  3994.                 moveq   #22,d2
  3995.                 bra.w   blit_mask
  3996.  
  3997. ; ---- PLAYER MOVEMENT ----
  3998.  
  3999. move_actor      tst.b   p_dead(a3)
  4000.                 beq.b   .ok2
  4001.                 rts
  4002.  
  4003. .ok2            tst.b   p_nomove(a3)
  4004.                 beq.b   .ok3
  4005.                 rts
  4006.  
  4007. .ok3            move.l  p_bob(a3),a0
  4008.                 tst.b   bo_inactive(a0)
  4009.                 beq.b   .isactive
  4010.                 rts
  4011.  
  4012. .isactive       subq.b  #1,p_walkspdcount(a3)
  4013.                 beq.b   .ok
  4014.                 rts
  4015.  
  4016. .ok             move.b  p_walkspeed(a3),p_walkspdcount(a3)
  4017.                 moveq   #0,d0
  4018.                 move.b  p_joystick(a3),d0
  4019.                 move.l  p_bob(a3),a0
  4020.                 jmp     _movetable(pc,d0.l)
  4021.  
  4022. _movetable      jmp     no_move(pc)
  4023.                 jmp     move_up(pc)
  4024.                 jmp     move_upleft(pc)
  4025.                 jmp     move_upright(pc)
  4026.                 jmp     move_down(pc)
  4027.                 jmp     move_downleft(pc)
  4028.                 jmp     move_downright(pc)
  4029.                 jmp     move_left(pc)
  4030.                 jmp     move_right(pc)
  4031.  
  4032.  
  4033. no_move         tst.b   p_direction(a3)
  4034.                 beq.b   .ok
  4035.                 move.b  p_direction(a3),p_lastdirection(a3)
  4036.                 clr.b   p_direction(a3)
  4037. .ok             rts
  4038.  
  4039. move_up         tst.b   p_noup(a3)
  4040.                 bne.b   .no
  4041.                 move    p_addwalky(a3),d0
  4042.                 sub     d0,bo_y(a0)
  4043. .no             move.b  p_direction(a3),p_lastdirection(a3)
  4044.                 move.b  #(DI_UP),p_direction(a3)
  4045.                 rts
  4046.  
  4047. move_upleft     tst.b   p_noup(a3)
  4048.                 bne.b   .no
  4049.                 tst.b   p_noleft(a3)
  4050.                 bne.b   .no
  4051.                 move    p_addwalky(a3),d0
  4052.                 sub     d0,bo_y(a0)
  4053.                 move    p_addwalkx(a3),d0
  4054.                 sub     d0,bo_x(a0)
  4055. .no             move.b  p_direction(a3),p_lastdirection(a3)
  4056.                 move.b  #(DI_UPLEFT),p_direction(a3)
  4057.                 rts
  4058.  
  4059. move_upright    tst.b   p_noup(a3)
  4060.                 bne.b   .no
  4061.                 tst.b   p_noright(a3)
  4062.                 bne.b   .no
  4063.  
  4064.                 move    p_addwalky(a3),d0
  4065.                 sub     d0,bo_y(a0)
  4066.                 move    p_addwalkx(a3),d0
  4067.                 add     d0,bo_x(a0)
  4068. .no             move.b  p_direction(a3),p_lastdirection(a3)
  4069.                 move.b  #(DI_UPRIGHT),p_direction(a3)
  4070.                 rts
  4071.  
  4072. move_down       tst.b   p_nodown(a3)
  4073.                 bne.b   .no
  4074.                 move    p_addwalky(a3),d0
  4075.                 add     d0,bo_y(a0)
  4076. .no             move.b  p_direction(a3),p_lastdirection(a3)
  4077.                 move.b  #(DI_DOWN),p_direction(a3)
  4078.                 rts
  4079.  
  4080. move_downleft   tst.b   p_nodown(a3)
  4081.                 bne.b   .no
  4082.                 tst.b   p_noleft(a3)
  4083.                 bne.b   .no
  4084.                 move    p_addwalky(a3),d0
  4085.                 add     d0,bo_y(a0)
  4086.                 move    p_addwalkx(a3),d0
  4087.                 sub     d0,bo_x(a0)
  4088. .no             move.b  p_direction(a3),p_lastdirection(a3)
  4089.                 move.b  #(DI_DOWNLEFT),p_direction(a3)
  4090.                 rts
  4091.  
  4092. move_downright  tst.b   p_nodown(a3)
  4093.                 bne.b   .no
  4094.                 tst.b   p_noright(a3)
  4095.                 bne.b   .no
  4096.                 move    p_addwalky(a3),d0
  4097.                 add     d0,bo_y(a0)
  4098.                 move    p_addwalkx(a3),d0
  4099.                 add     d0,bo_x(a0)
  4100. .no             move.b  p_direction(a3),p_lastdirection(a3)
  4101.                 move.b  #(DI_DOWNRIGHT),p_direction(a3)
  4102.                 rts
  4103.  
  4104. move_left       tst.b   p_noleft(a3)
  4105.                 bne.b   .no
  4106.                 move    p_addwalkx(a3),d0
  4107.                 sub     d0,bo_x(a0)
  4108. .no             move.b  p_direction(a3),p_lastdirection(a3)
  4109.                 move.b  #(DI_LEFT),p_direction(a3)
  4110.                 rts
  4111.  
  4112. move_right      tst.b   p_noright(a3)
  4113.                 bne.b   .no
  4114.  
  4115.                 move    p_addwalkx(a3),d0
  4116.                 add     d0,bo_x(a0)
  4117. .no             move.b  p_direction(a3),p_lastdirection(a3)
  4118.                 move.b  #(DI_RIGHT),p_direction(a3)
  4119.                 rts
  4120.  
  4121.  
  4122. ; ---- ANIMATE DYNAMITE/HORSE ----
  4123.  
  4124. animate_dynahorse
  4125.                 lea     _dynamite(pc),a3
  4126.                 tst.b   _dynaset
  4127.                 beq.b   .no
  4128.                 bsr.b   animate
  4129.  
  4130.                 cmp     #-4,d1
  4131.                 bne.b   .nofx
  4132.  
  4133.                 move    #$0502,d0
  4134.                 moveq   #1,d2
  4135.                 bsr.w   play_sfx                        ; explosion
  4136.                 st.b    _dynablow
  4137.  
  4138. .nofx           cmp     #-3,d1
  4139.                 bne.b   .no
  4140.  
  4141.  
  4142. ; ---- dynamite finish exploding ----
  4143.  
  4144.                 move.l  p_bob(a3),a0
  4145.                 move.b  #2,bo_inactive(a0)
  4146.                 clr.b   _dynablow
  4147.                 clr.b   _dynaset
  4148.  
  4149. .no             tst.b   _horseactive
  4150.                 beq.b   .nono
  4151.                 lea     _horse(pc),a3
  4152.                 bsr.b   animate
  4153.  
  4154.                 move.l  _horseman(pc),a0
  4155.                 tst.b   p_dead(a0)
  4156.                 bne.b   .nono
  4157.                 tst.b   p_nomove(a0)
  4158.                 bne.b   .nono
  4159.                 move.l  p_bob(a0),a1
  4160.                 cmp.b   #(DI_LEFT),p_direction(a3)
  4161.                 bne.b   .right
  4162.                 move    #(127),bo_image(a1)
  4163.                 rts
  4164. .right          move    #(135),bo_image(a1)
  4165.                 rts
  4166.  
  4167. .nono           rts
  4168.  
  4169. animate         subq.b  #1,p_animspdcount(a3)
  4170.                 beq.b   .ok
  4171.                 rts
  4172.  
  4173. .ok             move.b  p_animspeed(a3),p_animspdcount(a3)
  4174.                 move.l  p_animation(a3),a0
  4175.                 moveq   #0,d0
  4176.                 move.b  p_animpos(a3),d0
  4177.                 move    (a0,d0.l),d1
  4178.                 cmp     #-1,d1
  4179.                 beq.b   .reset
  4180.                 cmp     #-2,d1
  4181.                 beq.b   .dontcare
  4182.                 cmp     #-3,d1
  4183.                 beq.b   .is3
  4184.                 cmp     #-4,d1
  4185.                 beq.b   .is3
  4186.  
  4187.                 addq.b  #2,p_animpos(a3)
  4188.                 move.l  p_bob(a3),a0
  4189.                 move    d1,bo_image(a0)
  4190. .dontcare       rts
  4191.  
  4192. .is3            addq.b  #2,p_animpos(a3)
  4193.                 rts
  4194.  
  4195. .reset          clr.b   p_animpos(a3)
  4196.                 move.b  #1,p_animspdcount(a3)
  4197.                 rts
  4198.  
  4199.  
  4200. ; ---- ANIMATE ACTORS ----
  4201.  
  4202. animate_actors  move.l  p_bob(a3),a0
  4203.                 tst.b   bo_inactive(a0)
  4204.                 beq.b   .isactive
  4205.                 rts
  4206.  
  4207. .isactive       tst.b   p_animoff(a3)
  4208.                 beq.b   .animok
  4209.                 rts
  4210.  
  4211. .animok         moveq   #0,d0
  4212.                 tst.b   p_rigorgot(a3)
  4213.                 bne.w   a_rigor
  4214.                 tst.b   p_shooting(a3)
  4215.                 bne.w   a_shoot
  4216.                 cmp.b   #1,p_dead(a3)
  4217.                 beq.w   ai_die
  4218.                 tst.b   p_dead(a3)
  4219.                 bmi.b   continue_anim
  4220.  
  4221.                 move.b  p_direction(a3),d0
  4222.                 cmp.b   p_lastdirection(a3),d0
  4223.                 beq.b   continue_anim
  4224.                 move.b  #1,p_animspdcount(a3)
  4225.                 lsl     #2,d0
  4226.                 jmp     _animinittable(pc,d0.l)
  4227.  
  4228. _animinittable  jmp     ai_stop(pc)
  4229.                 jmp     ai_up(pc)
  4230.                 jmp     ai_upleft(pc)
  4231.                 jmp     ai_upright(pc)
  4232.                 jmp     ai_down(pc)
  4233.                 jmp     ai_downleft(pc)
  4234.                 jmp     ai_downright(pc)
  4235.                 jmp     ai_left(pc)
  4236.                 jmp     ai_right(pc)
  4237.  
  4238. ; ---- CONTINUE ANIMATIONS ----
  4239.  
  4240. continue_anim   subq.b  #1,p_animspdcount(a3)
  4241.                 beq.b   .ok
  4242.                 rts
  4243.  
  4244. .ok             move.b  p_animspeed(a3),p_animspdcount(a3)
  4245.                 move.l  p_animation(a3),a0
  4246.                 moveq   #0,d0
  4247.                 move.b  p_animpos(a3),d0
  4248.                 move    (a0,d0.l),d1
  4249.                 cmp     #-1,d1
  4250.                 beq.b   .reset
  4251.                 cmp     #-2,d1
  4252.                 beq.b   .dontcare
  4253.                 cmp     #-3,d1
  4254.                 beq.b   .addy
  4255.                 addq.b  #2,p_animpos(a3)
  4256.                 move.l  p_bob(a3),a0
  4257.                 move    d1,bo_image(a0)
  4258. .dontcare       rts
  4259.  
  4260. .addy           addq.b  #4,p_animpos(a3)
  4261.                 move    2(a0,d0.l),d1
  4262.                 move.l  p_bob(a3),a0
  4263.                 add     d1,bo_y(a0)
  4264.                 move.b  #1,p_animspdcount(a3)
  4265.                 bra.b   continue_anim
  4266.  
  4267. .reset          clr.b   p_animpos(a3)
  4268.                 move.b  #1,p_animspdcount(a3)
  4269.                 bra.b   continue_anim
  4270.  
  4271.  
  4272. ; ---- RIGOR MORTIS DRAGS THIS BODY ----
  4273.  
  4274. a_rigor         lea     _rigormortis(pc),a0
  4275.                 move.l  p_bob(a3),a1
  4276.                 moveq   #0,d0
  4277.                 move.b  p_direction(a0),d0              ; rigor direction
  4278.                 add     d0,d0
  4279. &nnbsp;               move.l  p_dragimages(a3),a0
  4280.                 move    (a0,d0.w),bo_image(a1)
  4281.                 rts
  4282.  
  4283. ; ---- INITIALISE ANIMATIONS ----
  4284.  
  4285. ai_stop         moveq   #0,d0
  4286.                 move.b  p_lastdirection(a3),d0
  4287.                 move.l  p_stopimages(a3),a1
  4288.                 add     d0,d0
  4289.                 move.l  p_bob(a3),a0
  4290.                 move    (a1,d0.l),bo_image(a0)
  4291.                 rts
  4292.  
  4293. a_shoot         moveq   #0,d0
  4294.                 move.b  p_lastdirection(a3),d0
  4295.                 move.l  p_shootimages(a3),a1
  4296.                 add     d0,d0
  4297.                 move.l  p_bob(a3),a0
  4298.                 move    (a1,d0.l),bo_image(a0)
  4299.                 rts
  4300.  
  4301. ai_up           move.l  p_animup(a3),a0
  4302.                 bra.b   ai_init
  4303. ai_upleft       move.l  p_animupleft(a3),a0
  4304.                 bra.b   ai_init
  4305. ai_upright      move.l  p_animupright(a3),a0
  4306.                 bra.b   ai_init
  4307. ai_down         move.l  p_animdown(a3),a0
  4308.                 bra.b   ai_init
  4309. ai_downleft     move.l  p_animdownleft(a3),a0
  4310.                 bra.b   ai_init
  4311. ai_downright    move.l  p_animdownright(a3),a0
  4312.                 bra.b   ai_init
  4313. ai_left         move.l  p_animleft(a3),a0
  4314.                 bra.b   ai_init
  4315. ai_right        move.l  p_animright(a3),a0
  4316.  
  4317. ai_init         move    (a0)+,d0
  4318.                 move.b  d0,p_animspeed(a3)      ; first byte is animspeed
  4319.                 move.b  #1,p_animspdcount(a3)
  4320.                 move.l  a0,p_animation(a3)
  4321.                 clr.b   p_animpos(a3)
  4322.                 rts
  4323.  
  4324. ai_die          move.l  p_animdie(a3),a0
  4325.                 clr.b   p_direction(a3)
  4326.                 clr.b   p_lastdirection(a3)
  4327.                 st.b    p_dead(a3)
  4328.                 bsr.b   ai_init
  4329.                 bra.w   continue_anim
  4330.  
  4331. _animtablesheriff       dc.l    _sheriffup
  4332.                         dc.l    _sheriffupleft
  4333.                         dc.l    _sheriffupright
  4334.                         dc.l    _sheriffdown
  4335.                         dc.l    _sheriffdownleft
  4336.                         dc.l    _sheriffdownright
  4337.                         dc.l    _sheriffleft
  4338.                         dc.l    _sheriffright
  4339.  
  4340. _animtableoutlaw        dc.l    _outlawup
  4341.                         dc.l    _outlawupleft
  4342.                         dc.l    _outlawupright
  4343.                         dc.l    _outlawdown
  4344.                         dc.l    _outlawdownleft
  4345.                         dc.l    _outlawdownright
  4346.                         dc.l    _outlawleft
  4347.                         dc.l    _outlawright
  4348.  
  4349. _animtableoutlawmoney   dc.l    _outlawup
  4350.                         dc.l    _outlawupleft
  4351.                         dc.l    _outlawupright
  4352.                         dc.l    _outlawdownm
  4353.                         dc.l    _outlawdownleftm
  4354.                         dc.l    _outlawdownrightm
  4355.                         dc.l    _outlawleftm
  4356.                         dc.l    _outlawrightm
  4357.  
  4358. _animtablehooker        dc.l    _hookerup
  4359.                         dc.l    _hookerupleft
  4360.                         dc.l    _hookerupright
  4361.                         dc.l    _hookerdown
  4362.                         dc.l    _hookerdownleft
  4363.                         dc.l    _hookerdownright
  4364.                         dc.l    _hookerleft
  4365.                         dc.l    _hookerright
  4366.  
  4367. _animtablerigor         dc.l    _rigorup
  4368.                         dc.l    _rigorupleft
  4369.                         dc.l    _rigorupright
  4370.                         dc.l    _rigordown
  4371.                         dc.l    _rigordownleft
  4372.                         dc.l    _rigordownright
  4373.                         dc.l    _rigorleft
  4374.                         dc.l    _rigorright
  4375.  
  4376. ; first word is animation speed
  4377.  
  4378. ; -1 to loop animation
  4379. ; -2 to end animation
  4380. ; -3,(VAL) to add to bob's y position (used when dying)
  4381.  
  4382. _sheriffup              dc      5,05,04,05,06,06,-1
  4383. _sheriffupleft          dc      5,29,28,29,30,30,-1
  4384. _sheriffupright         dc      5,25,24,25,26,26,-1
  4385. _sheriffdown            dc      5,01,00,01,02,02,-1
  4386. _sheriffdownleft        dc      5,21,20,21,22,22,-1
  4387. _sheriffdownright       dc      5,17,16,17,18,18,-1
  4388. _sheriffleft            dc      4,13,12,13,14,14,-1
  4389. _sheriffright           dc      4,09,08,09,10,10,-1
  4390. _sheriffstop            dc      0,5,29,25,1,21,17,13,9
  4391. _sheriffshoot           dc      0,7,31,27,3,23,19,15,11
  4392. _sheriffdie             dc      16,32,33,-2
  4393. _sheriffdrag            dc      0,34,38,37,34,34,34,35,36
  4394.  
  4395. _outlawup               dc      4,44,43,44,45,45,-1
  4396. _outlawupleft           dc      4,62,61,62,63,63,-1
  4397. _outlawupright          dc      4,59,58,59,60,60,-1
  4398. _outlawdown             dc      4,41,40,41,42,42,-1
  4399. _outlawdownleft         dc      4,56,55,56,57,57,-1
  4400. _outlawdownright        dc      4,53,52,53,54,54,-1
  4401. _outlawleft             dc      6,50,49,50,51,51,-1
  4402. _outlawright            dc      6,47,46,47,48,48,-1
  4403. _outlawstop             dc      0,44,62,59,41,56,53,50,47
  4404. _outlawshoot            dc      0,44,62,59,41,56,53,50,47
  4405. _outlawdrag             dc      0,120,124,123,120,120,120,121,122
  4406.  
  4407. _outlawdownm            dc      4,65,64,65,66,66,-1
  4408. _outlawdownleftm        dc      4,77,76,77,78,78,-1
  4409. _outlawdownrightm       dc      4,71,70,71,72,72,-1
  4410. _outlawleftm            dc      6,74,73,74,75,75,-1
  4411. _outlawrightm           dc      6,68,67,68,69,69,-1
  4412. _outlawdie              dc      16,125,-3,6,126,-2
  4413.  
  4414. _horsemanshootleft      dc      0,133,134,132,129,128,130,127,131
  4415. _horsemanshootright     dc      0,141,140,142,137,138,136,139,135
  4416. _horsemanstop           dc      0,44,62,59,41,56,53,146,138
  4417. _horsemandrag           dc      0,147,39,79,120,120,120,148,149
  4418. _horsemandieleft        dc      8,143,143,-3,11,145,146,-2
  4419. _horsemandieright       dc      8,144,144,-3,11,145,146,-2
  4420.  
  4421. _drawmanleft            dc      4,153,150,153,151,151,-1
  4422. _drawmandie &nnbsp;           dc      16,154,-3,6,155,-2
  4423.  
  4424. _hookerup               dc      6,90,91,-1
  4425. _hookerupleft           dc      6,92,93,-1
  4426. _hookerupright          dc      6,94,95,-1
  4427. _hookerdown             dc      6,80,81,-1
  4428. _hookerdownleft         dc      6,88,89,-1
  4429. _hookerdownright        dc      6,86,87,-1
  4430. _hookerleft             dc      6,84,85,-1
  4431. _hookerright            dc      6,82,83,-1
  4432. _hookerstop             dc      80,80,80,80,80,80,80,80,80
  4433.  
  4434. _rigorup                dc      3,100,099,100,101,101,-1
  4435. _rigorupleft            dc      3,118,117,118,119,119,-1
  4436. _rigorupright           dc      3,115,114,115,116,116,-1
  4437. _rigordown              dc      3,097,096,097,098,098,-1
  4438. _rigordownleft          dc      3,109,108,109,110,110,-1
  4439. _rigordownright         dc      3,112,111,112,113,113,-1
  4440. _rigorleft              dc      4,103,102,103,104,104,-1
  4441. _rigorright             dc      4,106,105,106,107,107,-1
  4442. _rigorstop              dc      100,100,118,115,097,109,112,103,106
  4443.  
  4444. _animdynamite           dc      4,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0
  4445.                         dc      -4,2,5,2,3,4,3,2,6,5,6,-3
  4446.  
  4447. _animhorseleft          dc      3,8,9,10,11,-1
  4448. _animhorseright         dc      3,12,13,14,15,-1
  4449.  
  4450.  
  4451. ;--------------------------------------
  4452. ; Game Engine © 1997 Seasons.
  4453. ;
  4454. ; GRAPHICS: BLITTER OPERATIONS
  4455. ;--------------------------------------
  4456.  
  4457. ;---- BLIT A BOB TO SCREEN ----
  4458. ; X (d0) Y (d1) BOB (d2) BOB (a3)
  4459. blit_bob        lea     _boblookuptable(pc),a1
  4460.                 moveq   #2,d3
  4461.                 lsl     d3,d2
  4462.                 move.l  (a1,d2.l),a0                    ; bob image
  4463.  
  4464.                 move.l  bo_maskoff(a3),d3
  4465.                 lea     (a0,d3.l),a1                    ; bob mask
  4466.  
  4467.                 tst.b   bo_maskmade(a3)
  4468.                 beq.b   .3
  4469.                 move.l  bo_newmask(a3),a1
  4470.  
  4471. .3              move.l  _dscreen(pc),a2
  4472.  
  4473.                 mulu    #(SCRWIDTH),d1
  4474.                 lea     (a2,d1.l),a2                    ; bpl address
  4475.  
  4476.                 move    d0,d1
  4477.                 moveq   #4,d3
  4478.                 lsr     d3,d0
  4479.                 add     d0,d0
  4480.                 lea     (a2,d0.l),a2                    ; bpl
  4481.  
  4482.                 move.l  #$0FCA,d3                       ; ABC|ABc|aBC|abC/UABCD
  4483.  
  4484.                 tst.b   bo_maskmade(a3)
  4485.                 bne.b   .noshift
  4486.  
  4487.                 moveq   #15,d0
  4488.                 and     d0,d1
  4489.                 moveq   #4,d0
  4490.                 ror     d0,d1
  4491.                 or      d1,d3
  4492.                 swap    d3
  4493.                 move    d1,d3                           ; d0=bltcon0/1
  4494.                 bra.b   .1
  4495.  
  4496. .noshift        moveq   #15,d0
  4497.                 and     d0,d1
  4498.                 moveq   #4,d0
  4499.                 ror     d0,d1
  4500.                 swap    d3
  4501.                 move    d1,d3
  4502.  
  4503. .1              move    bo_height(a3),d2
  4504.                 moveq   #6,d1
  4505.                 lsl     d1,d2
  4506.                 addq    #(BOBWIDTH/2),d2                ; bltsize
  4507.  
  4508.                 move    bo_height(a3),d1
  4509.                 mulu    #(BOBWIDTH),d1                  ; one plane
  4510.  
  4511.                 moveq   #-1,d0
  4512.                 CALLGRAF        WaitBlit
  4513.  
  4514.                 move.l  d0,BLTAFWM(a5)                  ; mask=$FFFFFFFF
  4515.  
  4516.                 moveq   #(SCRWIDTH-BOBWIDTH),d0
  4517.                 move.l  d0,BLTAMOD(a5)                  ; amod=0/dmod=34
  4518.                 swap    d0
  4519.                 move.l  d0,BLTCMOD(a5)                  ; cmod=34/bmod=0
  4520.  
  4521.                 moveq   #(NUMPLANES-1),d0
  4522. .2              CALL    WAITBLIT
  4523.                 move.l  a0,BLTBPT(a5)                   ; image ptr
  4524.                 move.l  a1,BLTAPT(a5)                   ; mask
  4525.                 move.l  a2,BLTCPT(a5)
  4526.                 move.l  a2,BLTDPT(a5)                   ; C/D=dest
  4527.                 move.l  d3,BLTCON0(a5)                  ; bltcon0/1 set
  4528.                 move    d2,BLTSIZE(a5)                  ; blit!
  4529.                 lea     PLANE_SIZE(a2),a2
  4530.                 add     d1,a0
  4531.                 dbf     d0,.2
  4532.                 rts
  4533.  
  4534. ;---- BLIT AN EXPANDED (48PIX WIDE/42PIX HIGH) BOB TO SCREEN ----
  4535. ; X (d0) Y (d1) BOB (d2) BOB (a3)
  4536. blit_expbob     lea     _expbobdata,a0
  4537.  
  4538.                 mulu    #(8*42*NUMPLANES)+(8*42),d2
  4539.                 add.l   d2,a0                           ; image
  4540.  
  4541.                 lea     8*42*NUMPLANES(a0),a1           ; mask
  4542.  
  4543.                 move.l  _dscreen(pc),a2
  4544.  
  4545.                 mulu    #(SCRWIDTH),d1
  4546.                 lea     (a2,d1.l),a2                    ; bpl address
  4547.  
  4548.                 move    d0,d1
  4549.                 moveq   #4,d3
  4550.                 lsr     d3,d0
  4551.                 add     d0,d0
  4552.                 lea     (a2,d0.l),a2                    ; bpl
  4553.  
  4554.                 move.l  #$0FCA,d3                       ; ABC|ABc|aBC|abC/UABCD
  4555.  
  4556.                 moveq   #15,d0
  4557.                 and     d0,d1
  4558.                 moveq   #4,d0
  4559.                 ror     d0,d1
  4560.                 or      d1,d3
  4561.                 swap    d3
  4562.                 move    d1,d3                           ; d0=bltcon0/1
  4563.  
  4564. .1              move    #(42*64+4),d2                   ; bltsize
  4565.  
  4566.                 move    #(42*8),d1                      ; one plane
  4567.  
  4568.                 moveq   #-1,d0
  4569.                 CALLGRAF        WaitBlit
  4570.  
  4571.       &nbsnbsp;         move.l  d0,BLTAFWM(a5)                  ; mask=$FFFFFFFF
  4572.  
  4573.                 moveq   #(SCRWIDTH-8),d0
  4574.                 move.l  d0,BLTAMOD(a5)                  ; amod=0/dmod=34
  4575.                 swap    d0
  4576.                 move.l  d0,BLTCMOD(a5)                  ; cmod=34/bmod=0
  4577.  
  4578.                 moveq   #(NUMPLANES-1),d0
  4579. .2              CALL    WAITBLIT
  4580.                 move.l  a0,BLTBPT(a5)                   ; image ptr
  4581.                 move.l  a1,BLTAPT(a5)                   ; mask
  4582.                 move.l  a2,BLTCPT(a5)
  4583.                 move.l  a2,BLTDPT(a5)                   ; C/D=dest
  4584.                 move.l  d3,BLTCON0(a5)                  ; bltcon0/1 set
  4585.                 move    d2,BLTSIZE(a5)                  ; blit!
  4586.                 lea     PLANE_SIZE(a2),a2
  4587.                 add     d1,a0
  4588.                 dbf     d0,.2
  4589.                 rts
  4590.  
  4591. ; ---- BLIT 32WIDE BLOCK TO SCREEN ----
  4592.  
  4593. ; X (D0) Y (D1) HEIGHT (D2)
  4594. ; Mask (A0)
  4595.  
  4596. blit_block      movem.l d0-d3/a0-a1,-(sp)
  4597.                 move.l  _dscreen(pc),a1
  4598.                 mulu    #(SCRWIDTH),d1
  4599.                 lea     (a1,d1.l),a1                    ; bpl
  4600.                 add     d0,d0
  4601.                 add     d0,a1
  4602.  
  4603.                 move.l  d2,d1
  4604.                 lsl     #6,d2
  4605.                 addq    #2,d2                           ; size of blit
  4606.  
  4607.                 lsl     #2,d1                           ; size of plane
  4608.  
  4609.                 moveq   #(SCRWIDTH-4),d0
  4610.  
  4611.                 move.l  #$09F0,d3
  4612.                 swap    d3
  4613.  
  4614.                 CALLGRAF        WaitBlit
  4615.  
  4616.                 move.l  d0,BLTAMOD(a5)                  ; Amod=XX/Dmod=0
  4617.                 moveq   #-1,d0
  4618.                 move.l  d0,BLTAFWM(a5)                  ; mask=$FFFFFFFF
  4619.  
  4620.                 moveq   #(NUMPLANES-1),d0
  4621. .2              CALL    WaitBlit
  4622.                 move.l  a0,BLTAPT(a5)                   ; data
  4623.                 move.l  a1,BLTDPT(a5)                   ; C/D=dest
  4624.                 move.l  d3,BLTCON0(a5)
  4625.                 move    d2,BLTSIZE(a5)                  ; start blitter
  4626.                 lea     PLANE_SIZE(a1),a1
  4627.                 add     d1,a0
  4628.                 dbf     d0,.2
  4629.                 movem.l (sp)+,d0-d3/a0-a1
  4630.                 rts
  4631.  
  4632. ; ---- BLIT 32WIDE MASK TO BACKMASK ----
  4633.  
  4634. ; X (D0) Y (D1) HEIGHT (D2)
  4635. ; Graph (A0)
  4636.  
  4637. blit_mask       lea     _backmask,a1
  4638.                 mulu    #40,d1
  4639.                 lea     (a1,d1.l),a1                    ; bpl
  4640.                 add     d0,d0
  4641.                 add     d0,a1
  4642.  
  4643.                 move.l  d2,d1
  4644.                 moveq   #6,d3
  4645.                 lsl     d3,d2
  4646.                 addq    #2,d2                           ; size of blit
  4647.                 moveq   #2,d3
  4648.                 lsl     d3,d1                           ; size of plane
  4649.  
  4650.                 moveq   #(40-4),d0
  4651.  
  4652.                 move.l  #$09F0,d3
  4653.                 swap    d3
  4654.  
  4655.                 CALLGRAF        WaitBlit
  4656.  
  4657.                 move.l  d0,BLTAMOD(a5)                  ; Amod=XX/Dmod=0
  4658.                 moveq   #-1,d0
  4659.                 move.l  d0,BLTAFWM(a5)                  ; mask=$FFFFFFFF
  4660.  
  4661.                 move.l  a0,BLTAPT(a5)                   ; data
  4662.                 move.l  a1,BLTDPT(a5)                   ; C/D=dest
  4663.                 move.l  d3,BLTCON0(a5)
  4664.                 move    d2,BLTSIZE(a5)                  ; start blitter
  4665.                 CALL    WaitBlit
  4666.                 rts
  4667.  
  4668. ;---- SAVE BACKGROUND BENEATH BOB ----
  4669. ; x (d0) y (d1) buffer (a0)
  4670.  
  4671. save_back       move.l  #$09F0,d3
  4672.                 swap    d3
  4673.                 move.l  _dscreen(pc),a1
  4674.                 mulu    #(SCRWIDTH),d1
  4675.                 lea     (a1,d1.l),a1                    ; bpl
  4676.                 moveq   #4,d1
  4677.                 lsr     d1,d0
  4678.                 add     d0,d0
  4679.                 lea     (a1,d0),a1                      ; bpl
  4680.  
  4681.                 move    bo_height(a3),d2
  4682.                 moveq   #6,d1
  4683.                 lsl     d1,d2
  4684.                 addq    #3,d2                           ; blitsize
  4685.  
  4686.                 move    bo_height(a3),d1
  4687.                 mulu    #(BOBWIDTH),d1                  ; one plane
  4688.  
  4689.                 moveq   #(SCRWIDTH-BOBWIDTH),d0
  4690.                 swap    d0
  4691.                 CALLGRAF        WaitBlit
  4692.  
  4693.                 move.l  d0,BLTAMOD(a5)
  4694.  
  4695.                 moveq   #(NUMPLANES-1),d0
  4696. .2              CALL    WaitBlit
  4697.                 move.l  a1,BLTAPT(a5)                   ; mask
  4698.                 move.l  a0,BLTDPT(a5)                   ; C/D=dest
  4699.                 move.l  d3,BLTCON0(a5)
  4700.                 move    d2,BLTSIZE(a5)                  ; start blitter
  4701.                 lea     PLANE_SIZE(a1),a1
  4702.                 add     d1,a0
  4703.                 dbf     d0,.2
  4704.                 rts
  4705.  
  4706. ;---- RESTORE BACKGROUND OVER BOB ----
  4707. ; x (d0) y (d1) buffer (a0)
  4708.  
  4709. restore_back    move.l  #$09F0,d3
  4710.                 swap    d3
  4711.  
  4712.                 move.l  _dscreen(pc),a1
  4713.                 mulu    #(SCRWIDTH),d1
  4714.                 lea     (a1,d1.l),a1                    ; bpl
  4715.                 moveq   #4,d1
  4716.                 lsr     d1,d0
  4717.                 add     d0,d0
  4718.                 lea     (a1,d0),a1                      ; bpl
  4719.  
  4720.                 move    bo_height(a3),d2
  4721.                 moveq   #6,d1
  4722.                 lsl     d1,d2
  4723.                 addq    #3,d2                           ; bltsize
  4724.  
  4725.                 move    bo_height(a3),d1
  4726.                 mulu    #(BOBWIDTH),d1             nbsp;     ; one plane
  4727.  
  4728.                 moveq   #(SCRWIDTH-BOBWIDTH),d0
  4729.                 CALLGRAF        WaitBlit
  4730.                 move.l  d0,BLTAMOD(a5)                  ; A/D = 34/0
  4731.  
  4732.                 moveq   #(NUMPLANES-1),d0
  4733. .2              CALL    WaitBlit
  4734.                 move.l  a0,BLTAPT(a5)                   ; mask
  4735.                 move.l  a1,BLTDPT(a5)                   ; C/D=dest
  4736.                 move.l  d3,BLTCON0(a5)                  ; 0/1 set
  4737.                 move    d2,BLTSIZE(a5)                  ; start blitter
  4738.                 lea     PLANE_SIZE(a1),a1
  4739.                 add     d1,a0
  4740.                 dbf     d0,.2
  4741.                 rts
  4742.  
  4743. ;---- SAVE BACKGROUND BENEATH EXPANDED BOB ----
  4744. ; x (d0) y (d1) buffer (a0)
  4745.  
  4746. save_expback    move.l  #$09F0,d3
  4747.                 swap    d3
  4748.                 move.l  _dscreen(pc),a1
  4749.                 mulu    #(SCRWIDTH),d1
  4750.                 lea     (a1,d1.l),a1                    ; bpl
  4751.                 moveq   #4,d1
  4752.                 lsr     d1,d0
  4753.                 add     d0,d0
  4754.                 lea     (a1,d0),a1                      ; bpl
  4755.  
  4756.                 move    #(42*64+4),d2                   ; bltsize
  4757.  
  4758.                 move    #(42*8),d1                      ; oneplane
  4759.  
  4760.                 moveq   #(SCRWIDTH-8),d0
  4761.                 swap    d0
  4762.                 CALLGRAF        WaitBlit
  4763.  
  4764.                 move.l  d0,BLTAMOD(a5)
  4765.  
  4766.                 moveq   #(NUMPLANES-1),d0
  4767. .2              CALL    WaitBlit
  4768.                 move.l  a1,BLTAPT(a5)                   ; mask
  4769.                 move.l  a0,BLTDPT(a5)                   ; C/D=dest
  4770.                 move.l  d3,BLTCON0(a5)
  4771.                 move    d2,BLTSIZE(a5)                  ; start blitter
  4772.                 lea     PLANE_SIZE(a1),a1
  4773.                 add     d1,a0
  4774.                 dbf     d0,.2
  4775.                 rts
  4776.  
  4777. ;---- RESTORE BACKGROUND OVER EXPANDED BOB ----
  4778. ; x (d0) y (d1) buffer (a0)
  4779.  
  4780. restore_expback move.l  #$09F0,d3
  4781.                 swap    d3
  4782.  
  4783.                 move.l  _dscreen(pc),a1
  4784.                 mulu    #(SCRWIDTH),d1
  4785.                 lea     (a1,d1.l),a1                    ; bpl
  4786.                 moveq   #4,d1
  4787.                 lsr     d1,d0
  4788.                 add     d0,d0
  4789.                 lea     (a1,d0),a1                      ; bpl
  4790.  
  4791.                 move    #(42*64+4),d2                   ; bltsize
  4792.                 move    #(42*8),d1                      ; oneplane
  4793.  
  4794.                 moveq   #(SCRWIDTH-8),d0
  4795.                 CALLGRAF        WaitBlit
  4796.                 move.l  d0,BLTAMOD(a5)                  ; A/D = 34/0
  4797.  
  4798.                 moveq   #(NUMPLANES-1),d0
  4799. .2              CALL    WaitBlit
  4800.                 move.l  a0,BLTAPT(a5)                   ; mask
  4801.                 move.l  a1,BLTDPT(a5)                   ; C/D=dest
  4802.                 move.l  d3,BLTCON0(a5)                  ; 0/1 set
  4803.                 move    d2,BLTSIZE(a5)                  ; start blitter
  4804.                 lea     PLANE_SIZE(a1),a1
  4805.                 add     d1,a0
  4806.                 dbf     d0,.2
  4807.                 rts
  4808.  
  4809. ; ---- CREATE NEW MASK FOR BOB ("BEHIND BACKGROUNDS") ----
  4810.  
  4811. create_mask     move.l  p_bob(a3),a0
  4812.                 tst.b   bo_inactive(a0)
  4813.                 beq.w   .isactive
  4814.  
  4815. .isactive       cmp     #82,bo_y(a0)
  4816.                 beq.b   .makemask
  4817.                 clr.b   bo_maskmade(a0)
  4818.                 rts
  4819.  
  4820. .makemask       st.b    bo_maskmade(a0)
  4821.  
  4822.                 moveq   #0,d2
  4823.                 move    bo_image(a0),d2
  4824.  
  4825.                 lea     _boblookuptable(pc),a1
  4826.                 moveq   #2,d3
  4827.                 lsl     d3,d2
  4828.                 move.l  (a1,d2.l),a1                    ; bob image
  4829.                 add.l   bo_maskoff(a0),a1               ; mask
  4830.  
  4831. ;               mulu    #(BOBWIDTH*BOBHEIGHT*NUMPLANES)+132,d2
  4832. ;               add     #(BOBSIZE),d2
  4833. ;               lea     (a1,d2.l),a1                    ; A1 = image mask
  4834.  
  4835.                 lea     _backmask,a2                    ; A2 = backmask
  4836.  
  4837.                 move.l  #$0D00+(A&B),d3
  4838.  
  4839.                 moveq   #0,d0
  4840.                 move    bo_x(a0),d0
  4841.                 moveq   #32,d1
  4842.                 sub     d1,d0
  4843.  
  4844.                 move    d0,d1
  4845.                 lsr     #4,d0
  4846.                 add     d0,d0
  4847.                 lea     (a2,d0),a2                      ; bpl
  4848.                 moveq   #15,d0
  4849.                 and     d0,d1
  4850.                 moveq   #4,d0
  4851.                 ror     d0,d1
  4852.                 or      d1,d3
  4853.                 swap    d3
  4854.  
  4855.                 move    #(BOBHEIGHT*64+(BOBWIDTH/2)),d2         ; bltsize
  4856.  
  4857.                 moveq   #-1,d0
  4858.                 moveq   #0,d1
  4859.                 CALLGRAF        WaitBlit
  4860.  
  4861.                 move.l  d0,BLTAFWM(a5)                  ; mask=$FFFFFFFF
  4862.  
  4863.                 move    d1,BLTAMOD(a5)
  4864.                 move    d1,BLTDMOD(a5)
  4865.                 moveq   #(40-BOBWIDTH),d0
  4866.                 move    d0,BLTBMOD(a5)
  4867.  
  4868.                 move.l  a1,BLTAPT(a5)                   ; image mask
  4869.                 move.l  a2,BLTBPT(a5)                   ; background mask
  4870.                 move.l  bo_newmask(a0),a0
  4871.                 move.l  a0,BLTDPT(a5)
  4872.                 move.l  d3,BLTCON0(a5)
  4873.                 move    d2,BLTSIZE(a5)                  ; blit!
  4874.                 CALL    WaitBlit
  4875.                 rts
  4876.  
  4877.  
  4878. ;---- WAIT FOR BEAM SYNC ----
  4879.  
  4880. wait_sync       btst    #0,5(a5)
  4881.                 bne.b   wait_sync
  4882. .1              btst    #0,5(a5)
  4883.                 beq.b   .1
  4884.                 rts
  4885.  
  4886. ;---- SHOW SCREEN -----
  4887.  
  4888. show_screen     lea     _copbitplaneptrs+2,a0
  4889.                 move.l  _screenswap1(pc),a1
  4890.                 move    (a1)+,(a0)
  4891.                 addq    #4,a0
  4892.                 move    (a1)+,(a0)
  4893.                 addq    #4,a0
  4894.                 move    (a1)+,(a0)
  4895.                 addq    #4,a0
  4896.                 move    (a1)+,(a0)
  4897.                 addq    #4,a0
  4898.                 move    (a1)+,(a0)
  4899.                 addq    #4,a0
  4900.                 move    (a1)+,(a0)
  4901.                 addq    #4,a0
  4902.                 move    (a1)+,(a0)
  4903.                 addq    #4,a0
  4904.                 move    (a1)+,(a0)
  4905.                 addq    #4,a0
  4906.                 move    (a1)+,(a0)
  4907.                 addq    #4,a0
  4908.                 move    (a1)+,(a0)
  4909.                 rts
  4910.  
  4911. ;---- SWAP SCREENS ----
  4912.  
  4913. swap_screens    not.b   _swapflag
  4914.                 move.l  _screen(pc),d7
  4915.                 move.l  _dscreen(pc),_screen
  4916.                 move.l  d7,_dscreen
  4917.                 move.l  _screenswap1(pc),d7
  4918.                 move.l  _screenswap2(pc),_screenswap1
  4919.                 move.l  d7,_screenswap2
  4920.                 rts
  4921.  
  4922.  
  4923. ;---- INITIALISE SCREEN SWAPPING ----
  4924.  
  4925. init_screenswap
  4926.                 move.l  _screen(pc),d0
  4927.                 lea     _screen1swap(pc),a0
  4928.                 move.l  a0,_screenswap1
  4929.                 moveq   #(NUMPLANES-1),d1
  4930. .1              swap    d0
  4931.                 move    d0,(a0)+
  4932.                 swap    d0
  4933.                 move    d0,(a0)+
  4934.                 add.l   #(PLANE_SIZE),d0
  4935.                 dbf     d1,.1
  4936.                 move.l  _dscreen(pc),d0
  4937.                 lea     _screen2swap(pc),a0
  4938.                 move.l  a0,_screenswap2
  4939.                 moveq   #(NUMPLANES-1),d1
  4940. .2              swap    d0
  4941.                 move    d0,(a0)+
  4942.                 swap    d0
  4943.                 move    d0,(a0)+
  4944.                 add.l   #(PLANE_SIZE),d0
  4945.                 dbf     d1,.2
  4946.                 rts
  4947.  
  4948. ;---- READ SELECTED CONTROL DEVICE FOR PLAYER ----
  4949. ; playerstructure (a3)
  4950.  
  4951. read_device     move.l  p_bob(a3),a0
  4952.                 tst.b   bo_inactive(a0)
  4953.                 bne.b   .no
  4954.                 move.l  p_device(a3),d0
  4955.                 tst.b   p_dead(a3)
  4956.                 beq.b   .notdead
  4957.                 tst.b   _bonusdraw
  4958.                 bne.b   .notdead
  4959.                 moveq   #(DEV_CPU),d0
  4960. .notdead        jmp     _devicetable(pc,d0.l)
  4961. .no             rts
  4962.  
  4963.                 CNOP    0,4
  4964. _devicetable    jmp     read_joystick0(pc)
  4965.                 jmp     read_joystick1(pc)
  4966.                 jmp     computer_control(pc)
  4967.                 jmp     read_none(pc)
  4968.  
  4969. read_none       rts
  4970.  
  4971. ; ---- DEVICE: JOYSTICK 1 ----
  4972.  
  4973. read_joystick1  tst.b   _bonusdraw
  4974.                 bne.b   .onlybutton
  4975.                 move    JOY1DAT(a5),d0
  4976.                 and     #$0303,d0
  4977.                 bclr    #8,d0
  4978.                 beq.b   .1
  4979.                 or.b    #%00000100,d0
  4980. .1              bclr    #9,d0
  4981.                 beq.b   .2
  4982.                 or.b    #%00001000,d0
  4983. .2              move.b  _joyreference(pc,d0.l),p_joystick(a3)
  4984.                 btst.b  #7,$BFE0FF
  4985.                 seq     p_fire(a3)
  4986.                 rts
  4987.  
  4988. .onlybutton     btst.b  #7,$BFE0FF
  4989.                 seq     p_fire(a3)
  4990.                 clr.b   p_joystick(a3)
  4991.                 rts
  4992.  
  4993. ; ---- DEVICE: JOYSTICK 0 ----
  4994.  
  4995. read_joystick0  tst.b   _bonusdraw
  4996.                 bne.b   .onlybutt
  4997.                 move    JOY0DAT(a5),d0
  4998.                 and     #$0303,d0
  4999.                 bclr    #8,d0
  5000.                 beq.b   .1
  5001.                 or.b    #%00000100,d0
  5002. .1              bclr    #9,d0
  5003.                 beq.b   .2
  5004.                 or.b    #%00001000,d0
  5005. .2              move.b  _joyreference(pc,d0.l),p_joystick(a3)
  5006.                 btst    #6,$BFE001
  5007.                 seq     p_fire(a3)
  5008.                 rts
  5009. .onlybutt       btst    #6,$BFE001
  5010.                 seq     p_fire(a3)
  5011.                 clr.b   p_joystick(a3)
  5012.                 rts
  5013.  
  5014.                 CNOP    0,4
  5015. _joyreference   dc.b    0,D_DOWN,D_DOWNRIGHT,D_RIGHT,D_UP
  5016.                 dc.b    0,0,D_UPRIGHT,D_UPLEFT,0,0,0,D_LEFT,D_DOWNLEFT,0,0
  5017.  
  5018.  
  5019. ; ---- WALKSEQUENCE CODE FOR BANK ROBBERS ----
  5020. ; -> sequence info data (D0)
  5021.  
  5022. walkseqcode_bankrobbery
  5023.                 cmp     #-1,d0
  5024.                 beq.w   remove_outlaw
  5025.                 cmp     #1,d0
  5026.                 beq.b   .gotmoney
  5027.                 rts
  5028.  
  5029. .gotmoney       lea     _animtableoutlawmoney(pc),a0
  5030.                 lea     p_animup(a3),a1
  5031.                 moveq   #7,d0
  5032. .2              move.l  (a0)+,(a1)+
  5033.                 dbf     d0,.2
  5034.                 st.b    p_noshoot(a3)
  5035.                 rts
  5036.  
  5037. ; ---- WALKSEQUENCE CODE FOR KIDNAPPERS ----
  5038. ; -> sequence info data (D0)
  5039.  
  5040. walkseqcode_kidnapping
  5041.                 cmp     #-1,d0
  5042.                 beq.w   remove_outlaw
  5043.                 cmp     #1,d0
  5044.                 beq.b   .hookertaken
  5045.                 rts
  5046.  
  5047. .hookertaken    move.l  a3,a0
  5048.                 bsr.w   add_hooker
  5049.                 tst.l   d0
  5050.                 bmi.b   .nono
  5051.                 st.b    p_noshoot(a0)
  5052.                 move.l  a3,p_outlawhooker(a0)
  5053.                 move.l  a0,p_hookeroutlaw(a3)
  5054.                 move.l  p_bob(a0),a0
  5055.                 move    bo_x(a0),bo_x(a2)
  5056.                 move    bo_y(a0),bo_y(a2)
  5057. .nono           rts
  5058.  
  5059. ; ---- WALKSEQUENCE CODE FOR DYNAMITE MAN ----
  5060. ; -> sequence info data (D0)
  5061.  
  5062. walkseqcode_dynamite
  5063.                 cmp     #-1,d0
  5064.                 beq.w   remove_outlaw
  5065.                 cmp     #1,d0
  5066.                 beq.b   put_dynamite
  5067.                 rts
  5068.  
  5069. put_dynamite    move.l  p_bob(a3),a1
  5070.                 clr.b   p_nevershoot(a3)
  5071.                 lea     _animdynamite(pc),a0
  5072.  
  5073.                 lea     _dynamite(pc),a0
  5074.                 lea     _animdynamite(pc),a2
  5075.                 move    (a2)+,d0
  5076.                 move.b  d0,p_animspeed(a0)      ; first byte is animspeed
  5077.                 move.b  #1,p_animspdcount(a0)
  5078.                 move.l  a2,p_animation(a0)
  5079.                 clr.b   p_animpos(a0)
  5080.  
  5081.                 st.b    _dynaset
  5082.                 clr.b   _dynamiteinrange
  5083.  
  5084.                 move.l  p_bob(a0),a0
  5085.                 move    bo_x(a1),d0
  5086.                 sub     #16,d0
  5087.                 move    d0,bo_x(a0)
  5088.                 move    bo_y(a1),d0
  5089.                 sub     #16,d0
  5090.                 move    d0,bo_y(a0)
  5091.  
  5092.                 clr.b   bo_inactive(a0)
  5093.                 st.b    bo_firstflag(a0)
  5094.                 move    #0,bo_image(a0)
  5095.  
  5096.                 clr.b   _dynamiteactive
  5097.  
  5098.                 subq.b  #1,_numoutlaws
  5099.  
  5100.                 bra.w   type_bankrobber
  5101.  
  5102. ; ---- WALK SEQUENCE CODE FOR KILLERS ----
  5103.  
  5104. walkseqcode_killer
  5105.                 cmp     #1,d0
  5106.                 beq.b   .newposition
  5107.                 rts
  5108.  
  5109. .newposition    clr     p_walkseqpos(a3)
  5110.                 lea     p_walksequence(a3),a0
  5111.                 move.l  #272,d0
  5112.                 bsr.w   random
  5113.                 add     #32,d0
  5114.                 move    d0,(a0)         ; new dest. x
  5115.                 moveq   #83,d0
  5116.                 bsr.w   random
  5117.                 add     #88,d0
  5118.                 move    d0,2(a0)        ; new dest. y
  5119.                 rts
  5120.  
  5121. WALKCOUNT       = 16
  5122.  
  5123.  
  5124. ; ---- DEVICE: COMPUTER CONTROL ----
  5125.  
  5126. computer_control
  5127.                 tst.b   p_rigorgot(a3)
  5128.                 bne.w   follow_rigor
  5129.  
  5130. .wa             cmp.b   #(OT_HORSE),p_type(a3)
  5131.                 beq.w   control_horse
  5132.                 cmp.b   #(OT_HORSEMAN),p_type(a3)
  5133.                 beq.w   control_horseman
  5134.                 cmp.b   #(OT_DYNAMAN),p_type(a3)
  5135.                 beq.w   control_dynaman
  5136. .ok             cmp.b   #(OT_HOOKER),p_type(a3)
  5137.                 beq.w   control_hooker
  5138.  
  5139. must_walk       tst.b   p_dead(a3)
  5140.                 bne.b   .nowalk
  5141.  
  5142.                 tst.b   p_nomove(a3)
  5143.                 beq.b   .walk
  5144.  
  5145. .nowalk         tst.b   _bonusdraw
  5146.                 bne.b   .noclr
  5147.                 clr.b   p_joystick(a3)
  5148.                 clr.b   p_fire(a3)
  5149. .noclr          rts
  5150.  
  5151. .walk           move.l  p_bob(a3),a0
  5152.                 movem   bo_x(a0),d0/d1
  5153.  
  5154.                 cmp.b   #5,_wave
  5155.                 beq.b   .ddd
  5156.  
  5157.                 tst.b   p_noshoot(a3)
  5158.                 bne.b   .ddd
  5159.                 cmp     #82,d1
  5160.                 seq     p_noshoot(a3)
  5161.  
  5162. .ddd            lea     p_walksequence(a3),a1
  5163.                 add     p_walkseqpos(a3),a1
  5164.                 movem   (a1)+,d2/d3
  5165.  
  5166.                 lsr     #2,d2
  5167.                 add     d2,d2
  5168.                 add     d2,d2
  5169.  
  5170.                 lsr     #2,d0
  5171.                 add     d0,d0
  5172.                 add     d0,d0
  5173.  
  5174.                 cmp     d2,d0
  5175.                 bne.b   .1
  5176.                 cmp     d3,d1
  5177.                 bne.b   .1
  5178.  
  5179.                 lea     p_walksequence(a3),a1
  5180.                 add     p_walkseqpos(a3),a1
  5181.                 move    4(a1),d0
  5182.                 addq    #6,p_walkseqpos(a3)
  5183.                 move.l  p_walkseqcode(a3),a1
  5184.                 jmp     (a1)                    ; walkseq checking
  5185.  
  5186. .1              addq    #1,p_scorecount(a3)
  5187.                 move    _scorecounter(pc),d0
  5188.                 cmp     p_scorecount(a3),d0
  5189.                 bne.b   .nono
  5190.  
  5191.                 move    _scoresub(pc),d0
  5192.                 sub     d0,p_score(a3)
  5193.                 tst     p_score(a3)
  5194.                 bpl.b   .okokok
  5195.                 add     d0,p_score(a3)          ; minus not allowed
  5196.  
  5197. .okokok         clr     p_scorecount(a3)
  5198.  
  5199. .nono           tst.b   p_noshoot(a3)
  5200.                 bne.b   .noshoot
  5201.  
  5202.                 move    _shootfrequency(pc),d0
  5203.                 bsr.w   random
  5204.                 tst     d0
  5205.                 bne.b   .noshoot
  5206.                 st.b    p_fire(a3)
  5207.                 rts
  5208.  
  5209. .noshoot        clr.b   p_fire(a3)
  5210.  
  5211.                 movem   bo_x(a0),d0/d1
  5212.                 cmp     d3,d1                   ; y positions equal?
  5213.                 beq.w   .leftright
  5214.                 cmp     d2,d0                   ; x positions equal?
  5215.                 beq.w   .updown
  5216.  
  5217.                 cmp     d3,d1
  5218.                 blo.b   .downdown
  5219.  
  5220.                 cmp     d2,d0
  5221.                 blo.b   .mupright
  5222.                 bra.b   .mupleft
  5223.  
  5224. .downdown       cmp     d2,d0
  5225.                 blo.w   .mdownright
  5226.                 bra.w   .mdownleft
  5227.  
  5228. ; ---- walk up and right ----
  5229.  
  5230. .mupright       tst.b   p_walkcntx(a3)
  5231.                 beq.b   .no
  5232.                 subq.b  #1,p_walkcntx(a3)
  5233.                 bne.w   .right
  5234.  
  5235. .no             tst.b   p_noup(a3)
  5236.                 bne.w   .right
  5237.  
  5238.                 move    bo_y(a0),d0             ; horizontal distance
  5239.                 sub     p_desty(a3),d0
  5240.                 move    d0,d1
  5241.                 add     bo_x(a0),d1
  5242.  
  5243.                 sub     p_destx(a3),d1          ; overflow
  5244.                 beq.w   .upright                ; no, will reach
  5245.  
  5246.                 cmp     #8,d0                   ; distance less than 8?
  5247.                 ble.w   .right                  ; forced alignment
  5248.  
  5249.                 tst.b   p_xalign(a3)
  5250.                 bne.b   .align
  5251.  
  5252.                 move.b  d0,p_xalign(a3)
  5253.                 rts
  5254.  
  5255. .align          moveq   #10,d0
  5256.                 bsr.w   random
  5257.                 cmp     #8,d0
  5258.                 ble.b   .no11
  5259.                 move.b  #(WALKCOUNT),p_walkcntx(a3)
  5260.                 subq.b  #1,p_xalign(a3)
  5261.                 rts
  5262. .no11           clr.b   p_walkcntx(a3)
  5263.                 bra.w   .upright
  5264.  
  5265. ; ---- walk up and left ----
  5266.  
  5267. .mupleft        tst.b   p_walkcntx(a3)
  5268.                 beq.b   .no21
  5269.                 subq.b  #1,p_walkcntx(a3)
  5270.                 bne.w   .left
  5271.  
  5272. .no21           tst.b   p_noup(a3)
  5273.                 bne.w   .left
  5274.  
  5275.                 move    bo_y(a0),d0             ; horizontal distance
  5276.                 sub     p_desty(a3),d0
  5277.                 move    d0,d1
  5278.                 add     bo_x(a0),d1
  5279.  
  5280.                 sub     p_destx(a3),d1          ; overflow
  5281.                 beq.w   .upleft         ; no, will reach
  5282.  
  5283.                 cmp     #8,d0                   ; distance less than 8?
  5284.                 ble.w   .left                   ; forced alignment
  5285.  
  5286.                 tst.b   p_xalign(a3)
  5287.                 bne.b   .align2
  5288.  
  5289.                 move.b  d0,p_xalign(a3)
  5290.                 rts
  5291.  
  5292. .align2         moveq   #10,d0
  5293.                 bsr.w   random
  5294.                 cmp     #8,d0
  5295.                 ble.b   .no12
  5296.                 move.b  #(WALKCOUNT),p_walkcntx(a3)
  5297.                 subq.b  #1,p_xalign(a3)
  5298.                 rts
  5299.  
  5300. .no12           clr.b   p_walkcntx(a3)
  5301.                 bra.w   .upleft
  5302.  
  5303.  
  5304. ; ---- walk down and left ----
  5305.  
  5306. .mdownleft      tst.b   p_walkcntx(a3)
  5307.                 beq.b   .no22
  5308.                 subq.b  #1,p_walkcntx(a3)
  5309.                 bne.w   .left
  5310.  
  5311. .no22           tst.b   p_nodown(a3)
  5312.                 bne.w   .left
  5313.  
  5314.                 move    bo_y(a0),d0             ; horizontal distance
  5315.                 sub     p_desty(a3),d0
  5316.                 move    d0,d1
  5317.                 add     bo_x(a0),d1
  5318.  
  5319.                 sub     p_destx(a3),d1          ; overflow
  5320.                 beq.w   .downleft               ; no, will reach
  5321.  
  5322.                 cmp     #192,d0                 ; distance less than 8?
  5323.                 bge.w   .left                   ; forced alignment
  5324.  
  5325.                 tst.b   p_xalign(a3)
  5326.                 bne.b   .align3
  5327.  
  5328.                 move.b  d0,p_xalign(a3)
  5329.                 rts
  5330.  
  5331. .align3         moveq   #10,d0
  5332.                 bsr.w   random
  5333.                 cmp     #8,d0
  5334.                 ble.b   .no13
  5335.                 move.b  #(WALKCOUNT),p_walkcntx(a3)
  5336.                 subq.b  #1,p_xalign(a3)
  5337.                 rts
  5338. .no13           clr.b   p_walkcntx(a3)
  5339.                 bra.w   .downleft
  5340.  
  5341. ; ---- walk down and right ----
  5342.  
  5343. .mdownright     tst.b   p_walkcntx(a3)
  5344.                 beq.b   .no23
  5345.                 subq.b  #1,p_walkcntx(a3)
  5346.                 bne.b   .right
  5347.  
  5348. .no23           tst.b   p_nodown(a3)
  5349.                 bne.b   .right
  5350.                 move    bo_y(a0),d0             ; horizontal distance
  5351.                 sub     p_desty(a3),d0
  5352.                 move    d0,d1
  5353.                 add     bo_x(a0),d1
  5354.  
  5355.                 sub     p_destx(a3),d1          ; overflow
  5356.                 beq.b   .downright              ; no, will reach
  5357.  
  5358.                 cmp     #192,d0                 ; distance less than 8?
  5359.                 bge.b   .left                   ; forced alignment
  5360.  
  5361.                 tst.b   p_xalign(a3)
  5362.                 bne.b   .align4
  5363.  
  5364.                 move.b  d0,p_xalign(a3)
  5365.                 rts
  5366.  
  5367. .align4         moveq   #10,d0
  5368.                 bsr.w   random
  5369.                 cmp     #8,d0
  5370.                 ble.b   .no14
  5371.                 move.b  #(WALKCOUNT),p_walkcntx(a3)
  5372.                 subq.b  #1,p_xalign(a3)
  5373.                 rts
  5374. .no14           clr.b   p_walkcntx(a3)
  5375.                 bra.b   .downright
  5376.  
  5377. ; ---- walk left or right ----
  5378.  
  5379. .leftright      cmp     d2,d0
  5380.                 blo.b   .right
  5381.  
  5382. .left           move.b  #(D_LEFT),p_joystick(a3)
  5383.                 rts
  5384. .right          move.b  #(D_RIGHT),p_joystick(a3)
  5385.                 rts
  5386.  
  5387. ; ---- walk up or down ----
  5388.  
  5389. .updown         cmp     d3,d1
  5390.                 blo.b   .down
  5391. .up             move.b  #(D_UP),p_joystick(a3)
  5392.                 rts
  5393. .down           move.b  #(D_DOWN),p_joystick(a3)
  5394.                 rts
  5395.  
  5396. .upleft         move.b  #(D_UPLEFT),p_joystick(a3)
  5397.                 rts
  5398. .upright        move.b  #(D_UPRIGHT),p_joystick(a3)
  5399.                 rts
  5400. .downleft       move.b  #(D_DOWNLEFT),p_joystick(a3)
  5401.                 rts
  5402. .downright      move.b  #(D_DOWNRIGHT),p_joystick(a3)
  5403.                 rts
  5404.  
  5405.  
  5406. ; ---- UPDATE HOOKER ----
  5407.  
  5408. control_hooker  tst.b   p_runhome(a3)
  5409.                 bne.w   must_walk
  5410.                 move.l  p_hookeroutlaw(a3),d0
  5411.                 beq.b   .runhome
  5412.                 move.l  d0,a0
  5413.                 tst.b   p_dead(a0)
  5414.                 bne.b   .runhome
  5415.                 move.b  p_direction(a0),p_direction(a3)
  5416.                 move.l  p_bob(a3),a3
  5417.                 move.l  p_bob(a0),a1
  5418.                 move    bo_x(a1),bo_x(a3)
  5419.                 move    bo_y(a1),bo_y(a3)
  5420.                 rts
  5421. .runhome        st.b    p_runhome(a3)
  5422.                 rts
  5423.  
  5424.  
  5425. ; ---- FOLLOW RIGOR (DRAGGING) ----
  5426.  
  5427. follow_rigor    lea     _rigormortis(pc),a2
  5428.                 move.l  p_bob(a2),a0
  5429.                 move.l  p_bob(a3),a1
  5430.  
  5431.                 move    bo_x(a0),d2
  5432.                 move    bo_y(a0),d3
  5433.  
  5434.                 moveq   #0,d0
  5435.                 move.b  p_direction(a2),d0
  5436.                 lsl     #2,d0
  5437.                 add     _dragoffsets(pc,d0.w),d2
  5438.                 add     _dragoffsets+2(pc,d0.w),d3
  5439.  
  5440.                 move    d2,bo_x(a1)
  5441.                 move    d3,bo_y(a1)
  5442.                 rts
  5443.  
  5444. _dragoffsets    dc.l    0
  5445.                 dc      -2,2    ; up
  5446.                 dc      2,4     ; upleft
  5447.                 dc      -4,4    ; upright
  5448.                 dc.l    0       ; down
  5449.                 dc.l    0       ; downl
  5450.                 dc.l    0       ; downr
  5451.                 dc      10,0    ; left
  5452.                 dc      -10,0   ; right
  5453.  
  5454. ; ---- CONTROL DYNAMITE MANIAC ----
  5455.  
  5456. control_dynaman tst.b   _dynamiteactive
  5457.                 bne.b   .ok
  5458.                 rts
  5459.  
  5460. .ok             cmp     #$FFFF,_hero1dead               ; both heros dead?
  5461.                 beq.w   gotohell
  5462.  
  5463. .ok2            lea     _player1(pc),a0
  5464.                 tst.b   _dynamitepl2
  5465.                 beq.b   .nono
  5466.                 lea     _player2(pc),a0
  5467. .nono           move.l  _dynamiteman(pc),a3
  5468.                 tst.b   p_dead(a3)
  5469.                 bne.b   .ok23
  5470.                 lea     p_walksequence(a3),a2
  5471.                 move.l  p_bob(a0),a0
  5472.                 movem   bo_x(a0),d0/d1
  5473.                 move    d0,(a2)
  5474.                 move    d1,2(a2)
  5475.  
  5476.                 move.l  p_bob(a3),a2
  5477.                 movem   bo_x(a2),d2/d3
  5478.  
  5479.                 sub     #24,d0
  5480.                 cmp     d2,d0
  5481.                 bhi.b   .3
  5482.                 add     #24+24,d0
  5483.                 cmp     d2,d0
  5484.                 blo.b   .3
  5485.  
  5486.                 sub     #20,d1
  5487.                 cmp     d3,d1
  5488.                 bhi.b   .3
  5489.                 add     #20+22,d1
  5490.                 cmp     d3,d1
  5491.                 blo.b   .3
  5492.  
  5493.                 bsr.w   put_dynamite
  5494.  
  5495. .3              lea     _player1(pc),a0
  5496.                 tst.b   _hero1dead
  5497.                 bne.b   .pl2
  5498.  
  5499.                 tst.b   _dynamitepl2
  5500.                 beq.b   .no22
  5501. .pl2            lea     _player2(pc),a0
  5502.  
  5503. .no22           move.l  p_bob(a0),a0
  5504.                 tst.b   bo_maskmade(a0)
  5505.                 bne.b   .rt
  5506. .ok23           bra.w   must_walk
  5507. .rt             clr.b   p_joystick(a3)
  5508.                 rts
  5509.  
  5510. gotohell        clr.b   _dynamiteactive
  5511.                 clr.b   p_type(a3)
  5512.                 subq.b  #1,_numoutlaws
  5513.                 bra.w   type_bankrobber
  5514.  
  5515. ; ---- CONTROL HORSE ----
  5516.  
  5517. control_horse   tst.b   _horseactive
  5518.                 bne.b   .ok22
  5519.                 rts
  5520. .ok22           move.l  p_bob(a3),a0
  5521.                 tst.b   bo_inactive(a0)
  5522.                 beq.b   .ok
  5523.                 rts
  5524.  
  5525. .ok             subq.b  #1,_horsefxcount
  5526.                 bne.b   .nonewfx
  5527.  
  5528.                 move    #$0503,d0
  5529.                 moveq   #2,d2
  5530.                 bsr.w   play_sfx
  5531.  
  5532.                 move.b  #20,_horsefxcount
  5533.  
  5534.  
  5535. .nonewfx        move    _horseshootfreq(pc),d0
  5536.                 bsr.w   random
  5537.                 move.l  _horseman(pc),a0
  5538.                 tst     d0
  5539.                 seq.b   p_fire(a0)                      ; horseman shoots
  5540. .nono           move.l  p_bob(a3),a0
  5541.  
  5542.                 cmp.b   #(DI_RIGHT),p_direction(a3)
  5543.                 beq.b   .isright
  5544.                 tst     bo_x(a0)
  5545.                 ble.b   .removehorse
  5546.                 subq    #2,bo_x(a0)
  5547.                 rts
  5548.  
  5549. .isright        cmp     #320,bo_x(a0)
  5550.                 beq.b   .removehorse
  5551.                 addq    #2,bo_x(a0)
  5552.                 rts
  5553.  
  5554. .removehorse    move.b  #2,bo_inactive(a0)
  5555.                 clr.b   _horseactive
  5556.  
  5557.                 move.l  _horseman(pc),a3
  5558.                 tst.b   p_dead(a3)
  5559.                 bne.b   .nomove
  5560.                 bra.w   remove_outlaw
  5561. .nomove         rts
  5562.  
  5563. _horsefxcount   dc.b    1,0
  5564.  
  5565.  
  5566. ; ---- CONTROL HORSEMAN ----
  5567.  
  5568. control_horseman
  5569.                 tst.b   _horseactive
  5570.                 bne.b   .ok
  5571.                 rts
  5572. .ok             move.l  _horseman(pc),a3
  5573.                 tst.b   p_dead(a3)
  5574.                 bmi.b   .nono
  5575.  
  5576.                 move.l  p_bob(a3),a1
  5577.  
  5578.                 lea     _horse(pc),a0
  5579.                 move.l  p_bob(a0),a0
  5580.                 movem   bo_x(a0),d0/d1
  5581.  
  5582.                 addq    #8,d0
  5583.                 move    d0,bo_x(a1)
  5584.                 addq    #3,d1
  5585.                 move    d1,bo_y(a1#41;
  5586.  
  5587. .nono           rts
  5588.  
  5589. ; -----------------------------------------
  5590. ;
  5591. ;             PLAYER STRUCTURE
  5592. ;
  5593. ; -----------------------------------------
  5594.  
  5595.                 RSRESET
  5596. p_bob           RS.L    1               ; APTR general bob structure
  5597. p_device        RS.L    1               ; selected device for player
  5598. p_animation     RS.L    1               ; APTR animation sequence
  5599. p_animup        RS.L    1
  5600. p_animupleft    RS.L    1
  5601. p_animupright   RS.L    1
  5602. p_animdown      RS.L    1
  5603. p_animdownleft  RS.L    1
  5604. p_animdownright RS.L    1
  5605. p_animleft      RS.L    1
  5606. p_animright     RS.L    1
  5607. p_animdie       RS.L    1
  5608. p_stopimages    RS.L    1               ; images used when idle
  5609. p_shootimages   RS.L    1               ; images used when shooting
  5610. p_dragimages    RS.L    1               ; images used when dragged
  5611. p_walkseqcode   RS.L    1               ; APTR code for checking in sequences
  5612. p_hookeroutlaw  RS.L    1               ; APTR which outlaw took the hooker
  5613. p_outlawhooker  RS.L    1               ; APTR which hooker took the outlaw
  5614. p_rigorbody     RS.L    1               ; APTR which body has Rig. Mortis
  5615. p_plscore       RS      1               ; score for player
  5616. p_lifescore     RS      1               ; score to get extra life
  5617. p_zone          RS      1               ; zone for actor
  5618. p_building      RS      1               ; which building actor's in
  5619. p_xlimit1       RS      1               ; horiz. walk limitation x1
  5620. p_xlimit2       RS      1
  5621. p_destx         RS      1               ; destination x
  5622. p_desty         RS      1               ; destination y
  5623. p_walkseqpos    RS      1
  5624. p_score         RS      1               ; current score for this outlaw
  5625. p_scorecount    RS      1
  5626. p_lives         RS      1               ; number of lives yet
  5627. p_addwalkx      RS      1
  5628. p_addwalky      RS      1
  5629. p_walkdirx      RS.B    1               ; * must be even
  5630. p_walkdiry      RS.B    1
  5631. p_joystick      RS.B    1               ; joystick input
  5632. p_direction     RS.B    1               ; current direction
  5633. p_lastdirection RS.B    1               ; previous direction
  5634. p_fire          RS.B    1               ; firebutton status
  5635. p_walkspeed     RS.B    1               ; speed of walking
  5636. p_walkspdcount  RS.B    1               ; * auto
  5637. p_animpos       RS.B    1               ; * auto
  5638. p_animspeed     RS.B    1               ; * auto
  5639. p_animspdcount  RS.B    1               ; * auto
  5640. p_nomove        RS.B    1               ; set if no move
  5641. p_noup          RS.B    1               ; set if can't move up
  5642. p_nodown        RS.B    1
  5643. p_noleft        RS.B    1
  5644. p_noright       RS.B    1
  5645. p_shootcounter  RS.B    1
  5646. p_shootdelay    RS.B    1
  5647. p_shooting      RS.B    1               ; set if shooting
  5648. p_walkcntx      RS.B    1
  5649. p_walkcnty      RS.B    1
  5650. p_xalign        RS.B    1
  5651. p_dead          RS.B    1               ; set if dead
  5652. p_noshoot       RS.B    1               ; set if (outlaw) can't shoot
  5653. p_cantdie       RS.B    1               ; set if can't die
  5654. p_rigorgot      RS.B    1               ; set if Rig. got this body
  5655. p_type          RS.B    1               ; type of bob
  5656. p_runhome       RS.B    1               ; set if hooker running home
  5657. p_animoff       RS.B    1               ; set if autoanimation off
  5658. p_nevershoot    RS.B    1               ; set if neverever shooting
  5659. p_notwalking    RS.B    2               ; drawman stuff
  5660. p_walksequence  RS.B    36
  5661. p_sizeof        RS.B    0
  5662.  
  5663.  
  5664. _player1        blk.b   (P_SIZEOF),0
  5665. _player2        blk.b   (P_SIZEOF),0
  5666. _outlaws        blk.b   (P_SIZEOF*MAXOUTLAWS),0
  5667. _hookers        blk.b   (P_SIZEOF*MAXHOOKERS),0
  5668. _rigormortis    blk.b   (P_SIZEOF),0
  5669. _dynamite       blk.b   (P_SIZEOF),0
  5670. _horse          blk.b   (P_SIZEOF),0
  5671.  
  5672. ; -----------------------------------------
  5673. ;
  5674. ;         INITIALISATIONS FOR GAME
  5675. ;
  5676. ; -----------------------------------------
  5677.  
  5678. init_allstructs bsr.w   init_sheriffstructures
  5679.                 bsr.w   init_outlawstructures
  5680.                 bsr.w   init_hookerstructures
  5681.                 bsr.w   init_rigorstructure
  5682.                 bsr.w   init_dynastructure
  5683.                 bsr.w   init_horsestructure
  5684. ;               bsr.w   init_drawlist
  5685.                 rts
  5686.  
  5687.  
  5688. ; ---- INITIALISE BOBSTRUCTURES ----
  5689.  
  5690. init_bobstructures
  5691.                 moveq   #(MAXBOBS-1),d0
  5692.  
  5693.                 lea     _player1(pc),a2
  5694.                 move.l  _bobmemory(pc),a1
  5695.                 lea     _bobstructs(pc),a0
  5696. .initloop       move.l  a1,bo_buffer1(a0)
  5697.                 add.l   #(BOBSIZE),a1
  5698.                 move.l  a1,bo_buffer2(a0)
  5699.                 add.l   #(BOBSIZE),a1
  5700.                 move.l  a1,bo_newmask(a0)
  5701.                 add.l   #(BOBPLANE),a1
  5702.                 move.l  #(BOBSIZE),bo_maskoff(a0)
  5703.                 clr.l   bo_x(a0)                        ; clear x/y
  5704.                 clr.l   bo_oldx1(a0)
  5705.                 clr.l   bo_oldx2(a0)
  5706.                 st.b    bo_inactive(a0)
  5707.                 st.b    bo_firstflag(a0)
  5708.                 clr.b   bo_maskmade(a0)
  5709.                 clr.b   bo_expanded(a0)
  5710.                 move    #(BOBHEIGHT),bo_height(a0)
  5711.                 move.l  a0,p_bob(a2)
  5712.                 lea     BO_SIZEOF(a0),a0
  5713.                 lea     P_SIZEOF(a2),a2
  5714.                 dbf     d0,.initloop
  5715.                 rts
  5716.  
  5717. ; ---- SET ALL BOBS INACTIVE ----
  5718.  
  5719. bobs_inactive   moveq   #(MAXBOBS-3),d0
  5720.  
  5721.                 lea     _outlaws(pc),a2
  5722. .initloop       st.b    bo_inactive(a0)
  5723.                 st.b    bo_firstflag(a0)
  5724.                 lea     BO_SIZEOF(a0),a0
  5725.                 dbf     d0,.initloop
  5726.                 rts
  5727.  
  5728. ; ---- SET ALL BULLETS INACTIVE ----
  5729.  
  5730. bullets_inactive
  5731.                 moveq   #(MAXBULLETS-1),d0
  5732.  
  5733.                 lea     _bullets(pc),a0
  5734. .initloop       clr.b   b_active(a0)
  5735.                 add     #(B_SIZEOF),a0
  5736.                 dbf     d0,.initloop
  5737.                 rts
  5738.  
  5739.  
  5740. ; ---- INITIALISE SHERIFF STRUCTURES ----
  5741.  
  5742. init_sheriffstructures
  5743.                 lea     _player1(pc),a3
  5744.                 move.l  p_bob(a3),a0
  5745.                 tst.b   _hero1dead
  5746.                 sne     bo_inactive(a0)
  5747.                 st.b    bo_firstflag(a0)
  5748.                 move.l  #(DEV_JOY1),p_device(a3)
  5749.                 move.b  #(OT_SHERIFF1),p_type(a3)
  5750.                 bsr.b   .setsheriff
  5751.  
  5752.                 lea     _player2(pc),a3
  5753.                 move.l  p_bob(a3),a0
  5754.                 tst.b   _hero2dead
  5755.                 sne     bo_inactive(a0)
  5756.                 st.b    bo_firstflag(a0)
  5757.                 move.l  #(DEV_JOY0),p_device(a3)
  5758.                 move.b  #(OT_SHERIFF2),p_type(a3)
  5759.  
  5760. .setsheriff     move.l  #_sheriffstop,p_stopimages(a3)
  5761.                 move.l  #_sheriffshoot,p_shootimages(a3)
  5762.                 move.l  #_sheriffdie,p_animdie(a3)
  5763.                 move.l  #_sheriffdrag,p_dragimages(a3)
  5764.                 clr.l   p_walkseqcode(a3)
  5765.                 clr     p_zone(a3)
  5766.                 clr     p_building(a3)
  5767.                 move    #2,p_addwalkx(a3)
  5768.                 move    #1,p_addwalky(a3)
  5769.                 move.b  #2,p_walkspeed(a3)
  5770.                 move.b  #1,p_walkspdcount(a3)
  5771.                 move.b  #1,p_animspdcount(a3)
  5772.                 move.b  #(DI_DOWN),p_direction(a3)
  5773.                 clr.b   p_lastdirection(a3)
  5774.                 clr.b   p_joystick(a3)
  5775.                 clr.b   p_fire(a3)
  5776.                 clr.b   p_nomove(a3)
  5777.                 clr.b   p_noup(a3)
  5778.                 clr.b   p_nodown(a3)
  5779.                 clr.b   p_noleft(a3)
  5780.                 clr.b   p_noright(a3)
  5781.                 clr.b   p_noshoot(a3)
  5782.                 clr.b   p_dead(a3)
  5783.                 clr.b   p_animpos(a3)
  5784.                 clr.b   p_shooting(a3)
  5785.                 clr.b   p_cantdie(a3)
  5786.                 clr.b   p_rigorgot(a3)
  5787.                 clr.b   p_animoff(a3)
  5788.                 clr.b   p_nevershoot(a3)
  5789.                 move.b  #1,p_shootcounter(a3)
  5790.                 move.b  #22,p_shootdelay(a3)
  5791.  
  5792.                 lea     _animtablesheriff(pc),a2
  5793.                 lea     p_animup(a3),a1
  5794.                 moveq   #7,d0
  5795. .1              move.l  (a2)+,(a1)+
  5796.                 dbf     d0,.1
  5797. .out            rts
  5798.  
  5799. ; ---- INITIALISE OUTLAW STRUCTURES ----
  5800.  
  5801. init_outlawstructures
  5802.                 clr.b   _numoutlaws
  5803.  
  5804.                 lea     _outlaws(pc),a3
  5805.  
  5806.                 moveq   #(MAXOUTLAWS-1),d0
  5807.  
  5808. .outlawloop     move.l  #(DEV_CPU),p_device(a3)
  5809.  
  5810.                 move.l  #_outlawstop,p_stopimages(a3)
  5811.                 move.l  #_outlawshoot,p_shootimages(a3)
  5812.                 move.l  #_outlawdrag,p_dragimages(a3)
  5813.  
  5814.                 move    #1,p_addwalkx(a3)
  5815.                 move    #1,p_addwalky(a3)
  5816.  
  5817.                 move.b  #2,p_walkspeed(a3)
  5818.                 move.b  #1,p_walkspdcount(a3)
  5819.                 move.b  #1,p_animspdcount(a3)
  5820.                 move.b  #(DI_RIGHT),p_direction(a3)
  5821.                 st.b    p_lastdirection(a3)
  5822.                 move.b  #10,p_shootdelay(a3)
  5823.                 clr.b   p_dead(a3)
  5824.                 clr.b   p_nevershoot(a3)
  5825.                 clr     p_score(a3)
  5826.                 clr.b   p_animpos(a3)
  5827.                 clr.b   p_cantdie(a3)
  5828.                 clr.b   p_animoff(a3)
  5829.                 clr.b   p_shooting(a3)
  5830.                 clr.b   p_noshoot(a3)
  5831.  
  5832.                 lea     _animtableoutlaw(pc),a2
  5833.                 lea     p_animup(a3),a1
  5834.                 moveq   #7,d1
  5835. .2              move.l  (a2)+,(a1)+
  5836.                 dbf     d1,.2
  5837.  
  5838.                 lea     _outlawdie(pc),a2
  5839.                 move.l  a2,p_animdie(a3)
  5840.  
  5841.                 lea     P_SIZEOF(a3),a3
  5842.                 dbf     d0,.outlawloop
  5843.                 rts
  5844.  
  5845. ; ---- INITIALISE HOOKER STRUCTURES ----
  5846.  
  5847. init_hookerstructures
  5848.                 lea     _hookers(pc),a3
  5849.  
  5850.                 moveq   #(MAXHOOKERS-1),d0
  5851.  
  5852. .outlawloop     move.l  #(DEV_CPU),p_device(a3)
  5853.  
  5854.                 lea     _hookersequence(pc),a0
  5855.                 lea     p_walksequence(a3),a1
  5856.                 moveq   #1,d1
  5857. .1              move.l  (a0)+,(a1)+
  5858.                 move.l  (a0)+,(a1)+
  5859.                 move.l  (a0)+,(a1)+
  5860.                 move.l  (a0)+,(a1)+
  5861.                 dbf     d1,.1
  5862.                 move.l  (a0)+,(a1)+
  5863.  
  5864.                 lea     walkseqcode_hooker(pc),a0
  5865.                 move.l  a0,p_walkseqcode(a3)
  5866.  
  5867.                 move.l  #_hookerstop,p_stopimages(a3)
  5868.                 move.b  #(OT_HOOKER),p_type(a3)
  5869.  
  5870.                 move    #1,p_addwalkx(a3)
  5871.                 move    #1,p_addwalky(a3)
  5872.  
  5873.                 st.b    p_noshoot(a3)
  5874.                 st.b    p_cantdie(a3)
  5875.                 clr.b   p_dead(a3)
  5876.                 clr.l   p_hookeroutlaw(a3)
  5877.                 move.b  #2,p_walkspeed(a3)
  5878.                 move.b  #1,p_walkspdcount(a3)
  5879.                 move.b  #1,p_animspdcount(a3)
  5880.                 move.b  #(DI_RIGHT),p_direction(a3)
  5881.                 move.b  #(DI_RIGHT),p_lastdirection(a3)
  5882.  
  5883.                 move.l  p_bob(a3),a0
  5884.                 move    #80,bo_image(a0)
  5885.                 st.b    bo_inactive(a0)
  5886.  
  5887.                 lea     _animtablehooker(pc),a2
  5888.                 lea     p_animup(a3),a1
  5889.                 moveq   #7,d1
  5890. .2              move.l  (a2)+,(a1)+
  5891.                 dbf     d1,.2
  5892.                 lea     P_SIZEOF(a3),a3
  5893.                 dbf     d0,.outlawloop
  5894.                 rts
  5895.  
  5896.  
  5897. _hookersequence dc&nnbsp;     19*8-4,84,0     ; sal. entrance
  5898.                 dc      19*8-4,82,0     ; inside
  5899.                 dc      16*8-4,82,-1    ; inside saloon left
  5900.                 dc      0,0,0           ; inside
  5901.                 dc      0,0,0           ; sal. entrance
  5902.                 dc      0,0,0           ; and run away
  5903.  
  5904. ; ---- WALK SEQUENCE CODE FOR HOOKERS ----
  5905.  
  5906. walkseqcode_hooker
  5907.                 tst     d0
  5908.                 bmi.b   remove_hooker
  5909.                 rts
  5910. remove_hooker   clr     p_walkseqpos(a3)
  5911.                 clr.b   p_runhome(a3)
  5912.                 move.l  p_bob(a3),a0
  5913.                 move.b  #2,bo_inactive(a0)
  5914.                 rts
  5915.  
  5916. ; ---- INITIALISE RIGOR MORTIS STRUCTURE ----
  5917.  
  5918. init_rigorstructure
  5919.                 lea     _rigormortis(pc),a3
  5920.  
  5921. .outlawloop     move.l  #(DEV_CPU),p_device(a3)
  5922.  
  5923.                 move.l  #_rigorstop,p_stopimages(a3)
  5924.                 st.b    p_noshoot(a3)
  5925.                 move.b  #(OT_RIGOR),p_type(a3)
  5926.  
  5927.                 move    #2,p_addwalkx(a3)
  5928.                 move    #1,p_addwalky(a3)
  5929.  
  5930.                 st.b    p_cantdie(a3)
  5931.                 move.b  #1,p_walkspeed(a3)
  5932.                 move.b  #1,p_walkspdcount(a3)
  5933.                 move.b  #1,p_animspdcount(a3)
  5934.                 move.b  #(DI_RIGHT),p_direction(a3)
  5935.                 st.b    p_lastdirection(a3)
  5936.  
  5937.                 lea     _animtablerigor(pc),a2
  5938.                 lea     p_animup(a3),a1
  5939.                 moveq   #7,d1
  5940. .2              move.l  (a2)+,(a1)+
  5941.                 dbf     d1,.2
  5942.                 rts
  5943.  
  5944. ; ---- INIT DYNAMITE STRUCTURE ----
  5945.  
  5946. init_dynastructure
  5947.                 lea     _dynamite(pc),a3
  5948.  
  5949.                 move.l  #(DEV_NONE),p_device(a3)
  5950.  
  5951.                 st.b    p_nomove(a3)
  5952.                 st.b    p_noshoot(a3)
  5953.                 move.b  #(OT_DYNA),p_type(a3)
  5954.                 st.b    p_cantdie(a3)
  5955.                 move.b  #1,p_walkspeed(a3)
  5956.                 move.b  #1,p_walkspdcount(a3)
  5957.                 move.b  #1,p_animspdcount(a3)
  5958. ;               move.b  #(DI_UP),p_direction(a3)
  5959. ;               st.b    p_lastdirection(a3)
  5960.  
  5961. ;               lea     _animdynamite(pc),a0
  5962. ;               lea     p_animup(a3),a1
  5963. ;               move.l  a0,(a1)
  5964.  
  5965.                 move.l  p_bob(a3),a0
  5966.                 lea     _dynabuff1,a1
  5967.                 move.l  a1,bo_buffer1(a0)
  5968.                 lea     _dynabuff2,a1
  5969.                 move.l  a1,bo_buffer2(a0)
  5970.                 st.b    bo_expanded(a0)
  5971.                 move    #42,bo_height(a0)
  5972.                 st.b    p_animoff(a3)
  5973.                 rts
  5974.  
  5975. ; ---- INITIALISE HORSESTRUCTURE ----
  5976.  
  5977. init_horsestructure
  5978.                 lea     _horse(pc),a3
  5979.  
  5980.                 move.l  #(DEV_CPU),p_device(a3)
  5981.  
  5982.                 st.b    p_nomove(a3)
  5983.                 st.b    p_noshoot(a3)
  5984.                 st.b    p_nevershoot(a3)
  5985.                 move.b  #(OT_HORSE),p_type(a3)
  5986.                 st.b    p_cantdie(a3)
  5987.                 move.b  #1,p_walkspeed(a3)
  5988.                 move.b  #1,p_walkspdcount(a3)
  5989.                 move.b  #1,p_animspdcount(a3)
  5990.                 clr.b   p_direction(a3)
  5991.                 clr.b   p_lastdirection(a3)
  5992.                 move.l  p_bob(a3),a0
  5993.                 lea     _horsebuff1,a1
  5994.                 move.l  a1,bo_buffer1(a0)
  5995.                 lea     _horsebuff2,a1
  5996.                 move.l  a1,bo_buffer2(a0)
  5997.                 st.b    bo_expanded(a0)
  5998.                 move    #42,bo_height(a0)
  5999.                 st.b    p_animoff(a3)
  6000.                 rts
  6001.  
  6002.                 CNOP    0,4
  6003.  
  6004. _drawlist       blk.l   (MAXBOBS+1),0
  6005.  
  6006.  
  6007. ; ---- SORT DRAWLIST BY Y POSITION ----
  6008.  
  6009. sort_drawlist   lea     _bobstructs(pc),a0
  6010.  
  6011.                 lea     _drawlist(pc),a2
  6012.                 move.l  a2,a1
  6013.                 moveq   #(MAXBOBS-1),d0
  6014. .clr            clr.l   (a1)+
  6015.                 dbf     d0,.clr
  6016.  
  6017.                 moveq   #(MAXBOBS-1),d4
  6018. .sort           move    BO_Y(a0),d0             ; ypos
  6019.                 add     BO_HEIGHT(a0),d0        ; add height
  6020.  
  6021.                 move.l  a2,a1                   ; drawlist -> a1
  6022.                 moveq   #0,d1
  6023. .1              move.l  (a1)+,d2                ; get bobstruct
  6024.                 beq.b   .insert
  6025.                 move.l  d2,a4
  6026.                 move    BO_Y(a4),d2             ; ypos in list
  6027.                 add     BO_HEIGHT(a4),d2
  6028.                 cmp     d0,d2
  6029.                 ble.b   .insert
  6030.                 addq.b  #1,d1
  6031.                 cmp.b   #(MAXBOBS),d1
  6032.                 bne.b   .1
  6033.  
  6034. .insert         moveq   #(MAXBOBS-2),d2
  6035.                 move.l  a2,a1                   ; drawlist -> a1
  6036. .llop           move    d2,d3
  6037.                 moveq   #2,d5
  6038.                 lsl     d5,d3
  6039.                 move.l  (a1,d3.w),4(a1,d3.w)
  6040.                 cmp.b   d2,d1
  6041.                 beq.b   .fin2
  6042.                 dbf     d2,.llop
  6043.  
  6044. .fin2           moveq   #2,d5
  6045.                 lsl     d5,d1
  6046.                 move.l  a0,(a1,d1.w)            ; set bobstruct
  6047.  
  6048.                 add     #(BO_SIZEOF),a0
  6049.  
  6050.                 dbf     d4,.sort
  6051.                 rts
  6052.  
  6053. ;--------------------------------------
  6054. ; Game Engine © 1997 Seasons.
  6055. ;
  6056. ; DOUBLE BUFFER SUPPORT: BOBS
  6057. ;--------------------------------------
  6058.  
  6059.  
  6060. ; ---- DRAW ACTIVE BOBS TO SCREEN ----
  6061.  
  6062. draw_bobs       lea     _drawlist+(MAXBOBS*4)(pc),a4
  6063.                 clr.b   _numbobs
  6064.                 moveq   #(MAXBOBS-1),d4
  6065. .draw           move.l  -(a4),a3
  6066.                 tst.b   bo_inactive(a3)
  6067.                 bne.b   .skipdraw
  6068.  
  6069.                 addq.b  #1,_numbobs
  6070.                 movem   bo_x(a3),d0/d1
  6071.                 move    bo_image(a3),d2
  6072.  
  6073.                 tst.b   bo_expanded(a3)
  6074.                 beq.b   .no
  6075.                 bsr.w   blit_expbob
  6076.                 dbf     d4,.draw
  6077.                 rts
  6078.  
  6079. .no             bsr.w   blit_bob
  6080. .skipdraw       dbf     d4,.draw
  6081.                 rts
  6082.  
  6083. ; ---- SAVE BACKGROUNDS -----
  6084.  
  6085. save_backgrounds
  6086.                 lea     _bobstructs(pc),a3
  6087.                 moveq   #(MAXBOBS-1),d4
  6088.  
  6089.                 tst.b   _swapflag
  6090.                 bne.b   .s2
  6091.  
  6092. .s1             tst.b   bo_inactive(a3)
  6093.                 bne.b   .nono
  6094.                 move.l  bo_x(a3),bo_oldx1(a3)
  6095.                 movem   bo_x(a3),d0/d1
  6096.                 move.l  bo_buffer1(a3),a0
  6097.  
  6098.                 tst.b   bo_expanded(a3)
  6099.                 beq.b   .no
  6100.                 bsr.w   save_expback
  6101.                 bra.b   .nono
  6102. .no             bsr.w   save_back
  6103. .nono           lea     bo_sizeof(a3),a3
  6104.                 dbf     d4,.s1
  6105.                 rts
  6106.  
  6107. .s2             tst.b   bo_inactive(a3)
  6108.                 bne.b   .nono2
  6109.                 move.l  bo_x(a3),bo_oldx2(a3)
  6110.                 movem   bo_x(a3),d0/d1
  6111.                 move.l  bo_buffer2(a3),a0
  6112.                 tst.b   bo_expanded(a3)
  6113.                 beq.b   .no222
  6114.                 bsr.w   save_expback
  6115.                 bra.b   .nono2
  6116. .no222          bsr.w   save_back
  6117. .nono2          lea     bo_sizeof(a3),a3
  6118.                 dbf     d4,.s2
  6119.                 rts
  6120.  
  6121. ; ---- RESTORE BACKGROUNDS -----
  6122.  
  6123. restore_backgrounds
  6124.                 lea     _bobstructs(pc),a3
  6125.                 moveq   #(MAXBOBS-1),d4
  6126.                 tst.b   _swapflag
  6127.                 bne.b   .s2
  6128.  
  6129. .s1             tst.b   bo_firstflag(a3)
  6130.                 bne.b   .sk
  6131.                 tst.b   bo_inactive(a3)
  6132.                 bmi.b   .sk
  6133.  
  6134.                 movem   bo_oldx1(a3),d0/d1
  6135.                 move.l  bo_buffer1(a3),a0
  6136.                 tst.b   bo_expanded(a3)
  6137.                 beq.b   .nn
  6138.                 bsr.w   restore_expback
  6139.                 bra.b   .no
  6140. .nn             bsr.w   restore_back
  6141.  
  6142. .no             cmp.b   #2,bo_inactive(a3)
  6143.                 bne.b   .skk
  6144.                 subq.b  #1,bo_inactive(a3)
  6145.                 bra.b   .sk
  6146. .skk            cmp.b   #1,bo_inactive(a3)
  6147.                 bne.b   .sk
  6148.                 st.b    bo_inactive(a3)
  6149. .sk             clr.b   bo_firstflag(a3)
  6150.                 lea     bo_sizeof(a3),a3
  6151.                 dbf     d4,.s1
  6152.                 rts
  6153.  
  6154. .s2             tst.b   bo_firstflag(a3)
  6155.                 bne.b   .sk2
  6156.                 tst.b   bo_inactive(a3)
  6157.                 bmi.b   .sk2
  6158.                 movem   bo_oldx2(a3),d0/d1
  6159.                 move.l  bo_buffer2(a3),a0
  6160.                 tst.b   bo_expanded(a3)
  6161.                 beq.b   .nonono
  6162.                 bsr.w   restore_expback
  6163.                 bra.b   .no2
  6164.  
  6165. .nonono         bsr.w   restore_back
  6166.  
  6167. .no2            cmp.b   #2,bo_inactive(a3)
  6168.                 bne.b   .skk2
  6169.                 subq.b  #1,bo_inactive(a3)
  6170.                 bra.b   .sk2
  6171. .skk2           cmp.b   #1,bo_inactive(a3)
  6172.                 bne.b   .sk2
  6173.                 st.b    bo_inactive(a3)
  6174. .sk2            clr.b   bo_firstflag(a3)
  6175.                 lea     bo_sizeof(a3),a3
  6176.                 dbf     d4,.s2
  6177.                 rts
  6178.  
  6179. ; -----------------------------------------
  6180. ;
  6181. ;         SYSTEM/ENGINE DATA AREA
  6182. ;
  6183. ; -----------------------------------------
  6184.  
  6185.  
  6186. _gfxbase        dc.l    0
  6187. _intbase        dc.l    0
  6188. _dosbase        dc.l    0
  6189.  
  6190. _dosname        dc.b    "dos.library",0
  6191.                 even
  6192.  
  6193. _screen         dc.l    0
  6194. _dscreen        dc.l    0
  6195. _screenswap1    dc.l    _screen1swap
  6196. _screenswap2    dc.l    _screen2swap
  6197. _bobmemory      dc.l    0
  6198. _swapflag       dc.b    0
  6199. _firstdone      dc.b    0
  6200.  
  6201. _screen1swap    blk.l   (NUMPLANES),0
  6202. _screen2swap    blk.l   (NUMPLANES),0
  6203.  
  6204.  
  6205. ; ---- INITIALISE EVERYTHING AND START ----
  6206.  
  6207. init_all        IFND    DEBUG
  6208.                 sub.l   a1,a1
  6209.                 move.l  4.w,a6
  6210.                 CALL    FindTask
  6211.                 move.l  d0,a1
  6212.                 moveq   #127,d0
  6213.                 CALL    SetTaskPri                      ; set priority max
  6214.                 ENDIF
  6215.  
  6216.                 lea     $dff000,a5                      ; custom chips
  6217.  
  6218.                 clr.b   d0
  6219.                 IFD     DEBUG
  6220.                 st.b    d0
  6221.                 ENDIF
  6222.  
  6223.                 lea     _copperlist,a0
  6224.                 callvideo       WAKERESOURCE            ; wake video resource
  6225.                 move.l  d0,_gfxbase
  6226.                 move.l  d1,_intbase
  6227.  
  6228.                 lea     _screen1,a0
  6229.                 move.l  a0,_screen
  6230.                 lea     _screen2,a0
  6231.                 move.l  a0,_dscreen
  6232.  
  6233.                 lea     _copbitplaneptrs,a0
  6234.                 move.l  _screen,a1
  6235.                 move.l  #(PLANE_SIZE),d0
  6236.                 moveq   #(NUMPLANES),d1
  6237.                 callvideo       INITBITPLANES
  6238.  
  6239.                 lea     _copspriteptrs,a0
  6240.                 lea     _blanksprite,a1
  6241.                 callvideo       INITBLANKSPRITES        ; init spriteptrs
  6242.  
  6243.                 callvideo       FIXSPRITES
  6244.                 callvideo       SYSTEMVIEWOFF
  6245.  
  6246.                 move.l  4.w,a6
  6247.               &nbnbsp; lea     _dosname(pc),a1
  6248.                 moveq   #0,d0
  6249.                 CALL    OpenLibrary
  6250.                 move.l  d0,_dosbase
  6251.                 rts
  6252.  
  6253. ; ---- CLEAN UP EVERYTHING AND QUIT ----
  6254.  
  6255. cleanup_all     bsr.b   free_bobs                       ; free bobs memory
  6256.  
  6257.                 IFND    DEBUG
  6258.                 CALLGRAF        DisOwnBlitter
  6259.                 ENDIF
  6260.  
  6261.                 callvideo       RETURNSPRITES
  6262.                 callvideo       SYSTEMVIEWRESTORE       ; restore system
  6263.  
  6264.                 callvideo       KILLRESOURCE            ; kill video resource
  6265.                 rts
  6266.  
  6267. ; ---- ALLOCATE MEMORY FOR BOBS ----
  6268.  
  6269. allocate_bobs
  6270.                 move.l  #((BOBSIZE*2+BOBPLANE)*MAXBOBS),d0
  6271.                 CALLVIDEO       ALLOCCHIP
  6272.                 move.l  d0,_bobmemory
  6273.                 rts
  6274.  
  6275. free_bobs       move.l  _bobmemory(pc),d0
  6276.                 move.l  #((BOBSIZE*2+BOBPLANE)*MAXBOBS),d1
  6277.                 CALLVIDEO       FLUSHCHIP
  6278.                 rts
  6279.  
  6280. ; ---- MAKE BOBLOOKUP TABLE ----
  6281.  
  6282. make_boblookup  lea     _bobdata,a0
  6283.                 lea     _boblookuptable(pc),a1
  6284.  
  6285.                 move    #(NUMBOBS-1),d0
  6286. .1              move.l  a0,(a1)+
  6287.                 add.l   #(BOBSIZEFULL),a0
  6288.                 dbf     d0,.1
  6289.                 rts
  6290.  
  6291. ;---- SET RANDOM SEED ----
  6292.  
  6293. set_random      move.l  _intbase(pc),a6
  6294.                 lea     _cut1(pc),a0
  6295.                 lea     _cut2(pc),a1
  6296.                 CALL    CurrentTime             ; for random number generator
  6297.  
  6298.                 move.l  _cut1(pc),d0
  6299.                 move.l  _cut2(pc),d1
  6300.  
  6301. ;---- RANDOM NUMBER ROUTINE -----
  6302.  
  6303. randomseed      add.l   d0,d1           ;user seed in d0 (d1 too)
  6304.                 movem.l d0/d1,_rnd
  6305. longrnd         movem.l d2-d3,-(sp)    
  6306.                 movem.l _rnd(pc),d0/d1  ;d0=lsb's, d1=msb's of random number
  6307.                 andi.b  #$0e,d0         ;ensure upper 59 bits are an...
  6308.                 ori.b   #$20,d0         ;...odd binary number
  6309.                 move.l  d0,d2
  6310.                 move.l  d1,d3
  6311.                 add.l   d2,d2           ;accounts for 1 of 17 left shifts
  6312.                 addx.l  d3,d3           ;[d2/d3] = rnd*2
  6313.                 add.l   d2,d0
  6314.                 addx.l  d3,d1           ;[d0/d1] = rnd*3
  6315.                 swap    d3              ;shift [d2/d3] additional 16 times
  6316.                 swap    d2
  6317.                 move.w  d2,d3
  6318.                 clr     d2
  6319.                 add.l   d2,d0           ;add to [d0/d1]
  6320.                 addx.l  d3,d1
  6321.                 movem.l d0/d1,_rnd      ;save for next time through
  6322.                 move.l  d1,d0           ;most random part to d0
  6323.                 movem.l (sp)+,d2-d3
  6324.                 rts
  6325.  
  6326. random          move.w  d2,-(sp)
  6327.                 move.w  d0,d2           ;save upper limit
  6328.                 beq.s   .1              ;range of 0 returns 0 always
  6329.                 bsr.s   longrnd         ;get a longword random number
  6330.                 clr.w   d0              ;use upper word (it's most random)
  6331.                 swap    d0
  6332.                 divu.w  d2,d0           ;divide by range...
  6333.                 clr.w   d0              ;...and use remainder for the value
  6334.                 swap    d0              ;result in d0.w
  6335. .1              move.w  (sp)+,d2
  6336.                 rts
  6337.  
  6338. _rnd            dc.l    0,0
  6339. _cut1           dc.l    0               ; int-currenttime values
  6340. _cut2           dc.l    0
  6341.  
  6342. ; ---- PRINT TEXT TO SCREEN ----
  6343.  
  6344. ; X (d0) Y (d1) length (d2) screen (a1)
  6345.  
  6346. print_text      lsl     #3,d1
  6347.                 mulu    #(SCRWIDTH),d1
  6348.                 add     d0,d1
  6349.  
  6350.                 move.l  _dscreen(pc),a1
  6351.                 add     d1,a1
  6352.                 bsr.b   print_txt
  6353.                 move.l  _screen(pc),a1
  6354.                 add     d1,a1
  6355.  
  6356. print_txt       move.l  d2,d3
  6357.                 move.l  a0,a3
  6358.  
  6359. .print          moveq   #0,d4
  6360.                 move.b  (a3)+,d4
  6361.                 bmi.b   .space
  6362.                 lsl     #3,d4
  6363.                 lea     _fontdata(pc),a2
  6364.                 lea     (a2,d4.l),a2
  6365.  
  6366.                 move.b  (a2)+,SCRWIDTH*0(a1)
  6367.                 move.b  (a2)+,SCRWIDTH*1(a1)
  6368.                 move.b  (a2)+,SCRWIDTH*2(a1)
  6369.                 move.b  (a2)+,SCRWIDTH*3(a1)
  6370.                 move.b  (a2)+,SCRWIDTH*4(a1)
  6371.                 move.b  (a2)+,SCRWIDTH*5(a1)
  6372.                 move.b  (a2)+,SCRWIDTH*6(a1)
  6373.                 move.b  (a2)+,SCRWIDTH*7(a1)
  6374. .space          addq    #1,a1
  6375.                 dbf     d3,.print
  6376.                 rts
  6377.  
  6378. print_text2     movem.l d0-d4/a0-a2,-(sp)
  6379.                 lsl     #3,d1
  6380.                 mulu    #(SCRWIDTH),d1
  6381.                 add     d0,d1
  6382.                 move.l  _dscreen(pc),a1
  6383.                 add     d1,a1
  6384. .print          moveq   #0,d4
  6385.                 move.b  (a0)+,d4
  6386.                 bmi.b   .space
  6387.                 lsl     #3,d4
  6388.                 lea     _fontdata(pc),a2
  6389.                 lea     (a2,d4.l),a2
  6390.  
  6391.                 move.b  (a2)+,SCRWIDTH*0(a1)
  6392.                 move.b  (a2)+,SCRWIDTH*1(a1)
  6393.                 move.b  (a2)+,SCRWIDTH*2(a1)
  6394.                 move.b  (a2)+,SCRWIDTH*3(a1)
  6395.                 move.b  (a2)+,SCRWIDTH*4(a1)
  6396.                 move.b  (a2)+,SCRWIDTH*5(a1)
  6397.                 move.b  (a2)+,SCRWIDTH*6(a1)
  6398.                 move.b  (a2)+,SCRWIDTH*7(a1)
  6399. .space          addq    #1,a1
  6400.                 dbf     d2,.print
  6401.                 movem.l (sp)+,d0-d4/a0-a2
  6402.                 rts
  6403.  
  6404. _maintext       dc.b    "S"-55,"C"-55,"O"-55,"R"-55,"E"-55,37
  6405.                 dc.b    0,0,0,0,0,37,37,"H"-55,"I"-55,37
  6406.                 dc.b    0,0,0,0,0,37,37,"B"-55,"O"-55,"N"-55,"U"-55,"S"-55
  6407.                 dc.b    37
  6408.                 dc.b    0,0,0,0,37,37,37,37,37,37,0
  6409. _score1txt      dc.b    0,0,0,0,0
  6410. _hiscoretxt     dc.b    0,0,0,0,0
  6411. _bonustxt       dc.b    0,0,0,0
  6412. _lifetxt        dc.b    0
  6413. _score2txt      dc.b    0,0,0,0,0
  6414.  
  6415. _maintext2      dc.b    37,"P"-55,"L"-55,1,37
  6416.                 dc.b    0,0,0,0,0,37,36
  6417. _lives21txt     dc.b    0,37,37
  6418.                 dc.b    "P"-55,"L"-55,2,37
  6419.                 dc.b    0,0,0,0,0,37,36
  6420. _lives22txt     dc.b    0,37,37
  6421.                 dc.b    "B"-55,"O"-55,"N"-55,"U"-55,"S"-55,37
  6422.                 dc.b    0,0,0,0,37
  6423.  
  6424.                 EVEN
  6425.  
  6426. ; ---- PRINT MAIN LINE ----
  6427.  
  6428. print_mainline  moveq   #4,d0
  6429.                 moveq   #0,d1
  6430.                 cmp.b   #2,_numplayers
  6431.                 bne.b   .1pl
  6432.                 lea     _maintext2(pc),a0
  6433.                 bra.b   .pr
  6434. .1pl            lea     _maintext(pc),a0
  6435. .pr             moveq   #39,d2
  6436.                 bra.w   print_text
  6437.  
  6438. ; ---- PRINT SCORE (1 PLAYER MODE) ----
  6439.  
  6440. print_score     movem.l d0-d4/a0-a3,-(sp)
  6441.                 moveq   #0,d0
  6442.                 lea     _player1(pc),a0
  6443.                 move    p_plscore(a0),d0
  6444.                 moveq   #5,d1
  6445.                 lea     _score1txt(pc),a0
  6446.                 bsr.w   numtoasc
  6447.  
  6448.                 cmp.b   #2,_numplayers
  6449.                 beq.b   .2pl
  6450.                 moveq   #10,d0
  6451.                 moveq   #0,d1
  6452.                 moveq   #4,d2
  6453.                 lea     _score1txt(pc),a0
  6454.                 bsr.w   print_text
  6455.                 movem.l (sp)+,d0-d4/a0-a3
  6456.                 rts
  6457.  
  6458. .2pl            moveq   #0,d0
  6459.                 lea     _player2(pc),a0
  6460.                 move    p_plscore(a0),d0
  6461.                 moveq   #5,d1
  6462.                 lea     _score2txt(pc),a0
  6463.                 bsr.w   numtoasc
  6464.                 moveq   #9,d0
  6465.                 moveq   #0,d1
  6466.                 moveq   #4,d2
  6467.                 lea     _score1txt(pc),a0
  6468.                 bsr.w   print_text
  6469.                 moveq   #23,d0
  6470.                 moveq   #0,d1
  6471.                 moveq   #4,d2
  6472.                 lea     _score2txt(pc),a0
  6473.                 bsr.w   print_text
  6474.                 movem.l (sp)+,d0-d4/a0-a3
  6475.                 rts
  6476.  
  6477.  
  6478. ; ---- PRINT HISCORE (1 PLAYER MODE) ----
  6479.  
  6480. print_hiscore   cmp.b   #1,_numplayers
  6481.                 beq.b   .ik
  6482.                 rts
  6483.  
  6484. .ik             move    _hiscore(pc),d0
  6485.                 moveq   #5,d1
  6486.                 lea     _hiscoretxt(pc),a0
  6487.                 bsr.w   numtoasc
  6488.                 moveq   #20,d0
  6489.                 moveq   #0,d1
  6490.                 moveq   #4,d2
  6491.                 lea     _hiscoretxt(pc),a0
  6492.                 bra.w   print_text
  6493.  
  6494. ; ---- PRINT BONUS (1 PLAYER MODE) ----
  6495.  
  6496. print_bonus     movem.l d0-d4/a0-a3,-(sp)
  6497.                 moveq   #0,d0
  6498.                 move    _bonus(pc),d0
  6499.                 moveq   #4,d1
  6500.                 lea     _bonustxt(pc),a0
  6501.                 bsr.w   numtoasc
  6502.                 cmp.b   #2,_numplayers
  6503.                 beq.b   .bonus2
  6504.  
  6505.                 moveq   #33,d0
  6506.                 moveq   #0,d1
  6507.                 moveq   #3,d2
  6508.                 lea     _bonustxt(pc),a0
  6509.                 bsr.w   print_text
  6510.                 bra.b   .ut
  6511.  
  6512. .bonus2         moveq   #39,d0
  6513.                 moveq   #0,d1
  6514.                 moveq   #3,d2
  6515.                 lea     _bonustxt(pc),a0
  6516.                 bsr.w   print_text
  6517. .ut             movem.l (sp)+,d0-d4/a0-a3
  6518.                 rts
  6519.  
  6520. ; ---- PRINT LIVES (1 PLAYER MODE) ----
  6521.  
  6522. print_lives     movem.l d0-d4/a0-a3,-(sp)
  6523.                 cmp.b   #2,_numplayers
  6524.                 beq.b   .2pl
  6525.                 moveq   #0,d0
  6526.                 lea     _player1(pc),a0
  6527.                 move    p_lives(a0),d0
  6528.                 move.b  d0,_lifetxt
  6529.                 moveq   #39+4,d0
  6530.                 moveq   #0,d1
  6531.                 moveq   #0,d2
  6532.                 lea     _lifetxt(pc),a0                 ; number
  6533.                 bsr.w   print_text
  6534.                 moveq   #0,d0
  6535.                 lea     _player1(pc),a0
  6536.                 move    p_lives(a0),d0
  6537.                 cmp     #4,d0
  6538.                 bhi.b   .nono
  6539.                 subq    #1,d0
  6540.                 lsl     #2,d0
  6541.                 lea     _lifedata(pc,d0.l),a0
  6542.                 moveq   #38,d0
  6543.                 moveq   #0,d1
  6544.                 moveq   #3,d2
  6545.                 bsr.w   print_text                      ; gfx
  6546. .nono           movem.l (sp)+,d0-d4/a0-a3
  6547.                 rts
  6548.  
  6549. .2pl            moveq   #0,d0
  6550.                 lea     _player1(pc),a0
  6551.                 move    p_lives(a0),d0
  6552.                 move.b  d0,_lifetxt
  6553.                 moveq   #4+12,d0
  6554.                 moveq   #0,d1
  6555.                 moveq   #0,d2
  6556.                 lea     _lifetxt(pc),a0                 ; number
  6557.                 bsr.w   print_text
  6558.                 moveq   #0,d0
  6559.                 lea     _player2(pc),a0
  6560.                 move    p_lives(a0),d0
  6561.                 move.b  d0,_lifetxt
  6562.                 moveq   #4+26,d0
  6563.                 moveq   #0,d1
  6564.                 moveq   #0,d2
  6565.                 lea     _lifetxt(pc),a0                 ; number
  6566.                 bsr.w   print_text
  6567.                 movem.l (sp)+,d0-d4/a0-a3
  6568.                 rts
  6569.  
  6570. _lifedata       dc.b    37,37,37,36                     ; 1 life
  6571.                 dc.b    37,37,36,36
  6572.                 dc.b    37,36,36,36
  6573.                 dc.b    36,36,36,36
  6574.  
  6575.  
  6576. _hiscore        dc      0
  6577. _bonus          dc      100
  6578.  
  6579.  
  6580. ; ---- GET A KEY ----
  6581.  
  6582. get_key         move.b  $bfec01,d0
  6583.                 st.b    d1
  6584.                 sub.b   d0,d1
  6585.                 ror.b   #1,d1
  6586.                 btst    #7,d1
  6587.                 bne     .no
  6588.                 move.b  d1,_rawkey
  6589.                 rts
  6590. .no             clr.b   _rawkey
  6591.                 rts
  6592.  
  6593. release_key     move.b  $bfec01,d0
  6594.                 st.b    d1
  6595.                 sub.b   d0,d1
  6596.                 ror.b   #1,d1
  6597. ;               move.b  d1,_rawkey
  6598.                 btst    #7,d1
  6599.                 beq     release_key
  6600.                 rts
  6601.  
  6602. _rawkey         dc.b    0,0
  6603.  
  6604. ; ---- NUMBER TO ASCII CONVERSION ----
  6605. ; number (d0) / number of digits (d1) / dest (a0)
  6606.  
  6607. numtoasc        sub     #9,d1
  6608.                 neg     d1
  6609.                 add     d1,d1
  6610.                 add     d1,d1
  6611.                 lea     _powersof10(pc,d1.w),a1
  6612. .next_pow       move.l  (a1)+,d1
  6613.                 moveq   #0,d2
  6614. .weigh          sub.l   d1,d0
  6615.                 bcs.b   .gotya
  6616.                 addq    #1,d2
  6617.                 bra.b   .weigh
  6618. .gotya          add.l   d1,d0
  6619.                 move.b  d2,(a0)+
  6620.                 subq.l  #1,d1
  6621.                 bne.s   .next_pow
  6622.                 rts
  6623.  
  6624. _powersof10     dc.l    100000000
  6625.                 dc.l    10000000
  6626.                 dc.l    1000000
  6627.                 dc.l    100000
  6628.                 dc.l    10000
  6629.                 dc.l    1000
  6630.                 dc.l    100
  6631.                 dc.l    10
  6632.                 dc.l    1
  6633.  
  6634. ; ---- SET VBL INTERRUPT HANDLER ----
  6635.  
  6636. set_vbintserver moveq   #5,d0
  6637.                 lea     vbintserver,a1
  6638.                 move.l  4.w,a6
  6639.                 CALL    addintserver
  6640.                 rts
  6641.  
  6642. ; ---- REMOVE VBL INTERRUPT HANDLER ----
  6643.  
  6644. reset_vbintserver
  6645.                 moveq   #5,d0
  6646.                 lea     vbintserver,a1
  6647.                 move.l  4.w,a6
  6648.                 CALL    remintserver
  6649.                 rts
  6650.  
  6651. ; ---- VBL INTERRUPT CODE ----
  6652.  
  6653. vbint           movem.l d0-d7/a0-a6,-(sp)
  6654.  
  6655.                 lea     _musicdata,a0
  6656.                 jsr     FM_PLAYSONG(a0)
  6657.  
  6658.                 movem.l (sp)+,d0-d7/a0-a6
  6659.                 moveq   #0,d0
  6660.                 rts
  6661.  
  6662. VBIntServer     dc.l    0,0
  6663.                 dc.b    2,0 ; type, priority
  6664.                 dc.l    _vbintname
  6665.                 dc.l    0,vbint
  6666.  
  6667. _vbintname      dc.b "Seasons VBL Interrupt!",0
  6668.                 EVEN
  6669.  
  6670. ; ---- READ HIGHSCORE TABLE FROM DISK ----
  6671.  
  6672. read_highscoretable
  6673.                 movem.l d0-a6,-(sp)
  6674.                 lea     _htablename(pc),a0
  6675.                 move.l  a0,d1
  6676.                 move.l  #1005,d2
  6677.                 move.l  _dosbase(pc),a6
  6678.                 CALL    Open
  6679.                 tst.l   d0
  6680.                 beq.b   .useinternal
  6681.                 move.l  d0,d1
  6682.                 move.l  d0,d5
  6683.                 lea     _hiscoretable(pc),a0
  6684.                 move.l  a0,d2
  6685.                 moveq   #120,d3
  6686.                 CALL    Read
  6687.                 cmp     d0,d3
  6688.                 bne.b   .useint
  6689.                 move.l  d5,d1
  6690.                 CALL    Close
  6691.                 movem.l (sp)+,d0-a6
  6692.                 moveq   #0,d0
  6693.                 rts
  6694.  
  6695. .useint         move.l  d5,d1
  6696.                 CALL    Close
  6697. .useinternal    lea     _internaltable(pc),a0
  6698.                 lea     _hiscoretable(pc),a1
  6699.                 moveq   #29,d0
  6700. .1              move.l  (a0)+,(a1)+             ; copy internal table
  6701.                 dbf     d0,.1
  6702.                 movem.l (sp)+,d0-a6
  6703.                 rts
  6704.  
  6705. ; ---- WRITE HIGHSCORE TABLE TO DISK ----
  6706.  
  6707. write_highscoretable
  6708.                 movem.l d0-a6,-(sp)
  6709.                 lea     _htablename(pc),a0
  6710.                 move.l  a0,d1
  6711.                 move.l  #1006,d2
  6712.                 move.l  _dosbase(pc),a6
  6713.                 CALL    Open
  6714.                 tst.l   d0
  6715.                 beq.b   .cantdo
  6716.                 move.l  d0,d1
  6717.                 move.l  d0,d5
  6718.                 lea     _hiscoretable(pc),a0
  6719.                 move.l  a0,d2
  6720.                 moveq   #120,d3
  6721.                 CALL    Write
  6722.                 move.l  d5,d1
  6723.                 CALL    Close
  6724. .cantdo         movem.l (sp)+,d0-a6
  6725.                 moveq   #0,d0
  6726.                 rts
  6727.  
  6728. _internaltable 
  6729.                 dc.b    "L"-55,37,"R"-55,"O"-55,"S"-55,"E"-55,"N"-55
  6730.                 dc.b    37,37,37,0,0
  6731.                 dc.b    "L"-55,37,"R"-55,"O"-55,"S"-55,"E"-55,"N"-55
  6732.                 dc.b    37,37,37,0,0
  6733.                 dc.b    "L"-55,37,"R"-55,"O"-55,"S"-55,"E"-55,"N"-55
  6734.                 dc.b    37,37,37,0,0
  6735.                 dc.b    "L"-55,37,"R"-55,"O"-55,"S"-55,"E"-55,"N"-55
  6736.                 dc.b    37,37,37,0,0
  6737.                 dc.b    "L"-55,37,"R"-55,"O"-55,"S"-55,"E"-55,"N"-55
  6738.                 dc.b    37,37,37,0,0
  6739.                 dc.b    "L"-55,37,"R"-55,"O"-55,"S"-55,"E"-55,"N"-55
  6740.                 dc.b    37,37,37,0,0
  6741.                 dc.b    "L"-55,37,"R"-55,"O"-55,"S"-55,"E"-55,"N"-55
  6742.                 dc.b    37,37,37,0,0
  6743.                 dc.b    "L"-55,37,"R"-55,"O"-55,"S"-55,"E"-55,"N"-55
  6744.                 dc.b    37,37,37,0,0
  6745.                 dc.b    "L"-55,37,"R"-55,"O"-55,"S"-55,"E"-55,"N"-55
  6746.                 dc.b    37,37,37,0,0
  6747.                 dc.b    "L"-55,37,"R"-55,"O"-55,"S"-55,"E"-55,"N"-55
  6748.                 dc.b    37,37,37,0,0
  6749.  
  6750. _htablename     dc.b    "Highnoon.HOF",0
  6751.                 EVEN
  6752.  
  6753. ; ------------------------------------------------------------------------
  6754. ;
  6755. ;                              DATA STRUCTURES
  6756. ;
  6757. ; ------------------------------------------------------------------------
  6758.  
  6759. _boblookuptable blk.l   (NUMBOBS),0
  6760.  
  6761.  
  6762. ; -----------------------------------------
  6763. ;
  6764. ;          GENERAL BOB STRUCTURE
  6765. ;
  6766. ; -----------------------------------------
  6767.  
  6768.                 RSRESET
  6769. bo_inactive     RS.B    1               ; set if no draw
  6770. bo_firstflag    RS.B    1               ; set if first time draw
  6771. bo_buffer1      RS.L    1               ; APTR save buffer 1
  6772. bo_buffer2      RS.L    1               ; APTR save buffer 2
  6773. bo_newmask      RS.L    1               ; APTR new mask (backgrounds)
  6774. bo_maskoff      RS.L    1               ; LONG mask offset
  6775. bo_oldx1        RS      1               ; old x position, 1
  6776. bo_oldy1        RS      1               ; old y position, 1
  6777. bo_oldx2        RS      1               ; old x position, 2
  6778. bo_oldy2        RS      1               ; old y position, 2
  6779. bo_x            RS      1               ; x position
  6780. bo_y            RS      1               ; y position
  6781. bo_image        RS      1               ; object image
  6782. bo_height       RS      1               ; object height
  6783. bo_maskmade     RS.B    1               ; set if new mask made
  6784. bo_expanded     RS.B    1               ; set if bob "expanded"
  6785. bo_sizeof       RS.B    0
  6786.  
  6787. _bobstructs     blk.b   (BO_SIZEOF*MAXBOBS),0
  6788.  
  6789.  
  6790.                 INCDIR  DH1:DEV/RSC/
  6791.  
  6792. _videoresource  INCBIN  VIDEO.RESOURCE
  6793.  
  6794.  
  6795.                 INCDIR  SOURCE:GAMES/CLASSIC/HIGH_NOON/
  6796.  
  6797. _fontdata       INCBIN  DATA/FONT.DATA
  6798. _arena1         INCBIN  DATA/ARENA1.DATA
  6799. _arena1map      INCBIN  DATA/ARENA1MAP.DATA
  6800. _arena2         INCBIN  DATA/ARENA2.DATA
  6801. _arena2map      INCBIN  DATA/ARENA2MAP.DATA
  6802. _sniperdata     INCBIN  DATA/SNIPERS.DATA
  6803. _title          INCBIN  DATA/TITLE.DATA
  6804. _titlemap       INCBIN  DATA/TITLEMAP.DATA
  6805. _highscore      INCBIN  DATA/HISCORE.DATA
  6806. _highscoremap   INCBIN  DATA/HISCOREMAP.DATA
  6807.  
  6808.  
  6809. ; ------------------------------------------------------------------------
  6810. ;
  6811. ;                            CHIP DATA HUNK
  6812. ;
  6813. ; ------------------------------------------------------------------------
  6814.  
  6815.                 INCDIR  SOURCE:GAMES/CLASSIC/HIGH_NOON/
  6816.  
  6817.  
  6818.  
  6819.                 SECTION BRUCE_II,DATA_C
  6820.  
  6821. CWAIT           = -2
  6822.  
  6823. CO      SET $0180
  6824. CB      SET $0
  6825.  
  6826.                 cnop    0,8
  6827.  
  6828. _copperlist     dc      $2107,CWAIT
  6829.  
  6830. _copspriteptrs  dc      SPR0PTH,$0000,SPR0PTL,$0000
  6831.                 dc      SPR1PTH,$0000,SPR1PTL,$0000
  6832.                 dc      SPR2PTH,$0000,SPR2PTL,$0000
  6833.                 dc      SPR3PTH,$0000,SPR3PTL,$0000
  6834.                 dc      SPR4PTH,$0000,SPR4PTL,$0000
  6835.                 dc      SPR5PTH,$0000,SPR5PTL,$0000
  6836.                 dc      SPR6PTH,$0000,SPR6PTL,$0000
  6837.                 dc      SPR7PTH,$0000,SPR7PTL,$0000
  6838.  
  6839.                 dc      DIWSTRT,$2C81,DIWSTOP,$3CC1
  6840.                 dc      DDFSTRT,$0028,DDFSTOP,$00D4
  6841.                 dc      BPLCON1,$0000,BPLCON2,$0024
  6842.                 dc      BPL1MOD,2,BPL2MOD,2
  6843.  
  6844.                 dc      BPLCON0,(NUMPLANES<<12)!$200
  6845.  
  6846. ;               dc      FMODE,$4
  6847. ;               dc      BPLCON3,$40
  6848.  
  6849. _copbitplaneptrs
  6850.                 dc      BPL1PTH,$0000,BPL1PTL,$0000
  6851.                 dc      BPL2PTH,$0000,BPL2PTL,$0000
  6852.                 dc      BPL3PTH,$0000,BPL3PTL,$0000
  6853.                 dc      BPL4PTH,$0000,BPL4PTL,$0000
  6854.                 dc      BPL5PTH,$0000,BPL5PTL,$0000
  6855.  
  6856.                 dc      CO+14,$000C
  6857.                 dc      CO+12,$0000
  6858.  
  6859.                 dc      $3407,CWAIT
  6860. _copcolors      dc      CO+00,$0000,CO+02,$0FFF,CO+04,$0C00,CO+06,$00FF
  6861.                 dc      CO+08,$0F0F,CO+10,$00C0,CO+12,$000C,CO+14,$0CC0
  6862.                 dc      CO+16,$0F80,CO+18,$0800,CO+20,$0F88,CO+22,$0444
  6863.                 dc      CO+24,$0888,CO+26,$00F8,CO+28,$0000,CO+30,$0CCC
  6864.  
  6865.                 dc      $D407,CWAIT
  6866.  
  6867.                 dc      CO+12
  6868. _textcolor      dc      $0000
  6869.                 dc      CO+08
  6870. _textcolor2     dc      $0000
  6871.  
  6872.                 dc      $F2EF,CWAIT
  6873.                 dc      BPLCON0,$0200
  6874.                 dc      BPL1MOD,$0000,BPL2MOD,$0000
  6875.                 dc      $FFFF,CWAIT
  6876.                 dc      $FFFF,CWAIT
  6877.  
  6878.                 cnop    0,8
  6879.  
  6880. _blanksprite    blk.l   16,0
  6881.  
  6882. _bobdata        INCBIN  DATA/SPRITES.DATA
  6883.  
  6884. _expbobdata     INCBIN  DATA/EXPSPRITES.DATA
  6885.  
  6886. _dynabuff1      blk.b   (8*42*NUMPLANES),0
  6887. _dynabuff2      blk.b   (8*42*NUMPLANES),0
  6888.  
  6889. _horsebuff1     blk.b   (8*42*NUMPLANES),0
  6890. _horsebuff2     blk.b   (8*42*NUMPLANES),0
  6891.  
  6892.                 CNOP    0,4
  6893.  
  6894. _backmask       INCBIN  DATA/BACKGROUND.MSK
  6895.  
  6896. _newmask        BLK.B   (BOBPLANE),0
  6897.  
  6898. _newmask2       BLK.B   (BOBPLANE),0
  6899.  
  6900. _doordata       INCBIN  DATA/DOORS.DATA
  6901.  
  6902. _musicdata      INCBIN  DATA/SOUND.DATA
  6903.  
  6904.                 cnop    0,8
  6905. _screen1        blk.l   (PLANE_SIZE*NUMPLANES)/4,0
  6906.                 cnop    0,8
  6907. _screen2        blk.l   (PLANE_SIZE*NUMPLANES)/4,0