* more space for EBDA in V86

* some bugfixes in NTFS support

git-svn-id: svn://kolibrios.org@820 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
Evgeny Grechnikov (Diamond) 2008-07-09 13:17:57 +00:00
parent ed2e35a24c
commit c6b94086d8
3 changed files with 38 additions and 18 deletions

View File

@ -806,7 +806,7 @@ bd_read:
ja .notread ja .notread
sub eax, [bios_cur_sector] sub eax, [bios_cur_sector]
shl eax, 9 shl eax, 9
add eax, (OS_BASE+0x9C000) add eax, (OS_BASE+0x9A000)
push ecx esi edi push ecx esi edi
mov esi, eax mov esi, eax
shl edi, 9 shl edi, 9
@ -851,7 +851,7 @@ bd_write_cache_chain:
shl esi, 9 shl esi, 9
call calculate_cache_2 call calculate_cache_2
add esi, eax add esi, eax
mov edi, OS_BASE + 0x9C000 mov edi, OS_BASE + 0x9A000
movzx ecx, [cache_chain_size] movzx ecx, [cache_chain_size]
push ecx push ecx
shl ecx, 9-2 shl ecx, 9-2
@ -884,7 +884,7 @@ int13_call:
; In current implementation it is protected by common mutex 'hd1_status' ; In current implementation it is protected by common mutex 'hd1_status'
mov word [BOOT_VAR + 510h], 10h ; packet length mov word [BOOT_VAR + 510h], 10h ; packet length
mov word [BOOT_VAR + 512h], cx ; number of sectors mov word [BOOT_VAR + 512h], cx ; number of sectors
mov dword [BOOT_VAR + 514h], 9C000000h ; buffer 9C00:0000 mov dword [BOOT_VAR + 514h], 9A000000h ; buffer 9A00:0000
mov dword [BOOT_VAR + 518h], eax mov dword [BOOT_VAR + 518h], eax
and dword [BOOT_VAR + 51Ch], 0 and dword [BOOT_VAR + 51Ch], 0
push ebx ecx esi edi push ebx ecx esi edi
@ -911,7 +911,7 @@ int13_call:
@@: @@:
mov word [ebx+v86_regs.esi], 510h mov word [ebx+v86_regs.esi], 510h
mov word [ebx+v86_regs.ss], 9000h mov word [ebx+v86_regs.ss], 9000h
mov word [ebx+v86_regs.esp], 0C000h mov word [ebx+v86_regs.esp], 0A000h
mov word [ebx+v86_regs.eip], 500h mov word [ebx+v86_regs.eip], 500h
mov [ebx+v86_regs.eflags], 20200h mov [ebx+v86_regs.eflags], 20200h
mov esi, [sys_v86_machine] mov esi, [sys_v86_machine]

View File

