wok annotate linld/stuff/src/_BEG.ASM @ rev 23864

syslinux/isoboot.s: accept user args (again)
author Pascal Bellard <pascal.bellard@slitaz.org>
date Fri Jun 19 17:01:11 2020 +0000 (2020-06-19)
parents a31ec0e0df8e
children d964f766faa5
rev   line source
pascal@19515 1 ;***************************************************************
pascal@19515 2 ;****** This file is distributed under GPL
pascal@19515 3 ;***************************************************************
pascal@19515 4 ideal
pascal@21984 5 %PAGESIZE 1000
pascal@19515 6 %crefref
pascal@19515 7 %noincl
pascal@19515 8 %nomacs
pascal@19636 9 p8086
pascal@19515 10
pascal@19515 11 group DGROUP _TEXT,_DATA,_BSS
pascal@19515 12 assume cs:DGROUP,ds:DGROUP
pascal@19515 13
pascal@19515 14 segment _TEXT byte public use16 'CODE'
pascal@20451 15 ends _TEXT
pascal@20451 16
pascal@20451 17 segment _DATA byte public use16 'DATA'
pascal@20451 18 global _data_start:byte
pascal@20451 19 label _data_start byte
pascal@20451 20 ifndef NO386
pascal@22183 21 msg_badcpu db "I need 386+ CPU in real mode w/o paging"
pascal@22183 22 db " or "
pascal@22183 23 msg_badmapping db "under VCPI 4.0+ manager with low 640k 1:1 mapping"
pascal@22183 24 global _vcpi:byte
pascal@22183 25 _vcpi db 0
pascal@20451 26 endif
pascal@20451 27
pascal@20451 28 ends _DATA
pascal@20451 29
pascal@20451 30 segment _BSS byte public use16 'BSS'
pascal@21757 31
pascal@20451 32 global _bss_start:byte
pascal@20451 33 label _bss_start byte
pascal@22312 34 global stktop:byte
pascal@22183 35 ifdef NO386
pascal@22183 36 global _cpu386:byte
pascal@22183 37 _cpu386 db ?
pascal@22183 38 org $-1
pascal@22183 39 endif
pascal@20451 40 global _cpu_features:dword
pascal@20451 41 _cpu_features dd ?
pascal@20451 42 ends _BSS
pascal@20451 43
pascal@20451 44 segment _TEXT byte public use16 'CODE'
pascal@19515 45
pascal@19825 46 macro cpuid
pascal@19825 47 db 0fh,0A2h
pascal@19825 48 endm
pascal@19825 49
pascal@19515 50 org 100h
pascal@19515 51 global _text_start:byte
pascal@19515 52 label _text_start byte
pascal@19546 53
pascal@19515 54 ;***************************************************************
pascal@19515 55 ; clear bss
pascal@19515 56 ;***************************************************************
pascal@21757 57 mov sp,offset stktop
pascal@22179 58 mov si,offset _bss_start
pascal@20457 59 mov bx, 0F000h ; cld ; cli & empty string
pascal@19515 60 clearbss:
pascal@22312 61 mov [si],bl ; clear bss + heap
pascal@20426 62 inc si
pascal@23797 63 ifdef ISOHOOK
pascal@23797 64 cmp si,bx
pascal@23797 65 endif
pascal@19546 66 jne clearbss
pascal@19546 67
pascal@19546 68 ;***************************************************************
pascal@19546 69 ; check CPU
pascal@19546 70 ;***************************************************************
pascal@19546 71
pascal@19546 72 ; Check for oldies
pascal@19873 73 push bx ; < 286 : flags[12..15] are forced 1
pascal@19873 74 popf ; = 286 : flags[12..15] are forced 0
pascal@19873 75 pushf ; > 286 : only flags[15] is forced 0
pascal@19873 76 pop dx
pascal@20451 77 add dh,bh ; NS=386+, S+NC=286, S+C=86/186
pascal@20451 78 ifndef NO386
pascal@19873 79 mov bx,offset msg_badcpu
pascal@22183 80 js godie ;it is not a 386+, die
pascal@20451 81 else
pascal@22183 82 js endcpu86 ;it is not a 386+, try ELKS & co
pascal@19546 83 endif
pascal@19636 84 p386
pascal@19546 85 ; Check for vm
pascal@19546 86 smsw ax ;SMSW cannot be trapped! :-)
pascal@19571 87 and al,1 ;MSW_PE
pascal@19546 88 ; We're in vm
pascal@20457 89 jnz check_vcpi
pascal@20457 90
pascal@20457 91 check_rm_paging:
pascal@20457 92 ; It's a 386 in real mode, chk for paging (crazy but possible)
pascal@20457 93 mov eax,cr0
pascal@20457 94 inc eax ;CR0_PG to S
pascal@20457 95 jns endcpu386
pascal@22183 96 ifndef NO386
pascal@20457 97 p8086
pascal@20457 98 extrn die:near
pascal@20457 99 godie:
pascal@22183 100 no_vcpi:
pascal@20457 101 call near die
pascal@22183 102 else
pascal@22183 103 jmp endcpu86
pascal@22183 104 endif
pascal@19546 105
pascal@23797 106 ifdef ISOHOOK
pascal@23797 107 extrn @ret:near
pascal@23797 108 global iso_open_hack
pascal@23797 109 iso_open_hack dw @ret
pascal@23797 110 global iso_read_hack
pascal@23797 111 iso_read_hack dw @ret
pascal@23797 112 global iso_lseek_hack
pascal@23797 113 iso_lseek_hack dw @ret
pascal@23797 114 global iso_close_hack
pascal@23797 115 iso_close_hack dw @ret
pascal@23797 116 global iso_cleanup_hack
pascal@23797 117 iso_cleanup_hack dw @ret
pascal@23797 118 dw _cpu_features+3
pascal@23797 119 endif
pascal@23797 120
pascal@19546 121 ;***************************************************************
pascal@19546 122 ; checks for vcpi
pascal@19546 123 ;***************************************************************
pascal@19546 124 label check_vcpi near
pascal@20457 125 p386
pascal@19546 126 push ds
pascal@19546 127 ; Check whether it is safe to call 67h (we trust only known EMM managers)
pascal@20426 128 push si
pascal@19546 129 pop ds
pascal@19546 130 mov ds,[word 67h*4+2]
pascal@20426 131 cmp [dword si+10+4],'0XXX'
pascal@19546 132 jne skip
pascal@19825 133 ;mov eax,'XMME'
pascal@20426 134 ;xor eax,[dword si+10]
pascal@19546 135 ; QMME also works (as told by <J.S.Peatfield@damtp.cambridge.ac.uk>)
pascal@19825 136 ;shl eax,8
pascal@19825 137 mov ax,'ME'
pascal@20426 138 xor ax,[word si+10]
pascal@19546 139 skip:
pascal@19546 140 pop ds
pascal@19546 141 jne no_vcpi
pascal@19546 142
pascal@19546 143 ; Check emm manager status and version
pascal@19571 144 ;mov ah,40h ; get status
pascal@19571 145 ;int 67h
pascal@22203 146 ;inc ax
pascal@22203 147 ;js no_vcpi
pascal@19546 148 mov ah,46h ; get version
pascal@19546 149 int 67h
pascal@22204 150 cmp ax,40h ; version must be >= 4.0
pascal@22203 151 jl no_vcpi ; btw check ax.15
pascal@19546 152 ; Check vcpi manager status
pascal@19546 153 ;;mov ax,5A01h ; ALLOCATE RAW PAGES
pascal@19546 154 ;;mov bx,4
pascal@19546 155 ;;int 67h
pascal@22203 156 ;;inc ax
pascal@22203 157 ;;js no_vcpi
pascal@19546 158 ;;push dx ;$ save handle
pascal@19546 159 mov ax,0DE00h ; check for vcpi present
pascal@19546 160 int 67h
pascal@19546 161 test ah,ah
pascal@19571 162 jnz no_vcpi
pascal@19546 163 is386vcpi:
pascal@19546 164 extrn prepare_vcpi:near
pascal@19546 165 call prepare_vcpi
pascal@19546 166 ; get_vcpi_interface() || die("VCPI: low 640k: need 1:1 mapping");
pascal@19546 167 ;extrn _get_vcpi_interface:near
pascal@19546 168 ;call _get_vcpi_interface
pascal@22183 169 ifndef NO386
pascal@19546 170 mov bx,offset msg_badmapping
pascal@20457 171 jnz no_vcpi
pascal@22183 172 dec [byte bx+_vcpi-msg_badmapping]
pascal@22183 173 else
pascal@22183 174 jnz no_vcpi
pascal@22183 175 extrn _vcpi:byte
pascal@22183 176 dec [byte _vcpi]
pascal@22183 177 endif
pascal@20457 178 endcpu386:
pascal@20457 179 pushfd
pascal@20457 180 pop dx
pascal@20457 181 pop ax
pascal@20457 182 mov bl,al
pascal@20457 183 xor al,20h ; toggle CPUID feature bit 21
pascal@20457 184 push ax
pascal@20457 185 push dx
pascal@20457 186 popfd
pascal@20457 187 pushfd
pascal@22203 188 pop dx ; dx.1=flags.1=1
pascal@20457 189 pop ax
pascal@20457 190 xor al,bl ; clear C
pascal@20457 191 je @@no_cpuid ; CPUID feature bit changed ?
pascal@20457 192 mov eax,80000001h ; Extended Processor Info and Feature Bits
pascal@20457 193 cpuid
pascal@22183 194 ifdef NO386
pascal@22204 195 mov dl,-1 ; set 386 flag
pascal@22203 196 db 66h ; mov [_cpu_features],edx
pascal@22203 197 @@no_cpuid:
pascal@22203 198 mov [word _cpu_features],dx ; dl != 0
pascal@22203 199 no_vcpi:
pascal@22203 200 else
pascal@20457 201 mov [_cpu_features],edx
pascal@20457 202 @@no_cpuid:
pascal@22203 203 endif
pascal@20457 204 endcpu86:
pascal@19636 205 p8086
pascal@19546 206
pascal@19515 207 ;***************************************************************
pascal@19515 208 ; build argv & argc
pascal@19515 209 ;***************************************************************
pascal@22203 210 extrn _bss_end:word
pascal@22203 211 mov di,offset _bss_end
pascal@22203 212 global _heap_top
pascal@22203 213 org $-2
pascal@22203 214 _heap_top dw ?
pascal@19546 215 ;xor ax,ax
pascal@19546 216 ;push ax ; envp (already cleared)
pascal@19546 217 ;mov [word di],ax ; argv[0] = 0 (idem)
pascal@19515 218 mov si,80h
pascal@19515 219 lodsb
pascal@19515 220 cmp al,7Eh
pascal@19515 221 jbe alok
pascal@19515 222 mov al,7Eh
pascal@19515 223 alok:
pascal@19546 224 cbw
pascal@19515 225 xchg ax,bx
pascal@19515 226 mov [bx+si],bh ; set eos
pascal@19515 227 argbuild:
pascal@20160 228 ifdef DEBUG
pascal@20142 229 p386
pascal@20142 230 pusha
pascal@20142 231 mov bx,si
pascal@20142 232 extrn puts:near
pascal@20142 233 call puts
pascal@20142 234 popa
pascal@20160 235 endif
pascal@19515 236 mov bx,2 ; argc * 2
pascal@19515 237 argeos:
pascal@20451 238 mov cx,1 ; look for a start of string
pascal@19515 239 mov [byte si-1],bh ; mark eos
pascal@19515 240 mov ah,20h ; space will be eos
pascal@19515 241 arglp:
pascal@19515 242 lodsb
pascal@19515 243 cmp al,0h
pascal@19515 244 je argdone
pascal@19515 245 cmp al,20h
pascal@19515 246 jb argeos
pascal@19515 247 cmp al,ah
pascal@19515 248 je argeos
pascal@19515 249 cmp al,27h
pascal@19515 250 je isargstr
pascal@19515 251 cmp al,22h
pascal@19515 252 je isargstr
pascal@20451 253 jcxz arglp ; not start of string
pascal@19515 254 dec si
pascal@19884 255 ;jmp newarg
pascal@20451 256 db 0BAh ; mov dx,im opcode
pascal@19515 257 isargstr:
pascal@19515 258 mov ah,al ; expected eos
pascal@19515 259 newarg:
pascal@19515 260 mov [word bx+di],si ; argv[argc++] = si
pascal@19515 261 inc bx
pascal@19515 262 inc bx
pascal@20451 263 dec cx
pascal@19515 264 jmp arglp
pascal@19515 265 argdone:
pascal@19515 266 ;mov [word bx+di],0 ; argv[argc] = 0
pascal@19546 267 lea ax,[bx+di+2]
pascal@19546 268 mov [_heap_top],ax
pascal@19515 269 push di ; argv
pascal@19515 270 shr bx,1
pascal@19515 271 push bx ; argc
pascal@19515 272 ifndef filearg
pascal@19515 273 mov bx,[di+2] ; argv[1]
pascal@20528 274 extrn openargs:near
pascal@20528 275 call near openargs
pascal@19515 276 jc argend
pascal@19515 277 pop bx ; trash argc, argv >> 1Kb !
pascal@19546 278 global read_cmdline:near
pascal@20528 279 pop cx ; sizemax=argv
pascal@19546 280 read_cmdline:
pascal@20528 281 mov dx,di
pascal@20528 282 push dx
pascal@19515 283 push ax
pascal@20528 284 xchg ax,bx
pascal@20528 285 extrn @read$cxdxbx:near ; read(fd=bx,buffer=dx,size=cx)
pascal@20528 286 call near @read$cxdxbx
pascal@19515 287 pop bx ; fd for close
pascal@19515 288 pop si ; si=buffer=argv
pascal@19515 289 add di,ax
pascal@19515 290 extrn close:near
pascal@19515 291 call near close
pascal@19515 292 jmp argbuild
pascal@19515 293 argend:
pascal@19515 294 endif
pascal@19515 295
pascal@19515 296 ;***************************************************************
pascal@21757 297 extrn _main:near
pascal@21757 298 call _main
pascal@21757 299 ;never return
pascal@19538 300
pascal@19515 301 ;***************************************************************
pascal@21757 302
pascal@19515 303 ends _TEXT
pascal@19515 304
pascal@19515 305
pascal@19515 306 end _text_start
pascal@19515 307
pascal@19515 308 ;###### END OF FILE ############################################