Index: /trunk/XTIDE_Universal_BIOS/Inc/CustomDPT.inc
===================================================================
--- /trunk/XTIDE_Universal_BIOS/Inc/CustomDPT.inc	(revision 172)
+++ /trunk/XTIDE_Universal_BIOS/Inc/CustomDPT.inc	(revision 173)
@@ -6,5 +6,5 @@
 
 ; Base DPT for all device types
-struc DPT	; 8 bytes
+struc DPT	; 10 bytes
 	; General Disk Parameter Table related
 	.wFlags:
@@ -12,17 +12,15 @@
 	.bFlagsHigh					resb	1
 	.bIdevarsOffset				resb	1	; Offset to IDEVARS for this drive
-
-	; L-CHS to P-CHS and L-CHS to LBA28 conversion related
-	.bLchsHeads					resb	1	; Number of L-CHS Heads (1...255)
+								resb	1
 
 	; IDE Drive related
-	.wPchsCylinders				resb	2	; Number of P-CHS (IDE) Cylinders (1...16383)
-	.wPchsHeadsAndSectors:
-	.bPchsHeads					resb	1	; Number of P-CHS (IDE) Heads (1...16)
-	.bPchsSectors				resb	1	; Number of P-CHS (IDE) Sectors per Track (1...63)
+	.dwCylinders				resb	4	; Number of Cylinders
+	.wHeadsAndSectors:
+	.bHeads						resb	1	; Number of Heads (1...255)
+	.bSectors					resb	1	; Number of Sectors per Track (1...63)
 endstruc
 
 ; DPT for ATA devices
-struc DPT_ATA	; 8 + 2 bytes = 10 bytes
+struc DPT_ATA	; 10 + 2 bytes = 12 bytes
 	.dpt						resb	DPT_size
 
@@ -61,4 +59,9 @@
 ADDRESSING_MODE_LBA48			EQU		3	; 48-bit LBA Addressing Mode
 
+; Number of Sectors per Track is fixed to 63 for LBA assist calculation.
+; 1024 cylinders, 256 heads, 63 sectors = 8.4 GB limit (but DOS does not support more than 255 heads)
+MAX_LCHS_CYLINDERS				EQU		1024
+LBA_ASSIST_SPT					EQU		63
+
 
 %endif ; CUSTOMDPT_INC
Index: /trunk/XTIDE_Universal_BIOS/Src/Handlers/Int13h/AH8h_HParams.asm
===================================================================
--- /trunk/XTIDE_Universal_BIOS/Src/Handlers/Int13h/AH8h_HParams.asm	(revision 172)
+++ /trunk/XTIDE_Universal_BIOS/Src/Handlers/Int13h/AH8h_HParams.asm	(revision 173)
@@ -58,5 +58,5 @@
 ALIGN JUMP_ALIGN
 AH8h_GetDriveParameters:
-	call	AccessDPT_GetLCHSfromPCHS	; AX=sectors, BX=cylinders, DX=heads
+	call	AccessDPT_GetLCHS		; AX=sectors, BX=cylinders, DX=heads
 	; Fall to .PackReturnValues
 
Index: /trunk/XTIDE_Universal_BIOS/Src/Handlers/Int13h/AH9h_HInit.asm
===================================================================
--- /trunk/XTIDE_Universal_BIOS/Src/Handlers/Int13h/AH9h_HInit.asm	(revision 172)
+++ /trunk/XTIDE_Universal_BIOS/Src/Handlers/Int13h/AH9h_HInit.asm	(revision 173)
@@ -94,7 +94,7 @@
 
 	; Initialize Logical Sectors per Track and Max Head number
-	mov		ah, [di+DPT.bPchsHeads]
+	mov		ah, [di+DPT.bHeads]
 	dec		ah							; Max Head number
-	mov		dl, [di+DPT.bPchsSectors]	; Sectors per Track
+	mov		dl, [di+DPT.bSectors]		; Sectors per Track
 	mov		al, COMMAND_INITIALIZE_DEVICE_PARAMETERS
 	mov		bx, TIMEOUT_AND_STATUS_TO_WAIT(TIMEOUT_BSY, FLG_STATUS_BSY)
