diff options
author | hpa <hpa> | 2004-12-20 20:20:09 +0000 |
---|---|---|
committer | hpa <hpa> | 2004-12-20 20:20:09 +0000 |
commit | b7b0e1ee7684e42dddc7ecfe699f6ef47b380363 (patch) | |
tree | 54512388de04c60d45e6dc1f6ec59ae231b97336 | |
parent | 6437a33203d4072bccee01d84778c2930dbea6e8 (diff) | |
download | syslinux-b7b0e1ee7684e42dddc7ecfe699f6ef47b380363.tar.gz |
Actually fix the block calculation. I think it works now.syslinux-2.20-pre10
-rw-r--r-- | extlinux.asm | 42 |
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 |