Merge from default.
This commit is contained in:
		
						commit
						496424acf6
					
				
					 4 changed files with 61 additions and 18 deletions
				
			
		
							
								
								
									
										2
									
								
								README
									
										
									
									
									
								
							
							
						
						
									
										2
									
								
								README
									
										
									
									
									
								
							|  | @ -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. | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -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); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -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 | ||||||
|  |  | ||||||
|  | @ -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; | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		
		Reference in a new issue