detect slot in INIT; detect slot in RAMDsk driver ; auto-mount RAMDDsk
This commit is contained in:
parent
724d4406f9
commit
c6d6e26438
|
@ -12,6 +12,7 @@
|
|||
|
||||
struct RAMDrvContext {
|
||||
DrvSts2 drvsts;
|
||||
char slot;
|
||||
};
|
||||
|
||||
#define DRIVE_SIZE_BYTES ((256ul-8ul)*1024ul*1024ul) // FIXME: mem size minus fb size
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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); */
|
||||
|
||||
|
|
|
@ -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 **** */
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
Binary file not shown.
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue