TempleOSCDV3.11.ISO

This commit is contained in:
Terry A. Davis authored and minexew committed 2018-09-08 21:46:29 +02:00
1 parent f8c05f98f4
commit ed64d7e3b8
549 files changed
+10643 -12855

No files matched your search

+164
View File
@@ -0,0 +1,164 @@
#define DVD_BOOT_LOADER_SIZE DVD_BLK_SIZE*1 //Max DVD_BLK_SIZE*4, I think
#define BOOT_HIGH_LOC_DVD ((BOOT_RAM_LIMIT-\
(BOOT_STK_SIZE+DVD_BOOT_LOADER_SIZE))>>4)
DefinePrint(
"DD_BOOT_HIGH_LOC_DVD","%08X",BOOT_HIGH_LOC_DVD<<4);
DefinePrint(
"DD_BOOT_HIGH_LOC_DVD_END","%08X",BOOT_RAM_LIMIT-1);
asm {
USE16
BDVD_START::
//DL is supposed to have the BIOS drive number
CLD
MOV AX,BOOT_HIGH_LOC_DVD
MOV ES,AX
CLI
MOV SS,AX
MOV SP,BOOT_STK_SIZE+DVD_BOOT_LOADER_SIZE
STI
CALL BDVD_GET_IP
BDVD_GET_IP:
POP BX
SUB BX,BDVD_GET_IP-BDVD_START
SHR BX,4
//This copies this bootloader's code to 0x$TX,"00096600",D="DD_BOOT_HIGH_LOC_DVD"$
MOV AX,CS
ADD AX,BX
MOV DS,AX
MOV CX,DVD_BOOT_LOADER_SIZE
XOR SI,SI
XOR DI,DI
REP_MOVSB
MOV AX,BOOT_HIGH_LOC_DVD
MOV DS,AX
//My assembler doesn't support 16-bit very well.
DU8 0xEA; //JMP BOOT_HIGH_LOC_DVD:BDVD_MAIN
DU16 BDVD_MAIN-BDVD_START,BOOT_HIGH_LOC_DVD;
BDVD_BIOS_DRV_NUM: DU8 0;
BDVD_PAGE: DU8 0;
BDVD_DAP: DU8 16,0,1,0; //One blk at a time
BDVD_DAP_BUF: DU16 0,0;
BDVD_DAP_BLK: DU64 0;
BDVD_TEMPLEOS_MSG:
DU8 "Loading TempleOS",0;
BDVD_NOT64_MSG:
DU8 "TempleOS requires a 64-bit capable processor.\n\r",0;
//These get patched.
BDVD_BLK_LO:: DU16 0;
BDVD_BLK_HI:: DU16 0;
BDVD_BLK_CNT:: DU16 0;
BDVD_PROGRESS_STEP:: DU32 0;
BDVD_PROGRESS_VAL:: DU32 0;
BDVD_PUTCHAR::
MOV AH,0xE
MOV BL,7 //Might be foreground color on some BIOS's
MOV BH,U8 [BDVD_PAGE-BDVD_START]
INT 0x10
BDVD_RET::
RET
BDVD_PUTS::
@@1: LODSB
TEST AL,AL
JZ BDVD_RET
CALL BDVD_PUTCHAR
JMP @@1
BDVD_MAIN::
MOV U8 [BDVD_BIOS_DRV_NUM-BDVD_START],DL //Passed in by BIOS
MOV AH,0xF
INT 0x10
MOV U8 [BDVD_PAGE-BDVD_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,BDVD_NOT64_MSG-BDVD_START
CALL BDVD_PUTS
@@10: JMP @@10
@@15: MOV SI,BDVD_TEMPLEOS_MSG-BDVD_START
CALL BDVD_PUTS
MOV AX,BOOT_RAM_BASE/16
MOV ES,AX
XOR ECX,ECX
MOV CX,U16 [BDVD_BLK_CNT-BDVD_START]
MOV EAX,(80-7-9)*65536 //80 columns
XOR EDX,EDX
DIV ECX
MOV U32 [BDVD_PROGRESS_STEP-BDVD_START],EAX
MOV U32 [BDVD_PROGRESS_VAL-BDVD_START],0
MOV AX,U16 [BDVD_BLK_LO-BDVD_START]
MOV DX,U16 [BDVD_BLK_HI-BDVD_START]
@@20: PUSH CX //Blk cnt
//READ BLK
PUSH AX //Blk lo
PUSH DX //Blk hi
PUSH ES //Buf seg
MOV U16 [BDVD_DAP_BLK-BDVD_START],AX
MOV U16 [BDVD_DAP_BLK+2-BDVD_START],DX
MOV AX,ES
MOV U16 [BDVD_DAP_BUF+2-BDVD_START],AX //ES:0000
MOV SI,BDVD_DAP-BDVD_START //DS:SI=DAP
MOV AH,0x42
MOV DL,U8 [BDVD_BIOS_DRV_NUM-BDVD_START]
INT 0x13
POP AX //ES
ADD AX,DVD_BLK_SIZE/16
MOV ES,AX
POP DX
POP AX
INC AX
JNZ @@25
INC DX
@@25: PUSH AX
MOV BX,U16 [BDVD_PROGRESS_VAL+2-BDVD_START]
MOV EAX,U32 [BDVD_PROGRESS_STEP-BDVD_START]
ADD U32 [BDVD_PROGRESS_VAL-BDVD_START],EAX
CMP U16 [BDVD_PROGRESS_VAL+2-BDVD_START],BX
JE @@30
MOV AL,'.'
CALL BDVD_PUTCHAR
@@30: POP AX
POP CX
LOOP @@20
//See $LK,"BootDVDProve",A="MN:BootDVDProve"$().
MOV EBX,U32 [BDVD_BLK_LO-BDVD_START] //TODO: oops overflow?
SHL EBX,16
MOV BX,BOOT_SRC_DVD //$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"$
BDVD_END::
#assert BDVD_END-BDVD_START<DVD_BOOT_LOADER_SIZE
}
+96
View File
@@ -0,0 +1,96 @@
#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,VGAM_TEXT/16
MOV FS,AX
MOV U32 FS:[0],'B'+GREEN<<12+('2'+GREEN<<12)<<16
MOV AX,BOOT_HIGH_LOC_HD
MOV ES,AX
CLI
MOV SS,AX
MOV SP,BOOT_STK_SIZE+MODULE_SIZE
STI
CALL BHD_GET_IP
BHD_GET_IP:
POP BX
SUB BX,BHD_GET_IP-BHD_START
SHR BX,4
//This copies this bootloader's code to 0x$TX,"00096C00",D="DD_BOOT_HIGH_LOC_HD"$
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 $LK,"MakeOSDrvBootInstall",A="MN:MakeOSDrvBootInstall"$().
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 $LK,"MakeOSDrvBootInstall",A="MN:MakeOSDrvBootInstall"$().
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
MOV EBX,BOOT_SRC_HARDDRV //$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"$
BHD_END::
#assert BHD_END-BHD_START<MODULE_SIZE-2
}
+240
View File
@@ -0,0 +1,240 @@
//See $LK,"Install Documentation",A="FI:::/Doc/Install.TXT"$ or $LK,"Upgrading Documentation",A="FI:::/Doc/Upgrade.TXT"$.
#help_index "Install"
#define KERNEL_BIN_C "Kernel.BIN.C"
#define BOOT_DIR "/0000Boot"
#define BOOT_DIR_KERNEL_BIN_C BOOT_DIR "/0000" KERNEL_BIN_C
//Stage 2 of master boot loader
#define BOOT_DIR_BOOTMHD2_BIN_C BOOT_DIR "/BootMHD2.BIN.C"
//Old master boot record
#define BOOT_DIR_OLDMBR_BIN_C BOOT_DIR "/OldMBR.BIN.C"
public U0 MakeAll()
{//Use $LK,"MakeOSDrvBootInstall",A="MN:MakeOSDrvBootInstall"$. Loader must be patched.
//These 2 modules (and bootloaders at top) are the only AOT
//compiled code in TempleOS. Everything else is JIT.
//You are doing it wrong if you make AOT compiled code.
if (Cmp("/Compiler/Compiler","Compiler",,':'))
throw;
if (Cmp("/Kernel/Kernel","Kernel",,':'))
throw;
}
public Bool MakeOSDrvBootInstall(U8 src_drv=0,U8 dst_drv=0)
{// Does $LK,"MakeAll",A="MN:MakeAll"$and installs new boot-loader.
//Normally, you just supply a src_drv. It will compile
//the code on that drive and update the boot sect.
//If you are making a bootable CD/DVD, you supply a dst_drv.
//See $LK,"::/Misc/DoDistro.CPP"$
//See $LK,"Install Documentation",A="FI:::/Doc/Install.TXT"$
//Study my account examples my technique: $LK,"Cfg Strs",A="FL:::/Demo/AcctExample/TOSCfg.CPP,1"$, $LK,"Update Funs",A="FL:::/Demo/AcctExample/TOSDistro.CPP,1"$
CBlkDev *bd;
CDrv *dv;
CFAT32Boot br;
CDirEntry de;
Bool result=FALSE;
I64 i,type;
try {
if (!src_drv) src_drv=Drv2Let(Fs->cur_dv);
if (!dst_drv) dst_drv=src_drv;
if (!Drv(src_drv))
throw;
MakeAll;
try {
bd=Let2BlkDev(dst_drv);
dv=Let2Drv(dst_drv);
type=bd->type;
} catch {
Fs->catch_except=TRUE;
type=BDT_ATAPI;
PrintWarn("Defaulting to CD/DVD dst.\n");
}
switch (type) {
case BDT_ATAPI:
Move("/Kernel/Kernel.BIN.Z",BOOT_DIR_KERNEL_BIN_C);
result=TRUE;
break;
case BDT_RAM:
case BDT_ATA:
Move("/Kernel/Kernel.BIN.Z","/" KERNEL_BIN_C);
if (!FileFind("/" KERNEL_BIN_C,&de,FUF_JUST_FILES))
"No Kernel.BIN.C\n";
else {
Free(de.full_name);
"Modifying partition boot record.\n";
RBlks(dv,&br,dv->base_offset,1);
br.jump_and_nop[0]=OC_JMP_REL8;
br.jump_and_nop[1]=offset(CFAT32Boot.code)-2;
#assert offset(CFAT32Boot.code)>=offset(CRedSeaBoot.code)
br.jump_and_nop[2]=OC_NOP;
*BHD_BLK_CNT(U16 *)=(de.size+BLK_SIZE-1)>>BLK_SIZE_BITS;
*BHD_DAP_BLK(I64 *)=Cluster2Blk(dv,de.cluster);
for (i=0;i<BHD_END-BHD_CODE;i++)
br.code[i]=BHD_CODE(U8 *)[i];
#assert sizeof(CFAT32Boot.code)>=BHD_END-BHD_CODE
for (;i<sizeof(CFAT32Boot.code);i++)
br.code[i]=0;
WBlks(dv,&br,dv->base_offset,1);
result=TRUE;
}
break;
}
} catch {
PutExcept;
Beep;
}
return result;
}
public U0 MasterBootOldRead(U8 src_drv,U8 dst_drv)
{//Reads MBR from disk drive containing src partition.
//Writes a single blk file to dst BOOT_DIR.
CBlkDev *bd=Let2BlkDev(src_drv);
CDrv *dv;
CMasterBoot mbr;
Drv(dst_drv);
dv=Fs->cur_dv;
if (dv->type!=DVT_REDSEA && dv->type!=DVT_FAT32)
PrintErr("Not RedSea Drv\n");
else {
//Bypass partition bounds-checking
BlkDevLock(bd);
ATAReadBlks(bd,&mbr,0,1);
BlkDevUnlock(bd);
Drv(dst_drv);
MkDir(BOOT_DIR);
FileWrite(BOOT_DIR_OLDMBR_BIN_C,&mbr,BLK_SIZE);
}
}
public U0 MasterBootOldWrite(U8 src_drv,U8 dst_drv)
{//Reads OldMBR from src drive BOOT_DIR.
//writes it to the MBR of the drive with dst partition.
CBlkDev *bd=Let2BlkDev(dst_drv);
CMasterBoot *mbr;
Drv(src_drv);
if (mbr=FileRead(BOOT_DIR_OLDMBR_BIN_C)) {
//Bypass partition bounds-checking
BlkDevLock(bd);
ATAWriteBlks(bd,mbr,0,1);
BlkDevUnlock(bd);
}
Free(mbr);
}
public U0 MasterBootZero(U8 dst_drv)
{//Set MBR of disk with dst partition to zero.
//This is dangerous!!
//The TempleOS partitioner doesn't play well
//with other operating systems at this time and you need
//to do this on a drive partitioned by TempleOS
//if you wish to partition with another operating system.
CBlkDev *bd=Let2BlkDev(dst_drv);
CMasterBoot mbr;
MemSet(&mbr,0,BLK_SIZE);
//Bypass partition bounds-checking
BlkDevLock(bd);
ATAWriteBlks(bd,&mbr,0,1);
BlkDevUnlock(bd);
}
public Bool MasterBootIntall(U8 drv_let,U8 *drv_lst=NULL)
{//Create new MBR on the disk that has drv_let as a partition.
//Puts stage 2 in BOOT_DIR of drv_let.
CBlkDev *bd,*bd1;
CDrv *dv,*p1;
CMasterBoot mbr;
CDirEntry de;
I64 i,j,size,*_q;
U8 *menu_ptr,*ptr,ch,buf[STR_LEN];
Bool result=FALSE;
try {
if (drv_lst)
StrCpy(buf,drv_lst);
else {
j=0;
for (i='A';i<='Z';i++)
buf[j++]=i;
buf[j++]=0;
}
Drv(drv_let);
dv=Fs->cur_dv;
if (dv->type!=DVT_REDSEA && dv->type!=DVT_FAT32)
PrintErr("Not RedSea Drv\n");
else {
bd=Let2BlkDev(drv_let);
if (!FileFind(BOOT_DIR_OLDMBR_BIN_C,,FUF_JUST_FILES))
MasterBootOldRead(drv_let,drv_let);
_q=BMHD2_BLK_ARRAY;
MemSet(_q,0,sizeof(I64)*8);
menu_ptr=BMHD2_BOOT_MSG;
StrPrint(menu_ptr,"\n\r\n\rTempleOS Boot Loader\n\r\n\r");
j=0;
if (FileFind(BOOT_DIR_OLDMBR_BIN_C,&de,FUF_JUST_FILES)) {
Free(de.full_name);
*_q++=Cluster2Blk(dv,de.cluster);
CatPrint(menu_ptr,"0. Old Boot Record\n\r");
j++;
}
ptr=buf;
while (ch=*ptr++) {
try {
p1 =Let2Drv(ch);
bd1=Let2BlkDev(ch);
} catch {
Fs->catch_except=TRUE;
p1 =NULL;
bd1=NULL;
}
if (p1 && bd1==bd) {
*_q=p1->base_offset;
"Drive %C:%16X\n",Drv2Let(p1),*_q;
CatPrint(menu_ptr,"%d. Drive %C\n\r",j++,Drv2Let(p1));
_q++;
}
}
CatPrint(menu_ptr,"\n\rSelection:");
size=BMHD2_END-BMHD2_START;
FileWrite(BOOT_DIR_BOOTMHD2_BIN_C,BMHD2_START,size);
if (!FileFind(BOOT_DIR_BOOTMHD2_BIN_C,&de,FUF_JUST_FILES))
"No Boot Loader Image\n";
else {
Free(de.full_name);
*BMHD_BLK_CNT(U16 *)=(size+BLK_SIZE-1)>>BLK_SIZE_BITS;
*BMHD_DAP_BLK(I64 *)=Cluster2Blk(dv,de.cluster);
//Bypass partition bounds-checking
BlkDevLock(bd);
ATAReadBlks(bd,&mbr,0,1);
for (i=0;i<BMHD_END-BMHD_CODE;i++)
mbr.code[i]=BMHD_CODE(U8 *)[i];
#assert sizeof(CMasterBoot.code)>=BMHD_END-BMHD_CODE
for (;i<sizeof(CMasterBoot.code);i++)
mbr.code[i]=0;
if (!mbr.media_id)
mbr.media_id=RandU32;
mbr.zero=0;
mbr.signature=0xAA55;
ATAWriteBlks(bd,&mbr,0,1);
BlkDevUnlock(bd);
result=TRUE;
}
}
} catch
PutExcept;
return result;
}
+110
View File
@@ -0,0 +1,110 @@
#define MODULE_SIZE 1*BLK_SIZE
#define BOOT_HIGH_LOC_MHD ((BOOT_RAM_LIMIT-\
(BOOT_STK_SIZE+MODULE_SIZE))>>4)
DefinePrint(
"DD_BOOT_HIGH_LOC_MHD","%08X",BOOT_HIGH_LOC_MHD<<4);
asm {
USE16
BMHD_START::
BMHD_CODE::
CLD
MOV AX,BOOT_HIGH_LOC_MHD
CLI
MOV SS,AX
MOV SP,BOOT_STK_SIZE+MODULE_SIZE
STI
PUSHFW
PUSH DS
PUSH ES
PUSH FS
PUSH GS
PUSH ECX
PUSH EBX
PUSH EDX
PUSH EBP
MOV ES,AX
MOV AX,VGAM_TEXT/16
MOV FS,AX
MOV U32 FS:[0],'B'+GREEN<<12+('1'+GREEN<<12)<<16
CALL BMHD_GET_IP
BMHD_GET_IP:
POP BX
SUB BX,BMHD_GET_IP-BMHD_START
MOV CX,BX
SHR BX,4
//This copies this bootloader's code to 0x$TX,"00096C00",D="DD_BOOT_HIGH_LOC_MHD"$
MOV AX,CS
PUSH AX
ADD AX,BX
MOV DS,AX
MOV U16 [BMHD_OLD_CS_IP-BMHD_START],CX
POP U16 [BMHD_OLD_CS_IP+2-BMHD_START]
MOV CX,MODULE_SIZE
XOR SI,SI
XOR DI,DI
REP_MOVSB
MOV AX,BOOT_HIGH_LOC_MHD
MOV DS,AX
//My assembler doesn't support 16-bit very well.
DU8 0xEA; //JMP BOOT_HIGH_LOC_MHD:BMHD_HISTART
DU16 BMHD_HISTART-BMHD_START,BOOT_HIGH_LOC_MHD;
BMHD_BIOS_DRV_NUM: DU8 0;
BMHD_OLD_CS_IP: DU16 0,0;
//Gets patched by $LK,"MakeOSDrvBootInstall",A="MN:MakeOSDrvBootInstall"$().
BMHD_BLK_CNT:: DU16 0;
BMHD_DAP: DU8 16,0,1,0; //One blk at a time
BMHD_DAP_BUF: DU16 0,0;
//Gets patched by $LK,"MakeOSDrvBootInstall",A="MN:MakeOSDrvBootInstall"$().
BMHD_DAP_BLK:: //64-bit
BMHD_DAP_BLK_LO: DU32 0;
BMHD_DAP_BLK_HI: DU32 0;
BMHD_HISTART:
MOV U8 [BMHD_BIOS_DRV_NUM-BMHD_START],DL //Passed in by BIOS
MOV AX,BOOT_RAM_BASE/16
MOV ES,AX
XOR ECX,ECX
MOV CX,U16 [BMHD_BLK_CNT-BMHD_START]
@@05: PUSH CX //Blk cnt
//READ BLK
PUSH ES //Buf seg
MOV AX,ES
MOV U16 [BMHD_DAP_BUF+2-BMHD_START],AX //ES:0000
MOV SI,BMHD_DAP-BMHD_START //DS:SI=DAP
MOV AH,0x42
MOV DL,U8 [BMHD_BIOS_DRV_NUM-BMHD_START]
INT 0x13
POP AX //ES
ADD AX,BLK_SIZE/16
MOV ES,AX
INC U32 [BMHD_DAP_BLK_LO-BMHD_START]
JNZ @@10
INC U32 [BMHD_DAP_BLK_HI-BMHD_START]
@@10: POP CX
LOOP @@05
MOV DL,U8 [BMHD_BIOS_DRV_NUM-BMHD_START]
MOV EBX,U32 [BMHD_OLD_CS_IP-BMHD_START]
//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,"BMHD2_START",A="FF:::/Adam/Opt/Boot/BootMHD2.CPP,BMHD2_START"$
BMHD_END::
#assert BMHD_END-BMHD_START<=440
}
+123
View File
@@ -0,0 +1,123 @@
#define MODULE_SIZE 2*BLK_SIZE
#define BOOT_HIGH_LOC_MHD2 ((BOOT_RAM_LIMIT-\
(BOOT_STK_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_IP-BMHD2_START],EBX
MOV U8 [BMHD2_BIOS_DRV_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
//My 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_MSG::
DU8 256 DUP(0);
BMHD2_BIOS_DRV_NUM: DU8 0;
BMHD2_PAGE: DU8 0;
BMHD2_BLK_ARRAY:: DU64 8 DUP(0);
BMHD2_DAP: DU8 16,0,1,0; //One blk 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_PUTCHAR::
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_PUTCHAR
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_MSG-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_IP-BMHD2_START]
SHR AX,4
ADD AX,U16 [BMHD2_OLD_CS_IP+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_DRV_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
POPFW
//My assembler doesn't support 16-bit very well.
DU8 0xEA; //JMP xxxx:yyyy
BMHD2_OLD_CS_IP:
DU16 0,0;
BMHD2_END::
//Continues here $LK,"::/Adam/Opt/Boot/BootHD.CPP",A="FF:::/Adam/Opt/Boot/BootHD.CPP,START"$
#assert BMHD2_END-BMHD2_START<MODULE_SIZE
}
+534
View File
@@ -0,0 +1,534 @@
#help_index "File/CD DVD"
U0 FillU16Palindrome(CPalindromeU16 *dst,U16 w)
{
dst->big=EndianU16(w);
dst->little=w;
}
U0 FillU32Palindrome(CPalindromeU32 *dst,I64 d)
{
dst->big=EndianU32(d);
dst->little=d;
}
class CCDVDUserData //Create DVD
{
I64 loc,path_entry_num,
short_dir_blks,long_dir_blks;
};
I64 DVDFileCreate2(CFile *out_file,CDirEntry *tempde,
CISO1DirEntry *tempi,CISO1DirEntry *tempi2,
I64 *_cur_blk,
CDirEntry *parent,Bool write,
U8 *stage2_filename,I64 *_stage2_blk)
{
CCDVDUserData *tempc;
CDirEntry *tempde1,*tempde2;
CFile *in_file;
U8 *buf=MAlloc(DVD_BLK_SIZE),*ptr1,*ptr2;
CISO1DirEntry *dir_blk_buf =CAlloc(DVD_BLK_SIZE*128),
*de =dir_blk_buf, *de1,
*dir_blk_buf2=CAlloc(DVD_BLK_SIZE*128),
*de2=dir_blk_buf2,*de12;
I64 i,n;
tempc=parent->user_data;
de->len=sizeof(CISO1DirEntry)-1;
de->ext_attr_len=0;
FillU16Palindrome(&de->vol_seq_num,1);
Date2ISO1(&de->date,tempde->datetime);
de->flags=ISO1_ATTR_DIR;
de->name_len=1;
de->name=0;
de->len+=de->name_len;
de(U8 *)+=de->len;
de->len=sizeof(CISO1DirEntry)-1;
de->ext_attr_len=0;
FillU32Palindrome(&de->loc,tempc->loc);
FillU32Palindrome(&de->size,tempc->short_dir_blks*DVD_BLK_SIZE);
FillU16Palindrome(&de->vol_seq_num,1);
Date2ISO1(&de->date,parent->datetime);
de->flags=ISO1_ATTR_DIR;
de->name_len=1;
de->name=1;
de->len+=de->name_len;
de(U8 *)+=de->len;
de2->len=sizeof(CISO1DirEntry)-1;
de2->ext_attr_len=0;
FillU16Palindrome(&de2->vol_seq_num,1);
Date2ISO1(&de2->date,tempde->datetime);
de2->flags=ISO1_ATTR_DIR;
de2->name_len=1;
de2->name=0;
de2->len=de2->len+de2->name_len;
de2(U8 *)+=de2->len;
de2->len=sizeof(CISO1DirEntry)-1;
de2->ext_attr_len=0;
FillU32Palindrome(&de2->loc,tempc->loc+tempc->short_dir_blks);
FillU32Palindrome(&de2->size,tempc->long_dir_blks*DVD_BLK_SIZE);
FillU16Palindrome(&de2->vol_seq_num,1);
Date2ISO1(&de2->date,parent->datetime);
de2->flags=ISO1_ATTR_DIR;
de2->name_len=1;
de2->name=1;
de2->len+=de2->name_len;
de2(U8 *)+=de2->len;
tempde1=tempde->sub;
while (tempde1) {
tempde2=tempde1->next;
if (!write) tempde1->user_data=CAlloc(sizeof(CCDVDUserData));
de1=de;
de12=de2;
if (tempde1->attr & RS_ATTR_DIR) {
n=DVDFileCreate2(out_file,tempde1,de,de2,_cur_blk,
tempde,write,stage2_filename,_stage2_blk);
de(U8 *)+=sizeof(CISO1DirEntry)-1+n;
de2(U8 *)+=sizeof(CISO1DirEntry)-1+n<<1;
} else {
tempc=tempde1->user_data;
de->len=sizeof(CISO1DirEntry)-1;
de->ext_attr_len=0;
FillU32Palindrome(&de->loc,*_cur_blk);
tempc->loc=*_cur_blk;
if (write) {
if (stage2_filename && !StrCmp(tempde1->full_name,stage2_filename)) {
"$$RED$$!!! Boot Stage 2 !!!$$FG$$\n";
if (_stage2_blk) *_stage2_blk=*_cur_blk;
}
"%X:%s\n",*_cur_blk,tempde1->full_name;
}
FillU32Palindrome(&de->size,tempde1->size);
FillU16Palindrome(&de->vol_seq_num,1);
Date2ISO1(&de->date,tempde1->datetime);
de->flags=0;
de->name_len=StrLen(tempde1->name);
StrCpy(&de->name,tempde1->name);
de->len=de->len+de->name_len;
de(U8 *)+=de->len;
de2->len=sizeof(CISO1DirEntry)-1;
de2->ext_attr_len=0;
FillU32Palindrome(&de2->loc,*_cur_blk);
FillU32Palindrome(&de2->size,tempde1->size);
FillU16Palindrome(&de2->vol_seq_num,1);
Date2ISO1(&de2->date,tempde1->datetime);
de2->flags=0;
de2->name_len=StrLen(tempde1->name)<<1;
ptr1=&de2->name;
ptr2=&tempde1->name;
for (i=0;i<de2->name_len;i=i+2) {
ptr1++;
*ptr1++=*ptr2++;
}
de2->len+=de2->name_len;
de2(U8 *)+=de2->len;
in_file=FOpen(tempde1->full_name,"r");
for (i=0;i<(FSize(in_file)+DVD_BLK_SIZE-1)/DVD_BLK_SIZE;i++) {
n=4;
if ((i+1)<<2>(FSize(in_file)+BLK_SIZE-1)>>BLK_SIZE_BITS) {
n=(FSize(in_file)+BLK_SIZE-1)>>BLK_SIZE_BITS&3;
MemSet(buf,0,DVD_BLK_SIZE);
}
if (write) {
FRBlks(in_file,buf,i<<2,n);
FWBlks(out_file,buf,*_cur_blk<<2,n);
}
*_cur_blk+=1;
}
FClose(in_file);
}
if ((de1(U8 *)-dir_blk_buf(U8 *))/DVD_BLK_SIZE!=
(de(U8 *) -dir_blk_buf(U8 *))/DVD_BLK_SIZE) {
i=de1->len;
MemCpy(buf,de1,i);
MemSet(de1,0,i);
de=dir_blk_buf(U8 *)+(de(U8 *)
-dir_blk_buf(U8 *))/DVD_BLK_SIZE*DVD_BLK_SIZE;
MemCpy(de,buf,i);
de(U8 *)+=i;
}
if ((de12(U8 *)-dir_blk_buf2(U8 *))/DVD_BLK_SIZE!=
(de2(U8 *) -dir_blk_buf2(U8 *))/DVD_BLK_SIZE) {
i=de12->len;
MemCpy(buf,de12,i);
MemSet(de12,0,i);
de2(U8 *)=dir_blk_buf2(U8 *)+(de2(U8 *)
-dir_blk_buf2(U8 *))/DVD_BLK_SIZE*DVD_BLK_SIZE;
MemCpy(de2,buf,i);
de2(U8 *)+=i;
}
tempde1=tempde2;
}
tempc=tempde->user_data;
tempi->len=sizeof(CISO1DirEntry)-1;
tempi->ext_attr_len=0;
tempi->flags=ISO1_ATTR_DIR;
if (!tempde->name[0]) {
tempi->name_len=1;
tempi->name=1;
} else {
tempi->name_len=StrLen(tempde->name);
StrCpy(&tempi->name,tempde->name);
}
tempi->len+=tempi->name_len;
n=de(U8 *)+1-dir_blk_buf(U8 *);
n=(n+DVD_BLK_SIZE-1)/DVD_BLK_SIZE;
FillU32Palindrome(&tempi->size,n*DVD_BLK_SIZE);
FillU32Palindrome(&tempi->loc,*_cur_blk);
tempc->short_dir_blks=n;
tempc->loc=*_cur_blk;
FillU32Palindrome(&dir_blk_buf->size,n*DVD_BLK_SIZE);
FillU32Palindrome(&dir_blk_buf->loc,*_cur_blk);
FillU16Palindrome(&tempi->vol_seq_num,1);
Date2ISO1(&tempi->date,tempde->datetime);
if (write)
"%X:%s\n",*_cur_blk,tempde->full_name;
if (write)
FWBlks(out_file,dir_blk_buf,*_cur_blk<<2,n<<2);
*_cur_blk+=n;
tempi2->len=sizeof(CISO1DirEntry)-1;
tempi2->ext_attr_len=0;
tempi2->flags=ISO1_ATTR_DIR;
if (!tempde->name[0]) {
tempi2->name_len=1;
tempi->name=1;
} else {
tempi2->name_len=StrLen(tempde->name)<<1;
ptr1=&tempi2->name;
ptr2=&tempde->name;
for (i=0;i<tempi2->name_len;i=i+2) {
ptr1++;
*ptr1++=*ptr2++;
}
}
tempi2->len+=tempi2->name_len;
n=de2(U8 *)+1-dir_blk_buf2(U8 *);
n=(n+DVD_BLK_SIZE-1)/DVD_BLK_SIZE;
FillU32Palindrome(&tempi2->size,n*DVD_BLK_SIZE);
FillU32Palindrome(&tempi2->loc,*_cur_blk);
tempc->long_dir_blks=n;
FillU32Palindrome(&dir_blk_buf2->size,n*DVD_BLK_SIZE);
FillU32Palindrome(&dir_blk_buf2->loc,*_cur_blk);
FillU16Palindrome(&tempi2->vol_seq_num,1);
Date2ISO1(&tempi2->date,tempde->datetime);
if (write)
"%X:%s\n",*_cur_blk,tempde->full_name;
if (write)
FWBlks(out_file,dir_blk_buf2,*_cur_blk<<2,n<<2);
*_cur_blk+=n;
Free(dir_blk_buf);
Free(dir_blk_buf2);
Free(buf);
return tempi->name_len;
}
I64 DVDTableLen(CDirEntry *tempde,I64 *size1,I64 *size2,I64 cur_depth)
{//Returns depth
CDirEntry *tempde1=tempde->sub;
I64 max_depth=cur_depth,i;
while (tempde1) {
if (tempde1->attr & RS_ATTR_DIR) {
*size1+=sizeof(CISO1PathEntry)-2+ (StrLen(tempde1->name)+1)&-0x2;
*size2+=sizeof(CISO1PathEntry)-2+StrLen(tempde1->name)<<1;
i=DVDTableLen(tempde1,size1,size2,cur_depth+1);
if (i>max_depth) max_depth=i;
}
tempde1=tempde1->next;
}
return max_depth;
}
U0 DVDFillPathTable(CDirEntry *tempde,
CISO1PathEntry **_itabbuf,CISO1PathEntry **_itabbuf2,
I64 parent_entry_num,Bool big_endian,I64 *first_free,
I64 cur_level,I64 output_level)
{
U8 *ptr1,*ptr2;
I64 i;
CISO1PathEntry *tabbuf=*_itabbuf,*tabbuf2=*_itabbuf2;
CDirEntry *tempde1=tempde->sub,*tempde2;
CCDVDUserData *tempc;
if (cur_level==output_level) {
while (tempde1) {
if (tempde1->attr & RS_ATTR_DIR) {
tempc=tempde1->user_data;
tempc->path_entry_num=*first_free;
tabbuf->name_len=StrLen(tempde1->name);
if (big_endian) {
tabbuf->blk=EndianU32(tempc->loc);
tabbuf->parent_entry_num=EndianU16(parent_entry_num);
} else {
tabbuf->blk=tempc->loc;
tabbuf->parent_entry_num=parent_entry_num;
}
StrCpy(&tabbuf->name,tempde1->name);
tabbuf(U8 *)+=sizeof(CISO1PathEntry)-2+
(StrLen(tempde1->name)+1) & -0x2;
tabbuf2->name_len=StrLen(tempde1->name)<<1;
if (big_endian) {
tabbuf2->blk=EndianU32(tempc->loc+tempc->short_dir_blks);
tabbuf2->parent_entry_num=EndianU16(parent_entry_num);
} else {
tabbuf2->blk=tempc->loc+tempc->short_dir_blks;
tabbuf2->parent_entry_num=parent_entry_num;
}
ptr1=&tabbuf2->name;
ptr2=&tempde1->name;
for (i=0;i<tabbuf2->name_len;i=i+2) {
ptr1++;
*ptr1++=*ptr2++;
}
tabbuf2(U8 *)+=sizeof(CISO1PathEntry)-2+
StrLen(tempde1->name)<<1;
*first_free+=1;
}
tempde1=tempde1->next;
}
*_itabbuf=tabbuf;
*_itabbuf2=tabbuf2;
}
tempde1=tempde->sub;
while (tempde1) {
tempde2=tempde1->next;
if (tempde1->attr & RS_ATTR_DIR) {
tempc=tempde1->user_data;
DVDFillPathTable(tempde1,_itabbuf,_itabbuf2,tempc->path_entry_num,
big_endian,first_free,cur_level+1,output_level);
}
tempde1=tempde2;
}
}
class CElTorito
{
U16 w[16];
U8 bootable; //88=bootable 00=not bootable
U8 media_type; //0=no emulation 4=hard disk
U16 load_seg; //0000->07C0
U8 sys_type;
U8 zero;
U16 sect_cnt;
U32 load_rba; //start addr of virtual disk
U8 zero2[20];
};
public I64 ISOFileCreate(U8 *_filename=NULL,U8 *src_files_find_mask,
U8 *fu_flags=NULL,U8 *_stage2_filename=NULL)
{//See $LK,"::/Misc/DoDistro.CPP"$
//Use "C:/Distro/*" if you want all files in the C:/Distro directory.
//Default flags are "+r" recurse.
CISO1PriDesc *iso_pri=CAlloc(DVD_BLK_SIZE),
*iso_boot=CAlloc(DVD_BLK_SIZE),
*iso_sup=CAlloc(DVD_BLK_SIZE),
*iso_term=CAlloc(DVD_BLK_SIZE);
CDirEntry *rootdir=CAlloc(sizeof(CDirEntry));
I64 i,j,stage2_blk=(DVD_FILE_OFFSET+1<<2+DVD_BOOT_LOADER_SIZE/BLK_SIZE)>>2,
stage2_size,cur_blk=0,tabsize,tabsize2,first_free,max_depth,fuf_flags=0;
U32 *d;
CElTorito *et=CAlloc(DVD_BLK_SIZE);
U8 *filename,*stage2_filename,
*stage1_buf=CAlloc(DVD_BOOT_LOADER_SIZE),
*zero_buf=CAlloc(DVD_BLK_SIZE);
CISO1PathEntry *tabbuf=NULL,*tabbuf2=NULL,*itabbuf,*itabbuf2;
CFile *out_file=NULL;
CISO1DirEntry *tempi;
CCDVDUserData *tempc;
ScanFlags(&fuf_flags,Define("ST_FILE_UTIL_FLAGS"),"+r");
ScanFlags(&fuf_flags,Define("ST_FILE_UTIL_FLAGS"),fu_flags);
if (!_filename)
_filename=blkdev.dft_iso_filename;
filename=DftExt(_filename,"ISO");
if (_stage2_filename)
stage2_filename=FileNameAbs(_stage2_filename);
else
stage2_filename=NULL;
rootdir->attr=RS_ATTR_DIR;
rootdir->sub=FilesFind(src_files_find_mask,fuf_flags);
rootdir->datetime=Now;
rootdir->user_data=CAlloc(sizeof(CCDVDUserData));
tempc=rootdir->user_data;
tempc->path_entry_num=1;
cur_blk=DVD_FILE_OFFSET>>2;
if (stage2_filename) //preboot and bootloader
cur_blk+=1+DVD_BOOT_LOADER_SIZE/DVD_BLK_SIZE;
DVDFileCreate2(out_file,rootdir,
&iso_pri->root_dir_record,
&iso_sup->root_dir_record,
&cur_blk,rootdir,FALSE,stage2_filename,&stage2_blk);
tabsize=sizeof(CISO1PathEntry);
tabsize2=sizeof(CISO1PathEntry);
max_depth=DVDTableLen(rootdir,&tabsize,&tabsize2,1);
FillU32Palindrome(&iso_pri->path_table_size,tabsize);
FillU32Palindrome(&iso_sup->path_table_size,tabsize2);
tabsize=(tabsize+DVD_BLK_SIZE-1)/DVD_BLK_SIZE;
cur_blk+=tabsize<<1;
tabsize2=(tabsize2+DVD_BLK_SIZE-1)/DVD_BLK_SIZE;
cur_blk+=tabsize2<<1;
if (FileAttr(filename) & RS_ATTR_CONTIGUOUS)
out_file=FOpen(filename,"wc",cur_blk<<2);
else
out_file=FOpen(filename,"w",cur_blk<<2);
cur_blk=0;
if (!out_file)
goto cf_done;
while (cur_blk<DVD_FILE_OFFSET>>2)
FWBlks(out_file,zero_buf,cur_blk++<<2,4);
iso_pri->type=ISO1T_PRI_VOL_DESC;
StrCpy(iso_pri->id,"CD001");
iso_pri->version=1;
FillU16Palindrome(&iso_pri->vol_set_size,1);
FillU16Palindrome(&iso_pri->vol_seq_num,1);
FillU16Palindrome(&iso_pri->log_block_size,DVD_BLK_SIZE);
iso_pri->file_structure_version=1;
iso_sup->type=ISO1T_SUPPLEMENTARY_DESC;
StrCpy(iso_sup->id,"CD001");
iso_sup->version=1;
FillU16Palindrome(&iso_sup->vol_set_size,1);
FillU16Palindrome(&iso_sup->vol_seq_num,1);
FillU16Palindrome(&iso_sup->log_block_size,DVD_BLK_SIZE);
iso_sup->file_structure_version=1;
iso_boot->type=ISO1T_BOOT_RECORD;
StrCpy(iso_boot->id,"CD001");
iso_boot->version=1;
StrCpy(iso_boot(U8 *)+7,"EL TORITO SPECIFICATION");
cur_blk=DVD_FILE_OFFSET>>2;
if (stage2_filename) {
d=iso_boot(U8 *)+0x47;
*d=cur_blk;
et->w[0]=1;
StrCpy(&et->w[2],"TempleOS");
et->w[15]=0xAA55;
j=0;
for (i=0;i<16;i++) //Checksum
j+=et->w[i];
et->w[14]=-j;
et->bootable=0x88;
et->media_type=0;//0=no emu 2=1.44meg 4=hard drive
et->sect_cnt=4; //5 seems like the limit, 4 is safer
et->load_rba=cur_blk+1;
"%X: Pre Boot Blk\n",cur_blk;
FWBlks(out_file,et,cur_blk++<<2,4);
"%X: Boot Stage 1\n",cur_blk;
cur_blk+=DVD_BOOT_LOADER_SIZE/DVD_BLK_SIZE;
}
DVDFileCreate2(out_file,rootdir,&iso_pri->root_dir_record,
&iso_sup->root_dir_record,&cur_blk,rootdir,TRUE,
stage2_filename,&stage2_blk);
tabbuf=CAlloc(tabsize*DVD_BLK_SIZE);
iso_pri->type_l_path_table=cur_blk;
tabbuf->name_len=2; //Fill-in adam entry
tempi=&iso_pri->root_dir_record;
tabbuf->blk=tempi->loc.little;
tabbuf->parent_entry_num=1;
tabbuf2=CAlloc(tabsize2*DVD_BLK_SIZE);
iso_sup->type_l_path_table=cur_blk+tabsize;
tabbuf2->name_len=2; //Fill-in adam entry
tempi=&iso_sup->root_dir_record;
tabbuf2->blk=tempi->loc.little;
tabbuf2->parent_entry_num=1;
itabbuf=tabbuf+1;
itabbuf2=tabbuf2+1;
first_free=2;
for (i=1;i<=max_depth;i++)
DVDFillPathTable(rootdir,&itabbuf,&itabbuf2,1,FALSE,&first_free,1,i);
"%X: Path Table 0\n",cur_blk;
FWBlks(out_file,tabbuf,cur_blk<<2,tabsize<<2);
cur_blk+=tabsize;
"%X: Path Table 1\n",cur_blk;
FWBlks(out_file,tabbuf2,cur_blk<<2,tabsize2<<2);
cur_blk+=tabsize2;
MemSet(tabbuf,0,tabsize*DVD_BLK_SIZE);
iso_pri->type_m_path_table=EndianU32(cur_blk);
tabbuf->name_len=2; //Fill-in adam entry
tempi=&iso_pri->root_dir_record;
tabbuf->blk=tempi->loc.big;
tabbuf->parent_entry_num=EndianU16(1);
MemSet(tabbuf2,0,tabsize2*DVD_BLK_SIZE);
iso_sup->type_m_path_table=EndianU32(cur_blk+tabsize);
tabbuf2->name_len=2; //Fill-in adam entry
tempi=&iso_sup->root_dir_record;
tabbuf2->blk=tempi->loc.big;
tabbuf2->parent_entry_num=EndianU16(1);
itabbuf=tabbuf+1;
itabbuf2=tabbuf2+1;
first_free=2;
for (i=1;i<=max_depth;i++)
DVDFillPathTable(rootdir,&itabbuf,&itabbuf2,1,TRUE,&first_free,1,i);
"%X: Path Table 2\n",cur_blk;
FWBlks(out_file,tabbuf,cur_blk<<2,tabsize<<2);
cur_blk+=tabsize;
"%X: Path Table 3\n",cur_blk;
FWBlks(out_file,tabbuf2,cur_blk<<2,tabsize2<<2);
cur_blk+=tabsize2;
DirTreeDel2(rootdir);
FillU32Palindrome(&iso_pri->vol_space_size,cur_blk);
FillU32Palindrome(&iso_sup->vol_space_size,cur_blk);
FWBlks(out_file,iso_pri,16<<2,4);
iso_term->type=ISO1T_TERMINATOR;
StrCpy(iso_term->id,"CD001");
iso_term->version=1;
if (stage2_filename) {
FWBlks(out_file,iso_boot,17<<2,4);
FWBlks(out_file,iso_sup,18<<2,4);
FWBlks(out_file,iso_term,19<<2,4);
stage2_size=(Size(stage2_filename,"+s")+DVD_BLK_SIZE-1)/DVD_BLK_SIZE;
MemCpy(stage1_buf,BDVD_START,BDVD_END-BDVD_START);
*(BDVD_BLK_CNT-BDVD_START+stage1_buf)(U16 *)=stage2_size;
*(BDVD_BLK_LO -BDVD_START+stage1_buf)(U32 *)=stage2_blk;
"$$RED$$!!! Boot Stage 2 !!! %X-%X$$FG$$\n",
stage2_blk,stage2_blk+stage2_size-1;
FWBlks(out_file,stage1_buf,
DVD_FILE_OFFSET+1<<2,DVD_BOOT_LOADER_SIZE/BLK_SIZE);
} else {
FWBlks(out_file,iso_sup,17<<2,4);
FWBlks(out_file,iso_term,18<<2,4);
}
cf_done:
FClose(out_file);
Free(tabbuf);
Free(tabbuf2);
Free(stage2_filename);
Free(filename);
Free(zero_buf);
Free(stage1_buf);
Free(et);
Free(iso_pri);
Free(iso_boot);
Free(iso_sup);
Free(iso_term);
return cur_blk;
}
+9
View File
@@ -0,0 +1,9 @@
Cd(__DIR__);;
#include "BootDVD"
#include "BootHD"
#include "BootMHD"
#include "BootMHD2"
#include "DskISOFile"
#include "BootIns"
#include "Reboot"
Cd("..");;
+58
View File
@@ -0,0 +1,58 @@
#help_index "Call"
asm {
_HI_CALL::
PUSH RBP
MOV RBP,RSP
MOV RAX,U64 16[RBP]
TEST RAX,RAX
JZ @@05
CALL RAX
@@05: POP RBP
RET1 8
//************************************
_HI_MEMCPY::
PUSH RBP
MOV RBP,RSP
PUSH RSI
PUSH RDI
CLD
MOV RDI,U64 SF_ARG1[RBP]
MOV RSI,U64 SF_ARG2[RBP]
MOV RCX,U64 SF_ARG3[RBP]
REP_MOVSB
MOV RAX,RDI
POP RDI
POP RSI
POP RBP
RET1 24
}
_extern _HI_CALL I64 HiCall(U8 *machine_code);
_extern _HI_MEMCPY U8 *HiMemCpy(U8 *dst,U8 *src,I64 cnt);
#help_index "Boot"
public U0 RAMReboot(U8 *filename)
{//Softboot Kernel Bin file. No hardware reset.
I64 size;
CKernel *hi_image,*lo_image=sys_boot_base-sizeof(CBinFile),
reg *sys_ram_reboot;
do if (!(hi_image=FileRead(filename,&size))) return;
while (hi_image<0x100000);
do sys_ram_reboot=MAlloc(SYS_RAM_REBOOT_END-SYS_RAM_REBOOT,Fs->code_heap);
while (sys_ram_reboot<0x100000);
hi_image->boot_src=BOOT_SRC_RAM;
hi_image->boot_patch_table_base=lo_image(U8 *)+hi_image->h.patch_table_offset;
hi_image->sys_run_level =lo_image->sys_run_level&(RLF_VGA|RLF_16BIT);
MemCpy(&hi_image->start,&lo_image->start,
sizeof(CKernel)-offset(CKernel.start));
CLI
if (mp_cnt>1)
MPHalt;
HiMemCpy(sys_ram_reboot,SYS_RAM_REBOOT,SYS_RAM_REBOOT_END-SYS_RAM_REBOOT);
HiMemCpy(lo_image,hi_image,size);
HiCall(sys_ram_reboot);
}