Added MZ700 modes, still work needed on the ISR for reliability

This commit is contained in:
Philip Smart
2020-06-10 21:49:02 +01:00
parent 61cbfc5455
commit 5fafddb097
8 changed files with 66 additions and 15 deletions

View File

@@ -1700,19 +1700,23 @@ void setCtrlLatch(uint8_t latchVal)
// Method to change the secondary CPU frequency and optionally enable/disable it.
// Input: frequency = desired frequency in Hertz.
// action = 0 - take no action, just change frequency, 1 - enable the secondary CPU frequency, 2 - disable the secondary CPU frequency.
// action = 0 - take no action, just change frequency, 1 - set and enable the secondary CPU frequency, 2 - set and disable the secondary CPU frequency,
// 3 - enable the secondary CPU frequency, 4 - disable the secondary CPU frequency
// Output: actual set frequency in Hertz.
//
uint32_t setZ80CPUFrequency(float frequency, uint8_t action)
{
// Locals.
//
uint32_t actualFreq;
uint32_t actualFreq = 0;
// Setup the alternative clock frequency on the CTL_CLK pin.
//
actualFreq=analogWriteFrequency(CTL_CLK_PIN, frequency);
analogWrite(CTL_CLK_PIN, 128);
if(action < 3)
{
actualFreq=analogWriteFrequency(CTL_CLK_PIN, frequency);
analogWrite(CTL_CLK_PIN, 128);
}
// Process action, enable, disable or do nothing (just freq change).
//
@@ -1725,7 +1729,7 @@ uint32_t setZ80CPUFrequency(float frequency, uint8_t action)
// Setup the pins to perform a write operation.
//
setupSignalsForZ80Access(WRITE);
writeZ80IO((action == 1 ? IO_TZ_SETXMHZ : IO_TZ_SET2MHZ), 0);
writeZ80IO((action == 1 || action == 3 ? IO_TZ_SETXMHZ : IO_TZ_SET2MHZ), 0);
releaseZ80();
}
}
@@ -2619,14 +2623,6 @@ void loadTranZPUterDefaultROMS(void)
{
printf("Error: Failed to load %s into tranZPUter memory.\n", MZ_ROM_SA1510_40C);
}
//if((result=loadZ80Memory((const char *)MZ_ROM_1Z_013A, 0, MZ_MROM_ADDR, 0, 0, 1)) != FR_OK)
//{
// printf("Error: Failed to load %s into tranZPUter memory.\n", MZ_ROM_1Z_013A);
//}
if((result=loadZ80Memory((const char *)MZ_ROM_1Z_013A, 0, 0x60000, 0, 0, 1)) != FR_OK)
{
printf("Error: Failed to load %s into tranZPUter memory.\n", MZ_ROM_1Z_013A);
}
if(!result && (result=loadZ80Memory((const char *)MZ_ROM_TZFS, 0, MZ_UROM_ADDR, 0x1800, 0, 1) != FR_OK))
{
printf("Error: Failed to load bank 1 of %s into tranZPUter memory.\n", MZ_ROM_TZFS);
@@ -3796,6 +3792,9 @@ void processServiceRequest(void)
{
printf("Error: Failed to load %s into tranZPUter memory.\n", MZ_ROM_SA1510_40C);
}
// Change frequency to default.
setZ80CPUFrequency(MZ_80A_CPU_FREQ, 2);
break;
// Load the 80 column version of the SA1510 bios into memory.
@@ -3804,6 +3803,31 @@ void processServiceRequest(void)
{
printf("Error: Failed to load %s into tranZPUter memory.\n", MZ_ROM_SA1510_80C);
}
// Change frequency to default.
setZ80CPUFrequency(MZ_80A_CPU_FREQ, 2);
break;
// Load the 40 column MZ700 1Z-013A bios into memory.
case TZSVC_CMD_LOAD700BIOS40:
if((status=loadZ80Memory((const char *)MZ_ROM_1Z_013A_40C, 0, MZ_MROM_ADDR, 0, 0, 1)) != FR_OK)
{
printf("Error: Failed to load %s into tranZPUter memory.\n", MZ_ROM_1Z_013A_40C);
}
// Change frequency to match Sharp MZ-700
setZ80CPUFrequency(MZ_700_CPU_FREQ, 1);
break;
// Load the 80 column MZ700 1Z-013A bios into memory.
case TZSVC_CMD_LOAD700BIOS80:
if((status=loadZ80Memory((const char *)MZ_ROM_1Z_013A_80C, 0, MZ_MROM_ADDR, 0, 0, 1)) != FR_OK)
{
printf("Error: Failed to load %s into tranZPUter memory.\n", MZ_ROM_1Z_013A_80C);
}
// Change frequency to match Sharp MZ-700
setZ80CPUFrequency(MZ_700_CPU_FREQ, 1);
break;
// Load the CPM CCP+BDOS from file into the address given.
@@ -3836,6 +3860,22 @@ void processServiceRequest(void)
copySize = TZSVC_CMD_SIZE;
break;
// Switch to the mainboard frequency (default).
case TZSVC_CMD_CPU_BASEFREQ:
setZ80CPUFrequency(0, 4);
break;
// Switch to the alternate frequency managed by the K64F counters.
case TZSVC_CMD_CPU_ALTFREQ:
setZ80CPUFrequency(0, 3);
break;
// Set the alternate frequency. The TZFS command provides the frequency in KHz so multiply up to Hertz before changing.
case TZSVC_CMD_CPU_CHGFREQ:
printf("Changing to Freq:%ld\n", (svcControl.cpuFreq * 1000));
setZ80CPUFrequency(svcControl.cpuFreq * 1000, 1);
break;
default:
break;
}

