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


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.


I found the answer:

    C = LBA ÷ (HPC × SPT)
    H = (LBA ÷ SPT) mod HPC
    S = (LBA mod SPT) + 1

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.