Index: /trunk/XTIDE_Universal_BIOS/Src/Handlers/Int13h/Tools/Address.asm
===================================================================
--- /trunk/XTIDE_Universal_BIOS/Src/Handlers/Int13h/Tools/Address.asm	(revision 172)
+++ /trunk/XTIDE_Universal_BIOS/Src/Handlers/Int13h/Tools/Address.asm	(revision 173)
@@ -83,5 +83,5 @@
 	; 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
+	div		BYTE [di+DPT.bHeads]	; AL = LHead / PHeadCount, AH = LHead % PHeadCount
 	mov		bh, ah					; Copy P-CHS Head number to BH
 	xor		ah, ah					; AX = LHead / PHeadCount
@@ -124,5 +124,5 @@
 	; cylToSeek*headsPerCyl (18-bit result)
 	mov		ax, cx					; Copy Cylinder number to AX
-	eMOVZX	dx, BYTE [di+DPT.bLchsHeads]
+	eMOVZX	dx, BYTE [di+DPT.bHeads]
 	mul		dx						; DX:AX = cylToSeek*headsPerCyl
 
@@ -133,5 +133,5 @@
 
 	; *=sectPerTrack (18-bit by 6-bit multiplication with 24-bit result)
-	eMOVZX	cx, BYTE [di+DPT.bPchsSectors]	; Load Sectors per Track
+	mov		cx, LBA_ASSIST_SPT		; Load Sectors per Track
 	xchg	ax, dx					; Hiword to AX, loword to DX
 	mul		cl						; AX = hiword * Sectors per Track
Index: /trunk/XTIDE_Universal_BIOS/Src/Initialization/AtaID.asm
===================================================================
--- /trunk/XTIDE_Universal_BIOS/Src/Initialization/AtaID.asm	(revision 172)
+++ /trunk/XTIDE_Universal_BIOS/Src/Initialization/AtaID.asm	(revision 173)
@@ -5,4 +5,91 @@
 ; Section containing code
 SECTION .text
+
+;--------------------------------------------------------------------
+; LBA assist calculation:
+; this is how to fit a big drive into INT13's skimpy size requirements,
+; with a maximum of 8.4G available.
+; 
+; total LBAs (as obtained by words 60+61) 
+; divided by 63 (sectors per track) (save as value A)
+; Sub 1 from A
+; divide A by 1024 + truncate. 
+; == total number of heads to use.
+; add 1
+; this value must be either 16, 32, 64, 128, or 256 (round up)
+; then take the value A above and divide by # of heads
+; to get the # of cylinders to use.  
+;
+;
+; so a LBA28 drive will have 268,435,456 as maximum LBAs
+; 
+; 10000000h / 63   = 410410h (total cylinders or tracks)
+;   410410h / 1024 = 1041h, which is way more than 256 heads, but 256 is max.
+;   410410h / 256  = 4104h cylinders
+;
+; there's a wealth of information at: http://www.mossywell.com/boot-sequence
+; they show a slightly different approach to LBA assist calulations, but
+; the method here provides compatibility with phoenix BIOS
+;
+; we're using the values from 60+61 here because we're topping out at 8.4G
+; anyway, so there's no need to use the 48bit LBA values.
+;
+; AtaID_GetLbaAssistedCHStoAXBLBH:
+;	Parameters:
+;		BX:DX:AX:	Total number of sectors
+;	Returns:
+;		DX:AX:	Number of cylinders
+;		BH:		Number of sectors per track (always 63)
+;		BL:		Number of heads (16, 32, 64, 128 or 255)
+;	Corrupts registers:
+;		CX
+;--------------------------------------------------------------------
+AtaID_GetLbaAssistedCHStoDXAXBLBH:
+	push	bp
+	push	si
+
+	; Value A = Total sector count / 63
+	xor		cx, cx
+	push	cx		; Push zero for bits 48...63
+	push	bx
+	push	dx
+	push	ax						; 64-bit sector count now in stack
+	mov		cl, LBA_ASSIST_SPT
+	mov		bp, sp					; SS:BP now points sector count
+	call	Math_DivQWatSSBPbyCX	; Temporary value A now in stack
+
+	; BX = Number of heads =  A / 1024
+	mov		ax, [bp]
+	mov		dx, [bp+2]
+	mov		bx, [bp+4]
+	call	Size_DivideSizeInBXDXAXby1024andIncrementMagnitudeInCX
+
+	; Heads must be 16, 32, 64, 128 or 256 (round up)
+	mov		bx, 256						; Max number of heads
+	test	dx, dx						; 65536 or more heads?
+	jnz		SHORT .GetNumberOfCylinders
+	mov		cx, 128						; Half BX for rounding up
+.FindMostSignificantBitForHeadSize:
+	cmp		ax, cx
+	jae		SHORT .GetNumberOfCylinders
+	shr		cx, 1
+	shr		bx, 1						; Halve number of heads
+	jmp		SHORT .FindMostSignificantBitForHeadSize
+
+	; DX:AX = Number of cylinders = A / number of heads
+.GetNumberOfCylinders:
+	mov		cx, bx
+	call	Math_DivQWatSSBPbyCX
+	mov		ax, [bp]
+	mov		dx, [bp+2]					; Cylinders now in DX:AX
+
+	; Return LBA assisted CHS
+	add		sp, BYTE 8					; Clean stack
+	sub		bl, bh						; Limit heads to 255
+	mov		bh, LBA_ASSIST_SPT
+	pop		si
+	pop		bp
+	ret
+
 
 ;--------------------------------------------------------------------
