0
I'm writing a bootsector, and for it I want to access a particular logical block address on a floppy disk. I have all the parameters of the disk, such as total sectors, sectors per track, head count, etc. And I know the formula to go from CHS to LBA, but I'm in need of a formula to calculate the Cylinder, Head, and Sector from a given LBA address.
I actually found such a function in the MikeOS source code:
l2hts: ; Calculate head, track and sector settings for int 13h
; IN: logical sector in AX, OUT: correct registers for int 13h
push bx
push ax
mov bx, ax ; Save logical sector
mov dx, 0 ; First the sector
div word [SectorsPerTrack]
add dl, 01h ; Physical sectors start at 1
mov cl, dl ; Sectors belong in CL for int 13h
mov ax, bx
mov dx, 0 ; Now calculate the head
div word [SectorsPerTrack]
mov dx, 0
div word [Sides]
mov dh, dl ; Head/side
mov ch, al ; Track
pop ax
pop bx
mov dl, byte [bootdev] ; Set correct device
ret
But I can't work out how this works. Take the Sector for example, from what I can work out the formula for the Sector here is (logical sector % sectors per track) + 1
. Is this correct? It doesn't make much sense to me, for some reason. Perhaps I just don't fully understand how logical sectors are layed out.
1
Some info: https://en.wikipedia.org/wiki/Cylinder-head-sector
– oldfred – 2019-11-08T18:00:11.213