TempleOSCDV4.08.ISO

This commit is contained in:
Terry A. Davis authored and minexew committed 2018-09-08 21:47:25 +02:00
1 parent b632ab9a4f
commit 2d56cda5f3
258 files changed
+6973 -5476

No files matched your search

+29 -4
View File
@@ -58,7 +58,7 @@ BDVD_NOT64_MSG:
BDVD_BLK_LO:: DU16 0;
BDVD_BLK_HI:: DU16 0;
BDVD_BLK_CNT:: DU16 0;
BDVD_SHIFT_BLKS:: DU16 0;
BDVD_PROGRESS_STEP:: DU32 0;
BDVD_PROGRESS_VAL:: DU32 0;
@@ -150,10 +150,35 @@ BDVD_MAIN::
POP CX
LOOP @@20
//Shift backward to align
PUSH DS
MOV BX,U16 [BDVD_SHIFT_BLKS-BDVD_START]
SHL BX,BLK_SIZE_BITS-4
MOV CX,U16 [BDVD_BLK_CNT-BDVD_START]
MOV AX,BOOT_RAM_BASE/16
MOV ES,AX
ADD AX,BX
MOV DS,AX
@@35: PUSH CX
XOR SI,SI
XOR DI,DI
MOV CX,DVD_BLK_SIZE/4
REP_MOVSD
MOV AX,DS
ADD AX,DVD_BLK_SIZE/16
MOV DS,AX
MOV AX,ES
ADD AX,DVD_BLK_SIZE/16
MOV ES,AX
POP CX
LOOP @@35
POP DS
//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"$
MOV EBX,U32 [BDVD_BLK_LO-BDVD_START]
MOV AX,U16 [BDVD_SHIFT_BLKS-BDVD_START]
SHL EAX,16
MOV AX,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
+2 -1
View File
@@ -86,7 +86,8 @@ BHD_HISTART:
@@10: POP CX
LOOP @@05
MOV EBX,BOOT_SRC_HARDDRV //$MA-X+PU,"See sys_boot_src",LM="Find(\"sys_boot_src\",\"/*\");View;\n"$
XOR EBX,EBX
MOV EAX,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;
+8 -7
View File
@@ -48,7 +48,7 @@ public Bool MakeOSDrvBootInstall(U8 src_drv=0,U8 dst_drv=0)
if (!Drv(src_drv))
throw;
MakeAll;
if ((bd=Let2BlkDev(dst_drv,FALSE)) && (dv=Let2Drv(dst_drv,FALSE)))
if ((dv=Let2Drv(dst_drv,FALSE)) && (bd=dv->bd))
type=bd->type;
else {
type=BDT_ATAPI;
@@ -56,6 +56,7 @@ public Bool MakeOSDrvBootInstall(U8 src_drv=0,U8 dst_drv=0)
}
switch (type) {
case BDT_ATAPI:
case BDT_FILE:
Move("/Kernel/Kernel.BIN.Z",BOOT_DIR_KERNEL_BIN_C);
res=TRUE;
break;
@@ -67,7 +68,7 @@ public Bool MakeOSDrvBootInstall(U8 src_drv=0,U8 dst_drv=0)
else {
Free(de.full_name);
"Modifying partition boot record.\n";
RBlks(dv,&br,dv->base_offset,1);
RBlks(dv,&br,dv->drv_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)
@@ -79,7 +80,7 @@ public Bool MakeOSDrvBootInstall(U8 src_drv=0,U8 dst_drv=0)
#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);
WBlks(dv,&br,dv->drv_offset,1);
res=TRUE;
}
break;
@@ -172,7 +173,7 @@ public Bool MasterBootInstall(U8 drv_let,U8 *drv_lst=NULL)
if (dv->fs_type!=FSt_REDSEA && dv->fs_type!=FSt_FAT32)
PrintErr("File System Not Supported\n");
else {
bd=Let2BlkDev(drv_let);
bd=dv->bd;
if (!FileFind(BOOT_DIR_OLDMBR_BIN_C,,FUF_JUST_FILES))
MasterBootOldRead(drv_let,drv_let);
@@ -190,14 +191,14 @@ public Bool MasterBootInstall(U8 drv_let,U8 *drv_lst=NULL)
ptr=buf;
while (ch=*ptr++) {
if ((p1=Let2Drv(ch,FALSE)) && (bd1=Let2BlkDev(ch,FALSE)) && bd1==bd) {
*_q=p1->base_offset;
if ((p1=Let2Drv(ch,FALSE)) && (bd1=p1->bd) && bd1==bd) {
*_q=p1->drv_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:");
CatPrint(menu_ptr,"\n\rSellection:");
size=BMHD2_END-BMHD2_START;
FileWrite(BOOT_DIR_BOOTMHD2_BIN_C,BMHD2_START,size);
@@ -1,28 +1,14 @@
#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)
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;
@@ -65,7 +51,7 @@ I64 DVDFileCreate2(CFile *out_file,CDirEntry *tempde,
de2->flags=ISO1_ATTR_DIR;
de2->name_len=1;
de2->name=0;
de2->len=de2->len+de2->name_len;
de2->len+=de2->name_len;
de2(U8 *)+=de2->len;
de2->len=sizeof(CISO1DirEntry)-1;
@@ -315,20 +301,7 @@ U0 DVDFillPathTable(CDirEntry *tempde,
}
}
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,
public I64 ISO9660ISO(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.
@@ -338,7 +311,7 @@ public I64 ISOFileCreate(U8 *_filename=NULL,U8 *src_files_find_mask,
*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,
I64 i,j,stage2_blk=(20<<2+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);
@@ -369,13 +342,12 @@ public I64 ISOFileCreate(U8 *_filename=NULL,U8 *src_files_find_mask,
tempc=rootdir->user_data;
tempc->path_entry_num=1;
cur_blk=DVD_FILE_OFFSET>>2;
cur_blk=20<<2>>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);
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);
@@ -394,7 +366,7 @@ public I64 ISOFileCreate(U8 *_filename=NULL,U8 *src_files_find_mask,
if (!out_file)
goto cf_done;
while (cur_blk<DVD_FILE_OFFSET>>2)
while (cur_blk<20<<2>>2)
FWBlks(out_file,zero_buf,cur_blk++<<2,4);
iso_pri->type=ISO1T_PRI_VOL_DESC;
@@ -418,7 +390,7 @@ public I64 ISOFileCreate(U8 *_filename=NULL,U8 *src_files_find_mask,
iso_boot->version=1;
StrCpy(iso_boot(U8 *)+7,"EL TORITO SPECIFICATION");
cur_blk=DVD_FILE_OFFSET>>2;
cur_blk=20<<2>>2;
if (stage2_filename) {
d=iso_boot(U8 *)+0x47;
@@ -511,7 +483,7 @@ public I64 ISOFileCreate(U8 *_filename=NULL,U8 *src_files_find_mask,
"$$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);
20<<2+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);
+186
View File
@@ -0,0 +1,186 @@
#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 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];
};
U0 RedSeaISO9660(U8 *iso_filename,U8 drv_let,I64 stage2_blk=0,I64 stage2_size=0)
{
CDrv *dv=Let2Drv(drv_let);
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);
I64 iso_size=0,i,j;
U32 *d;
CElTorito *et=CAlloc(DVD_BLK_SIZE);
U8 *stage1_buf=CAlloc(DVD_BOOT_LOADER_SIZE),
*zero_buf=CAlloc(DVD_BLK_SIZE);
CFile *out_file=NULL;
if (out_file=FOpen(iso_filename,"wc+")) {
iso_size=FSize(out_file)/DVD_BLK_SIZE;
for (i=0;i<dv->bd->drv_offset;i+=4)
FWBlks(out_file,zero_buf,i,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);
FillU32Palindrome(&iso_pri->vol_space_size,iso_size);
FillU32Palindrome(&iso_pri->root_dir_record,dv->root_cluster);
iso_pri->file_structure_version=1;
StrCpy(iso_pri->publisher_id,"TempleOS RedSea");
MemCpy(iso_sup,iso_pri,DVD_BLK_SIZE);
iso_sup->type=ISO1T_SUPPLEMENTARY_DESC;
iso_boot->type=ISO1T_BOOT_RECORD;
StrCpy(iso_boot->id,"CD001");
iso_boot->version=1;
StrCpy(iso_boot(U8 *)+7,"EL TORITO SPECIFICATION");
FWBlks(out_file,iso_pri,16<<2,4);
iso_term->type=ISO1T_TERMINATOR;
StrCpy(iso_term->id,"CD001");
iso_term->version=1;
if (stage2_blk) {
d=iso_boot(U8 *)+0x47;
*d=20<<2>>2;
FWBlks(out_file,iso_boot,17<<2,4);
FWBlks(out_file,iso_sup,18<<2,4);
FWBlks(out_file,iso_term,19<<2,4);
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=20<<2>>2+1;
FWBlks(out_file,et,20<<2,4);
MemCpy(stage1_buf,BDVD_START,BDVD_END-BDVD_START);
*(BDVD_BLK_LO -BDVD_START+stage1_buf)(U32 *)=stage2_blk>>2;
*(BDVD_BLK_CNT -BDVD_START+stage1_buf)(U16 *)=
(stage2_size+DVD_BLK_SIZE-1)>>(BLK_SIZE_BITS+2);
*(BDVD_SHIFT_BLKS -BDVD_START+stage1_buf)(U16 *)=stage2_blk&3;
if (stage2_blk&3)
*(BDVD_BLK_CNT -BDVD_START+stage1_buf)(U16 *)+=1;
FWBlks(out_file,stage1_buf,
20<<2+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);
}
FClose(out_file);
}
Free(zero_buf);
Free(stage1_buf);
Free(et);
Free(iso_pri);
Free(iso_boot);
Free(iso_sup);
Free(iso_term);
}
I64 RedSeaISOPass1(CDirEntry *tempde)
{
I64 dir_entry_cnt=3+LinkedLstCnt(tempde),res=0;
while (tempde) {
if (tempde->attr & RS_ATTR_DIR) {
if (tempde->sub)
res+=RedSeaISOPass1(tempde->sub);
else
res+=BLK_SIZE; //Empty dir
} else
res+=CeilU64(tempde->size,BLK_SIZE);
tempde=tempde->next;
}
res+=CeilU64(dir_entry_cnt<<6,BLK_SIZE); //Size in bytes
#assert CDIR_SIZE==64
return res;
}
public I64 RedSeaISO(U8 *_iso_filename=NULL,U8 *_src_dir,
U8 *_stage2_filename=NULL)
{//See $LK,"::/Misc/DoDistro.CPP"$. Must be ISO.C
I64 i,res,root_cnt,root_dir_blks,bitmap_blks,bitmap_blks1;
CDirEntry *tempde,de;
U8 buf[STR_LEN],*iso_filename,*src_dir,*stage2_filename;
CDrv *dv=DrvNextFree('M'); //First $LK,"BDT_FILE",A="MN:BDT_FILE"$
CBlkDev *bd=BlkDevNextFree(dv->drv_let,BDT_FILE);
if (!_iso_filename)
_iso_filename=blkdev.dft_iso_filename;
iso_filename=ChgExt(_iso_filename,"ISO.C");
src_dir=DirNameAbs(_src_dir);
if (_stage2_filename) {
stage2_filename=FileNameAbs(_stage2_filename);
*stage2_filename=dv->drv_let;
i=StrLen(src_dir);
if (i!=3) //If not root
i++; //Skip slash
StrCpy(stage2_filename+3,stage2_filename+i);
} else
stage2_filename=NULL;
tempde=FilesFind(src_dir,FUF_RECURSE);
root_cnt=LinkedLstCnt(tempde)+3;
root_dir_blks=CeilU64(root_cnt<<6,BLK_SIZE)>>BLK_SIZE_BITS;
if (res=RedSeaISOPass1(tempde)>>BLK_SIZE_BITS) {
bd->drv_offset=19<<2;
if (stage2_filename) //preboot and bootloader
bd->drv_offset+=(DVD_BLK_SIZE*2+DVD_BOOT_LOADER_SIZE)/BLK_SIZE;
bitmap_blks=1;
do {
bitmap_blks1=bitmap_blks;
bitmap_blks=(res+bitmap_blks+BLK_SIZE<<3-1)/BLK_SIZE<<3;
} while (bitmap_blks!=bitmap_blks1);
bd->max_blk=CeilI64(bd->drv_offset+1+bitmap_blks+res,4);
bd->max_blk--; //Inclusive.
bd->file_dsk_name=AStrNew(iso_filename);
bd->init_root_dir_blks=root_dir_blks;
BlkDevAdd(bd,TRUE,TRUE);
StrPrint(buf,"%C:/",dv->drv_let);
CopyTree(src_dir,buf,TRUE);
if (FileFind(stage2_filename,&de))
RedSeaISO9660(iso_filename,dv->drv_let,de.cluster,de.size);
else
RedSeaISO9660(iso_filename,dv->drv_let);
DrvDel(dv);
BlkDevDel(bd);
}
Free(stage2_filename);
Free(src_dir);
Free(iso_filename);
return res;
}
+2 -1
View File
@@ -3,7 +3,8 @@ Cd(__DIR__);;
#include "BootHD"
#include "BootMHD"
#include "BootMHD2"
#include "DskISOFile"
#include "DskISORedSea"
#include "DskISO9660"
#include "BootIns"
#include "Reboot"
Cd("..");;
+1
View File
@@ -43,6 +43,7 @@ public U0 RAMReboot(U8 *filename)
while (sys_ram_reboot<0x100000);
hi_image->boot_src=BOOT_SRC_RAM;
hi_image->boot_blk=0;
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,