mirror of
				https://gitlab.com/freepascal.org/fpc/source.git
				synced 2025-10-25 12:41:40 +02:00 
			
		
		
		
	+ Error2InoutRes implemented
* do_read was doing a wrong os call! * do_open was not pushing the right values * DosDir was pushing the wrong params on the stack * do_close would never works, was pushing a longint instead of word
This commit is contained in:
		
							parent
							
								
									5bac56f11c
								
							
						
					
					
						commit
						1b9ffe21b8
					
				| @ -1,7 +1,8 @@ | ||||
| { | ||||
|     $Id$ | ||||
|     This file is part of the Free Pascal run time library. | ||||
|     Copyright (c) 1993,97 by the Free Pascal development team. | ||||
|     Copyright (c) 1993,98 by Carl Eric Codere | ||||
|     member of the Free Pascal development team | ||||
| 
 | ||||
|     See the file COPYING.FPC, included in this distribution, | ||||
|     for details about the copyright. | ||||
| @ -14,9 +15,14 @@ | ||||
| {$define ATARI} | ||||
| unit sysatari; | ||||
| 
 | ||||
| {--------------------------------------------------------------------} | ||||
| { LEFT TO DO:                                                        } | ||||
| {--------------------------------------------------------------------} | ||||
| { o SBrk                                                             } | ||||
| { o Implement truncate                                               } | ||||
| { o Implement paramcount and paramstr                                } | ||||
| {--------------------------------------------------------------------} | ||||
| 
 | ||||
| { Left to do :                                                    } | ||||
| {    - Fix DOSError codes to conform to those of DOS (TP)         } | ||||
| 
 | ||||
| {$I os.inc} | ||||
| 
 | ||||
| @ -40,6 +46,8 @@ const | ||||
|     {$I system.inc} | ||||
|     {$I lowmath.inc} | ||||
| 
 | ||||
|     var | ||||
|       errno : integer; | ||||
|     type | ||||
|        plongint = ^longint; | ||||
| 
 | ||||
| @ -59,6 +67,34 @@ const | ||||
|          end; | ||||
| 
 | ||||
| 
 | ||||
|     Procedure Error2InOut; | ||||
|     Begin | ||||
|      if (errno <= -2) and (errno >= -11) then | ||||
|        InOutRes:=150-errno  { 150+errno } | ||||
|      else | ||||
|       Begin | ||||
|         case errno of | ||||
|           -32 : InOutRes:=1; | ||||
|           -33 : InOutRes:=2; | ||||
|           -34 : InOutRes:=3; | ||||
|           -35 : InOutRes:=4; | ||||
|           -36 : InOutRes:=5; | ||||
|           -37 : InOutRes:=8; | ||||
|           -39 : InOutRes:=8; | ||||
|           -40 : InOutRes:=9; | ||||
|           -46 : InOutRes:=15; | ||||
|           -67..-64 : InOutRes:=153; | ||||
|           -15 : InOutRes:=151; | ||||
|           -13 : InOutRes:=150; | ||||
|         else | ||||
|            InOutres := word(errno); | ||||
|          end; | ||||
|      end; | ||||
|      errno:=0; | ||||
|     end; | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
|     procedure halt(errnum : byte); | ||||
| 
 | ||||
|       begin | ||||
| @ -146,7 +182,8 @@ procedure do_close(h : longint); | ||||
| begin | ||||
|   asm | ||||
|         movem.l d2/d3/a2/a3,-(sp) | ||||
|         move.l  h,-(sp) | ||||
|         move.l  h,d0 | ||||
|         move.w  d0,-(sp) | ||||
|         move.w  #$3e,-(sp) | ||||
|         trap    #1 | ||||
|         add.l   #4,sp      { restore stack ... } | ||||
| @ -169,9 +206,11 @@ begin | ||||
|         movem.l (sp)+,d3/a2/a3 | ||||
|         tst.w  d0 | ||||
|         beq    @doserend | ||||
|         move.w d0,InOutRes | ||||
|         move.w d0,errno | ||||
|         @doserend: | ||||
|   end; | ||||
|   if errno <> 0 then | ||||
|      Error2InOut; | ||||
| end; | ||||
| 
 | ||||
| 
 | ||||
| @ -192,16 +231,18 @@ begin | ||||
|             movem.l (sp)+,d3/a2/a3 | ||||
|             tst.w   d0 | ||||
|             beq     @dosreend | ||||
|             move.w  d0,InOutRes    { error ... } | ||||
|             move.w  d0,errno    { error ... } | ||||
|          @dosreend: | ||||
|   end; | ||||
|   if errno <> 0 then | ||||
|      Error2InOut; | ||||
| end; | ||||
| 
 | ||||
| function do_isdevice(handle:longint):boolean; | ||||
| function do_isdevice(handle:word):boolean; | ||||
| begin | ||||
|   if (handle=stdoutputhandle) or (handle=stdinputhandle) or | ||||
|   (handle=stderrorhandle) then | ||||
|     do_isdevice:=FALSE; | ||||
|     do_isdevice:=FALSE | ||||
|   else | ||||
|     do_isdevice:=TRUE; | ||||
| end; | ||||
| @ -214,7 +255,8 @@ begin | ||||
|             movem.l d3/a2/a3,-(sp) | ||||
|             move.l  addr,-(sp) | ||||
|             move.l  len,-(sp) | ||||
|             move.w  h,-(sp) | ||||
|             move.l  h,d0 | ||||
|             move.w  d0,-(sp) | ||||
|             move.w  #$40,-(sp) | ||||
|             trap    #1 | ||||
|             lea     12(sp),sp | ||||
| @ -222,10 +264,12 @@ begin | ||||
|             movem.l (sp)+,d3/a2/a3 | ||||
|             tst.l   d0 | ||||
|             bpl     @doswrend | ||||
|             move.w  d0,InOutRes    { error ... } | ||||
|             move.w  d0,errno    { error ... } | ||||
|           @doswrend: | ||||
|             move.l  d0,@RESULT | ||||
|   end; | ||||
|   if errno <> 0 then | ||||
|      Error2InOut; | ||||
| end; | ||||
| 
 | ||||
| 
 | ||||
| @ -236,18 +280,21 @@ begin | ||||
|             movem.l d3/a2/a3,-(sp) | ||||
|             move.l addr,-(sp) | ||||
|             move.l len,-(sp) | ||||
|             move.w h,-(sp) | ||||
|             move.w #$40,-(sp) | ||||
|             move.l h,d0 | ||||
|             move.w d0,-(sp) | ||||
|             move.w #$3f,-(sp) | ||||
|             trap   #1 | ||||
|             lea    12(sp),sp | ||||
|             move.l d6,d2       { restore d2 } | ||||
|             movem.l (sp)+,d3/a2/a3 | ||||
|             tst.l   d0 | ||||
|             bpl     @dosrdend | ||||
|             move.w  d0,InOutRes    { error ... } | ||||
|             move.w  d0,errno    { error ... } | ||||
|           @dosrdend: | ||||
|             move.l  d0,@Result | ||||
|   end; | ||||
|   if errno <> 0 then | ||||
|      Error2InOut; | ||||
| end; | ||||
| 
 | ||||
| 
 | ||||
| @ -257,7 +304,8 @@ begin | ||||
|             move.l  d2,d6      { save d2 } | ||||
|             movem.l d3/a2/a3,-(sp) | ||||
|             move.w #1,-(sp)     { seek from current position } | ||||
|             move.w handle,-(sp) | ||||
|             move.l handle,d0 | ||||
|             move.w d0,-(sp) | ||||
|             move.l #0,-(sp)     { with a seek offset of zero } | ||||
|             move.w #$42,-(sp) | ||||
|             trap   #1 | ||||
| @ -275,7 +323,8 @@ begin | ||||
|             move.l  d2,d6      { save d2 } | ||||
|             movem.l d3/a2/a3,-(sp) | ||||
|             move.w #0,-(sp)     { seek from start of file    } | ||||
|             move.w handle,-(sp) | ||||
|             move.l handle,d0 | ||||
|             move.w d0,-(sp) | ||||
|             move.l pos,-(sp) | ||||
|             move.w #$42,-(sp) | ||||
|             trap   #1 | ||||
| @ -294,7 +343,8 @@ begin | ||||
|             move.l  d2,d6      { save d2 } | ||||
|             movem.l d3/a2/a3,-(sp) | ||||
|             move.w #2,-(sp)     { seek from end of file        } | ||||
|             move.w handle,-(sp) | ||||
|             move.l handle,d0 | ||||
|             move.w d0,-(sp) | ||||
|             move.l #0,-(sp)     { with an offset of 0 from end } | ||||
|             move.w #$42,-(sp) | ||||
|             trap   #1 | ||||
| @ -333,7 +383,7 @@ procedure do_open(var f;p:pchar;flags:longint); | ||||
|   when (flags and $1000) there is no check for close (needed for textfiles) | ||||
| } | ||||
| var | ||||
|   i : longint; | ||||
|   i : word; | ||||
|   oflags: longint; | ||||
| begin | ||||
|   AllowSlash(p); | ||||
| @ -352,12 +402,12 @@ begin | ||||
|    end; | ||||
| { reset file handle } | ||||
|   filerec(f).handle:=UnusedHandle; | ||||
|   oflags:=$04; | ||||
|   oflags:=$02; { read/write mode } | ||||
| { convert filemode to filerec modes } | ||||
|   case (flags and 3) of | ||||
|    0 : begin | ||||
|          filerec(f).mode:=fminput; | ||||
|          oflags:=$01; | ||||
|          oflags:=$00; { read mode only } | ||||
|        end; | ||||
|    1 : filerec(f).mode:=fmoutput; | ||||
|    2 : filerec(f).mode:=fminout; | ||||
| @ -365,13 +415,13 @@ begin | ||||
|   if (flags and $100)<>0 then | ||||
|    begin | ||||
|      filerec(f).mode:=fmoutput; | ||||
|      oflags:=$02; | ||||
|      oflags:=$04;  { read/write with create } | ||||
|    end | ||||
|   else | ||||
|    if (flags and $10)<>0 then | ||||
|     begin | ||||
|       filerec(f).mode:=fmoutput; | ||||
|       oflags:=$04; | ||||
|       oflags:=$02;  { read/write             } | ||||
|     end; | ||||
| { empty name is special } | ||||
|   if p[0]=#0 then | ||||
| @ -389,27 +439,41 @@ begin | ||||
|    asm | ||||
|       movem.l d2/d3/a2/a3,-(sp)    { save used registers } | ||||
| 
 | ||||
