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

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