home *** CD-ROM | disk | FTP | other *** search
/ Dave Lowe: Steel Sky In Game Driver Etc / Lowe_SteelSkyInGameDriverEtc.adf / driver.s < prev    next >
Encoding:
Text File  |  1978-10-05  |  23.3 KB  |  1,409 lines

  1.  
  2.  
  3.  
  4.     ;    DRIVER AND MUSIC REMAIN COPYRIGHT D.LOWE 
  5.  
  6.     ;       DRIVER TO RUN RELOCATABLE DATA BLK
  7.     ;
  8.     ;  .....fade only affects music in this version
  9.  
  10.  
  11.  
  12.     ;    JEREMY
  13.     ;    devpac source code file... no macros.
  14.  
  15.     ;    The data blocks can go anywhere in chip
  16.     ;    memory but the  base address must be passed 
  17.     ;    to the driver in A0...and call setup
  18.     ;    Everything else is the same....
  19.     ;    fx are in the same order in every data blk
  20.  
  21.  
  22.     ;    It must be assembled with SYMBOLS CASE independent.
  23.  
  24.     ;       dont hesitate to ring with any problems
  25.  
  26.  
  27.  
  28.     ;        DAVE LOWE.....0723  870648
  29.  
  30.  
  31.  
  32. ;        **************************
  33.  
  34.     section issA,code_c    ;must be in low memory for dma access
  35.                 ;DEVPAC PSEUDO OP ..CAN BE DELETED
  36.  
  37.  
  38. ;*****************************************
  39.  
  40.  
  41. select_tunes    equ 0        ;for conditional assembly whilst testing
  42.                 ; zero to step tunes on mouse button
  43.                 ; can be deleted..not essential
  44.  
  45.         ;  ALL EQUs
  46.  
  47. a00  equ  508*2
  48. bb00  equ  480*2
  49. b00  equ  453*2
  50.  
  51. c01  equ  428*2
  52. db01  equ  404*2
  53. d01 equ  381*2
  54. eb01  equ  360*2
  55. e01  equ  339*2
  56. f01  equ  320*2
  57. gb01  equ  302*2
  58. g01  equ  285*2
  59. ab01 equ 269*2
  60. a01  equ  508
  61. bb01  equ  480
  62. b01  equ  453
  63.  
  64. c02  equ  428
  65. db02  equ  404
  66. d02  equ  381
  67. eb02  equ  360
  68. e02  equ  339
  69. f02  equ  320
  70. gb02  equ  302
  71. g02  equ  285
  72. ab02 equ 269
  73. a02  equ  254
  74. bb02  equ  240
  75. b02  equ  226
  76.  
  77. c03  equ  214
  78. db03  equ  202
  79. d03  equ  190
  80. eb03  equ  180
  81. e03  equ  170
  82. f03  equ  160
  83. gb03  equ  151
  84. g03  equ  143
  85. ab03 equ 135
  86. a03  equ  127
  87.  
  88. bb03  equ  480*2
  89. b03  equ  453*2
  90.  
  91. c04  equ  428*2
  92. db04  equ  404*2
  93. d04 equ  381*2
  94. eb04  equ  360*2
  95. e04  equ  339*2
  96. f04  equ  320*2
  97. gb04  equ  302*2
  98. g04  equ  285*2
  99. ab04 equ 269*2
  100. a04  equ  508
  101. bb04  equ  480
  102. b04  equ  453
  103.  
  104. c05  equ  428
  105. db05  equ  404
  106. d05  equ  381
  107. eb05  equ  360
  108. e05  equ  339
  109. f05  equ  320
  110. gb05  equ  302
  111. g05  equ  285
  112. ab05 equ 269
  113. a05  equ  254
  114. bb05  equ  240
  115. b05  equ  226
  116.  
  117. c06  equ  214
  118. db06  equ  202
  119. d06  equ  190
  120. eb06  equ  180
  121. e06  equ  170
  122. f06  equ  160
  123. gb06  equ  151
  124. g06  equ  143
  125. ab06 equ 135
  126. a06  equ  127
  127. bb06  equ  480*2
  128. b06  equ  453*2
  129.  
  130. c07  equ  428*2
  131. db07  equ  404*2
  132. d07 equ  381*2
  133. eb07  equ  360*2
  134. e07  equ  339*2
  135. f07  equ  320*2
  136. gb07  equ  302*2
  137. g07  equ  285*2
  138. ab07 equ 269*2
  139. a07  equ  508
  140. bb07  equ  480
  141. b07  equ  453
  142.  
  143. c08  equ  428
  144. db08  equ  404
  145. d08  equ  381
  146. eb08  equ  360
  147. e08  equ  339
  148. f08  equ  320
  149. gb08  equ  302
  150. g08  equ  285
  151. ab08 equ 269
  152. a08  equ  254
  153. bb08  equ  240
  154. b08  equ  226
  155.  
  156.  
  157. v equ 0
  158.  
  159. no_loop equ 0
  160. loop equ 0
  161. chann1reg   equ $dff0a0    
  162. chann2reg   equ $dff0b0
  163. chann3reg   equ $dff0c0
  164. chann4reg   equ $dff0d0
  165. dmacon     equ $dff096
  166. int_bf_int   equ   $dff01e
  167. int_bf_w    equ   $dff09a
  168. vhposr     equ   $dff006
  169. in_line    equ   0
  170. new_snd    equ   4
  171. end_song     equ   1
  172. end_patt    equ   8
  173. new_env    equ   12
  174. pbend     equ   16
  175.  
  176.  
  177.  
  178. hi: equ 223
  179. lo:  equ 446
  180.  
  181. r22    equ 134
  182. r20    equ 179        ;correctum
  183. r19    equ 150
  184. r18    equ 178
  185. r17    equ 200
  186. r16:    equ 227        ;correctum
  187. r15:    equ 249
  188. r14    equ 280
  189. r13:    equ 305
  190. r12:    equ 333
  191. r11:    equ 361
  192. r10:    equ 389
  193. r9:    equ 419
  194. r8:    equ 446
  195. r7:    equ 446+112
  196. r6:    equ 446+223
  197. r5:    equ 446+223+112
  198. r4:    equ 446*2
  199. r3:    equ 446*3
  200. r2:    equ 446*4
  201. r1:    equ 446*8
  202.  
  203.  
  204. filter: equ $bfe001
  205. filter_on equ 44
  206. filter_off equ 48
  207.  
  208. modon     equ   20
  209. pboff     equ   24
  210. modoff     equ   28
  211. rest     equ 32
  212. end_fxp  equ 36
  213. end_fx3  equ 36
  214. end_fx4  equ 40
  215. acc    equ 52
  216. repeat    equ 56
  217. down      equ   1
  218. up       equ   2
  219.  
  220. fx    equ 0
  221.  
  222.  
  223.  
  224. ;**************************************************************************
  225. ;**************************************************************************
  226.  
  227.  
  228.  ;    THIS IS THE CONTROL SECTION FOR TESTING AS A STAND ALONE PRG. 
  229.  
  230.     ;       AND CAN BE DELETED WHEN NOT REQUIRED
  231.  
  232.  
  233.     lea data_blk,a0
  234.     jsr set_up
  235.  
  236.  
  237.     move.l    #1,song_buffer
  238.     jsr select_new_song    ;set up tune..numnber 1
  239.  
  240. testloop:
  241.     jsr delay    ;wait for scan line  at 50hz on pal
  242.     tst.w endf
  243.     beq noend
  244.     jsr kill_chip
  245.  
  246.     rts        ;finish
  247.  
  248. endf    dc.w 0
  249.  
  250. noend
  251.     jsr driver    ;run driver at 50 hz for testing
  252.  
  253.         bra testloop    ;loop back
  254.  
  255. finish    
  256.     move.w #1,endf
  257.     rts
  258.  
  259. ;--------
  260.  
  261.         ;these are all routines used during test/stand alone
  262.         ;        assembly
  263.  
  264. delay:
  265.     tst.w fxtimer
  266.     bne no_test
  267.     clr.l d0
  268.     move.b $bfe001,d0
  269.     btst #6,d0
  270.     bne no_test1
  271.     move.w #10,fxtimer
  272.     bra testfx4
  273. no_test
  274.     subq #1,fxtimer
  275. no_test1
  276.     clr.l d0
  277.         move.w vhposr,d0
  278.         andi.w #%1111111100000000,d0
  279.         cmpi.w #%1111111100000000,d0
  280.  
  281.     bne no_test1
  282.     rts
  283.  
  284. testfx4:  
  285.  
  286.     clr.l d0
  287.     move.b $bfe001,d0
  288.     btst #6,d0
  289.     beq testfx4
  290.  
  291.     move.l song_buffer,d0
  292.     addq.l #1,d0
  293.     cmp.l    max_songs,d0
  294.     bne nores
  295.     move.l #1,d0
  296. nores    move.l d0,song_buffer
  297.  
  298.     ifeq    demo
  299.     bra finish        
  300.     endc
  301.  
  302.  
  303.  
  304.     ifeq    select_tunes
  305.  
  306.     jsr    select_new_song        ;new song on mouse button
  307.  
  308.  
  309.     endc
  310.  
  311.     move.l fx_last,d0
  312.     move.l d0,fx_kill
  313.  
  314.     ;jsr kill_loopfx            ;use only one fx at a time
  315.                     ;for testing
  316.  
  317. no_k
  318.         move.l fx_no,fx_number
  319.     move.l fx_no,fx_last
  320.     addq.l #1,fx_no
  321.     move.l    max_fx,d0
  322.         cmp.l fx_no,d0
  323.     bne noreset
  324.     move.l #1,fx_no    
  325. noreset: 
  326.  
  327.  
  328.     ifne    select_tunes
  329.  
  330.     jsr set_up_fx
  331.  
  332.     endc
  333.  
  334.     bra no_test    
  335.  
  336. fxtc:          dc.w 10
  337. fx_no:         dc.l  1
  338. fx_last        dc.l  0
  339. ;max_songs    dc.l  10
  340. ;max_fx        dc.l  10
  341.  
  342. ;        END OF CONTROL (DELETABLE) SECTION
  343.  
  344. ;********************************************************************
  345. ;********************************************************************
  346.  
  347. ;    MAIN VARIABLES TO BE ACCESSED BY PROGRAMMER DURING RUNTIME
  348.  
  349.  
  350. fx_number:     dc.l 0 ;     number of fx required here
  351.  
  352.  
  353. fx_kill        dc.l 0 ;     number of fx to kill/used mainly
  354.                ;     to kill looping fx
  355.  
  356.  
  357. song_buffer     dc.l 1 ;     number of piece of music required here ie.1 to ?               ;     currently playing beach background..see list
  358.  
  359. music_disable:  dc.w 0 ;     1 = disable music
  360.  
  361. fx_disable:     dc.w 0 ;     1 = disable fx
  362.  
  363.  
  364. fade:        dc.w 0 ;      0 to 64..0 = full volume/64 = off
  365.  
  366.  
  367. ;    +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  368.  
  369. ;  THESE VARIABLES ARE USED INTERNALLY BY THE DRIVER
  370. fxr1         dc.l 0  
  371. fxr2         dc.l 0  
  372. fxr3         dc.l 0  
  373. fxr4         dc.l 0  
  374. fxc1        dc.l 0
  375. fxc2          dc.l 0
  376. fxc3        dc.l 0
  377. fxc4          dc.l 0
  378. fx1_flag    dc.w 0
  379. fx2_flag    dc.w 0
  380. fx3_flag    dc.w 0
  381. fx4_flag    dc.w 0
  382. fxtimer        dc.w 0
  383. gen        dc.w 0
  384. int_disable    dc.w 0
  385. altpf         dc.w 0
  386. kill_flag    dc.w 0
  387. mode        dc.w 0
  388. base_address    dc.w 0
  389.  
  390.  
  391.  
  392. ;*********************************
  393. set_up:
  394.     move.l a0,base_address
  395.     rts
  396.  
  397. ;  *******************************************************
  398.  
  399. ;  CALL THIS SUBROUTINE TO SET UP THE REQIURED FX
  400. ;  on entry it requires the fx number to be in "fx_number"(see above)
  401.  
  402.  
  403. set_up_fx
  404.     movem.l d5/a2,-(a7)    ;save used registers
  405.  
  406.     tst.l fxc4
  407.     bne check3
  408. use4:    
  409.     move.w #%0000000000001000,d5
  410.     lea chann4reg,a2
  411.     jsr end_fx4p
  412.     move.l fx_number,fxr4
  413.     move.l fx_number,fxc4
  414.     move.l #0,fx_number
  415.     bra no_fx
  416. check3:    tst.l fxc3
  417.     bne check2
  418. use3:
  419.     move.w #%0000000000000100,d5
  420.     lea chann3reg,a2
  421.     jsr end_fx3p
  422.     move.l fx_number,fxr3
  423.     move.l fx_number,fxc3
  424.     move.l #0,fx_number
  425.     bra no_fx
  426. check2:    tst.l fxc2
  427.     bne check1
  428. use2:
  429.     move.w #%0000000000000010,d5
  430.     lea chann2reg,a2
  431.     jsr end_fx2p
  432.     move.l fx_number,fxr2
  433.     move.l fx_number,fxc2
  434.     move.l #0,fx_number
  435.     bra no_fx
  436. check1:    tst.l fxc1
  437.     bne use3
  438. use1:
  439.     move.w #%0000000000000001,d5
  440.     lea chann1reg,a2
  441.     jsr end_fx1p
  442.     move.l fx_number,fxr1
  443.     move.l fx_number,fxc1
  444.     move.l #0,fx_number
  445. no_fx
  446.     movem.l (a7)+,d5/a2    ;restore registers
  447.     rts
  448.  
  449. ;*************************************************
  450. ;          CALL HERE TO KILL ANY FX...
  451. ;       after putting the number of the fx you want to kill
  452. ;            into fx_kill
  453.  
  454. kill_loopfx
  455.  
  456.     movem.l d5/a2,-(a7)    ;save used registers
  457.     move.l fx_kill,d5
  458.     cmp.l fxc1,d5
  459.     bne k2
  460.     move.w #%0000000000000001,d5
  461.     lea chann1reg,a2
  462.     jsr end_fx1p
  463.     bra error
  464. k2    cmp.l fxc2,d5
  465.     bne k3
  466.     move.w #%0000000000000010,d5
  467.     lea chann2reg,a2
  468.     jsr end_fx2p
  469.     bra error
  470. k3    cmp.l fxc3,d5
  471.     bne k4
  472.     move.w #%0000000000000100,d5
  473.     lea chann3reg,a2
  474.     jsr end_fx3p
  475.     bra error
  476. k4    cmp.l fxc4,d5
  477.     bne error
  478.     move.w #%0000000000001000,d5
  479.     lea chann2reg,a2
  480.     jsr end_fx4p
  481. error
  482.     clr.l fx_kill
  483.     movem.l (a7)+,d5/a2    ;restore registers
  484.     rts
  485. ;*************************************************
  486.  
  487.     ; CALL HERE TO KILL ANY SOUNDS LEFT ON CHIP
  488.  
  489. kill_chip:
  490.     move.w #%0000000000001111,dmacon
  491.     move.l arest_data,chann1reg
  492.     move.l arest_data,chann2reg
  493.     move.l arest_data,chann3reg
  494.     move.l arest_data,chann4reg
  495.     move.w #16,chann1reg+4    
  496.     move.w #16,chann2reg+4    
  497.     move.w #16,chann3reg+4    
  498.     move.w #16,chann4reg+4    
  499.     move.w #0,chann1reg+8
  500.     move.w #0,chann2reg+8
  501.     move.w #0,chann3reg+8
  502.     move.w #0,chann4reg+8
  503.     move.w #1,chann1reg+6
  504.     move.w #1,chann2reg+6
  505.     move.w #1,chann3reg+6
  506.     move.w #1,chann4reg+6
  507.     move.l #0,fxr1
  508.     move.l #0,fxr2
  509.     move.l #0,fxr3
  510.     move.l #0,fxr4
  511.     move.w #0,fx1_flag
  512.     move.w #0,fx2_flag
  513.     move.w #0,fx3_flag
  514.     move.w #0,fx4_flag
  515.     move.l #0,fxc1
  516.     move.l #0,fxc2
  517.     move.l #0,fxc3
  518.     move.l #0,fxc4
  519.     rts
  520.  
  521. arestd:
  522. arest_data:
  523.     dc.w    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  524.  
  525.  
  526.  
  527. ;****************************************
  528.  
  529. ;  CALL HERE TO SELECT WHICH PIECE OF MUSIC TO PLAY
  530. ;  AFTER PLACING NUMBER (1 to ?) IN "SONG_BUFFER"..see above
  531. ;  a call to this routine will initiliase the driver/kill any sound etc.      
  532. ;  make sure this routine has been called before running the interrupt
  533. ;  driven section....see below
  534.  
  535. select_new_song:
  536.  
  537.     move.w #1,int_disable
  538.     movem.l d0/d1/a0/a1,-(a7)    ;save used registers
  539.     move.w music_disable,gen
  540.     move.w #1,music_disable
  541.         jsr kill_chip           
  542.     clr.l d0
  543.         move.w #204,d0
  544.         lea gvars,a0
  545. clloop: clr.w (a0)+        
  546.         dbra  d0,clloop
  547.     tst.l song_buffer
  548.     beq no_song
  549.         move.l song_buffer,d1
  550.     add.l d1,d1
  551.      add.l d1,d1
  552.      add.l d1,d1
  553.      add.l d1,d1
  554.  
  555. ;-----------------
  556.     movea.l (base_address),a1
  557.     move.w (a1),d0        ;word offset to song_table
  558.     lea (a1,d0),a1
  559.     sub.l #16,a1
  560. ;-----------------
  561.         ;LEA  SONG_TABLE-16,A1
  562.  
  563.         add.l d1,a1         ;a1 points to song table in data blk     
  564.  
  565.     movea.l (base_address),a2
  566.         MOVE.L (A1)+,d0
  567.     add.l d0,a2
  568.     move.l a2,wsong1    
  569.  
  570.     movea.l (base_address),a2
  571.         MOVE.L (A1)+,d0
  572.     add.l d0,a2
  573.     move.l a2,wsong2    
  574.  
  575.     movea.l (base_address),a2
  576.         MOVE.L (A1)+,d0
  577.     add.l d0,a2
  578.     move.l a2,wsong3
  579.  
  580.     movea.l (base_address),a2
  581.         MOVE.L (A1),d0
  582.     add.l d0,a2
  583.     move.l a2,wsong4    
  584.  
  585.  
  586.  
  587.  
  588.         MOVE.L #pstart,PATTR1
  589.         MOVE.L #pstart,PATTR2
  590.         MOVE.L #pstart,PATTR3
  591.     move.l #pstart,pattr4
  592.         move.l #sstart,songr1
  593.         MOVE.L #sstart,SONGR2
  594.         MOVE.L #sstart,SONGR3
  595.     move.l #sstart,songr4
  596. no_song
  597.     move.w #1,ch1vars
  598.     move.w #2,ch2vars
  599.     move.w #3,ch3vars
  600.     move.w #4,ch4vars
  601.     move.w #6,ch4fxvars
  602.     move.w #5,ch3fxvars
  603.     move.w #7,ch2fxvars
  604.     move.w #8,ch1fxvars
  605.     move.w gen,music_disable
  606.     clr.w int_disable
  607.     movem.l (a7)+,d0/d1/a0/a1    ;restore registers
  608.         rts
  609.  
  610.  
  611. sstart:        dc.l 0,1
  612. pstart:        dc.w 8
  613.  
  614.  
  615.  
  616. ;**************************************************
  617.  
  618.         ;This is the interrupt routine
  619.  
  620.  
  621. ;  CALL HERE ON A 50hz INTERRUPT DURING RUNTIME
  622. ;  TO PLAY FX AND TUNES
  623.  
  624. driver:  
  625.     tst.w int_disable
  626.     beq process_data
  627.     rts        
  628. process_data
  629.     movem.l d0-d6/a0-a6,-(a7)    ;save used registers
  630.  
  631.  
  632. ch1:
  633.     tst.w fx_disable
  634.     bne test_music1
  635.     tst.l fxr1
  636.     bne   ch1j1
  637.     tst.l fxc1
  638.     beq test_music1
  639.     bra ch1j3
  640. ch1j2    jsr run_dummy1
  641.     jsr run_fx1
  642.     bra ch2
  643. ch1j1
  644.     jsr set_up1
  645. ch1j3    tst.w music_disable    
  646.     beq ch1j2
  647.     jsr run_fx1
  648.     bra ch2
  649. test_music1
  650.     tst.w music_disable
  651.     bne ch2
  652.     jsr run_music1
  653.     bra ch2
  654.     ;***********************
  655.  
  656.     ; channel 1 subroutines
  657.  
  658. run_dummy1    
  659.      lea ch1vars,a0
  660.      lea dummy_reg,a2 
  661.      move.w #0,d5 
  662.      jsr sect1    
  663.     rts
  664.  
  665. set_up1    
  666.          ;move.l fxr1,d0
  667.          ;add d0,d0
  668.          ;add d0,d0
  669. ;---------------------
  670. test
  671.     movea.l (base_address),a1
  672.     move.w 2(a1),d0
  673.     add.w d0,a1
  674.     sub.l #4,a1
  675. ;-----------------------
  676.  
  677.          move.l fxr1,d0
  678.          add d0,d0
  679.          add d0,d0
  680.  
  681.          ;lea  fxjump_table-4,A1
  682.      add.l d0,a1
  683. ;------------------------
  684.     move.l (a1),d0
  685.     move.l (base_address),a1
  686.     add.l d0,a1
  687.     move.l a1,currfx1    ;store address
  688. ;------------------------
  689.       clr.l fxr1
  690.      clr.w fxintc1
  691.       rts
  692.   
  693.      
  694. run_fx1
  695.     lea ch1fxvars,a0
  696.        lea chann1reg,a2
  697.       move.w #%0000000000000001,d5 
  698.      move.w #%1000000000000001,d1 
  699.  
  700.     move.w    #1,mode
  701.      jsr sect1
  702.     rts
  703.  
  704. run_music1
  705.     lea ch1vars,a0
  706.        lea chann1reg,a2
  707.       move.w #%0000000000000001,d5 
  708.       move.w #%1000000000000001,d1 
  709.     move.w    #0,mode
  710.       jsr sect1     
  711.     rts
  712.  
  713.     ;  **************************
  714. ch2
  715.     tst.w fx_disable
  716.     bne test_music2
  717.     tst.l fxr2
  718.     bne   ch2j1
  719.     tst.l fxc2
  720.     beq test_music2
  721.     bra ch2j3
  722. ch2j2    jsr run_dummy2
  723.     jsr run_fx2
  724.     bra ch3
  725. ch2j1
  726.     jsr set_up2
  727. ch2j3    tst.w music_disable    
  728.     beq ch2j2
  729.     jsr run_fx2
  730.     bra ch3
  731.  
  732. test_music2
  733.     tst.w music_disable
  734.     bne ch3
  735.     jsr run_music2
  736.     bra ch3
  737.     ;***********************
  738.     ; channel 2 subroutines
  739. run_dummy2    
  740.      lea ch2vars,a0
  741.      lea dummy_reg,a2 
  742.      move.w #0,d5 
  743.      jsr sect1    
  744.     rts
  745.  
  746. set_up2    
  747.  
  748. ;---------------------
  749.     movea.l (base_address),a1
  750.     move.w 2(a1),d0
  751.     add.w d0,a1
  752.     sub.l #4,a1
  753.  
  754. ;-----------------------
  755.          move.l fxr2,d0
  756.          add d0,d0
  757.          add d0,d0
  758.  
  759.          ;lea  fxjump_table-4,A1
  760.      add.l d0,a1
  761. ;------------------------
  762.     move.l (a1),d0
  763.     move.l (base_address),a1
  764.     add.l d0,a1
  765.     move.l a1,currfx2    ;store address
  766. ;------------------------
  767.       clr.l fxr2
  768.      clr.w fxintc2
  769.       rts
  770.   
  771.      
  772. run_fx2
  773.     lea ch2fxvars,a0
  774.        lea chann2reg,a2
  775.       move.w #%0000000000000010,d5 
  776.      move.w #%1000000000000010,d1 
  777.     move.w    #1,mode
  778.      jsr sect1
  779.     rts
  780.  
  781. run_music2
  782.     lea ch2vars,a0
  783.        lea chann2reg,a2
  784.       move.w #%0000000000000010,d5 
  785.       move.w #%1000000000000010,d1 
  786.     move.w    #0,mode
  787.       jsr sect1     
  788.     rts
  789.  
  790.     ;  **************************
  791.  
  792. ch3:
  793.     tst.w fx_disable
  794.     bne test_music3
  795.     tst.l fxr3
  796.     bne   ch3j1
  797.     tst.l fxc3
  798.     beq test_music3
  799.     bra ch3j3
  800. ch3j2    jsr run_dummy3
  801.     jsr run_fx3
  802.     bra ch4
  803. ch3j1
  804.     jsr set_up3
  805. ch3j3    tst.w music_disable    
  806.     beq ch3j2
  807.     jsr run_fx3
  808.     bra ch4
  809.  
  810. test_music3
  811.     tst.w music_disable
  812.     bne ch4
  813.     jsr run_music3
  814.     bra ch4
  815.  
  816.     ;***********************
  817.  
  818.     ; channel 3 subroutines
  819.  
  820. run_dummy3    
  821.      lea ch3vars,a0
  822.      lea dummy_reg,a2 
  823.      move.w #0,d5 
  824.      jsr sect1    
  825.     rts
  826.  
  827. set_up3    
  828.  
  829. ;---------------------
  830.     movea.l (base_address),a1
  831.     move.w 2(a1),d0
  832.     add.w d0,a1
  833.     sub.l #4,a1
  834. ;-----------------------
  835.          move.l fxr3,d0
  836.          add d0,d0
  837.          add d0,d0
  838.          ;lea  fxjump_table-4,A1
  839.      add.l d0,a1
  840. ;------------------------
  841.     move.l (a1),d0
  842.     move.l (base_address),a1
  843.     add.l d0,a1
  844.     move.l a1,currfx3    ;store address
  845. ;------------------------
  846.       clr.l fxr3
  847.      clr.w fxintc3
  848.       rts
  849.   
  850.      
  851. run_fx3
  852.     lea ch3fxvars,a0
  853.        lea chann3reg,a2
  854.       move.w #%0000000000000100,d5 
  855.      move.w #%1000000000000100,d1 
  856.     move.w    #1,mode
  857.      jsr sect1
  858.     rts
  859.  
  860. run_music3
  861.     lea ch3vars,a0
  862.        lea chann3reg,a2
  863.       move.w #%0000000000000100,d5 
  864.       move.w #%1000000000000100,d1 
  865.     move.w    #0,mode
  866.       jsr sect1     
  867.     rts
  868.  
  869.     ;  **************************
  870.  
  871. ch4:
  872.     tst.w fx_disable
  873.     bne test_music4
  874.     tst.l fxr4
  875.     bne   ch4j1
  876.     tst.l fxc4
  877.     beq test_music4
  878.     bra ch4j3
  879. ch4j2    jsr run_dummy4
  880.     jsr run_fx4
  881.     bra no4
  882. ch4j1
  883.     jsr set_up4
  884. ch4j3    tst.w music_disable    
  885.     beq ch4j2
  886.     jsr run_fx4
  887.     bra no4
  888.  
  889. test_music4
  890.     tst.w music_disable
  891.     bne no4
  892.     jsr run_music4
  893. no4    
  894.     movem.l (a7)+,d0-d6/a0-a6    ;restore registers
  895.     rts
  896.  
  897.     ;***********************
  898.  
  899.     ; channel 4 subroutines
  900.  
  901. run_dummy4    
  902.      lea ch4vars,a0
  903.      lea dummy_reg,a2 
  904.      move.w #0,d5 
  905.      jsr sect1    
  906.     rts
  907.  
  908. set_up4    
  909. ;---------------------
  910.     move.l (base_address),a1
  911.     move.w 2(a1),d0
  912.     add.w d0,a1
  913.     sub.l #4,a1        ;pointer to jumptable
  914. ;-----------------------
  915.          move.l fxr4,d0
  916.          add d0,d0
  917.          add d0,d0
  918.      add.l d0,a1        ;pointer to fx offset within table
  919. ;------------------------
  920.     move.l (a1),d0
  921.     move.l (base_address),a1
  922.     add.l d0,a1
  923.     move.l a1,currfx4    ;store address
  924. ;------------------------
  925.       clr.l fxr4
  926.      clr.w fxintc4
  927.       rts
  928.   
  929.      
  930. run_fx4
  931.     lea ch4fxvars,a0
  932.        lea chann4reg,a2
  933.       move.w #%0000000000001000,d5 
  934.      move.w #%1000001000001000,d1 
  935.     move.w    #1,mode
  936.      jsr sect1
  937.     rts
  938.  
  939. run_music4
  940.     lea ch4vars,a0
  941.        lea chann4reg,a2
  942.       move.w #%0000000000001000,d5 
  943.       move.w #%1000001000001000,d1 
  944.     move.w    #0,mode
  945.       jsr sect1     
  946.     rts
  947.     ;  **************************
  948.  
  949. sect1: tst.w (a0)
  950.     bne s1j1
  951.     rts
  952.  
  953. s1j1:    tst.w 2(a0)
  954.         beq sect3       
  955.         cmpi.w #1,2(a0)
  956.         beq sect4
  957.  
  958.         cmpi.w #3,4(a0)    
  959.         beq part2       
  960.     
  961. mode_switch:  subq.w #1,2(a0)     
  962.  
  963. check_effects: clr.w altpf      
  964.         move.w 6(a0),d2    
  965.         tst.w 8(a0)      
  966.         beq check_mod
  967.         tst.w 14(a0)      
  968.         beq cont_bend
  969.         subq.w #1,14(a0)
  970.         bra check_mod
  971. cont_bend:   addq.w #1,altpf    
  972.         move.w 10(a0),d3    
  973.         move.w 12(a0),d4    
  974.         cmpi.w #1,8(a0)
  975.         beq pbup
  976.     
  977.         sub.w d3,d2
  978.         cmp.w d2,d4
  979.         bcs check_mod
  980.         bra fbend
  981.  
  982. pbup:     add.w d3,d2
  983.         cmp.w d2,d4
  984.         bcc check_mod
  985. fbend:     move.w d4,d2
  986.         clr.w 8(a0)      
  987. check_mod:   tst.w 16(a0)
  988.         beq send_alt_pitch
  989.    
  990.  
  991.     tst.w  58(a0)
  992.     beq st_ok
  993.     subq.w #1,58(a0)
  994.     bra send_alt_pitch
  995. st_ok:
  996.         tst.w 50(a0)
  997.         beq cont_mod
  998.         subq #1,50(a0)
  999.         bra send_alt_pitch
  1000. cont_mod:    move.w 52(a0),50(a0)  
  1001.         addq #1,altpf
  1002.         cmpi #3,16(a0)
  1003.         bcc addmod
  1004.     
  1005.         move.w 56(a0),d3 
  1006.         sub.w d3,d2
  1007.         addq.w #1,16(a0)  
  1008.         bra send_alt_pitch
  1009. addmod:
  1010.  
  1011.         move.w 54(a0),d3 
  1012.         add.w d3,d2
  1013.         addq.w #1,16(a0)
  1014.         cmpi.w #5,16(a0)
  1015.        bne send_alt_pitch
  1016.         move.w #1,16(a0)  
  1017.  
  1018. send_alt_pitch: tst.w altpf
  1019.         beq send_env
  1020.         move.w d2,6(a0)  
  1021.         move.w d2,6(a2)  
  1022.  
  1023. send_env: 
  1024.  
  1025. do_env_check:
  1026.  
  1027. norm_env:
  1028.     move.l 18(a0),a1    
  1029.         cmpi.w #255,(a1)
  1030.         beq env_finished
  1031.     ;cmpi.w #1,66(a0)    
  1032.     ;bne    no_acc 
  1033.  
  1034. resu    clr.l d0
  1035.     move.w (a1)+,d0
  1036.     ;sub.w 64(a0),d0    
  1037.  
  1038.             ;test for mode here
  1039.     tst.w mode
  1040.     bne sete
  1041.  
  1042.     sub.w fade,d0
  1043.     bcc sete
  1044.  
  1045.  
  1046.     move.w #0,d0
  1047.  
  1048.  
  1049. sete    move.w d0,8(a2)    
  1050.     move.l a1,18(a0)
  1051.     rts        
  1052.  
  1053.  
  1054. no_acc:
  1055. ;resu:  
  1056. no_off
  1057.     ;move.w (a1)+,d0
  1058.     sub.w fade,d0
  1059.     bcc sete2
  1060.     move.w #0,d0
  1061. sete2    move.w d0,8(a2)
  1062.      move.w (a1)+,8(a2)
  1063.    
  1064. fint:   move.l a1,18(a0)    
  1065.     rts
  1066.  
  1067. env_finished:
  1068.     subq.l #2,a1    
  1069.     bra resu
  1070.     rts
  1071.  
  1072.  
  1073.  
  1074. one_shot_note: move.w #3,4(a0)     
  1075.         move.l 38(a0),(a2)
  1076.         move.w 42(a0),4(a2)
  1077.         move.w d1,dmacon     
  1078.         bra send_env
  1079.  
  1080.  
  1081. part2:                         
  1082.         move.l 44(a0),(a2)
  1083.         move.w 48(a0),4(a2)
  1084.         subq.w #1,2(a0)      
  1085.         move.w #1,4(a0)
  1086.         bra check_effects
  1087.  
  1088. sect3:
  1089.     move.w #0,66(a0)    
  1090.  
  1091.     move.l 22(a0),a1  
  1092. control_ret: move.w (a1)+,d0  
  1093.     cmpi.w #100,d0   
  1094.     bls sect5   
  1095.   
  1096. acc_note:
  1097.     move.w d0,6(a0)  
  1098.     move.w d0,6(a2)  
  1099.     move.w (a1)+,2(a0) 
  1100.     subq.w #1,2(a0)  
  1101.     move.l a1,22(a0)  
  1102.     move.l 34(a0),18(a0) 
  1103.     move.w 60(a0),58(a0) 
  1104.  
  1105.  
  1106.     tst.w 16(a0)
  1107.     beq no_mod_res
  1108.     move.w #1,16(a0)
  1109. no_mod_res:
  1110.     cmpi.w #0,4(a0)
  1111.     beq do_loop
  1112.     bra one_shot_note    
  1113.  
  1114.  
  1115. do_loop:    move.w d1,dmacon   
  1116.         bra send_env
  1117.  
  1118. do_rest:
  1119.     move.w (a1)+,2(a0) 
  1120.     subq.w #1,2(a0)  
  1121.     move.l a1,22(a0)  
  1122.     move.l  #drest_env,18(a0)
  1123.  
  1124.         move.w #0,8(a2)
  1125.         bra send_env
  1126.    
  1127. sect4:
  1128.         cmpi.w #0,4(a0)
  1129.         beq noof
  1130.         move.w d5,dmacon   
  1131. noof:     subq.w #1,2(a0)
  1132.         bra check_effects
  1133.    
  1134. sect5:     move.l #jump_table,a3
  1135.         move.l (a3,d0),a4
  1136.         jmp (a4)
  1137.  
  1138. jump_table: 
  1139.     dc.l  in_line_data
  1140.         dc.l  nsound
  1141.         dc.l  patt_end
  1142.         dc.l  get_env
  1143.         dc.l  check_pbend
  1144.         dc.l  do_mod
  1145.         dc.l  bend_off
  1146.         dc.l  mod_off
  1147.         dc.l  do_rest
  1148.         dc.l  end_fx
  1149.         dc.l  end_fx
  1150.     dc.l  s_f_on
  1151.     dc.l  s_f_off
  1152.     dc.l  set_acc
  1153.     dc.l  rept
  1154.  
  1155. in_line_data:
  1156.  
  1157.         nop
  1158.         rts
  1159.  
  1160. rept:
  1161.     move.l (a1),d0
  1162.     move.l (base_address),a1
  1163.     add.l    d0,a1
  1164.     bra control_ret
  1165.  
  1166. s_f_on: 
  1167.     bclr #1,filter
  1168.     bra control_ret
  1169. s_f_off:
  1170.     bset #1,filter
  1171.     bra control_ret
  1172.  
  1173. nsound:
  1174. ;----------------------------
  1175.     move.l (a1)+,d0        ;sound offset
  1176.     move.l (base_address),a3
  1177.     add.l d0,a3
  1178. ;----------------------------
  1179.         ;move.l (a1)+,a3     
  1180.  
  1181.         cmpi.w #0,(a3)
  1182.         bne one_shot_sound
  1183.  
  1184. xxx
  1185.         move.w (a3)+,4(a0)        ;length    
  1186.  
  1187. ;-----------------
  1188.     move.l (base_address),a6
  1189.     move.l (a3)+,d0
  1190.     add.l d0,a6
  1191.     move.l a6,(a2)
  1192. ;--------------------
  1193.         ;move.l (a3)+,(a2)     
  1194.  
  1195.         move.w (a3),4(a2)    
  1196.         jmp control_ret
  1197.  
  1198. one_shot_sound:
  1199.         move.w (a3)+,4(a0)        ;type of sound
  1200. ;-----------
  1201.     move.l (base_address),a6
  1202.     move.l (a3)+,d0
  1203.     add.l d0,a6
  1204.     move.l a6,38(a0)        ;address sample 1
  1205. ;---------------
  1206.         move.w (a3)+,42(a0)        ;length sample 1
  1207. ;---------------------
  1208.     move.l (base_address),a6
  1209.     move.l (a3)+,d0
  1210.     add.l d0,a6
  1211.     move.l a6,44(a0)
  1212.  
  1213. ;---------------------
  1214.     ;add.l #4,a3
  1215.         move.w (a3),48(a0)
  1216.         jmp control_ret
  1217.  
  1218. patt_end:
  1219.  
  1220.         move.l 26(a0),a1    
  1221.         cmpi.l #0,(a1)     
  1222.         beq song_control        ;end of song
  1223.         addq.l #4,26(a0)            ;get next pattern address
  1224. ;-----------------------
  1225.     move.l (a1),d0        ;offset
  1226.     move.l (base_address),a1
  1227.     add.l d0,a1        ;new pattern
  1228.  
  1229. ;------------------------
  1230.         ;move.l (a1),a1     
  1231.         jmp control_ret
  1232. get_env:
  1233. ;-----------------------
  1234.     move.l (a1)+,d0        ;env offset
  1235.     move.l (base_address),a4
  1236.     add.l d0,a4     
  1237. ;--------------------------
  1238.     ;move.l (a1)+,a4 
  1239.  
  1240.     move.l (a4)+,62(a0)    
  1241.     
  1242.     move.l  a4,34(a0)    
  1243.     
  1244.         bra control_ret
  1245.  
  1246. check_pbend:
  1247.      move.l (a1)+,8(a0)
  1248.         move.l (a1)+,12(a0)
  1249.         bra control_ret
  1250.  
  1251. do_mod:    move.w #1,16(a0)  
  1252.         move.l (a1)+,50(a0)
  1253.         move.l (a1)+,54(a0)
  1254.         move.l (a1)+,58(a0)
  1255.         bra control_ret
  1256.  
  1257. bend_off:   clr.w 8(a0)
  1258.         bra control_ret
  1259.  
  1260. mod_off:    clr.w 16(a0)
  1261.         bra control_ret
  1262.  
  1263.  
  1264. end_fx:    
  1265.     cmpi.w #6,(a0)
  1266.     beq end_fx4p
  1267.     cmpi.w #5,(a0)
  1268.     beq end_fx3p
  1269.     cmpi.w #7,(a0)
  1270.     beq end_fx2p
  1271.  
  1272. end_fx1p:
  1273.         move.w d5,dmacon   
  1274.     move.w  #1,chann1reg+6
  1275.     move.w #0,8(a2)
  1276.     move.l #0,fxc1
  1277.     rts
  1278.  
  1279. end_fx2p:
  1280.     move.w d5,dmacon 
  1281.     move.w  #1,chann2reg+6
  1282.         move.w #0,8(a2) 
  1283.     move.l #0,fxc2
  1284.         rts
  1285.  
  1286.  
  1287. end_fx3p:
  1288.         move.w d5,dmacon   
  1289.     move.w  #1,chann3reg+6
  1290.     move.w #0,8(a2)
  1291.     move.l #0,fxc3
  1292.     rts
  1293.  
  1294. end_fx4p:
  1295.     move.w d5,dmacon 
  1296.     move.w  #1,chann4reg+6
  1297.         move.w #0,8(a2) 
  1298.     move.l #0,fxc4
  1299.         rts
  1300.  
  1301. set_acc: move.w #1,66(a0) 
  1302.     bra control_ret
  1303.  
  1304. song_control:
  1305.         addq.l #4,a1
  1306.         move.l 30(a0),26(a0)
  1307.         move.l 26(a0),a1
  1308.         addq.l #4,26(a0)
  1309. ;------------------
  1310.     move.l (base_address),a6
  1311.     move.l (a1),d0
  1312.     add.l d0,a6
  1313.     move.l a6,a1
  1314. ;-----------------------
  1315.         ;move.l (a1),a1
  1316.         jmp control_ret
  1317.  
  1318.  
  1319.     ;"""""""""""""""""""""""""""""""""""""""""""""""""
  1320. ;************************************************************
  1321. gvars:
  1322. ch1vars     
  1323.     dc.w 0     
  1324.         dc.w 0,0,0,0,0,0,0,0,0,0     
  1325. pattr1: dc.l 0    
  1326. songr1: dc.l 0    
  1327. wsong1: dc.l 0   
  1328.         dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0   
  1329.  
  1330. ch2vars     
  1331.     dc.w 0     
  1332.         dc.w 0,0,0,0,0,0,0,0,0,0     
  1333. pattr2: dc.l 0    
  1334. songr2: dc.l 0    
  1335. wsong2: dc.l 0    
  1336.         dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0   
  1337.  
  1338. ch3vars 
  1339.     dc.w 0     
  1340.         dc.w 0,0,0,0,0,0,0,0,0,0     
  1341. pattr3: dc.l 0    
  1342. songr3: dc.l 0    
  1343. wsong3: dc.l 0    
  1344.         dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0   
  1345.  
  1346. ch4vars 
  1347.     dc.w 0     
  1348.         dc.w 0,0,0,0,0,0,0,0,0,0     
  1349. pattr4: dc.l 0    
  1350. songr4: dc.l 0    
  1351. wsong4: dc.l 0    
  1352.         dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0   
  1353.  
  1354.  
  1355. ch1fxvars 
  1356.     dc.w 0     
  1357. fxintc1:
  1358.     dc.w 0,0,0,0,0,0,0,0,0,0     
  1359. currfx1:
  1360.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0    
  1361.  
  1362. ch2fxvars 
  1363.     dc.w 0     
  1364. fxintc2:
  1365.     dc.w 0,0,0,0,0,0,0,0,0,0     
  1366. currfx2:
  1367.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0    
  1368.  
  1369.  
  1370. ch3fxvars
  1371.     dc.w 0     
  1372. fxintc3:
  1373.     dc.w 0,0,0,0,0,0,0,0,0,0     
  1374. currfx3:
  1375.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0    
  1376.  
  1377. ch4fxvars 
  1378.     dc.w 0     
  1379. fxintc4:
  1380.     dc.w 0,0,0,0,0,0,0,0,0,0     
  1381. currfx4:
  1382.     dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0    
  1383. ;************************************************************
  1384.  
  1385. drest_env    dc.w  0,0,0,0,0,0,0,0,255
  1386.  
  1387.  
  1388.  
  1389. dummy_reg dc.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  1390.         dc.l  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  1391.         dc.l  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  1392.         dc.l  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  1393.         dc.l  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  1394.         dc.l  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  1395.  
  1396.     even
  1397.  
  1398. data_blk:    ;test place for getting the data blk in
  1399.  
  1400.     ;incbin c:kq6/opening/open4.bin
  1401.  
  1402.     ;end
  1403.  
  1404.  
  1405.  
  1406. ;*****************************************************
  1407.  
  1408.  
  1409.