|       cmp.l   #4,oflags    { check if append mode ... } | ||||
|       cmp.l   #4,oflags    { check if rewrite mode ... } | ||||
|       bne     @opencont2 | ||||
|       move.w  #2,d0        { append mode... r/w open   } | ||||
|       bra     @opencont1 | ||||
|       { rewrite mode - create new file } | ||||
|       move.w  #0,-(sp) | ||||
|       move.l  p,-(sp) | ||||
|       move.w  #$3c,-(sp) | ||||
|       trap    #1 | ||||
|       add.l   #8,sp       { restore stack of os call } | ||||
|       bra     @end | ||||
|       { reset - open existing files     } | ||||
|     @opencont2: | ||||
|       move.l  oflags,d0    { use flag as source  ...    } | ||||
|     @opencont1: | ||||
|       move.w  d0,-(sp) | ||||
|       pea     p | ||||
|       move.l  p,-(sp) | ||||
|       move.w  #$3d,-(sp) | ||||
|       trap    #1 | ||||
|       add.l   #8,sp       { restore stack of os call } | ||||
| 
 | ||||
|    @end: | ||||
|       movem.l (sp)+,d2/d3/a2/a3 | ||||
| 
 | ||||
|       tst.l   d0 | ||||
|       bpl     @opennoerr | ||||
|       move.w  d0,InOutRes | ||||
|       tst.w   d0 | ||||
|       bpl     @opennoerr  { if positive return values then ok } | ||||
|       cmp.w   #-1,d0      { if handle is -1 CON:              } | ||||
|       beq     @opennoerr | ||||
|       cmp.w   #-2,d0      { if handle is -2 AUX:              } | ||||
|       beq     @opennoerr | ||||
|       cmp.w   #-3,d0      { if handle is -3 PRN:              } | ||||
|       beq     @opennoerr | ||||
|       move.w  d0,errno    { otherwise normal error            } | ||||
|     @opennoerr: | ||||
|       move.l  d0,i        { get handle ... } | ||||
|       move.w  d0,i        { get handle as SIGNED VALUE...     } | ||||
|     end; | ||||
|   if errno <> 0 then | ||||
|      Error2InOut; | ||||
|   filerec(f).handle:=i; | ||||
|   if (flags and $10)<>0 then | ||||
|    do_seekend(filerec(f).handle); | ||||
| @ -440,24 +504,28 @@ end; | ||||
| procedure DosDir(func:byte;const s:string); | ||||
| var | ||||
|   buffer : array[0..255] of char; | ||||
|   c : word; | ||||
| begin | ||||
|   move(s[1],buffer,length(s)); | ||||
|   buffer[length(s)]:=#0; | ||||
|   AllowSlash(pchar(@buffer)); | ||||
|   c:=word(func); | ||||
|   asm | ||||
|         move.l  d2,d6      { save d2 } | ||||
|         movem.l d3/a2/a3,-(sp) | ||||
|         pea     buffer | ||||
|         move.b  func,-(sp) | ||||
|         move.w  c,-(sp) | ||||
|         trap    #1 | ||||
|         add.l   #6,sp | ||||
|         move.l  d6,d2       { restore d2 } | ||||
|         movem.l (sp)+,d3/a2/a3 | ||||
|         tst.w   d0 | ||||
|         beq     @dosdirend | ||||
|         move.w  d0,InOutRes | ||||
|         move.w  d0,errno | ||||
|      @dosdirend: | ||||
|   end; | ||||
|   if errno <> 0 then | ||||
|      Error2InOut; | ||||
| end; | ||||
| 
 | ||||