@ -89,19 +89,29 @@ v86_create:
pop esi pop esi
; now V86 specific: initialize known addresses in first Mb ; now V86 specific: initialize known addresses in first Mb
pop eax edi pop eax
; first page - BIOS data (shared between all machines!) ; first page - BIOS data (shared between all machines!)
; physical address = 0x2f0000 ; physical address = 0x2f0000
; linear address = BOOT_VAR = OS_BASE + 0x2f0000 ; linear address = BOOT_VAR = OS_BASE + 0x2f0000
mov dword [eax], (BOOT_VAR - OS_BASE) or 111b mov dword [eax], (BOOT_VAR - OS_BASE) or 111b
mov dword [eax+800h], BOOT_VAR mov dword [eax+800h], BOOT_VAR
; page before 0xA0000 - Extended BIOS Data Area (shared between all machines!) ; page before 0xA0000 - Extended BIOS Data Area (shared between all machines!)
; physical address = 0x9F000 ; physical address = 0x9C000
; linear address = 0x8009F000 ; linear address = 0x8009C000
mov dword [eax+0x9E*4], 0x9E000 or 111b ; (I have seen one computer with EBDA segment = 0x9D80,
mov dword [eax+0x9E*4+800h], 0x9E000 + OS_BASE ; all other computers use less memory)
mov dword [eax+0x9F*4], 0x9F000 or 111b mov ecx, 4
mov dword [eax+0x9F*4+800h], 0x9F000 + OS_BASE mov edx, 0x9C000
push eax
lea edi, [eax+0x9C*4]
@@:
lea eax, [edx + OS_BASE]
mov [edi+800h], eax
lea eax, [edx + 111b]
stosd
loop @b
pop eax
pop edi
; addresses 0xC0000 - 0xFFFFF - BIOS code (shared between all machines!) ; addresses 0xC0000 - 0xFFFFF - BIOS code (shared between all machines!)
; physical address = 0xC0000 ; physical address = 0xC0000
; linear address = 0x800C0000 ; linear address = 0x800C0000
@ -216,12 +226,13 @@ init_sys_v86:
mov byte [BOOT_VAR + 0x505], 0xF4 mov byte [BOOT_VAR + 0x505], 0xF4
mov esi, eax mov esi, eax
mov ebx, [eax+V86_machine.pagedir] mov ebx, [eax+V86_machine.pagedir]
; one page for stack, two pages for results (0x2000 bytes = 16 sectors)
mov dword [ebx+0x99*4+0x1000], 0x99000 or 111b
mov dword [ebx+0x99*4+0x1800], OS_BASE + 0x99000
mov dword [ebx+0x9A*4+0x1000], 0x9A000 or 111b
mov dword [ebx+0x9A*4+0x1800], OS_BASE + 0x9A000
mov dword [ebx+0x9B*4+0x1000], 0x9B000 or 111b mov dword [ebx+0x9B*4+0x1000], 0x9B000 or 111b
mov dword [ebx+0x9B*4+0x1800], OS_BASE + 0x9B000 mov dword [ebx+0x9B*4+0x1800], OS_BASE + 0x9B000
mov dword [ebx+0x9C*4+0x1000], 0x9C000 or 111b
mov dword [ebx+0x9C*4+0x1800], OS_BASE + 0x9C000
mov dword [ebx+0x9D*4+0x1000], 0x9D000 or 111b
mov dword [ebx+0x9D*4+0x1800], OS_BASE + 0x9D000
if ~DEBUG_SHOW_IO if ~DEBUG_SHOW_IO
; allow access to all ports ; allow access to all ports
mov ecx, [esi+V86_machine.iopm] mov ecx, [esi+V86_machine.iopm]

View File

@ -793,14 +793,17 @@ ntfs_read_attr:
add esp, 10h add esp, 10h
mov eax, [ntfs_cur_tail] mov eax, [ntfs_cur_tail]
test eax, eax test eax, eax
jz .okret jz @f
sub eax, 0x200 sub eax, 0x200
add [ntfs_cur_read], eax add [ntfs_cur_read], eax
jmp .okret @@:
clc
ret
.errread2: .errread2:
pop ecx pop ecx
add esp, 10h add esp, 10h
jmp .errret stc
ret
.break: .break:
add esp, 10h ; CF=0 add esp, 10h ; CF=0
mov [ntfs_bCanContinue], 1 mov [ntfs_bCanContinue], 1
@ -1032,6 +1035,8 @@ ntfs_find_lfn:
push eax push eax
mov al, [edi] mov al, [edi]
inc edi inc edi
cmp al, '/'
jz .slash
call char_toupper call char_toupper
cmp al, [esp] cmp al, [esp]
pop eax pop eax
@ -1044,6 +1049,10 @@ ntfs_find_lfn:
movzx eax, word [esi+8] movzx eax, word [esi+8]
add esi, eax add esi, eax
jmp .scanloopint jmp .scanloopint
.slash:
pop eax
pop edi
pop esi
.subnode: .subnode:
test byte [esi+0Ch], 1 test byte [esi+0Ch], 1
jz .notfound jz .notfound