Update RFS driver to install ROMS

This commit is contained in:
Philip Smart
2023-03-04 16:01:07 +00:00
parent fe53a4c871
commit bd8cc2e964
52 changed files with 2514 additions and 34 deletions

32
.gitignore vendored
View File

@@ -1685,4 +1685,36 @@ software/linux/project/FusionX/
software/FusionX/src/driver/MZ80A/k64fcpu.c.hld software/FusionX/src/driver/MZ80A/k64fcpu.c.hld
software/linux/buildroot/.config.old software/linux/buildroot/.config.old
software/linux/kernel/scripts/kconfig/.mconf.cmd software/linux/kernel/scripts/kconfig/.mconf.cmd
software/FusionX/src/ttymz/.tmp_versions/
software/FusionX/src/ttymz/.ttymzdrv.ko.cmd
software/FusionX/src/ttymz/Makefile.orig
software/FusionX/src/ttymz/Module.symvers
software/FusionX/src/ttymz/modules.order
software/FusionX/src/ttymz/ttymzdrv.ko
software/FusionX/src/ttymz/ttymzdrv.mod.c
software/FusionX/src/z80drv/.tmp_versions/
software/FusionX/src/z80drv/.z80drv.ko.cmd
software/FusionX/src/z80drv/Kbuild.in
software/FusionX/src/z80drv/MZ80A/emumz.c
software/FusionX/src/z80drv/MZ80A/k64fcpu.c.hld
software/FusionX/src/z80drv/MZ80A/z80driver.c.bad
software/FusionX/src/z80drv/MZ80A/z80vhw_rfs.c.bad
software/FusionX/src/z80drv/Makefile.old
software/FusionX/src/z80drv/Makefile1
software/FusionX/src/z80drv/Makefile3
software/FusionX/src/z80drv/Module.symvers
software/FusionX/src/z80drv/Z80.c.old
software/FusionX/src/z80drv/Z80.c.old2
software/FusionX/src/z80drv/Z80.rc.in
software/FusionX/src/z80drv/Z80.x/
software/FusionX/src/z80drv/Zeta.test/
software/FusionX/src/z80drv/k64fcpu
software/FusionX/src/z80drv/modules.order
software/FusionX/src/z80drv/mz700.rom
software/FusionX/src/z80drv/sa1510.orig
software/FusionX/src/z80drv/test
software/FusionX/src/z80drv/x.mzf
software/FusionX/src/z80drv/z80ctrl
software/FusionX/src/z80drv/z80drv.ko
software/FusionX/src/z80drv/z80drv.mod.c

8
.gitmodules vendored
View File

@@ -1,12 +1,12 @@
[submodule "software/FusionX/src/driver/Z80"] [submodule "software/FusionX/src/driver/Z80"]
path = software/FusionX/src/driver/Z80 path = software/FusionX/src/z80drv/Z80
url = https://github.com/redcode/Z80.git url = https://github.com/redcode/Z80.git
[submodule "software/FusionX/src/driver/Zeta"] [submodule "software/FusionX/src/driver/Zeta"]
path = software/FusionX/src/driver/Zeta path = software/FusionX/src/z80drv/Zeta
url = https://github.com/redcode/Zeta.git url = https://github.com/redcode/Zeta.git
[submodule "software/FusionX/src/driver/6502"] [submodule "software/FusionX/src/driver/6502"]
path = software/FusionX/src/driver/6502 path = software/FusionX/src/z80drv/6502
url = https://github.com/redcode/6502.git url = https://github.com/redcode/6502.git
[submodule "software/FusionX/src/driver/software/FusionX/src/driver/6502"] [submodule "software/FusionX/src/driver/software/FusionX/src/driver/6502"]
path = software/FusionX/src/driver/software/FusionX/src/driver/6502 path = software/FusionX/src/z80drv/software/FusionX/src/driver/6502
url = https://github.com/redcode/6502.git url = https://github.com/redcode/6502.git

View File

