summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorhpa <hpa>2004-12-20 20:20:09 +0000
committerhpa <hpa>2004-12-20 20:20:09 +0000
commitb7b0e1ee7684e42dddc7ecfe699f6ef47b380363 (patch)
tree54512388de04c60d45e6dc1f6ec59ae231b97336
parent6437a33203d4072bccee01d84778c2930dbea6e8 (diff)
downloadsyslinux-b7b0e1ee7684e42dddc7ecfe699f6ef47b380363.tar.gz
Actually fix the block calculation. I think it works now.syslinux-2.20-pre10
-rw-r--r--extlinux.asm42
1 files changed, 17 insertions, 25 deletions
diff --git a/extlinux.asm b/extlinux.asm
index 2cbbd7ad..a0430e71 100644
--- a/extlinux.asm
+++ b/extlinux.asm
@@ -120,8 +120,6 @@ SuperInfo resd 16 ; DOS superblock expanded
ClustSize resd 1 ; Bytes/cluster ("block")
SecPerClust resd 1 ; Sectors/cluster
ClustMask resd 1 ; Sectors/cluster - 1
-PtrsPerSector1 resd 1 ; Pointers/sector
-PtrsPerSector2 resd 1 ; (Pointers/cluster) * (Pointers/sector)
PtrsPerBlock1 resd 1 ; Pointers/cluster
PtrsPerBlock2 resd 1 ; (Pointers/cluster)^2
DriveNumber resb 1 ; BIOS drive number
@@ -775,12 +773,6 @@ expand_super:
dec eax
mov [ClustMask],eax
- add cl,SECTOR_SHIFT-2 ; 4 bytes/pointer
- mov eax,SECTOR_SIZE/4
- mov [PtrsPerSector1],eax
- shl eax,cl
- mov [PtrsPerSector2],eax
-
shl edx,cl
mov [PtrsPerBlock1],edx
shl edx,cl
@@ -1227,17 +1219,17 @@ linsector:
; with respect to the start of the tind area;
; ebx contains the pointer to the tind block.
xor edx,edx
- div dword [PtrsPerSector2]
+ div dword [PtrsPerBlock2]
; EAX = which dind block, EDX = pointer within dind block
- push eax
- mov ebp,[gs:si+bx]
+ push ax
shr eax,SECTOR_SHIFT-2
+ mov ebp,[gs:si+bx]
shl ebp,cl
add eax,ebp
call getcachesector
- pop eax
- and eax,(SECTOR_SIZE >> 2)-1
- lea ebx,[4*eax]
+ pop bx
+ and bx,(SECTOR_SIZE >> 2)-1
+ shl bx,2
mov eax,edx ; The ind2 code wants the remainder...
.ind2:
@@ -1245,32 +1237,32 @@ linsector:
; with respect to the start of the dind area;
; ebx contains the pointer to the dind block.
xor edx,edx
- div dword [PtrsPerSector1]
+ div dword [PtrsPerBlock1]
; EAX = which ind block, EDX = pointer within ind block
- push eax
- mov ebp,[gs:si+bx]
+ push ax
shr eax,SECTOR_SHIFT-2
+ mov ebp,[gs:si+bx]
shl ebp,cl
add eax,ebp
call getcachesector
- pop eax
- and eax,(SECTOR_SIZE >> 2)-1
- lea ebx,[4*eax]
+ pop bx
+ and bx,(SECTOR_SIZE >> 2)-1
+ shl bx,2
mov eax,edx ; The int1 code wants the remainder...
.ind1:
; Single indirect; eax contains the block no
; with respect to the start of the ind area;
; ebx contains the pointer to the ind block.
- push eax
- mov ebp,[gs:si+bx]
+ push ax
shr eax,SECTOR_SHIFT-2
+ mov ebp,[gs:si+bx]
shl ebp,cl
add eax,ebp
call getcachesector
- pop eax
- and eax,(SECTOR_SIZE >> 2)-1
- lea ebx,[4*eax]
+ pop bx
+ and bx,(SECTOR_SIZE >> 2)-1
+ shl bx,2
.direct:
mov ebx,[gs:bx+si] ; Get the pointer