home *** CD-ROM | disk | FTP | other *** search
- program DROPDOS;
-
- {$V-} {$C-}
- {$I COMMON.PAS}
-
- procedure return;
- var f:file;
- begin
- assign(f,'bbs.com');
- print('Returning to BBS...');
- remove_port;
- if hangup then term_ready(false);
- execute(f);
- end;
-
- Type
- Str255=String[255];
- Str66=String[66];
- Var
- Command : str255;
- SubRet : Integer;
-
- Function SubProcess(CommandLine: Str255): Integer;
-
- Const
- SSSave: Integer=0;
- SPSave: Integer=0;
-
- Var
- Regs: Record Case Integer Of
- 1: (AX,BX,CX,DX,BP,SI,DI,DS,ES,Flags: Integer);
- 2: (AL,AH,BL,BH,CL,CH,DL,DH: Byte);
- End;
- FCB1,FCB2: Array [0..36] Of Byte;
- PathName: Str66;
- CommandTail: Str255;
- ParmTable: Record
- EnvSeg: Integer;
- ComLin: ^Integer;
- FCB1Pr: ^Integer;
- FCB2Pr: ^Integer;
- End;
-
- Begin
- If Pos(' ',CommandLine)=0 Then
- Begin
- PathName:=CommandLine+#0;
- CommandTail:=^M;
- End
- Else
- Begin
- PathName:=Copy(CommandLine,1,Pos(' ',CommandLine)-1)+#0;
- CommandTail:=Copy(CommandLine,Pos(' ',CommandLine),255)+^M;
- End;
- CommandTail[0]:=Pred(CommandTail[0]);
- With Regs Do
- Begin
- FillChar(FCB1,Sizeof(FCB1),0);
- AX:=$2901;
- DS:=Seg(CommandTail[1]);
- SI:=Ofs(CommandTail[1]);
- ES:=Seg(FCB1);
- DI:=Ofs(FCB1);
- MsDos(Regs); { Create FCB 1 }
- FillChar(FCB2,Sizeof(FCB2),0);
- AX:=$2901;
- ES:=Seg(FCB2);
- DI:=Ofs(FCB2);
- MsDos(Regs); { Create FCB 2 }
- ES:=CSeg;
- BX:=SSeg-CSeg+MemW[CSeg:MemW[CSeg:$0101]+$112];
- AH:=$4A;
- MsDos(Regs); { Deallocate unused memory }
- With ParmTable Do
- Begin
- EnvSeg:=MemW[CSeg:$002C];
- ComLin:=Addr(CommandTail);
- FCB1Pr:=Addr(FCB1);
- FCB2Pr:=Addr(FCB2);
- End;
- InLine($8D/$96/ PathName+1 / { <DX>:=Ofs(PathName[1]); }
- $8D/$9E/ ParmTable / { <BX>:=Ofs(ParmTable); }
- $B8/$00/$4B/ { <AX>:=$4B00; }
- $1E/$55/ { Save <DS>, <BP> }
- $16/$1F/ { <DS>:=Seg(PathName[1]); }
- $16/$07/ { <ES>:=Seg(ParmTable); }
- $2E/$8C/$16/ SSSave / { Save <SS> in SSSave }
- $2E/$89/$26/ SPSave / { Save <SP> in SPSave }
- $FA/ { Disable interrupts }
- $CD/$21/ { Call MS-DOS }
- $FA/ { Disable interrupts }
- $2E/$8B/$26/ SPSave / { Restore <SP> }
- $2E/$8E/$16/ SSSave / { Restore <SS> }
- $FB/ { Enable interrupts }
- $9C/$8F/$86/ Regs+18 / { Flags:=<CPU flags> }
- $89/$86/ Regs+0 / { AX:=<AX>; }
- $5D/$1F); { Restore <BP>,<DS> }
- If (Flags And 1)<>0 Then SubProcess:=AX
- Else SubProcess:=0;
- End;
- End;
-
- Function GetComSpec: Str66;
- Type
- Env=Array [0..32767] Of Char;
- Var
- EPtr: ^Env;
- EStr: Str255;
- Done: Boolean;
- JI: Integer;
-
- Begin
- EPtr:=Ptr(MemW[CSeg:$002C],0);
- JI:=0;
- Done:=False;
- EStr:='';
- Repeat
- If EPtr^[JI]=#0 Then
- Begin
- If EPtr^[JI+1]=#0 Then Done:=True;
- If Copy(EStr,1,8)='COMSPEC=' Then
- Begin
- GetComSpec:=Copy(EStr,9,100);
- Done:=True;
- End;
- EStr:='';
- End
- Else EStr:=EStr+EPtr^[JI];
- JI:=JI+1;
- Until Done;
- End;
-
- Procedure DropDOS;
- var
- t : real;
- begin
- Command:=GetComSpec;
- t:=timer;
- writeln('Type "EXIT" to quit.');
- SubRet:=Subprocess(Command);
- chdir('C:\SOURCE');
- clrscr;
- chattime:=chattime+timer-t;
- dump;
- end;
-
- BEGIN
- iport;
- DROPDOS;
- RETURN;
- END.