@@ -34,10 +121,7 @@
 ;--------------------------------------------------------------------
 AtaID_GetTotalSectorCountToBXDXAXfromAtaInfoInESSI:
-	push	ds
-
-	push	es
-	pop		ds
+	call	Registers_ExchangeDSSIwithESDI	; ATA info now in DSDI
 	xor		bx, bx
-	test	WORD [si+ATA1.wCaps], A1_wCaps_LBA
+	test	BYTE [di+ATA1.wCaps+1], A1_wCaps_LBA>>8
 	jz		SHORT .GetChsSectorCount
 	; Fall to .GetLbaSectorCount
@@ -45,4 +129,6 @@
 ;--------------------------------------------------------------------
 ; .GetLbaSectorCount
+; .GetLba28SectorCount
+; .GetChsSectorCount
 ;	Parameters:
 ;		BX:		Zero
@@ -54,30 +140,20 @@
 ;--------------------------------------------------------------------
 .GetLbaSectorCount:
-	test	WORD [si+ATA6.wSetSup83], A6_wSetSup83_LBA48
+	test	BYTE [di+ATA6.wSetSup83+1], A6_wSetSup83_LBA48>>8
 	jz		SHORT .GetLba28SectorCount
-	mov		ax, [si+ATA6.qwLBACnt]
-	mov		dx, [si+ATA6.qwLBACnt+2]
-	mov		bx, [si+ATA6.qwLBACnt+4]
-	pop		ds
-	ret
+	mov		ax, [di+ATA6.qwLBACnt]
+	mov		dx, [di+ATA6.qwLBACnt+2]
+	mov		bx, [di+ATA6.qwLBACnt+4]
+	jmp		SHORT .ExchangePtrAndReturn
+
 .GetLba28SectorCount:
-	mov		ax, [si+ATA1.dwLBACnt]
-	mov		dx, [si+ATA1.dwLBACnt+2]
-	pop		ds
-	ret
+	mov		ax, [di+ATA1.dwLBACnt]
+	mov		dx, [di+ATA1.dwLBACnt+2]
+	jmp		SHORT .ExchangePtrAndReturn
 
-;--------------------------------------------------------------------
-; .GetChsSectorCount
-;	Parameters:
-;		DS:SI:	Ptr to 512-byte ATA information read from the drive
-;	Returns:
-;		DX:AX:	24-bit sector count
-;	Corrupts registers:
-;		Nothing
-;--------------------------------------------------------------------
 .GetChsSectorCount:
