wok annotate linld/stuff/src/MEMTOP.ASM @ rev 24019

syslinux: fix build
author Pascal Bellard <pascal.bellard@slitaz.org>
date Sun Feb 28 16:32:57 2021 +0000 (2021-02-28)
parents 14ca5e18cfd9
children 6b6d14c9f7e9
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@24019 9
pascal@24019 10 include "common.inc"
pascal@24019 11
pascal@19636 12 ifdef NO386
pascal@19636 13 p8086
pascal@19636 14 else
pascal@19515 15 p386
pascal@19636 16 endif
pascal@19515 17
pascal@23983 18 group DGROUP _TEXT
pascal@19515 19 assume cs:DGROUP,ds:DGROUP
pascal@19515 20
pascal@19515 21
pascal@19515 22 segment _TEXT byte public use16 'CODE'
pascal@19515 23
pascal@19515 24 ;***************************************************************
pascal@19515 25 ;u32 memtopz();
pascal@19515 26 ;***************************************************************
pascal@19515 27 proc _memtopz near
pascal@19515 28 ;***************************************************************
pascal@24015 29 ;u32 memtop_e820()
pascal@24015 30 ;***************************************************************
pascal@24015 31 ; proc _memtop_e820 near
pascal@24015 32
pascal@24015 33 ifdef INT15_E820
pascal@24015 34
pascal@24015 35 struc e820 ;struct e820 {
pascal@24015 36 base dd ?,? ; 0 u64 base;
pascal@24015 37 length dd ?,? ; 8 u64 length;
pascal@24015 38 type db ?,?,?,? ;16 u32 type; 1=available
pascal@24015 39 ends e820 ;};
pascal@24015 40
pascal@24015 41 p386
pascal@24015 42 push ds
pascal@24015 43 pop es
pascal@24015 44 push di
pascal@24015 45 xor ebx,ebx
pascal@24015 46 @@e820lp:
pascal@24015 47 mov eax,0E820h
pascal@24015 48 mov edx,534D4150h ; 'SMAP'
pascal@24015 49 xor ecx,ecx
pascal@24015 50 mov cl,size e820
pascal@24015 51 extrn buf4k:byte
pascal@24015 52 mov di,offset buf4k
pascal@24015 53 int 15h
pascal@24015 54 jc @@err_e820
pascal@24015 55 ;cmp eax,534D4150h ; 'SMAP'
pascal@24015 56 ;jne @@err_e820
pascal@24015 57 cmp [(e820 di).type],1
pascal@24015 58 jnz @@notavail
pascal@24015 59 mov eax,[(e820 di).base]
pascal@24015 60 add eax,[(e820 di).length]
pascal@24015 61 push eax
pascal@24015 62 pop ax
pascal@24015 63 pop dx
pascal@24015 64 or dh,dh ; > 16M
pascal@24015 65 je @@notavail
pascal@24015 66 pop di
pascal@24015 67 ret
pascal@24015 68 @@notavail:
pascal@24015 69 or bx,bx
pascal@24015 70 jne @@e820lp
pascal@24015 71 @@err_e820:
pascal@24015 72 pop di
pascal@24015 73 endif
pascal@24015 74
pascal@24015 75 ; endp _memtop_e820
pascal@24015 76
pascal@24015 77 ;***************************************************************
pascal@19515 78 ;u32 memtop_e801()
pascal@19515 79 ;***************************************************************
pascal@19515 80 ; proc _memtop_e801 near
pascal@19515 81
pascal@19515 82 xor cx,cx ;fix to work around buggy
pascal@19515 83 xor dx,dx ; BIOSes which dont clear/set
pascal@24015 84 mov ax,0E801h ;ax=1kbs in 1-16M bx=64kbs above 16M extended
pascal@24015 85 int 15h ;cx=1kbs in 1-16M dx=64kbs above 16M configured
pascal@20453 86 xchg ax,cx ;kludge to handle BIOSes
pascal@20453 87 jcxz @@use_cxdx ; which report their extended
pascal@20453 88 ; memory in AX/BX rather than
pascal@20453 89 ; CX/DX. The spec I have read
pascal@19515 90 @@use_axbx: mov dx,bx ; seems to indicate AX/BX
pascal@19882 91 xchg ax,cx ; are more reasonable anyway...
pascal@20453 92 @@use_cxdx: ;now: dx=64k units above 16m
pascal@20453 93 ; ax=1k units above 1m below 16m (max 3c00h)
pascal@20510 94 or dx,dx
pascal@24015 95 jz @@below16M
pascal@19515 96 xor ax,ax ;ignore info on low 16M (assume full)
pascal@24015 97 inc dh ;account for low 16M
pascal@19515 98 ret
pascal@24015 99 @@below16M:
pascal@24015 100 or ax,ax
pascal@24015 101 jnz tokb ;dx=0 here, ax=kbs above 1m
pascal@19515 102 @@err:
pascal@19515 103 ; ret
pascal@19515 104 ; endp _memtop_e801
pascal@19515 105
pascal@19515 106
pascal@19515 107 ;***************************************************************
pascal@19515 108 ;u32 memtop_88()
pascal@19515 109 ;***************************************************************
pascal@19515 110 ; proc _memtop_88 near
pascal@19515 111
pascal@19515 112 mov ah,88h
pascal@19515 113 int 15h ;ax=kbs above 1m
pascal@24015 114 test ax,ax ; error: ax=0
pascal@20142 115 jnz tokb ;happens on big mem systems
pascal@19879 116
pascal@19879 117 ;***************************************************************
pascal@19879 118 ;u32 memtop_cmos()
pascal@19879 119 ;***************************************************************
pascal@19879 120
pascal@19879 121 ;memtop_cmos:
pascal@19879 122 pushf
pascal@19879 123 call rdcmos17
pascal@19879 124 popf
pascal@19515 125 tokb:
pascal@21757 126 mov cl,10 ;multiply by 1024
pascal@21757 127 ifndef NO386
pascal@21757 128 add ah,4h ;account for 1024 low kb
pascal@21757 129 setc dl ; (optimized to death)
pascal@21757 130 shld dx,ax,cl
pascal@21757 131 shl ax,cl ; (kbytes -> bytes)
pascal@21791 132 ret
pascal@21757 133 else
pascal@19634 134 xor dx,dx
pascal@19515 135 add ah,4h ;account for 1024 low kb
pascal@19515 136 adc dx,dx ; (optimized to death)
pascal@21791 137 db 0A9h ; test ax,0C28Ch
pascal@21791 138 global N_LXLSH@ES:near
pascal@21791 139 N_LXLSH@ES:
pascal@21791 140 mov dx,es
pascal@20142 141 global N_LXLSH@:near
pascal@20142 142 N_LXLSH@:
pascal@19883 143 mov ch,0
pascal@19515 144 @@lp:
pascal@19883 145 shl ax,1
pascal@19515 146 rcl dx,1
pascal@19515 147 loop @@lp
pascal@21791 148 ret
pascal@21791 149 global N_LXLSH@4:near
pascal@21791 150 N_LXLSH@4:
pascal@21791 151 xor dx,dx
pascal@21791 152 mov cl,4
pascal@21791 153 jmp N_LXLSH@
pascal@19515 154 endif
pascal@19883 155
pascal@19515 156 ; endp _memtop_88
pascal@19515 157
pascal@19515 158 ; proc _memtopz near
pascal@19515 159
pascal@19515 160 ; call _memtop_e801
pascal@19515 161 ; jnz @@ok
pascal@19515 162 ; call _memtop_88
pascal@19515 163 ; jnz @@ok
pascal@19879 164 ; jmp memtop_cmos
pascal@19515 165
pascal@20142 166 rdcmos17: cli
pascal@20142 167 mov al,18h ; read bytes 17-18 from CMOS
pascal@19515 168 call @@rdcmos
pascal@19515 169 mov ah,al
pascal@19515 170 mov al,17h
pascal@19515 171 @@rdcmos: out 70h,al
pascal@19515 172 call @@ret
pascal@19515 173 in al,71h
pascal@19515 174 @@ret:
pascal@19515 175 ret
pascal@19515 176
pascal@19515 177
pascal@19515 178 ;***************************************************************
pascal@19515 179 ;u32 memtop();
pascal@19515 180 ;***************************************************************
pascal@19515 181 global _memtop:near
pascal@19515 182 _memtop:
pascal@19515 183 call _memtopz
pascal@19515 184 mov cx,40h ; min 4m
pascal@19515 185 ; If reported mem is ridiculously low, presume
pascal@19515 186 ; we had trouble detecting memory size
pascal@19515 187 cmp dx,cx
pascal@19515 188 jb @@set
pascal@23996 189 extrn _cmdnum:dword
pascal@23996 190 _topmem = _cmdnum+8
pascal@20528 191 mov cx,[word _topmem+2]
pascal@20528 192 inc cx ; jcxnz
pascal@20528 193 loop @@topmemset
pascal@20528 194 mov ch,10h ; default = max 256m
pascal@20528 195 @@topmemset:
pascal@19515 196 ; Kernel can have trouble with initrd at very high addr:
pascal@19515 197 ; limit mem top to 256m
pascal@19515 198 cmp dh,ch
pascal@19515 199 jb @@done
pascal@19515 200 @@set:
pascal@19515 201 xchg ax,cx
pascal@19515 202 cwd
pascal@19515 203 xchg ax,dx
pascal@19515 204 @@done:
pascal@19515 205 ; Round down to page boundary.
pascal@19515 206 ; Or else initrd's tail may end up in last, partial page.
pascal@19515 207 ; Kernel will refuse to use such initrd.
pascal@19515 208 and ax,0f000h
pascal@19515 209 ;@@ok:
pascal@19515 210 ret
pascal@19515 211
pascal@19515 212 endp _memtopz
pascal@19515 213
pascal@19515 214 ;***************************************************************
pascal@19515 215 ;void hook_int15_88();
pascal@19515 216 ;***************************************************************
pascal@19515 217 global _hook_int15_88:near
pascal@19515 218 proc _hook_int15_88 near
pascal@19515 219
pascal@19515 220 ifndef xmm_hook
pascal@24013 221 ;mov ax,4300h
pascal@24013 222 ;int 2fh
pascal@24013 223 ;cmp al,80h ; 80h = XMS driver installed
pascal@24013 224 ;je @@skip
pascal@19515 225 endif
pascal@23983 226 saved15:
pascal@19883 227 xor bx,bx
pascal@19883 228 mov es,bx
pascal@19571 229 ifndef NO386
pascal@19876 230 push cs
pascal@19876 231 push offset int15_88
pascal@19876 232 pop eax
pascal@19883 233 xchg eax,[es:bx+15*4]
pascal@23983 234 mov [dword saved15],eax
pascal@19515 235 else
pascal@19876 236 mov ax,offset int15_88
pascal@23996 237 call saved15z
pascal@23996 238 mov ax,cs
pascal@23996 239 inc bx
pascal@23996 240 inc bx
pascal@23996 241 saved15z:
pascal@19883 242 xchg ax,[es:bx+15*4]
pascal@23996 243 mov [word bx+saved15],ax
pascal@19515 244 endif
pascal@21757 245 ;push ds
pascal@21757 246 ;pop es
pascal@19515 247 @@skip:
pascal@19515 248 ret
pascal@19515 249 int15_88:
pascal@19515 250 cmp ah,88h
pascal@19515 251 je @@do88
pascal@23983 252 jmp [dword saved15]
pascal@19515 253 @@do88:
pascal@19515 254 pushf
pascal@23983 255 call [dword saved15]
pascal@20510 256 or ax,ax
pascal@19515 257 jnz @@iret
pascal@19515 258
pascal@19515 259 ;****** Read extended mem size (CMOS bytes 17h,18h (lo,hi))
pascal@19515 260 call rdcmos17
pascal@19515 261 @@iret:
pascal@19515 262 iret
pascal@19515 263
pascal@19515 264 endp _hook_int15_88
pascal@19515 265
pascal@19515 266 ends _TEXT
pascal@19515 267
pascal@19515 268 end
pascal@19515 269
pascal@19515 270 ;###### END OF FILE ############################################