;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
;³ Functions                                                                   ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ

                        Jumps
                        .386

include switch.inc
include network.inc

;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
;³ Externals                                                                   ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ

IF MEMORYDEBUG

Segment         StartUp BYTE Public 'Code'
EndS

Segment         InfoPage BYTE Public 'Code'
EndS

Segment         Glbl BYTE Public 'Code'
EndS

Segment         Help BYTE Public 'Code'
EndS

Segment         Error BYTE Public 'Code'
EndS

Segment         EMS BYTE Public 'Code'
EndS

Segment         KeyBoard BYTE Public 'Code'
EndS

Segment         InfoLine BYTE Public 'Code'
EndS

Segment         Main BYTE Public 'Code'
EndS

ENDIF

Segment         Pattern BYTE Public 'Code'
                Extrn   PatternDataArea:Word
EndS

Segment         Inst BYTE Public 'Code'
                Extrn   MaxNode:Word
EndS

Segment         Music BYTE Public 'Code'
                Extrn   SongDataArea:Word
                Extrn   MIDIDataArea:Word
EndS

Segment         Disk BYTE Public 'Code'
                Extrn   DiskDataArea:Word
EndS

Segment         Screen BYTE Public 'Code'
EndS

Segment         Object1 BYTE Public 'Data'
EndS

;-------------------------------------------------------------------------------

                Extrn   LastInstrument:Byte

                Extrn   D_GetLoadSampleVars:Far
                Extrn   D_ClearFileName:Far
                Extrn   D_SaveSong:Far
                Extrn   D_ResetTimer:Far

                Extrn   E_UnInitEMS:Far
                Extrn   E_GetFreeEMS:Far

                Extrn   Glbl_F2_2:Far
                Extrn   Glbl_F3:Far
                Extrn   Glbl_Ctrl_F3:Far
                Extrn   Glbl_Ctrl_F4:Far
                Extrn   Glbl_F4:Far
                Extrn   Glbl_F5:Far
                Extrn   Glbl_Ctrl_F5:Far
                Extrn   Glbl_F6:Far
                Extrn   PE_F7:Far
                Extrn   Glbl_Shift_F6:Far
                Extrn   Glbl_Shift_F9:Far
                Extrn   Glbl_F9:Far
                Extrn   Glbl_F10:Far
                Extrn   Glbl_F11_2:Far
                Extrn   Glbl_F12:Far

                Extrn   Glbl_GetHeaderMode:Far

                Extrn   H_Help:Far

                Extrn   I_GetInstrumentOffset:Far
                Extrn   I_GetSampleOffset:Far

                Extrn   I_DrawWaveForm:Far
                Extrn   I_MapEnvelope:Far
                Extrn   D_DrawWaveForm:Far

                Extrn   S_InitScreen:Far
                Extrn   S_Set80x25Mode:Far
                Extrn   S_SetPalette2:Far
                Extrn   S_RedefineCharacters:Far
                Extrn   S_UnInitScreen:Far
                Extrn   S_DrawBox:Far
                Extrn   S_UpdateScreen:Far
                Extrn   S_OverrideVGADetection:Far
                Extrn   S_SetDirectMode:Far
                Extrn   S_DrawString:Far
                Extrn   S_HiLight:Far
                Extrn   S_GetDestination:Far
                Extrn   S_SaveScreen:Far
                Extrn   S_RestoreScreen:Far


                Extrn   Music_GetSongSegment:Far
                Extrn   Music_InitMixTable:Far
                Extrn   Music_InitMuteTable:Far
                Extrn   Music_ClearAllInstruments:Far
                Extrn   Music_SetGlobalVolume:Far
                Extrn   Music_InitStereo:Far
                Extrn   Music_Stop:Far

                Extrn   Music_RegetLoopInformation:Far

                Extrn   Music_ReleaseAllSamples:Far     ; For New Song Function
                Extrn   Music_ReleaseAllPatterns:Far
                Extrn   Music_ClearAllInstruments:Far
                Extrn   Music_ClearAllSampleNames:Far
                Extrn   Music_GetFreeSoundCardMemory:Far
                Extrn   Music_SoundCardLoadAllSamples:Far
                Extrn   Music_ReinitSoundCard:Far
                Extrn   Music_TimeSong:Far

                Extrn   Glbl_DriverScreen:Far
                Extrn   Music_GetDriverVariable:Far
                Extrn   Music_SetDriverVariable:Far

                Extrn   M_Object1List:Far

                Extrn   Msg_ResetMessage:Far

                Extrn   O1_EmptyList:Far
                Extrn   O1_ThumbStringList:Far
                Extrn   O1_InitialiseInstrumentList:Far
                Extrn   O1_NewSongList:Far

                Extrn   O1_MainMenu:Far
                Extrn   O1_FileMenu:Far
                Extrn   O1_PlaybackMenu:Far
                Extrn   O1_SampleMenu:Far
                Extrn   O1_InstrumentMenu:Far

                Extrn   PE_ConvAX2Num:Far
                Extrn   PE_ResetOrderPattern:Far

                Extrn   DOSShell:Far
                Extrn   Quit:Far

                Extrn   MouseAddEvent:Far, AddMouseQueue:Far, MouseClearEvents:Far
                Extrn   SetKeyboardLock:Far, NewCharacterSet:Far
                Extrn   MouseRemoveEvents:Far, MouseRestoreEvents:Far
                Extrn   MultiChannelInfo:Byte

;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
;³ Globals                                                                     ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ

                Global  F_MainMenu:Far
                Global  F_FileMenu:Far
                Global  F_PlaybackMenu:Far
                Global  F_SampleMenu:Far
                Global  F_InstrumentMenu:Far

                Global  F_DrawHeader:Far

                Global  F_InstrumentButtonHandler:Far

                Global  F_NewSong:Far
                Global  F_DrawStringInput:Far
                Global  F_PreStringInput:Far
                Global  F_PostStringInput:Far
                Global  F_RedrawScreen:Far
                Global  F_Nothing:Far
                Global  F_DrawBoxObject:Far
                Global  F_DrawTextObject:Far
                Global  F_PostExitObject:Far
                Global  F_SetDirectMode:Far
                Global  F_CharacterDefinitions:Far
                Global  F_CallFarFunction:Far
                Global  F_CallFarPreFunction:Far
                Global  F_CallFarPostFunction:Far

                Global  F_DrawToggle:Far
                Global  F_PreToggle:Far
                Global  F_PostToggle:Far

                Global  F_Draw5Num:Far
                Global  F_Pre5Num:Far
                Global  F_Post5Num:Far

                Global  F_Draw3Num:Far
                Global  F_Pre3Num:Far
                Global  F_Post3Num:Far

                Global  F_DrawButtonObject:Far
                Global  F_PreButtonObject:Far
                Global  F_PostButtonObject:Far

                Global  F_Return0:Far
                Global  F_Return1:Far
                Global  F_Return64:Far
                Global  F_Return192:Far

                Global  F_DrawThumbBar:Far
                Global  F_DrawScalableThumbBar:Far
                Global  F_PreThumbBar:Far
                Global  F_PreScalableThumbBar:Far
                Global  F_PostThumbBar:Far
                Global  F_PostScalableThumbBar:Far

                Global  F_DrawInfoLine:Far

                Global  F_ShowChannels:Far
                Global  F_GotoEmptyList:Far
                Global  F_DrawSMCChannels:Far

                Global  F_SetControlInstrument:Far
                Global  F_SetControlSample:Far
                Global  F_ConfigButtonSetup:Far

                Global  F_SetStereo:Far
                Global  F_SetMono:Far
                Global  F_SetAmiga:Far
                Global  F_SetLinear:Far

                Global  F_Reset5NumInputPos:Far

                Global  AddressInput:Byte
                Global  ThumbStringEnter:Byte

                Global  F_MessageEditor:Far
                Global  F_Help:Far                      ; Main menu
                Global  F_ViewPattern:Far
                Global  F_ViewVariables:Far
                Global  F_ViewOrderPan:Far

                Global  F_FileLoad:Far
                Global  F_FileNew:Far
                Global  F_FileSaveCurrent:Far
                Global  F_FileSaveAs:Far
                Global  F_FileDOSShell:Far
                Global  F_FileQuit:Far

                Global  F_InfoPage:Far                  ; Playback menu
                Global  F_PlaySong:Far
                Global  F_PlayPattern:Far
                Global  F_PlayOrder:Far
                Global  F_Stop:Far
                Global  F_PlayMark:Far
                Global  F_DriverScreen:Far
                Global  F_ReinitSoundCard:Far
                Global  F_CalculateLength:Far

                Global  F_SampleList:Far
                Global  F_SampleLibrary:Far
                Global  F_ReloadGravis:Far

                Global  F_InstrumentList:Far
                Global  F_InstrumentLibrary:Far

IF MEMORYDEBUG

                Global  F_DrawDebug:Far
                Global  F_DebugUp:Far
                Global  F_DebugDown:Far
                Global  F_DebugPgUp:Far
                Global  F_DebugPgDn:Far
                Global  F_DebugStringInput:Far
                Public  F_PostDebug

ENDIF

                Public  F_ShowMIDIZxxInput
                Public  F_MIDI_Up
                Public  F_MIDI_Down
                Public  F_MIDI_PgUp, F_MIDI_PgDn

;ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ

Segment                 Functions BYTE Public 'Code' USE16
                        Assume CS:Functions, DS:Nothing

;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
;³ Variables                                                                   ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ

ButtonVariables         Label   Word
                        DW      220h                    ; Standard SB Configs
                        DW      7
                        DW      1
                        DW      1                       ; Clear patterns
                        DW      1                       ; Clear samples
                        DW      1                       ; Clear instruments
                        DW      1                       ; Clear order list

ButtonTypes             Label   Word
                        DW      Offset ButtonType0      ; Press/Release buttons
                        DW      Offset ButtonType1      ; Toggle Press/Release
                        DW      Offset ButtonType2      ; One of Selection

ButtonEffects           Label   Word
                        DW      Offset ButtonEffect0    ; Return value
                        DW      Offset ButtonEffect1    ; New object list
                        DW      Offset ButtonEffect2    ; Call function
                        DW      Offset ButtonEffect3    ; Set var at offset
                        DW      Offset ButtonEffect4    ; Jump to function
                        DW      Offset ButtonEffect5    ; Set var
                        DW      Offset ButtonEffect6    ; Jump to function

ButtonWidth     Label   Word
        DW      0, 0, 0, 0, 0, 0, 0, 0
        DW      7, 7, 7, 7, 7, 7, 7, 7
        DW      0, 0, 0, 0, 0, 0, 0, 0
        DW      7, 7, 7, 7, 0, 0, 0, 0

MouseEventData          DW      7 Dup (0), Functions

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

GetThumbValues          Label   Word
                        DW      Offset GetPanning
                        DW      Offset GetPEVariables
                        DW      Offset GetSampleVariables
                        DW      Offset GetMusicVariables
                        DW      Offset GetPanning               ; ChannelVol
                        DW      Offset GetLoadSampleVariables
                        DW      Offset GetInstVariables
                        DW      Offset GetScreenVariables
                        DW      Offset GetInstrumentVariables
                        DW      Offset GetDriverVariables

DrawThumbValues         Label   Word
                        DW      Offset DrawPanning
                        DW      Offset F_NothingNear
                        DW      Offset F_NothingNear
                        DW      Offset F_NothingNear
                        DW      Offset F_NothingNear
                        DW      Offset F_NothingNear
                        DW      Offset DrawMIDIChannel
                        DW      Offset F_NothingNear
                        DW      Offset F_NothingNear
                        DW      Offset F_NothingNear

PreThumbFuncs           Label   Word
                        DW      Offset HiLightPanning
                        DW      Offset GetPEVariables
                        DW      Offset GetSampleVariables
                        DW      Offset GetMusicVariables
                        DW      Offset GetPanning               ; Channelvol
                        DW      Offset GetLoadSampleVariables
                        DW      Offset GetInstVariables
                        DW      Offset GetScreenVariables
                        DW      Offset GetInstrumentVariables
                        DW      Offset GetDriverVariables

PostThumbFuncs          Label   Word
                        DW      Offset SetPanning
                        DW      Offset SetPEVariables
                        DW      Offset SetSampleVariables
                        DW      Offset SetMusicVariables
                        DW      Offset SetPanning
                        DW      Offset SetLoadSampleVariables
                        DW      Offset SetInstVariables         ; Inst
                        DW      Offset SetScreenVariables
                        DW      Offset SetInstrumentVariables   ; Inst segment
                        DW      Offset SetDriverVariables

PostThumbCheck          Label   Word
                        DW      Offset PanningKeys
                        DW      Offset F_NothingNear
                        DW      Offset F_NothingNear
                        DW      Offset F_NothingNear
                        DW      Offset F_NothingNear
                        DW      Offset F_NothingNear
                        DW      Offset FilterKeys
                        DW      Offset F_NothingNear
                        DW      Offset F_NothingNear
                        DW      Offset F_NothingNear

ThumbStringEnter        DB      0
                        DB      4 Dup (0)

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

; LastStringData          DD      0

StringInputOffset       Label   Word
                        DW      Offset GetSIODiskSegment
                        DW      Offset GetSampleString
                        DW      Offset GetSIOInstSegment
                        DW      Offset GetLoadSampleString
                        DW      Offset GetMusicSegmentString    ; Songsegment
                        DW      Offset GetPatternSegmentString
                        DW      Offset GetInstrumentString
                        DW      Offset GetMIDIString

PostStringInput         Label   Word
                        DW      Offset F_NothingNear
                        DW      Offset SetSampleString
                        DW      Offset F_NothingNear
                        DW      Offset F_NothingNear
                        DW      Offset SetMusicSegmentString    ; Songsegment
                        DW      Offset F_NothingNear
                        DW      Offset SetInstrumentString
                        DW      Offset F_NothingNear

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

GetToggleStatus         Label   Word
                        DW      Offset GetSampleToggle
                        DW      Offset GetPatternSegmentToggle
                        DW      Offset GetMusicSegmentToggle
                        DW      Offset GetLoadSampleToggle
                        DW      Offset GetInstrumentToggle

ToggleBit               Label   Word
                        DW      Offset SampleToggle
                        DW      Offset PatternSegmentToggle
                        DW      Offset MusicSegmentToggle
                        DW      Offset LoadSampleToggle
                        DW      Offset InstrumentToggle

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

TripleNumberPos         DW      0

Get3NumValues           Label   Word
                        DW      Offset GetInstrument3Num

Set3NumValues           Label   Word
                        DW      Offset SetInstrument3Num

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

NumberPos               DW      0

Get5NumValues           Label   Word
                        DW      Offset GetSample5Num
                        DW      Offset GetLoadSample5Num
                        Dw      Offset GetInst5Num

Set5NumValues           Label   Word
                        DW      Offset SetSample5Num
                        DW      Offset SetLoadSample5Num
                        DW      Offset SetInst5Num

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

HeaderMsg1              Label   Byte
IF SHOWVERSION
                        DB      0FFh, 9, ' ', "Impulse Tracker v2.14 Copyright (C) 1995-2000 Jeffrey Lim", 13
ELSE
                        DB      0FFh, 12, ' ', "Impulse Tracker Copyright (C) 1995-2000 Jeffrey Lim", 13
ENDIF
                        DB      0FFh, 9, ' ', 0FEh, 21h, 139, 0FFh, 25, 134, 138, 0FFh, 11, ' ', 139, 0FFh, 28, 134, 138, 13
                        DB      0FEh, 20h, "Song Name", 0FEh, 21h, 132, 0FEh, 5, 0FFh, 25, ' ', 0FEh, 23h, 131, 0FEh, 20h, 0

HeaderMsg2              DB      " Instrument"
                        DB      0FEh, 21h, 132, 0FEh, 7, "  :", 0FFh, 25, ' ', 0FEh, 23h, 131, 0

HeaderMsg3              DB      0FFh, 5, " Sample"
                        DB      0FEh, 21h, 132, 0FEh, 7, "  :", 0FFh, 25, ' ', 0FEh, 23h, 131, 0

