#define MODULE_SIZE 		2 * BLK_SIZE
#define BOOT_HIGH_LOC_MHD2	((BOOT_RAM_LIMIT - (BOOT_STACK_SIZE + MODULE_SIZE)) >> 4)

DefinePrint("DD_BOOT_HIGH_LOC_MHD2", "%08X", BOOT_HIGH_LOC_MHD2 << 4);

asm {
USE16
BMHD2_START::
				MOV 		U32 FS:[0], 'B' + 0x2000 + ('2' + 0x2000) << 16

				MOV 		AX, BOOT_HIGH_LOC_MHD2
				MOV 		ES, AX
//This copies this bootloader's code to 0x$TX,"00096A00",D="DD_BOOT_HIGH_LOC_MHD2"$
				MOV 		AX, CS
				MOV 		DS, AX
				MOV 		U32 [BMHD2_OLD_CS_RIP -     BMHD2_START], EBX
				MOV 		U8  [BMHD2_BIOS_DRIVE_NUM - BMHD2_START], DL

				MOV 		CX, MODULE_SIZE
				XOR 		SI, SI
				XOR 		DI, DI
				REP_MOVSB

				MOV 		AX, BOOT_HIGH_LOC_MHD2
				MOV 		DS, AX

//My assembler doesn't support 16-bit very well.
				DU8 		0xEA; 	//JMP BOOT_HIGH_LOC_MHD2:BMHD2_HISTART
				DU16		BMHD2_HISTART - BMHD2_START, BOOT_HIGH_LOC_MHD2;

BMHD2_BOOT_MESSAGE::
				DU8 		256 DUP(0);

BMHD2_BIOS_DRIVE_NUM: 	DU8 		0;
BMHD2_PAGE: 			DU8 		0;
BMHD2_BLK_ARRAY:: 		DU64 8 DUP(0);

BMHD2_DAP:				DU8 		16, 0, 1, 0; //One blk at a time
BMHD2_DAP_BUF:			DU16		0, 0;
BMHD2_DAP_BLK:: //64-bit
BMHD2_DAP_BLK_LO: 		DU32		0;
BMHD2_DAP_BLK_HI: 		DU32		0;

BMHD2_PUT_CHAR::
				MOV 		AH, 0xE
				MOV 		BL, 7 //Might be foreground color on some BIOS's
				MOV 		BH, U8 [BMHD2_PAGE - BMHD2_START]
				INT 		0x10
BMHD2_RET::
				RET
BMHD2_PUTS::
@@1:			LODSB
				TEST		AL, AL
				JZ			BMHD2_RET
				CALL		BMHD2_PUT_CHAR
				JMP 		@@1

BMHD2_GETCHAR:
				XOR 		AH, AH
				INT 		0x16
				PUSH		AX
				MOV 		AH, 0x0E
				MOV 		BX, 0x07
				INT 		0x10
				POP 		AX
				RET

BMHD2_HISTART:
				MOV 		AH, 0xF
				INT 		0x10
				MOV 		U8 [BMHD2_PAGE - BMHD2_START], BH //Video page

				MOV 		U32 FS:[0], 0
@@5:			MOV 		SI, BMHD2_BOOT_MESSAGE - BMHD2_START
				CALL		BMHD2_PUTS
				CALL		BMHD2_GETCHAR
				CMP 		AL, '0'
				JB			@@5
				CMP 		AL, '8'
				JAE 		@@5
				AND 		EAX, 7

				MOV 		EBX, U32 BMHD2_BLK_ARRAY -     BMHD2_START[EAX * 8]
				MOV 		EAX, U32 BMHD2_BLK_ARRAY + 4 - BMHD2_START[EAX * 8]

				TEST		EBX, EBX
				JNZ 		@@10
				TEST		EAX, EAX
				JZ			@@5

@@10:			MOV 		U32 [BMHD2_DAP_BLK_LO - BMHD2_START], EBX
				MOV 		U32 [BMHD2_DAP_BLK_HI - BMHD2_START], EAX

				MOV 		AX, U16 [BMHD2_OLD_CS_RIP - BMHD2_START]
				SHR 		AX, 4
				ADD 		AX, U16 [BMHD2_OLD_CS_RIP + 2 - BMHD2_START]
				MOV 		U16 [BMHD2_DAP_BUF + 2 - BMHD2_START], AX //ES:0000
				MOV 		SI, BMHD2_DAP - BMHD2_START //DS:SI=DAP
				MOV 		DL, U8 [BMHD2_BIOS_DRIVE_NUM - BMHD2_START]
				MOV 		AH, 0x42
				INT 		0x13

				POP 		EBP
				POP 		EDX
				POP 		EBX
				POP 		ECX
				XOR 		EAX, EAX
				POP 		GS
				POP 		FS
				POP 		ES
				POP 		DS
				POPF

//My assembler doesn't support 16-bit very well.
				DU8 		0xEA; 	//JMP xxxx:yyyy
BMHD2_OLD_CS_RIP:
				DU16		0, 0;
BMHD2_END::
//Continues here $LK,"::/Zenith/Boot/BootHD.CC",A="FF:::/Zenith/Boot/BootHD.CC,START"$
#assert BMHD2_END - BMHD2_START < MODULE_SIZE
}
