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

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