Category : BASIC Source Code
Archive   : QBDOS.ZIP
Filename : QBTMOD.BAS
'Copyright (c) 1987 Marcel Madonna
'
' This program will change the maximum memory required field on
' the header of an EXE file.
' Execute with the following:
'
' QBTMOD XXXXXXXX /MAX 99999
' XXXXXXXX is the name of the program
' 99999 is the number of paragraphs representing the maximum amount
' of memory that the EXE will require when executed.
' The minimum value is 2000 and the maximum value is 65535.
' I purposely excluded any QBWARE/1 from this program so that it
' could be easily modified by non-registered users. I also wrote it
' to be compatible with QB V2.00.
'*****************************************************************************
' This is a useful little routine that strips leading and trailing blanks
' from a string
Def FnCompress$(Text$)
Static x%
x% = 1
While x% <= Len(Text$) and Mid$(Text$, x%, 1) = " "
x% = x%+1
Wend
Text$ = Mid$(Text$, x%)
x% = Len(Text$)
If x% = 0 then
FnCompress$ = ""
Exit Def
End if
While x% <> 0 and Mid$(Text$, x%, 1) = " "
x% = x% -1
Wend
Text$ = Left$(Text$, x%)
FnCompress$ = Text$
End Def
' Start of program
Text.in$ = Command$ 'Get Command line
Gosub Parse.Data 'Get file name
Target.File$ = First.Field$
If Len(Target.File$) = 0 then
Goto Invalid.Parameter
End if
' If no file extension is present, then add default of .EXE
' If file extension is present, then it must be.EXE
x% = Instr(Target.File$,".")
If x% = 0 then
Target.File$ = Target.File$ + ".EXE"
Else
If Right$(Target.File$, Len(Target.File$) - x%) <> "EXE" then
Goto Invalid.Parameter
End if
End if
' If no parameters were passed in the command line, then we can assume
' a default of 16000 paragraphs (256K) will be used to update the EXE
' header
If Parse.Done% then
New.Paragraph% = 16000
Paragraph.size = 16000
Else
Gosub Parse.Data
First.Blnk% = Instr(First.Field$, " ")
If First.Blnk% = 0 then
Goto Invalid.Parameter
End if
' Check to see if the new paragraph size is acceptable
' (Between 2000 and 65535)
Paragraph.Size = Val(Right$(First.Field$, Len(First.Field$)-First.Blnk%))
If Paragraph.Size < 2000 or Paragraph.Size > 65535 then
Goto Invalid.Parameter
End if
' We need to make paragraph size an integer, but QB accepts integers only up 32767
' so we need a little fancy footwork
If Paragraph.Size > 32767 then
New.Paragraph% = (65536-Paragraph.Size)*-1
Else
New.Paragraph% = Paragraph.Size
End if
End if
' We need an ASCIIZ string to open the file
Target.File$ = Target.File$ + Chr$(0)
Filenum% = 1 'Just to show you a neat trick
Reclen% = 26 'We only the first few bytes
Open Target.File$ Access READ WRITE as #Filenum% Len = Reclen%
Field #Filenum%, _
1 as ExeSig1$, _ 'First part of EXE signature - 4Dh
1 as ExeSig2$, _ 'Second part - 5Ah
2 as FileLen$, _ 'File size - (MOD 512)
2 as FileSiz$, _ 'File size in 512 byte pages
2 as RelCnt$, _ 'Number of relocation table items
2 as HeadSiz$, _ 'Size of header - in paragraphs
2 as MinSiz$, _ 'Minimum memory req's
2 as MaxSiz$, _ 'Maximum size req's
12 as Filler$ 'The rest is unimportant for now
' If the file has no length, assume that it was just created by the previous
' and it was really not on the disk and should be deleted
If Lof(Filenum%) = 0 then
Close #Filenum%
Kill Target.File$
Goto Invalid.Parameter
End if
Get #Filenum%,1 'Get the first record
' Check signature to insure that we have a valid EXE file
If ExeSig1$ <> Chr$(77) and ExeSig2$ <> Chr$(90) then
Close #Filenum%
Goto Invalid.Parameter
End if
MaxSiz% = Cvi(MaxSiz$)
MaxSiz = MaxSiz%
If MaxSiz < 0 then
MaxSiz = 65536 + MaxSiz
End if
Lset MaxSiz$ = Mki$(New.Paragraph%)
Put #Filenum%,1 'Put the record back
Close #Filenum%
' Let you know it worked
Cls
Locate 1,1
Print "File: " + Target.File$
Print "Max Memory requirements changed from "; Maxsiz; " to ";Paragraph.Size
End 'That's all folks
Parse.Data:
First.Dlm% = Instr(Text.In$,"/") 'Find first delimeter
If First.Dlm% = 0 then 'If no more delimeters
First.Field$ = FnCompress$(Text.In$)
Parse.Done% = -1 'Indicate parse complete
Return
End if
First.Field$ = Left$(Text.In$,First.Dlm%-1) 'Remove first field
' This function willremove all leading al trailing blanks
First.Field$ = FnCompress$(First.Field$)
' Strip first field from th command line
Text.In$ = Right$(Text.In$, Len(Text.In$) - First.Dlm%)
Return
Invalid.Parameter:
Cls
Locate 1,1
Print "Invalid parameter " + Command$
End
Very nice! Thank you for this wonderful archive. I wonder why I found it only now. Long live the BBS file archives!
This is so awesome! 😀 I’d be cool if you could download an entire archive of this at once, though.
But one thing that puzzles me is the “mtswslnkmcjklsdlsbdmMICROSOFT” string. There is an article about it here. It is definitely worth a read: http://www.os2museum.com/wp/mtswslnk/