wok-current diff linld/stuff/src/CRTL.ASM @ rev 19538
linld: add 'linld <kernel> <cmdline>' syntax
author | Pascal Bellard <pascal.bellard@slitaz.org> |
---|---|
date | Fri Dec 02 12:37:59 2016 +0100 (2016-12-02) |
parents | bb42796dcd3b |
children | 31c5cbbd9380 |
line diff
1.1 --- a/linld/stuff/src/CRTL.ASM Tue Nov 22 21:19:01 2016 +0100 1.2 +++ b/linld/stuff/src/CRTL.ASM Fri Dec 02 12:37:59 2016 +0100 1.3 @@ -13,8 +13,7 @@ 1.4 segment _DATA byte public use16 'DATA' 1.5 1.6 msg_hang db "High mem corrupted - not exiting to DOS",0 1.7 - global _vcpi_alloc_err:byte 1.8 -_vcpi_alloc_err db "vcpi " 1.9 +vcpi_alloc_err db "vcpi " 1.10 msg_malloc db "malloc() failure",0 1.11 msg_crlf db 13,10,0 1.12 1.13 @@ -34,6 +33,104 @@ 1.14 segment _TEXT byte public use16 'CODE' 1.15 1.16 ;*************************************************************** 1.17 +;char* strcpy(const char* a, const char* b); 1.18 +;*************************************************************** 1.19 + global _strcpy:near 1.20 + proc _strcpy near 1.21 + 1.22 + mov dl,0 1.23 +cat: 1.24 + pop ax ;caller return address 1.25 + pop cx ; a 1.26 + pop bx ; b 1.27 + push bx 1.28 + push cx 1.29 + push ax 1.30 + push si 1.31 + mov si,cx 1.32 + shr dl,1 1.33 + jnc @@nocat 1.34 +@@catlp: 1.35 + lodsb 1.36 + cmp al,0 1.37 + jne @@catlp 1.38 + dec si 1.39 + shr dl,1 1.40 + jnc @@nocat 1.41 + cmp cx,si 1.42 + jz @@nocat 1.43 + mov [word si],20h 1.44 + inc si 1.45 +@@nocat: 1.46 + sub bx,si 1.47 +@@cpylp: 1.48 + mov al,[bx+si] 1.49 + mov [si],al 1.50 + inc si 1.51 + cmp al,0 1.52 + jne @@cpylp 1.53 + mov ax,cx 1.54 + pop si 1.55 + ret 1.56 + 1.57 + endp _strcpy 1.58 + 1.59 + 1.60 +;*************************************************************** 1.61 +;char* strcat(const char* a,const char* b); 1.62 +;*************************************************************** 1.63 + global _strcat:near 1.64 + proc _strcat near 1.65 + 1.66 + mov dl,1 1.67 + jmp cat 1.68 + 1.69 + endp _strcat 1.70 + 1.71 + 1.72 +;*************************************************************** 1.73 +;char* strcatb(const char* a,const char* b); 1.74 +;*************************************************************** 1.75 + global _strcatb:near 1.76 + proc _strcatb near 1.77 + 1.78 + mov dl,3 1.79 + jmp cat 1.80 + 1.81 + endp _strcatb 1.82 + 1.83 + 1.84 +;*************************************************************** 1.85 +;void* malloc(unsigned sz); 1.86 +;*************************************************************** 1.87 + global _malloc:near 1.88 + proc _malloc near 1.89 + 1.90 + pop ax ;caller return address 1.91 + pop cx ; sz 1.92 + push cx 1.93 + push ax 1.94 + global malloc:near ; malloc(cx) 1.95 +malloc: 1.96 + mov ax,[_heap_top] 1.97 + mov bx,offset msg_malloc 1.98 + mov dx,-1400h ; MIN_STACK=_1k+PAGE_SIZE 1.99 + add dx,sp 1.100 + sub dx,ax ; can't overflow 1.101 + cmp dx,cx 1.102 + jb puts 1.103 + add [_heap_top],cx ; _BEG has zero'd heap 1.104 + ;mov bx,ax 1.105 +@@zalloc: 1.106 + ;mov [byte bx],0 1.107 + ;inc bx ; ZF=0 1.108 + ;loop @@zalloc 1.109 + ret 1.110 + 1.111 + endp _malloc 1.112 + 1.113 + 1.114 +;*************************************************************** 1.115 ;void puts(const char* s): 1.116 ;void putsz(const char* s): 1.117 ;*************************************************************** 1.118 @@ -64,12 +161,32 @@ 1.119 xchg ax,cx 1.120 mov bx,1 1.121 mov ah,40h 1.122 - jmp dos 1.123 + int 21h 1.124 + xor ax,ax ; ZF=1 (for malloc failure) 1.125 + ret 1.126 1.127 endp _puts 1.128 1.129 1.130 ;*************************************************************** 1.131 +;int fileattr(const char* name); 1.132 +;*************************************************************** 1.133 + global _fileattr:near 1.134 + proc _fileattr near 1.135 + 1.136 + pop ax ;caller return address 1.137 + pop dx ; name 1.138 + push dx 1.139 + push ax 1.140 + mov ax,4300h 1.141 + int 21h 1.142 + xchg ax,cx 1.143 + jmp chkc 1.144 + 1.145 + endp _fileattr 1.146 + 1.147 + 1.148 +;*************************************************************** 1.149 ;int open(const char* name, int flags); 1.150 ;*************************************************************** 1.151 global _open:near 1.152 @@ -87,15 +204,16 @@ 1.153 mov ah,3dh 1.154 dos: 1.155 int 21h 1.156 +chkc: 1.157 jnc doret 1.158 fail: 1.159 sbb ax,ax ; ax=-1 CF 1.160 cwd 1.161 doret: 1.162 ifndef NO386 1.163 - push dx 1.164 - push ax 1.165 - pop eax 1.166 + push dx ; see next_chunk:lseek 1.167 + push ax 1.168 + pop eax 1.169 endif 1.170 ret 1.171 1.172 @@ -170,7 +288,6 @@ 1.173 1.174 ;*************************************************************** 1.175 ;long lseek(int fd, long sz, int dir); 1.176 -;long rewind(int fd); 1.177 ;*************************************************************** 1.178 global _lseek:near 1.179 proc _lseek near 1.180 @@ -201,23 +318,6 @@ 1.181 endif 1.182 jmp dos 1.183 1.184 - global _rewind:near 1.185 -_rewind: 1.186 - pop ax ;caller return address 1.187 - pop bx ; fd 1.188 - push bx 1.189 - push ax 1.190 -rewind: 1.191 - ifndef NO386 1.192 - xor ecx,ecx 1.193 - xor dx,dx 1.194 - else 1.195 - xor ax,ax 1.196 - xor cx,cx 1.197 - cwd 1.198 - endif 1.199 - jmp lseek 1.200 - 1.201 endp _lseek 1.202 1.203 1.204 @@ -290,7 +390,7 @@ 1.205 global malloc_or_die:near ; malloc_or_die(cx) 1.206 malloc_or_die: 1.207 call malloc 1.208 - jz _diez 1.209 + jz _exit 1.210 ret 1.211 1.212 endp _malloc_or_die 1.213 @@ -298,7 +398,7 @@ 1.214 1.215 ;*************************************************************** 1.216 ;int die(const char* msg); 1.217 -;int diez(); 1.218 +;int exit(); 1.219 ;int abort(); 1.220 ;*************************************************************** 1.221 global _die:near 1.222 @@ -311,8 +411,8 @@ 1.223 global die:near ; die(bx) 1.224 die: 1.225 call puts 1.226 - global _diez:near 1.227 -_diez: 1.228 + global _exit:near 1.229 +_exit: 1.230 mov al,[_no_exit] 1.231 cmp al,0 1.232 jne @@hang 1.233 @@ -333,6 +433,87 @@ 1.234 1.235 1.236 ;*************************************************************** 1.237 +;u32* malloc_bufv_or_die(struct image_himem *m); 1.238 +;*************************************************************** 1.239 + global _malloc_bufv_or_die:near 1.240 + proc _malloc_bufv_or_die near 1.241 + 1.242 + pop bx ;caller return address 1.243 + pop ax 1.244 + push ax 1.245 + push bx 1.246 + push si 1.247 + xchg ax,si 1.248 + mov ecx,[si+6] ; m->size 1.249 + dec ecx 1.250 + shr ecx,12 1.251 + inc cx ; cnt = (m->size+PAGE_MASK)/PAGE_SIZE; 1.252 + push cx 1.253 + inc cx ; cnt+1 1.254 + shl cx,2 ; bufv => vcpi => vm86 1.255 +; our malloc zeroes allocated mem: bufv[cnt]=0; 1.256 +; Allocate pages, storing addrs in addrbuf 1.257 + call malloc_or_die 1.258 + pop cx 1.259 + push cx ; _sort:nel 1.260 + push ax ; _sort:base 1.261 + mov [si+18],ax ; m->bufv 1.262 + xchg ax,bx 1.263 +@@vcpi_alloc: 1.264 + xor edx,edx 1.265 + mov ax,0DE04h 1.266 + int 67h 1.267 + or ah,ah 1.268 + jz @@ok 1.269 + mov bx,offset vcpi_alloc_err 1.270 + jmp die 1.271 +@@ok: 1.272 + mov [bx],edx 1.273 + add bx,4 1.274 + loop @@vcpi_alloc 1.275 +@@again: 1.276 + call _sort 1.277 + extrn _initrd 1.278 + cmp si,offset _initrd 1.279 + jne @@quit 1.280 + pop ax 1.281 + pop cx 1.282 + push cx ; _sort:nel 1.283 + push ax ; _sort:base = m->bufv 1.284 +;again: 1.285 +; for (i = cnt-1; i >= 0; i--) { 1.286 +@@chkloop: 1.287 + mov bx,cx 1.288 + dec bx 1.289 +; if (m->bufv[i] > m->fallback+i*_4k && m->bufv[i] < m->fallback+m->size) { 1.290 + shl bx,2 1.291 + add bx,ax ; m->bufv 1.292 + mov edx,[bx] ; m->bufv[i] 1.293 + sub edx,[si+2] ; m->fallback 1.294 + cmp edx,[si+6] ; m->size 1.295 + jae @@chknext 1.296 + shr edx,12 1.297 + cmp dx,cx 1.298 + jb @@chknext 1.299 +; m->bufv[i] = vcpi_alloc_or_die(); 1.300 +; sort(m->bufv,cnt); 1.301 +; goto again; 1.302 + mov cx,1 1.303 + jmp @@vcpi_alloc 1.304 +; } 1.305 +; } 1.306 +@@chknext: 1.307 + loop @@chkloop 1.308 +@@quit: 1.309 + pop ax 1.310 + pop cx 1.311 + pop si 1.312 + ret 1.313 + 1.314 + endp _malloc_bufv_or_die 1.315 + 1.316 + 1.317 +;*************************************************************** 1.318 ;void next_chunk(struct image_himem *m); 1.319 ;*************************************************************** 1.320 proc _next_chunk near 1.321 @@ -341,7 +522,7 @@ 1.322 pop ax 1.323 push ax 1.324 push bx 1.325 - push di 1.326 + push si di 1.327 xchg ax,di 1.328 mov bx,[di] ; m->fd 1.329 call close 1.330 @@ -355,7 +536,6 @@ 1.331 mov bx,[di+28] ; m->state 1.332 cmp al,[bx] ; "" 1.333 jz @@end 1.334 - push si 1.335 mov si,bx 1.336 @@scan: 1.337 lodsb 1.338 @@ -373,9 +553,9 @@ 1.339 xchg ax,dx ; O_RDONLY 1.340 call open 1.341 pop [word si] ; restore string 1.342 - pop si 1.343 jc @@die 1.344 mov [di],ax ; m->fd 1.345 + mov [di+30],ax ; m->fd2close 1.346 mov dx,2 ; SEEK_END 1.347 xchg ax,bx 1.348 ifndef NO386 1.349 @@ -391,21 +571,26 @@ 1.350 mov bx,[di] ; m->fd 1.351 ifndef NO386 1.352 push eax 1.353 - call rewind 1.354 + xor ecx,ecx 1.355 + xor dx,dx 1.356 + call lseek ; rewind 1.357 pop eax 1.358 @@end: 1.359 mov [di+22],eax ; m->chunk_size 1.360 else 1.361 push ax 1.362 push dx 1.363 - call rewind 1.364 + xor ax,ax 1.365 + xor cx,cx 1.366 + cwd 1.367 + call lseek ; rewind 1.368 pop dx 1.369 pop ax 1.370 @@end: 1.371 mov [di+22],ax ; m->chunk_size 1.372 mov [di+24],dx 1.373 endif 1.374 - pop di 1.375 + pop di si 1.376 ret 1.377 1.378 endp _next_chunk 1.379 @@ -424,6 +609,7 @@ 1.380 ;22 u32 chunk_size; 1.381 ;26 void (*next_chunk)(struct image_himem *); 1.382 ;28 u16 state; 1.383 +;30 u16 fd2close; 1.384 ;}; 1.385 ;*************************************************************** 1.386 global _open_image:near 1.387 @@ -470,7 +656,7 @@ 1.388 and al,0FCh 1.389 add [di+6],ax ; m->size += m->chunk_size 1.390 adc [di+8],dx 1.391 - inc cx 1.392 + inc cx ; jcxnz 1.393 loop @@next 1.394 endif 1.395 mov [di+28],si ; m->state 1.396 @@ -508,49 +694,76 @@ 1.397 endif 1.398 mov di,[m] 1.399 @@loop: 1.400 - mov ax,[word sz] 1.401 - mov cx,[di+22] ; m->chunk_size 1.402 - cmp ax,cx 1.403 + ifndef NO386 1.404 + xor ecx,ecx 1.405 + mov cx,[word sz] 1.406 +@@chksz: 1.407 + mov eax,[di+22] ; m->chunk_size 1.408 + cmp ecx,eax 1.409 + jb @@szok 1.410 + xchg eax,ecx 1.411 + else 1.412 + mov cx,[word sz] 1.413 +@@chksz: 1.414 + mov ax,[di+22] ; lo m->chunk_size 1.415 + cmp cx,ax 1.416 jb @@szok 1.417 cmp [word di+24],0 ; hi m->chunk_size 1.418 jne @@szok 1.419 xchg ax,cx 1.420 + endif 1.421 @@szok: 1.422 - push ax 1.423 + jcxz image_done 1.424 + push cx 1.425 push [word data] 1.426 push [word di] 1.427 call _read 1.428 - pop cx 1.429 + pop dx 1.430 pop bx 1.431 + pop dx 1.432 + jc image_done 1.433 add bx,ax 1.434 - pop cx 1.435 xor cx,cx 1.436 + ifndef NO386 1.437 + cwde ; ax < 8000h 1.438 + cwd 1.439 + sub [di+22],eax 1.440 + else 1.441 + cwd ; ax < 8000h 1.442 sub [di+22],ax 1.443 - sbb [di+24],cx 1.444 + sbb [di+24],dx 1.445 + jnz @@fill 1.446 + cmp [di+22],dx 1.447 + endif 1.448 + jnz @@fill 1.449 + dec cx 1.450 @@fill: 1.451 test al,3 1.452 je @@filled 1.453 - mov [bx],cl 1.454 + mov [bx],dl 1.455 inc bx 1.456 inc ax 1.457 jmp @@fill 1.458 @@filled: 1.459 + ifndef NO386 1.460 + sub [di+10],eax ; m->remaining 1.461 + else 1.462 + sub [di+10],ax ; m->remaining 1.463 + sbb [di+12],dx 1.464 + endif 1.465 add [bp-4-2],ax 1.466 add [word data],ax 1.467 sub [word sz],ax 1.468 - jz image_done 1.469 - mov cx,[di+22] ; lo m->chunk_size 1.470 - or cx,[di+24] ; hi m->chunk_size 1.471 - jnz image_done 1.472 - or cx,[di+26] ; m->next_chunk 1.473 - jz image_done 1.474 + pushf 1.475 + and cx,[di+26] ; m->next_chunk 1.476 + jz @@same_chunk 1.477 push di 1.478 call cx ; m->next_chunk() 1.479 pop di 1.480 - mov cx,[di+22] ; lo m->chunk_size 1.481 - or cx,[di+24] ; hi m->chunk_size 1.482 - jz image_done 1.483 - jmp @@loop 1.484 +@@same_chunk: 1.485 + popf 1.486 + jnz @@loop 1.487 + jmp image_done 1.488 1.489 endp _read_image 1.490 1.491 @@ -561,20 +774,35 @@ 1.492 global _strtol:near 1.493 proc _strtol near 1.494 1.495 -;TODO NO386 1.496 ifndef NO386 1.497 pop ax ;caller return address 1.498 pop cx ; s 1.499 push cx 1.500 push ax 1.501 xor ebx,ebx 1.502 - jcxz @@end 1.503 + jcxz @@jncend 1.504 push si 1.505 mov si,cx 1.506 xor ecx,ecx 1.507 xor eax,eax 1.508 - mov cl,10 ; radix 1.509 lodsb 1.510 + mov dl,20h 1.511 + or dl,al 1.512 + cmp dl,'n' ; vga=normal 1.513 + je @@vga 1.514 + dec cx 1.515 + cmp dl,'e' ; vga=extended 1.516 + je @@vga 1.517 + dec cx 1.518 + cmp dl,'a' ; vga=ask 1.519 + jne @@notvga 1.520 +@@vga: 1.521 + dec cx 1.522 + xchg ax,cx 1.523 + cwd 1.524 + jmp popsiret 1.525 +@@notvga: 1.526 + mov cx,10 ; radix 1.527 cmp al,'+' 1.528 je @@radixskip 1.529 cmp al,'-' 1.530 @@ -627,6 +855,7 @@ 1.531 shl ebx,cl 1.532 @@noshift: 1.533 popf 1.534 +@@jncend: 1.535 jnc @@end 1.536 neg ebx 1.537 @@end: 1.538 @@ -645,10 +874,28 @@ 1.539 xor ax,ax 1.540 cwd 1.541 xchg ax,di 1.542 - jcxz @@end 1.543 + jcxz @@goend 1.544 mov si,cx 1.545 + lodsb 1.546 + mov dl,20h 1.547 + or dl,al 1.548 + mov cx,-1 1.549 + cmp dl,'n' ; vga=normal 1.550 + je @@vga 1.551 + dec cx 1.552 + cmp dl,'e' ; vga=extended 1.553 + je @@vga 1.554 + dec cx 1.555 + cmp dl,'a' ; vga=ask 1.556 + jne @@notvga 1.557 +@@vga: 1.558 + xchg ax,cx 1.559 + cwd 1.560 + jmp popsiret 1.561 +@@goend: 1.562 + jmp @@end 1.563 +@@notvga: 1.564 mov cx,10 ; radix 1.565 - lodsb 1.566 cmp al,'+' 1.567 je @@radixskip 1.568 cmp al,'-' 1.569 @@ -752,13 +999,12 @@ 1.570 ifndef fastsort 1.571 ; bubble sort 1.572 push si 1.573 - cmp cx,2 1.574 - jl popsiret 1.575 shl cx,2 1.576 @@loop: 1.577 xor ax,ax 1.578 - jcxz popsiret 1.579 mov si,4 1.580 + cmp cx,si 1.581 + jbe popsiret 1.582 @@next: 1.583 mov edx,[bx+si-4] 1.584 cmp edx,[bx+si] 1.585 @@ -859,41 +1105,6 @@ 1.586 endp _sort 1.587 1.588 1.589 -;*************************************************************** 1.590 -;void* malloc(unsigned sz); 1.591 -;*************************************************************** 1.592 - global _malloc:near 1.593 - proc _malloc near 1.594 - 1.595 - pop ax ;caller return address 1.596 - pop cx ; sz 1.597 - push cx 1.598 - push ax 1.599 - global malloc:near ; malloc(cx) 1.600 -malloc: 1.601 - mov ax,[_heap_top] 1.602 - mov bx,sp 1.603 - sub bh,14h ; MIN_STACK=_1k+PAGE_SIZE 1.604 - sub bx,cx 1.605 - jb @@outofmem 1.606 - cmp bx,ax 1.607 - jb @@outofmem 1.608 - add [_heap_top],cx ; _BEG has zero'd heap 1.609 - ;mov bx,ax 1.610 -@@zalloc: 1.611 - ;mov [byte bx],0 1.612 - ;inc bx ; ZF=0 1.613 - ;loop @@zalloc 1.614 - ret 1.615 -@@outofmem: 1.616 - mov bx,offset msg_malloc 1.617 - call puts 1.618 - xor ax,ax ; ZF=1 1.619 - ret 1.620 - 1.621 - endp _malloc 1.622 - 1.623 - 1.624 ifdef NO386 1.625 ;*************************************************************** 1.626 ;u16 topseg(); 1.627 @@ -905,7 +1116,7 @@ 1.628 jnc @@max640k 1.629 mov ax,640 ; 9000 1.630 @@max640k: 1.631 - sub al,040h 1.632 + sub ax,028h 1.633 and al,0C0h 1.634 mov cl,6 1.635 shl ax,cl 1.636 @@ -914,6 +1125,41 @@ 1.637 endp _topseg 1.638 endif 1.639 1.640 +;*************************************************************** 1.641 +;void rmcpy(void* rmbuf, u16 rmsize); 1.642 +;*************************************************************** 1.643 + global _rmcpy:near 1.644 + proc _rmcpy near 1.645 + 1.646 + pop bx ;caller return address 1.647 + pop ax ; rmbuf 1.648 + pop cx ; rmsize 1.649 + push cx 1.650 + push ax 1.651 + push bx 1.652 + push si di es 1.653 + xchg ax,si 1.654 + xor di,di 1.655 + ifdef NO386 1.656 + call _topseg 1.657 + mov es,ax 1.658 + else 1.659 + push 9000h 1.660 + pop es 1.661 + endif 1.662 + cld 1.663 + rep 1.664 + movsb 1.665 + extrn _cmdline:word 1.666 + mov si,[_cmdline] 1.667 + mov di,8000h 1.668 + mov ch,10h ; 4k 1.669 + rep 1.670 + movsb 1.671 + pop es di si 1.672 + ret 1.673 + 1.674 + endp _rmcpy 1.675 1.676 ends _TEXT 1.677