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

linld: skip xmm_alloc
author Pascal Bellard <pascal.bellard@slitaz.org>
date Sat Dec 12 10:41:29 2020 +0000 (2020-12-12)
parents 555bcdab610b
children a946c1651082
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@23992 27 ifdef EXTRA
pascal@23992 28 tazboot_cmd db "tazboot.cmd",0
pascal@23992 29 endif
pascal@20451 30
pascal@20451 31 ends _DATA
pascal@20451 32
pascal@20451 33 segment _BSS byte public use16 'BSS'
pascal@21757 34
pascal@20451 35 global _bss_start:byte
pascal@20451 36 label _bss_start byte
pascal@22312 37 global stktop:byte
pascal@23980 38 ifndef ISOHOOK
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@23980 46 endif
pascal@20451 47 ends _BSS
pascal@20451 48
pascal@20451 49 segment _TEXT byte public use16 'CODE'
pascal@19515 50
pascal@19825 51 macro cpuid
pascal@19825 52 db 0fh,0A2h
pascal@19825 53 endm
pascal@19825 54
pascal@19515 55 org 100h
pascal@19515 56 global _text_start:byte
pascal@19515 57 label _text_start byte
pascal@19546 58
pascal@19515 59 ;***************************************************************
pascal@19515 60 ; clear bss
pascal@19515 61 ;***************************************************************
pascal@21757 62 mov sp,offset stktop
pascal@22179 63 mov si,offset _bss_start
pascal@20457 64 mov bx, 0F000h ; cld ; cli & empty string
pascal@19515 65 clearbss:
pascal@22312 66 mov [si],bl ; clear bss + heap
pascal@20426 67 inc si
pascal@23797 68 ifdef ISOHOOK
pascal@23797 69 cmp si,bx
pascal@23797 70 endif
pascal@19546 71 jne clearbss
pascal@19546 72
pascal@19546 73 ;***************************************************************
pascal@19546 74 ; check CPU
pascal@19546 75 ;***************************************************************
pascal@19546 76
pascal@19546 77 ; Check for oldies
pascal@19873 78 push bx ; < 286 : flags[12..15] are forced 1
pascal@19873 79 popf ; = 286 : flags[12..15] are forced 0
pascal@19873 80 pushf ; > 286 : only flags[15] is forced 0
pascal@19873 81 pop dx
pascal@20451 82 add dh,bh ; NS=386+, S+NC=286, S+C=86/186
pascal@20451 83 ifndef NO386
pascal@19873 84 mov bx,offset msg_badcpu
pascal@22183 85 js godie ;it is not a 386+, die
pascal@20451 86 else
pascal@22183 87 js endcpu86 ;it is not a 386+, try ELKS & co
pascal@19546 88 endif
pascal@19636 89 p386
pascal@19546 90 ; Check for vm
pascal@19546 91 smsw ax ;SMSW cannot be trapped! :-)
pascal@19571 92 and al,1 ;MSW_PE
pascal@19546 93 ; We're in vm
pascal@20457 94 jnz check_vcpi
pascal@20457 95
pascal@20457 96 check_rm_paging:
pascal@20457 97 ; It's a 386 in real mode, chk for paging (crazy but possible)
pascal@20457 98 mov eax,cr0
pascal@20457 99 inc eax ;CR0_PG to S
pascal@20457 100 jns endcpu386
pascal@22183 101 ifndef NO386
pascal@20457 102 p8086
pascal@20457 103 extrn die:near
pascal@20457 104 godie:
pascal@22183 105 no_vcpi:
pascal@20457 106 call near die
pascal@22183 107 else
pascal@22183 108 jmp endcpu86
pascal@22183 109 endif
pascal@19546 110
pascal@23797 111 ifdef ISOHOOK
pascal@23985 112 global iso_close_hack
pascal@23985 113 iso_close_hack dw dosbx
pascal@23985 114 global iso_open_hack
pascal@23985 115 extrn __open:near
pascal@23985 116 iso_open_hack dw __open
pascal@23797 117 global iso_read_hack
pascal@23985 118 extrn dos:near
pascal@23985 119 iso_read_hack dw dos
pascal@23797 120 global iso_lseek_hack
pascal@23985 121 extrn dosbx:near
pascal@23985 122 iso_lseek_hack dw dosbx
pascal@23980 123 global _cpu_features:dword
pascal@23980 124 _cpu_features dd ? ; default _cpu_features+3=1Fh/8Eh (bit5=0, not 64bits)
pascal@23980 125 org $-4
pascal@23980 126 ifdef NO386
pascal@23980 127 global _cpu386:byte
pascal@23980 128 _cpu386 db 0
pascal@23980 129 endif
pascal@23797 130 endif
pascal@23797 131
pascal@19546 132 ;***************************************************************
pascal@19546 133 ; checks for vcpi
pascal@19546 134 ;***************************************************************
pascal@19546 135 label check_vcpi near
pascal@20457 136 p386
pascal@19546 137 push ds
pascal@19546 138 ; Check whether it is safe to call 67h (we trust only known EMM managers)
pascal@20426 139 push si
pascal@19546 140 pop ds
pascal@19546 141 mov ds,[word 67h*4+2]
pascal@20426 142 cmp [dword si+10+4],'0XXX'
pascal@19546 143 jne skip
pascal@19825 144 ;mov eax,'XMME'
pascal@20426 145 ;xor eax,[dword si+10]
pascal@19546 146 ; QMME also works (as told by <J.S.Peatfield@damtp.cambridge.ac.uk>)
pascal@19825 147 ;shl eax,8
pascal@19825 148 mov ax,'ME'
pascal@20426 149 xor ax,[word si+10]
pascal@19546 150 skip:
pascal@19546 151 pop ds
pascal@19546 152 jne no_vcpi
pascal@19546 153
pascal@19546 154 ; Check emm manager status and version
pascal@19571 155 ;mov ah,40h ; get status
pascal@19571 156 ;int 67h
pascal@22203 157 ;inc ax
pascal@22203 158 ;js no_vcpi
pascal@19546 159 mov ah,46h ; get version
pascal@19546 160 int 67h
pascal@22204 161 cmp ax,40h ; version must be >= 4.0
pascal@22203 162 jl no_vcpi ; btw check ax.15
pascal@19546 163 ; Check vcpi manager status
pascal@19546 164 ;;mov ax,5A01h ; ALLOCATE RAW PAGES
pascal@19546 165 ;;mov bx,4
pascal@19546 166 ;;int 67h
pascal@22203 167 ;;inc ax
pascal@22203 168 ;;js no_vcpi
pascal@19546 169 ;;push dx ;$ save handle
pascal@19546 170 mov ax,0DE00h ; check for vcpi present
pascal@19546 171 int 67h
pascal@19546 172 test ah,ah
pascal@19571 173 jnz no_vcpi
pascal@19546 174 is386vcpi:
pascal@19546 175 extrn prepare_vcpi:near
pascal@19546 176 call prepare_vcpi
pascal@19546 177 ; get_vcpi_interface() || die("VCPI: low 640k: need 1:1 mapping");
pascal@19546 178 ;extrn _get_vcpi_interface:near
pascal@19546 179 ;call _get_vcpi_interface
pascal@22183 180 ifndef NO386
pascal@19546 181 mov bx,offset msg_badmapping
pascal@20457 182 jnz no_vcpi
pascal@22183 183 dec [byte bx+_vcpi-msg_badmapping]
pascal@22183 184 else
pascal@22183 185 jnz no_vcpi
pascal@22183 186 extrn _vcpi:byte
pascal@22183 187 dec [byte _vcpi]
pascal@22183 188 endif
pascal@20457 189 endcpu386:
pascal@20457 190 pushfd
pascal@20457 191 pop dx
pascal@20457 192 pop ax
pascal@20457 193 mov bl,al
pascal@20457 194 xor al,20h ; toggle CPUID feature bit 21
pascal@20457 195 push ax
pascal@20457 196 push dx
pascal@20457 197 popfd
pascal@20457 198 pushfd
pascal@22203 199 pop dx ; dx.1=flags.1=1
pascal@20457 200 pop ax
pascal@20457 201 xor al,bl ; clear C
pascal@20457 202 je @@no_cpuid ; CPUID feature bit changed ?
pascal@20457 203 mov eax,80000001h ; Extended Processor Info and Feature Bits
pascal@20457 204 cpuid
pascal@22183 205 ifdef NO386
pascal@22204 206 mov dl,-1 ; set 386 flag
pascal@22203 207 db 66h ; mov [_cpu_features],edx
pascal@22203 208 @@no_cpuid:
pascal@22203 209 mov [word _cpu_features],dx ; dl != 0
pascal@22203 210 no_vcpi:
pascal@22203 211 else
pascal@20457 212 mov [_cpu_features],edx
pascal@20457 213 @@no_cpuid:
pascal@22203 214 endif
pascal@20457 215 endcpu86:
pascal@19636 216 p8086
pascal@19546 217
pascal@19515 218 ;***************************************************************
pascal@19515 219 ; build argv & argc
pascal@19515 220 ;***************************************************************
pascal@22203 221 extrn _bss_end:word
pascal@22203 222 mov di,offset _bss_end
pascal@22203 223 global _heap_top
pascal@22203 224 org $-2
pascal@22203 225 _heap_top dw ?
pascal@19546 226 ;xor ax,ax
pascal@19546 227 ;push ax ; envp (already cleared)
pascal@19546 228 ;mov [word di],ax ; argv[0] = 0 (idem)
pascal@19515 229 mov si,80h
pascal@19515 230 lodsb
pascal@19515 231 cmp al,7Eh
pascal@19515 232 jbe alok
pascal@19515 233 mov al,7Eh
pascal@19515 234 alok:
pascal@19546 235 cbw
pascal@19515 236 xchg ax,bx
pascal@19515 237 mov [bx+si],bh ; set eos
pascal@19515 238 argbuild:
pascal@20160 239 ifdef DEBUG
pascal@20142 240 p386
pascal@20142 241 pusha
pascal@20142 242 mov bx,si
pascal@20142 243 extrn puts:near
pascal@20142 244 call puts
pascal@20142 245 popa
pascal@20160 246 endif
pascal@19515 247 mov bx,2 ; argc * 2
pascal@19515 248 argeos:
pascal@20451 249 mov cx,1 ; look for a start of string
pascal@19515 250 mov [byte si-1],bh ; mark eos
pascal@19515 251 mov ah,20h ; space will be eos
pascal@19515 252 arglp:
pascal@19515 253 lodsb
pascal@19515 254 cmp al,0h
pascal@19515 255 je argdone
pascal@19515 256 cmp al,20h
pascal@19515 257 jb argeos
pascal@19515 258 cmp al,ah
pascal@19515 259 je argeos
pascal@19515 260 cmp al,27h
pascal@19515 261 je isargstr
pascal@19515 262 cmp al,22h
pascal@19515 263 je isargstr
pascal@20451 264 jcxz arglp ; not start of string
pascal@19515 265 dec si
pascal@19884 266 ;jmp newarg
pascal@20451 267 db 0BAh ; mov dx,im opcode
pascal@19515 268 isargstr:
pascal@19515 269 mov ah,al ; expected eos
pascal@19515 270 newarg:
pascal@19515 271 mov [word bx+di],si ; argv[argc++] = si
pascal@19515 272 inc bx
pascal@19515 273 inc bx
pascal@20451 274 dec cx
pascal@19515 275 jmp arglp
pascal@19515 276 argdone:
pascal@19515 277 ;mov [word bx+di],0 ; argv[argc] = 0
pascal@19546 278 lea ax,[bx+di+2]
pascal@19546 279 mov [_heap_top],ax
pascal@19515 280 push di ; argv
pascal@19515 281 shr bx,1
pascal@19515 282 push bx ; argc
pascal@19515 283 ifndef filearg
pascal@19515 284 mov bx,[di+2] ; argv[1]
pascal@20528 285 extrn openargs:near
pascal@20528 286 call near openargs
pascal@19515 287 jc argend
pascal@19515 288 pop bx ; trash argc, argv >> 1Kb !
pascal@20528 289 pop cx ; sizemax=argv
pascal@19546 290 read_cmdline:
pascal@20528 291 mov dx,di
pascal@20528 292 push dx
pascal@19515 293 push ax
pascal@20528 294 xchg ax,bx
pascal@20528 295 extrn @read$cxdxbx:near ; read(fd=bx,buffer=dx,size=cx)
pascal@20528 296 call near @read$cxdxbx
pascal@19515 297 pop bx ; fd for close
pascal@19515 298 pop si ; si=buffer=argv
pascal@19515 299 add di,ax
pascal@19515 300 extrn close:near
pascal@19515 301 call near close
pascal@19515 302 jmp argbuild
pascal@19515 303 argend:
pascal@19515 304 endif
pascal@19515 305
pascal@19515 306 ;***************************************************************
pascal@21757 307 extrn _main:near
pascal@21757 308 call _main
pascal@21757 309 ;never return
pascal@19538 310
pascal@19515 311 ;***************************************************************
pascal@21757 312
pascal@23992 313
pascal@23992 314 extrn _head_top:word
pascal@23992 315 ifdef USE_ARGSTR
pascal@23992 316 ;***************************************************************
pascal@23992 317 ;_fastcall void set_cmdline(bx:const char *filename);
pascal@23992 318 ;***************************************************************
pascal@23992 319 global @set_cmdline$qpxzc:near
pascal@23992 320 proc @set_cmdline$qpxzc near
pascal@23992 321 extrn openargs:near
pascal@23992 322 call openargs
pascal@23992 323 jc @ret
pascal@23992 324 mov ch,15 ; cx<4096
pascal@23992 325 mov di,[_heap_top]
pascal@23992 326 jmp read_cmdline ; read_cmdline(ax,di,cx)
pascal@23992 327
pascal@23992 328 endp @set_cmdline$qpxzc
pascal@23992 329 endif
pascal@23992 330
pascal@23992 331 ;***************************************************************
pascal@23992 332 ;void try_default_args();
pascal@23992 333 ;***************************************************************
pascal@23992 334
pascal@23992 335 ifdef EXTRA
pascal@23992 336 global _try_default_args:near
pascal@23992 337 proc _try_default_args near
pascal@23992 338
pascal@23992 339 mov bx,offset tazboot_cmd
pascal@23992 340 extrn @open$qpxzc:near
pascal@23992 341 call @open$qpxzc
pascal@23992 342 jc @ret
pascal@23992 343 mov ch,15 ; cx<4096
pascal@23992 344 mov di,[_heap_top]
pascal@23992 345 jmp read_cmdline ; read_cmdline(ax,di,cx)
pascal@23992 346
pascal@23992 347 endp _try_default_args
pascal@23992 348 endif
pascal@23992 349
pascal@23992 350 ifdef NO386
pascal@23992 351 ;***************************************************************
pascal@23992 352 ;u16 topseg();
pascal@23992 353 ;***************************************************************
pascal@23992 354 global _topseg:near
pascal@23992 355 proc _topseg near
pascal@23992 356
pascal@23992 357 int 12h
pascal@23992 358 jnc @@max640k
pascal@23992 359 mov ax,640 ; 9000
pascal@23992 360 @@max640k:
pascal@23992 361 dec ax
pascal@23992 362 and al,0C0h
pascal@23992 363 mov cl,6
pascal@23992 364 shl ax,cl
pascal@23992 365 @ret:
pascal@23992 366 ret
pascal@23992 367
pascal@23992 368 endp _topseg
pascal@23992 369 endif
pascal@23992 370
pascal@19515 371 ends _TEXT
pascal@19515 372
pascal@19515 373
pascal@19515 374 end _text_start
pascal@19515 375
pascal@19515 376 ;###### END OF FILE ############################################