From 972f628e80a9a7c0deac15b037bfc153708345ce Mon Sep 17 00:00:00 2001 From: Romain Dolbeau Date: Sun, 12 Jun 2022 13:45:41 +0200 Subject: [PATCH] use some custom RLE to initiliaze the RAM disk with a valid HFS FS. Still doesn't mount at boot though. --- nubus-to-ztex-gateware/DeclROM/Makefile | 11 +- .../DeclROM/NuBusFPGARAMDskDrvr.h | 2 + .../DeclROM/NuBusFPGARAMDskDrvr.s | 2 + .../DeclROM/NuBusFPGARAMDskDrvr_Ctrl.c | 4 +- .../DeclROM/NuBusFPGARAMDskDrvr_OpenClose.c | 26 +++- .../DeclROM/NuBusFPGARAMDskDrvr_Status.c | 3 +- nubus-to-ztex-gateware/DeclROM/dump.cpr | Bin 0 -> 2920 bytes nubus-to-ztex-gateware/DeclROM/myrle.c | 144 ++++++++++++++++++ 8 files changed, 187 insertions(+), 5 deletions(-) create mode 100755 nubus-to-ztex-gateware/DeclROM/dump.cpr create mode 100644 nubus-to-ztex-gateware/DeclROM/myrle.c diff --git a/nubus-to-ztex-gateware/DeclROM/Makefile b/nubus-to-ztex-gateware/DeclROM/Makefile index 4f467e7..75a61c0 100644 --- a/nubus-to-ztex-gateware/DeclROM/Makefile +++ b/nubus-to-ztex-gateware/DeclROM/Makefile @@ -13,7 +13,7 @@ HRES=1920 VRES=1080 CSRC_VIDEO=NuBusFPGADrvr_OpenClose.c NuBusFPGADrvr_Ctrl.c NuBusFPGADrvr_Status.c NuBusFPGAPrimaryInit_Primary.c NuBusFPGASecondaryInit_Secondary.c -CSRC_RAMDSK=NuBusFPGARAMDskDrvr_OpenClose.c NuBusFPGARAMDskDrvr_Ctrl.c NuBusFPGARAMDskDrvr_Prime.c NuBusFPGARAMDskDrvr_Status.c +CSRC_RAMDSK=NuBusFPGARAMDskDrvr_OpenClose.c NuBusFPGARAMDskDrvr_Ctrl.c NuBusFPGARAMDskDrvr_Prime.c NuBusFPGARAMDskDrvr_Status.c myrle.c CSRC=${CSRC_VIDEO} ${CSRC_RAMDSK} CSRC_ASM=${CSRC:.c=.s} @@ -60,6 +60,15 @@ NuBusFPGARAMDskDrvr_Status.s: NuBusFPGARAMDskDrvr_Status.c NuBusFPGARAMDskDrvr.h sed -i -e 's/^\([^a-zA-Z0-9_]*\.globl.*\)/# --- \1/' $@ sed -i -e 's/\.\(L[0-9][0-9]*\)/.RDStatus_\1/g' $@ +myrle.s: myrle.c + ${CC} -march=68020 -mcpu=68020 -O2 $< -S -o $@ -DSKIP_MAIN + sed -i -e 's/^\([^a-zA-Z0-9_]*\.globl.*\)/# --- \1/' $@ + sed -i -e 's/\.\(L[0-9][0-9]*\)/.myrle_\1/g' $@ + +dump_cpr.s: dump_cpr.c + ${CC} -march=68020 -mcpu=68020 -O2 $< -S -o $@ -DSKIP_MAIN + sed -i -e 's/^\([^a-zA-Z0-9_]*\.globl.*\)/# --- \1/' $@ + sed -i -e 's/\.\(L[0-9][0-9]*\)/.dump_cpr_\1/g' $@ NuBusFPGAPrimaryInit_Primary.s: NuBusFPGAPrimaryInit_Primary.c NuBusFPGADrvr.h diff --git a/nubus-to-ztex-gateware/DeclROM/NuBusFPGARAMDskDrvr.h b/nubus-to-ztex-gateware/DeclROM/NuBusFPGARAMDskDrvr.h index 9f62461..9c50818 100644 --- a/nubus-to-ztex-gateware/DeclROM/NuBusFPGARAMDskDrvr.h +++ b/nubus-to-ztex-gateware/DeclROM/NuBusFPGARAMDskDrvr.h @@ -21,4 +21,6 @@ struct RAMDrvContext { #define DRIVE_SIZE_BYTES ((256ul-8ul)*1024ul*1024ul) // FIXME: mem size minus fb size +uint32_t rledec(uint32_t* out, const uint32_t* in, const uint32_t len); + #endif diff --git a/nubus-to-ztex-gateware/DeclROM/NuBusFPGARAMDskDrvr.s b/nubus-to-ztex-gateware/DeclROM/NuBusFPGARAMDskDrvr.s index 2ce953a..fc9468f 100644 --- a/nubus-to-ztex-gateware/DeclROM/NuBusFPGARAMDskDrvr.s +++ b/nubus-to-ztex-gateware/DeclROM/NuBusFPGARAMDskDrvr.s @@ -92,5 +92,7 @@ _RAMDskGoIODone: .text .include "NuBusFPGARAMDskDrvr_Status.s" .text + .include "myrle.s" + .text ALIGN 2 diff --git a/nubus-to-ztex-gateware/DeclROM/NuBusFPGARAMDskDrvr_Ctrl.c b/nubus-to-ztex-gateware/DeclROM/NuBusFPGARAMDskDrvr_Ctrl.c index 0ef5543..0246b3f 100644 --- a/nubus-to-ztex-gateware/DeclROM/NuBusFPGARAMDskDrvr_Ctrl.c +++ b/nubus-to-ztex-gateware/DeclROM/NuBusFPGARAMDskDrvr_Ctrl.c @@ -7,8 +7,8 @@ OSErr cNuBusFPGARAMDskCtl(CntrlParamPtr pb, /* DCtlPtr */ AuxDCEPtr dce) dce->dCtlDevBase = 0xfc000000; - /* write_reg(dce, GOBOFB_DEBUG, 0xDEAD0002); */ - /* write_reg(dce, GOBOFB_DEBUG, pb->csCode); */ + write_reg(dce, GOBOFB_DEBUG, 0xDEAD0002); + write_reg(dce, GOBOFB_DEBUG, pb->csCode); ctx = *(struct RAMDrvContext**)dce->dCtlStorage; diff --git a/nubus-to-ztex-gateware/DeclROM/NuBusFPGARAMDskDrvr_OpenClose.c b/nubus-to-ztex-gateware/DeclROM/NuBusFPGARAMDskDrvr_OpenClose.c index e01d659..8c88d58 100644 --- a/nubus-to-ztex-gateware/DeclROM/NuBusFPGARAMDskDrvr_OpenClose.c +++ b/nubus-to-ztex-gateware/DeclROM/NuBusFPGARAMDskDrvr_OpenClose.c @@ -13,7 +13,7 @@ OSErr cNuBusFPGARAMDskOpen(IOParamPtr pb, /* DCtlPtr */ AuxDCEPtr dce) dce->dCtlDevBase = 0xfc000000; - /* write_reg(dce, GOBOFB_DEBUG, 0xDEAD0000); */ + write_reg(dce, GOBOFB_DEBUG, 0xDEAD0000); /* write_reg(dce, GOBOFB_DEBUG, dce->dCtlRefNum); */ if (dce->dCtlStorage == nil) { @@ -50,8 +50,32 @@ OSErr cNuBusFPGARAMDskOpen(IOParamPtr pb, /* DCtlPtr */ AuxDCEPtr dce) // dsptr->driveChar // dsptr->driveMisc + // MyAddDrive(dsptr->dQRefNum, drvnum, (DrvQElPtr)&dsptr->qLink); + + // write_reg(dce, GOBOFB_DEBUG, 0x0000DEAD); + { + unsigned char* superslot = 0xc0000000; // FIXME + unsigned long *compressed = 0xFcFF8000; // FIXME + unsigned long res; + /* + write_reg(dce, GOBOFB_DEBUG, 0xDEAD0000); + write_reg(dce, GOBOFB_DEBUG, compressed); + write_reg(dce, GOBOFB_DEBUG, compressed[0]); + write_reg(dce, GOBOFB_DEBUG, compressed[1]); + write_reg(dce, GOBOFB_DEBUG, compressed[2]); + write_reg(dce, GOBOFB_DEBUG, compressed[3]); + */ + res = rledec(superslot, compressed, 730); + /* + write_reg(dce, GOBOFB_DEBUG, res); + write_reg(dce, GOBOFB_DEBUG, 0xDEEEEEAD); + */ + } + + MyAddDrive(dsptr->dQRefNum, drvnum, (DrvQElPtr)&dsptr->qLink); } + done: return ret; diff --git a/nubus-to-ztex-gateware/DeclROM/NuBusFPGARAMDskDrvr_Status.c b/nubus-to-ztex-gateware/DeclROM/NuBusFPGARAMDskDrvr_Status.c index 293bdee..5c8f854 100644 --- a/nubus-to-ztex-gateware/DeclROM/NuBusFPGARAMDskDrvr_Status.c +++ b/nubus-to-ztex-gateware/DeclROM/NuBusFPGARAMDskDrvr_Status.c @@ -7,7 +7,8 @@ OSErr cNuBusFPGARAMDskStatus(CntrlParamPtr pb, /* DCtlPtr */ AuxDCEPtr dce) dce->dCtlDevBase = 0xfc000000; - /* write_reg(dce, GOBOFB_DEBUG, 0xDEAD0004); */ + write_reg(dce, GOBOFB_DEBUG, 0xDEAD0004); + write_reg(dce, GOBOFB_DEBUG, pb->csCode); ctx = *(struct RAMDrvContext**)dce->dCtlStorage; diff --git a/nubus-to-ztex-gateware/DeclROM/dump.cpr b/nubus-to-ztex-gateware/DeclROM/dump.cpr new file mode 100755 index 0000000000000000000000000000000000000000..ebfdfb7f23e2bcca4dc5a92da2ddb7b7622eb3b8 GIT binary patch literal 2920 zcma)8Z)j6j6hH4Z)|h57skL(=^|f}c6j`dwF<7x_7V4voNtU)#M7CDjrLA2P(-ve1 zrYZyHK1?0^Hc;3g%Gif7x6x0LAp^G$qM&2AR)kH2%{n&G&9-m9bMAXdm5RHMd*AP# zd+zyv?|VdK5t?OLe}yAc7h0#Le%SGqM&zP0qWg11eyoOwR^U~2?^b1OJUl+yme|^A zBwM!`k-^cuSYTd}F-I$918?HyLSM!J^8dw4=#cI-%r!jHcG$$_;I(a<1!?JBo6dZ! zhh?(7c^!*HZp@Z4|0bq$%gIPv_{Flc2lRmUlaI=*37hu7mIVnXJ4h z(>B79Ia8DgCN$mBSdO@-dm{a#d&kllBhn^9BVBFL$hNJ?kg&=ij96sXSuZyY(VxcK z@ee-fE+w)^`H1RI9{GbZ{)7rp8Hw zt#wqt!*+5k?-M=CP!Gg2{UdGZ;lBQCbZ~Sm()J9CX^X?r*4H{i%p-dk zNbQttm{S%&`)%&Rfjp|FuateTQS{9~%tzW0t(@LN{%n~l*3U7EwpcxiVveE?`BOz5 zjt?9I(yzNh;1Ip=Yu<)%Lfm(FA3jM3OGoFJ{PTF$!?F}!nDtUD0=$cT4B2my0sXLZ znmdzKz8OFXd(zApx-4xCeM%z>VgdbN0vpQq3Go2kv6cPNh4Yar<*g;1cINt+$U5=b zO|S6znJ@YQ;G9JbEVH%&26!cRA$6^&ItNkr$W~dylnOl1B4<=$qx2%r*i^wAwcfEk zY3P|ppq$1&jXM*n=a~4cL`O##_`X1eZv223&yB)?z?Qh+0bu`ciayBr;iS-qm}ki? z!Fw6|vx0{iuNV>h4&&7y3m#$Ia9J?SqQHi$g0qY_ekNGy9bnAvP{2I20DrjvD>)Ow z^E1=WDg3M8Lrm|wP@+fW$S9s|f0XF4eI@?n`4T-LLAqUFIXja=@3kx=(8~~^WqR)h z!Mf1jT=LB+FR#d>7I;KlasH*0aO-+X3&mLrwHW9av8XY^o*9QGE3%7a^AZ{(ZdSo6 zOrtv^NRpczmp^|*M4!z}nhBb0hdnsW%u>9!l!g4+X*tLXXxOJQ|DS3~HEHtHrKx<~ z04`WR#ww}``tqLyEAj`-{ZyNO(*274&iCvWb!L@Bt)`JG&GVOYyCycblDDamyk;S* z$0ldrZ_mB$>Kr1kcZjOVJ6!iNuYH%TK5=-xcH65LIqIz&!TudzU8a z=*Cfg?i{_GyUCJQ1wFAzy3V7vD?UTj(dno=HXiiUr`Zt4Pd>BU_`FHX;QRNqhH5OU zkpijmU?bI>-B|xtY}~v>O|QqXyQ;mBe5rCH8E&9VX7%a1^`?=m?Vv+OMJkE4<*BHV zqy~uFXLNr!OBY|v(;LA7+DR^Rd$1W{S(ZQ39pCb8#o4B{W?>V1iFjPuZgkdeCwFZc z7mPQ!f-SEy67fVlI_)L4+(?t#NYoENlPBde+E1-hcKHoh literal 0 HcmV?d00001 diff --git a/nubus-to-ztex-gateware/DeclROM/myrle.c b/nubus-to-ztex-gateware/DeclROM/myrle.c new file mode 100644 index 0000000..dab973d --- /dev/null +++ b/nubus-to-ztex-gateware/DeclROM/myrle.c @@ -0,0 +1,144 @@ +#include + +//#include + +#ifndef SKIP_MAIN +uint32_t rleenc(uint32_t* out, const uint32_t* in, const uint32_t len) { + uint32_t i = 0, j = 0, p = 0, ib, k; + int32_t c = 0; + + p = in[0]; + + for (i = 1 ; i < len ; i++) { + if (c == 0) { // just started + if (in[i] == p) { // repeat + c++; + } else { // non-repeat + p = in[i]; + c--; + ib = i - 1; + } + } else if (c > 0) { // in-repeat + if (in[i] == p) { // keep repeating + c++; + } else { // exit repeat + out[j++] = __builtin_bswap32(c); // write result + out[j++] = p; + p = in[i]; // restart + c = 0; + } + } else { // c < 0 + if (in[i] == p) { // exit non-repeat + out[j++] = __builtin_bswap32(c+1); // write result, removing previous + for (k = 0 ; k < (-c) ; k++) + out[j++] = in[ib+k]; + p = in[i]; // restart + c = 1; // this and previous + } else { // non-repeat + p = in[i]; + c--; + } + } + + } + out[j++] = __builtin_bswap32(c); + out[j++] = p; + + return j; +} +#endif + + +uint32_t rledec(uint32_t* out, const uint32_t* in, const uint32_t len) { + uint32_t i = 0, j = 0, k = 0, chk = 0, ib; + + for (i = 0 ; i < len ; ) { +#ifndef __m68k__ + int32_t c = (int32_t)__builtin_bswap32(in[i]); +#else + int32_t c = (int32_t)(in[i]); +#endif + if (c >= 0) { + chk += (1 + c); + if (c < 10000) // !!!!!!!!!!!!!!!!!!!!!!!!!! + for (k = 0 ; k < c+1 ; k++) + out[j++] = in[i+1]; + else + j += c+1; + i += 2; + } else { + chk += 1 + -c; + for (k = 0 ; k < 1 + -c ; k++) + out[j++] = in[i+1+k]; + i += 2 + -c; + } + //fprintf(stderr, "%u: %u <> %u (%d, 0x%08x)\n", i, j, chk, c, in[i+1]); + } + return j; +} + +#ifndef SKIP_MAIN +#include +#include +#include +#include +#include +#include +#include + +int main(int argc, char** argv) { + int fd; + uint32_t len, k; + uint32_t *bufa, *bufb; + FILE* f; + + bufa = calloc(sizeof(uint32_t), 256*1024*1024/sizeof(uint32_t)); + bufb = calloc(sizeof(uint32_t), 256*1024*1024/sizeof(uint32_t)); + + fd = open("dump.raw", O_RDONLY); + len = read(fd, bufa, 248*1024*1024ull) / 4; + close(fd); + + printf("File : %d bytes\n", len*4); + + len = rleenc(bufb, bufa, len); + + printf("Compressed : %d bytes\n", len*4); + + /* for (k = 0 ; k < len ; k++) */ + /* bufb[k] = __builtin_bswap32(bufb[k]); */ + + fd = open("dump.cpr", O_WRONLY | O_CREAT, S_IRWXU); + /* len = */write (fd, bufb, len*4); + close(fd); + + /* for (k = 0 ; k < len ; k++) */ + /* bufb[k] = __builtin_bswap32(bufb[k]); */ + + f = fopen("dump_cpr.c", "w"); + /* fprintf(f, "unsigned char* compressed[%d] = {\n", len*4); */ + /* for (k = 0 ; k < len*4 ; k++) { */ + /* fprintf(f, "0x%02x%s", ((unsigned char*)bufb)[k], */ + /* k == (len*4-1) ? "};" : (k%16 == 15 ? ",\n" : ",") */ + /* ); */ + /* } */ + fprintf(f, "unsigned long* compressed[%d] = {\n", len); + for (k = 0 ; k < len ; k++) { + fprintf(f, "0x%08x%s", bufb[k], + k == (len-1) ? "};" : (k%8 == 7 ? ",\n" : ",") + ); + } + fclose(f); + + len = rledec(bufa, bufb, len); + + printf("Uncompressed : %d bytes\n", len*4); + + fd = open("dump.ucp", O_WRONLY | O_CREAT, S_IRWXU); + len = write (fd, bufa, len*4); + close(fd); + + return 0; +} + +#endif