home *** CD-ROM | disk | FTP | other *** search
/ DP Tool Club 21 / CD_ASCQ_21_040595.iso / dos / prg / c / soundss3 / pasmod.asm < prev    next >
Assembly Source File  |  1995-02-10  |  91KB  |  3,501 lines

  1. ;
  2. ;       ╔══════════════════════════════════════╗
  3. ;       ║                                      ║
  4. TITLE   ║ PRO AUDIO SPECTRUM PLUS/16 MODPLAYER ║
  5. ;       ║                                      ║
  6. ;       ╚══════════════════════════════════════╝
  7. ;
  8. ; THIS MODULE PLAYER WAS CODED IN EARLY 1995
  9. ;
  10. ;                        BY SILVIO TURELLO (FRONTMAN/CREW242)
  11. ;
  12. ; PC-CONVERSION OF AMIGA PROTRACKER CODE (FOR SUPER PRO PLAY > MODLIB)
  13. ;
  14. ;                        BY JOSHUA C. JENSEN (CYBERSTRIKE/FORM. RENAISSANCE)
  15. ;
  16. ; ORIGIN SOURCE CODE CAME FROM THE PROTRACKER V2.1A
  17. ;
  18. ;                        BY LARS "ZAP" HAMRE (AMIGA FREELANCERS)
  19. ;
  20. ; FEATURES: 4/8-CHANNEL-MODS (M.K./FLT4/FLT8/8CHN), 8-FX-CHANNELS (PC/AMIGA)
  21. ;
  22. ;           8/16 BIT, 10000-44100 HZ, STEREO PANNING E8x, 16 BIT INTERPOLATION
  23. ;
  24. ;           AMPLIFIED MIXING, FULL MOD-FX SUPPORT EXCEPT FILTER & REVERSE FUNK
  25. ;
  26. ;           592 KB EMS-MEMORY SUPPORT FOR FX, EMS BUFFERED TRACKTABLE
  27. ;
  28. ;           THIS ROUTINE NEEDS A REALLY FAST CPU TO HANDLE 16 CHANNELS!
  29. ;
  30. ; MEMORY:   11K CODE, 32K MIXBUF, 32K VOLTABLE, 0-???K SAMPLES
  31. ;
  32. .ALPHA
  33. .MODEL MEDIUM
  34. COM_OR_OBJ    = 0
  35. STACKLENGTH     = 0100H
  36. UGROUP3 GROUP CODE_SEG3, DATA_SEG3
  37. ASSUME CS:UGROUP3, DS:UGROUP3, SS:UGROUP3
  38. ;=============================================================================
  39. MAX_CHAN_NUMB    = 8
  40. FX_CHAN_NUMB    = 8
  41. IRQ1            = 20H
  42. IRQ2        = 21H
  43. IRQ3        =0A0H
  44. IRQ4        =0A1H
  45. TIMER0        = 40H
  46. PIT1            = 43H
  47. UHR_INDEX    = 70H
  48. UHR_PORT    = 71H
  49. UHR_STATA    = 0AH
  50. UHR_STATB    = 0BH
  51. UHR_STATC    = 0CH
  52. INCLUDE COMMON.INC
  53. ;-----------------------------------------------------------------------------
  54. DATA_SEG3 SEGMENT WORD USE16
  55. PROG_START_SEG  DW 0
  56. PROG_END_SEG    DW 0
  57. IF COM_OR_OBJ
  58. VAR_BUFSEG    DW 0
  59. ELSE
  60. VAR_BUFSEG    DW 8000H
  61. ENDIF
  62. SYSTEM        DB 0
  63. IRQCOUNT    DB 56
  64. PAS_MODUS    DB 0        ;0=MUSIC&FX, 1=MUSIC, 2=FX, 3=NO_SOUND
  65. CD_MIXER    DB 0        ;0=MODULES ONLY, 1=CD MIXED
  66. IRQ_REENTER    DW 0
  67. LOADMOD_FLAG    DB 0
  68. PAN_FX        DB 0        ;FLIP SAMPLE CHANNEL
  69. SAM_FLAG1    DB 0
  70. SAM_CH        DB 0
  71. SAMPLE_RATE    DW 44100    ;STEREO 88200
  72. PAS_RATE    DW 0
  73. PAS_BASE    DW 0
  74. IRQ_NUMBER    DB 7
  75. DMA_CHANNEL    DB 1
  76. DMA_POFF    DW 0
  77. MAINFREQ    DD 41236
  78. DMA_CX        DW 434
  79. DMA_MORE    DW 434*4
  80. DMA_MAX        DW 434*16
  81. DMA_NEWPTR    DW 0
  82. DMA_PTR        DW 0
  83. DMA_SEG        DW 0
  84. DMA_OFFSET    DW 0
  85. MIXMUL_OFFSET    DW 0
  86. COMP_SPEED2     DW 0106H
  87. COMP_SPEED3     DW 4006H
  88. COMP_SPEED4     DW 0
  89. COMP_SPEED5     DW 1165
  90. HOLD70  LABEL   DWORD
  91.         DW OFFSET TIMER_HANDLER, 0
  92. HOLDPAS  LABEL   DWORD
  93.         DW OFFSET PASIRQ_HANDLER, 0
  94. PAN_REGS    DB 3,12,12,3,3,12,12,3
  95. PANNINGL    DW 256,256,256,256,248,240,232,224,208,192,176,160,128,096,064,032
  96. PANNINGR    DW 032,064,096,128,160,176,192,208,224,232,240,248,256,256,256,256
  97. DMA_ADR        DB 0,2,4,6,0C0H,0C4H,0C8H,0CCH
  98. DMA_CNT        DB 1,3,5,7,0C2H,0C6H,0CAH,0CEH
  99. DMA_PAGE    DB 87H,83H,81H,82H,8FH,8BH,89H,8AH
  100. DMA_MASK    DB 0AH,0AH,0AH,0AH,0D4H,0D4H,0D4H,0D4H
  101. DMA_MOD        DB 0BH,0BH,0BH,0BH,0D6H,0D6H,0D6H,0D6H
  102. DMA_FLIP    DB 0CH,0CH,0CH,0CH,0D8H,0D8H,0D8H,0D8H
  103. ;-----------------------------------------------------------------------------
  104. GDDLENGTH    DD 0
  105. GDDREST        DW 0
  106. GDDHANDLE    DW 0
  107. GDDZEIG        DB 0
  108. SONG_START    DB 0
  109. ;-----------------------------------------------------------------------------
  110. ERROR1_TEXT    DB "MOD ERROR",13,10,"$"
  111. ERROR2_TEXT    DB "FX ERROR",13,10,"$"
  112. ERROR3_TEXT    DB "PAS ERROR",13,10,"$"
  113. OUT_TEXT    DB "+/- VOLUME",13,10
  114.         DB "1   PLAY SAMPLE",13,10
  115.         DB "9   INIT REPEAT",13,10
  116.         DB "0   MUSIC MODE",13,10,"$"
  117. SAMPLE_NAME    DB "SAMPLE1.SAM",0
  118. CONFIG_NAME     DB "SS3.CFG",0
  119. CFG_TEXT2       DB "DEFAULT MUSIC MODE = ",0
  120. CFG_TEXT3       DB "SOUNDCARD BASE PORT = ",0
  121. CFG_TEXT4       DB "SOUNDCARD IRQ NUMBER = ",0
  122. CFG_TEXT5       DB "SOUNDCARD DMA NUMBER = ",0
  123. CFG_TEXT6       DB "DEFAULT SAMPLINGRATE = ",0
  124. CFG_TEXT7       DB "SYSTEM COMPATIBILITY = ",0
  125. ;-----------------------------------------------------------------------------
  126. ; PLAYER - KONTROLLSTRUKTUREN
  127. ;-----------------------------------------------------------------------------
  128. ALIGN 2
  129. MUSIC_VOL    DB 255
  130. MUSIC_VOLUME    DB 255
  131. FX_VOL        DB 255
  132. FX_VOLUME    DB 255
  133. MASTER_VOLUME    DB 255
  134. MOD_STAT    DB 0
  135. BPM_RATE    DW 1024
  136. BPM_VALUE    DW 125
  137. BPM_COUNT    DD 0
  138. BPM_SPEED    DD 0
  139. CH_NUMB        DW 4
  140. QUEUE_BUFFER    LABEL    WORD        ;256 BYTES
  141. NOTE        DW MAX_CHAN_NUMB DUP(0)
  142. CMD        DB MAX_CHAN_NUMB DUP(0)
  143. CMDLO        DB MAX_CHAN_NUMB DUP(0)
  144. START        DW MAX_CHAN_NUMB DUP(0)
  145. LENGTHI        DW MAX_CHAN_NUMB DUP(0)
  146. LOOPSTART    DW MAX_CHAN_NUMB DUP(0)
  147. REPLEN        DW MAX_CHAN_NUMB DUP(0)
  148. PERIOD        DW MAX_CHAN_NUMB DUP(0)
  149. FINETUNE    DB MAX_CHAN_NUMB DUP(0)
  150. CHVOLUME    DB MAX_CHAN_NUMB DUP(0)
  151. TONEPORTDIREC    DB MAX_CHAN_NUMB DUP(1)
  152. TONEPORTSPEED    DB MAX_CHAN_NUMB DUP(0)
  153. WANTEDPERIOD    DW MAX_CHAN_NUMB DUP(0)
  154. VIBRATOCMD    DB MAX_CHAN_NUMB DUP(0)
  155. VIBRATOPOS    DB MAX_CHAN_NUMB DUP(0)
  156. TREMOLOCMD    DB MAX_CHAN_NUMB DUP(0)
  157. TREMOLOPOS    DB MAX_CHAN_NUMB DUP(0)
  158. WAVECONTROL    DB MAX_CHAN_NUMB DUP(0)
  159. GLISSFUNK    DB MAX_CHAN_NUMB DUP(0)
  160. SAMPLEOFFSET    DB MAX_CHAN_NUMB DUP(0)
  161. PATTPOS        DB MAX_CHAN_NUMB DUP(0)
  162. LOOPCOUNT    DB MAX_CHAN_NUMB DUP(0)
  163.  
  164. MPANNING    DB MAX_CHAN_NUMB DUP(0)
  165. MFREQ        DW MAX_CHAN_NUMB DUP(0)
  166. MFIXED        DW MAX_CHAN_NUMB DUP(0)
  167. MOFLOW        DW MAX_CHAN_NUMB DUP(0)
  168. SONG_DATA    LABEL    BYTE        ;128 BYTES
  169. MVOL        DB MAX_CHAN_NUMB DUP(0)
  170. MSEG        DW MAX_CHAN_NUMB DUP(0)
  171. MOFS        DW MAX_CHAN_NUMB DUP(0)
  172. MREPEAT        DW MAX_CHAN_NUMB DUP(0)
  173. MREPLEN        DW MAX_CHAN_NUMB DUP(0)
  174. MMAXREP        DW MAX_CHAN_NUMB DUP(0)
  175. MOD_NAME    DB 68 DUP(0)        ;MIND. 40 BYTES
  176. ;-----------------------------------------------------------------------------
  177. ; Seg                           Stores the segment of the current sample.  If
  178. ;                               the segment is zero, then there is no sample
  179. ;                               begin played.
  180. ; Offset                        The current offset of the sample being played
  181. ;                               in the segment specified.
  182. ; MaxRep                        The offset of the place in the sample to
  183. ;                               repeat from (i.e. the end of the sample).
  184. ; Freq                          The frequency to be played out the output
  185. ;                               device.  It is actually a playback period,
  186. ;                               the upper byte determining the number of
  187. ;                               bytes to be added to the sample offset each
  188. ;                               interrupt, and the lower byte to be added
  189. ;                               over and over to generate carry flags to be
  190. ;                               added to additional offsets.
  191. ; Vol                           The actual volume to multiply the frequency
  192. ;                               by.
  193. ; Repeat                        The place to repeat from when the end of the
  194. ;                               loop is found.
  195. ; RepLen                        The number of bytes from Repeat to go to.
  196. ;                               When the end of this is found, it goes back
  197. ;                               to Repeat.
  198. ; OFlow                         The overflow variable used to generate the
  199. ;                               carry flags.
  200. ;-----------------------------------------------------------------------------
  201. ; PROTRACKER VARIABLEN
  202. ;-----------------------------------------------------------------------------
  203. ALIGN 2
  204. MT_SPEED                DB 6
  205. MT_COUNTER              DB 0
  206. MT_PATTERNPOS           DW 0
  207. MT_SONGPOS              DB 0
  208. MT_PATTDELAYTIME2       DB 0
  209. MT_PATTDELAYTIME        DB 0
  210. MT_PBREAKFLAG           DB 0
  211. MT_PBREAKPOS            DB 0
  212. MT_POSJUMPFLAG          DB 0
  213. MT_LOWMASK              DB 0FFH
  214.  
  215. ALIGN 2
  216. Effect_Jump_Table1    LABEL    WORD
  217. DW OFFSET Go_Arpeggio, OFFSET Go_PortaUp, OFFSET Go_PortaDown
  218. DW OFFSET Go_TonePortamento, OFFSET Go_vibrato, OFFSET Go_TonePlusVolSlide
  219. DW OFFSET Go_VibratoPlusVolSlide, OFFSET Go_Tremolo, OFFSET Go_Return
  220. DW OFFSET Go_Return, OFFSET Go_VolumeSlide, OFFSET Go_Return, OFFSET Go_Return
  221. DW OFFSET Go_Return, OFFSET Go_E_Commands, OFFSET Go_Return
  222.  
  223. Effect_Jump_Table2    LABEL    WORD
  224. DW OFFSET Go_PerNop, OFFSET Go_PerNop, OFFSET Go_PerNop
  225. DW OFFSET Go_PerNop, OFFSET Go_PerNop, OFFSET Go_PerNop
  226. DW OFFSET Go_PerNop, OFFSET Go_PerNop, OFFSET Go_PerNop
  227. DW OFFSET Go_SampleOffset, OFFSET Go_PerNop, OFFSET Go_PositionJump
  228. DW OFFSET Go_VolumeChange, OFFSET Go_PatternBreak
  229. DW OFFSET Go_E_Commands, OFFSET Go_SetSpeed
  230.  
  231. Effect_Jump_Table3    LABEL    WORD
  232. DW OFFSET Go_Return, OFFSET Go_FinePortaUp, OFFSET Go_FinePortaDown
  233. DW OFFSET Go_SetGlissControl, OFFSET Go_SetVibratoControl
  234. DW OFFSET Go_SeTFineTune, OFFSET Go_JumpLoop, OFFSET Go_SetTremoloControl
  235. DW OFFSET Go_PANNING, OFFSET Go_RetrigNote, OFFSET Go_VolumeFineUp
  236. DW OFFSET Go_VolumeFineDown, OFFSET Go_NoteCut, OFFSET Go_NoteDelay
  237. DW OFFSET Go_PatternDelay, OFFSET Go_Return
  238.  
  239. ALIGN 2
  240. MT_VIBRATOTABLE        DB   0, 24, 49, 74, 97,120,141,161
  241.                         DB 180,197,212,224,235,244,250,253
  242.                         DB 255,253,250,244,235,224,212,197
  243.                         DB 180,161,141,120, 97, 74, 49, 24
  244.  
  245. ALIGN 2
  246. MT_PERIODTABLE    LABEL    WORD
  247. DW 856,808,762,720,678,640,604,570,538,508,480,453 ;C-1 to H-1 Finetune +0.
  248. DW 428,404,381,360,339,320,302,285,269,254,240,226 ;C-2 to H-2 Finetune +0.
  249. DW 214,202,190,180,170,160,151,143,135,127,120,113 ;C-3 to H-3 Finetune +0.
  250. DW 107,101, 95, 90, 85, 80, 75, 71, 67, 63, 60, 56 ;C-4 to H-4 Finetune +0.
  251.  
  252. DW 850,802,757,715,674,637,601,567,535,505,477,450 ;C-1 to H-1 Finetune +1.
  253. DW 425,401,379,357,337,318,300,284,268,253,239,225 ;C-2 to H-2 Finetune +1.
  254. DW 213,201,189,179,169,159,150,142,134,126,119,113 ;C-3 to H-3 Finetune +1.
  255. DW 106,100, 94, 89, 84, 79, 75, 71, 67, 83, 59, 56 ;C-4 to H-4 Finetune +1.
  256.  
  257. DW 844,796,752,709,670,632,597,563,532,502,474,447 ;C-1 to H-1 Finetune +2.
  258. DW 422,398,376,355,335,316,298,282,266,251,237,224 ;C-2 to H-2 Finetune +2.
  259. DW 211,199,188,177,167,158,149,141,133,125,118,112 ;C-3 to H-3 Finetune +2.
  260. DW 105, 99, 94, 88, 83, 79, 74, 70, 66, 62, 59, 56 ;C-4 to H-4 Finetune +2.
  261.  
  262. DW 838,791,746,704,665,628,592,559,528,498,470,444 ;C-1 to H-1 Finetune +3.
  263. DW 419,395,373,352,332,314,296,280,264,249,235,222 ;C-2 to H-2 Finetune +3.
  264. DW 209,198,187,176,166,157,148,140,132,125,118,111 ;C-3 to H-3 Finetune +3.
  265. DW 104, 99, 93, 88, 83, 78, 74, 70, 66, 62, 59, 55 ;C-4 to H-4 Finetune +3.
  266.  
  267. DW 832,785,741,699,660,623,588,555,524,495,467,441 ;C-1 to H-1 Finetune +4.
  268. DW 416,392,370,350,330,312,294,278,262,247,233,220 ;C-2 to H-2 Finetune +4.
  269. DW 208,196,185,175,165,156,147,139,131,124,117,110 ;C-3 to H-3 Finetune +4.
  270. DW 104, 98, 92, 87, 82, 78, 73, 69, 65, 62, 58, 55 ;C-4 to H-4 Finetune +4.
  271.  
  272. DW 826,779,736,694,655,619,584,551,520,491,463,437 ;C-1 to H-1 Finetune +5.
  273. DW 413,390,368,347,328,309,292,276,260,245,232,219 ;C-2 to H-2 Finetune +5.
  274. DW 206,195,184,174,164,155,146,138,130,123,116,109 ;C-3 to H-3 Finetune +5.
  275. DW 103, 97, 92, 87, 82, 77, 73, 69, 65, 61, 58, 54 ;C-4 to H-4 Finetune +5.
  276.  
  277. DW 820,774,730,689,651,614,580,547,516,487,460,434 ;C-1 to H-1 Finetune +6.
  278. DW 410,387,365,345,325,307,290,274,258,244,230,217 ;C-2 to H-2 Finetune +6.
  279. DW 205,193,183,172,163,154,145,137,129,122,115,109 ;C-3 to H-3 Finetune +6.
  280. DW 102, 96, 91, 86, 81, 77, 72, 68, 64, 61, 57, 54 ;C-4 to H-4 Finetune +6.
  281.  
  282. DW 814,768,725,684,646,610,575,543,513,484,457,431 ;C-1 to H-1 Finetune +7.
  283. DW 407,384,363,342,323,305,288,272,256,242,228,216 ;C-2 to H-2 Finetune +7.
  284. DW 204,192,181,171,161,152,144,136,128,121,114,108 ;C-3 to H-3 Finetune +7.
  285. DW 102, 96, 90, 85, 80, 76, 72, 68, 64, 60, 57, 54 ;C-4 to H-4 Finetune +7.
  286.  
  287. DW 907,856,808,762,720,678,640,604,570,538,504,480 ;C-1 to H-1 Finetune -8.
  288. DW 453,428,404,381,360,339,320,302,285,269,254,240 ;C-2 to H-2 Finetune -8.
  289. DW 226,214,202,190,180,170,160,151,143,135,127,120 ;C-3 to H-3 Finetune -8.
  290. DW 113,107,101, 95, 90, 85, 80, 75, 71, 67, 63, 60 ;C-4 to H-4 Finetune -8.
  291.  
  292. DW 900,850,802,757,715,675,636,601,567,535,505,477 ;C-1 to H-1 Finetune -7.
  293. DW 450,425,401,379,357,337,318,300,284,268,253,238 ;C-2 to H-2 Finetune -7.
  294. DW 225,212,200,189,179,169,159,150,142,134,126,119 ;C-3 to H-3 Finetune -7.
  295. DW 112,106,100, 94, 89, 84, 79, 75, 71, 67, 63, 59 ;C-4 to H-4 Finetune -7.
  296.  
  297. DW 894,844,796,752,709,670,632,597,563,532,502,474 ;C-1 to H-1 Finetune -6.
  298. DW 447,422,398,376,355,335,316,298,282,266,251,237 ;C-2 to H-2 Finetune -6.
  299. DW 223,211,199,188,177,167,158,149,141,133,125,118 ;C-3 to H-3 Finetune -6.
  300. DW 111,105, 99, 94, 88, 83, 79, 74, 70, 66, 62, 59 ;C-4 to H-4 Finetune -6.
  301.  
  302. DW 887,838,791,746,704,665,628,592,559,528,498,470 ;C-1 to H-1 Finetune -5.
  303. DW 444,419,395,373,352,332,314,296,280,264,249,235 ;C-2 to H-2 Finetune -5.
  304. DW 222,209,198,187,176,166,157,148,140,132,125,118 ;C-3 to H-3 Finetune -5.
  305. DW 111,104, 99, 93, 88, 83, 78, 74, 70, 66, 62, 59 ;C-4 to H-4 Finetune -5.
  306.  
  307. DW 881,832,785,741,699,660,623,588,555,524,494,467 ;C-1 to H-1 Finetune -4.
  308. DW 441,416,392,370,350,330,312,294,278,262,247,233 ;C-2 to H-2 Finetune -4.
  309. DW 220,208,196,185,175,165,156,147,139,131,123,117 ;C-3 to H-3 Finetune -4.
  310. DW 110,104, 98, 92, 87, 82, 78, 73, 69, 65, 61, 58 ;C-4 to H-4 Finetune -4.
  311.  
  312. DW 875,826,779,736,694,655,619,584,551,520,491,463 ;C-1 to H-1 Finetune -3.
  313. DW 437,413,390,368,347,338,309,292,276,260,245,232 ;C-2 to H-2 Finetune -3.
  314. DW 219,206,195,184,174,164,155,146,138,130,123,116 ;C-3 to H-3 Finetune -3.
  315. DW 109,103, 97, 92, 87, 82, 77, 73, 69, 65, 61, 58 ;C-4 to H-4 Finetune -3.
  316.  
  317. DW 868,820,774,730,689,651,614,580,547,516,487,460 ;C-1 to H-1 Finetune -2.
  318. DW 434,410,387,365,345,325,307,290,274,258,244,230 ;C-2 to H-2 Finetune -2.
  319. DW 217,205,193,183,172,163,154,145,137,129,122,115 ;C-3 to H-3 Finetune -2.
  320. DW 108,102, 96, 91, 86, 81, 77, 72, 68, 64, 61, 57 ;C-4 to H-4 Finetune -2.
  321.  
  322. DW 862,814,768,725,684,646,610,575,543,513,484,457 ;C-1 to H-1 Finetune -1.
  323. DW 431,407,384,363,342,323,305,288,272,256,242,228 ;C-2 to H-2 Finetune -1.
  324. DW 216,203,192,181,171,161,152,144,136,128,121,114 ;C-3 to H-3 Finetune -1.
  325. DW 108,101, 96, 90, 85, 80, 76, 72, 68, 64, 60, 57 ;C-4 to H-4 Finetune -1.
  326. ;-----------------------------------------------------------------------------
  327. ; MTM - TRACKSTRUKTUR
  328. ;-----------------------------------------------------------------------------
  329. ALIGN 2
  330. TRACK_NUMBER    DW 0
  331. TRACK_INFO    DB 8 DUP(0)
  332. TRACK_SEG    DW 0
  333. TRACK_HANDLE    DW 0
  334. TRACKS_OFFSET    DW OFFSET TRACK1_DATA, OFFSET TRACK2_DATA, OFFSET TRACK3_DATA
  335.         DW OFFSET TRACK4_DATA, OFFSET TRACK5_DATA, OFFSET TRACK6_DATA
  336.         DW OFFSET TRACK7_DATA, OFFSET TRACK8_DATA
  337. TRACK1_DATA    DB 128 DUP(0)
  338. TRACK2_DATA    DB 128 DUP(0)
  339. TRACK3_DATA    DB 128 DUP(0)
  340. TRACK4_DATA    DB 128 DUP(0)
  341. TRACK5_DATA    DB 128 DUP(0)
  342. TRACK6_DATA    DB 128 DUP(0)
  343. TRACK7_DATA    DB 128 DUP(0)
  344. TRACK8_DATA    DB 128 DUP(0)
  345. ;-----------------------------------------------------------------------------
  346. ; MOD - DATEISTRUKTUR
  347. ;-----------------------------------------------------------------------------
  348. ALIGN 2
  349. SAMPLE_SIZE    DW 0
  350. PATTERN_SIZE    DW 0
  351. PATTERN_SEG    DW 0
  352. PATTERN_NUMBER    DW 0
  353. PATTERN_CURRENT    DW 0
  354. ISIZE        DW 31 DUP(0)
  355. IVOL_FINETUNE    DW 31 DUP(0)
  356. ILOOP_START    DW 31 DUP(0)
  357. ILOOP_SIZE    DW 31 DUP(0)
  358. SONG_SIZE    DB 0
  359. SONG_LOOP    DB 0
  360. MOD_SIGN    DD 0
  361. SAMPLE_SEG    DW 31 DUP(0)
  362. ;-----------------------------------------------------------------------------
  363. ; SINGLE SAMPLE VARIABLES
  364. ;-----------------------------------------------------------------------------
  365. SAMPLE_ZEIG    DW 0
  366. SAMPLE_MEM    DW 64 DUP(0)
  367. SAMPLE_BIG    DW 64 DUP(0)
  368. EMS_SEG        DW 0
  369. EMS_OFFSET    DW 0
  370. EMS_HANDLE    DW 0
  371. SAM_SEG        DW FX_CHAN_NUMB DUP(0)
  372. SAM_OFS        DD FX_CHAN_NUMB DUP(0)
  373. SAM_FRQ        DW FX_CHAN_NUMB DUP(0)
  374. SAM_FIX        DW FX_CHAN_NUMB DUP(0)
  375. SAM_OFL        DW FX_CHAN_NUMB DUP(0)
  376. SAM_MAX        DW FX_CHAN_NUMB DUP(0)
  377. SAM_PAN        DW FX_CHAN_NUMB DUP(0)
  378. ;-----------------------------------------------------------------------------
  379. PROG_END        LABEL   BYTE    ;MUSS LETZE ZEILE IM DATENSEGMENT SEIN!
  380. ;-----------------------------------------------------------------------------
  381. DATA_SEG3 ENDS
  382.  
  383. .386
  384. CODE_SEG3 SEGMENT PAGE USE16
  385. ORG 100H
  386. ;=============================================================================
  387. PUBLIC _MAIN3
  388. _MAIN3 PROC FAR
  389.     JMP    MAIN_CONT        ;0100
  390.     RETF
  391.     CALL    CONFIG_INIT        ;0104
  392.     RETF
  393.     CALL    LOAD_MOD        ;0108
  394.     RETF
  395.     CALL    PLAY_MUSIC        ;010C
  396.     RETF
  397.     CALL    STOP_MUSIC        ;0110
  398.     RETF
  399.     CALL    END_MUSIC        ;0114
  400.     RETF
  401.     CALL    LOAD_SAMPLE        ;0118
  402.     RETF
  403.     CALL    PLAY_SAMPLE        ;011C
  404.     RETF
  405.     CALL    END_SAMPLE        ;0120
  406.     RETF
  407.     CALL    SET_SAMPLERATE        ;0124
  408.     RETF
  409.     CALL    GET_VOLUME        ;0128
  410.     RETF
  411.     CALL    SET_VOLUME        ;012C
  412.     RETF
  413.     CALL    SET_SONGLOOP        ;0130
  414.     RETF
  415.     CALL    GET_SONGPOSITION    ;0134
  416.     RETF
  417.     CALL    SET_SONGPOSITION    ;0138
  418.     RETF
  419.     CALL    GET_SONGMOD        ;013C
  420.     RETF
  421.     CALL    SET_SONGMOD        ;0140
  422.     RETF
  423.     CALL    DSP_OFF            ;0144
  424.     RETF
  425.     CALL    DSP_RESET        ;0148
  426.     RETF
  427. _MAIN3 ENDP
  428. ;=============================================================================
  429. ;
  430. ; MOD ROUTINEN
  431. ;
  432. ;=============================================================================
  433. ; Format of a note: (ORIGINALLY MOD)
  434. ;
  435. ;                   0 0          0 0          0 0           0 0
  436. ;                   | |          | |          | |           | |
  437. ;                  /   \        / /          /   \           \ \
  438. ;         MSB of Ins.     Note        LSB Ins.  Spec. Com.   Data for special
  439. ;
  440. ; Format of a note: (MODIFIED BY LOADER)
  441. ;
  442. ;                   0 0          0 0          0 0           0 0
  443. ;                   | |          | |          | |           | |
  444. ;                  / /          /   \         \ \           \ \
  445. ;            LSB NOTE   SPEC.COM.    MSB NOTE  INSTRUMENT    DATA FOR SPECIAL
  446. ;
  447. ;╒═══════════════════════════════════════════════════════════════════════════╕
  448. ;│ DESCRIPTION: This procedure shouldn't need to be called by anything else  │
  449. ;│              but the interrupt (ever).  It handles all note updating,     │
  450. ;│              special effects, pointers, etc.                              │
  451. ;│                                                                           │
  452. ;│              *** This code came directly from the Amiga Protracker        │
  453. ;│                  playback code, written by Lars "Zap" Hamre.  Give this   │
  454. ;│                  guy a pat on the back for such excellent code.           │
  455. ;│                                                                           │
  456. ;│ BUGS       : Or rather, non-implementations.  Command EF - Funk it is     │
  457. ;│              not all the way implemented.  Command E0 - Filter is not     │
  458. ;│              implemented at all.  It is Amiga-specific, directly with     │
  459. ;│              the Paula chip.                                              │
  460. ;│                                                                           │
  461. ;│ IMPROVEMENTS:    Optimized code for PC-architecure by the Frontman        │
  462. ;│                                                                           │
  463. ;╘═══════════════════════════════════════════════════════════════════════════╛
  464. CONTROL_CHANNELS PROC NEAR
  465.     CMP    LOADMOD_FLAG,0
  466.     JNE    Go_NoNewPosYet
  467.     CMP    MOD_STAT,3
  468.     JAE    Go_NoNewPosYet
  469.     INC    MT_COUNTER
  470.     MOV    AL,MT_COUNTER
  471.     CMP    AL,MT_SPEED        ; Does it match the current speed?
  472.     JB    SHORT Go_NoNewNote    ; No, just do fx.
  473.     MOV    MT_COUNTER,0
  474.     CMP    MT_PATTDELAYTIME2,0
  475.     JE    SHORT Go_GetNewNote
  476.         CALL    Go_CheckEfx        ; Otherwise, just do fx only.
  477.         JMP    Go_Dskip                ; Then, jump to update block values.
  478. Go_NoNewNote:
  479.     CALL    Go_CheckEfx        ; Do fx.
  480.         JMP    Go_NoNewPosYet        ; We don't update block values
  481.                     ; when we are just doing fx.
  482. Go_GetNewNote:
  483.     CALL    TRACK_SAVE        ;SAVE EMS PAGES
  484.     CALL    TRACK_PAGING        ;GET TRACKS INTO EMS PAGES
  485.     MOV    ES,TRACK_SEG
  486.     XOR    SI,SI
  487. Go_PlayVoice:
  488.     PUSH    SI
  489.     MOV    DI,SI
  490.     SHL    DI,1
  491.     MOVZX    BX,MT_SONGPOS        ; BLOCK BEGINNING TO ES:BX
  492.     ADD    BX,[TRACKS_OFFSET+DI]
  493.     MOVZX    BX,[BX]
  494.     XCHG    BL,BH            ; MULTIPLY WITH 256 (TRACK-SIZE)
  495.     ADD    BX,MT_PATTERNPOS
  496.     CMP    [NOTE+DI],0        ; See if there is a note.
  497.     JNE    SHORT Go_plvskip    ; No, go on.
  498.     CMP    [CMD+SI],0
  499.     JNE    SHORT Go_plvskip
  500.     CMP    [CMDLO+SI],0
  501.     JNE    SHORT Go_plvskip
  502.     CALL    Go_PerNop        ; Otherwise, figure out the frequency.
  503. Go_plvskip:
  504.     MOV    AX,ES:[BX]        ; Load this channel's information
  505.     MOV    [NOTE+DI],AX        ; from the actual track block and
  506.     AND    [NOTE+DI],0FFFH
  507.     SHR    AH,4            ; into our own internal structure
  508.     MOV    [CMD+SI],AH        ; to access it from.
  509.     MOV    AX,ES:[BX+2]
  510.     MOV    [CMDLO+SI],AH
  511.     OR    AL,AL            ; Instrument byte.  Is there an ins?
  512.     JZ    SHORT Go_SetRegs
  513.     DEC    AL
  514.     MOVZX    BX,AL            ; GET SAMPLE SEGMENT
  515.     SHL    BX,1
  516.     MOV    AX,[SAMPLE_SEG+BX]
  517.     MOV    [START+DI],AX        ; Store it in our structure.
  518.     MOV    AX,[ISIZE+BX]        ; Get the length.
  519.     MOV    [LENGTHI+DI],AX        ; Store it appropriately.
  520.     MOV    AX,[IVOL_FINETUNE+BX]    ; Get the instrument volume and fine tune.
  521.     MOV    [CHVOLUME+SI],AL    ; Store it appropriately.
  522.     MOV    [FINETUNE+SI],AH
  523.     MOV    [MVOL+SI],AL
  524.     MOV    CX,[ILOOP_SIZE+BX]    ; Get Repeat length
  525.     CMP    CX,8            ; If the length is less than four,
  526.     JB    SHORT Go_NoLoop        ; then there is no loop.
  527.     MOV    AX,[ILOOP_START+BX]    ; Get the Repeat start.
  528.     MOV    [MREPEAT+DI],AX        ; Move it into the appropriate
  529.     MOV    [LOOPSTART+DI],AX    ; structures and locations.
  530.     MOV    [REPLEN+DI],CX        ; Move the length into its storage.
  531.     ADD    AX,CX            ; We're figuring out the offset of
  532.     MOV    [MREPLEN+DI],AX
  533.     MOV    [MMAXREP+DI],AX        ; where the repeat length breaks.
  534.     JMP    SHORT Go_SetRegs    ; Skip the no loop part.
  535. Go_NoLoop:
  536.     XOR    AX,AX            ; Zero out AX.
  537.     MOV    [REPLEN+DI],AX
  538.     MOV    [MREPLEN+DI],AX        ; Make sure that no loop exists and
  539.     MOV    [MREPEAT+DI],AX
  540.     MOV    [LOOPSTART+DI],AX
  541. Go_SetRegs:
  542.     CMP    [NOTE+DI],0        ; Grab the note.
  543.     JE    Go_CheckMore        ; Check the fx.
  544.     MOV    AH,[CMD+SI]        ; Get the special fx command.
  545.     MOV    AL,[CMDLO+SI]
  546.     AND    AL,0F0H            ; Mask out the bits we don't want.
  547.     CMP    AX,0E50H        ; Is there a fine tune command
  548.     JE    SHORT Go_DoSetFineTune
  549.     CMP    AH,3            ; Is it a tone portamento?
  550.     JE    SHORT Go_ChkTonePorta
  551.     CMP    AH,5            ; Is it a tone and volume slide?
  552.     JE    SHORT Go_ChkTonePorta
  553.     CMP    AH,9            ; Is it a sample offset command?
  554.     JNE    SHORT Go_SetPeriod    ; If not, go do the actual note.
  555.     PUSH    AX            ; keep the command byte in mem
  556.     CALL    Go_CheckMoreEfx
  557.     POP    AX
  558.     JMP    SHORT Go_SetPeriod    ; Go do the actual note.
  559. Go_ChkTonePorta:
  560.     CALL    Go_SetTonePorta        ; Do part of the tone portamento.
  561.     JMP    Go_CheckMore        ; Go do the fx.
  562. Go_DoSetFineTune:
  563.     PUSH    AX
  564.     MOV    AL,[CMDLO+SI]
  565.     AND    AL,0FH
  566.     CALL    Go_SetFineTune        ; Update the fine tune.
  567.     POP    AX
  568. ;-----------------------------------------------------------------------------
  569. ; ──── We are now going to find the note in the period table.  If it
  570. ; ──── doesn't exist, then no fine tuning can be performed.  If it
  571. ; ──── does, and fine tuning is specified, then we can update it.
  572. ;-----------------------------------------------------------------------------
  573. Go_SetPeriod:
  574.     MOV    CL,AH
  575.     MOV    AX,[NOTE+DI]        ; Get the note.
  576.     DEC    AX
  577.     MOV    BX,OFFSET MT_PERIODTABLE; Set pointer to beginning of table.
  578.     CMP    CL,3
  579.     JE    SHORT Seek_Period
  580.     CMP    CL,5
  581.     JNE    SHORT Go_ftufound
  582. Seek_Period:
  583.     INC    AX
  584.     MOV    CX,36+12        ; 36 periods to cycle through.
  585. Go_ftuloop:
  586.     CMP    AX,[BX]            ; Check the note against the period.
  587.     JAE    SHORT Go_Wizzyfound    ; We found it!
  588.     INC    BX
  589.     INC    BX            ; Otherwise, update the pointer and
  590.     LOOP    Go_ftuloop        ; keep looping.
  591.     JMP    SHORT Go_Wizzyfound
  592. Go_ftufound:
  593.     ADD    BX,AX
  594. Go_WizzyFound:
  595.     MOV    AL,[FINETUNE+SI]    ; Get the fine tune.
  596.     MOV    CL,(36+12)*2        ; The period table's size is 72.
  597.     MUL    CL            ; Multiply it by the fine tune.
  598.     ADD    BX,AX            ; Add it onto the pointer to point to
  599.     MOV    AX,[BX]            ; the new period and get it.
  600.     MOV    [PERIOD+DI],AX        ; Store it.
  601.     MOV    AH,[CMD+SI]        ; Get the special fx command.
  602.     MOV    AL,[CMDLO+SI]
  603.     AND    AL,0F0H            ; Mask out the bits we don't want.
  604.     CMP    AX,0ED0H
  605.     JE    SHORT Go_delnoc
  606.     MOV    AL,[WAVECONTROL+SI]    ; Get the WaveControl.
  607.     TEST    AL,00000100B        ; Amiga: BTST #2,WaveControl.
  608.     JZ    SHORT Go_vibnoc        ; If it is zero, then skip.
  609.     MOV    [VIBRATOPOS+SI],0
  610. Go_vibnoc:
  611.     TEST    AL,01000000B        ; Amiga: BTST #6,WaveControl
  612.     JZ    SHORT Go_trenoc        ; If it is zero, then skip.
  613.     MOV    [TREMOLOPOS+SI],0    ; Zero the Tremolo offset.
  614. Go_trenoc:
  615.     MOV    AX,[START+DI]        ; Get the start segment.
  616.     MOV    [MSEG+DI],AX        ; Store it to be updated.
  617.     MOV    [MOFS+DI],0        ; Set the offset to zero.
  618.     MOV    [MOFLOW+SI],0
  619.     MOV    AX,[LENGTHI+DI]
  620.     MOV    [MMAXREP+DI],AX        ; Store in MaxRepeat
  621.     MOV    CX,[PERIOD+DI]
  622.     CALL    Go_PerNop2
  623.     JMP    SHORT Go_CheckMore
  624. Go_delnoc:
  625.     MOV    AX,[MMAXREP+DI]
  626.     MOV    [MOFS+DI],AX
  627. Go_CheckMore:
  628.     CALL    Go_CheckMoreEfx
  629. Go_DoNext:
  630.     POP    SI            ;SKIP TO NEXT CHANNEL
  631.     INC    SI
  632.     CMP    SI,CH_NUMB
  633.     JB    Go_PlayVoice
  634.     CALL    TRACK_RESTORE        ;RESTORE EMS PAGES
  635. ;-----------------------------------------------------------------------------
  636. Go_Dskip:
  637.     ADD    MT_PATTERNPOS,4        ; Increment position by one
  638.     MOV    AL,MT_PATTDELAYTIME
  639.     OR    AL,AL
  640.     JZ    SHORT Go_dskc
  641.     MOV    MT_PATTDELAYTIME2,AL
  642.     MOV    MT_PATTDELAYTIME,0
  643. Go_dskc:
  644.     CMP    MT_PATTDELAYTIME2,0
  645.     JE    SHORT Go_dska
  646.     DEC    MT_PATTDELAYTIME2
  647.     JZ    SHORT Go_dska
  648.     SUB    MT_PATTERNPOS,4
  649. Go_dska:
  650.     CMP    MT_PBREAKFLAG,0
  651.     JE    SHORT Go_nnpysk
  652.     MOV    MT_PBREAKFLAG,0
  653.     MOVZX    AX,MT_PBREAKPOS
  654.     MOV    MT_PBREAKPOS,AH
  655.     SHL    AX,2
  656.     MOV    MT_PATTERNPOS,AX
  657. Go_nnpysk:
  658.     CMP    MT_PATTERNPOS,256
  659.     JB    SHORT Go_NoNewPosYet
  660. Go_NextPosition:
  661.     MOVZX    AX,MT_PBREAKPOS
  662.     SHL    AX,2
  663.     MOV    MT_PATTERNPOS,AX
  664.     MOV    MT_PBREAKPOS,0
  665.     MOV    MT_POSJUMPFLAG,0
  666.     MOV    AL,MT_SONGPOS
  667.     INC    AL
  668.     AND    AL,7FH
  669.     MOV    MT_SONGPOS,AL
  670.     CMP    AL,SONG_SIZE
  671.     JB    SHORT Go_NoNewPosYet
  672.     MOV    AL,SONG_LOOP
  673.     CMP    AL,SONG_SIZE
  674.     JB    SHORT Go_NoSongRestart
  675.     MOV    MOD_STAT,3
  676.     XOR    AL,AL
  677. Go_NoSongRestart:
  678.     MOV    MT_SONGPOS,AL
  679.     MOV    MT_SPEED,6        ;DEFAULT PROTRACKER SPEED
  680.     MOV    MT_COUNTER,0        ;RESET PROTRACKER VARIABLES
  681.     MOV    AL,125
  682.     CALL    Go_SetBPM
  683.     MOV    BPM_COUNT,0
  684. Go_NoNewPosYet:
  685.     CMP    MT_POSJUMPFLAG,0
  686.     JNE    Go_NextPosition
  687.     RET
  688. CONTROL_CHANNELS ENDP
  689. ;=============================================================================
  690. Go_CheckEfx PROC NEAR
  691.     XOR    SI,SI
  692. Go_DoEfx:
  693.     PUSH    SI
  694.     MOV    DI,SI
  695.     SHL    DI,1
  696.     MOV    BL,[CMD+SI]              ; Get the special command
  697.     MOV    BH,[CMDLO+SI]
  698.     OR    BX,BX
  699.     JNZ    SHORT SetBack1
  700.     CALL    Go_PerNop
  701.     JMP    SHORT SetBack2
  702. SetBack1:
  703.     XOR    BH,BH
  704.     SHL    BX,1
  705.     CALL    [Effect_Jump_Table1+BX]
  706. SetBack2:
  707.     POP    SI
  708.     INC    SI
  709.     CMP    SI,CH_NUMB
  710.     JB    Go_DoEfx
  711. Go_Return:
  712.     RET
  713. ;-----------------------------------------------------------------------------
  714. Go_PerNop PROC NEAR
  715.     MOV    CX,[PERIOD+DI]
  716. Go_PerNop2 PROC NEAR
  717.     PUSH    EAX ECX EDX
  718.     XOR    EAX,EAX
  719.     JCXZ    SHORT Go_DivZero
  720.     AND    ECX,0FFFFH
  721.     XOR    EDX,EDX
  722.     MOV    EAX,MAINFREQ
  723.     DIV    ECX
  724. Go_DivZero:
  725.     MOV    [MFIXED+DI],AX
  726.     SHR    EAX,16
  727.     MOV    [MFREQ+DI],AX
  728.     POP    EDX ECX EAX
  729.     RET
  730. Go_PerNop2 ENDP
  731. Go_PerNop ENDP
  732. Go_CheckEfx ENDP
  733. ;=============================================================================
  734. ;
  735. ; SI IS THE CHANNEL-BYTE-INDEX, DI IS THE CHANNEL-WORD-INDEX
  736. ;
  737. ;─────────────────────────────────────────────────────────────────────────────
  738. ; Effect 0 -- Arpeggio
  739. ;─────────────────────────────────────────────────────────────────────────────
  740. Go_Arpeggio PROC NEAR
  741.     MOVZX    AX,MT_COUNTER
  742.     MOV    BL,3
  743.     MOV    CX,[PERIOD+DI]
  744.     DIV    BL
  745.     OR    AH,AH
  746.     JZ    SHORT Go_Arpeggio1
  747.     MOV    AL,[CMDLO+SI]
  748.     CMP    AH,2
  749.     JE    SHORT Go_Arpeggio2
  750.     SHR    AL,4
  751. Go_Arpeggio2:
  752.     AND    AL,0FH
  753.     SHL    AL,1
  754.     MOVZX    BX,AL
  755.     MOV    AL,[FINETUNE+SI]
  756.     MOV    DX,CX
  757.     MOV    CL,(36+12)*2
  758.     MUL    CL
  759.     PUSH    DI
  760.     MOV    DI,OFFSET MT_PERIODTABLE
  761.     ADD    DI,AX
  762.     MOV    AH,36+12
  763. Go_arploop:
  764.     MOV    CX,[BX+DI]
  765.     CMP    DX,[DI]
  766.     JAE    SHORT Go_arpafterloop
  767.         INC    DI
  768.     INC    DI
  769.     DEC    AH
  770.     JNZ    Go_arploop
  771.     POP    DI
  772.     RET
  773. Go_arpafterloop:
  774.     POP    DI
  775. Go_Arpeggio1:
  776.     CALL    Go_PerNop2
  777.         RET
  778. Go_Arpeggio ENDP
  779. ;─────────────────────────────────────────────────────────────────────────────
  780. ; Effect 1 -- Portamento Up
  781. ;─────────────────────────────────────────────────────────────────────────────
  782. Go_PortaUp PROC NEAR
  783.     MOVZX    AX,[CMDLO+SI]        ; Number to slide up (was lo)
  784.     AND    AL,MT_LOWMASK
  785.     MOV    MT_LOWMASK,0FFH
  786.     SUB    [PERIOD+DI],AX
  787.     MOV    CX,[PERIOD+DI]
  788.     CMP    CX,113
  789.     JGE    SHORT Go_PortaUSkip
  790.     MOV    CX,113
  791.     MOV    [PERIOD+DI],CX
  792. Go_PortaUSkip:
  793.     CALL    Go_PerNop2
  794.     RET
  795. Go_PortaUp ENDP
  796. ;────────────────────────────────────────────────────────────────────────────
  797. ; Effect 2 -- Portamento Down
  798. ;────────────────────────────────────────────────────────────────────────────
  799. Go_PortaDown PROC NEAR
  800.     MOVZX    AX,[CMDLO+SI]        ; Number to slide down
  801.     AND    AL,MT_LOWMASK
  802.     MOV    MT_LOWMASK,0FFH
  803.     ADD    [PERIOD+DI],AX
  804.     MOV    CX,[PERIOD+DI]
  805.     CMP    CX,856
  806.     JL    SHORT Go_PortaDSkip
  807.     MOV    CX,856
  808.     MOV    [PERIOD+DI],CX
  809. Go_PortaDSkip:
  810.     CALL    Go_PerNop2
  811.     RET
  812. Go_PortaDown ENDP
  813. ;────────────────────────────────────────────────────────────────────────────
  814. ; Effect 3 -- Tone Portamento
  815. ;────────────────────────────────────────────────────────────────────────────
  816. Go_TonePortamento PROC NEAR
  817.     MOV    AL,[CMDLO+SI]
  818.     OR    AL,AL
  819.     JZ    SHORT Go_TonePortNoChange
  820.     MOV    [TONEPORTSPEED+SI],AL
  821.     MOV    [CMDLO+SI],0
  822. Go_TonePortNoChange:
  823.     CMP    [WANTEDPERIOD+DI],0
  824.     JZ    Go_Return
  825.     MOVZX    DX,[TONEPORTSPEED+SI]
  826.     MOV    CX,[PERIOD+DI]
  827.     MOV    AX,[WANTEDPERIOD+DI]
  828.     CMP    [TONEPORTDIREC+SI],0
  829.     JNE    SHORT Go_TonePortaUp
  830. Go_TonePortaDown:
  831.     ADD    CX,DX
  832.     CMP    AX,CX
  833.     JG    SHORT Go_TonePortaSetPer
  834.     JMP    SHORT Go_TonePortaEnd
  835. Go_TonePortaUp:
  836.     SUB    CX,DX
  837.     CMP    AX,CX
  838.     JL    SHORT Go_TonePortaSetPer
  839. Go_TonePortaEnd:
  840.     MOV    CX,AX
  841.     MOV    [WANTEDPERIOD+DI],0
  842. Go_TonePortaSetPer:
  843.     MOV    [PERIOD+DI],CX
  844.     MOV    AL,[GLISSFUNK+SI]
  845.     AND    AL,0FH
  846.     JZ    SHORT Go_GlissSkip
  847.     MOV    AL,[FINETUNE+SI]
  848.     MOV    BL,(36+12)*2
  849.     MUL    BL
  850.     PUSH    DI
  851.     MOV    DI,OFFSET MT_PERIODTABLE
  852.     ADD    DI,AX
  853.     XOR    BX,BX
  854. Go_GlissLoop:
  855.     CMP    CX,[BX+DI]
  856.     JAE    SHORT Go_GlissFound
  857.     INC    BX
  858.     INC    BX
  859.     CMP    BX,(36+12)*2
  860.     JB    Go_GlissLoop
  861.     MOV    BX,(35+12)*2
  862. Go_GlissFound:
  863.     MOV    CX,[BX+DI]
  864.     POP    DI
  865. Go_GlissSkip:
  866.     CALL    Go_PerNop2
  867.     RET
  868. Go_TonePortamento ENDP
  869. ;-----------------------------------------------------------------------------
  870. Go_SetTonePorta PROC NEAR
  871.     MOV    DX,[NOTE+DI]
  872.     MOV    AL,[FINETUNE+SI]
  873.     MOV    CL,48*2            ;37
  874.     MUL    CL
  875.     PUSH    DI
  876.     MOV    DI,OFFSET MT_PERIODTABLE
  877.     ADD    DI,AX
  878.     XOR    BX,BX
  879. Go_StpLoop:
  880.     CMP    DX,[BX+DI]
  881.     JAE    SHORT Go_StpFound
  882.     INC    BX
  883.     INC    BX
  884.     CMP    BX,48*2            ;37
  885.     JB    Go_StpLoop
  886.     MOV    BX,47*2            ;35
  887. Go_StpFound:
  888.     MOV    DL,[FINETUNE+SI]
  889.     AND    DL,8
  890.     JZ    SHORT Go_StpGoss
  891.     OR    BX,BX
  892.     JZ    SHORT Go_StpGoss
  893.     DEC    BX
  894.     DEC    BX
  895. Go_StpGoss:
  896.     MOV    DX,[BX+DI]
  897.     POP    DI
  898.     MOV    [WANTEDPERIOD+DI],DX
  899.     MOV    AX,[PERIOD+DI]
  900.     MOV    [TONEPORTDIREC+SI],0
  901.     CMP    DX,AX
  902.     JE    SHORT Go_ClearTonePorta
  903.     JA    Go_Return
  904.     INC    [TONEPORTDIREC+SI]
  905.     RET
  906. Go_ClearTonePorta:
  907.     MOV    [WANTEDPERIOD+DI],0
  908.     RET
  909. Go_SetTonePorta ENDP
  910. ;────────────────────────────────────────────────────────────────────────────
  911. ; Effect 4 -- Vibrato
  912. ;────────────────────────────────────────────────────────────────────────────
  913. Go_Vibrato PROC NEAR
  914.     MOV    AL,[CMDLO+SI]
  915.     OR    AL,AL
  916.     JZ    SHORT Go_Vibrato2
  917.     MOV    BL,[VIBRATOCMD+SI]
  918.     AND    AL,0FH
  919.     JZ    SHORT Go_vibskip
  920.     AND    BL,0F0H
  921.     OR    BL,AL
  922. Go_vibskip:
  923.     MOV    AL,[CMDLO+SI]
  924.     AND    AL,0F0H
  925.     JZ    SHORT Go_vibskip2
  926.     AND    BL,0FH
  927.     OR    BL,AL
  928. Go_vibskip2:
  929.     MOV    [VIBRATOCMD+SI],BL
  930. Go_Vibrato2:
  931.     MOV    AL,[VIBRATOPOS+SI]
  932.     SHR    AL,2
  933.     AND    AX,1FH
  934.     MOV    BL,[WAVECONTROL+SI]
  935.     AND    BL,3
  936.     JZ    SHORT Go_vib_sine
  937.     SHL    AL,3
  938.     CMP    BL,1
  939.     JE    SHORT Go_vib_rampdown
  940.     MOV    BL,255
  941.     JMP    SHORT Go_vib_set
  942. Go_vib_rampdown:
  943.     CMP    [VIBRATOPOS+SI],0
  944.     JG    SHORT Go_vib_rampdown2
  945.     MOV    BL,AL
  946.     NOT    BL
  947.     JMP    SHORT Go_vib_set
  948. Go_vib_rampdown2:
  949.     MOV    BL,AL
  950.     JMP    SHORT Go_vib_set
  951. Go_vib_sine:
  952.     MOVZX    BX,AL
  953.     MOV    BL,[MT_VIBRATOTABLE+BX]
  954. Go_vib_set:
  955.     MOV    AL,[VIBRATOCMD+SI]
  956.     AND    AL,0FH
  957.     MUL    BL
  958.     SHR    AX,7
  959.     MOV    BX,AX
  960.     MOV    AX,[PERIOD+DI]
  961.     CMP    [VIBRATOPOS+SI],0
  962.     JG    SHORT Go_VibratoNeg    ; BMI
  963.     NEG    BX
  964. Go_VibratoNeg:
  965.     ADD    AX,BX
  966. Go_Vibrato3:
  967.     MOV    CX,AX
  968.     CALL    Go_PerNop2
  969.     MOV    AL,[VIBRATOCMD+SI]
  970.     AND    AL,0F0H
  971.     SHR    AL,2
  972.     ADD    [VIBRATOPOS+SI],AL
  973.     RET
  974. Go_Vibrato ENDP
  975. ;────────────────────────────────────────────────────────────────────────────
  976. ; Effect 5 -- Tone and Volume Slide
  977. ;────────────────────────────────────────────────────────────────────────────
  978. Go_TonePlusVolSlide PROC NEAR
  979.     CALL    Go_TonePortNoChange
  980.     JMP    Go_VolumeSlide
  981. Go_TonePlusVolSlide ENDP
  982. ;────────────────────────────────────────────────────────────────────────────
  983. ; Effect 6 -- Vibrato and Volume Slide
  984. ;────────────────────────────────────────────────────────────────────────────
  985. Go_VibratoPlusVolSlide PROC NEAR
  986.     CALL    Go_Vibrato2        ;was mt_vibrato2
  987.     JMP    Go_VolumeSlide
  988. Go_VibratoPlusVolSlide ENDP
  989. ;────────────────────────────────────────────────────────────────────────────
  990. ; Effect 7 -- Tremolo
  991. ;────────────────────────────────────────────────────────────────────────────
  992. Go_Tremolo PROC NEAR
  993.     MOV    AL,[CMDLO+SI]
  994.     OR    AL,AL
  995.     JZ    SHORT Go_Tremolo2
  996.     MOV    BL,[TREMOLOCMD+SI]
  997.     AND    AL,0FH
  998.     JZ    SHORT Go_treskip
  999.     AND    BL,0F0H
  1000.     OR    BL,AL
  1001. Go_treskip:
  1002.     MOV    AL,[CMDLO+SI]
  1003.     AND    AL,0F0H
  1004.     JZ    SHORT Go_treskip2
  1005.     AND    BL,0FH
  1006.     OR    BL,AL
  1007. Go_treskip2:
  1008.     MOV    [TREMOLOCMD+SI],BL
  1009. Go_Tremolo2:
  1010.     MOV    AL,[TREMOLOPOS+SI]
  1011.     SHR    AL,2
  1012.     AND    AX,1FH
  1013.     MOV    BL,[WAVECONTROL+SI]
  1014.     SHR    BL,4
  1015.     AND    BL,3
  1016.     JZ    SHORT Go_tre_sine
  1017.     SHL    AL,3
  1018.     CMP    BL,1
  1019.     JE    SHORT Go_tre_rampdown
  1020.     MOV    BL,255
  1021.     JMP    SHORT Go_tre_set
  1022. Go_tre_rampdown:
  1023.     CMP    [TREMOLOPOS+SI],0
  1024.     JG    SHORT Go_tre_rampdown2
  1025.     MOV    BL,AL
  1026.     NOT    BL
  1027.     JMP    SHORT Go_tre_set
  1028. Go_tre_rampdown2:
  1029.     MOV    BL,AL
  1030.     JMP    SHORT Go_tre_set
  1031. Go_tre_sine:
  1032.     MOVZX    BX,AL
  1033.     MOV    BL,[MT_VIBRATOTABLE+BX]
  1034. Go_tre_set:
  1035.     MOV    AL,[TREMOLOCMD+SI]
  1036.     AND    AL,0FH
  1037.     MUL    BL
  1038.     MOV    BX,AX
  1039.     SHR    BX,6
  1040.     MOV    AL,[CHVOLUME+SI]
  1041.     CMP    [TREMOLOPOS+SI],0
  1042.     JG    SHORT Go_TremoloNeg        ; BMI  jns
  1043.     ADD    AL,BL
  1044.     JMP    SHORT Go_Tremolo3
  1045. Go_TremoloNeg:
  1046.     SUB    AL,BL
  1047. Go_Tremolo3:
  1048.     JNC    SHORT Go_TremoloSkip
  1049.     XOR    AX,AX
  1050. Go_TremoloSkip:
  1051.     CMP    AL,40H
  1052.     JBE    SHORT Go_TremoloOK        ; BLS
  1053.     MOV    AL,40H
  1054. Go_TremoloOK:
  1055.     MOV    [MVOL+SI],AL            ;was ah
  1056.     MOV    AL,[TREMOLOCMD+SI]
  1057.     AND    AL,0F0H
  1058.     SHR    AL,2
  1059.     ADD    [TREMOLOPOS+SI],AL
  1060.     RET
  1061. Go_Tremolo ENDP
  1062. ;────────────────────────────────────────────────────────────────────────────
  1063. ; Effect 9 -- Sample Offset
  1064. ;────────────────────────────────────────────────────────────────────────────
  1065. Go_SampleOffset PROC NEAR
  1066.     MOVZX    AX,[CMDLO+SI]
  1067.     OR    AL,AL
  1068.     JZ    SHORT Go_sononew
  1069.     MOV    [SAMPLEOFFSET+SI],AL
  1070. Go_sononew:
  1071.     MOVZX    AX,[SAMPLEOFFSET+SI]
  1072.     XCHG    AL,AH
  1073.     CMP    AX,[MMAXREP+DI]
  1074.     JAE    SHORT Go_sofskip
  1075.     MOV    [MOFS+DI],AX
  1076.     RET
  1077. Go_sofskip:
  1078.     MOV    AX,[MOFS+DI]
  1079.     MOV    [MMAXREP+DI],AX
  1080.     RET
  1081. Go_SampleOffset ENDP
  1082. ;────────────────────────────────────────────────────────────────────────────
  1083. ; Effect A -- Volume Slide
  1084. ;────────────────────────────────────────────────────────────────────────────
  1085. Go_VolumeSlide PROC NEAR
  1086.     MOV    AL,[CMDLO+SI]
  1087.     SHR    AL,4
  1088.     OR    AL,AL
  1089.     JZ    SHORT Go_VolSlideDown
  1090. Go_VolSlideUp:
  1091.     ADD    [CHVOLUME+SI],AL
  1092.     CMP    [CHVOLUME+SI],40H
  1093.     JBE    SHORT Go_vsdskip
  1094.     MOV    [CHVOLUME+SI],40H
  1095.     JMP    SHORT Go_vsdskip
  1096. Go_VolSlideDown:
  1097.     MOV    AL,[CMDLO+SI]
  1098.     AND    AL,0FH
  1099. Go_VolSlideDown2:
  1100.     SUB    [CHVOLUME+SI],AL
  1101.     JNC    SHORT Go_vsdskip
  1102.     MOV    [CHVOLUME+SI],0
  1103. Go_vsdskip:
  1104.     MOV    AL,[CHVOLUME+SI]
  1105.     MOV    [MVOL+SI],AL        ;was ah
  1106.     RET
  1107. Go_VolumeSlide ENDP
  1108. ;────────────────────────────────────────────────────────────────────────────
  1109. ; Effect B -- Position Jump
  1110. ;────────────────────────────────────────────────────────────────────────────
  1111. Go_PositionJump PROC NEAR
  1112.     MOV    AL,[CMDLO+SI]        ; Get where to jump
  1113.     DEC    AL            ; Update the
  1114.     MOV    MT_SONGPOS,AL        ; information.
  1115. Go_pj2:    MOV    MT_PBREAKPOS,0
  1116.     MOV    MT_POSJUMPFLAG,1
  1117.     RET
  1118. Go_PositionJump ENDP
  1119. ;────────────────────────────────────────────────────────────────────────────
  1120. ; Effect C -- Volume Change
  1121. ;────────────────────────────────────────────────────────────────────────────
  1122. Go_VolumeChange PROC NEAR
  1123.     MOV    AL,[CMDLO+SI]        ; Get value for volume
  1124.     CMP    AL,40H            ; Is it greater than 40h?
  1125.     JBE    SHORT Go_VolumeOK    ; Nope
  1126.     MOV    AL,40H
  1127. Go_VolumeOK:
  1128.     MOV    [CHVOLUME+SI],AL
  1129.     MOV    [MVOL+SI],AL        ;was ah
  1130.     RET
  1131. Go_VolumeChange ENDP
  1132. ;────────────────────────────────────────────────────────────────────────────
  1133. ; Effect D -- Pattern Break
  1134. ;────────────────────────────────────────────────────────────────────────────
  1135. Go_PatternBreak PROC NEAR
  1136.     MOV    AL,[CMDLO+SI]        ; Break to where?
  1137.     MOV    BL,AL            ; POSITION IS IN DECIMAL
  1138.     SHR    AL,4
  1139.     MOV    CL,10
  1140.     MUL    CL
  1141.     AND    BL,0FH
  1142.     ADD    AL,BL
  1143.     CMP    AL,63
  1144.     JG    Go_pj2
  1145.     MOV    MT_PBREAKPOS,AL
  1146.     MOV    MT_POSJUMPFLAG,1
  1147.     RET
  1148. Go_PatternBreak ENDP
  1149. ;────────────────────────────────────────────────────────────────────────────
  1150. ; Effect F -- Set Speed
  1151. ;────────────────────────────────────────────────────────────────────────────
  1152. Go_SetSpeed PROC NEAR
  1153.     MOV    AL,[CMDLO+SI]        ; Get value for speed
  1154.     OR    AL,AL
  1155.     JZ    Go_Return
  1156.     CMP    AL,32            ; Is it a BPM value ?
  1157.     JAE    SHORT Go_SetBPM
  1158.     MOV    MT_COUNTER,0
  1159.     MOV    MT_SPEED,AL
  1160.     RET
  1161. Go_SetBPM:
  1162.     XOR    AH,AH
  1163.     MOV    BPM_VALUE,AX
  1164.     CMP    AL,76            ; MIXROUTINE CANT HANDLE LESS THAN 76
  1165.     JAE    SHORT Go_CheckBPM1
  1166.     MOV    AL,76
  1167. Go_CheckBPM1:
  1168.     CMP    AL,202            ; MIXROUTINE CANT HANDLE MORE THAN 202
  1169.     JBE    SHORT Go_CheckBPM2
  1170.     MOV    AL,202
  1171. Go_CheckBPM2:
  1172.     SHL    AX,1
  1173.     MOV    BL,5            ; Denna bit är för att ställa
  1174.     DIV    BL            ; EFFECTs till annat än 50Hz
  1175.     MOV    DL,AL            ; Detta ger automatiskt en annan
  1176.     XOR    DH,DH            ; PATT_SPEED.; Hz=2*BPM/5
  1177.     XOR    AX,AX
  1178.     MOV    BX,BPM_RATE
  1179.     DIV    BX
  1180.     MOV    WORD PTR BPM_SPEED,AX
  1181.     XOR    AX,AX
  1182.     DIV    BX
  1183.     MOV    WORD PTR BPM_SPEED+2,AX
  1184.     RET
  1185. Go_SetSpeed ENDP
  1186. ;=============================================================================
  1187. Go_CheckMoreEfx PROC NEAR
  1188.     MOVZX    BX,[CMD+SI]
  1189.     SHL    BL,1
  1190.     JMP    [Effect_Jump_Table2+BX]
  1191. Go_CheckMoreEfx ENDP
  1192. ;─────────────────────────────────────────────────────────────────────────────
  1193. ; Effect E
  1194. ;─────────────────────────────────────────────────────────────────────────────
  1195. Go_E_Commands PROC NEAR
  1196.     MOVZX    BX,[CMDLO+SI]
  1197.     SHR    BL,4
  1198.     SHL    BL,1
  1199.     MOV    AL,[CMDLO+SI]
  1200.     AND    AL,0FH
  1201.     JMP    [Effect_Jump_Table3+BX]
  1202. ;-----------------------------------------------------------------------------
  1203. ; Effect 0 -- FilterOnOff
  1204. ; Effect 1 -- Fine Porta Up
  1205. ;-----------------------------------------------------------------------------
  1206. Go_FinePortaUp:
  1207.     CMP    MT_COUNTER,0
  1208.     JNE    Go_Return
  1209.     MOV    MT_LOWMASK,0FH
  1210.     JMP    Go_PortaUp
  1211. ;-----------------------------------------------------------------------------
  1212. ; Effect 2 -- Fine Porta Down
  1213. ;-----------------------------------------------------------------------------
  1214. Go_FinePortaDown:
  1215.     CMP    MT_COUNTER,0
  1216.     JNE    Go_Return
  1217.     MOV    MT_LOWMASK,0FH
  1218.     JMP    Go_PortaDown
  1219. ;-----------------------------------------------------------------------------
  1220. ; Effect 3 -- Set Gliss Control
  1221. ;-----------------------------------------------------------------------------
  1222. Go_SetGlissControl:
  1223.     AND    [GLISSFUNK+SI],0F0H
  1224.     OR    [GLISSFUNK+SI],AL
  1225.     RET
  1226. ;-----------------------------------------------------------------------------
  1227. ; Effect 4 -- Set Vibrato Control
  1228. ;-----------------------------------------------------------------------------
  1229. Go_SetVibratoControl:
  1230.     AND    [WAVECONTROL+SI],0F0H
  1231.     OR    [WAVECONTROL+SI],AL
  1232.     RET
  1233. ;-----------------------------------------------------------------------------
  1234. ; Effect 5 -- Set Fine Tune
  1235. ;-----------------------------------------------------------------------------
  1236. Go_SetFineTune:
  1237.     MOV    [FINETUNE+SI],AL
  1238.     RET
  1239. ;-----------------------------------------------------------------------------
  1240. ; Effect 6 -- Jump Loop
  1241. ;-----------------------------------------------------------------------------
  1242. Go_JumpLoop:
  1243.     CMP    MT_COUNTER,0
  1244.     JNE    Go_Return
  1245.     OR    AL,AL
  1246.     JZ    SHORT Go_SetLoop
  1247.     CMP    [LOOPCOUNT+SI],0
  1248.     JE    SHORT Go_jumpcnt
  1249.     DEC    [LOOPCOUNT+SI]
  1250.     JZ    Go_Return
  1251. Go_jmploop:
  1252.     MOV    AL,[PATTPOS+SI]
  1253.     MOV    MT_PBREAKPOS,AL
  1254.     MOV    MT_PBREAKFLAG,1
  1255.     RET
  1256. Go_jumpcnt:
  1257.     MOV    [LOOPCOUNT+SI],AL
  1258.     JMP    Go_jmploop
  1259. Go_SetLoop:
  1260.     MOV    AX,MT_PATTERNPOS
  1261.     SHR    AX,2
  1262.     MOV    [PATTPOS+SI],AL
  1263.     RET
  1264. ;-----------------------------------------------------------------------------
  1265. ; Effect 7 -- Set Tremolo Control
  1266. ;-----------------------------------------------------------------------------
  1267. Go_SetTremoloControl:
  1268.     SHL    AL,4
  1269.     AND    [WAVECONTROL+SI],0FH
  1270.     OR    [WAVECONTROL+SI],AL
  1271.     RET
  1272. ;-----------------------------------------------------------------------------
  1273. ; Effect 8 -- Set PANNING
  1274. ;-----------------------------------------------------------------------------
  1275. Go_PANNING:
  1276.     MOV    [MPANNING+SI],AL
  1277.     RET
  1278. ;-----------------------------------------------------------------------------
  1279. ; Effect 9 -- Retrig Note
  1280. ;-----------------------------------------------------------------------------
  1281. Go_RetrigNote:
  1282.     MOV    BL,AL
  1283.     OR    BL,BL
  1284.     JZ    SHORT Go_rtnend
  1285.     MOVZX    AX,MT_COUNTER
  1286.     OR    AL,AL
  1287.     JNZ    SHORT Go_rtnskp
  1288.     CMP    [NOTE+DI],0
  1289.     JNE    SHORT Go_rtnskp
  1290.     MOV    MT_COUNTER,0
  1291. Go_rtnskp:
  1292.     DIV    BL
  1293.     XCHG    AL,AH
  1294.     OR    AL,AL
  1295.     JNZ    SHORT Go_rtnend
  1296. Go_DoRetrig:
  1297.     XOR    AX,AX
  1298.     MOV    [MOFS+DI],AX
  1299.     MOV    [MOFLOW+SI],AX
  1300.     MOV    AX,[LENGTHI+DI]
  1301.     MOV    [MMAXREP+DI],AX
  1302.     MOV    AX,[LOOPSTART+DI]
  1303.     MOV    [MREPEAT+DI],AX
  1304.     ADD    AX,[REPLEN+DI]
  1305.     MOV    [MREPLEN+DI],AX
  1306. Go_rtnend:
  1307.     RET
  1308. ;-----------------------------------------------------------------------------
  1309. ; Effect A -- Volume Fine Up
  1310. ;-----------------------------------------------------------------------------
  1311. Go_VolumeFineUp:
  1312.     CMP    MT_COUNTER,0
  1313.     JNE    Go_Return
  1314.     JMP    Go_VolSlideUp
  1315. ;-----------------------------------------------------------------------------
  1316. ; Effect B -- Volume Fine Down
  1317. ;-----------------------------------------------------------------------------
  1318. Go_VolumeFineDown:
  1319.     CMP    MT_COUNTER,0
  1320.     JNZ    Go_Return
  1321.     JMP    Go_VolSlideDown2
  1322. ;-----------------------------------------------------------------------------
  1323. ; Effect C -- Note Cut
  1324. ;-----------------------------------------------------------------------------
  1325. Go_NoteCut:
  1326.     CMP    AL,MT_COUNTER
  1327.     JNE    Go_Return
  1328.     MOV    [CHVOLUME+SI],0
  1329.     MOV    [MVOL+SI],AL
  1330.     RET
  1331. ;-----------------------------------------------------------------------------
  1332. ; Effect D -- Note Delay
  1333. ;-----------------------------------------------------------------------------
  1334. Go_NoteDelay:
  1335.     CMP    AL,MT_COUNTER
  1336.     JNE    Go_Return
  1337.     CMP    [NOTE+DI],0
  1338.     JE    Go_Return
  1339.     JMP    Go_DoRetrig
  1340. ;-----------------------------------------------------------------------------
  1341. ; Effect E -- Pattern Delay
  1342. ;-----------------------------------------------------------------------------
  1343. Go_PatternDelay:
  1344.     CMP    MT_COUNTER,0
  1345.     JNE    Go_Return
  1346.     CMP    MT_PATTDELAYTIME2,0
  1347.     JNZ    Go_Return
  1348.     INC    AL
  1349.     MOV    MT_PATTDELAYTIME,AL
  1350.     RET
  1351. ;-----------------------------------------------------------------------------
  1352. ; Effect F -- Funk It
  1353. ;-----------------------------------------------------------------------------
  1354. Go_E_Commands ENDP
  1355. ;=============================================================================
  1356.  
  1357.  
  1358. ;=============================================================================
  1359. MIXUP_CHANNELS PROC NEAR
  1360.     CMP    MOD_STAT,3        ;MOD HAS FINISHED
  1361.     JB    SHORT GMX7
  1362.     XOR    AX,AX
  1363.     XOR    BX,BX
  1364.     MOV    CX,MAX_CHAN_NUMB
  1365. LMX4:    MOV    [MSEG+BX],AX
  1366.     INC    BX
  1367.     INC    BX
  1368.     LOOP    LMX4
  1369. GMX7:    MOV    CX,DMA_CX
  1370.     CMP    MOD_STAT,2
  1371.     JB    SHORT GMX3
  1372.     MOVZX    SI,DMA_CHANNEL
  1373.     MOVZX    DX,[DMA_FLIP+SI]
  1374.     OUT    DX,AL            ;FLIP-FLOP CLEAR
  1375.     MOVZX    DX,[DMA_ADR+SI]
  1376.     IN    AL,DX            ;GET DMA POSITION
  1377.     XCHG    AL,AH
  1378.     IN    AL,DX
  1379.     XCHG    AL,AH
  1380.     SUB    AX,DMA_POFF        ;AX IS OFFSET OF DMA-POS
  1381.     CMP    SI,4
  1382.     JB    SHORT GMX0
  1383.     SHL    AX,1
  1384. GMX0:    AND    AX,0FFFEH
  1385.     ADD    AX,DMA_MORE
  1386.     CMP    AX,DMA_MAX
  1387.     JB    SHORT GMX1
  1388.     SUB    AX,DMA_MAX
  1389. GMX1:    ADD    AX,DMA_OFFSET
  1390.     SUB    AX,DMA_PTR
  1391.     JNC    SHORT GMX2
  1392.     ADD    AX,DMA_MAX
  1393. GMX2:    MOV    CX,AX            ;CX IS NUMBER OF BYTES TO CALCULATE
  1394.     ADD    AX,DMA_PTR
  1395.     SUB    AX,DMA_OFFSET
  1396.     SUB    AX,8000H
  1397.     JC    SHORT GMX3
  1398.     SUB    CX,AX
  1399.  
  1400. GMX3:    CMP    IRQ_REENTER,1        ;OVERLOAD?
  1401.     JA    GMX20
  1402.     XOR    BX,BX
  1403.     XOR    DI,DI
  1404.     CLD
  1405.     SHR    CX,2
  1406.     CMP    CX,40H
  1407.     JB    GMX5
  1408.     CALL    MIX_CHANNELA
  1409.     INC    BX
  1410.     INC    DI
  1411.     INC    DI
  1412. LMX1:    CALL    MIX_CHANNELM        ;MIX CHANNELS
  1413.     INC    BX
  1414.     INC    DI
  1415.     INC    DI
  1416.     CMP    BX,CH_NUMB
  1417.     JB    LMX1
  1418.     CALL    EMS_SAVE
  1419.     XOR    BX,BX
  1420.     XOR    DI,DI
  1421. LMX2:    CALL    MIX_CHANNELS        ;MIX FX CHANNELS
  1422.     ADD    BX,4
  1423.     INC    DI
  1424.     INC    DI
  1425.     CMP    DI,2*FX_CHAN_NUMB
  1426.     JB    LMX2
  1427.     CALL    EMS_RESTORE
  1428.     MOV    AX,DMA_NEWPTR        ;CHECK DMA-BUFFER OVERFLOW
  1429.     MOV    SI,DMA_MAX        ;ITS A RING BUFFER
  1430.     ADD    SI,DMA_OFFSET
  1431.     CMP    AX,SI
  1432.     JB    SHORT GMX4
  1433.     MOV    CX,AX
  1434.     MOV    DI,DMA_OFFSET
  1435.     SUB    CX,SI
  1436.     JZ    SHORT GMX6
  1437.     CLD
  1438.     SHR    CX,1
  1439.     PUSH    DS
  1440.     MOV    ES,DMA_SEG
  1441.     MOV    DS,DMA_SEG
  1442.     REP MOVSW            ;MOVE OVERFLOW DATA
  1443.     POP    DS
  1444. GMX6:    MOV    AX,DI
  1445. GMX4:    MOV    DMA_PTR,AX        ;START DSP OUTPUT
  1446.     CMP    MOD_STAT,1
  1447.     JNE    SHORT GMX5
  1448.     INC    MOD_STAT
  1449.     CALL    DSP_OUT
  1450.     JMP    SHORT GMX5
  1451. GMX20:    MOV    AX,DMA_NEWPTR        ;IF OVERLOADED JUST CLEAR SOUND
  1452.     SUB    AX,DMA_PTR
  1453.     SUB    CX,AX
  1454.     XOR    AX,AX
  1455.     CLD
  1456.     SHR    CX,1
  1457.     JZ    SHORT GMX5
  1458.     MOV    ES,DMA_SEG
  1459.     MOV    DI,DMA_NEWPTR
  1460.     REP STOSW
  1461.     MOV    DMA_NEWPTR,DI
  1462. GMX5:    RET
  1463. MIXUP_CHANNELS ENDP
  1464. ;-----------------------------------------------------------------------------
  1465. MIX_CHANNELA PROC NEAR
  1466.     PUSH    CX BX DI
  1467.     MOV    AX,[MFIXED+DI]        ;OFF ADD AFTER FIXED POINT (X/256)
  1468.     MOV    WORD PTR MIXAS4+2,AX
  1469.     MOV    DX,[MFREQ+DI]        ;OFF ADD AFTER FIXED POINT (X/256)
  1470.     MOV    BYTE PTR MIXAS5+2,DL
  1471.     MOV    WORD PTR MIXAS2,01A72H    ;JB SHORT +26
  1472.     OR    DL,DL
  1473.     JNZ    SHORT MIXA_NOIP
  1474.     MOV    WORD PTR MIXAS2,0C38BH    ;MOV AX,BX
  1475. MIXA_NOIP:
  1476.     MOV    BP,MIXMUL_OFFSET
  1477.     MOV    WORD PTR MIXAS3+2,BP
  1478.     MOV    AL,[MVOL+BX]        ;SAMPLE VOLUME
  1479.     MOV    DL,MUSIC_VOL        ;MASTER VOLUME
  1480.     MOV    BL,[MPANNING+BX]
  1481.     MUL    DL
  1482.     SHL    BX,1
  1483.     MOV    SI,AX
  1484.     MOV    DX,[PANNINGL+BX]
  1485.     MUL    DX
  1486.     SHL    DX,9
  1487.     ADD    DX,BP
  1488.     MOV    WORD PTR MIXAS6+2,DX
  1489.     MOV    AX,SI
  1490.     MOV    DX,[PANNINGR+BX]
  1491.     MUL    DX
  1492.     SHL    DX,9
  1493.     ADD    DX,BP
  1494.     MOV    WORD PTR MIXAS7+2,DX
  1495.     MOV    DX,[MOFLOW+DI]        ;ACTUAL AFTER FIXED POINT VALUE
  1496.     MOV    SI,[MOFS+DI]        ;GET OFFSET IN SAMPLE (START=0)
  1497.     MOV    ES,[MSEG+DI]
  1498.     MOV    AX,[MMAXREP+DI]        ;OFFSET OF SAMPLE ENDING
  1499.     DEC    AX
  1500.     MOV    WORD PTR MIXAS1+2,AX
  1501.     JMP    SHORT CLEAR_PREF1    ;CLEAR PREFETCH QUEUE!!!
  1502. CLEAR_PREF1:
  1503.     MOV    DI,DMA_PTR
  1504.     MOV    DS,DMA_SEG        ;DS:DI IS DMA-BUFFER POINTER
  1505.     MOV    AX,ES
  1506.     OR    AX,AX
  1507.     JZ    SHORT SILENTA_FILL
  1508. MIXA_LOOP:
  1509. MIXAS1:    CMP    SI,0F000H        ;SMCODE FOR SAMPLE END
  1510.     JAE    SHORT RESTA_FILL
  1511.     MOV    BX,ES:[SI]        ;GET SAMPLE BYTES
  1512.     XCHG    BL,BH
  1513.  
  1514. MIXAS2:    MOV    AX,BX            ;SMCODE FOR JB +XX
  1515.     SAR    BL,1            ;BEGIN INTERPOLATION
  1516.     SAR    BH,1
  1517.     XOR    AL,AL
  1518.     SUB    BL,BH
  1519.     MOV    BH,DH
  1520.     SHR    BH,2
  1521.     SHL    BX,1
  1522. MIXAS3:    ADD    BX,0F000H        ;SMCODE FOR MIXMUL TABLE OFFSET
  1523.     MOV    BX,[BX]
  1524.     SAL    BX,2
  1525.     ADD    BX,AX            ;END INTERPOLATION
  1526.  
  1527.     SHR    BX,7            ;CALCULATE VOLUMES
  1528.     AND    BX,0000000111111110B
  1529. MIXAS4:    ADD    DX,0F000H        ;SMCODE FOR FIXED POINT
  1530. MIXAS5:    ADC    SI,0            ;SMCODE FOR SAMPLE POINTER
  1531. MIXAS6:    MOV    AX,[0F000H+BX]        ;SMCODE FOR VOLUME TABLE OFFSET LEFT
  1532. MIXAS7:    MOV    BP,[0F000H+BX]        ;SMCODE FOR VOLUME TABLE OFFSET RIGHT
  1533. MOVA1:    MOV    [DI],AX            ;SMCODE
  1534.     MOV    BX,BP
  1535.     INC    DI
  1536. NOP1:    INC    DI            ;SMCODE
  1537. MOVB1:    MOV    [DI],BX            ;SMCODE
  1538.     INC    DI
  1539. NOP2:    INC    DI            ;SMCODE
  1540.     LOOP    MIXA_LOOP
  1541. MIXA_END:
  1542.     MOV    AX,CS
  1543.     MOV    DS,AX
  1544.     MOV    AX,ES
  1545.     MOV    DMA_NEWPTR,DI
  1546.     POP    DI BX CX
  1547.     MOV    [MSEG+DI],AX
  1548.     MOV    [MOFLOW+DI],DX
  1549.     MOV    [MOFS+DI],SI
  1550.     RET
  1551. RESTA_FILL:
  1552.     POP    BP
  1553.     PUSH    BP
  1554.     MOV    AX,CS:[MREPLEN+BP]
  1555.     OR    AX,AX
  1556.     JZ    SHORT SILENTA_FILL
  1557.     MOV    CS:[MMAXREP+BP],AX
  1558.     DEC    AX
  1559.     MOV    WORD PTR CS:MIXAS1+2,AX
  1560.     MOV    SI,CS:[MREPEAT+BP]
  1561.     JMP    MIXA_LOOP
  1562. SILENTA_FILL:
  1563.     MOV    BX,DS
  1564.     MOV    ES,BX
  1565.     SHL    CX,1
  1566.     REP STOSW
  1567.     MOV    ES,AX
  1568.     JMP    MIXA_END
  1569. MIX_CHANNELA ENDP
  1570. ;-----------------------------------------------------------------------------
  1571. MIX_CHANNELM PROC NEAR
  1572.     PUSH    CX BX DI
  1573.     MOV    AX,[MFIXED+DI]        ;OFF ADD AFTER FIXED POINT (X/256)
  1574.     MOV    WORD PTR MIXMS4+2,AX
  1575.     MOV    DX,[MFREQ+DI]        ;OFF ADD AFTER FIXED POINT (X/256)
  1576.     MOV    BYTE PTR MIXMS5+2,DL
  1577.     MOV    WORD PTR MIXMS2,01A72H    ;JB SHORT +26
  1578.     OR    DL,DL
  1579.     JNZ    SHORT MIXM_NOIP
  1580.     MOV    WORD PTR MIXMS2,0C38BH    ;MOV AX,BX
  1581. MIXM_NOIP:
  1582.     MOV    BP,MIXMUL_OFFSET
  1583.     MOV    WORD PTR MIXMS3+2,BP
  1584.     MOV    AL,[MVOL+BX]        ;SAMPLE VOLUME
  1585.     MOV    DL,MUSIC_VOL        ;MASTER VOLUME
  1586.     MOV    BL,[MPANNING+BX]
  1587.     MUL    DL
  1588.     SHL    BX,1
  1589.     MOV    SI,AX
  1590.     MOV    DX,[PANNINGL+BX]
  1591.     MUL    DX
  1592.     SHL    DX,9
  1593.     ADD    DX,BP
  1594.     MOV    WORD PTR MIXMS6+2,DX
  1595.     MOV    AX,SI
  1596.     MOV    DX,[PANNINGR+BX]
  1597.     MUL    DX
  1598.     SHL    DX,9
  1599.     ADD    DX,BP
  1600.     MOV    WORD PTR MIXMS7+2,DX
  1601.     MOV    DX,[MOFLOW+DI]        ;ACTUAL AFTER FIXED POINT VALUE
  1602.     MOV    SI,[MOFS+DI]        ;GET OFFSET IN SAMPLE (START=0)
  1603.     MOV    ES,[MSEG+DI]
  1604.     MOV    AX,[MMAXREP+DI]        ;OFFSET OF SAMPLE ENDING
  1605.     DEC    AX
  1606.     MOV    WORD PTR MIXMS1+2,AX
  1607.     JMP    SHORT CLEAR_PREF2    ;CLEAR PREFETCH QUEUE!!!
  1608. CLEAR_PREF2:
  1609.     MOV    DI,DMA_PTR
  1610.     MOV    DS,DMA_SEG        ;DS:DI IS DMA-BUFFER POINTER
  1611.     MOV    AX,ES
  1612.     OR    AX,AX
  1613.     JZ    SHORT MIXM_END
  1614. MIXM_LOOP:
  1615. MIXMS1:    CMP    SI,0F000H        ;SMCODE FOR SAMPLE END
  1616.     JAE    SHORT RESTM_FILL
  1617.     MOV    BX,ES:[SI]        ;GET SAMPLE BYTES
  1618.     XCHG    BL,BH
  1619.  
  1620. MIXMS2:    MOV    AX,BX            ;SMCODE FOR JB +XX
  1621.     SAR    BL,1            ;BEGIN INTERPOLATION
  1622.     SAR    BH,1
  1623.     XOR    AL,AL
  1624.     SUB    BL,BH
  1625.     MOV    BH,DH
  1626.     SHR    BH,2
  1627.     SHL    BX,1
  1628. MIXMS3:    ADD    BX,0F000H        ;SMCODE FOR MIXMUL TABLE OFFSET
  1629.     MOV    BX,[BX]
  1630.     SAL    BX,2
  1631.     ADD    BX,AX            ;END INTERPOLATION
  1632.  
  1633.     SHR    BX,7            ;CALCULATE VOLUMES
  1634.     AND    BX,0000000111111110B
  1635. MIXMS4:    ADD    DX,0F000H        ;SMCODE FOR FIXED POINT
  1636. MIXMS5:    ADC    SI,0            ;SMCODE FOR SAMPLE POINTER
  1637. MIXMS6:    MOV    AX,[0F000H+BX]        ;SMCODE FOR VOLUME TABLE OFFSET LEFT
  1638. MIXMS7:    MOV    BP,[0F000H+BX]        ;SMCODE FOR VOLUME TABLE OFFSET RIGHT
  1639. ADDA2:    ADD    [DI],AX            ;SMCODE
  1640.     JNO    SHORT MIXMG1
  1641.     SHR    AX,15
  1642.     ADD    AX,7FFFH
  1643. MOVA2:    MOV    [DI],AX            ;SMCODE
  1644. MIXMG1:    MOV    BX,BP
  1645.     INC    DI
  1646. NOP3:    INC    DI            ;SMCODE
  1647. ADDB2:    ADD    [DI],BX            ;SMCODE
  1648.     JNO    SHORT MIXMG2
  1649.     SHR    BX,15
  1650.     ADD    BX,7FFFH
  1651. MOVB2:    MOV    [DI],BX            ;SMCODE
  1652. MIXMG2:    INC    DI
  1653. NOP4:    INC    DI            ;SMCODE
  1654.     LOOP    MIXM_LOOP
  1655. MIXM_END:
  1656.     MOV    AX,CS
  1657.     MOV    DS,AX
  1658.     MOV    AX,ES
  1659.     POP    DI BX CX
  1660.     MOV    [MSEG+DI],AX
  1661.     MOV    [MOFLOW+DI],DX
  1662.     MOV    [MOFS+DI],SI
  1663.     RET
  1664. RESTM_FILL:
  1665.     POP    BP
  1666.     PUSH    BP
  1667.     MOV    AX,CS:[MREPLEN+BP]
  1668.     OR    AX,AX
  1669.     JZ    SHORT SILENTM_FILL
  1670.     MOV    CS:[MMAXREP+BP],AX
  1671.     DEC    AX
  1672.     MOV    WORD PTR CS:MIXMS1+2,AX
  1673.     MOV    SI,CS:[MREPEAT+BP]
  1674.     JMP    MIXM_LOOP
  1675. SILENTM_FILL:
  1676.     MOV    ES,AX
  1677.     JMP    MIXM_END
  1678. MIX_CHANNELM ENDP
  1679. ;-----------------------------------------------------------------------------
  1680. MIX_CHANNELS PROC NEAR
  1681.     CMP    [SAM_SEG+DI],0
  1682.     JE    GO_BACKS
  1683.     PUSH    EAX
  1684.     MOV    EAX,[SAM_OFS+BX]
  1685.     CALL    EMS_PAGING
  1686.     POP    EAX
  1687.     PUSH    SI CX BX DI
  1688.     MOV    AX,[SAM_FIX+DI]        ;OFF ADD AFTER FIXED POINT (X/256)
  1689.     MOV    WORD PTR MIXSS4+2,AX
  1690.     MOV    DX,[SAM_FRQ+DI]        ;OFF ADD AFTER FIXED POINT (X/256)
  1691.     MOV    BYTE PTR MIXSS5+2,DL
  1692.     MOVZX    AX,FX_VOL        ;MASTER VOLUME
  1693.     MOV    BX,[SAM_PAN+DI]
  1694.     SHL    AX,6
  1695.     SHL    BX,1
  1696.     MOV    BP,AX
  1697.     MOV    DX,[PANNINGL+BX]
  1698.     MUL    DX
  1699.     SHL    DX,9
  1700.     ADD    DX,MIXMUL_OFFSET
  1701.     MOV    WORD PTR MIXSS6+2,DX
  1702.     MOV    AX,BP
  1703.     MOV    DX,[PANNINGR+BX]
  1704.     MUL    DX
  1705.     SHL    DX,9
  1706.     ADD    DX,MIXMUL_OFFSET
  1707.     MOV    WORD PTR MIXSS7+2,DX
  1708.     MOV    DX,[SAM_OFL+DI]        ;ACTUAL AFTER FIXED POINT VALUE
  1709.     MOV    AX,SI            ;OFFSET OF SAMPLE ENDING
  1710.     ADD    AX,[SAM_MAX+DI]
  1711.     JNC    SHORT MIXSG3
  1712.     XOR    AX,AX
  1713.     DEC    AX
  1714. MIXSG3:    MOV    WORD PTR MIXSS1+2,AX
  1715.     JMP    SHORT CLEAR_PREF3    ;CLEAR PREFETCH QUEUE!!!
  1716. CLEAR_PREF3:
  1717.     MOV    DI,DMA_PTR
  1718.     MOV    DS,DMA_SEG        ;DS:DI IS DMA-BUFFER POINTER
  1719. MIXS_LOOP:
  1720. MIXSS1:    CMP    SI,0F000H        ;SMCODE FOR SAMPLE END
  1721.     JAE    SHORT RESTS_FILL
  1722.     MOV    BL,ES:[SI]        ;GET SAMPLE BYTES
  1723.     XOR    BH,BH
  1724.     SHL    BX,1            ;CALCULATE VOLUMES
  1725. MIXSS4:    ADD    DX,0F000H        ;SMCODE FOR FIXED POINT
  1726. MIXSS5:    ADC    SI,0            ;SMCODE FOR SAMPLE POINTER
  1727. MIXSS6:    MOV    AX,[0F000H+BX]        ;SMCODE FOR VOLUME TABLE OFFSET LEFT
  1728. MIXSS7:    MOV    BP,[0F000H+BX]        ;SMCODE FOR VOLUME TABLE OFFSET RIGHT
  1729. ADDA3:    ADD    [DI],AX            ;SMCODE
  1730.     JNO    SHORT MIXSG1
  1731.     SHR    AX,15
  1732.     ADD    AX,7FFFH
  1733. MOVA3:    MOV    [DI],AX            ;SMCODE
  1734. MIXSG1:    MOV    BX,BP
  1735.     INC    DI
  1736. NOP5:    INC    DI            ;SMCODE
  1737. ADDB3:    ADD    [DI],BX            ;SMCODE
  1738.     JNO    SHORT MIXSG2
  1739.     SHR    BX,15
  1740.     ADD    BX,7FFFH
  1741. MOVB3:    MOV    [DI],BX            ;SMCODE
  1742. MIXSG2:    INC    DI
  1743. NOP6:    INC    DI            ;SMCODE
  1744.     LOOP    MIXS_LOOP
  1745. MIXS_END:
  1746.     MOV    AX,CS
  1747.     MOV    DS,AX
  1748.     POP    DI BX CX AX
  1749.     MOV    [SAM_OFL+DI],DX
  1750.     SUB    SI,AX
  1751.     PUSH    EAX
  1752.     MOVZX    EAX,SI
  1753.     ADD    [SAM_OFS+BX],EAX
  1754.     SUB    [SAM_MAX+DI],AX
  1755.     JZ    SHORT MIXS_SAMPEND
  1756.     JNC    SHORT MIXS_SAMPOK
  1757. MIXS_SAMPEND:
  1758.     MOV    [SAM_SEG+DI],0
  1759. MIXS_SAMPOK:
  1760.     POP    EAX
  1761. GO_BACKS:
  1762.     RET
  1763. RESTS_FILL:
  1764.     POP    DI
  1765.     PUSH    DI
  1766.     MOV    CS:[SAM_SEG+DI],0
  1767.     JMP    MIXS_END
  1768. MIX_CHANNELS ENDP
  1769. ;-----------------------------------------------------------------------------
  1770. ; SET EMS-PAGES
  1771. ; IN:  EAX= EMS-OFFSET
  1772. ; OUT: ES:SI= SEGMENT & OFFSET IN EMS PAGE
  1773. ;-----------------------------------------------------------------------------
  1774. EMS_PAGING PROC NEAR
  1775.     MOV    SI,AX
  1776.     AND    SI,3FFFH
  1777.     MOV    ES,EMS_SEG
  1778.     PUSHA
  1779.     PUSH    EAX
  1780.     SHR    EAX,14
  1781.     MOV    BX,AX
  1782.     XOR    AL,AL
  1783.     MOV    DX,EMS_HANDLE
  1784.     MOV    AH,44H
  1785.     INT    67H
  1786.     INC    AL
  1787.     INC    BX
  1788.     MOV    AH,44H
  1789.     INT    67H
  1790.     INC    AL
  1791.     INC    BX
  1792.     MOV    AH,44H
  1793.     INT    67H
  1794.     INC    AL
  1795.     INC    BX
  1796.     MOV    AH,44H
  1797.     INT    67H
  1798.     POP    EAX
  1799.     POPA
  1800.     RET
  1801. EMS_PAGING ENDP
  1802. ;-----------------------------------------------------------------------------
  1803. EMS_SAVE PROC NEAR
  1804.     PUSH    AX DX
  1805.     MOV    DX,EMS_HANDLE        ;EMS MAPPING SICHERN
  1806.     MOV    AH,47H
  1807.     INT    67H
  1808.     POP    DX AX
  1809.     RET
  1810. EMS_SAVE ENDP
  1811. ;-----------------------------------------------------------------------------
  1812. EMS_RESTORE PROC NEAR
  1813.     PUSH    AX DX
  1814.     MOV    DX,EMS_HANDLE        ;EMS MAPPING ZURÜCKSETZEN
  1815.     MOV    AH,48H
  1816.     INT    67H
  1817.     POP    DX AX
  1818.     RET
  1819. EMS_RESTORE ENDP
  1820. ;╒═══════════════════════════════════════════════════════════════════════════╕
  1821. ;│ DESCRIPTION: Calculates the values for the mixing multiplication table.   │
  1822. ;│              This table is used during 4/8-channel mixing to speed up the │
  1823. ;│              operation by avoiding 'mul' instructions.                    │
  1824. ;╘═══════════════════════════════════════════════════════════════════════════╛
  1825. MAKE_MIXMUL_VOLUMETABLE PROC NEAR
  1826.     MOV    ES,DMA_SEG
  1827.     MOV    DI,MIXMUL_OFFSET
  1828.     CLD
  1829.     XOR    BX,BX            ; start with volume 0
  1830.     INC    BH
  1831. VOLUMELOOP:                ; start with sample 0
  1832. SAMPLELOOP:
  1833.     MOV    AL,BL
  1834.     IMUL    BH
  1835.     SAL    AX,1
  1836.     CMP    BH,1
  1837.     JA    SHORT GMK1
  1838.     XOR    AX,AX
  1839. GMK1:    STOSW
  1840.     INC    BL
  1841.     JNZ    SAMPLELOOP
  1842.     INC    BH
  1843.     CMP    BH,64
  1844.     JBE    VOLUMELOOP
  1845.     RET
  1846. MAKE_MIXMUL_VOLUMETABLE ENDP
  1847. ;=============================================================================
  1848.  
  1849.  
  1850. ;=============================================================================
  1851. ;
  1852. ; DOS ROUTINEN
  1853. ;
  1854. ;=============================================================================
  1855. ;-----------------------------------------------------------------------------
  1856. ; TIMER-IRQ-HANDLER: 1024 HZ CALLING FREQUENCE
  1857. ;-----------------------------------------------------------------------------
  1858. TIMER_HANDLER PROC FAR
  1859.     PUSH    AX
  1860.     CMP    CS:SYSTEM,0
  1861.     JNE    SHORT WT6
  1862.     MOV    AL,UHR_STATC
  1863.     OUT    UHR_INDEX,AL
  1864.     JMP    SHORT WT1
  1865. WT1:    JMP    SHORT WT2
  1866. WT2:    IN    AL,UHR_PORT
  1867.     MOV    AL,20H
  1868.     OUT    IRQ3,AL
  1869. WT6:    MOV     AL,20H
  1870.     OUT    IRQ1,AL
  1871.     STI
  1872.     CMP    CS:MOD_STAT,0
  1873.     JE    SHORT WT3
  1874.     MOV    AX,WORD PTR CS:[BPM_SPEED+2]    ;1024/20.48 = 50 HZ
  1875.     ADD    WORD PTR CS:[BPM_COUNT+2],AX
  1876.     MOV    AX,WORD PTR CS:[BPM_SPEED]
  1877.     ADC    WORD PTR CS:[BPM_COUNT],AX
  1878.     JNC    SHORT WT3
  1879.     PUSHA
  1880.     PUSH    DS ES CS
  1881.     POP    DS
  1882.     INC    IRQ_REENTER
  1883.     CALL    CONTROL_CHANNELS
  1884. ;    MOV    AH,7
  1885. ;    CALL    RASTER_COL
  1886.     CALL    MIXUP_CHANNELS
  1887. ;    MOV    AH,0
  1888. ;    CALL    RASTER_COL
  1889.     TEST    PAS_MODUS,2
  1890.     JZ    SHORT WT5
  1891.     MOV    MOD_STAT,4
  1892.     JMP    SHORT WT4
  1893. WT5:    CMP    MOD_STAT,4
  1894.     JB    SHORT WT4
  1895.     MOV    MOD_STAT,2
  1896. WT4:    DEC    IRQ_REENTER
  1897.     POP    ES DS
  1898.     POPA
  1899. WT3:    POP    AX
  1900.     CMP    CS:VAR_BUFSEG,0
  1901.     JNE    SHORT WT8
  1902.     CMP    CS:SYSTEM,0
  1903.     JE    SHORT WT7
  1904.     DEC    CS:IRQCOUNT
  1905.     JNZ    SHORT WT7
  1906.     MOV    CS:IRQCOUNT,56
  1907. WT8:    JMP    DWORD PTR CS:[HOLD70]
  1908. WT7:    IRET
  1909. TIMER_HANDLER ENDP
  1910. ;-----------------------------------------------------------------------------
  1911. ; PAS-IRQ-HANDLER
  1912. ;-----------------------------------------------------------------------------
  1913. PASIRQ_HANDLER PROC FAR
  1914.     PUSH    AX DX
  1915.     MOV    DX,INTRCTLRST        ; clear the interrupt
  1916.     XOR    DX,CS:PAS_BASE        ; xlate the board address
  1917.     IN    AL,DX
  1918.     TEST    AL,bISsampbuff        ; our interrupt?
  1919.     JZ    SHORT NOT_PASIRQ    ; no, continue on...
  1920.     OUT    DX,AL            ; yes, flush it...
  1921.     MOV    AL,20H
  1922.     CMP    CS:IRQ_NUMBER,8
  1923.     JB    SHORT GSBI1
  1924.     OUT    IRQ3,AL
  1925. GSBI1:    OUT    IRQ1,AL
  1926.     POP    DX AX
  1927.     IRET
  1928. NOT_PASIRQ:
  1929.     POP    DX AX
  1930.     JMP    DWORD PTR CS:[HOLDPAS]
  1931. PASIRQ_HANDLER ENDP
  1932. ;-----------------------------------------------------------------------------
  1933. ; SERVICE IRQ UMLEITUNG; USES THE REAL-TIME-CLOCK IRQ
  1934. ;-----------------------------------------------------------------------------
  1935. IRQ_INIT PROC NEAR
  1936.     CLI
  1937.     XOR     AX,AX
  1938.     MOV     ES,AX
  1939.     CMP    SYSTEM,0
  1940.     JNE    WU11
  1941.     MOV     AX,COMP_SPEED2        ;XCHANGE INIT & STOP DATA FOR DOS
  1942.     MOV     DX,COMP_SPEED3
  1943.     MOV     COMP_SPEED2,DX
  1944.     MOV     COMP_SPEED3,AX
  1945.     CMP    VAR_BUFSEG,0
  1946.     JNE    SHORT WU13
  1947.     MOV    AL,UHR_STATA        ;UHR-IRQ-RATE EINSTELLEN (1024 HZ)
  1948.     OUT    UHR_INDEX,AL
  1949.     JMP    SHORT WU1
  1950. WU1:    JMP    SHORT WU2
  1951. WU2:    XCHG    AL,AH
  1952.     IN    AL,UHR_PORT
  1953.     AND    AL,0F0H
  1954.     OR    AL,DL
  1955.     XCHG    AL,AH
  1956.     OUT    UHR_INDEX,AL
  1957.     JMP    SHORT WU3
  1958. WU3:    JMP    SHORT WU4
  1959. WU4:    XCHG    AL,AH
  1960.     OUT    UHR_PORT,AL
  1961.     JMP    SHORT WU5
  1962. WU5:    JMP    SHORT WU6
  1963. WU6:    MOV    AL,UHR_STATB        ;UHR-IRQ-MODUS EINSTELLEN
  1964.     OUT    UHR_INDEX,AL
  1965.     JMP    SHORT WU7
  1966. WU7:    JMP    SHORT WU8
  1967. WU8:    XCHG    AL,AH
  1968.     IN    AL,UHR_PORT
  1969.     AND    AL,08FH
  1970.     MOV    DL,DH
  1971.     AND    DL,40H
  1972.     OR    AL,DL
  1973.     XCHG    AL,AH
  1974.     OUT    UHR_INDEX,AL
  1975.     JMP    SHORT WU9
  1976. WU9:    JMP    SHORT WU10
  1977. WU10:    XCHG    AL,AH
  1978.     OUT    UHR_PORT,AL
  1979.     IN    AL,IRQ4            ;IRQ8 DE-/MASKIEREN
  1980.     AND    AL,0FEH
  1981.     MOV    DL,DH
  1982.     AND    DL,1
  1983.     OR    AL,DL
  1984.     OUT    IRQ4,AL
  1985. WU13:    MOV    DL,DH
  1986.     AND    DL,1
  1987.     MOV    CL,IRQ_NUMBER
  1988.     CMP    CL,8
  1989.     JAE    SHORT WU20
  1990.     IN    AL,IRQ2            ;SBIRQ 0-7 DE-/MASKIEREN
  1991.     SHL    DL,CL
  1992.     MOV    DH,0FEH
  1993.     ROL    DH,CL
  1994.     AND    AL,DH
  1995.     OR    AL,DL
  1996.     OUT    IRQ2,AL
  1997.     JMP    SHORT WU21
  1998. WU20:    SUB    CL,8            ;SBIRQ 8-15 DE-/MASKIEREN
  1999.     IN    AL,IRQ4
  2000.     SHL    DL,CL
  2001.     MOV    DH,0FEH
  2002.     ROL    DH,CL
  2003.     AND    AL,DH
  2004.     OR    AL,DL
  2005.     OUT    IRQ4,AL
  2006. WU21:    MOV     BX,4*70H                ;UHR-IRQ VERBIEGEN
  2007.     MOV     EAX,ES:[BX]
  2008.     MOV     EDX,HOLD70
  2009.     MOV     ES:[BX],EDX
  2010.     MOV     HOLD70,EAX
  2011.     JMP    WU12
  2012. WU11:    CMP    VAR_BUFSEG,0
  2013.     JNE    SHORT WU14
  2014.     MOV     AX,COMP_SPEED4        ;FOR WINDOWS
  2015.     MOV     DX,COMP_SPEED5
  2016.     MOV     COMP_SPEED4,DX
  2017.     MOV     COMP_SPEED5,AX
  2018.     MOV     AL,00110110B            ;TIMER0 AUF 1.024 KHZ EINSTELLEN
  2019.     OUT     PIT1,AL                 ;TEILER=1193
  2020.     MOV     AL,DL
  2021.     OUT     TIMER0,AL
  2022.     JMP     SHORT OUT40
  2023. OUT40:  MOV     AL,DH
  2024.     OUT     TIMER0,AL
  2025. WU14:    MOV     AX,COMP_SPEED2        ;XCHANGE INIT & STOP DATA FOR DOS
  2026.     MOV     DX,COMP_SPEED3
  2027.     MOV     COMP_SPEED2,DX
  2028.     MOV     COMP_SPEED3,AX
  2029.     MOV    DL,DH
  2030.     AND    DL,1
  2031.     MOV    CL,IRQ_NUMBER
  2032.     CMP    CL,8
  2033.     JAE    SHORT WU30
  2034.     IN    AL,IRQ2            ;SBIRQ 0-7 DE-/MASKIEREN
  2035.     SHL    DL,CL
  2036.     MOV    DH,0FEH
  2037.     ROL    DH,CL
  2038.     AND    AL,DH
  2039.     OR    AL,DL
  2040.     OUT    IRQ2,AL
  2041.     JMP    SHORT WU31
  2042. WU30:    SUB    CL,8
  2043.     IN    AL,IRQ4            ;SBIRQ 8-15 DE-/MASKIEREN
  2044.     SHL    DL,CL
  2045.     MOV    DH,0FEH
  2046.     ROL    DH,CL
  2047.     AND    AL,DH
  2048.     OR    AL,DL
  2049.     OUT    IRQ4,AL
  2050. WU31:    MOV     BX,4*8H                 ;TIMEOUT-IRQ VERBIEGEN
  2051.     MOV     EAX,ES:[BX]
  2052.     MOV     EDX,HOLD70
  2053.     MOV     ES:[BX],EDX
  2054.     MOV     HOLD70,EAX
  2055. WU12:    MOVZX    BX,CL            ;SOUNDBLASTER-IRQ VERBIEGEN
  2056.     ADD    BX,08H
  2057.     CMP    IRQ_NUMBER,8
  2058.     JB    SHORT WU40
  2059.     ADD    BX,68H
  2060. WU40:    SHL    BX,2
  2061.     MOV     EAX,ES:[BX]
  2062.     MOV     EDX,HOLDPAS
  2063.     MOV     ES:[BX],EDX
  2064.     MOV     HOLDPAS,EAX
  2065.     MOV    AL,20H
  2066.     OUT    IRQ3,AL
  2067.     OUT    IRQ1,AL
  2068.     STI
  2069.     RET
  2070. IRQ_INIT ENDP
  2071. ;----------------------------------------------------------------------------
  2072. ; RESERVIERT SPEICHER FÜR TRACKS, CARRY-FLAG 0=OK 1=ABBRUCH
  2073. ;----------------------------------------------------------------------------
  2074. SET_TMEM PROC NEAR
  2075.     XOR    SI,SI
  2076.     XOR    AX,AX            ;CHECK FOR EMS-MANAGER
  2077.     MOV    ES,AX
  2078.     MOV    TRACK_HANDLE,AX
  2079.     MOV    AX,ES:[4*67H+2]
  2080.     MOV    ES,AX
  2081.     CMP    ES:[10],"XMME"
  2082.     JNE    SHORT STCM1
  2083.     CMP    ES:[14],"0XXX"
  2084.     JNE    SHORT STCM1
  2085.     MOV    AH,42H
  2086.     INT    67H
  2087.     OR    AH,AH
  2088.     JNZ    SHORT STCM1
  2089.     CMP    BX,4
  2090.     JB    SHORT STCM1
  2091.     MOV    AH,41H
  2092.     INT    67H
  2093.     MOV    TRACK_SEG,BX
  2094.     MOV    AH,43H            ;ALLOCATE 64K EMS FOR TRACK BUFFER
  2095.     MOV    BX,4
  2096.     INT    67H
  2097.     MOV    TRACK_HANDLE,DX
  2098.     MOV    AH,48H
  2099.     MOV    BX,80H            ;2K PATTERN BUFFER
  2100.     INT    21H
  2101.     JC    SHORT STCM1
  2102.     MOV    PATTERN_SEG,AX
  2103.     CLC
  2104.     RET
  2105. STCM1:    STC
  2106.     RET
  2107. SET_TMEM ENDP
  2108. ;----------------------------------------------------------------------------
  2109. ; GIBT SPEICHER VON TRACKS WIEDER FREI
  2110. ;----------------------------------------------------------------------------
  2111. FREE_TMEM PROC NEAR
  2112.     MOV    AX,SAMPLE_SEG
  2113.     MOV    ES,AX
  2114.     MOV    AH,49H
  2115.     INT    21H
  2116.     CMP    TRACK_SEG,0
  2117.     JE    SHORT GFTM1
  2118.     MOV    AH,45H
  2119.     MOV    DX,TRACK_HANDLE
  2120.     INT    67H
  2121.     MOV    TRACK_SEG,0
  2122. GFTM1:    RET
  2123. FREE_TMEM ENDP
  2124. ;-----------------------------------------------------------------------------
  2125. ; SET TRACK-PAGES
  2126. ;-----------------------------------------------------------------------------
  2127. TRACK_PAGING PROC NEAR
  2128.     PUSHA
  2129.     XOR    BX,BX
  2130.     XOR    AL,AL
  2131.     MOV    DX,TRACK_HANDLE
  2132.     MOV    AH,44H
  2133.     INT    67H
  2134.     INC    AL
  2135.     INC    BX
  2136.     MOV    AH,44H
  2137.     INT    67H
  2138.     INC    AL
  2139.     INC    BX
  2140.     MOV    AH,44H
  2141.     INT    67H
  2142.     INC    AL
  2143.     INC    BX
  2144.     MOV    AH,44H
  2145.     INT    67H
  2146.     POPA
  2147.     RET
  2148. TRACK_PAGING ENDP
  2149. ;-----------------------------------------------------------------------------
  2150. TRACK_SAVE PROC NEAR
  2151.     PUSH    AX DX
  2152.     MOV    DX,TRACK_HANDLE        ;EMS MAPPING SICHERN
  2153.     MOV    AH,47H
  2154.     INT    67H
  2155.     POP    DX AX
  2156.     RET
  2157. TRACK_SAVE ENDP
  2158. ;-----------------------------------------------------------------------------
  2159. TRACK_RESTORE PROC NEAR
  2160.     PUSH    AX DX
  2161.     MOV    DX,TRACK_HANDLE        ;EMS MAPPING ZURÜCKSETZEN
  2162.     MOV    AH,48H
  2163.     INT    67H
  2164.     POP    DX AX
  2165.     RET
  2166. TRACK_RESTORE ENDP
  2167. ;----------------------------------------------------------------------------
  2168. ; RESERVIERT SPEICHER FÜR DMA_BUFFER & MIXMUL_TABLE, CARRY 0=OK 1=ABBRUCH
  2169. ;----------------------------------------------------------------------------
  2170. SET_DMEM PROC NEAR
  2171.     MOV     AH,48H
  2172.     MOV     BX,1000H                ;64K BUFFER
  2173.     INT     21H
  2174.     JC      SHORT SDCM1
  2175.     MOV     DMA_SEG,AX
  2176.     MOV    DMA_OFFSET,0        ;DMA_BUFFER CA.  8K
  2177.     MOV    MIXMUL_OFFSET,8000H    ;MIXMUL_TAB CA. 16K
  2178.     AND    AX,0FFFH        ;ES IST DARAUF ZU ACHTEN, DASS
  2179.     CMP    AX,0800H        ;DER DMA_BUFFER VOLLSTÄNDIG IN
  2180.     JBE    SHORT SDCM2        ;EINER PAGE LIEGT
  2181.     MOV    DMA_OFFSET,8000H
  2182.     MOV    MIXMUL_OFFSET,0
  2183. SDCM2:    CLC
  2184. SDCM1:  RET
  2185. SET_DMEM ENDP
  2186. ;----------------------------------------------------------------------------
  2187. ; GIBT SPEICHER VON DMA & MIXMUL_VOLUMETABLE WIEDER FREI
  2188. ;----------------------------------------------------------------------------
  2189. FREE_DMEM PROC NEAR
  2190.     MOV    ES,DMA_SEG
  2191.     MOV    AH,49H
  2192.     INT    21H
  2193.     RET
  2194. FREE_DMEM ENDP
  2195. ;-----------------------------------------------------------------------------
  2196. FREE_MEM PROC NEAR
  2197.     MOV     BX,PROG_END_SEG         ;SPEICHER FREI MACHEN
  2198.     SUB     BX,PROG_START_SEG
  2199.     MOV     ES,PROG_START_SEG
  2200.     MOV     AH,4AH                  ;SPEICHERBLOCKGRÖSSE ÄNDERN
  2201.     INT     21H
  2202.     RET
  2203. FREE_MEM ENDP
  2204. ;=============================================================================
  2205.  
  2206.  
  2207. ;=============================================================================
  2208. ;
  2209. ; PRO AUDIO SPECTRUM PLUS/16 HARDWARE ROUTINEN
  2210. ;
  2211. ;=============================================================================
  2212. ; SET MIXER
  2213. ;-----------------------------------------------------------------------------
  2214. MIXER_INIT PROC NEAR
  2215.     MOV    DX,pAUDIOMIXR           ; parallel audio mixer interface
  2216.     MOV    AL,05H+90H        ; LEFT/RIGHT PCM MIXER VOLUME
  2217.     OUT    DX,AL
  2218.     MOV    AL,1FH            ; MAX VOLUME
  2219.     OUT    DX,AL
  2220. COMMENT *                ; KEEP THE DEFAULT
  2221.     MOV    AL,01H+80H        ; LEFT/RIGHT MASTER VOLUME
  2222.     OUT    DX,AL            ; write the index
  2223.     MOV    AL,1FH            ; MIDDLE VOLUME (MAX=3FH TOO LOUD)
  2224.     OUT    DX,AL            ; write the data
  2225.     *
  2226.     RET
  2227. MIXER_INIT ENDP
  2228. ;-----------------------------------------------------------------------------
  2229. ; SET DMA READY FOR TRANSFER WITH AUTOINIT
  2230. ; IN: DX:BX= BLOCKPOINTER, CX= SIZE
  2231. ;-----------------------------------------------------------------------------
  2232. DMA_INIT PROC NEAR
  2233.     CLI
  2234.     MOV    AX,DX            ;ADRESSE IN PAGE UND OFFSET UMRECHNEN
  2235.     SHL    DX,4
  2236.     SHR    AH,4            ;PAGE
  2237.     ADD    BX,DX            ;OFFSET NEU
  2238.     ADC    AH,0
  2239.     MOV    AL,AH
  2240.     MOVZX    SI,DMA_CHANNEL
  2241.     CMP    SI,4
  2242.     JB    SHORT GDMI1
  2243.     SHR    CX,1
  2244.     SHRD    BX,AX,1            ;ADRESSE FÜR 16-BIT DMA
  2245. GDMI1:    MOV    DMA_POFF,BX
  2246.     DEC    CX            ;DMA SIZE= BLOCK SIZE -1
  2247.     MOVZX    DX,[DMA_MASK+SI]
  2248.     MOV    AL,DMA_CHANNEL
  2249.     OR    AL,4
  2250.     OUT    DX,AL            ;DMA-KANAL MASKIEREN
  2251.     MOVZX    DX,[DMA_MOD+SI]
  2252.     AND    AL,3
  2253.     OR    AL,01011000B
  2254.     OUT    DX,AL            ;DMA-MODUS FÜR PAS
  2255.     MOVZX    DX,[DMA_FLIP+SI]
  2256.     OUT    DX,AL            ;FLIP-FLOP CLEAR
  2257.     MOVZX    DX,[DMA_ADR+SI]
  2258.     MOV    AL,BL            ;DMA CHANNEL 1-4
  2259.     OUT    DX,AL            ;OFFSET LOW
  2260.     MOV    AL,BH
  2261.     OUT    DX,AL            ;OFFSET HIGH
  2262.     MOVZX    DX,[DMA_CNT+SI]
  2263.     MOV    AL,CL
  2264.     OUT    DX,AL            ;SIZE LOW
  2265.     MOV    AL,CH
  2266.     OUT    DX,AL            ;SIZE HIGH
  2267.     MOVZX    DX,[DMA_PAGE+SI]
  2268.     MOV    AL,AH
  2269.     OUT    DX,AL            ;PAGE
  2270. ;
  2271. ; before we enable the DMA, let's make sure the DRQ is controlled,
  2272. ; not floating
  2273. ;
  2274.         MOV    DX,CROSSCHANNEL
  2275.         XOR    DX,[PAS_BASE]        ; Translate the board address
  2276.     MOV    AL,bCCdrq        ; set the DRQ bit to control it
  2277.     OUT    DX,AL
  2278.     MOVZX    DX,[DMA_MASK+SI]
  2279.     MOV    AX,SI
  2280.     AND    AL,3
  2281.     OUT    DX,AL            ;DMA-KANAL DEMASKIEREN
  2282.     STI
  2283.     RET
  2284. DMA_INIT ENDP
  2285. ;-----------------------------------------------------------------------------
  2286. ; DSP SET SAMPLE RATE
  2287. ;
  2288. ; Calculate the H/W timer value (internal routine)
  2289. ;
  2290. ; IN: ECX hold the users requested sample rate (MUST BE < 88200)
  2291. ;-----------------------------------------------------------------------------
  2292. DSP_RATE PROC NEAR
  2293. ;
  2294. ; load 1193180 in EAX for 32x32 bit division
  2295. ;
  2296.     MOV    EAX,1234DCH
  2297.     XOR    EDX,EDX
  2298.     DIV    ECX
  2299.     MOV    PAS_RATE,AX
  2300.     RET
  2301. DSP_RATE ENDP
  2302. ;-----------------------------------------------------------------------------
  2303. ; Setup the Sample Timer (T0 & square wave output)
  2304. ;-----------------------------------------------------------------------------
  2305. PASloadtimer0 PROC NEAR
  2306.     MOV    AL,00110110b            ; 36h Timer 0 & square wave
  2307.     MOV    DX,TMRCTLR
  2308.     XOR    DX,PAS_BASE        ; xlate the board address
  2309.     CLI
  2310.     OUT    DX,AL            ; setup the mode, etc
  2311.     MOV    AX,PAS_RATE        ; pre-calculated & saved in prior code
  2312.     MOV    DX,SAMPLERATE
  2313.     XOR    DX,PAS_BASE        ; xlate the board address
  2314.     OUT    DX,AL            ; output the timer value
  2315.     JMP    SHORT OUT01
  2316. OUT01:    XCHG    AL,AH
  2317.     OUT    DX,AL
  2318.     STI
  2319.     RET
  2320. PASloadtimer0 ENDP
  2321. ;-----------------------------------------------------------------------------
  2322. ; Setup the Sample Buffer Counter Timer (T1 & rate generator)
  2323. ; IN: AX= NUMBER OF UNITS (BYTES/WORDS)
  2324. ;-----------------------------------------------------------------------------
  2325. PASloadtimer1 PROC NEAR
  2326.     PUSH    AX            ; do not disturb any register
  2327.     MOV    AL,01110100b        ; 74h Timer 1 & rate generator
  2328.     MOV    DX,TMRCTLR
  2329.     XOR    DX,PAS_BASE        ; xlate the board address
  2330.     CLI
  2331.     OUT    DX,AL
  2332.     POP    AX
  2333.     MOV    DX,SAMPLECNT
  2334.     XOR    DX,PAS_BASE        ; xlate the board address
  2335.     OUT    DX,AL
  2336.     JMP    SHORT OUT02
  2337. OUT02:    XCHG    AL,AH
  2338.     OUT    DX,AL
  2339.     STI
  2340.     RET
  2341. PASloadtimer1 ENDP
  2342. ;-----------------------------------------------------------------------------
  2343. ; DSP OUT BLOCK
  2344. ;-----------------------------------------------------------------------------
  2345. DSP_OUT PROC NEAR
  2346.     CALL    PASloadtimer0        ;SET SAMPLE RATE TIMER 0
  2347.     MOV    AX,0FFF0H        ;PLAY LENGTH = MAX
  2348.     CALL    PASloadtimer1        ;SET SAMPLE COUNTER
  2349. ;
  2350. ; Setup the Interrupt Control Register
  2351. ;
  2352.     CLI
  2353.     MOV    DX,INTRCTLRST        ; flush any pending interrupts
  2354.     XOR    DX,PAS_BASE        ; xlate the board address
  2355.     OUT    DX,AL            ; of the PCM circuitry
  2356.     MOV    DX,INTRCTLR
  2357.     XOR    DX,PAS_BASE        ; xlate the board address
  2358.     IN    AL,DX            ; get the real mask
  2359.     OR    AL,bICsampbuff        ; interrupt on sample buffer count
  2360.     OUT    DX,AL            ; send it..
  2361. ;
  2362. ; enable the 16 bit stuff (ONLY FOR MV101 CHIP)
  2363. ;
  2364.     mov    cx,((NOT(bSC216bit+bSC212bit+bSC2msbinv))*256) + bSC216bit
  2365.     MOV    DX,SYSCONFIG2
  2366.     XOR    DX,PAS_BASE        ; xlate the board address
  2367.     IN    AL,DX
  2368.     AND    AL,CH            ; clear the bits
  2369.     OR    AL,CL            ; set the appropriate bits
  2370.     OUT    DX,AL
  2371. ;
  2372. ; setup the direction, stereo/mono and DMA enable bits
  2373. ;
  2374.     MOV    AL,11011001b        ; LOOK AT COMMON.INC FOR REG DESC
  2375.     MOV    DX,CROSSCHANNEL        ; FOR CROSSCHANNEL REG
  2376.     XOR    DX,PAS_BASE        ; xlate the board address
  2377.     XOR    AL,bCCenapcm        ; disable the PCM bit
  2378.     OUT    DX,AL            ; send to the hardware
  2379.     XOR    AL,bCCenapcm        ; enable the PCM bit
  2380.     OUT    DX,AL            ; send to the hardware
  2381. ;
  2382. ; Setup the audio filter sample bits
  2383. ;
  2384.     MOV    AL,11100001b        ; enable the sample count/buff counters
  2385.     MOV    DX,AUDIOFILT
  2386.     XOR    DX,PAS_BASE        ; xlate the board address
  2387.     OUT    DX,AL
  2388.     STI                ; Fly, baby Fly!!!
  2389.     RET
  2390. DSP_OUT ENDP
  2391. ;-----------------------------------------------------------------------------
  2392. ; DSP RESET
  2393. ;-----------------------------------------------------------------------------
  2394. DSP_RESET PROC NEAR
  2395.     CALL    DSP_OFF
  2396. ;
  2397. ; clear the audio filter sample bits
  2398. ;
  2399.     CLI
  2400.     MOV    DX,AUDIOFILT
  2401.     XOR    DX,PAS_BASE        ; xlate the board address
  2402.     MOV    AL,00100001b        ; flush the sample timer bits
  2403.     OUT    DX,AL
  2404. ;
  2405. ; clear the PCM enable bit
  2406. ;
  2407.     MOV    AL,10011001b        ; LOOK AT COMMON.INC FOR REG DESC
  2408.     MOV    DX,CROSSCHANNEL        ; FOR CROSSCHANNEL REG
  2409.     XOR    DX,PAS_BASE        ; xlate the board address
  2410.     OUT    DX,AL            ; end to the hardware
  2411. ;
  2412. ; disable the 16 bit stuff
  2413. ;
  2414.     MOV    DX,SYSCONFIG2
  2415.     XOR    DX,PAS_BASE        ; xlate the board address
  2416.     IN    AL,DX
  2417.     AND    AL,not (bSC216bit+bSC212bit) ; flush the 16 bit stuff
  2418.     OUT    DX,AL
  2419. ;
  2420. ; clear the appropriate Interrupt Control Register bit
  2421. ;
  2422.     MOV    DX,INTRCTLR
  2423.     XOR    DX,PAS_BASE        ; xlate the board address
  2424.     IN    AL,DX
  2425.     AND    AL,not (bICsamprate+bICsampbuff) ; kill sample timer interrupts
  2426.     OUT    DX,AL
  2427. ;
  2428. ; DEACTIVATE DMA
  2429. ;
  2430.     MOVZX    SI,DMA_CHANNEL
  2431.     MOVZX    DX,[DMA_MASK+SI]
  2432.     MOV    AL,DMA_CHANNEL
  2433.     OR    AL,4
  2434.     OUT    DX,AL            ;DMA-KANAL MASKIEREN
  2435. ;
  2436. ; remove control on the DRQ line
  2437. ;
  2438.     MOV    AL,00011001b        ; LOOK AT COMMON.INC FOR REG DESC
  2439.     MOV    DX,CROSSCHANNEL        ; FOR CROSSCHANNEL REG
  2440.     XOR    DX,PAS_BASE        ; xlate the board address
  2441.     OUT    DX,AL            ; end to the hardware
  2442.  
  2443.     MOV    DX,INTRCTLRST        ; flush any pending PCM irq
  2444.     XOR    DX,PAS_BASE        ; xlate the board address
  2445.     IN    AL,DX
  2446.     JMP    SHORT OUT03
  2447. OUT03:    OUT    DX,AL
  2448.     STI
  2449.     CALL    MIXER_INIT
  2450.     CLC                ;RESET OK
  2451.     RET
  2452. DSP_RESET ENDP
  2453. ;-----------------------------------------------------------------------------
  2454. ; MIXER AUS
  2455. ;-----------------------------------------------------------------------------
  2456. DSP_OFF PROC NEAR
  2457.     MOV    DX,pAUDIOMIXR           ; parallel audio mixer interface
  2458.     MOV    AL,05H+90H        ; LEFT/RIGHT PCM MIXER VOLUME
  2459.     OUT    DX,AL
  2460.     XOR    AL,AL            ; MIN VOLUME
  2461.     OUT    DX,AL
  2462.     RET
  2463. DSP_OFF ENDP
  2464. ;=============================================================================
  2465.  
  2466.  
  2467. ;=============================================================================
  2468. ;
  2469. ; MOD LADEROUTINEN
  2470. ;
  2471. ;=============================================================================
  2472. ; LÄDT EIN MODFILE
  2473. ; DS:DX= FILENAME
  2474. ;-----------------------------------------------------------------------------
  2475. LOAD_MOD PROC NEAR
  2476.     MOV    AX,3D00H        ;OPEN MOD
  2477.     INT    21H
  2478.     JC    GLDM1
  2479.     PUSH    CS
  2480.     POP    DS
  2481.     MOV    GDDHANDLE,AX
  2482. GLDM0:    CALL    SET_DMEM        ;ALLOCATE DMA-BUFFER 
  2483.     CALL    SET_TMEM        ;ALLOCATE TRACK-BUFFER
  2484.     CALL    TRACK_PAGING        ;GET TRACKS INTO EMS PAGES
  2485.     MOV    BX,GDDHANDLE
  2486.     MOV    GDDZEIG,0
  2487.     CMP    LOADMOD_FLAG,0
  2488.     JNE    GLDM99
  2489.     MOV    CX,10            ;SONG-NAME HOLEN
  2490. LLDM1:    CALL    GET_QUEUE
  2491.     JC    GLDM2
  2492.     LOOP    LLDM1
  2493.     MOV    SAMPLE_SIZE,0
  2494.     XOR    SI,SI            ;31 INSTRUMENTS
  2495. LLDM2:    MOV    AX,SAMPLE_SIZE
  2496.     MOV    [SAMPLE_SEG+SI],AX
  2497.     MOV    CX,11            ;INSTRUMENT NAME
  2498. LLDM3:    CALL    GET_QUEUE    
  2499.     JC    GLDM2
  2500.     LOOP    LLDM3
  2501.     XOR    EAX,EAX
  2502.     CALL    GET_QUEUE        ;INSTRUMENT SIZE
  2503.     XCHG    AL,AH
  2504.     CMP    AX,2
  2505.     JAE    SHORT GLDM20
  2506.     XOR    AX,AX
  2507. GLDM20:    SHL    AX,1
  2508.     MOV    [ISIZE+SI],AX        ;HÖCHSTENS 64K
  2509.     OR    EAX,EAX
  2510.     JZ    SHORT GLDM9
  2511.     SHR    EAX,4
  2512.     INC    AX
  2513.     ADD    SAMPLE_SIZE,AX
  2514. GLDM9:    CALL    GET_QUEUE        ;IVOLUME & FINETUNE
  2515.     XCHG    AL,AH
  2516.     MOV    [IVOL_FINETUNE+SI],AX
  2517.     CALL    GET_QUEUE        ;ILOOP_START
  2518.     XCHG    AL,AH
  2519.     SHL    AX,1
  2520.     MOV    [ILOOP_START+SI],AX
  2521.     CALL    GET_QUEUE        ;ILOOP_SIZE
  2522.     XCHG    AL,AH
  2523.     SHL    AX,1
  2524.     MOV    [ILOOP_SIZE+SI],AX
  2525.     INC    SI
  2526.     INC    SI
  2527.     CMP    SI,62
  2528.     JB    LLDM2
  2529.     CALL    GET_QUEUE        ;SONG_SIZE & LOOP_BYTE OR NOTHING
  2530.     JC    GLDM2
  2531.     MOV    SONG_SIZE,AL
  2532.     MOV    SONG_LOOP,AH
  2533.     XOR    DX,DX
  2534.     MOV    CX,64            ;SONG_DATA
  2535.     MOV    DI,OFFSET SONG_DATA
  2536. LLDM4:    CALL    GET_QUEUE
  2537.     JC    GLDM2
  2538.     MOV    [DI],AX
  2539.     CMP    AL,DL            ;FIND HIGHEST PATTERN NUMBER
  2540.     JBE    SHORT GLDM12
  2541.     MOV    DL,AL
  2542. GLDM12:    CMP    AH,DL
  2543.     JBE    SHORT GLDM13
  2544.     MOV    DL,AH
  2545. GLDM13:    INC    DI
  2546.     INC    DI
  2547.     LOOP    LLDM4
  2548.     INC    DL
  2549.     CLD
  2550.     MOV    PATTERN_NUMBER,DX
  2551.     CALL    GET_QUEUE
  2552.     PUSH    AX
  2553.     CALL    GET_QUEUE
  2554.     SHL    EAX,16
  2555.     POP    AX
  2556.     MOV    MOD_SIGN,EAX
  2557.     CMP    EAX,"NHC8"        ;8CHN-MOD
  2558.     JE    SHORT GLDM3
  2559.     CMP    EAX,"8TLF"        ;FLT8-MOD
  2560.     JE    SHORT GLDM3
  2561.     CMP    EAX,".K.M"        ;M.K.-MOD
  2562.     JE    SHORT GLDM10
  2563.     CMP    EAX,"4TLF"        ;FLT4-MOD
  2564.     JNE    GLDM2
  2565.  
  2566. GLDM10:    MOV    CH_NUMB,4        ;4-CHANNEL-MOD
  2567.     MOV    PATTERN_SIZE,1024
  2568.     MOV    AH,0
  2569.     MOV    TRACK_INFO+4,AH
  2570.     MOV    TRACK_INFO+5,AH
  2571.     MOV    TRACK_INFO+6,AH
  2572.     MOV    TRACK_INFO+7,AH
  2573.     JMP    SHORT GLDM11
  2574. GLDM3:    MOV    CH_NUMB,8        ;8-CHANNEL-MOD: GET-PATTERNS
  2575.     MOV    PATTERN_SIZE,2048
  2576. GLDM11:    MOV    PATTERN_CURRENT,0
  2577.     MOV    TRACK_NUMBER,0
  2578. LLDM7:    MOV    ES,PATTERN_SEG
  2579.     MOV    BX,GDDHANDLE
  2580.     XOR    DI,DI
  2581. LLDM6:    XOR    SI,SI
  2582. LLDM5:    CALL    GET_QUEUE        ;PATTERN HOLEN UND IN TRACKS AUFSPALTEN
  2583.     JC    GLDM2
  2584.     MOV    DX,AX
  2585.     CALL    GET_QUEUE
  2586.     JC    GLDM2
  2587.     ROL    AL,4            ;MODIFY PATTERN DATA
  2588.     MOV    CL,AL            ;LOOK AT PROTRACKER-CODE HEADER
  2589.     AND    AL,0FH
  2590.     AND    CL,0F0H    
  2591.     MOV    CH,DL
  2592.     AND    DL,0FH
  2593.     AND    CH,0F0H
  2594.     OR    AL,CH
  2595.     OR    DL,CL
  2596.     XCHG    DL,DH
  2597.     PUSH    DI
  2598.     ADD    DI,SI
  2599.     SHL    EAX,16
  2600.     MOV    AX,DX
  2601.     STOSD
  2602.     POP    DI
  2603.     ADD    SI,256
  2604.     CMP    SI,PATTERN_SIZE        ;NEXT TRACK/CHANNEL
  2605.     JB    LLDM5
  2606.     ADD    DI,4            ;NEXT NOTE
  2607.     CMP    DI,256
  2608.     JB    LLDM6
  2609.     CALL    SET_FREQUENCIES
  2610.     MOV    ES,TRACK_SEG        ;TRACK1-8 INTEGRIEREN
  2611.     MOV    DX,TRACK_NUMBER
  2612.     XCHG    DL,DH
  2613.     MOV    DS,PATTERN_SEG
  2614.     XOR    SI,SI
  2615.     XOR    BX,BX
  2616. LLDM8:    XOR    DI,DI
  2617. LLDM9:    CMP    DX,DI
  2618.     JBE    SHORT GLDM4
  2619.     PUSH    SI DI
  2620.     MOV    CX,256/4
  2621.     REPE CMPSD            ;TRACK ALREADY EXISTS?
  2622.     POP    DI SI
  2623.     PUSHF
  2624.     ADD    DI,256
  2625.     POPF
  2626.     JNE    LLDM9
  2627.     JMP    SHORT GLDM5
  2628. GLDM4:    INC    DH            ;NO, ADD TRACK TO BUFFER
  2629.     PUSH    SI
  2630.     MOV    CX,256/4
  2631.     REP MOVSD
  2632.     POP    SI
  2633. GLDM5:    MOV    AX,DI            ;YES
  2634.     DEC    AH
  2635.     MOV    CS:[TRACK_INFO+BX],AH
  2636.     INC    BX
  2637.     ADD    SI,256
  2638.     CMP    BX,CS:CH_NUMB
  2639.     JB    LLDM8
  2640.     PUSH    CS
  2641.     POP    DS
  2642.     XCHG    DL,DH
  2643.     MOV    TRACK_NUMBER,DX
  2644.     XOR    BX,BX            ;TRACKLISTE NACHFÜHREN
  2645.     MOV    AX,PATTERN_CURRENT
  2646. LLDM10:    CMP    [SONG_DATA+BX],AL
  2647.     JNE    SHORT GLDM6
  2648.     MOV    AH,TRACK_INFO
  2649.     MOV    [TRACK1_DATA+BX],AH
  2650.     MOV    AH,TRACK_INFO+1
  2651.     MOV    [TRACK2_DATA+BX],AH
  2652.     MOV    AH,TRACK_INFO+2
  2653.     MOV    [TRACK3_DATA+BX],AH
  2654.     MOV    AH,TRACK_INFO+3
  2655.     MOV    [TRACK4_DATA+BX],AH
  2656.     MOV    AH,TRACK_INFO+4
  2657.     MOV    [TRACK5_DATA+BX],AH
  2658.     MOV    AH,TRACK_INFO+5
  2659.     MOV    [TRACK6_DATA+BX],AH
  2660.     MOV    AH,TRACK_INFO+6
  2661.     MOV    [TRACK7_DATA+BX],AH
  2662.     MOV    AH,TRACK_INFO+7
  2663.     MOV    [TRACK8_DATA+BX],AH
  2664. GLDM6:    INC    BX
  2665.     CMP    BL,128
  2666.     JB    LLDM10
  2667.     INC    PATTERN_CURRENT        ;NÄCHSTES PATTERN HOLEN
  2668.     MOV    AX,PATTERN_CURRENT
  2669.     CMP    AX,PATTERN_NUMBER
  2670.     JB    LLDM7
  2671.     JMP    SHORT GLDM7
  2672.  
  2673. GLDM99:    CMP    TRACK_SEG,0        ;TRACK SEGMENT WIEDER LÖSCHEN
  2674.     JE    SHORT GLDM7
  2675.     MOV    AH,45H
  2676.     MOV    DX,TRACK_HANDLE
  2677.     INT    67H
  2678.     MOV    TRACK_SEG,0
  2679. GLDM7:    MOV    ES,PATTERN_SEG        ;PATTERN SEGMENT WIEDER LÖSCHEN
  2680.     MOV    AH,49H
  2681.     INT    21H
  2682.     CMP    LOADMOD_FLAG,0
  2683.     JNE    SHORT GLDM98
  2684.     MOV    BX,SAMPLE_SIZE        ;SAMPLE SEGMENT ALLOKIEREN 
  2685.     MOV    AH,48H
  2686.     INT    21H
  2687.     XOR    BX,BX
  2688. LLDM11:    ADD    [SAMPLE_SEG+BX],AX
  2689.     INC    BX
  2690.     INC    BX
  2691.     CMP    BX,62
  2692.     JB    LLDM11
  2693.     MOV    BX,GDDHANDLE
  2694.     XOR    SI,SI            ;SAMPLES LADEN
  2695. LLDM12:    MOV    CX,[ISIZE+SI]
  2696.     MOV    ES,[SAMPLE_SEG+SI]
  2697.     XOR    DI,DI
  2698.     SHR    CX,1
  2699.     JCXZ    SHORT GLDM8
  2700. LLDM13:    CALL    GET_QUEUE
  2701.     STOSW
  2702.     LOOP    LLDM13
  2703. GLDM8:    INC    SI
  2704.     INC    SI
  2705.     CMP    SI,62
  2706.     JB    LLDM12
  2707. GLDM98:    CLC
  2708.     JMP    SHORT GLDM15
  2709. GLDM2:    STC
  2710. GLDM15:    PUSHF
  2711.     CMP    VAR_BUFSEG,0
  2712.     JNE    SHORT GLDM16
  2713.     MOV    AH,3EH
  2714.     INT    21H
  2715. GLDM16:    POPF
  2716. GLDM1:    RET
  2717. LOAD_MOD ENDP
  2718. ;-----------------------------------------------------------------------------
  2719. ; ERSETZT DIE MEISTEN FREQUENZ-PERIODEN DURCH DEN TABELLEN-INDEX
  2720. ;-----------------------------------------------------------------------------
  2721. SET_FREQUENCIES PROC NEAR
  2722.     XOR    DI,DI
  2723. SET_FREQ1:
  2724.     MOV    AX,ES:[DI]        ;get fx
  2725.     MOV    DX,AX
  2726.     SHR    AH,4
  2727.     CMP    AH,3
  2728.     JE    SHORT SET_FREQ4
  2729.     CMP    AH,5
  2730.     JE    SHORT SET_FREQ4
  2731.     MOV    AX,DX
  2732.     AND    AX,0FFFH        ; Mask out unwanted bits.
  2733.     JZ    SHORT SET_FREQ4
  2734.     XOR    BX,BX
  2735.     MOV    CX,48            ; 36 periods to cycle through.
  2736. SET_FREQ2:
  2737.     CMP    AX,[MT_PERIODTABLE+BX]    ; Check the note against the period.
  2738.     JAE    SHORT SET_FREQ3        ; We found it!
  2739.     INC    BX            ; Otherwise, update the pointer and
  2740.     INC    BX
  2741.     LOOP    SET_FREQ2        ; keep looping.
  2742. SET_FREQ3:
  2743.     MOV    AX,DX            ;recall the Note Value
  2744.     AND    AX,0F000H        ;just keep fx
  2745.     INC    BX
  2746.     OR    AX,BX            ;put in the new offset
  2747.     STOSW                ;store it
  2748.     DEC    DI
  2749.     DEC    DI
  2750. SET_FREQ4:
  2751.     ADD    DI,4            ;and go to next channel
  2752.     CMP    DI,PATTERN_SIZE
  2753.     JB    SET_FREQ1
  2754.     RET
  2755. SET_FREQUENCIES ENDP
  2756. ;-----------------------------------------------------------------------------
  2757. ; HOLT EIN WORD AUS DEM BUFFER
  2758. ; IN: AX= WORD, BX= HANDLE
  2759. ;-----------------------------------------------------------------------------
  2760. GET_QUEUE PROC NEAR
  2761.     CMP     GDDZEIG,0
  2762.     JNE     SHORT GTQ1
  2763.     PUSH    CX DX
  2764.     MOV     DX,OFFSET QUEUE_BUFFER
  2765.     MOV     CX,256
  2766.     MOV     AH,3FH
  2767.     INT     21H
  2768.     MOV    GDDREST,AX
  2769.     POP    DX CX
  2770. GTQ1:   PUSH    BX
  2771.     MOV     BL,GDDZEIG
  2772.     XOR     BH,BH
  2773.     CMP    BX,GDDREST
  2774.     JAE    SHORT GTQ2
  2775.     MOV     AX,[QUEUE_BUFFER+BX]
  2776.     ADD     GDDZEIG,2
  2777.     POP    BX
  2778.     CLC
  2779.     RET
  2780. GTQ2:    POP    BX
  2781.     STC
  2782.     RET
  2783. GET_QUEUE ENDP
  2784. ;=============================================================================
  2785. ; LÄDT EIN SAMPLE
  2786. ; INPUT: DS:DX= FILENAME, CL= 00H AMIGA-SAMPLE, 80H PC-SAMPLE
  2787. ; OUTPUT: AX= SAMPLE-HANDLE FOR PLAYING
  2788. ;-----------------------------------------------------------------------------
  2789. LOAD_SAMPLE PROC NEAR
  2790.     MOV    AX,3D00H        ;OPEN SAMPLE
  2791.     INT    21H
  2792.     JC    GSMP1
  2793.     PUSH    CS
  2794.     POP    DS
  2795.     MOV    GDDHANDLE,AX
  2796.     MOV    BX,AX
  2797.     PUSH    CX
  2798.     CALL    GET_FILESIZE
  2799.     POP    CX
  2800. GSMP0:    AND    CL,80H
  2801.     MOV    SAM_FLAG1,CL
  2802.     MOV    GDDZEIG,0
  2803.     MOV    CX,AX
  2804.     AND    CX,0FFFEH
  2805.     SHR    AX,4
  2806.     INC    AX
  2807.     MOV    BX,AX
  2808.     CMP    EMS_SEG,0
  2809.     JNE    SHORT GSMP3
  2810.     PUSHA
  2811.     XOR    SI,SI
  2812.     XOR    AX,AX            ;CHECK FOR EMS-MANAGER
  2813.     MOV    ES,AX
  2814.     MOV    EMS_HANDLE,AX
  2815.     MOV    AX,ES:[4*67H+2]
  2816.     MOV    ES,AX
  2817.     CMP    ES:[10],"XMME"
  2818.     JNE    GSMP2
  2819.     CMP    ES:[14],"0XXX"
  2820.     JNE    GSMP2
  2821.     MOV    AH,42H
  2822.     INT    67H
  2823.     OR    AH,AH
  2824.     JNZ    GSMP2
  2825.     CMP    BX,37
  2826.     JB    GSMP2
  2827.     MOV    AH,41H
  2828.     INT    67H
  2829.     MOV    EMS_SEG,BX
  2830.     MOV    AH,43H            ;ALLOCATE 592K EMS FOR FX
  2831.     MOV    BX,37
  2832.     INT    67H
  2833.     MOV    EMS_HANDLE,DX
  2834.     XOR    AX,AX
  2835.     MOV    EMS_OFFSET,AX
  2836.     MOV    SAMPLE_ZEIG,AX
  2837.     POPA
  2838. GSMP3:    MOV    AX,EMS_OFFSET
  2839.     MOV    SI,SAMPLE_ZEIG
  2840.     MOV    [SAMPLE_MEM+SI],AX
  2841.     MOV    [SAMPLE_BIG+SI],CX
  2842.     ADD    SAMPLE_ZEIG,2
  2843.     MOV    DI,CX
  2844.     SHR    DI,4
  2845.     INC    DI
  2846.     ADD    EMS_OFFSET,DI
  2847.     XOR    DI,DI
  2848.     CLD
  2849.     INC    CX
  2850.     SHR    CX,1
  2851.     MOV    DL,SAM_FLAG1
  2852.     MOV    DH,DL
  2853.     AND    EAX,0FFFFH
  2854.     SHL    EAX,4
  2855. LSMP1:    PUSH    EAX SI
  2856.     OR    DI,DI
  2857.     JNZ    SHORT GSMP4
  2858.     CALL    EMS_PAGING
  2859.     MOV    DI,SI
  2860. GSMP4:    MOV    BX,GDDHANDLE
  2861.     CALL    GET_QUEUE
  2862.     XOR    AX,DX
  2863.     STOSW
  2864.     POP    SI EAX
  2865.     INC    EAX
  2866.     INC    EAX
  2867.     LOOP    LSMP1
  2868.     CLC
  2869.     PUSHA
  2870. GSMP2:    POPA
  2871.     PUSHF
  2872.     CMP    VAR_BUFSEG,0
  2873.     JNE    SHORT GSMP5
  2874.     MOV    BX,GDDHANDLE
  2875.     MOV    AH,3EH
  2876.     INT    21H
  2877. GSMP5:    MOV    AX,SI
  2878.     POPF
  2879. GSMP1:    RET
  2880. LOAD_SAMPLE ENDP
  2881. ;-----------------------------------------------------------------------------
  2882. GET_FILESIZE PROC NEAR
  2883.     MOV    AX,4202H
  2884.     XOR    CX,CX
  2885.     XOR    DX,DX
  2886.     INT    21H
  2887.     PUSH    AX
  2888.     MOV    AX,4200H
  2889.     XOR    CX,CX
  2890.     XOR    DX,DX
  2891.     INT    21H
  2892.     POP    AX
  2893.     RET
  2894. GET_FILESIZE ENDP
  2895. ;=============================================================================
  2896. ; LOAD CONFIG DATA (PARSER)
  2897. ; IN: CX=0C242H, DS:BX= POINTER TO PARAM-BLOCK
  2898. ;
  2899. ; PARAM-BLOCK:     + 0 BASE PORT        210H-280H, 388H, ETC.
  2900. ;                  + 2 DMA NUMBER        0-7
  2901. ;                  + 3 IRQ NUMBER        0-15
  2902. ;        + 4 SAMPLE RATE        10000-44100
  2903. ;               + 6 INTERNAL TYPE       0,1,2,3,... (if necessary)
  2904. ;        + 7 INTERRUPT TYPE      0,1 (realtime clock, timer)
  2905. ;               + 8 STARTING POSITION   0-127
  2906. ;               + 9 LOOP POSITION    0-127,128
  2907. ;               +10 SONG MODUS        0-3
  2908. ;               +11 START MASTER VOLUME 0-255
  2909. ;        +12 START MUSIC VOLUME    0-255
  2910. ;               +13 START FX VOLUME     0-255
  2911. ;-----------------------------------------------------------------------------
  2912. CONFIG_INIT PROC NEAR
  2913.     MOV    DX,DS
  2914.     MOV    AX,CS
  2915.     MOV    DS,AX
  2916.     MOV    WORD PTR HOLD70+2,AX
  2917.     MOV    WORD PTR HOLDPAS+2,AX
  2918.     CMP    CX,0C242H
  2919.     JNE    SHORT NORMAL_CONFIG
  2920.     MOV    ES,DX
  2921.     MOV    AX,ES:[BX]
  2922.     XOR    AX,DEFAULT_BASE
  2923.     MOV    PAS_BASE,AX
  2924.     MOV    AL,ES:[BX+2]
  2925.     AND    AL,7
  2926.     MOV    DMA_CHANNEL,AL
  2927.     MOV    AL,ES:[BX+3]
  2928.     AND    AL,15
  2929.     MOV    IRQ_NUMBER,AL
  2930.     MOV    AX,ES:[BX+4]
  2931.     MOV    SAMPLE_RATE,AX
  2932.     MOV    AL,ES:[BX+7]
  2933.     AND     AL,1
  2934.     MOV     SYSTEM,AL
  2935.     MOV    AL,ES:[BX+8]
  2936.     AND    AL,127
  2937.     MOV    SONG_START,AL
  2938.     MOV    AL,ES:[BX+9]
  2939.     MOV    SONG_LOOP,AL
  2940.     MOV    AL,ES:[BX+10]
  2941.     AND     AL,3
  2942.     MOV    PAS_MODUS,AL
  2943.     MOV    AL,ES:[BX+11]
  2944.     MOV    BX,ES:[BX+12]
  2945.     CALL    SET_VOLUME
  2946.     JMP    CONT_CONFIG
  2947. NORMAL_CONFIG:
  2948.     MOV     DX,OFFSET CONFIG_NAME
  2949.     MOV     AH,3DH
  2950.     MOV     AL,80H
  2951.     INT     21H
  2952.     JC      GCFG1
  2953.     MOV     GDDHANDLE,AX
  2954. LCFG1:  XOR     SI,SI
  2955.     MOV     DX,OFFSET QUEUE_BUFFER
  2956. LCFG2:  MOV     AH,3FH
  2957.     MOV     BX,GDDHANDLE
  2958.     MOV     CX,1
  2959.     INT     21H
  2960.     JC      GCFG2
  2961.     OR      AX,AX
  2962.     JZ      GCFG2
  2963.     MOV     DI,DX
  2964.     CMP     BYTE PTR [DI],0AH
  2965.     JE      SHORT GCFG6
  2966.     INC     DX
  2967.     INC     SI
  2968.     CMP     SI,256
  2969.     JB      LCFG2
  2970. GCFG6:    MOV     BX,OFFSET CFG_TEXT2
  2971.     CALL    SEEK_LINE
  2972.     JNC     SHORT GCFG4
  2973.     LODSB
  2974.     AND    AL,1
  2975.     MOV    CD_MIXER,AL
  2976.     LODSB
  2977.     AND     AL,3
  2978.     MOV    PAS_MODUS,AL
  2979.     JMP     LCFG1
  2980. GCFG4:  MOV     BX,OFFSET CFG_TEXT3
  2981.     CALL    SEEK_LINE
  2982.     JNC     SHORT GCFG5
  2983.     LODSW
  2984.     CMP    AL,"9"
  2985.     JBE    SHORT GCFG20
  2986.     SUB    AL,7
  2987. GCFG20:    CMP    AH,"9"
  2988.     JBE    SHORT GCFG21
  2989.     SUB    AH,7
  2990. GCFG21:    AND    AH,0FH
  2991.     SHL    AL,4
  2992.     OR    AH,AL
  2993.     LODSB
  2994.     CMP    AL,"9"
  2995.     JBE    SHORT GCFG22
  2996.     SUB    AL,7
  2997. GCFG22:    SHL    AL,4
  2998.     SHR    AX,4
  2999.     XOR    AX,DEFAULT_BASE
  3000.     MOV    PAS_BASE,AX
  3001.     JMP     LCFG1
  3002. GCFG5:  MOV     BX,OFFSET CFG_TEXT4
  3003.     CALL    SEEK_LINE
  3004.     JNC     SHORT GCFG7
  3005.     LODSW
  3006.     AND     AL,1
  3007.     AND    AH,15
  3008.     MOV    BH,AH
  3009.     MOV    BL,10
  3010.     MUL    BL
  3011.     ADD    AL,BH
  3012.     MOV    IRQ_NUMBER,AL
  3013.     JMP    LCFG1
  3014. GCFG7:  MOV     BX,OFFSET CFG_TEXT5
  3015.     CALL    SEEK_LINE
  3016.     JNC     SHORT GCFG8
  3017.     LODSB
  3018.     AND    AL,7
  3019.     MOV    DMA_CHANNEL,AL
  3020.     JMP    LCFG1
  3021. GCFG8:    MOV    BX,OFFSET CFG_TEXT6
  3022.     CALL    SEEK_LINE
  3023.     JNC    SHORT GCFG9
  3024.     XOR    BX,BX
  3025.     MOV    CX,5
  3026. LCFG3:    MOV    AX,BX
  3027.     MOV    DX,10
  3028.     MUL    DX
  3029.     MOV    BX,AX
  3030.     LODSB
  3031.     AND    AL,0FH
  3032.     XOR    AH,AH
  3033.     ADD    BX,AX
  3034.     LOOP    LCFG3
  3035.     MOV    SAMPLE_RATE,BX
  3036.     JMP     LCFG1
  3037. GCFG9:    MOV     BX,OFFSET CFG_TEXT7
  3038.     CALL    SEEK_LINE
  3039.     JNC     LCFG1
  3040.     LODSB
  3041.     AND     AL,1
  3042.     MOV     SYSTEM,AL
  3043.     JMP     LCFG1
  3044. GCFG2:  MOV     BX,GDDHANDLE
  3045.     MOV     AH,3EH
  3046.     INT     21H
  3047. CONT_CONFIG:
  3048. GCFG1:  RET
  3049. CONFIG_INIT ENDP
  3050. ;-----------------------------------------------------------------------------
  3051. SEEK_LINE PROC NEAR
  3052.     CLD
  3053.     MOV     SI,OFFSET QUEUE_BUFFER
  3054. LSKL1:  PUSH    BX
  3055. LSKL2:  CMP     BYTE PTR [BX],0
  3056.     JE      SHORT GSKL1
  3057.     CMP     SI,DX
  3058.     JAE     SHORT GSKL2
  3059.     LODSB
  3060.     CMP     AL,[BX]
  3061.     JNE     SHORT GSKL3
  3062.     INC     BX      
  3063.     JMP     LSKL2
  3064. GSKL3:  POP     BX
  3065.     JMP     LSKL1
  3066. GSKL2:  POP     BX
  3067.     CLC
  3068.     RET
  3069. GSKL1:  POP     BX
  3070.     STC
  3071.     RET
  3072. SEEK_LINE ENDP
  3073. ;=============================================================================
  3074.  
  3075.  
  3076. ;=============================================================================
  3077. PLAY_MUSIC PROC NEAR
  3078.     PUSH    CS
  3079.     POP    DS
  3080.     MOV    MOD_STAT,0        ;DEACTIVATE IRQ-HANDLING
  3081.     CALL    DSP_RESET
  3082.     JC    GPM1
  3083.     CALL    MAKE_MIXMUL_VOLUMETABLE
  3084.     CALL    IRQ_INIT
  3085.     MOVZX    EBX,SAMPLE_RATE
  3086.     MOV    EDX,36H
  3087.     MOV    EAX,9E940000H        ;1,193,180 * 30000H FOR FREQ CALCS
  3088.     DIV    EBX
  3089.     MOV    MAINFREQ,EAX
  3090.     MOV    AX,BX
  3091.     XOR    DX,DX
  3092.     MOV    BX,50            ;AMIGA TIMING IS 50HZ (SCREEN-REFRESH)
  3093.     DIV    BX
  3094.     SHL    AX,2            ;STEREO & 16 BIT = *4
  3095.     MOV    DMA_CX,AX        ;# OF BYTE/CYCLE (3445 FOR 44100 HZ)
  3096.     SHL    AX,2            ;4 TIMES FORWARD
  3097.     MOV    DMA_MORE,AX
  3098.     SHL    AX,1            ;8 TIMES MAXIMUM (27560 FOR 44100 HZ)
  3099.     MOV    DMA_MAX,AX
  3100.     MOV    AX,DMA_OFFSET
  3101.     MOV    DMA_PTR,AX
  3102.     MOV    DMA_NEWPTR,AX
  3103.     MOV    AL,125
  3104.     CALL    Go_SetBPM
  3105.     MOV    BPM_COUNT,0
  3106.     MOV    MT_SPEED,6        ;DEFAULT PROTRACKER SPEED
  3107.     XOR    AX,AX
  3108.     MOV    SAM_CH,AL
  3109.     MOV    MT_COUNTER,AL        ;RESET PROTRACKER VARIABLES
  3110.     MOV    MT_PATTERNPOS,AX
  3111.     MOV    DL,SONG_START
  3112.     MOV    MT_SONGPOS,DL
  3113.     MOV    MT_PATTDELAYTIME2,AL
  3114.     MOV    MT_PATTDELAYTIME,AL
  3115.     MOV    MT_PBREAKFLAG,AL
  3116.     MOV    MT_PBREAKPOS,AL
  3117.     MOV    MT_POSJUMPFLAG,AL
  3118.     MOV    MT_LOWMASK,0FFH
  3119.     MOV    CX,47*8/2
  3120.     CLD
  3121.     PUSH    DS
  3122.     POP    ES
  3123.     MOV    DI,OFFSET NOTE
  3124.     REP STOSW
  3125.     INC    AL
  3126.     MOV    CX,MAX_CHAN_NUMB
  3127.     MOV    DI,OFFSET TONEPORTDIREC
  3128.     REP STOSB
  3129.     XOR    BX,BX
  3130. LPM2:    MOV    AL,[PAN_REGS+BX]
  3131.     MOV    [MPANNING+BX],AL
  3132.     INC    BX
  3133.     CMP    BX,MAX_CHAN_NUMB
  3134.     JB    LPM2
  3135.     MOV    CX,3            ;PRECALCULATE SAMPLE DATA FOR INIT
  3136. LPM1:    PUSH    CX
  3137.     CALL    CONTROL_CHANNELS
  3138.     CALL    MIXUP_CHANNELS
  3139.     POP    CX
  3140.     LOOP    LPM1
  3141.     MOVZX    ECX,SAMPLE_RATE        ;INITIALIZE PAS_RATE
  3142.     SHL    ECX,1            ;STEREO = *2
  3143.     CALL    DSP_RATE
  3144.     MOV    DX,DMA_SEG        ;INITIALIZE DMA
  3145.     MOV    BX,DMA_OFFSET
  3146.     MOV    CX,DMA_MAX
  3147.     CALL    DMA_INIT
  3148.     MOV    MOD_STAT,1        ;ACTIVATE IRQ-HANDLING
  3149.     CLC
  3150. GPM1:    RET
  3151. PLAY_MUSIC ENDP
  3152. ;-----------------------------------------------------------------------------
  3153. STOP_MUSIC PROC NEAR
  3154.     PUSH    CS
  3155.     POP    DS
  3156.     MOV    MOD_STAT,0
  3157.     CALL    DSP_RESET
  3158.     CALL    IRQ_INIT
  3159.     MOV    IRQCOUNT,56
  3160.     RET
  3161. STOP_MUSIC ENDP
  3162. ;-----------------------------------------------------------------------------
  3163. END_MUSIC PROC NEAR
  3164.     PUSH    CS
  3165.     POP    DS
  3166.     CMP    LOADMOD_FLAG,0
  3167.     JNE    SHORT GENM1
  3168.     CALL    FREE_TMEM
  3169. GENM1:    CALL    FREE_DMEM
  3170.     RET
  3171. END_MUSIC ENDP
  3172. ;-----------------------------------------------------------------------------
  3173. GET_SONGMOD PROC NEAR
  3174.     MOV    AL,CS:PAS_MODUS
  3175.     RET
  3176. GET_SONGMOD ENDP
  3177. ;-----------------------------------------------------------------------------
  3178. SET_SONGMOD PROC NEAR
  3179.     AND    AL,3
  3180.     MOV    CS:PAS_MODUS,AL
  3181.     CMP    CS:CD_MIXER,0
  3182.     JE    SHORT GSNG1
  3183.     PUSH    AX DX
  3184.     XOR    AH,AH
  3185.     TEST    AL,2
  3186.     JNZ    SHORT GSNG2
  3187.     MOV    AH,CS:MUSIC_VOL
  3188. GSNG2:    SHR    AH,3
  3189.     MOV    DX,pAUDIOMIXR           ; parallel audio mixer interface
  3190.     MOV    AL,02H+90H        ; LEFT/RIGHT EXT MIXER VOLUME
  3191.     OUT    DX,AL
  3192.     MOV    AL,AH
  3193.     OUT    DX,AL
  3194.     MOV    AL,03H+90H        ; LEFT/RIGHT INT MIXER VOLUME
  3195.     OUT    DX,AL
  3196.     MOV    AL,AH
  3197.     OUT    DX,AL
  3198.     POP    DX AX
  3199. GSNG1:    RET
  3200. SET_SONGMOD ENDP
  3201. ;-----------------------------------------------------------------------------
  3202. GET_SONGPOSITION PROC NEAR
  3203.     MOV    AL,CS:MT_SONGPOS
  3204.     RET
  3205. GET_SONGPOSITION ENDP
  3206. ;-----------------------------------------------------------------------------
  3207. SET_SONGPOSITION PROC NEAR
  3208.     PUSH    BX
  3209.     AND    AL,7FH
  3210.     MOV    CS:MT_SONGPOS,AL
  3211.     MOV    CS:MT_PATTERNPOS,0
  3212.     XOR    BX,BX
  3213. LSET1:    MOV    CS:[MSEG+BX],0
  3214.     INC    BL
  3215.     INC    BL
  3216.     CMP    BL,2*MAX_CHAN_NUMB
  3217.     JB    LSET1
  3218.     POP    BX
  3219.     RET
  3220. SET_SONGPOSITION ENDP
  3221. ;-----------------------------------------------------------------------------
  3222. SET_SONGLOOP PROC NEAR
  3223.     MOV    CS:SONG_LOOP,AL
  3224.     RET
  3225. SET_SONGLOOP ENDP
  3226. ;-----------------------------------------------------------------------------
  3227. GET_VOLUME PROC NEAR
  3228.     MOV    AL,CS:MASTER_VOLUME    ;0= MIN VOLUME, 255= MAX VOLUME
  3229.     MOV    BL,CS:MUSIC_VOLUME    ;0= MIN VOLUME, 255= MAX VOLUME
  3230.     MOV    BH,CS:FX_VOLUME        ;0= MIN VOLUME, 255= MAX VOLUME
  3231.     RET
  3232. GET_VOLUME ENDP
  3233. ;-----------------------------------------------------------------------------
  3234. SET_VOLUME PROC NEAR
  3235.     MOV    CS:MASTER_VOLUME,AL    ;0= MIN VOLUME, 255= MAX VOLUME
  3236.     MOV    CS:MUSIC_VOLUME,BL    ;0= MIN VOLUME, 255= MAX VOLUME
  3237.     MOV    CS:FX_VOLUME,BH        ;0= MIN VOLUME, 255= MAX VOLUME
  3238.     PUSH    AX DX
  3239.     MOVZX    DX,AL
  3240.     INC    DX
  3241.     PUSH    DX
  3242.     MOVZX    AX,BL
  3243.     MUL    DX
  3244.     MOV    CS:MUSIC_VOL,AH
  3245.     CMP    CS:CD_MIXER,0
  3246.     JE    SHORT GSTV1
  3247.     SHR    AH,3
  3248.     MOV    DX,pAUDIOMIXR           ; parallel audio mixer interface
  3249.     MOV    AL,02H+90H        ; LEFT/RIGHT EXT MIXER VOLUME
  3250.     OUT    DX,AL
  3251.     MOV    AL,AH
  3252.     OUT    DX,AL
  3253.     MOV    AL,03H+90H        ; LEFT/RIGHT INT MIXER VOLUME
  3254.     OUT    DX,AL
  3255.     MOV    AL,AH
  3256.     OUT    DX,AL
  3257. GSTV1:    POP    DX
  3258.     MOVZX    AX,BH
  3259.     MUL    DX
  3260.     MOV    CS:FX_VOL,AH
  3261.     POP    DX AX
  3262.     RET
  3263. SET_VOLUME ENDP
  3264. ;-----------------------------------------------------------------------------
  3265. SET_LOADMOD_FLAG PROC NEAR
  3266.     AND    AL,1
  3267.     MOV    CS:LOADMOD_FLAG,AL    ;0= NORMAL, 1= CD PLAYER MODUS
  3268.     RET
  3269. SET_LOADMOD_FLAG ENDP
  3270. ;-----------------------------------------------------------------------------
  3271. SET_SAMPLERATE PROC NEAR
  3272.     CMP    AX,10000
  3273.     JAE    SHORT GSSR1
  3274.     MOV    AX,10000
  3275. GSSR1:    CMP    AX,44100
  3276.     JBE    SHORT GSSR2
  3277.     MOV    AX,44100
  3278. GSSR2:    MOV    CS:SAMPLE_RATE,AX    ;BEST BETWEEN 22222 - 44100 Hz
  3279.     RET
  3280. SET_SAMPLERATE ENDP
  3281. ;-----------------------------------------------------------------------------
  3282. SET_IRQ_RATE PROC NEAR
  3283.     PUSH    CS
  3284.     POP    DS
  3285.     MOV    BPM_RATE,AX
  3286.     MOV    AX,BPM_VALUE
  3287.     CALL    Go_SetBPM
  3288.     RET
  3289. SET_IRQ_RATE ENDP
  3290. ;-----------------------------------------------------------------------------
  3291. ; STARTET SAMPLE AUSGABE
  3292. ; BX= SAMPLE-HANDLE, CX= SAMPLERATE, AL= PANNING: 0= LEFT, 255=RIGHT
  3293. ;-----------------------------------------------------------------------------
  3294. PLAY_SAMPLE PROC NEAR
  3295.     PUSH    CS
  3296.     POP    DS
  3297.     TEST    PAS_MODUS,1
  3298.     JNZ    GPSMP1
  3299.     CMP    EMS_SEG,0
  3300.     JE    GPSMP1
  3301.     MOVZX    DI,SAM_CH
  3302.     SHL    DI,1
  3303.     XOR    AH,AH
  3304.     SHR    AL,4
  3305.     PUSH    AX
  3306.     MOV    AX,CX    
  3307.     SHL    EAX,16
  3308.     MOVZX    ECX,SAMPLE_RATE
  3309.     XOR    EDX,EDX
  3310.     DIV    ECX
  3311.     POP    DX
  3312.     OR    EAX,EAX
  3313.     JZ    SHORT GPSMP1
  3314.     CLI
  3315.     MOV    [SAM_PAN+DI],DX
  3316.     MOV    [SAM_FIX+DI],AX
  3317.     SHR    EAX,16
  3318.     MOV    [SAM_FRQ+DI],AX
  3319.     MOV    [SAM_OFL+DI],0
  3320.     MOV    AX,[SAMPLE_BIG+BX]
  3321.     MOV    [SAM_MAX+DI],AX
  3322.     MOV    AX,EMS_SEG
  3323.     MOV    [SAM_SEG+DI],AX
  3324.     MOVZX    EAX,[SAMPLE_MEM+BX]
  3325.     SHL    DI,1
  3326.     SHL    EAX,4
  3327.     MOV    [SAM_OFS+DI],EAX
  3328.     STI
  3329.     INC    SAM_CH
  3330.     CMP    SAM_CH,FX_CHAN_NUMB
  3331.     JB    SHORT GPSMP1
  3332.     MOV    SAM_CH,0
  3333. GPSMP1:    RET
  3334. PLAY_SAMPLE ENDP
  3335. ;-----------------------------------------------------------------------------
  3336. END_SAMPLE PROC NEAR
  3337.     PUSH    CS
  3338.     POP    DS
  3339.     XOR    BX,BX
  3340. LENDS1:    MOV    [SAM_SEG+BX],0
  3341.     INC    BX
  3342.     INC    BX
  3343.     CMP    BX,2*FX_CHAN_NUMB
  3344.     JB    LENDS1
  3345.     CMP    EMS_SEG,0
  3346.     JE    SHORT GEMP1
  3347.     MOV    AH,45H
  3348.     MOV    DX,EMS_HANDLE
  3349.     INT    67H
  3350.     MOV    EMS_SEG,0
  3351. GEMP1:    RET
  3352. END_SAMPLE ENDP
  3353. ;=============================================================================
  3354.  
  3355.  
  3356. IF COM_OR_OBJ
  3357. ;=============================================================================
  3358. MAIN_CONT PROC NEAR
  3359.     PUSH    BP DS CS ES
  3360.     POP    DS
  3361.     SHL    DI,2
  3362.     ADD    DI,0100H
  3363.     CALL    DI            ;FAR CALL
  3364.     SETC    DL
  3365.     XOR    DH,DH
  3366.     POP    DS BP            ;BP IS ABSOLUTELY IMPORTANT FOR C
  3367.     RETF
  3368. MAIN_CONT ENDP
  3369. ;=============================================================================
  3370.  
  3371. ELSE
  3372. ;=============================================================================
  3373. ;
  3374. ; MAIN ROUTINE
  3375. ;
  3376. ;=============================================================================
  3377. MAIN_CONT PROC NEAR
  3378.     MOV    AX,CS            ;DS setzen
  3379.     MOV    DS,AX
  3380.     MOV     PROG_START_SEG,ES       ;PROGRAMMANFANG
  3381.     MOV     AX,SS                   ;UND -ENDE MERKEN
  3382.     MOV     BX,OFFSET PROG_END
  3383.     ADD     BX,STACKLENGTH
  3384.     MOV     SP,BX
  3385.     SHR     BX,4
  3386.     INC     BX
  3387.     ADD     AX,BX
  3388.     MOV     PROG_END_SEG,AX
  3389.     XOR    BX,BX
  3390. GL1:    MOV    AL,ES:[82H+BX]
  3391.     OR    AL,AL
  3392.     JZ    SHORT GL2
  3393.     CMP    AL,20H
  3394.     JE    SHORT GL2
  3395.     CMP    AL,0DH
  3396.     JE    SHORT GL2
  3397.     MOV    [MOD_NAME+BX],AL
  3398.     INC    BX
  3399.     CMP    BX,40H
  3400.     JB    GL1
  3401. GL2:    OR    BX,BX
  3402.     JZ    GMEND
  3403.     XOR    AL,AL
  3404.     MOV    [MOD_NAME+BX],0
  3405.     CALL    FREE_MEM
  3406.     MOV    VAR_BUFSEG,0
  3407. ;-----------------------------------------------------------------------------
  3408. ; INITIALIZING & STARTING
  3409. ;    MOV    AX,44100        ;SET MAXIMUM SAMPLERATE
  3410. ;    CALL    SET_SAMPLERATE
  3411. ;    MOV    AL,255            ;SET MAXIMUM VOLUME
  3412. ;    MOV    BL,AL
  3413. ;    MOV    BH,AL
  3414. ;    CALL    SET_VOLUME
  3415.     CALL    CONFIG_INIT        ;GET CONFIG
  3416.     MOV    DX,OFFSET MOD_NAME    ;FIRST, TRY LOADING
  3417.     CALL    LOAD_MOD
  3418.     JNC    SHORT GM1
  3419.     MOV    AH,9
  3420.     MOV    DX,OFFSET ERROR1_TEXT
  3421.     INT    21H
  3422.     JMP    SHORT GM4
  3423. GM1:    MOV    DX,OFFSET SAMPLE_NAME    ;GET SAMPLE
  3424.     MOV    CL,80H            ;PC-SAMPLE
  3425.     CALL    LOAD_SAMPLE
  3426.     JNC    SHORT GM2
  3427.     MOV    AH,9
  3428.     MOV    DX,OFFSET ERROR2_TEXT
  3429.     INT    21H
  3430. GM2:    CALL    PLAY_MUSIC        ;TRY STARTING
  3431.     JNC    SHORT GM3
  3432.     MOV    AH,9
  3433.     MOV    DX,OFFSET ERROR3_TEXT
  3434.     INT    21H
  3435.     JMP    SHORT GM4
  3436. ;-----------------------------------------------------------------------------
  3437. ; THIS COULD BE THE MAIN ROUTINE
  3438. GM3:    MOV    AH,9
  3439.     MOV    DX,OFFSET OUT_TEXT
  3440.     INT    21H
  3441. LM1:    XOR    AH,AH
  3442.     INT    16H
  3443.     CMP    AL,27
  3444.     JE    SHORT GM5
  3445.     CMP    AL,"+"
  3446.     JNE    SHORT G1
  3447.     CALL    GET_VOLUME
  3448.     INC    AL
  3449.     CALL    SET_VOLUME
  3450.     JMP    LM1
  3451. G1:    CMP    AL,"-"
  3452.     JNE    SHORT G2
  3453.     CALL    GET_VOLUME
  3454.     DEC    AL
  3455.     CALL    SET_VOLUME
  3456.     JMP    LM1
  3457. G2:    CMP    AL,"9"
  3458.     JNE    SHORT G3
  3459.     MOV    AL,0
  3460.     CALL    SET_SONGLOOP
  3461.     JMP    LM1
  3462. G3:    CMP    AL,"0"
  3463.     JNE    SHORT G4
  3464.     INC    PAS_MODUS
  3465.     MOV    AL,PAS_MODUS
  3466.     CALL    SET_SONGMOD
  3467.     JMP    LM1
  3468. G4:    CMP    AL,"1"
  3469.     JNE    LM1
  3470.     ADD    PAN_FX,10H
  3471.     MOV    AL,PAN_FX        ;PANNING
  3472.     XOR    BX,BX            ;HANDLE
  3473.     MOV    CX,22050        ;FREQUENCE
  3474.     CALL    PLAY_SAMPLE
  3475.     JMP    LM1
  3476. ;-----------------------------------------------------------------------------
  3477. ; CUTTING OFF
  3478. GM5:    CALL    STOP_MUSIC        ;STOP MUSIC
  3479. GM4:    CALL    END_SAMPLE        ;UNLOAD SAMPLES
  3480.     CALL    END_MUSIC        ;UNLOAD MUSIC
  3481. GMEND:    MOV     AX,4C00H                ;BEENDEN NACH DOS
  3482.     INT     21H
  3483. MAIN_CONT ENDP
  3484. ;=============================================================================
  3485. ENDIF
  3486.  
  3487. ;=============================================================================
  3488. RASTER_COL PROC NEAR
  3489.     MOV    DX,03DAH
  3490.     IN    AL,DX
  3491.     MOV     DX,03C0H                ;OVERSCAN AENDERN        
  3492.     MOV     AL,31H                  ;REGISTER 11H
  3493.     OUT     DX,AL                   ;BILDSCHIRM AUS
  3494.     MOV     AL,AH                   ;WERT AH IN REGISTER (DAC-INDEX)
  3495.     OUT     DX,AL
  3496.     RET
  3497. RASTER_COL ENDP
  3498. ;=============================================================================
  3499. CODE_SEG3 ENDS
  3500.  
  3501. END _MAIN3