source: trunk/minix/boot/mkfhead.s@ 20

Last change on this file since 20 was 9, checked in by Mattia Monga, 14 years ago

Minix 3.1.2a

File size: 2.9 KB
RevLine 
[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
14mkfile:
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
270: movb _PSP+0x81(bx), ch ! Null terminate
28 dec bx
29 js 9f
30 cmpb _PSP+0x81(bx), 0x20 ! Whitespace?
31 jbe 0b
321: dec bx ! One argument character
33 js 2f
34 cmpb _PSP+0x81(bx), 0x20 ! More argument characters?
35 ja 1b
362: 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?
419: 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"
60dos: int 0x21 ! ax = creat(path, 0666);
61 jc seterrno
62 ret
63
64seterrno:
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 $
Note: See TracBrowser for help on using the repository browser.