HeaderMsg4              DB      "File Name", 0FEh, 21h, 132, 0FEh, 5, 0FFh, 18, ' ', 0FEh, 23h, 128, 0FFh, 6, 129, 136, 0FEh, 20h, "Speed/Tempo", 0FEh, 21h, 132, 0FEh, 5, "   ", 0FEh, 1, "/", 0FEh, 5, "   ", 0FEh, 23h, 128, 0FFh, 20, 129, 136, 13
                        DB      0FEh, 20h, 0FFh, 4, " Order", 0FEh, 21h, 132, 0FEh, 5, "   ", 0FEh, 1, "/", 0FEh, 5, "   ", 0FEh, 23h, 128, 0FFh, 10, 129, 136, 0FEh, 20h, 0FFh, 12, " Octave", 0FEh, 21h, 132, 0FEh, 5, " ", 0FEh, 23h, 128, 0FFh, 5, 129, 136, 13
                        DB      0FEh, 20h, "  Pattern", 0FEh, 21h, 132, 0FEh, 5, "   ", 0FEh, 1, "/", 0FEh, 5, "   ", 0FEh, 23h, 131, 0FEh, 20h,     " F1...Help       F9.....Load ", 0FEh, 23h, 137, 129, 136, 0FEh, 20h, 0FFh, 11, " FreeMem ", 0FDh, "Dk ", 13
                        DB      0FEh, 20h, 0FFh, 6, " Row", 0FEh, 21h, 132, 0FEh, 5, "   ", 0FEh, 1, "/", 0FEh, 5, "   ", 0FEh, 23h, 131, 0FEh, 20h, " ESC..Main Menu  F5/F8..Play / Stop", 0FFh, 8, " FreeEMS ", 0FDh, "Dk", 13
                        DB      0FEh, 23h, 0FFh, 9, ' ', 137, 0FFh, 7, 129, 136
                        DB      0

ChannelMsg              DB      "Channel "
ChannelNumbers          DB      "xx", 0

HexNumbers              DB      "0123456789ABCDEF"
SurroundMessage         DB      "Surround", 0
MutedMessage            DB      "  Muted", 0
ForwardMsg              DB      "Forwards", 0
PingPongMsg             DB      "Ping Pong", 0
ZxxString               DB      "Z", 0FDh, "X", 0
NumberStorage           DW      0, 0, 0, 0, 0, 0, 0, 0, 0
PitchMessage            DB      "Pitch", 0
FilterMessage           DB      "Filter", 0

;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
;³ Functions                                                                   ³
;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ

Proc            F_Nothing Far

                Xor     AX, AX
                Ret

EndP            F_Nothing

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            F_InstrumentButtonHandler Far

                Test    AX, AX
                JZ      F_InstrumentButtonHandler1

                NetworkSendInstrument

F_InstrumentButtonHandler1:
                Push    DS
                Call    I_GetInstrumentOffset   ; Returns DS:BX
                Push    DS
                Pop     ES
                Mov     DI, BX
                Pop     DS

                Add     DI, [SI+24]
                Ret

EndP            F_InstrumentButtonHandler

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            F_NothingNear

                Xor     AX, AX
                Ret

EndP            F_NothingNear

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            F_CallFarPreFunction Far

                Call    DWord Ptr [SI+6]

                Ret

EndP            F_CallFarPreFunction

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            F_CallFarPostFunction Far

                Mov     SI, [BX]

                Call    DWord Ptr [SI+10]

                Ret

EndP            F_CallFarPostFunction

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            F_CallFarFunction Far

                Call DWord Ptr [SI+2]

                Ret

EndP            F_CallFarFunction

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            F_DrawBoxObject Far

                LodsW
                Xor     AH, AH
                LodsB
                Push    AX
                LodsB
                Push    AX
                LodsB
                Push    AX
                LodsB
                Push    AX
                LodsB
                Push    AX
                Call    S_DrawBox
                Add     SP, 10

                Ret

EndP            F_DrawBoxObject

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            F_DrawTextObject Far

                LodsW

                Mov     BX, 3
                Xor     CX, CX                  ; CX = string length count
                Xor     DX, DX

F_DrawTextObject1:
                Mov     AL, [SI+BX]
                Inc     BX
                Cmp     AL, 0
                JE      F_DrawTextObject2

                Cmp     AL, 0FDh
                JNE     F_DrawTextObject1
                Inc     CX
                Cmp     Byte Ptr [SI+BX], 'L'
                JNE     F_DrawTextObject1
                Inc     CX
                Jmp     F_DrawTextObject1

F_DrawTextObject2:
                JCXZ    F_DrawTextObject3
                Push    Word Ptr [SI+BX]
                Add     BX, 2
                Inc     DX
                Dec     CX
                Jmp     F_DrawTextObject2

F_DrawTextObject3:
                Mov     AL, 80
                Mul     Byte Ptr [SI+1]
                Add     AL, [SI]
                AdC     AH, 0
                Add     AX, AX
                Mov     DI, AX
                Mov     AH, [SI+2]
                Add     SI, 3
                Call    S_DrawString

                Add     DX, DX
                Add     SP, DX

                Ret

EndP            F_DrawTextObject

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            F_PostExitObject Far

                Xor     AX, AX
                Test    CH, 1
                JNZ     F_PostExitObject1

                Mov     SI, [BX]
                Mov     DX, [SI+2]
                Mov     AX, 4                   ; Exit from MainProc

F_PostExitObject1:
                Ret

EndP            F_PostExitObject

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            F_SetDirectMode Far

                LodsW
                LodsB
                Call    S_SetDirectMode

                Ret

EndP            F_SetDirectMode

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            F_CharacterDefinitions Far

                LodsW
                LodsW
                Mov     BX, [SI]
                Add     SI, 2
                Call    S_RedefineCharacters

                Ret

EndP            F_CharacterDefinitions

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            MouseButtonPress Far            ; Given CX, DX = coords
                                                ; Given AX = Object number
                                                ; DS:SI points to mouse obj
                Mov     CX, 11Ch
                Xor     DX, DX
                Call    AddMouseQueue

                Mov     Word Ptr [SI+8], 1108h
                Mov     Word Ptr [SI+12], Offset MouseButtonRelease

                Mov     AL, 2
                Call    SetKeyboardLock

                Xor     AX, AX
                Ret

EndP            MouseButtonPress

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            MouseButtonRelease Far

                Mov     CX, 01Ch
                Xor     DX, DX
                Call    AddMouseQueue

                Mov     Word Ptr [SI+8], 102h
                Mov     Word Ptr [SI+12], Offset MouseButtonPress

                Xor     AX, AX
                Call    SetKeyboardLock

                Ret

EndP            MouseButtonRelease

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            F_DrawButtonObject Far  ; AX = object number
                                        ; SI = object

                Mov     [CS:MouseEventData+10], AX      ; Store object number

                Cmp     Word Ptr [SI+16], 5
                JB      F_DrawButtonObject1

                Xor     AX, AX
                Call    DWord Ptr [SI+18]
                Mov     AX, [SI+22]
                ScasB
;                Cmp     [ES:DI], AL

                SetE    [SI+33]

F_DrawButtonObject1:
                Mov     BX, [SI+32]
                And     BX, 0FFh
                Add     SI, 28
                Add     BX, BX
                Mov     DX, [CS:ButtonWidth+BX]

                Xor     AH, AH
                LodsB
                LEA     CX, [EAX*8+EDX]
                Mov     [CS:MouseEventData+0], CX
                Push    AX

                LodsB
                LEA     CX, [EAX*8+EDX]
                Mov     [CS:MouseEventData+2], CX
                Push    AX

                Sub     DX, 7

                LodsB
                Mov     CX, AX
                ShL     CX, 3
                Sub     CX, DX
                Mov     [CS:MouseEventData+4], CX
                Push    AX

                LodsB
                Mov     CX, AX
                ShL     CX, 3
                Sub     CX, DX
                Mov     [CS:MouseEventData+6], CX
                Push    AX

                LodsB                                   ; Base Style
                Mov     BL, [SI]                        ; Up/Down
                And     BL, 1
                Mov     [SI], BL
                Add     AL, BL
                Push    AX
                Call    S_DrawBox
                Add     SP, 10

                Inc     SI

                Mov     AL, 80
                Mul     Byte Ptr [SI-5]
                Add     AL, [SI-6]
                AdC     AH, 0
                Add     AX, AX
                Add     AX, 162
                Mov     DI, AX
                Mov     AH, 20h

                Call    S_DrawString

                Push    CS
                Pop     DS
                Mov     SI, Offset MouseEventData
                Mov     [MouseEventData+8], 102h   ; Left mouse button pressed
                Mov     [MouseEventData+12], Offset MouseButtonPress
                Call    MouseAddEvent

                Ret

EndP            F_DrawButtonObject

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            F_PreButtonObject Far

                Add     SI, 28
                Xor     AH, AH
                LodsB
                Push    AX
                LodsB
                Push    AX
                LodsB
                Push    AX
                LodsB
                Push    AX
                LodsB                                   ; Base Style
                Mov     BL, [SI]                        ; Up/Down
                And     BL, 1
                Add     AL, BL
                Push    AX
                Call    S_DrawBox
                Add     SP, 10

                Inc     SI

                Mov     AL, 80
                Mul     Byte Ptr [SI-5]
                Add     AL, [SI-6]
                AdC     AH, 0
                Add     AX, AX
                Add     AX, 162
                Mov     DI, AX
                Mov     AH, 23h

                Call    S_DrawString

                Ret

EndP            F_PreButtonObject

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            F_PostButtonObject Far

                Mov     SI, [BX]
                Push    SI
                Push    DI
                Push    BX
                Push    CX
                Push    DX

                Add     SI, 28
                Mov     AL, 80
                Mul     Byte Ptr [SI+1]
                Add     AL, [SI]
                AdC     AH, 0
                Add     AX, AX
                Add     AX, 162
                Mov     DI, AX
                Mov     AL, 20h
                Mov     CL, [SI+2]
                Sub     CL, [SI]
                Dec     CL
                Xor     CH, CH
                Call    S_HiLight

                Pop     DX
                Pop     CX
                Pop     BX
                Pop     DI
                Pop     SI

                Test    CH, 80h
                JNZ     F_PostButtonNoMIDI

                Mov     AL, [SI+33]
                Cmp     CL, 1Ch
                JE      F_PostButtonObject6             ; Enter

                Test    AL, 2
                JNZ     F_PostButtonObject7

                Cmp     CX, 1C8h                        ; Up pressed
                JE      F_PostButtonObject1

                Cmp     CX, 1D0h
                JE      F_PostButtonObject2             ; Down

                Cmp     CX, 1CBh
                JE      F_PostButtonObject3             ; Left

                Cmp     CX, 1CDh
                JE      F_PostButtonObject4             ; Right

                Cmp     CX, 10Fh                        ; Tab
                JE      F_PostButtonObject4

;                Test    CL, CL
;                JZ      F_PostButtonNOMIDI

                Cmp     DX, 0F00h                       ; Shift tab
                JE      F_PostButtonObject3

F_PostButtonNOMIDI:
                Xor     AX, AX
                Ret

F_PostButtonObject7:
                Test    AL, 4
                JZ      F_PostButtonObject8
                Test    CH, 1
                JZ      F_PostButtonObject8

                And     AX, 1
                Xor     AL, 1
                Mov     [SI+33], AL

F_PostButtonObject8:
                Mov     AX, 2
                Ret

F_PostButtonObject4:
                LodsW

F_PostButtonObject3:
                LodsW

F_PostButtonObject2:
                LodsW

F_PostButtonObject1:
                LodsW

                LodsW
                Cmp     AX, 0FFFFh
                JNE     F_PostButtonObject5

                Xor     AX, AX
                Ret

F_PostButtonObject5:
                Mov     [DI], AX
                Mov     AX, 2
                Ret

F_PostButtonObject6:                            ; Enter pressed
                Push    BX

                Mov     BX, [SI+10]
                Add     BX, BX
                Jmp     [CS:ButtonTypes+BX]

EndP            F_PostButtonObject

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            ButtonType0 Far

                Pop     BX

                Test    CH, 1
                JZ      ButtonType0_1

                Or      Byte Ptr [SI+33], 7

ButtonType0_2:
                Mov     AX, 2
                Ret

ButtonType0_1:
                Test    AL, 1
                JNZ     ButtonType0_4

                Test    AL, 2
                JZ      ButtonType0_2

ButtonType0_4:
                Mov     Byte Ptr [SI+33], 0

                Jmp     ButtonEffect

EndP            ButtonType0

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            ButtonType1 Far

                Pop     BX

                And     CH, CH
                JZ      ButtonType1_2

                Test    AL, 2
                JNZ     ButtonType1_1

                Xor     Byte Ptr [SI+33], 7

ButtonType1_1:
                Mov     AX, 2
                Ret

ButtonType1_2:
                And     Byte Ptr [SI+33], 1

                Jmp     ButtonEffect

EndP            ButtonType1

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            ButtonEffect Far

                Mov     BX, [SI+16]
                Add     BX, BX
                Jmp     [CS:ButtonEffects+BX]

EndP            ButtonEffect

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            ButtonType2 Far

                Pop     BX

                And     CH, CH
                JZ      ButtonEffect

                Test    AL, 2
                JZ      ButtonType2_1

                Mov     AX, 2
                Ret

ButtonType2_1:
                Add     SI, 12
                LodsW
                Mov     CX, AX
                LodsW
                Mov     DX, AX
                Add     DX, DX
                Add     DI, 6
                Add     DX, DI
                Add     CX, CX
                Add     DI, CX

                Xor     AX, AX

ButtonType2_2:
                Mov     SI, [DI]
                Mov     [SI+33], AL

                ScasW
;                Add     DI, 2
                Cmp     DI, DX
                JBE     ButtonType2_2

                Mov     SI, [BX]
                Mov     Byte Ptr [SI+33], 1

                Mov     AX, 1
                Ret

EndP            ButtonType2

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            ButtonEffect0 Far

                Mov     DX, [SI+18]
                Mov     AX, 4
                Ret

EndP            ButtonEffect0

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            ButtonEffect1 Far

                Mov     CX, [SI+20]
                Mov     DX, [SI+18]
                Mov     AX, 5
                Mov     SI, 1
                Ret

EndP            ButtonEffect1

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            ButtonEffect2 Far

                Push    DS
                Push    SI

                Mov     AL, [SI+33]
                Call    DWord Ptr [SI+18]

                Pop     SI
                Pop     DS

                Mov     AX, 1

                Ret

EndP            ButtonEffect2

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            ButtonEffect3 Far

                Mov     BX, [SI+18]             ; Var number
                Mov     AX, [SI+20]
                Add     BX, BX
                Mov     [CS:ButtonVariables+BX], AX

                Mov     AX, 1
                Ret

EndP            ButtonEffect3

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            ButtonEffect4 Far

                Jmp     DWord Ptr [SI+18]

EndP            ButtonEffect4

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            ButtonEffect5 Far

                Mov     AX, 1
                Call    DWord Ptr [SI+18]
                Mov     AX, [SI+22]

                StosB
;                Mov     [ES:DI], AL

                Mov     AX, 1
                Ret

EndP            ButtonEffect5

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            ButtonEffect6 Far

                Jmp    DWord Ptr [SI+24]

EndP            ButtonEffect6

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            GetPanning              ; DI = channel no.

                Push    DS

                Call    Music_GetSongSegment
                Mov     DS, AX

                Mov     DL, [DI+64]
                Xor     DH, DH

                Pop     DS

                Ret

EndP            GetPanning

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            GetPEVariables

                Push    DS

                Mov     DX, Pattern
                Mov     DS, DX
;                Call    PE_GetPatternSegment
                Mov     DL, [DI]
                Xor     DH, DH

                Pop     DS
                Ret

EndP            GetPEVariables

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            GetScreenVariables

                Push    DS

                Mov     DX, Screen
                Mov     DS, DX
                Mov     DL, [DI]
                Xor     DH, DH

                Pop     DS
                Ret

EndP            GetScreenVariables

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            SetScreenVariables

                Push    DS
                Push    AX

                Mov     AX, Screen
                Mov     DS, AX
                Pop     AX

                Mov     [DI], AL
                Call    S_SetPalette2

                Pop     DS
                Ret

EndP            SetScreenVariables

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            SetPanning

                Push    DS

                Push    AX
                Call    Music_GetSongSegment
                Mov     DS, AX
                Pop     AX
                Add     DI, 64

                Mov     [DI], AL

IF NETWORKENABLED
                Mov     CX, 1
                Mov     DX, DI
                Call    Network_SendSongDataInformation
ENDIF

                Pop     DS
                Ret

EndP            SetPanning

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            SetPEVariables

                Push    DS

                Push    AX
                Mov     AX, Pattern
                Mov     DS, AX
;                Call    PE_GetPatternSegment
                Pop     AX

                Mov     [DI], AL

                Pop     DS
                Ret

EndP            SetPEVariables

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            GetInstVariables

                Push    DS
                Push    AX
                Push    BX

                Call    I_GetInstrumentOffset

                Mov     DX, [BX+DI]
                Cmp     DI, 19h
                JNE     GetInstVariables1

                And     DX, 7Fh

