mirror of
https://github.com/rdolbeau/NuBusFPGA.git
synced 2024-06-17 13:29:40 +00:00
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 {
|
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
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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); */
|
||||||
|
|
||||||
|
|
|
@ -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 **** */
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
Binary file not shown.
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue
Block a user