home *** CD-ROM | disk | FTP | other *** search
/ CD-X 1 / cdx_01.iso / demodisc / cyberdan / intrance / gus / gusplay.asm < prev    next >
Encoding:
Assembly Source File  |  1994-12-25  |  40.8 KB  |  2,321 lines

  1.     Comment &
  2.  
  3.     Gus play routine V 1.5 by Robert Adolfsson - CASCADA
  4.     Not for release!
  5.  
  6.     NosieTracker/SoundTracker/StarTrekker/FastTracker/OctaComposer compatible
  7.  
  8.     &
  9.  
  10.     Jumps
  11.     .286
  12.  
  13. _Code    Segment Para 'PlaySeg'
  14.  
  15.     assume    cs:_Code
  16.  
  17. ;    Publics
  18.  
  19. Public    MainVolume,PlayingPattern,RealPPattern,PatternRow,RealRow,OrderLen,ChanOn,NumChans,Time,SampChans,Bar,BasePort,ErrorCode,Timing
  20. Public    LoadMod,ClearMem,StartPlaying,StopPlaying,Init,InitDevice
  21. public  resetplayer
  22.  
  23. ;    Structures
  24.  
  25. ChanSize    Equ 54
  26.  
  27. ChanInfo    Struc
  28.  
  29. SampOff        dd 0
  30. FreqVal     dw 0
  31. Vol         dw 0
  32. OldVol        dw 0
  33. Fine         dw 0
  34. Repeat         dw 0
  35. RepLen         dw 0
  36. Len         dw 0
  37. Amiga         dw 0
  38. Effect         dw 0
  39. VibratoPek     dw 0
  40. OldVibrato     dw 0
  41. PortTo         dw 0
  42. OldPortTo     dw 0
  43. EffectTime    dw 0
  44. CurrSamp    dw 0
  45. OldSamp        dw 0
  46. Arp         dw 0,0,0
  47. ArpCounter     dw 0
  48. InstSet        dw 0
  49. LoopOnOff    dw 0
  50. OffsetAdd    dw 0
  51. Bar        dw 0
  52. smp        dw    0
  53.  
  54. ChanInfo    EndS
  55. resetcounter    dw $-offset sampoff
  56.  
  57. ; Number of voices to use
  58.  
  59. NumVoices    Equ 20
  60.  
  61. ; UltraSound Ports
  62.  
  63. StatusPort    Equ 6h
  64. TimerCtrlPort    Equ 8h
  65. TimerDataPort    Equ 9h
  66. MidiCtrlPort    Equ 100h
  67. MidiDataPort    Equ 101h
  68. ActiveVoicePort    Equ 102h
  69. CommandPort    Equ 103h
  70. DataLowPort    Equ 104h
  71. DataHighPort    Equ 105h
  72. DRAMIOPort    Equ 107h
  73.  
  74. ; UltraSound Commands
  75.  
  76. WriteVoiceMode    Equ 00h
  77. SetVoiceFreq    Equ 01h        ; Value=Freq/Divisor
  78. LoopStartLo    Equ 02h
  79. LoopStartHi    Equ 03h
  80. SampleEndLo    Equ 04h
  81. SampleEndHi    Equ 05h
  82. VolRampRate    Equ 06h
  83. VolRampStart    Equ 07h
  84. VolRampEnd    Equ 08h
  85. SetVolume    Equ 09h
  86. SampleStartLo    Equ 0Ah
  87. SampleStartHi    Equ 0Bh
  88. VoiceBalance    Equ 0Ch
  89. VolumeCtrl    Equ 0Dh
  90. VoicesActive    Equ 0Eh
  91. DMACtrl        Equ 41h
  92. DRAMAddrLo    Equ 43h
  93. DRAMAddrHi    Equ 44h
  94. Initialize    Equ 4Ch
  95. ReadVolume    Equ 89h
  96. VoicePosLo    Equ 8Ah
  97. VoicePosHi    Equ 8Bh
  98. ReadVolCtrl    Equ 8Dh
  99.  
  100. ; Divisors
  101.  
  102. Voices14    Equ 4300
  103. Voices15    Equ 4000
  104. Voices16    Equ 3700
  105. Voices17    Equ 3500
  106. Voices18    Equ 3300
  107. Voices19    Equ 3100
  108. Voices20    Equ 3030
  109. Voices21    Equ 2800
  110. Voices22    Equ 2700
  111. Voices23    Equ 2600
  112. Voices24    Equ 2500
  113. Voices25    Equ 2400
  114. Voices26    Equ 2300
  115. Voices27    Equ 2200
  116. Voices28    Equ 2100
  117. Voices29    Equ 2000
  118. Voices30    Equ 2000
  119. Voices31    Equ 1900
  120. Voices32    Equ 1800
  121.  
  122. ;    Variables
  123.  
  124. MKSign        db 'M.K.FLT46CHN8CHNOCTA'
  125. MKMod        db 0
  126. Info        db 1084/4 dup ('M.K.')
  127. OrderLen    db 0
  128. Restart        db 0
  129. PatternOrder    db 128/4 dup ('M.K.')
  130. SinTab        db 0,25,50,74,98,120,142,162,180,197,212,225,236
  131.         db 244,250,254,255,254,250,244,236,225,212,197,180
  132.         db 162,142,120,98,74,50,25
  133.  
  134. ArpTable    db 70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70
  135.         db 70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,68,68,68,68,68,68,68,66,66,66,66,66,66,66,64,64,64,64,64,64,64,64,62,62,62,62,62,62,62,62,60,60,60,60,60,60,60,60,58,58,58,58,58,58
  136.         db 58,58,58,56,56,56,56,56,56,56,56,56,56,54,54,54,54,54,54,54,54,54,54,52,52,52,52,52,52,52,52,52,52,50,50,50,50,50,50,50,50,50,50,50,50,48,48,48,48,48,48,48,48,48,48,48,48,46,46,46,46,46,46,46,46,46,46,46,46,44,44,44,44,44,44,44,44,44,44
  137.         db 44,44,44,44,42,42,42,42,42,42,42,42,42,42,42,42,42,42,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,34,34,34,34,34,34,34,34,34,34,34,34,34
  138.         db 34,34,34,34,34,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,26,26,26,26,26,26,26,26,26,26,26,26,26
  139.         db 26,26,26,26,26,26,26,26,26,26,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20
  140.         db 20,20,20,20,20,20,20,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,14,14,14,14,14,14,14,14,14,14,14,14,14,14
  141.         db 14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10
  142.         db 10,10,10,10,10,10,10,10,10,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4
  143.         db 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  144.  
  145. PanRegs        db 3,12,12,3,0,0,0,0,0,0,0,0,0,0,0,0
  146.         db 6,6,9,9,9,6,0,0,0,0,0,0,0,0,0,0
  147.         db 6,6,9,9,9,9,6,6,0,0,0,0,0,0,0,0
  148.  
  149. EvenData
  150.  
  151. AmigaVals    dw 856,808,762,720,678,640,604,570,538,508,480,453 ;C-1 to B-1 Finetune +0.
  152.         dw 428,404,381,360,339,320,302,285,269,254,240,226 ;C-2 to B-2 Finetune +0.
  153.         dw 214,202,190,180,170,160,151,143,135,127,120,113 ;C-3 to B-3 Finetune +0.
  154.  
  155.         dw 850,802,757,715,674,637,601,567,535,505,477,450 ;C-1 to B-1 Finetune +1.
  156.         dw 425,401,379,357,337,318,300,284,268,253,239,225 ;C-2 to B-2 Finetune +1.
  157.         dw 213,201,189,179,169,159,150,142,134,126,119,113 ;C-3 to B-3 Finetune +1.
  158.  
  159.         dw 844,796,752,709,670,632,597,563,532,502,474,447 ;C-1 to B-1 Finetune +2.
  160.         dw 422,398,376,355,335,316,298,282,266,251,237,224 ;C-2 to B-2 Finetune +2.
  161.         dw 211,199,188,177,167,158,149,141,133,125,118,112 ;C-3 to B-3 Finetune +2.
  162.  
  163.         dw 838,791,746,704,665,628,592,559,528,498,470,444 ;C-1 to B-1 Finetune +3.
  164.         dw 419,395,373,352,332,314,296,280,264,249,235,222 ;C-2 to B-2 Finetune +3.
  165.         dw 209,198,187,176,166,157,148,140,132,125,118,111 ;C-3 to B-3 Finetune +3.
  166.  
  167.         dw 832,785,741,699,660,623,588,555,524,495,467,441 ;C-1 to B-1 Finetune +4.
  168.         dw 416,392,370,350,330,312,294,278,262,247,233,220 ;C-2 to B-2 Finetune +4.
  169.         dw 208,196,185,175,165,156,147,139,131,124,117,110 ;C-3 to B-3 Finetune +4.
  170.  
  171.         dw 826,779,736,694,655,619,584,551,520,491,463,437 ;C-1 to B-1 Finetune +5.
  172.         dw 413,390,368,347,328,309,292,276,260,245,232,219 ;C-2 to B-2 Finetune +5.
  173.         dw 206,195,184,174,164,155,146,138,130,123,116,109 ;C-3 to B-3 Finetune +5.
  174.  
  175.         dw 820,774,730,689,651,614,580,547,516,487,460,434 ;C-1 to B-1 Finetune +6.
  176.         dw 410,387,365,345,325,307,290,274,258,244,230,217 ;C-2 to B-2 Finetune +6.
  177.         dw 205,193,183,172,163,154,145,137,129,122,115,109 ;C-3 to B-3 Finetune +6.
  178.  
  179.         dw 814,768,725,684,646,610,575,543,513,484,457,431 ;C-1 to B-1 Finetune +7.
  180.         dw 407,384,363,342,323,305,288,272,256,242,228,216 ;C-2 to B-2 Finetune +7.
  181.         dw 204,192,181,171,161,152,144,136,128,121,114,108 ;C-3 to B-3 Finetune +7.
  182.  
  183.         dw 907,856,808,762,720,678,640,604,570,538,504,480 ;C-1 to B-1 Finetune -8.
  184.         dw 453,428,404,381,360,339,320,302,285,269,254,240 ;C-2 to B-2 Finetune -8.
  185.         dw 226,214,202,190,180,170,160,151,143,135,127,120 ;C-3 to B-3 Finetune -8.
  186.  
  187.         dw 900,850,802,757,715,675,636,601,567,535,505,477 ;C-1 to B-1 Finetune -7.
  188.         dw 450,425,401,379,357,337,318,300,284,268,253,238 ;C-2 to B-2 Finetune -7.
  189.         dw 225,212,200,189,179,169,159,150,142,134,126,119 ;C-3 to B-3 Finetune -7.
  190.  
  191.         dw 894,844,796,752,709,670,632,597,563,532,502,474 ;C-1 to B-1 Finetune -6.
  192.         dw 447,422,398,376,355,335,316,298,282,266,251,237 ;C-2 to B-2 Finetune -6.
  193.         dw 223,211,199,188,177,167,158,149,141,133,125,118 ;C-3 to B-3 Finetune -6.
  194.  
  195.         dw 887,838,791,746,704,665,628,592,559,528,498,470 ;C-1 to B-1 Finetune -5.
  196.         dw 444,419,395,373,352,332,314,296,280,264,249,235 ;C-2 to B-2 Finetune -5.
  197.         dw 222,209,198,187,176,166,157,148,140,132,125,118 ;C-3 to B-3 Finetune -5.
  198.  
  199.         dw 881,832,785,741,699,660,623,588,555,524,494,467 ;C-1 to B-1 Finetune -4.
  200.         dw 441,416,392,370,350,330,312,294,278,262,247,233 ;C-2 to B-2 Finetune -4.
  201.         dw 220,208,196,185,175,165,156,147,139,131,123,117 ;C-3 to B-3 Finetune -4.
  202.  
  203.         dw 875,826,779,736,694,655,619,584,551,520,491,463 ;C-1 to B-1 Finetune -3.
  204.         dw 437,413,390,368,347,338,309,292,276,260,245,232 ;C-2 to B-2 Finetune -3.
  205.         dw 219,206,195,184,174,164,155,146,138,130,123,116 ;C-3 to B-3 Finetune -3.
  206.  
  207.         dw 868,820,774,730,689,651,614,580,547,516,487,460 ;C-1 to B-1 Finetune -2.
  208.         dw 434,410,387,365,345,325,307,290,274,258,244,230 ;C-2 to B-2 Finetune -2.
  209.         dw 217,205,193,183,172,163,154,145,137,129,122,115 ;C-3 to B-3 Finetune -2.
  210.  
  211.         dw 862,814,768,725,684,646,610,575,543,513,484,457 ;C-1 to B-1 Finetune -1.
  212.         dw 431,407,384,363,342,323,305,288,272,256,242,228 ;C-2 to B-2 Finetune -1.
  213.         dw 216,203,192,181,171,161,152,144,136,128,121,114 ;C-3 to B-3 Finetune -1.
  214.  
  215. GusVol        dw 20000,39120,41376,42656,43936,45072,45696,46240,46848,47408
  216.         dw 47952,48528,49072,49360,49632,49920,50160,50432,50704,50928
  217.         dw 51168,51424,51680,51952,52160,52448,52672,52912,53152,53312
  218.         dw 53440,53584,53664,53808,53952,54048,54144,54288,54400,54496
  219.         dw 54608,54720,54832,54944,55072,55184,55312,55440,55552,55696
  220.         dw 55760,55888,56016,56096,56240,56304,56448,56528,56672,56752
  221.         dw 56896,56976,57136,57216
  222.  
  223. SampOffset    dd 31 dup (0)
  224. SampLen        dw 31 dup (0)
  225. SampVol        dw 31 dup (0)
  226. SampFine    dw 31 dup (0)
  227. SampRep        dw 31 dup (0)
  228. SampRepLen    dw 31 dup (0)
  229.  
  230. BasePort    dw 220h
  231. FileHandle    dw 0
  232. NumChans    dw 4            ; 4,6 or 8 (Defualt = 4)
  233. ChanOn        dw 0FFh
  234.  
  235. ChanOnCount     dw 0
  236. PatternSpeed    dw 0
  237. PatternCount    dw 0
  238. PatternRow    dw 0
  239. RealRow        dw 0
  240. PlayingPattern    dw 0
  241. RealPPattern    dw 0
  242. TempVol        dw 0
  243. ErrorCode    dw 0
  244.  
  245. FreqTable    dw 908 dup ('?!')
  246.  
  247. PatternPek    equ this DWord
  248.  
  249. BytePattern     dw 0
  250. SegPattern    dw 0
  251.  
  252. SampMem        dw 0
  253. PatternMem    dw 0
  254. BreakData    dw 0
  255. OldTimer    dd 0
  256. GUSMem        dd 0
  257. Speed        dd 0
  258. SpeedAdd    dd 0
  259. Counter        dw 0
  260. Time        dd 0
  261. JumpOldTimer    dw 0
  262.  
  263. Count        dw    0
  264. Timing        dw 0
  265. MainVolume    dw 64
  266.  
  267. SampChans       ChanInfo 8 dup (<>)
  268.  
  269. ;     Macros
  270.  
  271. NopLoop        Macro    Nops
  272. Local    NopLoop
  273.  
  274.     push    cx
  275.     mov    cx,Nops
  276. NopLoop:
  277.     nop
  278.     loop    NopLoop
  279.     pop    cx
  280.  
  281.         EndM
  282.  
  283. ;    The Code
  284.  
  285. Even
  286.  
  287.     assume    ds:_Code
  288.  
  289. Pattern        Proc    Near
  290.  
  291.     pusha
  292.     push    ds
  293.     push    es
  294.  
  295.     mov    ax,_Code
  296.     mov    ds,ax
  297.  
  298.     mov    al,20h
  299.     out    20h,al
  300.     sti
  301.  
  302.     add    Word Ptr [Time],1
  303.     adc    Word Ptr [Time+2],0
  304.  
  305.     inc    [Count]
  306.     inc    [Counter]
  307.     mov    ax,Word Ptr [Speed+2]
  308.     add    Word Ptr [SpeedAdd+2],ax
  309.     mov    ax,Word Ptr [Speed]
  310.     adc    Word Ptr [SpeedAdd],ax
  311.     jc    JumpPattern
  312.     cmp    [Counter],4
  313.     je    ClearNotes
  314.     cmp    [Counter],5
  315.     je    SetNotes
  316.     jmp    EndPattern
  317.  
  318. ClearNotes:
  319.     mov    di,offset [SampChans]
  320.     mov    cx,[NumChans]
  321.     mov    dx,[BasePort]
  322.     add    dx,CommandPort
  323.  
  324. StopVoices:
  325.     dec    dx
  326.     mov    al,Byte Ptr [NumChans]
  327.     sub    al,cl
  328.     out    dx,al
  329.     inc    dx
  330.  
  331.     cmp    [di.InstSet],2
  332.     je    VoiceOff1
  333.     cmp    [di.InstSet],1
  334.     je    VoiceOff2
  335.     cmp    [di.OffsetAdd],0
  336.     jne    VoiceOff1
  337.     jmp    NoVoiceOff
  338.  
  339. VoiceOff2:
  340.     mov    ax,[di.CurrSamp]
  341.     cmp    ax,[di.OldSamp]
  342.     jne    VoiceOff1
  343.     jmp    NoVoiceOff
  344.  
  345. VoiceOff1:
  346.     mov    ax,[di.OldVol]
  347.     mov    [di.OldVol],0
  348.     mov    bx,[MainVolume]
  349.     mul    bx
  350.     shr    ax,6
  351.     adc    ax,0
  352.     mov    bx,ax
  353.     shl    bx,1
  354.     mov    bx,[GusVol+bx]
  355.  
  356.     mov    dx,[BasePort]
  357.     add    dx,CommandPort
  358.  
  359.     mov    al,VolumeCtrl
  360.     out    dx,al
  361.     add    dx,2
  362.     mov    al,3
  363.     out    dx,al
  364.     sub    dx,2
  365.  
  366.     mov    bp,[GusVol]
  367.     mov    ah,0
  368.     cmp    bx,bp
  369.     jb    NoFixVolDir1
  370.     mov    ah,01000000b
  371.     xchg    bx,bp
  372. NoFixVolDir1:
  373.  
  374.     mov    al,VolRampStart
  375.     out    dx,al
  376.     xchg    ax,bx
  377.     inc    dx
  378.     out    dx,ax
  379.     dec    dx
  380.  
  381.     mov    al,VolRampEnd
  382.     out    dx,al
  383.     mov    ax,bp
  384.     inc    dx
  385.     out    dx,ax
  386.     dec    dx
  387.  
  388.     mov    al,VolumeCtrl
  389.     out    dx,al
  390.     mov    al,bh
  391.     add    dx,2
  392.     out    dx,al
  393.     sub    dx,2
  394. NoVoiceOff:
  395.  
  396.     add    di,ChanSize
  397.     dec    cx
  398.     jnz    StopVoices
  399.     jmp    EndPattern
  400.  
  401. SetNotes:
  402.     mov    [Counter],1
  403.     mov    di,offset [SampChans]
  404.     mov    cx,[NumChans]
  405.     mov    dx,[BasePort]
  406.     add    dx,CommandPort
  407.  
  408. ChangeSamps:
  409.     dec    dx
  410.     mov    al,Byte Ptr [NumChans]
  411.     sub    al,cl
  412.     out    dx,al
  413.     inc    dx
  414.  
  415.     cmp    [di.InstSet],2
  416.     je    SampChange1
  417.     cmp    [di.InstSet],1
  418.     je    SampChange2
  419.     cmp    [di.OffsetAdd],0
  420.     jne    ChangeOffset
  421.     jmp    NoChangeSamp
  422.  
  423. ChangeOffset:
  424.     mov    al,SampleStartLo
  425.     out    dx,al
  426.     inc    dx
  427.     mov    ax,Word Ptr [di.SampOff]
  428.     mov    bp,Word Ptr [di.SampOff+2]
  429.     add    ax,[di.OffsetAdd]
  430.     adc    bp,0
  431.     shr    ax,7
  432.     shl    bp,9
  433.     or    ax,bp
  434.     out    dx,ax
  435.     dec    dx
  436.     mov    al,SampleStartHi
  437.     out    dx,al
  438.     inc    dx
  439.     mov    ax,Word Ptr [di.SampOff]
  440.     add    ax,[di.OffsetAdd]
  441.     shl    ax,9
  442.     out    dx,ax
  443.     dec    dx
  444.     sub    dx,CommandPort
  445.     Rept    6
  446.     in    al,dx
  447.     EndM
  448.     add    dx,CommandPort
  449.     jmp    NoChangeSamp
  450.  
  451. SampChange1:
  452.     mov    al,WriteVoiceMode
  453.     out    dx,al
  454.     add    dx,2
  455.     mov    al,3
  456.     out    dx,al
  457.     sub    dx,DataHighPort
  458.     Rept    6
  459.     in    al,dx
  460.     EndM
  461.     add    dx,CommandPort
  462.  
  463.     mov    al,SampleStartLo
  464.     out    dx,al
  465.     inc    dx
  466.     mov    ax,Word Ptr [di.SampOff]
  467.     mov    bp,Word Ptr [di.SampOff+2]
  468.     add    ax,[di.OffsetAdd]
  469.     adc    bp,0
  470.     shr    ax,7
  471.     shl    bp,9
  472.     or    ax,bp
  473.     out    dx,ax
  474.     dec    dx
  475.     mov    al,SampleStartHi
  476.     out    dx,al
  477.     inc    dx
  478.     mov    ax,Word Ptr [di.SampOff]
  479.     add    ax,[di.OffsetAdd]
  480.     shl    ax,9
  481.     out    dx,ax
  482.     sub    dx,DataLowPort
  483.     Rept    6
  484.     in    al,dx
  485.     EndM
  486.     add    dx,CommandPort
  487.  
  488.     mov    ax,[di.OldSamp]
  489.     cmp    ax,[di.CurrSamp]
  490.     je    NoChangeSamp
  491.  
  492.     mov    al,SampleEndLo
  493.     out    dx,al
  494.     inc    dx
  495.     mov    ax,Word Ptr [di.SampOff]
  496.     mov    bp,Word Ptr [di.SampOff+2]
  497.     add    ax,[di.Len]
  498.     adc    bp,0
  499.     shr    ax,7
  500.     shl    bp,9
  501.     or    ax,bp
  502.     out    dx,ax
  503.     dec    dx
  504.     mov    al,SampleEndHi
  505.     out    dx,al
  506.     inc    dx
  507.     mov    ax,Word Ptr [di.SampOff]
  508.     add    ax,[di.Len]
  509.     shl    ax,9
  510.     out    dx,ax
  511.     dec    dx
  512.  
  513.     mov    al,LoopStartLo
  514.     out    dx,al
  515.     inc    dx
  516.     mov    ax,Word Ptr [di.SampOff]
  517.     mov    bp,Word Ptr [di.SampOff+2]
  518.     add    ax,[di.Repeat]
  519.     adc    bp,0
  520.     shr    ax,7
  521.     shl    bp,9
  522.     or    ax,bp
  523.     out    dx,ax
  524.     dec    dx
  525.     mov    al,LoopStartHi
  526.     out    dx,al
  527.     inc    dx
  528.     mov    ax,Word Ptr [di.SampOff]
  529.     add    ax,[di.Repeat]
  530.     shl    ax,9
  531.     out    dx,ax
  532.     dec    dx
  533.  
  534.     mov    al,WriteVoiceMode
  535.     out    dx,al
  536.     add    dx,2
  537.     mov    al,3
  538.     out    dx,al
  539.     sub    dx,2
  540.     jmp    NoChangeSamp
  541.  
  542. SampChange2:
  543.     mov    ax,[di.OldSamp]
  544.     cmp    ax,[di.CurrSamp]
  545.     je    NoChangeSamp
  546.  
  547.     mov    al,VoicePosLo
  548.     out    dx,al
  549.     inc    dx
  550.     in    ax,dx
  551.     mov    bx,ax
  552.     dec    dx
  553.     mov    al,VoicePosHi
  554.     out    dx,al
  555.     inc    dx
  556.     in    ax,dx
  557.     dec    dx
  558.     xchg    ax,bx
  559.     shl    ax,7
  560.     shr    bx,9
  561.     and    bx,7Fh
  562.     or    ax,bx
  563.     mov    bx,[di.OldSamp]
  564.     dec    bx
  565.     shl    bx,2
  566.     sub    ax,Word Ptr [SampOffset+bx]
  567.     mov    bx,ax
  568.     cmp    bx,[di.Len]
  569.     jb    NoFixStart
  570.     mov    bx,[di.Len]
  571.     dec    bx
  572. NoFixStart:
  573.  
  574.     cmp    [di.OffsetAdd],0
  575.     jne    NoOffsetEff
  576.     mov    [di.OffsetAdd],bx
  577. NoOffsetEff:
  578.  
  579.     mov    al,SampleStartLo
  580.     out    dx,al
  581.     inc    dx
  582.     mov    ax,Word Ptr [di.SampOff]
  583.     mov    bp,Word Ptr [di.SampOff+2]
  584.     add    ax,[di.OffsetAdd]
  585.     adc    bp,0
  586.     shr    ax,7
  587.     shl    bp,9
  588.     or    ax,bp
  589.     out    dx,ax
  590.     dec    dx
  591.     mov    al,SampleStartHi
  592.     out    dx,al
  593.     inc    dx
  594.     mov    ax,Word Ptr [di.SampOff]
  595.     add    ax,[di.OffsetAdd]
  596.     shl    ax,9
  597.     out    dx,ax
  598.     sub    dx,DataLowPort
  599.     Rept    6
  600.     in    al,dx
  601.     EndM
  602.     add    dx,CommandPort
  603.  
  604.     mov    al,SampleEndLo
  605.     out    dx,al
  606.     inc    dx
  607.     mov    ax,Word Ptr [di.SampOff]
  608.     mov    bp,Word Ptr [di.SampOff+2]
  609.     add    ax,[di.Len]
  610.     adc    bp,0
  611.     shr    ax,7
  612.     shl    bp,9
  613.     or    ax,bp
  614.     out    dx,ax
  615.     dec    dx
  616.     mov    al,SampleEndHi
  617.     out    dx,al
  618.     inc    dx
  619.     mov    ax,Word Ptr [di.SampOff]
  620.     add    ax,[di.Len]
  621.     shl    ax,9
  622.     out    dx,ax
  623.     dec    dx
  624.  
  625.     mov    al,LoopStartLo
  626.     out    dx,al
  627.     inc    dx
  628.     mov    ax,Word Ptr [di.SampOff]
  629.     mov    bp,Word Ptr [di.SampOff+2]
  630.     add    ax,[di.Repeat]
  631.     adc    bp,0
  632.     shr    ax,7
  633.     shl    bp,9
  634.     or    ax,bp
  635.     out    dx,ax
  636.     dec    dx
  637.     mov    al,LoopStartHi
  638.     out    dx,al
  639.     inc    dx
  640.     mov    ax,Word Ptr [di.SampOff]
  641.     add    ax,[di.Repeat]
  642.     shl    ax,9
  643.     out    dx,ax
  644.     dec    dx
  645.  
  646.     mov    al,WriteVoiceMode
  647.     out    dx,al
  648.     add    dx,2
  649.     mov    al,Byte Ptr [di.LoopOnOff]
  650.     out    dx,al
  651.     sub    dx,DataHighPort
  652.     Rept    6
  653.     in    al,dx
  654.     EndM
  655.     add    dx,CommandPort
  656. NoChangeSamp:
  657.  
  658.     mov    ax,[di.Vol]
  659.     cmp    ax,[di.OldVol]
  660.     je    NoSetBar
  661.     mov    [di.Bar],ax
  662. NoSetBar:
  663.  
  664.     mov    [TempVol],ax
  665.     mov    ax,[Counter]
  666.     test    [ChanOn],ax
  667.     jnz    NoChanOff
  668.     mov    [TempVol],0
  669.     mov    [di.Bar],0
  670. NoChanOff:
  671.  
  672.     mov    ax,[di.OldVol]
  673.     mov    bx,[MainVolume]
  674.     mul    bx
  675.     shr    ax,6
  676.     adc    ax,0
  677.     mov    bx,ax
  678.     shl    bx,1
  679.     mov    bx,[GusVol+bx]
  680.     mov    ax,[TempVol]
  681.     mov    bp,[MainVolume]
  682.     mul    bp
  683.     shr    ax,6
  684.     adc    ax,0
  685.     mov    bp,ax
  686.     shl    bp,1
  687.     mov    bp,[GusVol+bp]
  688.  
  689.     mov    dx,bp
  690.     mov    dl,bh
  691.     cmp    dl,dh
  692.     jne    SetVol
  693.  
  694.     mov    dx,[BasePort]
  695.     add    dx,CommandPort
  696.  
  697.     mov    al,VolumeCtrl
  698.     out    dx,al
  699.     add    dx,2
  700.     mov    al,3
  701.     out    dx,al
  702.     sub    dx,2
  703.  
  704.     mov    al,SetVolume
  705.     out    dx,al
  706.     mov    ax,bp
  707.     inc    dx
  708.     out    dx,ax
  709.     dec    dx
  710.     jmp    NoSetVol
  711.  
  712. SetVol:
  713.     mov    dx,[BasePort]
  714.     add    dx,CommandPort
  715.  
  716.     mov    al,VolumeCtrl
  717.     out    dx,al
  718.     add    dx,2
  719.     mov    al,3
  720.     out    dx,al
  721.     sub    dx,2
  722.  
  723.     mov    ah,0
  724.     cmp    bx,bp
  725.     jb    NoFixVolDir
  726.     mov    ah,01000000b
  727.     xchg    bx,bp
  728. NoFixVolDir:
  729.  
  730.     mov    dx,[BasePort]
  731.     add    dx,CommandPort
  732.     mov    al,VolRampStart
  733.     out    dx,al
  734.     xchg    ax,bx
  735.     inc    dx
  736.     out    dx,ax
  737.     dec    dx
  738.  
  739.     mov    al,VolRampEnd
  740.     out    dx,al
  741.     mov    ax,bp
  742.     inc    dx
  743.     out    dx,ax
  744.     dec    dx
  745.  
  746.     mov    al,VolumeCtrl
  747.     out    dx,al
  748.     mov    al,bh
  749.     add    dx,2
  750.     out    dx,al
  751.     sub    dx,2
  752. NoSetVol:
  753.  
  754.     mov    al,SetVoiceFreq
  755.     out    dx,al
  756.     inc    dx
  757.     mov    ax,[di.FreqVal]
  758.     out    dx,ax
  759.     dec    dx
  760.  
  761.     shl    [Counter],1
  762.     add    di,ChanSize
  763.     dec    cx
  764.     jnz    ChangeSamps
  765.  
  766.     mov    di,offset [SampChans]
  767.     mov    cx,[NumChans]
  768.  
  769. StartVoices:
  770.     dec    dx
  771.     mov    al,Byte Ptr [NumChans]
  772.     sub    al,cl
  773.     out    dx,al
  774.     inc    dx
  775.  
  776.     cmp    [di.InstSet],2
  777.     jne    NoVoiceStart
  778.  
  779.     mov    al,WriteVoiceMode
  780.     out    dx,al
  781.     add    dx,2
  782.     mov    al,Byte Ptr [di.LoopOnOff]
  783.     out    dx,al
  784.     sub    dx,DataHighPort
  785.     Rept    6
  786.     in    al,dx
  787.     EndM
  788.     add    dx,CommandPort
  789. NoVoiceStart:
  790.  
  791.     mov    [di.InstSet],0
  792.     mov    [di.OffsetAdd],0
  793.  
  794.     add    di,ChanSize
  795.     dec    cx
  796.     jnz    StartVoices
  797.     jmp    EndPattern
  798.  
  799. JumpPattern:
  800.  
  801.     mov    [Counter],0
  802.  
  803.     dec    Word Ptr [PatternCount]
  804.     jnz    DoEffects
  805.     jmp    DoPattern
  806. DoEffects:
  807.  
  808.     mov    di,offset [SampChans]
  809.     mov    cx,[NumChans]
  810.  
  811. EffectLoop:
  812.  
  813.     mov    ax,[di.Vol]
  814.     mov    [di.OldVol],ax
  815.  
  816.     inc    [di.EffectTime]
  817.     add    [di.ArpCounter],2
  818.     cmp    [di.ArpCounter],6
  819.     jb    NoWrapArp
  820.     mov    [di.ArpCounter],0
  821. NoWrapArp:
  822.     mov    ax,[di.Effect]
  823.     cmp    ax,0
  824.     jne    DoEffect
  825.     jmp    NoEffect
  826. DoEffect:
  827.     mov    bl,al
  828.     mov    bh,0
  829.     cmp    bl,0Eh
  830.     je    DoEEffects
  831.     shl    bx,1
  832.     jmp    [EffectJumps+bx]
  833. DoEEffects:
  834.     mov    bl,ah
  835.     and    ah,0Fh
  836.     shr    bl,4
  837.     shl    bx,1
  838.     jmp    [EEffectJumps+bx]
  839. Arpeggio:
  840.     mov    bx,[di.ArpCounter]
  841.     mov    bx,[di.Arp+bx]
  842.     shl    bx,1
  843.     mov    ax,Word Ptr [FreqTable+bx]
  844.     mov    [di.FreqVal],ax
  845.     jmp    NoEffect
  846. PortUp:
  847.     xchg    ah,al
  848.     mov    ah,0
  849.     mov    bp,[di.Fine]
  850.     mov    bp,[AmigaVals+35*2+bp]
  851.     mov    bx,[di.Amiga]
  852.     sub    bx,ax
  853.     jnc    NoFix1
  854.     mov    bx,bp
  855. NoFix1:
  856.     cmp    bx,bp
  857.     jae    NotSmall1
  858.     mov    bx,bp
  859. NotSmall1:
  860.     mov    [di.Amiga],bx
  861.     shl    bx,1
  862.     mov    ax,[FreqTable+bx]
  863.     mov    [di.FreqVal],ax
  864.     jmp    NoEffect
  865. PortDown:
  866.     xchg    ah,al
  867.     mov    ah,0
  868.     mov    bp,[di.Fine]
  869.     mov    bp,[AmigaVals+bp]
  870.     mov    bx,[di.Amiga]
  871.     add    bx,ax
  872.     cmp    bx,bp
  873.     jbe    NotBig1
  874.     mov    bx,bp
  875. NotBig1:
  876.     mov    [di.Amiga],bx
  877.     shl    bx,1
  878.     mov    ax,[FreqTable+bx]
  879.     mov    [di.FreqVal],ax
  880.     jmp    NoEffect
  881. PortToTone:
  882.     xchg    ah,al
  883.     xor    ah,ah
  884.     mov    dx,[di.PortTo]
  885.     mov    bx,[di.Amiga]
  886.     cmp    bx,dx
  887.     jae    NoPortToUp
  888.     add    bx,ax
  889.     cmp    bx,dx
  890.     jna    NoPortToUp
  891.     mov    [di.Amiga],dx
  892. NoPortToUp:
  893.     cmp    bx,dx
  894.     jbe    NoPortToDown
  895.     sub    bx,ax
  896.     jnc    NoPortToError
  897.     mov    bx,dx
  898. NoPortToError:
  899.     cmp    bx,dx
  900.     jnb    NoPortToDown
  901.     mov    bx,dx
  902. NoPortToDown:
  903.     mov    [di.Amiga],bx
  904.     shl    bx,1
  905.     mov    ax,[FreqTable+bx]
  906.     mov    [di.FreqVal],ax
  907.     jmp    NoEffect
  908. Vibrato:
  909.     mov    bp,[di.Fine]
  910.     mov    si,[AmigaVals+bp]
  911.     mov    bp,[AmigaVals+35*2+bp]
  912.     mov    dl,ah
  913.     and    ah,0F0h
  914.     shr    ah,2
  915.     and    dl,0Fh
  916.     mov    bl,Byte Ptr [di.VibratoPek]
  917.     add    bl,ah
  918.     mov    Byte Ptr [di.VibratoPek],bl
  919.     shr    bl,2
  920.     and    bx,1Fh
  921.     mov    al,[SinTab+bx]
  922.     mul    dl
  923.     rol    ax,1
  924.     xchg    ah,al
  925.     and    ah,1
  926.     test    Byte Ptr [di.VibratoPek],128
  927.     jne    VibUp1
  928.     neg    ax
  929. VibUp1:
  930.     add    ax,[di.Amiga]
  931.     cmp    ax,bp
  932.     jae    NoHighVibrato1
  933.     mov    ax,bp
  934. NoHighVibrato1:
  935.     cmp    ax,si
  936.     jbe    NoLowVibrato1
  937.     mov    ax,si
  938. NoLowVibrato1:
  939.     shl    ax,1
  940.     mov    bx,ax
  941.     mov    ax,[FreqTable+bx]
  942.     mov    [di.FreqVal],ax
  943.     jmp    NoEffect
  944. PortToVSlide:
  945.     mov    al,ah
  946.     and    ah,0Fh
  947.     shr    al,4
  948.     sub    ah,al
  949.     mov    al,Byte Ptr [di.Vol]
  950.     sub    al,ah
  951.     jns    NoSlideLow2
  952.     mov    al,0
  953. NoSlideLow2:
  954.     cmp    al,40h
  955.     jb    NoSlideHigh2
  956.     mov    al,3Fh
  957. NoSlideHigh2:
  958.     mov    Byte Ptr [di.Vol],al
  959.     mov    ax,[di.OldPortTo]
  960.     mov    dx,[di.PortTo]
  961.     mov    bx,[di.Amiga]
  962.     cmp    bx,dx
  963.     jae    NoPortToUp2
  964.     add    bx,ax
  965.     cmp    bx,dx
  966.     jna    NoPortToUp2
  967.     mov    [di.Amiga],dx
  968. NoPortToUp2:
  969.     cmp    bx,dx
  970.     jbe    NoPortToDown2
  971.     sub    bx,ax
  972.     jnc    NoPortToError2
  973.     mov    bx,0
  974. NoPortToError2:
  975.     cmp    bx,dx
  976.     jnb    NoPortToDown2
  977.     mov    bx,dx
  978. NoPortToDown2:
  979.     mov    [di.Amiga],bx
  980.     shl    bx,1
  981.     mov    ax,Word Ptr [FreqTable+bx]
  982.     mov    [di.FreqVal],ax
  983.     jmp    NoEffect
  984. VibratoVSlide:
  985.     mov    al,ah
  986.     and    ah,0Fh
  987.     shr    al,4
  988.     sub    ah,al
  989.     mov    al,Byte Ptr [di.Vol]
  990.     sub    al,ah
  991.     jns    NoSlideLow3
  992.     mov    al,0
  993. NoSlideLow3:
  994.     cmp    al,40h
  995.     jb    NoSlideHigh3
  996.     mov    al,3Fh
  997. NoSlideHigh3:
  998.     mov    Byte Ptr [di.Vol],al
  999.     mov    bp,[di.Fine]
  1000.     mov    si,[AmigaVals+bp]
  1001.     mov    bp,[AmigaVals+35*2+bp]
  1002.     mov    ah,Byte Ptr [di.OldVibrato]
  1003.     or    ah,Byte Ptr [di.OldVibrato+1]
  1004.     mov    dl,ah
  1005.     and    ah,0F0h
  1006.     shr    ah,2
  1007.     and    dl,0Fh
  1008.     mov    bl,Byte Ptr [di.VibratoPek]
  1009.     add    bl,ah
  1010.     mov    Byte Ptr [di.VibratoPek],bl
  1011.     shr    bl,2
  1012.     and    bx,1Fh
  1013.     mov    al,[SinTab+bx]
  1014.     mul    dl
  1015.     rol    ax,1
  1016.     xchg    ah,al
  1017.     and    ah,1
  1018.     test    Byte Ptr [di.VibratoPek],128
  1019.     jne    VibUp2
  1020.     neg    ax
  1021. VibUp2:
  1022.     add    ax,[di.Amiga]
  1023.     cmp    ax,bp
  1024.     jae    NoHighVibrato2
  1025.     mov    ax,bp
  1026. NoHighVibrato2:
  1027.     cmp    ax,si
  1028.     jbe    NoLowVibrato2
  1029.     mov    ax,si
  1030. NoLowVibrato2:
  1031.     shl    ax,1
  1032.     mov    bx,ax
  1033.     mov    ax,[FreqTable+bx]
  1034.     mov    [di.FreqVal],ax
  1035.     jmp    NoEffect
  1036. VolSlide:
  1037.     mov    al,ah
  1038.     and    ah,0Fh
  1039.     shr    al,4
  1040.     cmp    al,0
  1041.     je    NoVolSlideUp
  1042.     neg    al
  1043.     mov    ah,al
  1044. NoVolSlideUp:
  1045.     mov    al,Byte Ptr [di.Vol]
  1046.     sub    al,ah
  1047.     jns    NoSlideLow1
  1048.     mov    al,0
  1049. NoSlideLow1:
  1050.     cmp    al,40h
  1051.     jb    NoSlideHigh1
  1052.     mov    al,3Fh
  1053. NoSlideHigh1:
  1054.     mov    Byte Ptr [di.Vol],al
  1055.     jmp    NoEffect
  1056. RetrigNote:
  1057.     cmp    ah,Byte Ptr [di.EffectTime]
  1058.     jne    NoRetrig
  1059.     mov    [di.EffectTime],0
  1060.     mov    [di.InstSet],2
  1061. NoRetrig:
  1062.     jmp    NoEffect
  1063. CutNote:
  1064.     cmp    ah,Byte Ptr [di.EffectTime]
  1065.     jne    NoCutNote
  1066.     mov    [di.Amiga],0
  1067.     mov    [di.FreqVal],0
  1068. NoCutNote:
  1069.     jmp    NoEffect
  1070. DelayNote:
  1071.     cmp    ah,Byte Ptr [di.EffectTime]
  1072.     jne    NoDelayNote
  1073.     mov    [di.InstSet],2
  1074.     mov    [di.VibratoPek],0
  1075.     mov    bx,[di.PortTo]
  1076.     mov    [di.Amiga],bx
  1077.     shl    bx,1
  1078.     mov    bx,[FreqTable+bx]
  1079.     mov    [di.FreqVal],bx
  1080. NoDelayNote:
  1081.     jmp    NoEffect
  1082. NoEffect:
  1083.  
  1084.     add    di,ChanSize
  1085.     dec    cx
  1086.     jz    EndEffects
  1087.     jmp    EffectLoop
  1088. EndEffects:
  1089.  
  1090.     jmp    EndPattern
  1091.  
  1092. DoPattern:
  1093.     mov    ax,[PatternSpeed]
  1094.     mov    [PatternCount],ax
  1095.     cmp    [PatternRow],64
  1096.     jb    NoPatternWrap
  1097.     mov    ax,[PlayingPattern]
  1098.     cmp    al,[OrderLen]
  1099.     jb    NoTrackWrap
  1100.     mov    ax,0
  1101.     cmp    [Restart],78h
  1102.     jae    NoRestart
  1103.     mov    al,[Restart]
  1104. NoRestart:
  1105.     mov    [PlayingPattern],ax
  1106. NoTrackWrap:
  1107.     mov    bx,[PlayingPattern]
  1108.     mov    [RealPPattern],bx
  1109.     inc    [RealPPattern]
  1110.     mov    ah,0
  1111.     mov    al,[PatternOrder+bx]
  1112.     mov    dx,[NumChans]
  1113.     shl    dx,8
  1114.     mul    dx
  1115.     shl    dx,12
  1116.     add    dx,[PatternMem]
  1117.     mov    [SegPattern],dx
  1118.     mov    [BytePattern],ax
  1119.     mov    ax,[BreakData]
  1120.     mov    [PatternRow],ax
  1121.     shl    ax,4
  1122.     add    [BytePattern],ax
  1123.     mov    [BreakData],0
  1124.     inc    [PlayingPattern]
  1125. NoPatternWrap:
  1126.  
  1127.     les    si,[PatternPek]
  1128.     mov    di,offset [SampChans]
  1129.     mov    cx,[NumChans]
  1130.     mov    ax,[PatternRow]
  1131.     mov    [RealRow],ax
  1132.  
  1133. PattLoop:
  1134.  
  1135.     mov    ax,[di.Vol]
  1136.     mov    [di.OldVol],ax
  1137.     mov    [di.smp],0
  1138.  
  1139.     mov    bh,es:[si]        ; New Sample
  1140.     mov    bl,es:[si+2]
  1141.     and    bh,0F0h
  1142.     shr    bl,4
  1143.     add    bl,bh
  1144.     je    NoNewSample
  1145.     mov    [di.smp],1
  1146.     mov    bh,Byte Ptr [di.CurrSamp]
  1147.     mov    Byte Ptr [di.OldSamp],bh
  1148.     mov    Byte Ptr [di.CurrSamp],bl
  1149.     mov    bh,0
  1150.     dec    bx
  1151.     shl    bx,1
  1152.     mov    ax,[SampVol+bx]
  1153.     cmp    ax,40h
  1154.     jb    NoHighVol
  1155.     mov    ax,3Fh
  1156. NoHighVol:
  1157.     mov    [di.Vol],ax
  1158.     mov    [di.InstSet],1
  1159.     shl    bx,1
  1160.     mov    ax,Word Ptr [SampOffset+bx]
  1161.     mov    Word Ptr [di.SampOff],ax
  1162.     mov    ax,Word Ptr [SampOffset+bx+2]
  1163.     mov    Word Ptr [di.SampOff+2],ax
  1164.     shr    bx,1
  1165.     mov    ax,[SampFine+bx]
  1166.     shl    ax,3
  1167.     mov    [di.Fine],ax
  1168.     shl    ax,3
  1169.     add    [di.Fine],ax
  1170.     mov    [di.LoopOnOff],0
  1171.     mov    ax,[SampLen+bx]
  1172.     mov    [di.Len],ax
  1173.     mov    ax,[SampRep+bx]
  1174.     mov    [di.Repeat],ax
  1175.     mov    ax,[SampRepLen+bx]
  1176.     mov    [di.RepLen],ax
  1177.     cmp    ax,2
  1178.     jbe    NoNewSample
  1179.     mov    [di.LoopOnOff],8
  1180.     mov    ax,[di.Repeat]
  1181.     add    ax,[di.RepLen]
  1182.     cmp    ax,[di.Len]
  1183.     ja    NoNewSample
  1184.     mov    [di.Len],ax
  1185. NoNewSample:
  1186.  
  1187.     mov    bx,es:[si]
  1188.     xchg    bh,bl
  1189.     and    bx,0FFFh
  1190.     je    NoNewNote
  1191.     
  1192.     mov    bl,[ArpTable+bx]
  1193.     mov    bh,0
  1194.     add    bx,[di.Fine]
  1195.     mov    bx,[AmigaVals+bx]
  1196.     mov    [di.PortTo],bx
  1197.     mov    ax,es:[si+2]
  1198.     and    al,0Fh
  1199.     and    ah,0F0h
  1200.     cmp    al,03h
  1201.     je    PortToP
  1202.     cmp    al,05h
  1203.     je    PortToP
  1204.     jmp    NoPortToP
  1205. PortToP:
  1206.     push    cx
  1207.     neg    cx
  1208.     add    cx,[NumChans]
  1209.     mov    ax,1
  1210.     shl    ax,cl
  1211.     test    ax,[ChanOn]
  1212.     je    NoSetPortBar
  1213.     mov    ax,[di.Vol]
  1214.     mov    [di.Bar],ax
  1215. NoSetPortBar:
  1216.     pop    cx
  1217.     jmp    NoNewNote
  1218. NoPortToP:
  1219.     cmp    ax,0D00Eh
  1220.     jne    NewNote
  1221.     mov    al,es:[si+2]
  1222.     cmp    al,0
  1223.     je    NewNote
  1224.     mov    [di.InstSet],0
  1225.     jmp    NoNewNote
  1226. NewNote:
  1227.     mov    [di.InstSet],2
  1228.     mov    [di.VibratoPek],0
  1229.     mov    [di.Amiga],bx
  1230.     shl    bx,1
  1231.     mov    bx,[FreqTable+bx]
  1232.     mov    [di.FreqVal],bx
  1233. NoNewNote:
  1234.  
  1235.     mov    [di.ArpCounter],0
  1236.     mov    ax,es:[si+2]
  1237.     and    al,0Fh
  1238.     mov    [di.Effect],ax
  1239.     cmp    al,7
  1240.     jb    NoSetOldFreq
  1241.     mov    bx,ax
  1242.     and    bh,0F0h
  1243.     cmp    bx,0C00Eh
  1244.     je    NoSetOldFreq
  1245.     cmp    bx,0D00Eh
  1246.     je    NoSetOldFreq
  1247.     mov    bx,[di.Amiga]
  1248.     shl    bx,1
  1249.     mov    bx,[FreqTable+bx]
  1250.     mov    [di.FreqVal],bx
  1251. NoSetOldFreq:
  1252.     mov    bh,0
  1253.     mov    bl,al
  1254.     cmp    bl,0Eh
  1255.     je    DoEPattEffects
  1256.     shl    bx,1
  1257.     jmp    [PattJumps+bx]
  1258. DoEPattEffects:
  1259.     mov    bl,ah
  1260.     and    ah,0Fh
  1261.     shr    bl,4
  1262.     shl    bx,1
  1263.     jmp    [EPattJumps+bx]
  1264. ArpeggioFix:
  1265.     mov    bx,[di.Amiga]
  1266.     mov    bl,[ArpTable+bx]
  1267.     mov    bh,0
  1268.     mov    bp,bx
  1269.     add    bx,[di.Fine]
  1270.     mov    dx,[AmigaVals+bx]
  1271.     mov    [di.Arp],dx
  1272.     xchg    ah,al
  1273.     mov    ah,0
  1274.     mov    dx,ax
  1275.     shr    dx,4
  1276.     and    ax,0Fh
  1277.     shl    dx,1
  1278.     shl    ax,1
  1279.     mov    bx,bp
  1280.     add    bx,dx
  1281.     cmp    bx,70
  1282.     jbe    NoWrapArp1
  1283.     mov    bx,70
  1284. NoWrapArp1:
  1285.     add    bx,[di.Fine]
  1286.     mov    dx,[AmigaVals+bx]
  1287.     mov    [di.Arp+2],dx
  1288.     mov    bx,bp
  1289.     add    bx,ax
  1290.     cmp    bx,70
  1291.     jbe    NoWrapArp2
  1292.     mov    bx,70
  1293. NoWrapArp2:
  1294.     add    bx,[di.Fine]
  1295.     mov    dx,[AmigaVals+bx]
  1296.     mov    [di.Arp+4],dx
  1297.     jmp    NoPattEffect
  1298. PortToFix:
  1299.     cmp    ah,0
  1300.     jne    NoPortPekFix
  1301.     mov    ah,Byte Ptr [di.OldPortTo]
  1302. NoPortPekFix:
  1303.     mov    Byte Ptr [di.OldPortTo],ah
  1304.     mov    Byte Ptr [di.Effect+1],ah
  1305.     jmp    NoPattEffect
  1306. VibratoFix:
  1307.     mov    al,ah
  1308.     and    al,0Fh
  1309.     and    ah,0F0h
  1310.     cmp    al,0
  1311.     jne    NoVibratoFix1
  1312.     mov    al,Byte Ptr [di.OldVibrato]
  1313. NoVibratoFix1:
  1314.     cmp    ah,0
  1315.     jne    NoVibratoFix2
  1316.     mov    ah,Byte Ptr [di.OldVibrato+1]
  1317. NoVibratoFix2:
  1318.     mov    Byte Ptr [di.OldVibrato],al
  1319.     mov    Byte Ptr [di.OldVibrato+1],ah
  1320.     or    al,ah
  1321.     mov    Byte Ptr [di.Effect+1],al
  1322.     jmp    NoPattEffect
  1323. SampleOff:
  1324.     mov    al,0
  1325.     cmp    ax,[di.Len]
  1326.     jb    NoFixOffset
  1327.     mov    ax,[di.Len]
  1328.     dec    ax
  1329. NoFixOffset:
  1330.     mov    [di.OffsetAdd],ax
  1331.     jmp    NoPattEffect
  1332. PosJump:
  1333.     mov    [PatternRow],63
  1334.     mov    Byte Ptr [PlayingPattern],ah
  1335.     jmp    NoPattEffect
  1336. Volume:
  1337.     cmp    ah,40h
  1338.     jb    NoFixVol1
  1339.     mov    ah,3Fh
  1340. NoFixVol1:
  1341.     mov    Byte Ptr [di.Vol],ah
  1342.     jmp    NoPattEffect
  1343. BreakPatt:
  1344.     mov    [PatternRow],63
  1345.     cmp    ah,64h
  1346.     jb    NoFixBreak
  1347.     mov    ah,63h
  1348. NoFixBreak:
  1349.     mov    al,ah
  1350.     and    al,0Fh
  1351.     shr    ah,4
  1352.     shl    ah,1
  1353.     mov    Byte Ptr [BreakData],al
  1354.     add    Byte Ptr [BreakData],ah
  1355.     shl    ah,2
  1356.     add    Byte Ptr [BreakData],ah
  1357.     jmp    NoPattEffect
  1358. SpeedSet:
  1359.     cmp    ah,0
  1360.     je    NoPattEffect
  1361.     cmp    ah,1Fh
  1362.     jbe    UsualSpeed
  1363.  
  1364.     xchg    ah,al
  1365.     mov    ah,0
  1366.     shl    ax,1            ;
  1367.     mov    bl,5            ; Denna bit är för att ställa
  1368.     div    bl            ; Effects till annat än 50Hz
  1369.     mov    dl,al            ; Detta ger automatiskt en annan
  1370.     mov    dh,0            ; patternspeed.; Hz=2*BPM/5
  1371.     mov    ax,0
  1372.     mov    bx,1000
  1373.     div    bx
  1374.     mov    Word Ptr cs:[Speed],ax
  1375.     mov    ax,0
  1376.     div    bx
  1377.     mov    Word Ptr cs:[Speed+2],ax
  1378.     jmp    NoPattEffect
  1379. UsualSpeed:
  1380.     mov    Byte Ptr [PatternSpeed],ah
  1381.     mov    Byte Ptr [PatternCount],ah
  1382.     jmp    NoPattEffect
  1383. FinePortUp:
  1384.     xchg    ah,al
  1385.     mov    ah,0
  1386.     sub    [di.Amiga],ax
  1387.     mov    bx,[di.Fine]
  1388.     mov    bx,[AmigaVals+35*2+bx]
  1389.     cmp    [di.Amiga],bx
  1390.     jae    NoFixFineUp
  1391.     mov    [di.Amiga],bx
  1392. NoFixFineUp:
  1393.     jmp    NoPattEffect
  1394. FinePortDown:
  1395.     xchg    ah,al
  1396.     mov    ah,0
  1397.     add    [di.Amiga],ax
  1398.     mov    bx,[di.Fine]
  1399.     mov    bx,[AmigaVals+bx]
  1400.     cmp    [di.Amiga],bx
  1401.     jbe    NoFixFineDown
  1402.     mov    [di.Amiga],bx
  1403. NoFixFineDown:
  1404.     jmp    NoPattEffect
  1405. FineVolUp:
  1406.     add    Byte Ptr [di.Vol],ah
  1407.     cmp    Byte Ptr [di.Vol],3Fh
  1408.     jbe    NoFixFineVolUp
  1409.     mov    Byte Ptr [di.Vol],3Fh
  1410. NoFixFineVolUp:
  1411.     jmp    NoPattEffect
  1412. FineVolDown:
  1413.     sub    Byte Ptr [di.Vol],ah
  1414.     jnc    NoFixFineVolDown
  1415.     mov    Byte Ptr [di.Vol],0
  1416. NoFixFineVolDown:
  1417.     jmp    NoPattEffect
  1418. NoPattEffect:
  1419.  
  1420.     add    si,4
  1421.     jnc    NoChangeSeg1
  1422.     mov    dx,es
  1423.     add    dx,1000h
  1424.     mov    es,dx
  1425. NoChangeSeg1:
  1426.     mov    [di.EffectTime],0
  1427.     add    di,ChanSize
  1428.     dec    cx
  1429.     jz    EndChannels
  1430.     jmp    PattLoop
  1431. EndChannels:
  1432.  
  1433. ;{timing}
  1434.     mov    [timing],0
  1435.     mov    di,offset [SampChans]
  1436.     mov    ax,[di.currsamp]
  1437.     cmp    ax,0fh
  1438.     je    timi2
  1439.     cmp    ax,11h
  1440.     jne    timi1
  1441. timi2:    cmp    word ptr [di.smp],0
  1442.     jz    timi1
  1443.     cmp    word ptr [di.vol],3fh
  1444.     jne    timi1
  1445.     mov    [timing],1
  1446. timi1:    
  1447.  
  1448.     inc    [PatternRow]
  1449.     mov    ax,[NumChans]
  1450.     shl    ax,2
  1451.     add    [BytePattern],ax
  1452.     jnc    EndPattern
  1453.     add    [SegPattern],1000h
  1454. EndPattern:
  1455.  
  1456.     dec    [JumpOldTimer]
  1457.     jnz    NoJumpOld
  1458.     mov    [JumpOldTimer],55
  1459.     pop    es
  1460.     pop    ds
  1461.     popa
  1462.     jmp    DWord Ptr cs:[OldTimer]
  1463. NoJumpOld:
  1464.     pop    es
  1465.     pop    ds
  1466.     popa
  1467.     iret
  1468.  
  1469. Pattern        EndP
  1470.  
  1471. PattJumps    dw offset cs:[ArpeggioFix]    ; 0
  1472.         dw offset cs:[NoPattEffect]    ; 1
  1473.         dw offset cs:[NoPattEffect]    ; 2
  1474.         dw offset cs:[PortToFix]    ; 3
  1475.         dw offset cs:[VibratoFix]    ; 4
  1476.         dw offset cs:[NoPattEffect]    ; 5
  1477.         dw offset cs:[NoPattEffect]    ; 6
  1478.         dw offset cs:[NoPattEffect]    ; 7
  1479.         dw offset cs:[NoPattEffect]    ; 8
  1480.         dw offset cs:[SampleOff]    ; 9
  1481.         dw offset cs:[NoPattEffect]    ; A
  1482.         dw offset cs:[PosJump]        ; B
  1483.         dw offset cs:[Volume]        ; C
  1484.         dw offset cs:[BreakPatt]    ; D
  1485.         dw offset cs:[NoPattEffect]    ; E
  1486.         dw offset cs:[SpeedSet]        ; F
  1487.  
  1488. EPattJumps    dw offset cs:[NoPattEffect]    ; 0
  1489.         dw offset cs:[FinePortUp]    ; 1
  1490.         dw offset cs:[FinePortDown]    ; 2
  1491.         dw offset cs:[NoPattEffect]    ; 3
  1492.         dw offset cs:[NoPattEffect]    ; 4
  1493.         dw offset cs:[NoPattEffect]    ; 5
  1494.         dw offset cs:[NoPattEffect]    ; 6
  1495.         dw offset cs:[NoPattEffect]    ; 7
  1496.         dw offset cs:[NoPattEffect]    ; 8
  1497.         dw offset cs:[NoPattEffect]    ; 9
  1498.         dw offset cs:[FineVolUp]    ; A
  1499.         dw offset cs:[FineVolDown]    ; B
  1500.         dw offset cs:[NoPattEffect]    ; C
  1501.         dw offset cs:[NoPattEffect]    ; D
  1502.         dw offset cs:[NoPattEffect]    ; E
  1503.         dw offset cs:[NoPattEffect]    ; F
  1504.  
  1505. EffectJumps    dw offset cs:[Arpeggio]        ; 0
  1506.         dw offset cs:[PortUp]        ; 1
  1507.         dw offset cs:[PortDown]        ; 2
  1508.         dw offset cs:[PortToTone]    ; 3
  1509.         dw offset cs:[Vibrato]        ; 4
  1510.         dw offset cs:[PortToVSlide]    ; 5
  1511.         dw offset cs:[VibratoVSlide]    ; 6
  1512.         dw offset cs:[NoEffect]        ; 7
  1513.         dw offset cs:[NoEffect]        ; 8
  1514.         dw offset cs:[NoEffect]        ; 9
  1515.         dw offset cs:[VolSlide]        ; A
  1516.         dw offset cs:[NoEffect]        ; B
  1517.         dw offset cs:[NoEffect]        ; C
  1518.         dw offset cs:[NoEffect]        ; D
  1519.         dw offset cs:[NoEffect]        ; E
  1520.         dw offset cs:[NoEffect]        ; F
  1521.  
  1522. EEffectJumps    dw offset cs:[NoEffect]        ; 0
  1523.         dw offset cs:[NoEffect]        ; 1
  1524.         dw offset cs:[NoEffect]        ; 2
  1525.         dw offset cs:[NoEffect]        ; 3
  1526.         dw offset cs:[NoEffect]        ; 4
  1527.         dw offset cs:[NoEffect]        ; 5
  1528.         dw offset cs:[NoEffect]        ; 6
  1529.         dw offset cs:[NoEffect]        ; 7
  1530.         dw offset cs:[NoEffect]        ; 8
  1531.         dw offset cs:[RetrigNote]    ; 9
  1532.         dw offset cs:[NoEffect]        ; A
  1533.         dw offset cs:[NoEffect]        ; B
  1534.         dw offset cs:[CutNote]        ; C
  1535.         dw offset cs:[DelayNote]    ; D
  1536.         dw offset cs:[NoEffect]        ; E
  1537.         dw offset cs:[NoEffect]        ; F
  1538.  
  1539.     assume    ds:nothing
  1540.  
  1541. StartPlaying    Proc    Far
  1542.  
  1543.     pusha
  1544.     push    ds
  1545.     push    es
  1546.  
  1547.     cli
  1548.  
  1549.     mov    [JumpOldTimer],55
  1550.     mov    di,offset cs:[SampChans]
  1551.     mov    cx,cs:[NumChans]
  1552. ClearVarLoop:
  1553.     mov    cs:[di.FreqVal],0
  1554.     mov    cs:[di.Vol],0
  1555.     add    di,ChanSize
  1556.     loop    ClearVarLoop
  1557.  
  1558.     mov    ax,0
  1559.     mov    es,ax
  1560.  
  1561.     mov    bx,es:[20h]
  1562.     mov    ax,es:[22h]
  1563.     mov    Word Ptr cs:[OldTimer],bx
  1564.     mov    Word Ptr cs:[OldTimer+2],ax
  1565.  
  1566.     push    cs
  1567.     pop    ds
  1568.     mov    dx,offset cs:[Pattern]
  1569.  
  1570.     mov    es:[20h],dx
  1571.     mov    es:[22h],ds
  1572.  
  1573.     mov    al,36h
  1574.     out    43h,al
  1575.     mov    al,169
  1576.     out    40h,al
  1577.     mov    al,4
  1578.     out    40h,al
  1579.  
  1580.     mov    ax,0
  1581.     mov    dx,50
  1582.     mov    bx,1000
  1583.     div    bx
  1584.     mov    Word Ptr cs:[Speed],ax
  1585.     mov    ax,0
  1586.     div    bx
  1587.     mov    Word Ptr cs:[Speed+2],ax
  1588.     mov    Word Ptr cs:[SpeedAdd],0
  1589.     mov    Word Ptr cs:[SpeedAdd+2],0
  1590.     mov    [Counter],20
  1591.     mov    Word Ptr [Time],0
  1592.     mov    Word Ptr [Time+2],0
  1593.  
  1594.     mov    dx,cs:[BasePort]    ; Speaker On!!!
  1595.     mov    al,00000001b
  1596.     out    dx,al
  1597.  
  1598.     sti
  1599.  
  1600.     pop    es
  1601.     pop    ds
  1602.     popa
  1603.     ret
  1604.  
  1605. StartPlaying    EndP
  1606.  
  1607. StopPlaying    Proc    Far
  1608.  
  1609.     pusha
  1610.     push    ds
  1611.     push    es
  1612.  
  1613.     cli
  1614.  
  1615.     mov    dx,cs:[BasePort]    ; Speaker Off!!!
  1616.     mov    al,00000011b
  1617.     out    dx,al
  1618.  
  1619.     mov    ax,0
  1620.     mov    es,ax
  1621.  
  1622.     mov    al,36h
  1623.     out    43h,al
  1624.     mov    al,0
  1625.     out    40h,al
  1626.     mov    al,0
  1627.     out    40h,al
  1628.  
  1629.     mov    dx,Word Ptr cs:[OldTimer]
  1630.     mov    ds,Word Ptr cs:[OldTimer+2]
  1631.     mov    es:[20h],dx
  1632.     mov    es:[22h],ds
  1633.     sti
  1634.  
  1635.     mov    dx,cs:[BasePort]
  1636.     add    dx,ActiveVoicePort
  1637.     mov    cx,NumVoices
  1638. VoiceClearL:
  1639.     mov    al,cl
  1640.     dec    al
  1641.     out    dx,al
  1642.     inc    dx
  1643.     mov    al,0
  1644.     out    dx,al
  1645.     add    dx,2
  1646.     mov    al,3    ; Voice Off
  1647.     out    dx,al
  1648.     sub    dx,2
  1649.     mov    al,0Dh
  1650.     out    dx,al
  1651.     add    dx,2
  1652.     mov    al,3    ; Ramp Off
  1653.     out    dx,al
  1654.     sub    dx,3
  1655.     loop    VoiceClearL
  1656.  
  1657.     pop    es
  1658.     pop    ds
  1659.     popa
  1660.     ret
  1661.  
  1662. StopPlaying    EndP
  1663.  
  1664. Init        Proc    Far
  1665.  
  1666.     pusha
  1667.     push    ds
  1668.     push    es
  1669.     mov    cs:[PatternRow],64
  1670.     mov    cs:[PlayingPattern],0
  1671.     mov    cs:[PatternSpeed],6
  1672.     mov    cs:[PatternCount],1
  1673.     pop    es
  1674.     pop    ds
  1675.     popa
  1676.     mov    ax,cs
  1677.     ret
  1678.  
  1679. Init        EndP
  1680.  
  1681. InitDevice    Proc    Far
  1682.  
  1683.     pusha
  1684.     push    es
  1685.     push    ds
  1686.  
  1687.     mov    si,108*2
  1688.     mov    bp,108
  1689.     mov    cx,908-108+1
  1690. CountLoop:
  1691.     mov    dx,36h
  1692.     mov    ax,9DE4h
  1693.     div    bp
  1694.     mov    dx,100
  1695.     mul    dx
  1696.     mov    bx,Voices20
  1697.     div    bx
  1698.     shr    bx,1
  1699.     adc    bx,0
  1700.     cmp    dx,bx
  1701.     jb    NoHigherFreq
  1702.     inc    ax
  1703. NoHigherFreq:
  1704.     mov    Word Ptr cs:[FreqTable+si],ax
  1705.     inc    bp
  1706.     add    si,2
  1707.     loop    CountLoop
  1708.  
  1709. ;    Init the UltraSound
  1710.  
  1711.     mov    bx,cs:[BasePort]
  1712.     mov    cx,bx
  1713.     add    bx,CommandPort
  1714.     add    cx,DataHighPort
  1715.     mov    dx,bx
  1716.     mov    al,Initialize
  1717.     out    dx,al
  1718.     mov    dx,cx
  1719.     mov    al,0
  1720.     out    dx,al
  1721.     mov    dx,cs:[BasePort]
  1722.     Rept    6
  1723.     in    al,dx
  1724.     EndM
  1725.     mov    dx,bx
  1726.     mov    al,4Ch
  1727.     out    dx,al
  1728.     mov    dx,cx
  1729.     mov    al,1
  1730.     out    dx,al
  1731.     mov    dx,cs:[BasePort]
  1732.     Rept    6
  1733.     in    al,dx
  1734.     EndM
  1735.  
  1736.     mov    dx,bx
  1737.     mov    al,DMACtrl
  1738.     out    dx,al
  1739.     mov    dx,cx
  1740.     mov    al,0
  1741.     out    dx,al
  1742.     mov    dx,bx
  1743.     mov    al,45h
  1744.     out    dx,al
  1745.     mov    dx,cx
  1746.     mov    al,0
  1747.     out    dx,al
  1748.     mov    dx,bx
  1749.     mov    al,49h
  1750.     out    dx,al
  1751.     mov    dx,cx
  1752.     mov    al,0
  1753.     out    dx,al
  1754.  
  1755.     mov    dx,bx
  1756.     mov    al,VoicesActive
  1757.     out    dx,al
  1758.     mov    dx,cx
  1759.     mov    al,NumVoices
  1760.     dec    al
  1761.     or    al,0C0h
  1762.     out    dx,al
  1763.  
  1764.     mov    dx,cs:[BasePort]
  1765.     add    dx,StatusPort
  1766.     in    al,dx
  1767.     mov    dx,bx
  1768.     mov    al,DMACtrl
  1769.     out    dx,al
  1770.     mov    dx,cx
  1771.     in    al,dx
  1772.     mov    dx,bx
  1773.     mov    al,49h
  1774.     out    dx,al
  1775.     mov    dx,cx
  1776.     in    al,dx
  1777.     mov    dx,bx
  1778.     mov    al,8Fh
  1779.     out    dx,al
  1780.     mov    dx,cx
  1781.     in    al,dx
  1782.  
  1783.     push    cx
  1784.     mov    cx,32
  1785. VoiceClearLoop:
  1786.     mov    dx,cs:[BasePort]
  1787.     add    dx,ActiveVoicePort
  1788.     mov    al,cl
  1789.     dec    al
  1790.     out    dx,al
  1791.     inc    dx
  1792.     mov    al,0
  1793.     out    dx,al
  1794.     add    dx,2
  1795.     mov    al,3    ; Voice Off
  1796.     out    dx,al
  1797.     sub    dx,2
  1798.     mov    al,0Dh
  1799.     out    dx,al
  1800.     add    dx,2
  1801.     mov    al,3    ; Ramp Off
  1802.     out    dx,al
  1803.     loop    VoiceClearLoop
  1804.     pop    cx
  1805.  
  1806.     mov    dx,bx
  1807.     mov    al,DMACtrl
  1808.     out    dx,al
  1809.     mov    dx,cx
  1810.     in    al,dx
  1811.     mov    dx,bx
  1812.     mov    al,49h
  1813.     out    dx,al
  1814.     mov    dx,cx
  1815.     in    al,dx
  1816.     mov    dx,bx
  1817.     mov    al,8Fh
  1818.     out    dx,al
  1819.     mov    dx,cx
  1820.     in    al,dx
  1821.  
  1822.     mov    dx,bx
  1823.     mov    al,Initialize
  1824.     out    dx,al
  1825.     mov    dx,cx
  1826.     mov    al,7
  1827.     out    dx,al
  1828.  
  1829.     mov    cx,NumVoices
  1830. SetRampRateLoop:
  1831.     mov    dx,cs:[BasePort]
  1832.     add    dx,ActiveVoicePort
  1833.     mov    al,NumVoices
  1834.     sub    al,cl
  1835.     out    dx,al
  1836.  
  1837.     mov    dx,cs:[BasePort]
  1838.     add    dx,CommandPort
  1839.     mov    al,VolRampRate
  1840.     out    dx,al
  1841.     mov    al,00111111b
  1842.     mov    dx,cs:[BasePort]
  1843.     add    dx,DataHighPort
  1844.     out    dx,al
  1845.  
  1846.     mov    dx,cs:[BasePort]
  1847.     add    dx,CommandPort
  1848.     mov    al,SetVolume
  1849.     out    dx,al
  1850.     mov    ax,cs:[GusVol]
  1851.     mov    dx,cs:[BasePort]
  1852.     add    dx,DataLowPort
  1853.     out    dx,ax
  1854.     loop    SetRampRateLoop
  1855.  
  1856. ;    Finished Initialize (Pheewww!!!!!!!!!!!!!)
  1857.  
  1858.     pop    es
  1859.     pop    ds
  1860.     popa
  1861.     ret
  1862.  
  1863. InitDevice    EndP
  1864.  
  1865. ClearMem    Proc    Far
  1866.  
  1867.     pusha
  1868.     push    es
  1869.     mov    es,cs:[PatternMem]
  1870.     call    DeAlloc
  1871.     pop    es
  1872.     popa
  1873.     ret
  1874.  
  1875. ClearMem    EndP
  1876.  
  1877. LoadMod        Proc    Far
  1878. ; Error if CF set! ax=errorcode.
  1879. ; ax=1, File or path not found.
  1880. ; ax=2, Error loading file.
  1881. ; ax=3, Out of memory.
  1882.  
  1883.     call    FileOpen
  1884.     jnc    NoOpenError
  1885.     mov    ax,[ErrorCode]
  1886.     jmp    NoMod
  1887. NoOpenError:
  1888.     call    ModLoad
  1889.     jnc    NoLoadError
  1890.     mov    ax,[ErrorCode]
  1891.     jmp    NoMod
  1892. NoLoadError:
  1893.     call    FileClose
  1894. NoMod:
  1895.     ret
  1896.  
  1897. LoadMod        EndP
  1898.  
  1899. ModLoad        Proc    Near
  1900.  
  1901.     pusha
  1902.     push    ds
  1903.     push    es
  1904.  
  1905.         mov     cs:[MainVolume],64
  1906.     mov    cx,1084
  1907.     mov    dx,offset cs:[Info]
  1908.     push    cs
  1909.     pop    ds
  1910.     call    FileRead
  1911.     mov    cs:[NumChans],4
  1912.     mov    bp,offset cs:[Info+1080]
  1913.     mov    bx,0
  1914.     mov    cx,4
  1915. TestInst1:
  1916.     mov    al,cs:[bp]
  1917.     cmp    al,cs:[MKSign+bx]
  1918.     jne    NoMK1
  1919.     inc    bp
  1920.     inc    bx
  1921.     loop    TestInst1
  1922.     mov    si,offset cs:[Info+952]
  1923.     mov    cs:[MKMod],1
  1924.     jmp    Load
  1925. NoMK1:
  1926.     mov    bp,offset cs:[Info+1080]
  1927.     mov    bx,4
  1928.     mov    cx,4
  1929. TestInst2:
  1930.     mov    al,cs:[bp]
  1931.     cmp    al,cs:[MKSign+bx]
  1932.     jne    NoMK2
  1933.     inc    bp
  1934.     inc    bx
  1935.     loop    TestInst2
  1936.     mov    si,offset cs:[Info+952]
  1937.     mov    cs:[MKMod],1
  1938.     jmp    Load
  1939. NoMK2:
  1940.     mov    bp,offset cs:[Info+1080]
  1941.     mov    bx,8
  1942.     mov    cx,4
  1943. TestInst3:
  1944.     mov    al,cs:[bp]
  1945.     cmp    al,cs:[MKSign+bx]
  1946.     jne    No6CHN2
  1947.     inc    bp
  1948.     inc    bx
  1949.     loop    TestInst3
  1950.     mov    cs:[MainVolume],48
  1951.     mov    cs:[NumChans],6
  1952.     mov    si,offset cs:[Info+952]
  1953.     mov    cs:[MKMod],1
  1954.     jmp    Load
  1955. No6CHN2:
  1956.     mov    bp,offset cs:[Info+1080]
  1957.     mov    bx,12
  1958.     mov    cx,4
  1959. TestInst4:
  1960.     mov    al,cs:[bp]
  1961.     cmp    al,cs:[MKSign+bx]
  1962.     jne    No8CHN3
  1963.     inc    bp
  1964.     inc    bx
  1965.     loop    TestInst4
  1966.         mov     cs:[MainVolume],64
  1967.     mov    cs:[NumChans],8
  1968.     mov    si,offset cs:[Info+952]
  1969.     mov    cs:[MKMod],1
  1970.     jmp    Load
  1971. No8CHN3:
  1972.     mov    bp,offset cs:[Info+1080]
  1973.     mov    bx,16
  1974.     mov    cx,4
  1975. TestInst5:
  1976.     mov    al,cs:[bp]
  1977.     cmp    al,cs:[MKSign+bx]
  1978.     jne    STMod
  1979.     inc    bp
  1980.     inc    bx
  1981.     loop    TestInst5
  1982.         mov     cs:[MainVolume],64
  1983.     mov    cs:[NumChans],8
  1984.     mov    si,offset cs:[Info+952]
  1985.     mov    cs:[MKMod],1
  1986.     jmp    Load
  1987. STMod:
  1988.     call    MovePoint
  1989.     mov    dx,offset cs:[Info]
  1990.     mov    cx,600
  1991.     call    FileRead
  1992.     mov    si,offset cs:[Info+472]
  1993.     mov    cs:[MKMod],0
  1994.  
  1995. Load:
  1996.     mov    ax,cs:[si-2]
  1997.     mov    Word Ptr cs:[OrderLen],ax
  1998.     mov    di,offset cs:[PatternOrder]
  1999.     mov    cx,128
  2000. CopyOrder:
  2001.     mov    al,cs:[si]
  2002.     mov    cs:[di],al
  2003.     inc    si
  2004.     inc    di
  2005.     loop    CopyOrder
  2006.     mov    si,offset cs:[PatternOrder]
  2007.     mov    cx,128
  2008.     mov    ax,0
  2009. CheckPatt:
  2010.     mov    al,cs:[si]
  2011.     cmp    al,ah
  2012.     jb    NoHigh
  2013.     xchg    ah,al
  2014. NoHigh:
  2015.     inc    si
  2016.     loop    CheckPatt
  2017.     inc    ah
  2018.     xor    al,al
  2019.     mov    bx,cs:[NumChans]
  2020.     mul    bx
  2021.     mov    si,dx
  2022.     mov    di,ax
  2023.     mov    bx,16
  2024.     div    bx
  2025.     mov    bx,ax
  2026.     call    Alloc
  2027.     jnc    NoOutHunk
  2028.     stc
  2029.     mov    cs:[ErrorCode],3
  2030.     jmp    ErrorLoad        ; Fixa nån slags error-flagga.
  2031. NoOutHunk:
  2032.     mov    cs:[PatternMem],ax
  2033.     mov    ds,ax
  2034.  
  2035. LoadLoop:
  2036.     dec    si
  2037.     js    EndBigLoad
  2038.     mov    dx,0
  2039.     mov    cx,65535
  2040.     call    FileRead
  2041.     mov    dx,65535
  2042.     mov    cx,1
  2043.     call    FileRead
  2044.     mov    dx,ds
  2045.     add    dx,1000h
  2046.     mov    ds,dx
  2047.     jmp    Short LoadLoop
  2048. EndBigLoad:
  2049.     mov    cx,di
  2050.     mov    dx,0
  2051.     call    FileRead
  2052.  
  2053.     mov    cx,15
  2054.     cmp    cs:[MKMod],1
  2055.     jne    NoMK
  2056.     mov    cx,31
  2057. NoMK:
  2058.     mov    bx,4096
  2059.     call    Alloc
  2060.     mov    cs:[SampMem],ax
  2061.     mov    Word Ptr cs:[GUSMem],0
  2062.     mov    Word Ptr cs:[GUSMem+2],0
  2063.     mov    si,offset cs:[Info+42]
  2064.     mov    bp,0
  2065. LoadIns:
  2066.     push    cx
  2067.     mov    Word Ptr cs:[SampLen+bp],0
  2068.     mov    cx,cs:[si]
  2069.     add    si,2
  2070.     xchg    ch,cl
  2071.     cmp    cx,2
  2072.     jbe    NoIns
  2073.     shl    cx,1
  2074.     mov    cs:[SampLen+bp],cx
  2075.     mov    ds,cs:[SampMem]
  2076.     mov    dx,0
  2077.     call    FileRead
  2078.  
  2079. ;    Lets move the sample to the UltaraSound!
  2080.  
  2081.     push    bp
  2082.     mov    cx,cs:[SampLen+bp]
  2083.     shl    bp,1
  2084.     mov    di,Word Ptr cs:[GUSMem]
  2085.     mov    bl,Byte Ptr cs:[GUSMem+2]
  2086.     mov    Word Ptr [SampOffset+bp],di
  2087.     mov    Byte Ptr [SampOffset+bp+2],bl
  2088.     mov    bp,di
  2089.     mov    di,0
  2090.     mov    dx,cs:[BasePort]
  2091.     add    dx,CommandPort
  2092. MSamp2GUS:
  2093.     mov    al,DRAMAddrLo
  2094.     out    dx,al
  2095.     inc    dx
  2096.     mov    ax,bp
  2097.     out    dx,ax
  2098.     dec    dx
  2099.     mov    al,DRAMAddrHi
  2100.     out    dx,al
  2101.     add    dx,2
  2102.     mov    al,bl
  2103.     out    dx,al
  2104.     add    dx,2
  2105.     mov    al,[di]
  2106.     out    dx,al
  2107.     sub    dx,4
  2108.     inc    di
  2109.     add    bp,1
  2110.     adc    bl,0
  2111.     loop    MSamp2GUS
  2112.     dec    di
  2113.     mov    al,DRAMAddrLo
  2114.     out    dx,al
  2115.     inc    dx
  2116.     mov    ax,bp
  2117.     out    dx,ax
  2118.     dec    dx
  2119.     mov    al,DRAMAddrHi
  2120.     out    dx,al
  2121.     add    dx,2
  2122.     mov    al,bl
  2123.     out    dx,al
  2124.     add    dx,2
  2125.     mov    al,[di]
  2126.     out    dx,al
  2127.     sub    dx,4
  2128.     add    bp,1
  2129.     adc    bl,0
  2130.     mov     Word Ptr cs:[GUSMem],bp
  2131.     mov    Byte Ptr cs:[GUSMem+2],bl
  2132.     pop    bp
  2133.  
  2134. NoIns:
  2135.     mov    ah,0
  2136.     mov    al,cs:[si]
  2137.     inc    si
  2138.     mov    cs:[SampFine+bp],ax
  2139.     mov    al,cs:[si]
  2140.     inc    si
  2141.     mov    Byte Ptr cs:[SampVol+bp],al
  2142.  
  2143.     mov    dx,cs:[SampLen+bp]
  2144.     mov    ax,cs:[si]
  2145.     add    si,2
  2146.     xchg    ah,al
  2147.     mov    cx,cs:[si]
  2148.     add    si,2
  2149.     xchg    ch,cl
  2150.     cmp    cs:[MKMod],1
  2151.     jne    STMod1
  2152.     shl    ax,1
  2153.     shl    cx,1
  2154. STMod1:
  2155.     mov    cs:[SampRepLen+bp],cx
  2156.     add    cx,ax
  2157.     cmp    cx,dx
  2158.     jbe    NoRepFix
  2159.     mov    cx,dx
  2160.     sub    cx,ax
  2161.     mov    cs:[SampRepLen+bp],cx
  2162. NoRepFix:
  2163.     mov    cs:[SampRep+bp],ax
  2164.  
  2165.     add    si,22
  2166.     add    bp,2
  2167.     pop    cx
  2168.     dec    cx
  2169.     jz    Loaded
  2170.     jmp    LoadIns
  2171. Loaded:
  2172.     mov    es,cs:[SampMem]
  2173.     call    DeAlloc
  2174.     mov    cs:[ErrorCode],0
  2175.     clc
  2176.  
  2177. ;    Set Pan Regs!!
  2178.  
  2179. ErrorLoad:
  2180.     mov    cx,cs:[NumChans]
  2181.     mov    bx,cx
  2182.     shr    bx,1
  2183.     sub    bx,2
  2184.     shl    bx,4
  2185. SetPanLoop:
  2186.     mov    dx,cs:[BasePort]
  2187.     add    dx,ActiveVoicePort
  2188.     mov    al,Byte Ptr cs:[NumChans]
  2189.     sub    al,cl
  2190.     out    dx,al
  2191.  
  2192.     mov    dx,cs:[BasePort]
  2193.     add    dx,CommandPort
  2194.     mov    al,VoiceBalance
  2195.     out    dx,al
  2196.     mov    dx,cs:[BasePort]
  2197.     add    dx,DataHighPort
  2198.     mov    al,cs:[PanRegs+bx]
  2199.     out    dx,al
  2200.     inc    bx
  2201.     loop    SetPanLoop
  2202.  
  2203.     pop    es
  2204.     pop    ds
  2205.     popa
  2206.     ret
  2207.  
  2208. ModLoad        EndP
  2209.  
  2210. Alloc        Proc    Near
  2211.  
  2212.     push    bx
  2213.     mov    ax,4800h
  2214.     int    21h
  2215.     pop    bx
  2216.     ret
  2217.  
  2218. Alloc        EndP
  2219.  
  2220. DeAlloc        Proc    Near
  2221.  
  2222.     push    ax
  2223.     push    es
  2224.     mov    ax,4900h
  2225.     int    21h
  2226.     pop    es
  2227.     pop    ax
  2228.     ret
  2229.  
  2230. DeAlloc        EndP
  2231.  
  2232. FileRead    Proc    Near
  2233.  
  2234.     push    ax
  2235.     push    bx
  2236.     push    cx
  2237.     push    dx
  2238.     push    ds
  2239.     mov    ax,3F00h
  2240.     mov    bx,cs:[FileHandle]
  2241.     int    21h
  2242.     pop    ds
  2243.     pop    dx
  2244.     pop    cx
  2245.     pop    bx
  2246.     pop    ax
  2247.     ret
  2248.  
  2249. FileRead    EndP
  2250.  
  2251. FileOpen    Proc    Near
  2252.  
  2253.     push    dx
  2254.     push    ds
  2255.     mov    ax,3D00h
  2256.     int    21h
  2257.     mov    cs:[FileHandle],ax
  2258.     jnc    NoErrorOpen
  2259.     mov    cs:[ErrorCode],1
  2260. NoErrorOpen:
  2261.     pop    ds
  2262.     pop    dx
  2263.     ret
  2264.  
  2265. FileOpen    EndP
  2266.  
  2267. FileClose    Proc    Near
  2268.  
  2269.     push    ax
  2270.     push    bx
  2271.     mov    ax,3E00h
  2272.     mov    bx,cs:[FileHandle]
  2273.     int    21h
  2274.     pop    bx
  2275.     pop    ax
  2276.     ret
  2277.  
  2278. FileClose    EndP
  2279.  
  2280. MovePoint    Proc    Near
  2281.  
  2282.     push    ax
  2283.     push    bx
  2284.     push    cx
  2285.     push    dx
  2286.     mov    ax,4200h
  2287.     mov    bx,cs:[FileHandle]
  2288.     mov    cx,0
  2289.     mov    dx,0
  2290.     int    21h
  2291.     pop    dx
  2292.     pop    cx
  2293.     pop    bx
  2294.     pop    ax
  2295.     ret
  2296.  
  2297. MovePoint    EndP
  2298.  
  2299.  
  2300. resetplayer:
  2301.                 push    cs
  2302.                 pop     es
  2303.                 lea     di,cs:SampOff
  2304.                 mov     ax,0
  2305.                 mov     cx,cs:resetcounter
  2306.                 shr     cx,1
  2307.                 repnz   stosw
  2308.                 lea     di,cs:sampoffset
  2309.                 mov     cx,434/2
  2310.                 repnz   stosw
  2311.                 lea     di,cs:chanoncount
  2312.                 mov     cx,917
  2313.                 repnz   stosw
  2314.                 lea     di,cs:bytepattern
  2315.                 mov     cx,20
  2316.                 repnz   stosw
  2317.                 retf
  2318. _Code    EndS
  2319.  
  2320.     End
  2321.