GetInstVariables1:

; If DI = 3Ah or 3Bh, the XOR top bit.
                Cmp     DI, 3Ah
                JB      GetInstVariables4
                Cmp     DI, 3Bh
                JA      GetInstVariables4

                Xor     DL, 80h
                Jmp     GetInstVariables3

GetInstVariables4:

                Cmp     DI, 14h
                JE      GetInstVariables2
                Xor     DH, DH
                Cmp     DI, 3Dh
                JAE     GetInstVariables3
                Cmp     DI, 16h
                JNE     GetInstVariables2

GetInstVariables3:
                MovSX   DX, DL

GetInstVariables2:
                Pop     BX
                Pop     AX
                Pop     DS

                Ret

EndP            GetInstVariables
                Assume DS:Nothing

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            GetSampleVariables

                Push    DS
                Push    AX
                Push    BX

                Call    I_GetSampleOffset

                Mov     DL, [BX+DI]
                Xor     DH, DH
                Cmp     DI, 2Fh
                JNE     GetSampleVariables1

                And     DL, 7Fh

GetSampleVariables1:
                Pop     BX
                Pop     AX
                Pop     DS

                Ret

EndP            GetSampleVariables
                Assume DS:Nothing

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            GetMusicVariables

                Push    DS

                Call    Music_GetSongSegment
                Mov     DS, AX
                Xor     DX, DX
                Mov     DL, [DI]

                Pop     DS

                Ret

EndP            GetMusicVariables

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            GetInstrumentVariables

                Push    DS

                Mov     AX, Inst
                Mov     DS, AX
                Mov     DX, [DI]

                Pop     DS

                Ret

EndP            GetInstrumentVariables

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            GetDriverVariables

                Call    Music_GetDriverVariable
                Mov     DX, AX
                Ret

EndP            GetDriverVariables

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            SetDriverVariables

                Call    Music_SetDriverVariable
                Ret

EndP            SetDriverVariables

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            GetLoadSampleVariables

                Push    DS
                Push    SI
                Push    BX

                Call    D_GetLoadSampleVars
                Mov     BX, SI

                Mov     DL, [BX+DI]
                Xor     DH, DH

                Pop     BX
                Pop     SI
                Pop     DS

                Ret

EndP            GetLoadSampleVariables

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            SetInstVariables

                Push    DS
                Push    BX
                Push    AX

                Call    I_GetInstrumentOffset

                Pop     AX

IF FILTERENVELOPES
                Cmp     DI, 3Ah
                JB      SetInstVariables3
                Cmp     DI, 3Bh
                JA      SetInstVariables3

                Xor     AL, 80h
ELSE
                And     Word Ptr [BX+3Ah], 7F7Fh
ENDIF

SetInstVariables3:
                Mov     [BX+DI], AL
                Cmp     DI, 14h
                JNE     SetInstVariables1

SetInstVariables2:
                Mov     [BX+DI], AX

SetInstVariables1:
                NetworkSendInstrument

                Pop     BX
                Pop     DS

                Ret

EndP            SetInstVariables
                Assume DS:Nothing

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            SetSampleVariables

                Push    DS
                Push    BX
                Push    AX

                Call    I_GetSampleOffset

                Pop     AX
                Cmp     DI, 2Fh
                JNE     SetSampleVariables1

                Or      AL, 80h         ; Turn on.

SetSampleVariables1:
                Mov     [BX+DI], AL

                Pop     BX
                Pop     DS

                NetworkSendSample

                Ret

EndP            SetSampleVariables
                Assume DS:Nothing

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            SetMusicVariables

                Push    DS
                Push    AX

                Call    Music_GetSongSegment
                Mov     DS, AX

                Pop     AX
                Mov     [DI], AL

IF NETWORKENABLED
                Mov     CX, 1
                Mov     DX, DI
                Call    Network_SendSongDataInformation
ENDIF

                Cmp     DI, 31h
                JNE     SetMusicVariables1

                Call    Music_InitMixTable
                Jmp     SetMusicVariablesEnd

SetMusicVariables1:
                Cmp     DI, 30h
                JNE     SetMusicVariables3

                Call    Music_SetGlobalVolume

SetMusicVariables3:

SetMusicVariablesEnd:
                Pop     DS

                Ret

EndP            SetMusicVariables

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            SetInstrumentVariables

                Push    DS
                Push    AX

                Mov     AX, Inst
                Mov     DS, AX

                Pop     AX
                Mov     [DI], AX

                Pop     DS

                Ret

EndP            SetInstrumentVariables

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            SetLoadSampleVariables

                Push    DS
                Push    SI
                Push    BX

                Call    D_GetLoadSampleVars
                Mov     BX, SI

                Mov     [BX+DI], AL

                Pop     BX
                Pop     SI
                Pop     DS

                Ret

EndP            SetLoadSampleVariables

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            MousePressThumbBar Far

                Mov     DX, CX
                Mov     CX, 8010h
                Call    AddMouseQueue

                Mov     Word Ptr [SI+8], 1109h  ; move or release
                Mov     Word Ptr [SI+12], Offset MouseHeldThumbBar

                Mov     AL, 1
                Call    SetKeyboardLock

                Xor     AX, AX

                Ret

EndP            MousePressThumbBar

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            MouseHeldThumbBar Far

                Test    BH, 8
                JNZ     MouseHeldThumbBar2

MouseHeldThumbBar1:
                Mov     DX, CX
                Mov     CX, 8010h
                Call    AddMouseQueue
                Ret

MouseHeldThumbBar2:
                Mov     CX, 8001h               ; Redraw screen
                Call    AddMouseQueue

;                Mov     Word Ptr [SI+8], 102h
;                Mov     Word Ptr [SI+12], Offset MousePressThumbBar

                Xor     AX, AX
                Call    SetKeyboardLock

                Ret

EndP            MouseHeldThumbBar

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            F_DrawThumbBar Far

                Mov     [CS:MouseEventData+10], AX      ; Store object number

                Call    S_GetDestination

                Mov     BX, [SI+8]
                Mov     DI, [SI+10]
                Add     BX, BX
                Call    [CS:GetThumbValues+BX]  ; DX returns thumbbar value

                Mov     AL, 80
                Mul     Byte Ptr [SI+3]
                Add     AL, [SI+2]
                AdC     AH, 0
                Add     AX, AX
                Mov     DI, AX          ; ES:DI points to area...

                Cmp     DX, [SI+6]
                JG      F_DrawThumbBar2
                Cmp     DX, [SI+4]
                JL      F_DrawThumbBar2

                Mov     CX, [SI+6]
                Sub     CX, [SI+4]
                Add     CX, 15
                ShR     CX, 3
                Mov     BX, CX
                Mov     AX, 300h
;                Xor     AX, AX

                Push    DI
                Push    DI

                Rep     StosW

                Pop     DI
                Push    BX
                Push    DI
                Mov     BX, DX          ; DX = value to show.
                Sub     BX, [SI+4]
                Inc     BX
                Mov     AX, BX
                ShR     BX, 3
                Add     BX, BX
                Add     DI, BX
                And     AX, 7
                Add     AX, 155
                Mov     AH, 2
                StosW

                Cmp     AL, 157
                JBE     F_DrawThumbBar1
                Add     AL, 5
                StosW

F_DrawThumbBar1:
                Pop     DI
                Pop     BX
                LEA     DI, [EDI+EBX*2+2]
                Mov     CH, 21h
                Mov     AX, DX
                Call    PE_ConvAX2Num

                Pop     DI

F_DrawThumbBar2:
                Mov     BX, [SI+8]
                Add     BX, BX
                Call    [CS:DrawThumbValues+BX]  ; DX returns pan value

                Mov     CX, [SI+6]
                Sub     CX, [SI+4]
                Add     CX, 15
                ShR     CX, 3

                Xor     AH, AH
                Mov     AL, [SI+2]
                ShL     AX, 3
                Mov     [CS:MouseEventData+0], AX
                ShL     CX, 3
                Add     AX, CX
                Dec     AX
                Mov     [CS:MouseEventData+4], AX

                Xor     AH, AH
                Mov     AL, [SI+3]
                ShL     AX, 3
                Mov     [CS:MouseEventData+2], AX
                Add     AX, 7
                Mov     [CS:MouseEventData+6], AX

                Push    CS
                Pop     DS
                        Assume DS:Functions
                Mov     SI, Offset MouseEventData
                Mov     Word Ptr [SI+8], 102h
                Mov     Word Ptr [SI+12], Offset MousePressThumbBar
                Call    MouseAddEvent

                Ret

EndP            F_DrawThumbBar
                Assume DS:Nothing

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            F_DrawScalableThumbBar Far

                Mov     [CS:MouseEventData+10], AX      ; Store object number

                Call    S_GetDestination

                Mov     BX, [SI+8]
                Mov     DI, [SI+10]
                Add     BX, BX
                Call    [CS:GetThumbValues+BX]  ; DX returns thumbbar value

                Mov     AL, 80
                Mul     Byte Ptr [SI+3]
                Add     AL, [SI+2]
                AdC     AH, 0
                Add     AX, AX
                Mov     DI, AX          ; ES:DI points to area...

                Cmp     DX, [SI+6]
                JG      F_DrawScalableThumbBar2
                Cmp     DX, [SI+4]
                JL      F_DrawScalableThumbBar2

                Push    DI
                Push    DI

                Mov     AX, 300h
                Mov     CX, [SI+24]     ; Display length
                Inc     CX
                Rep     StosW

        ; Volume bar position = Value*Width / (MaxVal-MinVal)

                Pop     DI
                Push    DI

                Push    DX

                Mov     AX, [SI+24]
                ShL     AX, 3
                Sub     DX, [SI+4]
                Mul     DX
                Mov     CX, [SI+6]
                Sub     CX, [SI+4]
                Div     CX

                Inc     AX
                Mov     BX, AX
                ShR     BX, 3
                Add     BX, BX
                Add     DI, BX
                And     AX, 7
                Add     AX, 155
                Mov     AH, 2
                StosW

                Cmp     AL, 157
                JBE     F_DrawScalableThumbBar1
                Add     AL, 5
                StosW

F_DrawScalableThumbBar1:
                Pop     DX

                Pop     DI

                Mov     AX, [SI+24]
                LEA     DI, [EDI+EAX*2+4]
                Mov     CH, 21h
                Mov     AX, DX
                Call    PE_ConvAX2Num

                Pop     DI

F_DrawScalableThumbBar2:
                Mov     BX, [SI+8]
                Add     BX, BX
                Call    [CS:DrawThumbValues+BX]  ; DX returns pan value

                Xor     AH, AH
                Mov     AL, [SI+2]
                Mov     CX, AX
                ShL     AX, 3
                Mov     [CS:MouseEventData+0], AX
                Mov     CX, [SI+24]
                Inc     CX
                ShL     CX, 3
                Add     AX, CX
                Dec     AX
                Mov     [CS:MouseEventData+4], AX

                Xor     AH, AH
                Mov     AL, [SI+3]
                ShL     AX, 3
                Mov     [CS:MouseEventData+2], AX
                Add     AX, 7
                Mov     [CS:MouseEventData+6], AX

                Push    CS
                Pop     DS
                        Assume DS:Functions
                Mov     SI, Offset MouseEventData
                Mov     Word Ptr [SI+8], 102h
                Mov     Word Ptr [SI+12], Offset MousePressThumbBar
                Call    MouseAddEvent

                Ret

EndP            F_DrawScalableThumbBar
                Assume DS:Nothing

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            HiLightPanning

                Mov     AL, 80
                Mul     Byte Ptr [SI+3]
                Add     AL, [SI+2]
                AdC     AH, 0
                Sub     AX, 11
                Add     AX, AX
                Mov     DI, AX

                Mov     AL, 23h
                Mov     CX, 10
                Call    S_HiLight

                Ret

EndP            HiLightPanning

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            F_PreThumbBar Far

                Call    S_GetDestination

                Mov     BX, [SI+8]
                Mov     DI, [SI+10]
                Add     BX, BX
                Call    [CS:GetThumbValues+BX]  ; DX returns thumbbar value

                Mov     AL, 80
                Mul     Byte Ptr [SI+3]
                Add     AL, [SI+2]
                AdC     AH, 0
                Add     AX, AX
                Mov     DI, AX          ; ES:DI points to area...

                Cmp     DX, [SI+6]
                JG      F_PreThumbBar2
                Cmp     DX, [SI+4]
                JL      F_PreThumbBar2

                Mov     CX, [SI+6]
                Sub     CX, [SI+4]
                Add     CX, 15
                ShR     CX, 3
                Mov     BX, CX
                Mov     AX, 300h
;                Xor     AX, AX

                Push    DI
                Push    DI

                Rep     StosW

                Pop     DI
                Push    BX
                Push    DI
                Mov     BX, DX          ; DX = value to show.
                Sub     BX, [SI+4]
                Inc     BX
                Mov     AX, BX
                ShR     BX, 3
                Add     BX, BX
                Add     DI, BX
                And     AX, 7
                Add     AX, 155
                Mov     AH, 3
                StosW

                Cmp     AL, 157
                JBE     F_PreThumbBar1
                Add     AL, 5
                StosW

F_PreThumbBar1:
                Pop     DI
                Pop     BX
                LEA     DI, [EDI+EBX*2+2]
                Mov     CH, 21h
                Mov     AX, DX
                Call    PE_ConvAX2Num

                Pop     DI

F_PreThumbBar2:
                Mov     BX, [SI+8]
                Add     BX, BX
                Call    [CS:DrawThumbValues+BX]  ; DX returns pan value

;                Ret

                Call    S_GetDestination

                Mov     BX, [SI+8]
                Mov     DI, [SI+10]
                Add     BX, BX
                Call    [CS:PreThumbFuncs+BX]  ; DX returns pan value

                Mov     AL, 80
                Mul     Byte Ptr [SI+3]
                Add     AL, [SI+2]
                AdC     AH, 0
                Add     AX, AX
                Mov     DI, AX          ; ES:DI points to area...

F_PreThumbBar3:
                Mov     CX, [SI+6]
                Sub     CX, [SI+4]
                Add     CX, 15
                ShR     CX, 3
                Mov     AL, 3
                Call    S_HiLight
                Ret

EndP            F_PreThumbBar

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            F_PreScalableThumbBar Far

                Call    S_GetDestination

                Mov     BX, [SI+8]
                Mov     DI, [SI+10]
                Add     BX, BX
                Call    [CS:GetThumbValues+BX]  ; DX returns thumbbar value

                Mov     AL, 80
                Mul     Byte Ptr [SI+3]
                Add     AL, [SI+2]
                AdC     AH, 0
                Add     AX, AX
                Mov     DI, AX          ; ES:DI points to area...

                Cmp     DX, [SI+6]
                JG      F_PreScalableThumbBar2
                Cmp     DX, [SI+4]
                JL      F_PreScalableThumbBar2

                Push    DI
                Push    DI

                Mov     AX, 300h
                Mov     CX, [SI+24]     ; Display length
                Inc     CX
                Rep     StosW

        ; Volume bar position = Value*Width / (MaxVal-MinVal)

                Pop     DI
                Push    DI

                Push    DX

                Mov     AX, [SI+24]
                ShL     AX, 3
                Sub     DX, [SI+4]
                Mul     DX
                Mov     CX, [SI+6]
                Sub     CX, [SI+4]
                Div     CX

                Inc     AX
                Mov     BX, AX
                ShR     BX, 3
                Add     BX, BX
                Add     DI, BX
                And     AX, 7
                Add     AX, 155
                Mov     AH, 2
                StosW

                Cmp     AL, 157
                JBE     F_PreScalableThumbBar1
                Add     AL, 5
                StosW

F_PreScalableThumbBar1:
                Pop     DX

                Pop     DI

                Mov     AX, [SI+24]
                LEA     DI, [EDI+EAX*2+4]
                Mov     CH, 21h
                Mov     AX, DX
                Call    PE_ConvAX2Num

                Pop     DI

F_PreScalableThumbBar2:
                Mov     BX, [SI+8]
                Add     BX, BX
                Call    [CS:DrawThumbValues+BX]  ; DX returns pan value

;                Ret

                Call    S_GetDestination

                Mov     BX, [SI+8]
                Mov     DI, [SI+10]
                Add     BX, BX
                Call    [CS:PreThumbFuncs+BX]  ; DX returns pan value

                Mov     AL, 80
                Mul     Byte Ptr [SI+3]
                Add     AL, [SI+2]
                AdC     AH, 0
                Add     AX, AX
                Mov     DI, AX          ; ES:DI points to area...

