#define MODULE_SIZE         1 * BLK_SIZE
#define BOOT_HIGH_LOC_HD    ((BOOT_RAM_LIMIT - (BOOT_STACK_SIZE + MODULE_SIZE)) >> 4)

DefinePrint("DD_BOOT_HIGH_LOC_HD", "%08X", BOOT_HIGH_LOC_HD << 4);

asm {
USE16
BHD_CODE::

#define BHD_START   (BHD_CODE - offset(CFAT32Boot.code))

                CLD

                MOV         AX, BOOT_HIGH_LOC_HD
                MOV         ES, AX

                CLI
                MOV         SS, AX
                MOV         SP, BOOT_STACK_SIZE + MODULE_SIZE
                STI

                CALL        BHD_GET_RIP
BHD_GET_RIP:
                POP         BX
                SUB         BX, BHD_GET_RIP - BHD_START
                SHR         BX, 4
//This copies this bootloader's code to 0x00096C00
                MOV         AX, CS
                ADD         AX, BX
                MOV         DS, AX
                MOV         CX, MODULE_SIZE
                XOR         SI, SI
                XOR         DI, DI
                REP_MOVSB

                MOV         AX, BOOT_HIGH_LOC_HD
                MOV         DS, AX

//The assembler doesn't support 16-bit very well.
                DU8         0xEA;   //JMP BOOT_HIGH_LOC_HD:BHD_HISTART
                DU16        BHD_HISTART - BHD_START, BOOT_HIGH_LOC_HD;

BHD_BIOS_DRIVE_NUM: DU8 0;

//Gets patched by BootHDIns().
BHD_BLK_COUNT:: DU16        0;

BHD_DAP:        DU8         16, 0, 1, 0; //One block at a time
BHD_DAP_BUF:    DU16        0, 0;
//Gets patched by BootHDIns().
BHD_DAP_BLK::   //64-bit
BHD_DAP_BLK_LO: DU32        0;
BHD_DAP_BLK_HI: DU32        0;

BHD_HISTART:
                MOV         U8 [BHD_BIOS_DRIVE_NUM - BHD_START], DL //Passed in by BIOS
                MOV         AX,  BOOT_RAM_BASE / 16
                MOV         ES,  AX
                XOR         ECX, ECX
                MOV         CX,  U16 [BHD_BLK_COUNT - BHD_START]

@@05:           PUSH        CX          //Block count

//READ BLOCK
                PUSH        ES          //Buf seg
                MOV         AX, ES
                MOV         U16 [BHD_DAP_BUF + 2 - BHD_START], AX //ES:0000
                MOV         SI, BHD_DAP - BHD_START //DS:SI=DAP
                MOV         AH, 0x42
                MOV         DL, U8 [BHD_BIOS_DRIVE_NUM - BHD_START]
                INT         0x13

                POP         AX          //ES
                ADD         AX, BLK_SIZE / 16
                MOV         ES, AX
                INC         U32 [BHD_DAP_BLK_LO - BHD_START]
                JNZ         @@10
                INC         U32 [BHD_DAP_BLK_HI - BHD_START]

@@10:           POP         CX
                LOOP        @@05

                XOR         EBX, EBX
                MOV         EAX, BOOT_SRC_HARDDRIVE //See sys_boot_src
//The assembler doesn't support 16-bit very well.
                DU8         0xEA;   //JMP BOOT_RAM_BASE:0000
                DU16        0, BOOT_RAM_BASE / 16;
//Continues here ::/Kernel/KStart16.ZC
BHD_END::
#assert BHD_END - BHD_START < MODULE_SIZE - 2
}