From 8ebbc29a791075e3d9635c3c4d70f30d03c6313f Mon Sep 17 00:00:00 2001 From: beeanyew Date: Thu, 10 Jun 2021 20:20:05 +0200 Subject: [PATCH] Some non-working loading of file systems from disk for PiSCSI --- platforms/amiga/hunk-reloc.c | 25 ++++++ .../amiga/piscsi/device_driver_amiga/bootrom | Bin 2144 -> 2092 bytes .../piscsi/device_driver_amiga/bootrom.s | 41 ++++++--- platforms/amiga/piscsi/piscsi-enums.h | 2 + platforms/amiga/piscsi/piscsi.c | 81 ++++++++++++++++-- platforms/amiga/piscsi/piscsi.h | 2 + platforms/amiga/piscsi/piscsi.rom | Bin 16384 -> 16384 bytes 7 files changed, 130 insertions(+), 21 deletions(-) diff --git a/platforms/amiga/hunk-reloc.c b/platforms/amiga/hunk-reloc.c index 3b92e33..b1c2e32 100644 --- a/platforms/amiga/hunk-reloc.c +++ b/platforms/amiga/hunk-reloc.c @@ -8,6 +8,7 @@ #include #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; +} diff --git a/platforms/amiga/piscsi/device_driver_amiga/bootrom b/platforms/amiga/piscsi/device_driver_amiga/bootrom index c83fa552948c215a74bc3f0b10a050eebfeef1c0..5ec9567fd0e8b03b3d923e06d5a8947ef40a4da1 100644 GIT binary patch delta 577 zcmX|+O-LJ25Xa|zXkL4YpripU>laZ_@TwJ25|<#$g54_EgEcf86O7ron?M4BIf_T0 zc=YH&q!j8wJc!3qDD)^EGzSkJdJyp>g>>HA;KIz#|3ANZZ(cKc8vTAoxP3updl zhw_GeVAgL-=IIj2%1e46#%jQmFRh<)nT@_V8cxI8xtG?7+-1Gg5b~Jy$9@g|1Ay@c zfHC&~FeHrVIzU=BS%T!G;C(w(6A48albDNIk0?Db4FrhRqe|P~T2q5pSiLi5wM($h zcWr|Jp)_eK%BW-Re(h)VscQ?39N@ItW>`_WG8$llVcqSt>?$_&Cot1L8213Y5_-HW zz}^C2e^K+cm&dY*QO2mrd!C5z?je#3+%G9F_*5^u3M6Qq{21!EC6qo(9!d6;&}Gg> zp=^1Xtm$Z|Dbta};+pE1g`(@!13R;+=G7*^+g{RlGZoKAM{fr-S@pvMfU3=y>3nnp zuj+r*SJOv%6^X5Mwmb8+LQo0RFtE>S2%nO#OA$r~fCAOgcL_ z^mTOV&`Ct7Lnu-lI+eOQh-jwb(5aJ1%lF=w@Szv(ednBe?z{IeGKd_XFi`=vulj6` z{Zg0gg?(^div0zE*e-ynQ8Yl20EGfH5uk8@iUHEUs3~KOMOD-ID027yPZj2=iBItr z2xss8BbDJZM&(ew=5y2E)1Wub(|q<8;7Q1gyagz#4?Mxv)mJ{dAn-K0FF_vj8Pecw89a;=VuHzPL1Sn^y6zsC}oR0fO|H>Cp6J^<%kjZkEnr*i(y=BrsB(b2Wfhb_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; diff --git a/platforms/amiga/piscsi/piscsi.h b/platforms/amiga/piscsi/piscsi.h index a9fd353..b938411 100644 --- a/platforms/amiga/piscsi/piscsi.h +++ b/platforms/amiga/piscsi/piscsi.h @@ -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); diff --git a/platforms/amiga/piscsi/piscsi.rom b/platforms/amiga/piscsi/piscsi.rom index c677e97ef4b6eda7dc43a8a61dd2b291793f20f1..7d6ffab8af8ed92328774014cab46e8ff52797f6 100644 GIT binary patch delta 2603 zcma)8eN0+T%;R{8L}QFu7^D8~D=;>fXq$WQ zIlpu6`MT%b_Y8v>20L|z$)S%}tN8(|WXH{K*#lDW^PoA%A7caN$NZR5KT2}@T=u-V zOR6n=YMaZxYfeh#TvN<vqT<6Q{zOP=8ROsVx}T*NOMc0 zMrdgFW8QD^Ucpzj5F=*swSo_w%x-gMK)E!(g)-2C_AydO5j>j_TG}DZj%E3PWi`@e z#0a}ZGxB^ zgIrTK`2tj8!_nUDiQ%1x^r%o|fZjdr$-B%r|I3sM+SeWgD)l@yqz4mw2ReEzr5Urc zpytttkaP^~kMie5{MNY@%E8q&H!-{nbgq}jt(bAlKqxz z{)d?^&$txPw1J2Xe7pH%OTR>!>$k*(QzZ#(o1oxDQV;VbYO-t9igYc$Q11cbsT$dTWM z-kqh^o~ba`3S+No4OAbzGB*GCkF zeAC3VLxi7J7!Tq z`$$7^*N4JPJPbo2Z3s=T#5;5nd8_2BrSeUFq+UxENh+aD@SkMo46Lq}Y05Xp?9I;n z=ev(oB}k5(*B2t6B8>vE^>oJm5laJi!Kl}hAV+m~z^~R(LsP~eGCblbOu2t1546>) zL9*$j+QoCHI^d33lnWHMsB)i|REyH!K@lDVV)Ij8pQ6trJzHobaDo(@o&0?yZ9%y9 zFVo|V54iF}*Hz9oOP-Z~{*2^d7gr*Zhs(F}G;u4RIj@)_)JzLQ*FOWx8q71(Cy zG|uoIVi>$s+$NI9+WncxA33cSIW_%4KGa3lvzI=^s&Ip{*=&uUk>Vot_d6HFeN~_lBU>lfF;80tszVpRw(k~nrDoo?6p)-&91(PRY^}gx0F#eRf!u@ z`Fi~9R3EW3UE^_LC#&zme4k@aX&)NfYmKsJVtD~(Wo3mJ}bh4 zdBz!SL_ln@B789nRK^NJcBhw$YZtLcD4Xg!K{8ywVWA4V5lzhgB67zfLtBJ%&HP{1o;?zZO-A(84b%!+CBQ%|vEXdqv2`D9A?MZrxgc9-$<_le2W2cZYlLp>N=gW8{tjWS zqHLE=xs$uG#dMT5iW^DR65?6H{ZVe+C@Ol$OBELFaL-ydlB;Q+WD%jz!bz--d;03c ziQv29c>f+yws=WD(M3?JfW3~jIJOg|(gL_x!Ic9&+8?s{Gpvv3ELIx8d*`V6M(I7P zpM*kQ{Czkn7Ea7drEA%D=8vV#={Y|{Jo}_zF2Y!c2k{tI8G~VzU^s!jL~bhdff0%vBM3Qo_A;5TFa z)0}oy1(Zpl(%TzN<=*Cn)~7+QJ~Z4vJk*_dNdhJBoFisC4@|gnOa#L jFZ|66mbuwwQ!mq<46(77AY2d{pkId#?eyPedp!RDjO$X1 delta 2224 zcmb7FZ%k8H6hHU92Yq0zr54fx>MN8|@ee3UvdLVj$XG)fQgGSKA{8j53);7~Y_gH` zmF)w}1dY!R%i745&<6GO zlG3}C0@?s&{RUjaLk&&gTF0GqHcU_LwEUAHMFq5jNSe=q(wt1e4}m>^jdJ);ng-2+ z=0FSjDXG?Z`wN5&BqKeo@nrXi8sT9K(4(23rC*pJw(9eRd)Q^&ZmKQCXcF6ELy@kL zWboi29xEz(r>QK>CnjOfaH6dX3gBkW+PXrKWPCW$XJi$9z@$)QD1Na21w6DIyZ1;e znM%UI(6eAdTUTrRurXFbmD~(GK#3IQzIYyEf3_%_7xXNwuE|}CZ zl!zScAL+oXk$w)7)C-0<6p^#f&RnlNZ_)*8X^9oc1|Eaq_Yq~)z1B*b$XVe@VRw+1KzpB1i;dv!RtFkI1NK8sm z)UOs!XAU(hO!|BLct#&8Y4EvwJUzkT&V{u;+MslX21&^w%VRpbfbfj(9jmtlF7iCl zI%M)FF>)w!biFRwnk)q;JC9YxNeW+8m%>+OI&GI&T8SfIki5X{?oPkYx{>M|7c?Tx z%{x2Q;3caW%j}iaCmnapDBLqh=BiauV$J?@B%9Zgua|_Y39_xdmD#?_Q5bw|6_`Vq z%m1@!Sd;k(bU!Ga7e-?*1>}4djxsOk$5;Bf*YUE4IqdV~^4Adq38kYXlh}Bl8n7fu z&EC8SDGM59)7fkd4zk8iGGCWU)=eZ-(Y*;sQOlSSCsLGz^<0x^fY@CmlgL~Xqb6Dn zy$n1?ja1@4Pc~4Q;c;Txb+Fd&94&S5qp{jTn#)JBpK`mXJ~m`}*e|>|>6m6rE-lLf zErYGyL?#crcN9_{`|Q~|JmeYS>$siy`e-k)?mz~I67&> zwE-&29dAIuGMbw-*C0vh=N0({q-O%74Je2$?}4yf2KK@zLkf?j*#9j!OxYlMsHl(V zjB1)bM^ZmAyRnRP-g&qe++zvZ)$+Wg077y3K1@7P$xd%AKK0nY32C8BF2&MpN}AOo z{cieUZ2PBPG~RIm$6*24s5s>f-%4rW8z~`t%`b$%OR-liFa4kO(b5@p3-9b_=fw5! z!&LQbCNgJlbP!fEYJ4HYH;@+_rlkdRf=K3EKj7>w&={>j2UtP&oiW-$Wjp=kfUn%} zRRFInb&ZnttUYk+|E4}Mru$qa-Yh_F>ywV{@8T``XOD1%?~)0wm$W9M^r$P3yYhFNjX5PmM@t z?33DT>R$@kW~X;oDvl@pmj*ihq*!U+=2kxY;#*CY%cD1iK+n~2#8;(8tA2l`-nmB(b^ zAw4~jRPH5_eXzwIHJ0p4#(EMT!y