F_PreScalableThumbBar3:
                Mov     CX, [SI+24]
                Inc     CX
                Mov     AL, 3
                Call    S_HiLight
                Ret

EndP            F_PreScalableThumbBar

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            F_PostScalableThumbBar Far

                Cmp     CX, 8010h
                JE      F_PostScalableThumbBarMouse1

                Jmp     F_PostThumbBar

F_PostScalableThumbBarMouse1:                   ; DX = pixel...
                Mov     SI, [BX]

                Xor     AX, AX
                Mov     AL, [SI+2]      ; Left point
                ShL     AX, 3           ; Left pixel
                Add     AX, 4

                Sub     DX, AX
                JNC     F_PostScalableThumbBarMouse2

                Xor     DX, DX

F_PostScalableThumbBarMouse2:   ; Value = (Pixel / NumPixels)*(Max-Min)+Min
                Mov     CX, [SI+24]     ; Length
                ShL     CX, 3           ; AX = MaxPixel
                Cmp     DX, CX
                JB      F_PostScalableThumbBarMouse3

                Mov     DX, CX

F_PostScalableThumbBarMouse3:
                Mov     AX, [SI+6]
                Sub     AX, [SI+4]
                Mul     DX
                Div     CX

                ShR     CX, 1
                Cmp     CX, DX
                AdC     AX, 0

                Add     AX, [SI+4]

                Mov     BX, [SI+8]
                Mov     DI, [SI+10]
                Add     BX, BX
                Call    [CS:PostThumbFuncs+BX]

                Mov     AX, 2
                Ret

EndP            F_PostScalableThumbBar

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            F_PostThumbBar Far

                Mov     SI, [BX]

                Push    ES
                Push    DI

                Call    S_GetDestination

                Mov     BX, [SI+8]
                Mov     DI, [SI+10]
                Add     BX, BX
                Push    BX
                Push    DX
                Call    [CS:GetThumbValues+BX]  ; AX contains value.
                Mov     AX, DX
                Pop     DX
                Pop     BX

                Pop     DI
                Pop     ES

                Push    AX
                Push    BX

                Call    [CS:PostThumbCheck+BX]
                Test    AX, AX
                JNZ     F_PostThumbBar23

                Pop     BX
                Pop     AX

                Cmp     CX, 8010h
                JE      F_PostThumbBarMouse1

                Cmp     CX, 8001h
                JE      F_PostThumbBarMouseRedrawScreen

                Cmp     CX, 1CBh
                JE      F_PostThumbBar2

                Cmp     CX, 1CDh
                JE      F_PostThumbBar4

                Cmp     CX, 1C7h
                JE      F_PostThumbBar10

                Cmp     CX, 1CFh
                JE      F_PostThumbBar11

                Cmp     CX, 1C8h
                JE      F_PostThumbBar5

                Cmp     CX, 1D0h
                JE      F_PostThumbBar6

                Cmp     CX, 10Fh
                JE      F_PostThumbBar7

                Cmp     CX, 1C9h
                JE      F_PostThumbBar21

                Cmp     CX, 1D1h
                JE      F_PostThumbBar22

                Test    CL, CL
                JZ      F_PostThumbBar20

                Cmp     DX, 0F00h
                JE      F_PostThumbBar8

                Cmp     DX, '0'
                JB      F_PostThumbBar50
                Cmp     DX, '9'
                JA      F_PostThumbBar50

                Jmp     F_PostThumbBar30

F_PostThumbBar50:
                Test    CX, 600h
                JNZ     F_PostThumbBar17

                Test    CX, 1800h
                JNZ     F_PostThumbBar16

F_PostThumbBar20:
                Xor     AX, AX
                Ret

F_PostThumbBar23:
                Pop     BX
                Pop     AX

F_PostThumbBarMouseRedrawScreen:
                Mov     AX, 1
                Ret

F_PostThumbBar16:
                Mov     DI, CX
                And     DI, 1FFh
                Cmp     DI, 1CBh
                JE      F_PostThumbBar14

                Cmp     DI, 1CDh
                JE      F_PostThumbBar12

                Jmp     F_PostThumbBar20

F_PostThumbBar17:
                Mov     DI, CX
                And     DI, 1FFh
                Cmp     DI, 1CBh
                JE      F_PostThumbBar18

                Cmp     DI, 1CDh
                JE      F_PostThumbBar19

                Jmp     F_PostThumbBar20

F_PostThumbBar2:
                Dec     AX
                Cmp     AX, [SI+6]
                JG      F_PostThumbBar9
                Cmp     Ax, [SI+4]
                JL      F_PostThumbBar9

F_PostThumbBar15:
                Cmp     AX, [SI+6]
                JG      F_PostThumbBarMin
                Cmp     AX, [SI+4]
                JGE     F_PostThumbBar3

F_PostThumbBarMin:
                Mov     AX, [SI+4]

F_PostThumbBar3:
                Mov     DI, [SI+10]
                Call    [CS:PostThumbFuncs+BX]

F_PostThumbBar9:
                Mov     AX, 1
                Ret

F_PostThumbBar10:
                Mov     AX, [SI+4]
                Jmp     F_PostThumbBar3

F_PostThumbBar11:
                Mov     AX, [SI+6]
                Jmp     F_PostThumbBar3

F_PostThumbBar4:
                Inc     AX
                Cmp     AX, [SI+4]
                JL      F_PostThumbBar9

                Cmp     AX, [SI+6]
                JG      F_PostThumbBar9

F_PostThumbBar13:
                Cmp     AX, [SI+4]
                JL      F_PostThumbBarMax
                Cmp     AX, [SI+6]
                JLE     F_PostThumbBar3

F_PostThumbBarMax:
                Mov     AX, [SI+6]
                Jmp     F_PostThumbBar3

F_PostThumbBar12:
                Add     AX, 2
                Jmp     F_PostThumbBar13

F_PostThumbBar14:
                Sub     AX, 2
                Jmp     F_PostThumbBar15

F_PostThumbBar18:
                Sub     AX, 4
                Jmp     F_PostThumbBar15

F_PostThumbBar19:
                Add     AX, 4
                Jmp     F_PostThumbBar13

F_PostThumbBar22:
                LodsW

F_PostThumbBar21:
                LodsW

F_PostThumbBar8:
                LodsW

F_PostThumbBar7:
                LodsW

F_PostThumbBar6:
                LodsW

F_PostThumbBar5:
                Add     SI, 12
                LodsW
                Cmp     AX, 0FFFFh
                JE      F_PostThumbBar20

                Mov     [DI], AX
                Jmp     F_PostThumbBar9

F_PostThumbBarMouse1:                   ; DX = pixel...
                Xor     AX, AX
                Mov     AL, [SI+2]      ; Left point
                ShL     AX, 3           ; Left pixel
                Sub     DX, AX
                Sub     DX, 4
                Mov     AX, [SI+4]
                Add     AX, DX

                Cmp     AX, [SI+4]
                JG      F_PostThumbBarMouse2

                Mov     AX, [SI+4]
                Jmp     F_PostThumbBarMouse3

F_PostThumbBarMouse2:
                Cmp     AX, [SI+6]
                JL      F_PostThumbBarMouse3

                Mov     AX, [SI+6]

F_PostThumbBarMouse3:
                Mov     BX, [SI+8]
                Mov     DI, [SI+10]
                Add     BX, BX
                Call    [CS:PostThumbFuncs+BX]

                Mov     AX, 2
                Ret

F_PostThumbBar30:
                Push    DS
                Push    SI

                Call    S_SaveScreen

                Mov     DI, Offset ThumbStringEnter
                Push    CS
                Pop     ES
                Mov     AL, DL
                StosB

                Xor     AL, AL
                Mov     CX, 4
                Rep     StosB

                Mov     DI, Offset O1_ThumbStringList
                Mov     CX, 3
                Call    M_Object1List

                Call    S_RestoreScreen

                Pop     SI
                Pop     DS

                And     DX, DX
                JZ      F_PostThumbBar31

                                        ; Now get value...
                Xor     CX, CX
                Mov     DI, Offset ThumbStringEnter

F_PostThumbBar32:
                Mov     AL, [CS:DI]
                And     AL, AL
                JZ      F_PostThumbBar33

                Inc     DI

                Push    AX
                Mov     AX, 10
                Mul     CX
                Mov     CX, AX
                Pop     AX

                Cmp     AL, '0'
                JB      F_PostThumbBar31
                Cmp     AL, '9'
                JA      F_PostThumbBar31

                Sub     AL, '0'
                Xor     AH, AH
                Add     CX, AX
                Jmp     F_PostThumbBar32

F_PostThumbBar33:                               ; now save value.
                Cmp     DI, Offset ThumbStringEnter
                JE      F_PostThumbBar31

                Mov     AX, CX

                Cmp     AX, [SI+4]
                JL      F_PostThumbBar31
                Cmp     AX, [SI+6]
                JG      F_PostThumbBar31

                Mov     BX, [SI+8]
                Mov     DI, [SI+10]
                Add     BX, BX
                Call    [CS:PostThumbFuncs+BX]

F_PostThumbBar31:
                Mov     AX, 1
                Ret

EndP            F_PostThumbBar

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            F_DrawInfoLine Far

                Push    ES
                LodsW
                Push    SI
                Xor     DX, DX

F_DrawInfoLine1:
                LodsB
                Inc     DX
                And     AL, AL
                JNZ     F_DrawInfoLine1

                Dec     DX
                Pop     SI                      ; DX contains length of string
                Call    S_GetDestination

                Mov     DI, (1+11*80)*2
                Mov     BX, 78
                Mov     CX, BX
                Cmp     Byte Ptr [SI], 0
                JE      F_DrawInfoLine3

                Sub     CX, DX
                ShR     CX, 1
                Sub     BX, CX
                Sub     BX, DX
                Sub     BX, 2

                Mov     AX, 219Ah
                Rep     StosW

                Mov     AX, 2020h
                StosW

F_DrawInfoLine2:
                LodsB
                StosW
                Dec     DX
                JNZ     F_DrawInfoLine2

                Mov     AX, 2020h
                StosW

                Mov     CX, BX

F_DrawInfoLine3:
                Mov     AX, 219Ah
                Rep     StosW

                Pop     ES
                Ret

EndP            F_DrawInfoLine

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            F_ShowChannels Far

                Push    DS

                Push    CS
                Pop     DS
                        Assume DS:Functions

                Mov     DI, (20+15*80)*2
                Mov     CX, 32
                Mov     AX, 3130h
                Mov     Word Ptr ChannelNumbers, AX
                Mov     AH, 20h
                Call    F_ShowChannel1

                Mov     DI, (54+15*80)*2
                Mov     CX, 32
                Call    F_ShowChannel1

                Pop     DS
                        Assume DS:Nothing
                Ret

EndP            F_ShowChannels

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            F_ShowChannel1

                        Assume DS:Functions

F_ShowChannel1_1:
                Mov     SI, Offset ChannelMsg
                Call    S_DrawString

                Inc     Byte Ptr [ChannelNumbers+1]
                Cmp     Byte Ptr [ChannelNumbers+1], '9'
                JBE     F_ShowChannel1_2

                Inc     Byte Ptr [ChannelNumbers]
                Mov     Byte Ptr [ChannelNumbers+1], '0'

F_ShowChannel1_2:
                Add     DI, 140
                Loop    F_ShowChannel1_1

                        Assume DS:Nothing

                Ret

EndP            F_ShowChannel1

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            F_RedrawScreen Far

                Mov     AX, 1
                Ret

EndP            F_RedrawScreen

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            F_Return0 Far           ; ESC pressed on opening scrn

                Xor     DX, DX
                Mov     AX, 4
                Ret

EndP            F_Return0

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            F_Return64 Far

                Mov     DX, 64
                Mov     AX, 4
                Ret

EndP            F_Return64

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            F_Return192 Far

                Mov     DX, 192
                Mov     AX, 4
                Ret

EndP            F_Return192

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            PanningKeys

                Push    AX
                Mov     AX, DX
                Cmp     AX, 'a'
                JB      PanningKeys1

                Cmp     AX, 'z'
                JA      PanningKeys3

                Sub     AX, 32

PanningKeys1:
                Cmp     AL, 'L'
                JE      PanningKeysLeft
                Cmp     AL, 'R'
                JE      PanningKeysRight
                Cmp     AL, 'M'
                JE      PanningKeysMiddle
                Cmp     AL, 'S'
                JE      PanningKeysSurround
                Cmp     AL, ' '
                JE      PanningKeysSpace

PanningKeys3:
                Pop     AX
                Xor     AX, AX
                Ret

PanningKeysLeft:
                Xor     AX, AX
                Jmp     PanningKeys2

PanningKeysRight:
                Mov     AX, 64
                Jmp     PanningKeys2

PanningKeysMiddle:
                Mov     AX, 32
                Jmp     PanningKeys2

PanningKeysSurround:
                Mov     AX, 100

PanningKeys2:
                Mov     DI, [SI+10]
                Call    SetPanning
                Pop     AX

                Mov     AX, 1
                Ret

PanningKeysSpace:
                Pop     AX
                Xor     AL, 128
                Push    AX

                Mov     BX, [ES:DI]
                Cmp     BX, 74
                JAE     PanningKeys2

                Inc     Word Ptr [ES:DI]

                Jmp     PanningKeys2

EndP            PanningKeys

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            FilterKeys

                Push    DI
                Mov     DI, [SI+10]

                Cmp     DI, 3Ah
                JB      FilterKeys1
                Cmp     DI, 3Bh
                JA      FilterKeys1

                Cmp     DX, ' '
                JNE     FilterKeys1

                Xor     AL, 80h
                Call    SetInstVariables

                Mov     AX, 1
                Jmp     FilterKeysEnd

FilterKeys1:
                Xor     AX, AX
FilterKeysEnd:
                Pop     DI
                Ret

EndP            FilterKeys

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            DrawPanning

                Push    DS
                Push    SI

                Push    CS
                Pop     DS

                Test    DL, 128
                JZ      DrawPanning2

                Mov     SI, Offset MutedMessage
                Mov     AH, 5
                Call    S_DrawString

                Jmp     DrawPanning1

DrawPanning2:
                Cmp     DX, 100
                JNE     DrawPanning1

                Mov     SI, Offset SurroundMessage
                Mov     AH, 5
                Call    S_DrawString

DrawPanning1:
                Pop     SI
                Pop     DS
                Ret

EndP            DrawPanning

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            DrawMIDIChannel

                Mov     AX, [SI+0Ah]
                Cmp     AX, 3Fh
                JA      DrawMIDIChannel2
                Cmp     AX, 3Ah
                JB      DrawMIDIChannel2

                Cmp     AX, 3Ch
                JNE     DrawMIDIChannel4

DrawMIDIChannel1:
                Cmp     DL, 17
                JNE     DrawMIDIChannel5

                Add     DI, 22
                Mov     AX, 200h+'M'
                StosW
                Mov     AL, 'a'
                StosW
                Mov     AL, 'p'
                StosW
                StosW
                Mov     AL, 'e'
                StosW
                Mov     AL, 'd'
                StosW

DrawMIDIChannel5:
                Test    DL, DL
                JZ      DrawMIDIChannel3
                Jmp     DrawMIDIChannel2

DrawMIDIChannel4:
                Test    DX, DX
                JNS     DrawMIDIChannel2

DrawMIDIChannel3:
                Mov     AX, 200h+'O'
                StosW
                Mov     AL, 'f'
                StosW
                StosW
                Jmp     DrawMIDIChannel2

DrawMIDIChannel2:
                Ret

EndP            DrawMIDIChannel

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            F_Return1 Far

                Mov     DX, 1
                Mov     AX, 4
                Ret

EndP            F_Return1

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            GetSIOInstSegment

                Mov     SI, Inst
                Mov     DS, SI
                Mov     SI, CX

                Ret

EndP            GetSIOInstSegment

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            GetSIODiskSegment

                Mov     SI, Disk
                Mov     DS, SI
                Mov     SI, CX

                Ret

EndP            GetSIODiskSegment

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            GetLoadSampleString             ; Returns DS:SI

                Call    D_GetLoadSampleVars     ; Gets SI = currentsample offset
                                                ; DS = DiskDataArea
                Add     SI, CX

                Ret

EndP            GetLoadSampleString

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            GetMusicSegmentString

                Call    Music_GetSongSegment
                Mov     DS, AX

                Mov     SI, CX

                Ret

EndP            GetMusicSegmentString

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            SetMusicSegmentString

IF NETWORKENABLED
                Mov     CX, 26
                Mov     DX, 4
                Call    Network_SendSongDataInformation
