;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ Startup Module ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ; TODO ;Jumps %include "switch.inc" ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ Externals ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ Segment Object1 BYTE Public 'Data' extern HelpKeyValue:Word, OrderKeyValue:Word EndS Segment InfoLine BYTE Public 'Code' USE16 extern ShowUsageTime:Byte EndS Segment Disk BYTE Public 'Code' USE16 extern DiskOptions:Byte EndS Segment Screen BYTE Public 'Code' extern CharacterGenerationOffset:Word extern VGAFlags:Byte EndS Segment Mouse BYTE Public 'Code' extern MouseCharacterGenerationOffset:Word EndS Segment Main DWORD Public 'Code' USE16 extern ReleaseTimeSlice:Byte EndS extern D_InitDisk:Far extern D_UnInitDisk:Far extern D_DisableFileColours:Far extern E_InitEMS:Far extern E_UnInitEMS:Far extern Error_InitHandler:Far extern Error_UnInitHandler:Far extern K_InitKeyBoard:Far extern K_UnInitKeyBoard:Far extern K_InstallKeyboardType:Far extern K_RemoveKeyboardType:Far extern K_InstallDOSHandler:Far extern K_UnInstallDOSHandler:Far extern K_SwapKeyBoard:Far extern O1_AutoDetectList:Far extern O1_ConfirmQuit:Far extern O1_PatternEditList:Far extern O1_CrashRecovery:Far extern O1_KeyboardList:Far extern M_Object1List:Far extern S_InitScreen:Far extern S_ClearScreen:Far extern S_UnInitScreen:Far extern S_SetDirectMode:Far extern S_DrawString:Far extern Music_InitMusic:Far extern Music_UnInitMusic:Far extern Music_SetLimit:Far extern Music_SetSoundCard:Far extern Music_SetDMA:Far extern Music_SetIRQ:Far extern Music_SetMixSpeed:Far extern Music_SetAddress:Far extern Music_ReverseChannels:Far extern Music_PatternStorage:Far extern Music_SetSoundCardDriver:Far extern Music_Stop:Far extern Music_AutoDetectSoundCard:Far %IF NETWORKENABLED extern Network_Shutdown:Far %ENDIF extern PE_InitPatternEdit:Far extern PE_UnInitPatternEdit:Far extern PECheckModified:Far extern D_RestorePreShellDirectory:Far extern D_GetPreShellDirectory:Far extern MMTSR_InstallMMTSR:Far extern MMTSR_UninstallMMTSR:Far extern InitMouse:Far, UnInitMouse:Far extern CmdLineDisableMouse:Far extern InitTimerHandler:Far, UnInitTimerHandler:Far ;ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ Global Quit:Far, Refresh:Far Global DOSShell:Far, GetEnvironment:Far Global CrashRecovery:Far Public IsStartupKeyList Public GetStartupKeyList ;ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ ;Segment StartUp BYTE Public 'Code' USE16 section .text %warning "USE16" ; ;Assume CS:StartUp, DS:Nothing, ES:Nothing CREATENEWLOGFILE EQU 1 %include "debug.inc" ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ Variables ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ StackSize equ 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 ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ Functions ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ CapitaliseAL: Cmp AL, 'a' JB CapitaliseAL1 Cmp AL, 'z' JA CapitaliseAL1 Add AL, 'A'-'a' CapitaliseAL1: Ret ;EndP CapitaliseAL CapitaliseAL: cmp al, 'a' jb .r cmp al, 'z' ja .r or al, 'A'-'a' .r: ret ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ 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 ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ 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, 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 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 ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ IsStartupKeyList:;Far Mov AL,CS:StartupList Ret ;EndP IsStartupKeyList ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ 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 ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ 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 ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ 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 ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ Refresh:;Far Call D_GetPreShellDirectory Call S_InitScreen Call D_InitDisk Call InitMouse Call D_RestorePreShellDirectory Mov AX, 1 Ret ;EndP Refresh ;ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ 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 ;ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ EndS ;ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ;³ Stack Segment ³ ;ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ Segment StackSeg PARA Stack 'Stack' StackData DB StackSize Dup(?) EndS ;ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ End Start