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

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