ENDIF
                Ret

EndP            SetMusicSegmentString

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            GetPatternSegmentString

                Push    CS
                Pop     DS

                Mov     SI, CX

                Ret

EndP            GetPatternSegmentString

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            GetSampleString

                Call    I_GetSampleOffset
                Mov     SI, BX
                Add     SI, CX

                Ret

EndP            GetSampleString

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            SetSampleString

                NetworkSendSample

                Ret

EndP            SetSampleString

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            GetInstrumentString

                Call    I_GetInstrumentOffset
                Mov     SI, BX
                Add     SI, CX

                Ret

EndP            GetInstrumentString

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            SetInstrumentString

                NetworkSendInstrument
                Ret

EndP            SetInstrumentString

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

TopMIDIMacro    DW      80h

Proc            GetMIDIString           ; CX = select2

                Push    Music
                Pop     DS
                        Assume DS:Music

                Mov     DS, MIDIDataArea
                        Assume DS:Nothing

                Mov     SI, CX
                Test    CX, CX
                JNS     GetMIDIString1

                Mov     CX, CS:TopMIDIMacro
                Sub     SI, 8000h+80h*20h
                ShL     CX, 5
                Add     SI, CX

GetMIDIString1:
                Ret

EndP            GetMIDIString

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            MouseSelectString Far

                Mov     CX, 8010h
                Xor     DX, DX
                Call    AddMouseQueue

                Xor     AX, AX

                Ret

EndP            MouseSelectString

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

PostStringFunction      DW      0

Proc            F_GetStringInputOffset

                Mov     BX, [SI+4]
                Mov     CX, [SI+6]

                Mov     [CS:PostStringFunction], Offset F_NothingNear

                Cmp     BX, 10h
                JA      F_GetStringInputOffset1

                Add     BX, BX
                Push    AX

                Mov     AX, [CS:PostStringInput+BX]
                Mov     PostStringFunction, AX

                Pop     AX
                Call    [CS:StringInputOffset+BX]       ; DS:SI points to string
                Ret

F_GetStringInputOffset1:
                Mov     DS, BX
                Mov     SI, CX
                Ret

EndP            F_GetStringInputOffset

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            F_DrawStringInput Far

                Mov     [CS:MouseEventData+10], AX      ; Store object number

                Push    DS
                Push    SI

                Mov     AL, 80
                Mul     Byte Ptr [SI+3]
                Add     AL, [SI+2]
                AdC     AH, 0
                Add     AX, AX
                Mov     DI, AX
                Call    S_GetDestination

                Call    F_GetStringInputOffset

                Mov     AH, 2h

F_DrawStringInput1:
                LodsB
                Test    AL, AL
                JZ      F_DrawStringInput2
                Cmp     AL, 226
                JB      F_DrawStringInput3

                Mov     AL, ' '

F_DrawStringInput3:

                StosW
                Jmp     F_DrawStringInput1

F_DrawStringInput2:
                Pop     SI
                Pop     DS

                Xor     AH, AH
                Mov     AL, [SI+2]      ; XValue
                Mov     CX, AX
                ShL     CX, 3
                Mov     [CS:MouseEventData+0], CX

                Add     AL, [SI+8]
                Mov     CX, AX
                ShL     CX, 3
                Dec     CX
                Mov     [CS:MouseEventData+4], CX

                Mov     AL, [SI+3]
                ShL     AX, 3
                Mov     [CS:MouseEventData+2], AX
                Add     AX, 7
                Mov     [CS:MouseEventData+6], AX

                Push    CS
                Pop     DS
                        Assume DS:Functions

                Mov     SI, Offset MouseEventData
                Mov     [MouseEventData+8], 102h
                Mov     [MouseEventData+12], Offset MouseSelectString

                Call    MouseAddEvent

                Ret

EndP            F_DrawStringInput
                Assume DS:Nothing

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            F_PreStringInput Far

                Mov     AL, 80
                Mul     Byte Ptr [SI+3]
                Add     AL, [SI+2]
                AdC     AH, 0
                Add     AX, AX
                Mov     DI, AX
                Call    S_GetDestination

                Call    F_GetStringInputOffset

F_PreStringInput1:
                LodsB
                And     AL, AL
                JZ      F_PreStringInput2
                ScasW
;                Add     DI, 2
                Jmp     F_PreStringInput1

F_PreStringInput2:
                Inc     DI
                Mov     AL, 30h
                StosB
                Ret

EndP            F_PreStringInput

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            F_PostStringInput Far

                Test    CL, CL
                JZ      F_PostStringInput9

                Mov     SI, [BX]

                Cmp     CX, 8010h
                JE      F_PostStringInput5

                Cmp     CX, 1C8h
                JNE     F_PostStringInput1

                Mov     AX, [SI+14]
                Jmp     F_PostStringInput4

F_PostStringInput1:
                Cmp     CX, 1D0h
                JNE     F_PostStringInput2

                Mov     AX, [SI+16]
                Jmp     F_PostStringInput4

F_PostStringInput2:
                Cmp     CX, 10Fh        ; Tab
                JNE     F_PostStringInput3

                Mov     AX, [SI+18]
                Jmp     F_PostStringInput4

F_PostStringInput3:
                Cmp     DX, 0F00h
                JNE     F_PostStringInput6

                Mov     AX, [SI+20]

F_PostStringInput4:
                Cmp     AX, 0FFFFh
                JE      F_PostStringInput12

;                Mov     Word Ptr CS:LastStringData, 0
;                Mov     Word Ptr CS:LastStringData+2, 0

                Mov     [DI], AX

F_PostStringInput5:
                Mov     AX, 1
                Ret

F_PostStringInput6:
                Cmp     CX, 11Ch                        ; Enter
                JNE     F_PostStringInput7

                Cmp     Word Ptr [SI+10], 0
                JNE     F_PostStringInput13

                Cmp     Word Ptr [SI+12], 0
                JE      F_PostStringInput12

F_PostStringInput13:
                Jmp     DWord Ptr [SI+10]

F_PostStringInput7:
                Cmp     CX, 10Eh                ; Backspace
                JNE     F_PostStringInput8

                Call    F_GetStringInputOffset

                Cmp     Byte Ptr [DS:SI], 0
                JE      F_PostStringBackSpace2

F_PostStringBackSpace1:
                LodsB
                And     AL, AL
                JNZ     F_PostStringBackSpace1

                Mov     [SI-2], AL

F_PostStringBackSpace2:
                Jmp     F_PostStringInput11

F_PostStringInput8:
                Cmp     DX, 127                         ; Ctrl-Backspace
                JNE     F_PostStringInput12

                Mov     DX, [SI+8]
                Call    F_GetStringInputOffset

                Mov     CX, DX
                Mov     AX, DS
                Mov     ES, AX
                Mov     DI, SI
                Xor     AL, AL
                Rep     StosB

                Jmp     F_PostStringInput11

F_PostStringInput12:
                Test    CL, CL
                JZ      F_PostStringInput9
                Cmp     DL, 32
                JB      F_PostStringInput9

                Mov     DI, [SI+8]
                Call    F_GetStringInputOffset

                Xor     BX, BX

F_PostStringInput10:
                LodsB
                Inc     BX
                And     AL, AL
                JNZ     F_PostStringInput10

                Dec     SI
                Cmp     BX, DI
                JAE     F_PostStringInput11

                Mov     AL, DL
                Xor     AH, AH
                Mov     [DS:SI], AX

F_PostStringInput11:
                Call    [CS:PostStringFunction]

                Mov     AX, 1
                Ret

F_PostStringInput9:
                Xor     AX, AX
                Ret

EndP            F_PostStringInput

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            F_GotoEmptyList Far

                Mov     AX, 5
                Mov     SI, 1
                Mov     DI, AX
                Mov     CX, Object1
                Mov     DX, Offset O1_EmptyList

                Ret

EndP            F_GotoEmptyList

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            GetSampleToggle

                Push    DS

                Call    I_GetSampleOffset
                Xor     CL, CL

                Mov     DH, [BX+DI]
                Test    DH, DL
                JZ      GetSampleToggle1

                Inc     CX

                Cmp     DI, 2Fh
                JE      GetSampleToggle1

                ShL     DL, 1
                ShL     DL, 1

                Pop     DS
                Push    DS

                Mov     AL, 80
                Mul     Byte Ptr [SI+3]
                Add     AL, [SI+2]
                AdC     AH, 0
                Add     AX, AX
                LEA     DI, [EAX+6]             ; DI points to screen part.
                Push    DS
                Push    SI

                Mov     SI, Offset ForwardMsg
                Test    DH, DL
                JZ      GetSampleToggle2

                Mov     SI, Offset PingPongMsg

GetSampleToggle2:
                Push    CS
                Pop     DS
                Mov     AH, 2
                Call    S_DrawString

                Pop     SI
                Pop     DS

GetSampleToggle1:
                Pop     DS
                Ret

EndP            GetSampleToggle

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            GetInstrumentToggle

                Push    DS

                Call    I_GetInstrumentOffset
                Xor     CL, CL

                Mov     DH, [BX+DI]
                Test    DH, DL
                JZ      GetInstrumentToggle1

                Inc     CX

                Cmp     DI, 1D4h
                JNE     GetInstrumentToggle1
                Cmp     DL, 1
                JNE     GetInstrumentToggle1

                Push    DS
                Push    SI

                Push    CS
                Pop     DS

                Mov     DI, (28*80+57)*2
                Mov     AH, 2
                Mov     SI, Offset PitchMessage
                Test    DH, DH
                JNS     GetInstrumentToggle3

                Mov     SI, Offset FilterMessage

GetInstrumentToggle3:
                Call    S_DrawString

                Pop     SI
                Pop     DS

GetInstrumentToggle1:
                Cmp     DI, 19h
                JNE     GetInstrumentToggle2

                Xor     CL, 1

GetInstrumentToggle2:
                Pop     DS
                Ret

EndP            GetInstrumentToggle

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            GetLoadSampleToggle

                Push    DS
                Push    SI
                Call    D_GetLoadSampleVars     ; Gets SI = currentsample offset
                                                ; DS = DiskDataArea

                Mov     BX, SI
                Pop     SI

                Xor     CL, CL

                Mov     DH, [BX+DI]
                Test    DH, DL
                JZ      GetLoadSampleToggle1

                Inc     CX

                ShL     DL, 1
                ShL     DL, 1

                Pop     DS
                Push    DS

                Mov     AL, 80
                Mul     Byte Ptr [SI+3]
                Add     AL, [SI+2]
                AdC     AH, 0
                Add     AX, AX
                LEA     DI, [EAX+6]             ; DI points to screen part
                Push    DS
                Push    SI

                Mov     SI, Offset ForwardMsg
                Test    DH, DL
                JZ      GetLoadSampleToggle2

                Mov     SI, Offset PingPongMsg

GetLoadSampleToggle2:
                Push    CS
                Pop     DS
                Mov     AH, 2
                Call    S_DrawString

                Pop     SI
                Pop     DS

GetLoadSampleToggle1:
                Pop     DS
                Ret

EndP            GetLoadSampleToggle

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            GetPatternSegmentToggle

                Push    DS

                Mov     AX, Pattern
                Mov     DS, AX

                Xor     CL, CL
                Test    [DS:DI], DL
                JZ      GetPatternSegmentToggle1

                Inc     CX

GetPatternSegmentToggle1:
                Pop     DS
                Ret

EndP            GetPatternSegmentToggle

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            GetMusicSegmentToggle

                Push    DS

                Call    Music_GetSongSegment
                Mov     DS, AX

                Xor     CL, CL
                Test    [DS:DI], DL
                JZ      GetMusicSegmentToggle1

                Inc     CX

GetMusicSegmentToggle1:
                Pop     DS
                Ret

EndP            GetMusicSegmentToggle

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            SampleToggle

                Push    DS

                Call    I_GetSampleOffset

                Cmp     DI, 2Fh
                JNE     SampleToggle6

                Xor     [BX+DI], DL

                Jmp     SampleToggleEnd

SampleToggle6:
                Mov     DH, DL
                ShL     DH, 1
                ShL     DH, 1
                Test    [BX+DI], DL
                JZ      SampleToggle3

                Test    [BX+DI], DH
                JNZ     SampleToggle3

                Xor     [BX+DI], DH

                Call    Music_RegetLoopInformation
                Jmp     SampleToggleEnd

SampleToggle3:
                Xor     [BX+DI], DL
                Test    [BX+DI], DL
                JZ      SampleToggle1
                                        ; Something was just toggled On.
                Not     DH
                And     [BX+DI], DH

                Cmp     DL, 10h
                JE      SampleToggle2
                Cmp     DL, 20h
                JNE     SampleToggle1       ; Safety Check.
                                        ; Sustain Loop.
                Mov     EAX, [BX+40h]    ; SusLBeg
                Cmp     EAX, [BX+30h]
                JB      SampleToggle4

                Xor     EAX, EAX
                Mov     [BX+40h], EAX

SampleToggle4:
                Cmp     EAX, [BX+44h]
                JB      SampleToggle1

                Mov     EAX, [BX+30h]
                Mov     [BX+44h], EAX
                Jmp     SampleToggle1

SampleToggle2:                      ; Normal Loop
                Mov     EAX, [BX+34h]
                Cmp     EAX, [BX+30h]
                JB      SampleToggle5

                Xor     EAX, EAX
                Mov     [BX+34h], EAX

SampleToggle5:
                Cmp     EAX, [BX+38h]
                JB      SampleToggle1

                Mov     EAX, [BX+30h]
                Mov     [BX+38h], EAX

SampleToggle1:
                Call    Music_RegetLoopInformation
                Call    I_DrawWaveForm

SampleToggleEnd:
                NetworkSendSample

                Pop     DS
                Ret

EndP            SampleToggle

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            InstrumentToggle

                Push    DS

                Call    I_GetInstrumentOffset

IF FILTERENVELOPES
                Cmp     DI, 1D4h
                JNE     InstrumentToggle2
                Cmp     DL, 1
                JNE     InstrumentToggle2

                Xor     Byte Ptr [BX+DI], 80h
                JNS     InstrumentToggle3

                Test    [BX+DI], DL
                JZ      InstrumentToggle2

                And     Byte Ptr [BX+DI], 7Fh

InstrumentToggle2:
ELSE
                And     Byte Ptr [BX+1D4h], 7Fh
ENDIF
                Xor     [BX+DI], DL

InstrumentToggle3:
                Call    I_MapEnvelope

                NetworkSendInstrument

                Pop     DS
                Ret

EndP            InstrumentToggle

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            LoadSampleToggle

                Push    DS
                Push    SI
                Call    D_GetLoadSampleVars     ; Gets SI = currentsample offset
                                                ; DS = DiskDataArea

                Mov     BX, SI
                Pop     SI

                Mov     DH, DL
                ShL     DH, 1
                ShL     DH, 1
                Test    [BX+DI], DL
                JZ      LoadSampleToggle3

                Test    [BX+DI], DH
                JNZ     LoadSampleToggle3

                Xor     [BX+DI], DH
                Pop     DS
                Ret

LoadSampleToggle3:
                Xor     [BX+DI], DL
                Test    [BX+DI], DL
                JZ      LoadSampleToggle1
                                        ; Something was just toggled On.
                Not     DH
                And     [BX+DI], DH

                Cmp     DL, 10h
                JE      LoadSampleToggle2
                Cmp     DL, 20h
                JNE     LoadSampleToggle1       ; Safety Check.
                                        ; Sustain Loop.
                Mov     EAX, [BX+40h]    ; SusLBeg
                Cmp     EAX, [BX+30h]
                JB      LoadSampleToggle4

                Xor     EAX, EAX
                Mov     [BX+40h], EAX

LoadSampleToggle4:
                Cmp     EAX, [BX+44h]
                JB      LoadSampleToggle1

                Mov     EAX, [BX+30h]
                Mov     [BX+44h], EAX
                Jmp     LoadSampleToggle1

LoadSampleToggle2:                      ; Normal Loop
                Mov     EAX, [BX+34h]
                Cmp     EAX, [BX+30h]
                JB      LoadSampleToggle5

                Xor     EAX, EAX
                Mov     [BX+34h], EAX

LoadSampleToggle5:
                Cmp     EAX, [BX+38h]
                JB      LoadSampleToggle1

                Mov     EAX, [BX+30h]
                Mov     [BX+38h], EAX

LoadSampleToggle1:
                Call    D_DrawWaveForm

                Pop     DS
                Ret

