Date : Tue, 29 Jan 1985 17:17:18 GMT
From : Chuck McManis <cem%intelca.uucp@BRL-TGR.ARPA>
Subject: Turbo Design Flaw
As some of you probably already know there is a major design flaw in
Turbo PASCAL. Namely, THEY USE THE COMMAND LINE TO STORE DATA INTO!
For those of you have tried to use the CP/M command tail with the
statement
VAR CmdLine : String[127] absolute $80;
Will probably notice that if your command line is more often than
not completely munged when you try to read it. I have found that
if the VERY FIRST thing your program does is copy the command line
into a string variable with the loop
FOR I := 1 to Mem[$80] do Cmdline[I] := Chr(Mem[$80+I]);
CmdLine[0] := Mem[$80];
The most you can get seems to be around 37 characters of the original
command tail. The rest is corrupted(sp?) by Turbo's init procedure.
There is a solution however, or rather a hack, that will allow one
the full use of the command tail. The procedure is as follows :
o Put the following code in the program at or before the point where
you will use the command line :
Const
Start_Address = $1FC9; { Declare the value from your system }
Var
I : Integer;
CmdLine : String[127]
For I := 1 to Mem[Start_Address] Do
Cmdline[I] := Chr(Mem[Start_Address+I]);
CmdLine[0] := Chr(Mem[Start_Address]);
o Go into the Options menu, and set the mode to Com file. (Doesn't
make sense to have command line recognition when you are running
the code from memory.)
o Then set the start address from what it currently is to start_
address + 80h bytes. In my system the start address went from
1FC9h to 2049h.
o "Q"uit the options menu and compile the program. When completed
the list of memory used should come up with 128 bytes free at the
beginning of your program.
o Now use DDT or SID or ZSID on the resultant .COM file. Note the
length of the file (so you can save it again later) and dump
at address 100H. There will be a jump at 100 to the start address
you adjusted above. After that will be a copyright message from
Borland, and some zeros until about address 170h. Do the following
commands in the debugger :
A>ZSID FOO.COM
ZSID .........
xxyy HHHH HHHH <- The hex number xx is the number of pages you
#a100 need to save.
100 jp 130
103
#a130
130 ld hl,80
133 ld de,1fc9
136 ld bc,80
139 ldir
13B jp "start_Address" ; use the address that the jump at 100 originally
13E ; pointed to.
#G0
A>Save zz FOO.COM <- convert xx to decimal and use in place of zz.
You now have a .COM file, that will first save the command tail before
Turbo has a chance to Stomp on it. Argh! Why couldn't they design it
correctly in the first place!
--Chuck
--
- - - D I S C L A I M E R - - -
{ihnp4,fortune}!dual\ All opinions expressed herein are my
{qantel,idi}-> !intelca!cem own and not those of my employer, my
{ucbvax,hao}!hplabs/ friends, or my avocado plant. :-}