home *** CD-ROM | disk | FTP | other *** search
/ CD-X 3 / cdx_03.iso / democomp / demo / _2complx.arj / 2CLX-SRC.ZIP / INC / S3MPLAY.ASM < prev    next >
Encoding:
Assembly Source File  |  1995-08-28  |  56.3 KB  |  2,243 lines

  1. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  2. ;
  3. ; 32CHN S3M PLAYER FOR GUS V3.94 - BY CYBERDANCER [SHOCK!]
  4. ;
  5. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  6. ;
  7. ;        SUPPORTED S3M COMMANDS: [26]
  8. ;
  9. ;        A  - SPEED
  10. ;        B  - JUMP
  11. ;        C  - BREAK PATTERN
  12. ;        D  - VOLUME SLiDE
  13. ;        DF - FINE VOLUME SLIDE
  14. ;        E  - PORTAMENTO DOWN
  15. ;        EF - FINE PORTA DOWN
  16. ;        EE - EXTRA FINE PORTA DOWN
  17. ;        F  - PORTAMENTO UP
  18. ;        FF - FINE PORTA UP
  19. ;        FE - EXTRA FINE PORTA UP
  20. ;        G  - TONE PORTAMENTO                       
  21. ;        H  - ViBRATO
  22. ;        J  - ARPEGGIO
  23. ;        K  - ViBRATO WiTH VOLUME SLiDE
  24. ;        L  - TONE PORTAMENTO WiTH VOLUME SLiDE
  25. ;        O  - SAMPLE OFFSET
  26. ;        Q  - RETRIGGER NOTE
  27. ;        T  - TEMPO
  28. ;        V  - SET GLOBAL VOLUME
  29. ;        X  - SET DMP PAN
  30. ;        S1 - GLISSANDO CONTROL                     
  31. ;        S8 - SET PAN
  32. ;        SC - NOTE CUT
  33. ;        SD - NOTE DELAY
  34. ;        SE - PATTERN DELAY
  35. ;
  36. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  37.  
  38. PUBLiC          S3MPLAY
  39. PUBLiC          REALPATPOiNTER
  40. PUBLiC          PATTERNPOiNTER
  41. PUBLiC          ORDERPOiNTER
  42. PUBLiC          PATTERNNUM
  43. PUBLiC          SONGOFFSET
  44. PUBLiC          U_BASE
  45. PUBLIC          TEMPO
  46. PUBLIC          CURRSPEED
  47. PUBLIC          VOLL
  48. PUBLIC          NUMOFCHANNELS
  49. PUBLIC          COM1
  50. PUBLIC          OPE1
  51. PUBLIC          NOTE
  52. PUBLIC          MASTERVOLUME
  53.  
  54. CODE            SEGMENT
  55. .386
  56. ASSUME          CS:CODE
  57.  
  58. S3MPLAY:JMP     SELECTOR
  59.  
  60. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  61.  
  62. COPYRiGHT       DB 10,13,10,13,' ************************************'
  63.                 DB '******************************************',10,13
  64.                 DB ' ************** S3M/GUS PLAYER DRiVER v3.94 '
  65.                 DB 'BY CYBERDANCER/SHOCK! *************',10,13
  66.                 DB ' ********************************************'
  67.                 DB '**********************************'
  68.  
  69. REALPATPOINTER  DW 000
  70. ORDERPOiNTER    DW 000
  71. PATTERNNUM      DW 000
  72. SONGOFFSET      DW 000
  73. COUNTER         DB 000
  74. PATTERNPOiNTER  DW 000
  75.  
  76. NUMOFORDERS     EQU 20H
  77. NUMOFSAMPLES    EQU 22H
  78. NUMOFPATTERNS   EQU 24H
  79. CHANNELCODES    EQU 40H
  80. ORDERLiST       EQU 60H
  81.  
  82. SC_PAN          DB 32 DUP(0)
  83. SC_VOL          DW 16 DUP(0)
  84. SC_NOTE         DW 16 DUP(0)
  85. SC_MODE         DB 32 DUP(0)
  86. SC_START        DW 16 DUP(0)
  87. SC_START2       DW 16 DUP(0)
  88. SC_LOOPST       DW 16 DUP(0)
  89. SC_LOOPST2      DW 16 DUP(0)
  90. WAVESTART       DW 16 DUP(0)
  91. WAVESTART2      DW 16 DUP(0)
  92. REPLEN          DW 16 DUP(0)
  93. REPLEN2         DW 16 DUP(0)
  94. VOLL            DB 32 DUP(0)
  95. LASTiNST        DW 16 DUP(0)
  96. PERiOD          DW 16 DUP(0)
  97. WAVECONTROL     DB 32 DUP(0)
  98. ViBRATOPOS      DB 32 DUP(0)
  99. COM1            DB 32 DUP(0)
  100. OPE1            DB 32 DUP(0)
  101. OLDPERiOD       DW 16 DUP(0)
  102. TARGETPERiOD    DW 16 DUP(0)
  103. NOTE            DW 16 DUP(0)
  104. SAMPLEOFFSET    DB 32 DUP(0)
  105. LASTVOLSLiDE    DB 32 DUP(0)
  106. LASTPORTA       DB 32 DUP(0)
  107. ViBRATOCMD      DB 32 DUP(0)
  108. GLISSFUNK       DB 32 DUP(0)
  109. TONEPORTSPEED   DW 16 DUP(0)
  110.  
  111. FILEOFFSET      DD 000
  112. SONGNAMESEG     DW 000
  113. GUSPOS          DD 000
  114. INSSEG          DW 000
  115. PATTERNSiZE     DW 000
  116. PATTDELAYTiME   DB 000
  117. PATTDELAYTiME2  DB 000
  118. U_BASE          DW 000
  119. U_VOiCE         DW 000
  120. U_COMMAND       DW 000
  121. U_DATAHi        DW 000
  122. U_DATALO        DW 000
  123. U_STATUS        DW 000
  124. PBREAKPOSiTiON  DB 000
  125. POSJUMPASSERT   DB 000
  126. PBREAKFLAG      DB 000
  127. SAMPLEiNFOMAP   DW 000
  128. PATTERNSEGMAP   DW 000
  129. NUMOFCHANNELS   DW 000
  130. PLAYiNG         DB 000
  131. OLDiNT8         DW 0,0
  132. PROCESSCHANNEL  DW 000
  133. THiNGSTODO      DB 000
  134. GOTNOTE         DB 000
  135. SMPBEGiN        DW 000
  136. NOTEBYTE        DB 000
  137. TEMPO           DB 125
  138. TEMPODEFA       DB 125
  139. CURRSPEED       DB 006
  140. GLVOLUME        DB 063
  141. ViBFiX          DW 010
  142. MASTERVOLUME    DB 64
  143. BiGNUM          DD 2982950
  144.  
  145. ViBRATOTABLE    DB 0000,0024,0049,0074,0097,0120,0141,0161
  146.                 DB 0180,0197,0212,0224,0235,0244,0250,0253
  147.                 DB 0255,0253,0250,0244,0235,0224,0212,0197
  148.                 DB 0180,0161,0141,0120,0097,0074,0049,0024
  149.                 DB 0000,0000,0000,0000,0000,0000,0000,0000
  150. PERiODTABLE     DW 1712,1712,1712,1712,1712,1712,1712,1712
  151.                 DW 1712,1712,1712,1712,1712,1712,1712,1712
  152.                 DW 1712,1712,1712,1712,1712,1712,1712,1712
  153.                 DW 1712,1712,1712,1712,1712,1712,1712,1712
  154.                 DW 1712,1601,1518,1423,1366,1280,1200,1138
  155.                 DW 1067,1024,0960,0910,0000,0000,0000,0000
  156.                 DW 0856,0808,0762,0720,0678,0640,0604,0570
  157.                 DW 0538,0508,0480,0453,0000,0000,0000,0000
  158.                 DW 0428,0404,0381,0360,0339,0320,0302,0285
  159.                 DW 0269,0254,0240,0226,0000,0000,0000,0000
  160.                 DW 0214,0202,0190,0180,0170,0160,0151,0143
  161.                 DW 0135,0127,0120,0113,0000,0000,0000,0000
  162.                 DW 0106,0100,0095,0089,0085,0080,0075,0071
  163.                 DW 0066,0064,0060,0057,0000,0000,0000,0000
  164.                 DW 0053,0050,0047,0044,0042,0040,0038,0035
  165.                 DW 0033,0032,0030,0028,0000,0000,0000,0000
  166. PERiODTABLE2    DW 0856,0808,0762,0720,0678,0640,0604,0570
  167.                 DW 0538,0508,0480,0453,0428,0404,0381,0360
  168.                 DW 0339,0320,0302,0285,0269,0254,0240,0226
  169.                 DW 0214,0202,0190,0180,0170,0160,0151,0143
  170.                 DW 0135,0127,0120,0113,0000,0856,0808,0762
  171.                 DW 0720,0678,0640,0604,0570,0538,0508,0480
  172.                 DW 0453,0428,0404,0381,0360,0339,0320,0302
  173.                 DW 0285,0269,0254,0240,0226,0214,0202,0190
  174.                 DW 0180,0170,0160,0151,0143,0135,0127,0120
  175.                 DW 0113,0106,0100,0095,0089,0085,0080,0075
  176.                 DW 0071,0066,0064,0060,0057,0000,0000,0000
  177. MT_VOLTABLE     DW 01500H,09300h,0A900h,0B400h,0BC00h,0C180h
  178.                 DW 0C580h,0C980h,0CD80h,0CF40h,0D240h,0D440h
  179.                 DW 0D640h,0D840h,0DA40h,0DC40h,0DE40h,0DEF0h
  180.                 DW 0DFA0h,0E1A0h,0E2A0h,0E3A0h,0E4A0h,0E5A0h
  181.                 DW 0E6A0h,0E7A0h,0E8A0h,0E9A0h,0EAA0h,0EBA0h
  182.                 DW 0ECA0h,0EDA0h,0EEA0h,0EEF0h,0EFE0h,0EF60h
  183.                 DW 0F1E0h,0F160h,0F1E0h,0F260h,0F2E0h,0F360h
  184.                 DW 0F3E0h,0F460h,0F4E0h,0F560h,0F5E0h,0F660h
  185.                 DW 0F6E0h,0F760h,0F7E0h,0F860h,0F8E0h,0F960h
  186.                 DW 0F9E0h,0FA60h,0FAF0h,0FB70h,0FBF0h,0FC70h
  187.                 DW 0FCF0h,0FD70h,0FD90h,0FDB0h,0FDD0h,00000H
  188. NOTS3M          DB 'THiS iS NOT AN S3M FiLE!$'
  189.  
  190. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  191.  
  192. JUMPTABLE       DW OFFSET iNSTALL_GUS
  193.                 DW OFFSET iNSTALLMUZAK
  194.                 DW OFFSET TURNONMUZAK
  195.                 DW OFFSET TURNOFFMUZAK
  196.                 DW OFFSET CHANGEGLVOLUME
  197.                 DW OFFSET POLLMUSiC
  198.                 DW OFFSET DATAPLACE
  199.  
  200. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  201.  
  202. SELECTOR:
  203.         PUSH    AX
  204.         PUSH    BP
  205.         PUSH    Si
  206.         PUSH    Di
  207.         PUSH    DS
  208.         PUSH    ES
  209.         SHL     BX,1
  210.         CALL    CS:[BX+JUMPTABLE]
  211.         POP     ES
  212.         POP     DS
  213.         POP     Di
  214.         POP     Si
  215.         POP     BP
  216.         POP     AX
  217.         RETF
  218.  
  219. DATAPLACE:
  220.         MOV     CX,CS
  221.         LEA     DX,PATTERNPOiNTER
  222.         RET
  223.  
  224. iNSTALL_GUS:
  225.         CALL    DETECTGUS
  226.         MOV     DX,[CS:U_BASE]
  227.         ADD     DX,102H
  228.         MOV     [CS:U_VOiCE],DX
  229.         iNC     DX
  230.         MOV     [CS:U_COMMAND],DX
  231.         iNC     DX
  232.         MOV     [CS:U_DATALO],DX
  233.         iNC     DX
  234.         MOV     [CS:U_DATAHi],DX
  235.         MOV     DX,[CS:U_BASE]
  236.         ADD     DX,6
  237.         MOV     [CS:U_STATUS],DX
  238.         CALL    U_RESET
  239.         ;call    ultrareset
  240.         ;call    ultrareset0
  241.         RET
  242.  
  243. UDELAY: PUSH    DX AX
  244.         MOV     DX,300H
  245.         iN      AL,DX
  246.         iN      AL,DX
  247.         iN      AL,DX
  248.         iN      AL,DX
  249.         iN      AL,DX
  250.         iN      AL,DX
  251.         iN      AL,DX
  252.         POP     AX DX
  253.         RET
  254.  
  255. U_RESET:CLi
  256.         MOV     BX,[CS:U_COMMAND]
  257.         MOV     CX,[CS:U_DATAHi]
  258.         MOV     DX,BX
  259.         MOV     AL,4CH
  260.         OUT     DX,AL
  261.         MOV     DX,CX
  262.         MOV     AL,0
  263.         OUT     DX,AL
  264.         CALL    UDELAY
  265.         CALL    UDELAY
  266.         MOV     DX,BX
  267.         MOV     AL,4CH
  268.         OUT     DX,AL
  269.         MOV     DX,CX
  270.         MOV     AL,1
  271.         OUT     DX,AL
  272.         CALL    UDELAY
  273.         CALL    UDELAY
  274.         MOV     DX,[CS:U_VOiCE]
  275.         ADD     DX,100H
  276.         MOV     AL,3
  277.         OUT     DX,AL
  278.         CALL    UDELAY
  279.         MOV     DX,[CS:U_VOiCE]
  280.         ADD     DX,100H
  281.         MOV     AL,0
  282.         OUT     DX,AL
  283.         MOV     DX,BX
  284.         MOV     AL,41H
  285.         OUT     DX,AL
  286.         MOV     DX,CX
  287.         MOV     AL,0
  288.         OUT     DX,AL
  289.         MOV     DX,BX
  290.         MOV     AL,45H
  291.         OUT     DX,AL
  292.         MOV     DX,CX
  293.         MOV     AL,0
  294.         OUT     DX,AL
  295.         MOV     DX,BX
  296.         MOV     AL,49H
  297.         OUT     DX,AL
  298.         MOV     DX,CX
  299.         MOV     AL,0
  300.         OUT     DX,AL
  301.         MOV     DX,BX
  302.         MOV     AL,0EH
  303.         OUT     DX,AL
  304.         ADD     DX,2
  305.         MOV     AL,15
  306.         OR      AL,0C0H
  307.         OUT     DX,AL
  308.         MOV     DX,[CS:U_STATUS]
  309.         iN      AL,DX
  310.         MOV     DX,BX
  311.         MOV     AL,41H
  312.         OUT     DX,AL
  313.         MOV     DX,CX
  314.         iN      AL,DX
  315.         MOV     DX,BX
  316.         MOV     AL,49H
  317.         OUT     DX,AL
  318.         MOV     DX,CX
  319.         iN      AL,DX
  320.         MOV     DX,BX
  321.         MOV     AL,8FH
  322.         OUT     DX,AL
  323.         MOV     DX,CX
  324.         iN      AL,DX
  325.         PUSH    BX CX
  326.         MOV     CX,0
  327. @@VOiCECLEARLOOP:
  328.         MOV     DX,[CS:U_VOiCE]
  329.         MOV     AL,CL
  330.         OUT     DX,AL
  331.         iNC     DX
  332.         MOV     AL,9
  333.         OUT     DX,AL
  334.         iNC     DL
  335.         MOV     AX,0
  336.         OUT     DX,AX
  337.         DEC     DL
  338.         MOV     AL,0
  339.         OUT     DX,AL
  340.         ADD     DX,2
  341.         MOV     AL,3                    ; TURN VOiCE OFF
  342.         OUT     DX,AL
  343.         SUB     DX,2
  344.         MOV     AL,0DH
  345.         OUT     DX,AL
  346.         ADD     DX,2
  347.         MOV     AL,3
  348.         OUT     DX,AL
  349.         SUB     DX,2
  350.         iNC     CX
  351.         CMP     CX,31
  352.         JNZ     @@VOiCECLEARLOOP
  353.         POP     CX BX
  354.         MOV     DX,BX
  355.         MOV     AL,41H
  356.         OUT     DX,AL
  357.         MOV     DX,CX
  358.         iN      AL,DX
  359.         MOV     DX,BX
  360.         MOV     AL,49H
  361.         OUT     DX,AL
  362.         MOV     DX,CX
  363.         iN      AL,DX
  364.         MOV     DX,BX
  365.         MOV     AL,8FH
  366.         OUT     DX,AL
  367.         MOV     DX,CX
  368.         iN      AL,DX
  369.         MOV     DX,BX
  370.         MOV     AL,4CH
  371.         OUT     DX,AL
  372.         MOV     DX,CX
  373.         MOV     AL,7
  374.         OUT     DX,AL
  375.         STi
  376.         RET
  377.  
  378. TURNONMUZAK:
  379.         CMP     PLAYiNG,0
  380.         JE      GOTOSTART
  381.         RET
  382. GOTOSTART:
  383.         MOV     PLAYiNG,1
  384.         CLi
  385.         XOR     AX,AX
  386.         MOV     ES,AX
  387.         MOV     AX,ES:[20H]
  388.         MOV     BX,ES:[22H]
  389.         MOV     OLDiNT8,AX
  390.         MOV     OLDiNT8+2,BX
  391.         MOV     AX,OFFSET NEWiNT8
  392.         MOV     ES:[20H],AX
  393.         MOV     AX,CS
  394.         MOV     ES:[22H],AX
  395.         MOV     AL,54
  396.         OUT     43H,AL
  397.         MOV     AX,23863        ;1193181/50     ;HZ
  398.         OUT     40H,AL
  399.         MOV     AL,AH
  400.         OUT     40H,AL
  401.         MOV     DX,U_BASE
  402.         MOV     AL,1
  403.         OUT     DX,AL           ;NO LINE IN
  404.         MOV     AL,TEMPODEFA
  405.         CALL    SETTEMPO
  406.         RET
  407.  
  408. TURNOFFMUZAK:
  409.         CMP     PLAYiNG,1
  410.         JE      GOTOSTOP
  411.         RET
  412. GOTOSTOP:
  413.         MOV     PLAYiNG,0
  414.         CLi
  415.         MOV     AL,54
  416.         OUT     43H,AL
  417.         MOV     AL,0
  418.         OUT     40H,AL
  419.         OUT     40H,AL
  420.         MOV     AX,CS
  421.         MOV     DS,AX
  422.         XOR     AX,AX
  423.         MOV     ES,AX
  424.         MOV     AX,OLDiNT8
  425.         MOV     BX,OLDiNT8+2
  426.         MOV     ES:[20H],AX
  427.         MOV     ES:[22H],BX
  428.  
  429.         MOV     AL,54
  430.         OUT     43H,AL
  431.         MOV     AX,0    ;18HZ
  432.         OUT     40H,AL
  433.         MOV     AL,AH
  434.         OUT     40H,AL
  435.         MOV     AL,0B6H
  436.         OUT     43H,AL
  437.         MOV     AX,533H
  438.         OUT     42H,AL
  439.         MOV     AL,AH
  440.         OUT     42H,AL
  441.         iN      AL,61H
  442.         AND     AL,0FCH
  443.         OUT     61H,AL
  444.         CALL    GUSKUSS
  445.         MOV     DX,U_BASE
  446.         MOV     AL,2
  447.         OUT     DX,AL           ;LINE IN ENABLED
  448.         RET
  449.  
  450. iNSTALLMUZAK:
  451.         MOV     CS:[SONGNAMESEG],DS
  452.         MOV     CS:[SONGOFFSET],ES
  453.         PUSHA
  454.         CALL    iNSTALL_GUS
  455.         CALL    RESETDATAS
  456.         POPA
  457.         CMP     AX,1
  458.         JNE     NOLOADS
  459.         JMP     INST2
  460. NOLOADS:MOV     DS,CS:[SONGOFFSET]
  461.         XOR     BX,BX
  462. COUNTCHANS:
  463.         CMP     BYTE PTR DS:[CHANNELCODES+BX],0FFH
  464.         JE      NMCHANNELS
  465.         iNC     BX
  466.         JMP     COUNTCHANS
  467. NMCHANNELS:
  468.         MOV     NUMOFCHANNELS,BX
  469.         MOV     AX,DS:[NUMOFORDERS]
  470.         ADD     AX,60H
  471.         MOV     SAMPLEiNFOMAP,AX
  472.         MOV     BX,DS:[NUMOFSAMPLES]
  473.         ADD     BX,BX
  474.         ADD     AX,BX
  475.         MOV     PATTERNSEGMAP,AX
  476.         MOV     AL,DS:[32H]                     ;iNiTiAL TEMPO
  477.         MOV     CS:TEMPODEFA,AL
  478.         MOV     AL,DS:[31H]                     ;iNiTiAL SPEED
  479.         MOV     CS:CURRSPEED,AL
  480.         MOV     DS,SONGOFFSET
  481.         CALL    COUNTORDERS
  482.         MOV     CX,16
  483.         XOR     Si,Si
  484.         XOR     BP,BP
  485. BALANCESET:
  486.         CMP     BYTE PTR DS:[CHANNELCODES+Si],8
  487.         JB      LEFTCH
  488.         MOV     BYTE PTR CS:[SC_PAN+BP],0FH
  489.         JMP     SRR
  490. LEFTCH: MOV     BYTE PTR CS:[SC_PAN+BP],0
  491. SRR:    iNC     Si
  492.         ADD     BP,2
  493.         LOOP    BALANCESET
  494.         MOV     BX,SAMPLEiNFOMAP
  495.         MOV     CX,DS:[NUMOFSAMPLES]
  496.         MOV     Si,DS:[BX]
  497.         SHL     Si,4
  498.         MOV     DX,DS:[Si+14]
  499.         MOV     SMPBEGiN,DX
  500. LOWNEXT:PUSH    CX
  501.         MOV     Si,DS:[BX]
  502.         SHL     Si,4
  503.         SUB     DS:[Si+14],DX
  504.         ADD     BX,2
  505.         POP     CX
  506.         LOOP    LOWNEXT
  507.         MOV     CX,DS:[NUMOFSAMPLES]
  508.         MOV     BX,SAMPLEiNFOMAP
  509. DMPG:   PUSH    CX
  510.         MOV     Si,DS:[BX]
  511.         SHL     Si,4
  512.         MOV     CX,DS:[Si+16]
  513.         MOV     AX,DS:[Si+14]
  514.         CALL    DUMPTOGUSRAM
  515.         POP     CX
  516.         ADD     BX,2
  517.         LOOP    DMPG
  518.         RET
  519.  
  520. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ DUMP FOR TYPE 1 (ALREADY LOADED SAMPLES) ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  521.  
  522. DUMPTOGUSRAM:                         ;AX - SEGMENT FROM,   CX - SiZE
  523.         OR      CX,CX
  524.         JE      NODMP
  525.         PUSH    BX BP DX Si
  526.         MOV     BX,AX
  527.         ADD     BX,SMPBEGiN
  528.         ADD     BX,SONGOFFSET
  529.         MOV     ES,BX
  530.         MOV     BX,AX
  531.         XOR     BP,BP
  532.         RCL     BX,1
  533.         RCL     BP,1
  534.         RCL     BX,1
  535.         RCL     BP,1
  536.         RCL     BX,1
  537.         RCL     BP,1
  538.         RCL     BX,1
  539.         RCL     BP,1
  540.         MOV     Si,BP
  541.         MOV     Di,BX
  542.         XOR     BX,BX
  543.  
  544. LPDMP:  CLi
  545.         PUSH    CX
  546.         MOV     DX,U_COMMAND
  547.         MOV     AL,44H
  548.         OUT     DX,AL
  549.         ADD     DX,2
  550.         PUSH    AX
  551.         MOV     AX,Si
  552.         OUT     DX,AL
  553.         POP     AX
  554.         SUB     DX,2
  555. @@MAiNLOOP:
  556.         MOV     AL,43H
  557.         OUT     DX,AL
  558.         iNC     DX
  559.         PUSH    AX
  560.         MOV     AX,Di
  561.         OUT     DX,AX
  562.         POP     AX
  563.         DEC     DX
  564. @@DUMPBYTE:
  565.         ADD     DX,4
  566.         MOV     AL,ES:[BX]
  567.         ADD     AL,128
  568.         iNC     BX
  569.         OUT     DX,AL
  570.         SUB     DX,4
  571.         ADD     Di,1
  572.         JNC     @@DOLOOP
  573.         iNC     Si
  574.         MOV     AL,44H
  575.         OUT     DX,AL
  576.         ADD     DX,2
  577.         PUSH    AX
  578.         MOV     AX,Si
  579.         OUT     DX,AL
  580.         POP     AX
  581.         SUB     DX,2
  582. @@DOLOOP:
  583.         LOOP    @@MAiNLOOP
  584.         POP     CX
  585.         STi
  586.         POP     Si DX BP BX
  587. NODMP:  RET
  588.  
  589. RESETDATAS:
  590.         MOV     ORDERPOiNTER,0
  591.         MOV     PATTERNPOiNTER,0
  592.         MOV     REALPATPOINTER,0
  593.         MOV     CURRSPEED,6H
  594.         MOV     AL,TEMPODEFA
  595.         MOV     TEMPO,AL
  596.         RET
  597.  
  598. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ SECOND TYPE: LOAD S3M TOO ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  599.  
  600. iNST2:  MOV     CS:FILEOFFSET,ECX
  601.         MOV     DS,CS:[SONGNAMESEG]
  602.         MOV     DX,Si
  603.         CALL    OPENFiLE             ; OPEN THE S3M
  604.         MOV     DS,CS:SONGOFFSET
  605.         MOV     DX,0
  606.         MOV     ECX,CS:FILEOFFSET
  607.         CALL    LSEEK
  608.         MOV     ECX,96               ; HEADERSiZE
  609.         CALL    READFiLE             ; LOAD HEADER OF S3M
  610.         CMP     WORD PTR DS:[44],'CS'
  611.         JE      EZS3M                ; OKAY, S3M
  612.         CALL    CLOSEFiLE
  613.         PUSH    CS
  614.         POP     DS
  615.         LEA     DX,NOTS3M            ; PRiNT ERROR MSG
  616.         MOV     AH,9
  617.         iNT     21H
  618.         MOV     AX,4C00H             ; EXiT TO DOS
  619.         iNT     21H
  620. EZS3M:  MOV     CX,WORD PTR DS:[20H]
  621.         MOV     DX,96                ; ENNYIT OLVASTUNK BE EDDIG
  622.         CALL    READFILE             ; READING ORDERS
  623.         ADD     DX,AX                ; INCREASE MEMPOINTER
  624.         MOV     CX,WORD PTR DS:[22H]
  625.         SHL     CX,1
  626.         CALL    READFILE             ; READING INSTRUMENT POINTERS
  627.         MOV     SI,DX
  628.         MOV     CX,WORD PTR DS:[SI]
  629.         MOV     CS:INSSEG,CX
  630.         ADD     DX,AX
  631.         MOV     CX,WORD PTR DS:[24H]
  632.         SHL     CX,1
  633.         CALL    READFILE             ; READING PATTERN POINTERS
  634.         ADD     DX,AX
  635.         MOV     CX,CS:INSSEG
  636.         SHL     CX,4
  637.         SUB     CX,DX
  638.         CALL    READFILE             ; SOME EXTRA SHIT
  639.         ADD     DX,AX
  640.         MOV     CX,WORD PTR DS:[22H]
  641.         MOV     AX,CX
  642.         SHL     CX,6                 ; INSNUM * 80
  643.         SHL     AX,4
  644.         ADD     CX,AX
  645.         CALL    READFILE             ; READING INSTRUMENTS
  646.         MOV     SI,DX
  647.         ADD     DX,AX
  648. INSSEEK:MOVZX   ECX,WORD PTR DS:[SI+14] ; GET 1ST REAL INSTR PLACE
  649.         CMP     ECX,0
  650.         JNE     OKINS1
  651.         ADD     SI,80
  652.         JMP     INSSEEK              ; NOT A REAL INSTRUMENT (0 BYTES LONG!)
  653. OKINS1: SHL     ECX,4
  654.         MOVZX   EDX,DX
  655.         SUB     ECX,EDX
  656.         PUSH    ECX
  657.         CALL    READFILE             ; READ ALL THE PATTERNS
  658.         POP     ECX
  659.         ADD     EDX,ECX
  660.         MOV     AX,DS
  661.         SHR     EDX,4
  662.         ADD     AX,DX
  663.         MOV     DS,AX
  664.         MOV     CS:INSSEG,AX         ; IDE LEHET TOLTENI A HANGSZEREKET
  665.         PUSH    CS
  666.         POP     DS
  667.         CALL    iNSTALL_GUS          ; iNiTiALiZE GUS
  668.         CALL    RESETDATAS           ; AND VARiABLES TOO
  669.         MOV     DS,CS:SONGOFFSET
  670.         XOR     BX,BX
  671. COUNTCHANS_iNST2:
  672.         CMP     BYTE PTR DS:[CHANNELCODES+BX],0FFH
  673.         JE      NMCHANNELS_iNST2
  674.         iNC     BX
  675.         JMP     COUNTCHANS_iNST2
  676. NMCHANNELS_iNST2:
  677.         MOV     CS:[NUMOFCHANNELS],BX
  678.         MOV     AX,DS:[NUMOFORDERS]
  679.         ADD     AX,60H
  680.         MOV     SAMPLEiNFOMAP,AX
  681.         MOV     BX,DS:[NUMOFSAMPLES]
  682.         ADD     BX,BX
  683.         ADD     AX,BX
  684.         MOV     CS:[PATTERNSEGMAP],AX
  685.         MOV     AL,DS:[32H]                     ;iNiTiAL TEMPO
  686.         MOV     CS:TEMPODEFA,AL
  687.         MOV     AL,DS:[31H]                     ;iNiTiAL SPEED
  688.         MOV     CS:[CURRSPEED],AL
  689.         MOV     DS,CS:[SONGOFFSET]
  690.         CALL    COUNTORDERS
  691.         MOV     CX,16
  692.         XOR     Si,Si
  693.         XOR     BP,BP
  694. BALANCESET_iNST2:
  695.         CMP     BYTE PTR DS:[CHANNELCODES+Si],8
  696.         JB      LEFTCH2
  697.         MOV     BYTE PTR CS:[SC_PAN+BP],0FH
  698.         JMP     SRR2
  699. LEFTCH2:MOV     BYTE PTR CS:[SC_PAN+BP],00
  700. SRR2:   iNC     Si
  701.         ADD     BP,2
  702.         LOOP    BALANCESET_iNST2
  703.         MOV     BX,CS:SAMPLEiNFOMAP
  704.         MOV     CX,DS:[NUMOFSAMPLES]
  705.         MOV     Si,DS:[BX]
  706.         SHL     Si,4
  707.         MOV     DX,DS:[Si+14]
  708.         MOV     CS:[SMPBEGiN],DX
  709.         MOV     CX,DS:[NUMOFSAMPLES]
  710.         MOV     BX,CS:[SAMPLEiNFOMAP]
  711. DMPG2:  PUSH    CX
  712.         MOV     Si,DS:[BX]
  713.         SHL     Si,4
  714.         MOVZX   ECX,WORD PTR DS:[Si+14] ; DATAS FOR SEEKiNG
  715.         SHL     ECX,4                   ; CALC OFFSET
  716.         ADD     ECX,CS:FILEOFFSET
  717.         CALL    LSEEK
  718.         MOV     CX,DS:[Si+16]           ; GET LENGTH OF SAMPLE
  719.         PUSH    DS DX CX BX
  720.         MOV     DX,0
  721.         MOV     DS,CS:iNSSEG
  722.         CALL    READFiLE                ; LOAD ONE SAMPLE
  723.         POP     BX CX DX DS
  724.         MOVZX   EAX,WORD PTR DS:[Si+14]
  725.         SHL     EAX,4
  726.         MOV     CS:[GUSPOS],EAX         ; CALC PLACE iN GRAViS TOO
  727.         CALL    LOADSAMPLE              ; LOAD iT
  728.         POP     CX
  729.         ADD     BX,2
  730.         LOOP    DMPG2                   ; NEXT SAMPLE
  731.         CALL    CLOSEFiLE               ; WE DiD iT :-)
  732.         RET
  733.  
  734. LOADSAMPLE:
  735.         CMP     CX,0
  736.         JE      NOUPLOAD
  737.         PUSHAD
  738.         MOV     ES,CS:[iNSSEG]
  739.         XOR     EDX,EDX
  740.         MOV     EDi,ECX
  741.         MOV     ECX,CS:[GUSPOS]
  742.         MOV     ESi,EDX
  743.         XOR     EBP,EBP
  744.         MOV     DX,CS:[U_BASE]
  745.         ADD     DX,0103H
  746. NBYTE:  MOV     EBX,ECX
  747.         MOV     AL,43H
  748.         OUT     DX,AL
  749.         iNC     DX
  750.         MOV     AX,BX
  751.         OUT     DX,AX
  752.         DEC     DX
  753.         MOV     AL,44H
  754.         OUT     DX,AL
  755.         SHR     EBX,16
  756.         MOV     AL,BL
  757.         iNC     DX
  758.         iNC     DX
  759.         OUT     DX,AL
  760.         iNC     DX
  761.         iNC     DX
  762.         MOV     AL,BYTE PTR ES:[EBP]
  763.         SUB     AL,80H
  764.         OUT     DX,AL
  765.         SUB     DX,4
  766.         iNC     ECX
  767.         iNC     EBP
  768.         CMP     EBP,EDi
  769.         JNE     NBYTE
  770.         POPAD
  771.         PUSHA
  772.         MOV     AH,2
  773.         MOV     DL,254
  774.         iNT     21H
  775.         POPA
  776. NOUPLOAD:
  777.         RET
  778.  
  779. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ THIS ROUTINE WILL BE POLLED ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  780.  
  781. NEWiNT8:
  782.         PUSHF
  783.         PUSH    AX
  784.         PUSH    BX
  785.         PUSH    CX
  786.         PUSH    DX
  787.         PUSH    BP
  788.         PUSH    Si
  789.         PUSH    Di
  790.         PUSH    DS
  791.         PUSH    ES
  792.         CLD
  793.         CALL    POLLMUSiC
  794.         POP     ES
  795.         POP     DS
  796.         POP     Di
  797.         POP     Si
  798.         POP     BP
  799.         POP     DX
  800.         POP     CX
  801.         POP     BX
  802.         MOV     AL,20H
  803.         OUT     20H,AL
  804.         POP     AX
  805.         POPF
  806.         iRET
  807.  
  808. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  809.  
  810. SETVOiCE MACRO
  811.         MOV     DX,U_VOiCE
  812.         MOV     AX,BP
  813.         SHR     AX,1
  814.         OUT     DX,AL
  815. ENDM    SETVOiCE
  816.  
  817. PLAYVOL MACRO
  818.         LOCAL   DONE
  819.         MOV     DX,U_COMMAND
  820.         MOV     AL,89H
  821.         OUT     DX,AL
  822.         iNC     DL
  823.         iN      AX,DX
  824.         CMP     AX,[BP+SC_VOL]
  825.         JZ      DONE
  826.         MOV     AX,[BP+SC_VOL]
  827.         CALL    SLiDERAMP
  828. DONE:
  829. ENDM    PLAYVOL
  830.  
  831. PLAYNOTE MACRO
  832.         LOCAL   DONE
  833.         MOV     DX,U_COMMAND
  834.         ;MOV     AL,81H
  835.         ;OUT     DX,AL
  836.         ;iNC     DL
  837.         ;iN      AX,DX
  838.         ;CMP     AX,[BP+SC_NOTE]
  839.         ;JZ      DONE
  840.         ;DEC     DL
  841.         MOV     AL,1
  842.         OUT     DX,AL
  843.         iNC     DL
  844.         MOV     AX,[BP+SC_NOTE]
  845.         OUT     DX,AX
  846. DONE:
  847. ENDM    PLAYNOTE
  848.  
  849. RSHiFT: MOV     BX,CX
  850.         SHR     AX,7
  851.         SHR     CX,7
  852.         SHL     BX,9
  853.         OR      AX,BX
  854.         RET
  855. DOiNS:  CMP     SC_START2[BP],0F000H
  856.         JNZ     DOVOiCE
  857.         JMP     NOVOiCE
  858. DOVOiCE:
  859.         MOV     AL,0
  860.         CALL    DORAMP
  861.         MOV     DX,U_COMMAND
  862.         MOV     AL,0
  863.         OUT     DX,AL
  864.         MOV     AL,3
  865.         ADD     DX,2
  866.         OUT     DX,AL
  867.         MOV     DX,U_VOiCE
  868.         MOV     AX,BP
  869.         SHR     AX,1
  870.         OUT     DX,AL
  871. DOBEGiN:
  872.         MOV     DX,U_COMMAND
  873.         MOV     AL,0AH
  874.         OUT     DX,AL
  875.         iNC     DX
  876.         MOV     AX,SC_START[BP]
  877.         MOV     CX,SC_START2[BP]
  878.         CALL    RSHiFT
  879.         OUT     DX,AX
  880.         DEC     DX
  881.         MOV     AL,0BH
  882.         OUT     DX,AL
  883.         iNC     DX
  884.         MOV     AX,SC_START[BP]
  885.         SHL     AX,9
  886.         OUT     DX,AX
  887.         MOV     DX,U_COMMAND
  888.         MOV     AL,2
  889.         OUT     DX,AL
  890.         iNC     DX
  891.         MOV     AX,SC_LOOPST[BP]
  892.         MOV     CX,SC_LOOPST2[BP]
  893.         CALL    RSHiFT
  894.         OUT     DX,AX
  895.         DEC     DX
  896.         MOV     AL,3
  897.         OUT     DX,AL
  898.         iNC     DX
  899.         MOV     AX,SC_LOOPST[BP]
  900.         SHL     AX,9
  901.         OUT     DX,AX
  902.         MOV     DX,U_COMMAND
  903.         MOV     AL,4
  904.         OUT     DX,AL
  905.         iNC     DX
  906.         MOV     AX,REPLEN[BP]
  907.         MOV     CX,REPLEN2[BP]
  908.         CALL    RSHiFT
  909.         OUT     DX,AX
  910.         DEC     DX
  911.         MOV     AL,5
  912.         OUT     DX,AL
  913.         iNC     DX              ; 104H
  914.         MOV     AX,REPLEN[BP]
  915.         SHL     AX,9
  916.         OUT     DX,AX
  917.         DEC     DX              ; 103H
  918.         MOV     AL,0
  919.         OUT     DX,AL
  920.         ADD     DX,2
  921.         MOV     AL,SC_MODE[BP]
  922.         OUT     DX,AL
  923. SETGENERAL:
  924.         CALL    PERNOP
  925.         MOV     DX,U_COMMAND
  926.         MOV     AL,0CH
  927.         OUT     DX,AL
  928.         ADD     DX,2
  929.         MOV     AL,SC_PAN[BP]
  930.         OUT     DX,AL
  931.         JMP     BOTTOM
  932. NOVOiCE:
  933.         MOV     AL,0
  934.         CALL    DORAMP
  935.         MOV     AL,0
  936.         OUT     DX,AL
  937.         ADD     DX,2
  938.         MOV     AL,3
  939.         OUT     DX,AL
  940. BOTTOM: RET
  941.  
  942. POLLMUSiC:
  943.         PUSH    CS
  944.         POP     DS
  945.         iNC     COUNTER
  946.         MOV     AL,COUNTER
  947.         CMP     AL,CURRSPEED
  948.         JB      DOFX
  949.         JMP     KOVSOR
  950. DOFX:   JMP     COMMANDREL
  951.  
  952. KOVSOR: MOV     COUNTER,0
  953.         CMP     PATTDELAYTiME2,0
  954.         JE      GETNOTEN
  955.         CALL    DOFX
  956.         JMP     DSKiP
  957. GETNOTEN:
  958.         MOV     ES,SONGOFFSET
  959.         MOV     Si,ORDERPOiNTER
  960.         MOV     BL,ES:[Si+ORDERLiST]
  961.         CMP     BL,254
  962.         JNE     NOPLUSZ
  963.         iNC     ORDERPOiNTER
  964.         JMP     GETNOTEN
  965. NOPLUSZ:CMP     BL,255
  966.         JNE     NOADDiE
  967.         JMP     OVERP
  968. NOADDiE:XOR     BH,BH
  969.         MOV     PATTERNNUM,BX
  970.         SHL     BX,1
  971.         MOV     Di,PATTERNSEGMAP
  972.         MOV     AX,ES:[BX+Di]
  973.         ADD     AX,SONGOFFSET
  974.         MOV     DS,AX
  975.         MOV     Si,PATTERNPOiNTER
  976.         OR      Si,Si
  977.         JNE     NOTFiRSTROW
  978.         LODSW
  979.         MOV     PATTERNSiZE,AX
  980. NOTFiRSTROW:
  981.         CALL    CHANNELPROCi
  982. DSKiP:  MOV     PATTERNPOiNTER,Si
  983.         INC     REALPATPOINTER
  984.         MOV     AL,PATTDELAYTiME
  985.         OR      AL,AL
  986.         JE      NODELY
  987.         MOV     PATTDELAYTiME2,AL
  988.         MOV     PATTDELAYTiME,0
  989. NODELY: CMP     PATTDELAYTiME2,0
  990.         JZ      DSKA
  991.         DEC     PATTDELAYTiME2
  992.         JZ      DSKA
  993.         SUB     PATTERNPOiNTER,16
  994.         SUB     REALPATPOINTER,16
  995. DSKA:   CMP     PBREAKFLAG,0
  996.         JE      NNPYSK
  997.         MOV     PBREAKFLAG,0
  998.         MOV     AL,PBREAKPOSiTiON
  999.         XOR     AH,AH
  1000.         SHL     AX,4
  1001. CONTBRK:MOV     PATTERNPOiNTER,AX
  1002.         MOV     REALPATPOINTER,AX
  1003.         MOV     PBREAKPOSiTiON,0
  1004. NNPYSK: CMP     Si,PATTERNSiZE
  1005.         JAE     NEXTPATTERN
  1006.         CMP     POSJUMPASSERT,1
  1007.         JE      NEXTPATTERN
  1008.         RET
  1009. NEXTPATTERN:
  1010.         MOV     AL,PBREAKPOSiTiON
  1011.         XOR     AH,AH
  1012.         SHL     AX,4
  1013.         MOV     PATTERNPOiNTER,AX
  1014.         MOV     REALPATPOINTER,AX
  1015.         MOV     PBREAKPOSiTiON,0
  1016.         MOV     POSJUMPASSERT,0
  1017.         MOV     ES,SONGOFFSET
  1018.         iNC     ORDERPOiNTER
  1019.         MOV     AX,ORDERPOiNTER
  1020.         CMP     AX,ES:[NUMOFORDERS]
  1021.         JB      NEMOVER
  1022. OVERP:  CALL    RESETDATAS
  1023.         MOV     PATTDELAYTiME,0
  1024.         MOV     PATTDELAYTiME2,0
  1025.         MOV     AL,TEMPODEFA
  1026.         CALL    SETTEMPO
  1027.         PUSH    ES CS
  1028.         POP     ES
  1029.         MOV     AX,0
  1030.         MOV     CX,80
  1031.         LEA     Di,COM1
  1032.         REP     STOSW
  1033.         POP     ES
  1034. NEMOVER:RET
  1035.  
  1036. CHANNELPROCi:
  1037.         MOV     CX,NUMOFCHANNELS
  1038.         XOR     BX,BX
  1039. CLEARR:
  1040.         MOV     WORD PTR COM1[BX],0
  1041.         MOV     NOTE[BX],0
  1042.         SHL     BX,1
  1043.         SHR     BX,1
  1044.         ADD     BX,2
  1045.         LOOP    CLEARR
  1046.  
  1047. CHANNELREPEAT:
  1048.         LODSB
  1049.         OR      AL,AL
  1050.         JNE     MOREDATAiN
  1051.         RET
  1052. MOREDATAiN:
  1053.         PUSH    AX
  1054.         AND     AX,0FH  ;1F -> UP TO 32 CHANNELS
  1055.         SHL     AX,1
  1056.         MOV     BP,AX
  1057.         MOV     PROCESSCHANNEL,BP
  1058.         POP     AX
  1059.         SHR     AX,5
  1060.         AND     AX,7
  1061.         MOV     THiNGSTODO,AL
  1062.  
  1063.         MOV     CX,PROCESSCHANNEL
  1064.         SHR     CX,1
  1065.         SETVOiCE
  1066.         TEST    THiNGSTODO,1
  1067.         JE      NONOTEANDSAM
  1068.         PUSH    DS
  1069.         CALL    GETNOTEANDSAM
  1070.         POP     DS
  1071. NONOTEANDSAM:
  1072.         TEST    THiNGSTODO,2
  1073.         JE      NOVOLSET
  1074.         CALL    GETVOLUMESET
  1075. NOVOLSET:
  1076.         TEST    THiNGSTODO,4
  1077.         JE      NOEFFX
  1078.         CALL    GETEFFECT
  1079. NOEFFX:
  1080.         CALL    PERNOP
  1081.         CMP     GOTNOTE,0
  1082.         JE      NODU
  1083.         CALL    DOiNS
  1084. NODU:   MOV     GOTNOTE,0
  1085.         PUSH    DS Si
  1086.         PLAYNOTE
  1087.         PLAYVOL
  1088.         POP     Si DS
  1089.         JMP     CHANNELREPEAT
  1090.  
  1091. GETNOTEANDSAM:
  1092.         LODSB
  1093.         MOV     NOTEBYTE,AL
  1094.         CMP     AL,0FEH
  1095.         JNE     GOODNOTE
  1096.         iNC     Si              ;READ iNS>NULL
  1097.         RET
  1098. GOODNOTE:
  1099.         LODSB
  1100.         XOR     AH,AH
  1101.         OR      AL,AL
  1102.         JNE     NOLASTSAM
  1103.         MOV     AX,LASTiNST[BP]
  1104.         MOV     SC_MODE[BP],0
  1105.         DEC     AX
  1106.         MOV     Di,AX
  1107.         SHL     Di,1
  1108.         MOV     ES,SONGOFFSET
  1109.         MOV     BX,SAMPLEiNFOMAP
  1110.         MOV     Di,ES:[BX+Di]
  1111.         SHL     Di,4
  1112.         MOV     AL,ES:[Di+28]
  1113.         CMP     NOTEBYTE,0FFH
  1114.         JNE     CONTiSET
  1115.         RET
  1116. NOLASTSAM:
  1117.         MOV     LASTiNST[BP],AX
  1118.         MOV     SC_MODE[BP],0
  1119.         DEC     AX
  1120.         MOV     Di,AX
  1121.         SHL     Di,1
  1122.         MOV     ES,SONGOFFSET
  1123.         MOV     BX,SAMPLEiNFOMAP
  1124.         MOV     Di,ES:[BX+Di]
  1125.         SHL     Di,4
  1126.         MOV     AL,ES:[Di+28]
  1127.         MOV     VOLL[BP],AL
  1128.         CALL    VOLEQU
  1129.         CMP     NOTEBYTE,0FFH
  1130.         JNE     CONTiSET
  1131.         RET
  1132. CONTiSET:
  1133.         MOV     AX,ES:[Di+14]
  1134.         XOR     DX,DX
  1135.         RCL     AX,1
  1136.         RCL     DX,1
  1137.         CLC
  1138.         RCL     AX,1
  1139.         RCL     DX,1
  1140.         CLC
  1141.         RCL     AX,1
  1142.         RCL     DX,1
  1143.         CLC
  1144.         RCL     AX,1
  1145.         RCL     DX,1
  1146.         MOV     SC_START[BP],AX
  1147.         MOV     SC_START2[BP],DX
  1148.         TEST    BYTE PTR ES:[Di+31],1   ;LOOP FLAG
  1149.         JE      NOLOOP
  1150.         OR      SC_MODE[BP],00001000B
  1151.         MOV     CX,ES:[Di+20]
  1152.         OR      CX,CX
  1153.         JE      LOOPNOFiX
  1154.         DEC     CX
  1155. LOOPNOFiX:
  1156.         MOV     AX,SC_START[BP]
  1157.         MOV     DX,SC_START2[BP]
  1158.         ADD     AX,CX
  1159.         ADC     DX,0
  1160.         MOV     SC_LOOPST[BP],AX
  1161.         MOV     SC_LOOPST2[BP],DX
  1162.         MOV     WAVESTART[BP],AX
  1163.         MOV     WAVESTART2[BP],DX
  1164.         MOV     CX,ES:[Di+24]
  1165.         DEC     CX
  1166.         MOV     AX,SC_START[BP]
  1167.         MOV     DX,SC_START2[BP]
  1168.         ADD     AX,CX
  1169.         ADC     DX,0
  1170.         MOV     REPLEN[BP],AX
  1171.         MOV     REPLEN2[BP],DX
  1172.         JMP     SETREGS
  1173. NOLOOP: MOV     AX,SC_START[BP]
  1174.         MOV     DX,SC_START2[BP]
  1175.         MOV     SC_LOOPST[BP],AX
  1176.         MOV     SC_LOOPST2[BP],DX
  1177.         MOV     WAVESTART[BP],AX
  1178.         MOV     WAVESTART2[BP],DX
  1179.         MOV     CX,ES:[Di+16]
  1180.         DEC     CX
  1181.         ADD     AX,CX
  1182.         ADC     DX,0
  1183.         MOV     REPLEN[BP],AX
  1184.         MOV     REPLEN2[BP],DX
  1185. SETREGS:
  1186.         MOV     BL,NOTEBYTE
  1187.         XOR     BH,BH
  1188.         SHL     BX,1
  1189.         MOV     AX,PERiODTABLE[BX]
  1190.         MOV     BX,8200
  1191.         MUL     BX
  1192.         DiV     WORD PTR ES:[Di+32]
  1193.         MOV     BX,PERiOD[BP]
  1194.         MOV     OLDPERiOD[BP],BX
  1195.         MOV     NOTE[BP],AX
  1196.         MOV     PERiOD[BP],AX
  1197.         CALL    PERNOP
  1198.         MOV     GOTNOTE,1
  1199.         RET
  1200.  
  1201. GETVOLUMESET:
  1202.         LODSB
  1203.         MOV     VOLL[BP],AL
  1204.         CALL    VOLEQU
  1205.         RET
  1206.  
  1207. GETEFFECT:
  1208.         LODSB
  1209.         MOV     COM1[BP],AL
  1210.         MOV     AH,AL
  1211.         LODSB
  1212.         MOV     OPE1[BP],AL
  1213.         OR      AH,AH
  1214.         JNE     CHKCOM3
  1215.         RET
  1216. CHKCOM3:
  1217.         CMP     AH,1
  1218.         JE      SPDCH
  1219.         CMP     AH,2
  1220.         JE      POSJUMP
  1221.         CMP     AH,3
  1222.         JE      PATTBR
  1223.         CMP     AH,7
  1224.         JE      SETTONEPORTA
  1225.         CMP     AH,12
  1226.         JE      SETTONEPORTA
  1227.         CMP     AH,15
  1228.         JE      SAMOFFS
  1229.         CMP     AH,20
  1230.         JE      SETTEMPO
  1231.         RET
  1232.  
  1233. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ COMMAND 1: CHANGE SPEED ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  1234.  
  1235. SPDCH:  AND     AL,0FFH
  1236.         JE      SPEEDNULL
  1237.         CMP     AL,32
  1238.         JB      NORMSPD
  1239.         RET
  1240. NORMSPD:
  1241.         MOV     CURRSPEED,AL
  1242.         MOV     COUNTER,0
  1243. SPEEDNULL:
  1244.         RET
  1245.  
  1246. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ COMMAND 2: JUMP ORDER ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  1247.  
  1248. POSJUMP:
  1249.         DEC     AL
  1250.         XOR     AH,AH
  1251.         MOV     ORDERPOiNTER,AX
  1252.         MOV     POSJUMPASSERT,1
  1253.         RET
  1254.  
  1255. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ COMMAND 3: PATTERN BREAK ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  1256.  
  1257. PATTBR: MOV     POSJUMPASSERT,1
  1258.         RET
  1259.  
  1260. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ COMMAND 7: PORTA TO NOTE ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  1261.  
  1262. SETTONEPORTA:
  1263.         MOV     GOTNOTE,0
  1264.         CMP     NOTE[BP],0
  1265.         JE      REMG1
  1266.         MOV     BX,PERiOD[BP]
  1267.         MOV     TARGETPERiOD[BP],BX
  1268.         MOV     AX,OLDPERiOD[BP]
  1269.         MOV     PERiOD[BP],AX
  1270.         MOV     NOTE[BP],0
  1271. REMG1:  RET
  1272.  
  1273. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ COMMAND 15: SAMPLE OFFSET ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  1274.  
  1275. SAMOFFS:XOR     AH,AH
  1276.         OR      AL,AL
  1277.         JZ      SONONEW
  1278.         MOV     SAMPLEOFFSET[BP],AL
  1279. SONONEW:MOV     EAX,0
  1280.         MOV     AH,SAMPLEOFFSET[BP]
  1281.         PUSH    BX DI ES AX
  1282.         MOV     AX,LASTiNST[BP]
  1283.         DEC     AX
  1284.         MOV     Di,AX
  1285.         SHL     Di,1
  1286.         MOV     ES,CS:[SONGOFFSET]
  1287.         MOV     BX,SAMPLEiNFOMAP
  1288.         MOV     Di,ES:[BX+Di]
  1289.         SHL     Di,4
  1290.         MOV     DX,ES:[Di+16]
  1291.         POP     AX ES DI BX
  1292.         CMP     DX,AX
  1293.         JA      SUCKOFF
  1294.         MOV     AX,DX
  1295. SUCKOFF:CMP     NOTE[BP],0
  1296.         JE      NOUJOFF
  1297.         ADD     SC_START[BP],AX
  1298.         ADC     SC_START2[BP],0
  1299. NOUJOFF:MOV     GOTNOTE,1
  1300.         RET
  1301.  
  1302. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ COMMAND 20: SET TEMPO ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  1303.  
  1304. SETTEMPO:
  1305.         PUSH    AX BX DX
  1306.         CMP     AL,46
  1307.         JAE     OKTEMPO
  1308.         MOV     AL,125
  1309. OKTEMPO:MOV     TEMPO,AL
  1310.         MOV     AH,0
  1311.         MOV     BX,AX
  1312.         MOV     DX,WORD PTR CS:BiGNUM+2
  1313.         MOV     AX,WORD PTR CS:BiGNUM
  1314.         DiV     BX
  1315.         MOV     BX,AX
  1316.         CLi
  1317.         MOV     AL,00110100B
  1318.         OUT     43H,AL
  1319.         MOV     AL,BL
  1320.         OUT     40H,AL
  1321.         MOV     AL,BH
  1322.         OUT     40H,AL
  1323.         STi
  1324.         POP     DX BX AX
  1325.         RET
  1326.  
  1327. COMMANDREL:
  1328.         MOV     CX,NUMOFCHANNELS
  1329.         XOR     BP,BP
  1330. COMLOOP_:
  1331.         PUSH    CX
  1332.         SETVOiCE
  1333.         CALL    QUESTCOM
  1334.         PLAYNOTE
  1335.         PLAYVOL
  1336. deLYP:  POP     CX
  1337.         ADD     BP,2
  1338.         LOOP    COMLOOP_
  1339.         RET
  1340. JUMPS
  1341.  
  1342. QUESTCOM:                               ; HERE iS THE HEART OF THE PLAYER
  1343.         MOV     AL,COM1[BP]
  1344.         OR      AL,AL
  1345.         JNE     GHH2
  1346.         RET
  1347. GHH2:   CMP     AL,4
  1348.         JE      VOLSLiDE
  1349.         CMP     AL,5
  1350.         JE      PORTADOWN
  1351.         CMP     AL,6
  1352.         JE      PORTAUP
  1353.         CMP     AL,7
  1354.         JE      TONEPORTAMENTO
  1355.         CMP     AL,8
  1356.         JE      ViBRATO
  1357.         CMP     AL,10
  1358.         JE      ARPEGGiO
  1359.         CMP     AL,11
  1360.         JE      VOLSLiDEANDViBRATO
  1361.         CMP     AL,12
  1362.         JE      VOLSLiDEANDTONE
  1363.         CMP     AL,17
  1364.         JE      RETRIGGERNOTE
  1365.         CMP     AL,19
  1366.         JE      EXTRACOMMANDS
  1367.         CMP     AL,22
  1368.         JE      CHANGEGLVOLUME
  1369.         CMP     AL,24
  1370.         JE      DMPPAN
  1371.         RET
  1372.  
  1373. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ COMMAND 4: VOLUME SLIDE ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  1374.  
  1375. VOLSLiDE:
  1376.         MOV     AL,OPE1[BP]
  1377.         OR      AL,AL
  1378.         JNE     NEWVLS
  1379.         MOV     AL,LASTVOLSLiDE[BP]
  1380. NEWVLS: MOV     LASTVOLSLiDE[BP],AL
  1381.         CMP     AL,0F0H
  1382.         JE      VOLSLIDEUP
  1383.         SHR     AL,4
  1384.         OR      AL,AL
  1385.         JE      VOLSLiDEDOWN
  1386.         CMP     AL,0FH
  1387.         JE      FINEVOLDOWN
  1388. VOLSLiDEUP:
  1389.         MOV     AL,LASTVOLSLiDE[BP]
  1390.         TEST    AL,0FH
  1391.         JNE     FiNEVOLUP
  1392. VOLSLiDEUP2:
  1393.         SHR     AL,4
  1394.         ADD     VOLL[BP],AL
  1395.         CMP     VOLL[BP],40H
  1396.         JB      VSUSKiP
  1397.         MOV     VOLL[BP],40H
  1398. VSUSKiP:MOV     AL,VOLL[BP]
  1399.         CALL    VOLEQU
  1400.         RET
  1401. VOLSLiDEDOWN:
  1402.         MOV     AL,LASTVOLSLiDE[BP]
  1403.         AND     AL,0FH
  1404.         SUB     VOLL[BP],AL
  1405.         CMP     VOLL[BP],0FFH
  1406.         JG      VSDSKiP
  1407.         MOV     VOLL[BP],0
  1408. VSDSKiP:MOV     AL,VOLL[BP]
  1409.         CALL    VOLEQU
  1410.         RET
  1411.  
  1412. FiNEVOLDOWN:
  1413.         MOV     COM1[BP],0
  1414.         JMP     VOLSLiDEDOWN
  1415. FiNEVOLUP:
  1416.         MOV     COM1[BP],0
  1417.         JMP     VOLSLiDEUP2
  1418.  
  1419. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ COMMAND 5: PORTAMENTO DOWN ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  1420.  
  1421. PORTADOWN:
  1422.         MOV     AL,OPE1[BP]
  1423.         MOV     BL,AL
  1424.         SHR     BL,4
  1425.         CMP     BL,0FH
  1426.         JE      FINEPD
  1427.         CMP     BL,0EH
  1428.         JE      EFINEPD
  1429.         OR      AL,AL
  1430.         JNE     PD
  1431.         MOV     AL,LASTPORTA[BP]
  1432. PD:     MOV     LASTPORTA[BP],AL
  1433. FDOWN:  XOR     AH,AH
  1434.         ADD     PERiOD[BP],AX
  1435.         MOV     CX,PERiOD[BP]
  1436.         JMP     PERNOP2
  1437. FINEPD: AND     AL,0FH
  1438.         MOV     LASTPORTA[BP],0
  1439.         MOV     COM1[BP],0
  1440.         JMP     FDOWN
  1441. EFINEPD:AND     AL,0FH
  1442.         SHR     AL,2
  1443.         MOV     LASTPORTA[BP],0
  1444.         MOV     COM1[BP],0
  1445.         JMP     FDOWN
  1446.  
  1447. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ COMMAND 6: PORTAMENTO UP ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  1448.  
  1449. PORTAUP:
  1450.         MOV     AL,OPE1[BP]
  1451.         MOV     BL,AL
  1452.         SHR     BL,4
  1453.         CMP     BL,0FH
  1454.         JE      FINEPU
  1455.         CMP     BL,0EH
  1456.         JE      EFINEPU
  1457.         OR      AL,AL
  1458.         JNE     PU
  1459.         MOV     AL,LASTPORTA[BP]
  1460. PU:     MOV     LASTPORTA[BP],AL
  1461. FUP:    XOR     AH,AH
  1462.         SUB     PERiOD[BP],AX
  1463.         MOV     CX,PERiOD[BP]
  1464.         JMP     PERNOP2
  1465. FINEPU: AND     AL,0FH
  1466.         MOV     LASTPORTA[BP],0
  1467.         MOV     COM1[BP],0
  1468.         JMP     FUP
  1469. EFINEPU:AND     AL,0FH
  1470.         SHR     AL,2
  1471.         MOV     LASTPORTA[BP],0
  1472.         MOV     COM1[BP],0
  1473.         JMP     FUP
  1474.  
  1475. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ COMMAND 7: TONE PORTAMENTO ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  1476.  
  1477. TONEPORTAMENTO:
  1478.         MOV     AL,OPE1[BP]
  1479.         XOR     AH,AH
  1480.         OR      AL,AL
  1481.         JE      TONEPORTNOCHANGE
  1482.         MOV     TONEPORTSPEED[BP],AX
  1483.         MOV     OPE1[BP],0
  1484. TONEPORTNOCHANGE:
  1485.         CMP     TARGETPERiOD[BP],0
  1486.         JNE     TPER
  1487.         RET
  1488. TPER:   MOV     BX,TONEPORTSPEED[BP]
  1489.         MOV     AX,PERiOD[BP]
  1490.         CMP     AX,TARGETPERiOD[BP]
  1491.         JNE     NMORG1
  1492.         RET
  1493. NMORG1: CMP     AX,TARGETPERiOD[BP]
  1494.         JA      DWNG1
  1495.         ADD     AX,BX
  1496.         CMP     AX,TARGETPERiOD[BP]
  1497.         JBE     NMG1
  1498.         MOV     AX,TARGETPERiOD[BP]
  1499. NMG1:   MOV     PERiOD[BP],AX
  1500.         JMP     PERNOP
  1501. DWNG1:  CMP     AX,BX
  1502.         JBE     DOG1
  1503.         SUB     AX,BX
  1504.         CMP     AX,TARGETPERiOD[BP]
  1505.         JNB     NMGG1
  1506. DOG1:   MOV     AX,TARGETPERiOD[BP]
  1507. NMGG1:  MOV     PERiOD[BP],AX
  1508.         JMP     PERNOP
  1509.  
  1510. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ COMMAND 8: VIBRATO ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  1511.  
  1512. ViBRATO:
  1513.         MOV     AL,OPE1[BP]
  1514.         OR      AL,AL
  1515.         JE      ViBRATO2
  1516.         MOV     BL,ViBRATOCMD[BP]
  1517.         AND     AL,0FH
  1518.         JE      ViBSKiP
  1519.         AND     BL,0F0H
  1520.         OR      BL,AL
  1521. ViBSKiP:
  1522.         MOV     AL,OPE1[BP]
  1523.         AND     AL,0F0H
  1524.         JE      ViBSKiP2
  1525.         AND     BL,0FH
  1526.         OR      BL,AL
  1527. ViBSKiP2:
  1528.         MOV     ViBRATOCMD[BP],BL
  1529. ViBRATO2:
  1530.         MOV     AL,ViBRATOPOS[BP]
  1531.         SHR     AL,2
  1532.         AND     AX,1FH
  1533.         MOV     BL,WAVECONTROL[BP]
  1534.         AND     BL,3
  1535.         JE      ViBSiNE
  1536.         SHL     AL,3
  1537.         CMP     BL,1
  1538.         JE      ViBRAMPDOWN
  1539.         MOV     BL,255
  1540.         JMP     ViBSET
  1541. ViBRAMPDOWN:
  1542.         CMP     BYTE PTR ViBRATOPOS[BP],0
  1543.         JNB     ViBRAMPDOWN2
  1544.         MOV     BL,255
  1545.         SUB     BL,AL
  1546.         JMP     ViBSET
  1547. ViBRAMPDOWN2:
  1548.         MOV     BL,AL
  1549.         JMP     ViBSET
  1550.  
  1551. ViBSiNE:MOV     BL,AL
  1552.         XOR     BH,BH
  1553.         MOV     BL,ViBRATOTABLE[BX]
  1554.  
  1555. ViBSET: MOV     AL,ViBRATOCMD[BP]
  1556.         AND     AL,0FH
  1557.         MUL     BL
  1558.         SHR     AX,7
  1559.         MOV     BX,AX
  1560.         MOV     AX,PERiOD[BP]
  1561.         CMP     BYTE PTR ViBRATOPOS[BP],0
  1562.         JB      ViBRATONEG
  1563.         ADD     AX,BX
  1564.         JMP     ViBRATO3
  1565. ViBRATONEG:
  1566.         SUB     AX,BX
  1567. ViBRATO3:
  1568.         MOV     CX,AX
  1569.         CALL    PERNOP2
  1570.         MOV     AL,ViBRATOCMD[BP]
  1571.         XOR     AH,AH
  1572.         SHR     AX,2
  1573.         AND     AX,3CH
  1574.         ADD     ViBRATOPOS[BP],AL
  1575.         RET
  1576.                          
  1577. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ COMMAND 10: ARPEGGIO ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  1578.  
  1579. ARPEGGIO:
  1580.         mov     cx,cx
  1581.     CMP    OPE1[BP],0
  1582.     JNE    GOARP
  1583.     RET
  1584. GOARP:
  1585.         MOV     AL,COUNTER
  1586.         XOR     AH,AH
  1587.         MOV     BL,3
  1588.         DIV     BL
  1589.         CMP     AH,1
  1590.         JE      ARPEGGIO1
  1591.         CMP     AH,2
  1592.         JE      ARPEGGIO2
  1593. ARPEGGIO0:
  1594.         MOV     AX,PERIOD[BP]
  1595.         JMP     ARPEGGIOSET
  1596. ARPEGGIO1:
  1597.         XOR     AH,AH
  1598.         MOV     AL,OPE1[BP]
  1599.         SHR     AL,4
  1600.         JMP     ARPEGGIOFIND
  1601. ARPEGGIO2:
  1602.         XOR     AH,AH
  1603.         MOV     AL,OPE1[BP]
  1604.         AND     AL,15
  1605. ARPEGGIOFIND:
  1606.         CBW
  1607.         SAL     AX,1
  1608.         MOV     BX,AX
  1609.         MOV     DX,PERIOD[BP]
  1610.         LEA     DI,PERIODTABLE2
  1611.         MOV     CX,35
  1612. ARPLOOP:
  1613.         MOV     AX,CS:[BX+DI]
  1614.         push    bx
  1615.         mov     bx,ax
  1616.         shr     bx,4
  1617.         add     ax,bx
  1618.         shr     bx,3
  1619.         add     ax,bx
  1620.         pop     bx
  1621.         CMP     DX,CS:[DI]
  1622.         JAE     ARPEGGIOSET
  1623.         ADD     DI,2
  1624.         LOOP    ARPLOOP
  1625.         RET
  1626. ARPEGGIOSET:
  1627.         MOV     CX,AX
  1628.         JMP     PERNOP2
  1629.  
  1630. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ COMMAND 11: VOLSLD+VIBRATO ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  1631.  
  1632. VOLSLiDEANDViBRATO:
  1633.         CALL    VOLSLiDE
  1634.         JMP     ViBRATO2
  1635.  
  1636. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ COMMAND 12: VOLSLD+TONEPORTA ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  1637.  
  1638. VOLSLiDEANDTONE:
  1639.         CALL    VOLSLiDE
  1640.         JMP     TONEPORTNOCHANGE
  1641.  
  1642. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ COMMAND 17: RETRIGGER NOTE ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  1643.  
  1644. RETRIGGERNOTE:
  1645.         ret
  1646.         MOV     BL,OPE1[BP]
  1647.         AND     BL,0FH
  1648.         JZ      RTNEND       
  1649.         MOV     AL,COUNTER
  1650.         XOR     AH,AH
  1651.         OR      AL,AL
  1652.         JNZ     RTNSKP
  1653.         MOV     CX,NOTE[BP]
  1654.         AND     CX,0FFFH
  1655.         JNZ     RTNSKP
  1656.         MOV     COUNTER,0
  1657. RTNSKP: DIV     BL
  1658.         XCHG    AL,AH
  1659.         OR      AL,AL
  1660.         JNZ     RTNEND
  1661. DORETRIG:
  1662.         MOV     SC_START[BP],0
  1663.         MOV     SC_START2[BP],0
  1664.         CALL    DOINS
  1665. RTNEND: RET
  1666.  
  1667. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ COMMAND 22: CHANGE GLOBAL VOLUME ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  1668.  
  1669. CHANGEGLVOLUME:
  1670.         MOV     AL,OPE1[BP]
  1671.         MOV     MASTERVOLUME,AL
  1672.         RET
  1673.  
  1674. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ COMMAND 24: SET DMP PAN ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  1675.  
  1676. DMPPAN: MOV     AL,OPE1[BP]
  1677.         SHR     AL,4
  1678.         MOV     SC_PAN[BP],AL
  1679.         RET
  1680.  
  1681. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  1682.  
  1683. DORAMP: PUSH    BX Si
  1684.         MOV     AH,0
  1685.         CMP     MASTERVOLUME,0
  1686.         JZ      @@ZEROVOL
  1687.         MUL     MASTERVOLUME
  1688.         iNC     AH
  1689. @@ZEROVOL:
  1690.         MOV     BL,AH
  1691.         XOR     BH,BH
  1692.         SHL     BX,1
  1693.         MOV     AX,[BX+MT_VOLTABLE]
  1694.         JMP     SLiDERAMP2
  1695. SLiDERAMP:
  1696.         PUSH    BX Si
  1697. SLiDERAMP2:
  1698.         MOV     Si,AX
  1699.         MOV     DX,[CS:U_COMMAND]
  1700.         MOV     AL,0DH
  1701.         OUT     DX,AL
  1702.         ADD     DL,2
  1703.         MOV     AL,3
  1704.         OUT     DX,AL
  1705.         SUB     DL,2
  1706.         MOV     AL,89H
  1707.         OUT     DX,AL
  1708.         iNC     DX
  1709.         iN      AX,DX
  1710.         PUSH    Si
  1711.         PUSH    AX
  1712.         SHR     AX,8
  1713.         SHR     Si,8
  1714.         CMP     AX,Si
  1715.         JZ      @@DONE2
  1716.         JB      @@OK
  1717.         XCHG    Si,AX
  1718. @@OK:   PUSH    AX
  1719.         MOV     DX,[CS:U_COMMAND]
  1720.         MOV     AL,7
  1721.         OUT     DX,AL
  1722.         ADD     DX,2
  1723.         POP     AX
  1724.         OUT     DX,AL
  1725.         MOV     DX,[CS:U_COMMAND]
  1726.         MOV     AL,8
  1727.         OUT     DX,AL
  1728.         ADD     DX,2
  1729.         MOV     AX,Si
  1730.         OUT     DX,AL
  1731.         MOV     DX,[CS:U_COMMAND]
  1732.         MOV     AL,6
  1733.         OUT     DX,AL
  1734.         ADD     DX,2
  1735.         MOV     AL,00111111B
  1736.         OUT     DX,AL
  1737.         MOV     BL,00000000B
  1738.         POP     AX
  1739.         POP     Si
  1740.         CMP     AX,Si
  1741.         JB      @@OK2
  1742.         OR      BL,01000000B
  1743. @@OK2:  MOV     DX,[CS:U_COMMAND]
  1744.         MOV     AL,0DH
  1745.         OUT     DX,AL
  1746.         ADD     DX,2
  1747.         MOV     AL,BL
  1748.         OUT     DX,AL
  1749.         JMP     @@DONE
  1750. @@DONE2:POP     AX AX
  1751. @@DONE: POP     Si BX
  1752.         RET
  1753.  
  1754. VOLEQU: PUSH    BX
  1755.         MOV     AH,0
  1756.         CMP     MASTERVOLUME,0
  1757.         JZ      @@ZEROVOL2
  1758.         MUL     MASTERVOLUME
  1759. @@ZEROVOL2:
  1760.         MOV     BL,AH
  1761.         XOR     BH,BH
  1762.         SHL     BX,1
  1763.         MOV     AX,[BX+MT_VOLTABLE]
  1764. @@SKiP: MOV     [BP+SC_VOL],AX
  1765.         POP     BX
  1766.         RET
  1767. DiViT:
  1768.         OR      BX,BX
  1769.         STC
  1770.         JZ      DiV1
  1771.         MOV     CX,AX
  1772.         MOV     AX,DX
  1773.         XOR     DX,DX
  1774.         DiV     BX
  1775.         XCHG    CX,AX
  1776.         DiV     BX
  1777.         XCHG    DX,CX
  1778.         CLC
  1779. DiV1:   RET
  1780.  
  1781. PERNOP: MOV     CX,[BP+PERiOD]    ; GET PERiOD VALUE
  1782. PERNOP2:MOV     AX,CX
  1783.         AND     AX,0FFFH
  1784.         OR      AX,AX
  1785.         JZ      @@OUTiT
  1786.         PUSH    DX BX AX
  1787.         MOV     BX,20
  1788.         MOV     DX,28
  1789.         MOV     AX,9E9AH
  1790.         CALL    DiViT
  1791.         POP     BX
  1792.         CALL    DiViT
  1793.         POP     BX DX
  1794. @@OUTiT:MOV     [BP+SC_NOTE],AX
  1795.         RET
  1796.  
  1797. GUSKUSS:
  1798.         MOV     CX,0
  1799. GK2:    CALL    GUSCHNK
  1800.         iNC     CX
  1801.         CMP     CX,31
  1802.         JNE     GK2
  1803.         RET
  1804.  
  1805. GUSCHNK:MOV     DX,CS:[U_BASE]       ;EGY CSATORNA KUSSOLTATASA
  1806.         ADD     DX,102H
  1807.         MOV     AL,CL
  1808.         OUT     DX,AL
  1809.         iNC     DX
  1810.         MOV     AL,80H
  1811.         OUT     DX,AL
  1812.         ADD     DX,2
  1813.         iN      AL,DX
  1814.         AND     AL,0DFH
  1815.         OR      AL,3
  1816.         MOV     AH,AL
  1817.         MOV     AL,0
  1818.         SUB     DX,2
  1819.         OUT     DX,AL
  1820.         ADD     DX,2
  1821.         MOV     AL,AH
  1822.         CALL    UDELAY
  1823.         SUB     DX,2
  1824.         MOV     AL,0
  1825.         OUT     DX,AL
  1826.         ADD     DX,2
  1827.         MOV     AL,AH
  1828.         OUT     DX,AL
  1829.         RET
  1830.  
  1831. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ EXTRA COMMANDS ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  1832.  
  1833. EXTRACOMMANDS:
  1834.         MOV     BL,OPE1[BP]
  1835.         MOV     AL,OPE1[BP]
  1836.         AND     AL,15
  1837.         SHR     BL,4
  1838.         CMP     BL,0
  1839.         JE      XFILTERONOFF
  1840.         CMP     BL,1
  1841.         JE      XSETGLISSCTRL
  1842.         CMP     BL,2
  1843.         JE      XFINETUNE
  1844.         CMP     BL,3
  1845.         JE      XSETVIBRATOCTRL
  1846.         CMP     BL,4
  1847.         JE      XSETTREMCTRL
  1848.         CMP     BL,8
  1849.         JE      XSETPAN
  1850.         CMP     BL,0AH
  1851.         JE      XOLDSTEREO
  1852.         CMP     BL,0BH
  1853.         JE      XJUMPLOOP
  1854.         CMP     BL,0CH
  1855.         JE      XNOTECUT
  1856.         CMP     BL,0DH
  1857.         JE      XNOTEDELAY
  1858.         CMP     BL,0EH
  1859.         JE      XPATTERNDELAY
  1860.         CMP     BL,0FH
  1861.         JE      XFUNKIT
  1862.         RET
  1863.  
  1864. XFILTERONOFF:   JMP     FILTERONOFF
  1865. XFINETUNE:      JMP     FINETUNE
  1866. XSETPAN:        JMP     SETPAN
  1867. XOLDSTEREO:     JMP     OLDSTEREO
  1868. XNOTECUT:       JMP     NOTECUT
  1869. XNOTEDELAY:     JMP     NOTEDELAY
  1870. XPATTERNDELAY:  JMP     PATTERNDELAY
  1871. XJUMPLOOP:      JMP     PATTERNLOOP
  1872. XSETGLISSCTRL:  JMP     SETGLISSCONTROL
  1873. XSETVIBRATOCTRL:JMP     SETVIBRATOCONTROL
  1874. XSETTREMCTRL:   JMP     SETTREMOLOCONTROL
  1875. XFUNKIT:        JMP     FUNKIT
  1876.  
  1877. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ SPECIAL COMMAND 0: SET FILTER ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  1878.  
  1879. FILTERONOFF:
  1880.         RET
  1881.  
  1882. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ SPECIAL COMMAND 1: GLISSANDO CONTROL ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  1883.  
  1884. SETGLISSCONTROL:
  1885.         MOV     AL,OPE1[BP]
  1886.         AND     AL,0FH
  1887.         AND     GLISSFUNK[BP],0F0H
  1888.         OR      GLISSFUNK[BP],AL
  1889.         RET
  1890.  
  1891. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ SPECIAL COMMAND 2: SET FINETUNE ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  1892.  
  1893. FINETUNE:
  1894.         RET
  1895.  
  1896. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ SPECIAL COMMAND 3: SET VIBRATO CONTROL ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  1897.  
  1898. SETVIBRATOCONTROL:
  1899.         MOV     AL,OPE1[BP]
  1900.         AND     AL,0FH
  1901.         AND     WAVECONTROL[BP],0F0H
  1902.         OR      WAVECONTROL[BP],AL
  1903.         RET
  1904.  
  1905. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ SPECIAL COMMAND 4: SET TREMOLO CONTROL ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  1906.  
  1907. SETTREMOLOCONTROL:
  1908.         MOV     AL,OPE1[BP]
  1909.         AND     AL,0FH
  1910.         SHL     AL,4
  1911.         AND     WAVECONTROL[BP],0FH
  1912.         OR      WAVECONTROL[BP],AL
  1913.         RET
  1914.  
  1915. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ SPECIAL COMMAND 8: SET PAN ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  1916.  
  1917. SETPAN: MOV     AL,OPE1[BP]
  1918.         AND     AL,15
  1919.         MOV     SC_PAN[BP],AL
  1920.         RET
  1921.  
  1922. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ SPECIAL COMMAND 10: OLD STEREO EFFECT ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  1923.  
  1924. OLDSTEREO:
  1925.         RET
  1926.  
  1927. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ SPECIAL COMMAND 11: PATTERN LOOP ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  1928.  
  1929. PATTERNLOOP:
  1930.         RET
  1931.  
  1932. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ SPECIAL COMMAND 12: NOTE CUT ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  1933.  
  1934. NOTECUT:MOV     AL,OPE1[BP]
  1935.         AND     AL,15
  1936.         CMP     AL,COUNTER
  1937.         JNZ     RETNC
  1938.         MOV     AX,0
  1939.         MOV     VOLL[BP],AL
  1940.         CALL    VOLEQU
  1941. RETNC:  RET
  1942.  
  1943. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ SPECIAL COMMAND 13: NOTE DELAY ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  1944.  
  1945. ;OLDSCN  DW      16 DUP (0)
  1946. ;FIRST   DB      1
  1947. ;
  1948. NOTEDELAY:ret
  1949. ;        CMP     FIRST,0
  1950. ;        JE      NOSAVE
  1951. ;        MOV     AX,SC_NOTE[BP]
  1952. ;        MOV     OLDSCN[BP],AX
  1953. ;NOSAVE: MOV     AL,OPE1[BP]
  1954. ;        AND     AL,0FH
  1955. ;        CMP     AL,COUNTER
  1956. ;        JNZ     RETND
  1957. ;        MOV     AX,NOTE[BP]
  1958. ;        OR      AX,AX
  1959. ;        JZ      RETND
  1960. ;        MOV     AX,OLDSCN[BP]
  1961. ;        MOV     SC_NOTE[BP],AX
  1962. ;        PLAYNOTE
  1963. ;        MOV     FIRST,1
  1964. ;DONE3:  RET
  1965. ;RETND:  MOV     DX,U_COMMAND
  1966. ;        MOV     AL,81H
  1967. ;        OUT     DX,AL
  1968. ;        iNC     DL
  1969. ;        iN      AX,DX
  1970. ;        CMP     AX,0
  1971. ;        JZ      DONE4
  1972. ;        DEC     DL
  1973. ;        MOV     AL,1
  1974. ;        OUT     DX,AL
  1975. ;        iNC     DL
  1976. ;        MOV     AX,0
  1977. ;        OUT     DX,AX
  1978. ;DONE4:  POP     AX
  1979. ;        JMP     DELYP
  1980. ;        RET
  1981.  
  1982. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ SPECIAL COMMAND 14: PATTERN DELAY ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  1983.  
  1984. PATTERNDELAY:
  1985.         CMP     COUNTER,0
  1986.         JNE     RETPD
  1987.         MOV     AL,OPE1[BP]
  1988.         AND     AL,0FH
  1989.         CMP     PATTDELAYTIME2,0
  1990.         JNE     RETPD
  1991.         INC     AL
  1992.         MOV     PATTDELAYTIME,AL
  1993. RETPD:  RET
  1994.  
  1995. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ SPECIAL COMMAND 15: FUNK REPEAT ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  1996.  
  1997. FUNKIT: RET
  1998.  
  1999. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ GUSPORT DETECT ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  2000.  
  2001. ; NO CARRY  - GUS AT U_BASE
  2002.  
  2003. DETECTGUS:
  2004.         MOV     CS:[U_BASE],210H
  2005. TESTPRT:CALL    GUSPROBE
  2006.         JNB     FOUNDP
  2007.         ADD     CS:[U_BASE],10H
  2008.         CMP     CS:[U_BASE],270H
  2009.         JB      TESTPRT
  2010.         STC
  2011.         RET
  2012. FOUNDP: CLC
  2013.         RET
  2014.  
  2015. DETECTGUS2:
  2016.         MOV     DI,210H
  2017.         MOV     CX,7
  2018. DEGUS2: MOV     DX,DI
  2019.         ADD     DI,10H
  2020.         ADD     DX,100H
  2021.         IN      AL,DX
  2022.         CMP     AL,2
  2023.         JE      DEGUS3
  2024.         LOOP    DEGUS2
  2025.         MOV     AX,0
  2026.         RET
  2027. DEGUS3: MOV     AX,DI
  2028.         SUB     AX,10H
  2029.         MOV     CS:[U_BASE],AX
  2030.         RET
  2031.  
  2032. GUSPEEK:PUSH    DX
  2033.         MOV     DX,CS:[U_BASE]
  2034.         ADD     DX,103H
  2035.         MOV     AL,43H
  2036.         OUT     DX,AL
  2037.         iNC     DX
  2038.         MOV     AX,CX
  2039.         OUT     DX,AX
  2040.         DEC     DX
  2041.         MOV     AL,44H
  2042.         OUT     DX,AL
  2043.         ADD     DX,2
  2044.         MOV     AL,BL
  2045.         OUT     DX,AL
  2046.         ADD     DX,2
  2047.         iN      AL,DX
  2048.         POP     DX
  2049.         RET
  2050.  
  2051. GUSPOKE:PUSH    DX AX
  2052.         MOV     DX,CS:[U_BASE]
  2053.         ADD     DX,103H
  2054.         MOV     AL,43H
  2055.         OUT     DX,AL
  2056.         iNC     DX
  2057.         MOV     AX,CX
  2058.         OUT     DX,AX
  2059.         DEC     DX
  2060.         MOV     AL,44H
  2061.         OUT     DX,AL
  2062.         ADD     DX,2
  2063.         MOV     AL,BL
  2064.         OUT     DX,AL
  2065.         ADD     DX,2
  2066.         POP     AX
  2067.         OUT     DX,AL
  2068.         POP     DX
  2069.         RET
  2070.  
  2071. GUSPROBE:
  2072.         MOV     DX,CS:[U_BASE]
  2073.         ADD     DX,0103H
  2074.         MOV     AL,4CH
  2075.         OUT     DX,AL
  2076.         ADD     DX,2
  2077.         MOV     AL,0
  2078.         OUT     DX,AL
  2079.         CALL    UDELAY
  2080.         CALL    UDELAY
  2081.         SUB     DX,2
  2082.         MOV     AL,4CH
  2083.         OUT     DX,AL
  2084.         ADD     DX,2
  2085.         MOV     AL,1
  2086.         OUT     DX,AL
  2087.         MOV     AX,0AAH
  2088.         MOV     BX,0
  2089.         MOV     CX,0
  2090.         CALL    GUSPOKE
  2091.         MOV     AX,055H
  2092.         MOV     BX,1
  2093.         CALL    GUSPOKE
  2094.         MOV     BX,0
  2095.         CALL    GUSPEEK
  2096.         PUSH    AX
  2097.         MOV     AX,0
  2098.         CALL    GUSPOKE
  2099.         SUB     DX,2
  2100.         MOV     AL,4CH
  2101.         OUT     DX,AL
  2102.         ADD     DX,2
  2103.         MOV     AL,0
  2104.         OUT     DX,AL
  2105.         POP     AX
  2106.         CMP     AL,0AAH
  2107.         JNZ     NOFOUND
  2108.         CLC
  2109.         RET
  2110. NOFOUND:STC
  2111.         RET
  2112.  
  2113. COUNTORDERS:
  2114.         MOV     CX,CX
  2115.         PUSHA
  2116.         MOV     CX,0
  2117.         MOV     SI,60H
  2118. CNTOR1: LODSB
  2119.         CMP     AL,255
  2120.         JE      CNTOR2
  2121.         INC     CX
  2122.         JMP     CNTOR1
  2123. CNTOR2: MOV     DS:[20H],CX     ; STORE THE CORRECT NUM. OF ORDERS
  2124.         POPA
  2125.         RET
  2126. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ LOADER ROUTiNES ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  2127.  
  2128. OPENFiLE:                       ; DS:DX FiLENAME
  2129.         PUSH    CX
  2130.         MOV     AL,0            ; READ/WRiTE FLAG
  2131.         MOV     AH,3DH
  2132.         iNT     21H
  2133.         JNC     NOERROR
  2134.         JMP     FiLEERROR
  2135. NOERROR:MOV     CS:HANDLE,AX
  2136.         POP     CX
  2137.         RET
  2138.  
  2139. CLOSEFiLE:
  2140.         MOV     BX,CS:HANDLE
  2141.         MOV     AH,3EH
  2142.         iNT     21H
  2143.         JNC     NCERROR
  2144.         JMP     FiLEERROR
  2145. NCERROR:RET
  2146.  
  2147. READFiLE:                       ; DS:DX = PUFFER
  2148.         PUSH    DS
  2149.         MOV     EAX,0
  2150.         MOV     BX,CS:HANDLE
  2151.         MOV     BP,CX
  2152.         SHR     ECX,16
  2153.         JZ      NINCS64K
  2154. REREAD: PUSH    CX
  2155.         MOV     CX,0FFF0H
  2156.         MOV     AX,3F00H        ; ECX - MENNYiT
  2157.         iNT     21H
  2158.         MOV     AX,DS
  2159.         ADD     AX,0FFFH
  2160.         MOV     DS,AX
  2161.         POP     CX
  2162.         LOOP    REREAD
  2163. NINCS64K:
  2164.         MOV     CX,BP
  2165.         MOV     AX,3F00H
  2166.         iNT     21H  
  2167.         POP     DS
  2168.         RET
  2169.  
  2170. LSEEK:  PUSHA                          ; ECX = OFFSET TO SEEK
  2171.         MOVZX   EDX,CX
  2172.         SHR     ECX,16
  2173.         MOV     AX,4200H
  2174.         MOV     BX,CS:HANDLE
  2175.         iNT     21H
  2176.         JNC     NSERROR
  2177.         JMP     FILEERROR
  2178. NSERROR:POPA
  2179.         RET
  2180.  
  2181. FiLEERROR:
  2182.         PUSH    AX
  2183.         MOV     AX,CS
  2184.         MOV     DS,AX
  2185.         POP     AX
  2186.         CALL    WHiCHERROR
  2187.         MOV     AH,9
  2188.         iNT     21H
  2189.         MOV     AX,4C00H
  2190.         iNT     21H
  2191. WHiCHERROR:
  2192.         CMP     AX,1
  2193.         JNE     FER2
  2194.         LEA     DX,FERR1
  2195.         RET
  2196. FER2:   CMP     AX,2
  2197.         JNE     FER3
  2198.         LEA     DX,FERR2
  2199.         RET
  2200. FER3:   CMP     AX,3
  2201.         JNE     FER4
  2202.         LEA     DX,FERR3
  2203.         RET
  2204. FER4:   CMP     AX,4
  2205.         JNE     FER5
  2206.         LEA     DX,FERR4
  2207.         RET
  2208. FER5:   CMP     AX,5
  2209.         JNE     FER6
  2210.         LEA     DX,FERR5
  2211.         RET
  2212. FER6:   CMP     AX,6
  2213.         JNE     FER7
  2214.         LEA     DX,FERR6
  2215.         RET
  2216. FER7:   CMP     AX,7
  2217.         JNE     FER8
  2218.         LEA     DX,FERR7
  2219.         RET
  2220. FER8:   CMP     AX,8
  2221.         JNE     FER9
  2222.         LEA     DX,FERR8
  2223.         RET
  2224. FER9:   LEA     DX,FERR9
  2225.         RET
  2226.  
  2227. ;▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ DATAS & MSGS ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
  2228.  
  2229. HANDLE  DW      0
  2230.  
  2231. FERR1   DB      'FUNCTiON NUMBER iNVALiD$'
  2232. FERR2   DB      'INVALID FILENAME SPECIFIED$'
  2233. FERR3   DB      'PATH NOT FOUND$'
  2234. FERR4   DB      'TOO MANY OPEN FiLES$'
  2235. FERR5   DB      'ACCES DENiED$'
  2236. FERR6   DB      'iNVALiD HANDLE$'
  2237. FERR7   DB      'MEMORY CONTROL BLOCK DESTROYED$'
  2238. FERR8   DB      'iNSUFFiCiENT MEMORY$'
  2239. FERR9   DB      'HULYE EGY HiBA$'
  2240.  
  2241. CODE    ENDS
  2242.         END
  2243.