home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CP/M
/
CPM_CDROM.iso
/
cpm
/
turbopas
/
patch.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
1985-02-05
|
3KB
|
111 lines
Program Patch;
{
PATCH: Patches a Turbo program to save the command line and
suppress the automatic calls to terminal initialization.
Written by CSEB (EBM)
Net address: J. Eliot B. Moss <EBM@MIT-XX.ARPA>
Last update: 07 JUN 84, 1650 EDT
}
{$I-,W0}
const
SkelSize = 14;
var
Base : integer;
CmdAddr : integer; { place for the command line to be stored }
EndAddr : integer; { next free byte after code }
StartAddr: integer; { starting place of original Turbo code }
Buffer : array [0..255] of byte;
FileName : string[16];
CmdString: string[31] absolute $0080;
ComFile : file;
{ - - - level 1 - - - }
Function GetInt (Offset: integer): integer;
begin
GetInt := Buffer[Offset] + (Buffer[Offset + 1] SHL 8);
end; { function GetInt }
{ - - - level 1 - - - }
procedure PutInt (Offset, Value: integer);
begin
Buffer[Offset ] := Lo (Value);
Buffer[Offset + 1] := Hi (Value);
end; { procedure PutInt }
{ - - - level 1 - - - }
procedure Skeleton;
begin
Inline ($21 / $80 / $00 / { LXI H, $0080 }
$11 / $00 / $00 / { LXI D, .... }
$01 / $80 / $00 / { LXI B, $0080 }
$ED / $B0 / { LDIR }
$C3 / $00 / $00); { JMP .... }
end; { procedure Skeleton }
{ - - - level 0b - - - }
begin { program Patch }
FileName := CmdString;
while (Length (FileName) > 0) AND (FileName[1] = ' ') do
Delete (FileName, 1, 1);
if FileName = '' then
Writeln ('PATCH takes the name of the file to patch as an argument.')
else begin { do it all }
if Pos ('.', FileName) = 0 then
FileName := FileName + '.COM';
Assign (ComFile, FileName);
Reset (ComFile);
if IOResult <> 0 then
Writeln ('Sorry, could not open ', FileName, '.')
else begin { find things out }
Seek (ComFile, 0);
BlockRead (ComFile, Buffer, 1);
StartAddr := GetInt ($01);
if StartAddr <> $1FC9 then
Writeln ('Program appears to have been patched already!')
else begin { fix file }
Seek (ComFile, (StartAddr - $100) SHR 7);
BlockRead (ComFile, Buffer, 2);
Base := StartAddr AND $7F;
EndAddr := GetInt (Base + $10);
CmdAddr := GetInt (Base + $04);
Seek (ComFile, 0);
BlockRead (ComFile, Buffer, 1);
PutInt ($01, EndAddr);
Seek (ComFile, 0);
BlockWrite (ComFile, Buffer, 1);
Seek (ComFile, ($400 - $100) SHR 7);
BlockRead (ComFile, Buffer, 2);
Buffer[$D1] := Buffer[$D7]; { eliminate terminal calls }
Seek (ComFile, ($400 - $100) SHR 7);
BlockWrite (ComFile, Buffer, 2);
Seek (ComFile, (EndAddr - $100) SHR 7);
BlockRead (ComFile, Buffer, 2);
Base := EndAddr AND $7F;
Move (Mem[Addr (Skeleton)], Buffer[Base], SkelSize);
PutInt (Base + $04, CmdAddr );
PutInt (Base + $0C, StartAddr);
Seek (ComFile, (EndAddr - $100) SHR 7);
BlockWrite (ComFile, Buffer, (Base + SkelSize + 128) SHR 7);
Close (ComFile)
end { fix file }
end { find things out }
end { do it all }
end. { program Patch }