dpvm/it/IT.ASM

1148 lines
33 KiB
NASM
Raw Permalink Normal View History

2024-01-30 11:24:04 -08:00
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ
;<3B> Startup Module <20>
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Jumps
.386P
include switch.inc
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ
;<3B> Externals <20>
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Segment Object1 BYTE Public 'Data'
Extrn HelpKeyValue:Word, OrderKeyValue:Word
EndS
Segment InfoLine BYTE Public 'Code' USE16
Extrn ShowUsageTime:Byte
EndS
Segment Disk BYTE Public 'Code' USE16
Extrn DiskOptions:Byte
EndS
Segment Screen BYTE Public 'Code'
Extrn CharacterGenerationOffset:Word
Extrn VGAFlags:Byte
EndS
Segment Mouse BYTE Public 'Code'
Extrn MouseCharacterGenerationOffset:Word
EndS
Segment Main DWORD Public 'Code' USE16
Extrn ReleaseTimeSlice:Byte
EndS
Extrn D_InitDisk:Far
Extrn D_UnInitDisk:Far
Extrn D_DisableFileColours:Far
Extrn E_InitEMS:Far
Extrn E_UnInitEMS:Far
Extrn Error_InitHandler:Far
Extrn Error_UnInitHandler:Far
Extrn K_InitKeyBoard:Far
Extrn K_UnInitKeyBoard:Far
Extrn K_InstallKeyboardType:Far
Extrn K_RemoveKeyboardType:Far
Extrn K_InstallDOSHandler:Far
Extrn K_UnInstallDOSHandler:Far
Extrn K_SwapKeyBoard:Far
Extrn O1_AutoDetectList:Far
Extrn O1_ConfirmQuit:Far
Extrn O1_PatternEditList:Far
Extrn O1_CrashRecovery:Far
Extrn O1_KeyboardList:Far
Extrn M_Object1List:Far
Extrn S_InitScreen:Far
Extrn S_ClearScreen:Far
Extrn S_UnInitScreen:Far
Extrn S_SetDirectMode:Far
Extrn S_DrawString:Far
Extrn Music_InitMusic:Far
Extrn Music_UnInitMusic:Far
Extrn Music_SetLimit:Far
Extrn Music_SetSoundCard:Far
Extrn Music_SetDMA:Far
Extrn Music_SetIRQ:Far
Extrn Music_SetMixSpeed:Far
Extrn Music_SetAddress:Far
Extrn Music_ReverseChannels:Far
Extrn Music_PatternStorage:Far
Extrn Music_SetSoundCardDriver:Far
Extrn Music_Stop:Far
Extrn Music_AutoDetectSoundCard:Far
IF NETWORKENABLED
Extrn Network_Shutdown:Far
ENDIF
Extrn PE_InitPatternEdit:Far
Extrn PE_UnInitPatternEdit:Far
Extrn PECheckModified:Far
Extrn D_RestorePreShellDirectory:Far
Extrn D_GetPreShellDirectory:Far
Extrn MMTSR_InstallMMTSR:Far
Extrn MMTSR_UninstallMMTSR:Far
Extrn InitMouse:Far, UnInitMouse:Far
Extrn CmdLineDisableMouse:Far
Extrn InitTimerHandler:Far, UnInitTimerHandler:Far
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Global Quit:Far, Refresh:Far
Global DOSShell:Far, GetEnvironment:Far
Global CrashRecovery:Far
Public IsStartupKeyList
Public GetStartupKeyList
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Segment StartUp BYTE Public 'Code' USE16
Assume CS:StartUp, DS:Nothing, ES:Nothing
CREATENEWLOGFILE EQU 1
include debug.inc
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ
;<3B> Variables <20>
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
StackSize = 1000h
No386Msg DB "Sorry, Impulse Tracker requires a 386+ processor to run."
DB 13, 10, "$"
WindowsMsg DB "Microsoft Windows detected.", 13, 10, 10
DB "Due to instabilities in Windows, it is highly recommended that you run", 13, 10
DB "Impulse Tracker in DOS instead.", 13, 10, 10
DB "Press any key to continue..."
DB "$"
PSP DW ?
LoadMMTSR DB 1
Pause DB 0
COMSPECFound DB 0
COMSPEC DD 0
Control DB 0
CommandTail DB 1, 0, 13
FCB1 DB 0, 11 Dup (32), 52 Dup (0)
FCB2 DB 0, 11 Dup (32), 52 Dup (0)
COMSPECString DB "COMSPEC"
DefaultShell DB "C:\COMMAND.COM", 0
EXECData DW 0 ; Inherit same environment block
DW Offset CommandTail, Startup
DW Offset FCB1, Startup
DW Offset FCB2, Startup
ShellMsg DB "Type EXIT to return to Impulse Tracker$"
IF SHOWREGISTERNAME
include wavswitc.inc
include username.inc
ENDIF
Label CmdLineHelp Byte
IF SHOWVERSION
DB "Impulse Tracker 2.14, Copyright (C) 1995-2000 Jeffrey Lim", 13, 10
DB 10
DB " Usage: IT.EXE [Switches]", 13, 10
ELSE
DB "Impulse Tracker, Copyright (C) 1995-2000 Jeffrey Lim", 13, 10
IF SHOWREGISTERNAME
DB "Registered to: "
DB REGISTERNAME
DB 13, 10
ENDIF
ENDIF
DB 10
DB "Switches:", 13, 10
DB " SFilename.Drv Select sound card driver", 13, 10
DB " S#", 9, 9, " Quick select sound card", 13, 10
DB 9, "S0: No sound card", 9, 9, " S9: Pro Audio Spectrum", 13, 10
DB 9, "S1: PC Speaker", 9, 9, 9, "S10: Pro Audio Spectrum 16", 13, 10
DB 9, "S2: Sound Blaster 1.xx", 9, 9, "S11: Windows Sound System", 13, 10
DB 9, "S3: Sound Blaster 2.xx", 9, 9, "S12: ESS ES1868 AudioDrive", 13, 10
DB 9, "S4: Sound Blaster Pro", 9, 9, "S13: EWS64 XL Codec", 13, 10
DB 9, "S5: Sound Blaster 16", 9, 9, "S14: Ensoniq SoundscapeVIVO", 13, 10
DB 9, "S6: Sound Blaster AWE 32", 9, "S19: Generic MPU401", 13, 10
DB 9, "S7: Gravis UltraSound", 9, 9, "S20: Disk Writer (WAV)", 13, 10
DB 9, "S8: AMD Interwave", 9, 9, "S21: Disk Writer (MID)", 13, 10
DB 10
DB " Axxx", 9, "Set Base Address of sound card (hexadecimal)", 13, 10
DB " I###", 9, "Set IRQ of sound card (decimal)", 13, 10
DB " D###", 9, "Set DMA of sound card (decimal)", 13, 10
DB 10
DB " M###", 9, "Set Mixspeed", 13, 10
DB " L###", 9, "Limit number of channels (4-256)", 13, 10
DB "$"
MixErrorMsg DB "Error: Mixing speed invalid - setting ignored", 13, 10, "$"
AddressErrorMsg DB "Error: Base Address invalid - setting ignored", 13, 10, "$"
IRQErrorMsg DB "Error: IRQ number invalid - setting ignored", 13, 10, "$"
LimitErrorMsg DB "Error: Channel limit number invalid - setting ignored", 13, 10, "$"
ContinueMsg DB "Press any key to continue...$"
StartupList DB 0
StartupMode DB 0 ; Load? Or Load/Play? or Load/Save
StartupFileOffset DW 0
StartupFileSegment DW 0
StartupKeyListFunction DW Offset GetStartupKeyList1
; CX,DX
StartupInformation DW 11Ch, 0 ; Enter
DW 1Ch, 0 ; Release Enter
DW 10Fh, 0 ; Tab
DW 10Fh, 0 ; Tab
DW 10Fh, 0 ; Tab
DW 90Eh, 127 ; Ctrl-Backspace
ENDSTARTUPINFORMATION EQU $
SaveInformation DW 0, 0 ; Loading screen key-loss
DW 1FFh, 13h ; Ctrl-S
DW 0, 0 ; Saving screen key-loss
DW 1FFh, 11h ; Ctrl-Q
DW 1FFh, 'Y' ; 'Y'
ENDSAVEINFORMATION EQU $
StartupQueueOffset DW Offset StartupInformation
StartupQueueEnd DW Offset ENDSTARTUPINFORMATION
StartupQueueNextFunction DW Offset GetStartupKeyList2
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ
;<3B> Functions <20>
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Proc CapitaliseAL
Cmp AL, 'a'
JB CapitaliseAL1
Cmp AL, 'z'
JA CapitaliseAL1
Add AL, 'A'-'a'
CapitaliseAL1:
Ret
EndP CapitaliseAL
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Proc GetDecimalNumber ; Returns CX
LodsB
Cmp AL, '0'
JB GetDecimalNumber1
Cmp AL, '9'
JBE GetDecimalNumber2
GetDecimalNumber1:
StC
Ret
GetDecimalNumber2:
Xor CX, CX
GetDecimalNumber3:
Mov BL, AL
Sub BL, '0'
Xor BH, BH
Mov AX, 10
Mul CX
Add AX, BX
Mov CX, AX
LodsB
And DX, DX
JNZ GetDecimalNumber1
Cmp AL, '0'
JB GetDecimalNumber4
Cmp AL, '9'
JA GetDecimalNumber4
Jmp GetDecimalNumber3
GetDecimalNumber4:
ClC
Ret
EndP GetDecimalNumber
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Proc Start
Assume DS:Nothing
; 386 check.
Trace "Impulse Tracker Startup"
Push SP
Pop AX
Cmp AX, SP
JNE No386
PushF
Pop CX ; CX = Flags.
Mov AX, CX
Or AX, 0F000h
Push AX
PopF
PushF
Pop AX
And AX, 0F000h
JNZ Found386
No386:
Push CS
Pop DS
Mov AH, 9
Mov DX, Offset No386Msg
Int 21h
Mov AX, 4C02h
Int 21h
Found386:
; Push 0B800h ; DEBUG!!!!!
; Pop GS ; DEBUG!!!!!
Push CX
PopF
ClD
Mov [CS:PSP], ES
Mov AX, ES
Mov BX, SS
Sub BX, AX
Add BX, StackSize / 16 ; Add BX, <Size reqd for Stack in para>
Mov AH, 4Ah ; Re-allocate memory
Int 21h
; Check for 386 here.
; Do command line stuff.
Mov SI, 81h ; DS:SI points to cmdtail
CmdLine1:
Push ES
Pop DS
LodsB
CmdLine3:
Cmp AL, 0Dh
JE CmdLineEnd
And AL, AL
JZ CmdLineEnd
Call CapitaliseAL
CmdLine2:
Cmp AL, 'K'
JE KeyboardSwap
Cmp AL, 'F'
JE DisableColours
Cmp AL, 'C'
JE SetControl
Cmp AL, 'H'
JE ShowCmdLineHelp
Cmp AL, '?'
JE ShowCmdLineHelp
Cmp AL, 'S'
JE SetSoundCard1
Cmp AL, 'D'
JE SetDMA1
Cmp AL, 'M'
JE SetMixSpeed1
Cmp AL, 'I'
JE SetIRQ1
Cmp AL, 'A'
JE SetAddress1
Cmp AL, 'V'
JE OverrideVGA
Cmp AL, 'L'
JE Limit1
Cmp AL, 'R'
JE Reverse1
Cmp AL, 'X'
JE DisableFeatures
Cmp AL, 'P'
JE PatternStorage
Cmp AL, 'T'
JE NoShowUsageTime
Cmp AL, 'W'
JE ConvertModule
Jmp CmdLine1
NoShowUsageTime:
LodsB
Cmp AL, '1'
JNE NoReleaseTimeSlice
Push DS
Push InfoLine
Pop DS
Assume DS:InfoLine
Mov [ShowUsageTime], 0
Pop DS
Jmp CmdLine1
Assume DS:Nothing
NoReleaseTimeSlice:
Cmp AL, '2'
JNE CmdLine3
NoReleaseTimeSlice2:
Push DS
Push Main
Pop DS
Assume DS:Main
Mov [ReleaseTimeSlice], 1
Pop DS
Jmp CmdLine1
PatternStorage:
LodsB
Sub AL, '0'
JC PatternStorageEnd
Cmp AL, 2
JA PatternStorageEnd
Call Music_PatternStorage
Jmp CmdLine1
PatternStorageEnd:
Jmp CmdLine3
DisableFeatures:
LodsB
Cmp AL, '1'
JB CmdLine3
JE DisableMMTSR
Cmp AL, '3'
JB DisableMouse
JE DisableDetectDriveMap
Cmp AL, '5'
JB DisableCacheFiles
Jmp CmdLine3
DisableMouse:
Call CmdLineDisableMouse
Jmp CmdLine1
DisableMMTSR:
Mov [LoadMMTSR], 0
Jmp CmdLine1
DisableDetectDriveMap:
Push Disk
Pop DS
Assume DS:Disk
Or [DiskOptions], 1
Jmp CmdLine1
Assume DS:Nothing
DisableCacheFiles:
Push Disk
Pop DS
Assume DS:Disk
Or [DiskOptions], 2
Jmp CmdLine1
Assume DS:Nothing
KeyboardSwap:
Mov AX, Object1
Mov DS, AX
Assume DS:Object1
Mov [HelpKeyValue], 157h
Mov [OrderKeyValue], 13Bh
Jmp CmdLine1
Assume DS:Nothing
DisableColours:
Call D_DisableFileColours
Jmp CmdLine1
Reverse1:
Call Music_ReverseChannels
Jmp CmdLine1
OverrideVGA:
LodsB
Mov CX, Screen
Mov DS, CX
Assume DS:Screen
Cmp AL, '1'
JE OverrideVGA1
Cmp AL, '2'
JE Matrox
Cmp AL, '3'
JE WaitforRetrace
Cmp AL, '4'
JE Retrace
Jmp CmdLine3
OverrideVGA1:
Or [VGAFlags], 1
Jmp CmdLine1
WaitforRetrace:
Or [VGAFlags], 4
Jmp CmdLine1
Retrace:
Or [VGAFlags], 2
Jmp CmdLine1
Matrox:
Mov [CharacterGenerationOffset], 256*32
Mov AX, Mouse
Mov DS, AX
Assume DS:Mouse
Mov [MouseCharacterGenerationOffset], 256*32
Jmp CmdLine1
Assume DS:Nothing
SetControl:
Mov [CS:Control], 1
Jmp CmdLine1
ShowCmdLineHelp:
Push CS
Pop DS
Mov AH, 9
Mov DX, Offset CmdLineHelp
Int 21h
Mov AX, 4C00h
Int 21h
SetSoundCard1:
Call GetDecimalNumber
JC SetSoundCardDriver
Cmp CX, 21
JA SetSoundCard2
Push AX
Mov AX, CX
Call Music_SetSoundCard
Pop AX
SetSoundCard2:
Jmp CmdLine3
SetSoundCardDriver:
Cmp AL, 32
JBE CmdLine3
Dec SI
Call Music_SetSoundCardDriver
SetSoundCardDriver1:
LodsB
Cmp AL, 32
JA SetSoundCardDriver1
Mov Byte Ptr [SI-1], 0
Cmp AL, 32
JE CmdLine1
Jmp CmdLineEnd
ConvertModule:
Mov [CS:StartupList], 1
Mov [CS:StartupFileOffset], SI
Mov [CS:StartupFileSegment], DS
Jmp SetSoundCardDriver1
SetDMA1:
LodsB
Cmp AL, '0'
JB CmdLine3
Cmp AL, '7'
JA CmdLine3
Sub AL, '0'
Call Music_SetDMA
Jmp CmdLine1
SetMixSpeed1:
Call GetDecimalNumber
JC SetMixSpeedError
Push AX
Call Music_SetMixSpeed
Pop AX
Jmp CmdLine3
SetMixSpeedError:
Push CS
Pop DS
Assume DS:StartUp
Mov AH, 9
Mov DX, Offset MixErrorMsg
Int 21h
Mov [Pause], 1
Jmp CmdLine1
Assume DS:Nothing
SetIRQ1:
Call GetDecimalNumber
JC IRQError
Cmp CX, 15
JA IRQError
Push AX
Call Music_SetIRQ
Pop AX
Jmp CmdLine3
IRQError:
Push CS
Pop DS
Assume DS:StartUp
Mov AH, 9
Mov DX, Offset IRQErrorMsg
Int 21h
Mov [Pause], 1
Jmp CmdLine1
Assume DS:Nothing
SetAddress1:
LodsB
Xor DX, DX
Mov CL, 4
Cmp AL, '0'
JB SetAddress2
Cmp AL, '9'
JA SetAddress2
Sub AL, '0'
Jmp SetAddress3
SetAddress2:
Call CapitaliseAL
Cmp AL, 'A'
JB CmdLine2
Cmp AL, 'F'
JA CmdLine2
Sub AL, '@'
SetAddress3:
Test DX, 0F000h
JNZ AddressError
ShL DX, CL
Or DL, AL
LodsB
Cmp AL, '0'
JB SetAddress4
Cmp AL, '9'
JA SetAddress4
Sub AL, '0'
Jmp SetAddress3
SetAddress4:
Call CapitaliseAL
Cmp AL, 'A'
JB SetAddress5
Cmp AL, 'F'
JA SetAddress5
Sub AL, '@'
Jmp SetAddress3
SetAddress5:
Call Music_SetAddress
Jmp CmdLine3
AddressError:
Push CS
Pop DS
Assume DS:StartUp
Mov AH, 9
Mov DX, Offset AddressErrorMsg
Int 21h
Mov [Pause], 1
Jmp CmdLine1
Assume DS:Nothing
Limit1:
Call GetDecimalNumber
JC LimitError
Cmp CX, 256
JA LimitError
Cmp CX, 4
JB LimitError
Push AX
Call Music_SetLimit
Pop AX
Jmp CmdLine3
LimitError:
Push CS
Pop DS
Assume DS:StartUp
Mov AH, 9
Mov DX, Offset LimitErrorMsg
Int 21h
Mov [Pause], 1
Jmp CmdLine1
Assume DS:Nothing
CmdLineEnd:
Trace "Command Line Parsed"
Push CS
Pop DS
Assume DS:StartUp
Trace "Windows Detection"
Mov AX, 1600h ; Windows detection.
Int 2Fh
Test AL, 7Fh
JZ Start1
Cmp AL, 4 ; Windows 4.0+ ??
JAE Start1
Mov AH, 9
Mov DX, Offset WindowsMsg
Int 21h
Xor AX, AX
Int 16h
Start1:
; Get Comspec
Cmp [Pause], 1
JNE NoPause
Mov DX, Offset ContinueMsg
Mov AH, 9
Int 21h
Xor AX, AX
Int 16h
NoPause:
Trace "Retrieving Environment"
Mov SI, Offset COMSPECString
Mov CX, 7
Call GetEnvironment
JC Start2
Mov [COMSPECFound], 1
Mov [Word Ptr COMSPEC], DI
Mov [Word Ptr COMSPEC+2], ES
Start2:
Mov FS, [CS:PSP]
Trace "Initialising Screen Module"
Call S_InitScreen
Trace "Initialising Disk Module"
Call D_InitDisk
Trace "Initialising Expanded Memory Module"
Call E_InitEMS
Trace "Initialising Music Module"
Call Music_InitMusic
Trace "Initialising Keyboard Module"
Call K_InitKeyBoard
Trace "Initialising Edit Module"
Call PE_InitPatternEdit
Trace "Initialising Custom Keyboard Layout"
Call K_InstallKeyboardType
Trace "Initialising Error Handler Module"
Call Error_InitHandler
Cmp [CS:LoadMMTSR], 0
JE SkipMMTSR
Trace "Initialising MMTSR Module"
Call MMTSR_InstallMMTSR
SkipMMTSR:
Trace "Initialising Mouse Module"
Call InitMouse
Call S_ClearScreen
Trace "Initialising Timer Module"
Call InitTimerHandler
Trace "Initialising Soundcard"
Call Music_AutoDetectSoundCard
Trace "Entering Main Message Loop"
Mov DI, Offset O1_AutoDetectList
; Mov DI, Offset O1_KeyboardList
Mov CX, 0FFFFh
Call M_Object1List
Jmp Quit1
Proc Quit Far
Mov DI, Offset O1_ConfirmQuit
Mov CX, 3
Call M_Object1List
And DX, DX
JNZ Quit1
Mov AX, 1
RetF
Quit1:
Call PECheckModified
Call Music_Stop
IF NETWORKENABLED
Call Network_Shutdown
ENDIF
Call MMTSR_UninstallMMTSR
Call PE_UnInitPatternEdit
Call Music_UnInitMusic
Call UnInitMouse
Call S_UnInitScreen
Call E_UnInitEMS
Call K_UnInitKeyBoard
Call Error_UnInitHandler
Call D_UnInitDisk
Call K_RemoveKeyboardType
Call UnInitTimerHandler
Mov AX, 4C00h
Int 21h
EndP Quit
EndP Start
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Proc IsStartupKeyList Far
Mov AL,CS:StartupList
Ret
EndP IsStartupKeyList
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Proc GetStartupKeyList Far
Jmp [CS:StartupKeyListFunction]
GetStartupKeyList1:
Push SI
Mov SI, [CS:StartupQueueOffset]
Mov CX, [CS:SI]
Mov DX, [CS:SI+2]
Add SI, 4
Mov [CS:StartupQueueOffset], SI
Cmp SI, [CS:StartupQueueEnd]
Pop SI
JB GetStartupKeyList1End
Mov AX, [CS:StartupQueueNextFunction]
Mov [CS:StartupKeyListFunction], AX
GetStartupKeyList1End:
Ret
GetStartupKeyList2:
Push DS
Push SI
LDS SI, [DWord Ptr CS:StartupFileOffset]
LodsB
Mov [CS:StartupFileOffset], SI
Pop SI
Pop DS
Cmp AL, 32
JE GetStartupKeyList2EndOfString
And AX, 0FFh
JZ GetStartupKeyList2EndOfString
Mov DX, AX
Mov CX, 1FFh
Ret
GetStartupKeyList2EndOfString:
Mov [CS:StartupQueueOffset], Offset SaveInformation
Mov [CS:StartupQueueEnd], Offset ENDSAVEINFORMATION
Mov [CS:StartupQueueNextfunction], Offset GetStartupKeyList3
Mov [CS:StartupKeyListFunction], Offset GetStartupKeyList1
Mov CX, 11Ch ; Enter
Mov DX, 0
Ret
GetStartupKeyList3: ; Save module then quit
Xor CX, CX
Xor DX, DX
Mov [CS:StartupList], 0
Ret
EndP GetStartupKeyList
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Proc CrashRecovery Far ; CtrlAltDel location.
ClD
StI
Call S_ClearScreen
Call S_InitScreen
Call D_InitDisk
Call InitMouse
Mov DI, Offset O1_CrashRecovery
Mov CX, 0FFFFh
Call M_Object1List
Mov DI, Offset O1_PatternEditList
Mov CX, 0FFFFh
Jmp M_Object1List
EndP CrashRecovery
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Proc GetEnvironment Far ; DS:SI points to string.
; CX = length of string.
; Returns ES:DI
Mov ES, [CS:PSP]
Mov ES, [ES:2Ch] ; DS:00 points to environ.
Xor DI, DI
GetEnvironment1:
Push DI
Push CX
Push SI
RepE CmpSB
Pop SI
Pop CX
Pop DI
JE GetEnvironment3 ; From RepE
Xor AL, AL
GetEnvironment2:
ScasB
JNE GetEnvironment2
Cmp [Byte Ptr ES:DI], AL
JNE GetEnvironment1
StC
Ret
GetEnvironment3:
Add DI, CX
Inc DI ; Skip past '='
ClC
Ret
EndP GetEnvironment
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Proc Refresh Far
Call D_GetPreShellDirectory
Call S_InitScreen
Call D_InitDisk
Call InitMouse
Call D_RestorePreShellDirectory
Mov AX, 1
Ret
EndP Refresh
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Proc DOSShell Far
PushAD
Push DS
Push ES
PushF
Call D_GetPreShellDirectory
Cmp [CS:Control], 0
JNE DOSShell2
Call K_UnInitKeyBoard
Jmp DOSShell3
DOSShell2:
Call K_InstallDOSHandler
DOSShell3:
Mov AX, 3
Int 10h ; Clr screen.
Call UnInitMouse
Push CS
Push CS
Pop DS
Pop ES
Assume DS:StartUp
Mov AH, 9
Mov DX, Offset ShellMsg
Int 21h
Mov AX, 4B00h
Mov BX, Offset ExecData
Mov DX, Offset DefaultShell
Cmp [COMSPECFound], 0
JE DOSShell1
LDS DX, [COMSPEC]
DOSShell1:
ClI
Int 21h
Assume DS:Nothing
PopF
Call S_InitScreen
Call D_InitDisk
Call InitMouse
Cmp [CS:Control], 0
JNE DOSShell4
Call K_InitKeyBoard
Jmp DOSShell5
DOSShell4:
Call K_UnInstallDOSHandler
DOSShell5:
Call D_RestorePreShellDirectory
Pop ES
Pop DS
PopAD
Mov AX, 1
Ret
EndP DOSShell
Assume DS:Nothing
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
EndS
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ
;<3B> Stack Segment <20>
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Segment StackSeg PARA Stack 'Stack'
StackData DB StackSize Dup(?)
EndS
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
End Start