From 29116f8b3f6765a694ba26cdea7c646b1f2beca8 Mon Sep 17 00:00:00 2001 From: Philip Smart Date: Wed, 29 Jul 2020 14:02:28 +0100 Subject: [PATCH] Updates for v2.1 of the tranZPUter board --- .gitignore | 2 + apps/tzpu/tzpu.c | 26 ++++++++- common/tranzputer.c | 98 +++++++++++++++++++++++++++----- include/tranzputer.h | 4 ++ libraries/lib/libimath2-k64f.a | Bin 12504 -> 12504 bytes libraries/lib/libumansi-k64f.a | Bin 124218 -> 124218 bytes libraries/lib/libummath-k64f.a | Bin 2660 -> 2660 bytes libraries/lib/libummathf-k64f.a | Bin 63972 -> 63972 bytes libraries/lib/libummisc-k64f.a | Bin 6222 -> 6222 bytes libraries/lib/libumstdio-k64f.a | Bin 80138 -> 80050 bytes zOS/Makefile.k64f | 4 +- zOS/src/zOS.cpp | 1 + 12 files changed, 119 insertions(+), 16 deletions(-) diff --git a/.gitignore b/.gitignore index 76cea0c..a0fc8e1 100644 --- a/.gitignore +++ b/.gitignore @@ -72,3 +72,5 @@ zOS/*.s zputa/*.i zputa/*.ii zputa/*.s +zOS/main.save + diff --git a/apps/tzpu/tzpu.c b/apps/tzpu/tzpu.c index 38d18f8..46843a7 100644 --- a/apps/tzpu/tzpu.c +++ b/apps/tzpu/tzpu.c @@ -8,7 +8,10 @@ // Credits: // Copyright: (c) 2019-2020 Philip Smart // -// History: May 2020 - Initial write of the TranZPUter software. +// History: May 2020 - Initial write of the TranZPUter software. +// July 2020 - Another test, a bug with the VHDL on the v2.1 tranZPUter board, so +// needed to output a constant memory mode. The bug turned out to be +// a delayed tri-stating of the bus. // // Notes: See Makefile to enable/disable conditional components // @@ -101,6 +104,25 @@ void testBus(void) } } +void testSixtyBug(void) +{ + printf("Repeating a write to 0x0060\n"); + while(true) + { + if(reqTranZPUterBus(100) == 0) + { + setupSignalsForZ80Access(WRITE); + uint8_t data = 0x07; + writeZ80Memory(0x0060, data); + releaseZ80(); + } + else + { + printf("Failed to obtain the Z80 bus.\n"); + } + } +} + // Main entry and start point of a zOS/ZPUTA Application. Only 2 parameters are catered for and a 32bit return code, additional parameters can be added by changing the appcrt0.s // startup code to add them to the stack prior to app() call. @@ -125,6 +147,8 @@ uint32_t app(uint32_t param1, uint32_t param2) //} // _init_Teensyduino_internal_(); // setupZ80Pins(1, G->millis); + // + testSixtyBug(); printf("Loading Monitor ROM\n"); loadZ80Memory("SA1510.rom", 0, 0x00000000, 0, 0, 0, 1); diff --git a/common/tranzputer.c b/common/tranzputer.c index 3805b38..3c88af8 100644 --- a/common/tranzputer.c +++ b/common/tranzputer.c @@ -34,6 +34,9 @@ // for Z80 A11:A0 and Port A 15:12 for Z80 A15:12. This was done due to the // extra overhead required to piece together address and data lines in v1.0 // where the PCB was routed for linear reading and routing. +// v1.2 July 2020 - Updates for the v2.1 tranZPUter board. I've used macro processing +// to seperate v1+ and v2+ but I may well create two seperate directories +// as both projects are updated. Alternatively I use git flow or similar, TBD! // // Notes: See Makefile to enable/disable conditional components // @@ -164,6 +167,7 @@ static void __attribute((naked, noinline)) irqPortC_dummy(void) } #endif +#if TZBOARD == 100 || TZBOARD == 110 || TZBOARD == 200 || TZBOARD == 210 // This method is called everytime an active irq triggers on Port E. For this design, this means the two IO CS // lines, TZ_SVCREQ and TZ_SYSREQ. The SVCREQ is used when the Z80 requires a service, the SYSREQ is yet to // be utilised. @@ -202,7 +206,9 @@ static void __attribute((naked, noinline)) irqPortE(void) return; } +#endif +#if TZBOARD == 110 || TZBOARD == 200 || TZBOARD == 210 // This method is called everytime an active irq triggers on Port D. For this design, this means the IORQ and RESET lines. // // There are 3 versions of the same routine, originally using #if macro preprocessor statements but it became @@ -227,10 +233,10 @@ static void __attribute((naked, noinline)) irqPortD_Mode0(void) " str r0, [r1, #0] \n" // Is Z80_RESET active, set flag and exit. - " movs r0, #1 \n" - " tst r5, #0x010 \n" + " movs r1, #1 \n" + " tst r0, #0x0010 \n" " beq irqPortD_Exit \n" - " strb r0, %[val0] \n" + " strb r1, %[val0] \n" " irqPortD_Exit: \n" @@ -243,10 +249,11 @@ static void __attribute((naked, noinline)) irqPortD_Mode0(void) return; } +#endif // // Mode 1 & 2 - Capture and store an IORQ or MREQ Memory Mapped event for the main thread to process. // -#if 1 +#if TZBOARD == 110 static void __attribute((naked, noinline)) irqPortD_Mode12(void) { // Save minimum number of registers, cycles matter as we need to capture the address and halt the Z80 whilst we decode it. @@ -462,6 +469,7 @@ static void __attribute((naked, noinline)) irqPortD_Mode12(void) return; } #endif +#if TZBOARD == 110 // // Mode 3 - MZ700 processing. // @@ -840,6 +848,7 @@ static void __attribute((naked, noinline)) irqPortD_Mode3(void) return; } +#endif // Method to install the interrupt vector and enable it to capture Z80 memory/IO operations. // @@ -853,10 +862,18 @@ static void setupIRQ(void) // For the MZ700 we need to enable IORQ to process the OUT statements the Z80 generates for memory mode selection. case MZ700: // Install the dummy method to be called when PortE triggers. +#if TZBOARD == 110 _VectorsRam[IRQ_PORTE + 16] = irqPortE_dummy; - +#elif TZBOARD == 200 || TZBOARD == 210 + _VectorsRam[IRQ_PORTE + 16] = irqPortE; +#endif + // Install the method to be called when PortD triggers. +#if TZBOARD == 110 _VectorsRam[IRQ_PORTD + 16] = irqPortD_Mode3; +#elif TZBOARD == 200 || TZBOARD == 210 + _VectorsRam[IRQ_PORTD + 16] = irqPortD_Mode0; +#endif // Setup the IRQ for Z80_IORQ. installIRQ(Z80_IORQ, IRQ_MASK_FALLING); @@ -864,6 +881,7 @@ static void setupIRQ(void) // Setup the IRQ for Z80_RESET. installIRQ(Z80_RESET, IRQ_MASK_FALLING); +#if TZBOARD == 110 // Setup the IRQ for Z80_MREQ. //installIRQ(Z80_MREQ, IRQ_MASK_RISING); @@ -871,6 +889,14 @@ static void setupIRQ(void) removeIRQ(TZ_SVCREQ); removeIRQ(TZ_SYSREQ); +#elif TZBOARD == 200 || TZBOARD == 210 + // Setup the IRQ for TZ_SYSREQ. + installIRQ(TZ_SYSREQ, IRQ_MASK_FALLING); + + // Setup the IRQ for Z80_RESET. + installIRQ(Z80_RESET, IRQ_MASK_FALLING); +#endif + // Set relevant priorities to meet latency. NVIC_SET_PRIORITY(IRQ_PORTD, 0); NVIC_SET_PRIORITY(IRQ_PORTE, 16); @@ -882,7 +908,11 @@ static void setupIRQ(void) _VectorsRam[IRQ_PORTE + 16] = irqPortE_dummy; // Install the method to be called when PortD triggers. +#if TZBOARD == 110 _VectorsRam[IRQ_PORTD + 16] = irqPortD_Mode3; +#elif TZBOARD == 200 || TZBOARD == 210 + _VectorsRam[IRQ_PORTD + 16] = irqPortD_Mode0; +#endif // Setup the IRQ for Z80_IORQ. installIRQ(Z80_IORQ, IRQ_MASK_FALLING); @@ -890,8 +920,10 @@ static void setupIRQ(void) // Setup the IRQ for Z80_RESET. installIRQ(Z80_RESET, IRQ_MASK_FALLING); +#if TZBOARD == 110 // Setup the IRQ for Z80_MREQ. //installIRQ(Z80_MREQ, IRQ_MASK_RISING); +#endif // Remove previous interrupts not needed in this mode. removeIRQ(TZ_SVCREQ); @@ -947,8 +979,10 @@ static void restoreIRQ(void) // Setup the IRQ for Z80_IORQ. installIRQ(Z80_IORQ, IRQ_MASK_FALLING); +#if TZBOARD == 110 // Setup the IRQ for Z80_MREQ. //installIRQ(Z80_MREQ, IRQ_MASK_FALLING); +#endif // Setup the IRQ for Z80_RESET. installIRQ(Z80_RESET, IRQ_MASK_FALLING); @@ -959,8 +993,10 @@ static void restoreIRQ(void) // Setup the IRQ for Z80_IORQ. installIRQ(Z80_IORQ, IRQ_MASK_FALLING); +#if TZBOARD == 110 // Setup the IRQ for Z80_MREQ. //installIRQ(Z80_MREQ, IRQ_MASK_FALLING); +#endif // Setup the IRQ for Z80_RESET. installIRQ(Z80_RESET, IRQ_MASK_FALLING); @@ -1361,7 +1397,6 @@ uint8_t writeZ80Memory(uint16_t addr, uint8_t data) { // Locals. uint32_t startTime = *ms; - volatile uint32_t pulseWidth; // Set the data and address on the bus. // @@ -1369,8 +1404,9 @@ uint8_t writeZ80Memory(uint16_t addr, uint8_t data) setZ80Data(data); // Setup time before applying control signals. - for(pulseWidth = 0; pulseWidth < 5; pulseWidth++); + for(volatile uint32_t pulseWidth = 0; pulseWidth < 3; pulseWidth++); pinLow(Z80_MREQ); + for(volatile uint32_t pulseWidth = 0; pulseWidth < 3; pulseWidth++); // Different logic according to what is being accessed. The mainboard needs to uphold timing and WAIT signals whereas the Tranzputer logic has no wait // signals and faster memory. @@ -1385,7 +1421,11 @@ uint8_t writeZ80Memory(uint16_t addr, uint8_t data) pinLow(Z80_WR); // On a Teensy3.5 K64F running at 120MHz this delay gives a pulsewidth of 760nS. - for(volatile uint32_t pulseWidth=0; pulseWidth < 2; pulseWidth++); +#if TZBOARD == 100 || TZBOARD == 110 + for(volatile uint32_t pulseWidth=0; pulseWidth < 4; pulseWidth++); +#elif TZBOARD == 200 || TZBOARD == 210 + for(volatile uint32_t pulseWidth=0; pulseWidth < 5; pulseWidth++); +#endif // Another wait loop check as the Z80 can assert wait at the time of Write or anytime before it is deasserted. while((*ms - startTime) < 200 && pinGet(Z80_WAIT) == 0); @@ -1393,10 +1433,15 @@ uint8_t writeZ80Memory(uint16_t addr, uint8_t data) { // Start the write cycle, MREQ and WR go low. pinLow(Z80_WR); - } - // Hold time for the WR signal before clearing it. - for(pulseWidth = 0; pulseWidth < 5; pulseWidth++); + // On a Teensy3.5 K64F running at 120MHz this delay gives a pulsewidth of 760nS. +#if TZBOARD == 100 || TZBOARD == 110 + for(volatile uint32_t pulseWidth = 0; pulseWidth < 2; pulseWidth++); + // With the tranZPUter SW v2 boards, need to increase the write pulse width, alternatively wait until a positive edge on the CPU clock. +#elif TZBOARD == 200 || TZBOARD == 210 + for(volatile uint32_t pulseWidth=0; pulseWidth < 3; pulseWidth++); +#endif + } // Complete the write cycle. // @@ -1430,11 +1475,21 @@ uint8_t readZ80Memory(uint16_t addr) // On a Teensy3.5 K64F running at 120MHz this delay gives a pulsewidth of 760nS. This gives time for the addressed device to present the data // on the data bus. +#if TZBOARD == 100 || TZBOARD == 110 for(volatile uint32_t pulseWidth=0; pulseWidth < 1; pulseWidth++); + // With the tranZPUter SW v2 boards, need to increase the write pulse width, alternatively wait until a positive edge on the CPU clock. +#elif TZBOARD == 200 || TZBOARD == 210 + for(volatile uint32_t pulseWidth=0; pulseWidth < 4; pulseWidth++); +#endif } else { // On the tranZPUter v1.1, because of reorganisation of the signals, the time to process is less and so the pulse width under v1.0 is insufficient. +#if TZBOARD == 100 || TZBOARD == 110 for(volatile uint32_t pulseWidth=0; pulseWidth < 1; pulseWidth++); + // With the tranZPUter SW v2 boards, need to increase the write pulse width to accommodate the different memories used. +#elif TZBOARD == 200 || TZBOARD == 210 + for(volatile uint32_t pulseWidth=0; pulseWidth < 4; pulseWidth++); +#endif } // Fetch the data before deasserting the signals. @@ -1481,14 +1536,23 @@ uint8_t writeZ80IO(uint16_t addr, uint8_t data) pinLow(Z80_WR); // On a Teensy3.5 K64F running at 120MHz this delay gives a pulsewidth of 760nS. +#if TZBOARD == 100 || TZBOARD == 110 //for(volatile uint32_t pulseWidth=0; pulseWidth < 2; pulseWidth++); +#elif TZBOARD == 200 || TZBOARD == 210 + for(volatile uint32_t pulseWidth=0; pulseWidth < 2; pulseWidth++); +#endif // Another wait loop check as the Z80 can assert wait at the time of Write or anytime before it is deasserted. while((*ms - startTime) < 200 && pinGet(Z80_WAIT) == 0); } else { - // Start the write cycle, MREQ and WR go low. + // Start the write cycle, WR go low. pinLow(Z80_WR); + + // With the tranZPUter SW v2 boards, need to increase the write pulse width as the latch is synchronous, alternatively wait until a positive edge on the CPU clock. +#if TZBOARD == 200 || TZBOARD == 210 + for(volatile uint32_t pulseWidth=0; pulseWidth < 8; pulseWidth++); +#endif } // Complete the write cycle. @@ -4013,7 +4077,7 @@ uint32_t getServiceAddr(void) { // Locals. uint32_t addr = TZSVC_CMD_STRUCT_ADDR_TZFS; - uint8_t memoryMode = readCtrlLatch(); + uint8_t memoryMode = readCtrlLatch() & 0x1F; // If in CPM mode then set the service address accordingly. if(memoryMode == TZMM_CPM || memoryMode == TZMM_CPM2) @@ -4160,7 +4224,11 @@ void processServiceRequest(void) // Load the 40 column MZ700 1Z-013A bios into memory. case TZSVC_CMD_LOAD700BIOS40: +#if TZBOARD == 100 || TZBOARD == 110 + if((status=loadZ80Memory((const char *)MZ_ROM_1Z_013A_KM_40C, 0, MZ_MROM_ADDR, 0, 0, 0, 1)) != FR_OK) +#elif TZBOARD == 200 || TZBOARD == 210 if((status=loadZ80Memory((const char *)MZ_ROM_1Z_013A_40C, 0, MZ_MROM_ADDR, 0, 0, 0, 1)) != FR_OK) +#endif { printf("Error: Failed to load %s into tranZPUter memory.\n", MZ_ROM_1Z_013A_40C); } @@ -4177,7 +4245,11 @@ void processServiceRequest(void) // Load the 80 column MZ700 1Z-013A bios into memory. case TZSVC_CMD_LOAD700BIOS80: +#if TZBOARD == 100 || TZBOARD == 110 + if((status=loadZ80Memory((const char *)MZ_ROM_1Z_013A_KM_80C, 0, MZ_MROM_ADDR, 0, 0, 0, 1)) != FR_OK) +#elif TZBOARD == 200 || TZBOARD == 210 if((status=loadZ80Memory((const char *)MZ_ROM_1Z_013A_80C, 0, MZ_MROM_ADDR, 0, 0, 0, 1)) != FR_OK) +#endif { printf("Error: Failed to load %s into tranZPUter memory.\n", MZ_ROM_1Z_013A_80C); } diff --git a/include/tranzputer.h b/include/tranzputer.h index b524c54..c75efbd 100755 --- a/include/tranzputer.h +++ b/include/tranzputer.h @@ -9,6 +9,7 @@ // Copyright: (c) 2019-2020 Philip Smart // // History: May 2020 - Initial write of the TranZPUter software. +// July 2020- Updates to accommodate v2.1 of the tranZPUter board. // // Notes: See Makefile to enable/disable conditional components // @@ -42,6 +43,7 @@ // 3 = NZ700 memory mode decode - This doesnt work per original, the memory change occurs one instruction after the OUT instruction due to the way the Z80 functions in respect to BUSRQ. #define REFRESH_BYTE_COUNT 8 // This constant controls the number of bytes read/written to the z80 bus before a refresh cycle is needed. #define RFSH_BYTE_CNT 256 // Number of bytes we can write before needing a full refresh for the DRAM. +#define TZBOARD 210 // tranZPUter SW Hardware versions - v1.0 = 110, v1.1 = 110, v2.0 = 200 and v2.1 = 210 // tranZPUter Memory Modes - select one of the 32 possible memory models using these constants. // @@ -106,6 +108,8 @@ #define MZ_ROM_SA1510_80C "0:\\TZFS\\SA1510-8.ROM" // Original Monitor ROM patched for 80 character screen mode. #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_1Z_013A_KM_40C "0:\\TZFS\\1Z-013A-KM.ROM" // Original 40 character Monitor ROM for the Sharp MZ700 with keyboard remapped for the MZ80A. +#define MZ_ROM_1Z_013A_KM_80C "0:\\TZFS\\1Z-013A-KM-8.ROM" // Original Monitor ROM patched for the Sharp MZ700 with keyboard remapped for the MZ80A and patched for 80 column mode. #define MZ_ROM_MZ80B_IPL "0:\\TZFS\\MZ80B_IPL.ROM" // Original IPL ROM for the Sharp MZ-80B. #define MZ_ROM_TZFS "0:\\TZFS\\TZFS.ROM" // tranZPUter Filing System ROM. diff --git a/libraries/lib/libimath2-k64f.a b/libraries/lib/libimath2-k64f.a index d43fff8d3c63ec248ec4d78915479dbce42e8cc3..8372f73ed0de9523355660f0f1656895fc9292bd 100644 GIT binary patch delta 76 zcmcbScq4IwG`p#Vxv`n0;Y6ic7<2MEN%4()XYs-Ko8$OBx!|02lC?ZA&g3|L@y(uU G{agTR;1!bq delta 76 zcmcbScq4IwG`op~rIC@j@kFIs7<2MEN%4()XYs-Ko8$OBx!|02lC?ZA&g3|L@y(uU G{agTO$rXP9 diff --git a/libraries/lib/libumansi-k64f.a b/libraries/lib/libumansi-k64f.a index 39b3f5beb0c3cd5d99acf31afa666f6758f57b55..bbc2b82029ff52a45f097f805e343ab1ae6bb824 100644 GIT binary patch delta 807 zcmY*XO(;ZB6z&)q26-s+9`fWbNtv23BNim35TURdWn&T>OEe3y5Y2dt2@%c4Viv=Z z8-hx%ZCU`@VO+pL5>Z4H|cYMt6>}(pGJ)vRgI^p5r3VHakj& zy(9)S$sprf%3&;F#?!2yL^grCy2gQb^%`V!mkyfP>rHEAtX9UZ+N=LWOVf@Zbiabd z?Jt6m3{ITr>lB2pI?y&y&m++_G%K;RaNY9p3qC$?l`(g^KL#tf?3OvE0w1M)OWemvSpE3ZL~%;-BXiSdwg-idJ50>27+E(8B3Hg94k zTtj9od^#8F&`6ZN7I+E$NNB|oE~3>G@|_LqQKj9Y>3*3U6+vC} zGf{@tCu#)*lOw0JTgXQZ+;fHZZUxNby%7>p*g%BJ?0~s6Muk=+hYnynhJBsn!3k{1 zP`0X&?opVG_M=I6V{j{yLcb8XnF0?l7fG7&KwBzHBD7CBN7U0ndi?wn)N^$Udb#KJ cKCE%zrEv}9^%#~o72e)=0iU81ZLw(j18`67)c^nh delta 807 zcmdmWihb89_6gGLCKi@PM&?Evm7X&}*@l}1nD=tRIFkjKB{sj|IfyJEzWKD+KMt6R z%@^bs!a36y++vj2JV7Iq3nsnE*c4f>#O4s2o2UXlZaWbI7uHB_Rt3Kqoa+3`dSTHr({<-|*h3oqlWC-U>K6guEvtI%yLTOy)L1bCU z&GzL2a9OYua~sO|VTMhXvzFM*G+`-R#pZQ0pTap{rt!fA)~%P={D}W3TwwD$xlT@) z>}ETSiEz&3b#fA$-x+Gc1vblB-$Zc!x%}jX>-!gE2bcS~ZkUjipWXU_S+Emx8_M`$hE0~Ume|ZRVJTe2=5;fl!Z~2&8yA1$hAH2?Zv9%gZzkJmNN%p) vSAtLu@&w-rMTCHz#*)pqF23b}>pyo(7a=QW?X=nD$#jGOC;)%Hea#I3cv^5~ diff --git a/libraries/lib/libummisc-k64f.a b/libraries/lib/libummisc-k64f.a index dbc0da2e6ea8c9dd5eac85fbe8bd2091cbc551ab..f33dc6bed1ac94e860c05bc88e7a9b4dd3e50f62 100644 GIT binary patch delta 42 lcmX?SaL!7VsC)0L>K{0B_MKC8 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 delta 7187 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 diff --git a/zOS/Makefile.k64f b/zOS/Makefile.k64f index 4fd30b9..da2412e 100644 --- a/zOS/Makefile.k64f +++ b/zOS/Makefile.k64f @@ -48,8 +48,8 @@ TARGET = main TEENSY = 35 # Set to 24000000, 48000000, or 96000000 to set CPU core speed -TEENSY_CORE_SPEED = 168000000 -#TEENSY_CORE_SPEED = 120000000 +#TEENSY_CORE_SPEED = 168000000 +TEENSY_CORE_SPEED = 120000000 # Some libraries will require this to be defined # If you define this, you will break the default main.cpp diff --git a/zOS/src/zOS.cpp b/zOS/src/zOS.cpp index 07560d8..bfe1242 100644 --- a/zOS/src/zOS.cpp +++ b/zOS/src/zOS.cpp @@ -19,6 +19,7 @@ // enhanced to work with both the ZPU and K64F for the original purpose // of testing but also now for end application programming using the // features of zOS where applicable. +// July 2020 - Tweaks to accomodate v2.1 of the tranZPUter board. // // Notes: See Makefile to enable/disable conditional components // USELOADB - The Byte write command is implemented in hw/sw so use it.