ZealOS/src/Misc/Auto/BootMHD2.CC
2021-10-31 20:04:05 -04:00

122 lines
2.9 KiB
HolyC
Executable file
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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
//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
MOV AL, '1' // go directly to C:/
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 $LK,"::/System/Boot/BootHD.CC",A="FF:::/System/Boot/BootHD.CC,START"$
#assert BMHD2_END - BMHD2_START < MODULE_SIZE
}