detect slot in INIT; detect slot in RAMDsk driver ; auto-mount RAMDDsk

This commit is contained in:
Romain Dolbeau 2022-06-26 12:31:43 +02:00
parent 724d4406f9
commit c6d6e26438
8 changed files with 107 additions and 41 deletions

View File

@ -12,6 +12,7 @@
struct RAMDrvContext { struct RAMDrvContext {
DrvSts2 drvsts; DrvSts2 drvsts;
char slot;
}; };
#define DRIVE_SIZE_BYTES ((256ul-8ul)*1024ul*1024ul) // FIXME: mem size minus fb size #define DRIVE_SIZE_BYTES ((256ul-8ul)*1024ul*1024ul) // FIXME: mem size minus fb size

View File

@ -5,10 +5,8 @@ OSErr cNuBusFPGARAMDskCtl(CntrlParamPtr pb, /* DCtlPtr */ AuxDCEPtr dce)
OSErr ret = noErr; OSErr ret = noErr;
struct RAMDrvContext *ctx; struct RAMDrvContext *ctx;
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; ctx = *(struct RAMDrvContext**)dce->dCtlStorage;

View File

@ -3,6 +3,8 @@
/* duplicated */ /* duplicated */
void MyAddDrive(short drvrRefNum, short drvNum, DrvQElPtr qEl); void MyAddDrive(short drvrRefNum, short drvNum, DrvQElPtr qEl);
#include <ROMDefs.h>
OSErr cNuBusFPGARAMDskOpen(IOParamPtr pb, /* DCtlPtr */ AuxDCEPtr dce) OSErr cNuBusFPGARAMDskOpen(IOParamPtr pb, /* DCtlPtr */ AuxDCEPtr dce)
{ {
DrvSts2 *dsptr; // pointer to the DrvSts2 in our context DrvSts2 *dsptr; // pointer to the DrvSts2 in our context
@ -10,13 +12,32 @@ OSErr cNuBusFPGARAMDskOpen(IOParamPtr pb, /* DCtlPtr */ AuxDCEPtr dce)
struct RAMDrvContext *ctx; struct RAMDrvContext *ctx;
OSErr ret = noErr; OSErr ret = noErr;
char busMode; char busMode;
char slot;
busMode = 1; busMode = 1;
SwapMMUMode ( &busMode ); // to32 // this likely won't work on older MacII ??? SwapMMUMode ( &busMode ); // to32 // this likely won't work on older MacII ???
dce->dCtlDevBase = 0xfc000000; // FIXME: why do we not get our slot properly ? if (dce->dCtlDevBase == 0) { // for some unknown reason, we get an empty dCtlDevBase...
SpBlock mySpBlock;
SInfoRecord mySInfoRecord;
mySpBlock.spResult = (long)&mySInfoRecord;
mySpBlock.spSlot = 0x9; // start at first
mySpBlock.spID = 0;
mySpBlock.spExtDev = 0;
mySpBlock.spCategory = catProto;
mySpBlock.spCType = 0x1000; // typeDrive;
mySpBlock.spDrvrSW = drSwApple;
mySpBlock.spDrvrHW = 0xbeee; // DrHwNuBusFPGADsk
mySpBlock.spTBMask = 0;
ret = SNextTypeSRsrc(&mySpBlock);
if (ret)
goto done;
slot = mySpBlock.spSlot;
dce->dCtlDevBase = 0xF0000000ul | ((unsigned long)slot << 24);
}
write_reg(dce, GOBOFB_DEBUG, 0xDEAD0000); /* write_reg(dce, GOBOFB_DEBUG, 0xDEAD0000); */
/* write_reg(dce, GOBOFB_DEBUG, dce->dCtlRefNum); */ /* write_reg(dce, GOBOFB_DEBUG, dce->dCtlRefNum); */
if (dce->dCtlStorage == nil) { if (dce->dCtlStorage == nil) {
@ -36,6 +57,7 @@ OSErr cNuBusFPGARAMDskOpen(IOParamPtr pb, /* DCtlPtr */ AuxDCEPtr dce)
HLock(dce->dCtlStorage); HLock(dce->dCtlStorage);
ctx = *(struct RAMDrvContext **)dce->dCtlStorage; ctx = *(struct RAMDrvContext **)dce->dCtlStorage;
ctx->slot = slot;
dsptr = &ctx->drvsts; dsptr = &ctx->drvsts;
// dsptr->track /* current track */ // dsptr->track /* current track */
@ -58,27 +80,24 @@ OSErr cNuBusFPGARAMDskOpen(IOParamPtr pb, /* DCtlPtr */ AuxDCEPtr dce)
// MyAddDrive(dsptr->dQRefNum, drvnum, (DrvQElPtr)&dsptr->qLink); // MyAddDrive(dsptr->dQRefNum, drvnum, (DrvQElPtr)&dsptr->qLink);
// write_reg(dce, GOBOFB_DEBUG, 0x0000DEAD); // write_reg(dce, GOBOFB_DEBUG, 0x0000DEAD);
// initialize to our empty volume
{ {
unsigned char* superslot = 0xc0000000; // FIXME unsigned long *superslot = (unsigned long*)(((unsigned long)ctx->slot) << 28ul);
unsigned long *compressed = 0xFcFF8000; // FIXME unsigned long *compressed = (unsigned long*)(dce->dCtlDevBase + 0x00FF8000ul);
unsigned long res; 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); // FIXME: 730 = 2920/4 (compressed size in words) res = rledec(superslot, compressed, 730); // FIXME: 730 = 2920/4 (compressed size in words)
/*
write_reg(dce, GOBOFB_DEBUG, res);
write_reg(dce, GOBOFB_DEBUG, 0xDEEEEEAD);
*/
} }
// add the drive
MyAddDrive(dsptr->dQRefNum, drvnum, (DrvQElPtr)&dsptr->qLink); MyAddDrive(dsptr->dQRefNum, drvnum, (DrvQElPtr)&dsptr->qLink);
// auto-mount
{
ParamBlockRec pbr;
pbr.volumeParam.ioVRefNum = dsptr->dQDrive;
ret = PBMountVol(&pbr);
}
} }
SwapMMUMode ( &busMode ); SwapMMUMode ( &busMode );
@ -92,7 +111,7 @@ OSErr cNuBusFPGARAMDskClose(IOParamPtr pb, /* DCtlPtr */ AuxDCEPtr dce)
OSErr ret = noErr; OSErr ret = noErr;
//RAMDrvContext *ctx = *(RAMDrvContext**)dce->dCtlStorage; //RAMDrvContext *ctx = *(RAMDrvContext**)dce->dCtlStorage;
dce->dCtlDevBase = 0xfc000000; /* dce->dCtlDevBase = 0xfc000000; */
/* write_reg(dce, GOBOFB_DEBUG, 0xDEAD0001); */ /* write_reg(dce, GOBOFB_DEBUG, 0xDEAD0001); */

