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

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