-	mov		al, [si+ATA1.wSPT]		; AL=Sectors per track
-	mul		BYTE [si+ATA1.wHeadCnt]	; AX=Sectors per track * number of heads
-	mul		WORD [si+ATA1.wCylCnt]	; DX:AX=Sectors per track * number of heads * number of cylinders
-	pop		ds
-	ret
+	mov		al, [di+ATA1.wSPT]		; AL=Sectors per track
+	mul		BYTE [di+ATA1.wHeadCnt]	; AX=Sectors per track * number of heads
+	mul		WORD [di+ATA1.wCylCnt]	; DX:AX=Sectors per track * number of heads * number of cylinders
+.ExchangePtrAndReturn:
+	jmp		Registers_ExchangeDSSIwithESDI
Index: /trunk/XTIDE_Universal_BIOS/Src/VariablesAndDPTs/AccessDPT.asm
===================================================================
--- /trunk/XTIDE_Universal_BIOS/Src/VariablesAndDPTs/AccessDPT.asm	(revision 172)
+++ /trunk/XTIDE_Universal_BIOS/Src/VariablesAndDPTs/AccessDPT.asm	(revision 173)
@@ -59,5 +59,5 @@
 
 ;--------------------------------------------------------------------
-; AccessDPT_GetLCHSfromPCHS
+; AccessDPT_GetLCHS
 ;	Parameters:
 ;		DS:DI:	Ptr to Disk Parameter Table
@@ -67,17 +67,53 @@
 ;		DX:		Number of L-CHS heads
 ;	Corrupts registers:
+;		CX
+;--------------------------------------------------------------------
+AccessDPT_GetLCHS:
+	; Load CHS from DPT
+	eMOVZX	ax, BYTE [di+DPT.bSectors]
+	mov		bx, [di+DPT.dwCylinders]
+	cwd
+	mov		dl, [di+DPT.bHeads]
+
+	; Only need to limit sectors for LBA assist
+	test	BYTE [di+DPT.bFlagsLow], FLG_DRVNHEAD_LBA
+	jnz		SHORT .ReturnLbaAssistedLCHS
+
+	; P-CHS to L-CHS translation when necessary
+	jmp		SHORT AccessDPT_ShiftPCHinBXDXtoLCH
+
+.ReturnLbaAssistedLCHS:
+	cmp		WORD [di+DPT.dwCylinders+2], BYTE 0
+	jz		SHORT .LimitCylindersTo1024
+	mov		bx, MAX_LCHS_CYLINDERS
+.LimitCylindersTo1024:
+	MIN_U	bx, MAX_LCHS_CYLINDERS
+	ret
+
+
+;--------------------------------------------------------------------
+; AccessDPT_ShiftPCHinBXDXtoLCH
+;	Parameters:
+;		BX:		P-CHS cylinders (1...16383)
+;		DX:		P-CHS heads (1...16)
+;	Returns:
+;		BX:		Number of L-CHS cylinders (1...1024)
+;		DX:		Number of L-CHS heads (1...255)
+;		CX:		Number of bits shifted
+;	Corrupts registers:
 ;		Nothing
 ;--------------------------------------------------------------------
-ALIGN JUMP_ALIGN
-AccessDPT_GetLCHSfromPCHS:
-	mov		al, [di+DPT.bFlagsLow]
-	and		al, MASKL_DPT_CHS_SHIFT_COUNT	; Load shift count
-	xchg	cx, ax
-	mov		bx, [di+DPT.wPchsCylinders]		; Load P-CHS cylinders
-	shr		bx, cl							; Shift to L-CHS cylinders
-	xchg	cx, ax
-	eMOVZX	ax, BYTE [di+DPT.bPchsSectors]	; Load Sectors per track
-	cwd
-	mov		dl, [di+DPT.bLchsHeads]			; Load L-CHS heads
+AccessDPT_ShiftPCHinBXDXtoLCH:
+	xor		cx, cx
+.ShiftLoop:
+	cmp		bx, MAX_LCHS_CYLINDERS		; Need to shift?
+	jbe		SHORT .LimitHeadsTo255		;  If not, return
+	inc		cx							; Increment shift count
+	shr		bx, 1						; Halve cylinders
+	shl		dx, 1						; Double heads
+	jmp		SHORT .ShiftLoop
+.LimitHeadsTo255:						; DOS does not support drives with 256 heads
+	sub		dl, dh						; BH set only when 256 logical heads
+	xor		dh, dh
 	ret
 
Index: /trunk/XTIDE_Universal_BIOS/Src/VariablesAndDPTs/CreateDPT.asm
===================================================================
--- /trunk/XTIDE_Universal_BIOS/Src/VariablesAndDPTs/CreateDPT.asm	(revision 172)
+++ /trunk/XTIDE_Universal_BIOS/Src/VariablesAndDPTs/CreateDPT.asm	(revision 173)
@@ -63,100 +63,82 @@
 .StoreFlags:
 	mov		[di+DPT.wFlags], ax
