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

updated sleuthkit and sleuthkit-dev (4.6.7 -> 4.8.0)
author Hans-G?nter Theisgen
date Mon Apr 20 14:22:39 2020 +0100 (2020-04-20)
parents 04ffefac5707
children fc88d0826de4
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 ifdef NO386
pascal@19636 10 p8086
pascal@19636 11 else
pascal@19515 12 p386
pascal@19636 13 endif
pascal@19515 14
pascal@20451 15 group DGROUP _TEXT,_BSS
pascal@19515 16 assume cs:DGROUP,ds:DGROUP
pascal@19515 17
pascal@19515 18
pascal@19515 19 segment _BSS byte public use16 'BSS'
pascal@19515 20
pascal@19515 21 saved15 dd ?
pascal@19515 22
pascal@19515 23 ends _BSS
pascal@19515 24
pascal@19515 25
pascal@19515 26 segment _TEXT byte public use16 'CODE'
pascal@19515 27
pascal@19515 28 ;***************************************************************
pascal@19515 29 ;u32 memtopz();
pascal@19515 30 ;***************************************************************
pascal@19515 31 proc _memtopz near
pascal@19515 32 ;***************************************************************
pascal@19515 33 ;u32 memtop_e801()
pascal@19515 34 ;***************************************************************
pascal@19515 35 ; proc _memtop_e801 near
pascal@19515 36
pascal@19515 37 xor cx,cx ;fix to work around buggy
pascal@19515 38 xor dx,dx ; BIOSes which dont clear/set
pascal@19515 39 stc ; carry on pass/error of
pascal@19515 40 mov ax,0E801h
pascal@19515 41 int 15h
pascal@19515 42 jc @@err
pascal@20453 43
pascal@20453 44 xchg ax,cx ;kludge to handle BIOSes
pascal@20453 45 jcxz @@use_cxdx ; which report their extended
pascal@20453 46 ; memory in AX/BX rather than
pascal@20453 47 ; CX/DX. The spec I have read
pascal@19515 48 @@use_axbx: mov dx,bx ; seems to indicate AX/BX
pascal@19882 49 xchg ax,cx ; are more reasonable anyway...
pascal@20453 50 @@use_cxdx: ;now: dx=64k units above 16m
pascal@20453 51 ; ax=1k units above 1m below 16m (max 3c00h)
pascal@20510 52 or dx,dx
pascal@19515 53 jz tokb ;dx=0 here, ax=kbs above 1m
pascal@19515 54 xor ax,ax ;ignore info on low 16M (assume full)
pascal@19515 55 ;add dx,100h ;account for low 16M
pascal@19515 56 inc dh ;account for low 16M (optimized)
pascal@19515 57 ret
pascal@19515 58 @@err:
pascal@19515 59 ; xor ax,ax
pascal@19515 60 ; cwd
pascal@19515 61 ; ret
pascal@19515 62 ; endp _memtop_e801
pascal@19515 63
pascal@19515 64
pascal@19515 65 ;***************************************************************
pascal@19515 66 ;u32 memtop_88()
pascal@19515 67 ;***************************************************************
pascal@19515 68 ; proc _memtop_88 near
pascal@19515 69
pascal@19515 70 mov ah,88h
pascal@19515 71 int 15h ;ax=kbs above 1m
pascal@20142 72 cmc ; error: cf=1 or ax=0
pascal@20142 73 sbb dx,dx
pascal@20142 74 and ax,dx ;
pascal@20142 75 jnz tokb ;happens on big mem systems
pascal@19879 76
pascal@19879 77 ;***************************************************************
pascal@19879 78 ;u32 memtop_cmos()
pascal@19879 79 ;***************************************************************
pascal@19879 80
pascal@19879 81 ;memtop_cmos:
pascal@19879 82 pushf
pascal@19879 83 call rdcmos17
pascal@19879 84 popf
pascal@19515 85 tokb:
pascal@21757 86 mov cl,10 ;multiply by 1024
pascal@21757 87 ifndef NO386
pascal@21757 88 add ah,4h ;account for 1024 low kb
pascal@21757 89 setc dl ; (optimized to death)
pascal@21757 90 shld dx,ax,cl
pascal@21757 91 shl ax,cl ; (kbytes -> bytes)
pascal@21791 92 ret
pascal@21757 93 else
pascal@19634 94 xor dx,dx
pascal@19515 95 add ah,4h ;account for 1024 low kb
pascal@19515 96 adc dx,dx ; (optimized to death)
pascal@21791 97 db 0A9h ; test ax,0C28Ch
pascal@21791 98 global N_LXLSH@ES:near
pascal@21791 99 N_LXLSH@ES:
pascal@21791 100 mov dx,es
pascal@20142 101 global N_LXLSH@:near
pascal@20142 102 N_LXLSH@:
pascal@19883 103 mov ch,0
pascal@19515 104 @@lp:
pascal@19883 105 shl ax,1
pascal@19515 106 rcl dx,1
pascal@19515 107 loop @@lp
pascal@21791 108 ret
pascal@21791 109 global N_LXLSH@4:near
pascal@21791 110 N_LXLSH@4:
pascal@21791 111 xor dx,dx
pascal@21791 112 mov cl,4
pascal@21791 113 jmp N_LXLSH@
pascal@19515 114 endif
pascal@19883 115
pascal@19515 116 ; endp _memtop_88
pascal@19515 117
pascal@19515 118 ; proc _memtopz near
pascal@19515 119
pascal@19515 120 ; call _memtop_e801
pascal@19515 121 ; jnz @@ok
pascal@19515 122 ; call _memtop_88
pascal@19515 123 ; jnz @@ok
pascal@19879 124 ; jmp memtop_cmos
pascal@19515 125
pascal@20142 126 rdcmos17: cli
pascal@20142 127 mov al,18h ; read bytes 17-18 from CMOS
pascal@19515 128 call @@rdcmos
pascal@19515 129 mov ah,al
pascal@19515 130 mov al,17h
pascal@19515 131 @@rdcmos: out 70h,al
pascal@19515 132 call @@ret
pascal@19515 133 in al,71h
pascal@19515 134 @@ret:
pascal@19515 135 ret
pascal@19515 136
pascal@19515 137
pascal@19515 138 ;***************************************************************
pascal@19515 139 ;u32 memtop();
pascal@19515 140 ;***************************************************************
pascal@19515 141 global _memtop:near
pascal@19515 142 _memtop:
pascal@19515 143 call _memtopz
pascal@19515 144 mov cx,40h ; min 4m
pascal@19515 145 ; If reported mem is ridiculously low, presume
pascal@19515 146 ; we had trouble detecting memory size
pascal@19515 147 cmp dx,cx
pascal@19515 148 jb @@set
pascal@20451 149 extrn _topmem:dword
pascal@20528 150 mov cx,[word _topmem+2]
pascal@20528 151 inc cx ; jcxnz
pascal@20528 152 loop @@topmemset
pascal@20528 153 mov ch,10h ; default = max 256m
pascal@20528 154 @@topmemset:
pascal@19515 155 ; Kernel can have trouble with initrd at very high addr:
pascal@19515 156 ; limit mem top to 256m
pascal@19515 157 cmp dh,ch
pascal@19515 158 jb @@done
pascal@19515 159 @@set:
pascal@19515 160 xchg ax,cx
pascal@19515 161 cwd
pascal@19515 162 xchg ax,dx
pascal@19515 163 @@done:
pascal@19515 164 ; Round down to page boundary.
pascal@19515 165 ; Or else initrd's tail may end up in last, partial page.
pascal@19515 166 ; Kernel will refuse to use such initrd.
pascal@19515 167 and ax,0f000h
pascal@19515 168 ;@@ok:
pascal@19515 169 ret
pascal@19515 170
pascal@19515 171 endp _memtopz
pascal@19515 172
pascal@19515 173 ;***************************************************************
pascal@19515 174 ;void hook_int15_88();
pascal@19515 175 ;***************************************************************
pascal@19515 176 global _hook_int15_88:near
pascal@19515 177 proc _hook_int15_88 near
pascal@19515 178
pascal@19515 179 ifndef xmm_hook
pascal@19515 180 mov ax,4300h
pascal@19515 181 int 2fh
pascal@19571 182 cmp al,80h ; 80h = XMS driver installed
pascal@19515 183 je @@skip
pascal@19515 184 endif
pascal@19883 185 xor bx,bx
pascal@19883 186 mov es,bx
pascal@19571 187 ifndef NO386
pascal@19876 188 push cs
pascal@19876 189 push offset int15_88
pascal@19876 190 pop eax
pascal@19883 191 xchg eax,[es:bx+15*4]
pascal@19515 192 mov [saved15],eax
pascal@19515 193 else
pascal@19876 194 mov ax,offset int15_88
pascal@19883 195 xchg ax,[es:bx+15*4]
pascal@19515 196 mov [word saved15],ax
pascal@19876 197 mov ax,cs
pascal@19883 198 xchg ax,[es:bx+15*4+2]
pascal@19515 199 mov [word saved15+2],ax
pascal@19515 200 endif
pascal@21757 201 ;push ds
pascal@21757 202 ;pop es
pascal@19515 203 @@skip:
pascal@19515 204 ret
pascal@19515 205 int15_88:
pascal@19515 206 cmp ah,88h
pascal@19515 207 je @@do88
pascal@19515 208 jmp [saved15]
pascal@19515 209 @@do88:
pascal@19515 210 pushf
pascal@21302 211 call [saved15]
pascal@20510 212 or ax,ax
pascal@19515 213 jnz @@iret
pascal@19515 214
pascal@19515 215 ;****** Read extended mem size (CMOS bytes 17h,18h (lo,hi))
pascal@19515 216 call rdcmos17
pascal@19515 217 @@iret:
pascal@19515 218 iret
pascal@19515 219
pascal@19515 220 endp _hook_int15_88
pascal@19515 221
pascal@19515 222 ends _TEXT
pascal@19515 223
pascal@19515 224 end
pascal@19515 225
pascal@19515 226 ;###### END OF FILE ############################################