| 
 | ||||
| @ -485,19 +553,21 @@ end; | ||||
| procedure getdir(drivenr : byte;var dir : string); | ||||
| var | ||||
|   temp : array[0..255] of char; | ||||
|   sof  : pchar; | ||||
|   i    : longint; | ||||
|   j: byte; | ||||
|   drv: word; | ||||
| begin | ||||
|   sof:=pchar(@dir[4]); | ||||
|   drv:=word(drivenr); | ||||
|   asm | ||||
|             move.l  d2,d6      { save d2 } | ||||
|             movem.l d3/a2/a3,-(sp) | ||||
| 
 | ||||
|             { Get dir from drivenr : 0=default, 1=A etc... } | ||||
|             move.w drivenr,-(sp) | ||||
|             move.w drv,-(sp) | ||||
| 
 | ||||
|             { put (previously saved) offset in si } | ||||
|             pea    dir | ||||
| {            move.l temp,-(sp)} | ||||
|              pea   temp | ||||
| 
 | ||||
|             { call attos function 47H : Get dir } | ||||
|             move.w #$47,-(sp) | ||||
| @ -509,21 +579,18 @@ begin | ||||
|             move.l d6,d2         { restore d2 } | ||||
|             movem.l (sp)+,d3/a2/a3 | ||||
|   end; | ||||
| { Now Dir should be filled with directory in ASCIIZ, } | ||||
| { starting from dir[4]                               } | ||||
|   dir[0]:=#3; | ||||
|   dir[2]:=':'; | ||||
|   dir[3]:='\'; | ||||
|   i:=4; | ||||
| { conversation to Pascal string } | ||||
|   while (dir[i]<>#0) do | ||||
|   { conversion to pascal string } | ||||
|   i:=0; | ||||
|   while (temp[i]<>#0) do | ||||
|    begin | ||||
|    { convert path name to DOS } | ||||
|      if dir[i]='/' then | ||||
|       dir[i]:='\'; | ||||
|      dir[0]:=chr(i); | ||||
|      if temp[i]='/' then | ||||
|       temp[i]:='\'; | ||||
|      dir[i+3]:=temp[i]; | ||||
|      inc(i); | ||||
|    end; | ||||
|   dir[2]:=':'; | ||||
|   dir[3]:='\'; | ||||
|   dir[0]:=char(i+2); | ||||
| { upcase the string (FPKPascal function) } | ||||
|   dir:=upcase(dir); | ||||
|   if drivenr<>0 then   { Drive was supplied. We know it } | ||||
| @ -536,10 +603,11 @@ begin | ||||
|         move.w #$19,-(sp) | ||||
|         trap   #1 | ||||
|         add.l  #2,sp | ||||
|         move.w d0,drv | ||||
|         move.l d6,d2        { restore d2 } | ||||
|         movem.l (sp)+,d3/a2/a3 | ||||
|      end; | ||||
|      dir[1]:=chr(i); | ||||
|      dir[1]:=chr(byte(drv)+ord('A')); | ||||
|    end; | ||||
| end; | ||||
| 
 | ||||
| @ -562,11 +630,19 @@ begin | ||||
|   OpenStdIO(StdErr,fmOutput,StdErrorHandle); | ||||
| { Reset IO Error } | ||||
|   InOutRes:=0; | ||||
|   errno := 0; | ||||
| end. | ||||
| 
 | ||||
| { | ||||
|   $Log$ | ||||
|   Revision 1.4  1998-07-02 12:39:27  carl | ||||
|   Revision 1.5  1998-07-13 12:34:13  carl | ||||
|     + Error2InoutRes implemented | ||||
|     * do_read was doing a wrong os call! | ||||
|     * do_open was not pushing the right values | ||||
|     * DosDir was pushing the wrong params on the stack | ||||
|     * do_close would never works, was pushing a longint instead of word | ||||
| 
 | ||||
|   Revision 1.4  1998/07/02 12:39:27  carl | ||||
|     * IOCheck for mkdir,chdir and rmdir, just like in TP | ||||
| 
 | ||||
|   Revision 1.3  1998/07/01 14:40:20  carl | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 carl
						carl