[9] | 1 | ! Mkfhead.s - DOS & BIOS support for mkfile.c Author: Kees J. Bot
|
---|
| 2 | ! 9 May 1998
|
---|
| 3 | !
|
---|
| 4 | ! This file contains the startup and low level support for the MKFILE.COM
|
---|
| 5 | ! utility. See doshead.ack.s for more comments on .COM files.
|
---|
| 6 | !
|
---|
| 7 | .sect .text; .sect .rom; .sect .data; .sect .bss
|
---|
| 8 | .sect .text
|
---|
| 9 |
|
---|
| 10 | .define _PSP
|
---|
| 11 | _PSP:
|
---|
| 12 | .space 256 ! Program Segment Prefix
|
---|
| 13 |
|
---|
| 14 | mkfile:
|
---|
| 15 | cld ! C compiler wants UP
|
---|
| 16 | xor ax, ax ! Zero
|
---|
| 17 | mov di, _edata ! Start of bss is at end of data
|
---|
| 18 | mov cx, _end ! End of bss (begin of heap)
|
---|
| 19 | sub cx, di ! Number of bss bytes
|
---|
| 20 | shr cx, 1 ! Number of words
|
---|
| 21 | rep stos ! Clear bss
|
---|
| 22 |
|
---|
| 23 | xor cx, cx ! cx = argc
|
---|
| 24 | xor bx, bx
|
---|
| 25 | push bx ! argv[argc] = NULL
|
---|
| 26 | movb bl, (_PSP+0x80) ! Argument byte count
|
---|
| 27 | 0: movb _PSP+0x81(bx), ch ! Null terminate
|
---|
| 28 | dec bx
|
---|
| 29 | js 9f
|
---|
| 30 | cmpb _PSP+0x81(bx), 0x20 ! Whitespace?
|
---|
| 31 | jbe 0b
|
---|
| 32 | 1: dec bx ! One argument character
|
---|
| 33 | js 2f
|
---|
| 34 | cmpb _PSP+0x81(bx), 0x20 ! More argument characters?
|
---|
| 35 | ja 1b
|
---|
| 36 | 2: lea ax, _PSP+0x81+1(bx) ! Address of argument
|
---|
| 37 | push ax ! argv[n]
|
---|
| 38 | inc cx ! argc++;
|
---|
| 39 | test bx, bx
|
---|
| 40 | jns 0b ! More arguments?
|
---|
| 41 | 9: movb _PSP+0x81(bx), ch ! Make a null string
|
---|
| 42 | lea ax, _PSP+0x81(bx)
|
---|
| 43 | push ax ! to use as argv[0]
|
---|
| 44 | inc cx ! Final value of argc
|
---|
| 45 | mov ax, sp
|
---|
| 46 | push ax ! argv
|
---|
| 47 | push cx ! argc
|
---|
| 48 | call _main ! main(argc, argv)
|
---|
| 49 | push ax
|
---|
| 50 | call _exit ! exit(main(argc, argv))
|
---|
| 51 |
|
---|
| 52 | ! int creat(const char *path, mode_t mode)
|
---|
| 53 | ! Create a file with the old creat() call.
|
---|
| 54 | .define _creat
|
---|
| 55 | _creat:
|
---|
| 56 | mov bx, sp
|
---|
| 57 | mov dx, 2(bx) ! Filename
|
---|
| 58 | xor cx, cx ! Ignore mode, always read-write
|
---|
| 59 | movb ah, 0x3C ! "CREAT"
|
---|
| 60 | dos: int 0x21 ! ax = creat(path, 0666);
|
---|
| 61 | jc seterrno
|
---|
| 62 | ret
|
---|
| 63 |
|
---|
| 64 | seterrno:
|
---|
| 65 | mov (_errno), ax ! Set errno to the DOS error code
|
---|
| 66 | mov ax, -1
|
---|
| 67 | cwd ! return -1L;
|
---|
| 68 | ret
|
---|
| 69 |
|
---|
| 70 | ! int open(const char *path, int oflag)
|
---|
| 71 | ! Open a file with the oldfashioned two-argument open() call.
|
---|
| 72 | .define _open
|
---|
| 73 | _open:
|
---|
| 74 | mov bx, sp
|
---|
| 75 | mov dx, 2(bx) ! Filename
|
---|
| 76 | movb al, 4(bx) ! O_RDONLY, O_WRONLY, O_RDWR
|
---|
| 77 | movb ah, 0x3D ! "OPEN"
|
---|
| 78 | jmp dos
|
---|
| 79 |
|
---|
| 80 | ! int close(int fd)
|
---|
| 81 | ! Close an open file.
|
---|
| 82 | .define _close
|
---|
| 83 | _close:
|
---|
| 84 | mov bx, sp
|
---|
| 85 | mov bx, 2(bx) ! bx = file handle
|
---|
| 86 | movb ah, 0x3E ! "CLOSE"
|
---|
| 87 | jmp dos
|
---|
| 88 |
|
---|
| 89 | ! void exit(int status)
|
---|
| 90 | ! void _exit(int status)
|
---|
| 91 | ! Return to DOS.
|
---|
| 92 | .define _exit, __exit, ___exit
|
---|
| 93 | _exit:
|
---|
| 94 | __exit:
|
---|
| 95 | ___exit:
|
---|
| 96 | pop ax
|
---|
| 97 | pop ax ! al = status
|
---|
| 98 | movb ah, 0x4C ! "EXIT"
|
---|
| 99 | int 0x21
|
---|
| 100 | hlt
|
---|
| 101 |
|
---|
| 102 | ! ssize_t read(int fd, void *buf, size_t n)
|
---|
| 103 | ! Read bytes from an open file.
|
---|
| 104 | .define _read
|
---|
| 105 | _read:
|
---|
| 106 | mov bx, sp
|
---|
| 107 | mov cx, 6(bx)
|
---|
| 108 | mov dx, 4(bx)
|
---|
| 109 | mov bx, 2(bx)
|
---|
| 110 | movb ah, 0x3F ! "READ"
|
---|
| 111 | jmp dos
|
---|
| 112 |
|
---|
| 113 | ! ssize_t write(int fd, const void *buf, size_t n)
|
---|
| 114 | ! Write bytes to an open file.
|
---|
| 115 | .define _write
|
---|
| 116 | _write:
|
---|
| 117 | mov bx, sp
|
---|
| 118 | mov cx, 6(bx)
|
---|
| 119 | mov dx, 4(bx)
|
---|
| 120 | mov bx, 2(bx)
|
---|
| 121 | movb ah, 0x40 ! "WRITE"
|
---|
| 122 | jmp dos
|
---|
| 123 |
|
---|
| 124 | ! off_t lseek(int fd, off_t offset, int whence)
|
---|
| 125 | ! Set file position for read or write.
|
---|
| 126 | .define _lseek
|
---|
| 127 | _lseek:
|
---|
| 128 | mov bx, sp
|
---|
| 129 | movb al, 8(bx) ! SEEK_SET, SEEK_CUR, SEEK_END
|
---|
| 130 | mov dx, 4(bx)
|
---|
| 131 | mov cx, 6(bx) ! cx:dx = offset
|
---|
| 132 | mov bx, 2(bx)
|
---|
| 133 | movb ah, 0x42 ! "LSEEK"
|
---|
| 134 | jmp dos
|
---|
| 135 |
|
---|
| 136 | !
|
---|
| 137 | ! $PchId: mkfhead.ack.s,v 1.3 1999/01/14 21:17:06 philip Exp $
|
---|