mirror of
https://github.com/Zeal-Operating-System/ZealOS.git
synced 2025-04-27 22:10:11 +01:00
122 lines
2.9 KiB
HolyC
Executable file
122 lines
2.9 KiB
HolyC
Executable file
#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
|
||
}
|