mirror of
https://github.com/rdolbeau/NuBusFPGA.git
synced 2025-02-26 01:29:12 +00:00
in _sampling, map whole SDRAm in superslot and use the first 248 Mib as a RAM disk with driver in the DeclRom
This commit is contained in:
parent
9b9f0efb6e
commit
2000161727
@ -27,7 +27,10 @@ RB1s = HRES/8
|
||||
RB15s = HRES*2
|
||||
RB24s = HRES*4
|
||||
|
||||
DrHwNuBusFPGA = 0xBEEF /* placeholder */
|
||||
DrHwNuBusFPGA = 0xBEEF /* placeholder for GoboFB */
|
||||
DrHwNuBusFPGADsk = 0xBEEE /* placeholder for RAM Dsk*/
|
||||
|
||||
typeDrive = 0x1000 /* placeholder for RAM Dsk*/
|
||||
|
||||
defmBaseOffset = 0 /* beginning, placeholder */
|
||||
|
||||
|
@ -12,7 +12,9 @@ APPLEINCS=${NS816DECLROMDIR}/atrap.inc ${NS816DECLROMDIR}/declrom.inc ${NS816DEC
|
||||
HRES=1920
|
||||
VRES=1080
|
||||
|
||||
CSRC=NuBusFPGADrvr_OpenClose.c NuBusFPGADrvr_Ctrl.c NuBusFPGADrvr_Status.c NuBusFPGAPrimaryInit_Primary.c NuBusFPGASecondaryInit_Secondary.c
|
||||
CSRC_VIDEO=NuBusFPGADrvr_OpenClose.c NuBusFPGADrvr_Ctrl.c NuBusFPGADrvr_Status.c NuBusFPGAPrimaryInit_Primary.c NuBusFPGASecondaryInit_Secondary.c
|
||||
CSRC_RAMDSK=NuBusFPGARAMDskDrvr_OpenClose.c NuBusFPGARAMDskDrvr_Ctrl.c NuBusFPGARAMDskDrvr_Prime.c NuBusFPGARAMDskDrvr_Status.c
|
||||
CSRC=${CSRC_VIDEO} ${CSRC_RAMDSK}
|
||||
CSRC_ASM=${CSRC:.c=.s}
|
||||
|
||||
all: vid_decl_rom.bin vid_decl_rom.srec
|
||||
@ -37,6 +39,29 @@ NuBusFPGADrvr_Status.s: NuBusFPGADrvr_Status.c NuBusFPGADrvr.h
|
||||
sed -i -e 's/^\([^a-zA-Z0-9_]*\.globl.*\)/# --- \1/' $@
|
||||
sed -i -e 's/\.\(L[0-9][0-9]*\)/.Status_\1/g' $@
|
||||
|
||||
|
||||
NuBusFPGARAMDskDrvr_OpenClose.s: NuBusFPGARAMDskDrvr_OpenClose.c NuBusFPGARAMDskDrvr.h
|
||||
${CC} -march=68020 -mcpu=68020 -O2 $< -S -o $@ -DHRES=${HRES} -DVRES=${VRES}
|
||||
sed -i -e 's/^\([^a-zA-Z0-9_]*\.globl.*\)/# --- \1/' $@
|
||||
sed -i -e 's/\.\(L[0-9][0-9]*\)/.RDOpenClose_\1/g' $@
|
||||
|
||||
NuBusFPGARAMDskDrvr_Prime.s: NuBusFPGARAMDskDrvr_Prime.c NuBusFPGARAMDskDrvr.h
|
||||
${CC} -march=68020 -mcpu=68020 -O2 $< -S -o $@ -DHRES=${HRES} -DVRES=${VRES}
|
||||
sed -i -e 's/^\([^a-zA-Z0-9_]*\.globl.*\)/# --- \1/' $@
|
||||
sed -i -e 's/\.\(L[0-9][0-9]*\)/.RDPrime_\1/g' $@
|
||||
|
||||
NuBusFPGARAMDskDrvr_Ctrl.s: NuBusFPGARAMDskDrvr_Ctrl.c NuBusFPGARAMDskDrvr.h
|
||||
${CC} -march=68020 -mcpu=68020 -O2 $< -S -o $@ -DHRES=${HRES} -DVRES=${VRES}
|
||||
sed -i -e 's/^\([^a-zA-Z0-9_]*\.globl.*\)/# --- \1/' $@
|
||||
sed -i -e 's/\.\(L[0-9][0-9]*\)/.RDCtrl_\1/g' $@
|
||||
|
||||
NuBusFPGARAMDskDrvr_Status.s: NuBusFPGARAMDskDrvr_Status.c NuBusFPGARAMDskDrvr.h
|
||||
${CC} -march=68020 -mcpu=68020 -O2 $< -S -o $@ -DHRES=${HRES} -DVRES=${VRES}
|
||||
sed -i -e 's/^\([^a-zA-Z0-9_]*\.globl.*\)/# --- \1/' $@
|
||||
sed -i -e 's/\.\(L[0-9][0-9]*\)/.RDStatus_\1/g' $@
|
||||
|
||||
|
||||
|
||||
NuBusFPGAPrimaryInit_Primary.s: NuBusFPGAPrimaryInit_Primary.c NuBusFPGADrvr.h
|
||||
${CC} -march=68020 -mcpu=68020 -O2 $< -S -o $@ -DHRES=${HRES} -DVRES=${VRES}
|
||||
sed -i -e 's/^\([^a-zA-Z0-9_]*\.globl.*\)/# --- \1/' $@
|
||||
|
24
nubus-to-ztex-gateware/DeclROM/NuBusFPGARAMDskDrvr.h
Normal file
24
nubus-to-ztex-gateware/DeclROM/NuBusFPGARAMDskDrvr.h
Normal file
@ -0,0 +1,24 @@
|
||||
#ifndef __NUBUSFPGARAMDSKDRVR_H__
|
||||
#define __NUBUSFPGARAMDSKDRVR_H__
|
||||
|
||||
#include <Files.h>
|
||||
#include <Devices.h>
|
||||
#include <Slots.h>
|
||||
#include <MacErrors.h>
|
||||
#include <MacMemory.h>
|
||||
#include <Disks.h>
|
||||
|
||||
#include "NuBusFPGADrvr.h"
|
||||
|
||||
struct RAMDrvContext {
|
||||
DrvSts2 drvsts;
|
||||
//Ptr origcopyfunc;
|
||||
//Ptr origdisk; /* keep unstripped pointers for Dispose*/
|
||||
//unsigned char * disk;
|
||||
//char initialized;
|
||||
//char alreadyalloced;
|
||||
};
|
||||
|
||||
#define DRIVE_SIZE_BYTES ((256ul-8ul)*1024ul*1024ul) // FIXME: mem size minus fb size
|
||||
|
||||
#endif
|
96
nubus-to-ztex-gateware/DeclROM/NuBusFPGARAMDskDrvr.s
Normal file
96
nubus-to-ztex-gateware/DeclROM/NuBusFPGARAMDskDrvr.s
Normal file
@ -0,0 +1,96 @@
|
||||
NuBusFPGARAMDskDrvr:
|
||||
.word 0x4f00 /* 0x4f00: ctl, status, read, write, needsLock [Devices.a] */
|
||||
.word 0
|
||||
.word 0
|
||||
.word 0
|
||||
/* Entry point offset table */
|
||||
.word _NuBusFPGARAMDskOpen - NuBusFPGARAMDskDrvr /* open routine */
|
||||
.word _NuBusFPGARAMDskPrime - NuBusFPGARAMDskDrvr /* prime */
|
||||
.word _NuBusFPGARAMDskCtl - NuBusFPGARAMDskDrvr /* control */
|
||||
.word _NuBusFPGARAMDskStatus- NuBusFPGARAMDskDrvr /* status */
|
||||
.word _NuBusFPGARAMDskClose - NuBusFPGARAMDskDrvr /* close */
|
||||
|
||||
_NuBusFPGARAMDskTitle:
|
||||
.byte _NuBusFPGARAMDskTitle_StringEnd-.-1 /* pascal string length */
|
||||
.ascii ".NuBusFPGARAMDsk_Drvr"
|
||||
_NuBusFPGARAMDskTitle_StringEnd:
|
||||
.word 0 /* version number */
|
||||
|
||||
/* A0 pointer to driver parameter block */
|
||||
/* A1 pointer to driver device control entry */
|
||||
ALIGN 2
|
||||
_NuBusFPGARAMDskOpen:
|
||||
MOVE.L %A1, -(%A7)
|
||||
MOVE.L %A0, -(%A7)
|
||||
JSR cNuBusFPGARAMDskOpen
|
||||
MOVE.L (%A7)+, %a0
|
||||
MOVE.L (%A7)+, %a1
|
||||
rts
|
||||
_NuBusFPGARAMDskOpenError:
|
||||
moveq #-23,%d0 /* error flag */
|
||||
rts
|
||||
|
||||
_NuBusFPGARAMDskPrime:
|
||||
MOVE.L %A1, -(%A7)
|
||||
MOVE.L %A0, -(%A7)
|
||||
jsr cNuBusFPGARAMDskPrime
|
||||
MOVE.L (%A7)+, %a0
|
||||
MOVE.L (%A7)+, %a1
|
||||
BTST #9,%a0@(ioTrap) /* noQueueBit is 9 */
|
||||
BEQ.S _RAMDskGoIODone
|
||||
rts
|
||||
|
||||
_NuBusFPGARAMDskCtl:
|
||||
MOVE.L %A1, -(%A7)
|
||||
MOVE.L %A0, -(%A7)
|
||||
jsr cNuBusFPGARAMDskCtl
|
||||
MOVE.L (%A7)+, %a0
|
||||
MOVE.L (%A7)+, %a1
|
||||
BTST #9,%a0@(ioTrap) /* noQueueBit is 9 */
|
||||
BEQ.S _RAMDskGoIODone
|
||||
rts
|
||||
|
||||
_NuBusFPGARAMDskStatus:
|
||||
MOVE.L %A1, -(%A7)
|
||||
MOVE.L %A0, -(%A7)
|
||||
jsr cNuBusFPGARAMDskStatus
|
||||
MOVE.L (%A7)+, %a0
|
||||
MOVE.L (%A7)+, %a1
|
||||
BTST #9,%a0@(ioTrap) /* noQueueBit is 9 */
|
||||
BEQ.S _RAMDskGoIODone
|
||||
rts
|
||||
|
||||
_NuBusFPGARAMDskClose:
|
||||
MOVE.L %A1, -(%A7)
|
||||
MOVE.L %A0, -(%A7)
|
||||
jsr cNuBusFPGARAMDskClose
|
||||
MOVE.L (%A7)+, %a0
|
||||
MOVE.L (%A7)+, %a1
|
||||
|
||||
MyAddDrive:
|
||||
LINK %A6,#0
|
||||
CLR.L %D0
|
||||
MOVE.W 10(%A6),%D0
|
||||
SWAP %D0
|
||||
MOVE.W 8(%A6),%D0
|
||||
MOVEA.L 12(%A6),%A0
|
||||
DC.W 0xA04E /* _AddDrive */
|
||||
UNLK %A6
|
||||
RTS
|
||||
|
||||
_RAMDskGoIODone:
|
||||
/* MOVEA.L JIODone,%A0 */
|
||||
/* JMP (%A0) */
|
||||
movel JIODone,%sp@-
|
||||
rts
|
||||
|
||||
.include "NuBusFPGARAMDskDrvr_OpenClose.s"
|
||||
.text
|
||||
.include "NuBusFPGARAMDskDrvr_Prime.s"
|
||||
.text
|
||||
.include "NuBusFPGARAMDskDrvr_Ctrl.s"
|
||||
.text
|
||||
.include "NuBusFPGARAMDskDrvr_Status.s"
|
||||
.text
|
||||
|
||||
ALIGN 2
|
32
nubus-to-ztex-gateware/DeclROM/NuBusFPGARAMDskDrvr_Ctrl.c
Normal file
32
nubus-to-ztex-gateware/DeclROM/NuBusFPGARAMDskDrvr_Ctrl.c
Normal file
@ -0,0 +1,32 @@
|
||||
#include "NuBusFPGARAMDskDrvr.h"
|
||||
|
||||
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); */
|
||||
|
||||
ctx = *(struct RAMDrvContext**)dce->dCtlStorage;
|
||||
|
||||
if (ctx) {
|
||||
switch (pb->csCode)
|
||||
{
|
||||
case kFormat:
|
||||
ret = noErr;
|
||||
break;
|
||||
default:
|
||||
ret = controlErr;
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
ret = offLinErr; /* r/w requested for an off-line drive */
|
||||
goto done;
|
||||
}
|
||||
|
||||
done:
|
||||
return ret;
|
||||
}
|
@ -0,0 +1,76 @@
|
||||
#include "NuBusFPGARAMDskDrvr.h"
|
||||
|
||||
/* duplicated */
|
||||
void MyAddDrive(short drvrRefNum, short drvNum, DrvQElPtr qEl);
|
||||
|
||||
OSErr cNuBusFPGARAMDskOpen(IOParamPtr pb, /* DCtlPtr */ AuxDCEPtr dce)
|
||||
{
|
||||
DrvSts2 *dsptr; // pointer to the DrvSts2 in our context
|
||||
DrvQElPtr dq;
|
||||
int drvnum = 1;
|
||||
struct RAMDrvContext *ctx;
|
||||
OSErr ret = noErr;
|
||||
|
||||
dce->dCtlDevBase = 0xfc000000;
|
||||
|
||||
/* write_reg(dce, GOBOFB_DEBUG, 0xDEAD0000); */
|
||||
/* write_reg(dce, GOBOFB_DEBUG, dce->dCtlRefNum); */
|
||||
|
||||
if (dce->dCtlStorage == nil) {
|
||||
for(dq = (DrvQElPtr)(GetDrvQHdr())->qHead; dq; dq = (DrvQElPtr)dq->qLink) {
|
||||
if (dq->dQDrive >= drvnum)
|
||||
drvnum = dq->dQDrive+1;
|
||||
}
|
||||
|
||||
dce->dCtlStorage = NewHandleSysClear(sizeof(struct RAMDrvContext));
|
||||
if (dce->dCtlStorage == nil) {
|
||||
ret = openErr;
|
||||
goto done;
|
||||
}
|
||||
|
||||
HLock(dce->dCtlStorage);
|
||||
|
||||
ctx = *(struct RAMDrvContext **)dce->dCtlStorage;
|
||||
|
||||
dsptr = &ctx->drvsts;
|
||||
// dsptr->track /* current track */
|
||||
dsptr->writeProt = 0; /* bit 7 = 1 if volume is locked */
|
||||
dsptr->diskInPlace = 8; /* disk in drive */
|
||||
// dsptr->installed /* drive installed */
|
||||
// dsptr->sides /* -1 for 2-sided, 0 for 1-sided */
|
||||
// dsptr->QLink /* next queue entry */
|
||||
dsptr->qType = 1; /* 1 for HD20 */ /* Files 2-85 (p173) : 1 to enable S1 */
|
||||
dsptr->dQDrive = drvnum; /* drive number */
|
||||
dsptr->dQRefNum = dce->dCtlRefNum; /* driver reference number */
|
||||
// dsptr->dQFSID /* file system ID */
|
||||
dsptr->driveSize = ((DRIVE_SIZE_BYTES/512ul) & 0x0000FFFFul); /* (no comments in Disks.h) */
|
||||
dsptr->driveS1 = ((DRIVE_SIZE_BYTES/512ul) & 0xFFFF0000ul) >> 16; /* */
|
||||
// dsptr->driveType
|
||||
// dsptr->driveManf
|
||||
// dsptr->driveChar
|
||||
// dsptr->driveMisc
|
||||
|
||||
MyAddDrive(dsptr->dQRefNum, drvnum, (DrvQElPtr)&dsptr->qLink);
|
||||
}
|
||||
|
||||
done:
|
||||
return ret;
|
||||
}
|
||||
|
||||
OSErr cNuBusFPGARAMDskClose(IOParamPtr pb, /* DCtlPtr */ AuxDCEPtr dce)
|
||||
{
|
||||
OSErr ret = noErr;
|
||||
//RAMDrvContext *ctx = *(RAMDrvContext**)dce->dCtlStorage;
|
||||
|
||||
dce->dCtlDevBase = 0xfc000000;
|
||||
|
||||
/* write_reg(dce, GOBOFB_DEBUG, 0xDEAD0001); */
|
||||
|
||||
if (dce->dCtlStorage) {
|
||||
HUnlock(dce->dCtlStorage);
|
||||
DisposeHandle(dce->dCtlStorage);
|
||||
dce->dCtlStorage = NULL;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
62
nubus-to-ztex-gateware/DeclROM/NuBusFPGARAMDskDrvr_Prime.c
Normal file
62
nubus-to-ztex-gateware/DeclROM/NuBusFPGARAMDskDrvr_Prime.c
Normal file
@ -0,0 +1,62 @@
|
||||
#include "NuBusFPGARAMDskDrvr.h"
|
||||
|
||||
/* Devices 1-34 (p54) */
|
||||
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); */
|
||||
/* write_reg(dce, GOBOFB_DEBUG, pb->ioReqCount); */
|
||||
/* write_reg(dce, GOBOFB_DEBUG, pb->ioPosOffset); */
|
||||
|
||||
ctx = *(struct RAMDrvContext**)dce->dCtlStorage;
|
||||
|
||||
if (ctx) {
|
||||
unsigned char* superslot = 0xc0000000; //(unsigned char*)(((unsigned long)dce->dCtlSlot) << 28ul);
|
||||
unsigned long abs_offset = 0;
|
||||
/* IOParamPtr: Devices 1-53 (p73) */
|
||||
/* **** WHERE **** */
|
||||
switch(pb->ioPosMode & 0x000F) { // ignore rdVerify
|
||||
case fsAtMark:
|
||||
abs_offset = dce->dCtlPosition;
|
||||
break;
|
||||
case fsFromStart:
|
||||
abs_offset = pb->ioPosOffset;
|
||||
break;
|
||||
case fsFromMark:
|
||||
abs_offset = dce->dCtlPosition + pb->ioPosOffset;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
/* **** WHAT **** */
|
||||
/* Devices 1-33 (p53) */
|
||||
if ((pb->ioTrap & 0x00FF) == aRdCmd) {
|
||||
if(!(pb->ioPosMode & 0x40)) { // rdVerify, let's ignore it for now
|
||||
BlockMoveData((superslot + abs_offset), pb->ioBuffer, pb->ioReqCount);
|
||||
}
|
||||
pb->ioActCount = pb->ioReqCount;
|
||||
dce->dCtlPosition = abs_offset + pb->ioReqCount;
|
||||
pb->ioPosOffset = dce->dCtlPosition;
|
||||
} else if ((pb->ioTrap & 0x00FF) == aWrCmd) {
|
||||
BlockMoveData(pb->ioBuffer, (superslot + abs_offset), pb->ioReqCount);
|
||||
pb->ioActCount = pb->ioReqCount;
|
||||
dce->dCtlPosition = abs_offset + pb->ioReqCount;
|
||||
pb->ioPosOffset = dce->dCtlPosition;
|
||||
} else {
|
||||
ret = paramErr;
|
||||
goto done;
|
||||
}
|
||||
} else {
|
||||
ret = offLinErr; /* r/w requested for an off-line drive */
|
||||
goto done;
|
||||
}
|
||||
|
||||
done:
|
||||
return ret;
|
||||
}
|
28
nubus-to-ztex-gateware/DeclROM/NuBusFPGARAMDskDrvr_Status.c
Normal file
28
nubus-to-ztex-gateware/DeclROM/NuBusFPGARAMDskDrvr_Status.c
Normal file
@ -0,0 +1,28 @@
|
||||
#include "NuBusFPGARAMDskDrvr.h"
|
||||
|
||||
OSErr cNuBusFPGARAMDskStatus(CntrlParamPtr pb, /* DCtlPtr */ AuxDCEPtr dce)
|
||||
{
|
||||
OSErr ret = noErr;
|
||||
struct RAMDrvContext *ctx;
|
||||
|
||||
dce->dCtlDevBase = 0xfc000000;
|
||||
|
||||
/* write_reg(dce, GOBOFB_DEBUG, 0xDEAD0004); */
|
||||
|
||||
ctx = *(struct RAMDrvContext**)dce->dCtlStorage;
|
||||
|
||||
if (ctx) {
|
||||
switch (pb->csCode)
|
||||
{
|
||||
default:
|
||||
ret = statusErr;
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
ret = offLinErr; /* r/w requested for an off-line drive */
|
||||
goto done;
|
||||
}
|
||||
|
||||
done:
|
||||
return ret;
|
||||
}
|
@ -7,11 +7,13 @@
|
||||
.include "DepVideo.inc"
|
||||
|
||||
sRsrc_Board = 1 /* board sResource (>0 & <128) */
|
||||
sRsrc_VidHiRes = 0x80 /* functional sResources */
|
||||
sRsrc_GoboFB = 0x80 /* functional sResources */
|
||||
sRsrc_RAMDsk = 0x81 /* functional sResources */
|
||||
|
||||
_sRsrcDir:
|
||||
OSLstEntry sRsrc_Board,_sRsrc_Board /* board sRsrc List */
|
||||
OSLstEntry sRsrc_VidHiRes,_sRsrc_VidHiRes /* video sRsrc List */
|
||||
OSLstEntry sRsrc_Board,_sRsrc_Board /* board sRsrc List */
|
||||
OSLstEntry sRsrc_GoboFB,_sRsrc_GoboFB /* video sRsrc List */
|
||||
OSLstEntry sRsrc_RAMDsk,_sRsrc_RAMDsk /* video sRsrc List */
|
||||
.long EndOfList
|
||||
|
||||
_sRsrc_Board:
|
||||
@ -31,7 +33,7 @@ _BoardType:
|
||||
.short 0
|
||||
|
||||
_BoardName:
|
||||
.string "NuBusFPGA Video\0" /* name of board */
|
||||
.string "NuBusFPGA GoboFB\0" /* name of board */
|
||||
ALIGN 2
|
||||
|
||||
/* _VidICON ; optional icon, not needed */
|
||||
@ -74,21 +76,21 @@ _Date:
|
||||
ALIGN 2
|
||||
|
||||
_VModeName:
|
||||
OSLstEntry sRsrc_VidHiRes, _ScreenNameVidHiRes
|
||||
OSLstEntry sRsrc_GoboFB, _ScreenNameGoboFB
|
||||
DatLstEntry endOfList, 0
|
||||
|
||||
ALIGN 2
|
||||
_ScreenNameVidHiRes:
|
||||
.long _ScreenNameVidHiResEnd - _ScreenNameVidHiRes
|
||||
_ScreenNameGoboFB:
|
||||
.long _ScreenNameGoboFBEnd - _ScreenNameGoboFB
|
||||
.word 0
|
||||
.string "That one resolution\0"
|
||||
_ScreenNameVidHiResEnd:
|
||||
.string "GoblinFB Native\0"
|
||||
_ScreenNameGoboFBEnd:
|
||||
|
||||
ALIGN 2
|
||||
_sRsrc_VidHiRes:
|
||||
OSLstEntry sRsrcType,_VideoType /* video type descriptor */
|
||||
OSLstEntry sRsrcName,_VideoName /* offset to driver name string */
|
||||
OSLstEntry sRsrcDrvrDir,_VidDrvrDir /* offset to driver directory */
|
||||
_sRsrc_GoboFB:
|
||||
OSLstEntry sRsrcType,_GoboFBType /* video type descriptor */
|
||||
OSLstEntry sRsrcName,_GoboFBName /* offset to driver name string */
|
||||
OSLstEntry sRsrcDrvrDir,_GoboFBDrvrDir /* offset to driver directory */
|
||||
DatLstEntry sRsrcFlags,6 /* force 32 bits mode & open */
|
||||
DatLstEntry sRsrcHWDevId,1 /* hardware device ID */
|
||||
OSLstEntry MinorBaseOS,_MinorBase /* offset to frame buffer array */
|
||||
@ -104,30 +106,31 @@ _sRsrc_VidHiRes:
|
||||
.long EndOfList /* end of list */
|
||||
|
||||
ALIGN 2
|
||||
_VideoType:
|
||||
_GoboFBType:
|
||||
.short catDisplay /* <Category> */
|
||||
.short typeVideo /* <Type> */
|
||||
.short drSwApple /* <DrvrSw> */
|
||||
.short DrHwNuBusFPGA /* <DrvrHw> */
|
||||
|
||||
_VideoName:
|
||||
.string "Video_NuBusFPGA" /* video driver name */
|
||||
_GoboFBName:
|
||||
.string "GoboFB_NuBusFPGA" /* video driver name */
|
||||
|
||||
_MinorBase:
|
||||
.long defMinorBase /* frame buffer offset */
|
||||
_MinorLength:
|
||||
.long defMinorLength /* frame buffer length */
|
||||
|
||||
ALIGN 2
|
||||
_VidDrvrDir:
|
||||
OSLstEntry sMacOS68020,_DrvrMacOS68020 /* driver directory for Mac OS */
|
||||
_GoboFBDrvrDir:
|
||||
OSLstEntry sMacOS68020,_GoboFBDrvrMacOS68020 /* driver directory for Mac OS */
|
||||
.long EndOfList
|
||||
|
||||
ALIGN 2
|
||||
_DrvrMacOS68020:
|
||||
.long _End020Drvr-. /* physical block size */
|
||||
_GoboFBDrvrMacOS68020:
|
||||
.long _GoboFBEnd020Drvr-. /* physical block size */
|
||||
.include "NuBusFPGADrvr.s" /* driver code */
|
||||
.text
|
||||
_End020Drvr:
|
||||
_GoboFBEnd020Drvr:
|
||||
|
||||
/* ALIGN 2 */
|
||||
/* _GammaDirS: */
|
||||
@ -295,3 +298,34 @@ _HRV15Parms:
|
||||
.long defmPlaneBytes /* bmPlaneBytes */
|
||||
_EndHRV15Parms:
|
||||
|
||||
ALIGN 2
|
||||
_sRsrc_RAMDsk:
|
||||
OSLstEntry sRsrcType,_RAMDskType /* video type descriptor */
|
||||
OSLstEntry sRsrcName,_RAMDskName /* offset to driver name string */
|
||||
OSLstEntry sRsrcDrvrDir,_RAMDskDrvrDir /* offset to driver directory */
|
||||
DatLstEntry sRsrcFlags,6 /* force 32 bits mode & open */
|
||||
DatLstEntry sRsrcHWDevId,2 /* hardware device ID */
|
||||
.long EndOfList /* end of list */
|
||||
|
||||
ALIGN 2
|
||||
_RAMDskType:
|
||||
.short catProto /* <Category> */
|
||||
.short typeDrive /* custom */ /* <Type> */
|
||||
.short drSwApple /* <DrvrSw> */
|
||||
.short DrHwNuBusFPGADsk /* <DrvrHw> */
|
||||
|
||||
_RAMDskName:
|
||||
.string "RAMDsk_NuBusFPGA" /* video driver name */
|
||||
|
||||
ALIGN 2
|
||||
_RAMDskDrvrDir:
|
||||
OSLstEntry sMacOS68020,_RAMDskDrvrMacOS68020 /* driver directory for Mac OS */
|
||||
.long EndOfList
|
||||
|
||||
ALIGN 2
|
||||
_RAMDskDrvrMacOS68020:
|
||||
.long _RAMDskEnd020Drvr-. /* physical block size */
|
||||
.include "NuBusFPGARAMDskDrvr.s" /* driver code */
|
||||
.text
|
||||
_RAMDskEnd020Drvr:
|
||||
|
||||
|
@ -72,12 +72,15 @@ class NuBus(Module):
|
||||
# address rewriting
|
||||
# can change every cycle *on falling edge*
|
||||
processed_ad = Signal(32)
|
||||
processed_super_ad = Signal(32)
|
||||
self.comb += [
|
||||
processed_ad[0:23].eq(sampled_ad[0:23]),
|
||||
If(~sampled_ad[23], # first 8 MiB of slot space: remap to last 8 Mib of SDRAM
|
||||
processed_ad[23:32].eq(Cat(Signal(1, reset=1), Signal(8, reset = 0x8f))), # 0x8f8...
|
||||
).Else( # second 8 MiB: direct access
|
||||
processed_ad[23:32].eq(Cat(sampled_ad[23], Signal(8, reset = 0xf0)))), # 24 bits, a.k.a 22 bits of words
|
||||
processed_super_ad[0:28].eq(sampled_ad[0:28]),
|
||||
processed_super_ad[28:32].eq(Signal(4, reset = 0x8)),
|
||||
]
|
||||
|
||||
# decoded signals, exposing decoded results from the sampled signals
|
||||
@ -88,6 +91,7 @@ class NuBus(Module):
|
||||
decoded_busy = Signal()
|
||||
# locally evaluated
|
||||
decoded_myslot = Signal()
|
||||
decoded_mysuperslot = Signal()
|
||||
self.comb += [
|
||||
decoded_myslot.eq(
|
||||
(sampled_ad[28:32] == 0xF) &
|
||||
@ -95,6 +99,11 @@ class NuBus(Module):
|
||||
(sampled_ad[26] == ~id_i_n[2]) &
|
||||
(sampled_ad[25] == ~id_i_n[1]) &
|
||||
(sampled_ad[24] == ~id_i_n[0])),
|
||||
decoded_mysuperslot.eq(
|
||||
(sampled_ad[31] == ~id_i_n[3]) &
|
||||
(sampled_ad[30] == ~id_i_n[2]) &
|
||||
(sampled_ad[29] == ~id_i_n[1]) &
|
||||
(sampled_ad[28] == ~id_i_n[0])),
|
||||
#led0.eq(decoded_block),
|
||||
]
|
||||
|
||||
@ -160,8 +169,12 @@ class NuBus(Module):
|
||||
)
|
||||
slave_fsm.act("Idle",
|
||||
# only react to transaction start at posedge
|
||||
If(nub_clk_posedge & decoded_myslot & sampled_start & ~sampled_ack & ~sampled_tm1,# & ~decoded_block, # regular read (we always send back 32 bits, so don't worry about byte/word)
|
||||
NextValue(current_adr, processed_ad),
|
||||
If(nub_clk_posedge & (decoded_myslot | decoded_mysuperslot) & sampled_start & ~sampled_ack & ~sampled_tm1,# & ~decoded_block, # regular read (we always send back 32 bits, so don't worry about byte/word)
|
||||
If(decoded_myslot,
|
||||
NextValue(current_adr, processed_ad),
|
||||
).Else( # decoded_mysuperslot,
|
||||
NextValue(current_adr, processed_super_ad),
|
||||
),
|
||||
#NextValue(current_tm0, sampled_tm0),
|
||||
#NextValue(current_tm1, sampled_tm1),
|
||||
#NextValue(current_sel, decoded_sel),
|
||||
@ -170,8 +183,12 @@ class NuBus(Module):
|
||||
# NextValue(decoded_block_memory, 1),),
|
||||
NextValue(read_ctr, read_ctr + 1),
|
||||
NextState("WaitWBRead"),
|
||||
).Elif(nub_clk_posedge & decoded_myslot & sampled_start & ~sampled_ack & sampled_tm1,# & ~decoded_block, # regular write
|
||||
NextValue(current_adr, processed_ad),
|
||||
).Elif(nub_clk_posedge & (decoded_myslot | decoded_mysuperslot) & sampled_start & ~sampled_ack & sampled_tm1,# & ~decoded_block, # regular write
|
||||
If(decoded_myslot,
|
||||
NextValue(current_adr, processed_ad),
|
||||
).Else( # decoded_mysuperslot,
|
||||
NextValue(current_adr, processed_super_ad),
|
||||
),
|
||||
#NextValue(current_tm0, sampled_tm0),
|
||||
#NextValue(current_tm1, sampled_tm1),
|
||||
NextValue(current_sel, decoded_sel),
|
||||
|
Loading…
x
Reference in New Issue
Block a user