#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 }