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

linld: basic iso9660 support
author Pascal Bellard <pascal.bellard@slitaz.org>
date Sun Mar 14 19:55:20 2021 +0000 (2021-03-14)
parents 61df94a0fa43
children 526688f99354
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@24019 9
pascal@24019 10 include "common.inc"
pascal@24022 11 include "himem.inc"
pascal@24022 12 include "isostate.inc"
pascal@24022 13
pascal@24022 14 ifdef QUICK_BOOT
pascal@24022 15 CMDNUMCNT = 7
pascal@24022 16 else
pascal@24022 17 CMDNUMCNT = 5
pascal@24022 18 endif
pascal@24022 19
pascal@24022 20 macro alloc_isostate
pascal@24022 21 public _isostate
pascal@24022 22 _isostate isostate <?>
pascal@24022 23 org $-ISOSTATE_OVERLAP
pascal@24022 24 endm
pascal@24022 25
pascal@24022 26 macro alloc_image
pascal@24022 27 rm_size dw ? ; _imgs-4
pascal@24022 28 rm_buf dw ? ; _imgs-2
pascal@24022 29 global _imgs:byte
pascal@24022 30 label _imgs byte
pascal@24022 31 img_kernel image_himem ?
pascal@24022 32 img_initrd image_himem ?
pascal@24022 33 endm
pascal@24022 34
pascal@24022 35 macro alloc_misc
pascal@24022 36 global _cmdnum:word
pascal@24022 37 label _cmdnum word
pascal@24022 38 dd CMDNUMCNT dup(?)
pascal@24022 39
pascal@24022 40 global _himem_buf:dword
pascal@24022 41 _himem_buf dd ?
pascal@24022 42 endm
pascal@24019 43
pascal@19636 44 p8086
pascal@19515 45
pascal@19515 46 group DGROUP _TEXT,_DATA,_BSS
pascal@19515 47 assume cs:DGROUP,ds:DGROUP
pascal@19515 48
pascal@19515 49 segment _TEXT byte public use16 'CODE'
pascal@20451 50 ends _TEXT
pascal@20451 51
pascal@20451 52 segment _DATA byte public use16 'DATA'
pascal@23996 53 ;global _data_start:byte
pascal@20451 54 label _data_start byte
pascal@20451 55 ifndef NO386
pascal@24019 56 msg_badcpu db "I need a 386+ in real mode w/o paging"
pascal@24019 57 ifdef VCPI
pascal@22183 58 db " or "
pascal@22183 59 msg_badmapping db "under VCPI 4.0+ manager with low 640k 1:1 mapping"
pascal@22183 60 global _vcpi:byte
pascal@24019 61 endif
pascal@22183 62 _vcpi db 0
pascal@20451 63 endif
pascal@20451 64
pascal@20451 65 ends _DATA
pascal@20451 66
pascal@20451 67 segment _BSS byte public use16 'BSS'
pascal@21757 68
pascal@24022 69 ifdef ISO9660
pascal@24022 70 ifndef VCPI
pascal@24022 71 alloc_isotate
pascal@24022 72 else
pascal@24022 73 room_for_isostate = 1
pascal@24022 74 endif
pascal@24022 75 endif
pascal@24022 76
pascal@24013 77 ifdef ISOHOOK
pascal@23996 78 extrn _big_cmdline:byte
pascal@23996 79 db 254 dup(?)
pascal@23996 80 endif
pascal@23996 81 ;global _bss_start:byte
pascal@20451 82 label _bss_start byte
pascal@22312 83 global stktop:byte
pascal@22183 84 global _cpu386:byte
pascal@22183 85 _cpu386 db ?
pascal@24019 86 ifdef CPU64
pascal@22183 87 org $-1
pascal@20451 88 global _cpu_features:dword
pascal@20451 89 _cpu_features dd ?
pascal@24022 90 room_for_image = 1
pascal@24022 91 else
pascal@24022 92 alloc_image
pascal@24019 93 endif
pascal@24022 94
pascal@24022 95 ifndef BSS_OVERLAP_BOOT
pascal@24022 96
pascal@24022 97 ifdef room_for_isostate
pascal@24022 98 alloc_isostate
pascal@24022 99 endif
pascal@24022 100
pascal@24022 101 ifdef room_for_image
pascal@24022 102 alloc_image
pascal@24022 103 endif
pascal@24022 104
pascal@24022 105 alloc_misc
pascal@24022 106
pascal@24022 107 endif
pascal@24022 108
pascal@20451 109 ends _BSS
pascal@20451 110
pascal@20451 111 segment _TEXT byte public use16 'CODE'
pascal@19515 112
pascal@19825 113 macro cpuid
pascal@19825 114 db 0fh,0A2h
pascal@19825 115 endm
pascal@19825 116
pascal@19515 117 org 100h
pascal@23996 118 ;global _text_start:byte
pascal@19515 119 label _text_start byte
pascal@19546 120
pascal@19515 121 ;***************************************************************
pascal@19515 122 ; clear bss
pascal@19515 123 ;***************************************************************
pascal@21757 124 mov sp,offset stktop
pascal@23996 125 mov bx, 0F000h ; cld ; cli & empty string
pascal@22179 126 mov si,offset _bss_start
pascal@19515 127 clearbss:
pascal@22312 128 mov [si],bl ; clear bss + heap
pascal@20426 129 inc si
pascal@19546 130 jne clearbss
pascal@19546 131
pascal@19546 132 ;***************************************************************
pascal@19546 133 ; check CPU
pascal@19546 134 ;***************************************************************
pascal@19546 135
pascal@19546 136 ; Check for oldies
pascal@19873 137 push bx ; < 286 : flags[12..15] are forced 1
pascal@24013 138 popf ; = 286 : flags[12..15] are forced 0, cld
pascal@19873 139 pushf ; > 286 : only flags[15] is forced 0
pascal@19873 140 pop dx
pascal@20451 141 add dh,bh ; NS=386+, S+NC=286, S+C=86/186
pascal@20451 142 ifndef NO386
pascal@19873 143 mov bx,offset msg_badcpu
pascal@22183 144 js godie ;it is not a 386+, die
pascal@20451 145 else
pascal@22183 146 js endcpu86 ;it is not a 386+, try ELKS & co
pascal@19546 147 endif
pascal@19636 148 p386
pascal@23996 149 mov edx,cs
pascal@23996 150 shl edx,4 ; edx for prepare_vcpi
pascal@23996 151 extrn gdt_base_memcpy:word ; gdt_base for memcpy32
pascal@23996 152 add [dword gdt_base_memcpy],edx
pascal@19546 153 ; Check for vm
pascal@19546 154 smsw ax ;SMSW cannot be trapped! :-)
pascal@19571 155 and al,1 ;MSW_PE
pascal@19546 156 ; We're in vm
pascal@20457 157 jnz check_vcpi
pascal@20457 158
pascal@20457 159 check_rm_paging:
pascal@20457 160 ; It's a 386 in real mode, chk for paging (crazy but possible)
pascal@20457 161 mov eax,cr0
pascal@20457 162 inc eax ;CR0_PG to S
pascal@20457 163 jns endcpu386
pascal@22183 164 ifndef NO386
pascal@20457 165 p8086
pascal@20457 166 extrn die:near
pascal@20457 167 godie:
pascal@20457 168 call near die
pascal@22183 169 else
pascal@22183 170 jmp endcpu86
pascal@22183 171 endif
pascal@19546 172
pascal@23797 173
pascal@19546 174 ;***************************************************************
pascal@19546 175 ; checks for vcpi
pascal@19546 176 ;***************************************************************
pascal@19546 177 label check_vcpi near
pascal@20457 178 p386
pascal@24019 179 ifdef VCPI
pascal@24013 180 ; Check whether it is safe to call 67h
pascal@24013 181 xor eax,eax
pascal@24022 182 push ds
pascal@24022 183 mov ds,ax
pascal@24022 184 cmp [dword 67h*4],eax
pascal@24022 185 pop ds
pascal@23996 186 je no_vcpi
pascal@24013 187 mov ah,0DEh ; check for vcpi present
pascal@19546 188 int 67h
pascal@23996 189 or ah,ah
pascal@19571 190 jnz no_vcpi
pascal@19546 191 is386vcpi:
pascal@19546 192 extrn prepare_vcpi:near
pascal@19546 193 call prepare_vcpi
pascal@19546 194 ; get_vcpi_interface() || die("VCPI: low 640k: need 1:1 mapping");
pascal@19546 195 ;extrn _get_vcpi_interface:near
pascal@19546 196 ;call _get_vcpi_interface
pascal@22183 197 ifndef NO386
pascal@19546 198 mov bx,offset msg_badmapping
pascal@20457 199 jnz no_vcpi
pascal@22183 200 dec [byte bx+_vcpi-msg_badmapping]
pascal@22183 201 else
pascal@22183 202 jnz no_vcpi
pascal@22183 203 extrn _vcpi:byte
pascal@22183 204 dec [byte _vcpi]
pascal@22183 205 endif
pascal@24019 206 endif
pascal@23996 207 no_vcpi:
pascal@20457 208 endcpu386:
pascal@24019 209 ifdef CPU64
pascal@20457 210 pushfd
pascal@20457 211 pop dx
pascal@20457 212 pop ax
pascal@20457 213 mov bl,al
pascal@23996 214 xor al,20h ; toggle CPUID feature bit 21 (=> pentium+)
pascal@23996 215 push ax ; (toggle AC: bit 18 => 486+)
pascal@20457 216 push dx
pascal@20457 217 popfd
pascal@20457 218 pushfd
pascal@22203 219 pop dx ; dx.1=flags.1=1
pascal@20457 220 pop ax
pascal@20457 221 xor al,bl ; clear C
pascal@20457 222 je @@no_cpuid ; CPUID feature bit changed ?
pascal@20457 223 mov eax,80000001h ; Extended Processor Info and Feature Bits
pascal@20457 224 cpuid
pascal@23996 225 mov dl,-1 ; set 386 flag (assume cpuid => fpu:bit0=1 ?)
pascal@22183 226 ifdef NO386
pascal@22203 227 db 66h ; mov [_cpu_features],edx
pascal@22203 228 @@no_cpuid:
pascal@22203 229 mov [word _cpu_features],dx ; dl != 0
pascal@22203 230 else
pascal@20457 231 mov [_cpu_features],edx
pascal@20457 232 @@no_cpuid:
pascal@22203 233 endif
pascal@24019 234 else
pascal@24019 235 dec [_cpu386]
pascal@24019 236 endif
pascal@20457 237 endcpu86:
pascal@19636 238 p8086
pascal@19546 239
pascal@19515 240 ;***************************************************************
pascal@19515 241 ; build argv & argc
pascal@19515 242 ;***************************************************************
pascal@19515 243 mov si,80h
pascal@24013 244 ifdef ISOHOOK
pascal@23996 245 mov bx,offset _big_cmdline
pascal@23996 246 cmp [byte si],2
pascal@23996 247 jnb @@user_args
pascal@23996 248 call @set_cmdline$qpxzc
pascal@23996 249 @@user_args:
pascal@23996 250 endif
pascal@23996 251 lodsb ; size 0..127
pascal@19546 252 cbw
pascal@24013 253 ifdef ISOHOOK
pascal@23996 254 inc ax
pascal@23996 255 jnz short_cmdline
pascal@23996 256 mov si,bx
pascal@23996 257 lodsb ; size 0..254
pascal@23996 258 short_cmdline:
pascal@23996 259 dec ax
pascal@23996 260 endif
pascal@19515 261 xchg ax,bx
pascal@19515 262 mov [bx+si],bh ; set eos
pascal@24022 263
pascal@24022 264 ;***************************************************************
pascal@24022 265
pascal@24022 266 ifdef BSS_OVERLAP_BOOT
pascal@24022 267 mov al,0
pascal@24022 268 mov di,100h
pascal@24022 269 mov cx,offset clean-100h
pascal@24022 270
pascal@24022 271 org $-(CMDNUMCNT*4)-4
pascal@24022 272
pascal@24022 273 ifdef room_for_image
pascal@24022 274 org $-2-2-(2*size image_himem)
pascal@24022 275 endif
pascal@24022 276
pascal@24022 277 ifdef room_for_isostate
pascal@24022 278 org $+ISOSTATE_OVERLAP-size isostate
pascal@24022 279 alloc_isostate
pascal@24022 280 endif
pascal@24022 281
pascal@24022 282 ifdef room_for_image
pascal@24022 283 alloc_image
pascal@24022 284 endif
pascal@24022 285
pascal@24022 286 alloc_misc
pascal@24022 287 clean:
pascal@24022 288 rep
pascal@24022 289 stosb
pascal@24022 290 endif
pascal@24022 291
pascal@24022 292 ;***************************************************************
pascal@24022 293 extrn _bss_end:word
pascal@24022 294 mov di,offset _bss_end
pascal@24022 295 global _heap_top
pascal@24022 296 org $-2
pascal@24022 297 _heap_top dw ?
pascal@23996 298 ;xor dx,dx
pascal@23996 299 ;push dx ; envp (already cleared)
pascal@23996 300 ;mov [word di],dx ; argv[0] = 0 (idem)
pascal@19515 301 argbuild:
pascal@19515 302 mov bx,2 ; argc * 2
pascal@19515 303 argeos:
pascal@20451 304 mov cx,1 ; look for a start of string
pascal@19515 305 mov [byte si-1],bh ; mark eos
pascal@19515 306 mov ah,20h ; space will be eos
pascal@19515 307 arglp:
pascal@19515 308 lodsb
pascal@19515 309 cmp al,0h
pascal@19515 310 je argdone
pascal@19515 311 cmp al,20h
pascal@19515 312 jb argeos
pascal@19515 313 cmp al,ah
pascal@19515 314 je argeos
pascal@19515 315 cmp al,27h
pascal@19515 316 je isargstr
pascal@19515 317 cmp al,22h
pascal@19515 318 je isargstr
pascal@20451 319 jcxz arglp ; not start of string
pascal@19515 320 dec si
pascal@19884 321 ;jmp newarg
pascal@20451 322 db 0BAh ; mov dx,im opcode
pascal@19515 323 isargstr:
pascal@19515 324 mov ah,al ; expected eos
pascal@19515 325 newarg:
pascal@19515 326 mov [word bx+di],si ; argv[argc++] = si
pascal@19515 327 inc bx
pascal@19515 328 inc bx
pascal@20451 329 dec cx
pascal@19515 330 jmp arglp
pascal@23992 331
pascal@23992 332 ;***************************************************************
pascal@23992 333 ;_fastcall void set_cmdline(bx:const char *filename);
pascal@23992 334 ;***************************************************************
pascal@23992 335 global @set_cmdline$qpxzc:near
pascal@23992 336 proc @set_cmdline$qpxzc near
pascal@23992 337 extrn openargs:near
pascal@23992 338 call openargs
pascal@23992 339 jc @ret
pascal@23992 340 mov ch,15 ; cx<4096
pascal@23992 341 mov di,[_heap_top]
pascal@23992 342 jmp read_cmdline ; read_cmdline(ax,di,cx)
pascal@23992 343
pascal@23992 344 endp @set_cmdline$qpxzc
pascal@23992 345
pascal@23992 346 ifdef NO386
pascal@23992 347 ;***************************************************************
pascal@23992 348 ;u16 topseg();
pascal@23992 349 ;***************************************************************
pascal@23992 350 global _topseg:near
pascal@23992 351 proc _topseg near
pascal@23992 352
pascal@23992 353 int 12h
pascal@23992 354 jnc @@max640k
pascal@23992 355 mov ax,640 ; 9000
pascal@23992 356 @@max640k:
pascal@23992 357 dec ax
pascal@23992 358 and al,0C0h
pascal@23992 359 mov cl,6
pascal@23992 360 shl ax,cl
pascal@23992 361 @ret:
pascal@23992 362 ret
pascal@23992 363
pascal@23992 364 endp _topseg
pascal@24019 365 else
pascal@24019 366 @ret:
pascal@24019 367 ret
pascal@23992 368 endif
pascal@23992 369
pascal@24013 370 ;***************************************************************
pascal@24013 371 argdone:
pascal@24013 372 ;mov [word bx+di],0 ; argv[argc] = 0
pascal@24013 373 lea ax,[bx+di+2]
pascal@24013 374 mov [_heap_top],ax
pascal@24013 375 ;push di ; argv
pascal@24013 376 ;shr bx,1
pascal@24013 377 ;push bx ; argc
pascal@24013 378 ifndef filearg
pascal@24013 379 mov bx,[di+2] ; argv[1]
pascal@24013 380 extrn openargs:near
pascal@24013 381 call near openargs
pascal@24013 382 jc argend
pascal@24013 383 ;pop bx ; trash argc, argv >> 1Kb !
pascal@24013 384 ;pop cx ; sizemax=argv
pascal@24013 385 dec cx ; sizemax=0ffffh
pascal@24013 386 read_cmdline:
pascal@24013 387 mov dx,di
pascal@24013 388 push dx
pascal@24013 389 xchg ax,bx
pascal@24013 390 extrn @read$cxdxbx:near ; read(fd=bx,buffer=dx,size=cx)
pascal@24013 391 call near @read$cxdxbx
pascal@24013 392 pop si ; si=buffer=argv
pascal@24013 393 add di,ax
pascal@24013 394 ifndef NO_CLOSE
pascal@24013 395 extrn close:near
pascal@24013 396 call near close
pascal@24013 397 endif
pascal@24013 398 jmp argbuild
pascal@24013 399 argend:
pascal@24013 400 endif
pascal@24013 401
pascal@24013 402 ;***************************************************************
pascal@24013 403 ; extrn _main:near
pascal@24013 404 ; call _main
pascal@24013 405 ;never return
pascal@24013 406
pascal@24013 407 ;***************************************************************
pascal@24013 408
pascal@24013 409
pascal@19515 410 ends _TEXT
pascal@19515 411
pascal@19515 412
pascal@19515 413 end _text_start
pascal@19515 414
pascal@19515 415 ;###### END OF FILE ############################################