@@ -32,15 +32,16 @@ rmmod z80drv 2>/dev/null
insmod z80drv.ko insmod z80drv.ko
sleep 1 sleep 1
# Load the original RFS ROM images.
${FUSIONXDIR}/bin/z80ctrl --loadrom --file ${FUSIONXDIR}/rom/MROM_256_${SCREENWIDTH}c.bin --addr 0x000000 --type 1
${FUSIONXDIR}/bin/z80ctrl --loadrom --file ${FUSIONXDIR}/rom/USER_ROM_256_${SCREENWIDTH}c.bin --addr 0x80000 --type 1
${FUSIONXDIR}/bin/z80ctrl --loadrom --file ${FUSIONXDIR}/rom/USER_ROM_II_256_${SCREENWIDTH}c.bin --addr 0x100000 --type 1
${FUSIONXDIR}/bin/z80ctrl --loadrom --file ${FUSIONXDIR}/rom/USER_ROM_III_256_${SCREENWIDTH}c.bin --addr 0x180000 --type 1
# Add the RFS Virtual Hardware to the driver. # Add the RFS Virtual Hardware to the driver.
${FUSIONXDIR}/bin/z80ctrl --adddev --device rfs ${FUSIONXDIR}/bin/z80ctrl --adddev --device rfs
# Load the original RFS ROM images. These are loaded by the RFS driver but here for reference or to load alternate. If
# alternate roms are loaded then ensure they are loaded prior to the start command below.
#${FUSIONXDIR}/bin/z80ctrl --loadrom --file ${FUSIONXDIR}/rom/MROM_256_${SCREENWIDTH}c.bin --addr 0x000000 --type 1
#${FUSIONXDIR}/bin/z80ctrl --loadrom --file ${FUSIONXDIR}/rom/USER_ROM_256_${SCREENWIDTH}c.bin --addr 0x80000 --type 1
#${FUSIONXDIR}/bin/z80ctrl --loadrom --file ${FUSIONXDIR}/rom/USER_ROM_II_256_${SCREENWIDTH}c.bin --addr 0x100000 --type 1
#${FUSIONXDIR}/bin/z80ctrl --loadrom --file ${FUSIONXDIR}/rom/USER_ROM_III_256_${SCREENWIDTH}c.bin --addr 0x180000 --type 1
# Start the Z80 (ie. MZ-80A virtual processor). # Start the Z80 (ie. MZ-80A virtual processor).
${FUSIONXDIR/bin/z80ctrl --start ${FUSIONXDIR/bin/z80ctrl --start

View File

@@ -32,6 +32,12 @@ rmmod z80drv 2>/dev/null
insmod z80drv.ko insmod z80drv.ko
sleep 1 sleep 1
# Add the TZPU Virtual Hardware to the driver.
${FUSIONXDIR}/bin/z80ctrl --adddev --device tzpu
# Start the K64F Virtual CPU Emulation.
${FUSIONXDIR}/bin/k64fcpu &
# Load the original Monitor and TZFS ROM images. This is done in the K64F daemon but can be manually enabled. # Load the original Monitor and TZFS ROM images. This is done in the K64F daemon but can be manually enabled.
#${FUSIONXDIR}/bin/z80ctrl --loadrom --file ${FUSIONXDIR}/roms/monitor_${SCREENWIDTH}c_sa1510.rom --addr 0x000000 --type 1 #${FUSIONXDIR}/bin/z80ctrl --loadrom --file ${FUSIONXDIR}/roms/monitor_${SCREENWIDTH}c_sa1510.rom --addr 0x000000 --type 1
#${FUSIONXDIR}/bin/z80ctrl --loadrom --file ${FUSIONXDIR}/roms/tzfs.rom --offset 0x000000 --len 0x001800 --addr 0x00E800 --type 1 #${FUSIONXDIR}/bin/z80ctrl --loadrom --file ${FUSIONXDIR}/roms/tzfs.rom --offset 0x000000 --len 0x001800 --addr 0x00E800 --type 1
@@ -39,12 +45,6 @@ sleep 1
#${FUSIONXDIR}/bin/z80ctrl --loadrom --file ${FUSIONXDIR}/roms/tzfs.rom --offset 0x002800 --len 0x001000 --addr 0x02F000 --type 1 #${FUSIONXDIR}/bin/z80ctrl --loadrom --file ${FUSIONXDIR}/roms/tzfs.rom --offset 0x002800 --len 0x001000 --addr 0x02F000 --type 1
#${FUSIONXDIR}/bin/z80ctrl --loadrom --file ${FUSIONXDIR}/roms/tzfs.rom --offset 0x003800 --len 0x001000 --addr 0x03F000 --type 1 #${FUSIONXDIR}/bin/z80ctrl --loadrom --file ${FUSIONXDIR}/roms/tzfs.rom --offset 0x003800 --len 0x001000 --addr 0x03F000 --type 1
# Add the TZPU Virtual Hardware to the driver.
${FUSIONXDIR}/bin/z80ctrl --adddev --device tzpu
# Start the K64F Virtual CPU Emulation.
${FUSIONXDIR}/bin/k64fcpu &
# Ensure the system is set for performance mode with max frequency. # Ensure the system is set for performance mode with max frequency.
# NB: Enabling this prior to starting the Z80 results in a kernel error. # NB: Enabling this prior to starting the Z80 results in a kernel error.
echo performance > /sys/devices//system/cpu/cpufreq/policy0/scaling_governor echo performance > /sys/devices//system/cpu/cpufreq/policy0/scaling_governor

File diff suppressed because it is too large Load Diff

View File

@@ -581,9 +581,13 @@ int ctrlCmd(int fdZ80, enum CTRL_COMMANDS cmd, long param1, long param2, long pa
break; break;
case Z80_CMD_ADD_DEVICE: case Z80_CMD_ADD_DEVICE:
ioctlCmd.vdev.device = VIRTUAL_DEVICE_NONE; ioctlCmd.vdev.device = VIRTUAL_DEVICE_NONE;
if(strcasecmp((char *)param1, "RFS") == 0) if(strcasecmp((char *)param1, "RFS") == 0 || strcasecmp((char *)param1, "RFS80") == 0)
{ {
ioctlCmd.vdev.device = VIRTUAL_DEVICE_RFS; ioctlCmd.vdev.device = VIRTUAL_DEVICE_RFS80;
}
if(strcasecmp((char *)param1, "RFS40") == 0)
{
ioctlCmd.vdev.device = VIRTUAL_DEVICE_RFS40;
} }
else if(strcasecmp((char *)param1, "TZPU") == 0) else if(strcasecmp((char *)param1, "TZPU") == 0)
{ {
@@ -597,9 +601,13 @@ int ctrlCmd(int fdZ80, enum CTRL_COMMANDS cmd, long param1, long param2, long pa
break; break;
case Z80_CMD_DEL_DEVICE: case Z80_CMD_DEL_DEVICE:
ioctlCmd.vdev.device = VIRTUAL_DEVICE_NONE; ioctlCmd.vdev.device = VIRTUAL_DEVICE_NONE;
if(strcasecmp((char *)param1, "RFS") == 0) if(strcasecmp((char *)param1, "RFS") == 0 || strcasecmp((char *)param1, "RFS80") == 0)
{ {
ioctlCmd.vdev.device = VIRTUAL_DEVICE_RFS; ioctlCmd.vdev.device = VIRTUAL_DEVICE_RFS80;
}
else if(strcasecmp((char *)param1, "RFS40") == 0)
{
ioctlCmd.vdev.device = VIRTUAL_DEVICE_RFS40;
} }
else if(strcasecmp((char *)param1, "TZPU") == 0) else if(strcasecmp((char *)param1, "TZPU") == 0)
{ {
@@ -734,8 +742,8 @@ void showArgs(char *progName, struct optparse *options)
printf(" = CONTINUE # Continue Z80 execution\n"); printf(" = CONTINUE # Continue Z80 execution\n");
printf(" = HOSTRAM # Use HOST DRAM\n"); printf(" = HOSTRAM # Use HOST DRAM\n");
printf(" = VIRTRAM # Use Virtual RAM\n"); printf(" = VIRTRAM # Use Virtual RAM\n");
printf(" = ADDDEV --device <RFS, TZPU> # Add a virtual device into the Z80 configuration.\n"); printf(" = ADDDEV --device <RFS40, RFS80, TZPU> # Add a virtual device into the Z80 configuration.\n");
printf(" = DELDEV --device <RFS, TZPU> # Remove a virtual device from the Z80 configuration.\n"); printf(" = DELDEV --device <RFS40, RFS80, TZPU> # Remove a virtual device from the Z80 configuration.\n");
printf(" = SPEED --mult <1, 2, 4, 8, 16, 32, 64, 128> # In Virtual RAM mode, set CPU speed to base clock x factor.\n"); printf(" = SPEED --mult <1, 2, 4, 8, 16, 32, 64, 128> # In Virtual RAM mode, set CPU speed to base clock x factor.\n");
printf(" = LOADMZF --file <mzf filename> # Load MZF file into RAM.\n"); printf(" = LOADMZF --file <mzf filename> # Load MZF file into RAM.\n");
printf(" # Load contents of binary file into memory at address. default = 0x000000.\n"); printf(" # Load contents of binary file into memory at address. default = 0x000000.\n");

View File

@@ -1629,8 +1629,10 @@ static long int z80drv_ioctl(struct file *file, unsigned cmd, unsigned long arg)
} }
if(idx < Z80Ctrl->virtualDeviceCnt) if(idx < Z80Ctrl->virtualDeviceCnt)
break; break;
#if(TARGET_HOST_MZ700 == 1 || TARGET_HOST_MZ2000 == 1) #if(TARGET_HOST_MZ700 == 1 || TARGET_HOST_MZ2000 == 1)
pr_info("RFS Board currently supported on MZ-80A Host only.\n"); if(ioctlCmd.vdev.device & VIRTUAL_DEVICE_RFS)
pr_info("RFS Board currently supported on MZ-80A Host only.\n");
break; break;
#endif #endif
@@ -1644,10 +1646,11 @@ static long int z80drv_ioctl(struct file *file, unsigned cmd, unsigned long arg)
switch(ioctlCmd.vdev.device) switch(ioctlCmd.vdev.device)
{ {
#if(TARGET_HOST_MZ80A == 1) #if(TARGET_HOST_MZ80A == 1)
case VIRTUAL_DEVICE_RFS: case VIRTUAL_DEVICE_RFS40:
Z80Ctrl->virtualDevice[Z80Ctrl->virtualDeviceCnt++] = VIRTUAL_DEVICE_RFS; case VIRTUAL_DEVICE_RFS80:
Z80Ctrl->virtualDeviceBitMap |= VIRTUAL_DEVICE_RFS; Z80Ctrl->virtualDevice[Z80Ctrl->virtualDeviceCnt++] = ioctlCmd.vdev.device;
rfsInit(); Z80Ctrl->virtualDeviceBitMap |= ioctlCmd.vdev.device;
rfsInit(Z80Ctrl->virtualDeviceBitMap & VIRTUAL_DEVICE_RFS40 ? 0 : 1);
break; break;
#endif #endif
@@ -1698,8 +1701,9 @@ static long int z80drv_ioctl(struct file *file, unsigned cmd, unsigned long arg)
// Delete the device, removing hooks etc as required. // Delete the device, removing hooks etc as required.
switch(ioctlCmd.vdev.device) switch(ioctlCmd.vdev.device)
{ {
case VIRTUAL_DEVICE_RFS: case VIRTUAL_DEVICE_RFS40:
Z80Ctrl->virtualDeviceBitMap &= ~VIRTUAL_DEVICE_RFS; case VIRTUAL_DEVICE_RFS80:
Z80Ctrl->virtualDeviceBitMap &= ~ioctlCmd.vdev.device;
break; break;
case VIRTUAL_DEVICE_TZPU: case VIRTUAL_DEVICE_TZPU:

View File

@@ -451,8 +451,10 @@ enum Z80_MEMORY_PROFILE {
}; };
enum VIRTUAL_DEVICE { enum VIRTUAL_DEVICE {
VIRTUAL_DEVICE_NONE = 0x00000000, VIRTUAL_DEVICE_NONE = 0x00000000,
VIRTUAL_DEVICE_RFS = 0x02000000, VIRTUAL_DEVICE_RFS40 = 0x01000000,
VIRTUAL_DEVICE_TZPU = 0x01000000 VIRTUAL_DEVICE_RFS80 = 0x02000000,
VIRTUAL_DEVICE_RFS = 0x03000000,
VIRTUAL_DEVICE_TZPU = 0x04000000
}; };
typedef struct { typedef struct {

View File

@@ -86,8 +86,30 @@
#define BNKCTRLDEF BBMOSI+SDCS+BBCLK // Default on startup for the Bank Control register. #define BNKCTRLDEF BBMOSI+SDCS+BBCLK // Default on startup for the Bank Control register.
// RFS Board ROM rom filename definitions.
#define ROM_DIR "/apps/FusionX/roms/"
#define ROM_MROM_40C_FILENAME ROM_DIR "MROM_256_40c.bin"
#define ROM_USER_I_40C_FILENAME ROM_DIR "USER_ROM_256_40c.bin"
#define ROM_USER_II_40C_FILENAME ROM_DIR "USER_ROM_II_256_40c.bin"
#define ROM_USER_III_40C_FILENAME ROM_DIR "USER_ROM_III_256_40c.bin"
#define ROM_MROM_80C_FILENAME ROM_DIR "MROM_256_80c.bin"
#define ROM_USER_I_80C_FILENAME ROM_DIR "USER_ROM_256_80c.bin"
#define ROM_USER_II_80C_FILENAME ROM_DIR "USER_ROM_II_256_80c.bin"
#define ROM_USER_III_80C_FILENAME ROM_DIR "USER_ROM_III_256_80c.bin"
// RFS Board ROM rom load and size definitions.
#define ROM_MROM_LOAD_ADDR 0x000000
#define ROM_USER_I_LOAD_ADDR 0x080000
#define ROM_USER_II_LOAD_ADDR 0x100000
#define ROM_USER_III_LOAD_ADDR 0x180000
#define ROM_MROM_SIZE 0x80000
#define ROM_USER_I_SIZE 0x80000
#define ROM_USER_II_SIZE 0x80000
#define ROM_USER_III_SIZE 0x80000
// SD Drive constants. // SD Drive constants.
#define SD_CARD_FILENAME "/apps/FusionX/SD/SHARP_MZ80A_RFS_CPM_IMAGE_1.img"// SD Card Binary Image. #define SD_DIR "/apps/FusionX/SD/"
#define SD_CARD_FILENAME SD_DIR "SHARP_MZ80A_RFS_CPM_IMAGE_1.img"// SD Card Binary Image.
// MMC/SD command (SPI mode) // MMC/SD command (SPI mode)
#define CMD0 0x40 + 0 // GO_IDLE_STATE #define CMD0 0x40 + 0 // GO_IDLE_STATE
@@ -203,9 +225,45 @@ void rfsSetupMemory(enum Z80_MEMORY_PROFILE mode)
pr_info("RFS Memory Setup complete.\n"); pr_info("RFS Memory Setup complete.\n");
} }
// Perform any setup operations, such as variable initialisation, to enable use of this module. // Method to load a ROM image into the ROM memory.
void rfsInit(void) //
uint8_t loadROM(const char* romFileName, uint32_t loadAddr, uint32_t loadSize)
{ {
// Locals.
uint8_t result = 0;
long noBytes;
struct file *fp;
fp = filp_open(romFileName, O_RDONLY, 0);
if(IS_ERR(fp))
{
pr_info("Error opening ROM Image:%s\n:", romFileName);
result = 1;
} else
{
vfs_llseek(fp, 0, SEEK_SET);
noBytes = kernel_read(fp, fp->f_pos, &Z80Ctrl->rom[loadAddr], loadSize);
if(noBytes < loadSize)
{
// pr_info("Short load, ROM Image:%s, bytes loaded:%08x\n:", romFileName, loadSize);
}
filp_close(fp,NULL);
}
return(result);
}
// Perform any setup operations, such as variable initialisation, to enable use of this module.
void rfsInit(uint8_t mode80c)
{
// Locals.
// Load ROMS according to the display configuration, 40 char = standard, 80 char = 40/80 board installed.
loadROM(mode80c == 0 ? ROM_MROM_40C_FILENAME : ROM_MROM_80C_FILENAME, ROM_MROM_LOAD_ADDR, ROM_MROM_SIZE);
loadROM(mode80c == 0 ? ROM_USER_I_40C_FILENAME : ROM_USER_I_80C_FILENAME, ROM_USER_I_LOAD_ADDR, ROM_MROM_SIZE);
loadROM(mode80c == 0 ? ROM_USER_II_40C_FILENAME : ROM_USER_II_80C_FILENAME, ROM_USER_II_LOAD_ADDR, ROM_MROM_SIZE);
loadROM(mode80c == 0 ? ROM_USER_III_40C_FILENAME : ROM_USER_II_80C_FILENAME, ROM_USER_III_LOAD_ADDR, ROM_MROM_SIZE);
pr_info("Enabling RFS driver.\n"); pr_info("Enabling RFS driver.\n");
} }