plat/msdos86: implement close( ) function & proper errno setting

This commit is contained in:
Tee-Kiah Chia 2021-03-24 14:30:18 +00:00
parent 4c678ca210
commit aaf3ef695b
4 changed files with 131 additions and 0 deletions

View file

@ -0,0 +1,23 @@
#
! $Source$
! $State$
! $Revision$
! Declare segments (the order is important).
.sect .text
.sect .rom
.sect .data
.sect .bss
.sect .text
! Close a file.
.define _close
_close:
mov bx, sp
mov bx, 2(bx)
movb ah, 0x3E
int 0x21
jmp .sys_zret

View file

@ -0,0 +1,28 @@
#
! $Source$
! $State$
! $Revision$
! Declare segments (the order is important).
.sect .text
.sect .rom
.sect .data
.sect .bss
#define D(e) .define e; e
.sect .data
! Define various ACK error numbers. Note that these are *not* ANSI C
! errnos, and are used for different purposes.
D(ERANGE) = 1
D(ESET) = 2
D(EIDIVZ) = 6
D(EHEAP) = 17
D(EILLINS) = 18
D(EODDZ) = 19
D(ECASE) = 20
D(EBADMON) = 25

View file

@ -0,0 +1,45 @@
/* $Source$
* $State$
* $Revision$
*/
#include <errno.h>
static const signed char err_map[] =
{
0, /* 0x00 no error */
EINVAL, /* 0x01 function number invalid */
ENOENT, /* 0x02 file not found */
ENOENT, /* 0x03 path not found */
EMFILE, /* 0x04 too many open files */
EACCES, /* 0x05 access denied */
EBADF, /* 0x06 invalid handle */
EFAULT, /* 0x07 mem. control block destroyed */
ENOMEM, /* 0x08 insufficient memory */
EFAULT, /* 0x09 memory block address invalid */
E2BIG, /* 0x0A environment invalid */
ENOEXEC, /* 0x0B format invalid */
EINVAL, /* 0x0C access code invalid */
EINVAL, /* 0x0D data invalid */
ENOEXEC, /* 0x0E (?) fixup overflow */
ENODEV, /* 0x0F invalid drive */
EBUSY, /* 0x10 attempt to remove curr. dir. */
EXDEV, /* 0x11 not same device */
ENOENT, /* 0x12 no more files */
EIO, /* 0x13 disk write-protected */
EIO, /* 0x14 unknown unit */
ENXIO, /* 0x15 drive not ready */
};
/*
* Map an MS-DOS 2+ system error code to an `errno' value and store that in
* `errno'. Return -1.
*/
int _sys_seterrno(unsigned dos_err)
{
if (dos_err < sizeof(err_map) / sizeof(err_map[0]))
errno = err_map[dos_err];
else
errno = EIO;
return -1;
}

View file

@ -0,0 +1,35 @@
#
! $Source$
! $State$
! $Revision$
! Declare segments (the order is important).
.sect .text
.sect .rom
.sect .data
.sect .bss
.sect .text
! .sys_zret: if the carry flag is set, then set `errno' from the DOS error
! code in ax, and return -1. If the carry flag is clear, just return zero.
!
! .sys_axret: if the carry flag is set, then set `errno' from the DOS error
! code in ax, and return -1. If the carry flag is clear, just return ax as
! a return value.
.extern .sys_zret
.extern .sys_axret
.sys_zret:
jc error
xor ax, ax
no_error:
ret
.sys_axret:
jnc no_error
error:
push ax
call __sys_seterrno
pop cx
ret