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

syslinux/iso2exe: read isolinux.cfg
author Pascal Bellard <pascal.bellard@slitaz.org>
date Tue Jan 12 07:47:12 2021 +0000 (2021-01-12)
parents a946c1651082
children bc4b94310a29
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@23996 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@23996 32 ifdef BIG_CMDLINE
pascal@23996 33 extrn _big_cmdline:byte
pascal@23996 34 db 254 dup(?)
pascal@23996 35 endif
pascal@23996 36 ;global _bss_start:byte
pascal@20451 37 label _bss_start byte
pascal@22312 38 global stktop:byte
pascal@22183 39 ifdef NO386
pascal@22183 40 global _cpu386:byte
pascal@22183 41 _cpu386 db ?
pascal@22183 42 org $-1
pascal@22183 43 endif
pascal@20451 44 global _cpu_features:dword
pascal@20451 45 _cpu_features dd ?
pascal@20451 46 ends _BSS
pascal@20451 47
pascal@20451 48 segment _TEXT byte public use16 'CODE'
pascal@19515 49
pascal@19825 50 macro cpuid
pascal@19825 51 db 0fh,0A2h
pascal@19825 52 endm
pascal@19825 53
pascal@19515 54 org 100h
pascal@23996 55 ;global _text_start:byte
pascal@19515 56 label _text_start byte
pascal@19546 57
pascal@19515 58 ;***************************************************************
pascal@19515 59 ; clear bss
pascal@19515 60 ;***************************************************************
pascal@21757 61 mov sp,offset stktop
pascal@23996 62 mov bx, 0F000h ; cld ; cli & empty string
pascal@23996 63 org $-4-2
pascal@23996 64 global _himem_buf:dword
pascal@23996 65 _himem_buf dd ?
pascal@23996 66 global _buf_cmdline:word
pascal@23996 67 _buf_cmdline dw ? ; 128 bytes, must start with 00
pascal@22179 68 mov si,offset _bss_start
pascal@19515 69 clearbss:
pascal@22312 70 mov [si],bl ; clear bss + heap
pascal@20426 71 inc si
pascal@19546 72 jne clearbss
pascal@19546 73
pascal@19546 74 ;***************************************************************
pascal@19546 75 ; check CPU
pascal@19546 76 ;***************************************************************
pascal@19546 77
pascal@19546 78 ; Check for oldies
pascal@19873 79 push bx ; < 286 : flags[12..15] are forced 1
pascal@19873 80 popf ; = 286 : flags[12..15] are forced 0
pascal@19873 81 pushf ; > 286 : only flags[15] is forced 0
pascal@19873 82 pop dx
pascal@20451 83 add dh,bh ; NS=386+, S+NC=286, S+C=86/186
pascal@20451 84 ifndef NO386
pascal@19873 85 mov bx,offset msg_badcpu
pascal@22183 86 js godie ;it is not a 386+, die
pascal@20451 87 else
pascal@22183 88 js endcpu86 ;it is not a 386+, try ELKS & co
pascal@19546 89 endif
pascal@19636 90 p386
pascal@23996 91 mov edx,cs
pascal@23996 92 shl edx,4 ; edx for prepare_vcpi
pascal@23996 93 extrn gdt_base_memcpy:word ; gdt_base for memcpy32
pascal@23996 94 add [dword gdt_base_memcpy],edx
pascal@19546 95 ; Check for vm
pascal@19546 96 smsw ax ;SMSW cannot be trapped! :-)
pascal@19571 97 and al,1 ;MSW_PE
pascal@19546 98 ; We're in vm
pascal@20457 99 jnz check_vcpi
pascal@20457 100
pascal@20457 101 check_rm_paging:
pascal@20457 102 ; It's a 386 in real mode, chk for paging (crazy but possible)
pascal@20457 103 mov eax,cr0
pascal@20457 104 inc eax ;CR0_PG to S
pascal@20457 105 jns endcpu386
pascal@22183 106 ifndef NO386
pascal@20457 107 p8086
pascal@20457 108 extrn die:near
pascal@20457 109 godie:
pascal@20457 110 call near die
pascal@22183 111 else
pascal@22183 112 jmp endcpu86
pascal@22183 113 endif
pascal@19546 114
pascal@23797 115
pascal@19546 116 ;***************************************************************
pascal@19546 117 ; checks for vcpi
pascal@19546 118 ;***************************************************************
pascal@19546 119 label check_vcpi near
pascal@20457 120 p386
pascal@19546 121 push ds
pascal@19546 122 ; Check whether it is safe to call 67h (we trust only known EMM managers)
pascal@20426 123 push si
pascal@19546 124 pop ds
pascal@23996 125 mov ax,[word 67h*4]
pascal@23996 126 or ax,[word 67h*4+2]
pascal@19546 127 pop ds
pascal@23996 128 je no_vcpi
pascal@19546 129 mov ax,0DE00h ; check for vcpi present
pascal@19546 130 int 67h
pascal@23996 131 or ah,ah
pascal@19571 132 jnz no_vcpi
pascal@19546 133 is386vcpi:
pascal@19546 134 extrn prepare_vcpi:near
pascal@19546 135 call prepare_vcpi
pascal@19546 136 ; get_vcpi_interface() || die("VCPI: low 640k: need 1:1 mapping");
pascal@19546 137 ;extrn _get_vcpi_interface:near
pascal@19546 138 ;call _get_vcpi_interface
pascal@22183 139 ifndef NO386
pascal@19546 140 mov bx,offset msg_badmapping
pascal@20457 141 jnz no_vcpi
pascal@22183 142 dec [byte bx+_vcpi-msg_badmapping]
pascal@22183 143 else
pascal@22183 144 jnz no_vcpi
pascal@22183 145 extrn _vcpi:byte
pascal@22183 146 dec [byte _vcpi]
pascal@22183 147 endif
pascal@23996 148 no_vcpi:
pascal@20457 149 endcpu386:
pascal@20457 150 pushfd
pascal@20457 151 pop dx
pascal@20457 152 pop ax
pascal@20457 153 mov bl,al
pascal@23996 154 xor al,20h ; toggle CPUID feature bit 21 (=> pentium+)
pascal@23996 155 push ax ; (toggle AC: bit 18 => 486+)
pascal@20457 156 push dx
pascal@20457 157 popfd
pascal@20457 158 pushfd
pascal@22203 159 pop dx ; dx.1=flags.1=1
pascal@20457 160 pop ax
pascal@20457 161 xor al,bl ; clear C
pascal@20457 162 je @@no_cpuid ; CPUID feature bit changed ?
pascal@20457 163 mov eax,80000001h ; Extended Processor Info and Feature Bits
pascal@20457 164 cpuid
pascal@23996 165 mov dl,-1 ; set 386 flag (assume cpuid => fpu:bit0=1 ?)
pascal@22183 166 ifdef NO386
pascal@22203 167 db 66h ; mov [_cpu_features],edx
pascal@22203 168 @@no_cpuid:
pascal@22203 169 mov [word _cpu_features],dx ; dl != 0
pascal@22203 170 else
pascal@20457 171 mov [_cpu_features],edx
pascal@20457 172 @@no_cpuid:
pascal@22203 173 endif
pascal@20457 174 endcpu86:
pascal@19636 175 p8086
pascal@19546 176
pascal@19515 177 ;***************************************************************
pascal@19515 178 ; build argv & argc
pascal@19515 179 ;***************************************************************
pascal@22203 180 extrn _bss_end:word
pascal@22203 181 mov di,offset _bss_end
pascal@22203 182 global _heap_top
pascal@22203 183 org $-2
pascal@22203 184 _heap_top dw ?
pascal@19515 185 mov si,80h
pascal@23996 186 ifdef BIG_CMDLINE
pascal@23996 187 mov bx,offset _big_cmdline
pascal@23996 188 cmp [byte si],2
pascal@23996 189 jnb @@user_args
pascal@23996 190 call @set_cmdline$qpxzc
pascal@23996 191 @@user_args:
pascal@23996 192 endif
pascal@23996 193 lodsb ; size 0..127
pascal@19546 194 cbw
pascal@23996 195 ifdef BIG_CMDLINE
pascal@23996 196 inc ax
pascal@23996 197 jnz short_cmdline
pascal@23996 198 mov si,bx
pascal@23996 199 lodsb ; size 0..254
pascal@23996 200 short_cmdline:
pascal@23996 201 dec ax
pascal@23996 202 endif
pascal@19515 203 xchg ax,bx
pascal@19515 204 mov [bx+si],bh ; set eos
pascal@23996 205 ;xor dx,dx
pascal@23996 206 ;push dx ; envp (already cleared)
pascal@23996 207 ;mov [word di],dx ; argv[0] = 0 (idem)
pascal@19515 208 argbuild:
pascal@19515 209 mov bx,2 ; argc * 2
pascal@19515 210 argeos:
pascal@20451 211 mov cx,1 ; look for a start of string
pascal@19515 212 mov [byte si-1],bh ; mark eos
pascal@19515 213 mov ah,20h ; space will be eos
pascal@19515 214 arglp:
pascal@19515 215 lodsb
pascal@19515 216 cmp al,0h
pascal@19515 217 je argdone
pascal@19515 218 cmp al,20h
pascal@19515 219 jb argeos
pascal@19515 220 cmp al,ah
pascal@19515 221 je argeos
pascal@19515 222 cmp al,27h
pascal@19515 223 je isargstr
pascal@19515 224 cmp al,22h
pascal@19515 225 je isargstr
pascal@20451 226 jcxz arglp ; not start of string
pascal@19515 227 dec si
pascal@19884 228 ;jmp newarg
pascal@20451 229 db 0BAh ; mov dx,im opcode
pascal@19515 230 isargstr:
pascal@19515 231 mov ah,al ; expected eos
pascal@19515 232 newarg:
pascal@19515 233 mov [word bx+di],si ; argv[argc++] = si
pascal@19515 234 inc bx
pascal@19515 235 inc bx
pascal@20451 236 dec cx
pascal@19515 237 jmp arglp
pascal@19515 238 argdone:
pascal@19515 239 ;mov [word bx+di],0 ; argv[argc] = 0
pascal@19546 240 lea ax,[bx+di+2]
pascal@19546 241 mov [_heap_top],ax
pascal@19515 242 push di ; argv
pascal@19515 243 shr bx,1
pascal@19515 244 push bx ; argc
pascal@19515 245 ifndef filearg
pascal@19515 246 mov bx,[di+2] ; argv[1]
pascal@20528 247 extrn openargs:near
pascal@20528 248 call near openargs
pascal@19515 249 jc argend
pascal@19515 250 pop bx ; trash argc, argv >> 1Kb !
pascal@20528 251 pop cx ; sizemax=argv
pascal@19546 252 read_cmdline:
pascal@20528 253 mov dx,di
pascal@20528 254 push dx
pascal@20528 255 xchg ax,bx
pascal@20528 256 extrn @read$cxdxbx:near ; read(fd=bx,buffer=dx,size=cx)
pascal@20528 257 call near @read$cxdxbx
pascal@19515 258 pop si ; si=buffer=argv
pascal@19515 259 add di,ax
pascal@23996 260 ifndef NO_CLOSE
pascal@19515 261 extrn close:near
pascal@19515 262 call near close
pascal@23996 263 endif
pascal@19515 264 jmp argbuild
pascal@19515 265 argend:
pascal@19515 266 endif
pascal@19515 267
pascal@19515 268 ;***************************************************************
pascal@21757 269 extrn _main:near
pascal@21757 270 call _main
pascal@21757 271 ;never return
pascal@19538 272
pascal@19515 273 ;***************************************************************
pascal@21757 274
pascal@23992 275
pascal@23992 276 ;***************************************************************
pascal@23992 277 ;_fastcall void set_cmdline(bx:const char *filename);
pascal@23992 278 ;***************************************************************
pascal@23992 279 global @set_cmdline$qpxzc:near
pascal@23992 280 proc @set_cmdline$qpxzc near
pascal@23992 281 extrn openargs:near
pascal@23992 282 call openargs
pascal@23992 283 jc @ret
pascal@23992 284 mov ch,15 ; cx<4096
pascal@23992 285 mov di,[_heap_top]
pascal@23992 286 jmp read_cmdline ; read_cmdline(ax,di,cx)
pascal@23992 287
pascal@23992 288 endp @set_cmdline$qpxzc
pascal@23992 289
pascal@23992 290 ifdef NO386
pascal@23992 291 ;***************************************************************
pascal@23992 292 ;u16 topseg();
pascal@23992 293 ;***************************************************************
pascal@23992 294 global _topseg:near
pascal@23992 295 proc _topseg near
pascal@23992 296
pascal@23992 297 int 12h
pascal@23992 298 jnc @@max640k
pascal@23992 299 mov ax,640 ; 9000
pascal@23992 300 @@max640k:
pascal@23992 301 dec ax
pascal@23992 302 and al,0C0h
pascal@23992 303 mov cl,6
pascal@23992 304 shl ax,cl
pascal@23992 305 @ret:
pascal@23992 306 ret
pascal@23992 307
pascal@23992 308 endp _topseg
pascal@23992 309 endif
pascal@23992 310
pascal@19515 311 ends _TEXT
pascal@19515 312
pascal@19515 313
pascal@19515 314 end _text_start
pascal@19515 315
pascal@19515 316 ;###### END OF FILE ############################################