* go32v1, go32v2 recompiles with the new objects

* remake3 works again with go32v2
  - removed some "optimizes" from daniel which were wrong
This commit is contained in:
peter 1998-05-22 00:39:22 +00:00
parent 92924c2075
commit b0b403d498
10 changed files with 1485 additions and 1680 deletions

View File

@ -3,6 +3,8 @@
This file is part of the Free Pascal run time library.
Copyright (c) 1993,97 by the Free Pascal development team.
Dos unit for BP7 compatible RTL
See the file COPYING.FPC, included in this distribution,
for details about the copyright.
@ -68,9 +70,7 @@ Type
{$i filerec.inc}
{$i textrec.inc}
{$PACKRECORDS 1}
DateTime = record
DateTime = packed record
Year,
Month,
Day,
@ -79,8 +79,9 @@ Type
Sec : word;
End;
{$IFDEF GO32V2}
searchrec = record
{$ifdef GO32V2}
searchrec = packed record
fill : array[1..21] of byte;
attr : byte;
time : longint;
@ -92,7 +93,8 @@ Type
Registers = Go32.Registers;
{$ELSE}
searchrec = record
searchrec = packed record
fill : array[1..21] of byte;
attr : byte;
time : longint;
@ -101,7 +103,7 @@ Type
name : string[15]; { the same size as declared by (DJ GNU C) }
end;
registers = record
registers = packed record
case i : integer of
0 : (ax,f1,bx,f2,cx,f3,dx,f4,bp,f5,si,f51,di,f6,ds,f7,es,f8,flags,fs,gs : word);
1 : (al,ah,f9,f10,bl,bh,f11,f12,cl,ch,f13,f14,dl,dh : byte);
@ -109,8 +111,6 @@ Type
end;
{$endif GO32V1}
{$PACKRECORDS 2}
Var
DosError : integer;
@ -249,54 +249,59 @@ var
end;
{$endif GO32V2}
procedure msdos(var regs : registers);
begin
procedure msdos(var regs : registers);
begin
intr($21,regs);
end;
end;
{******************************************************************************
--- Info / Date / Time ---
******************************************************************************}
function dosversion : word;
begin
function dosversion : word;
begin
dosregs.ax:=$3000;
msdos(dosregs);
dosversion:=dosregs.ax;
end;
end;
procedure getdate(var year,month,mday,wday : word);
begin
procedure getdate(var year,month,mday,wday : word);
begin
dosregs.ax:=$2a00;
msdos(dosregs);
wday:=dosregs.al;
year:=dosregs.cx;
month:=dosregs.dh;
mday:=dosregs.dl;
end;
end;
procedure setdate(year,month,day : word);
begin
procedure setdate(year,month,day : word);
begin
dosregs.cx:=year;
dosregs.dh:=month;
dosregs.dl:=day;
dosregs.ah:=$2b;
msdos(dosregs);
LoadDosError;
end;
end;
procedure gettime(var hour,minute,second,sec100 : word);
begin
procedure gettime(var hour,minute,second,sec100 : word);
begin
dosregs.ah:=$2c;
msdos(dosregs);
hour:=dosregs.ch;
minute:=dosregs.cl;
second:=dosregs.dh;
sec100:=dosregs.dl;
end;
end;
procedure settime(hour,minute,second,sec100 : word);
begin
procedure settime(hour,minute,second,sec100 : word);
begin
dosregs.ch:=hour;
dosregs.cl:=minute;
dosregs.dh:=second;
@ -304,40 +309,39 @@ var
dosregs.ah:=$2d;
msdos(dosregs);
LoadDosError;
end;
end;
Procedure packtime(var t : datetime;var p : longint);
Begin
Procedure packtime(var t : datetime;var p : longint);
Begin
p:=(t.sec shr 1)+(t.min shl 5)+(t.hour shl 11)+(t.day shl 16)+(t.month shl 21)+((t.year-1980) shl 25);
End;
End;
Procedure unpacktime(p : longint;var t : datetime);
Begin
with t do
begin
sec:=(p and 31) shl 1;
min:=(p shr 5) and 63;
hour:=(p shr 11) and 31;
day:=(p shr 16) and 31;
month:=(p shr 21) and 15;
year:=(p shr 25)+1980;
end;
End;
Procedure unpacktime(p : longint;var t : datetime);
Begin
t.sec:=(p and 31) shl 1;
t.min:=(p shr 5) and 63;
t.hour:=(p shr 11) and 31;
t.day:=(p shr 16) and 31;
t.month:=(p shr 21) and 15;
t.year:=(p shr 25)+1980;
End;
{******************************************************************************
--- Exec ---
******************************************************************************}
var
var
lastdosexitcode : word;
{$ifdef GO32V2}
{ this code is just the most basic part of dosexec.c from
the djgpp code }
procedure exec(const path : pathstr;const comline : comstr);
procedure do_system(p,c : string);
{
{
Table 0931
Format of EXEC parameter block for AL=00h,01h,04h:
Offset Size Description
@ -350,14 +354,14 @@ var
0Eh DWORD (AL=01h) will hold subprogram's initial SS:SP on return
12h DWORD (AL=01h) will hold entry point (CS:IP) on return
INT 21 4B--
}
}
type
realptr = record
procedure exec(const path : pathstr;const comline : comstr);
type
realptr = packed record
ofs,seg : word;
end;
texecblock = record
texecblock = packed record
envseg : word;
comtail : realptr;
firstFCB : realptr;
@ -365,10 +369,18 @@ var
iniStack : realptr;
iniCSIP : realptr;
end;
var
current_dos_buffer_pos,
arg_ofs,
i,la_env,
la_p,la_c,la_e,
fcb1_la,fcb2_la : longint;
execblock : texecblock;
c,p : string;
var current_dos_buffer_pos : longint;
function paste_to_dos(src : string) : boolean;
var c : array[0..255] of char;
var
c : array[0..255] of char;
begin
paste_to_dos:=false;
if current_dos_buffer_pos+length(src)+1>transfer_buffer+tb_size then
@ -379,23 +391,27 @@ var
current_dos_buffer_pos:=current_dos_buffer_pos+length(src)+1;
paste_to_dos:=true;
end;
var
i,la_env,la_p,la_c,la_e,fcb1_la,fcb2_la : longint;
arg_ofs : longint;
execblock : texecblock;
begin
la_env:=transfer_buffer;
while (la_env mod 16)<>0 do inc(la_env);
current_dos_buffer_pos:=la_env;
for i:=1 to envcount do
begin
paste_to_dos(envstr(i));
end;
paste_to_dos(''); { adds a double zero at the end }
{ allow slash as backslash }
begin
{ create command line }
move(comline[0],c[1],length(comline)+1);
c[length(comline)+2]:=#13;
c[0]:=char(length(comline)+2);
{ create path }
p:=path;
for i:=1 to length(p) do
if p[i]='/' then p[i]:='\';
if p[i]='/' then
p[i]:='\';
{ create buffer }
la_env:=transfer_buffer;
while (la_env and 15)<>0 do
inc(la_env);
current_dos_buffer_pos:=la_env;
{ copy environment }
for i:=1 to envcount do
paste_to_dos(envstr(i));
paste_to_dos(''); { adds a double zero at the end }
{ allow slash as backslash }
la_p:=current_dos_buffer_pos;
paste_to_dos(p);
la_c:=current_dos_buffer_pos;
@ -405,47 +421,47 @@ var
la_e:=la_e+16;
fcb2_la:=la_e;
la_e:=la_e+16;
{ allocate FCB see dosexec code }
dosregs.ax:=$2901;
{ allocate FCB see dosexec code }
arg_ofs:=1;
while (c[arg_ofs]=' ') or (c[arg_ofs]=#9) do inc(arg_ofs);
dosregs.ds:=(la_c+arg_ofs) div 16;
dosregs.si:=(la_c+arg_ofs) mod 16;
dosregs.es:=fcb1_la div 16;
dosregs.di:=fcb1_la mod 16;
while (c[arg_ofs] in [' ',#9]) do
inc(arg_ofs);
dosregs.ax:=$2901;
dosregs.ds:=(la_c+arg_ofs) shr 4;
dosregs.esi:=(la_c+arg_ofs) and 15;
dosregs.es:=fcb1_la shr 4;
dosregs.edi:=fcb1_la and 15;
msdos(dosregs);
{ allocate second FCB see dosexec code }
repeat
inc(arg_ofs);
until (c[arg_ofs]=' ') or
(c[arg_ofs]=#9) or
(c[arg_ofs]=#13);
until (c[arg_ofs] in [' ',#9,#13]);
if c[arg_ofs]<>#13 then
begin
repeat
inc(arg_ofs);
while (c[arg_ofs]=' ') or (c[arg_ofs]=#9) do inc(arg_ofs);
until not (c[arg_ofs] in [' ',#9]);
end;
{ allocate second FCB see dosexec code }
dosregs.ax:=$2901;
dosregs.ds:=(la_c+arg_ofs) div 16;
dosregs.si:=(la_c+arg_ofs) mod 16;
dosregs.es:=fcb2_la div 16;
dosregs.di:=fcb2_la mod 16;
dosregs.ds:=(la_c+arg_ofs) shr 4;
dosregs.si:=(la_c+arg_ofs) and 15;
dosregs.es:=fcb2_la shr 4;
dosregs.di:=fcb2_la and 15;
msdos(dosregs);
with execblock do
begin
envseg:=la_env div 16;
comtail.seg:=la_c div 16;
comtail.ofs:=la_c mod 16;
firstFCB.seg:=fcb1_la div 16;
firstFCB.ofs:=fcb1_la mod 16;
secondFCB.seg:=fcb2_la div 16;
secondFCB.ofs:=fcb2_la mod 16;
envseg:=la_env shr 4;
comtail.seg:=la_c shr 4;
comtail.ofs:=la_c and 15;
firstFCB.seg:=fcb1_la shr 4;
firstFCB.ofs:=fcb1_la and 15;
secondFCB.seg:=fcb2_la shr 4;
secondFCB.ofs:=fcb2_la and 15;
end;
seg_move(get_ds,longint(@execblock),dosmemselector,la_e,sizeof(texecblock));
dosregs.edx:=la_p mod 16;
dosregs.ds:=la_p div 16;
dosregs.ebx:=la_e mod 16;
dosregs.es:=la_e div 16;
dosregs.edx:=la_p and 15;
dosregs.ds:=la_p shr 4;
dosregs.ebx:=la_e and 15;
dosregs.es:=la_e shr 4;
dosregs.ax:=$4b00;
msdos(dosregs);
LoadDosError;
@ -457,92 +473,81 @@ var
end
else
LastDosExitCode:=0;
end;
{ var
p,c : array[0..255] of char; }
var c : string;
begin
doserror:=0;
{ move(path[1],p,length(path));
p[length(path)]:=#0; }
move(comline[0],c[1],length(comline)+1);
c[length(comline)+2]:=#13;
c[0]:=char(length(comline)+2);
do_system(path,c);
end;
end;
{$else GO32V2}
procedure exec(const path : pathstr;const comline : comstr);
procedure do_system(p : pchar);
begin
procedure exec(const path : pathstr;const comline : comstr);
var
i : longint;
b : array[0..255] of char;
begin
doserror:=0;
for i:=1to length(path) do
if path[i]='/' then
b[i-1]:='\'
else
b[i-1]:=path[i];
b[i]:=' ';
inc(i);
move(comline[1],b[i],length(comline));
inc(i,length(comline));
b[i]:=#0;
asm
movl 12(%ebp),%ebx
leal b,%ebx
movw $0xff07,%ax
int $0x21
movw %ax,_LASTDOSEXITCODE
end;
end;
end;
var
i : longint;
execute : string;
b : array[0..255] of char;
{$endif}
begin
doserror:=0;
execute:=path+' '+comline;
{ allow slash as backslash for the program name only }
for i:=1 to length(path) do
if execute[i]='/' then execute[i]:='\';
move(execute[1],b,length(execute));
b[length(execute)]:=#0;
do_system(b);
end;
{$endif GO32V2}
function dosexitcode : word;
begin
function dosexitcode : word;
begin
dosexitcode:=lastdosexitcode;
end;
end;
procedure getcbreak(var breakvalue : boolean);
begin
procedure getcbreak(var breakvalue : boolean);
begin
dosregs.ax:=$3300;
msdos(dosregs);
breakvalue:=dosregs.dl<>0;
end;
end;
procedure setcbreak(breakvalue : boolean);
begin
procedure setcbreak(breakvalue : boolean);
begin
dosregs.ax:=$3301;
dosregs.dl:=ord(breakvalue);
msdos(dosregs);
end;
end;
procedure getverify(var verify : boolean);
begin
procedure getverify(var verify : boolean);
begin
dosregs.ah:=$54;
msdos(dosregs);
verify:=dosregs.al<>0;
end;
end;
procedure setverify(verify : boolean);
begin
procedure setverify(verify : boolean);
begin
dosregs.ah:=$2e;
dosregs.al:=ord(verify);
msdos(dosregs);
end;
end;
{******************************************************************************
--- Disk ---
******************************************************************************}
function diskfree(drive : byte) : longint;
begin
function diskfree(drive : byte) : longint;
begin
dosregs.dl:=drive;
dosregs.ah:=$36;
msdos(dosregs);
@ -550,11 +555,11 @@ var
diskfree:=dosregs.ax*dosregs.bx*dosregs.cx
else
diskfree:=-1;
end;
end;
function disksize(drive : byte) : longint;
begin
function disksize(drive : byte) : longint;
begin
dosregs.dl:=drive;
dosregs.ah:=$36;
msdos(dosregs);
@ -562,7 +567,8 @@ var
disksize:=dosregs.ax*dosregs.cx*dosregs.dx
else
disksize:=-1;
end;
end;
{******************************************************************************
--- Findfirst FindNext ---
@ -814,10 +820,13 @@ var
{Now remove also all references to '\..\' + of course previous dirs..}
repeat
i:=pos('\..\',pa);
if i<>0 then j:=i-1;
if i<>0 then
begin
j:=i-1;
while (j>1) and (pa[j]<>'\') do
dec (j);
delete (pa,j,i-j+3);
end;
until i=0;
{Remove End . and \}
if (length(pa)>0) and (pa[length(pa)]='.') then
@ -866,8 +875,6 @@ var
end;
end;
{$ifdef GO32V2}
procedure getftime(var f;var time : longint);
begin
dosregs.bx:=textrec(f).handle;
@ -887,67 +894,57 @@ var
doserror:=dosregs.al;
end;
procedure getfattr(var f;var attr : word);
begin
procedure getfattr(var f;var attr : word);
{$ifndef GO32V2}
var
n : array[0..255] of char;
{$endif}
begin
{$ifdef GO32V2}
copytodos(filerec(f).name,strlen(filerec(f).name)+1);
dosregs.ax:=$4300;
dosregs.edx:=transfer_buffer and 15;
dosregs.ds:=transfer_buffer shr 4;
{$else}
strpcopy(n,filerec(f).name);
dosregs.edx:=longint(@n);
{$endif}
dosregs.ax:=$4300;
msdos(dosregs);
LoadDosError;
Attr:=dosregs.cx;
end;
end;
procedure setfattr(var f;attr : word);
begin
procedure setfattr(var f;attr : word);
{$ifndef GO32V2}
var
n : array[0..255] of char;
{$endif}
begin
{$ifdef GO32V2}
copytodos(filerec(f).name,strlen(filerec(f).name)+1);
dosregs.ax:=$4301;
dosregs.edx:=transfer_buffer mod 16;
dosregs.ds:=transfer_buffer div 16;
dosregs.cx:=attr;
msdos(dosregs);
LoadDosError;
end;
{$else GO32V2}
procedure getfattr(var f;var attr : word);
var
n : array[0..255] of char;
r : registers;
begin
{$else}
strpcopy(n,filerec(f).name);
dosregs.ax:=$4300;
dosregs.edx:=longint(@n);
msdos(dosregs);
LoadDosError;
attr:=dosregs.cx;
end;
procedure setfattr(var f;attr : word);
var
n : array[0..255] of char;
r : registers;
begin
strpcopy(n,filerec(f).name);
{$endif}
dosregs.ax:=$4301;
dosregs.edx:=longint(@n);
dosregs.cx:=attr;
msdos(dosregs);
LoadDosError;
end;
{$endif GO32V2}
end;
{******************************************************************************
--- Environment ---
******************************************************************************}
function envcount : longint;
var
function envcount : longint;
var
hp : ppchar;
begin
begin
hp:=envp;
envcount:=0;
while assigned(hp^) do
@ -955,26 +952,26 @@ var
inc(envcount);
hp:=hp+4;
end;
end;
end;
function envstr(index : integer) : string;
begin
function envstr(index : integer) : string;
begin
if (index<=0) or (index>envcount) then
begin
envstr:='';
exit;
end;
envstr:=strpas(ppchar(envp+4*(index-1))^);
end;
end;
Function GetEnv(envvar: string): string;
var
Function GetEnv(envvar: string): string;
var
hp : ppchar;
hs : string;
eqpos : longint;
begin
begin
envvar:=upcase(envvar);
hp:=envp;
getenv:='';
@ -989,7 +986,8 @@ var
end;
hp:=hp+4;
end;
end;
end;
{******************************************************************************
--- Not Supported ---
@ -1011,7 +1009,12 @@ End;
end.
{
$Log$
Revision 1.3 1998-05-21 19:30:47 peter
Revision 1.4 1998-05-22 00:39:22 peter
* go32v1, go32v2 recompiles with the new objects
* remake3 works again with go32v2
- removed some "optimizes" from daniel which were wrong
Revision 1.3 1998/05/21 19:30:47 peter
* objects compiles for linux
+ assign(pchar), assign(char), rename(pchar), rename(char)
* fixed read_text_as_array

View File

@ -205,8 +205,8 @@ crt$(PPUEXT) : ../crt.pp $(INC)/textrec.inc go32$(PPUEXT) $(SYSTEMPPU)
$(PP) $(OPT) crt $(REDIR)
$(DEL) crt.pp
objects$(PPUEXT) : ../objects.pp $(SYSTEMPPU)
$(COPY) ../objects.pp .
objects$(PPUEXT) : $(INC)/objects.pp objinc.inc $(SYSTEMPPU)
$(COPY) $(INC)/objects.pp .
$(PP) $(OPT) objects.pp $(REDIR)
$(DEL) objects.pp
@ -234,15 +234,15 @@ mouse$(PPUEXT) : ../mouse.pp $(SYSTEMPPU)
$(PP) $(OPT) mouse.pp $(REDIR)
$(DEL) mouse.pp
getopts$(PPUEXT) : $(PROCINC)/getopts.pp $(SYSTEMPPU)
$(COPY) $(PROCINC)/getopts.pp .
getopts$(PPUEXT) : $(INC)/getopts.pp $(SYSTEMPPU)
$(COPY) $(INC)/getopts.pp .
$(PP) $(OPT) getopts.pp $(REDIR)
$(DEL) getopts.pp
graph$(PPUEXT) : ../graph.pp go32$(PPUEXT) $(SYSTEMPPU) mmx$(PPUEXT) \
$(PPIDEPS)
PPIFILES:=$(wildcard $(PPI)/*.ppi)
graph$(PPUEXT) : ../graph.pp go32$(PPUEXT) $(SYSTEMPPU) mmx$(PPUEXT) $(PPIFILES)
$(COPY) ../graph.pp .
$(PP) $(OPT) -Up$(PPI) graph $(REDIR)
$(PP) $(OPT) -I$(PPI) graph $(REDIR)
$(DEL) graph.pp

View File

@ -11,7 +11,7 @@
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
**********************************************************************}
{$define dos}
{$define go32v1}
{$undef go32v2}
{$undef os2}
{$undef linux}
@ -19,27 +19,9 @@
{
$Log$
Revision 1.1 1998-03-25 11:18:41 root
Initial revision
Revision 1.2 1998-05-22 00:39:31 peter
* go32v1, go32v2 recompiles with the new objects
* remake3 works again with go32v2
- removed some "optimizes" from daniel which were wrong
Revision 1.3 1998/01/26 11:57:08 michael
+ Added log at the end
Working file: rtl/dos/go32v1/os.inc
description:
----------------------------
revision 1.2
date: 1997/12/01 12:24:05; author: michael; state: Exp; lines: +13 -0
+ added copyright reference in header.
----------------------------
revision 1.1
date: 1997/11/27 08:33:53; author: michael; state: Exp;
Initial revision
----------------------------
revision 1.1.1.1
date: 1997/11/27 08:33:53; author: michael; state: Exp; lines: +0 -0
FPC RTL CVS start
=============================================================================
}

View File

@ -3,6 +3,8 @@
# This file is part of the Free Pascal run time library.
# Copyright (c) 1993,97 by the Free Pascal development team.
#
# Go32V1 Startup code
#
# See the file COPYING.FPC, included in this distribution,
# for details about the copyright.
#
@ -11,14 +13,13 @@
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
#
# **********************************************************************
#///*
#//** Called as start(argc, argv, envp)
#//*/
#///* gs:edx points to prog_info structure. All other registers are OBSOLETE
#//** but included for backwards compatibility
#//*/
.text
#
# Called as start(argc, argv, envp)
#
# gs:edx points to prog_info structure. All other registers are OBSOLETE
# but included for backwards compatibility
#
.text
.globl _start
_start:
.globl start
@ -36,7 +37,7 @@ start:
movw %ds,%ax
cmpw %cx,%ax
je Lcopy_none
# /* set the right size */
# set the right size
movl $40,U_SYSTEM_GO32_INFO_BLOCK
movl %gs:(%edx), %ecx
@ -84,9 +85,9 @@ Lcopy_done:
movw U_SYSTEM_GO32_INFO_BLOCK+36,%ax
movw %ax,_run_mode
#/* I need a value for the stack bottom, */
#/* but I don't know how to get it from go32 */
#/* I suppose the stack is 4Ko long, is this true ? */
# I need a value for the stack bottom,
# but I don't know how to get it from go32
# I suppose the stack is 4Ko long, is this true ?
movl %esp,%eax
subl $0x4000,%eax
movl %eax,__stkbottom
@ -105,15 +106,16 @@ Lcopy_done:
movl %esp,%ebx
movl 8(%ebx),%eax
movl %eax,_environ
movl %eax,U_SYSTEM_ENVIRON
movl %eax,U_SYSTEM_ENVP
movl 4(%ebx),%eax
movl %eax,_args
movl %eax,U_SYSTEM_ARGV
movl (%ebx),%eax
movl %eax,_argc
movl %eax,U_SYSTEM_ARGC
call PASCALMAIN
exit_again:
movl $0x4c00,%eax
int $0x21
@ -121,23 +123,31 @@ exit_again:
ret
.data
.data
.globl _argc
_argc:
.long 0
.globl _args
_args:
.long 0
.globl _run_mode
_run_mode:
.word 0
.globl _core_selector
_core_selector:
.word 0
.globl _environ
_environ:
.long 0
.globl __stkbottom
__stkbottom:
.long 0
.globl _run_mode
_run_mode:
.word 0
.globl _core_selector
_core_selector:
.word 0
.globl ___pid
___pid:
.long 42
@ -155,30 +165,21 @@ _ScreenSecondary:
.long 0
.globl __hard_master
.globl __hard_slave
.globl __core_select
__hard_master:
.byte 0
.globl __hard_slave
__hard_slave:
.byte 0
.globl __core_select
__core_select:
.short 0
.globl __stkbottom
__stkbottom:
.long 0
# .globl U_SYSTEM_GO32_INFO_BLOCK
# U_SYSTEM_GO32_INFO_BLOCK:
# .long __go32_end - U_SYSTEM_GO32_INFO_BLOCK #//* size */
# .long 0 #//* offs 4 linear_address_of_primary_screen; */
# .long 0 #//* offs 8 linear_address_of_secondary_screen; */
# .long 0 #//* offs 12 linear_address_of_transfer_buffer; */
# .long 0 #//* offs 16 size_of_transfer_buffer; >= 4k */
# .long 0 #//* offs 20 pid; */
# .byte 0 #//* offs 24 u_char master_interrupt_controller_base; */
# .byte 0 #//* offs 25 u_char slave_interrupt_controller_base; */
# .word 0 #//* offs 26 u_short selector_for_linear_memory; */
# .long 0 #//* offs 28 u_long linear_address_of_stub_info_structure; */
# .long 0 #//* offs 32 u_long linear_address_of_original_psp; */
# .word 0 #//* offs 36 u_short run_mode; */
# .word 0 #//* offs 38 u_short run_mode_info; */
#__go32_end:
#
# $Log$
# Revision 1.3 1998-05-22 00:39:32 peter
# * go32v1, go32v2 recompiles with the new objects
# * remake3 works again with go32v2
# - removed some "optimizes" from daniel which were wrong
#
#

View File

@ -12,30 +12,45 @@
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
**********************************************************************}
{ system unit for go32v1 }
{$define DOS}
unit system;
interface
{ no stack check in system }
{$S-}
{$I os.inc}
interface
{ include system-independent routine headers }
{ die betriebssystemunabhangigen Deklarationen einfuegen: }
{$I systemh.inc}
{$I systemh.inc}
{ include heap support headers }
{$I heaph.inc}
{$I heaph.inc}
const
UnusedHandle=$ffff;
StdInputHandle=0;
StdOutputHandle=1;
StdErrorHandle=2;
{ Default filehandles }
UnusedHandle = $ffff;
StdInputHandle = 0;
StdOutputHandle = 1;
StdErrorHandle = 2;
{ Default memory segments (Tp7 compatibility) }
seg0040 = $0040;
segA000 = $A000;
segB000 = $B000;
segB800 = $B800;
var
{ C-compatible arguments and environment }
argc : longint;
argv : ppchar;
envp : ppchar;
type
{$PACKRECORDS 1}
t_stub_info = record
{ Dos Extender info }
p_stub_info = ^t_stub_info;
t_stub_info = packed record
magic : array[0..15] of char;
size : longint;
minstack : longint;
@ -51,9 +66,8 @@ type
argv0 : array [0..15] of char;
dpmi_server : array [0..15] of char;
end;
p_stub_info = ^t_stub_info;
t_go32_info_block = record
t_go32_info_block = packed record
size_of_this_structure_in_bytes : longint; {offset 0}
linear_address_of_primary_screen : longint; {offset 4}
linear_address_of_secondary_screen : longint; {offset 8}
@ -68,30 +82,29 @@ type
run_mode : word; {offset 36}
run_mode_info : word; {offset 38}
end;
{$PACKRECORDS NORMAL}
var
stub_info : p_stub_info;
go32_info_block : t_go32_info_block;
environ : ppchar;
implementation
{ Needed for CRT unit }
function do_read(h,addr,len : longint) : longint;
{ include system independent routines }
{$I system.inc}
implementation
{$S-}
procedure st1(stack_size : longint);[public,alias: 'STACKCHECK'];
{ include system independent routines }
begin
{ called when trying to get local stack }
{ if the compiler directive $S is set }
{ this function must preserve esi !!!! }
{ because esi is set by the calling }
{ proc for methods }
{ it must preserve all registers !! }
{$I system.inc}
procedure int_stackcheck(stack_size:longint);[public,alias: 'STACKCHECK'];
begin
{ called when trying to get local stack
if the compiler directive $S is set
this function must preserve esi !!!!
because esi is set by the calling
proc for methods
it must preserve all registers !! }
asm
pushl %eax
pushl %ebx
@ -118,86 +131,60 @@ var
popl %eax
end['EAX','EBX'];
RunError(202);
{ this needs a local variable }
{ so the function called itself !! }
{ Writeln('low in stack ');
RunError(202); }
end;
end;
procedure halt(errnum : byte);
begin
{$I386_ATT}
procedure halt(errnum : byte);
begin
do_exit;
flush(stderr);
asm
movl $0x4c00,%eax
movb 8(%ebp),%al
movb errnum,%al
int $0x21
end;
end;
end;
function paramcount : longint;
begin
asm
movl _argc,%eax
decl %eax
leave
ret
end ['EAX'];
end;
function paramcount : longint;
begin
paramcount := argc - 1;
end;
function paramstr(l : longint) : string;
function args : pointer;
function paramstr(l : longint) : string;
begin
if (l>=0) and (l+1<=argc) then
paramstr:=strpas(argv[l])
else
paramstr:='';
end;
begin
asm
movl _args,%eax
leave
ret
end ['EAX'];
end;
var
p : ^pchar;
begin
if (l>=0) and (l<=paramcount) then
begin
p:=args;
paramstr:=strpas(p[l]);
end
else paramstr:='';
end;
procedure randomize;
var
hl : longint;
begin
asm
procedure randomize;assembler;
asm
movb $0x2c,%ah
int $0x21
movw %cx,-4(%ebp)
movw %dx,-2(%ebp)
end;
randseed:=hl;
end;
shll $16,%ecx
movw %dx,%cx
movl %ecx,randseed
end;
{ use standard heap management }
{ sbrk function of go32v1 }
function Sbrk(size : longint) : longint;
begin
asm
{*****************************************************************************
Heap Management
*****************************************************************************}
function Sbrk(size : longint) : longint;assembler;
asm
movl size,%ebx
movl $0x4a01,%eax
int $0x21
movl %eax,__RESULT
end;
end;
end;
{ include standard heap management }
{$I heap.inc}
@ -215,15 +202,13 @@ begin
end;
procedure do_close(h : longint);
begin
asm
movl 8(%ebp),%ebx
procedure do_close(h : longint);assembler;
asm
movl h,%ebx
movb $0x3e,%ah
pushl %ebp
intl $0x21
popl %ebp
end;
end;
@ -231,14 +216,14 @@ procedure do_erase(p : pchar);
begin
AllowSlash(p);
asm
movl 8(%ebp),%edx
movl p,%edx
movb $0x41,%ah
pushl %ebp
int $0x21
popl %ebp
jnc .LERASE1
movw %ax,U_SYSTEM_INOUTRES;
.LERASE1:
movw %ax,inoutres
.LERASE1:
end;
end;
@ -248,121 +233,102 @@ begin
AllowSlash(p1);
AllowSlash(p2);
asm
movl 8(%ebp),%edx
movl 12(%ebp),%edi
movl p1,%edx
movl p2,%edi
movb $0x56,%ah
pushl %ebp
int $0x21
popl %ebp
jnc .LRENAME1
movw %ax,U_SYSTEM_INOUTRES;
.LRENAME1:
movw %ax,inoutres
.LRENAME1:
end;
end;
function do_write(h,addr,len : longint) : longint;
begin
asm
movl 16(%ebp),%ecx
movl 12(%ebp),%edx
movl 8(%ebp),%ebx
function do_write(h,addr,len : longint) : longint;assembler;
asm
movl len,%ecx
movl addr,%edx
movl h,%ebx
movb $0x40,%ah
int $0x21
jnc .LDOSWRITE1
movw %ax,U_SYSTEM_INOUTRES;
.LDOSWRITE1:
movl %eax,-4(%ebp)
end;
movw %ax,inoutres
xorl %eax,%eax
.LDOSWRITE1:
end;
function do_read(h,addr,len : longint) : longint;
begin
asm
movl 16(%ebp),%ecx
movl 12(%ebp),%edx
movl 8(%ebp),%ebx
function do_read(h,addr,len : longint) : longint;assembler;
asm
movl len,%ecx
movl addr,%edx
movl h,%ebx
movb $0x3f,%ah
int $0x21
jnc .LDOSREAD1
movw %ax,U_SYSTEM_INOUTRES;
movw %ax,inoutres
xorl %eax,%eax
.LDOSREAD1:
leave
ret $12
end;
.LDOSREAD1:
end;
function do_filepos(handle : longint) : longint;
begin
asm
movb $0x42,%ah
movb $0x1,%al
movl 8(%ebp),%ebx
function do_filepos(handle : longint) : longint;assembler;
asm
movl $0x4201,%eax
movl handle,%ebx
xorl %ecx,%ecx
xorl %edx,%edx
pushl %ebp
int $0x21
popl %ebp
jnc .LDOSFILEPOS1
movw %ax,U_SYSTEM_INOUTRES;
movw %ax,inoutres
xorl %eax,%eax
jmp .LDOSFILEPOS2
.LDOSFILEPOS1:
.LDOSFILEPOS1:
shll $16,%edx
movzwl %ax,%eax
orl %edx,%eax
.LDOSFILEPOS2:
leave
ret $4
end;
.LDOSFILEPOS2:
end;
procedure do_seek(handle,pos : longint);
begin
asm
procedure do_seek(handle,pos : longint);assembler;
asm
movl $0x4200,%eax
movl 8(%ebp),%ebx
movl 12(%ebp),%edx
movl handle,%ebx
movl pos,%edx
movl %edx,%ecx
shrl $16,%ecx
pushl %ebp
int $0x21
popl %ebp
jnc .LDOSSEEK1
movw %ax,U_SYSTEM_INOUTRES;
.LDOSSEEK1:
leave
ret $8
end;
movw %ax,inoutres
.LDOSSEEK1:
end;
function do_seekend(handle : longint) : longint;
begin
asm
function do_seekend(handle : longint) : longint;assembler;
asm
movl $0x4202,%eax
movl 8(%ebp),%ebx
movl handle,%ebx
xorl %ecx,%ecx
xorl %edx,%edx
pushl %ebp
int $0x21
popl %ebp
jnc .Lset_at_end1
movw %ax,U_SYSTEM_INOUTRES;
movw %ax,inoutres
xorl %eax,%eax
jmp .Lset_at_end2
.Lset_at_end1:
.Lset_at_end1:
shll $16,%edx
movzwl %ax,%eax
orl %edx,%eax
.Lset_at_end2:
leave
ret $4
end;
.Lset_at_end2:
end;
@ -376,31 +342,26 @@ begin
end;
procedure do_truncate(handle,pos : longint);
begin
asm
procedure do_truncate(handle,pos : longint);assembler;
asm
movl $0x4200,%eax
movl 8(%ebp),%ebx
movl 12(%ebp),%edx
movl handle,%ebx
movl pos,%edx
movl %edx,%ecx
shrl $16,%ecx
pushl %ebp
int $0x21
popl %ebp
jc .LTruncate1
movl 8(%ebp),%ebx
movl 12(%ebp),%edx
movl handle,%ebx
movl %ebp,%edx
xorl %ecx,%ecx
movb $0x40,%ah
int $0x21
jnc .LTruncate2
.LTruncate1:
movw %ax,U_SYSTEM_INOUTRES;
.LTruncate2:
leave
ret $8
end;
.LTruncate1:
movw %ax,inoutres
.LTruncate2:
end;
@ -466,15 +427,15 @@ begin
exit;
end;
asm
movl $0xff02,%ax
movl -4(%ebp),%ecx
movl 12(%ebp),%ebx
movl $0xff02,%eax
movl oflags,%ecx
movl flags,%ebx
int $0x21
jnc .LOPEN1
movw %ax,U_SYSTEM_INOUTRES;
movw %ax,inoutres
movw $0xffff,%ax
.LOPEN1:
movl 8(%ebp),%edx
.LOPEN1:
movl f,%edx
movw %ax,(%edx)
end;
if (flags and $10)<>0 then
@ -514,11 +475,11 @@ begin
AllowSlash(pchar(@buffer));
asm
leal buffer,%edx
movb 8(%ebp),%ah
movb func,%ah
int $0x21
jnc .LDOS_DIRS1
movw %ax,U_SYSTEM_INOUTRES;
.LDOS_DIRS1:
movw %ax,inoutres
.LDOS_DIRS1:
end;
end;
@ -540,9 +501,7 @@ begin
DosDir($3b,s);
end;
{ thanks to Michael Van Canneyt <michael@tfdec1.fys.kuleuven.ac.be>, }
{ who writes this code }
{ her is a problem if the getdir is called with a pathstr var in dos.pp }
procedure getdir(drivenr : byte;var dir : string);
var
temp : array[0..255] of char;
@ -550,18 +509,16 @@ var
i : byte;
begin
sof:=pchar(@dir[4]);
{ dir[1..3] will contain '[drivenr]:\', but is not }
{ supplied by DOS, so we let dos string start at }
{ dir[4] }
{ Get dir from drivenr : 0=default, 1=A etc... }
{ dir[1..3] will contain '[drivenr]:\', but is not supplied by DOS,
so we let dos string start at dir[4]
Get dir from drivenr : 0=default, 1=A etc }
asm
movb drivenr,%dl
movl sof,%esi
mov $0x47,%ah
int $0x21
end;
{ Now Dir should be filled with directory in ASCIIZ, }
{ starting from dir[4] }
{ Now Dir should be filled with directory in ASCIIZ starting from dir[4] }
dir[0]:=#3;
dir[2]:=':';
dir[3]:='\';
@ -575,7 +532,7 @@ begin
dir[0]:=chr(i);
inc(i);
end;
{ upcase the string (FPKPascal function) }
{ upcase the string }
dir:=upcase(dir);
if drivenr<>0 then { Drive was supplied. We know it }
dir[1]:=chr(65+drivenr-1)
@ -623,60 +580,11 @@ Begin
{ Reset IO Error }
InOutRes:=0;
End.
{
$Log$
Revision 1.2 1998-03-26 12:21:02 peter
* makefile works again
* environ is now defined in system.pp (like go32v2)
Revision 1.3 1998-05-22 00:39:33 peter
* go32v1, go32v2 recompiles with the new objects
* remake3 works again with go32v2
- removed some "optimizes" from daniel which were wrong
Revision 1.1.1.1 1998/03/25 11:18:41 root
* Restored version
Revision 1.9 1998/02/14 01:41:35 peter
* fixed unusedhandle bug which was -1
Revision 1.8 1998/01/26 11:57:03 michael
+ Added log at the end
Working file: rtl/dos/go32v1/system.pp
description:
----------------------------
revision 1.7
date: 1998/01/25 21:53:22; author: peter; state: Exp; lines: +12 -8
+ Universal Handles support for StdIn/StdOut/StdErr
* Updated layout of sysamiga.pas
----------------------------
revision 1.6
date: 1998/01/16 23:10:50; author: florian; state: Exp; lines: +2 -2
+ some tobject stuff
----------------------------
revision 1.5
date: 1998/01/11 02:47:31; author: michael; state: Exp; lines: +384 -507
* Changed files to use the new filestructure in /inc directory.
(By Peter Vreman)
----------------------------
revision 1.4
date: 1998/01/07 00:05:04; author: michael; state: Exp; lines: +189 -184
+ Final adjustments for a uniform file handling interface.
(From Peter Vreman)
----------------------------
revision 1.3
date: 1998/01/05 16:51:04; author: michael; state: Exp; lines: +18 -46
+ Moved init of heap to heap.inc: INITheap() (From Peter Vreman)
----------------------------
revision 1.2
date: 1997/12/01 12:24:06; author: michael; state: Exp; lines: +12 -3
+ added copyright reference in header.
----------------------------
revision 1.1
date: 1997/11/27 08:33:53; author: michael; state: Exp;
Initial revision
----------------------------
revision 1.1.1.1
date: 1997/11/27 08:33:53; author: michael; state: Exp; lines: +0 -0
FPC RTL CVS start
=============================================================================
}

View File

@ -200,8 +200,8 @@ crt$(PPUEXT) : ../crt.pp $(INC)/textrec.inc go32$(PPUEXT) $(SYSTEMPPU)
$(PP) $(OPT) crt $(REDIR)
$(DEL) crt.pp
objects$(PPUEXT) : ../objects.pp $(SYSTEMPPU)
$(COPY) ../objects.pp .
objects$(PPUEXT) : $(INC)/objects.pp $(INC)/platform.inc objinc.inc $(SYSTEMPPU)
$(COPY) $(INC)/objects.pp .
$(PP) $(OPT) objects.pp $(REDIR)
$(DEL) objects.pp
@ -229,8 +229,8 @@ mouse$(PPUEXT) : ../mouse.pp $(SYSTEMPPU)
$(PP) $(OPT) mouse.pp $(REDIR)
$(DEL) mouse.pp
getopts$(PPUEXT) : $(PROCINC)/getopts.pp $(SYSTEMPPU)
$(COPY) $(PROCINC)/getopts.pp .
getopts$(PPUEXT) : $(INC)/getopts.pp $(SYSTEMPPU)
$(COPY) $(INC)/getopts.pp .
$(PP) $(OPT) getopts.pp $(REDIR)
$(DEL) getopts.pp
@ -264,7 +264,12 @@ include $(CFG)/makefile.def
#
# $Log$
# Revision 1.8 1998-05-06 11:53:40 peter
# Revision 1.9 1998-05-22 00:39:36 peter
# * go32v1, go32v2 recompiles with the new objects
# * remake3 works again with go32v2
# - removed some "optimizes" from daniel which were wrong
#
# Revision 1.8 1998/05/06 11:53:40 peter
# * update
#
#

View File

@ -882,7 +882,7 @@ ___prt1_startup:
call _setup_screens
call _setup_go32_info_block
/* call ___djgpp_exception_setup
call _setup_environment */
call _setup_ENVPment */
incl ___environ_changed
/* pushl $0
call __use_lfn
@ -898,14 +898,14 @@ ___prt1_startup:
movl U_SYSTEM_DOS_ARGV0,%ebx
.L56:
pushl %ebx
call ___crt0_load_environment_file
call ___crt0_load_ENVPment_file
pushl $0
call __use_lfn
pushl %ebx
call __npxsetup
call __crt0_init_mcount
call ___main */
pushl U_SYSTEM_ENVIRON
pushl U_SYSTEM_ENVP
pushl ___crt0_argv
pushl ___crt0_argc
call _pascal_start
@ -932,15 +932,15 @@ _swap_out:
_v2prt0_exceptions_on:
.long 0
/*.comm __crt0_startup_flags,4
.comm U_SYSTEM_ENVIRON,4 */
.comm U_SYSTEM_ENVP,4 */
.ifdef test_go32v1
#///*
#//** Called as start(argc, argv, envp)
#//*/
#///* gs:edx points to prog_info structure. All other registers are OBSOLETE
#//** but included for backwards compatibility
#//*/
#
# Called as start(argc, argv, envp)
#
# gs:edx points to prog_info structure. All other registers are OBSOLETE
# but included for backwards compatibility
#
.text
.globl old_start
@ -1022,7 +1022,7 @@ LtbaddressOK:
movl $0x0,%ebp
movl %esp,%ebx
movl 8(%ebx),%eax
movl %eax,U_SYSTEM_ENVIRON
movl %eax,U_SYSTEM_ENVP
movl 4(%ebx),%eax
movl %eax,_args
movl (%ebx),%eax
@ -1065,8 +1065,8 @@ _run_mode:
.globl _core_selector
_core_selector:
.word 0
.globl _environ
_environ:
.globl _ENVP
_ENVP:
.long 0 */
.globl ___pid
@ -1108,7 +1108,7 @@ _pascal_start:
movl $0x0,%ebp
movl %esp,%ebx
movl 12(%ebx),%eax
movl %eax,U_SYSTEM_ENVIRON
movl %eax,U_SYSTEM_ENVP
movl 8(%ebx),%eax
movl %eax,_args
movl 4(%ebx),%eax
@ -1124,7 +1124,7 @@ _pascal_start:
.data
/* .comm U_SYSTEM_ENVIRON,4 */
/* .comm U_SYSTEM_ENVP,4 */
.globl _ScreenPrimary
_ScreenPrimary:
.long 0
@ -1171,26 +1171,10 @@ __dos_ds:
/*
$Log$
Revision 1.1 1998-03-25 11:18:42 root
Initial revision
Revision 1.7 1998/03/19 10:04:30 pierre
+ changed as files so that they can be compiled by GNU as directly
changed the makefile accordingly
Revision 1.6 1998/02/03 15:52:46 pierre
* swapvectors really disable exception handling
and interrupt redirection with go32v2
* in dos.pp bug if arg path from fsearch had a directory part fixed
Revision 1.5 1998/02/01 14:04:27 peter
* Fixed exit status which was wrong when exception_exit was used
Revision 1.4 1998/01/19 17:03:51 pierre
* %fs was set in a commented part, corrected
Revision 1.3 1998/01/16 16:46:53 pierre
+ %fs contains the core selector at startup
Revision 1.2 1998-05-22 00:39:38 peter
* go32v1, go32v2 recompiles with the new objects
* remake3 works again with go32v2
- removed some "optimizes" from daniel which were wrong
*/

View File

@ -1,9 +1,11 @@
{
$Id$
This file is part of the Free Pascal run time library.
Copyright (c) 1993,97 by Florian klaempf & Gernot Tenchio
Copyright (c) 1993-98 by Florian Klaempf & Gernot Tenchio
members of the Free Pascal development team.
Graph unit for BP7 compatible RTL
See the file COPYING.FPC, included in this distribution,
for details about the copyright.
@ -824,44 +826,9 @@ end.
{
$Log$
Revision 1.2 1998-03-26 10:41:15 florian
* some warnings fixed
Revision 1.3 1998-05-22 00:39:23 peter
* go32v1, go32v2 recompiles with the new objects
* remake3 works again with go32v2
- removed some "optimizes" from daniel which were wrong
Revision 1.1.1.1 1998/03/25 11:18:41 root
* Restored version
Revision 1.7 1998/03/03 22:48:41 florian
+ graph.drawpoly procedure
+ putimage with xorput uses mmx if available
Revision 1.6 1998/03/02 00:17:26 carl
+GraphErrorMsg function implemented
Revision 1.5 1998/02/25 17:08:07 jonas
* change interface definition of SetGraphMode to match the implementation
Revision 1.4 1998/01/26 11:56:33 michael
+ Added log at the end
Working file: rtl/dos/graph.pp
description:
----------------------------
revision 1.3
date: 1997/12/03 15:24:19; author: florian; state: Exp; lines: +38 -11
Graph.SetGraphMode for DOS added
----------------------------
revision 1.2
date: 1997/12/01 12:15:46; author: michael; state: Exp; lines: +15 -73
+ added copyright reference in header.
----------------------------
revision 1.1
date: 1997/11/27 08:33:50; author: michael; state: Exp;
Initial revision
----------------------------
revision 1.1.1.1
date: 1997/11/27 08:33:50; author: michael; state: Exp; lines: +0 -0
FPC RTL CVS start
=============================================================================
}

View File

@ -3,6 +3,8 @@
This file is part of the Free Pascal run time library.
Copyright (c) 1993,97 by the Free Pascal development team
Mouse unit containing allmost all interrupt 33h functions
See the file COPYING.FPC, included in this distribution,
for details about the copyright.
@ -405,31 +407,9 @@ Begin
End.
{
$Log$
Revision 1.3 1998-04-05 13:56:54 peter
- fixed mouse to compile with $i386_att
+ linux crt supports redirecting (not Esc-codes anymore)
Revision 1.4 1998-05-22 00:39:25 peter
* go32v1, go32v2 recompiles with the new objects
* remake3 works again with go32v2
- removed some "optimizes" from daniel which were wrong
Revision 1.2 1998/03/26 12:25:22 peter
* integrated both mouse units
Revision 1.1.1.1 1998/03/25 11:18:41 root
* Restored version
Revision 1.4 1998/03/24 15:53:12 peter
* cleanup and doesn't give warnings when compiling
Revision 1.3 1998/01/26 11:56:24 michael
+ Added log at the end
Revision 1.2
date: 1997/12/01 12:15:45; author: michael; state: Exp; lines: +14 -12
+ added copyright reference in header.
Revision 1.1
date: 1997/11/27 08:33:49; author: michael; state: Exp;
Initial revision
Revision 1.1.1.1
date: 1997/11/27 08:33:49; author: michael; state: Exp; lines: +0 -0
FPC RTL CVS start
}

View File

@ -1,9 +1,11 @@
{
$Id$
This file is part of the Free Pascal run time library.
Copyright (c) 1993,97 by Florian Klaempfl
Copyright (c) 1993,98 by Florian Klaempfl
member of the Free Pascal development team
Printer unit for BP7 compatible RTL
See the file COPYING.FPC, included in this distribution,
for details about the copyright.
@ -12,31 +14,23 @@
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
**********************************************************************}
{
History:
10.4.1994: Version 1.0
Unit is completely implemented
}
unit printer;
interface
interface
var
var
lst : text;
implementation
implementation
var
var
old_exit : pointer;
procedure printer_exit;
begin
procedure printer_exit;
begin
close(lst);
exitproc:=old_exit;
end;
end;
begin
assign(lst,'PRN');
@ -44,30 +38,11 @@ begin
old_exit:=exitproc;
exitproc:=@printer_exit;
end.
{
$Log$
Revision 1.1 1998-03-25 11:18:41 root
Initial revision
Revision 1.2 1998-05-22 00:39:26 peter
* go32v1, go32v2 recompiles with the new objects
* remake3 works again with go32v2
- removed some "optimizes" from daniel which were wrong
Revision 1.3 1998/01/26 11:56:59 michael
+ Added log at the end
Working file: rtl/dos/printer.pp
description:
----------------------------
revision 1.2
date: 1997/12/01 12:15:48; author: michael; state: Exp; lines: +13 -6
+ added copyright reference in header.
----------------------------
revision 1.1
date: 1997/11/27 08:33:50; author: michael; state: Exp;
Initial revision
----------------------------
revision 1.1.1.1
date: 1997/11/27 08:33:50; author: michael; state: Exp; lines: +0 -0
FPC RTL CVS start
=============================================================================
}