View File

@@ -93,9 +93,12 @@
#define MZ_MEMORY_RESET 0xE010 // Address when read resets the memory to the default location 0000-0FFF.
#define MZ_CRT_NORMAL 0xE014 // Address when read sets the CRT to normal display mode.
#define MZ_CRT_INVERSE 0xE018 // Address when read sets the CRT to inverted display mode.
#define MZ_80A_CPU_FREQ 2000000 // CPU Speed of the Sharp MZ-80A
#define MZ_700_CPU_FREQ 3580000 // CPU Speed of the Sharp MZ-700
#define MZ_ROM_SA1510_40C "0:\\TZFS\\SA1510.ROM" // Original 40 character Monitor ROM.
#define MZ_ROM_SA1510_80C "0:\\TZFS\\SA1510-8.ROM" // Original Monitor ROM patched for 80 character screen mode.
#define MZ_ROM_1Z_013A "0:\\TZFS\\1Z-013A.ROM" // Original 40 character Monitor ROM for the Sharp MZ700.
#define MZ_ROM_1Z_013A_40C "0:\\TZFS\\1Z-013A.ROM" // Original 40 character Monitor ROM for the Sharp MZ700.
#define MZ_ROM_1Z_013A_80C "0:\\TZFS\\1Z-013A-8.ROM" // Original Monitor ROM patched for the Sharp MZ700 patched for 80 column mode.
#define MZ_ROM_TZFS "0:\\TZFS\\TZFS.ROM" // tranZPUter Filing System ROM.
// CP/M constants.
@@ -128,10 +131,15 @@
#define TZSVC_CMD_CHANGEDIR 0x09 // Service command to change active directory on the SD card.
#define TZSVC_CMD_LOAD40BIOS 0x20 // Service command requesting that the 40 column version of the SA1510 BIOS is loaded.
#define TZSVC_CMD_LOAD80BIOS 0x21 // Service command requesting that the 80 column version of the SA1510 BIOS is loaded.
#define TZSVC_CMD_LOAD700BIOS40 0x22 // Service command requesting that the MZ700 1Z-013A 40 column BIOS is loaded.
#define TZSVC_CMD_LOAD700BIOS80 0x23 //Service command requesting that the MZ700 1Z-013A 80 column patched BIOS is loaded.
#define TZSVC_CMD_LOADBDOS 0x30 // Service command to reload CPM BDOS+CCP.
#define TZSVC_CMD_ADDSDDRIVE 0x31 // Service command to attach a CPM disk to a drive number.
#define TZSVC_CMD_READSDDRIVE 0x32 // Service command to read an attached SD file as a CPM disk drive.
#define TZSVC_CMD_WRITESDDRIVE 0x33 // Service command to write to a CPM disk drive which is an attached SD file.
#define TZSVC_CMD_CPU_BASEFREQ 0x40 // Service command to switch to the mainboard frequency.
#define TZSVC_CMD_CPU_ALTFREQ 0x41 // Service command to switch to the alternate frequency provided by the K64F.
#define TZSVC_CMD_CPU_CHGFREQ 0x42 // Service command to set the alternate frequency in hertz.
#define TZSVC_DEFAULT_DIR "MZF" // Default directory where MZF files are stored.
#define TZSVC_DEFAULT_EXT "MZF" // Default file extension for MZF files.
#define TZSVC_DEFAULT_WILDCARD "*" // Default wildcard file matching.
@@ -525,7 +533,10 @@ typedef struct __attribute__((__packed__)) {
uint16_t trackNo; // For virtual drives with track and sector this is the track number
uint16_t sectorNo; // For virtual drives with tracl and sector this is the sector number.
uint8_t fileNo; // File number of a file within the last directory listing to open/update.
uint16_t loadAddr; // Load address for ROM/File images which need to be dynamic.
union {
uint16_t loadAddr; // Load address for ROM/File images which need to be dynamic.
uint16_t cpuFreq; // CPU Frequency in KHz - used for setting of the alternate CPU clock frequency.
};
uint16_t loadSize; // Size for ROM/File to be loaded.
uint8_t directory[TZSVC_DIRNAME_SIZE]; // Directory in which to look for a file. If no directory is given default to MZF.
uint8_t filename[TZSVC_FILENAME_SIZE]; // File to open or create.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.