home *** CD-ROM | disk | FTP | other *** search
/ Dave Lowe: Kings Quest Backup 2 / Lowe_KingsQuestBackup2.adf / driver.s next >
Encoding:
Text File  |  1978-06-30  |  23.1 KB  |  1,393 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.  
  243.     jsr driver    ;run driver at 50 hz for testing
  244.  
  245.         bra testloop    ;loop back
  246.  
  247.  
  248. ;--------
  249.  
  250.         ;these are all routines used during test/stand alone
  251.         ;        assembly
  252.  
  253. delay:
  254.     tst.w fxtimer
  255.     bne no_test
  256.     clr.l d0
  257.     move.b $bfe001,d0
  258.     btst #6,d0
  259.     bne no_test1
  260.     move.w #10,fxtimer
  261.     bra testfx4
  262. no_test
  263.     subq #1,fxtimer
  264. no_test1
  265.     clr.l d0
  266.         move.w vhposr,d0
  267.         andi.w #%1111111100000000,d0
  268.         cmpi.w #%1111111100000000,d0
  269.  
  270.     bne no_test1
  271.     rts
  272.  
  273. testfx4:  
  274.  
  275.     clr.l d0
  276.     move.b $bfe001,d0
  277.     btst #6,d0
  278.     beq testfx4
  279.  
  280.     move.l song_buffer,d0
  281.     addq.l #1,d0
  282.     cmp.l    max_songs,d0
  283.     bne nores
  284.     move.l #1,d0
  285. nores    move.l d0,song_buffer
  286.  
  287.  
  288.     ifeq    select_tunes
  289.  
  290.     jsr    select_new_song        ;new song on mouse button
  291.  
  292.  
  293.     endc
  294.  
  295.     move.l fx_last,d0
  296.     move.l d0,fx_kill
  297.  
  298.     ;jsr kill_loopfx            ;use only one fx at a time
  299.                     ;for testing
  300.  
  301. no_k
  302.         move.l fx_no,fx_number
  303.     move.l fx_no,fx_last
  304.     addq.l #1,fx_no
  305.     move.l    max_fx,d0
  306.         cmp.l fx_no,d0
  307.     bne noreset
  308.     move.l #1,fx_no    
  309. noreset: 
  310.  
  311.  
  312.     ifne    select_tunes
  313.  
  314.     jsr set_up_fx
  315.  
  316.     endc
  317.  
  318.     bra no_test    
  319.  
  320. fxtc:          dc.w 10
  321. fx_no:         dc.l  1
  322. fx_last        dc.l  0
  323. max_songs    dc.l  5
  324. max_fx        dc.l  10
  325.  
  326. ;        END OF CONTROL (DELETABLE) SECTION
  327.  
  328. ;********************************************************************
  329. ;********************************************************************
  330.  
  331. ;    MAIN VARIABLES TO BE ACCESSED BY PROGRAMMER DURING RUNTIME
  332.  
  333.  
  334. fx_number:     dc.l 0 ;     number of fx required here
  335.  
  336.  
  337. fx_kill        dc.l 0 ;     number of fx to kill/used mainly
  338.                ;     to kill looping fx
  339.  
  340.  
  341. song_buffer     dc.l 1 ;     number of piece of music required here ie.1 to ?               ;     currently playing beach background..see list
  342.  
  343. music_disable:  dc.w 0 ;     1 = disable music
  344.  
  345. fx_disable:     dc.w 0 ;     1 = disable fx
  346.  
  347.  
  348. fade:        dc.w 0 ;      0 to 64..0 = full volume/64 = off
  349.  
  350.  
  351. ;    +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  352.  
  353. ;  THESE VARIABLES ARE USED INTERNALLY BY THE DRIVER
  354. fxr1         dc.l 0  
  355. fxr2         dc.l 0  
  356. fxr3         dc.l 0  
  357. fxr4         dc.l 0  
  358. fxc1        dc.l 0
  359. fxc2          dc.l 0
  360. fxc3        dc.l 0
  361. fxc4          dc.l 0
  362. fx1_flag    dc.w 0
  363. fx2_flag    dc.w 0
  364. fx3_flag    dc.w 0
  365. fx4_flag    dc.w 0
  366. fxtimer        dc.w 0
  367. gen        dc.w 0
  368. int_disable    dc.w 0
  369. altpf         dc.w 0
  370. kill_flag    dc.w 0
  371. mode        dc.w 0
  372. base_address    dc.w 0
  373.  
  374.  
  375.  
  376. ;*********************************
  377. set_up:
  378.     move.l a0,base_address
  379.     rts
  380.  
  381. ;  *******************************************************
  382.  
  383. ;  CALL THIS SUBROUTINE TO SET UP THE REQIURED FX
  384. ;  on entry it requires the fx number to be in "fx_number"(see above)
  385.  
  386.  
  387. set_up_fx
  388.     movem.l d5/a2,-(a7)    ;save used registers
  389.  
  390.     tst.l fxc4
  391.     bne check3
  392. use4:    
  393.     move.w #%0000000000001000,d5
  394.     lea chann4reg,a2
  395.     jsr end_fx4p
  396.     move.l fx_number,fxr4
  397.     move.l fx_number,fxc4
  398.     move.l #0,fx_number
  399.     bra no_fx
  400. check3:    tst.l fxc3
  401.     bne check2
  402. use3:
  403.     move.w #%0000000000000100,d5
  404.     lea chann3reg,a2
  405.     jsr end_fx3p
  406.     move.l fx_number,fxr3
  407.     move.l fx_number,fxc3
  408.     move.l #0,fx_number
  409.     bra no_fx
  410. check2:    tst.l fxc2
  411.     bne check1
  412. use2:
  413.     move.w #%0000000000000010,d5
  414.     lea chann2reg,a2
  415.     jsr end_fx2p
  416.     move.l fx_number,fxr2
  417.     move.l fx_number,fxc2
  418.     move.l #0,fx_number
  419.     bra no_fx
  420. check1:    tst.l fxc1
  421.     bne use3
  422. use1:
  423.     move.w #%0000000000000001,d5
  424.     lea chann1reg,a2
  425.     jsr end_fx1p
  426.     move.l fx_number,fxr1
  427.     move.l fx_number,fxc1
  428.     move.l #0,fx_number
  429. no_fx
  430.     movem.l (a7)+,d5/a2    ;restore registers
  431.     rts
  432.  
  433. ;*************************************************
  434. ;          CALL HERE TO KILL ANY FX...
  435. ;       after putting the number of the fx you want to kill
  436. ;            into fx_kill
  437.  
  438. kill_loopfx
  439.  
  440.     movem.l d5/a2,-(a7)    ;save used registers
  441.     move.l fx_kill,d5
  442.     cmp.l fxc1,d5
  443.     bne k2
  444.     move.w #%0000000000000001,d5
  445.     lea chann1reg,a2
  446.     jsr end_fx1p
  447.     bra error
  448. k2    cmp.l fxc2,d5
  449.     bne k3
  450.     move.w #%0000000000000010,d5
  451.     lea chann2reg,a2
  452.     jsr end_fx2p
  453.     bra error
  454. k3    cmp.l fxc3,d5
  455.     bne k4
  456.     move.w #%0000000000000100,d5
  457.     lea chann3reg,a2
  458.     jsr end_fx3p
  459.     bra error
  460. k4    cmp.l fxc4,d5
  461.     bne error
  462.     move.w #%0000000000001000,d5
  463.     lea chann2reg,a2
  464.     jsr end_fx4p
  465. error
  466.     clr.l fx_kill
  467.     movem.l (a7)+,d5/a2    ;restore registers
  468.     rts
  469. ;*************************************************
  470.  
  471.     ; CALL HERE TO KILL ANY SOUNDS LEFT ON CHIP
  472.  
  473. kill_chip:
  474.     move.w #%0000000000001111,dmacon
  475.     move.l arest_data,chann1reg
  476.     move.l arest_data,chann2reg
  477.     move.l arest_data,chann3reg
  478.     move.l arest_data,chann4reg
  479.     move.w #16,chann1reg+4    
  480.     move.w #16,chann2reg+4    
  481.     move.w #16,chann3reg+4    
  482.     move.w #16,chann4reg+4    
  483.     move.w #0,chann1reg+8
  484.     move.w #0,chann2reg+8
  485.     move.w #0,chann3reg+8
  486.     move.w #0,chann4reg+8
  487.     move.w #1,chann1reg+6
  488.     move.w #1,chann2reg+6
  489.     move.w #1,chann3reg+6
  490.     move.w #1,chann4reg+6
  491.     move.l #0,fxr1
  492.     move.l #0,fxr2
  493.     move.l #0,fxr3
  494.     move.l #0,fxr4
  495.     move.w #0,fx1_flag
  496.     move.w #0,fx2_flag
  497.     move.w #0,fx3_flag
  498.     move.w #0,fx4_flag
  499.     move.l #0,fxc1
  500.     move.l #0,fxc2
  501.     move.l #0,fxc3
  502.     move.l #0,fxc4
  503.     rts
  504.  
  505. arestd:
  506. arest_data:
  507.     dc.w    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  508.  
  509.  
  510.  
  511. ;****************************************
  512.  
  513. ;  CALL HERE TO SELECT WHICH PIECE OF MUSIC TO PLAY
  514. ;  AFTER PLACING NUMBER (1 to ?) IN "SONG_BUFFER"..see above
  515. ;  a call to this routine will initiliase the driver/kill any sound etc.      
  516. ;  make sure this routine has been called before running the interrupt
  517. ;  driven section....see below
  518.  
  519. select_new_song:
  520.  
  521.     move.w #1,int_disable
  522.     movem.l d0/d1/a0/a1,-(a7)    ;save used registers
  523.     move.w music_disable,gen
  524.     move.w #1,music_disable
  525.         jsr kill_chip           
  526.     clr.l d0
  527.         move.w #204,d0
  528.         lea gvars,a0
  529. clloop: clr.w (a0)+        
  530.         dbra  d0,clloop
  531.     tst.l song_buffer
  532.     beq no_song
  533.         move.l song_buffer,d1
  534.     add.l d1,d1
  535.      add.l d1,d1
  536.      add.l d1,d1
  537.      add.l d1,d1
  538.  
  539. ;-----------------
  540.     movea.l (base_address),a1
  541.     move.w (a1),d0        ;word offset to song_table
  542.     lea (a1,d0),a1
  543.     sub.l #16,a1
  544. ;-----------------
  545.         ;LEA  SONG_TABLE-16,A1
  546.  
  547.         add.l d1,a1         ;a1 points to song table in data blk     
  548.  
  549.     movea.l (base_address),a2
  550.         MOVE.L (A1)+,d0
  551.     add.l d0,a2
  552.     move.l a2,wsong1    
  553.  
  554.     movea.l (base_address),a2
  555.         MOVE.L (A1)+,d0
  556.     add.l d0,a2
  557.     move.l a2,wsong2    
  558.  
  559.     movea.l (base_address),a2
  560.         MOVE.L (A1)+,d0
  561.     add.l d0,a2
  562.     move.l a2,wsong3
  563.  
  564.     movea.l (base_address),a2
  565.         MOVE.L (A1),d0
  566.     add.l d0,a2
  567.     move.l a2,wsong4    
  568.  
  569.  
  570.  
  571.  
  572.         MOVE.L #pstart,PATTR1
  573.         MOVE.L #pstart,PATTR2
  574.         MOVE.L #pstart,PATTR3
  575.     move.l #pstart,pattr4
  576.         move.l #sstart,songr1
  577.         MOVE.L #sstart,SONGR2
  578.         MOVE.L #sstart,SONGR3
  579.     move.l #sstart,songr4
  580. no_song
  581.     move.w #1,ch1vars
  582.     move.w #2,ch2vars
  583.     move.w #3,ch3vars
  584.     move.w #4,ch4vars
  585.     move.w #6,ch4fxvars
  586.     move.w #5,ch3fxvars
  587.     move.w #7,ch2fxvars
  588.     move.w #8,ch1fxvars
  589.     move.w gen,music_disable
  590.     clr.w int_disable
  591.     movem.l (a7)+,d0/d1/a0/a1    ;restore registers
  592.         rts
  593.  
  594.  
  595. sstart:        dc.l 0,1
  596. pstart:        dc.w 8
  597.  
  598.  
  599.  
  600. ;**************************************************
  601.  
  602.         ;This is the interrupt routine
  603.  
  604.  
  605. ;  CALL HERE ON A 50hz INTERRUPT DURING RUNTIME
  606. ;  TO PLAY FX AND TUNES
  607.  
  608. driver:  
  609.     tst.w int_disable
  610.     beq process_data
  611.     rts        
  612. process_data
  613.     movem.l d0-d6/a0-a6,-(a7)    ;save used registers
  614.  
  615.  
  616. ch1:
  617.     tst.w fx_disable
  618.     bne test_music1
  619.     tst.l fxr1
  620.     bne   ch1j1
  621.     tst.l fxc1
  622.     beq test_music1
  623.     bra ch1j3
  624. ch1j2    jsr run_dummy1
  625.     jsr run_fx1
  626.     bra ch2
  627. ch1j1
  628.     jsr set_up1
  629. ch1j3    tst.w music_disable    
  630.     beq ch1j2
  631.     jsr run_fx1
  632.     bra ch2
  633. test_music1
  634.     tst.w music_disable
  635.     bne ch2
  636.     jsr run_music1
  637.     bra ch2
  638.     ;***********************
  639.  
  640.     ; channel 1 subroutines
  641.  
  642. run_dummy1    
  643.      lea ch1vars,a0
  644.      lea dummy_reg,a2 
  645.      move.w #0,d5 
  646.      jsr sect1    
  647.     rts
  648.  
  649. set_up1    
  650.          ;move.l fxr1,d0
  651.          ;add d0,d0
  652.          ;add d0,d0
  653. ;---------------------
  654. test
  655.     movea.l (base_address),a1
  656.     move.w 2(a1),d0
  657.     add.w d0,a1
  658.     sub.l #4,a1
  659. ;-----------------------
  660.  
  661.          move.l fxr1,d0
  662.          add d0,d0
  663.          add d0,d0
  664.  
  665.          ;lea  fxjump_table-4,A1
  666.      add.l d0,a1
  667. ;------------------------
  668.     move.l (a1),d0
  669.     move.l (base_address),a1
  670.     add.l d0,a1
  671.     move.l a1,currfx1    ;store address
  672. ;------------------------
  673.       clr.l fxr1
  674.      clr.w fxintc1
  675.       rts
  676.   
  677.      
  678. run_fx1
  679.     lea ch1fxvars,a0
  680.        lea chann1reg,a2
  681.       move.w #%0000000000000001,d5 
  682.      move.w #%1000000000000001,d1 
  683.  
  684.     move.w    #1,mode
  685.      jsr sect1
  686.     rts
  687.  
  688. run_music1
  689.     lea ch1vars,a0
  690.        lea chann1reg,a2
  691.       move.w #%0000000000000001,d5 
  692.       move.w #%1000000000000001,d1 
  693.     move.w    #0,mode
  694.       jsr sect1     
  695.     rts
  696.  
  697.     ;  **************************
  698. ch2
  699.     tst.w fx_disable
  700.     bne test_music2
  701.     tst.l fxr2
  702.     bne   ch2j1
  703.     tst.l fxc2
  704.     beq test_music2
  705.     bra ch2j3
  706. ch2j2    jsr run_dummy2
  707.     jsr run_fx2
  708.     bra ch3
  709. ch2j1
  710.     jsr set_up2
  711. ch2j3    tst.w music_disable    
  712.     beq ch2j2
  713.     jsr run_fx2
  714.     bra ch3
  715.  
  716. test_music2
  717.     tst.w music_disable
  718.     bne ch3
  719.     jsr run_music2
  720.     bra ch3
  721.     ;***********************
  722.     ; channel 2 subroutines
  723. run_dummy2    
  724.      lea ch2vars,a0
  725.      lea dummy_reg,a2 
  726.      move.w #0,d5 
  727.      jsr sect1    
  728.     rts
  729.  
  730. set_up2    
  731.  
  732. ;---------------------
  733.     movea.l (base_address),a1
  734.     move.w 2(a1),d0
  735.     add.w d0,a1
  736.     sub.l #4,a1
  737.  
  738. ;-----------------------
  739.          move.l fxr2,d0
  740.          add d0,d0
  741.          add d0,d0
  742.  
  743.          ;lea  fxjump_table-4,A1
  744.      add.l d0,a1
  745. ;------------------------
  746.     move.l (a1),d0
  747.     move.l (base_address),a1
  748.     add.l d0,a1
  749.     move.l a1,currfx2    ;store address
  750. ;------------------------
  751.       clr.l fxr2
  752.      clr.w fxintc2
  753.       rts
  754.   
  755.      
  756. run_fx2
  757.     lea ch2fxvars,a0
  758.        lea chann2reg,a2
  759.       move.w #%0000000000000010,d5 
  760.      move.w #%1000000000000010,d1 
  761.     move.w    #1,mode
  762.      jsr sect1
  763.     rts
  764.  
  765. run_music2
  766.     lea ch2vars,a0
  767.        lea chann2reg,a2
  768.       move.w #%0000000000000010,d5 
  769.       move.w #%1000000000000010,d1 
  770.     move.w    #0,mode
  771.       jsr sect1     
  772.     rts
  773.  
  774.     ;  **************************
  775.  
  776. ch3:
  777.     tst.w fx_disable
  778.     bne test_music3
  779.     tst.l fxr3
  780.     bne   ch3j1
  781.     tst.l fxc3
  782.     beq test_music3
  783.     bra ch3j3
  784. ch3j2    jsr run_dummy3
  785.     jsr run_fx3
  786.     bra ch4
  787. ch3j1
  788.     jsr set_up3
  789. ch3j3    tst.w music_disable    
  790.     beq ch3j2
  791.     jsr run_fx3
  792.     bra ch4
  793.  
  794. test_music3
  795.     tst.w music_disable
  796.     bne ch4
  797.     jsr run_music3
  798.     bra ch4
  799.  
  800.     ;***********************
  801.  
  802.     ; channel 3 subroutines
  803.  
  804. run_dummy3    
  805.      lea ch3vars,a0
  806.      lea dummy_reg,a2 
  807.      move.w #0,d5 
  808.      jsr sect1    
  809.     rts
  810.  
  811. set_up3    
  812.  
  813. ;---------------------
  814.     movea.l (base_address),a1
  815.     move.w 2(a1),d0
  816.     add.w d0,a1
  817.     sub.l #4,a1
  818. ;-----------------------
  819.          move.l fxr3,d0
  820.          add d0,d0
  821.          add d0,d0
  822.          ;lea  fxjump_table-4,A1
  823.      add.l d0,a1
  824. ;------------------------
  825.     move.l (a1),d0
  826.     move.l (base_address),a1
  827.     add.l d0,a1
  828.     move.l a1,currfx3    ;store address
  829. ;------------------------
  830.       clr.l fxr3
  831.      clr.w fxintc3
  832.       rts
  833.   
  834.      
  835. run_fx3
  836.     lea ch3fxvars,a0
  837.        lea chann3reg,a2
  838.       move.w #%0000000000000100,d5 
  839.      move.w #%1000000000000100,d1 
  840.     move.w    #1,mode
  841.      jsr sect1
  842.     rts
  843.  
  844. run_music3
  845.     lea ch3vars,a0
  846.        lea chann3reg,a2
  847.       move.w #%0000000000000100,d5 
  848.       move.w #%1000000000000100,d1 
  849.     move.w    #0,mode
  850.       jsr sect1     
  851.     rts
  852.  
  853.     ;  **************************
  854.  
  855. ch4:
  856.     tst.w fx_disable
  857.     bne test_music4
  858.     tst.l fxr4
  859.     bne   ch4j1
  860.     tst.l fxc4
  861.     beq test_music4
  862.     bra ch4j3
  863. ch4j2    jsr run_dummy4
  864.     jsr run_fx4
  865.     bra no4
  866. ch4j1
  867.     jsr set_up4
  868. ch4j3    tst.w music_disable    
  869.     beq ch4j2
  870.     jsr run_fx4
  871.     bra no4
  872.  
  873. test_music4
  874.     tst.w music_disable
  875.     bne no4
  876.     jsr run_music4
  877. no4    
  878.     movem.l (a7)+,d0-d6/a0-a6    ;restore registers
  879.     rts
  880.  
  881.     ;***********************
  882.  
  883.     ; channel 4 subroutines
  884.  
  885. run_dummy4    
  886.      lea ch4vars,a0
  887.      lea dummy_reg,a2 
  888.      move.w #0,d5 
  889.      jsr sect1    
  890.     rts
  891.  
  892. set_up4    
  893. ;---------------------
  894.     move.l (base_address),a1
  895.     move.w 2(a1),d0
  896.     add.w d0,a1
  897.     sub.l #4,a1        ;pointer to jumptable
  898. ;-----------------------
  899.          move.l fxr4,d0
  900.          add d0,d0
  901.          add d0,d0
  902.      add.l d0,a1        ;pointer to fx offset within table
  903. ;------------------------
  904.     move.l (a1),d0
  905.     move.l (base_address),a1
  906.     add.l d0,a1
  907.     move.l a1,currfx4    ;store address
  908. ;------------------------
  909.       clr.l fxr4
  910.      clr.w fxintc4
  911.       rts
  912.   
  913.      
  914. run_fx4
  915.     lea ch4fxvars,a0
  916.        lea chann4reg,a2
  917.       move.w #%0000000000001000,d5 
  918.      move.w #%1000001000001000,d1 
  919.     move.w    #1,mode
  920.      jsr sect1
  921.     rts
  922.  
  923. run_music4
  924.     lea ch4vars,a0
  925.        lea chann4reg,a2
  926.       move.w #%0000000000001000,d5 
  927.       move.w #%1000001000001000,d1 
  928.     move.w    #0,mode
  929.       jsr sect1     
  930.     rts
  931.     ;  **************************
  932.  
  933. sect1: tst.w (a0)
  934.     bne s1j1
  935.     rts
  936.  
  937. s1j1:    tst.w 2(a0)
  938.         beq sect3       
  939.         cmpi.w #1,2(a0)
  940.         beq sect4
  941.  
  942.         cmpi.w #3,4(a0)    
  943.         beq part2       
  944.     
  945. mode_switch:  subq.w #1,2(a0)     
  946.  
  947. check_effects: clr.w altpf      
  948.         move.w 6(a0),d2    
  949.         tst.w 8(a0)      
  950.         beq check_mod
  951.         tst.w 14(a0)      
  952.         beq cont_bend
  953.         subq.w #1,14(a0)
  954.         bra check_mod
  955. cont_bend:   addq.w #1,altpf    
  956.         move.w 10(a0),d3    
  957.         move.w 12(a0),d4    
  958.         cmpi.w #1,8(a0)
  959.         beq pbup
  960.     
  961.         sub.w d3,d2
  962.         cmp.w d2,d4
  963.         bcs check_mod
  964.         bra fbend
  965.  
  966. pbup:     add.w d3,d2
  967.         cmp.w d2,d4
  968.         bcc check_mod
  969. fbend:     move.w d4,d2
  970.         clr.w 8(a0)      
  971. check_mod:   tst.w 16(a0)
  972.         beq send_alt_pitch
  973.    
  974.  
  975.     tst.w  58(a0)
  976.     beq st_ok
  977.     subq.w #1,58(a0)
  978.     bra send_alt_pitch
  979. st_ok:
  980.         tst.w 50(a0)
  981.         beq cont_mod
  982.         subq #1,50(a0)
  983.         bra send_alt_pitch
  984. cont_mod:    move.w 52(a0),50(a0)  
  985.         addq #1,altpf
  986.         cmpi #3,16(a0)
  987.         bcc addmod
  988.     
  989.         move.w 56(a0),d3 
  990.         sub.w d3,d2
  991.         addq.w #1,16(a0)  
  992.         bra send_alt_pitch
  993. addmod:
  994.  
  995.         move.w 54(a0),d3 
  996.         add.w d3,d2
  997.         addq.w #1,16(a0)
  998.         cmpi.w #5,16(a0)
  999.        bne send_alt_pitch
  1000.         move.w #1,16(a0)  
  1001.  
  1002. send_alt_pitch: tst.w altpf
  1003.         beq send_env
  1004.         move.w d2,6(a0)  
  1005.         move.w d2,6(a2)  
  1006.  
  1007. send_env: 
  1008.  
  1009. do_env_check:
  1010.  
  1011. norm_env:
  1012.     move.l 18(a0),a1    
  1013.         cmpi.w #255,(a1)
  1014.         beq env_finished
  1015.     ;cmpi.w #1,66(a0)    
  1016.     ;bne    no_acc 
  1017.  
  1018. resu    clr.l d0
  1019.     move.w (a1)+,d0
  1020.     ;sub.w 64(a0),d0    
  1021.  
  1022.             ;test for mode here
  1023.     tst.w mode
  1024.     bne sete
  1025.  
  1026.     sub.w fade,d0
  1027.     bcc sete
  1028.  
  1029.  
  1030.     move.w #0,d0
  1031.  
  1032.  
  1033. sete    move.w d0,8(a2)    
  1034.     move.l a1,18(a0)
  1035.     rts        
  1036.  
  1037.  
  1038. no_acc:
  1039. ;resu:  
  1040. no_off
  1041.     ;move.w (a1)+,d0
  1042.     sub.w fade,d0
  1043.     bcc sete2
  1044.     move.w #0,d0
  1045. sete2    move.w d0,8(a2)
  1046.      move.w (a1)+,8(a2)
  1047.    
  1048. fint:   move.l a1,18(a0)    
  1049.     rts
  1050.  
  1051. env_finished:
  1052.     subq.l #2,a1    
  1053.     bra resu
  1054.     rts
  1055.  
  1056.  
  1057.  
  1058. one_shot_note: move.w #3,4(a0)     
  1059.         move.l 38(a0),(a2)
  1060.         move.w 42(a0),4(a2)
  1061.         move.w d1,dmacon     
  1062.         bra send_env
  1063.  
  1064.  
  1065. part2:                         
  1066.         move.l 44(a0),(a2)
  1067.         move.w 48(a0),4(a2)
  1068.         subq.w #1,2(a0)      
  1069.         move.w #1,4(a0)
  1070.         bra check_effects
  1071.  
  1072. sect3:
  1073.     move.w #0,66(a0)    
  1074.  
  1075.     move.l 22(a0),a1  
  1076. control_ret: move.w (a1)+,d0  
  1077.     cmpi.w #100,d0   
  1078.     bls sect5   
  1079.   
  1080. acc_note:
  1081.     move.w d0,6(a0)  
  1082.     move.w d0,6(a2)  
  1083.     move.w (a1)+,2(a0) 
  1084.     subq.w #1,2(a0)  
  1085.     move.l a1,22(a0)  
  1086.     move.l 34(a0),18(a0) 
  1087.     move.w 60(a0),58(a0) 
  1088.  
  1089.  
  1090.     tst.w 16(a0)
  1091.     beq no_mod_res
  1092.     move.w #1,16(a0)
  1093. no_mod_res:
  1094.     cmpi.w #0,4(a0)
  1095.     beq do_loop
  1096.     bra one_shot_note    
  1097.  
  1098.  
  1099. do_loop:    move.w d1,dmacon   
  1100.         bra send_env
  1101.  
  1102. do_rest:
  1103.     move.w (a1)+,2(a0) 
  1104.     subq.w #1,2(a0)  
  1105.     move.l a1,22(a0)  
  1106.     move.l  #rest_env,18(a0)
  1107.  
  1108.         move.w #0,8(a2)
  1109.         bra send_env
  1110.    
  1111. sect4:
  1112.         cmpi.w #0,4(a0)
  1113.         beq noof
  1114.         move.w d5,dmacon   
  1115. noof:     subq.w #1,2(a0)
  1116.         bra check_effects
  1117.    
  1118. sect5:     move.l #jump_table,a3
  1119.         move.l (a3,d0),a4
  1120.         jmp (a4)
  1121.  
  1122. jump_table: 
  1123.     dc.l  in_line_data
  1124.         dc.l  nsound
  1125.         dc.l  patt_end
  1126.         dc.l  get_env
  1127.         dc.l  check_pbend
  1128.         dc.l  do_mod
  1129.         dc.l  bend_off
  1130.         dc.l  mod_off
  1131.         dc.l  do_rest
  1132.         dc.l  end_fx
  1133.         dc.l  end_fx
  1134.     dc.l  s_f_on
  1135.     dc.l  s_f_off
  1136.     dc.l  set_acc
  1137.     dc.l  rept
  1138.  
  1139. in_line_data:
  1140.  
  1141.         nop
  1142.         rts
  1143.  
  1144. rept:
  1145.     move.l (a1),d0
  1146.     move.l (base_address),a1
  1147.     add.l    d0,a1
  1148.     bra control_ret
  1149.  
  1150. s_f_on: 
  1151.     bclr #1,filter
  1152.     bra control_ret
  1153. s_f_off:
  1154.     bset #1,filter
  1155.     bra control_ret
  1156.  
  1157. nsound:
  1158. ;----------------------------
  1159.     move.l (a1)+,d0        ;sound offset
  1160.     move.l (base_address),a3
  1161.     add.l d0,a3
  1162. ;----------------------------
  1163.         ;move.l (a1)+,a3     
  1164.  
  1165.         cmpi.w #0,(a3)
  1166.         bne one_shot_sound
  1167.  
  1168. xxx
  1169.         move.w (a3)+,4(a0)        ;length    
  1170.  
  1171. ;-----------------
  1172.     move.l (base_address),a6
  1173.     move.l (a3)+,d0
  1174.     add.l d0,a6
  1175.     move.l a6,(a2)
  1176. ;--------------------
  1177.         ;move.l (a3)+,(a2)     
  1178.  
  1179.         move.w (a3),4(a2)    
  1180.         jmp control_ret
  1181.  
  1182. one_shot_sound:
  1183.         move.w (a3)+,4(a0)        ;type of sound
  1184. ;-----------
  1185.     move.l (base_address),a6
  1186.     move.l (a3)+,d0
  1187.     add.l d0,a6
  1188.     move.l a6,38(a0)        ;address sample 1
  1189. ;---------------
  1190.         move.w (a3)+,42(a0)        ;length sample 1
  1191. ;---------------------
  1192.     move.l (base_address),a6
  1193.     move.l (a3)+,d0
  1194.     add.l d0,a6
  1195.     move.l a6,44(a0)
  1196.  
  1197. ;---------------------
  1198.     ;add.l #4,a3
  1199.         move.w (a3),48(a0)
  1200.         jmp control_ret
  1201.  
  1202. patt_end:
  1203.  
  1204.         move.l 26(a0),a1    
  1205.         cmpi.l #0,(a1)     
  1206.         beq song_control        ;end of song
  1207.         addq.l #4,26(a0)            ;get next pattern address
  1208. ;-----------------------
  1209.     move.l (a1),d0        ;offset
  1210.     move.l (base_address),a1
  1211.     add.l d0,a1        ;new pattern
  1212.  
  1213. ;------------------------
  1214.         ;move.l (a1),a1     
  1215.         jmp control_ret
  1216. get_env:
  1217. ;-----------------------
  1218.     move.l (a1)+,d0        ;env offset
  1219.     move.l (base_address),a4
  1220.     add.l d0,a4     
  1221. ;--------------------------
  1222.     ;move.l (a1)+,a4 
  1223.  
  1224.     move.l (a4)+,62(a0)    
  1225.     
  1226.     move.l  a4,34(a0)    
  1227.     
  1228.         bra control_ret
  1229.  
  1230. check_pbend:
  1231.      move.l (a1)+,8(a0)
  1232.         move.l (a1)+,12(a0)
  1233.         bra control_ret
  1234.  
  1235. do_mod:    move.w #1,16(a0)  
  1236.         move.l (a1)+,50(a0)
  1237.         move.l (a1)+,54(a0)
  1238.         move.l (a1)+,58(a0)
  1239.         bra control_ret
  1240.  
  1241. bend_off:   clr.w 8(a0)
  1242.         bra control_ret
  1243.  
  1244. mod_off:    clr.w 16(a0)
  1245.         bra control_ret
  1246.  
  1247.  
  1248. end_fx:    
  1249.     cmpi.w #6,(a0)
  1250.     beq end_fx4p
  1251.     cmpi.w #5,(a0)
  1252.     beq end_fx3p
  1253.     cmpi.w #7,(a0)
  1254.     beq end_fx2p
  1255.  
  1256. end_fx1p:
  1257.         move.w d5,dmacon   
  1258.     move.w  #1,chann1reg+6
  1259.     move.w #0,8(a2)
  1260.     move.l #0,fxc1
  1261.     rts
  1262.  
  1263. end_fx2p:
  1264.     move.w d5,dmacon 
  1265.     move.w  #1,chann2reg+6
  1266.         move.w #0,8(a2) 
  1267.     move.l #0,fxc2
  1268.         rts
  1269.  
  1270.  
  1271. end_fx3p:
  1272.         move.w d5,dmacon   
  1273.     move.w  #1,chann3reg+6
  1274.     move.w #0,8(a2)
  1275.     move.l #0,fxc3
  1276.     rts
  1277.  
  1278. end_fx4p:
  1279.     move.w d5,dmacon 
  1280.     move.w  #1,chann4reg+6
  1281.         move.w #0,8(a2) 
  1282.     move.l #0,fxc4
  1283.         rts
  1284.  
  1285. set_acc: move.w #1,66(a0) 
  1286.     bra control_ret
  1287.  
  1288. song_control:
  1289.         addq.l #4,a1
  1290.         move.l 30(a0),26(a0)
  1291.         move.l 26(a0),a1
  1292.         addq.l #4,26(a0)
  1293. ;------------------
  1294.     move.l (base_address),a6
  1295.     move.l (a1),d0
  1296.     add.l d0,a6
  1297.     move.l a6,a1
  1298. ;-----------------------
  1299.         ;move.l (a1),a1
  1300.         jmp control_ret
  1301.  
  1302.  
  1303.     ;"""""""""""""""""""""""""""""""""""""""""""""""""
  1304. ;************************************************************
  1305. gvars:
  1306. ch1vars     
  1307.     dc.w 0     
  1308.         dc.w 0,0,0,0,0,0,0,0,0,0     
  1309. pattr1: dc.l 0    
  1310. songr1: dc.l 0    
  1311. wsong1: dc.l 0   
  1312.         dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0   
  1313.  
  1314. ch2vars     
  1315.     dc.w 0     
  1316.         dc.w 0,0,0,0,0,0,0,0,0,0     
  1317. pattr2: dc.l 0    
  1318. songr2: dc.l 0    
  1319. wsong2: dc.l 0    
  1320.         dc.w 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0   
  1321.  
  1322. ch3vars 
  1323.     dc.w 0     
  1324.         dc.w 0,0,0,0,0,0,0,0,0,0     
  1325. pattr3: dc.l 0    
  1326. songr3: dc.l 0    
  1327. wsong3: 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. ch4vars 
  1331.     dc.w 0     
  1332.         dc.w 0,0,0,0,0,0,0,0,0,0     
  1333. pattr4: dc.l 0    
  1334. songr4: dc.l 0    
  1335. wsong4: 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.  
  1339. ch1fxvars 
  1340.     dc.w 0     
  1341. fxintc1:
  1342.     dc.w 0,0,0,0,0,0,0,0,0,0     
  1343. currfx1:
  1344.     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    
  1345.  
  1346. ch2fxvars 
  1347.     dc.w 0     
  1348. fxintc2:
  1349.     dc.w 0,0,0,0,0,0,0,0,0,0     
  1350. currfx2:
  1351.     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    
  1352.  
  1353.  
  1354. ch3fxvars
  1355.     dc.w 0     
  1356. fxintc3:
  1357.     dc.w 0,0,0,0,0,0,0,0,0,0     
  1358. currfx3:
  1359.     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    
  1360.  
  1361. ch4fxvars 
  1362.     dc.w 0     
  1363. fxintc4:
  1364.     dc.w 0,0,0,0,0,0,0,0,0,0     
  1365. currfx4:
  1366.     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    
  1367. ;************************************************************
  1368.  
  1369. rest_env    dc.w  0,0,0,0,0,0,0,0,255
  1370.  
  1371.  
  1372.  
  1373. dummy_reg dc.l 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  1374.         dc.l  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  1375.         dc.l  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  1376.         dc.l  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  1377.         dc.l  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  1378.         dc.l  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  1379.  
  1380.     even
  1381.  
  1382. data_blk:    ;test place for getting the data blk in
  1383.  
  1384.  
  1385.  
  1386.     end
  1387.  
  1388.  
  1389.  
  1390. ;*****************************************************
  1391.  
  1392.  
  1393.