#define MODULE_SIZE 1*BLK_SIZE #define BOOT_HIGH_LOC_HD ((BOOT_RAM_LIMIT-\ (BOOT_STK_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_STK_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 //My 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_DRV_NUM: DU8 0; //Gets patched by BootHDIns(). BHD_BLK_CNT:: DU16 0; BHD_DAP: DU8 16,0,1,0; //One blk 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_DRV_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_CNT-BHD_START] @@05: PUSH CX //Blk cnt //READ BLK 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_DRV_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_HARDDRV //See sys_boot_src //My 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.HC BHD_END:: #assert BHD_END-BHD_START<MODULE_SIZE-2 }