-	; Fall to .StorePCHS
-
-;--------------------------------------------------------------------
-; .StorePCHS
-;	Parameters:
-;		BH:		Drive Select byte for Drive and Head Register
-;		DS:DI:	Ptr to Disk Parameter Table
-;		ES:SI:	Ptr to 512-byte ATA information read from the drive
-;		CS:BP:	Ptr to IDEVARS for the controller
-;	Returns:
-;		AX:		P-CHS cylinders
-;		BL:		P-CHS heads
-;		BH:		P-CHS sectors
-;	Corrupts registers:
-;		Nothing
-;--------------------------------------------------------------------
-.StorePCHS:
+	; Fall to .StoreAddressing
+
+;--------------------------------------------------------------------
+; .StoreAddressing
+;	Parameters:
+;		DS:DI:	Ptr to Disk Parameter Table
+;		ES:SI:	Ptr to 512-byte ATA information read from the drive
+;		CS:BP:	Ptr to IDEVARS for the controller
+;	Returns:
+;		DX:AX or AX:	Number of cylinders
+;		BH:				Number of sectors per track
+;		BL:				Number of heads
+;	Corrupts registers:
+;		CX, (DX)
+;--------------------------------------------------------------------
+.StoreAddressing:
+	; Check if CHS defined in ROMVARS
 	mov		al, FLG_DRVPARAMS_USERCHS	; User specified CHS?
 	call	AccessDPT_TestIdeVarsFlagsForMasterOrSlaveDrive
-	jnz		SHORT .GetUserSpecifiedPCHS
+	jnz		SHORT .StoreUserDefinedCHSaddressing
+
+	; Check if LBA supported
 	call	AtaID_GetPCHStoAXBLBHfromAtaInfoInESSI
-	jmp		SHORT .StorePCHStoDPT
-
-.GetUserSpecifiedPCHS:
+	test	BYTE [es:si+ATA1.wCaps+1], A1_wCaps_LBA>>8
+	jz		SHORT .StoreCHSaddressing
+
+	; Check if 48-bit LBA supported
+	test	BYTE [es:si+ATA6.wSetSup83+1], A6_wSetSup83_LBA48>>8
+	jz		SHORT .StoreLBA28addressing
+	or		BYTE [di+DPT.bFlagsLow], ADDRESSING_MODE_LBA48<<ADDRESSING_MODE_FIELD_POSITION
+.StoreLBA28addressing:
+	or		BYTE [di+DPT.bFlagsLow], ADDRESSING_MODE_LBA28<<ADDRESSING_MODE_FIELD_POSITION
+	call	AtaID_GetTotalSectorCountToBXDXAXfromAtaInfoInESSI
+	call	AtaID_GetLbaAssistedCHStoDXAXBLBH
+	jmp		SHORT .StoreChsFromDXAXBX
+
+	; Check if P-CHS to L-CHS translation required
+.StoreUserDefinedCHSaddressing:
 	call	AccessDPT_GetPointerToDRVPARAMStoCSBX
 	mov		ax, [cs:bx+DRVPARAMS.wCylinders]
 	mov		bx, [cs:bx+DRVPARAMS.wHeadsAndSectors]
