165 lines
3.2 KiB
C++
165 lines
3.2 KiB
C++
#define CD_BOOT_LOADER_SIZE CD_BLK_SIZE*1 //Max CD_BLK_SIZE*4, I think
|
|
#define BOOT_HIGH_LOC_CD ((BOOT_RAM_LIMIT-\
|
|
(BOOT_STK_SIZE+CD_BOOT_LOADER_SIZE))>>4)
|
|
|
|
DefinePrint(
|
|
"DD_BOOT_HIGH_LOC_CD","%08X",BOOT_HIGH_LOC_CD<<4);
|
|
DefinePrint(
|
|
"DD_BOOT_HIGH_LOC_CD_END","%08X",BOOT_RAM_LIMIT-1);
|
|
|
|
asm {
|
|
USE16
|
|
BCD_START::
|
|
//DL is supposed to have the BIOS drive number
|
|
CLD
|
|
MOV AX,BOOT_HIGH_LOC_CD
|
|
MOV ES,AX
|
|
|
|
CLI
|
|
MOV SS,AX
|
|
MOV SP,BOOT_STK_SIZE+CD_BOOT_LOADER_SIZE
|
|
STI
|
|
|
|
CALL BCD_GET_IP
|
|
BCD_GET_IP:
|
|
POP BX
|
|
SUB BX,BCD_GET_IP-BCD_START
|
|
SHR BX,4
|
|
//This copies this bootloader's code to 0x$TX,"00096600",D="DD_BOOT_HIGH_LOC_CD"$
|
|
MOV AX,CS
|
|
ADD AX,BX
|
|
MOV DS,AX
|
|
MOV CX,CD_BOOT_LOADER_SIZE
|
|
XOR SI,SI
|
|
XOR DI,DI
|
|
REP_MOVSB
|
|
|
|
MOV AX,BOOT_HIGH_LOC_CD
|
|
MOV DS,AX
|
|
|
|
//My assembler doesn't support 16-bit very well.
|
|
DU8 0xEA; //JMP BOOT_HIGH_LOC_CD:BCD_MAIN
|
|
DU16 BCD_MAIN-BCD_START,BOOT_HIGH_LOC_CD;
|
|
|
|
BCD_BIOS_DRV_NUM: DU8 0;
|
|
BCD_PAGE: DU8 0;
|
|
|
|
BCD_DAP: DU8 16,0,1,0; //One blk at a time
|
|
BCD_DAP_BUF: DU16 0,0;
|
|
BCD_DAP_BLK: DU64 0;
|
|
|
|
BCD_TEMPLEOS_MSG:
|
|
DU8 "Loading TempleOS",0;
|
|
|
|
BCD_NOT64_MSG:
|
|
DU8 "TempleOS requires a 64-bit capable processor.\n\r",0;
|
|
|
|
//These get patched.
|
|
BCD_BLK_LO:: DU16 0;
|
|
BCD_BLK_HI:: DU16 0;
|
|
BCD_BLK_CNT:: DU16 0;
|
|
|
|
BCD_PROGRESS_STEP:: DU32 0;
|
|
BCD_PROGRESS_VAL:: DU32 0;
|
|
|
|
BCD_PUTCHAR::
|
|
MOV AH,0xE
|
|
MOV BL,7 //Might be foreground color on some BIOS's
|
|
MOV BH,U8 [BCD_PAGE-BCD_START]
|
|
INT 0x10
|
|
BCD_RET::
|
|
RET
|
|
BCD_PUTS::
|
|
@@1: LODSB
|
|
TEST AL,AL
|
|
JZ BCD_RET
|
|
CALL BCD_PUTCHAR
|
|
JMP @@1
|
|
|
|
BCD_MAIN::
|
|
MOV U8 [BCD_BIOS_DRV_NUM-BCD_START],DL //Passed in by BIOS
|
|
|
|
MOV AH,0xF
|
|
INT 0x10
|
|
MOV U8 [BCD_PAGE-BCD_START],BH //video page
|
|
|
|
MOV EAX,0x80000000
|
|
CPUID
|
|
CMP EAX,0x80000001
|
|
JB @@05
|
|
|
|
MOV EAX,0x80000001
|
|
CPUID
|
|
BT EDX,29
|
|
JC @@15
|
|
@@05: MOV SI,BCD_NOT64_MSG-BCD_START
|
|
CALL BCD_PUTS
|
|
@@10: JMP @@10
|
|
|
|
@@15: MOV SI,BCD_TEMPLEOS_MSG-BCD_START
|
|
CALL BCD_PUTS
|
|
|
|
MOV AX,BOOT_RAM_BASE/16
|
|
MOV ES,AX
|
|
XOR ECX,ECX
|
|
MOV CX,U16 [BCD_BLK_CNT-BCD_START]
|
|
|
|
MOV EAX,(80-7-9)*65536 //80 columns
|
|
XOR EDX,EDX
|
|
DIV ECX
|
|
MOV U32 [BCD_PROGRESS_STEP-BCD_START],EAX
|
|
MOV U32 [BCD_PROGRESS_VAL-BCD_START],0
|
|
|
|
MOV AX,U16 [BCD_BLK_LO-BCD_START]
|
|
MOV DX,U16 [BCD_BLK_HI-BCD_START]
|
|
|
|
@@20: PUSH CX //Blk cnt
|
|
|
|
//READ BLK
|
|
PUSH AX //Blk lo
|
|
PUSH DX //Blk hi
|
|
PUSH ES //Buf seg
|
|
MOV U16 [BCD_DAP_BLK-BCD_START],AX
|
|
MOV U16 [BCD_DAP_BLK+2-BCD_START],DX
|
|
MOV AX,ES
|
|
MOV U16 [BCD_DAP_BUF+2-BCD_START],AX //ES:0000
|
|
MOV SI,BCD_DAP-BCD_START //DS:SI=DAP
|
|
MOV AH,0x42
|
|
MOV DL,U8 [BCD_BIOS_DRV_NUM-BCD_START]
|
|
INT 0x13
|
|
|
|
POP AX //ES
|
|
ADD AX,CD_BLK_SIZE/16
|
|
MOV ES,AX
|
|
POP DX
|
|
POP AX
|
|
INC AX
|
|
JNZ @@25
|
|
INC DX
|
|
|
|
@@25: PUSH AX
|
|
MOV BX,U16 [BCD_PROGRESS_VAL+2-BCD_START]
|
|
MOV EAX,U32 [BCD_PROGRESS_STEP-BCD_START]
|
|
ADD U32 [BCD_PROGRESS_VAL-BCD_START],EAX
|
|
CMP U16 [BCD_PROGRESS_VAL+2-BCD_START],BX
|
|
JE @@30
|
|
MOV AL,'.'
|
|
CALL BCD_PUTCHAR
|
|
@@30: POP AX
|
|
|
|
POP CX
|
|
LOOP @@20
|
|
|
|
//See $LK,"BootCdProbe",A="MN:BootCdProbe"$().
|
|
MOV EBX,U32 [BCD_BLK_LO-BCD_START] //TODO: oops overflow?
|
|
SHL EBX,16
|
|
MOV BX,BOOT_SRC_CDROM //$MA-X+PU,"See sys_boot_src",LM="Find(\"sys_boot_src\",\"/*\");View;\n"$
|
|
|
|
//My assembler doesn't support 16-bit very well.
|
|
DU8 0xEA; //JMP BOOT_RAM_BASE:0000
|
|
DU16 0,BOOT_RAM_BASE/16;
|
|
//Continues here $LK,"::/Kernel/KStart.CPP",A="FL:::/Kernel/KStart.CPP,1"$
|
|
BCD_END::
|
|
#assert BCD_END-BCD_START<CD_BOOT_LOADER_SIZE
|
|
}
|