mirror of
https://github.com/captain-amygdala/pistorm.git
synced 2026-04-15 16:09:58 +00:00
Some non-working loading of file systems from disk for PiSCSI
This commit is contained in:
@@ -8,6 +8,7 @@
|
||||
#include <endian.h>
|
||||
#include "hunk-reloc.h"
|
||||
#include "piscsi/piscsi-enums.h"
|
||||
#include "piscsi/piscsi.h"
|
||||
|
||||
#ifdef FAKESTORM
|
||||
#define lseek64 lseek
|
||||
@@ -247,3 +248,27 @@ fail:;
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
int load_fs(struct piscsi_fs *fs, char *dosID) {
|
||||
char filename[256];
|
||||
memset(filename, 0x00, 256);
|
||||
sprintf(filename, "./data/fs/%c%c%c.%d", dosID[0], dosID[1], dosID[2], dosID[3]);
|
||||
|
||||
FILE *in = fopen(filename, "rb");
|
||||
if (in == NULL)
|
||||
return -1;
|
||||
|
||||
fseek(in, 0, SEEK_END);
|
||||
uint32_t file_size = ftell(in);
|
||||
fseek(in, 0, SEEK_SET);
|
||||
|
||||
fs->binary_data = malloc(file_size);
|
||||
fread(fs->binary_data, file_size, 1, in);
|
||||
process_hunks(in, &fs->h_info, fs->relocs, 0x0);
|
||||
fs->h_info.byte_size = file_size;
|
||||
fs->h_info.alloc_size = file_size + add_size;
|
||||
|
||||
fclose(in);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
Binary file not shown.
@@ -88,6 +88,8 @@ PiSCSINextFS EQU $80000064
|
||||
PiSCSICopyFS EQU $80000068
|
||||
PiSCSIFSSize EQU $8000006C
|
||||
PiSCSISetFSH EQU $80000070
|
||||
PiSCSILoadFS EQU $80000084
|
||||
PiSCSIGetFSInfo EQU $80000088
|
||||
PiSCSIDbg1 EQU $80001010
|
||||
PiSCSIDbg2 EQU $80001014
|
||||
PiSCSIDbg3 EQU $80001018
|
||||
@@ -303,7 +305,7 @@ NoZ3:
|
||||
|
||||
SkipDriverLoad:
|
||||
move.l #9,PiSCSIDebugMe
|
||||
bra.w LoadFileSystems
|
||||
jsr LoadFileSystems(pc)
|
||||
|
||||
FSLoadExit:
|
||||
lea ExpansionName(pc),a1
|
||||
@@ -318,6 +320,16 @@ PartitionLoop:
|
||||
beq.w EndPartitions ; If the next partition returns 0, there's no additional partitions
|
||||
move.l d0,a0
|
||||
jsr MakeDosNode(a6)
|
||||
;cmp.l #0,PiSCSIGetFSInfo ; This does not work for some reason... not massively surprising...
|
||||
;beq.s SkipLoadFS
|
||||
|
||||
;move.l d0,PiSCSILoadFS ; Attempt to load the file system driver from data/fs
|
||||
;cmp.l #$FFFFFFFF,PiSCSIAddr4
|
||||
;beq SkipLoadFS
|
||||
|
||||
;jsr LoadFileSystems(pc)
|
||||
|
||||
SkipLoadFS:
|
||||
move.l d0,PiSCSISetFSH
|
||||
move.l d0,PiSCSIAddr2 ; Put DeviceNode address in PiSCSIAddr2, because I'm useless
|
||||
move.l d0,a0
|
||||
@@ -340,14 +352,14 @@ PartitionLoop:
|
||||
|
||||
EnqueueNode:
|
||||
exg a6,a4
|
||||
move.l #35,PiSCSIDebugMe
|
||||
move.l #BootNode_SIZEOF,PiSCSIDebugMe
|
||||
move.l #NT_BOOTNODE,PiSCSIDebugMe
|
||||
move.l #LN_TYPE,PiSCSIDebugMe
|
||||
move.l #LN_PRI,PiSCSIDebugMe
|
||||
move.l #LN_NAME,PiSCSIDebugMe
|
||||
move.l #eb_MountList,PiSCSIDebugMe
|
||||
move.l #35,PiSCSIDebugMe
|
||||
;move.l #35,PiSCSIDebugMe
|
||||
;move.l #BootNode_SIZEOF,PiSCSIDebugMe
|
||||
;move.l #NT_BOOTNODE,PiSCSIDebugMe
|
||||
;move.l #LN_TYPE,PiSCSIDebugMe
|
||||
;move.l #LN_PRI,PiSCSIDebugMe
|
||||
;move.l #LN_NAME,PiSCSIDebugMe
|
||||
;move.l #eb_MountList,PiSCSIDebugMe
|
||||
;move.l #35,PiSCSIDebugMe
|
||||
|
||||
move.l #BootNode_SIZEOF,d0
|
||||
move.l #$10001,d1
|
||||
@@ -406,6 +418,7 @@ FSResource: dc.l $0
|
||||
LoadFileSystems:
|
||||
movem.l d0-d7/a0-a6,-(sp) ; Push registers to stack
|
||||
move.l #30,PiSCSIDebugMe
|
||||
movea.l 4,a6
|
||||
ReloadResource:
|
||||
lea FileSysName(pc),a1
|
||||
jsr OpenResource(a6)
|
||||
@@ -432,7 +445,7 @@ ReloadResource:
|
||||
move.l a2,a1
|
||||
jsr -$f6(a6) ; AddTail
|
||||
move.l a2,a0
|
||||
bra.s ReloadResource
|
||||
move.l a0,d0
|
||||
|
||||
FSRExists:
|
||||
move.l d0,PiSCSIAddr2 ; PiSCSIAddr2 is now FileSystem.resource
|
||||
@@ -441,7 +454,6 @@ FSRExists:
|
||||
move.l PiSCSIGetFS,d0
|
||||
cmp.l #0,d0
|
||||
beq.w FSDone
|
||||
move.l d0,d7
|
||||
|
||||
FSNext:
|
||||
move.l #45,PiSCSIDebugMe
|
||||
@@ -468,18 +480,19 @@ NoEntries:
|
||||
move.l #39,PiSCSIDebugMe
|
||||
move.l PiSCSIFSSize,d0
|
||||
move.l #40,PiSCSIDebugMe
|
||||
move.l #0,d1
|
||||
move.l #$10001,d1
|
||||
move.l #41,PiSCSIDebugMe
|
||||
jsr AllocMem(a6)
|
||||
move.l d0,PiSCSIAddr3
|
||||
move.l d0,a0
|
||||
move.l #1,PiSCSICopyFS
|
||||
move.b #NT_RESOURCE,LN_TYPE(a0)
|
||||
|
||||
AlreadyLoaded:
|
||||
move.l #480,PiSCSIDebugMe
|
||||
move.l PiSCSIAddr2,a0
|
||||
move.l #1,PiSCSINextFS
|
||||
move.l PiSCSIGetFS,d0
|
||||
move.l d0,d7
|
||||
cmp.l #0,d0
|
||||
bne.w FSNext
|
||||
|
||||
@@ -487,7 +500,7 @@ FSDone: move.l #37,PiSCSIDebugMe
|
||||
move.l #32,PiSCSIDebugMe ; Couldn't open FileSystem.resource, Kick 1.2/1.3?
|
||||
|
||||
movem.l (sp)+,d0-d7/a0-a6 ; Pop registers from stack
|
||||
bra.w FSLoadExit
|
||||
rts
|
||||
|
||||
FSRes
|
||||
dc.l 0
|
||||
|
||||
@@ -49,6 +49,8 @@ enum piscsi_cmds {
|
||||
PISCSI_CMD_READBYTES = 0x78,
|
||||
PISCSI_CMD_WRITEBYTES = 0x7C,
|
||||
PISCSI_CMD_DRVNUMX = 0x80,
|
||||
PISCSI_CMD_LOADFS = 0x84,
|
||||
PISCSI_CMD_GET_FS_INFO = 0x88,
|
||||
PISCSI_DBG_MSG = 0x1000,
|
||||
PISCSI_DBG_VAL1 = 0x1010,
|
||||
PISCSI_DBG_VAL2 = 0x1014,
|
||||
|
||||
@@ -273,7 +273,7 @@ void piscsi_find_filesystems(struct piscsi_dev *d) {
|
||||
DEBUG("[FSHD] Patchflags: %d Type: %d\n", BE(fhb->fhb_PatchFlags), BE(fhb->fhb_Type));
|
||||
DEBUG("[FSHD] Task: %d Lock: %d\n", BE(fhb->fhb_Task), BE(fhb->fhb_Lock));
|
||||
DEBUG("[FSHD] Handler: %d StackSize: %d\n", BE(fhb->fhb_Handler), BE(fhb->fhb_StackSize));
|
||||
DEBUG("[FSHD] Prio: %d Startup: %d\n", BE(fhb->fhb_Priority), BE(fhb->fhb_Startup));
|
||||
DEBUG("[FSHD] Prio: %d Startup: %d (%.8X)\n", BE(fhb->fhb_Priority), BE(fhb->fhb_Startup), BE(fhb->fhb_Startup));
|
||||
DEBUG("[FSHD] SegListBlocks: %d GlobalVec: %d\n", BE(fhb->fhb_Priority), BE(fhb->fhb_Startup));
|
||||
DEBUG("[FSHD] FileSysName: %s\n", fhb->fhb_FileSysName + 1);
|
||||
#endif
|
||||
@@ -292,6 +292,24 @@ void piscsi_find_filesystems(struct piscsi_dev *d) {
|
||||
filesystems[piscsi_num_fs].FS_ID = fhb->fhb_DosType;
|
||||
filesystems[piscsi_num_fs].fhb = fhb;
|
||||
printf("[FSHD] Loaded and set up file system %d: %c%c%c/%d\n", piscsi_num_fs + 1, dosID[0], dosID[1], dosID[2], dosID[3]);
|
||||
{
|
||||
char fs_save_filename[256];
|
||||
memset(fs_save_filename, 0x00, 256);
|
||||
sprintf(fs_save_filename, "./data/fs/%c%c%c.%d", dosID[0], dosID[1], dosID[2], dosID[3]);
|
||||
FILE *save_fs = fopen(fs_save_filename, "rb");
|
||||
if (save_fs == NULL) {
|
||||
save_fs = fopen(fs_save_filename, "wb+");
|
||||
if (save_fs != NULL) {
|
||||
fwrite(filesystems[piscsi_num_fs].binary_data, filesystems[piscsi_num_fs].h_info.byte_size, 1, save_fs);
|
||||
fclose(save_fs);
|
||||
printf("[FSHD] File system %c%c%c/%d saved to fs storage.\n", dosID[0], dosID[1], dosID[2], dosID[3]);
|
||||
} else {
|
||||
printf("[FSHD] Failed to save file system to fs storage. (Permission issues?)\n");
|
||||
}
|
||||
} else {
|
||||
fclose(save_fs);
|
||||
}
|
||||
}
|
||||
piscsi_num_fs++;
|
||||
}
|
||||
|
||||
@@ -522,6 +540,7 @@ void print_piscsi_debug_message(int index) {
|
||||
void piscsi_debugme(uint32_t index) {
|
||||
switch (index) {
|
||||
DEBUGME_SIMPLE(1, "[PISCSI-DEBUGME] Arrived at DiagEntry.\n");
|
||||
DEBUGME_SIMPLE(2, "[PISCSI-DEBUGME] Arrived at BootEntry, for some reason.\n");
|
||||
DEBUGME_SIMPLE(3, "[PISCSI-DEBUGME] Init: Interrupt disable.\n");
|
||||
DEBUGME_SIMPLE(4, "[PISCSI-DEBUGME] Init: Copy/reloc driver.\n");
|
||||
DEBUGME_SIMPLE(5, "[PISCSI-DEBUGME] Init: InitResident.\n");
|
||||
@@ -531,7 +550,10 @@ void piscsi_debugme(uint32_t index) {
|
||||
DEBUGME_SIMPLE(10, "[PISCSI-DEBUGME] Init: AllocMem for resident.\n");
|
||||
DEBUGME_SIMPLE(11, "[PISCSI-DEBUGME] Init: Checking if resident is loaded.\n");
|
||||
DEBUGME_SIMPLE(22, "[PISCSI-DEBUGME] Arrived at BootEntry.\n");
|
||||
DEBUGME_SIMPLE(30, "[PISCSI-DEBUGME] LoadFileSystems: Opening FileSystem.resource.\n");
|
||||
case 30:
|
||||
DEBUG("[PISCSI-DEBUGME] LoadFileSystems: Opening FileSystem.resource.\n");
|
||||
rom_cur_fs = 0;
|
||||
break;
|
||||
DEBUGME_SIMPLE(33, "[PISCSI-DEBUGME] FileSystem.resource not available, creating.\n");
|
||||
case 31:
|
||||
DEBUG("[PISCSI-DEBUGME] OpenResource result: %d\n", piscsi_u32[0]);
|
||||
@@ -539,6 +561,12 @@ void piscsi_debugme(uint32_t index) {
|
||||
case 32:
|
||||
DEBUG("AAAAHH!\n");
|
||||
break;
|
||||
case 35:
|
||||
DEBUG("[PISCSI-DEBUGME] stuff output\n");
|
||||
break;
|
||||
case 36:
|
||||
DEBUG("[PISCSI-DEBUGME] Debug pointers: %.8X %.8X %.8X %.8X\n", piscsi_u32[0], piscsi_u32[1], piscsi_u32[2], piscsi_u32[3]);
|
||||
break;
|
||||
default:
|
||||
DEBUG("[!!!PISCSI-DEBUGME] No debugme message for index %d!\n", index);
|
||||
break;
|
||||
@@ -765,7 +793,6 @@ skip_disk:;
|
||||
r = get_mapped_item_by_address(cfg, piscsi_u32[2]);
|
||||
if (r != -1) {
|
||||
uint32_t addr = piscsi_u32[2] - cfg->map_offset[r];
|
||||
memset(cfg->map_data[r] + addr, 0x00, filesystems[rom_cur_fs].h_info.alloc_size);
|
||||
memcpy(cfg->map_data[r] + addr, filesystems[rom_cur_fs].binary_data, filesystems[rom_cur_fs].h_info.byte_size);
|
||||
filesystems[rom_cur_fs].h_info.base_offset = piscsi_u32[2];
|
||||
reloc_hunks(filesystems[rom_cur_fs].relocs, cfg->map_data[r] + addr, &filesystems[rom_cur_fs].h_info);
|
||||
@@ -780,27 +807,49 @@ skip_disk:;
|
||||
uint32_t addr = val - cfg->map_offset[r];
|
||||
struct DeviceNode *node = (struct DeviceNode *)(cfg->map_data[r] + addr);
|
||||
char *dosID = (char *)&rom_partition_dostype[rom_cur_partition];
|
||||
#ifdef PISCSI_DEBUG
|
||||
#endif
|
||||
|
||||
DEBUG("[PISCSI] Partition DOSType is %c%c%c/%d\n", dosID[0], dosID[1], dosID[2], dosID[3]);
|
||||
for (i = 0; i < piscsi_num_fs; i++) {
|
||||
if (rom_partition_dostype[rom_cur_partition] == filesystems[i].FS_ID) {
|
||||
node->dn_SegList = htobe32((filesystems[i].handler >> 2));
|
||||
node->dn_SegList = htobe32(((filesystems[i].handler) >> 2));
|
||||
node->dn_GlobalVec = 0xFFFFFFFF;
|
||||
goto fs_found;
|
||||
}
|
||||
}
|
||||
node->dn_GlobalVec = 0xFFFFFFFF;
|
||||
node->dn_SegList = 0;
|
||||
printf("[!!!PISCSI] Found no handler for file system %c%c%c/%d\n", dosID[0], dosID[1], dosID[2], dosID[3]);
|
||||
fs_found:;
|
||||
DEBUG("[FS-HANDLER] Next: %d Type: %.8X\n", BE(node->dn_Next), BE(node->dn_Type));
|
||||
DEBUG("[FS-HANDLER] Task: %d Lock: %d\n", BE(node->dn_Task), BE(node->dn_Lock));
|
||||
DEBUG("[FS-HANDLER] Handler: %d Stacksize: %d\n", BE((uint32_t)node->dn_Handler), BE(node->dn_StackSize));
|
||||
DEBUG("[FS-HANDLER] Priority: %d Startup: %d\n", BE((uint32_t)node->dn_Priority), BE(node->dn_Startup));
|
||||
DEBUG("[FS-HANDLER] Priority: %d Startup: %d (%.8X)\n", BE((uint32_t)node->dn_Priority), BE(node->dn_Startup), BE(node->dn_Startup));
|
||||
DEBUG("[FS-HANDLER] SegList: %.8X GlobalVec: %d\n", BE((uint32_t)node->dn_SegList), BE(node->dn_GlobalVec));
|
||||
DEBUG("[PISCSI] Handler for partition %.8X set to %.8X (%.8X).\n", BE((uint32_t)node->dn_Name), filesystems[i].FS_ID, filesystems[i].handler);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case PISCSI_CMD_LOADFS: {
|
||||
DEBUG("[PISCSI] Attempt to load file system for partition %d from disk.\n", rom_cur_partition);
|
||||
r = get_mapped_item_by_address(cfg, val);
|
||||
if (r != -1) {
|
||||
char *dosID = (char *)&rom_partition_dostype[rom_cur_partition];
|
||||
filesystems[piscsi_num_fs].binary_data = NULL;
|
||||
filesystems[piscsi_num_fs].fhb = NULL;
|
||||
filesystems[piscsi_num_fs].FS_ID = rom_partition_dostype[rom_cur_partition];
|
||||
filesystems[piscsi_num_fs].handler = 0;
|
||||
if (load_fs(&filesystems[piscsi_num_fs], dosID) != -1) {
|
||||
printf("[FSHD-Late] Loaded file system %c%c%c/%d from fs storage.\n", dosID[0], dosID[1], dosID[2], dosID[3]);
|
||||
piscsi_u32[3] = piscsi_num_fs;
|
||||
rom_cur_fs = piscsi_num_fs;
|
||||
piscsi_num_fs++;
|
||||
} else {
|
||||
printf("[FSHD-Late] Failed to load file system %c%c%c/%d from fs storage.\n", dosID[0], dosID[1], dosID[2], dosID[3]);
|
||||
piscsi_u32[3] = 0xFFFFFFFF;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case PISCSI_DBG_VAL1: case PISCSI_DBG_VAL2: case PISCSI_DBG_VAL3: case PISCSI_DBG_VAL4:
|
||||
case PISCSI_DBG_VAL5: case PISCSI_DBG_VAL6: case PISCSI_DBG_VAL7: case PISCSI_DBG_VAL8: {
|
||||
int i = ((addr & 0xFFFF) - PISCSI_DBG_VAL1) / 4;
|
||||
@@ -899,6 +948,24 @@ uint32_t handle_piscsi_read(uint32_t addr, uint8_t type) {
|
||||
case PISCSI_CMD_BLOCKSIZE:
|
||||
DEBUG("[PISCSI] Get block size of drive %d: %d\n", piscsi_cur_drive, devs[piscsi_cur_drive].block_size);
|
||||
return devs[piscsi_cur_drive].block_size;
|
||||
case PISCSI_CMD_GET_FS_INFO: {
|
||||
int i = 0;
|
||||
uint32_t val = piscsi_u32[1];
|
||||
int32_t r = get_mapped_item_by_address(cfg, val);
|
||||
if (r != -1) {
|
||||
#ifdef DEBUG_PISCSI
|
||||
uint32_t addr = val - cfg->map_offset[r];
|
||||
char *dosID = (char *)&rom_partition_dostype[rom_cur_partition];
|
||||
DEBUG("[PISCSI-GET-FS-INFO] Partition DOSType is %c%c%c/%d\n", dosID[0], dosID[1], dosID[2], dosID[3]);
|
||||
#endif
|
||||
for (i = 0; i < piscsi_num_fs; i++) {
|
||||
if (rom_partition_dostype[rom_cur_partition] == filesystems[i].FS_ID) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
default:
|
||||
DEBUG("[!!!PISCSI] WARN: Unhandled %s register read from %.8X\n", op_type_names[type], addr);
|
||||
break;
|
||||
|
||||
@@ -265,3 +265,5 @@ uint32_t handle_piscsi_read(uint32_t addr, uint8_t type);
|
||||
|
||||
void piscsi_find_filesystems(struct piscsi_dev *d);
|
||||
void piscsi_refresh_drives();
|
||||
|
||||
int load_fs(struct piscsi_fs *fs, char *dosID);
|
||||
|
||||
Binary file not shown.
Reference in New Issue
Block a user