wok-current rev 23985
linld: up to 60k for header.com
author | Pascal Bellard <pascal.bellard@slitaz.org> |
---|---|
date | Sat Nov 28 09:45:01 2020 +0000 (2020-11-28) |
parents | 431c14b76522 |
children | f3eb71ce1913 |
files | linld/stuff/src/CRTL.ASM linld/stuff/src/HEADER.ASM linld/stuff/src/ISOCRTL.ASM linld/stuff/src/_BEG.ASM |
line diff
1.1 --- a/linld/stuff/src/CRTL.ASM Wed Nov 25 20:41:41 2020 +0000 1.2 +++ b/linld/stuff/src/CRTL.ASM Sat Nov 28 09:45:01 2020 +0000 1.3 @@ -135,6 +135,7 @@ 1.4 global @strcmp$qpxzct1:near 1.5 proc @strcmp$qpxzct1 near 1.6 1.7 + ifdef USE_ARGSTR 1.8 @@loop: 1.9 xchg ax,bx 1.10 mov cl,[bx] ; cl = *b++ 1.11 @@ -147,6 +148,15 @@ 1.12 jz failifc ; return 0 1.13 jmp @@loop 1.14 1.15 + else 1.16 + 1.17 + call @strhead$qpxzct1 1.18 + jne closeret ; return -1 1.19 + cmp cl,[bx] 1.20 + jmp failifc ; return 0 or -1 1.21 + 1.22 + endif 1.23 + 1.24 endp @strcmp$qpxzct1 1.25 endif 1.26 1.27 @@ -166,9 +176,10 @@ 1.28 1.29 open: ; open(bx) 1.30 ifdef ISOHOOK 1.31 -;_fastcall int open(bx:const char* name); 1.32 extrn iso_open_hack:word 1.33 - call [iso_open_hack] ; or ret 1.34 + jmp [iso_open_hack] 1.35 + global __open:near 1.36 +__open: 1.37 endif 1.38 ifdef LONG_FILENAME 1.39 mov ax,716Ch 1.40 @@ -206,15 +217,17 @@ 1.41 1.42 global close:near ; close(ax) 1.43 close: 1.44 + mov bh,3Eh 1.45 ifdef ISOHOOK 1.46 extrn iso_close_hack:word 1.47 - call [iso_close_hack] ; or ret 1.48 + jmp [iso_close_hack] 1.49 endif 1.50 - mov bh,3Eh 1.51 + global dosbx:near 1.52 dosbx: 1.53 xchg ax,bx 1.54 or bx,bx 1.55 jnz dos 1.56 +closeret: 1.57 ret 1.58 1.59 endp @close$qi 1.60 @@ -252,12 +265,13 @@ 1.61 @read$cxdxbx: 1.62 mov ah,3Fh 1.63 endif 1.64 + jcxz fail 1.65 ifdef ISOHOOK 1.66 -;_fastcall int read(bx:int fd, dx:void* data, cx:int sz); 1.67 +;_fastcall int read(bx:int fd, dx:void* data, cx:int sz, ah=3Fh); 1.68 extrn iso_read_hack:word 1.69 - call [iso_read_hack] ; or ret 1.70 + jmp [iso_read_hack] ; or ret 1.71 endif 1.72 - jcxz fail 1.73 + global dos:near 1.74 dos: 1.75 int 21h 1.76 jnc doret 1.77 @@ -296,13 +310,14 @@ 1.78 lseekword: 1.79 sbb cx,cx 1.80 lseekset: 1.81 + mov bh,42h ; bx=fd cx:dx=offset al=whence 1.82 ifdef ISOHOOK 1.83 -;_fastcall long lseek(ax:int fd, cxdx:unsigned long offset, bl:whence); 1.84 +;_fastcall long lseek(ax:int fd, cxdx:unsigned long offset, bl:whence, bh=42h); 1.85 extrn iso_lseek_hack:word 1.86 - call [iso_lseek_hack] ; or ret 1.87 + jmp [iso_lseek_hack] 1.88 + else 1.89 + jmp dosbx 1.90 endif 1.91 - mov bh,42h ; bx=fd cx:dx=offset al=whence 1.92 - jmp dosbx 1.93 1.94 endp @rewind$qi 1.95 1.96 @@ -463,9 +478,9 @@ 1.97 xchg ax,bx 1.98 mov cl,[bx] ; cl = *b++ 1.99 inc bx 1.100 + xchg ax,bx 1.101 or cl,cl ; clear C 1.102 jz failifc ; return 0 1.103 - xchg ax,bx 1.104 xor cl,[bx] ; cl -= *a++ 1.105 inc bx 1.106 and cl,0dfh ; case insensitive
2.1 --- a/linld/stuff/src/HEADER.ASM Wed Nov 25 20:41:41 2020 +0000 2.2 +++ b/linld/stuff/src/HEADER.ASM Sat Nov 28 09:45:01 2020 +0000 2.3 @@ -13,52 +13,45 @@ 2.4 2.5 segment _TEXT byte public use16 'CODE' 2.6 2.7 - org 100h 2.8 +COMSTART = 100h 2.9 +MAXCODESZ = 0F000h ; < 64K - COMSTART - STKSZ 2.10 + 2.11 + org COMSTART 2.12 global _text_start:byte 2.13 label _text_start byte 2.14 2.15 + cld 2.16 + mov dx,offset tazboot_cmd 2.17 mov di,80h 2.18 - cmp [byte di],1 2.19 + cmp [byte di],dh 2.20 ja notfound 2.21 - ifdef WITH_LONG_FILENAME 2.22 - mov si,offset tazboot_cmd 2.23 - mov ax,716Ch 2.24 - xor bx,bx ; R/O 2.25 - xor cx,cx ; attributes 2.26 - cwd ; action = open 2.27 - stc 2.28 - int 21h 2.29 - jnc found 2.30 - mov dx,si 2.31 - else 2.32 - mov dx,offset tazboot_cmd 2.33 - endif 2.34 mov ax,3d00h ; read-only+compatibility 2.35 ;mov cl,0 ; attribute mask 2.36 int 21h 2.37 jc notfound 2.38 found: 2.39 xchg ax,bx 2.40 - mov ah,3Eh 2.41 + mov ah,3Eh ; close 2.42 int 21h 2.43 - mov cx,endcmd-begcmd+1 2.44 - mov si,offset default_arg 2.45 + mov si,offset default_arg ; di = 0080h 2.46 + mov cx,di 2.47 rep 2.48 movsb 2.49 notfound: 2.50 - mov di,9000h 2.51 - mov si,offset tomove 2.52 - mov ch,1 2.53 - jmp move 2.54 -tomove: 2.55 - cld 2.56 - mov di,100h 2.57 - mov si,offset endcmd 2.58 - mov ch,40h 2.59 + mov di,MAXCODESZ+offset endcmd 2.60 + mov si,offset move 2.61 + mov cx,COMSTART 2.62 + mov ax,offset endcmd 2.63 move: 2.64 push di 2.65 + push cx 2.66 rep 2.67 - movsw 2.68 + movsb 2.69 + pop di 2.70 + pop cx 2.71 + ;sub cx,ax 2.72 + xchg ax,si 2.73 + push cx 2.74 ret 2.75 2.76 default_arg db endcmd-begcmd
3.1 --- a/linld/stuff/src/ISOCRTL.ASM Wed Nov 25 20:41:41 2020 +0000 3.2 +++ b/linld/stuff/src/ISOCRTL.ASM Sat Nov 28 09:45:01 2020 +0000 3.3 @@ -51,13 +51,13 @@ 3.4 push ds 3.5 pop es 3.6 mov di,128h ; TABLE 3.7 - mov ax,offset iso_open_hack 3.8 + mov ax,offset iso_close_hack 3.9 stosw 3.10 - mov al,offset iso_read_hack-0F000h 3.11 + inc ax ; iso_open_hack 3.12 stosw 3.13 - mov al,offset iso_lseek_hack-0F000h 3.14 + add al,offset iso_read_hack-offset iso_open_hack 3.15 stosw 3.16 - mov al,offset iso_close_hack-0F000h 3.17 + add al,offset iso_lseek_hack-offset iso_read_hack 3.18 stosw 3.19 ifdef NO386 3.20 global N_LXLSH@ES:near 3.21 @@ -71,6 +71,7 @@ 3.22 rcl dx,1 3.23 loop @@lp 3.24 endif 3.25 +iso_close_hack: 3.26 ret 3.27 3.28 ;*************************************************************** 3.29 @@ -81,135 +82,24 @@ 3.30 cmp [byte bx],'!' 3.31 je @readmenu$qv 3.32 xchg ax,bx 3.33 - global iso_open:near 3.34 iso_open: 3.35 mov [_isostate.filename2open],ax 3.36 call @_isoopen$qv 3.37 cmp al,1 3.38 cmc 3.39 -iso_close_hack: 3.40 - pop bx 3.41 ret 3.42 3.43 3.44 ;*************************************************************** 3.45 -;_fastcall void readmenu(void); 3.46 -;*************************************************************** 3.47 - global @readmenu$qv:near 3.48 - proc @readmenu$qv near 3.49 - 3.50 - pop ax 3.51 - mov dx,18 3.52 - xor cx,cx 3.53 - call lseekset 3.54 - mov dx,offset _isostate.filemod 3.55 - mov cx,10 3.56 - call readfd ; // read x->filemod + x->fileofs & x->filesize 3.57 - mov bx,offset _isostate.fileofs 3.58 - ; x->fileofs = 0x7FF0 - (x->filesize &= 0xFFFF); 3.59 - mov ax,7FF0h 3.60 - cwd 3.61 - mov [word bx+6],dx 3.62 - sub ax,[bx+4] 3.63 - mov [word bx+2],dx 3.64 - mov [bx],ax 3.65 - ; //magic = x->filemod; 3.66 - 3.67 - endp @readmenu$qv 3.68 - 3.69 -;*************************************************************** 3.70 -;_fastcall void isolseek(bx:const unsigned long *offset); 3.71 -;*************************************************************** 3.72 - global @isolseek$qpxul:near 3.73 - proc @isolseek$qpxul near 3.74 - 3.75 -isolseek: 3.76 - mov dx,[bx] 3.77 - mov cx,[bx+2] 3.78 -lseekset: 3.79 - mov ax,4200h ; bx=fd cx:dx=offset al=whence 3.80 -dosfd: 3.81 - mov bx,[_isostate.fd] 3.82 -dos: 3.83 - int 21h 3.84 -failifc: 3.85 - jnc dosok 3.86 -fail: 3.87 - sbb ax,ax 3.88 - cwd 3.89 -dosok: 3.90 - ret 3.91 - 3.92 - endp @isolseek$qpxul 3.93 - 3.94 -;*************************************************************** 3.95 -;_fastcall int isoreadsector(bx:const unsigned long *offset); 3.96 -;*************************************************************** 3.97 - global @isoreadsector$qpxul:near 3.98 - proc @isoreadsector$qpxul near 3.99 - 3.100 - call isolseek 3.101 - jc fail 3.102 - mov cx,2560 3.103 - mov dx,offset _isostate.buffer 3.104 - global readfd:near 3.105 -readfd: 3.106 - mov ah,3Fh 3.107 - jmp dosfd 3.108 - 3.109 - endp @isoreadsector$qpxul 3.110 - 3.111 -;*************************************************************** 3.112 -;_fastcall int strhead(bx:const char* a, ax:const char* b); 3.113 -;*************************************************************** 3.114 - global @strhead$qpxzct1:near 3.115 - proc @strhead$qpxzct1 near 3.116 - 3.117 -@@loop: 3.118 - xchg ax,bx 3.119 - mov cl,[bx] ; cl = *b++ 3.120 - inc bx 3.121 - or cl,cl ; clear C 3.122 - jz fail ; return 0 3.123 - xchg ax,bx 3.124 - xor cl,[bx] ; cl -= *a++ 3.125 - inc bx 3.126 - or cl,cl 3.127 - stc 3.128 - jne fail ; return -1 3.129 - jmp @@loop 3.130 - 3.131 - endp @strhead$qpxzct1 3.132 - 3.133 -;*************************************************************** 3.134 -;_fastcall int strcmp(bx:const char* a, ax:const char* b); 3.135 -;*************************************************************** 3.136 - global @strcmp$qpxzct1:near 3.137 - proc @strcmp$qpxzct1 near 3.138 - 3.139 - call @strhead$qpxzct1 3.140 - jne dosok ; return -1 3.141 - xchg ax,bx 3.142 - cmp cl,[bx] 3.143 - jmp fail ; return 0 or -1 3.144 - 3.145 - endp @strcmp$qpxzct1 3.146 - 3.147 -;*************************************************************** 3.148 -;_fastcall int read(bx:int fd=isostate.fd, dx:void* data, cx:int sz); 3.149 +;_fastcall int read(bx:int fd=isostate.fd, dx:void* data, cx:int sz, ah=3Fh); 3.150 ;*************************************************************** 3.151 iso_read_hack: 3.152 push dx 3.153 push cx 3.154 xor cx,cx 3.155 - mov ax,4201h 3.156 - cwd 3.157 - ifdef SEEK_CUR 3.158 - call curpos ; bx = _isostate.fileofs 3.159 - else 3.160 - call dosfd ; lseek(,0L,SEEK_CUR) 3.161 - call sub_fileofs ; bx = _isostate.fileofs 3.162 - endif 3.163 + xor dx,dx 3.164 + mov al,01h 3.165 + call doseek ; bx = _isostate.fileofs 3.166 ifdef NO386 3.167 mov cx,[bx+4] ; _isostate.filesize 3.168 sub cx,ax 3.169 @@ -240,38 +130,138 @@ 3.170 xchg ax,cx 3.171 @@cxok: 3.172 pop dx ; buffer 3.173 - pop bx ; skip last caller 3.174 jmp readfd 3.175 3.176 + 3.177 ;*************************************************************** 3.178 -;_fastcall long lseek(ax:int fd=isostate.fd, cxdx:unsigned long offset, bl:whence); 3.179 +;_fastcall long lseek(ax:int fd=isostate.fd, cxdx:unsigned long offset, bl:whence, bh=42h); 3.180 ;*************************************************************** 3.181 iso_lseek_hack: 3.182 xchg ax,bx 3.183 - pop bx ; skip last caller 3.184 ifdef SEEK_CUR 3.185 cmp al,1 ; current 3.186 - jne @@nocurrent 3.187 -curpos: 3.188 - call dosfd ; lseek(,0L,SEEK_CUR) 3.189 - jmp sub_fileofs 3.190 -@@nocurrent: 3.191 + je doseek 3.192 endif 3.193 mov bx,offset _isostate.fileofs 3.194 add dx,[bx] 3.195 adc cx,[bx+2] 3.196 cmp al,0 ; start 3.197 - je @@doseek 3.198 + je doseek 3.199 add dx,[bx+4] ; _isostate.filesize 3.200 adc cx,[bx+6] 3.201 -@@doseek: 3.202 - call lseekset ; lseek(,0L,SEEK_SET) 3.203 +doseek: 3.204 + call lseek ; lseek(,,al) 3.205 sub_fileofs: 3.206 mov bx,offset _isostate.fileofs 3.207 sub ax,[bx] 3.208 sbb dx,[bx+2] 3.209 ret 3.210 3.211 + 3.212 +;*************************************************************** 3.213 +;_fastcall void readmenu(void); 3.214 +;*************************************************************** 3.215 + proc @readmenu$qv near 3.216 + 3.217 + mov dx,18 3.218 + xor cx,cx 3.219 + call lseekset 3.220 + mov dx,offset _isostate.filemod 3.221 + mov cl,10 3.222 + call readfd ; // read x->filemod + x->fileofs & x->filesize 3.223 + mov bx,offset _isostate.fileofs 3.224 + ; x->fileofs = 0x7FF0 - (x->filesize &= 0xFFFF); 3.225 + mov ax,7FF0h 3.226 + cwd 3.227 + mov [word bx+6],dx 3.228 + sub ax,[bx+4] 3.229 + mov [word bx+2],dx 3.230 + mov [bx],ax 3.231 + ; //magic = x->filemod; 3.232 + 3.233 + endp @readmenu$qv 3.234 + 3.235 +;*************************************************************** 3.236 +;_fastcall void isolseek(bx:const unsigned long *offset); 3.237 +;*************************************************************** 3.238 + global @isolseek$qpxul:near 3.239 + proc @isolseek$qpxul near 3.240 + 3.241 +isolseek: 3.242 + mov dx,[bx] 3.243 + mov cx,[bx+2] 3.244 +lseekset: 3.245 + mov al,00h ; bx=fd cx:dx=offset al=whence 3.246 +lseek: 3.247 + mov ah,42h 3.248 +dosfd: 3.249 + mov bx,[_isostate.fd] 3.250 +dos: 3.251 + int 21h 3.252 +failifc: 3.253 + jnc dosok 3.254 +fail: 3.255 + sbb ax,ax 3.256 + cwd 3.257 +dosok: 3.258 + ret 3.259 + 3.260 + endp @isolseek$qpxul 3.261 + 3.262 + 3.263 +;*************************************************************** 3.264 +;_fastcall int isoreadsector(bx:const unsigned long *offset); 3.265 +;*************************************************************** 3.266 + global @isoreadsector$qpxul:near 3.267 + proc @isoreadsector$qpxul near 3.268 + 3.269 + call isolseek 3.270 + jc fail 3.271 + mov ch,9 ; < 2560 3.272 + mov dx,offset _isostate.buffer 3.273 +readfd: 3.274 + mov ah,3Fh 3.275 + jmp dosfd 3.276 + 3.277 + endp @isoreadsector$qpxul 3.278 + 3.279 + 3.280 +;*************************************************************** 3.281 +;_fastcall int strhead(bx:const char* a, ax:const char* b); 3.282 +;*************************************************************** 3.283 + global @strhead$qpxzct1:near 3.284 + proc @strhead$qpxzct1 near 3.285 + 3.286 +@@loop: 3.287 + xchg ax,bx 3.288 + mov cl,[bx] ; cl = *b++ 3.289 + inc bx 3.290 + xchg ax,bx 3.291 + or cl,cl ; clear C 3.292 + jz fail ; return 0 3.293 + xor cl,[bx] ; cl -= *a++ 3.294 + inc bx 3.295 + or cl,cl 3.296 + stc 3.297 + jne fail ; return -1 3.298 + jmp @@loop 3.299 + 3.300 + endp @strhead$qpxzct1 3.301 + 3.302 + 3.303 +;*************************************************************** 3.304 +;_fastcall int strcmp(bx:const char* a, ax:const char* b); 3.305 +;*************************************************************** 3.306 + global @strcmp$qpxzct1:near 3.307 + proc @strcmp$qpxzct1 near 3.308 + 3.309 + call @strhead$qpxzct1 3.310 + jne dosok ; return -1 3.311 + cmp cl,[bx] 3.312 + jmp fail ; return 0 or -1 3.313 + 3.314 + endp @strcmp$qpxzct1 3.315 + 3.316 ends _TEXT 3.317 3.318 end
4.1 --- a/linld/stuff/src/_BEG.ASM Wed Nov 25 20:41:41 2020 +0000 4.2 +++ b/linld/stuff/src/_BEG.ASM Sat Nov 28 09:45:01 2020 +0000 4.3 @@ -106,15 +106,17 @@ 4.4 endif 4.5 4.6 ifdef ISOHOOK 4.7 - extrn @ret:near 4.8 - global iso_open_hack 4.9 -iso_open_hack dw @ret 4.10 + global iso_close_hack 4.11 +iso_close_hack dw dosbx 4.12 + global iso_open_hack 4.13 + extrn __open:near 4.14 +iso_open_hack dw __open 4.15 global iso_read_hack 4.16 -iso_read_hack dw @ret 4.17 + extrn dos:near 4.18 +iso_read_hack dw dos 4.19 global iso_lseek_hack 4.20 -iso_lseek_hack dw @ret 4.21 - global iso_close_hack 4.22 -iso_close_hack dw @ret 4.23 + extrn dosbx:near 4.24 +iso_lseek_hack dw dosbx 4.25 global _cpu_features:dword 4.26 _cpu_features dd ? ; default _cpu_features+3=1Fh/8Eh (bit5=0, not 64bits) 4.27 org $-4