View File

@ -6,8 +6,6 @@ OSErr cNuBusFPGARAMDskPrime(IOParamPtr pb, /* DCtlPtr */ AuxDCEPtr dce)
OSErr ret = noErr; OSErr ret = noErr;
struct RAMDrvContext *ctx; struct RAMDrvContext *ctx;
dce->dCtlDevBase = 0xfc000000;
/* write_reg(dce, GOBOFB_DEBUG, 0xDEAD0003); */ /* write_reg(dce, GOBOFB_DEBUG, 0xDEAD0003); */
/* write_reg(dce, GOBOFB_DEBUG, pb->ioTrap); */ /* write_reg(dce, GOBOFB_DEBUG, pb->ioTrap); */
/* write_reg(dce, GOBOFB_DEBUG, pb->ioPosMode); */ /* write_reg(dce, GOBOFB_DEBUG, pb->ioPosMode); */
@ -17,7 +15,7 @@ OSErr cNuBusFPGARAMDskPrime(IOParamPtr pb, /* DCtlPtr */ AuxDCEPtr dce)
ctx = *(struct RAMDrvContext**)dce->dCtlStorage; ctx = *(struct RAMDrvContext**)dce->dCtlStorage;
if (ctx) { if (ctx) {
unsigned char* superslot = 0xc0000000; //(unsigned char*)(((unsigned long)dce->dCtlSlot) << 28ul); unsigned char* superslot = (unsigned char*)(((unsigned long)ctx->slot) << 28ul);
unsigned long abs_offset = 0; unsigned long abs_offset = 0;
/* IOParamPtr: Devices 1-53 (p73) */ /* IOParamPtr: Devices 1-53 (p73) */
/* **** WHERE **** */ /* **** WHERE **** */

View File

@ -5,10 +5,8 @@ OSErr cNuBusFPGARAMDskStatus(CntrlParamPtr pb, /* DCtlPtr */ AuxDCEPtr dce)
OSErr ret = noErr; OSErr ret = noErr;
struct RAMDrvContext *ctx; struct RAMDrvContext *ctx;
dce->dCtlDevBase = 0xfc000000; /* write_reg(dce, GOBOFB_DEBUG, 0xDEAD0004); */
/* write_reg(dce, GOBOFB_DEBUG, pb->csCode); */
write_reg(dce, GOBOFB_DEBUG, 0xDEAD0004);
write_reg(dce, GOBOFB_DEBUG, pb->csCode);
ctx = *(struct RAMDrvContext**)dce->dCtlStorage; ctx = *(struct RAMDrvContext**)dce->dCtlStorage;

View File

@ -3,6 +3,8 @@
#include <OSUtils.h> #include <OSUtils.h>
#include <Types.h> #include <Types.h>
#include <QuickDraw.h> #include <QuickDraw.h>
#include <Slots.h>
#include <ROMDefs.h>
#include "NuBusFPGA_HW.h" #include "NuBusFPGA_HW.h"
@ -15,13 +17,9 @@
// #define QEMU // #define QEMU
//extern pascal void CopyBits(const BitMap *srcBits, const BitMap *dstBits, const Rect *srcRect, const Rect *dstRect, short mode, RgnHandle maskRgn) ONEWORDINLINE(0xA8EC); int hwblit(char* stack, char* p_fb_base, /* short dstshift, */ short mode, Pattern* pat, PixMapPtr dstpix, PixMapPtr srcpix, Rect *dstrect, Rect *srcrect);
//extern pascal void StdBits(const BitMap *srcBits, const Rect *srcRect, const Rect *dstRect, short mode, RgnHandle maskRgn) ONEWORDINLINE(0xA8EB); pascal asm void myBitBlt(BitMap *srcBits, BitMap *maskBits, BitMap *dstBits, Rect *srcRect, Rect *maskRect, Rect *dstRect, short mode, Pattern *pat, RgnHandle rgnA, RgnHandle rgnB, RgnHandle rgnC, short multColor);
short check_slots(char list[6]);
#if 0
typedef pascal void (*StdBitsProc)(BitMap *srcBits, Rect *srcRect, Rect *dstRect, short mode, RgnHandle maskRgn);
StdBitsProc oldStdBits;
#endif
typedef pascal void (*BitBltProc)(BitMap *srcBits, BitMap *maskBits, BitMap *dstBits, Rect *srcRect, Rect *maskRect, Rect *dstRect, short mode, Pattern *pat, RgnHandle rgnA, RgnHandle rgnB, RgnHandle rgnC, short multColor); typedef pascal void (*BitBltProc)(BitMap *srcBits, BitMap *maskBits, BitMap *dstBits, Rect *srcRect, Rect *maskRect, Rect *dstRect, short mode, Pattern *pat, RgnHandle rgnA, RgnHandle rgnB, RgnHandle rgnC, short multColor);
static BitBltProc oldBitBlt; static BitBltProc oldBitBlt;
@ -278,7 +276,7 @@ int hwblit(char* stack, char* p_fb_base, /* short dstshift, */ short mode, Patte
return 0; return 0;
} }
pascal asm void myBitBlt(BitMap *srcBits, BitMap *maskBits, BitMap *dstBits, Rect *srcRect, Rect *maskRect, Rect *dstRect, short mode, Pattern *pat, RgnHandle rgnA, RgnHandle rgnB, RgnHandle rgnC, short multColor){ pascal asm void myBitBlt(BitMap *srcBits, BitMap *maskBits, BitMap *dstBits, Rect *srcRect, Rect *maskRect, Rect *dstRect, short mode, Pattern *pat, RgnHandle rgnA, RgnHandle rgnB, RgnHandle rgnC, short multColor) {
// a2: srcrect // a2: srcrect
// a3: dstrect // a3: dstrect
// a4: srcpix // a4: srcpix
@ -331,7 +329,9 @@ pascal asm void myBitBlt(BitMap *srcBits, BitMap *maskBits, BitMap *dstBits, Rec
void main(void) void main(void)
{ {
long oldA4; long oldA4;
short cnt;
char list[6];
char slot;
Handle h; Handle h;
struct goblin_bt_regs* bt; struct goblin_bt_regs* bt;
@ -341,7 +341,15 @@ void main(void)
oldA4 = SetCurrentA4(); oldA4 = SetCurrentA4();
RememberA4(); RememberA4();
fb_base = (void*)GOBLIN_FB_BASE; // FIXME !!! cnt = check_slots(list);
if (!cnt)
goto finish;
slot = list[0]; // FIXME: what if more than one ???
//fb_base = (void*)GOBLIN_FB_BASE; // FIXME !!!
fb_base = (void*)(0xF0000000ul | (((unsigned long)slot) << 24));
bt_base = ((char*)fb_base + GOBLIN_BT_OFFSET); bt_base = ((char*)fb_base + GOBLIN_BT_OFFSET);
accel_base = ((char*)fb_base + GOBLIN_ACCEL_OFFSET); accel_base = ((char*)fb_base + GOBLIN_ACCEL_OFFSET);
@ -362,10 +370,54 @@ void main(void)
//*debug_ptr = (unsigned long)oldBitBlt; //*debug_ptr = (unsigned long)oldBitBlt;
SetToolTrapAddress((UniversalProcPtr)myBitBlt, _BitBlt); SetToolTrapAddress((UniversalProcPtr)myBitBlt, _BitBlt);
ShowInitIcon(128, true); ShowInitIcon(121 + slot, true);
finish:
/* restore the a4 world */ /* restore the a4 world */
SetA4(oldA4); SetA4(oldA4);
// *debug_ptr = 0xBEEFDEAD; // *debug_ptr = 0xBEEFDEAD;
} }
short check_slots(char list[6]) {
int i;
short cnt;
OSErr err;
SpBlock mySpBlock;
SInfoRecord mySInfoRecord;
cnt = 0;
// check all slots
for (i = 0x9 ; i < 0xf ; i++) {
// check if there's something there
mySpBlock.spResult = (long)&mySInfoRecord;
mySpBlock.spSlot = i;
mySpBlock.spSize = 0; // unused by SReadInfo, can be altered
err = SReadInfo(&mySpBlock);
if (!err) {
if (mySInfoRecord.siInitStatusA == smEmptySlot) {
// oups ?
} else {
// check for what exactly is here
mySpBlock.spSlot = i;
mySpBlock.spID = 0;
mySpBlock.spExtDev = 0;
mySpBlock.spCategory = catDisplay;
mySpBlock.spCType = typeVideo;
mySpBlock.spDrvrSW = drSwApple;
mySpBlock.spDrvrHW = 0xbeef; // DrHwNuBusFPGA
mySpBlock.spTBMask = 0;
err = SNextTypeSRsrc(&mySpBlock);
if (!err) {
if ((mySpBlock.spCategory == catDisplay) &&
(mySpBlock.spCType == typeVideo) &&
(mySpBlock.spDrvrSW == drSwApple) &&
(mySpBlock.spDrvrHW == 0xbeef) &&
(mySpBlock.spSlot == i)) {
list[cnt] = i;
cnt ++;
}
}
}
}
}
return cnt;
}

View File

@ -1,7 +1,7 @@
#ifndef __NUBUSFPGA_HW_H__ #ifndef __NUBUSFPGA_HW_H__
#define __NUBUSFPGA_HW_H__ #define __NUBUSFPGA_HW_H__
#define GOBLIN_FB_BASE 0xFC000000 // FIXME !!!! //#define GOBLIN_FB_BASE 0xFC000000 // FIXME !!!!
#define GOBLIN_BT_OFFSET 0x00900000 #define GOBLIN_BT_OFFSET 0x00900000
#define GOBLIN_ACCEL_OFFSET 0x00901000 #define GOBLIN_ACCEL_OFFSET 0x00901000