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

  1. ;
  2. ;       ╔═════════════════════════════╗
  3. ;       ║                             ║
  4. TITLE   ║ GRAVIS ULTRASOUND MODPLAYER ║
  5. ;       ║                             ║
  6. ;       ╚═════════════════════════════╝
  7. ;
  8. ; THIS MODULE PLAYER WAS CODED IN EARLY 1994
  9. ;
  10. ;                        BY SILVIO TURELLO (FRONTMAN/CREW242)
  11. ;
  12. ; IT IS A COMPLETELY REVISED VERSION OF GUSPLAY 1.5
  13. ;
  14. ;                        BY ROBERT ADOLFSSON (CASCADA)
  15. ;
  16. ; FEATURES: 4/6/8-CHANNEL-MODS (M.K./FLT4/FLT8/OCTA/8CHN/6CHN)
  17. ;
  18. ;           16-FX-CHANNELS, FULL MOD-FX SUPPORT, FULL 8/16-BIT DMA SUPPORT
  19. ;
  20. ;           1 MB GUS SUPPORT, PANNING COMMAND E8x, OF COURSE VERY FAST
  21. ;
  22. ; MEMORY:   13K CODE, 0-64K TRACKBUF
  23. ;
  24. .ALPHA
  25. .MODEL MEDIUM
  26. COM_OR_OBJ    = 0
  27. STACKLENGTH     = 0100H
  28. UGROUP4 GROUP CODE_SEG4, DATA_SEG4
  29. ASSUME CS:UGROUP4, DS:UGROUP4, SS:UGROUP4
  30. ;=============================================================================
  31. IRQ1            = 20H
  32. IRQ2        = 21H
  33. IRQ3        =0A0H
  34. IRQ4        =0A1H
  35. TIMER0        = 40H
  36. PIT1        = 43H
  37. UHR_INDEX    = 70H
  38. UHR_PORT    = 71H
  39. UHR_STATA    = 0AH
  40. UHR_STATB    = 0BH
  41. UHR_STATC    = 0CH
  42. ;-----------------------------------------------------------------------------
  43. NumVoices    = 25        ; Number of voices to use
  44. StatusPort    = 6h        ; UltraSound Ports
  45. TimerCtrlPort    = 8h
  46. TimerDataPort    = 9h
  47. DMASetPort    = 0Bh
  48. MidiCtrlPort    = 100h
  49. MidiDataPort    = 101h
  50. ActiveVoicePort    = 102h
  51. CommandPort    = 103h
  52. DataLowPort    = 104h
  53. DataHighPort    = 105h
  54. DRAMIOPort    = 107h
  55. GUS_VERSION    = 506h
  56. ICMIX_SEL    = 506h
  57. ICMIX_DATA    = 106h
  58. CODEC_BASE    = 10Ch
  59.  
  60. WriteVoiceMode    = 00h        ; UltraSound Commands
  61. SetVoiceFreq    = 01h        ; Value=Freq/Divisor
  62. LoopStartLo    = 02h
  63. LoopStartHi    = 03h
  64. SampleEndLo    = 04h
  65. SampleEndHi    = 05h
  66. VolRampRate    = 06h
  67. VolRampStart    = 07h
  68. VolRampEnd    = 08h
  69. SetVolume    = 09h
  70. SampleStartLo    = 0Ah
  71. SampleStartHi    = 0Bh
  72. VoiceBalance    = 0Ch
  73. VolumeCtrl    = 0Dh
  74. VoicesActive    = 0Eh
  75. DMACtrl        = 41h
  76. DMAAddr        = 42h
  77. DRAMAddrLo    = 43h
  78. DRAMAddrHi    = 44h
  79. Initialize    = 4Ch
  80. ReadVolume    = 89h
  81. VoicePosLo    = 8Ah
  82. VoicePosHi    = 8Bh
  83. ReadVolCtrl    = 8Dh
  84.  
  85. Voices14    = 4300        ; Divisors
  86. Voices15    = 4000
  87. Voices16    = 3700
  88. Voices17    = 3500
  89. Voices18    = 3300
  90. Voices19    = 3100
  91. Voices20    = 3030
  92. Voices21    = 2800
  93. Voices22    = 2700
  94. Voices23    = 2600
  95. Voices24    = 2500
  96. Voices25    = 2400
  97. Voices26    = 2300
  98. Voices27    = 2200
  99. Voices28    = 2100
  100. Voices29    = 2000
  101. Voices30    = 2000
  102. Voices31    = 1900
  103. Voices32    = 1800
  104. ;-----------------------------------------------------------------------------
  105. CHAN_SIZE    = 52
  106. CHAN_INFO STRUC
  107. SAMP_OFF    DD 0
  108. FREQ_VAL     DW 0
  109. VOL         DW 0
  110. OLD_VOL        DW 0
  111. FINE         DW 0
  112. REPEAT         DW 0
  113. REPLEN         DW 0
  114. LEN         DW 0
  115. AMIGA         DW 0
  116. EFFECT         DW 0
  117. VIBRATO_POINT     DW 0
  118. OLD_VIBRATO     DW 0
  119. PORT_TO        DW 0
  120. OLD_PORT_TO     DW 0
  121. EFFECT_TIME    DW 0
  122. CURR_SAMP    DW 0
  123. OLD_SAMP    DW 0
  124. ARP         DW 0,0,0
  125. ARP_COUNTER     DW 0
  126. INST_SET    DB 0
  127. BALANCE        DB 0
  128. LOOP_ONOFF    DW 0
  129. OFFSET_ADD    DW 0
  130. TRACK_OFF    DW 0
  131. CHAN_INFO ENDS
  132. ;=============================================================================
  133.  
  134. DATA_SEG4 SEGMENT WORD USE16
  135. ;=============================================================================
  136. PROG_START_SEG  DW 0
  137. PROG_END_SEG    DW 0
  138. IF COM_OR_OBJ
  139. VAR_BUFSEG    DW 0
  140. ELSE
  141. VAR_BUFSEG    DW 8000H
  142. ENDIF
  143. GDDLENGTH    DD 0
  144. GDDREST        DW 0
  145. GDDHANDLE    DW 0
  146. GDDSEG        DW 0
  147. BUFSEG        DW 0
  148. GDDZEIG        DB 0
  149. SAM_CH        DB 8
  150. MOD_STAT    DB 0
  151. US_MODUS    DB 0            ;0=MUSIC&FX, 1=MUSIC, 2=FX, 3=OFF
  152. CD_MIXER    DB 0            ;0=MODULES ONLY, 1=CD MIXED
  153. LOADMOD_FLAG    DB 0
  154. SYSTEM        DB 0
  155. IRQCOUNT    DB 56
  156. COMP_SPEED2     DW 0106H
  157. COMP_SPEED3     DW 4006H
  158. COMP_SPEED4     DW 0
  159. COMP_SPEED5     DW 1165
  160. HOLD70  LABEL   DWORD
  161.         DW OFFSET CONTROL_CHANNELS, 0
  162. PAN_REGS    DB 3,12,12,3,3,12,12,3
  163.         DB 2,13,2,13,2,13,2,13
  164.         DB 2,13,2,13,2,13,2,13
  165.         DB 2,13,2,13,2,13,2,13
  166. PAN_FX        DB 0
  167. SONG_START    DB 0
  168. MOD_NAME    DB 88 DUP(0)
  169. ;-----------------------------------------------------------------------------
  170. ERROR1_TEXT    DB "MOD ERROR",13,10,"$"
  171. ERROR2_TEXT    DB "FX ERROR",13,10,"$"
  172. OUT_TEXT    DB "+/- VOLUME",13,10
  173.         DB "1   PLAY SAMPLE",13,10
  174.         DB "9   INIT REPEAT",13,10
  175.         DB "0   MUSIC MODE",13,10,"$"
  176. SAMPLE_NAME    DB "SAMPLE1.SAM",0
  177. CONFIG_NAME     DB "SS3.CFG",0
  178. CFG_TEXT2       DB "DEFAULT MUSIC MODE = ",0
  179. CFG_TEXT3       DB "SOUNDCARD BASE PORT = ",0
  180. CFG_TEXT5       DB "SOUNDCARD DMA NUMBER = ",0
  181. CFG_TEXT7       DB "SYSTEM COMPATIBILITY = ",0
  182. DMA_ADR        DB 0,2,4,6,0C0H,0C4H,0C8H,0CCH
  183. DMA_CNT        DB 1,3,5,7,0C2H,0C6H,0CAH,0CEH
  184. DMA_PAGE    DB 87H,83H,81H,82H,8FH,8BH,89H,8AH
  185. DMA_STAT    DB 08H,08H,08H,08H,0D0H,0D0H,0D0H,0D0H
  186. DMA_BITS    DB 1,2,4,8,1,2,4,8
  187. DMA_MASK    DB 0AH,0AH,0AH,0AH,0D4H,0D4H,0D4H,0D4H
  188. DMA_MOD        DB 0BH,0BH,0BH,0BH,0D6H,0D6H,0D6H,0D6H
  189. DMA_FLIP    DB 0CH,0CH,0CH,0CH,0D8H,0D8H,0D8H,0D8H
  190. DMA_RESET    DB 0DH,0DH,0DH,0DH,0DAH,0DAH,0DAH,0DAH
  191. DMA_SET_DATA    DB 0,1,0,2,0,3,4,5
  192. ;-----------------------------------------------------------------------------
  193. ; PROTRACKER VARIABLEN
  194. ;-----------------------------------------------------------------------------
  195. ALIGN 2
  196. ULTRA16        DW 0
  197. CODEC_PORT    DW 32CH
  198. BASE_PORT    DW 220H
  199. DMA_CHANNEL    DW 1            ;DMA 0 IS NO DMA BYTE-PUSHING
  200. MASTER_VOLUME    DW 255
  201. MUSIC_VOLUME    DW 255
  202. FX_VOLUME    DW 255
  203. MUSIC_VOL    DW 255
  204. FX_VOL        DW 255
  205. BPM_RATE    DW 1024
  206. BPM_VALUE    DW 125
  207. BPM_COUNT    DD 0
  208. BPM_SPEED    DD 0
  209. COUNTER        DW 0
  210. CH_NUMB        DW 4
  211. PATT_SPEED    DW 0
  212. PATT_COUNT    DW 0
  213. PATT_ROW    DW 0
  214. PATT_CURRENT    DW 0
  215. PATT_BREAK    DW 0
  216. ;-----------------------------------------------------------------------------
  217. ; MTM - TRACKSTRUKTUR
  218. ;-----------------------------------------------------------------------------
  219. ALIGN 2
  220. TRACK_NUMBER    DW 0
  221. TRACK_INFO    DB 8 DUP(0)
  222. TRACK_SEG    DW 0
  223. TRACKS_OFFSET    DW OFFSET TRACK1_DATA, OFFSET TRACK2_DATA, OFFSET TRACK3_DATA
  224.         DW OFFSET TRACK4_DATA, OFFSET TRACK5_DATA, OFFSET TRACK6_DATA
  225.         DW OFFSET TRACK7_DATA, OFFSET TRACK8_DATA
  226. TRACK1_DATA    DB 128 DUP(0)
  227. TRACK2_DATA    DB 128 DUP(0)
  228. TRACK3_DATA    DB 128 DUP(0)
  229. TRACK4_DATA    DB 128 DUP(0)
  230. TRACK5_DATA    DB 128 DUP(0)
  231. TRACK6_DATA    DB 128 DUP(0)
  232. TRACK7_DATA    DB 128 DUP(0)
  233. TRACK8_DATA    DB 128 DUP(0)
  234. ;-----------------------------------------------------------------------------
  235. ; MOD - DATEISTRUKTUR
  236. ;-----------------------------------------------------------------------------
  237. ALIGN 2
  238. PATTERN_SIZE    DW 0
  239. PATTERN_SEG    DW 0
  240. PATTERN_NUMBER    DW 0
  241. IOFFSET        DD 31 DUP(0)
  242. ISIZE        DW 31 DUP(0)
  243. IVOLUME        DW 31 DUP(0)
  244. IFINETUNE    DW 31 DUP(0)
  245. ILOOP_START    DW 31 DUP(0)
  246. ILOOP_SIZE    DW 31 DUP(0)
  247. SONG_SIZE    DB 0
  248. SONG_LOOP    DB 0
  249. ;-----------------------------------------------------------------------------
  250. ; PLAYER - KONTROLLSTRUKTUREN
  251. ;-----------------------------------------------------------------------------
  252. ALIGN 2
  253. SONG_DATA    LABEL    BYTE
  254. FREQ_TABLE    DW 780 DUP(0)    ;908
  255. QUEUE_BUFFER    DW 128 DUP(0)
  256. SAMP_CHANS    CHAN_INFO 8 DUP(<>)
  257. SAMPLE_CHAN    CHAN_INFO <>
  258. ;-----------------------------------------------------------------------------
  259. ; SINGLE SAMPLE VARIABLES
  260. ;-----------------------------------------------------------------------------
  261. GUS_MEM        DD 0
  262. SAMPLE_ZEIG    DW 0
  263. SAMPLE_MEM    DD 64 DUP(0)
  264. SAMPLE_BIG    DW 64 DUP(0)
  265. SAM_COUNT    DW 32 DUP(0)
  266. ;-----------------------------------------------------------------------------
  267. ALIGN 2
  268. PattJumps    DW OFFSET ARPeggioFix    ; 0
  269.         DW OFFSET NoPattEFFECT    ; 1
  270.         DW OFFSET NoPattEFFECT    ; 2
  271.         DW OFFSET PORT_TOFix    ; 3
  272.         DW OFFSET VibratoFix    ; 4
  273.         DW OFFSET NoPattEFFECT    ; 5
  274.         DW OFFSET NoPattEFFECT    ; 6
  275.         DW OFFSET NoPattEFFECT    ; 7
  276.         DW OFFSET NoPattEFFECT    ; 8
  277.         DW OFFSET SampleOff    ; 9
  278.         DW OFFSET NoPattEFFECT    ; A
  279.         DW OFFSET PosJump    ; B
  280.         DW OFFSET VOLume    ; C
  281.         DW OFFSET BreakPatt    ; D
  282.         DW OFFSET NoPattEFFECT    ; E
  283.         DW OFFSET SpeedSet    ; F
  284.  
  285. EPattJumps    DW OFFSET NoPattEFFECT    ; 0
  286.         DW OFFSET FINEPortUp    ; 1
  287.         DW OFFSET FINEPortDown    ; 2
  288.         DW OFFSET NoPattEFFECT    ; 3
  289.         DW OFFSET NoPattEFFECT    ; 4
  290.         DW OFFSET NoPattEFFECT    ; 5
  291.         DW OFFSET NoPattEFFECT    ; 6
  292.         DW OFFSET NoPattEFFECT    ; 7
  293.         DW OFFSET PANNING    ; 8
  294.         DW OFFSET NoPattEFFECT    ; 9
  295.         DW OFFSET FINEVOLUP    ; A
  296.         DW OFFSET FINEVOLDown    ; B
  297.         DW OFFSET NoPattEFFECT    ; C
  298.         DW OFFSET NoPattEFFECT    ; D
  299.         DW OFFSET NoPattEFFECT    ; E
  300.         DW OFFSET NoPattEFFECT    ; F
  301.  
  302. EFFECTJumps    DW OFFSET ARPeggio    ; 0
  303.         DW OFFSET PortUp    ; 1
  304.         DW OFFSET PortDown    ; 2
  305.         DW OFFSET PORT_TOTone    ; 3
  306.         DW OFFSET Vibrato    ; 4
  307.         DW OFFSET PORT_TOVSlide    ; 5
  308.         DW OFFSET VibratoVSlide    ; 6
  309.         DW OFFSET NoEFFECT    ; 7
  310.         DW OFFSET NoEFFECT    ; 8
  311.         DW OFFSET NoEFFECT    ; 9
  312.         DW OFFSET VOLSlide    ; A
  313.         DW OFFSET NoEFFECT    ; B
  314.         DW OFFSET NoEFFECT    ; C
  315.         DW OFFSET NoEFFECT    ; D
  316.         DW OFFSET NoEFFECT    ; E
  317.         DW OFFSET NoEFFECT    ; F
  318.  
  319. EEFFECTJumps    DW OFFSET NoEFFECT    ; 0
  320.         DW OFFSET NoEFFECT    ; 1
  321.         DW OFFSET NoEFFECT    ; 2
  322.         DW OFFSET NoEFFECT    ; 3
  323.         DW OFFSET NoEFFECT    ; 4
  324.         DW OFFSET NoEFFECT    ; 5
  325.         DW OFFSET NoEFFECT    ; 6
  326.         DW OFFSET NoEFFECT    ; 7
  327.         DW OFFSET NoEFFECT    ; 8
  328.         DW OFFSET RetrigNote    ; 9
  329.         DW OFFSET NoEFFECT    ; A
  330.         DW OFFSET NoEFFECT    ; B
  331.         DW OFFSET CutNote    ; C
  332.         DW OFFSET DelayNote    ; D
  333.         DW OFFSET NoEFFECT    ; E
  334.         DW OFFSET NoEFFECT    ; F
  335.  
  336. SIN_TAB        DB 0,25,50,74,98,120,142,162,180,197,212,225,236
  337.         DB 244,250,254,255,254,250,244,236,225,212,197,180
  338.         DB 162,142,120,98,74,50,25
  339.  
  340. PERIOD_TABLE    LABEL    WORD
  341. DW 856,808,762,720,678,640,604,570,538,508,480,453 ;C-1 to H-1 Finetune +0.
  342. DW 428,404,381,360,339,320,302,285,269,254,240,226 ;C-2 to H-2 Finetune +0.
  343. DW 214,202,190,180,170,160,151,143,135,127,120,113 ;C-3 to H-3 Finetune +0.
  344. DW 107,101, 95, 90, 85, 80, 75, 71, 67, 63, 60, 56 ;C-4 to H-4 Finetune +0.
  345.  
  346. DW 850,802,757,715,674,637,601,567,535,505,477,450 ;C-1 to H-1 Finetune +1.
  347. DW 425,401,379,357,337,318,300,284,268,253,239,225 ;C-2 to H-2 Finetune +1.
  348. DW 213,201,189,179,169,159,150,142,134,126,119,113 ;C-3 to H-3 Finetune +1.
  349. DW 106,100, 94, 89, 84, 79, 75, 71, 67, 83, 59, 56 ;C-4 to H-4 Finetune +1.
  350.  
  351. DW 844,796,752,709,670,632,597,563,532,502,474,447 ;C-1 to H-1 Finetune +2.
  352. DW 422,398,376,355,335,316,298,282,266,251,237,224 ;C-2 to H-2 Finetune +2.
  353. DW 211,199,188,177,167,158,149,141,133,125,118,112 ;C-3 to H-3 Finetune +2.
  354. DW 105, 99, 94, 88, 83, 79, 74, 70, 66, 62, 59, 56 ;C-4 to H-4 Finetune +2.
  355.  
  356. DW 838,791,746,704,665,628,592,559,528,498,470,444 ;C-1 to H-1 Finetune +3.
  357. DW 419,395,373,352,332,314,296,280,264,249,235,222 ;C-2 to H-2 Finetune +3.
  358. DW 209,198,187,176,166,157,148,140,132,125,118,111 ;C-3 to H-3 Finetune +3.
  359. DW 104, 99, 93, 88, 83, 78, 74, 70, 66, 62, 59, 55 ;C-4 to H-4 Finetune +3.
  360.  
  361. DW 832,785,741,699,660,623,588,555,524,495,467,441 ;C-1 to H-1 Finetune +4.
  362. DW 416,392,370,350,330,312,294,278,262,247,233,220 ;C-2 to H-2 Finetune +4.
  363. DW 208,196,185,175,165,156,147,139,131,124,117,110 ;C-3 to H-3 Finetune +4.
  364. DW 104, 98, 92, 87, 82, 78, 73, 69, 65, 62, 58, 55 ;C-4 to H-4 Finetune +4.
  365.  
  366. DW 826,779,736,694,655,619,584,551,520,491,463,437 ;C-1 to H-1 Finetune +5.
  367. DW 413,390,368,347,328,309,292,276,260,245,232,219 ;C-2 to H-2 Finetune +5.
  368. DW 206,195,184,174,164,155,146,138,130,123,116,109 ;C-3 to H-3 Finetune +5.
  369. DW 103, 97, 92, 87, 82, 77, 73, 69, 65, 61, 58, 54 ;C-4 to H-4 Finetune +5.
  370.  
  371. DW 820,774,730,689,651,614,580,547,516,487,460,434 ;C-1 to H-1 Finetune +6.
  372. DW 410,387,365,345,325,307,290,274,258,244,230,217 ;C-2 to H-2 Finetune +6.
  373. DW 205,193,183,172,163,154,145,137,129,122,115,109 ;C-3 to H-3 Finetune +6.
  374. DW 102, 96, 91, 86, 81, 77, 72, 68, 64, 61, 57, 54 ;C-4 to H-4 Finetune +6.
  375.  
  376. DW 814,768,725,684,646,610,575,543,513,484,457,431 ;C-1 to H-1 Finetune +7.
  377. DW 407,384,363,342,323,305,288,272,256,242,228,216 ;C-2 to H-2 Finetune +7.
  378. DW 204,192,181,171,161,152,144,136,128,121,114,108 ;C-3 to H-3 Finetune +7.
  379. DW 102, 96, 90, 85, 80, 76, 72, 68, 64, 60, 57, 54 ;C-4 to H-4 Finetune +7.
  380.  
  381. DW 907,856,808,762,720,678,640,604,570,538,504,480 ;C-1 to H-1 Finetune -8.
  382. DW 453,428,404,381,360,339,320,302,285,269,254,240 ;C-2 to H-2 Finetune -8.
  383. DW 226,214,202,190,180,170,160,151,143,135,127,120 ;C-3 to H-3 Finetune -8.
  384. DW 113,107,101, 95, 90, 85, 80, 75, 71, 67, 63, 60 ;C-4 to H-4 Finetune -8.
  385.  
  386. DW 900,850,802,757,715,675,636,601,567,535,505,477 ;C-1 to H-1 Finetune -7.
  387. DW 450,425,401,379,357,337,318,300,284,268,253,238 ;C-2 to H-2 Finetune -7.
  388. DW 225,212,200,189,179,169,159,150,142,134,126,119 ;C-3 to H-3 Finetune -7.
  389. DW 112,106,100, 94, 89, 84, 79, 75, 71, 67, 63, 59 ;C-4 to H-4 Finetune -7.
  390.  
  391. DW 894,844,796,752,709,670,632,597,563,532,502,474 ;C-1 to H-1 Finetune -6.
  392. DW 447,422,398,376,355,335,316,298,282,266,251,237 ;C-2 to H-2 Finetune -6.
  393. DW 223,211,199,188,177,167,158,149,141,133,125,118 ;C-3 to H-3 Finetune -6.
  394. DW 111,105, 99, 94, 88, 83, 79, 74, 70, 66, 62, 59 ;C-4 to H-4 Finetune -6.
  395.  
  396. DW 887,838,791,746,704,665,628,592,559,528,498,470 ;C-1 to H-1 Finetune -5.
  397. DW 444,419,395,373,352,332,314,296,280,264,249,235 ;C-2 to H-2 Finetune -5.
  398. DW 222,209,198,187,176,166,157,148,140,132,125,118 ;C-3 to H-3 Finetune -5.
  399. DW 111,104, 99, 93, 88, 83, 78, 74, 70, 66, 62, 59 ;C-4 to H-4 Finetune -5.
  400.  
  401. DW 881,832,785,741,699,660,623,588,555,524,494,467 ;C-1 to H-1 Finetune -4.
  402. DW 441,416,392,370,350,330,312,294,278,262,247,233 ;C-2 to H-2 Finetune -4.
  403. DW 220,208,196,185,175,165,156,147,139,131,123,117 ;C-3 to H-3 Finetune -4.
  404. DW 110,104, 98, 92, 87, 82, 78, 73, 69, 65, 61, 58 ;C-4 to H-4 Finetune -4.
  405.  
  406. DW 875,826,779,736,694,655,619,584,551,520,491,463 ;C-1 to H-1 Finetune -3.
  407. DW 437,413,390,368,347,338,309,292,276,260,245,232 ;C-2 to H-2 Finetune -3.
  408. DW 219,206,195,184,174,164,155,146,138,130,123,116 ;C-3 to H-3 Finetune -3.
  409. DW 109,103, 97, 92, 87, 82, 77, 73, 69, 65, 61, 58 ;C-4 to H-4 Finetune -3.
  410.  
  411. DW 868,820,774,730,689,651,614,580,547,516,487,460 ;C-1 to H-1 Finetune -2.
  412. DW 434,410,387,365,345,325,307,290,274,258,244,230 ;C-2 to H-2 Finetune -2.
  413. DW 217,205,193,183,172,163,154,145,137,129,122,115 ;C-3 to H-3 Finetune -2.
  414. DW 108,102, 96, 91, 86, 81, 77, 72, 68, 64, 61, 57 ;C-4 to H-4 Finetune -2.
  415.  
  416. DW 862,814,768,725,684,646,610,575,543,513,484,457 ;C-1 to H-1 Finetune -1.
  417. DW 431,407,384,363,342,323,305,288,272,256,242,228 ;C-2 to H-2 Finetune -1.
  418. DW 216,203,192,181,171,161,152,144,136,128,121,114 ;C-3 to H-3 Finetune -1.
  419. DW 108,101, 96, 90, 85, 80, 76, 72, 68, 64, 60, 57 ;C-4 to H-4 Finetune -1.
  420.  
  421. GUS_VOL        DW 01000H,08FF0H,09FF0H,0A800H,0AFF0H,0B400H,0B800H,0BC00H
  422.         DW 0BFF0H,0C200H,0C400H,0C600H,0C800H,0CA00H,0CC00H,0CE00H
  423.         DW 0CFF0H,0D100H,0D200H,0D300H,0D400H,0D500H,0D600H,0D700H
  424.         DW 0D800H,0D900H,0DA00H,0DB00H,0DC00H,0DD00H,0DE00H,0DF00H
  425.         DW 0DFF0H,0E080H,0E100H,0E180H,0E200H,0E280H,0E300H,0E380H
  426.         DW 0E400H,0E480H,0E500H,0E580H,0E600H,0E680H,0E700H,0E780H
  427.         DW 0E800H,0E880H,0E900H,0E980H,0EA00H,0EA80H,0EB00H,0EB80H
  428.         DW 0EC00H,0EC80H,0ED00H,0ED80H,0EE00H,0EE80H,0EF00H,0EF80H
  429.         DW 0F800H    ;SINGLE SAMPLE MAX VOL > SONG MAX VOL
  430. ;-----------------------------------------------------------------------------
  431. PROG_END        LABEL   BYTE    ;MUSS LETZE ZEILE IM DATENSEGMENT SEIN!
  432. ;-----------------------------------------------------------------------------
  433. DATA_SEG4 ENDS
  434.  
  435. .386
  436. CODE_SEG4 SEGMENT PAGE USE16
  437. ORG 100H
  438. ;=============================================================================
  439. PUBLIC _MAIN4
  440. _MAIN4 PROC FAR
  441.     JMP    MAIN_CONT        ;0100
  442.     RETF
  443.     CALL    CONFIG_INIT        ;0104
  444.     RETF
  445.     CALL    LOAD_MOD        ;0108
  446.     RETF
  447.     CALL    PLAY_MUSIC        ;010C
  448.     RETF
  449.     CALL    STOP_MUSIC        ;0110
  450.     RETF
  451.     CALL    END_MUSIC        ;0114
  452.     RETF
  453.     CALL    LOAD_SAMPLE        ;0118
  454.     RETF
  455.     CALL    PLAY_SAMPLE        ;011C
  456.     RETF
  457.     CALL    END_SAMPLE        ;0120
  458.     RETF
  459.     JMP    NOFUNC            ;0124
  460. NOFUNC:    RETF
  461.     CALL    GET_VOLUME        ;0128
  462.     RETF
  463.     CALL    SET_VOLUME        ;012C
  464.     RETF
  465.     CALL    SET_SONGLOOP        ;0130
  466.     RETF
  467.     CALL    GET_SONGPOSITION    ;0134
  468.     RETF
  469.     CALL    SET_SONGPOSITION    ;0138
  470.     RETF
  471.     CALL    GET_SONGMOD        ;013C
  472.     RETF
  473.     CALL    SET_SONGMOD        ;0140
  474.     RETF
  475.     CALL    US_OFF            ;0144
  476.     RETF
  477.     CALL    INIT_DEVICE        ;0148
  478.     RETF
  479. _MAIN4 ENDP
  480. ;=============================================================================
  481.  
  482.  
  483. ;=============================================================================
  484. ALIGN 2
  485. CONTROL_CHANNELS PROC NEAR
  486.     PUSH    EAX EBX ECX EDX ESI EDI EBP
  487.     PUSH    DS ES CS
  488.     POP    DS
  489.     CMP    SYSTEM,0
  490.     JNE    SHORT WT6
  491.     MOV    AL,UHR_STATC
  492.     OUT    UHR_INDEX,AL
  493.     JMP    SHORT WT1
  494. WT1:    JMP    SHORT WT2
  495. WT2:    IN    AL,UHR_PORT
  496. WT6:    MOV     AL,20H
  497.     OUT     IRQ3,AL
  498.     OUT    IRQ1,AL
  499.     STI
  500.     CMP    LOADMOD_FLAG,0
  501.     JNE    EndPattern
  502.     INC    COUNTER
  503.     MOV    AX,WORD PTR [BPM_SPEED+2]
  504.     ADD    WORD PTR [BPM_COUNT+2],AX
  505.     MOV    AX,WORD PTR [BPM_SPEED]
  506.     ADC    WORD PTR [BPM_COUNT],AX
  507.     JC    JumpPattern
  508.     CMP    BPM_RATE,512
  509.     JB    EndPattern
  510.     CMP    COUNTER,3
  511.     JE    SHORT ClearNotes
  512.     CMP    COUNTER,6
  513.     JE    SetNotes
  514.     JMP    EndPattern
  515. ;-----------------------------------------------------------------------------
  516. ClearNotes:
  517.     CMP    MOD_STAT,0
  518.     JE    SHORT NOT_FINISHED
  519.     MOV    PATT_CURRENT,0
  520.     MOV    DI,OFFSET SAMP_CHANS
  521.     MOV    CX,CH_NUMB
  522. FINISH:    MOV    [DI.OLD_VOL],0
  523.     MOV    [DI.VOL],0
  524.     MOV    [DI.AMIGA],0
  525.     MOV    [DI.FREQ_VAL],0
  526.     ADD    DI,CHAN_SIZE
  527.     LOOP    FINISH
  528. NOT_FINISHED:
  529.     MOV    DI,OFFSET SAMP_CHANS
  530.     MOV    CX,CH_NUMB
  531.     MOV    DX,BASE_PORT
  532.     ADD    DX,CommandPort
  533. StopVoices:
  534.     DEC    DX
  535.     MOV    AL,BYTE PTR CH_NUMB
  536.     SUB    AL,CL
  537.     OUT    DX,AL
  538.     INC    DX
  539.     CMP    [DI.INST_SET],2
  540.     JE    SHORT VoiceOff1
  541.     CMP    [DI.INST_SET],1
  542.     JE    SHORT VoiceOff2
  543.     CMP    [DI.OFFSET_ADD],0
  544.     JNE    SHORT VoiceOff1
  545.     JMP    SHORT NoVoiceOff
  546. VoiceOff2:
  547.     MOV    AX,[DI.CURR_SAMP]
  548.     CMP    AX,[DI.OLD_SAMP]
  549.     JNE    SHORT VoiceOff1
  550.     JMP    SHORT NoVoiceOff
  551. VoiceOff1:
  552.     MOV    AX,[DI.OLD_VOL]
  553.     MOV    [DI.OLD_VOL],0
  554.     MOV    BP,GUS_VOL
  555.     MOV    BX,MUSIC_VOL
  556.     MUL    BL
  557.     MOVZX    BX,AH
  558.     SHL    BX,1
  559.     MOV    BX,[GUS_VOL+BX]
  560.     TEST    US_MODUS,2
  561.     JZ    SHORT WITH_SOUND1
  562.     MOV    BX,1000H
  563.     MOV    BP,BX
  564. WITH_SOUND1:
  565.     CALL    SEND_RAMP
  566. NoVoiceOff:
  567.     ADD    DI,CHAN_SIZE
  568.     LOOP    StopVoices
  569.     CMP    BPM_RATE,512
  570.     JAE    EndPattern
  571. ;-----------------------------------------------------------------------------
  572. SetNotes:
  573.     MOV    COUNTER,1
  574.     MOV    DI,OFFSET SAMP_CHANS
  575.     MOV    CX,CH_NUMB
  576.     MOV    DX,BASE_PORT
  577.     ADD    DX,CommandPort
  578. ChangeSamps:
  579.     DEC    DX
  580.     MOV    AL,BYTE PTR CH_NUMB
  581.     SUB    AL,CL
  582.     OUT    DX,AL
  583.     INC    DX
  584.     MOV    AL,[DI.BALANCE]        ;PANNING
  585.     MOV    AH,AL
  586.     SHR    AL,4
  587.     AND    AH,0FH
  588.     CMP    AL,AH
  589.     JE    SHORT NO_PANNING
  590.     MOV    AL,AH
  591.     SHL    AL,4
  592.     OR    AL,AH
  593.     MOV    [DI.BALANCE],AL
  594.     MOV    AL,VoiceBalance
  595.     OUT    DX,AL
  596.     ADD    DX,2
  597.     MOV    AL,AH
  598.     OUT    DX,AL
  599.     SUB    DX,2
  600. NO_PANNING:
  601.     CMP    [DI.INST_SET],2
  602.     JE    SHORT SampChange1
  603.     CMP    [DI.INST_SET],1
  604.     JE    SHORT SampChange2
  605.     CMP    [DI.OFFSET_ADD],0
  606.     JNE    SHORT ChangeOffset
  607.     JMP    SHORT NoChangeSamp
  608. ChangeOffset:
  609.     CALL    SEND_SAMPLE_START
  610.     JMP    SHORT NoChangeSamp
  611. SampChange1:
  612.     MOV    AH,3
  613.     CALL    SEND_WRITE_VOICE
  614.     CALL    WAIT_PORT
  615.     CALL    SEND_SAMPLE_START
  616.     MOV    AX,[DI.OLD_SAMP]
  617.     CMP    AX,[DI.CURR_SAMP]
  618.     JE    SHORT NoChangeSamp
  619.     CALL    SEND_SAMPLE_END
  620.     CALL    SEND_SAMPLE_LOOP
  621.     MOV    AH,3
  622.     CALL    SEND_WRITE_VOICE
  623.     JMP    SHORT NoChangeSamp
  624. SampChange2:
  625.     MOV    AX,[DI.OLD_SAMP]
  626.     CMP    AX,[DI.CURR_SAMP]
  627.     JE    SHORT NoChangeSamp
  628.     MOV    AL,VoicePosLo
  629.     OUT    DX,AL
  630.     INC    DX
  631.     IN    AX,DX
  632.     MOV    BX,AX
  633.     DEC    DX
  634.     MOV    AL,VoicePosHi
  635.     OUT    DX,AL
  636.     INC    DX
  637.     IN    AX,DX
  638.     DEC    DX
  639.     XCHG    AX,BX
  640.     SHL    AX,7
  641.     SHR    BX,9
  642.     AND    BX,7FH
  643.     OR    AX,BX
  644.     MOV    BX,[DI.OLD_SAMP]
  645.     DEC    BX
  646.     SHL    BX,2
  647.     SUB    AX,WORD PTR [IOFFSET+BX]
  648.     MOV    BX,AX
  649.     CMP    BX,[DI.LEN]
  650.     JB    SHORT NoFixStart
  651.     MOV    BX,[DI.LEN]
  652.     DEC    BX
  653. NoFixStart:
  654.     CMP    [DI.OFFSET_ADD],0
  655.     JNE    SHORT NoOffsetEff
  656.     MOV    [DI.OFFSET_ADD],BX
  657. NoOffsetEff:
  658.     CALL    SEND_SAMPLE_START
  659.     CALL    SEND_SAMPLE_END
  660.     CALL    SEND_SAMPLE_LOOP
  661.     MOV    AH,BYTE PTR [DI.LOOP_ONOFF]
  662.     CALL    SEND_WRITE_VOICE
  663.     CALL    WAIT_PORT
  664. NoChangeSamp:
  665.     MOV    AX,[DI.OLD_VOL]
  666.     MOV    BX,MUSIC_VOL
  667.     MUL    BL
  668.     MOVZX    BX,AH
  669.     SHL    BX,1
  670.     MOV    BX,[GUS_VOL+BX]
  671.     MOV    AX,[DI.VOL]
  672.     MOV    BP,MUSIC_VOL
  673.     MUL    BP
  674.     MOVZX    BP,AH
  675.     SHL    BP,1
  676.     MOV    BP,CS:[GUS_VOL+BP]
  677.     TEST    US_MODUS,2
  678.     JZ    SHORT WITH_SOUND2
  679.     MOV    BX,1000H
  680.     MOV    BP,BX
  681. WITH_SOUND2:
  682.     MOV    DX,BP
  683.     MOV    DL,BH
  684.     CMP    DL,DH
  685.     JNE    SHORT SetVOL
  686.     MOV    DX,BASE_PORT
  687.     ADD    DX,CommandPort
  688.     MOV    AL,VOLumeCtrl
  689.     OUT    DX,AL
  690.     ADD    DX,2
  691.     MOV    AL,3
  692.     OUT    DX,AL
  693.     SUB    DX,2
  694.     MOV    AL,SetVOLume
  695.     OUT    DX,AL
  696.     MOV    AX,BP
  697.     INC    DX
  698.     OUT    DX,AX
  699.     DEC    DX
  700.     JMP    SHORT NoSetVOL
  701. SetVOL:    CALL    SEND_RAMP
  702. NoSetVOL:
  703.     MOV    AL,SetVoiceFreq
  704.     OUT    DX,AL
  705.     INC    DX
  706.     MOV    AX,[DI.FREQ_VAL]
  707.     OUT    DX,AX
  708.     DEC    DX
  709.     SHL    COUNTER,1
  710.     ADD    DI,CHAN_SIZE
  711.     DEC    CX
  712.     JNZ    ChangeSamps
  713.     MOV    DI,OFFSET SAMP_CHANS
  714.     MOV    CX,CH_NUMB
  715. StartVoices:
  716.     DEC    DX
  717.     MOV    AL,BYTE PTR CH_NUMB
  718.     SUB    AL,CL
  719.     OUT    DX,AL
  720.     INC    DX
  721.     CMP    [DI.INST_SET],2
  722.     JNE    SHORT NoVoiceStart
  723.     MOV    AH,BYTE PTR [DI.LOOP_ONOFF]
  724.     CALL    SEND_WRITE_VOICE
  725.     CALL    WAIT_PORT
  726. NoVoiceStart:
  727.     MOV    [DI.INST_SET],0
  728.     MOV    [DI.OFFSET_ADD],0
  729.     ADD    DI,CHAN_SIZE
  730.     LOOP    StartVoices
  731.     JMP    EndPattern
  732. ;-----------------------------------------------------------------------------
  733. JumpPattern:
  734.     MOV    COUNTER,0
  735.     DEC    PATT_COUNT
  736.     JZ    DoPattern
  737.     MOV    DI,OFFSET SAMP_CHANS
  738.     MOV    CX,CH_NUMB
  739. EFFECTLoop:
  740.     MOV    AX,[DI.VOL]
  741.     MOV    [DI.OLD_VOL],AX
  742.     INC    [DI.EFFECT_TIME]
  743.     ADD    [DI.ARP_COUNTER],2
  744.     CMP    [DI.ARP_COUNTER],6
  745.     JB    SHORT NoWrapARP
  746.     MOV    [DI.ARP_COUNTER],0
  747. NoWrapARP:
  748.     MOV    AX,[DI.EFFECT]
  749.     OR    AX,AX
  750.     JZ    NoEFFECT
  751.     MOVZX    BX,AL
  752.     CMP    BL,0EH
  753.     JE    SHORT DoEEFFECTs
  754.     SHL    BX,1
  755.     JMP    [EFFECTJumps+BX]
  756. DoEEFFECTs:
  757.     MOV    BL,AH
  758.     AND    AH,0FH
  759.     SHR    BL,4
  760.     SHL    BX,1
  761.     JMP    [EEFFECTJumps+BX]
  762. ARPeggio:
  763.     MOV    BX,[DI.ARP_COUNTER]
  764.     MOV    BX,[DI.ARP+BX]
  765.     SHL    BX,1
  766.     MOV    AX,[FREQ_TABLE+BX]
  767.     MOV    [DI.FREQ_VAL],AX
  768.     JMP    NoEFFECT
  769. PortUp:    XCHG    AL,AH
  770.     XOR    AH,AH
  771.     MOV    SI,[DI.FINE]
  772.     MOV    BP,[PERIOD_TABLE+47*2+SI]    ;35
  773.     MOV    BX,[DI.AMIGA]
  774.     SUB    BX,AX
  775.     JNC    SHORT NoFix1
  776.     MOV    BX,BP
  777. NoFix1:    CMP    BX,BP
  778.     JAE    SHORT NotSmall1
  779.     MOV    BX,BP
  780. NotSmall1:
  781.     MOV    [DI.AMIGA],BX
  782.     SHL    BX,1
  783.     MOV    AX,[FREQ_TABLE+BX]
  784.     MOV    [DI.FREQ_VAL],AX
  785.     JMP    NoEFFECT
  786. PortDown:
  787.     XCHG    AL,AH
  788.     XOR    AH,AH
  789.     MOV    SI,[DI.FINE]
  790.     MOV    BP,[PERIOD_TABLE+SI]
  791.     MOV    BX,[DI.AMIGA]
  792.     ADD    BX,AX
  793.     CMP    BX,BP
  794.     JBE    SHORT NotBig1
  795.     MOV    BX,BP
  796. NotBig1:
  797.     MOV    [DI.AMIGA],BX
  798.     SHL    BX,1
  799.     MOV    AX,[FREQ_TABLE+BX]
  800.     MOV    [DI.FREQ_VAL],AX
  801.     JMP    NoEFFECT
  802. PORT_TOTone:
  803.     XCHG    AL,AH
  804.     XOR    AH,AH
  805. GOTO_PORT_TO:
  806.     MOV    DX,[DI.PORT_TO]
  807.     MOV    BX,[DI.AMIGA]
  808.     CMP    BX,DX
  809.     JAE    SHORT NoPORT_TOUp
  810.     ADD    BX,AX
  811.     CMP    BX,DX
  812.     JBE    SHORT NoPORT_TOUp
  813.     MOV    [DI.AMIGA],DX
  814. NoPORT_TOUp:
  815.     CMP    BX,DX
  816.     JBE    SHORT NoPORT_TODown
  817.     SUB    BX,AX
  818.     JNC    SHORT NoPORT_TOError
  819.     MOV    BX,DX
  820. NoPORT_TOError:
  821.     CMP    BX,DX
  822.     JAE    SHORT NoPORT_TODown
  823.     MOV    BX,DX
  824. NoPORT_TODown:
  825.     MOV    [DI.AMIGA],BX
  826.     SHL    BX,1
  827.     MOV    AX,[FREQ_TABLE+BX]
  828.     MOV    [DI.FREQ_VAL],AX
  829.     JMP    NoEFFECT
  830. Vibrato:
  831.     MOV    SI,[DI.FINE]
  832.     MOV    BP,[PERIOD_TABLE+47*2+SI]    ;35
  833.     MOV    SI,[PERIOD_TABLE+SI]
  834.     MOV    DL,AH
  835.     AND    AH,0F0H
  836.     SHR    AH,2
  837.     AND    DL,0FH
  838.     MOV    BL,BYTE PTR [DI.VIBRATO_POINT]
  839.     ADD    BL,AH
  840.     MOV    BYTE PTR [DI.VIBRATO_POINT],BL
  841.     SHR    BL,2
  842.     AND    BX,1Fh
  843.     MOV    AL,[SIN_TAB+BX]
  844.     MUL    DL
  845.     ROL    AX,1
  846.     XCHG    AL,AH
  847.     AND    AH,1
  848.     TEST    BYTE PTR [DI.VIBRATO_POINT],80H
  849.     JNE    SHORT VibUp1
  850.     NEG    AX
  851. VibUp1:    ADD    AX,[DI.AMIGA]
  852.     CMP    AX,BP
  853.     JAE    SHORT NoHighVibrato1
  854.     MOV    AX,BP
  855. NoHighVibrato1:
  856.     CMP    AX,SI
  857.     JBE    SHORT NoLowVibrato1
  858.     MOV    AX,SI
  859. NoLowVibrato1:
  860.     SHL    AX,1
  861.     MOV    BX,AX
  862.     MOV    AX,[FREQ_TABLE+BX]
  863.     MOV    [DI.FREQ_VAL],AX
  864.     JMP    NoEFFECT
  865. PORT_TOVSlide:
  866.     MOV    AL,AH
  867.     AND    AH,0FH
  868.     SHR    AL,4
  869.     SUB    AH,AL
  870.     MOV    AL,BYTE PTR [DI.VOL]
  871.     SUB    AL,AH
  872.     JNS    SHORT NoSlideLow2
  873.     XOR    AL,AL
  874. NoSlideLow2:
  875.     CMP    AL,40H
  876.     JBE    SHORT NoSlideHigh2
  877.     MOV    AL,40H
  878. NoSlideHigh2:
  879.     MOV    BYTE PTR [DI.VOL],AL
  880.     MOV    AX,[DI.OLD_PORT_TO]
  881.     JMP    GOTO_PORT_TO
  882. VibratoVSlide:
  883.     MOV    AL,AH
  884.     AND    AH,0FH
  885.     SHR    AL,4
  886.     SUB    AH,AL
  887.     MOV    AL,BYTE PTR [DI.VOL]
  888.     SUB    AL,AH
  889.     JNS    SHORT NoSlideLow3
  890.     XOR    AL,AL
  891. NoSlideLow3:
  892.     CMP    AL,40H
  893.     JBE    SHORT NoSlideHigh3
  894.     MOV    AL,40H
  895. NoSlideHigh3:
  896.     MOV    BYTE PTR [DI.VOL],AL
  897.     JMP    Vibrato
  898. VOLSlide:
  899.     MOV    AL,AH
  900.     AND    AH,0FH
  901.     SHR    AL,4
  902.     OR    AL,AL
  903.     JZ    SHORT NoVOLSlideUp
  904.     NEG    AL
  905.     MOV    AH,AL
  906. NoVOLSlideUp:
  907.     MOV    AL,BYTE PTR [DI.VOL]
  908.     SUB    AL,AH
  909.     JNS    SHORT NoSlideLow1
  910.     XOR    AL,AL
  911. NoSlideLow1:
  912.     CMP    AL,40H
  913.     JBE    SHORT NoSlideHigh1
  914.     MOV    AL,40H
  915. NoSlideHigh1:
  916.     MOV    BYTE PTR [DI.VOL],AL
  917.     JMP    SHORT NoEFFECT
  918. RetrigNote:
  919.     CMP    AH,BYTE PTR [DI.EFFECT_TIME]
  920.     JNE    SHORT NoRetrig
  921.     MOV    [DI.EFFECT_TIME],0
  922.     MOV    [DI.INST_SET],2
  923. NoRetrig:
  924.     JMP    SHORT NoEFFECT
  925. CutNote:
  926.     CMP    AH,BYTE PTR [DI.EFFECT_TIME]
  927.     JNE    SHORT NoCutNote
  928.     MOV    [DI.AMIGA],0
  929.     MOV    [DI.FREQ_VAL],0
  930. NoCutNote:
  931.     JMP    SHORT NoEFFECT
  932. DelayNote:
  933.     CMP    AH,BYTE PTR [DI.EFFECT_TIME]
  934.     JNE    SHORT NoDelayNote
  935.     MOV    [DI.INST_SET],2
  936.     MOV    [DI.VIBRATO_POINT],0
  937.     MOV    BX,[DI.PORT_TO]
  938.     MOV    [DI.AMIGA],BX
  939.     SHL    BX,1
  940.     MOV    BX,[FREQ_TABLE+BX]
  941.     MOV    [DI.FREQ_VAL],BX
  942. NoDelayNote:
  943.     JMP    SHORT NoEFFECT
  944. NoEFFECT:
  945.     ADD    DI,CHAN_SIZE
  946.     DEC    CX
  947.     JNZ    EFFECTLoop
  948.     JMP    EndPattern2
  949. ;-----------------------------------------------------------------------------
  950. DoPattern:
  951.     MOV    AX,PATT_SPEED
  952.     MOV    PATT_COUNT,AX
  953.     CMP    PATT_ROW,64
  954.     JB    SHORT NoPatternWrap
  955.     MOV    AX,PATT_CURRENT
  956.     CMP    AL,SONG_SIZE
  957.     JB    SHORT NoTrackWrap
  958.     MOV    AL,SONG_LOOP
  959.     CMP    AL,SONG_SIZE
  960.     JB    SHORT NoRestart
  961.     MOV    MOD_STAT,3
  962.     XOR    AL,AL
  963. NoRestart:
  964.     MOV    PATT_CURRENT,AX
  965.     MOV    PATT_SPEED,6
  966.     MOV    PATT_COUNT,1
  967.     MOV    AL,125
  968.     CALL    GO_SETBPM
  969.     MOV    BPM_COUNT,0
  970. NoTrackWrap:
  971.     MOV    BX,PATT_CURRENT
  972.     INC    PATT_CURRENT
  973.     MOV    DI,OFFSET SAMP_CHANS
  974.     XOR    SI,SI
  975. NewTracks:
  976.     PUSH    SI
  977.     SHL    SI,1
  978.     MOV    SI,[TRACKS_OFFSET+SI]
  979.     MOV    AX,PATT_BREAK
  980.     MOV    PATT_ROW,AX
  981.     SHL    AX,2
  982.     ADD    AH,[SI+BX]
  983.     MOV    [DI.TRACK_OFF],AX
  984.     POP    SI
  985.     ADD    DI,CHAN_SIZE
  986.     INC    SI
  987.     CMP    SI,CH_NUMB
  988.     JB    NewTracks
  989.     MOV    PATT_BREAK,0
  990. NoPatternWrap:
  991.     MOV    ES,TRACK_SEG
  992.     MOV    DI,OFFSET SAMP_CHANS
  993.     MOV    CX,CH_NUMB
  994. PattLoop:
  995.     MOV    SI,[DI.TRACK_OFF]
  996.     MOV    AX,[DI.VOL]
  997.     MOV    [DI.OLD_VOL],AX
  998.     MOV    BH,ES:[SI]        ; New Sample
  999.     MOV    BL,ES:[SI+2]
  1000.     AND    BH,0F0H
  1001.     SHR    BL,4
  1002.     ADD    BL,BH
  1003.     JZ    SHORT NoNewSample
  1004.     MOV    BH,BYTE PTR [DI.CURR_SAMP]
  1005.     MOV    BYTE PTR [DI.OLD_SAMP],BH
  1006.     MOV    BYTE PTR [DI.CURR_SAMP],BL
  1007.     XOR    BH,BH
  1008.     DEC    BX
  1009.     SHL    BX,1
  1010.     MOV    AX,[IVOLUME+BX]
  1011.     MOV    [DI.VOL],AX
  1012.     MOV    [DI.INST_SET],1
  1013.     SHL    BX,1
  1014.     MOV    EAX,[IOFFSET+BX]
  1015.     MOV    [DI.SAMP_OFF],EAX
  1016.     SHR    BX,1
  1017.     MOV    AX,[IFINETUNE+BX]
  1018.     SHL    AX,5
  1019.     MOV    [DI.FINE],AX
  1020.     SHL    AX,1
  1021.     ADD    [DI.FINE],AX
  1022.     MOV    [DI.LOOP_ONOFF],0
  1023.     MOV    AX,[ISIZE+BX]
  1024.     MOV    [DI.LEN],AX
  1025.     MOV    AX,[ILOOP_START+BX]
  1026.     MOV    [DI.REPEAT],AX
  1027.     MOV    AX,[ILOOP_SIZE+BX]
  1028.     MOV    [DI.REPLEN],AX
  1029.     CMP    AX,2
  1030.     JBE    SHORT NoNewSample
  1031.     MOV    [DI.LOOP_ONOFF],8
  1032.     MOV    AX,[DI.REPEAT]
  1033.     ADD    AX,[DI.REPLEN]
  1034.     CMP    AX,[DI.LEN]
  1035.     JA    SHORT NoNewSample
  1036.     MOV    [DI.LEN],AX
  1037. NoNewSample:
  1038.     MOV    BX,ES:[SI]
  1039.     XCHG    BL,BH
  1040.     AND    BX,0FFFH
  1041.     JZ    SHORT NoNewNote
  1042.     CALL    GET_PERIOD_INDEX
  1043.     ADD    BX,[DI.FINE]
  1044.     MOV    BX,[PERIOD_TABLE+BX]
  1045.     MOV    [DI.PORT_TO],BX
  1046.     MOV    AX,ES:[SI+2]
  1047.     AND    AL,0FH
  1048.     AND    AH,0F0H
  1049.     CMP    AL,3
  1050.     JE    SHORT NoNewNote
  1051.     CMP    AL,5
  1052.     JE    SHORT NoNewNote
  1053.     CMP    AX,0D00EH
  1054.     JNE    SHORT NewNote
  1055.     MOV    AL,ES:[SI+2]
  1056.     OR    AL,AL
  1057.     JZ    SHORT NewNote
  1058.     MOV    [DI.INST_SET],0
  1059.     JMP    SHORT NoNewNote
  1060. NewNote:
  1061.     MOV    [DI.INST_SET],2
  1062.     MOV    [DI.VIBRATO_POINT],0
  1063.     MOV    [DI.AMIGA],BX
  1064.     SHL    BX,1
  1065.     MOV    BX,[FREQ_TABLE+BX]
  1066.     MOV    [DI.FREQ_VAL],BX
  1067. NoNewNote:
  1068.     MOV    [DI.ARP_COUNTER],0
  1069.     MOV    AX,ES:[SI+2]
  1070.     AND    AL,0FH
  1071.     MOV    [DI.EFFECT],AX
  1072.     CMP    AL,7
  1073.     JB    SHORT NoSetOldFreq
  1074.     MOV    BX,AX
  1075.     AND    BH,0F0H
  1076.     CMP    BX,0C00EH
  1077.     JE    SHORT NoSetOldFreq
  1078.     CMP    BX,0D00EH
  1079.     JE    SHORT NoSetOldFreq
  1080.     MOV    BX,[DI.AMIGA]
  1081.     SHL    BX,1
  1082.     MOV    BX,[FREQ_TABLE+BX]
  1083.     MOV    [DI.FREQ_VAL],BX
  1084. NoSetOldFreq:
  1085.     MOVZX    BX,AL
  1086.     CMP    BL,0EH
  1087.     JE    SHORT DoEPattEFFECTs
  1088.     SHL    BX,1
  1089.     JMP    [PattJumps+BX]
  1090. DoEPattEFFECTs:
  1091.     MOV    BL,AH
  1092.     AND    AH,0FH
  1093.     SHR    BL,4
  1094.     SHL    BX,1
  1095.     JMP    [EPattJumps+BX]
  1096. ARPeggioFix:
  1097.     MOV    BX,[DI.AMIGA]
  1098.     CALL    GET_PERIOD_INDEX
  1099.     MOV    BP,BX
  1100.     ADD    BX,[DI.FINE]
  1101.     MOV    DX,[PERIOD_TABLE+BX]
  1102.     MOV    [DI.ARP],DX
  1103.     XCHG    AL,AH
  1104.     XOR    AH,AH
  1105.     MOV    DX,AX
  1106.     SHR    DX,4
  1107.     AND    AX,0FH
  1108.     SHL    DX,1
  1109.     SHL    AX,1
  1110.     MOV    BX,BP
  1111.     ADD    BX,DX
  1112.     CMP    BX,94
  1113.     JBE    SHORT NoWrapARP1
  1114.     MOV    BX,94
  1115. NoWrapARP1:
  1116.     ADD    BX,[DI.FINE]
  1117.     MOV    DX,[PERIOD_TABLE+BX]
  1118.     MOV    [DI.ARP+2],DX
  1119.     MOV    BX,BP
  1120.     ADD    BX,AX
  1121.     CMP    BX,94
  1122.     JBE    SHORT NoWrapARP2
  1123.     MOV    BX,94
  1124. NoWrapARP2:
  1125.     ADD    BX,[DI.FINE]
  1126.     MOV    DX,[PERIOD_TABLE+BX]
  1127.     MOV    [DI.ARP+4],DX
  1128.     JMP    NoPattEFFECT
  1129. PORT_TOFix:
  1130.     OR    AH,AH
  1131.     JNZ    SHORT NoPortPekFix
  1132.     MOV    AH,BYTE PTR [DI.OLD_PORT_TO]
  1133. NoPortPekFix:
  1134.     MOV    BYTE PTR [DI.OLD_PORT_TO],AH
  1135.     MOV    BYTE PTR [DI.EFFECT+1],AH
  1136.     JMP    NoPattEFFECT
  1137. VibratoFix:
  1138.     MOV    AL,AH
  1139.     AND    AL,0FH
  1140.     AND    AH,0F0H
  1141.     OR    AL,AL
  1142.     JNZ    SHORT NoVibratoFix1
  1143.     MOV    AL,BYTE PTR [DI.OLD_VIBRATO]
  1144. NoVibratoFix1:
  1145.     OR    AH,AH
  1146.     JNZ    SHORT NoVibratoFix2
  1147.     MOV    AH,BYTE PTR [DI.OLD_VIBRATO+1]
  1148. NoVibratoFix2:
  1149.     MOV    BYTE PTR [DI.OLD_VIBRATO],AL
  1150.     MOV    BYTE PTR [DI.OLD_VIBRATO+1],AH
  1151.     OR    AL,AH
  1152.     MOV    BYTE PTR [DI.EFFECT+1],AL
  1153.     JMP    NoPattEFFECT
  1154. SampleOff:
  1155.     XOR    AL,AL
  1156.     CMP    AX,[DI.LEN]
  1157.     JB    SHORT NoFixOffset
  1158.     MOV    AX,[DI.LEN]
  1159.     DEC    AX
  1160. NoFixOffset:
  1161.     MOV    [DI.OFFSET_ADD],AX
  1162.     JMP    NoPattEFFECT
  1163. PosJump:
  1164.     MOV    [PATT_ROW],63
  1165.     MOV    BYTE PTR [PATT_CURRENT],AH
  1166.     JMP    NoPattEFFECT
  1167. VOLume:
  1168.     CMP    AH,40H
  1169.     JBE    SHORT NoFixVOL1
  1170.     MOV    AH,40H
  1171. NoFixVOL1:
  1172.     MOV    BYTE PTR [DI.VOL],AH
  1173.     JMP    NoPattEFFECT
  1174. BreakPatt:
  1175.     MOV    [PATT_ROW],63
  1176.     CMP    AH,64H
  1177.     JB    SHORT NoFixBreak
  1178.     MOV    AH,63H
  1179. NoFixBreak:
  1180.     MOV    AL,AH
  1181.     AND    AL,0FH
  1182.     SHR    AH,4
  1183.     SHL    AH,1
  1184.     MOV    BYTE PTR [PATT_BREAK],AL
  1185.     ADD    BYTE PTR [PATT_BREAK],AH
  1186.     SHL    AH,2
  1187.     ADD    BYTE PTR [PATT_BREAK],AH
  1188.     JMP    NoPattEFFECT
  1189. SpeedSet:
  1190.     OR    AH,AH
  1191.     JZ    NoPattEFFECT
  1192.     CMP    AH,1FH
  1193.     JBE    SHORT UsualSpeed
  1194.     XCHG    AL,AH
  1195.     CALL    GO_SETBPM
  1196.     JMP    SHORT NoPattEFFECT
  1197. UsualSpeed:
  1198.     MOV    BYTE PTR [PATT_SPEED],AH
  1199.     MOV    BYTE PTR [PATT_COUNT],AH
  1200.     JMP    SHORT NoPattEFFECT
  1201. FINEPortUp:
  1202.     XCHG    AL,AH
  1203.     XOR    AH,AH
  1204.     SUB    [DI.AMIGA],AX
  1205.     MOV    BX,[DI.FINE]
  1206.     MOV    BX,[PERIOD_TABLE+47*2+BX] ;35
  1207.     CMP    [DI.AMIGA],BX
  1208.     JAE    SHORT NoFixFINEUp
  1209.     MOV    [DI.AMIGA],BX
  1210. NoFixFINEUp:
  1211.     JMP    SHORT NoPattEFFECT
  1212. FINEPortDown:
  1213.     XCHG    AL,AH
  1214.     XOR    AH,AH
  1215.     ADD    [DI.AMIGA],AX
  1216.     MOV    BX,[DI.FINE]
  1217.     MOV    BX,[PERIOD_TABLE+BX]
  1218.     CMP    [DI.AMIGA],BX
  1219.     JBE    SHORT NoFixFINEDown
  1220.     MOV    [DI.AMIGA],BX
  1221. NoFixFINEDown:
  1222.     JMP    SHORT NoPattEFFECT
  1223. PANNING:
  1224.     AND    [DI.BALANCE],0F0H
  1225.     OR    [DI.BALANCE],AH
  1226.     JMP    SHORT NoPattEFFECT
  1227. FINEVOLUP:
  1228.     ADD    BYTE PTR [DI.VOL],AH
  1229.     CMP    BYTE PTR [DI.VOL],40H
  1230.     JBE    SHORT NoFixFINEVOLUp
  1231.     MOV    BYTE PTR [DI.VOL],40H
  1232. NoFixFINEVOLUp:
  1233.     JMP    SHORT NoPattEFFECT
  1234. FINEVOLDown:
  1235.     SUB    BYTE PTR [DI.VOL],AH
  1236.     JNC    SHORT NoFixFINEVOLDown
  1237.     MOV    BYTE PTR [DI.VOL],0
  1238. NoFixFINEVOLDown:
  1239.     JMP    SHORT NoPattEFFECT
  1240. NoPattEFFECT:
  1241.     ADD    [DI.TRACK_OFF],4
  1242.     MOV    [DI.EFFECT_TIME],0
  1243.     ADD    DI,CHAN_SIZE
  1244.     DEC    CX
  1245.     JNZ    PattLoop
  1246.     INC    PATT_ROW
  1247. EndPattern2:
  1248.     CMP    BPM_RATE,512
  1249.     JB    ClearNotes
  1250. EndPattern:
  1251.     CALL    CONTROL_SAMPLE
  1252.     POP    ES DS
  1253.     POP    EBP EDI ESI EDX ECX EBX EAX
  1254.     CMP    CS:VAR_BUFSEG,0
  1255.     JNE    SHORT WT8
  1256.     CMP    CS:SYSTEM,0
  1257.     JE    SHORT WT7
  1258.     DEC    CS:IRQCOUNT
  1259.     JNZ    SHORT WT7
  1260.     MOV    CS:IRQCOUNT,56
  1261. WT8:    JMP    DWORD PTR CS:[HOLD70]
  1262. WT7:    IRET
  1263. CONTROL_CHANNELS ENDP
  1264. ;-----------------------------------------------------------------------------
  1265. GET_PERIOD_INDEX PROC NEAR
  1266.     MOV    BP,BX
  1267.     XOR    BH,BH
  1268.     MOV    DX,6000H        ;BINAERSUCHE
  1269. LGP1:    MOV    BL,DL
  1270.     ADD    BL,DH
  1271.     SHR    BL,1
  1272.     AND    BL,0FEH
  1273.     JZ    SHORT GGP2
  1274.     CMP    BL,94
  1275.     JE    SHORT GGP2
  1276.     CMP    BP,[PERIOD_TABLE+BX]
  1277.     JAE    SHORT GGP1
  1278.     MOV    DL,BL
  1279.     JMP    LGP1
  1280. GGP1:    MOV    DH,BL
  1281.     CMP    BP,[PERIOD_TABLE-2+BX]
  1282.     JAE    LGP1            ;GEFUNDEN
  1283.     MOV    DX,[PERIOD_TABLE-2+BX]    ;GET NEAREST PERIOD
  1284.     SUB    DX,BP
  1285.     SUB    BP,[PERIOD_TABLE+BX]
  1286.     CMP    DX,BP
  1287.     JAE    SHORT GGP2
  1288.     SUB    BX,2
  1289. GGP2:    RET
  1290. GET_PERIOD_INDEX ENDP
  1291. ;-----------------------------------------------------------------------------
  1292. GO_SETBPM PROC NEAR
  1293.     XOR    AH,AH
  1294.     MOV    BPM_VALUE,AX
  1295.     SHL    AX,1
  1296.     MOV    BL,5            ; Denna bit är för att ställa
  1297.     DIV    BL            ; EFFECTs till annat än 50Hz
  1298.     MOV    DL,AL            ; Detta ger automatiskt en annan
  1299.     XOR    DH,DH            ; PATT_SPEED.; Hz=2*BPM/5
  1300.     XOR    AX,AX
  1301.     MOV    BX,BPM_RATE
  1302.     CMP    BX,DX
  1303.     JA    SHORT GOSBPM
  1304.     MOV    BX,DX
  1305.     INC    BX
  1306. GOSBPM:    DIV    BX
  1307.     MOV    WORD PTR BPM_SPEED,AX
  1308.     XOR    AX,AX
  1309.     DIV    BX
  1310.     MOV    WORD PTR BPM_SPEED+2,AX
  1311.     RET
  1312. GO_SETBPM ENDP
  1313. ;-----------------------------------------------------------------------------
  1314. CONTROL_SAMPLE PROC NEAR
  1315.     MOV    CL,8
  1316.     XOR    SI,SI
  1317. LCS1:    CMP    [SAM_COUNT+SI],0
  1318.     JE    SHORT GCS1
  1319.     JL    SHORT GCS2
  1320.     DEC    [SAM_COUNT+SI]
  1321.     JNZ    SHORT GCS1
  1322.     MOV    [SAM_COUNT+SI],-256    ;RAMP DOWN SAMPLE
  1323.     MOV    DX,BASE_PORT
  1324.     ADD    DX,CommandPort
  1325.     DEC    DX
  1326.     MOV    AL,CL
  1327.     OUT    DX,AL
  1328.     INC    DX
  1329.     MOV    BP,GUS_VOL
  1330.     MOV    BX,FX_VOL
  1331.     INC    BX
  1332.     SHR    BX,2
  1333.     CMP    BL,40H
  1334.     JBE    SHORT FIXVOL
  1335.     MOV    BL,40H
  1336. FIXVOL:    SHL    BX,1
  1337.     MOV    BX,[GUS_VOL+BX]
  1338.     CALL    SEND_RAMP
  1339.     JMP    SHORT GCS1
  1340. GCS2:    INC    [SAM_COUNT+SI]        ;STOP SAMPLE
  1341.     JNZ    SHORT GCS1
  1342.     MOV    DX,BASE_PORT
  1343.     ADD    DX,ActiveVoicePort
  1344.     MOV    AL,CL
  1345.     OUT    DX,AL
  1346.     INC    DX
  1347.     MOV    AL,WriteVoiceMode
  1348.     OUT    DX,AL
  1349.     ADD    DX,2
  1350.     MOV    AL,3            ;Voice Off
  1351.     OUT    DX,AL
  1352.     SUB    DX,2
  1353.     MOV    AL,VolumeCtrl
  1354.     OUT    DX,AL
  1355.     ADD    DX,2
  1356.     MOV    AL,3            ;Ramp Off
  1357.     OUT    DX,AL
  1358.     SUB    DX,3
  1359. GCS1:    INC    SI
  1360.     INC    SI
  1361.     INC    CL
  1362.     CMP    CL,NumVoices-1
  1363.     JB    LCS1
  1364.     RET
  1365. CONTROL_SAMPLE ENDP
  1366. ;=============================================================================
  1367.  
  1368.  
  1369. ;=============================================================================
  1370. ;
  1371. ; ULTRASOUND INIT
  1372. ;
  1373. ;=============================================================================
  1374. INIT_DEVICE PROC NEAR
  1375.     PUSH    CS
  1376.     POP    DS
  1377.     CLI
  1378.     MOV    BX,BASE_PORT        ;Init the UltraSound
  1379.     MOV    CX,BX
  1380.     ADD    BX,CommandPort
  1381.     ADD    CX,DataHighPort
  1382.     MOV    DX,BX
  1383.     MOV    AL,Initialize
  1384.     OUT    DX,AL
  1385.     MOV    DX,CX
  1386.     MOV    AL,0
  1387.     OUT    DX,AL
  1388.     MOV    DX,BASE_PORT
  1389.     MOV    AH,10
  1390. LID1:    IN    AL,DX
  1391.     DEC    AH
  1392.     JNZ    LID1
  1393.     MOV    DX,BX
  1394.     MOV    AL,Initialize
  1395.     OUT    DX,AL
  1396.     MOV    DX,CX
  1397.     MOV    AL,1
  1398.     OUT    DX,AL
  1399.     MOV    DX,BASE_PORT
  1400.     MOV    AH,10
  1401. LID2:    IN    AL,DX
  1402.     DEC    AH
  1403.     JNZ    LID2
  1404.     MOV    DX,BX
  1405.     MOV    AL,DMACtrl
  1406.     OUT    DX,AL
  1407.     MOV    DX,CX
  1408.     MOV    AL,0
  1409.     OUT    DX,AL
  1410.     MOV    DX,BX
  1411.     MOV    AL,45H
  1412.     OUT    DX,AL
  1413.     MOV    DX,CX
  1414.     MOV    AL,0
  1415.     OUT    DX,AL
  1416.     MOV    DX,BX
  1417.     MOV    AL,49H
  1418.     OUT    DX,AL
  1419.     MOV    DX,CX
  1420.     MOV    AL,0
  1421.     OUT    DX,AL
  1422.  
  1423.     MOV    DX,BX
  1424.     MOV    AL,VoicesActive
  1425.     OUT    DX,AL
  1426.     MOV    DX,CX
  1427.     MOV    AL,NumVoices
  1428.     DEC    AL
  1429.     OR    AL,0C0H
  1430.     OUT    DX,AL
  1431.  
  1432.     MOV    DX,BASE_PORT        ;Clear IRQs
  1433.     ADD    DX,StatusPort
  1434.     IN    AL,DX
  1435.     MOV    DX,BX
  1436.     MOV    AL,DMACtrl
  1437.     OUT    DX,AL
  1438.     MOV    DX,CX
  1439.     IN    AL,DX
  1440.     MOV    DX,BX
  1441.     MOV    AL,49H
  1442.     OUT    DX,AL
  1443.     MOV    DX,CX
  1444.     IN    AL,DX
  1445.     MOV    DX,BX
  1446.     MOV    AL,8FH
  1447.     OUT    DX,AL
  1448.     MOV    DX,CX
  1449.     IN    AL,DX
  1450.  
  1451.     PUSH    CX
  1452.     MOV    CX,32
  1453. VoiceClearLoop:
  1454.     MOV    DX,BASE_PORT
  1455.     ADD    DX,ActiveVoicePort
  1456.     MOV    AL,CL
  1457.     DEC    AL
  1458.     OUT    DX,AL
  1459.     INC    DX
  1460.     MOV    AL,0
  1461.     OUT    DX,AL
  1462.     ADD    DX,2
  1463.     MOV    AL,3            ;Voice Off
  1464.     OUT    DX,AL
  1465.     SUB    DX,2
  1466.     MOV    AL,0DH
  1467.     OUT    DX,AL
  1468.     ADD    DX,2
  1469.     MOV    AL,3            ;Ramp Off
  1470.     OUT    DX,AL
  1471.     MOV    DX,BASE_PORT
  1472.     MOV    AH,10
  1473. LID3:    IN    AL,DX
  1474.     DEC    AH
  1475.     JNZ    LID3
  1476.     LOOP    VoiceClearLoop
  1477.     POP    CX
  1478.  
  1479.     CMP    DMA_CHANNEL,0        ;NO DMA
  1480.     JE    SHORT LID5
  1481.     MOV    DX,BASE_PORT        ;SETUP FOR DIGITAL ASIC
  1482.     ADD    DX,0FH
  1483.     MOV    AL,5
  1484.     OUT    DX,AL
  1485.     SUB    DX,0FH
  1486.     MOV    AL,3
  1487.     OUT    DX,AL
  1488.     ADD    DX,DMASetPort
  1489.     MOV    AL,0
  1490.     OUT    DX,AL
  1491.     ADD    DX,0FH-DMASetPort
  1492.     OUT    DX,AL
  1493.     SUB    DX,0FH
  1494.     MOV    AL,3            ;SET DMA CHANNEL
  1495.     OUT    DX,AL
  1496.     ADD    DX,DMASetPort
  1497.     PUSH    BX
  1498.     MOV    BX,DMA_CHANNEL
  1499.     MOV    AL,[DMA_SET_DATA+BX]
  1500.     POP    BX
  1501.     OR    AL,0C0H            ;SET DMA
  1502.     OUT    DX,AL
  1503.     SUB    DX,DMASetPort
  1504.     PUSH    AX
  1505.     MOV    AL,43H
  1506.     OUT    DX,AL
  1507.     ADD    DX,DMASetPort
  1508.     MOV    AL,45H            ;SET IRQ11
  1509.     OUT    DX,AL
  1510.     SUB    DX,DMASetPort
  1511.     MOV    AL,3
  1512.     OUT    DX,AL
  1513.     ADD    DX,DMASetPort
  1514.     POP    AX
  1515.     AND    AL,7FH            ;SET DMA
  1516.     OUT    DX,AL
  1517.     SUB    DX,DMASetPort
  1518.     MOV    AL,43H
  1519.     OUT    DX,AL
  1520.     ADD    DX,DMASetPort
  1521.     MOV    AL,45H            ;SET IRQ11
  1522.     OUT    DX,AL
  1523.     ADD    DX,ActiveVoicePort-DMASetPort
  1524.     MOV    AL,0
  1525.     OUT    DX,AL
  1526.     SUB    DX,ActiveVoicePort
  1527.     MOV    AL,8            ;SETUP DMA LATCH
  1528.     OUT    DX,AL
  1529.     ADD    DX,ActiveVoicePort
  1530.     MOV    AL,0
  1531.     OUT    DX,AL
  1532. LID5:
  1533.     MOV    DX,BX            ;Clear IRQs
  1534.     MOV    AL,DMACtrl
  1535.     OUT    DX,AL
  1536.     MOV    DX,CX
  1537.     IN    AL,DX
  1538.     MOV    DX,BX
  1539.     MOV    AL,49H
  1540.     OUT    DX,AL
  1541.     MOV    DX,CX
  1542.     IN    AL,DX
  1543.     MOV    DX,BX
  1544.     MOV    AL,8FH
  1545.     OUT    DX,AL
  1546.     MOV    DX,CX
  1547.     IN    AL,DX
  1548.  
  1549.     MOV    DX,BX
  1550.     MOV    AL,Initialize
  1551.     OUT    DX,AL
  1552.     MOV    DX,CX
  1553.     MOV    AL,3
  1554.     OUT    DX,AL
  1555.  
  1556.     MOV    CX,NumVoices
  1557. SetRampRateLoop:
  1558.     MOV    DX,BASE_PORT
  1559.     ADD    DX,ActiveVoicePort
  1560.     MOV    AL,NumVoices
  1561.     SUB    AL,CL
  1562.     OUT    DX,AL
  1563.  
  1564.     MOV    DX,BASE_PORT
  1565.     ADD    DX,CommandPort
  1566.     MOV    AL,VOLRampRate
  1567.     OUT    DX,AL
  1568.     MOV    AL,00111111B
  1569.     MOV    DX,BASE_PORT
  1570.     ADD    DX,DataHighPort
  1571.     OUT    DX,AL
  1572.  
  1573.     MOV    DX,BASE_PORT
  1574.     ADD    DX,CommandPort
  1575.     MOV    AL,SetVOLume
  1576.     OUT    DX,AL
  1577.     MOV    AX,GUS_VOL
  1578.     MOV    DX,BASE_PORT
  1579.     ADD    DX,DataLowPort
  1580.     OUT    DX,AX
  1581.     MOV    DX,BASE_PORT
  1582.     MOV    AH,10
  1583. LID4:    IN    AL,DX
  1584.     DEC    AH
  1585.     JNZ    LID4
  1586.     LOOP    SetRampRateLoop
  1587.  
  1588.     MOV    DX,BASE_PORT        ;DETECT GUS VERSION
  1589.     ADD    DX,GUS_VERSION
  1590.     IN    AL,DX
  1591.     CMP    ULTRA16,0        ;IST ULTRA16 BOARD ANGEGEBEN?
  1592.     JNE    SHORT LID9
  1593.     CMP    AL,5            ;GUS BEFORE 3.7 NO MIXER
  1594.     JL    SHORT LID6
  1595.     CMP    AL,10
  1596.     JB    SHORT LID7        ;NON GUS MAX
  1597. LID9:    CMP    AL,10
  1598.     JB    SHORT LID8
  1599.     ADD    DX,ICMIX_DATA-ICMIX_SEL    ;ACTIVATE GUS MAX MIXER OUTPUT
  1600.     MOV    AX,CODEC_PORT
  1601.     SHR    AL,4
  1602.     OR    AL,40H
  1603.     OUT    DX,AL
  1604. LID8:    MOV    DX,CODEC_PORT        ;CODEC MIXER ON GUS MAX 31-0
  1605.     MOV    AH,8            ;NO GAIN, KEINE VERSTAERKUNG
  1606.     MOV    AL,2            ;GF1 LEFT CHANNEL
  1607.     OUT    DX,AL
  1608.     INC    DX
  1609.     MOV    AL,AH
  1610.     OUT    DX,AL
  1611.     DEC    DX
  1612.     MOV    AL,3            ;GF1 RIGHT CHANNEL
  1613.     OUT    DX,AL
  1614.     INC    DX
  1615.     MOV    AL,AH
  1616.     OUT    DX,AL
  1617.     DEC    DX
  1618.     XOR    AH,AH
  1619.     MOV    AL,6            ;OUT LEFT CHANNEL
  1620.     OUT    DX,AL
  1621.     INC    DX
  1622.     MOV    AL,AH
  1623.     OUT    DX,AL
  1624.     DEC    DX
  1625.     MOV    AL,7            ;OUT RIGHT CHANNEL
  1626.     OUT    DX,AL
  1627.     INC    DX
  1628.     MOV    AL,AH
  1629.     OUT    DX,AL
  1630. LID7:    MOV    AH,BYTE PTR MUSIC_VOL
  1631.     CALL    SET_CDMIXER
  1632. LID6:    STI
  1633.     RET
  1634. INIT_DEVICE ENDP
  1635. ;-----------------------------------------------------------------------------
  1636. SEND_SAMPLE_START PROC NEAR
  1637.     MOV    AL,SampleStartLo
  1638.     OUT    DX,AL
  1639.     INC    DX
  1640.     MOV    AX,WORD PTR [DI.SAMP_OFF]
  1641.     MOV    BP,WORD PTR [DI.SAMP_OFF+2]
  1642.     ADD    AX,[DI.OFFSET_ADD]
  1643.     ADC    BP,0
  1644.     SHR    AX,7
  1645.     SHL    BP,9
  1646.     OR    AX,BP
  1647.     OUT    DX,AX
  1648.     DEC    DX
  1649.     MOV    AL,SampleStartHi
  1650.     OUT    DX,AL
  1651.     INC    DX
  1652.     MOV    AX,WORD PTR [DI.SAMP_OFF]
  1653.     ADD    AX,[DI.OFFSET_ADD]
  1654.     SHL    AX,9
  1655.     OUT    DX,AX
  1656.     DEC    DX
  1657.     SUB    DX,CommandPort
  1658.     Rept    6
  1659.     IN    AL,DX
  1660.     EndM
  1661.     ADD    DX,CommandPort
  1662.     RET
  1663. SEND_SAMPLE_START ENDP
  1664. ;-----------------------------------------------------------------------------
  1665. SEND_SAMPLE_END PROC NEAR
  1666.     MOV    AL,SampleEndLo
  1667.     OUT    DX,AL
  1668.     INC    DX
  1669.     MOV    AX,WORD PTR [DI.SAMP_OFF]
  1670.     MOV    BP,WORD PTR [DI.SAMP_OFF+2]
  1671.     ADD    AX,[DI.LEN]
  1672.     ADC    BP,0
  1673.     SHR    AX,7
  1674.     SHL    BP,9
  1675.     OR    AX,BP
  1676.     OUT    DX,AX
  1677.     DEC    DX
  1678.     MOV    AL,SampleEndHi
  1679.     OUT    DX,AL
  1680.     INC    DX
  1681.     MOV    AX,WORD PTR [DI.SAMP_OFF]
  1682.     ADD    AX,[DI.LEN]
  1683.     SHL    AX,9
  1684.     OUT    DX,AX
  1685.     DEC    DX
  1686.     RET
  1687. SEND_SAMPLE_END ENDP
  1688. ;-----------------------------------------------------------------------------
  1689. SEND_SAMPLE_LOOP PROC NEAR
  1690.     MOV    AL,LoopStartLo
  1691.     OUT    DX,AL
  1692.     INC    DX
  1693.     MOV    AX,WORD PTR [DI.SAMP_OFF]
  1694.     MOV    BP,WORD PTR [DI.SAMP_OFF+2]
  1695.     ADD    AX,[DI.REPEAT]
  1696.     ADC    BP,0
  1697.     SHR    AX,7
  1698.     SHL    BP,9
  1699.     OR    AX,BP
  1700.     OUT    DX,AX
  1701.     DEC    DX
  1702.     MOV    AL,LoopStartHi
  1703.     OUT    DX,AL
  1704.     INC    DX
  1705.     MOV    AX,WORD PTR [DI.SAMP_OFF]
  1706.     ADD    AX,[DI.REPEAT]
  1707.     SHL    AX,9
  1708.     OUT    DX,AX
  1709.     DEC    DX
  1710.     RET
  1711. SEND_SAMPLE_LOOP ENDP
  1712. ;-----------------------------------------------------------------------------
  1713. SEND_WRITE_VOICE PROC NEAR
  1714.     MOV    AL,WriteVoiceMode
  1715.     OUT    DX,AL
  1716.     ADD    DX,2
  1717.     MOV    AL,AH
  1718.     OUT    DX,AL
  1719.     SUB    DX,2
  1720.     RET
  1721. SEND_WRITE_VOICE ENDP
  1722. ;-----------------------------------------------------------------------------
  1723. WAIT_PORT PROC NEAR
  1724.     SUB    DX,CommandPort
  1725.     Rept    6
  1726.     IN    AL,DX
  1727.     EndM
  1728.     ADD    DX,CommandPort
  1729.     RET
  1730. WAIT_PORT ENDP
  1731. ;-----------------------------------------------------------------------------
  1732. SEND_RAMP PROC NEAR
  1733.     MOV    DX,BASE_PORT
  1734.     ADD    DX,CommandPort
  1735.     MOV    AL,VOLumeCtrl
  1736.     OUT    DX,AL
  1737.     ADD    DX,2
  1738.     MOV    AL,3
  1739.     OUT    DX,AL
  1740.     SUB    DX,2
  1741.     MOV    AH,0
  1742.     CMP    BX,BP
  1743.     JB    SHORT NoFixVOLDir
  1744.     MOV    AH,01000000B
  1745.     XCHG    BX,BP
  1746. NoFixVOLDir:
  1747.     MOV    AL,VOLRampStart
  1748.     OUT    DX,AL
  1749.     XCHG    AX,BX
  1750.     INC    DX
  1751.     OUT    DX,AX
  1752.     DEC    DX
  1753.     MOV    AL,VOLRampEnd
  1754.     OUT    DX,AL
  1755.     MOV    AX,BP
  1756.     INC    DX
  1757.     OUT    DX,AX
  1758.     DEC    DX
  1759.     MOV    AL,VOLumeCtrl
  1760.     OUT    DX,AL
  1761.     MOV    AL,BH
  1762.     ADD    DX,2
  1763.     OUT    DX,AL
  1764.     SUB    DX,2
  1765.     RET
  1766. SEND_RAMP ENDP
  1767. ;-----------------------------------------------------------------------------
  1768. ; CX= ANZAHL WORDS, EDI= GUSMEM ZEIGER, BX= 0000H AMIGA, 8080H PC SAMPLE
  1769. ; DS:SI= ZEIGER AUF SAMPLE-DATEN
  1770. ;-----------------------------------------------------------------------------
  1771. SEND_SAMPLE_DATA PROC NEAR
  1772.     CMP    CS:DMA_CHANNEL,0
  1773.     JNE    DMA_INIT
  1774.     MOV    DX,CS:BASE_PORT
  1775.     ADD    DX,CommandPort
  1776. LHP1:    LODSW
  1777.     CLI
  1778.     XOR    AX,BX
  1779.     MOV    BP,AX
  1780.     MOV    AL,DRAMAddrLo
  1781.     OUT    DX,AL
  1782.     INC    DX
  1783.     MOV    AX,DI
  1784.     OUT    DX,AX
  1785.     DEC    DX
  1786.     MOV    AL,DRAMAddrHi
  1787.     OUT    DX,AL
  1788.     ADD    DX,2
  1789.     MOV    EAX,EDI
  1790.     SHR    EAX,16
  1791.     OUT    DX,AL
  1792.     ADD    DX,2
  1793.     MOV    AX,BP
  1794.     OUT    DX,AL
  1795.     SUB    DX,4
  1796.     INC    EDI
  1797.     MOV    AL,DRAMAddrLo
  1798.     OUT    DX,AL
  1799.     INC    DX
  1800.     MOV    AX,DI
  1801.     OUT    DX,AX
  1802.     DEC    DX
  1803.     MOV    AL,DRAMAddrHi
  1804.     OUT    DX,AL
  1805.     ADD    DX,2
  1806.     MOV    EAX,EDI
  1807.     SHR    EAX,16
  1808.     OUT    DX,AL
  1809.     ADD    DX,2
  1810.     MOV    AX,BP
  1811.     MOV    AL,AH
  1812.     OUT    DX,AL
  1813.     SUB    DX,4
  1814.     INC    EDI
  1815.     STI
  1816.     LOOP    LHP1
  1817.     CLI
  1818.     MOV    AL,DRAMAddrLo        ;SAMPLE UM EIN WORD VERLÄNGERN
  1819.     OUT    DX,AL
  1820.     INC    DX
  1821.     MOV    AX,DI
  1822.     OUT    DX,AX
  1823.     DEC    DX
  1824.     MOV    AL,DRAMAddrHi
  1825.     OUT    DX,AL
  1826.     ADD    DX,2
  1827.     MOV    EAX,EDI
  1828.     SHR    EAX,16
  1829.     OUT    DX,AL
  1830.     ADD    DX,2
  1831.     MOV    AX,BP
  1832.     MOV    AL,AH
  1833.     OUT    DX,AL
  1834.     SUB    DX,4
  1835.     INC    EDI
  1836.     MOV    CS:GUS_MEM,EDI
  1837.     STI
  1838.     RET
  1839. SEND_SAMPLE_DATA ENDP
  1840. ;-----------------------------------------------------------------------------
  1841. ; SET DMA READY FOR TRANSFER WITH AUTOINIT
  1842. ; IN: DS:SI= BLOCKPOINTER, CX= SIZE IN WORDS, EDI, BX WIE OBEN
  1843. ;-----------------------------------------------------------------------------
  1844. DMA_INIT PROC NEAR
  1845.     MOV    DX,CS:BASE_PORT        ;STOP GUS DMA & CLEAR ALL PENDING IRQs
  1846.     ADD    DX,CommandPort
  1847.     MOV    AL,DMACtrl
  1848.     OUT    DX,AL
  1849.     INC    DX
  1850.     INC    DX
  1851.     IN    AL,DX            ;CLEAR IRQ, BUT MASTER IRQ IS DISABLED
  1852.     MOV    DX,CS:BASE_PORT        ;THERE HAPPENED NO IRQ
  1853.     ADD    DX,StatusPort
  1854.     IN    AL,DX
  1855.     MOV    BP,CS:DMA_CHANNEL
  1856. ;    MOVZX    DX,CS:[DMA_RESET+BP]    ;CASCADED DMA2 (MASTER) RESET
  1857. ;    OUT    DX,AL            ;RESET AUF MASTER DMA LOESCHT CASCADE
  1858.     CMP    BP,4
  1859.     JAE    SHORT NO_RESET1
  1860.     MOVZX    DX,CS:[DMA_RESET]    ;DMA1 (SLAVE) MASTER CLEAR
  1861.     OUT    DX,AL
  1862. NO_RESET1:
  1863.     MOV    BP,BX
  1864.     MOVZX    EAX,CX            ;CHECK 256K GUS DRAM BOUNDARY
  1865.     SHL    EAX,1            ;BECAUSE DMA IS NOT ABLE TO CROSS
  1866.     INC    EAX            ;1 WORD LÄNGER-1 BYTE IST LETZTES BYTE
  1867.     ADD    EAX,EDI
  1868.     SHR    EAX,18
  1869.     MOV    EDX,EDI
  1870.     SHR    EDX,18
  1871.     CMP    EAX,EDX
  1872.     JE    SHORT DMA_NORMAL
  1873.     PUSH    SI CX
  1874.     SHL    EAX,18
  1875.     SUB    EAX,EDI
  1876.     MOV    CX,AX
  1877.     SHR    CX,1
  1878.     PUSH    CX
  1879.     DEC    CX
  1880.     CALL    DMA_PORTION        ;FIRST PORTION
  1881.     POP    AX CX SI
  1882.     SUB    CX,AX
  1883.     ADD    SI,AX
  1884.     ADD    SI,AX            ;REST: CORRECT OFFSET & SIZE
  1885. DMA_NORMAL:
  1886.     MOV    BX,CX            ;SAMPLE UM EIN WORD VERLÄNGERN
  1887.     SHL    BX,1
  1888.     DEC    BX
  1889.     MOV    AL,[SI+BX]
  1890.     MOV    AH,AL
  1891.     INC    BX
  1892.     MOV    [SI+BX],AX
  1893. DMA_PORTION:
  1894.     CLI
  1895.     MOV    BX,SI            ;SETUP PC DMA CONTROLLER
  1896.     MOV    DX,DS
  1897.     MOV    AX,DX            ;ADRESSE IN PAGE UND OFFSET UMRECHNEN
  1898.     SHL    DX,4
  1899.     SHR    AH,4            ;PAGE
  1900.     ADD    BX,DX            ;OFFSET NEU
  1901.     ADC    AH,0
  1902.     MOV    AL,AH
  1903.     MOV    SI,CS:DMA_CHANNEL
  1904.     CMP    SI,4
  1905.     JB    SHORT GDMI1
  1906.     SHRD    BX,AX,1            ;ADRESSE FÜR 16-BIT DMA
  1907.     JMP    SHORT GDMI2
  1908. GDMI1:    SHL    CX,1            ;ZAEHLER FÜR 8-BIT DMA
  1909.     INC    CX            ;SAMPLE ABSCHLUSS MIT EINEM WORD MEHR
  1910. GDMI2:    MOVZX    DX,CS:[DMA_MASK+SI]
  1911.     MOV    AL,BYTE PTR CS:DMA_CHANNEL
  1912.     OR    AL,4
  1913.     OUT    DX,AL            ;DMA-KANAL MASKIEREN
  1914.     MOVZX    DX,CS:[DMA_MOD+SI]
  1915.     AND    AL,3
  1916.     OR    AL,01001000B
  1917.     OUT    DX,AL            ;DMA-MODUS FÜR GUS
  1918.     MOVZX    DX,CS:[DMA_FLIP+SI]
  1919.     OUT    DX,AL            ;FLIP-FLOP CLEAR
  1920.     MOVZX    DX,CS:[DMA_ADR+SI]
  1921.     MOV    AL,BL            ;DMA CHANNEL 1-4
  1922.     OUT    DX,AL            ;OFFSET LOW
  1923.     MOV    AL,BH
  1924.     OUT    DX,AL            ;OFFSET HIGH
  1925.     MOVZX    DX,CS:[DMA_CNT+SI]
  1926.     MOV    AL,CL
  1927.     OUT    DX,AL            ;SIZE LOW
  1928.     MOV    AL,CH
  1929.     OUT    DX,AL            ;SIZE HIGH
  1930.     MOVZX    DX,CS:[DMA_PAGE+SI]
  1931.     MOV    AL,AH
  1932.     OUT    DX,AL            ;PAGE
  1933.     MOVZX    DX,CS:[DMA_MASK+SI]
  1934.     MOV    AX,SI
  1935.     AND    AL,3
  1936.     OUT    DX,AL            ;DMA-KANAL DEMASKIEREN
  1937.  
  1938.     MOV    DX,CS:BASE_PORT        ;SETUP GUS FOR DMA TRANSFER
  1939.     ADD    DX,CommandPort
  1940.     MOV    AL,DMAAddr        ;SET DMA ADDRESS
  1941.     OUT    DX,AL
  1942.     MOV    EAX,EDI
  1943.     SHR    EAX,4
  1944.     CMP    SI,4
  1945.     JB    SHORT GDMI3
  1946.     MOV    BX,AX            ;CONVERT FOR 16-BIT TRANSFER
  1947.     AND    AX,03FFFH
  1948.     SHR    AX,1
  1949.     AND    BX,0C000H
  1950.     OR    AX,BX
  1951. GDMI3:    INC    DX    
  1952.     OUT    DX,AX
  1953.     DEC    DX
  1954.     MOV    AL,DMACtrl
  1955.     OUT    DX,AL
  1956.     INC    DX
  1957.     INC    DX
  1958.     MOV    AX,SI
  1959.     AND    AL,4            ;SELECT 8/16-BIT CHANNEL
  1960.     OR    AX,BP            ;SELECT AMIGA/PC
  1961.     OR    AL,00100001B        ;START DMA TRANSFER
  1962.     OUT    DX,AL
  1963.     STI
  1964.     MOVZX    DX,CS:[DMA_STAT+SI]
  1965.     MOV    AH,CS:[DMA_BITS+SI]
  1966.     MOV    EBX,800000H        ;TIMEOUT
  1967. GDMI4:    DEC    EBX
  1968.     JZ    SHORT GDMI5
  1969.     OR    BL,BL
  1970.     JNZ    GDMI4
  1971.     IN    AL,DX            ;WAIT FOR TRANSFER END
  1972.     TEST    AL,AH
  1973.     JZ    GDMI4
  1974. GDMI5:    MOV    DX,CS:BASE_PORT        ;STOP GUS DMA
  1975.     ADD    DX,CommandPort
  1976.     MOV    AL,DMACtrl
  1977.     OUT    DX,AL
  1978.     INC    DX
  1979.     INC    DX
  1980.     IN    AL,DX            ;CLEAR IRQ, BUT MASTER IRQ IS DISABLED
  1981.     MOV    DX,CS:BASE_PORT        ;THERE HAPPENED NO IRQ
  1982.     ADD    DX,StatusPort
  1983.     IN    AL,DX
  1984. ;    MOVZX    DX,CS:[DMA_RESET+SI]    ;CASCADED DMA2 (MASTER) RESET
  1985. ;    OUT    DX,AL            ;RESET AUF MASTER DMA LOESCHT CASCADE
  1986.     CMP    SI,4
  1987.     JAE    SHORT NO_RESET2
  1988.     MOVZX    DX,CS:[DMA_RESET]    ;DMA1 (SLAVE) MASTER CLEAR
  1989.     OUT    DX,AL
  1990. NO_RESET2:
  1991.     AND    ECX,0FFFFH        ;INCREASE GUSMEM-POINTER
  1992.     INC    CX
  1993.     CMP    SI,4
  1994.     JB    SHORT GDMI6
  1995.     SHL    CX,1
  1996. GDMI6:    ADD    EDI,ECX
  1997.     MOV    CS:GUS_MEM,EDI
  1998.     RET
  1999. DMA_INIT ENDP
  2000. ;=============================================================================
  2001.  
  2002.  
  2003. ;=============================================================================
  2004. PLAY_MUSIC PROC NEAR
  2005.     PUSH    CS
  2006.     POP    DS
  2007.     CLI
  2008.     MOV    SI,54*2
  2009.     MOV    EBP,54
  2010.     MOV    CX,908-54+1
  2011. CountLoop:
  2012.     XOR    EDX,EDX
  2013.     MOV    EAX,369DE4H
  2014.     DIV    EBP
  2015.     MOV    EDX,100
  2016.     MUL    EDX
  2017.     MOV    EBX,Voices25
  2018.     DIV    EBX
  2019.     SHR    BX,1
  2020.     ADC    BX,0
  2021.     CMP    DX,BX
  2022.     JB    SHORT NoHigherFreq
  2023.     INC    AX
  2024. NoHigherFreq:
  2025.     MOV    [FREQ_TABLE+SI],AX
  2026.     INC    BP
  2027.     ADD    SI,2
  2028.     LOOP    CountLoop
  2029.     MOV    SAM_CH,8
  2030.     MOV    MOD_STAT,0
  2031.     MOV    PATT_ROW,64
  2032.     MOVZX    AX,SONG_START
  2033.     MOV    PATT_CURRENT,AX
  2034.     MOV    PATT_SPEED,6
  2035.     MOV    PATT_COUNT,1
  2036.     MOV    DI,OFFSET SAMP_CHANS
  2037.     XOR    BX,BX
  2038.     MOV    CX,CH_NUMB
  2039. ClearVarLoop:
  2040.     MOV    [DI.FREQ_VAL],0
  2041.     MOV    [DI.VOL],0
  2042.     MOV    AL,[PAN_REGS+BX]
  2043.     SHL    AL,4
  2044.     OR    AL,[PAN_REGS+BX]
  2045.     MOV    [DI.BALANCE],AL
  2046.     INC    BX
  2047.     ADD    DI,CHAN_SIZE
  2048.     LOOP    ClearVarLoop
  2049.  
  2050.     XOR    BX,BX            ;Set Pan Regs!!
  2051.     MOV    CX,NumVoices
  2052. LLDM14:    MOV    DX,BASE_PORT
  2053.     ADD    DX,ActiveVoicePort
  2054.     MOV    AL,NumVoices
  2055.     SUB    AL,CL
  2056.     OUT    DX,AL
  2057.     MOV    DX,BASE_PORT
  2058.     ADD    DX,CommandPort
  2059.     MOV    AL,VoiceBalance
  2060.     OUT    DX,AL
  2061.     MOV    DX,BASE_PORT
  2062.     ADD    DX,DataHighPort
  2063.     MOV    AL,[PAN_REGS+BX]
  2064.     OUT    DX,AL
  2065.     INC    BX
  2066.     LOOP    LLDM14
  2067.  
  2068.     MOV    AL,125
  2069.     CALL    GO_SETBPM
  2070.     MOV    BPM_COUNT,0
  2071.     MOV    COUNTER,20
  2072.     MOV    DX,BASE_PORT        ;Speaker On!!!
  2073.     MOV    AL,00000001B
  2074.     OUT    DX,AL
  2075.     STI
  2076.     CALL    IRQ_INIT
  2077.     RET
  2078. PLAY_MUSIC ENDP
  2079. ;-----------------------------------------------------------------------------
  2080. STOP_MUSIC PROC NEAR
  2081.     PUSH    CS
  2082.     POP    DS
  2083.     CALL    IRQ_INIT
  2084. US_OFF:    PUSH    CS
  2085.     POP    DS
  2086.     MOV    DX,BASE_PORT        ;Speaker Off!!!
  2087.     MOV    AL,00000011B
  2088.     OUT    DX,AL
  2089.     MOV    DX,BASE_PORT
  2090.     ADD    DX,ActiveVoicePort
  2091.     MOV    CX,NumVoices
  2092. VoiceClearL:
  2093.     MOV    AL,CL
  2094.     DEC    AL
  2095.     OUT    DX,AL
  2096.     INC    DX
  2097.     MOV    AL,WriteVoiceMode
  2098.     OUT    DX,AL
  2099.     ADD    DX,2
  2100.     MOV    AL,3            ;Voice Off
  2101.     OUT    DX,AL
  2102.     SUB    DX,2
  2103.     MOV    AL,VolumeCtrl
  2104.     OUT    DX,AL
  2105.     ADD    DX,2
  2106.     MOV    AL,3            ;Ramp Off
  2107.     OUT    DX,AL
  2108.     SUB    DX,3
  2109.     LOOP    VoiceClearL
  2110.     RET
  2111. STOP_MUSIC ENDP
  2112. ;-----------------------------------------------------------------------------
  2113. ; SERVICE IRQ UMLEITUNG; USES THE REAL-TIME-CLOCK IRQ
  2114. ;-----------------------------------------------------------------------------
  2115. IRQ_INIT PROC NEAR
  2116.     CLI
  2117.     XOR     AX,AX
  2118.     MOV     ES,AX
  2119.     CMP    SYSTEM,0
  2120.     JNE    SHORT WU11
  2121.     CMP    VAR_BUFSEG,0
  2122.     JNE    SHORT WU13
  2123.     MOV     AX,COMP_SPEED2        ;XCHANGE INIT & STOP DATA FOR DOS
  2124.     MOV     DX,COMP_SPEED3
  2125.     MOV     COMP_SPEED2,DX
  2126.     MOV     COMP_SPEED3,AX
  2127.     MOV    AL,UHR_STATA        ;UHR-IRQ-RATE EINSTELLEN (1024 HZ)
  2128.     OUT    UHR_INDEX,AL
  2129.     JMP    SHORT WU1
  2130. WU1:    JMP    SHORT WU2
  2131. WU2:    XCHG    AL,AH
  2132.     IN    AL,UHR_PORT
  2133.     AND    AL,0F0H
  2134.     OR    AL,DL
  2135.     XCHG    AL,AH
  2136.     OUT    UHR_INDEX,AL
  2137.     JMP    SHORT WU3
  2138. WU3:    JMP    SHORT WU4
  2139. WU4:    XCHG    AL,AH
  2140.     OUT    UHR_PORT,AL
  2141.     JMP    SHORT WU5
  2142. WU5:    JMP    SHORT WU6
  2143. WU6:    MOV    AL,UHR_STATB        ;UHR-IRQ-MODUS EINSTELLEN
  2144.     OUT    UHR_INDEX,AL
  2145.     JMP    SHORT WU7
  2146. WU7:    JMP    SHORT WU8
  2147. WU8:    XCHG    AL,AH
  2148.     IN    AL,UHR_PORT
  2149.     AND    AL,08FH
  2150.     MOV    DL,DH
  2151.     AND    DL,40H
  2152.     OR    AL,DL
  2153.     XCHG    AL,AH
  2154.     OUT    UHR_INDEX,AL
  2155.     JMP    SHORT WU9
  2156. WU9:    JMP    SHORT WU10
  2157. WU10:    XCHG    AL,AH
  2158.     OUT    UHR_PORT,AL
  2159.     IN    AL,IRQ4            ;IRQ8 DE-/MASKIEREN
  2160.     AND    AL,0FEH
  2161.     MOV    DL,DH
  2162.     AND    DL,1
  2163.     OR    AL,DL
  2164.     OUT    IRQ4,AL
  2165. WU13:    MOV     BX,4*70H                ;UHR-IRQ VERBIEGEN
  2166.     MOV     EAX,ES:[BX]
  2167.     MOV     EDX,HOLD70
  2168.     MOV     ES:[BX],EDX
  2169.     MOV     HOLD70,EAX
  2170.     JMP    SHORT WU12
  2171. WU11:    CMP    VAR_BUFSEG,0
  2172.     JNE    SHORT WU14
  2173.     MOV     AX,COMP_SPEED4        ;FOR WINDOWS
  2174.     MOV     DX,COMP_SPEED5
  2175.     MOV     COMP_SPEED4,DX
  2176.     MOV     COMP_SPEED5,AX
  2177.     MOV     AL,00110110B            ;TIMER0 AUF 1.024 KHZ EINSTELLEN
  2178.     OUT     PIT1,AL                 ;TEILER=1193
  2179.     MOV     AL,DL
  2180.     OUT     TIMER0,AL
  2181.     JMP     SHORT OUT40
  2182. OUT40:  MOV     AL,DH
  2183.     OUT     TIMER0,AL
  2184. WU14:    MOV     BX,4*8H                 ;TIMEOUT-IRQ VERBIEGEN
  2185.     MOV     EAX,ES:[BX]
  2186.     MOV     EDX,HOLD70
  2187.     MOV     ES:[BX],EDX
  2188.     MOV     HOLD70,EAX
  2189. WU12:    MOV    AL,20H
  2190.     OUT    IRQ3,AL
  2191.     OUT    IRQ1,AL
  2192.     STI
  2193.     RET
  2194. IRQ_INIT ENDP
  2195. ;-----------------------------------------------------------------------------
  2196. GET_SONGMOD PROC NEAR
  2197.     MOV    AL,CS:US_MODUS
  2198.     RET
  2199. GET_SONGMOD ENDP
  2200. ;-----------------------------------------------------------------------------
  2201. SET_SONGMOD PROC NEAR
  2202.     AND    AL,3
  2203.     MOV    CS:US_MODUS,AL
  2204.     PUSH    AX
  2205.     XOR    AH,AH
  2206.     TEST    AL,2
  2207.     JNZ    SHORT GSNG2
  2208.     MOV    AH,BYTE PTR CS:MUSIC_VOL
  2209. GSNG2:    CALL    SET_CDMIXER
  2210.     POP    AX
  2211. GSNG1:    RET
  2212. SET_SONGMOD ENDP
  2213. ;-----------------------------------------------------------------------------
  2214. GET_SONGPOSITION PROC NEAR
  2215.     MOV    AL,BYTE PTR CS:PATT_CURRENT
  2216.     RET
  2217. GET_SONGPOSITION ENDP
  2218. ;-----------------------------------------------------------------------------
  2219. SET_SONGPOSITION PROC NEAR
  2220.     PUSH    CX DI
  2221.     AND    AL,7FH
  2222.     MOV    BYTE PTR CS:PATT_CURRENT,AL
  2223.     MOV    CS:PATT_ROW,64
  2224.     MOV    DI,OFFSET SAMP_CHANS
  2225.     MOV    CX,CS:CH_NUMB
  2226. LSET1:    MOV    CS:[DI.VOL],0
  2227.     MOV    CS:[DI.INST_SET],0
  2228.     ADD    DI,CHAN_SIZE
  2229.     LOOP    LSET1
  2230.     POP    DI CX
  2231.     RET
  2232. SET_SONGPOSITION ENDP
  2233. ;-----------------------------------------------------------------------------
  2234. SET_SONGLOOP PROC NEAR
  2235.     MOV    CS:SONG_LOOP,AL
  2236.     RET
  2237. SET_SONGLOOP ENDP
  2238. ;-----------------------------------------------------------------------------
  2239. GET_VOLUME PROC NEAR
  2240.     MOV    AL,BYTE PTR CS:MASTER_VOLUME    ;0= MIN VOLUME,255= MAX VOLUME
  2241.     MOV    BL,BYTE PTR CS:MUSIC_VOLUME    ;0= MIN VOLUME,255= MAX VOLUME
  2242.     MOV    BH,BYTE PTR CS:FX_VOLUME    ;0= MIN VOLUME,255= MAX VOLUME
  2243.     RET
  2244. GET_VOLUME ENDP
  2245. ;-----------------------------------------------------------------------------
  2246. SET_VOLUME PROC NEAR
  2247.     MOV    BYTE PTR CS:MASTER_VOLUME,AL    ;0= MIN VOLUME,255= MAX VOLUME
  2248.     MOV    BYTE PTR CS:MUSIC_VOLUME,BL    ;0= MIN VOLUME,255= MAX VOLUME
  2249.     MOV    BYTE PTR CS:FX_VOLUME,BH    ;0= MIN VOLUME,255= MAX VOLUME
  2250.     PUSH    AX DX
  2251.     MOVZX    DX,AL
  2252.     INC    DX
  2253.     PUSH    DX
  2254.     MOVZX    AX,BL
  2255.     MUL    DX
  2256.     MOV    BYTE PTR CS:MUSIC_VOL,AH
  2257.     CALL    SET_CDMIXER
  2258.     POP    DX
  2259.     MOVZX    AX,BH
  2260.     MUL    DX
  2261.     MOV    BYTE PTR CS:FX_VOL,AH
  2262.     POP    DX AX
  2263.     RET
  2264. SET_VOLUME ENDP
  2265. ;-----------------------------------------------------------------------------
  2266. SET_CDMIXER PROC NEAR
  2267.     CMP    CS:CD_MIXER,0
  2268.     JE    GCD1
  2269.     PUSH    AX DX
  2270.     MOV    DX,CS:BASE_PORT        ;DETECT GUS VERSION
  2271.     ADD    DX,GUS_VERSION        ;GLEICH WIE ICMIX_SEL
  2272.     IN    AL,DX
  2273.     CMP    CS:ULTRA16,0        ;IST ULTRA16 ANGEGEBEN?
  2274.     JNE    SHORT GCD3
  2275.     CMP    AL,5            ;GUS BEFORE 3.7 NO MIXER
  2276.     JL    SHORT GCD2
  2277.     CMP    AL,10
  2278.     JAE    SHORT GCD3
  2279.     SHR    AH,1            ;ICS MIXER ON GUS 0-127
  2280.     MOV    AL,18            ;CD LINE LEFT CHANNEL
  2281.     OUT    DX,AL
  2282.     ADD    DX,ICMIX_DATA-ICMIX_SEL
  2283.     MOV    AL,AH
  2284.     OUT    DX,AL
  2285.     ADD    DX,ICMIX_SEL-ICMIX_DATA
  2286.     MOV    AL,19            ;CD LINE RIGHT CHANNEL
  2287.     OUT    DX,AL
  2288.     ADD    DX,ICMIX_DATA-ICMIX_SEL
  2289.     MOV    AL,AH
  2290.     OUT    DX,AL
  2291.     ADD    DX,ICMIX_SEL-ICMIX_DATA
  2292.     MOV    AL,10            ;LINE IN LEFT CHANNEL
  2293.     OUT    DX,AL
  2294.     ADD    DX,ICMIX_DATA-ICMIX_SEL
  2295.     MOV    AL,AH
  2296.     OUT    DX,AL
  2297.     ADD    DX,ICMIX_SEL-ICMIX_DATA
  2298.     MOV    AL,11            ;LINE IN RIGHT CHANNEL
  2299.     OUT    DX,AL
  2300.     ADD    DX,ICMIX_DATA-ICMIX_SEL
  2301.     MOV    AL,AH
  2302.     OUT    DX,AL
  2303.     JMP    SHORT GCD2
  2304. GCD3:    MOV    DX,CS:CODEC_PORT    ;CODEC MIXER ON GUS MAX 31-0
  2305.     SHR    AH,3
  2306.     JZ    SHORT GCD4
  2307.     XOR    AH,80H
  2308. GCD4:    XOR    AH,9FH
  2309.     MOV    AL,4            ;CD LEFT CHANNEL
  2310.     OUT    DX,AL
  2311.     INC    DX
  2312.     MOV    AL,AH
  2313.     OUT    DX,AL
  2314.     DEC    DX
  2315.     MOV    AL,5            ;CD RIGHT CHANNEL
  2316.     OUT    DX,AL
  2317.     INC    DX
  2318.     MOV    AL,AH
  2319.     OUT    DX,AL
  2320.     DEC    DX
  2321.     MOV    AL,12H            ;LINE IN LEFT CHANNEL
  2322.     OUT    DX,AL
  2323.     INC    DX
  2324.     MOV    AL,AH
  2325.     OUT    DX,AL
  2326.     DEC    DX
  2327.     MOV    AL,13H            ;LINE IN RIGHT CHANNEL
  2328.     OUT    DX,AL
  2329.     INC    DX
  2330.     MOV    AL,AH
  2331.     OUT    DX,AL
  2332. GCD2:    POP    DX AX
  2333. GCD1:    RET
  2334. SET_CDMIXER ENDP
  2335. ;-----------------------------------------------------------------------------
  2336. SET_LOADMOD_FLAG PROC NEAR
  2337.     AND    AL,1
  2338.     MOV    CS:LOADMOD_FLAG,AL    ;0= NORMAL, 1= CD PLAYER MODUS
  2339.     RET
  2340. SET_LOADMOD_FLAG ENDP
  2341. ;-----------------------------------------------------------------------------
  2342. SET_IRQ_RATE PROC NEAR
  2343.     PUSH    CS
  2344.     POP    DS
  2345.     MOV    BPM_RATE,AX
  2346.     MOV    AX,BPM_VALUE
  2347.     CALL    Go_SetBPM
  2348.     MOV    CL,8
  2349.     XOR    SI,SI
  2350. SIR1:    CMP    BPM_RATE,512
  2351.     JB    SHORT SIR2
  2352.     SHL    [SAM_COUNT+SI],4
  2353.     OR    [SAM_COUNT+SI],8
  2354.     JMP    SHORT SIR3
  2355. SIR2:    CMP    [SAM_COUNT+SI],16
  2356.     JB    SHORT SIR3
  2357.     SHR    [SAM_COUNT+SI],4
  2358. SIR3:    INC    SI
  2359.     INC    SI
  2360.     INC    CL
  2361.     CMP    CL,NumVoices-1
  2362.     JB    SIR1
  2363.     RET
  2364. SET_IRQ_RATE ENDP
  2365. ;-----------------------------------------------------------------------------
  2366. ; STARTET SAMPLE AUSGABE
  2367. ; BX= SAMPLE-HANDLE, CX= FREQUENCE (HZ), AL= PANNING: 0= LEFT, 255=RIGHT
  2368. ;-----------------------------------------------------------------------------
  2369. PLAY_SAMPLE PROC NEAR
  2370.     PUSH    CS
  2371.     POP    DS
  2372.     TEST    US_MODUS,1
  2373.     JNZ    GPSMP1
  2374.     CLI
  2375.     PUSH    AX
  2376.     MOV    DI,OFFSET SAMPLE_CHAN
  2377.     MOV    [DI.OFFSET_ADD],0
  2378.     MOV    [DI.REPEAT],0
  2379.     MOV    AX,[SAMPLE_BIG+BX]
  2380.     MOV    [DI.LEN],AX
  2381.     MOV    DX,BPM_RATE
  2382.     MUL    DX
  2383.     DIV    CX
  2384.     MOV    DX,BPM_RATE
  2385.     SHR    DX,4
  2386.     MOV    BP,AX
  2387.     SUB    AX,DX
  2388.     JNC    SHORT LOW_COUNT
  2389.     MOV    AX,BP
  2390. LOW_COUNT:
  2391.     CMP    AX,DX
  2392.     JAE    SHORT LOW_COUNT2
  2393.     MOV    AX,BP
  2394. LOW_COUNT2:
  2395.     MOVZX    SI,SAM_CH
  2396.     SUB    SI,8
  2397.     SHL    SI,1
  2398.     MOV    [SAM_COUNT+SI],AX
  2399.     MOV    AX,100
  2400.     MUL    CX
  2401.     MOV    BP,Voices25
  2402.     DIV    BP
  2403.     SHR    BP,1
  2404.     ADC    BP,0
  2405.     CMP    DX,BP
  2406.     JB    SHORT NoHigherFreq2
  2407.     INC    AX
  2408. NoHigherFreq2:
  2409.     MOV    [DI.FREQ_VAL],AX
  2410.     SHL    BX,1
  2411.     MOV    EAX,[SAMPLE_MEM+BX]
  2412.     MOV    [DI.SAMP_OFF],EAX
  2413.     MOV    DX,BASE_PORT
  2414.     ADD    DX,CommandPort
  2415.     DEC    DX
  2416.     MOV    AL,SAM_CH
  2417.     OUT    DX,AL
  2418.     INC    DX
  2419.     MOV    AL,VoiceBalance
  2420.     OUT    DX,AL
  2421.     INC    DX
  2422.     INC    DX
  2423.     POP    AX
  2424.     SHR    AL,4
  2425.     OUT    DX,AL
  2426.     DEC    DX
  2427.     DEC    DX
  2428.     MOV    AH,3
  2429.     CALL    SEND_WRITE_VOICE
  2430.     CALL    WAIT_PORT
  2431.     CALL    SEND_SAMPLE_START
  2432.     CALL    SEND_SAMPLE_END
  2433.     CALL    SEND_SAMPLE_LOOP
  2434.     MOV    AH,3
  2435.     CALL    SEND_WRITE_VOICE
  2436.     MOV    BP,GUS_VOL        ;SET VOLUME
  2437.     MOV    BX,FX_VOL
  2438.     INC    BX
  2439.     SHR    BX,2
  2440.     CMP    BL,40H
  2441.     JBE    SHORT FIXVL
  2442.     MOV    BL,40H
  2443. FIXVL:    SHL    BX,1
  2444.     MOV    BX,[GUS_VOL+BX]
  2445.     XCHG    BX,BP
  2446.     CALL    SEND_RAMP
  2447.     MOV    AL,SetVoiceFreq        ;SET FREQUENCE
  2448.     OUT    DX,AL
  2449.     INC    DX
  2450.     MOV    AX,[DI.FREQ_VAL]
  2451.     OUT    DX,AX
  2452.     DEC    DX
  2453.     DEC    DX            ;START VOICE
  2454.     MOV    AL,SAM_CH
  2455.     OUT    DX,AL
  2456.     INC    DX
  2457.     MOV    AH,0            ;NO LOOP
  2458.     CALL    SEND_WRITE_VOICE
  2459.     CALL    WAIT_PORT
  2460.     STI
  2461.     INC    SAM_CH
  2462.     CMP    SAM_CH,NumVoices-1
  2463.     JB    SHORT GPSMP1
  2464.     MOV    SAM_CH,8
  2465. GPSMP1:    RET
  2466. PLAY_SAMPLE ENDP
  2467. ;-----------------------------------------------------------------------------
  2468. END_SAMPLE PROC NEAR
  2469.     MOV    CS:SAMPLE_ZEIG,0
  2470.     RET
  2471. END_SAMPLE ENDP
  2472. ;=============================================================================
  2473.  
  2474.  
  2475. ;=============================================================================
  2476. ; LOAD CONFIG DATA (PARSER)
  2477. ; IN: CX=0C242H, DS:BX= POINTER TO PARAM-BLOCK
  2478. ;
  2479. ; PARAM-BLOCK:     + 0 BASE PORT        210H-280H, 388H, ETC.
  2480. ;                  + 2 DMA NUMBER        0-7
  2481. ;                  + 3 IRQ NUMBER        0-15
  2482. ;        + 4 SAMPLE RATE        10000-44100
  2483. ;               + 6 INTERNAL TYPE       0,1,2,3,... (if necessary)
  2484. ;        + 7 INTERRUPT TYPE      0,1 (realtime clock, timer)
  2485. ;               + 8 STARTING POSITION   0-127
  2486. ;               + 9 LOOP POSITION    0-127,128
  2487. ;               +10 SONG MODUS        0-3
  2488. ;               +11 START MASTER VOLUME 0-255
  2489. ;        +12 START MUSIC VOLUME    0-255
  2490. ;               +13 START FX VOLUME     0-255
  2491. ;-----------------------------------------------------------------------------
  2492. CONFIG_INIT PROC NEAR
  2493.     MOV    DX,DS
  2494.     MOV    AX,CS
  2495.     MOV    DS,AX
  2496.     MOV    WORD PTR HOLD70+2,AX
  2497.     CMP    CX,0C242H
  2498.     JNE    SHORT NORMAL_CONFIG
  2499.     MOV    ES,DX
  2500.     MOV    AX,ES:[BX]
  2501.     MOV    BASE_PORT,AX
  2502.     ADD    AX,CODEC_BASE
  2503.     MOV    CODEC_PORT,AX
  2504.     MOV    AL,ES:[BX+2]
  2505.     AND    AX,7
  2506.     MOV    DMA_CHANNEL,AX
  2507.     MOV    AL,ES:[BX+7]
  2508.     AND     AL,1
  2509.     MOV     SYSTEM,AL
  2510.     MOV    AL,ES:[BX+8]
  2511.     AND    AL,127
  2512.     MOV    SONG_START,AL
  2513.     MOV    AL,ES:[BX+9]
  2514.     MOV    SONG_LOOP,AL
  2515.     MOV    AL,ES:[BX+10]
  2516.     AND     AL,3
  2517.     MOV    US_MODUS,AL
  2518.     MOV    AL,ES:[BX+11]
  2519.     MOV    BX,ES:[BX+12]
  2520.     CALL    SET_VOLUME
  2521.     JMP    CONT_CONFIG
  2522. NORMAL_CONFIG:
  2523.     MOV     DX,OFFSET CONFIG_NAME
  2524.     MOV     AH,3DH
  2525.     MOV     AL,80H
  2526.     INT     21H
  2527.     JC      GCFG1
  2528.     MOV     GDDHANDLE,AX
  2529. LCFG1:  XOR     SI,SI
  2530.     MOV     DX,OFFSET QUEUE_BUFFER
  2531. LCFG2:  MOV     AH,3FH
  2532.     MOV     BX,GDDHANDLE
  2533.     MOV     CX,1
  2534.     INT     21H
  2535.     JC      SHORT GCFG2
  2536.     OR      AX,AX
  2537.     JZ      SHORT GCFG2
  2538.     MOV     DI,DX
  2539.     CMP     BYTE PTR [DI],0AH
  2540.     JE      SHORT GCFG6
  2541.     INC     DX
  2542.     INC     SI
  2543.     CMP     SI,256
  2544.     JB      LCFG2
  2545. GCFG6:  MOV     BX,OFFSET CFG_TEXT2
  2546.     CALL    SEEK_LINE
  2547.     JNC     SHORT GCFG4
  2548.     LODSB
  2549.     AND    AL,1
  2550.     MOV    CD_MIXER,AL
  2551.     LODSB
  2552.     AND     AL,3
  2553.     MOV    US_MODUS,AL
  2554.     JMP     LCFG1
  2555. GCFG4:  MOV     BX,OFFSET CFG_TEXT3
  2556.     CALL    SEEK_LINE
  2557.     JNC     SHORT GCFG5
  2558.     INC    SI
  2559.     LODSB
  2560.     DEC    AL
  2561.     AND    AL,7
  2562.     INC    AL
  2563.     SHL    AL,4
  2564.     MOV    AH,2
  2565.     MOV    BASE_PORT,AX
  2566.     ADD    AX,CODEC_BASE
  2567.     MOV    CODEC_PORT,AX
  2568.     JMP     LCFG1
  2569. GCFG5:  MOV     BX,OFFSET CFG_TEXT5
  2570.     CALL    SEEK_LINE
  2571.     JNC     SHORT GCFG7
  2572.     LODSB
  2573.     AND    AX,7
  2574.     MOV    DMA_CHANNEL,AX
  2575.     JMP    LCFG1
  2576. GCFG7:    MOV     BX,OFFSET CFG_TEXT7
  2577.     CALL    SEEK_LINE
  2578.     JNC     LCFG1
  2579.     LODSB
  2580.     AND     AL,1
  2581.     MOV     SYSTEM,AL
  2582.     JMP     LCFG1
  2583. GCFG2:  MOV     BX,GDDHANDLE
  2584.     MOV     AH,3EH
  2585.     INT     21H
  2586. CONT_CONFIG:
  2587.     MOV    AH,62H            ;ULTRA16 ENVIRONMENT SUCHEN
  2588.     INT    21H            ;PSP VON AKTUELLEM EXE ODER COM HOLEN
  2589.     MOV    ES,BX
  2590.     MOV    BX,ES:[2CH]        ;ENV SEG HOLEN
  2591.     MOV    ES,BX
  2592.     XOR    BX,BX
  2593.     MOV    ULTRA16,BX
  2594. LCFG3:    CMP    WORD PTR ES:[BX],0
  2595.     JE    SHORT GCFG11
  2596.     CMP    DWORD PTR ES:[BX],"61AR";CHECK ULTRA16 TEXT
  2597.     JNE    SHORT GCFG10
  2598.     CMP    DWORD PTR ES:[BX-3],"RTLU"
  2599.     JNE    SHORT GCFG10
  2600.     ADD    BX,4
  2601. LCFG4:    INC    BX
  2602.     MOV    AL,ES:[BX]
  2603.     OR    AL,AL
  2604.     JZ    SHORT GCFG11
  2605.     CMP    AL,"0"
  2606.     JB    LCFG4
  2607.     CMP    AL,"F"
  2608.     JA    LCFG4
  2609.     CMP    AL,"9"
  2610.     JBE    SHORT GCFG12
  2611.     CMP    AL,"A"
  2612.     JB    LCFG4
  2613. GCFG12:    XOR    DX,DX
  2614. LCFG5:    MOV    AL,ES:[BX]
  2615.     CMP    AL,"0"
  2616.     JB    SHORT GCFG13
  2617.     CMP    AL,"F"
  2618.     JA    SHORT GCFG13
  2619.     CMP    AL,"9"
  2620.     JBE    SHORT GCFG14
  2621.     SUB    AL,7
  2622.     CMP    AL,"A"-7
  2623.     JB    SHORT GCFG13
  2624. GCFG14:    AND    AL,0FH
  2625.     SHL    DX,4
  2626.     OR    DL,AL
  2627.     INC    BX
  2628.     CMP    BX,8000H
  2629.     JB    LCFG5
  2630. GCFG13:    MOV    CODEC_PORT,DX
  2631.     MOV    ULTRA16,1
  2632.     JMP    SHORT GCFG11
  2633. GCFG10:    INC     BX
  2634.     CMP    BX,8000H
  2635.     JB    LCFG3
  2636. GCFG11:    CLC
  2637. GCFG1:  RET
  2638. CONFIG_INIT ENDP
  2639. ;-----------------------------------------------------------------------------
  2640. SEEK_LINE PROC NEAR
  2641.     CLD
  2642.     MOV     SI,OFFSET QUEUE_BUFFER
  2643. LSKL1:  PUSH    BX
  2644. LSKL2:  CMP     BYTE PTR [BX],0
  2645.     JE      SHORT GSKL1
  2646.     CMP     SI,DX
  2647.     JAE     SHORT GSKL2
  2648.     LODSB
  2649.     CMP     AL,[BX]
  2650.     JNE     SHORT GSKL3
  2651.     INC     BX      
  2652.     JMP     LSKL2
  2653. GSKL3:  POP     BX
  2654.     JMP     LSKL1
  2655. GSKL2:  POP     BX
  2656.     CLC
  2657.     RET
  2658. GSKL1:  POP     BX
  2659.     STC
  2660.     RET
  2661. SEEK_LINE ENDP
  2662. ;=============================================================================
  2663.  
  2664.  
  2665. ;=============================================================================
  2666. ;
  2667. ; MOD LADEROUTINEN
  2668. ;
  2669. ;=============================================================================
  2670. ; LÄDT EIN MODFILE
  2671. ; DS:DX= FILENAME
  2672. ;-----------------------------------------------------------------------------
  2673. LOAD_MOD PROC NEAR
  2674.     MOV    AX,3D00H        ;OPEN MOD
  2675.     INT    21H
  2676.     JC    GLDM1
  2677.     PUSH    CS
  2678.     POP    DS
  2679.     MOV    GDDHANDLE,AX
  2680. GLDM0:    CALL    SET_TMEM        ;ALLOCATE TRACK-BUFFER
  2681.     MOV    BX,GDDHANDLE
  2682.     MOV    GDDZEIG,0
  2683.     CMP    LOADMOD_FLAG,0
  2684.     JNE    GLDM99
  2685.     MOV    CX,10            ;SONG-NAME HOLEN
  2686. LLDM1:    CALL    GET_QUEUE
  2687.     JC    GLDM2
  2688.     LOOP    LLDM1
  2689.     XOR    SI,SI            ;31 INSTRUMENTS
  2690. LLDM2:    MOV    CX,11            ;INSTRUMENT NAME
  2691. LLDM3:    CALL    GET_QUEUE    
  2692.     JC    GLDM2
  2693.     LOOP    LLDM3
  2694.     XOR    EAX,EAX
  2695.     CALL    GET_QUEUE        ;INSTRUMENT SIZE
  2696.     XCHG    AL,AH
  2697.     CMP    AX,2
  2698.     JAE    SHORT GLDM20
  2699.     XOR    AX,AX
  2700. GLDM20:    SHL    AX,1
  2701.     MOV    [ISIZE+SI],AX        ;HÖCHSTENS 64K
  2702.     CALL    GET_QUEUE        ;IVOLUME & FINETUNE
  2703.     PUSH    AX
  2704.     XOR    AH,AH
  2705.     MOV    [IFINETUNE+SI],AX
  2706.     POP    AX
  2707.     SHR    AX,8
  2708.     CMP    AX,40H
  2709.     JBE    SHORT GLDM9
  2710.     MOV    AX,40H
  2711. GLDM9:    MOV    [IVOLUME+SI],AX
  2712.     CALL    GET_QUEUE        ;ILOOP_START
  2713.     XCHG    AL,AH
  2714.     SHL    AX,1
  2715.     MOV    [ILOOP_START+SI],AX
  2716.     CALL    GET_QUEUE        ;ILOOP_SIZE
  2717.     XCHG    AL,AH
  2718.     SHL    AX,1
  2719.     MOV    [ILOOP_SIZE+SI],AX
  2720.     INC    SI
  2721.     INC    SI
  2722.     CMP    SI,62
  2723.     JB    LLDM2
  2724.     CALL    GET_QUEUE        ;SONG_SIZE & LOOP_BYTE OR NOTHING
  2725.     JC    GLDM2
  2726.     MOV    SONG_SIZE,AL
  2727.     MOV    SONG_LOOP,AH
  2728.     XOR    DX,DX
  2729.     MOV    CX,64            ;SONG_DATA
  2730.     MOV    DI,OFFSET SONG_DATA
  2731. LLDM4:    CALL    GET_QUEUE
  2732.     JC    GLDM2
  2733.     MOV    [DI],AX
  2734.     CMP    AL,DL            ;FIND HIGHEST PATTERN NUMBER
  2735.     JBE    SHORT GLDM12
  2736.     MOV    DL,AL
  2737. GLDM12:    CMP    AH,DL
  2738.     JBE    SHORT GLDM13
  2739.     MOV    DL,AH
  2740. GLDM13:    INC    DI
  2741.     INC    DI
  2742.     LOOP    LLDM4
  2743.     INC    DL
  2744.     CLD
  2745.     MOV    PATTERN_NUMBER,DX
  2746.     CALL    GET_QUEUE
  2747.     PUSH    AX
  2748.     CALL    GET_QUEUE
  2749.     SHL    EAX,16
  2750.     POP    AX
  2751.     CMP    EAX,"NHC8"        ;8CHN-MOD
  2752.     JE    SHORT GLDM3
  2753.     CMP    EAX,"8TLF"        ;FLT8-MOD
  2754.     JE    SHORT GLDM3
  2755.     CMP    EAX,"ATCO"        ;OCTA-MOD
  2756.     JE    SHORT GLDM3
  2757.     CMP    EAX,"NHC6"        ;6CHN-MOD
  2758.     JE    SHORT GLDM16
  2759.     CMP    EAX,".K.M"        ;M.K.-MOD
  2760.     JE    SHORT GLDM10
  2761.     CMP    EAX,"4TLF"        ;FLT4-MOD
  2762.     JNE    GLDM2
  2763.  
  2764. GLDM10:    MOV    CH_NUMB,4        ;4-CHANNEL-MOD
  2765.     MOV    PATTERN_SIZE,1024
  2766.     MOV    AH,0
  2767.     MOV    TRACK_INFO+4,AH
  2768.     MOV    TRACK_INFO+5,AH
  2769.     MOV    TRACK_INFO+6,AH
  2770.     MOV    TRACK_INFO+7,AH
  2771.     JMP    SHORT GLDM11
  2772. GLDM16:    MOV    CH_NUMB,6        ;6-CHANNEL-MOD
  2773.     MOV    PATTERN_SIZE,1536
  2774.     MOV    AH,0
  2775.     MOV    TRACK_INFO+6,AH
  2776.     MOV    TRACK_INFO+7,AH
  2777.     JMP    SHORT GLDM11
  2778. GLDM3:    MOV    CH_NUMB,8        ;8-CHANNEL-MOD: GET-PATTERNS
  2779.     MOV    PATTERN_SIZE,2048
  2780. GLDM11:    MOV    PATT_CURRENT,0
  2781.     MOV    TRACK_NUMBER,0
  2782. LLDM7:    MOV    ES,PATTERN_SEG
  2783.     MOV    BX,GDDHANDLE
  2784.     XOR    DI,DI
  2785. LLDM6:    XOR    SI,SI
  2786. LLDM5:    CALL    GET_QUEUE        ;PATTERN HOLEN UND IN TRACKS AUFSPALTEN
  2787.     JC    GLDM2
  2788.     MOV    DX,AX
  2789.     CALL    GET_QUEUE
  2790.     JC    GLDM2
  2791.     PUSH    DI
  2792.     ADD    DI,SI
  2793.     SHL    EAX,16
  2794.     MOV    AX,DX
  2795.     STOSD
  2796.     POP    DI
  2797.     ADD    SI,256
  2798.     CMP    SI,PATTERN_SIZE        ;NEXT TRACK/CHANNEL
  2799.     JB    LLDM5
  2800.     ADD    DI,4            ;NEXT NOTE
  2801.     CMP    DI,256
  2802.     JB    LLDM6
  2803.     MOV    ES,TRACK_SEG        ;TRACK1-8 INTEGRIEREN
  2804.     MOV    DX,TRACK_NUMBER
  2805.     XCHG    DL,DH
  2806.     MOV    DS,PATTERN_SEG
  2807.     XOR    SI,SI
  2808.     XOR    BX,BX
  2809. LLDM8:    XOR    DI,DI
  2810. LLDM9:    CMP    DX,DI
  2811.     JBE    SHORT GLDM4
  2812.     PUSH    SI DI
  2813.     MOV    CX,256/4
  2814.     REPE CMPSD            ;TRACK ALREADY EXISTS?
  2815.     POP    DI SI
  2816.     PUSHF
  2817.     ADD    DI,256
  2818.     POPF
  2819.     JNE    LLDM9
  2820.     JMP    SHORT GLDM5
  2821. GLDM4:    INC    DH            ;NO, ADD TRACK TO BUFFER
  2822.     PUSH    SI
  2823.     MOV    CX,256/4
  2824.     REP MOVSD
  2825.     POP    SI
  2826. GLDM5:    MOV    AX,DI            ;YES
  2827.     DEC    AH
  2828.     MOV    CS:[TRACK_INFO+BX],AH
  2829.     INC    BX
  2830.     ADD    SI,256
  2831.     CMP    BX,CS:CH_NUMB
  2832.     JB    LLDM8
  2833.     PUSH    CS
  2834.     POP    DS
  2835.     XCHG    DL,DH
  2836.     MOV    TRACK_NUMBER,DX
  2837.     XOR    BX,BX            ;TRACKLISTE NACHFÜHREN
  2838.     MOV    AX,PATT_CURRENT
  2839. LLDM10:    CMP    [SONG_DATA+BX],AL
  2840.     JNE    SHORT GLDM6
  2841.     MOV    AH,TRACK_INFO
  2842.     MOV    [TRACK1_DATA+BX],AH
  2843.     MOV    AH,TRACK_INFO+1
  2844.     MOV    [TRACK2_DATA+BX],AH
  2845.     MOV    AH,TRACK_INFO+2
  2846.     MOV    [TRACK3_DATA+BX],AH
  2847.     MOV    AH,TRACK_INFO+3
  2848.     MOV    [TRACK4_DATA+BX],AH
  2849.     MOV    AH,TRACK_INFO+4
  2850.     MOV    [TRACK5_DATA+BX],AH
  2851.     MOV    AH,TRACK_INFO+5
  2852.     MOV    [TRACK6_DATA+BX],AH
  2853.     MOV    AH,TRACK_INFO+6
  2854.     MOV    [TRACK7_DATA+BX],AH
  2855.     MOV    AH,TRACK_INFO+7
  2856.     MOV    [TRACK8_DATA+BX],AH
  2857. GLDM6:    INC    BX
  2858.     CMP    BL,128
  2859.     JB    LLDM10
  2860.     INC    PATT_CURRENT        ;NÄCHSTES PATTERN HOLEN
  2861.     MOV    AX,PATT_CURRENT
  2862.     CMP    AX,PATTERN_NUMBER
  2863.     JB    LLDM7
  2864.     JMP    SHORT GLDM7
  2865.  
  2866. GLDM99:    MOV    ES,TRACK_SEG        ;TRACK SEGMENT WIEDER LÖSCHEN
  2867.     MOV    AH,49H
  2868.     INT    21H
  2869.     MOV    GUS_MEM,0
  2870. GLDM7:    MOV    ES,PATTERN_SEG        ;PATTERN SEGMENT WIEDER LÖSCHEN
  2871.     MOV    AH,49H
  2872.     INT    21H
  2873.     MOV    PATTERN_SEG,0
  2874.     CALL    INIT_DEVICE        ;IS PROBABLY THE FIRST INIT
  2875.     CMP    LOADMOD_FLAG,0
  2876.     JNE    GLDM98
  2877.     MOV    BX,TRACK_NUMBER        ;TRACK SEGMENT REDUZIEREN
  2878.     SHL    BX,4
  2879.     MOV    ES,TRACK_SEG
  2880.     MOV    AH,4AH
  2881.     INT    21H
  2882.  
  2883.     MOVZX    AX,GDDZEIG        ;FILEZEIGER KORRIGIEREN
  2884.     OR    AX,AX            ;BUFFER ABHÄNGEN
  2885.     JZ    SHORT GLDM30
  2886.     MOV    DX,GDDREST
  2887.     SUB    DX,AX
  2888.     JZ    SHORT GLDM30
  2889.     XOR    CX,CX
  2890.     MOV    GDDZEIG,CL
  2891.     MOV    BX,GDDHANDLE
  2892.     NEG    DX
  2893.     DEC    CX
  2894.     MOV    AX,4201H        ;DATEIZEIGER ZURÜCKBEWEGEN
  2895.     INT    21H
  2896. GLDM30:    MOV    AH,48H            ;SAMPLE BUFFER BEREIT
  2897.     MOV    BX,2000H        ;128K WEGEN 64K DMA FENSTER
  2898.     INT    21H
  2899.     MOV    GDDSEG,AX
  2900.     TEST    AX,0FFFH
  2901.     JZ    SHORT GLDM31
  2902.     AND    AX,0F000H
  2903.     ADD    AX,1000H
  2904. GLDM31:    MOV    BUFSEG,AX
  2905.     XOR    EDI,EDI            ;SAMPLES LADEN
  2906.     MOV    GUS_MEM,EDI
  2907.     XOR    SI,SI
  2908. LLDM12:    PUSH    SI
  2909.     MOV    CX,[ISIZE+SI]
  2910.     JCXZ    SHORT GLDM8
  2911.     SHL    SI,1
  2912.     TEST    EDI,31
  2913.     JZ    SHORT GLDM32
  2914.     AND    EDI,-32            ;32 BYTE BOUND FOR DMA
  2915.     ADD    EDI,32
  2916. GLDM32:    MOV    [IOFFSET+SI],EDI
  2917.     MOV    BX,GDDHANDLE        ;SAMPLE IN BUFFER LADEN
  2918.     PUSH    DS
  2919.     XOR    DX,DX
  2920.     MOV    SI,DX
  2921.     MOV    DS,BUFSEG
  2922.     MOV     AH,3FH
  2923.     INT     21H
  2924.     SHR    CX,1
  2925.     XOR    BX,BX            ;AMIGA-SAMPLE
  2926.     CALL    SEND_SAMPLE_DATA
  2927.     POP    DS
  2928. GLDM8:    POP    SI
  2929.     INC    SI
  2930.     INC    SI
  2931.     CMP    SI,62
  2932.     JB    LLDM12
  2933.     MOV    ES,GDDSEG        ;SAMPLE BUFFER FREIGEBEN
  2934.     MOV    AH,49H
  2935.     INT    21H
  2936.     MOV    GDDSEG,0
  2937. GLDM98:    CLC
  2938.     JMP    SHORT GLDM15
  2939. GLDM2:    STC
  2940. GLDM15:    PUSHF
  2941.     CMP    VAR_BUFSEG,0
  2942.     JNE    SHORT GLDM97
  2943.     MOV    AH,3EH
  2944.     MOV    BX,GDDHANDLE
  2945.     INT    21H
  2946. GLDM97:    POPF
  2947. GLDM1:    RET
  2948. LOAD_MOD ENDP
  2949. ;-----------------------------------------------------------------------------
  2950. ; HOLT EIN WORD AUS DEM BUFFER
  2951. ; IN: AX= WORD, BX= HANDLE
  2952. ;-----------------------------------------------------------------------------
  2953. GET_QUEUE PROC NEAR
  2954.     CMP     GDDZEIG,0
  2955.     JNE     SHORT GTQ1
  2956.     PUSH    CX DX
  2957.     MOV     DX,OFFSET QUEUE_BUFFER
  2958.     MOV     CX,256
  2959.     MOV     AH,3FH
  2960.     INT     21H
  2961.     MOV    GDDREST,AX
  2962.     POP    DX CX
  2963. GTQ1:   PUSH    BX
  2964.     MOV     BL,GDDZEIG
  2965.     XOR     BH,BH
  2966.     CMP    BX,GDDREST
  2967.     JAE    SHORT GTQ2
  2968.     MOV     AX,[QUEUE_BUFFER+BX]
  2969.     ADD     GDDZEIG,2
  2970.     POP    BX
  2971.     CLC
  2972.     RET
  2973. GTQ2:    POP    BX
  2974.     STC
  2975.     RET
  2976. GET_QUEUE ENDP
  2977. ;----------------------------------------------------------------------------
  2978. ; RESERVIERT SPEICHER FÜR TRACKS, CARRY-FLAG 0=OK 1=ABBRUCH
  2979. ;----------------------------------------------------------------------------
  2980. SET_TMEM PROC NEAR
  2981.     MOV     AH,48H
  2982.     MOV     BX,1000H                ;64K TRACK BUFFER (WIRD RESIZED)
  2983.     INT     21H
  2984.     JC      SHORT STCM1
  2985.     MOV     TRACK_SEG,AX
  2986.     MOV    AH,48H
  2987.     MOV    BX,80H            ;2K PATTERN BUFFER
  2988.     INT    21H
  2989.     JC    SHORT STCM1
  2990.     MOV    PATTERN_SEG,AX
  2991. STCM1:  RET
  2992. SET_TMEM ENDP
  2993. ;----------------------------------------------------------------------------
  2994. END_MUSIC PROC NEAR
  2995.     CALL    INIT_DEVICE
  2996.     CMP    LOADMOD_FLAG,0
  2997.     JNE    SHORT LEM3
  2998.     MOV     AH,49H
  2999.     MOV     ES,TRACK_SEG
  3000.     INT     21H
  3001.     CMP    PATTERN_SEG,0
  3002.     JE    SHORT LEM3
  3003.     MOV     AH,49H
  3004.     MOV     ES,PATTERN_SEG
  3005.     INT     21H
  3006.     MOV    PATTERN_SEG,0
  3007. LEM3:    CMP    GDDSEG,0
  3008.     JE    SHORT LEM4
  3009.     MOV     AH,49H
  3010.     MOV     ES,GDDSEG
  3011.     INT     21H
  3012.     MOV    GDDSEG,0
  3013. LEM4:    XOR    EAX,EAX
  3014.     MOV    GDDLENGTH,EAX
  3015.     MOV    GDDREST,AX
  3016.     MOV    GDDHANDLE,AX
  3017.     MOV    GDDSEG,AX
  3018.     MOV    BUFSEG,AX
  3019.     MOV    GDDZEIG,AL        ;RESET VARIABLES
  3020.     MOV    SAM_CH,8
  3021.     MOV    MOD_STAT,AL
  3022.     XOR    BX,BX
  3023.     MOV    CX,11
  3024. LEM1:    MOV    WORD PTR [BPM_COUNT+BX],AX
  3025.     ADD    BX,2
  3026.     LOOP    LEM1
  3027.     MOV    CH_NUMB,4
  3028.     MOV    TRACK_NUMBER,AX
  3029.     MOV    DWORD PTR TRACK_INFO,EAX
  3030.     MOV    DWORD PTR TRACK_INFO+4,EAX
  3031.     MOV    TRACK_SEG,AX
  3032.     MOV    BX,OFFSET TRACK1_DATA
  3033. LEM2:    MOV    [BX],AL
  3034.     INC    BX
  3035.     CMP    BX,OFFSET PATTJUMPS
  3036.     JB    LEM2
  3037.     MOV    IRQCOUNT,56
  3038.     RET
  3039. END_MUSIC ENDP
  3040. ;=============================================================================
  3041. ; LÄDT EIN SAMPLE
  3042. ; INPUT: DS:DX= FILENAME, CL= 00H AMIGA-SAMPLE, 80H PC-SAMPLE
  3043. ; OUTPUT: AX= SAMPLE-HANDLE FOR PLAYING
  3044. ;-----------------------------------------------------------------------------
  3045. LOAD_SAMPLE PROC NEAR
  3046.     MOV    AX,3D00H        ;OPEN SAMPLE
  3047.     INT    21H
  3048.     JC    GSMP1
  3049.     PUSH    CS
  3050.     POP    DS
  3051.     MOV    GDDHANDLE,AX
  3052.     MOV    BX,AX
  3053.     PUSH    CX
  3054.     CALL    GET_FILESIZE
  3055.     POP    CX
  3056. GSMP0:    AND    CL,80H
  3057.     MOV    CH,CL
  3058.     PUSH    DS CX
  3059.     MOV    GDDZEIG,0
  3060.     MOV    CX,AX
  3061.     AND    CX,0FFFEH
  3062.     MOV    AH,48H            ;SAMPLE BUFFER BEREIT
  3063.     MOV    BX,2000H        ;128K WEGEN 64K DMA FENSTER
  3064.     INT    21H
  3065.     MOV    GDDSEG,AX
  3066.     TEST    AX,0FFFH
  3067.     JZ    SHORT GSMP2
  3068.     AND    AX,0F000H
  3069.     ADD    AX,1000H
  3070. GSMP2:    MOV    BUFSEG,AX
  3071.     MOV    EDI,GUS_MEM
  3072.     TEST    EDI,31
  3073.     JZ    SHORT GSMP3
  3074.     AND    EDI,-32            ;32 BYTE BOUND FOR DMA
  3075.     ADD    EDI,32
  3076. GSMP3:    MOV    SI,SAMPLE_ZEIG
  3077.     MOV    [SAMPLE_BIG+SI],CX
  3078.     SHL    SI,1
  3079.     MOV    [SAMPLE_MEM+SI],EDI
  3080.     MOV    BX,GDDHANDLE        ;SAMPLE IN BUFFER LADEN
  3081.     XOR    DX,DX
  3082.     MOV    SI,DX
  3083.     MOV    DS,BUFSEG
  3084.     MOV     AH,3FH
  3085.     INT     21H
  3086.     SHR    CX,1
  3087.     POP    BX
  3088.     CLD
  3089.     CALL    SEND_SAMPLE_DATA
  3090.     POP    DS
  3091.     MOV    ES,GDDSEG        ;SAMPLE BUFFER FREIGEBEN
  3092.     MOV    AH,49H
  3093.     INT    21H
  3094.     MOV    GDDSEG,0
  3095.     CMP    VAR_BUFSEG,0
  3096.     JNE    SHORT GSMP5
  3097.     MOV    BX,GDDHANDLE
  3098.     MOV    AH,3EH
  3099.     INT    21H
  3100. GSMP5:    MOV    AX,SAMPLE_ZEIG
  3101.     ADD    SAMPLE_ZEIG,2
  3102.     CLC
  3103. GSMP1:    RET
  3104. LOAD_SAMPLE ENDP
  3105. ;-----------------------------------------------------------------------------
  3106. GET_FILESIZE PROC NEAR
  3107.     MOV    AX,4202H
  3108.     XOR    CX,CX
  3109.     XOR    DX,DX
  3110.     INT    21H
  3111.     PUSH    AX
  3112.     MOV    AX,4200H
  3113.     XOR    CX,CX
  3114.     XOR    DX,DX
  3115.     INT    21H
  3116.     POP    AX
  3117.     RET
  3118. GET_FILESIZE ENDP
  3119. ;=============================================================================
  3120.  
  3121. IF COM_OR_OBJ
  3122. ;=============================================================================
  3123. MAIN_CONT PROC NEAR
  3124.     PUSH    BP DS CS ES
  3125.     POP    DS
  3126.     SHL    DI,2
  3127.     ADD    DI,0100H
  3128.     CALL    DI            ;FAR CALL
  3129.     SETC    DL
  3130.     XOR    DH,DH
  3131.     POP    DS BP            ;BP IS ABSOLUTELY IMPORTANT FOR C
  3132.     RETF
  3133. MAIN_CONT ENDP
  3134. ;=============================================================================
  3135.  
  3136. ELSE
  3137. ;=============================================================================
  3138. MAIN_CONT PROC NEAR
  3139.     MOV    AX,CS            ;DS setzen
  3140.     MOV    DS,AX
  3141.     MOV     PROG_START_SEG,ES       ;PROGRAMMANFANG
  3142.     MOV     AX,SS                   ;UND -ENDE MERKEN
  3143.     MOV     BX,OFFSET PROG_END
  3144.     ADD     BX,STACKLENGTH
  3145.     MOV     SP,BX
  3146.     SHR     BX,4
  3147.     INC     BX
  3148.     ADD     AX,BX
  3149.     MOV     PROG_END_SEG,AX
  3150.     XOR    BX,BX
  3151. GL1:    MOV    AL,ES:[82H+BX]
  3152.     OR    AL,AL
  3153.     JZ    SHORT GL2
  3154.     CMP    AL,20H
  3155.     JE    SHORT GL2
  3156.     CMP    AL,0DH
  3157.     JE    SHORT GL2
  3158.     MOV    [MOD_NAME+BX],AL
  3159.     INC    BX
  3160.     CMP    BX,40H
  3161.     JB    GL1
  3162. GL2:    OR    BX,BX
  3163.     JZ    GMEND
  3164.     XOR    AL,AL
  3165.     MOV    [MOD_NAME+BX],0
  3166.     MOV     BX,PROG_END_SEG         ;SPEICHER FREI MACHEN
  3167.     SUB     BX,PROG_START_SEG
  3168.     MOV     ES,PROG_START_SEG
  3169.     MOV     AH,4AH                  ;SPEICHERBLOCKGRÖSSE ÄNDERN
  3170.     INT     21H
  3171.     MOV    VAR_BUFSEG,0
  3172. ;-----------------------------------------------------------------------------
  3173. ; INITIALIZING & STARTING
  3174. ;    MOV    AL,255            ;SET MAXIMUM VOLUME
  3175. ;    MOV    BL,AL
  3176. ;    MOV    BH,AL
  3177. ;    CALL    SET_VOLUME
  3178.     XOR    CX,CX            ;FD.CFG
  3179.     CALL    CONFIG_INIT        ;GET CONFIG
  3180. ;    MOV    LOADMOD_FLAG,1        ;CD TEST CONFIGURATION
  3181. ;    MOV    CD_MIXER,1
  3182.     MOV    DX,OFFSET MOD_NAME    ;FIRST, TRY LOADING
  3183.     CALL    LOAD_MOD
  3184.     JNC    SHORT GM1
  3185.     MOV    AH,9
  3186.     MOV    DX,OFFSET ERROR1_TEXT
  3187.     INT    21H
  3188.     JMP    SHORT GM4
  3189. GM1:    MOV    DX,OFFSET SAMPLE_NAME    ;GET SAMPLE
  3190.     MOV    CL,80H            ;PC-SAMPLE
  3191.     CALL    LOAD_SAMPLE
  3192.     JNC    SHORT GM2
  3193.     MOV    AH,9
  3194.     MOV    DX,OFFSET ERROR2_TEXT
  3195.     INT    21H
  3196. GM2:    CALL    PLAY_MUSIC        ;TRY STARTING
  3197. ;-----------------------------------------------------------------------------
  3198. ; THIS COULD BE THE MAIN ROUTINE
  3199.     MOV    AH,9
  3200.     MOV    DX,OFFSET OUT_TEXT
  3201.     INT    21H
  3202. LM1:    XOR    AH,AH
  3203.     INT    16H
  3204.     CMP    AL,27
  3205.     JE    SHORT GM5
  3206.     CMP    AL,"+"
  3207.     JNE    SHORT G1
  3208.     CALL    GET_VOLUME
  3209.     INC    AL
  3210.     CALL    SET_VOLUME
  3211.     JMP    LM1
  3212. G1:    CMP    AL,"-"
  3213.     JNE    SHORT G2
  3214.     CALL    GET_VOLUME
  3215.     DEC    AL
  3216.     CALL    SET_VOLUME
  3217.     JMP    LM1
  3218. G2:    CMP    AL,"9"
  3219.     JNE    SHORT G3
  3220.     MOV    AL,0
  3221.     CALL    SET_SONGLOOP
  3222.     JMP    LM1
  3223. G3:    CMP    AL,"0"
  3224.     JNE    SHORT G4
  3225.     INC    US_MODUS
  3226.     MOV    AL,US_MODUS
  3227.     CALL    SET_SONGMOD
  3228.     JMP    LM1
  3229. G4:    CMP    AL,"1"
  3230.     JNE    LM1
  3231.     ADD    PAN_FX,10H
  3232.     MOV    AL,PAN_FX        ;PANNING
  3233.     XOR    BX,BX            ;HANDLE
  3234.     MOV    CX,22222        ;FREQUENCE
  3235.     CALL    PLAY_SAMPLE
  3236.     JMP    LM1
  3237. ;-----------------------------------------------------------------------------
  3238. ; CUTTING OFF
  3239. GM5:    CALL    STOP_MUSIC        ;STOP MUSIC
  3240.     CALL    END_SAMPLE        ;UNLOAD SAMPLES
  3241. GM4:    CALL    END_MUSIC        ;UNLOAD MUSIC
  3242. GMEND:    MOV     AX,4C00H                ;BEENDEN NACH DOS
  3243.     INT     21H
  3244. MAIN_CONT ENDP
  3245. ;=============================================================================
  3246. ENDIF
  3247. CODE_SEG4 ENDS
  3248.  
  3249. END _MAIN4