Merge from default.

This commit is contained in:
David Given 2022-07-16 19:35:49 +02:00
commit 496424acf6
4 changed files with 61 additions and 18 deletions

2
README
View file

@ -56,6 +56,8 @@ Requirements:
- GNU make. - GNU make.
- Lua (any version) with the lua-posix library installed.
- (optionally) ninja; if you've got this, this will be autodetected and give - (optionally) ninja; if you've got this, this will be autodetected and give
you faster builds. you faster builds.

View file

@ -1,14 +1,31 @@
/* /*
* (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands. * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
* See the copyright notice in the ACK home directory, in the file "Copyright". * See the copyright notice in the ACK home directory, in the file "Copyright".
*
* (c) copyright 2022 by TK Chia.
*/ */
/* $Id$ */ /* $Id$ */
#include <stdlib.h> #include <stdlib.h>
#include <sys/types.h> #include <sys/types.h>
#include <signal.h> #include <signal.h>
#include <unistd.h>
void abort(void) void abort(void)
{ {
raise(SIGABRT); unsigned short count = 0;
int *bad_ptr = NULL;
while (--count != 0)
raise(SIGABRT);
/*
* If the target platform does not implement raise(.), or the
* SIGABRT signal turns out to be handled or ignored, then our
* process may still be running. Try harder to make the process
* crash or exit. -- tkchia
*/
while (--count != 0)
abs(*bad_ptr);
write(2, "abort!\n", 7);
for (;;)
_exit(128 + SIGABRT);
} }

View file

@ -12,6 +12,8 @@
.sect .text .sect .text
#define STACK_BUFFER 128 /* number of bytes to leave for stack */
begtext: begtext:
! Make sure we are running under MS-DOS 2 or above. ! Make sure we are running under MS-DOS 2 or above.
! !
@ -20,9 +22,38 @@ begtext:
! segment. (DOS 3+ does; DOS 2.x does not.) ! segment. (DOS 3+ does; DOS 2.x does not.)
movb ah, 0x30 movb ah, 0x30
int 0x21 int 0x21
cbw
cmpb al, 2 cmpb al, 2
xchg bx, ax xchg bp, ax
jc bad_sys jnc ok_sys
mov dx, bad_sys_msg
dos_msg:
movb ah, 9
int 0x21
ret
ok_sys:
! Resize the program's memory control block (MCB) to cover only the
! program's near code and data space. Use the starting sp value as
! a guide to how much memory we can grab. Abort on any failure.
!
! As a side effect, this also frees up any memory allocated to our
! program beyond 64 KiB. (The freed memory can possibly be used by
! e.g. child processes, in the future.)
!
! Also check that we have some space between the BSS end and the
! starting sp.
cmp sp, endbss+STACK_BUFFER
jb no_room
movb ah, 0x4a
mov bx, sp
movb cl, 4
shr bx, cl
inc bx
int 0x21
jc no_room
! Clear BSS. ! Clear BSS.
mov di, begbss mov di, begbss
@ -35,11 +66,12 @@ begtext:
! Get the size of the environment variables plus (if present) the ! Get the size of the environment variables plus (if present) the
! program name. Also count the number of environment variables. ! program name. Also count the number of environment variables.
mov es, (0x002C)
xor di, di xor di, di
mov es, 0x002C(di)
! ax = 0 from above ! ax = 0 from above
cwd ! dx = count of env. vars. cwd ! dx = count of env. vars.
mov cx, -1 ! cx = 0 from above
dec cx ! cx = max. str. bytes to scan
scasb ! handle special case of empty env. scasb ! handle special case of empty env.
jz is_empty_env jz is_empty_env
size_env: size_env:
@ -48,7 +80,7 @@ size_env:
scasb scasb
jnz size_env jnz size_env
is_empty_env: is_empty_env:
cmpb bl, 2 cmp bp, 2
jz no_argv0 jz no_argv0
scasw scasw
repnz scasb repnz scasb
@ -58,10 +90,9 @@ no_argv0:
! onto the stack. ! onto the stack.
mov si, di mov si, di
dec si dec si
and si, -2
std std
copy_env: copy_env:
test si, si and si, -2
eseg lodsw eseg lodsw
push ax push ax
jnz copy_env jnz copy_env
@ -79,7 +110,7 @@ copy_env:
! Build up argc, argv[], and envp[]. ! Build up argc, argv[], and envp[].
push ax ! output buffer for argc, argv, envp push ax ! output buffer for argc, argv, envp
push bx ! MS-DOS version push bp ! MS-DOS version
push cx ! env. string data push cx ! env. string data
push dx ! count of env. vars. push dx ! count of env. vars.
mov ax, 0x0080 mov ax, 0x0080
@ -97,13 +128,6 @@ copy_env:
push ax push ax
call _exit call _exit
bad_sys:
mov dx, bad_sys_msg
dos_msg:
movb ah, 9
int 0x21
ret
no_room: no_room:
mov dx, no_room_msg mov dx, no_room_msg
call dos_msg call dos_msg

View file

@ -22,7 +22,7 @@ struct for_main {
* Return zero if everything went well, non-zero otherwise. * Return zero if everything went well, non-zero otherwise.
*/ */
int _sys_initmain(char *arg_data, size_t n_env_vars, char *env_data, int _sys_initmain(char *arg_data, size_t n_env_vars, char *env_data,
unsigned msdos_ver, struct for_main *out) unsigned msdos_ver_major, struct for_main *out)
{ {
char **argv, **envp; char **argv, **envp;
char c, *p, **pp; char c, *p, **pp;
@ -100,7 +100,7 @@ int _sys_initmain(char *arg_data, size_t n_env_vars, char *env_data,
* shortword) following the environment variables, so advance p by 3 * shortword) following the environment variables, so advance p by 3
* bytes to get at the program name. * bytes to get at the program name.
*/ */
if ((msdos_ver & 0x00ff) >= 3) if (msdos_ver_major >= 3)
{ {
p += 3; p += 3;
argv[0] = p; argv[0] = p;