wok-6.x annotate linld/stuff/src/_BEG.ASM @ rev 19515

linld: multi initrd support
author Pascal Bellard <pascal.bellard@slitaz.org>
date Tue Nov 22 21:19:01 2016 +0100 (2016-11-22)
parents
children 7f92b23984dc
rev   line source
pascal@19515 1 ;***************************************************************
pascal@19515 2 ;****** This file is distributed under GPL
pascal@19515 3 ;***************************************************************
pascal@19515 4 ideal
pascal@19515 5 %crefref
pascal@19515 6 %noincl
pascal@19515 7 %nomacs
pascal@19515 8 p386
pascal@19515 9
pascal@19515 10 group DGROUP _TEXT,_DATA,_BSS
pascal@19515 11 assume cs:DGROUP,ds:DGROUP
pascal@19515 12
pascal@19515 13 segment _TEXT byte public use16 'CODE'
pascal@19515 14
pascal@19515 15 org 100h
pascal@19515 16 global _text_start:byte
pascal@19515 17 label _text_start byte
pascal@19515 18 extrn _bss_end
pascal@19515 19 ;***************************************************************
pascal@19515 20 ; clear bss
pascal@19515 21 ;***************************************************************
pascal@19515 22 xor ax,ax
pascal@19515 23 mov di,offset _bss_start
pascal@19515 24 clearbss:
pascal@19515 25 mov [di],al
pascal@19515 26 inc di
pascal@19515 27 cmp di,sp ; clear bss + heap
pascal@19515 28 jbe clearbss
pascal@19515 29 mov di,offset _bss_end
pascal@19515 30 ;***************************************************************
pascal@19515 31 ; build argv & argc
pascal@19515 32 ;***************************************************************
pascal@19515 33 ; push ax ; envp (int 20h do it for us)
pascal@19515 34 ;mov [word di],ax ; argv[0] = 0
pascal@19515 35 mov si,80h
pascal@19515 36 cld
pascal@19515 37 lodsb
pascal@19515 38 cmp al,7Eh
pascal@19515 39 jbe alok
pascal@19515 40 mov al,7Eh
pascal@19515 41 alok:
pascal@19515 42 xchg ax,bx
pascal@19515 43 mov [bx+si],bh ; set eos
pascal@19515 44 argbuild:
pascal@19515 45 mov bx,2 ; argc * 2
pascal@19515 46 argeos:
pascal@19515 47 mov dl,1 ; look for a start of string
pascal@19515 48 mov [byte si-1],bh ; mark eos
pascal@19515 49 mov ah,20h ; space will be eos
pascal@19515 50 arglp:
pascal@19515 51 lodsb
pascal@19515 52 cmp al,0h
pascal@19515 53 je argdone
pascal@19515 54 cmp al,20h
pascal@19515 55 jb argeos
pascal@19515 56 cmp al,ah
pascal@19515 57 je argeos
pascal@19515 58 cmp al,27h
pascal@19515 59 je isargstr
pascal@19515 60 cmp al,22h
pascal@19515 61 je isargstr
pascal@19515 62 or dl,dl
pascal@19515 63 je arglp ; not start of string
pascal@19515 64 dec si
pascal@19515 65 jmp newarg
pascal@19515 66 isargstr:
pascal@19515 67 mov ah,al ; expected eos
pascal@19515 68 newarg:
pascal@19515 69 mov [word bx+di],si ; argv[argc++] = si
pascal@19515 70 inc bx
pascal@19515 71 inc bx
pascal@19515 72 dec dx
pascal@19515 73 jmp arglp
pascal@19515 74 argdone:
pascal@19515 75 ;mov [word bx+di],0 ; argv[argc] = 0
pascal@19515 76 lea si,[bx+di+2]
pascal@19515 77 extrn _heap_top:word
pascal@19515 78 mov [_heap_top],si
pascal@19515 79 push di ; argv
pascal@19515 80 shr bx,1
pascal@19515 81 push bx ; argc
pascal@19515 82 ifndef filearg
pascal@19515 83 mov bx,[di+2] ; argv[1]
pascal@19515 84 cmp [byte bx],'@'
pascal@19515 85 jne argend
pascal@19515 86 inc bx ; al=0 RDONLY
pascal@19515 87 extrn open:near
pascal@19515 88 call near open
pascal@19515 89 jc argend
pascal@19515 90 pop bx ; trash argc, argv >> 1Kb !
pascal@19515 91 push di
pascal@19515 92 push ax
pascal@19515 93 extrn _read:near
pascal@19515 94 call near _read
pascal@19515 95 pop bx ; fd for close
pascal@19515 96 pop si ; si=buffer=argv
pascal@19515 97 add di,ax
pascal@19515 98 pop ax ; trash sizemax=argv
pascal@19515 99 extrn close:near
pascal@19515 100 call near close
pascal@19515 101 jmp argbuild
pascal@19515 102 argend:
pascal@19515 103 endif
pascal@19515 104
pascal@19515 105 ;***************************************************************
pascal@19515 106 extrn _is_vm86:near
pascal@19515 107 call _is_vm86 ; load_image needs that
pascal@19515 108
pascal@19515 109 ;***************************************************************
pascal@19515 110 extrn _main:near
pascal@19515 111 call _main
pascal@19515 112 push ax
pascal@19515 113 push ax
pascal@19515 114 ;***************************************************************
pascal@19515 115 ;void exit(int n);
pascal@19515 116 ;***************************************************************
pascal@19515 117 global _exit:near
pascal@19515 118 global exit:near
pascal@19515 119 _exit:
pascal@19515 120 pop bx ;caller return address
pascal@19515 121 pop ax ; n
pascal@19515 122 exit:
pascal@19515 123 mov ah,4Ch
pascal@19515 124 int 21h
pascal@19515 125 ends _TEXT
pascal@19515 126
pascal@19515 127 segment _DATA byte public use16 'DATA'
pascal@19515 128 global _data_start:byte
pascal@19515 129 label _data_start byte
pascal@19515 130 ends _DATA
pascal@19515 131
pascal@19515 132 segment _BSS byte public use16 'BSS'
pascal@19515 133 global _bss_start:byte
pascal@19515 134 label _bss_start byte
pascal@19515 135 ends _BSS
pascal@19515 136
pascal@19515 137 end _text_start
pascal@19515 138
pascal@19515 139 ;###### END OF FILE ############################################