EndP            LoadSampleToggle

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            PatternSegmentToggle

                Push    DS
                Mov     AX, Pattern
                Mov     DS, AX
                        Assume DS:Pattern

                Xor     [DS:DI], DL

                Cmp     DI, Offset MultiChannelInfo
                JB      PatternSegmentToggle1
                Cmp     DI, Offset MultiChannelInfo+64
                JAE     PatternSegmentToggle1

                Test    CX, 8000h
                JNZ     PatternSegmentToggle1

                Inc     Word Ptr [ES:BP]

PatternSegmentToggle1:
                Pop     DS
                Ret

EndP            PatternSegmentToggle
                Assume DS:Nothing

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            MusicSegmentToggle

                Push    DS
                Call    Music_GetSongSegment
                Mov     DS, AX

                Xor     [DS:DI], DL

IF NETWORKENABLED
                Mov     CX, 1
                Mov     DX, DI
                Call    Network_SendSongDataInformation
ENDIF

                Pop     DS
                Ret

EndP            MusicSegmentToggle

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            MouseToggle Far

                Mov     CX, 8010h
                Mov     DX, ' '
                Call    AddMouseQueue

                Xor     AX, AX

                Ret

EndP            MouseToggle

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            F_DrawToggle Far

                Mov     [CS:MouseEventData+10], AX      ; Store object number

                Call    S_GetDestination
                Mov     BX, [SI+4]              ; Segment no.
                Mov     DI, [SI+6]
                Mov     DL, [SI+8]
                Add     BX, BX
                Call    [CS:GetToggleStatus+BX] ; Returns CL with 0=off, 1=on

                Mov     AL, 80
                Mul     Byte Ptr [SI+3]
                Add     AL, [SI+2]
                AdC     AH, 0
                Add     AX, AX
                Mov     DI, AX                  ; DI points to screen part.

                Mov     AX, 200h+'O'
                StosW
                And     CL, CL
                JZ      F_DrawToggle1

                Mov     AL, 'n'
                StosW
                Jmp     F_DrawToggle2

F_DrawToggle1:
                Mov     AL, 'f'
                StosW
                StosW

F_DrawToggle2:
                Xor     AH, AH
                Mov     AL, [SI+2]      ; XValue
                ShL     AX, 3
                Mov     [CS:MouseEventData+0], AX
                Add     AX, 23
                Mov     [CS:MouseEventData+4], AX

                Xor     AH, AH
                Mov     AL, [SI+3]
                ShL     AX, 3
                Mov     [CS:MouseEventData+2], AX
                Add     AX, 7
                Mov     [CS:MouseEventData+6], AX

                Push    CS
                Pop     DS
                        Assume DS:Functions

                Mov     SI, Offset MouseEventData
                Mov     [MouseEventData+8], 102h
                Mov     [MouseEventData+12], Offset MouseToggle

                Call    MouseAddEvent

                Ret

EndP            F_DrawToggle

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            F_PreToggle Far

                Call    S_GetDestination
                Mov     BX, [SI+4]              ; Segment no.
                Mov     DI, [SI+6]
                Mov     DL, [SI+8]
                Add     BX, BX
                Call    [CS:GetToggleStatus+BX] ; Returns CL with 0=off, 1=on

                Xor     CH, CH
                Neg     CL
                Add     CL, 3                   ; CL = number to hilight

                Mov     AL, 80
                Mul     Byte Ptr [SI+3]
                Add     AL, [SI+2]
                AdC     AH, 0
                Add     AX, AX
                Mov     DI, AX

                Mov     AL, 30h
                Call    S_HiLight

                Ret

EndP            F_PreToggle

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            F_PostToggle Far

                Mov     SI, [BX]

                Test    CL, CL
                JZ      F_PostToggle7

                Cmp     DX, ' '
                JNE     F_PostToggle1

                Mov     BP, DI

                Mov     BX, [SI+4]              ; Segment no.
                Mov     DI, [SI+6]
                Mov     DL, [SI+8]
                Add     BX, BX
                Call    [CS:ToggleBit+BX]

                Mov     AX, 1
                Ret

F_PostToggle1:
                Cmp     CX, 1C8h
                JE      F_PostToggle5
                Cmp     CX, 1D0h
                JE      F_PostToggle4
                Cmp     CX, 10Fh        ; Tab
                JE      F_PostToggle3
                Cmp     CX, 1CDh
                JE      F_PostToggle3
                Cmp     DX, 0F00h
                JE      F_PostToggle2
                Cmp     CX, 1CBh
                JE      F_PostToggle2

F_PostToggle7:
                Xor     AX, AX
                Ret

F_PostToggle2:
                LodsW
F_PostToggle3:
                LodsW
F_PostToggle4:
                LodsW
F_PostToggle5:
                Add     SI, 9
                LodsW
                Cmp     AX, 0FFFFh
                JE      F_PostToggle7

                Mov     [DI], AX

F_PostToggle6:
                Mov     AX, 1
                Ret

EndP            F_PostToggle

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            GetInstrument3Num

                Push    DS

                Call    I_GetInstrumentOffset

                Mov     AL, [BX+DI]
                Xor     AH, AH

                Pop     DS
                Ret

EndP            GetInstrument3Num

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            SetInstrument3Num               ; AX = value.

                Push    DS
                Push    SI
                Push    AX

                Mov     AX, Inst
                Mov     DS, AX
                        Assume DS:Inst

                Mov     CX, MaxNode
                Dec     CL
                        Assume DS:Nothing


                Call    I_GetInstrumentOffset

                Pop     AX
                Cmp     AL, CL
                JB      SetInstrument3Num1

                Mov     AL, CL

SetInstrument3Num1:
                Mov     [BX+DI], AL

                Mov     SI, 132h
                Call    Near Ptr SetInstrument3Num2

                Mov     SI, 134h
                Call    Near Ptr SetInstrument3Num2

                Mov     SI, 184h
                Call    Near Ptr SetInstrument3Num2

                Mov     SI, 186h
                Call    Near Ptr SetInstrument3Num2

                Mov     SI, 1D6h
                Call    Near Ptr SetInstrument3Num2

                Mov     SI, 1D8h
                Call    Near Ptr SetInstrument3Num2

                Call    I_MapEnvelope

                Pop     SI
                Pop     DS

                Ret

SetInstrument3Num2:
                Mov     AL, [BX+SI]
                Cmp     AL, [BX+SI+1]
                JBE     SetInstrument3Num3

                Mov     [BX+SI+1], AL

SetInstrument3Num3:
                RetN

EndP            SetInstrument3Num

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            GetSample5Num

                Push    DS

                Call    I_GetSampleOffset

                Mov     EAX, [BX+DI]

                Pop     DS
                Ret

EndP            GetSample5Num

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            GetLoadSample5Num

                Push    DS
                Push    SI
                Call    D_GetLoadSampleVars     ; Gets SI = currentsample offset
                                                ; DS = DiskDataArea

                Mov     BX, SI
                Mov     EAX, [BX+DI]

                Pop     SI
                Pop     DS

                Ret

EndP            GetLoadSample5Num

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            GetInst5Num

                Push    DS
                Mov     AX, Inst

                Mov     DS, AX
                Mov     EAX, [DI]

                Pop     DS
                Ret

EndP            GetInst5Num

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            SetSample5Num               ; AX = value.

                Push    DS
                Push    AX

                Call    I_GetSampleOffset

                Pop     AX
                Mov     [BX+DI], EAX

                Pop     DS

                NetworkSendSample

                Ret

EndP            SetSample5Num

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            SetLoadSample5Num               ; AX = value.

                Push    DS
                Push    SI

                Call    D_GetLoadSampleVars     ; Gets SI = currentsample offset
                Mov     BX, SI

                Mov     [BX+DI], EAX

                Pop     SI
                Pop     DS
                Ret

EndP            SetLoadSample5Num

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            SetInst5Num

                Push    DS

                Mov     BX, Inst
                Mov     DS, BX
                Mov     [DI], EAX

                Pop     DS

                Ret

EndP            SetInst5Num

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            MouseNumberDecrement Far

                Mov     CX, 8010h
                Mov     DX, '-'
                Call    AddMouseQueue

                Xor     AX, AX

                Ret

EndP            MouseNumberDecrement

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            MouseNumberIncrement Far

                Mov     CX, 8010h
                Mov     DX, '+'
                Call    AddMouseQueue

                Xor     AX, AX

                Ret

EndP            MouseNumberIncrement

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            F_Draw3Num Far

                Mov     [CS:MouseEventData+10], AX      ; Store object number

                Mov     BX, [SI+4]
                Add     BX, BX
                Mov     DI, [SI+6]

                Call    [CS:Get3NumValues+BX]           ; AX = value.

                Push    AX

                Mov     AL, 80
                Mul     Byte Ptr [SI+3]
                Add     AL, [SI+2]
                AdC     AH, 0
                Add     AX, AX
                Mov     DI, AX
                Call    S_GetDestination

                Pop     AX
                Xor     DX, DX
                Mov     CH, 2
                Call    PE_ConvAX2Num

                Xor     AX, AX
                Mov     AL, [SI+2]              ; X value
                ShL     AX, 3
                Mov     [CS:MouseEventData+0], AX
                Add     AX, 3*8-1
                Mov     [CS:MouseEventData+4], AX
                Xor     AX, AX
                Mov     AL, [SI+3]
                ShL     AX, 3
                Mov     [CS:MouseEventData+2], AX
                Add     AX, 7
                Mov     [CS:MouseEventData+6], AX

                Push    CS
                Pop     DS

                Mov     SI, Offset MouseEventData
                Mov     Word Ptr [SI+8], 102h
                Mov     Word Ptr [SI+12], Offset MouseNumberDecrement
                Call    MouseAddEvent
                Mov     Word Ptr [SI+8], 110h
                Mov     Word Ptr [SI+12], Offset MouseNumberIncrement
                Call    MouseAddEvent

                Ret

EndP            F_Draw3Num

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            F_Pre3Num Far

                Mov     AL, 80
                Mul     Byte Ptr [SI+3]
                Add     AL, [SI+2]
                AdC     AH, 0
                Mov     DI, AX
                Add     DI, CS:TripleNumberPos
                Add     DI, DI

                Mov     CX, 1
                Mov     AL, 30h
                Call    S_HiLight

                Ret

EndP            F_Pre3Num

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            F_Post3Num Far

                Mov     SI, [BX]
                Test    CL, CL
                JZ      F_Post3Num7

                Cmp     DX, 8
                JE      F_Post3Num16
                Cmp     CX, 1CBh        ; Left
                JNE     F_Post3Num1

F_Post3Num16:
                Mov     AX, CS:TripleNumberPos
                Dec     AX
                JS      F_Post3Num2

F_Post3Num5:
                Mov     CS:TripleNumberPos, AX

F_Post3Num2:
                Mov     AX, 1
                Ret

F_Post3Num1:
                Cmp     CX, 1CDh        ; Right
                JNE     F_Post3Num3

F_Post3Num4:
                Mov     AX, CS:TripleNumberPos
                Inc     AX
                Cmp     AX, 2
                JA      F_Post3Num2
                Jmp     F_Post3Num5

F_Post3Num3:
                Cmp     CX, 1C8h        ; Up
                JE      F_Post3Num14
                Cmp     CX, 1D0h        ; Down
                JE      F_Post3Num13
                Cmp     CX, 10Fh
                JE      F_Post3Num12
                Cmp     DX, 0F00h
                JNE     F_Post3Num6

                LodsW
F_Post3Num12:
                LodsW
F_Post3Num13:
                LodsW
F_Post3Num14:
                Add     SI, 12
                LodsW
                Cmp     AX, 0FFFFh
                JE      F_Post3Num7

                Mov     [DI], AX

F_Post3Num15:
                Mov     AX, 1
                Ret

F_Post3Num18:
                Mov     BX, [SI+4]
                Add     BX, BX
                Mov     DI, [SI+6]

                Push    BX
                Call    [CS:Get3NumValues+BX]           ; AX = value.
                Pop     BX
                Add     AX, 1
                JC      F_Post3Num15
                Call    [CS:Set3NumValues+BX]           ; AX = value.
                Call    Near Ptr F_Post3Num20
                Jmp     F_Post3Num15

F_Post3Num19:
                Mov     BX, [SI+4]
                Add     BX, BX
                Mov     DI, [SI+6]

                Push    BX
                Call    [CS:Get3NumValues+BX]           ; AX = value.
                Pop     BX
                Sub     AX, 1
                JC      F_Post3Num15
                Call    [CS:Set3NumValues+BX]           ; AX = value.
                Call    Near Ptr F_Post3Num20
                Jmp     F_Post3Num15

F_Post3Num6:
                Cmp     DX, '+'
                JE      F_Post3Num18
                Cmp     DX, '-'
                JE      F_Post3Num19

                Cmp     DX, '0'
                JL      F_Post3Num7
                Cmp     DX, '9'
                JLE     F_Post3Num8

F_Post3Num7:
                Xor     AX, AX
                Ret

F_Post3Num8:                            ; OK... a number was inputted.
                Push    DX

                Mov     BX, [SI+4]
                Add     BX, BX
                Mov     DI, [SI+6]

                Call    [CS:Get3NumValues+BX]           ; AX = value.

                Mov     CX, 3
                Mov     BX, 10
                Mov     DI, Offset NumberStorage+6

F_Post3Num9:
                Xor     DX, DX
                Div     BX
                Sub     DI, 2
                Mov     [CS:DI], DX
                Loop    F_Post3Num9

                Mov     BX, CS:TripleNumberPos
                Add     BX, BX

                Pop     DX
                Sub     DX, '0'
                Mov     [CS:DI+BX], DX

                Xor     AX, AX
                Mov     BX, 10
                Mov     CX, 3
                Xor     DX, DX

F_Post3Num10:
                Mul     BX
                Add     AX, [CS:DI]
                AdC     DX, 0
                ScasW
;                Add     DI, 2
                Loop    F_Post3Num10

                And     DX, DX
                JZ      F_Post3Num11

                Mov     AX, 0FFFFh

F_Post3Num11:
                Mov     BX, [SI+4]
                Add     BX, BX
                Mov     DI, [SI+6]

                Call    [CS:Set3NumValues+BX]           ; AX = value.
                Call    Near Ptr F_Post3Num20
                Jmp     F_Post3Num4

F_Post3Num20:
                Cmp     Word Ptr [SI+8], 0
                JNZ     F_Post3Num17

                Cmp     Word Ptr [SI+10], 0
                JZ      F_Post3Num21

F_Post3Num17:
                Call    DWord Ptr [SI+8]

F_Post3Num21:
                RetN


EndP            F_Post3Num

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            F_ConvEAX2Num Far

                Push    EAX                      ; CH = colour
                Push    EBX                      ; DX:AX = number
                Push    CX
                Push    EDX

                Mov     EBX, 10
                Mov     CL, 7

F_ConvEAX2Num1:
                Xor     EDX, EDX
                Div     EBX
                Push    DX
                Dec     CL
                JNZ     F_ConvEAX2Num1

                Mov     CL, 7

F_ConvEAX2Num2:
                Pop     AX
                Add     AL, '0'
                Mov     AH, CH
                StosW

                Dec     CL
                JNZ     F_ConvEAX2Num2

                Pop     EDX
                Pop     CX
                Pop     EBX
                Pop     EAX

                Ret

EndP            F_ConvEAX2Num

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            F_Draw5Num Far

                Mov     [CS:MouseEventData+10], AX

                Mov     BX, [SI+4]
                Add     BX, BX
                Mov     DI, [SI+6]

                Call    [CS:Get5NumValues+BX]           ; AX = value.

                Push    AX

                Mov     AL, 80
                Mul     Byte Ptr [SI+3]
                Add     AL, [SI+2]
                AdC     AH, 0
                Add     AX, AX
                Mov     DI, AX
                Call    S_GetDestination

                Pop     AX
                Xor     DX, DX
                Mov     CH, 2
                Call    F_ConvEAX2Num

                Xor     AX, AX
                Mov     AL, [SI+2]              ; X value
                ShL     AX, 3
                Mov     [CS:MouseEventData+0], AX
                Add     AX, 7*8-1
                Mov     [CS:MouseEventData+4], AX
                Xor     AX, AX
                Mov     AL, [SI+3]
                ShL     AX, 3
                Mov     [CS:MouseEventData+2], AX
                Add     AX, 7
                Mov     [CS:MouseEventData+6], AX

                Push    CS
                Pop     DS

                Mov     SI, Offset MouseEventData
                Mov     Word Ptr [SI+8], 102h
                Mov     Word Ptr [SI+12], Offset MouseNumberDecrement
                Call    MouseAddEvent
                Mov     Word Ptr [SI+8], 110h
                Mov     Word Ptr [SI+12], Offset MouseNumberIncrement
                Call    MouseAddEvent

                Ret

