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 {
DrvSts2 drvsts;
char slot;
};
#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;
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;

View File

@ -3,6 +3,8 @@
/* duplicated */
void MyAddDrive(short drvrRefNum, short drvNum, DrvQElPtr qEl);
#include <ROMDefs.h>
OSErr cNuBusFPGARAMDskOpen(IOParamPtr pb, /* DCtlPtr */ AuxDCEPtr dce)
{
DrvSts2 *dsptr; // pointer to the DrvSts2 in our context
@ -10,13 +12,32 @@ OSErr cNuBusFPGARAMDskOpen(IOParamPtr pb, /* DCtlPtr */ AuxDCEPtr dce)
struct RAMDrvContext *ctx;
OSErr ret = noErr;
char busMode;
char slot;
busMode = 1;
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); */
if (dce->dCtlStorage == nil) {
@ -36,6 +57,7 @@ OSErr cNuBusFPGARAMDskOpen(IOParamPtr pb, /* DCtlPtr */ AuxDCEPtr dce)
HLock(dce->dCtlStorage);
ctx = *(struct RAMDrvContext **)dce->dCtlStorage;
ctx->slot = slot;
dsptr = &ctx->drvsts;
// dsptr->track /* current track */
@ -58,27 +80,24 @@ OSErr cNuBusFPGARAMDskOpen(IOParamPtr pb, /* DCtlPtr */ AuxDCEPtr dce)
// MyAddDrive(dsptr->dQRefNum, drvnum, (DrvQElPtr)&dsptr->qLink);
// write_reg(dce, GOBOFB_DEBUG, 0x0000DEAD);
// initialize to our empty volume
{
unsigned char* superslot = 0xc0000000; // FIXME
unsigned long *compressed = 0xFcFF8000; // FIXME
unsigned long *superslot = (unsigned long*)(((unsigned long)ctx->slot) << 28ul);
unsigned long *compressed = (unsigned long*)(dce->dCtlDevBase + 0x00FF8000ul);
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)
/*
write_reg(dce, GOBOFB_DEBUG, res);
write_reg(dce, GOBOFB_DEBUG, 0xDEEEEEAD);
*/
}
// add the drive
MyAddDrive(dsptr->dQRefNum, drvnum, (DrvQElPtr)&dsptr->qLink);
// auto-mount
{
ParamBlockRec pbr;
pbr.volumeParam.ioVRefNum = dsptr->dQDrive;
ret = PBMountVol(&pbr);
}
}
SwapMMUMode ( &busMode );
@ -92,7 +111,7 @@ OSErr cNuBusFPGARAMDskClose(IOParamPtr pb, /* DCtlPtr */ AuxDCEPtr dce)
OSErr ret = noErr;
//RAMDrvContext *ctx = *(RAMDrvContext**)dce->dCtlStorage;
dce->dCtlDevBase = 0xfc000000;
/* dce->dCtlDevBase = 0xfc000000; */
/* write_reg(dce, GOBOFB_DEBUG, 0xDEAD0001); */

View File

@ -6,8 +6,6 @@ OSErr cNuBusFPGARAMDskPrime(IOParamPtr pb, /* DCtlPtr */ AuxDCEPtr dce)
OSErr ret = noErr;
struct RAMDrvContext *ctx;
dce->dCtlDevBase = 0xfc000000;
/* write_reg(dce, GOBOFB_DEBUG, 0xDEAD0003); */
/* write_reg(dce, GOBOFB_DEBUG, pb->ioTrap); */
/* write_reg(dce, GOBOFB_DEBUG, pb->ioPosMode); */
@ -17,7 +15,7 @@ OSErr cNuBusFPGARAMDskPrime(IOParamPtr pb, /* DCtlPtr */ AuxDCEPtr dce)
ctx = *(struct RAMDrvContext**)dce->dCtlStorage;
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;
/* IOParamPtr: Devices 1-53 (p73) */
/* **** WHERE **** */

View File

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

View File

@ -3,6 +3,8 @@
#include <OSUtils.h>
#include <Types.h>
#include <QuickDraw.h>
#include <Slots.h>
#include <ROMDefs.h>
#include "NuBusFPGA_HW.h"
@ -15,13 +17,9 @@
// #define QEMU
//extern pascal void CopyBits(const BitMap *srcBits, const BitMap *dstBits, const Rect *srcRect, const Rect *dstRect, short mode, RgnHandle maskRgn) ONEWORDINLINE(0xA8EC);
//extern pascal void StdBits(const BitMap *srcBits, const Rect *srcRect, const Rect *dstRect, short mode, RgnHandle maskRgn) ONEWORDINLINE(0xA8EB);
#if 0
typedef pascal void (*StdBitsProc)(BitMap *srcBits, Rect *srcRect, Rect *dstRect, short mode, RgnHandle maskRgn);
StdBitsProc oldStdBits;
#endif
int hwblit(char* stack, char* p_fb_base, /* short dstshift, */ short mode, Pattern* pat, PixMapPtr dstpix, PixMapPtr srcpix, Rect *dstrect, Rect *srcrect);
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]);
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;
@ -278,7 +276,7 @@ int hwblit(char* stack, char* p_fb_base, /* short dstshift, */ short mode, Patte
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
// a3: dstrect
// a4: srcpix
@ -331,7 +329,9 @@ pascal asm void myBitBlt(BitMap *srcBits, BitMap *maskBits, BitMap *dstBits, Rec
void main(void)
{
long oldA4;
short cnt;
char list[6];
char slot;
Handle h;
struct goblin_bt_regs* bt;
@ -341,7 +341,15 @@ void main(void)
oldA4 = SetCurrentA4();
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);
accel_base = ((char*)fb_base + GOBLIN_ACCEL_OFFSET);
@ -362,10 +370,54 @@ void main(void)
//*debug_ptr = (unsigned long)oldBitBlt;
SetToolTrapAddress((UniversalProcPtr)myBitBlt, _BitBlt);
ShowInitIcon(128, true);
ShowInitIcon(121 + slot, true);
finish:
/* restore the a4 world */
SetA4(oldA4);
// *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__
#define __NUBUSFPGA_HW_H__
#define GOBLIN_FB_BASE 0xFC000000 // FIXME !!!!
//#define GOBLIN_FB_BASE 0xFC000000 // FIXME !!!!
#define GOBLIN_BT_OFFSET 0x00900000
#define GOBLIN_ACCEL_OFFSET 0x00901000