138 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			ArmAsm
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			138 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			ArmAsm
		
	
	
		
			Executable File
		
	
	
	
	
!	Mkfhead.s - DOS & BIOS support for mkfile.c	Author: Kees J. Bot
 | 
						|
!								9 May 1998
 | 
						|
!
 | 
						|
! This file contains the startup and low level support for the MKFILE.COM
 | 
						|
! utility.  See doshead.ack.s for more comments on .COM files.
 | 
						|
!
 | 
						|
.sect .text; .sect .rom; .sect .data; .sect .bss
 | 
						|
.sect .text
 | 
						|
 | 
						|
.define _PSP
 | 
						|
_PSP:
 | 
						|
	.space	256			! Program Segment Prefix
 | 
						|
 | 
						|
mkfile:
 | 
						|
	cld				! C compiler wants UP
 | 
						|
	xor	ax, ax			! Zero
 | 
						|
	mov	di, _edata		! Start of bss is at end of data
 | 
						|
	mov	cx, _end		! End of bss (begin of heap)
 | 
						|
	sub	cx, di			! Number of bss bytes
 | 
						|
	shr	cx, 1			! Number of words
 | 
						|
 rep	stos				! Clear bss
 | 
						|
 | 
						|
	xor	cx, cx			! cx = argc
 | 
						|
	xor	bx, bx
 | 
						|
	push	bx			! argv[argc] = NULL
 | 
						|
	movb	bl, (_PSP+0x80)		! Argument byte count
 | 
						|
0:	movb	_PSP+0x81(bx), ch	! Null terminate
 | 
						|
	dec	bx
 | 
						|
	js	9f
 | 
						|
	cmpb	_PSP+0x81(bx), 0x20	! Whitespace?
 | 
						|
	jbe	0b
 | 
						|
1:	dec	bx			! One argument character
 | 
						|
	js	2f
 | 
						|
	cmpb	_PSP+0x81(bx), 0x20	! More argument characters?
 | 
						|
	ja	1b
 | 
						|
2:	lea	ax, _PSP+0x81+1(bx)	! Address of argument
 | 
						|
	push	ax			! argv[n]
 | 
						|
	inc	cx			! argc++;
 | 
						|
	test	bx, bx
 | 
						|
	jns	0b			! More arguments?
 | 
						|
9:	movb	_PSP+0x81(bx), ch	! Make a null string
 | 
						|
	lea	ax, _PSP+0x81(bx)
 | 
						|
	push	ax			! to use as argv[0]
 | 
						|
	inc	cx			! Final value of argc
 | 
						|
	mov	ax, sp
 | 
						|
	push	ax			! argv
 | 
						|
	push	cx			! argc
 | 
						|
	call	_main			! main(argc, argv)
 | 
						|
	push	ax
 | 
						|
	call	_exit			! exit(main(argc, argv))
 | 
						|
 | 
						|
! int creat(const char *path, mode_t mode)
 | 
						|
!	Create a file with the old creat() call.
 | 
						|
.define _creat
 | 
						|
_creat:
 | 
						|
	mov	bx, sp
 | 
						|
	mov	dx, 2(bx)		! Filename
 | 
						|
	xor	cx, cx			! Ignore mode, always read-write
 | 
						|
	movb	ah, 0x3C		! "CREAT"
 | 
						|
dos:	int	0x21			! ax = creat(path, 0666);
 | 
						|
	jc	seterrno
 | 
						|
	ret
 | 
						|
 | 
						|
seterrno:
 | 
						|
	mov	(_errno), ax		! Set errno to the DOS error code
 | 
						|
	mov	ax, -1
 | 
						|
	cwd				! return -1L;
 | 
						|
	ret
 | 
						|
 | 
						|
! int open(const char *path, int oflag)
 | 
						|
!	Open a file with the oldfashioned two-argument open() call.
 | 
						|
.define _open
 | 
						|
_open:
 | 
						|
	mov	bx, sp
 | 
						|
	mov	dx, 2(bx)		! Filename
 | 
						|
	movb	al, 4(bx)		! O_RDONLY, O_WRONLY, O_RDWR
 | 
						|
	movb	ah, 0x3D		! "OPEN"
 | 
						|
	jmp	dos
 | 
						|
 | 
						|
! int close(int fd)
 | 
						|
!	Close an open file.
 | 
						|
.define _close
 | 
						|
_close:
 | 
						|
	mov	bx, sp
 | 
						|
	mov	bx, 2(bx)		! bx = file handle
 | 
						|
	movb	ah, 0x3E		! "CLOSE"
 | 
						|
	jmp	dos
 | 
						|
 | 
						|
! void exit(int status)
 | 
						|
! void _exit(int status)
 | 
						|
!	Return to DOS.
 | 
						|
.define _exit, __exit, ___exit
 | 
						|
_exit:
 | 
						|
__exit:
 | 
						|
___exit:
 | 
						|
	pop	ax
 | 
						|
	pop	ax			! al = status
 | 
						|
	movb	ah, 0x4C		! "EXIT"
 | 
						|
	int	0x21
 | 
						|
	hlt
 | 
						|
 | 
						|
! ssize_t read(int fd, void *buf, size_t n)
 | 
						|
!	Read bytes from an open file.
 | 
						|
.define _read
 | 
						|
_read:
 | 
						|
	mov	bx, sp
 | 
						|
	mov	cx, 6(bx)
 | 
						|
	mov	dx, 4(bx)
 | 
						|
	mov	bx, 2(bx)
 | 
						|
	movb	ah, 0x3F		! "READ"
 | 
						|
	jmp	dos
 | 
						|
 | 
						|
! ssize_t write(int fd, const void *buf, size_t n)
 | 
						|
!	Write bytes to an open file.
 | 
						|
.define _write
 | 
						|
_write:
 | 
						|
	mov	bx, sp
 | 
						|
	mov	cx, 6(bx)
 | 
						|
	mov	dx, 4(bx)
 | 
						|
	mov	bx, 2(bx)
 | 
						|
	movb	ah, 0x40		! "WRITE"
 | 
						|
	jmp	dos
 | 
						|
 | 
						|
! off_t lseek(int fd, off_t offset, int whence)
 | 
						|
!	Set file position for read or write.
 | 
						|
.define _lseek
 | 
						|
_lseek:
 | 
						|
	mov	bx, sp
 | 
						|
	movb	al, 8(bx)		! SEEK_SET, SEEK_CUR, SEEK_END
 | 
						|
	mov	dx, 4(bx)
 | 
						|
	mov	cx, 6(bx)		! cx:dx = offset
 | 
						|
	mov	bx, 2(bx)
 | 
						|
	movb	ah, 0x42		! "LSEEK"
 | 
						|
	jmp	dos
 | 
						|
 | 
						|
!
 | 
						|
! $PchId: mkfhead.ack.s,v 1.3 1999/01/14 21:17:06 philip Exp $
 |