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

linld/tazboot: fix magic
author Pascal Bellard <pascal.bellard@slitaz.org>
date Thu Mar 30 17:22:13 2017 +0200 (2017-03-30)
parents 6f494adb2c71
children c9c88c0a2ae5
rev   line source
pascal@19515 1 ;***************************************************************
pascal@19515 2 ;****** This file is distributed under GPL
pascal@19515 3 ;***************************************************************
pascal@19515 4 ideal
pascal@19515 5 %crefref
pascal@19515 6 %noincl
pascal@19515 7 %nomacs
pascal@19636 8 p8086
pascal@19515 9
pascal@19515 10 group DGROUP _TEXT,_DATA,_BSS
pascal@19515 11 assume cs:DGROUP,ds:DGROUP
pascal@19515 12
pascal@19515 13 segment _TEXT byte public use16 'CODE'
pascal@19515 14
pascal@19825 15 macro cpuid
pascal@19825 16 db 0fh,0A2h
pascal@19825 17 endm
pascal@19825 18
pascal@19515 19 org 100h
pascal@19515 20 global _text_start:byte
pascal@19515 21 label _text_start byte
pascal@19546 22
pascal@19515 23 ;***************************************************************
pascal@19515 24 ; clear bss
pascal@19515 25 ;***************************************************************
pascal@19546 26 mov bx,offset _bss_start
pascal@19515 27 clearbss:
pascal@19546 28 mov [byte bx],0 ; clear bss + heap + sp
pascal@19546 29 inc bx
pascal@19546 30 jne clearbss
pascal@19571 31 cld
pascal@19546 32
pascal@19546 33 ;***************************************************************
pascal@19546 34 ; check CPU
pascal@19546 35 ;***************************************************************
pascal@19546 36
pascal@19546 37 ; Check for oldies
pascal@19848 38 push sp
pascal@19848 39 pop ax
pascal@19571 40 mov bx,offset msg_badcpu
pascal@19848 41 sub ax,sp
pascal@19546 42 ifndef NO386
pascal@19848 43 jnz no_vcpi ;it is a 86/186 not a 286+
pascal@19546 44 else
pascal@19848 45 jnz endcpu
pascal@19546 46 endif
pascal@19636 47 p386
pascal@19825 48 ifdef EXTRA
pascal@19825 49 pushfd
pascal@19825 50 pop dx
pascal@19825 51 pop ax
pascal@19825 52 mov bl,al
pascal@19825 53 xor al,20h ; toggle CPUID feature bit 21
pascal@19825 54 push ax
pascal@19825 55 push dx
pascal@19825 56 popfd
pascal@19825 57 pushfd
pascal@19825 58 pop dx
pascal@19825 59 pop ax
pascal@19825 60 xor al,bl ; clear C
pascal@19825 61 je @@check_vm ; CPUID feature bit changed ?
pascal@19825 62 mov eax,80000001h ; Extended Processor Info and Feature Bits
pascal@19825 63 cpuid
pascal@19825 64 mov [_cpu_features],edx
pascal@19825 65 @@check_vm:
pascal@19825 66 endif
pascal@19546 67 ; Check for vm
pascal@19546 68 smsw ax ;SMSW cannot be trapped! :-)
pascal@19571 69 and al,1 ;MSW_PE
pascal@19546 70 ; We're in vm
pascal@19571 71 jz check_rm_paging
pascal@19546 72
pascal@19546 73 ;***************************************************************
pascal@19546 74 ; checks for vcpi
pascal@19546 75 ;***************************************************************
pascal@19546 76 label check_vcpi near
pascal@19546 77 push ds
pascal@19546 78 ; Check whether it is safe to call 67h (we trust only known EMM managers)
pascal@19825 79 xor bx,bx
pascal@19825 80 push bx
pascal@19546 81 pop ds
pascal@19546 82 mov ds,[word 67h*4+2]
pascal@19825 83 cmp [dword bx+10+4],'0XXX'
pascal@19546 84 jne skip
pascal@19825 85 ;mov eax,'XMME'
pascal@19825 86 ;xor eax,[dword bx+10]
pascal@19546 87 ; QMME also works (as told by <J.S.Peatfield@damtp.cambridge.ac.uk>)
pascal@19825 88 ;shl eax,8
pascal@19825 89 mov ax,'ME'
pascal@19825 90 xor ax,[word bx+10]
pascal@19546 91 skip:
pascal@19546 92 pop ds
pascal@19546 93 jne no_vcpi
pascal@19546 94
pascal@19546 95 ; Check emm manager status and version
pascal@19571 96 ;mov ah,40h ; get status
pascal@19571 97 ;int 67h
pascal@19571 98 ;test ah,ah
pascal@19571 99 ;jnz no_vcpi
pascal@19546 100 mov ah,46h ; get version
pascal@19546 101 int 67h
pascal@19546 102 test ah,ah
pascal@19546 103 jnz no_vcpi
pascal@19546 104 cmp al,40h ; version must be >= 4.0
pascal@19546 105 jb no_vcpi
pascal@19546 106 ; Check vcpi manager status
pascal@19546 107 ;;mov ax,5A01h ; ALLOCATE RAW PAGES
pascal@19546 108 ;;mov bx,4
pascal@19546 109 ;;int 67h
pascal@19546 110 ;;test ah,ah
pascal@19546 111 ;;jnz no_vcpi
pascal@19546 112 ;;push dx ;$ save handle
pascal@19546 113 mov ax,0DE00h ; check for vcpi present
pascal@19546 114 int 67h
pascal@19546 115 test ah,ah
pascal@19571 116 jnz no_vcpi
pascal@19546 117 is386vcpi:
pascal@19571 118 inc [_vcpi]
pascal@19546 119 extrn prepare_vcpi:near
pascal@19546 120 call prepare_vcpi
pascal@19546 121 ; get_vcpi_interface() || die("VCPI: low 640k: need 1:1 mapping");
pascal@19546 122 ;extrn _get_vcpi_interface:near
pascal@19546 123 ;call _get_vcpi_interface
pascal@19546 124 mov bx,offset msg_badmapping
pascal@19634 125 jz endcpu
pascal@19571 126 no_vcpi:
pascal@19636 127 p8086
pascal@19571 128 ;;pop dx ;$ handle
pascal@19571 129 ;;mov ax,4500h ; DEALLOCATE PAGES
pascal@19571 130 ;;int 67h
pascal@19571 131 extrn die:near
pascal@19571 132 godie:
pascal@19571 133 jmp near die
pascal@19571 134 check_rm_paging:
pascal@19571 135 ; It's a 386 in real mode, chk for paging (crazy but possible)
pascal@19636 136 p386
pascal@19571 137 mov edx,cr0
pascal@19571 138 shl edx,1 ;CR0_PG to CF
pascal@19571 139 jc no_vcpi
pascal@19546 140 endcpu:
pascal@19636 141 p8086
pascal@19546 142
pascal@19515 143 ;***************************************************************
pascal@19515 144 ; build argv & argc
pascal@19515 145 ;***************************************************************
pascal@19546 146 extrn _heap_top:word
pascal@19546 147 mov di,[_heap_top]
pascal@19546 148 ;xor ax,ax
pascal@19546 149 ;push ax ; envp (already cleared)
pascal@19546 150 ;mov [word di],ax ; argv[0] = 0 (idem)
pascal@19515 151 mov si,80h
pascal@19515 152 lodsb
pascal@19515 153 cmp al,7Eh
pascal@19515 154 jbe alok
pascal@19515 155 mov al,7Eh
pascal@19515 156 alok:
pascal@19546 157 cbw
pascal@19515 158 xchg ax,bx
pascal@19515 159 mov [bx+si],bh ; set eos
pascal@19515 160 argbuild:
pascal@19515 161 mov bx,2 ; argc * 2
pascal@19515 162 argeos:
pascal@19515 163 mov dl,1 ; look for a start of string
pascal@19515 164 mov [byte si-1],bh ; mark eos
pascal@19515 165 mov ah,20h ; space will be eos
pascal@19515 166 arglp:
pascal@19515 167 lodsb
pascal@19515 168 cmp al,0h
pascal@19515 169 je argdone
pascal@19515 170 cmp al,20h
pascal@19515 171 jb argeos
pascal@19515 172 cmp al,ah
pascal@19515 173 je argeos
pascal@19515 174 cmp al,27h
pascal@19515 175 je isargstr
pascal@19515 176 cmp al,22h
pascal@19515 177 je isargstr
pascal@19515 178 or dl,dl
pascal@19515 179 je arglp ; not start of string
pascal@19515 180 dec si
pascal@19515 181 jmp newarg
pascal@19515 182 isargstr:
pascal@19515 183 mov ah,al ; expected eos
pascal@19515 184 newarg:
pascal@19515 185 mov [word bx+di],si ; argv[argc++] = si
pascal@19515 186 inc bx
pascal@19515 187 inc bx
pascal@19515 188 dec dx
pascal@19515 189 jmp arglp
pascal@19515 190 argdone:
pascal@19515 191 ;mov [word bx+di],0 ; argv[argc] = 0
pascal@19546 192 lea ax,[bx+di+2]
pascal@19546 193 mov [_heap_top],ax
pascal@19515 194 push di ; argv
pascal@19515 195 shr bx,1
pascal@19515 196 push bx ; argc
pascal@19515 197 ifndef filearg
pascal@19515 198 mov bx,[di+2] ; argv[1]
pascal@19515 199 cmp [byte bx],'@'
pascal@19515 200 jne argend
pascal@19546 201 inc bx
pascal@19515 202 extrn open:near
pascal@19515 203 call near open
pascal@19515 204 jc argend
pascal@19515 205 pop bx ; trash argc, argv >> 1Kb !
pascal@19546 206 global read_cmdline:near
pascal@19546 207 read_cmdline:
pascal@19515 208 push di
pascal@19515 209 push ax
pascal@19515 210 extrn _read:near
pascal@19515 211 call near _read
pascal@19515 212 pop bx ; fd for close
pascal@19515 213 pop si ; si=buffer=argv
pascal@19515 214 add di,ax
pascal@19515 215 pop ax ; trash sizemax=argv
pascal@19515 216 extrn close:near
pascal@19515 217 call near close
pascal@19515 218 jmp argbuild
pascal@19515 219 argend:
pascal@19515 220 endif
pascal@19515 221
pascal@19515 222 ;***************************************************************
pascal@19515 223 extrn _main:near
pascal@19515 224 call _main
pascal@19538 225
pascal@19515 226 ;***************************************************************
pascal@19515 227 global exit:near
pascal@19515 228 exit:
pascal@19515 229 mov ah,4Ch
pascal@19515 230 int 21h
pascal@19515 231 ends _TEXT
pascal@19515 232
pascal@19515 233 segment _DATA byte public use16 'DATA'
pascal@19515 234 global _data_start:byte
pascal@19515 235 label _data_start byte
pascal@19546 236 msg_badcpu db "I need 386+ CPU in real mode or under VCPI manager"
pascal@19546 237 global _vcpi:byte
pascal@19546 238 _vcpi db 0
pascal@19546 239 msg_badmapping db "VCPI: low 640k: need 1:1 mapping",0
pascal@19546 240
pascal@19515 241 ends _DATA
pascal@19515 242
pascal@19515 243 segment _BSS byte public use16 'BSS'
pascal@19515 244 global _bss_start:byte
pascal@19515 245 label _bss_start byte
pascal@19825 246 ifdef EXTRA
pascal@19825 247 global _cpu_features:dword
pascal@19825 248 _cpu_features dd ?
pascal@19825 249 endif
pascal@19515 250 ends _BSS
pascal@19515 251
pascal@19515 252 end _text_start
pascal@19515 253
pascal@19515 254 ;###### END OF FILE ############################################