#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 0x00096A00
                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

//The 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 block 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

//The assembler doesn't support 16-bit very well.
                DU8         0xEA;   //JMP xxxx:yyyy
BMHD2_OLD_CS_RIP:
                DU16        0, 0;
BMHD2_END::
//Continues here ::/System/Boot/BootHD.ZC
#assert BMHD2_END - BMHD2_START < MODULE_SIZE
}