diff --git a/nubus-to-ztex-gateware/DeclROM/NuBusFPGARAMDskDrvr.h b/nubus-to-ztex-gateware/DeclROM/NuBusFPGARAMDskDrvr.h index 65664a8..16b19df 100644 --- a/nubus-to-ztex-gateware/DeclROM/NuBusFPGARAMDskDrvr.h +++ b/nubus-to-ztex-gateware/DeclROM/NuBusFPGARAMDskDrvr.h @@ -12,6 +12,7 @@ struct RAMDrvContext { DrvSts2 drvsts; + char slot; }; #define DRIVE_SIZE_BYTES ((256ul-8ul)*1024ul*1024ul) // FIXME: mem size minus fb size diff --git a/nubus-to-ztex-gateware/DeclROM/NuBusFPGARAMDskDrvr_Ctrl.c b/nubus-to-ztex-gateware/DeclROM/NuBusFPGARAMDskDrvr_Ctrl.c index 0246b3f..c4bac91 100644 --- a/nubus-to-ztex-gateware/DeclROM/NuBusFPGARAMDskDrvr_Ctrl.c +++ b/nubus-to-ztex-gateware/DeclROM/NuBusFPGARAMDskDrvr_Ctrl.c @@ -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; diff --git a/nubus-to-ztex-gateware/DeclROM/NuBusFPGARAMDskDrvr_OpenClose.c b/nubus-to-ztex-gateware/DeclROM/NuBusFPGARAMDskDrvr_OpenClose.c index f6ccd9f..c1c250c 100644 --- a/nubus-to-ztex-gateware/DeclROM/NuBusFPGARAMDskDrvr_OpenClose.c +++ b/nubus-to-ztex-gateware/DeclROM/NuBusFPGARAMDskDrvr_OpenClose.c @@ -3,6 +3,8 @@ /* duplicated */ void MyAddDrive(short drvrRefNum, short drvNum, DrvQElPtr qEl); +#include + 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); */ diff --git a/nubus-to-ztex-gateware/DeclROM/NuBusFPGARAMDskDrvr_Prime.c b/nubus-to-ztex-gateware/DeclROM/NuBusFPGARAMDskDrvr_Prime.c index c58e7f4..3a01bc9 100644 --- a/nubus-to-ztex-gateware/DeclROM/NuBusFPGARAMDskDrvr_Prime.c +++ b/nubus-to-ztex-gateware/DeclROM/NuBusFPGARAMDskDrvr_Prime.c @@ -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 **** */ diff --git a/nubus-to-ztex-gateware/DeclROM/NuBusFPGARAMDskDrvr_Status.c b/nubus-to-ztex-gateware/DeclROM/NuBusFPGARAMDskDrvr_Status.c index 5c8f854..3e7c099 100644 --- a/nubus-to-ztex-gateware/DeclROM/NuBusFPGARAMDskDrvr_Status.c +++ b/nubus-to-ztex-gateware/DeclROM/NuBusFPGARAMDskDrvr_Status.c @@ -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; diff --git a/nubus-to-ztex-gateware/NuBusFPGAInit/NuBusFPGAInit.c b/nubus-to-ztex-gateware/NuBusFPGAInit/NuBusFPGAInit.c index ef084d6..8b23c46 100644 --- a/nubus-to-ztex-gateware/NuBusFPGAInit/NuBusFPGAInit.c +++ b/nubus-to-ztex-gateware/NuBusFPGAInit/NuBusFPGAInit.c @@ -3,6 +3,8 @@ #include #include #include +#include +#include #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; +} \ No newline at end of file diff --git a/nubus-to-ztex-gateware/NuBusFPGAInit/NuBusFPGAInit.rsrc.bin b/nubus-to-ztex-gateware/NuBusFPGAInit/NuBusFPGAInit.rsrc.bin index 90f1a8a..fef1ce8 100644 Binary files a/nubus-to-ztex-gateware/NuBusFPGAInit/NuBusFPGAInit.rsrc.bin and b/nubus-to-ztex-gateware/NuBusFPGAInit/NuBusFPGAInit.rsrc.bin differ diff --git a/nubus-to-ztex-gateware/NuBusFPGAInit/NuBusFPGA_HW.h b/nubus-to-ztex-gateware/NuBusFPGAInit/NuBusFPGA_HW.h index 342e4f2..08b4a54 100644 --- a/nubus-to-ztex-gateware/NuBusFPGAInit/NuBusFPGA_HW.h +++ b/nubus-to-ztex-gateware/NuBusFPGAInit/NuBusFPGA_HW.h @@ -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