forked from KolibriOS/kolibrios
direct detection of available memory
git-svn-id: svn://kolibrios.org@2047 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
550c1d97e1
commit
2a927db105
@ -1,13 +1,13 @@
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; ;;
|
||||
;; Copyright (C) KolibriOS team 2004-2010. All rights reserved. ;;
|
||||
;; Copyright (C) KolibriOS team 2004-2011. All rights reserved. ;;
|
||||
;; Copyright (C) MenuetOS 2000-2004 Ville Mikael Turjanmaa ;;
|
||||
;; Distributed under terms of the GNU General Public License ;;
|
||||
;; ;;
|
||||
;; BOOTCODE.INC ;;
|
||||
;; ;;
|
||||
;; KolibriOS 16-bit loader, ;;
|
||||
;; based on bootcode for MenuetOS ;;
|
||||
;; Kolibri-A auxiliary 16-bit code, ;;
|
||||
;; based on bootcode for KolibriOS ;;
|
||||
;; ;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
@ -119,17 +119,6 @@ no_hd_load:
|
||||
push cs
|
||||
pop es
|
||||
|
||||
if 0
|
||||
; set videomode
|
||||
mov ax, 3
|
||||
int 0x10
|
||||
|
||||
; draw frames
|
||||
push 0xb800
|
||||
pop es
|
||||
xor di, di
|
||||
mov ah, 1*16+15
|
||||
end if
|
||||
|
||||
cpugood:
|
||||
|
||||
@ -298,12 +287,6 @@ cfgmanager:
|
||||
dec al
|
||||
mov [boot_dev], al
|
||||
|
||||
; GET MEMORY MAP
|
||||
include 'detect/biosmem.inc'
|
||||
|
||||
; READ DISKETTE TO MEMORY
|
||||
|
||||
|
||||
|
||||
; SET GRAPHICS
|
||||
|
||||
|
20
kernel/branches/Kolibri-A/trunk/bus/USER/special.inc
Normal file
20
kernel/branches/Kolibri-A/trunk/bus/USER/special.inc
Normal file
@ -0,0 +1,20 @@
|
||||
;
|
||||
; Kolibri-A Special service template -- art_zh 2011
|
||||
;
|
||||
; ah = syscall function# (default: 255)
|
||||
; al = subfunction
|
||||
;
|
||||
|
||||
align 4
|
||||
special_srv:
|
||||
mov cl, ah
|
||||
and cl, 3
|
||||
call dword[spec_servetable + ecx*4]
|
||||
ret
|
||||
|
||||
align 4
|
||||
spec_servetable:
|
||||
dd paleholder ; set something special here
|
||||
dd paleholder
|
||||
dd paleholder
|
||||
dd paleholder
|
@ -26,10 +26,10 @@ CPU_PENTIUM equ 5
|
||||
CPU_P6 equ 6
|
||||
CPU_PENTIUM4 equ 0x0F
|
||||
|
||||
PLATFORM equ 0x14
|
||||
PLATFORM_RS780 equ 0x0F
|
||||
PLATFORM_RS880 equ 0x10
|
||||
PLATFORM_FUSION equ 0x14
|
||||
PLATFORM equ 0x14
|
||||
PLATFORM_RS780 equ 0x0F
|
||||
PLATFORM_RS880 equ 0x10
|
||||
PLATFORM_FUSION equ 0x14
|
||||
|
||||
CAPS_FPU equ 00 ;on-chip x87 floating point unit
|
||||
CAPS_VME equ 01 ;virtual-mode enhancements
|
||||
@ -298,7 +298,7 @@ RAMDISK equ (OS_BASE+0x0100000)
|
||||
RAMDISK_FAT equ (OS_BASE+0x0280000)
|
||||
FLOPPY_FAT equ (OS_BASE+0x0282000)
|
||||
|
||||
CLEAN_ZONE equ 0x280000
|
||||
CLEAN_ZONE equ 0x280000
|
||||
IDE_DMA equ 0x284000
|
||||
|
||||
BgrAuxTable equ (OS_BASE+0x0298000)
|
||||
@ -309,7 +309,7 @@ SB16_Status equ (OS_BASE+0x02B0000)
|
||||
BUTTON_INFO equ (OS_BASE+0x02C0000)
|
||||
RESERVED_PORTS equ (OS_BASE+0x02D0000)
|
||||
IRQ_SAVE equ (OS_BASE+0x02E0000)
|
||||
;BOOT_VAR equ (OS_BASE+0x02F0000)
|
||||
;BOOT_VAR equ (OS_BASE+0x02F0000)
|
||||
|
||||
|
||||
stack_data_start equ (OS_BASE+0x0300000)
|
||||
@ -335,10 +335,11 @@ virtual at (OS_BASE+0x05FFF80)
|
||||
end virtual
|
||||
|
||||
HEAP_BASE equ (OS_BASE+0x0800000)
|
||||
HEAP_MIN_SIZE equ 0x01000000
|
||||
HEAP_MIN_SIZE equ 0x02000000
|
||||
|
||||
PCIe_CONFIG_SPACE equ 0xF0000000
|
||||
USER_DMA_BUFFER equ 0xFD000000 ; linear addr.
|
||||
USER_DMA_SIZE equ 0x00800000
|
||||
|
||||
page_tabs equ 0xFDC00000
|
||||
app_page_tabs equ 0xFDC00000
|
||||
|
@ -337,7 +337,7 @@ endp
|
||||
|
||||
align 4
|
||||
proc init_LFB
|
||||
call init_mtrr
|
||||
stdcall set_mtrr, [LFBAddress],[LFBSize],MEM_WC
|
||||
|
||||
mov edx, LFB_BASE
|
||||
mov esi, [LFBAddress]
|
||||
@ -364,16 +364,16 @@ endp
|
||||
|
||||
align 4
|
||||
init_userDMA:
|
||||
stdcall alloc_pages, 4096 ; 16M <<<<<<<<<<+++++++++++++++++++++++++++++++++
|
||||
add eax, 0x007FFFF0 ; terrible mess, sorry ...
|
||||
and eax, 0xFF800000 ; align at 8M boundary
|
||||
mov [UserDMAaddr], eax
|
||||
or eax, PG_LARGE + PG_UW + PG_NOCACHE
|
||||
stdcall set_mtrr, [UserDMAaddr], USER_DMA_SIZE, MEM_UC ; <<<<<<<<<<+++++++++++++++++++++++++++++++++
|
||||
|
||||
mov eax, [UserDMAaddr] ; phys. addr, 8M-aligned
|
||||
or eax, PG_GLOBAL+PG_LARGE + PG_UW + PG_NOCACHE
|
||||
mov ebx, sys_pgdir + (USER_DMA_BUFFER shr 20)
|
||||
mov [ebx], eax
|
||||
add ebx, 4
|
||||
add eax, 0x00400000
|
||||
mov [ebx], eax
|
||||
|
||||
mov eax, cr3 ;flush TLB
|
||||
mov cr3, eax
|
||||
ret
|
||||
@ -1248,75 +1248,6 @@ proc load_pe_driver stdcall, file:dword
|
||||
endp
|
||||
|
||||
|
||||
align 4
|
||||
proc init_mtrr
|
||||
|
||||
cmp [BOOT_VAR+0x901c],byte 2
|
||||
je .exit
|
||||
|
||||
bt [cpu_caps], CAPS_MTRR
|
||||
jnc .exit
|
||||
|
||||
mov eax, cr0
|
||||
or eax, 0x60000000 ;disable caching
|
||||
mov cr0, eax
|
||||
wbinvd ;invalidate cache
|
||||
|
||||
mov ecx, 0x2FF
|
||||
rdmsr ;
|
||||
; has BIOS already initialized MTRRs?
|
||||
test ah, 8
|
||||
jnz .skip_init
|
||||
; rarely needed, so mainly placeholder
|
||||
; main memory - cached
|
||||
push eax
|
||||
|
||||
mov eax, [MEM_AMOUNT]
|
||||
; round eax up to next power of 2
|
||||
dec eax
|
||||
bsr ecx, eax
|
||||
mov ebx, 2
|
||||
shl ebx, cl
|
||||
dec ebx
|
||||
; base of memory range = 0, type of memory range = MEM_WB
|
||||
xor edx, edx
|
||||
mov eax, MEM_WB
|
||||
mov ecx, 0x200
|
||||
wrmsr
|
||||
; mask of memory range = 0xFFFFFFFFF - (size - 1), ebx = size - 1
|
||||
mov eax, 0xFFFFFFFF
|
||||
mov edx, 0x0000000F
|
||||
sub eax, ebx
|
||||
sbb edx, 0
|
||||
or eax, 0x800
|
||||
inc ecx
|
||||
wrmsr
|
||||
; clear unused MTRRs
|
||||
xor eax, eax
|
||||
xor edx, edx
|
||||
@@:
|
||||
wrmsr
|
||||
inc ecx
|
||||
cmp ecx, 0x210
|
||||
jb @b
|
||||
; enable MTRRs
|
||||
pop eax
|
||||
or ah, 8
|
||||
and al, 0xF0 ; default memtype = UC
|
||||
mov ecx, 0x2FF
|
||||
wrmsr
|
||||
.skip_init:
|
||||
stdcall set_mtrr, [LFBAddress],[LFBSize],MEM_WC
|
||||
|
||||
wbinvd ;again invalidate
|
||||
|
||||
mov eax, cr0
|
||||
and eax, not 0x60000000
|
||||
mov cr0, eax ; enable caching
|
||||
.exit:
|
||||
ret
|
||||
endp
|
||||
|
||||
align 4
|
||||
proc set_mtrr stdcall, base:dword,size:dword,mem_type:dword
|
||||
; find unused register
|
||||
@ -1337,7 +1268,11 @@ proc set_mtrr stdcall, base:dword,size:dword,mem_type:dword
|
||||
.ret:
|
||||
ret
|
||||
.found:
|
||||
; found, write values
|
||||
mov eax, cr0
|
||||
or eax, 0x60000000 ;disable caching
|
||||
mov cr0, eax
|
||||
wbinvd ;invalidate cache
|
||||
|
||||
xor edx, edx
|
||||
mov eax, [base]
|
||||
or eax, [mem_type]
|
||||
@ -1352,6 +1287,12 @@ proc set_mtrr stdcall, base:dword,size:dword,mem_type:dword
|
||||
or eax, 0x800
|
||||
inc ecx
|
||||
wrmsr
|
||||
|
||||
wbinvd ;again invalidate
|
||||
mov eax, cr0
|
||||
and eax, not 0x60000000
|
||||
mov cr0, eax ; enable caching
|
||||
|
||||
ret
|
||||
endp
|
||||
|
||||
|
@ -46,8 +46,10 @@ align 32
|
||||
syscall_entry:
|
||||
; sti
|
||||
push ecx
|
||||
and eax, 3
|
||||
call dword [servetable3 + eax * 4]
|
||||
xor ecx, ecx
|
||||
mov cl, al
|
||||
and cl, 7
|
||||
call dword [servetable3 + ecx * 4]
|
||||
pop ecx
|
||||
sysret
|
||||
|
||||
@ -156,8 +158,13 @@ align 4
|
||||
servetable3: ; Kolibri-A special service
|
||||
|
||||
dd sys_rdmsr ; 0 = read MSR
|
||||
dd sys_map1 ; 1 = map any page (test only)
|
||||
dd sys_map1 ; 1 = get sys data (test only)
|
||||
dd paleholder ; 2
|
||||
dd paleholder ; 3
|
||||
dd paleholder ; 4
|
||||
dd paleholder ; 5
|
||||
dd paleholder ; 6
|
||||
dd special_srv ; 7 = special service
|
||||
dd sys_end ; last
|
||||
|
||||
endg
|
||||
|
@ -255,6 +255,7 @@ endofcode:
|
||||
gdte:
|
||||
|
||||
align 16
|
||||
diff16 "cur_saved_data (data32.inc) ", 0, $
|
||||
cur_saved_data rb 4096
|
||||
fpu_data: rb 512
|
||||
|
||||
@ -282,12 +283,15 @@ irq15read rd 16
|
||||
|
||||
irq_tab rd 16
|
||||
|
||||
diff16 "mem_block_map (data32.inc) ", 0, $
|
||||
mem_block_map rb 512
|
||||
mem_block_list rd 64
|
||||
large_block_list rd 31
|
||||
mem_block_mask rd 2
|
||||
large_block_mask rd 1
|
||||
|
||||
diff16 "mem_used (data32.inc) ", 0, $
|
||||
|
||||
mem_used.fd rd 1
|
||||
mem_used.bk rd 1
|
||||
|
||||
@ -302,6 +306,7 @@ heap_blocks rd 1
|
||||
free_blocks rd 1
|
||||
|
||||
mst MEM_STATE
|
||||
diff16 "page_start (data32.inc) ", 0, $
|
||||
|
||||
page_start rd 1
|
||||
page_end rd 1
|
||||
@ -331,6 +336,8 @@ srv.bk rd 1
|
||||
;img_screen_y rd 1
|
||||
|
||||
align 64
|
||||
diff16 "_WinMapAddress (data32.inc) ", 0, $
|
||||
|
||||
;_WinMapWidth rd 1
|
||||
;_WinMapHeight rd 1
|
||||
_WinMapAddress rd 1
|
||||
@ -363,6 +370,8 @@ proc_mem_tab rd 1
|
||||
tmp_task_pdir rd 1
|
||||
tmp_task_ptab rd 1
|
||||
|
||||
diff16 "default_io_map (data32.inc) ", 0, $
|
||||
|
||||
default_io_map rd 1
|
||||
|
||||
LFBSize rd 1
|
||||
|
@ -1,43 +0,0 @@
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
;; ;;
|
||||
;; Copyright (C) KolibriOS team 2009. All rights reserved. ;;
|
||||
;; Distributed under terms of the GNU General Public License ;;
|
||||
;; ;;
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
; Query physical memory map from BIOS.
|
||||
; diamond, 2009
|
||||
|
||||
push ds
|
||||
; first call to fn E820
|
||||
mov eax, 0xE820
|
||||
xor ebx, ebx
|
||||
mov es, bx
|
||||
mov ds, bx
|
||||
mov di, 0x9104
|
||||
mov [di-4], ebx ; no blocks yet
|
||||
mov ecx, 20
|
||||
mov edx, 0x534D4150
|
||||
int 15h
|
||||
jc no_E820
|
||||
cmp eax, 0x534D4150
|
||||
jnz no_E820
|
||||
e820_mem_loop:
|
||||
cmp byte [di+16], 1 ; ignore non-free areas
|
||||
jnz e820_mem_next
|
||||
inc byte [0x9100]
|
||||
add di, 20
|
||||
e820_mem_next:
|
||||
; consequent calls to fn E820
|
||||
test ebx, ebx
|
||||
jz e820_test_done
|
||||
cmp byte [0x9100], 32
|
||||
jae e820_test_done
|
||||
mov eax, 0xE820
|
||||
int 15h
|
||||
jc e820_test_done
|
||||
jmp e820_mem_loop
|
||||
no_E820:
|
||||
; let's hope for mem_test from init.inc
|
||||
e820_test_done:
|
||||
pop ds
|
@ -18,7 +18,7 @@ preinit_mem:
|
||||
|
||||
; clear [CLEAN_ZONE..HEAP_BASE]
|
||||
xor eax,eax
|
||||
mov edi,CLEAN_ZONE ; 0x280000 = ramdisk FAT ?
|
||||
mov edi,CLEAN_ZONE ; 0x280000 = ramdisk FAT ?
|
||||
mov ecx,(HEAP_BASE-OS_BASE-CLEAN_ZONE) / 4
|
||||
cld
|
||||
rep stosd
|
||||
@ -35,7 +35,7 @@ preinit_mem:
|
||||
|
||||
; save [0..0xffff]
|
||||
xor esi, esi
|
||||
mov edi, (BOOT_VAR - OS_BASE) ; low mem storage area
|
||||
mov edi, (BOOT_VAR - OS_BASE) ; low mem storage area
|
||||
mov ecx, 0x10000 / 4
|
||||
rep movsd
|
||||
; clear [0x1000..0x0ffff]
|
||||
@ -53,11 +53,32 @@ preinit_mem:
|
||||
align 4
|
||||
proc init_mem
|
||||
|
||||
mov esi, (PCIe_CONFIG_SPACE-OS_BASE) ; esi will hold total amount of memory
|
||||
mov edx, esi ; edx will hold maximum allocatable address
|
||||
mov ecx, 0xC001001A ; Top of Memory MSR
|
||||
xor edi, edi
|
||||
rdmsr
|
||||
mov esi, eax ; esi = total amount of memory
|
||||
mov ecx, 0x0200
|
||||
.read_mtrr:
|
||||
rdmsr
|
||||
and eax, 0xFFF00000 ; not just bitcleaning
|
||||
jz .next_mtrr ; ignore the main memory and free MTRRs
|
||||
cmp esi, eax
|
||||
jb .next_mtrr ; ignore MMIO blocks
|
||||
mov esi, eax
|
||||
.next_mtrr:
|
||||
add cl, 2
|
||||
cmp cl, 0x10
|
||||
jb .read_mtrr
|
||||
|
||||
mov [MEM_AMOUNT-OS_BASE], esi
|
||||
mov [pg_data.mem_amount-OS_BASE], esi
|
||||
mov eax, USER_DMA_SIZE
|
||||
sub esi, eax ; exclude the Global DMA block...
|
||||
and esi, 0xFF800000 ; ...and the hole above it
|
||||
mov eax, esi
|
||||
mov [MEM_AMOUNT-OS_BASE], eax
|
||||
mov [pg_data.mem_amount-OS_BASE], eax ; the true MEMTOP
|
||||
mov [UserDMAaddr-OS_BASE], eax
|
||||
|
||||
mov edx, esi ; edx will hold maximum allocatable address
|
||||
shr esi, 12
|
||||
mov [pg_data.pages_count-OS_BASE], esi ; max number of PTEs ?
|
||||
|
||||
|
@ -499,10 +499,10 @@ v20ga32:
|
||||
mov [graph_data_l+4],al
|
||||
mov [graph_data_l+7],ah
|
||||
|
||||
; or [KERNEL_ALLOC_FLAG], dword PG_NOCACHE
|
||||
; or [KERNEL_ALLOC_FLAG], dword PG_NOCACHE ;<<<<<<<<<<<<<<<<
|
||||
stdcall kernel_alloc, [_WinMapSize]
|
||||
mov [_WinMapAddress], eax
|
||||
; xor [KERNEL_ALLOC_FLAG], dword PG_NOCACHE
|
||||
; xor [KERNEL_ALLOC_FLAG], dword PG_NOCACHE ;<<<<<<<<<<<<<<<<
|
||||
|
||||
xor eax,eax
|
||||
inc eax
|
||||
|
@ -248,6 +248,7 @@ include "bus/pci/pci32.inc"
|
||||
;include "bus/pci/PCIe.inc"
|
||||
include "bus/HT.inc" ; AMD HyperTransport bus control
|
||||
include "bus/SB/SB.inc"
|
||||
include "bus/user/special.inc"
|
||||
|
||||
; Floppy drive controller
|
||||
|
||||
|
@ -10,87 +10,87 @@ $Revision$
|
||||
|
||||
; void __stdcall unpack(void* packed_data, void* unpacked_data);
|
||||
unpack:
|
||||
pushad
|
||||
mov esi, [esp+32+4]
|
||||
mov edi, [esp+32+8]
|
||||
mov eax, [esi+8]
|
||||
and al, 0xC0
|
||||
cmp al, 0xC0
|
||||
jz .failed
|
||||
mov eax, [esi+8]
|
||||
push eax
|
||||
add esi, 12
|
||||
and al, not 0xC0
|
||||
dec al
|
||||
jz .lzma
|
||||
pushad
|
||||
mov esi, [esp+32+4]
|
||||
mov edi, [esp+32+8]
|
||||
mov eax, [esi+8]
|
||||
and al, 0xC0
|
||||
cmp al, 0xC0
|
||||
jz .failed
|
||||
mov eax, [esi+8]
|
||||
push eax
|
||||
add esi, 12
|
||||
and al, not 0xC0
|
||||
dec al
|
||||
jz .lzma
|
||||
.failed:
|
||||
pop eax
|
||||
popad
|
||||
ret 8
|
||||
pop eax
|
||||
popad
|
||||
ret 8
|
||||
.lzma:
|
||||
call .lzma_unpack
|
||||
call .lzma_unpack
|
||||
.common:
|
||||
pop eax
|
||||
test al, 0x80
|
||||
jnz .ctr1
|
||||
test al, 0x40
|
||||
jz .ok
|
||||
lodsd
|
||||
mov ecx, eax
|
||||
jecxz .ok
|
||||
mov dl, [esi]
|
||||
mov esi, [esp+32+8]
|
||||
pop eax
|
||||
test al, 0x80
|
||||
jnz .ctr1
|
||||
test al, 0x40
|
||||
jz .ok
|
||||
lodsd
|
||||
mov ecx, eax
|
||||
jecxz .ok
|
||||
mov dl, [esi]
|
||||
mov esi, [esp+32+8]
|
||||
.c1:
|
||||
lodsb
|
||||
sub al, 0E8h
|
||||
cmp al, 1
|
||||
ja .c1
|
||||
cmp byte [esi], dl
|
||||
jnz .c1
|
||||
lodsd
|
||||
lodsb
|
||||
sub al, 0E8h
|
||||
cmp al, 1
|
||||
ja .c1
|
||||
cmp byte [esi], dl
|
||||
jnz .c1
|
||||
lodsd
|
||||
; "bswap eax" is not supported on i386
|
||||
shr ax, 8
|
||||
ror eax, 16
|
||||
xchg al, ah
|
||||
sub eax, esi
|
||||
add eax, [esp+32+8]
|
||||
mov [esi-4], eax
|
||||
loop .c1
|
||||
shr ax, 8
|
||||
ror eax, 16
|
||||
xchg al, ah
|
||||
sub eax, esi
|
||||
add eax, [esp+32+8]
|
||||
mov [esi-4], eax
|
||||
loop .c1
|
||||
.ok:
|
||||
popad
|
||||
ret 8
|
||||
popad
|
||||
ret 8
|
||||
.ctr1:
|
||||
lodsd
|
||||
mov ecx, eax
|
||||
jecxz .ok
|
||||
mov dl, [esi]
|
||||
mov esi, [esp+32+8]
|
||||
lodsd
|
||||
mov ecx, eax
|
||||
jecxz .ok
|
||||
mov dl, [esi]
|
||||
mov esi, [esp+32+8]
|
||||
.c2:
|
||||
lodsb
|
||||
lodsb
|
||||
@@:
|
||||
cmp al, 0xF
|
||||
jnz .f
|
||||
lodsb
|
||||
cmp al, 80h
|
||||
jb @b
|
||||
cmp al, 90h
|
||||
jb @f
|
||||
cmp al, 0xF
|
||||
jnz .f
|
||||
lodsb
|
||||
cmp al, 80h
|
||||
jb @b
|
||||
cmp al, 90h
|
||||
jb @f
|
||||
.f:
|
||||
sub al, 0E8h
|
||||
cmp al, 1
|
||||
ja .c2
|
||||
sub al, 0E8h
|
||||
cmp al, 1
|
||||
ja .c2
|
||||
@@:
|
||||
cmp byte [esi], dl
|
||||
jnz .c2
|
||||
lodsd
|
||||
shr ax, 8
|
||||
ror eax, 16
|
||||
xchg al, ah
|
||||
sub eax, esi
|
||||
add eax, [esp+32+8]
|
||||
mov [esi-4], eax
|
||||
loop .c2
|
||||
jmp .ok
|
||||
cmp byte [esi], dl
|
||||
jnz .c2
|
||||
lodsd
|
||||
shr ax, 8
|
||||
ror eax, 16
|
||||
xchg al, ah
|
||||
sub eax, esi
|
||||
add eax, [esp+32+8]
|
||||
mov [esi-4], eax
|
||||
loop .c2
|
||||
jmp .ok
|
||||
|
||||
.lzma_unpack:
|
||||
|
||||
@ -98,22 +98,22 @@ unpack:
|
||||
.lp = 0 ; literal pos state bits
|
||||
.lc = 3 ; literal context bits
|
||||
.posStateMask = ((1 shl .pb)-1)
|
||||
.literalPosMask = ((1 shl .lp)-1)
|
||||
.literalPosMask = ((1 shl .lp)-1)
|
||||
|
||||
.kNumPosBitsMax = 4
|
||||
.kNumPosBitsMax = 4
|
||||
.kNumPosStatesMax = (1 shl .kNumPosBitsMax)
|
||||
|
||||
.kLenNumLowBits = 3
|
||||
.kLenNumLowSymbols = (1 shl .kLenNumLowBits)
|
||||
.kLenNumMidBits = 3
|
||||
.kLenNumMidSymbols = (1 shl .kLenNumMidBits)
|
||||
.kLenNumHighBits = 8
|
||||
.kLenNumHighSymbols = (1 shl .kLenNumHighBits)
|
||||
.kLenNumLowBits = 3
|
||||
.kLenNumLowSymbols = (1 shl .kLenNumLowBits)
|
||||
.kLenNumMidBits = 3
|
||||
.kLenNumMidSymbols = (1 shl .kLenNumMidBits)
|
||||
.kLenNumHighBits = 8
|
||||
.kLenNumHighSymbols = (1 shl .kLenNumHighBits)
|
||||
|
||||
.LenChoice = 0
|
||||
.LenChoice2 = 1
|
||||
.LenLow = 2
|
||||
.LenMid = (.LenLow + (.kNumPosStatesMax shl .kLenNumLowBits))
|
||||
.LenLow = 2
|
||||
.LenMid = (.LenLow + (.kNumPosStatesMax shl .kLenNumLowBits))
|
||||
.LenHigh = (.LenMid + (.kNumPosStatesMax shl .kLenNumMidBits))
|
||||
.kNumLenProbs = (.LenHigh + .kLenNumHighSymbols)
|
||||
|
||||
@ -136,22 +136,22 @@ unpack:
|
||||
.IsRep0Long = (.IsRepG2 + .kNumStates)
|
||||
.PosSlot = (.IsRep0Long + (.kNumStates shl .kNumPosBitsMax))
|
||||
.SpecPos = (.PosSlot + (.kNumLenToPosStates shl .kNumPosSlotBits))
|
||||
.Align_ = (.SpecPos + .kNumFullDistances - .kEndPosModelIndex)
|
||||
.Align_ = (.SpecPos + .kNumFullDistances - .kEndPosModelIndex)
|
||||
.Lencoder = (.Align_ + .kAlignTableSize)
|
||||
.RepLencoder = (.Lencoder + .kNumLenProbs)
|
||||
.Literal = (.RepLencoder + .kNumLenProbs)
|
||||
|
||||
.LZMA_BASE_SIZE = 1846 ; must be ==Literal
|
||||
.LZMA_BASE_SIZE = 1846 ; must be ==Literal
|
||||
.LZMA_LIT_SIZE = 768
|
||||
|
||||
.kNumTopBits = 24
|
||||
.kTopValue = (1 shl .kNumTopBits)
|
||||
|
||||
.kNumBitModelTotalBits = 11
|
||||
.kBitModelTotal = (1 shl .kNumBitModelTotalBits)
|
||||
.kBitModelTotal = (1 shl .kNumBitModelTotalBits)
|
||||
.kNumMoveBits = 5
|
||||
|
||||
push edi
|
||||
push edi
|
||||
; int state=0;
|
||||
xor ebx, ebx
|
||||
mov [.previousByte], bl
|
||||
@ -173,7 +173,7 @@ unpack:
|
||||
; rd->Buffer = stream
|
||||
; rd->BufferLim = stream+bufferSize
|
||||
; rd->Range = 0xFFFFFFFF
|
||||
pop edi
|
||||
pop edi
|
||||
mov ebp, [esi-8] ; dest_length
|
||||
add ebp, edi ; ebp = destination limit
|
||||
lodsd
|
||||
@ -515,7 +515,8 @@ end if
|
||||
|
||||
uglobal
|
||||
align 4
|
||||
;unpack.p rd unpack.LZMA_BASE_SIZE + (unpack.LZMA_LIT_SIZE shl (unpack.lc+unpack.lp))
|
||||
diff16 "unpacker.inc structures", 0, $
|
||||
;unpack.p rd unpack.LZMA_BASE_SIZE + (unpack.LZMA_LIT_SIZE shl (unpack.lc+unpack.lp))
|
||||
unpack.p dd ?
|
||||
unpack.code_ dd ?
|
||||
unpack.range dd ?
|
||||
|
Loading…
Reference in New Issue
Block a user