; Project name : XTIDE Universal BIOS ; Description : Functions for address translations. ; Section containing code SECTION .text ;--------------------------------------------------------------------- ; Address_ExtractLCHSparametersFromOldInt13hAddress ; Parameters: ; CH: Cylinder number, bits 7...0 ; CL: Bits 7...6: Cylinder number bits 9 and 8 ; Bits 5...0: Sector number ; DH: Head number ; Returns: ; BL: Sector number (1...63) ; BH: Head number (0...255) ; CX: Cylinder number (0...1023) ; Corrupts registers: ; Nothing ;-------------------------------------------------------------------- ALIGN JUMP_ALIGN Address_ExtractLCHSparametersFromOldInt13hAddress: mov bl, cl ; Copy sector number... and bl, 3Fh ; ...and limit to 1...63 sub cl, bl ; Remove from cylinder number high eROL_IM cl, 2 ; High bits to beginning mov bh, dh ; Copy Head number xchg cl, ch ; Cylinder number now in CX ret ;--------------------------------------------------------------------- ; Converts LCHS parameters to IDE P-CHS parameters. ; PCylinder = (LCylinder << n) + (LHead / PHeadCount) ; PHead = LHead % PHeadCount ; PSector = LSector ; ; Address_ConvertLCHStoPCHS: ; Parameters: ; BL: Sector number (1...63) ; BH: Head number (0...255) ; CX: Cylinder number (0...1023) ; DS:DI: Ptr to Disk Parameter Table ; Returns: ; BL: Sector number (1...63) ; BH: Head number (0...15) ; CX: Cylinder number (0...16382) ; Corrupts registers: ; AX, DX ;-------------------------------------------------------------------- ALIGN JUMP_ALIGN ConvertLCHStoPCHS: ; LHead / PHeadCount and LHead % PHeadCount eMOVZX ax, bh ; Copy L-CHS Head number to AX div BYTE [di+DPT.bPchsHeads]; AL = LHead / PHeadCount, AH = LHead % PHeadCount mov bh, ah ; Copy P-CHS Head number to BH xor ah, ah ; AX = LHead / PHeadCount ; (LCylinder << n) + (LHead / PHeadCount) mov dx, cx ; Copy L-CHS Cylinder number to DX mov cl, [di+DPT.bFlagsLow] ; Load shift count and cl, MASKL_DPT_CHS_SHIFT_COUNT shl dx, cl ; DX = LCylinder << n add ax, dx ; AX = P-CHS Cylinder number xchg cx, ax ; Move P-CHS Cylinder number to CX DoNotConvertLCHS: ret ;-------------------------------------------------------------------- ; Address_OldInt13hAddressToIdeAddress ; Parameters: ; CH: Cylinder number, bits 7...0 ; CL: Bits 7...6: Cylinder number bits 9 and 8 ; Bits 5...0: Starting sector number (1...63) ; DH: Starting head number (0...255) ; DS:DI: Ptr to DPT ; Returns: ; BL: LBA Low Register / Sector Number Register (LBA 7...0) ; CL: LBA Mid Register / Low Cylinder Register (LBA 15...8) ; CH: LBA High Register / High Cylinder Register (LBA 23...16) ; BH: Drive and Head Register (LBA 27...24) ; Corrupts registers: ; AX, DX ;-------------------------------------------------------------------- ALIGN JUMP_ALIGN Address_OldInt13hAddressToIdeAddress: call Address_ExtractLCHSparametersFromOldInt13hAddress AccessDPT_GetUnshiftedAddressModeToALZF ;;; 0: ADDR_DPT_LCHS jz DoNotConvertLCHS ;;; 1: ADDR_DPT_PCHS ; ; Since we are only checking for zero, we can do our math in the high order bits, ; in this case effectively subtracting 1 from the address mode. ; sub al,(1<