EndP            F_Draw5Num

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            F_Pre5Num Far

                Mov     AL, 80
                Mul     Byte Ptr [SI+3]
                Add     AL, [SI+2]
                AdC     AH, 0
                Mov     DI, AX
                Add     DI, CS:NumberPos
                Add     DI, DI

                Mov     CX, 1
                Mov     AL, 30h
                Call    S_HiLight

                Ret

EndP            F_Pre5Num

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            F_Post5Num Far

                Mov     SI, [BX]
                Test    CL, CL
                JZ      F_Post5Num7

                Cmp     DX, 8
                JE      F_Post5Num16
                Cmp     CX, 1CBh        ; Left
                JNE     F_Post5Num1

F_Post5Num16:
                Mov     AX, CS:NumberPos
                Dec     AX
                JS      F_Post5Num2

F_Post5Num5:
                Mov     CS:NumberPos, AX

F_Post5Num2:
                Mov     AX, 1
                Ret

F_Post5Num1:
                Cmp     CX, 1CDh        ; Right
                JNE     F_Post5Num3

F_Post5Num4:
                Mov     AX, CS:NumberPos
                Inc     AX
                Cmp     AX, 6
                JA      F_Post5Num2
                Jmp     F_Post5Num5

F_Post5Num3:
                Cmp     CX, 1C8h        ; Up
                JE      F_Post5Num14
                Cmp     CX, 1D0h        ; Down
                JE      F_Post5Num13
                Cmp     CX, 10Fh
                JE      F_Post5Num12
                Cmp     DX, 0F00h
                JNE     F_Post5Num6

                LodsW
F_Post5Num12:
                LodsW
F_Post5Num13:
                LodsW
F_Post5Num14:
                Add     SI, 12
                LodsW
                Cmp     AX, 0FFFFh
                JE      F_Post5Num7

                Mov     [DI], AX

F_Post5Num15:
                Mov     AX, 1
                Ret

F_Post5Num18:
                Mov     BX, [SI+4]
                Add     BX, BX
                Mov     DI, [SI+6]

                Push    BX
                Call    [CS:Get5NumValues+BX]           ; AX = value.
                Pop     BX
                Inc     EAX
                Call    [CS:Set5NumValues+BX]           ; AX = value.
                Call    Near Ptr F_Post5Num20
                Jmp     F_Post5Num15

F_Post5Num19:
                Mov     BX, [SI+4]
                Add     BX, BX
                Mov     DI, [SI+6]

                Push    BX
                Call    [CS:Get5NumValues+BX]           ; AX = value.
                Pop     BX
                Sub     EAX, 1
                JC      F_Post5Num15
                Call    [CS:Set5NumValues+BX]           ; AX = value.
                Call    Near Ptr F_Post5Num20
                Jmp     F_Post5Num15

F_Post5Num6:
                Cmp     DX, '+'
                JE      F_Post5Num18
                Cmp     DX, '-'
                JE      F_Post5Num19

                Cmp     DX, '0'
                JL      F_Post5Num7
                Cmp     DX, '9'
                JLE     F_Post5Num8

F_Post5Num7:
                Xor     AX, AX
                Ret

F_Post5Num8:                            ; OK... a number was inputted.
                Push    DX

                Mov     BX, [SI+4]
                Add     BX, BX
                Mov     DI, [SI+6]

                Call    [CS:Get5NumValues+BX]           ; EAX = value.

                Mov     CX, 7
                Mov     EBX, 10
                Mov     DI, Offset NumberStorage+14

F_Post5Num9:
                Xor     EDX, EDX
                Div     EBX
                Sub     DI, 2
                Mov     [CS:DI], DX
                Loop    F_Post5Num9

                Mov     BX, CS:NumberPos
                Add     BX, BX

                Pop     DX
                Sub     DX, '0'
                Mov     [CS:DI+BX], DX

                Xor     EAX, EAX
                Mov     BX, 10
                Mov     CX, 7

F_Post5Num10:
                IMul    EAX, 10
                MovZX   EBX, Word Ptr [CS:DI]
                Add     EAX, EBX

;                Add     DI, 2
                ScasW
                Loop    F_Post5Num10

F_Post5Num11:
                Mov     BX, [SI+4]
                Add     BX, BX
                Mov     DI, [SI+6]

                Call    [CS:Set5NumValues+BX]           ; AX = value.
                Call    Near Ptr F_Post5Num20
                Jmp     F_Post5Num4

F_Post5Num20:
                Cmp     Word Ptr [SI+8], 0
                JNZ     F_Post5Num17

                Cmp     Word Ptr [SI+10], 0
                JZ      F_Post5Num21

F_Post5Num17:
                Call    DWord Ptr [SI+8]

F_Post5Num21:
                RetN

EndP            F_Post5Num

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            F_DrawHeader Far

;                Call    MouseClearEvents

                Call    Music_GetSongSegment
                Mov     DS, AX
                Mov     DL, [DS:2Ch]

                Push    CS
                Pop     DS

                Call    E_GetFreeEMS
                Push    AX

                Mov     AH, 48h
                Mov     BX, 0FFFFh
                Int     21h
                ShR     BX, 6
                Push    BX

                Mov     AH, 20h
                Mov     SI, Offset HeaderMsg1
                Mov     DI, ((1*80)+2)*2
                Call    S_DrawString

                Mov     SI, Offset HeaderMsg2
                Call    Glbl_GetHeaderMode
                And     AH, AH
                JNZ     F_DrawHeader1

                Mov     SI, Offset HeaderMsg3

F_DrawHeader1:
                Mov     AH, 20h
                Call    S_DrawString

                Mov     SI, Offset HeaderMsg4
                Mov     DI, ((4*80)+2)*2
                Call    S_DrawString

                Add     SP, 4

                Call    Music_GetFreeSoundCardMemory
                 ; Returns DS:SI, Carry set if nothing to show
                JC      F_DrawHeader2          ; and AX = value to print.

                Push    BX
                Push    AX

                Mov     AH, 20h
                Mov     DI, (63+8*80)*2
                Call    S_DrawString

                Pop     AX
                Pop     BX

F_DrawHeader2:
                Ret

EndP            F_DrawHeader

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            F_DrawSMCChannels Far

;                Call    MouseClearEvents

                Push    CS
                Pop     DS

                Xor     CX, CX

F_DrawSMCChannels1:
                Mov     AL, CL
                Inc     AX
                Xor     AH, AH
                Mov     BH, 10
                Div     BH
                Add     AX, 3030h
                Mov     Word Ptr ChannelNumbers, AX

                Mov     BX, CX
                And     BX, 0Fh
                Mov     AX, 160                 ; Calculate DI (offset on screen)
                Mul     BX
                Mov     DI, AX
                Add     DI, (22*80+9)*2
                Mov     BX, CX
                And     BX, 00F0h
                ShL     BX, 1
                Add     DI, BX

                Mov     SI, Offset ChannelMsg
                Mov     AH, 20h
                Call    S_DrawString

                Inc     CX
                Cmp     CX, 64
                JB      F_DrawSMCChannels1

                Ret

EndP            F_DrawSMCChannels

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            F_ConfigButtonSetup Far

                Call    Music_GetSongSegment
                Mov     DS, AX                          ; OK... now check for
                                                        ; control mode first.
                Mov     CL, [DS:2Ch]                    ; CL = Flags.
                Add     DI, 50                          ; ES:DI points to inst button

                Mov     BX, [ES:DI]                     ; ES:BX points to inst button data
;                Add     DI, 2
                ScasW
                Xor     CH, CH
                Test    CL, 4
                JZ      F_ConfigButtonSetup1

                Inc     CH

F_ConfigButtonSetup1:
                Mov     [ES:BX+33], CH                  ; Instrument button

                Xor     CH, 1
                Mov     BX, [ES:DI]
;                Add     DI, 2
                ScasW
                Mov     [ES:BX+33], CH                  ; Sample button

                Mov     BX, [ES:DI]
;                Add     DI, 2
                ScasW
                Xor     CH, CH
                Test    CL, 1
                JZ      F_ConfigButtonSetup2

                Inc     CH

F_ConfigButtonSetup2:
                Mov     [ES:BX+33], CH                  ; Stereo button

                Xor     CH, 1
                Mov     BX, [ES:DI]
;                Add     DI, 2
                ScasW
                Mov     [ES:BX+33], CH                  ; Mono button

                Mov     BX, [ES:DI]
;                Add     DI, 2
                ScasW
                Xor     CH, CH
                Test    CL, 8                           ; Slides...
                JZ      F_ConfigButtonSetup3

                Inc     CH

F_ConfigButtonSetup3:
                Mov     [ES:BX+33], CH

                Xor     CH, 1
                Mov     BX, [ES:DI]
;                Add     DI, 2                           ; Compression reasons
                ScasW
                Mov     [ES:BX+33], CH

                Ret

EndP            F_ConfigButtonSetup

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

IF NETWORKENABLED
Proc            F_SendSongFlags

                Push    CX
                Push    DX

                Mov     CX, 1
                Mov     DX, 2Ch
                Call    Network_SendSongDataInformation

                Pop     DX
                Pop     CX

                Ret

EndP            F_SendSongFlags

SendSongFlags   EQU     Call F_SendSongFlags

ELSE

SendSongFlags   EQU     ;

ENDIF

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            F_SetControlSample Far

                Call    Music_GetSongSegment
                Mov     DS, AX

                And     Byte Ptr [DS:2Ch], NOT 4

                SendSongFlags

                Ret

EndP            F_SetControlSample

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            F_SetControlInstrument Far

                Call    Music_GetSongSegment
                Mov     DS, AX

                Or      Byte Ptr [DS:2Ch], 4

                Push    DS

                Mov     DI, Offset O1_InitialiseInstrumentList
                Mov     CX, 3
                Call    M_Object1List
                                                ; DX = 0 -> don't initialise
                                                ; DX = 1 -> initialise
                Pop     DS                      ; DS = SongDataSegment

                SendSongFlags

                Test    DX, DX
                JZ      F_SetControlInstrument3

                Call    Music_ClearAllInstruments

                                                ; OK.. for samples 1..99
                                                ; check if sample exists.
                                                ; if so, copy name&set all
                                                ; notes of instrument.
                Push    DS
                Pop     ES                      ; ES = SongDataSegment

                Xor     DX, DX

F_SetControlInstrument1:
                Mov     BX, DX
                Add     BX, BX
                Mov     SI, [DS:BX+64912]       ; SI points to sample
                Mov     DI, [DS:BX+64712]       ; DI points to instrument

                Test    Byte Ptr [DS:SI+12h], 1
                JZ      F_SetControlInstrument2
                                                ; No sample there!

                                                ; Copy name
                Mov     CX, 26
                Add     SI, 14h
                Add     DI, 20h
                Rep     MovsB
                Add     DI, 7

                Mov     AL, DL                  ; DL = sample number
                Inc     AX
                Mov     CX, 120

F_SetControlInstrument4:
                StosB
                Inc     DI
                Loop    F_SetControlInstrument4

F_SetControlInstrument2:
IF NETWORKENABLED
                Call    Network_GetSendQueue
                JZ      F_SetControlInstrument5

                Mov     AX, 400h
                StosW
                Mov     AX, DX
                StosB

F_SetControlInstrument5:
                Call    Network_FinishedSendQueue
ENDIF
                Inc     DX
                Cmp     DX, 99
                JBE     F_SetControlInstrument1

F_SetControlInstrument3:

                Ret

EndP            F_SetControlInstrument

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            F_SetStereo Far

                Call    Music_GetSongSegment
                Mov     DS, AX

                Or      Byte Ptr [DS:2Ch], 1

                Call    Music_InitStereo

                SendSongFlags

                Ret

EndP            F_SetStereo

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            F_SetMono Far

                Call    Music_GetSongSegment
                Mov     DS, AX

                And     Byte Ptr [DS:2Ch], NOT 1

                Call    Music_InitStereo

                SendSongFlags

                Ret

EndP            F_SetMono

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            F_SetLinear Far

                Call    Music_GetSongSegment
                Mov     DS, AX

                Or      Byte Ptr [DS:2Ch], 8

                SendSongFlags

                Ret

EndP            F_SetLinear

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            F_SetAmiga Far

                Call    Music_GetSongSegment
                Mov     DS, AX

                And     Byte Ptr [DS:2Ch], NOT 8

                SendSongFlags

                Ret

EndP            F_SetAmiga

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            F_Reset5NumInputPos Far

                Mov     CS:NumberPos, 0
                Ret

EndP            F_Reset5NumInputPos

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            F_NewSong Far

                EnsureNoNetwork

                Mov     DI, Offset O1_NewSongList
                Mov     CX, 11                  ; OK Button..
                Call    M_Object1List
                And     DX, DX
                JZ      F_NewSongEnd

                Call    Music_Stop

                Cmp     Word Ptr [CS:ButtonVariables+8], 0
                JE      F_NewSong2

                Call    Music_ReleaseAllSamples
                Call    Music_ClearAllSampleNames

F_NewSong2:
                Cmp     Word Ptr [CS:ButtonVariables+10], 0
                JE      F_NewSong3

                Call    Music_ClearAllInstruments

F_NewSong3:
                Cmp     Word Ptr [CS:ButtonVariables+12], 0
                JE      F_NewSong1

                Call    D_ClearFileName
                Call    D_ResetTimer

                Call    Music_GetSongSegment
                Mov     ES, AX

                Mov     DI, 4           ; Clear song name
                Mov     CX, 13
                Xor     AX, AX
                Rep     StosW

                Mov     DI, 3Ch         ; Clear Time
                Xor     AX, AX
                StosW
                StosW

                Mov     CX, 64
                Mov     AL, 32
                Rep     StosB

                Mov     CX, 64          ; Channel volume
                Mov     AL, 64
                Rep     StosB

                Mov     DI, 100h        ; Orders.
                Mov     AL, 0FFh
                Mov     CX, 256
                Rep     StosB

                Call    Music_InitMuteTable
                Call    Msg_ResetMessage

F_NewSong1:
                Cmp     Word Ptr [CS:ButtonVariables+6], 0
                JE      F_NewSongEnd
                                                ; Clear patterns.
                Call    D_ClearFileName
                Call    D_ResetTimer
                Call    Music_ReleaseAllPatterns
                Call    PE_ResetOrderPattern

F_NewSongEnd:
                Mov     AX, 1
                Ret

EndP            F_NewSong

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            F_MainMenu Far

                Call    S_SaveScreen

                Mov     CX, 0FFFFh
                Mov     DI, Offset O1_MainMenu
                Call    M_Object1List

                Call    S_RestoreScreen

                Mov     AX, 1
                Ret

EndP            F_MainMenu

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            F_ViewPattern Far

                Call    MouseRestoreEvents
                Add     SP, 20
                Jmp     Glbl_F2_2

EndP            F_ViewPattern

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            F_ViewVariables Far

                Call    MouseRestoreEvents
                Add     SP, 20
                Jmp     Glbl_F12

EndP            F_ViewVariables

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            F_ViewOrderPan Far

                Call    MouseRestoreEvents
                Add     SP, 20
                Jmp     Glbl_F11_2

EndP            F_ViewOrderPan

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            F_MessageEditor Far

                Call    MouseRestoreEvents
                Add     SP, 20
                Jmp     Glbl_Shift_F9

EndP            F_MessageEditor

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            F_Help Far

                Call    S_RestoreScreen
                Call    MouseRestoreEvents
                Add     SP, 20
                Jmp     H_Help

EndP            F_Help

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            F_PlaybackMenu Far

                Mov     CX, 0FFFFh
                Mov     DI, Offset O1_PlaybackMenu
                Call    M_Object1List

                Call    S_RestoreScreen
                Mov     AX, 1
                Ret

EndP            F_PlaybackMenu

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            F_InfoPage Far

                Call    MouseRestoreEvents
                Call    MouseRestoreEvents

                Add     SP, 48
                Jmp     Glbl_F5

EndP            F_InfoPage

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            F_PlaySong Far

                Call    MouseRestoreEvents
                Call    MouseRestoreEvents
                Add     SP, 48
                Jmp     Glbl_Ctrl_F5

EndP            F_PlaySong

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            F_PlayPattern Far

                Call    MouseRestoreEvents
                Call    MouseRestoreEvents
                Add     SP, 48
                Jmp     Glbl_F6

EndP            F_PlayPattern

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            F_PlayOrder Far

                Call    MouseRestoreEvents
                Call    MouseRestoreEvents
                Add     SP, 48
                Jmp     Glbl_Shift_F6