-
-.StorePCHStoDPT:
-	mov		[di+DPT.wPchsCylinders], ax
-	mov		[di+DPT.wPchsHeadsAndSectors], bx
-	; Fall to .StoreLCHS
-
-;--------------------------------------------------------------------
-; .StoreLCHS
-;	Parameters:
-;		AX:		P-CHS cylinders
-;		BL:		P-CHS heads
-;		DS:DI:	Ptr to Disk Parameter Table
-;		ES:SI:	Ptr to 512-byte ATA information read from the drive
-;		CS:BP:	Ptr to IDEVARS for the controller
-;	Returns:
-;		Nothing
-;	Corrupts registers:
-;		AX, BX, CX
-;--------------------------------------------------------------------
-.StoreLCHS:
-	xor		bh, bh						; BX = P-CHS Heads (1...16)
-	xor		cx, cx
-.ShiftLoop:
-	cmp		ax, 1024					; Need to shift?
-	jbe		SHORT .LimitHeadsTo255		;  If not, return
-	inc		cx							; Increment shift count
-	shr		ax, 1						; Halve cylinders
-	shl		bx, 1						; Double heads
-	jmp		SHORT .ShiftLoop
-
-.LimitHeadsTo255:						; DOS does not support drives with 256 heads
-	rcr		bh, 1						; Set CF if 256 heads
-	sbb		bl, 0						; Decrement to 255 if 256 heads
-	or		[di+DPT.wFlags], cl
-	mov		[di+DPT.bLchsHeads], bl
-	; Fall to .StoreAddressing
-
-;--------------------------------------------------------------------
-; .StoreAddressing
-;	Parameters:
-;		DS:DI:	Ptr to Disk Parameter Table
-;		ES:SI:	Ptr to 512-byte ATA information read from the drive
-;		CS:BP:	Ptr to IDEVARS for the controller
-;	Returns:
-;		Nothing
-;	Corrupts registers:
-;		AX, BX
-;--------------------------------------------------------------------
-.StoreAddressing:
-	; Check if L-CHS addressing should be used
-	cmp		WORD [di+DPT.wPchsCylinders], 1024	; L-CHS possible? (no translation needed)
-	jbe		SHORT .StoreBlockMode				;  If so, nothing needs to be changed
-
-	; Check if P-CHS addressing should be used
-	mov		al, FLG_DRVPARAMS_USERCHS			; User specified CHS?
-	call	AccessDPT_TestIdeVarsFlagsForMasterOrSlaveDrive
-	jnz		SHORT .StorePCHSaddressing
-	test	WORD [es:si+ATA1.wCaps], A2_wCaps_LBA
-	jz		SHORT .StorePCHSaddressing			; Use P-CHS since LBA not supported
-
-	; LBA needs to be used. Check if 48-bit LBA is supported
-	test	WORD [es:si+ATA6.wSetSup83], A6_wSetSup83_LBA48
-	jz		SHORT .StoreLBA28addressing			; Use LBA-28 since LBA-48 not supported
-	or		BYTE [di+DPT.wFlags], ADDRESSING_MODE_LBA48<<ADDRESSING_MODE_FIELD_POSITION
-.StoreLBA28addressing:
-	or		BYTE [di+DPT.wFlags], ADDRESSING_MODE_LBA28<<ADDRESSING_MODE_FIELD_POSITION
-	jmp		SHORT .StoreBlockMode
-.StorePCHSaddressing:
-	or		BYTE [di+DPT.wFlags], ADDRESSING_MODE_PCHS<<ADDRESSING_MODE_FIELD_POSITION
+.StoreCHSaddressing:
+	cmp		ax, MAX_LCHS_CYLINDERS
+	jbe		SHORT .StoreChsFromAXBX		; No translation required
+
+	; We need to get number of bits to shift for translation
+	push	bx
+	push	ax
+	eMOVZX	dx, bl						; Heads now in DX
+	xchg	bx, ax						; Sectors now in BX
+	call	AccessDPT_ShiftPCHinBXDXtoLCH
+	or		cl, ADDRESSING_MODE_PCHS<<ADDRESSING_MODE_FIELD_POSITION
+	or		[di+DPT.bFlagsLow], cl		; Store bits to shift
+	pop		ax
+	pop		bx
+	; Fall to .StoreChsFromAXBX
+
+;--------------------------------------------------------------------
+; .StoreChsFromAXBX
+; .StoreChsFromDXAXBX
+;	Parameters:
+;		DX:AX or AX:	Number of cylinders
+;		BH:		Number of sectors per track
+;		BL:		Number of heads
+;		DS:DI:	Ptr to Disk Parameter Table
+;		ES:SI:	Ptr to 512-byte ATA information read from the drive
+;		CS:BP:	Ptr to IDEVARS for the controller
+;	Returns:
+;		Nothing
+;	Corrupts registers:
+;		DX
+;--------------------------------------------------------------------
+.StoreChsFromAXBX:
+	xor		dx, dx
+.StoreChsFromDXAXBX:
+	mov		[di+DPT.dwCylinders], ax
+	mov		[di+DPT.dwCylinders+2], dx
+	mov		[di+DPT.wHeadsAndSectors], bx
 	; Fall to .StoreBlockMode
 