EndP            F_PlayOrder

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            F_PlayMark Far

                Call    MouseRestoreEvents
                Call    MouseRestoreEvents
                Add     SP, 48
                Jmp     PE_F7

EndP            F_PlayMark

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            F_Stop Far

                Call    MouseRestoreEvents
                Call    MouseRestoreEvents
                Add     SP, 48
                Jmp     Music_Stop

EndP            F_Stop

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            F_ReinitSoundCard Far

                Call    MouseRestoreEvents
                Call    MouseRestoreEvents
                Add     SP, 48
                Jmp     Music_ReinitSoundCard

EndP            F_ReinitSoundCard

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            F_CalculateLength Far

                Call    S_RestoreScreen
                Call    MouseRestoreEvents
                Call    MouseRestoreEvents
                Add     SP, 48
                Jmp     Music_TimeSong

EndP            F_CalculateLEngth

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            F_DriverScreen Far

                Call    MouseRestoreEvents
                Call    MouseRestoreEvents
                Add     SP, 48
                Jmp     Glbl_DriverScreen

EndP            F_DriverScreen

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            F_SampleMenu Far

                Mov     CX, 0FFFFh
                Mov     DI, Offset O1_SampleMenu
                Call    M_Object1List

                Call    S_RestoreScreen
                Mov     AX, 1
                Ret

EndP            F_SampleMenu

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            F_InstrumentMenu Far

                Mov     CX, 0FFFFh
                Mov     DI, Offset O1_InstrumentMenu
                Call    M_Object1List

                Call    S_RestoreScreen
                Mov     AX, 1
                Ret

EndP            F_InstrumentMenu

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            F_SampleList Far

                Call    MouseRestoreEvents
                Call    MouseRestoreEvents
                Add     SP, 48
                Jmp     Glbl_F3

EndP            F_SampleList

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            F_InstrumentList Far

                Call    MouseRestoreEvents
                Call    MouseRestoreEvents
                Add     SP, 48
                Jmp     Glbl_F4

EndP            F_InstrumentList

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            F_InstrumentLibrary Far

                Call    MouseRestoreEvents
                Call    MouseRestoreEvents
                Add     SP, 48
                Jmp     Glbl_Ctrl_F4

EndP            F_InstrumentLibrary

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            F_ReloadGravis Far

                Call    MouseRestoreEvents
                Call    MouseRestoreEvents
                Add     SP, 48
                Jmp     Music_SoundCardLoadAllSamples

EndP            F_ReloadGravis

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            F_SampleLibrary Far

                Call    MouseRestoreEvents
                Call    MouseRestoreEvents
                Add     SP, 48
                Jmp     Glbl_Ctrl_F3

EndP            F_SampleLibrary

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            F_FileMenu Far

                Mov     CX, 0FFFFh
                Mov     DI, Offset O1_FileMenu
                Call    M_Object1List

                Call    S_RestoreScreen
                Mov     AX, 1
                Ret

EndP            F_FileMenu

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            F_FileLoad Far

                Call    MouseRestoreEvents
                Call    MouseRestoreEvents
                Add     SP, 48
                Jmp     Glbl_F9

EndP            F_FileLoad


;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            F_FileNew Far

                Call    MouseRestoreEvents
                Call    MouseRestoreEvents
                Call    S_RestoreScreen
                Add     SP, 48
                Jmp     F_NewSong

EndP            F_FileNew

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            F_FileSaveCurrent Far

                Call    MouseRestoreEvents
                Call    MouseRestoreEvents
                Call    S_RestoreScreen
                Add     SP, 48
                Jmp     D_SaveSong

EndP            F_FileSaveCurrent

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            F_FileSaveAs Far

                Call    MouseRestoreEvents
                Call    MouseRestoreEvents
                Add     SP, 48
                Jmp     Glbl_F10

EndP            F_FileSaveAs

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            F_FileDOSShell Far

                Call    MouseRestoreEvents
                Call    MouseRestoreEvents
                Call    S_RestoreScreen
                Add     SP, 48
                Jmp     DOSShell

EndP            F_FileDOSShell

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            F_FileQuit Far

                Call    MouseRestoreEvents
                Call    MouseRestoreEvents
                Call    S_RestoreScreen
                Add     SP, 48
                Jmp     Quit

EndP            F_FileQuit

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

IF MEMORYDEBUG

DebugOffset             DW      0
DebugSegment            DW      0

AddressInput            DB      0
                        DB      19 Dup (0)
SegmentMsg              DB      "Segment: ", 0FDh, 'Xh', 0

DebugSegmentNames       DB      10, "STARTUP", 0
                        DW      Startup

                        DB      11, "KEYBOARD", 0
                        DW      Keyboard

                        DB      10, "PATTERN", 0
                        DW      Pattern

                        DB      7, "DISK", 0
                        DW      Disk

                        DB      6, "EMS", 0
                        DW      EMS

                        DB      8, "ERROR", 0
                        DW      Error

                        DB      7, "INST", 0
                        DW      Inst

                        DB      12, "FUNCTIONS", 0
                        DW      Functions

                        DB      9, "GLOBAL", 0
                        DW      Glbl

                        DB      7, "HELP", 0
                        DW      Help

                        DB      11, "INFOLINE", 0
                        DW      InfoLine

                        DB      7, "MAIN", 0
                        DW      Main

                        DB      8, "MUSIC", 0
                        DW      Music

                        DB      9, "SCREEN", 0
                        DW      Screen

                        DB      10, "OBJECT1", 0
                        DW      Object1

                        DB      11, "INFOPAGE", 0
                        DW      InfoPage

                        DB      11, "SONGDATA", 0
DebugSongDataSegment    DW      0

                        DB      11, "DISKDATA", 0
DebugDiskDataSegment    DW      0

                        DB      14, "PATTERNDATA", 0
DebugPatternDataSegment DW      0

                        DB      0FFh            ; End of list.

DebugMsg                DB      "CX: ", 0FDh, "X, DX: ", 0FDh, "X        ", 0
DebugCX                 DW      0
DebugDX                 DW      0

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            F_DrawDebug Far

                Push    CS
                Pop     DS
                        Assume DS:Functions

                Call    S_GetDestination
                Mov     SI, Offset SegmentMsg
                Mov     DI, (4+13*80)*2

                Push    DebugSegment
;                Mov     AX, DebugSegment
;                Push    AX
                Mov     AH, 21h
                Call    S_DrawString            ; OK segment done
                Pop     AX                      ; Clear stack.

                                        ; Put offsets on screen.
                                        ; Work out digits.
                Mov     CX, 1E04h
                Mov     DI, (3+15*80)*2
                Mov     DX, DebugOffset
                Xor     BH, BH
                Mov     AH, 2

F_DrawDebug1:
                Push    DI

                Mov     BL, DH
                ShR     BL, CL
                Mov     AL, [HexNumbers+BX]             ; Blah.. how inefficient
                StosW
                Mov     BL, DH
                And     BL, 0Fh
                Mov     AL, [HexNumbers+BX]
                StosW
                Mov     BL, DL
                ShR     BL, CL
                Mov     AL, [HexNumbers+BX]
                StosW
                Mov     BL, DL
                And     BL, 0Fh
                Mov     AL, [HexNumbers+BX]
                StosW                           ; Offset is on screen.

                Mov     AL, ':'
                StosW

                Pop     DI
                Add     DI, 160
                Add     DX, 16
                Dec     CH
                JNZ     F_DrawDebug1

                                                ; Now to shove debug stuff.
                Mov     SI, DebugOffset
                Mov     DS, DebugSegment
                        Assume DS:Nothing
                Mov     DI, (10+15*80)*2

                Mov     DX, 30

F_DrawDebug2:
                Push    DI
                Push    SI

                Mov     CX, 1004h

F_DrawDebug3:
                Cmp     CH, 8
                JNE     F_DrawDebug4

                Mov     AL, '-'
                StosW
                Xor     AL, AL
                StosW

F_DrawDebug4:
                LodsB                           ; Number.
                Mov     BL, AL
                ShR     BL, CL
                Mov     BL, [CS:HexNumbers+BX]
                XChg    AL, BL
                And     BL, 0Fh
                StosW
                Mov     AL, [CS:HexNumbers+BX]
                StosW

                Xor     AL, AL
                StosW

                Dec     CH                      ; Hex number loop
                JNZ     F_DrawDebug3

                StosW

                Pop     SI
                Mov     CX, 16

F_DrawDebug5:
                LodsB
                StosW
                Loop    F_DrawDebug5

                Pop     DI
                Add     DI, 160                 ; Next line.

                Dec     DX                      ; line loop.
                JNZ     F_DrawDebug2

                Push    CS
                Pop     DS

                Push    DebugDX
                Push    DebugCX

                Mov     SI, Offset DebugMsg
                Mov     AH, 20h
                Mov     DI, (40+47*80)*2
                Call    S_DrawString
                Pop     AX
                Pop     AX

                Mov     AX, 1
                Ret

EndP            F_DrawDebug
                Assume DS:Nothing

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            F_PostDebug Far

                Mov     CS:DebugCX, CX
                Mov     CS:DebugDX, DX

                Xor     AX, AX
                Ret

EndP            F_PostDebug

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            F_DebugUp Far

                Sub     CS:DebugOffset, 16

                Mov     AX, 1
                Ret

EndP            F_DebugUp

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            F_DebugDown Far

                Add     CS:DebugOffset, 16

                Mov     AX, 1
                Ret

EndP            F_DebugDown

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            F_DebugPgUp Far

                Sub     CS:DebugOffset, 16*30

                Mov     AX, 1
                Ret

EndP            F_DebugPgUp

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            F_DebugPgDn Far

                Add     CS:DebugOffset, 16*30

                Mov     AX, 1
                Ret

EndP            F_DebugPgDn

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            F_DebugStringInput Far

                Mov     AX, Disk
                Mov     DS, AX
                        Assume DS:Disk
                Mov     DX, DiskDataArea

                Xor     BP, BP                  ; BP = ':' count.

                Mov     AX, Music
                Mov     DS, AX
                        Assume DS:Music
                Mov     BX, SongDataArea

                Mov     AX, Pattern
                Mov     DS, AX
                        Assume DS:Pattern
                Mov     SI, PatternDataArea

                Push    CS
                Push    CS
                Pop     DS
                Pop     ES
                        Assume DS:Functions ; ES = functions also.

                Mov     DebugSongDataSegment, BX
                Mov     DebugDiskDataSegment, DX
                Mov     DebugPatternDataSegment, SI

                Mov     SI, Offset DebugSegmentNames
                Xor     BX, BX

F_DebugStringInput1:
                Mov     DI, Offset AddressInput
                LodsB
                Cmp     AL, 0FFh
                JE      F_DebugStringInput2

                Mov     BL, AL
                Push    SI
                                        ; OK.. compare in here..
F_DebugStringInput4:
                LodsB
                Mov     AH, [DI]

                And     AL, AL
                JZ      F_DebugStringInput3

                And     AH, AH
                JZ      F_DebugStringInput6

                Cmp     AH, 'a'
                JB      F_DebugStringInput6
                Cmp     AH, 'z'
                JA      F_DebugStringInput6

                Add     AH, 'A'-'a'

F_DebugStringInput6:
                Inc     DI
                Cmp     AH, AL
                JE      F_DebugStringInput4


F_DebugStringInput5:
                Pop     SI
                Add     SI, BX
                Jmp     F_DebugStringInput1


F_DebugStringInput3:
                And     AH, AH
                JNZ     F_DebugStringInput6

                LodsW
                Pop     SI
                Mov     DebugSegment, AX
                Mov     DebugOffset, 0

                Mov     AX, 1
                Ret

F_DebugStringInput2:                            ; We have a hex address(?)
                Mov     SI, Offset AddressInput
                Cmp     Byte Ptr [SI], 0
                JE      F_DebugStringInput15

F_DebugStringInput7:
                LodsB
                And     AL, AL
                JZ      F_DebugStringInput10

                Cmp     AL, '0'
                JB      F_DebugStringInput8
                Cmp     AL, '9'
                JBE     F_DebugStringInput7

F_DebugStringInput8:
                Cmp     AL, 'A'
                JB      F_DebugStringInput9
                Cmp     AL, 'F'
                JBE     F_DebugStringInput7


F_DebugStringInput9:
                Cmp     AL, 'a'
                JB      F_DebugStringInput16
                Cmp     AL, 'f'
                JBE     F_DebugStringInput7

F_DebugStringInput16:
                Cmp     AL, ':'
                JE      F_DebugStringInput7

F_DebugStringInput15:
                Xor     AX, AX
                Ret

F_DebugStringInput10:                           ; Hex address
                Mov     BX, DebugSegment
                Mov     CL, 4
                Xor     DX, DX                  ; BX:DX contains address

                Xor     AX, AX
                Mov     SI, Offset AddressInput

F_DebugStringInput11:
                LodsB
                And     AL, AL
                JZ      F_DebugStringInput12

                Cmp     AL, ':'
                JE      F_DebugStringInput13

                Sub     AL, '0'
                Cmp     AL, 9
                JBE     F_DebugStringInput14

                Sub     AL, '@'-'9'
                Cmp     AL, 15
                JBE     F_DebugStringInput14

                Sub     AL, 32

F_DebugStringInput14:
                ShL     DX, CL
                Add     DX, AX

                Jmp     F_DebugStringInput11

F_DebugStringInput13:
                Inc     BP
                Cmp     BP, 2
                JAE     F_DebugStringInput17

                Mov     BX, DX
                Xor     DX, DX
                Jmp     F_DebugStringInput11

F_DebugStringInput17:
                Mov     DebugSegment, BX
                Mov     DebugOffset, DX
                Xor     DX, DX
                Jmp     F_DebugStringInput11

F_DebugStringInput12:
                Cmp     BP, 2
                JB      F_DebugStringInput18

                LDS     SI, DWord Ptr [DebugOffset]
                Mov     [SI], DL
                Jmp     F_DebugStringInput19

F_DebugStringInput18:
                Mov     DebugSegment, BX
                Mov     DebugOffset, DX

F_DebugStringInput19:
                Mov     AX, 1
                Ret

EndP            F_DebugStringInput

ENDIF

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            F_ShowMIDIZxxInput Far

                Push    CS
                Pop     DS
                        Assume DS:Functions

                Mov     SI, Offset ZxxString
                Mov     AX, TopMIDIMacro
                Add     AX, 6
                Mov     CX, 7

F_ShowMIDIZxxInput1:
                Push    AX
                Dec     AX
                Loop    F_ShowMIDIZxxInput1

                Mov     CX, 7
                Mov     DI, (13+42*80)*2

F_ShowMIDIZxxInput2:
                Mov     AH, 20h
                Call    S_DrawString
                Pop     AX
                Add     DI, (80-3)*2
                Loop    F_ShowMIDIZxxInput2

                Ret

EndP            F_ShowMIDIZxxInput
                Assume DS:Nothing

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            F_MIDI_Up Far

                Cmp     CS:TopMIDIMacro, 80h
                JBE     F_MIDI_Up1

                Dec     CS:TOPMIDIMacro
                Jmp     F_MIDI_Up2

F_MIDI_Up1:
                Mov     Word Ptr [ES:DI], 33

F_MIDI_Up2:
                Mov     AX, 1
                Ret

EndP            F_MIDI_Up

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            F_MIDI_Down Far

                Cmp     CS:TopMIDIMacro, 0F9h
                JAE     F_MIDI_Down1

                Inc     CS:TOPMIDIMacro

F_MIDI_Down1:
                Mov     AX, 1
                Ret

EndP            F_MIDI_Down

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            F_MIDI_PgUp Far

                Cmp     Word Ptr [ES:DI], 33
                JBE     F_MIDI_PgUp1

                Sub     Byte Ptr [CS:TopMIDIMacro], 7
                JS      F_MIDI_PgUp1

                Mov     Byte Ptr [CS:TopMIDIMacro], 80h

F_MIDI_PgUp1:
                Mov     AX, 1
                Ret

EndP            F_MIDI_PgUp

;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ

Proc            F_MIDI_PgDn Far

                Cmp     Word Ptr [ES:DI], 33
                JBE     F_MIDI_PgDn1

                Add     [CS:TopMIDIMacro], 7
                Cmp     [CS:TopMIDIMacro], 0F9h
                JB      F_MIDI_PgDn1

                Mov     [CS:TopMIDIMacro], 0F9h

F_MIDI_PgDn1:
                Mov     AX, 1
                Ret

EndP            F_MIDI_PgDn

;ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ

EndS

;ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ

End
