tag:blogger.com,1999:blog-2556031891678684152024-03-13T21:04:31.834+11:00ZX81 Keyboard AdventureExplore a dedicated blog catering to Sinclair ZX81 enthusiasts, offering a rich blend of software and hardware projects. With a primary focus on ZX81, occasional ZX Spectrum content, and ventures into other 80s microcomputers like Commodore Vic 20 and TRS80, the blog provides a nostalgic journey. Engaging and informative, this platform attracts DIY enthusiasts and microcomputer aficionados with its diverse content, creating a valuable resource for the community.David Stephensonhttp://www.blogger.com/profile/11637474307612171656noreply@blogger.comBlogger90125tag:blogger.com,1999:blog-255603189167868415.post-33017647516110255932024-01-07T14:29:00.005+11:002024-01-07T18:11:23.969+11:00ZXIO Interface for the ZX81: Part 6<p> </p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZF1cv8WX12SPQ0ntmZ8GD2kByCjNKje-wBGah2d6qmhncY17nbFkdVZEL8VRmcD41_kPSECrqqggBk1X8YfIzYnqFDapWyHlkolkMmItkG3WLNDN9JcwwK7SFQ2anB228q2k93NnE1ft-m2E-fGY1X3DDJcJGwcig8-TlwVlhDYrunGgI_HnzkB3FlD7u/s2538/20230814_152209-EDIT.jpg" style="margin-left: auto; margin-right: auto;"><img alt="ZX81 ZXIO TalkBot interface and ZXIO Interface" border="0" data-original-height="2029" data-original-width="2538" height="512" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZF1cv8WX12SPQ0ntmZ8GD2kByCjNKje-wBGah2d6qmhncY17nbFkdVZEL8VRmcD41_kPSECrqqggBk1X8YfIzYnqFDapWyHlkolkMmItkG3WLNDN9JcwwK7SFQ2anB228q2k93NnE1ft-m2E-fGY1X3DDJcJGwcig8-TlwVlhDYrunGgI_HnzkB3FlD7u/w640-h512/20230814_152209-EDIT.jpg" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">ZXIO-TalkBot and ZXIO V2 (with minor revisions)</td></tr></tbody></table><br /><p></p><h2 style="text-align: left;">ZXIO-TalkBot</h2><p>Alright, we've got our reliable ZX81 all decked out with the ZXIO V2. Now, let's kick things up a notch - how about introducing an SP0256 (the original retro) speech chip to the party? This little marvel can transform pre-defined sounds (allophones) into speech, bringing a whole new layer of excitement to our setup.</p><p><br /></p><p>Prior to designing the Talkbot, I made a slight modification to the ZXIO V2 (now V2.1 I guess) board. I introduced a new 4-pin header on the left side of the board, incorporating the NMI, Reset and Clock (foreshadowing) signals from the ZX81, along with a Gnd line. This addition was made with the anticipation that the extra signals would be beneficial for future expansions. Moreover, the header enhances stability when connecting more extended expansion cards directly to the front of the ZXIO interface.</p><p><br /></p><p>Of course it's well worth noting that it's quite possible to build an entirely separate / standalone interface board for the SP0256-AL2. When designing the ZXIO-Talkbot, I consulted a number of designs as a reference before planning the ZXIO plugin card. I highly recommend 'How to Make Your Computer Talk' by Steven J. Veltri as an excellent starting point. His book covers interfaces for a number of 80s home computers including the ZX81, along side in depth details on how the SP0256-AL2 itself works.</p><p><br /></p><p></p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEiV_DRKde4lEAJI-VxTfKc30L2-ZElpAvJYogCVQyYqXfCQnKdEYuoOWNpgxAgIplxZadlRQkcOCdSKv-jerMuPaMuGfbhqVbLKM0AEvqMtT4hmp2hfpL2h3tNb-tl0T8DyYbV3koanYO1LlQiIKhHsWJs3ymxUnYjCYOfUZwz7EdFvesOGsxFQx8SSL8v9" style="margin-left: auto; margin-right: auto;"><img alt="" data-original-height="1355" data-original-width="1905" height="456" src="https://blogger.googleusercontent.com/img/a/AVvXsEiV_DRKde4lEAJI-VxTfKc30L2-ZElpAvJYogCVQyYqXfCQnKdEYuoOWNpgxAgIplxZadlRQkcOCdSKv-jerMuPaMuGfbhqVbLKM0AEvqMtT4hmp2hfpL2h3tNb-tl0T8DyYbV3koanYO1LlQiIKhHsWJs3ymxUnYjCYOfUZwz7EdFvesOGsxFQx8SSL8v9=w640-h456" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">How to Make Your Computer Talk: T/S 1000, ZX80, and ZX81 Speech Circuit Schematic</td></tr></tbody></table><br />The interface circuit from '<a href="https://archive.org/details/howtomakeyourcomputertalk" target="_blank">How to Make Your Computer Talk</a>' is depicted above. Although as it's designed for Machine Code programs, it is not accessible to BASIC due to the absence of Memory Mapping. However, the fundamental design can be readily adapted for use with the ZXIO expansion card.<p></p><p><br /></p><p>In the ZXIO-Talkbot, all addressing and data lines are interconnected with the 8255A on the ZXIO V2 interface card. Consequently, their control is handled in a manner similar to the earlier experiments where we employed the ZXIO V2 to manage an HD44780 LCD board. </p><p><br /></p><p>Unlike the 'How to Make Your Computer Talk' board, the clock signal is not produced by a separate 3.12MHz crystal; instead, we utilise the ZX81's own oscillator, which operates at 3.25 MHz—sufficiently close. Additionally, a separate RESET signal is not required; this line is directly connected to the ZX81's RESET. While, in future versions, it could be managed by the 8255A, such a configuration might be considered overkill.</p><p><br /></p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoZk5Mr_9Di7-TkoVTUMgxbAeMT1ZbrP2kDhwBXTQbfuU4KslmSzxFOTWNqVg0D77kS0ZrzTvQXcAop04dRdmfA77F2Q9rskJNbO32U__kba5QNrhb0ibqQGt1cqxWYrQ3RHaYQu8Xi6HeUqtf2_PpdXGErpdhbyzc_cmILn51AmX5AOsfpyorygm9PIc5/s1500/zxio_talkbot_schem.png" style="margin-left: auto; margin-right: auto;"><img alt="ZXIO TalkBot Schematic, Featuring the SP0256-AL2 Speech Chip" border="0" data-original-height="1229" data-original-width="1500" height="524" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoZk5Mr_9Di7-TkoVTUMgxbAeMT1ZbrP2kDhwBXTQbfuU4KslmSzxFOTWNqVg0D77kS0ZrzTvQXcAop04dRdmfA77F2Q9rskJNbO32U__kba5QNrhb0ibqQGt1cqxWYrQ3RHaYQu8Xi6HeUqtf2_PpdXGErpdhbyzc_cmILn51AmX5AOsfpyorygm9PIc5/w640-h524/zxio_talkbot_schem.png" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">ZXIO TalkBot Schematic, Featuring the SP0256-AL2 Speech Chip</td></tr></tbody></table><p><br /></p><p>The only other notable difference is the removal of the op-amp. Instead, I've provisioned a 3.5mm headphone jack that's easy enough to connect to powered speakers for all your amplification needs. (Note that there is also a direct connector that goes to my ZonZX-81 sound card.)</p><p><br /></p><h3>Talking the TalkBot</h3><p>The SP0256 is a speech synthesis chip designed to convert phonetic information into audible speech. It operates by receiving allophone codes, which represent specific variants of a phoneme occurring in particular linguistic contexts. Allophones, unlike phonemes, are concrete variations of sound within a language.</p><p><br /></p><p>In short, this means that you can't simply give the TalkBot a word and have it 'say' it correctly. Instead, you need to supply it with an allophone list that will hopefully construct a word from its sound samples. Below is a list of allophones, their sound descriptions, and suggested timings that each should be allowed to run.</p><p><br /></p><p>Unfortunately, the timings are not so useful in ZX81 BASIC, as the instructions take more time to process than desired. Feeding the Talkbot the allophones and ignoring time signatures works sufficiently well. Of course, there's nothing stopping us from addressing the Talkbot/SP0256 later in Assembly for a little more accuracy.</p><p><br /></p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhh8DI9oSkiR52aQX34IVpKZfD5LVx-Fcj9QvXHFzUtW65-VfSd5XFVOf1DxIEi_-zMZ1S65SAB2d1l-OTuzhH2aqrUWy9MTAApvkoeB6qbxSqlaV8pp06PHxVUr21OGrtADXzf9ww-UurWmgQJPXjjjG26TKN3Lh3H__9E4u99qWmRwOlmOVETkQ9lxfhM/s2176/SP0256_Allophones_Reference.png" style="margin-left: auto; margin-right: auto;"><img alt="ZXIO SP0256-AL2 Allophones Reference for the ZX81" border="0" data-original-height="1347" data-original-width="2176" height="396" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhh8DI9oSkiR52aQX34IVpKZfD5LVx-Fcj9QvXHFzUtW65-VfSd5XFVOf1DxIEi_-zMZ1S65SAB2d1l-OTuzhH2aqrUWy9MTAApvkoeB6qbxSqlaV8pp06PHxVUr21OGrtADXzf9ww-UurWmgQJPXjjjG26TKN3Lh3H__9E4u99qWmRwOlmOVETkQ9lxfhM/w640-h396/SP0256_Allophones_Reference.png" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">SP0256-AL2 Allophones Reference</td></tr></tbody></table><br /><p>To transmit data to the ZXIO-TalkBot interface we must first configure Port A and Port B on the 8255A IC for output mode. This can be done by POKEing the control register at address 49151 with a value of 128. Once complete, we can begin transmitting control codes. </p><p><br /></p><p>The Enable line is first set low on Port B at address 49149, 0, while the allophone control codes are transmitted through Port A at address 49148, 'code'. Then Enable line 1 on port B is set high at 49149, 1. After that, the Enable line is brought low again.</p><p><br /></p><p></p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEgLLLnpXR8HE5gOywr-pvZgi1Ib5LX4MqsJku7gFFy6GKu8QxDYH1RqbkKC-RZse2yZVXSq32d_2xUNJb4DMCk4OUAalyTGQ4u71pBP6BHSGv92w_V6g1vPd1OnX-m8vTgXdYNB0R7jxV0IdkltwEB_3HUpueU-TqlAYsJkQjgUs1Df6cBieKGyq8PPbnkP" style="margin-left: auto; margin-right: auto;"><img alt="" data-original-height="1308" data-original-width="2106" height="398" src="https://blogger.googleusercontent.com/img/a/AVvXsEgLLLnpXR8HE5gOywr-pvZgi1Ib5LX4MqsJku7gFFy6GKu8QxDYH1RqbkKC-RZse2yZVXSq32d_2xUNJb4DMCk4OUAalyTGQ4u71pBP6BHSGv92w_V6g1vPd1OnX-m8vTgXdYNB0R7jxV0IdkltwEB_3HUpueU-TqlAYsJkQjgUs1Df6cBieKGyq8PPbnkP=w640-h398" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">ZXIO-TalkBot and ZXIO V2 interface cards (plus ZX Minstel ZXpand & ZonZX-81)</td></tr></tbody></table><br /><br /><p></p><h3 style="text-align: left;">LCD and TalkBot</h3><p style="text-align: left;">The fun doesn't end there; after all, the ZXIO is designed to allow multiple interfaces to be attached simultaneously. As such, we can reuse the LCD interface from the previous project in <a href="https://www.zx81keyboardadventure.com/2023/05/zxio-interface-for-zx81-part-5.html" target="_blank">Part 5</a>, and have it write out what we're asking the ZXIO-TalkBot to say at the same time. For this, we only need to use the upper bits at address 49149 (Port B) to enable and disable its control lines.</p><p style="text-align: left;"><br /></p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwbKRQctJW_BtHNOA1MNaYZobJY7-OykMQTEqbuuPBqqRwTDcll4M9jat47sODS0xIa4oX3kWIp5KBzNLmi2CPmSuiiYgwAwxEVRlGpdLwqQD53trR9D66DdvuQxMuUaD6kU2Dhn5ql9kho8e1yMeW0K3OGjR3wTvO52En2t6jNaffe6sdC2o4IMl29x85/s1024/lcdsbotb.png" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="768" data-original-width="1024" height="480" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwbKRQctJW_BtHNOA1MNaYZobJY7-OykMQTEqbuuPBqqRwTDcll4M9jat47sODS0xIa4oX3kWIp5KBzNLmi2CPmSuiiYgwAwxEVRlGpdLwqQD53trR9D66DdvuQxMuUaD6kU2Dhn5ql9kho8e1yMeW0K3OGjR3wTvO52En2t6jNaffe6sdC2o4IMl29x85/w640-h480/lcdsbotb.png" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">ZX81 ZXIO V2 running the LCD and ZXIO-TalkBot Togther Demo </td></tr></tbody></table><p style="text-align: left;"><br /></p><p style="text-align: left;">For your complete audio-visual enjoyment, please play the video below to witness and hear the results. This is just a sample of what could be achieved; the ZXIO V2 Cards and expansions offer almost limitless possibilities. For instance, they could be employed to power a wide array of applications, even extending to interfacing with devices like an Arduino. The potential is expansive, and the video provides just a glimpse of the creative possibilities.</p><br /><div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='624' height='465' src='https://www.blogger.com/video.g?token=AD6v5dxbR-ybKgY5J7xATBo8kKkZixsq46ppGzJMqFMXnTECYOavqeWvI6xU5QniOMb2HpCNuyU6j84QMRwHs2dr-A' class='b-hbp-video b-uploaded' frameborder='0'></iframe></div><br /><p>For the moment, that pretty much concludes this mini-series on the ZXIO and ZXIO V2 expansion cards. Further projects based on the board are in the pipeline, and if there's enough interest, I may decide to produce kits and/or complete units. Please let me know if you'd be interested in obtaining a board. If you haven't already, please read over all the related earlier (and future) articles listed below.</p><p><br /></p><p>See all the other entries for this project: <a href="https://www.zx81keyboardadventure.com/2023/02/zxio-interface-for-zx81-part-1.html">Part 1</a>, <a href="https://www.zx81keyboardadventure.com/2023/02/zxio-interface-for-zx81-part-2.html">Part 2</a>, <a href="https://www.zx81keyboardadventure.com/2023/03/zxio-interface-for-zx81-part-3.html">Part 3</a>, <a href="https://www.zx81keyboardadventure.com/2023/04/zxio-interface-for-zx81-part-4.html">Part 4</a>, <a href="https://www.zx81keyboardadventure.com/2023/05/zxio-interface-for-zx81-part-5.html">Part 5</a> and <a href="https://www.zx81keyboardadventure.com/2023/08/zxio-interface-for-zx81-part-6.html">Part 6.</a></p><p><br /></p><p><br /></p>David Stephensonhttp://www.blogger.com/profile/11637474307612171656noreply@blogger.com0tag:blogger.com,1999:blog-255603189167868415.post-85123402256404467572023-12-06T23:07:00.003+11:002023-12-08T15:46:23.261+11:00Tut-Tut: Egyptomania the RC2014 Way<p><span style="font-size: large;">Sheila Dixon unwraps a spooktacular new version of Tut-Tut, the modern Retro classic, playfully bringing 'Egyptomania' to the premier home-built computer of the modern Retro era, the <a href="https://rc2014.co.uk/" target="_blank">RC2014</a>.</span></p><p><span style="font-size: large;"><br /></span></p><p><span style="font-size: large;"></span></p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEiYibTZKmUuTdMZu5bQDWeZ8L88PdxyHnxxa6Nt5JW0CAjKySE3Ta9_imC665_qiij890BWA3H6rGrYCkh-BiwAFhXKvUqlw8jDuqJgnYG9jhGLZUSLaE422112bmh0aAIfzwcG-w8fLzUoYBegk9ZpUT3g1ub5MO0auPhgUZ6QuB5xdt9voC-_42f6Q5Kw" style="margin-left: auto; margin-right: auto;"><img alt="Tut-Tut Level Ruby Rhod playing on the RC2014" data-original-height="1257" data-original-width="2000" height="402" src="https://blogger.googleusercontent.com/img/a/AVvXsEiYibTZKmUuTdMZu5bQDWeZ8L88PdxyHnxxa6Nt5JW0CAjKySE3Ta9_imC665_qiij890BWA3H6rGrYCkh-BiwAFhXKvUqlw8jDuqJgnYG9jhGLZUSLaE422112bmh0aAIfzwcG-w8fLzUoYBegk9ZpUT3g1ub5MO0auPhgUZ6QuB5xdt9voC-_42f6Q5Kw=w640-h402" title="Tut-Tut Level Ruby Rhod playing on the RC2014" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Tut-Tut Level Ruby Rhod playing on the RC2014</td></tr></tbody></table><span style="font-size: large;"><br /></span><p></p><h2 style="text-align: left;">What's New is Old when Tomb Raiding</h2><p></p><p>Why let the ancient microcomputers of the Pharaohs have all the fun when there are splendidly modern Z80 machines ready to embark on the Tut-Tut adventure. With the RC2014 debut, Sheila has seamlessly amalgamated elements from diverse game versions, infusing captivating sonic enhancements that add an extra layer of discovery.</p><p><br /></p><p>Part of the discovery may entail constructing your own RC2014 and then crafting a suitable video card for this petite computer, either a <a href="https://www.tindie.com/products/shieladixon/tms9918a-video-module-designed-for-rc2014/" target="_blank">TMS9918A video module designed for RC2014</a> or a <a href="https://www.tindie.com/products/shieladixon/tmsemu-graphics-card-designed-for-rc2014/" target="_blank">TMSEMU graphics card designed for RC2014</a>, required as notably a base RC2014 kit only provides serial out.</p><p><br /></p><p>The TMS9918A video IC was a fixture in numerous 80s home computers, including MSX1, so fittingly a touch of ancient technology is required to play the new RC2014 version of Tut. The TMS9918A brings a very vibrant palette to the game, remenicant of the ZX Spectrum, yet with it's own unique touches and a level of colour variety that puts the Sinclair to shame, delivering a new visulal experiance to the all the levels.</p><p><br /></p><p></p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEiu_vukEHirXpwj5EwsmX3peqM6yJmi8ftbEay-8Y_mPP3olxsV9Q3q0EdBWBTNu9GPTWfkr07d2E4ocjrkl_5mduD1UolsVqeFtgrNaTqIazVxo4riutMhmzFIdUFC4KG2RfbvflAJHoJiNFsggx8jdyf0KEAlC_jUKwtBdM-Vr9fbLCxGImJoWiBaxQUN" style="margin-left: auto; margin-right: auto;"><img alt="Screen Shot of a Screen of a Level of Tut-Tut RC2014" data-original-height="1536" data-original-width="2048" height="480" src="https://blogger.googleusercontent.com/img/a/AVvXsEiu_vukEHirXpwj5EwsmX3peqM6yJmi8ftbEay-8Y_mPP3olxsV9Q3q0EdBWBTNu9GPTWfkr07d2E4ocjrkl_5mduD1UolsVqeFtgrNaTqIazVxo4riutMhmzFIdUFC4KG2RfbvflAJHoJiNFsggx8jdyf0KEAlC_jUKwtBdM-Vr9fbLCxGImJoWiBaxQUN=w640-h480" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Screen Shot of a Screen of a Level of Tut-Tut RC2014</td></tr></tbody></table><br />Talking about levels, this edition incorporates both the freshest additions and timeless classics from the Vic20 release. What might not be immediately apparent is that, for the most part, they are constructed using the ZX81 level definitions. This peels back a layer of the game, restoring a slightly more claustrophobic ambience and an oddly menacing urgency to escape each tomb. Just like in the Vic20 release, level codes are provided, so you need not remained encased in a failed level forever however. <p></p><p><br /></p><p>One of the most exciting additions to the RC2014 version is the audio overhaul. Sheila has added a new score and sound effects thanks to an optional requirement of an AY sound module. (<a href="https://www.tindie.com/products/shieladixon/ymay-rev6-sound-card-designed-for-rc2014/" target="_blank">Another fun addition to the RC2014 to build</a>). Perhaps the best way to judge is to hear and see the game in action in a short clip taken during the games deveopment.</p><p><br /></p><div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen="" class="BLOG_video_class" height="339" src="https://www.youtube.com/embed/eqkJPY8MJa8" width="572" youtube-src-id="eqkJPY8MJa8"></iframe></div><br /><p><br /></p><p>In short, the RC2014 proves to be an outstanding addition to the Tut-Tut lineup, coupled with the added bonus of running the game on a system you've constructed yourself.</p><p><br /></p><p>You can dig up a copy of Tut-Tut RC2014 over at Itch IO, and don't forget to check out all the other versions of the games listed below.</p><p><br /></p><hr style="background-color: white; box-sizing: border-box; color: #333333; font-family: lora; font-size: 15px;" /><h2 style="background-color: white; border-bottom: 4px solid rgb(238, 238, 238); box-sizing: border-box; color: #333333; font-family: Oswald, sans-serif; font-size: 36px; font-weight: normal; line-height: 44px; margin: 10px 0px; padding: 0px 0px 5px;">Raid the Pyramids for a Copy of TuT-TuT</h2><div><br /></div><div><p><span style="background-color: white; box-sizing: border-box; color: #333333; font-family: lora; font-size: large; margin: 0px; padding: 0px;"><b style="box-sizing: border-box;">RC2014 CPM Version for the TMS9918A Video Card</b></span></p></div><div><p><span style="background-color: white; box-sizing: border-box; color: #333333; font-family: lora; font-size: large; margin: 0px; padding: 0px;"><b style="box-sizing: border-box;"></b></span></p><ul><a href="https://zx81keyboardadventure.itch.io/zx81-tut-tut" style="background-color: white; font-family: lora; font-size: 15px;" target="_blank"></a><li><span style="color: #333333; font-family: lora;"><span style="font-size: 15px;"><a href="https://shieladixon.itch.io/tut-tut-port-for-rc2014-cpm" target="_blank">Tut-Tut for the RC2014 Digital Copy</a>: Based on the ZX81 and Vic20 versions, with enhancements, by Shiela Dixon</span></span></li></ul><p><span style="background-color: white; box-sizing: border-box; color: #333333; font-family: lora; font-size: large; margin: 0px; padding: 0px;"><b style="box-sizing: border-box;">Commodore Vic-20</b></span><br style="background-color: white; box-sizing: border-box; color: #333333; font-family: lora; font-size: 15px;" /></p><p><span style="background-color: white; box-sizing: border-box; color: #333333; font-family: lora; font-size: large; margin: 0px; padding: 0px;"><b style="box-sizing: border-box;"></b></span></p><ul style="background-color: white; box-sizing: border-box; margin: 0px 0px 0px 35px; padding: 10px 0px 20px;"><li><a href="https://www.thefuturewas8bit.com/vic20-penultimate-plus-two.html" target="_blank">Find Tut-Tut on the PENULTIMATE+2 CARTRIDGE from the Future was 8bit</a></li><li><span style="color: #333333; font-family: lora;"><span style="font-size: 15px;">Coming in the not to distant future will be a Digital Release </span></span></li></ul></div><div><p><span style="background-color: white; box-sizing: border-box; color: #333333; font-family: lora; font-size: large; margin: 0px; padding: 0px;"><b style="box-sizing: border-box;">Commodore PET</b></span><br style="background-color: white; box-sizing: border-box; color: #333333; font-family: lora; font-size: 15px;" /></p><ul style="background-color: white; box-sizing: border-box; margin: 0px 0px 0px 35px; padding: 10px 0px 20px;"><li><span style="color: #333333; font-family: lora;"><span style="font-size: 15px;"><a href="https://tynemouth.itch.io/tut-tut-commodore-pet" target="_blank">Tut-Tut for the PET Digital Copy</a>: Based on the ZX81 version, with enhancements, by Dave Curran</span></span></li><li><a href="https://www.thefuturewas8bit.com/cas024.html" style="font-family: lora; font-size: 15px;" target="_blank">Get the Cassette from The Future was 8bit</a></li></ul></div><p><b style="background-color: white; box-sizing: border-box; color: #333333; font-family: lora; font-size: 15px;"><span style="box-sizing: border-box; font-size: large; margin: 0px; padding: 0px;">ZX81 Versions</span></b><br /></p><ul><a href="https://zx81keyboardadventure.itch.io/zx81-tut-tut" style="background-color: white; font-family: lora; font-size: 15px;" target="_blank"></a><li><a href="https://zx81keyboardadventure.itch.io/zx81-tut-tut" style="background-color: white; font-family: lora; font-size: 15px;" target="_blank"></a><a href="https://zx81keyboardadventure.itch.io/zx81-tut-tut" style="background-color: white; font-family: lora; font-size: 15px;" target="_blank">A Digital copy at Itch.io</a></li><li><a href="https://cronosoft.fwscart.com/TUT-TUT_Sinclair_ZX81_+_16K_RAM_on_cassette/p5357732_20270309.aspx" style="background-color: white; font-family: lora;" target="_blank">Get the Cassette from Cronosoft</a></li><li><span style="background-color: white; color: #333333; font-family: lora; font-size: 15px;">Play it on you iPad or iPhone, get a copy of </span><a href="https://apps.apple.com/us/app/zx81/id1180117434" style="background-color: white; box-sizing: border-box; color: #f3153d; font-family: lora; font-size: 15px; margin: 0px; outline: none; padding: 0px; text-decoration-line: none; transition: all 0.25s linear 0s;" target="_blank">ZX81 for IOS</a></li></ul><p><span style="background-color: white; box-sizing: border-box; color: #333333; font-family: lora; font-size: large; margin: 0px; padding: 0px;"><b style="box-sizing: border-box;">ZX Spectrum Versions</b></span><br style="background-color: white; box-sizing: border-box; color: #333333; font-family: lora; font-size: 15px;" /></p><ul><a href="https://zx81keyboardadventure.itch.io/zx-spectrum-tut-tut-2020-edition" style="background-color: white; font-family: lora; font-size: 15px;" target="_blank"></a><li><a href="https://zx81keyboardadventure.itch.io/zx-spectrum-tut-tut-2020-edition" style="background-color: white; font-family: lora; font-size: 15px;" target="_blank"></a><a href="https://zx81keyboardadventure.itch.io/zx-spectrum-tut-tut-2020-edition" style="background-color: white; font-family: lora; font-size: 15px;" target="_blank">Tut-Tut 2020 Edition at Itch.io</a><span style="background-color: white; color: #333333; font-family: lora; font-size: 15px;">: Based on the ZX81 version with extra levels (and glorious colour).</span></li><li><a href="https://cronosoft.fwscart.com/TUT-TUT_Sinclair_ZX_Spectrum_48K_on_cassette/p5357732_20754892.aspx" style="background-color: white; font-family: lora; font-size: 15px;" target="_blank">Get the Cassette from Cronosoft</a></li><li><a href="https://paleotronic.com/2019/11/05/tut-tut-a-new-game-for-the-zx-spectrum/" style="background-color: white; font-family: lora; font-size: 15px;" target="_blank">Classic BASIC</a><span style="background-color: white; color: #333333; font-family: lora; font-size: 15px;">: Physical Paper type-in release and Digital Copies will be available from Paleotronic Magazine</span></li></ul><p><a href="https://zx81keyboardadventure.itch.io/zx81-tut-tut" style="background-color: white; font-family: lora; font-size: 15px;" target="_blank"></a><a href="https://zx81keyboardadventure.itch.io/zx-spectrum-tut-tut-2020-edition" style="background-color: white; font-family: lora; font-size: 15px;" target="_blank"></a></p><div><p><span style="background-color: white; box-sizing: border-box; color: #333333; font-family: lora; font-size: large; margin: 0px; padding: 0px;"><b style="box-sizing: border-box;">Jupiter Ace</b></span><br style="background-color: white; box-sizing: border-box; color: #333333; font-family: lora; font-size: 15px;" /></p><span style="background-color: white; color: #333333; font-family: lora;"><ul><li><span style="color: #333333; font-family: lora;"><span style="font-size: 15px;"><a href="https://github.com/markgbeckett/jupiter_ace/tree/master/tut-tut" target="_blank">Tut-tut for the Jupiter, Ace Digital Copy</a>: Based on the ZX81 version, with enhancements, by </span></span><span>George Beckett</span></li><li><span style="color: #333333; font-family: lora;"><span style="font-size: 15px;"><a href="https://cronosoft.fwscart.com/TUT-TUT_Jupiter_Ace_+16K_RAM/p5357732_20996395.aspx" target="_blank">Get the Cassette from Cronosoft</a></span></span></li></ul></span><div><p><b style="color: #333333; font-family: lora; font-size: large;">TRS80 MC-10</b></p><div><ul><li><span style="background-color: white; color: #333333; font-family: lora;"><span style="font-size: 15px;"><a href=" https://youtu.be/j2P5wuhX8iI" target="_blank">Classic BASIC Digital Copy</a>: conversion to Tandys MC-10 by Jim Gerri</span></span></li></ul></div></div></div>David Stephensonhttp://www.blogger.com/profile/11637474307612171656noreply@blogger.com0tag:blogger.com,1999:blog-255603189167868415.post-31689953383214445902023-08-18T21:49:00.004+10:002023-08-21T19:40:57.270+10:00ZX81 Bus Extender: The Expansion Board Solution <div style="text-align: left;"><span style="font-size: x-large;">Adding expansion boards to the back of a ZX81 is always a slightly terrifying business, a fear compounded with each consecutive item tacked behind the little wedge.</span></div><p><span style="font-size: normal;"><br /></span></p><p><span style="font-size: normal;">The wobbly expansion of expansions is a near unsolvable problem when using off the (distant in time and space) shelf products, however, when building our own expansions there's really no need to suffer. What's the answer to the wibbly wobbly's? Why a decently designed Bus Extender board and case of course.</span></p><p><span style="font-size: normal;"><br /></span></p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIm05yA1KmAMnhv6pc_-HOTSwwogJ-Tl-zHy2L9jTeWxyGa11ER4peRSjaz2M_rAT5cDW4Q4f0Tm3nomD6-cS-Fci8Lx5Gj76cmQJGjc2OIUpKOCfLV7cFf4DY6eXXkON7AYufG0LcUp3LKABkl3LF0Xt0KIyhexYDng_AaB5OFm4dR7n84VdMaJb_Tg/s4076/P1000133.JPG" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="2694" data-original-width="4076" height="424" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIm05yA1KmAMnhv6pc_-HOTSwwogJ-Tl-zHy2L9jTeWxyGa11ER4peRSjaz2M_rAT5cDW4Q4f0Tm3nomD6-cS-Fci8Lx5Gj76cmQJGjc2OIUpKOCfLV7cFf4DY6eXXkON7AYufG0LcUp3LKABkl3LF0Xt0KIyhexYDng_AaB5OFm4dR7n84VdMaJb_Tg/w640-h424/P1000133.JPG" title="ZX Bus Extender with an assortment of add-ons" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">ZX81 Bus Extender with an Assortment of Add-ons</td></tr></tbody></table><p>We're not embarking on a wheel-reinventing adventure here. The concept of a Bus Extender isn't a groundbreaking discovery; Over the past four decades, resourceful enthusiasts have crafted their versions for the ZX80 and 81. The only hiccup? Laying your hands on one. But behold the magic of our modern age: securing your very own Bus Extender is a breeze. A simple solution? Just place an order for a PCB at any of the numerous fabrication houses like JLCPCB, PCBWAY or AISLER. Now, of course, you'll need something to order, and lo and behold, we've got you covered with the ZX81 Bus Extender gerber files conveniently linked below. Your expansion dreams are just a click away!</p><p><br /></p><p></p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEhsnl8Y61o455sWFglyaE7PVonf5pkoe_iBNVV4Az6mGgYTwnCyqfANjZPyqsh2FGuvFD1npD6P5yBc0rAI6clS_bcNdzCYfTCqC_U4u3Sfk0n7WUcJeiZCMcs45Kl3Swwkl-x0RLxlyeyK0BLfmF0IwUU3fgB3Ps9XxMPdwLzzmlzY3c8ELW5dk6lpZA" style="margin-left: auto; margin-right: auto;"><img alt="Refer to http://www.zx81stuff.org.uk/zx81/hardware/MaplinExtender for details" data-original-height="914" data-original-width="1234" height="474" src="https://blogger.googleusercontent.com/img/a/AVvXsEhsnl8Y61o455sWFglyaE7PVonf5pkoe_iBNVV4Az6mGgYTwnCyqfANjZPyqsh2FGuvFD1npD6P5yBc0rAI6clS_bcNdzCYfTCqC_U4u3Sfk0n7WUcJeiZCMcs45Kl3Swwkl-x0RLxlyeyK0BLfmF0IwUU3fgB3Ps9XxMPdwLzzmlzY3c8ELW5dk6lpZA=w640-h474" title="Maplin ZX81 Extender" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Maplin Bus Extender Interface (available at one point in the UK)</td></tr></tbody></table><p>The Extender boasts a well-thought-out design, strategically accommodating up to three expansion cards and further expansion possible behind (Think ZXpand or similar). Its layout incorporates a three row hole arrangement on the printed circuit board, with ZX81 BUS 1a duplicated twice, offering the flexibility to house either two-row expansion headers or card slots – you know, the same kind that snugly attach to your trusty ZX81. This Extender knows how to cater to your every expansion whim. You'll require at least one expansion header to attach the thing to a ZX81 or ZX80, and additional headers of your own choosing for accomodate the expansion cards.</p><br /><p></p><p></p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEgwmibuhUVW7dwVhYevO6LTCFoGf1TRJR7rGqKlwQ_O97qdQWgwpg4n7Px-G6EDOH8wRGMXREUmzKbIuSiqVAGgaKowSi3sQRJu4nxwQuAOmPO-2T8ZcdpAeZFIgq5XPFg6ok8JLIB1FBxnLF8TsIZCsBFHka8kxSa8H5LojZunA2iiO4T-pK7ka3oWgQ" style="margin-left: auto; margin-right: auto;"><img alt="zx81 bus extender / expansion edge connetor" data-original-height="1320" data-original-width="1616" height="522" src="https://blogger.googleusercontent.com/img/a/AVvXsEgwmibuhUVW7dwVhYevO6LTCFoGf1TRJR7rGqKlwQ_O97qdQWgwpg4n7Px-G6EDOH8wRGMXREUmzKbIuSiqVAGgaKowSi3sQRJu4nxwQuAOmPO-2T8ZcdpAeZFIgq5XPFg6ok8JLIB1FBxnLF8TsIZCsBFHka8kxSa8H5LojZunA2iiO4T-pK7ka3oWgQ=w640-h522" title="Edge Expansion bus for the ZX81 and ZX80" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">ZX81 Adventures 3x3 Bus Extender</td></tr></tbody></table><p>Naturally, a bus extender isn't fully dressed without its cosy enclosure. Picture it nestled within a polished case, a snug retreat ensures seamless operation, cradling expansion cards of your creation. The case boasts an elegantly simple design, seamlessly complementing your ZX81's rear. Oh, and don't forget those rubber feet (12.5mm*12.5mm*3mm(L*W*H)) – they elevate both style and stability, and some M3 screws to hold it together.</p><p><br /></p><p></p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEhAi9rTSC-_UbrIG1KCkC-olBhEAYaeZnAi0LsHjq81WpcU2-6nMQTSZ2eWhEjWhB-981V8HlSWuewgs7GizBBv35szwsgi5HcXMlSpyCT9h6Zdrqyq8ik3MJry9xVQ36LLcIYvAKfYJmQcAqzI5hqxv9_lh1EokdV2rSIthJGh4Cba_vMKaYQ4d9KcMRjV" style="margin-left: auto; margin-right: auto;"><img alt="zx81 bus extender / expansion edge connetor in 3d printed case" data-original-height="1320" data-original-width="1676" height="504" src="https://blogger.googleusercontent.com/img/a/AVvXsEhAi9rTSC-_UbrIG1KCkC-olBhEAYaeZnAi0LsHjq81WpcU2-6nMQTSZ2eWhEjWhB-981V8HlSWuewgs7GizBBv35szwsgi5HcXMlSpyCT9h6Zdrqyq8ik3MJry9xVQ36LLcIYvAKfYJmQcAqzI5hqxv9_lh1EokdV2rSIthJGh4Cba_vMKaYQ4d9KcMRjV=w640-h504" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">ZX81 Adventures 3x3 Bus Extender in Handy Dany Case with Cards</td></tr></tbody></table><br /><p></p><h3 style="text-align: left;">Project Files</h3><div>If you find these files useful, flip me coffee or beer etc.</div><p></p><p></p><ul style="text-align: left;"><li><a href="https://drive.google.com/file/d/1G-mpxJFzVnn6qIZ7AlbJqWCG4RaGxJI0/view?usp=sharing" target="_blank">PCB Gerbers Files for the <span style="text-align: center;">ZX81 Adventures 3x3 Bus Extender</span></a></li><li><a href="https://drive.google.com/file/d/1gZizNGoiuZzpIHPosWZC_W3JECUvNYt5/view?usp=sharing" target="_blank"><span style="text-align: center;">Hand Dandy </span><span style="text-align: center;">ZX81 Adventures</span><span style="text-align: center;"> </span><span style="text-align: center;">3x3 Bus Extender Case Files</span></a></li></ul><p></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p>David Stephensonhttp://www.blogger.com/profile/11637474307612171656noreply@blogger.com0tag:blogger.com,1999:blog-255603189167868415.post-57611212031820278832023-07-16T09:19:00.009+10:002023-07-25T02:10:13.770+10:00Tut-Tut: Tomb Raiding on the Vic-20 <p></p><div style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEhtL0E1oPaxtjMwNzXvQetfSdb-G1RLiCD3kt1uabz84rVjRsNIEW_WgpXqG6Hfa8HNZ_-S_rfDST07l_vlAVlA7p6_VJ7MlQf2-AQ1a58NAMib8yxuDNl-aOMpVPLHl4wXDFthn2mTc4cY4VWerECol06OK4IRG-c600dBjIAocPrurCCFKpsrZhNTivLK"><img alt="Tut-Tut Concept Art" data-original-height="1600" data-original-width="2560" height="400" src="https://blogger.googleusercontent.com/img/a/AVvXsEhtL0E1oPaxtjMwNzXvQetfSdb-G1RLiCD3kt1uabz84rVjRsNIEW_WgpXqG6Hfa8HNZ_-S_rfDST07l_vlAVlA7p6_VJ7MlQf2-AQ1a58NAMib8yxuDNl-aOMpVPLHl4wXDFthn2mTc4cY4VWerECol06OK4IRG-c600dBjIAocPrurCCFKpsrZhNTivLK=w640-h400" title="Tut-Tut Concept Art by David Stephenson" width="640" /></a></div><br /><p></p><h2 style="text-align: left;">A New Version of a Modern Retro Classic</h2><p><span style="font-size: large;">Given the resounding success of my little game of Tut-Tut on platforms such as ZX Spectrum, ZX81, Jupiter ACE, and the commendable port by <a href="http://blog.tynemouthsoftware.co.uk/" target="_blank">Tynemouth Software's Dave Curran</a> to the Commodore PET, it was an inevitable progression to broaden the game's horizons and introduce it to the illustrious Vic-20, the "Wonder Computer of the 1980s."</span></p><hr /><p></p><h3 style="text-align: left;">New to Tut-Tut? What's this Game About?</h3><p>As the digging season of 1921 draws to a close in Egypt's Valley of the Kings, it becomes evident that your excavations have yielded disappointing results. Despite your ardent efforts, no traces of the fabled and elusive Pharaohs' tombs have been uncovered. However, as the final weeks approach, intriguing rumours begin to circulate, recounting chilling accounts of vengeful mummies exacting retribution upon local would-be tomb raiders.</p><p><br /></p><p>These wild stories, though tinged with the supernatural and curses, cannot be ignored. As an Egyptologist and daring adventurer, you find yourself presented with concrete leads and irresistible opportunities. The allure of uncovering long-lost secrets and ancient treasures proves too tempting to resist, even in the face of ominous tales of wrathful spirits.</p><p><br /></p><p></p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEglYuG2O37i2nquNLWADC-QvV-mfSQ_TmOZ-VKGhwPkSkQoyXtLvgHeB1OI1S1QNA2yBhFWP25kwz-wOwRmcLZbycLI5CT2JaP9O7p0kqNgwnauuXM8LdouCtz_O3BaP8V-LA7-CRqOKxAMioc1TE6zfBgHjTW5H43eP3gY6cf7nESKLAt8becaHyDwHbJl" style="margin-left: auto; margin-right: auto;"><img alt="Tut-Tut Vic20 Screen Shots" data-original-height="3096" data-original-width="2712" height="640" src="https://blogger.googleusercontent.com/img/a/AVvXsEglYuG2O37i2nquNLWADC-QvV-mfSQ_TmOZ-VKGhwPkSkQoyXtLvgHeB1OI1S1QNA2yBhFWP25kwz-wOwRmcLZbycLI5CT2JaP9O7p0kqNgwnauuXM8LdouCtz_O3BaP8V-LA7-CRqOKxAMioc1TE6zfBgHjTW5H43eP3gY6cf7nESKLAt8becaHyDwHbJl=w561-h640" title="Tut-Tut Commodore Vic20 Screen Shots" width="561" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Screen Shots from the Vic-20 version of TuT-TuT</td></tr></tbody></table><br /><div>Now, on the cusp of a new expedition, you stand poised to delve into the unknown depths of the Valley of the Kings, ready to face the mysteries and potential dangers that lie ahead. Will you emerge unscathed from the clutches of ancient curses, or will the vengeful spirits lurking in the shadows prove to be more than mere legends? The answers await, as you embark on a daring quest that will test your courage, knowledge, and perhaps even your beliefs.<div><br />Prepare to embark on a journey like no other as Tut-Tut takes you on an adventure through the treacherous Egyptian tombs, with its visually stunning colour scheme and a myriad of intricately woven graphic tile sets that bring the ancient world to life before your very eyes.<p></p><p><br /></p><h2 style="text-align: left;">The Making of the Vic-20 Version </h2><div>Tut-Tut initially originated as a BASIC type-in game, designed specifically for the ZX Spectrum and published in <a href="https://paleotronic.com/2019/11/05/tut-tut-a-new-game-for-the-zx-spectrum/" target="_blank">Paleotronic Magazine</a>. Further versions of the game for the <a href="https://www.zx81keyboardadventure.com/2019/10/zx81-game-tut-tut.html" target="_blank">ZX81</a>, Enhanced <a href="https://www.zx81keyboardadventure.com/2020/04/zx-spectrum-game-tut-tut-2020-ed.html" target="_blank">2020 Spectrum Edition</a> and <a href="https://www.zx81keyboardadventure.com/2020/05/tut-tut-on-jupiter-ace-part-1.html" target="_blank">Jupiter Ace</a>, the latest version was one ported to the <a href="https://www.zx81keyboardadventure.com/2021/08/tut-tut-on-commodore-pet.html" target="_blank">Commodore PET</a> by Dave Curran. All varieties have all kept the core structure and mechanics as outlined there.</div><div><br /></div><div>After witnessing the success of Dave's PET version, I couldn't help but ponder the possibility of bringing Tut-Tut to the Vic-20. While considering the similarities between the two machines, I became aware of the numerous disparities that needed to be addressed, particularly in terms of screen real-estate and the Vic-20's unconventional memory management scheme. Luckily i raised the conversion idea with Dave, and he was up to a joint challenge, as I'm in no way sure I'd have got there without our joint efforts.</div><div><br /></div><h4 style="text-align: left;">Screen Real-Estate and Luck by Design</h4><div><div>Due to Tut-Tut's origin as a ZX BASIC game, one that need to run quickly, lead to the adoption of a 26x17 character grid for the game board layout (excluding score bars etc). The ZX Spectrum's character resolution is 32x24, constraining the board size to a smaller grid made for more time efficient code in the very orriginal ZX BASIC version. These dimensions sunsiquently stuck for all future conversions.</div><div><br /></div><div>However, while the grid size was suitable for the ZX line, it posed a challenge when porting Tut-Tut to the Vic-20. Those familiar with the Vic-20 immediately noticed the issue: the Vic-20's screen width is only 22 characters wide (and 23 high). This presented a hurdle that needed to be addressed in order to adapt the game for the Vic-20.</div></div><div><br /></div><div>A possible solution could have been to reconfigure the game's levels to fit within the Vic-20's 22x23 screen limitations. This would have been easily achievable code wise, but level design wise it would come at a cost to the overall feel and immersion. A particular issue, as the existing levels are heavily constructed around the games mechanics and already small(ish) screen size.</div><div><br /></div><div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEhT-oUXPz6yMA68qQhJAfAfKTYpsKqxTnvQV4PqO9z8sDozLExwWh2hzBZWqlNU8lwp-u8LKB_8rnT35LGCHhonlCMVyJvJ7dyoI-9prUL4bowsjAOSZNmNBtZSZINlEn6nZ2cDmXyzrVt6bVI_zoCbefKFbeYPYfVaA1bPN5gOQWxJrn0godVwba2g9ppF" style="margin-left: auto; margin-right: auto;"><img alt="Tut-Tut Vic20 Screen Shots / PAL vs NTSC Geometry" data-original-height="706" data-original-width="1198" height="378" src="https://blogger.googleusercontent.com/img/a/AVvXsEhT-oUXPz6yMA68qQhJAfAfKTYpsKqxTnvQV4PqO9z8sDozLExwWh2hzBZWqlNU8lwp-u8LKB_8rnT35LGCHhonlCMVyJvJ7dyoI-9prUL4bowsjAOSZNmNBtZSZINlEn6nZ2cDmXyzrVt6bVI_zoCbefKFbeYPYfVaA1bPN5gOQWxJrn0godVwba2g9ppF=w640-h378" title="Tut-Tut Commodore Vic20 PAL vs NTSC Geometry" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">PAL vs NTSC Geometry Comparison</td></tr></tbody></table><br /></div><div>As luck would have it, the Vic-20's screen sizes can be redefined to an extent. Values in memory location 36864 to 36867 can be POKED to set screen geometry and centring. The results of doing so yielded just the right amount screen width to fit the existing level structure.</div><div><br />Yet another obstacle presented itself: the disparities in screen geometry between PAL and NTSC standards. NTSC, in particular, occupies a wider physical width on a display (not pixels) compared to PAL. However, by a stroke of luck, the constraints imposed by the level width inadvertently resulted in an image that delicately brushes the very edge of an NTSC display. This serendipitous alignment allowed Tut-Tut to make the most of the available screen space on both PAL and NTSC systems.</div><div><br /></div><h4 style="text-align: left;">Graphics Updates</h4><div><div>The Vic-20 is perhaps renowned for its vibrant and colourful display, you'd think this would be directly comparable to the ZX Spectrum in terms of its rich palette. However, an intriguing aspect arises when considering the variation in colour appearance based on factors such as the age, make, and region (PAL/NTSC) of the Vic Chip utilised on any given machine. Then there is the screen fuzziness / blurriness, which again varies. </div><div><br /></div><div>The diversity in colour appearance on different Vic-20 machines prompted us to reevaluate tile design and colour choices for Tut-Tut. In the Spectrum version, the game employed various palettes that cycled based on the level number, creating a dynamic and ever-changing visual experience. However, for the Vic-20 version, we've opted for a different approach. Instead of cycling palettes, we focused on expanding the selection of available thematic tiles while exercising tighter control over the colour schemes. (A good approach, and If I hadn't mentioned it, would probably gone unnoticed.)</div></div><div><br /></div><div>We're pretty confident we reached the required level of ancient Egyptian cinematic charm / ham.</div><div><br /></div><h4 style="text-align: left;">Memory for Mummies?</h4><div>Another challenge we faced was determining how much memory we could allocate to the game on the Vic-20. By default, the Vic-20 only had a modest 3k of onboard memory, which was insufficient to accommodate even the most streamlined versions of Tut. The issue was further compounded by the lack of a standardised expansion memory layout and location of that memory on a Vic-20. This variability made it difficult to rely on expanded memory for larger games, often leading to the reliance on cartridges for larger game titles.</div><div><br /></div><div>Ultimately, we proceeded with the assumption that modern enthusiasts would likely possess a contemporary memory solution, such as the Penultimate+, offering a generous 32k of memory. This assumption gave us the confidence that the game could be released on cassette. Little did we know at the time of developing the game that Tut-Tut would eventually become a pack-in title on the <a href="https://www.thefuturewas8bit.com/vic20-penultimate-plus-two.html" target="_blank">Penultimate+2 Cart from TFW8b.com</a>.</div><div><br /></div><h4 style="text-align: left;">Pharaohs' (Pen)Ultimate Enhancements</h4><div><div>The Vic-20 version of Tut-Tut comes packed with all 36 levels from the ZX Spectrum 2020 Edition. In addition, we have incorporated 6 exciting new levels (bringing the total to 40) that are carefully integrated throughout the game, providing fresh challenges and surprises.</div><div><br /></div><div>We have also included the convenient pause option from the PET version, allowing intrepid Archaeologists to take much needed meal and rest breaks. Furthermore, one of the most highly requested features we have implemented is the inclusion of level codes: Enter specific codes to access the harder levels previously reached.</div></div><div><br /></div><div>All very good reasons to call this Vic-20 version, the Ultimate Tut-Tut.</div><div> </div><p></p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEhvhSmMXGDyYRMTFdJDdBUQuMTKtq6xQZa3bGDT4Et4Gd1BYYI0wCYOWJYOP6KSXDC9R--xHwDbYpZrSo6D9KyNjzLcIuhos2Xe77-Pm1wF6R4qoxAekmiKQ3IXKWhdBAQHAR72T_6Updf3Ikg1yABPWsU5sZBHr0Eie0zU8qaFGfM4GHwJtw2ZmTNA8u22" style="margin-left: auto; margin-right: auto;"><img alt="Playing Vic20 Tut-Tut with the Peultimate+2 Cartridge" data-original-height="1320" data-original-width="1056" height="640" src="https://blogger.googleusercontent.com/img/a/AVvXsEhvhSmMXGDyYRMTFdJDdBUQuMTKtq6xQZa3bGDT4Et4Gd1BYYI0wCYOWJYOP6KSXDC9R--xHwDbYpZrSo6D9KyNjzLcIuhos2Xe77-Pm1wF6R4qoxAekmiKQ3IXKWhdBAQHAR72T_6Updf3Ikg1yABPWsU5sZBHr0Eie0zU8qaFGfM4GHwJtw2ZmTNA8u22=w512-h640" title="Playing Vic-20 Tut-Tut with the Peultimate+2 Cartridge" width="512" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Playing Tut-Tut Vic-20 as included on the Penultimate+2 Cart</td></tr></tbody></table><br /></div><h3 style="text-align: left;">Special Thanks</h3><div><div>I Can't end this post without thanking Dave Curran for sharing in the creation of the Vic-20 conversion, he'd paved much of the ground work during his PET efforts.</div><div><br /></div><div>Additionally, thanks very much to Rob Hull for including the game in the Penultimate+2 games lineup. Very happy indeed to have it listed alongside the other TFW8b titles.</div></div><div><br /></div><div><br /></div><h3 style="text-align: left;">Fancey Delving Deeper into the Vic-20 Conversion?</h3><div>Further Readings unraveling the mysteries of Tut-Tut Tomb's and the Vic-20 conversion are now available on the Illustrious <a href="http://blog.tynemouthsoftware.co.uk/2023/07/tut-tut-for-vic20.html" target="_blank">Tynemouth Software Blog</a>.</div><div><br /></div><div><hr style="background-color: white; box-sizing: border-box; color: #333333; font-family: lora; font-size: 15px;" /><h2 style="background-color: white; border-bottom: 4px solid rgb(238, 238, 238); box-sizing: border-box; color: #333333; font-family: Oswald, sans-serif; font-size: 36px; font-weight: normal; line-height: 44px; margin: 10px 0px; padding: 0px 0px 5px;">Raid the Pyramids for a Copy of TuT-TuT</h2><div><br /></div><div><p><span style="background-color: white; box-sizing: border-box; color: #333333; font-family: lora; font-size: large; margin: 0px; padding: 0px;"><b style="box-sizing: border-box;">Commodore Vic-20</b></span><br style="background-color: white; box-sizing: border-box; color: #333333; font-family: lora; font-size: 15px;" /></p><p><span style="background-color: white; box-sizing: border-box; color: #333333; font-family: lora; font-size: large; margin: 0px; padding: 0px;"><b style="box-sizing: border-box;"></b></span></p><ul style="background-color: white; box-sizing: border-box; margin: 0px 0px 0px 35px; padding: 10px 0px 20px;"><li><a href="https://www.thefuturewas8bit.com/vic20-penultimate-plus-two.html" target="_blank">Find Tut-Tut on the PENULTIMATE+2 CARTRIDGE from the Future was 8bit</a></li><li><span style="color: #333333; font-family: lora;"><span style="font-size: 15px;">Coming in the not to distant future will be a Digital Release </span></span></li></ul></div><div><p><span style="background-color: white; box-sizing: border-box; color: #333333; font-family: lora; font-size: large; margin: 0px; padding: 0px;"><b style="box-sizing: border-box;">Commodore PET</b></span><br style="background-color: white; box-sizing: border-box; color: #333333; font-family: lora; font-size: 15px;" /></p><ul style="background-color: white; box-sizing: border-box; margin: 0px 0px 0px 35px; padding: 10px 0px 20px; text-align: left;"><li><span style="color: #333333; font-family: lora;"><span style="font-size: 15px;"><a href="https://tynemouth.itch.io/tut-tut-commodore-pet" target="_blank">Tut-Tut for the PET Digital Copy</a>: Based on the ZX81 version, with enhancements, by Dave Curran</span></span></li><li><a href="https://www.thefuturewas8bit.com/cas024.html" style="background-color: white; font-family: lora; font-size: 15px;" target="_blank">Get the Cassette from The Future was 8bit</a></li></ul></div><p><b style="background-color: white; box-sizing: border-box; color: #333333; font-family: lora; font-size: 15px;"><span style="box-sizing: border-box; font-size: large; margin: 0px; padding: 0px;">ZX81 Versions</span></b><br /></p><a href="https://zx81keyboardadventure.itch.io/zx81-tut-tut" style="background-color: white; font-family: lora; font-size: 15px;" target="_blank"></a><ul style="text-align: left;"><a href="https://zx81keyboardadventure.itch.io/zx81-tut-tut" style="background-color: white; font-family: lora; font-size: 15px;" target="_blank"></a><li><a href="https://zx81keyboardadventure.itch.io/zx81-tut-tut" style="background-color: white; font-family: lora; font-size: 15px;" target="_blank"></a><a href="https://zx81keyboardadventure.itch.io/zx81-tut-tut" style="background-color: white; font-family: lora; font-size: 15px;" target="_blank">A Digital copy at Itch.io</a></li><li><a href="https://cronosoft.fwscart.com/TUT-TUT_Sinclair_ZX81_+_16K_RAM_on_cassette/p5357732_20270309.aspx" style="background-color: white; font-family: lora;" target="_blank">Get the Cassette from Cronosoft</a></li><li><span style="background-color: white; color: #333333; font-family: lora; font-size: 15px;">Play it on you iPad or iPhone, get a copy of </span><a href="https://apps.apple.com/us/app/zx81/id1180117434" style="background-color: white; box-sizing: border-box; color: #f3153d; font-family: lora; font-size: 15px; margin: 0px; outline: none; padding: 0px; text-decoration-line: none; transition: all 0.25s linear 0s;" target="_blank">ZX81 for IOS</a></li></ul><p><span style="background-color: white; box-sizing: border-box; color: #333333; font-family: lora; font-size: large; margin: 0px; padding: 0px;"><b style="box-sizing: border-box;">ZX Spectrum Versions</b></span><br style="background-color: white; box-sizing: border-box; color: #333333; font-family: lora; font-size: 15px;" /></p><a href="https://zx81keyboardadventure.itch.io/zx-spectrum-tut-tut-2020-edition" style="background-color: white; font-family: lora; font-size: 15px;" target="_blank"></a><ul style="text-align: left;"><a href="https://zx81keyboardadventure.itch.io/zx-spectrum-tut-tut-2020-edition" style="background-color: white; font-family: lora; font-size: 15px;" target="_blank"></a><li><a href="https://zx81keyboardadventure.itch.io/zx-spectrum-tut-tut-2020-edition" style="background-color: white; font-family: lora; font-size: 15px;" target="_blank"></a><a href="https://zx81keyboardadventure.itch.io/zx-spectrum-tut-tut-2020-edition" style="background-color: white; font-family: lora; font-size: 15px;" target="_blank">Tut-Tut 2020 Edition at Itch.io</a><span style="background-color: white; color: #333333; font-family: lora; font-size: 15px;">: Based on the ZX81 version with extra levels (and glorious colour).</span></li><li><a href="https://cronosoft.fwscart.com/TUT-TUT_Sinclair_ZX_Spectrum_48K_on_cassette/p5357732_20754892.aspx" style="background-color: white; font-family: lora; font-size: 15px;" target="_blank">Get the Cassette from Cronosoft</a></li><li><a href="https://paleotronic.com/2019/11/05/tut-tut-a-new-game-for-the-zx-spectrum/" style="background-color: white; font-family: lora; font-size: 15px;" target="_blank">Classic BASIC</a><span style="background-color: white; color: #333333; font-family: lora; font-size: 15px;">: Physical Paper type-in release and Digital Copies will be available from Paleotronic Magazine</span></li></ul><div><p><span style="background-color: white; box-sizing: border-box; color: #333333; font-family: lora; font-size: large; margin: 0px; padding: 0px;"><b style="box-sizing: border-box;">Jupiter Ace</b></span><br style="background-color: white; box-sizing: border-box; color: #333333; font-family: lora; font-size: 15px;" /></p><span style="background-color: white; color: #333333; font-family: lora;"><ul style="text-align: left;"><li><span style="background-color: white; color: #333333; font-family: lora;"><span style="font-size: 15px;"><a href="https://github.com/markgbeckett/jupiter_ace/tree/master/tut-tut" target="_blank">Tut-tut for the Jupiter, Ace Digital Copy</a>: Based on the ZX81 version, with enhancements, by </span></span><span style="background-color: white;">George Beckett</span></li><li><span style="background-color: white; color: #333333; font-family: lora;"><span style="font-size: 15px;"><a href="https://cronosoft.fwscart.com/TUT-TUT_Jupiter_Ace_+16K_RAM/p5357732_20996395.aspx" target="_blank">Get the Cassette from Cronosoft</a></span></span></li></ul></span><div><p><b style="color: #333333; font-family: lora; font-size: large;">TRS80 MC-10</b></p><div style="text-align: left;"><ul style="text-align: left;"><li><span style="background-color: white; color: #333333; font-family: lora;"><span style="font-size: 15px;"><a href=" https://youtu.be/j2P5wuhX8iI" target="_blank">Classic BASIC Digital Copy</a>: conversion to Tandys MC-10 by Jim Gerri</span></span></li></ul></div></div></div></div><div><br /></div></div>David Stephensonhttp://www.blogger.com/profile/11637474307612171656noreply@blogger.com1tag:blogger.com,1999:blog-255603189167868415.post-56747238051801820772023-05-07T21:46:00.006+10:002024-01-07T14:23:53.575+11:00ZXIO Interface for the ZX81: Part 5<h3 style="text-align: left;">IO Boards Comparison, Featuring Hitachi LCDs</h3><p style="text-align: left;">Now that we have 2 differing IO boards, why not put them in a side by side comparison. I figured a good test of the board would involve a simple communications project, such as writing out to a character based HD44780 compatible LCD screen.</p><p style="text-align: left;"><br />An HD44780 LCD panel is a character-based liquid crystal display that can display 16 characters per line and up to 2 lines of text. It is widely used in embedded systems and DIY projects because of its low cost, low power consumption, and ease of use. The HD44780 LCD panel is compatible with a wide range of microcontrollers and can be interfaced using a 4-bit or 8-bit command set. We really couldn't ask for a more amiable device for testing ZXIO board differences with.</p><p style="text-align: left;"><br /></p><div><div class="separator" style="clear: both; text-align: left;"><div><div><div><span style="font-size: large;"><b>HD44780 </b><b>LCD Module</b><b> </b><b>Pin out </b></span></div><table bgcolor="#CDCDCD"><tbody><tr><th colspan="1" width="15%"><div style="text-align: left;">Pin</div></th><th colspan="1" width="15%"><div style="text-align: left;">Signal</div></th><th colspan="1" width="70%"><div style="text-align: left;">Function</div></th></tr><tr><td><b><i>1</i></b></td><td><b>VSS</b></td><td>Ground</td></tr><tr bgcolor="#EEEEEE"><td><b><i>2</i></b></td><td><b>VCC</b></td><td>+5 Volts</td></tr><tr><td><b><i>3</i></b></td><td><b>VEE</b></td><td>Contrast adjustment 0V: High Contrast</td></tr><tr bgcolor="#EEEEEE"><td><b><i>4</i></b></td><td><b>RS</b></td><td>Register Select 0: Command, 1: Data</td></tr><tr><td><b><i>5</i></b></td><td><b>R/W</b></td><td>Read/Write 0: Write, 1: Read</td></tr><tr bgcolor="#EEEEEE"><td><b><i>6</i></b></td><td><b>EN</b></td><td>Enable. Falling edge triggered</td></tr><tr><td><b><i>7</i></b></td><td><b>DB0</b></td><td>Data Bit 0 (Not used in 4-bit Mode)</td></tr><tr bgcolor="#EEEEEE"><td><b><i>8</i></b></td><td><b>DB1</b></td><td>Data Bit 1 (Not used in 4-bit Mode)</td></tr><tr><td><b><i>9</i></b></td><td><b>DB2</b></td><td>Data Bit 2 (Not used in 4-bit Mode)</td></tr><tr bgcolor="#EEEEEE"><td><b><i>10</i></b></td><td><b>DB3</b></td><td>Data Bit 2 (Not used in 4-bit Mode)</td></tr><tr><td><b><i>11</i></b></td><td><b>DB4</b></td><td>Data Bit 4</td></tr><tr bgcolor="#EEEEEE"><td><b><i>12</i></b></td><td><b>DB5</b></td><td>Data Bit 5</td></tr><tr><td><b><i>13</i></b></td><td><b>DB6</b></td><td>Data Bit 6</td></tr><tr bgcolor="#EEEEEE"><td><b><i>14</i></b></td><td><b>DB7</b></td><td>Data Bit 7</td></tr><tr><td><b><i>15</i></b></td><td><b>LED A+</b></td><td>Anode Back light + </td></tr><tr bgcolor="#EEEEEE"><td><b><i>16</i></b></td><td><b>LED K-</b></td><td>Cathode Back light -</td></tr></tbody></table></div></div><h3 style="text-align: left;">Configuring for the ZXIO V1 Board</h3><div>Connecting the LCD module to the ZXIO is a straightforward process. The output pins O0 to O3 of ZXIO should be paired with DB4 to DB7 on the LCD board to send data from ZX81 to the module. In addition, the output line 6 of ZXIO must be linked to Register Select, while the output line 7 should be connected to the Enable Pin.</div><div><br /></div><div>The lines responsible for controlling the power to the LCD module and screen contrast are as follows: VSS is linked to the ground, VCC is linked to +5 volts, and VEE is connected to the ground through a variable resistor (across the +5v line). To adjust the screen brightness, connect the LED+ pin to +5 volts and the LED-pin to the ground through a 220 ohm resistor (resistor is optional as some of these Module clones have the required resistor built in).</div><div><br /></div></div><div class="separator" style="clear: both; text-align: left;"><br /></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6c9JzzT8WRHX6SBGEO26pMFGQZsyh0YPt1PnO5kKbpHELh00R_aWKR2VyDEMDwQE9HR1JPNkNL3iLVf2zuC72TNME-_cqLS-NucBEAbkufHzMRvkM8tDk1_wSbyTe3i0RNukYvaYBKAcAr3nEqWV5-gvg8FpdYw6d7Fg1yR-2If3f4uitWXiALAe_bg/s1175/lcd_v1.png" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="846" data-original-width="1175" height="460" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj6c9JzzT8WRHX6SBGEO26pMFGQZsyh0YPt1PnO5kKbpHELh00R_aWKR2VyDEMDwQE9HR1JPNkNL3iLVf2zuC72TNME-_cqLS-NucBEAbkufHzMRvkM8tDk1_wSbyTe3i0RNukYvaYBKAcAr3nEqWV5-gvg8FpdYw6d7Fg1yR-2If3f4uitWXiALAe_bg/w640-h460/lcd_v1.png" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">ZXIO V1 to LCD Module</td></tr></tbody></table>That's the hardware out of the way, the rest is all down to some BASIC programming on the ZX81 targeting the ZXIO and LCD display module.</div><div><br /><div class="separator" style="clear: both; text-align: left;"><div><div class="separator" style="clear: both;"><div><span style="font-size: large;"><b>HD44780 </b><b>LCD Commands</b></span><b><span style="font-size: small;"> </span>(Examples)</b></div><table bgcolor="#CDCDCD"><tbody><tr><th colspan="1" width="15%"><div style="text-align: left;">Code (HEX)</div></th><th colspan="1" width="15%"><div style="text-align: left;">Code (DEC)</div></th><th colspan="1" width="70%"><div style="text-align: left;">Command to LCD</div></th></tr><tr><td><b><i>0x01</i></b></td><td><b>1</b></td><td>Clear the display screen</td></tr><tr bgcolor="#EEEEEE"><td><b><i>0x02</i></b></td><td><b>2</b></td><td>Set to 4 Bit Mode</td></tr><tr><td><b><i>0x0e</i></b></td><td><b>14</b></td><td>Set Underline Cursor</td></tr></tbody></table></div></div></div>The below program connects the HD44780 to the ZX81 / ZXIO V1 at address 16507. It initializes the HD44780 by sending a sequence of control codes to set the display mode, enable the display, clear the display, and set the cursor to the home position. To send each byte, it needs to be split into 2 * 4 bits and sent consecutively. The Enable line must be brought high and then low to signal each 4 bit segment sent.</div><div><br /></div><div><div>Subsequently, the program transmits the message "HELLO FOUR BITS" to the HD44780 by encoding each character as its corresponding ASCII code. To achieve this, the ZX81 Characters should to be converted to their ASCII counterparts. As previously mentioned, each byte is then split into two 4-bit segments, with both the Enable and Register Select lines being set high. After transmitting each 4-bit segment, the Enable line is set low once again.</div></div><div><div></div></div><div><div class="separator" style="clear: both; text-align: center;"><br /></div></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhX12uFAD8Axa4SvjlMA4hdCYyu4OC1PlVo-y9fO1uJbctT6TH43hMjcxlaUiUEU7O_igrBvj6ycLmiT6whrVfUK-izoOSAbOxD4P6z76NbGMsjUzFxhX5KzuZnIdF9_UvITGVXrYUcjJBEzCmLyJykew_eyX0YP7b_blD5MZoekDYzXiMBJcZUhICSMQ/s1024/lcd-4bit.bmp" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="864" data-original-width="1024" height="540" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhX12uFAD8Axa4SvjlMA4hdCYyu4OC1PlVo-y9fO1uJbctT6TH43hMjcxlaUiUEU7O_igrBvj6ycLmiT6whrVfUK-izoOSAbOxD4P6z76NbGMsjUzFxhX5KzuZnIdF9_UvITGVXrYUcjJBEzCmLyJykew_eyX0YP7b_blD5MZoekDYzXiMBJcZUhICSMQ/w640-h540/lcd-4bit.bmp" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">ZX81 Code to drive LCD in 4bit Mode</td></tr></tbody></table><div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;">The program sends data to the LCD screen at a slow but satisfying speed. While this could be accelerated with code optimisation and pre-conversion of the ASCII text, I opted to maintain program similarity between the code directed at the V1 and V2 boards for a more effective side-by-side comparison (see next section).</div></div><div class="separator" style="clear: both; text-align: left;"><br /></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPpTyou_2O1X_fRd5P_WMCM3BhxCSnmuFgp72G9-0d1aT10CqTsx48yJaYo8XTJMvbkGuC0FiiAr0JqWb6UW6UQGiRNg68Z90OYiKxuuePlFts3GzBLTFX-eeA8j1xJy1XP11BE52bCHgICy8fJlwBWd2MQBIojdcsNoHiBSuRzsS41QVV7eO6Y2fM_Q/s2549/4bit_lcd.png" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="1320" data-original-width="2549" height="332" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPpTyou_2O1X_fRd5P_WMCM3BhxCSnmuFgp72G9-0d1aT10CqTsx48yJaYo8XTJMvbkGuC0FiiAr0JqWb6UW6UQGiRNg68Z90OYiKxuuePlFts3GzBLTFX-eeA8j1xJy1XP11BE52bCHgICy8fJlwBWd2MQBIojdcsNoHiBSuRzsS41QVV7eO6Y2fM_Q/w640-h332/4bit_lcd.png" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Output from ZXIO V1 4Bit LCD Program</td></tr></tbody></table><br /><h3 style="clear: both; text-align: left;">Configuring for the ZXIO V2 Board</h3><div class="separator" style="clear: both; text-align: left;"><div>Setting up the V2 interface involves a process similar to that of the V1 version, with the added advantage of utilising the entire 8-bit input lines available on the HD44780 controller board. On the ZXIO V2 board, Port A pins 0 to 7 (facilitated by the 8255A chip) are mapped to the Data pins on the LCD. While, the Register Select and Enable lines are mapped to Port B pins 6 and 7, respectively.</div></div><div><div class="separator" style="clear: both; text-align: center;"><br /></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEik68q2yrpYD6c1D6bWuMl-X1wqyvCrUcY5F6BOqRw2ZE9fqQdOyBkMX_FN7R7j40LRLSFMWptOECBguyLl7cG4q0-RFVps1d08c6UnbdT0QAbQf_Onyr6Bm-H4lf3X-OfYHhYevi34MziN9vr4MTy1nID_yf8IXoqHmKeg60nvPIw4h3KyHlo9aVVNQg/s1175/lcd_v2.png" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="846" data-original-width="1175" height="460" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEik68q2yrpYD6c1D6bWuMl-X1wqyvCrUcY5F6BOqRw2ZE9fqQdOyBkMX_FN7R7j40LRLSFMWptOECBguyLl7cG4q0-RFVps1d08c6UnbdT0QAbQf_Onyr6Bm-H4lf3X-OfYHhYevi34MziN9vr4MTy1nID_yf8IXoqHmKeg60nvPIw4h3KyHlo9aVVNQg/w640-h460/lcd_v2.png" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">ZXIO V2 to LCD Module</td></tr></tbody></table><br /></div><div>As we're using the full 8-bit input, the configuration commands we need to send to the LCD interface vary slightly as we no longer need to put the device into 4-bit mode. (In both cases we're only using a very small subset of the available command set, just enough to get things moving along.) </div><div><br /></div><div><br /></div><div><div><span style="font-size: large;"><b>HD44780 </b><b>LCD Commands</b></span><b><span style="font-size: small;"> </span>(Examples)</b></div><table bgcolor="#CDCDCD"><tbody><tr><th colspan="1" width="15%"><div style="text-align: left;">Code (HEX)</div></th><th colspan="1" width="15%"><div style="text-align: left;">Code (DEC)</div></th><th colspan="1" width="70%"><div style="text-align: left;">Command to LCD</div></th></tr><tr><td><b><i>0x01</i></b></td><td><b>1</b></td><td>Clear the display screen</td></tr><tr bgcolor="#EEEEEE"><td><b><i>0x0e</i></b></td><td><b>14</b></td><td>Set Underline Cursor</td></tr><tr><td><b><i>0x38</i></b></td><td><b>56</b></td><td>Set to 8 Bit Mode, Configure Display</td></tr></tbody></table></div><div>To transmit data to the LCD interface using the V2 version, we must first configure Port A and Port B on the 8255A IC for output mode. This can be done by POKEing the control register at address 49151 with a value of 128. Once complete, we can begin transmitting control codes. The Enable line is set high via Port B pin (address 49149), while the control codes are transmitted through Port A (address 49148). After each code, the Enable lines is brought low.</div><div><br /></div><div>As in the previous version, we first convert our message "HELLO EIGHT BITS" to ASCII before transmitting it to the LCD. We begin by setting the Enable and Register Select lines to high via Port B. Next, we send a character from our message string to Port A, and after transmission, set the Enable line back to low.</div><br /><div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLOPvv64dyGrXHJGJT2EfWCwjiD4RWi78Tytm20XYniZ0HutSBcNnbd7L4yyVIKTvsZIWYWJp3zqquGR8SphlS14Qz2vFD-bsexqunxO4IzVirvG2uW0q_Ng6HxT_M5mW3AwicPM4fG_laRhrVdNek8JJ929tuRug45bmhZaBgTL4YnYTI_1BQlv6sHg/s1024/lcd-8bit.bmp" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="576" data-original-width="1024" height="360" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgLOPvv64dyGrXHJGJT2EfWCwjiD4RWi78Tytm20XYniZ0HutSBcNnbd7L4yyVIKTvsZIWYWJp3zqquGR8SphlS14Qz2vFD-bsexqunxO4IzVirvG2uW0q_Ng6HxT_M5mW3AwicPM4fG_laRhrVdNek8JJ929tuRug45bmhZaBgTL4YnYTI_1BQlv6sHg/w640-h360/lcd-8bit.bmp" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">ZX81 Code to drive LCD in 8bit Mode</td></tr></tbody></table><br /></div><div>Using the the ZXIO V2 board, our "HELLO" message is send somewhat more speedily, though still managing a rather 80s sci-fi future computer message output speed (All very MU-TH-UR 6000: Look out Ripply!).<br /><br /></div><div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen="" class="BLOG_video_class" height="466" src="https://www.youtube.com/embed/Y1fRdCP5UWI" width="560" youtube-src-id="Y1fRdCP5UWI"></iframe></div><h3 style="text-align: left;">Conclusions Drawn??</h3><div><div>The discussion above only scratches the surface of the potential applications for both the V1 and V2 ZXIO boards. Despite its simplicity, the LCD test highlights the greater versatility of the V2 board in the long run. Nonetheless, this does not detract from the ease of use of the V1 board. With a simple address change to mend the issues outlined in previous blog posts, the V1 board is an ideal choice for a wide range of hardware experiments.</div><div><br /></div><div>That being said, the ZXIO V2 design offers more possibilities for exploration due to the presence of the 8255A PIO chip. Future blog posts in this IO series will delve deeper into these possibilities.</div></div><div><br /></div><div>Waiting for more in the IO series? Take a read of: <a href="https://www.zx81keyboardadventure.com/2023/02/zxio-interface-for-zx81-part-1.html">Part 1</a>, <a href="https://www.zx81keyboardadventure.com/2023/02/zxio-interface-for-zx81-part-2.html">Part 2</a>, <a href="https://www.zx81keyboardadventure.com/2023/03/zxio-interface-for-zx81-part-3.html">Part 3</a>, <a href="https://www.zx81keyboardadventure.com/2023/04/zxio-interface-for-zx81-part-4.html">Part 4</a>, <a href="https://www.zx81keyboardadventure.com/2023/05/zxio-interface-for-zx81-part-5.html">Part 5</a> and <a href="https://www.zx81keyboardadventure.com/2023/08/zxio-interface-for-zx81-part-6.html">Part 6.</a></div><div><div class="separator" style="clear: both; text-align: center;"><br /></div><br /><div><br /></div><div><br /></div><div><br /></div><br /></div>David Stephensonhttp://www.blogger.com/profile/11637474307612171656noreply@blogger.com0tag:blogger.com,1999:blog-255603189167868415.post-40000008982566266342023-04-16T00:12:00.008+10:002024-01-07T14:24:21.736+11:00ZXIO Interface for the ZX81: Part 4<p> </p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZ-3qj2bQzzgWOr5fbdtvdH-EIDbIOfuzOsbw9g1kPWpWnXhNCanX3LpaemI_wg0fDA0QQkbdesN6nRg46yqf9uSTbsAF6vvXTGCVPAmE04mqGIaleeTdBGPur8xwWliITT8t1uyJJbUm9nNgs2KtO57GwACcSOilz60fwB1z1RXJFWLjD8ceKwJ10vA/s3106/20230331_205134.jpg" style="margin-left: auto; margin-right: auto;"><img alt="ZX81 ZXIO V2 Input Output Card with LCD Shield" border="0" data-original-height="2014" data-original-width="3106" height="414" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZ-3qj2bQzzgWOr5fbdtvdH-EIDbIOfuzOsbw9g1kPWpWnXhNCanX3LpaemI_wg0fDA0QQkbdesN6nRg46yqf9uSTbsAF6vvXTGCVPAmE04mqGIaleeTdBGPur8xwWliITT8t1uyJJbUm9nNgs2KtO57GwACcSOilz60fwB1z1RXJFWLjD8ceKwJ10vA/w640-h414/20230331_205134.jpg" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">ZXIO V2 Card with LED Expansion Board</td></tr></tbody></table><p><span style="font-size: large;">Previously I built a simple Input / Output board for the ZX81, tested it, identified some self induced errors then hinted that it may be worth changing designs completely. Way back in <a href="https://www.zx81keyboardadventure.com/2023/02/zxio-interface-for-zx81-part-1.html">Part 1</a> I'd already come to the conclusion that I really shouldn't make this a simple project, so of course I went back and stared things again.</span></p><h3 style="text-align: left;">Why Change Now?</h3><p>Didn't the last design work and only really require some minor addressing changes? Yes, and that would be a perfectly fine end to the IO project. Still I wished to take this further and build a more capable board. Note that the overall aim of building a relatively simple interface is still a primary goal.</p><p><br /></p><p>The IO version One card has a minor limitation in that it can only support an 8-bit wide addressing, which may not be sufficient for more complex hardware that requires access to at least a partial 16-bit width address space to access control lines while still being able to send and receive 8 bits. There are several ways to address this issue, such as using 4-bit modes or using 7 bits for data and the remaining bit as a control line. However, the feasibility of these solutions depends on the specific interface requirements of the project.</p><p><br /></p><p>One possible solution is to double the IO options by adding an extra set of latch and buffer ICs. However, this would increase the complexity of building the board, including routing and address decoding. Other options could involve employing a "standard" IO IC.</p><p><br /></p><h3>The 8255A, the IO Chip of Choice (This Time)</h3><p>Three suitable IO ICs come to mind for our purposes: the Z80-PIO (Parallel Input/Output Interface), the 8255A-PPI (Programmable Peripheral Interface) and the W65C22N-VIA (Versatile Interface Adaptor). All three of these chips are period correct for the ZX81, in production and available of the shelf today (at least in 2023).</p><p><br /></p><p>For Version 2 of the IO board I selected the 8255A, as it's pretty well documented, and as a bonus it made an appearance in a ZX81 IO board designed by A. Daykin for Maplin's 'Project Book 04' from 1983. With some modifications to the Addressing and IO configurations to make it more suitable for experimentation, the Maplin board can be made pretty well perfect for our needs.</p><div><br /></div><div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEiam082GNXY5J5Zc4jqUG5kPT4QyZB3AiVq9UcpVBpaT6ZEH4yto49jJEs42mp7WhLl8muf_Z594KEpt1_QZj2TKE6Hm-7cIeKmL6GAuIUDZhXhe9d6mPdMpB5fw4D2gHusgSr16bRRyhp4UNVl3bJstmPBMD5YtDC0M84givAz5U5VXTltf3LfDE9tOQ" style="margin-left: auto; margin-right: auto;"><img alt="" data-original-height="1058" data-original-width="1350" height="502" src="https://blogger.googleusercontent.com/img/a/AVvXsEiam082GNXY5J5Zc4jqUG5kPT4QyZB3AiVq9UcpVBpaT6ZEH4yto49jJEs42mp7WhLl8muf_Z594KEpt1_QZj2TKE6Hm-7cIeKmL6GAuIUDZhXhe9d6mPdMpB5fw4D2gHusgSr16bRRyhp4UNVl3bJstmPBMD5YtDC0M84givAz5U5VXTltf3LfDE9tOQ=w640-h502" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Period Inspiration from Maplin Project Book 04 - 1983</td></tr></tbody></table></div><div style="text-align: left;">The 8255A IC is a chip that serves as a programmable peripheral interface, allowing for parallel input and output. It has three ports: Port A, Port B, and Port C. Each port can be configured as either an input or an output. Port C can be split into upper and lower blocks, each with the option to be programmed as an input or output. The IC also has a control register that is used to set the mode of operation for each port. With these features, the 8255 IC can replicate and even expand upon all the functions that the first version of the ZXIO board was capable of achieving. It can actually do fair bit more, but we may explore that latter on in this series of posts. </div><div style="text-align: left;"><br /></div><h3 style="text-align: left;">Maplin IN </h3><p>The Maplins design is appropriately simple, making it easy to connect the 8255A to the ZX81. Note that 4 contiguous address locations require mapping, this performed partly by the 8255A and then the supporting ICs. The 8255A chip has two address lines on pins 8 and 9, which are directly linked to the ZX81 address lines Al and AO. The 74 series ICs then handle the remaining address decoding, and enabling of the 8255A when pin 6 is set to logic level 0. All data lines from the ZX81 are directly connected to the 8255A, along with write and read signals. The reset line on the 8255A at pin 36 is tied to GND.</p><p><br /></p><p>The 16 IO pins of the 8255A that make up Ports A and C are directly connected to pin headers at the edge of the Maplin board for external device connection. However, the pins of Port B are linked to IC5 and IC6, which buffer the outputs from the 8255A. In conjunction with a set of 4.7k resistors, this setup offers protection against overload. The purpose of this configuration is to drive potentially higher voltage equipment from Port B. A side affect of the buffering is to limit Port B to output only.</p><p><br /></p><p>Each IO Port and a Control Port are Memory Address Decoded back to the ZX81, Specifically, Port A corresponds to memory address 16380, Port B corresponds to memory address 16381, Port C corresponds to memory address 16382, and the Control Port corresponds to memory address 16383. These addresses are located at the top of ZX81s 8 to 16k range where a copy of the ROM would normally be shadow mapped. Refer back to <a href="https://www.zx81keyboardadventure.com/2023/02/zxio-interface-for-zx81-part-2.html">Part 2</a> in this series for details on address ranges and suggested uses.</p><p><br /></p><p><i>** For additional details on the Maplin Board I'd recommend <a href="https://allanfaulds.weebly.com/zx81-input--output-board.html" target="_blank">Allan Faulds</a> blog page, where he builds up an original Maplin IO Board purchased in the 1980's. **</i></p><p><i><br /></i></p><h3>ZXIO V2 OUT</h3><p>Although there aren't many modifications needed to transform the Maplin into a ZXIO V2, there are a few adjustments I would like to implement to enhance the design's practicality for contemporary experimentation.</p><p><br /></p><p>The initial modification I made was to adjust the address mapping to span from 49148 to 49151. This will position the device at the upper end of the 40-48k memory segment, beyond the reach of numerous contemporary and historic memory expansion cards (not all, but many). </p><p><br /></p><p>I eliminated the buffering ICs from Port B, if buffering becomes necessary, we can always incorporate that back into external hardware. I also took the opportunity to ground output lines on Ports A to C via 4.7k resistors, this will prevent floating values on the lines when they're not connected to anything. Additionally the Reset line on the 8255A is now tied to the Z80 / ZX81's reset signal, inverted through spare NAND gates from the address decoding ICs.</p><p><br /></p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDCNcwV4IcSo6CQjeFmNwffMEl8hFgT4AFECfQEfatLc8GE3_qSL5uiNcT9msEK9kJKIpjp6tacBfj5ZLnqFmDju2j3mXyQppvqA9V-YQpmseWZsHKCIzePR1sjPUb8EGtcJ2OqiLnreK2PZpCGZfW8bUs290B9WZ_CnGYUv2kUpsKJEGs3eJoLi3rmg/s2412/zxio_V2_03_schem.png" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="2412" data-original-width="2085" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDCNcwV4IcSo6CQjeFmNwffMEl8hFgT4AFECfQEfatLc8GE3_qSL5uiNcT9msEK9kJKIpjp6tacBfj5ZLnqFmDju2j3mXyQppvqA9V-YQpmseWZsHKCIzePR1sjPUb8EGtcJ2OqiLnreK2PZpCGZfW8bUs290B9WZ_CnGYUv2kUpsKJEGs3eJoLi3rmg/w554-h640/zxio_V2_03_schem.png" width="554" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">ZXIO V2 Schematic.</td></tr></tbody></table><p></p><p>The last functional modification consists of two headers. The first one is an IDC header resembling the ZXIO version 1 board, which includes the IO Lines, Ports A to C, Ground, and +5 Volts. This facilitates the use of IDC cables to connect to external breadboards or built-up external devices. Additionally, I added a female header in parallel, allowing for direct connection to plug-in boards, like the LED "hat" shown in the photo at the top of this post.</p><p><br /></p><p></p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLuHUj3A_zDU34psmzXsUhxTwiRGJlh0BU_E-bzcCA-bRzCoBcC5yNCP1arFByCNdZMc-9FeTg1taui3H7oqrnc1b-QNxNGboUT5kbuuGOYBnf0cvI6EOcFSEpSS194ydvRGdCvMr8YSFq6DmnsBRagDZvmsJSn1hqgvlmIJkn7C9Bv5OXZo4DEqa1ug/s3222/20230415_224614.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="1558" data-original-width="3222" height="310" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiLuHUj3A_zDU34psmzXsUhxTwiRGJlh0BU_E-bzcCA-bRzCoBcC5yNCP1arFByCNdZMc-9FeTg1taui3H7oqrnc1b-QNxNGboUT5kbuuGOYBnf0cvI6EOcFSEpSS194ydvRGdCvMr8YSFq6DmnsBRagDZvmsJSn1hqgvlmIJkn7C9Bv5OXZo4DEqa1ug/w640-h310/20230415_224614.jpg" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">ZXIO V2 Test Board</td></tr></tbody></table><p></p><h3 style="text-align: left;">Next Post?</h3><div>This should mostly cover the essential hardware details of ZXIO V2. In my next blog entry, I plan to conduct a quick comparison between the old and new ZXIO boards. Although I am confident that V2 is a more versatile board, V1 remains a decent option for basic experimentation. Lets see, stay tuned for the next post.</div><div><br /></div><div>Until then see all the other entries for this project: <a href="https://www.zx81keyboardadventure.com/2023/02/zxio-interface-for-zx81-part-1.html">Part 1</a>, <a href="https://www.zx81keyboardadventure.com/2023/02/zxio-interface-for-zx81-part-2.html">Part 2</a>, <a href="https://www.zx81keyboardadventure.com/2023/03/zxio-interface-for-zx81-part-3.html">Part 3</a>, <a href="https://www.zx81keyboardadventure.com/2023/04/zxio-interface-for-zx81-part-4.html">Part 4</a>, <a href="https://www.zx81keyboardadventure.com/2023/05/zxio-interface-for-zx81-part-5.html">Part 5</a> and <a href="https://www.zx81keyboardadventure.com/2023/08/zxio-interface-for-zx81-part-6.html">Part 6.</a></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div>David Stephensonhttp://www.blogger.com/profile/11637474307612171656noreply@blogger.com0tag:blogger.com,1999:blog-255603189167868415.post-70106175439574836712023-03-03T17:57:00.011+11:002024-01-07T14:25:09.663+11:00ZXIO Interface for the ZX81: Part 3<p></p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPlLUGaMPH5kQK9deJQN1vcWCIPl-1l1OT3Z2MO63LLx4OuGJ-CEbMNNZYxEKgZ5LXazq2Cs2uhcYS3XlsfvsF8TrhVSU45vzsR_XQxviaR6LtN3-1QwjN8H8NDCw_65FjJ9FTcDcKHN5QC5kCtNHgGR7JLpcNFrxGS5AIYPpSi0XFlpuQ_wuUkeXDGA/s2248/20230220_124247.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="2248" data-original-width="2145" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgPlLUGaMPH5kQK9deJQN1vcWCIPl-1l1OT3Z2MO63LLx4OuGJ-CEbMNNZYxEKgZ5LXazq2Cs2uhcYS3XlsfvsF8TrhVSU45vzsR_XQxviaR6LtN3-1QwjN8H8NDCw_65FjJ9FTcDcKHN5QC5kCtNHgGR7JLpcNFrxGS5AIYPpSi0XFlpuQ_wuUkeXDGA/w610-h640/20230220_124247.jpg" width="610" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Testing ZXIO Boards with a Variety of ZX81 and Minstrel Hardware Options</td></tr></tbody></table><div><span style="font-size: large;">We're finally at the point where I go over the actual test ZXIO boards, test the addressing changes and learn why I mentioned in the first article that memory address 16507 is the "perfect location for an Output Board, and an interesting, possibly flawed location for an Input Board"</span></div><div><span style="font-size: large;"><br /></span></div><div><span><h3 style="text-align: left;">Boards as Envisaged?</h3><div>After some simple initial testing I had prototype ZXIO boards produced. The core board along with breadboard friendly breakout boards, these components are designed to connect via a 20 pin IDC cable for easy IO experimentation. This arrangement also made testing the boards a relatively simple process.</div><div><br /></div><div>While building the device I'd noticed I'd not connected the +9v power rail to the voltage rectifier, which needed fixing with some bodge wire. Somehow I'd left the line off on the schematic. I caught this issue out after noticing some odd voltage drops on the input / output lines. Interestingly the whole board was being powered by vampire voltages sourced from the ZX81's Address lines up until this point. </div><div><br /></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhh6tRuHIf92qjoQcehzv4U-2gSykRqTKI3wbgLsmsJrR3UurCHWeV0OQ7ALDrcfxxAV5VxEBxogzzUTsfqS1EcRLuiWy3eCPP950uDPEIx0ICdIPOPa-7mVWILdHyZUzAdv5xOpMAWd3Hfrw_-RDWHvu9iMCZwWqAK2GBeWJUPhzGA-8VcPubrBpUboA/s3969/20230225_113241.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="1922" data-original-width="3969" height="310" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhh6tRuHIf92qjoQcehzv4U-2gSykRqTKI3wbgLsmsJrR3UurCHWeV0OQ7ALDrcfxxAV5VxEBxogzzUTsfqS1EcRLuiWy3eCPP950uDPEIx0ICdIPOPa-7mVWILdHyZUzAdv5xOpMAWd3Hfrw_-RDWHvu9iMCZwWqAK2GBeWJUPhzGA-8VcPubrBpUboA/w640-h310/20230225_113241.jpg" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">ZXIO Test Board with Accessories</td></tr></tbody></table><div><br /></div><div>With power problems sorted, testing the Output lines was a simple matter of POKE-ing address 16507, data lines checked individually with their corresponding decimal value, 1,2,4,8,16,32,64 and 128. This test checked out fine. The next step, writing a up a 'traditional' counting application cycling for 0 to 255, POKE-ing the numbers and watching the LED's flash accordingly. A delightfully flash result was produced.</div><div><br /></div><div>Input testing was a not to dissimilar process, only in reverse. With the breakout PCB mounted on a breadboard, I tested each input with a 220 ohm resistor from +5v (included in the breakout pins) routed to each of the input data lines in turn. The ZX81 was set to PEEK at address 16507 and each of the lines read back correctly. All good so far.</div><div><br /></div><div>Last major test was to cycle values through the Output and Inputs at the same time. If everything was working as expected I should be getting different values in to what I was sending out. If I was POKE-ing 255 out and had the inputs setup for say 15, I should see 255 on the LED display (which is output only), but be getting a value of 15 when conducting a read / PEEK-ing at address 16507.</div><div><br /></div><div>This was also all good on my initial testing as conducted using a ZX Minstrel Issue 3 (Tynemouth Software's ZX81 Clone) with the its ZXpand attached. Then I moved the experiments over to a real ZX81 and things were not quite as rosy there.</div><div><br /></div><h3 style="text-align: left;">Tales of RAM Packs and Modern Expansions</h3><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi87EZ6rQv1EWG8KSps4DcCZrpGfHdnT_v-XgpBBijXHKFZbTshvVeYgEeLSBEO1oRObJakTViXy8sy519XWq3zQL_mWOoXSzmHxozs5Zf8UwSZDqsrwe7spwIDz6BOG8QfeVEUzUNolKrdt3bhMwZf-EmY3deA5TlK9Di8n--ICR-GdnW4K_GDjbwkKw/s3287/20230225_115228.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="2139" data-original-width="3287" height="416" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi87EZ6rQv1EWG8KSps4DcCZrpGfHdnT_v-XgpBBijXHKFZbTshvVeYgEeLSBEO1oRObJakTViXy8sy519XWq3zQL_mWOoXSzmHxozs5Zf8UwSZDqsrwe7spwIDz6BOG8QfeVEUzUNolKrdt3bhMwZf-EmY3deA5TlK9Di8n--ICR-GdnW4K_GDjbwkKw/w640-h416/20230225_115228.jpg" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">ZX81 and ZX Minstrel 3 Expansion Options</td></tr></tbody></table><br /><div>Over on a 'real' ZX81 with a period correct 16k RAM pack, attempting to write out and read in would produce an accumulation, for example if POKE-ing out 1 and setting up the input lines to be 2, you end up with a value of 3, Essentially the combination of bits. So what's going on, why the difference? In hindsight I really should have expected the results I'm getting from the ZX81, but to understand why we'll need to look at how memory packs work on the 81.</div><div><br /></div><div>To use external ZX81 RAM packs, the internal 1k RAM of the machine must be disabled first. This can be done by raising the RAMCS line on the expansion bus to +5v. Once a 16k expansion is added, the memory map will follow the layout as described in <a href="https://www.zx81keyboardadventure.com/2023/02/zxio-interface-for-zx81-part-2.html">Part 2</a>, with the additional 16k of memory appearing between addresses 16384 and 32767. l was expected when laying out the idea of the ZXIO and placing our memory mapping at address 16507 in an unused location in the system variable table. What I hadn't calculated for was the inability to disable the external RAM in a similar fashion.</div><div><br /></div></span></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhe9-10DRE4w2940KbeW2-M22msg0UAcRhwkuootFa-QS8jeSoA4n31fJXNPNmZH7GrXvG9yk5ps6y64jGzmblS6lp92MCSSZT-NukOGmfA98VYKKGhHicrG31J0iO_4BI4r7j97ORVPsAc9WGdE6b0f__-EHfLXH89sHyPV1dk87jOwKgGMuFqiCYfmg/s2955/ZX-DEV_14_schem.png" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="2607" data-original-width="2955" height="564" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhe9-10DRE4w2940KbeW2-M22msg0UAcRhwkuootFa-QS8jeSoA4n31fJXNPNmZH7GrXvG9yk5ps6y64jGzmblS6lp92MCSSZT-NukOGmfA98VYKKGhHicrG31J0iO_4BI4r7j97ORVPsAc9WGdE6b0f__-EHfLXH89sHyPV1dk87jOwKgGMuFqiCYfmg/w640-h564/ZX-DEV_14_schem.png" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">ZXIO Schematic for 16507 Addressing as Tested. (Note RAMCS mostly, wouldn't recommend building)</td></tr></tbody></table><div><br /></div><div>It appears that both the Minstrel and modern RAM expansions for the ZX81, such as the ZXpand+, are keeping a watch on the ROMCS and RAMCS lines for any other activity. The purpose of this is would be to enable the functioning of any devices that utilise memory mapping and that may be mapped to areas occupied by the additional 32k of memory provided by these modern expansions.</div><div><br /></div><div>Older period memory packs are not functioning in the same manor. Most if not all would be anticipating memory mapped devices to be located in the ROM mirror areas. To this end all my setting RAMCS to high is doing is affirming that yes the ZX81 should be using external RAM.</div><div><br /></div><div>This is precisely what I meant earlier when I suggesting that memory address 16507 would be the ideal location for an Output Board. It is an area of RAM that is otherwise not utilised, making it perfect for setting up external devices to read from. However, if old RAM pack hardware is connected and data is written back to this address, it is likely to result in confusion at the bit or byte level.</div><div><br /></div><div>So that's where we're at for the moment, we have an IO board that works perfectly with modern ZX81 hardware, not so much with period pieces. Next step I'm guessing is to move the memory mapping to somewhere the shadow ROMS are expected to be. Much like the original design from ETI Canada only a little more targeted like we tried out this time around. It might also be tempting to try out another design of IO board entirely, but all this is for the next set of posts in the series.</div><div><br /></div><div>Until then see all the other entries for this project: <a href="https://www.zx81keyboardadventure.com/2023/02/zxio-interface-for-zx81-part-1.html">Part 1</a>, <a href="https://www.zx81keyboardadventure.com/2023/02/zxio-interface-for-zx81-part-2.html">Part 2</a>, <a href="https://www.zx81keyboardadventure.com/2023/03/zxio-interface-for-zx81-part-3.html">Part 3</a>, <a href="https://www.zx81keyboardadventure.com/2023/04/zxio-interface-for-zx81-part-4.html">Part 4</a>, <a href="https://www.zx81keyboardadventure.com/2023/05/zxio-interface-for-zx81-part-5.html">Part 5</a> and <a href="https://www.zx81keyboardadventure.com/2023/08/zxio-interface-for-zx81-part-6.html">Part 6.</a></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div>David Stephensonhttp://www.blogger.com/profile/11637474307612171656noreply@blogger.com0tag:blogger.com,1999:blog-255603189167868415.post-77066997432808168042023-02-27T22:18:00.001+11:002023-03-02T21:06:42.720+11:00ZX81 Expansion Bus Cheat Sheet<p><span style="font-size: large;">While designing or reverse engineering external interfaces for the ZX81 it's usually advantageous to have some quick reference materials to hand. This is for me as much as anyone, may it be of some use to all.</span></p><h4 style="text-align: left;">ZX81 Expansion Bus Connector</h4><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZydD8xex-f3QFfb1wcLKMiuilF7GU1-clxt2ZunbCB17tdX8LuT-vVIuj3ZLMdh3sfJ1zfFpXKb9HxX53iJ5p9lwKfiuvf4FT-mcpDUnfGVa1vSnYzzG7sdVErda1X3o_UVKw02uPGOziJNN1CAunPZ56qPGRLoQq5u4NumyRXSe5oZPxNvt2e-D_zw/s1746/zx-bus.png" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="730" data-original-width="1746" height="268" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZydD8xex-f3QFfb1wcLKMiuilF7GU1-clxt2ZunbCB17tdX8LuT-vVIuj3ZLMdh3sfJ1zfFpXKb9HxX53iJ5p9lwKfiuvf4FT-mcpDUnfGVa1vSnYzzG7sdVErda1X3o_UVKw02uPGOziJNN1CAunPZ56qPGRLoQq5u4NumyRXSe5oZPxNvt2e-D_zw/w640-h268/zx-bus.png" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">ZX81 Expansion Bus Connector, Viewed from Rear of Machine</td></tr></tbody></table><h4 style="text-align: left;">Pinout Functions and Properties Summary Table</h4><div>A quick summary of the Signal and Functions of each Pin / Pad available on the Expansion BUS. This is not an extensive description, for that I'd highly recommend reading the 1983 Melbourne House book "The Ins And Outs Of The TIMEX TS 1000 & ZX81" by Don Thomasson, in particular chapter "<a href="https://archive.org/details/the-ins-and-outs-of-the-timex-ts-1000-zx-81/page/43/mode/2up" target="_blank">The External Interface</a>"</div><div><br /></div><table bgcolor="#CDCDCD"><tbody>
<tr bgcolor="#000000"><td colspan="4"><div style="color: white; text-align: center;"><b><i>TOP ROW</i></b></div></td></tr>
<tr><th colspan="1" width="15%"><div style="text-align: left;">Pin</div>
</th><th colspan="1" width="15%"><div style="text-align: left;">Lable</div>
</th><th colspan="1" width="35%"><div style="text-align: left;">Function</div>
</th><th colspan="1" width="35%"><div style="text-align: left;">Properties</div>
</th></tr>
<tr><td><b><i>1A</i></b></td><td><b>D7</b></td><td>Data Line</td><td>Active High - Bidirectional</td></tr>
<tr bgcolor="#EEEEEE"><td><b><i>2A</i></b></td><td><b>RAM C.S.</b></td><td>RAM Chip Select</td><td>Active Low - Pull high to disable onboard RAM</td></tr>
<tr><td><b><i>3A</i></b></td><td><b>Slot</b></td><td>Cutout / Keyed</td><td><br /></td></tr>
<tr bgcolor="#EEEEEE"><td><b><i>4A</i></b></td><td><b>D0</b></td><td>Data Line</td><td>Active High - Bidirectional </td></tr>
<tr><td><b><i>5A</i></b></td><td><b>D1</b></td><td>Data Line</td><td>Active High - Bidirectional</td></tr>
<tr bgcolor="#EEEEEE"><td><b><i>6A</i></b></td><td><b>D2</b></td><td>Data Line</td><td>Active High - Bidirectional</td></tr>
<tr><td><b><i>7A</i></b></td><td><b>D6</b></td><td>Data Line</td><td>Active High - Bidirectional</td></tr>
<tr bgcolor="#EEEEEE"><td><b><i>8A</i></b></td><td><b>D5</b></td><td>Data Line</td><td>Active High - Bidirectional</td></tr>
<tr><td><b><i>9A</i></b></td><td><b>D3</b></td><td>Data Line</td><td>Active High - Bidirectional</td></tr>
<tr bgcolor="#EEEEEE"><td><b><i>10A</i></b></td><td><b>D4</b></td><td>Data Line</td><td>Active High - Bidirectional</td></tr>
<tr><td><b><i>11A</i></b></td><td><b>INT</b></td><td>Interrupt </td><td>Active Low - Input</td></tr>
<tr bgcolor="#EEEEEE"><td><b><i>12A</i></b></td><td><b>NMI</b></td><td>Non-Maskable Interrupt </td><td>Active Low - Input</td></tr>
<tr><td><b><i>13A</i></b></td><td><b>HALT</b></td><td>Halt CPU Sate</td><td>Active Low - Output</td></tr>
<tr bgcolor="#EEEEEE"><td><b><i>14A</i></b></td><td><b>MREQ</b></td><td>Memory Request</td><td>Active Low - Output</td></tr>
<tr><td><b><i>15A</i></b></td><td><b>IORQ</b></td><td>Input/Output Request</td><td>Active Low - Output</td></tr>
<tr bgcolor="#EEEEEE"><td><b><i>16A</i></b></td><td><b>RD</b></td><td>Read Request</td><td>Active Low</td></tr>
<tr><td><b><i>17A</i></b></td><td><b>WR</b></td><td>Write Request</td><td>Active Low</td></tr>
<tr bgcolor="#EEEEEE"><td><b><i>18A</i></b></td><td><b>BUSAK</b></td><td>Bus Acknowledge</td><td>Active Low - Output</td></tr>
<tr><td><b><i>19A</i></b></td><td><b>WAIT</b></td><td>Force CPU Idle</td><td>Active Low - Input</td></tr>
<tr bgcolor="#EEEEEE"><td><b><i>20A</i></b></td><td><b>BUSRQ</b></td><td>Bus Acknowledge</td><td>Active Low - Input</td></tr>
<tr><td><b><i>21A</i></b></td><td><b>RESET</b></td><td>Reset / Restart</td><td>Active Low</td></tr>
<tr bgcolor="#EEEEEE"><td><b><i>22A</i></b></td><td><b>M1</b></td><td>Machine Cycle</td><td>Active Low - Output</td></tr>
<tr><td><b><i>23A</i></b></td><td><b>RFSH</b></td><td>Refresh (dynamic RAM)</td><td>Active Low - Output</td></tr>
<tr bgcolor="#000000"><td colspan="4"><div style="color: white; text-align: center;"><b><i>BOTTOM ROW</i></b></div></td></tr>
<tr><th colspan="1" width="15%"><div style="text-align: left;">Pin</div>
</th><th colspan="1" width="15%"><div style="text-align: left;">Lable</div>
</th><th colspan="1" width="35%"><div style="text-align: left;">Function</div>
</th><th colspan="1" width="35%"><div style="text-align: left;">Properties</div>
</th></tr>
<tr bgcolor="#EEEEEE"><td><b><i>1B</i></b></td><td><b>+5v</b></td><td>+5 Volts Regulated</td><td>Internal</td></tr><tr><td><b><i>2B</i></b></td><td><b>+9v</b></td><td>+9 Volts Un-Regulated</td><td>External Supply Voltage </td></tr><tr bgcolor="#EEEEEE"><td><b><i>3B</i></b></td><td><b>Slot</b></td><td>Cutout / Keyed</td><td><br /></td></tr>
<tr><td><b><i>4B</i></b></td><td><b>GND</b></td><td>Ground 0 Volts</td><td>Shared Ground </td></tr>
<tr bgcolor="#EEEEEE"><td><b><i>5B</i></b></td><td><b>GND</b></td><td>Ground 0 Volts</td><td>Shared Ground </td></tr>
<tr><td><b><i>6B</i></b></td><td><b>Ø</b></td><td>Clock 3.25 Mhz</td><td>Active Low - Output</td></tr>
<tr bgcolor="#EEEEEE"><td><b><i>7B</i></b></td><td><b>A0</b></td><td>Address Line</td><td>Active High - Output</td></tr>
<tr><td><b><i>8B</i></b></td><td><b>A1</b></td><td>Address Line</td><td>Active High - Output</td></tr>
<tr bgcolor="#EEEEEE"><td><b><i>9B</i></b></td><td><b>A2</b></td><td>Address Line</td><td>Active High - Output</td></tr>
<tr><td><b><i>10B</i></b></td><td><b>A3</b></td><td>Address Line</td><td>Active High - Output</td></tr>
<tr bgcolor="#EEEEEE"><td><b><i>11B</i></b></td><td><b>A15</b></td><td>Address Line</td><td>Active High - Output</td></tr>
<tr><td><b><i>12B</i></b></td><td><b>A14</b></td><td>Address Line</td><td>Active High - Output</td></tr>
<tr bgcolor="#EEEEEE"><td><b><i>13B</i></b></td><td><b>A13</b></td><td>Address Line</td><td>Active High - Output</td></tr>
<tr><td><b><i>14B</i></b></td><td><b>A12</b></td><td>Address Line</td><td>Active High - Output</td></tr>
<tr bgcolor="#EEEEEE"><td><b><i>15B</i></b></td><td><b>A11</b></td><td>Address Line</td><td>Active High - Output</td></tr>
<tr><td><b><i>16B</i></b></td><td><b>A10</b></td><td>Address Line</td><td>Active High - Output</td></tr>
<tr bgcolor="#EEEEEE"><td><b><i>17B</i></b></td><td><b>A9</b></td><td>Address Line</td><td>Active High - Output</td></tr>
<tr><td><b><i>18B</i></b></td><td><b>A8</b></td><td>Address Line</td><td>Active High - Output</td></tr>
<tr bgcolor="#EEEEEE"><td><b><i>19B</i></b></td><td><b>A7</b></td><td>Address Line</td><td>Active High - Output</td></tr>
<tr><td><b><i>20B</i></b></td><td><b>A6</b></td><td>Address Line</td><td>Active High - Output</td></tr>
<tr bgcolor="#EEEEEE"><td><b><i>21B</i></b></td><td><b>A5</b></td><td>Address Line</td><td>Active High - Output</td></tr>
<tr><td><b><i>22B</i></b></td><td><b>A4</b></td><td>Address Line</td><td>Active High - Output</td></tr>
<tr bgcolor="#EEEEEE"><td><b><i>23B</i></b></td><td><b>ROM C.S.</b></td><td>ROM Chip Select</td><td>Active Low - Pull high to disable ROM mirrors</td></tr>
</tbody></table>
<p></p><p><br /></p><p><br /></p>David Stephensonhttp://www.blogger.com/profile/11637474307612171656noreply@blogger.com0tag:blogger.com,1999:blog-255603189167868415.post-79051113614462496332023-02-19T12:41:00.020+11:002024-01-07T14:25:30.735+11:00ZXIO Interface for the ZX81: Part 2<p> </p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0ZCcm8bsBO_ZgvzemkaMt9xjABS-WzthHtiimdoFa60a-wOawyjGRcDZHhdvTTqNBnlFezy6NNIw7tYZahvHmDpKZlF0qxGhrnkfIpP_sugFvrmEcsTZE9evzD6T-FfyUDLDRORF6Gm4RzC60_zrvmyikWutWVaMptsbllIf1_HLkQfgu4-FetbMbyg/s3698/20230217_163327.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1182" data-original-width="3698" height="204" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0ZCcm8bsBO_ZgvzemkaMt9xjABS-WzthHtiimdoFa60a-wOawyjGRcDZHhdvTTqNBnlFezy6NNIw7tYZahvHmDpKZlF0qxGhrnkfIpP_sugFvrmEcsTZE9evzD6T-FfyUDLDRORF6Gm4RzC60_zrvmyikWutWVaMptsbllIf1_HLkQfgu4-FetbMbyg/w640-h204/20230217_163327.jpg" width="640" /></a></div><p style="text-align: left;"><span style="font-weight: 400;"><span style="font-size: large;"><br /></span></span></p><p style="text-align: left;"><span style="font-weight: 400;"><span style="font-size: large;">Last post I mentioned that the ZXIO add-on is memory mapped to location 16507. So this time I go over why 16507 and dig into Memory Mapping at little.</span></span></p><h3 style="text-align: left;">Let's Talk about Memory Mapping</h3><div>The main problem with mapping an IO device to a memory location is that it can remove that location from the ZX81's physical memory. Meaning that you can potentially poke black holes right into a location crucial for executing your applications. Not so good but avoidable.</div><div><br /></div><div>To understand where to locate a memory mapped device let's first cover the basics: The first 8k is always devoted to ROM, the second 8k is by default is a shadow copy of ROM. This is then followed by a block of RAM either a 1k block followed subsequently by 16 shadow 1k copies of the first on a stock machine; or on a 16k expanded ZX81, an entire 16k block. In both a 1k and 16k machines, RAM addressing tops out at address 32767. Then we find 2 shadow copies of ROM taking up a 16k slot and finally shadow copies of RAM identical to those located between addresses 16384 and 32767.</div><div><br /></div><p></p>
<table cellpadding="4" cellspacing="0" style="background: transparent; break-before: page; page-break-before: always;">
<colgroup><col width="31*"></col>
<col width="41*"></col>
<col width="41*"></col>
<col width="72*"></col>
<col width="72*"></col>
</colgroup><tbody>
<tr bgcolor="#ffffff" style="background: rgb(255, 255, 255);">
<td bgcolor="#ffffff" colspan="5" style="border-bottom: none; border-left: 1px solid rgb(169, 169, 169); border-right: 1px solid rgb(169, 169, 169); border-top: 1px solid rgb(169, 169, 169); padding-bottom: 0cm; padding-left: 0.2cm; padding-right: 0.2cm; padding-top: 0.1cm; padding: 0.1cm 0.2cm 0cm;" width="100%"><p align="center">
<font color="#ffffff"><b><font color="#000000" size="2">ZX81 Memory Map in
Standard 16k and an Example 32k Configuration</font></b></font></p>
</td>
</tr>
<tr style="background: transparent;">
<td bgcolor="#f22b4f" style="border-bottom: 1px solid rgb(255, 255, 255); border-left: 1px solid rgb(255, 255, 255); border-right: none; border-top: none; padding-bottom: 0.1cm; padding-left: 0.2cm; padding-right: 0cm; padding-top: 0cm; padding: 0cm 0cm 0.1cm 0.2cm;" width="12%"><p align="center">
<font color="#ffffff"><b>Block</b></font></p>
</td>
<td bgcolor="#f22b4f" style="border-bottom: 1px solid rgb(255, 255, 255); border-left: 1px solid rgb(255, 255, 255); border-right: none; border-top: none; padding-bottom: 0.1cm; padding-left: 0.2cm; padding-right: 0cm; padding-top: 0cm; padding: 0cm 0cm 0.1cm 0.2cm;" width="16%"><p align="center">
<font color="#ffffff"><b>Add </b></font><font color="#ffffff"><b>Dec</b></font></p>
</td>
<td bgcolor="#f22b4f" style="border-bottom: 1px solid rgb(255, 255, 255); border-left: 1px solid rgb(255, 255, 255); border-right: none; border-top: none; padding-bottom: 0.1cm; padding-left: 0.2cm; padding-right: 0cm; padding-top: 0cm; padding: 0cm 0cm 0.1cm 0.2cm;" width="16%"><p align="center">
<font color="#ffffff"><b>Add Hex</b></font></p>
</td>
<td bgcolor="#f22b4f" style="border-bottom: 1px solid rgb(255, 255, 255); border-left: 1px solid rgb(255, 255, 255); border-right: none; border-top: none; padding-bottom: 0.1cm; padding-left: 0.2cm; padding-right: 0cm; padding-top: 0cm; padding: 0cm 0cm 0.1cm 0.2cm;" width="28%"><p align="center">
<font color="#ffffff"><b>16K RAM Map</b></font></p>
</td>
<td bgcolor="#f22b4f" style="border-bottom: 1px solid rgb(255, 255, 255); border-left: 1px solid rgb(255, 255, 255); border-right: 1px solid rgb(255, 255, 255); border-top: none; padding-bottom: 0.1cm; padding-left: 0.2cm; padding-right: 0.2cm; padding-top: 0cm; padding: 0cm 0.2cm 0.1cm;" width="28%"><p align="center">
<font color="#ffffff"><b>32K ZXpand <span style="font-size: xx-small;">(Low Map)</span></b></font></p>
</td>
</tr>
</tbody>
<tbody>
<tr style="background: transparent;">
<td style="border-bottom: 1px solid rgb(169, 169, 169); border-left: 1px solid rgb(169, 169, 169); border-right: none; border-top: none; padding-bottom: 0.1cm; padding-left: 0.2cm; padding-right: 0cm; padding-top: 0cm; padding: 0cm 0cm 0.1cm 0.2cm;" width="12%"><p align="center">
<font face="courier" size="2">0 - 8k</font></p>
</td>
<td style="border-bottom: 1px solid rgb(169, 169, 169); border-left: 1px solid rgb(169, 169, 169); border-right: none; border-top: none; padding-bottom: 0.1cm; padding-left: 0.2cm; padding-right: 0cm; padding-top: 0cm; padding: 0cm 0cm 0.1cm 0.2cm;" width="16%"><p align="center">
<font face="courier" size="2">00000-08191</font></p>
</td>
<td style="border-bottom: 1px solid rgb(169, 169, 169); border-left: 1px solid rgb(169, 169, 169); border-right: none; border-top: none; padding-bottom: 0.1cm; padding-left: 0.2cm; padding-right: 0cm; padding-top: 0cm; padding: 0cm 0cm 0.1cm 0.2cm;" width="16%"><p align="center">
<font face="courier" size="2">0000-1FFF</font></p>
</td>
<td style="border-bottom: 1px solid rgb(169, 169, 169); border-left: 1px solid rgb(169, 169, 169); border-right: none; border-top: none; padding-bottom: 0.1cm; padding-left: 0.2cm; padding-right: 0cm; padding-top: 0cm; padding: 0cm 0cm 0.1cm 0.2cm;" width="28%"><p align="center">
<font face="courier" size="2"><b>ROM</b></font></p>
</td>
<td style="border-bottom: 1px solid rgb(169, 169, 169); border-left: 1px solid rgb(169, 169, 169); border-right: 1px solid rgb(169, 169, 169); border-top: none; padding-bottom: 0.1cm; padding-left: 0.2cm; padding-right: 0.2cm; padding-top: 0cm; padding: 0cm 0.2cm 0.1cm;" width="28%"><p align="center">
<font face="courier" size="2"><b>ROM</b></font></p>
</td>
</tr>
</tbody>
<tbody>
<tr style="background: transparent;">
<td style="border-bottom: 1px solid rgb(169, 169, 169); border-left: 1px solid rgb(169, 169, 169); border-right: none; border-top: none; padding-bottom: 0.1cm; padding-left: 0.2cm; padding-right: 0cm; padding-top: 0cm; padding: 0cm 0cm 0.1cm 0.2cm;" width="12%"><p align="center">
<font face="courier" size="2">8 - 16k</font></p>
</td>
<td style="border-bottom: 1px solid rgb(169, 169, 169); border-left: 1px solid rgb(169, 169, 169); border-right: none; border-top: none; padding-bottom: 0.1cm; padding-left: 0.2cm; padding-right: 0cm; padding-top: 0cm; padding: 0cm 0cm 0.1cm 0.2cm;" width="16%"><p align="center">
<font face="courier" size="2">08192-16383</font></p>
</td>
<td style="border-bottom: 1px solid rgb(169, 169, 169); border-left: 1px solid rgb(169, 169, 169); border-right: none; border-top: none; padding-bottom: 0.1cm; padding-left: 0.2cm; padding-right: 0cm; padding-top: 0cm; padding: 0cm 0cm 0.1cm 0.2cm;" width="16%"><p align="center">
<font face="courier" size="2">2000-3FFF</font></p>
</td>
<td style="border-bottom: 1px solid rgb(169, 169, 169); border-left: 1px solid rgb(169, 169, 169); border-right: none; border-top: none; padding-bottom: 0.1cm; padding-left: 0.2cm; padding-right: 0cm; padding-top: 0cm; padding: 0cm 0cm 0.1cm 0.2cm;" width="28%"><p align="center">
<font face="courier" size="2"><b>ROM</b> </font><font face="courier" size="1">(Copy 0000-08191)</font></p>
</td>
<td style="border-bottom: 1px solid rgb(169, 169, 169); border-left: 1px solid rgb(169, 169, 169); border-right: 1px solid rgb(169, 169, 169); border-top: none; padding-bottom: 0.1cm; padding-left: 0.2cm; padding-right: 0.2cm; padding-top: 0cm; padding: 0cm 0.2cm 0.1cm;" width="28%"><p align="center">
<font color="#f22b4f"><font face="courier" size="2"><b>RAM</b></font></font></p>
</td>
</tr>
</tbody>
<tbody>
<tr style="background: transparent;">
<td style="border-bottom: 1px solid rgb(169, 169, 169); border-left: 1px solid rgb(169, 169, 169); border-right: none; border-top: none; padding-bottom: 0.1cm; padding-left: 0.2cm; padding-right: 0cm; padding-top: 0cm; padding: 0cm 0cm 0.1cm 0.2cm;" width="12%"><p align="center">
<font face="courier" size="2">16 - 24k</font></p>
</td>
<td style="border-bottom: 1px solid rgb(169, 169, 169); border-left: 1px solid rgb(169, 169, 169); border-right: none; border-top: none; padding-bottom: 0.1cm; padding-left: 0.2cm; padding-right: 0cm; padding-top: 0cm; padding: 0cm 0cm 0.1cm 0.2cm;" width="16%"><p align="center">
<font face="courier" size="2">16384-20479</font></p>
</td>
<td style="border-bottom: 1px solid rgb(169, 169, 169); border-left: 1px solid rgb(169, 169, 169); border-right: none; border-top: none; padding-bottom: 0.1cm; padding-left: 0.2cm; padding-right: 0cm; padding-top: 0cm; padding: 0cm 0cm 0.1cm 0.2cm;" width="16%"><p align="center">
<font face="courier" size="2">4000-4FFF</font></p>
</td>
<td style="border-bottom: 1px solid rgb(169, 169, 169); border-left: 1px solid rgb(169, 169, 169); border-right: none; border-top: none; padding-bottom: 0.1cm; padding-left: 0.2cm; padding-right: 0cm; padding-top: 0cm; padding: 0cm 0cm 0.1cm 0.2cm;" width="28%"><p align="center">
<font color="#f22b4f"><font face="courier" size="2"><b>RAM</b></font></font></p>
</td>
<td style="border-bottom: 1px solid rgb(169, 169, 169); border-left: 1px solid rgb(169, 169, 169); border-right: 1px solid rgb(169, 169, 169); border-top: none; padding-bottom: 0.1cm; padding-left: 0.2cm; padding-right: 0.2cm; padding-top: 0cm; padding: 0cm 0.2cm 0.1cm;" width="28%"><p align="center">
<font color="#f22b4f"><font face="courier" size="2"><b>RAM</b></font></font></p>
</td>
</tr>
</tbody>
<tbody>
<tr style="background: transparent;">
<td style="border-bottom: 1px solid rgb(169, 169, 169); border-left: 1px solid rgb(169, 169, 169); border-right: none; border-top: none; padding-bottom: 0.1cm; padding-left: 0.2cm; padding-right: 0cm; padding-top: 0cm; padding: 0cm 0cm 0.1cm 0.2cm;" width="12%"><p align="center">
<font face="courier" size="2">24- 32k</font></p>
</td>
<td style="border-bottom: 1px solid rgb(169, 169, 169); border-left: 1px solid rgb(169, 169, 169); border-right: none; border-top: none; padding-bottom: 0.1cm; padding-left: 0.2cm; padding-right: 0cm; padding-top: 0cm; padding: 0cm 0cm 0.1cm 0.2cm;" width="16%"><p align="center">
<font face="courier" size="2">20480-32767</font></p>
</td>
<td style="border-bottom: 1px solid rgb(169, 169, 169); border-left: 1px solid rgb(169, 169, 169); border-right: none; border-top: none; padding-bottom: 0.1cm; padding-left: 0.2cm; padding-right: 0cm; padding-top: 0cm; padding: 0cm 0cm 0.1cm 0.2cm;" width="16%"><p align="center">
<font face="courier" size="2">6000-7FFF</font></p>
</td>
<td style="border-bottom: 1px solid rgb(169, 169, 169); border-left: 1px solid rgb(169, 169, 169); border-right: none; border-top: none; padding-bottom: 0.1cm; padding-left: 0.2cm; padding-right: 0cm; padding-top: 0cm; padding: 0cm 0cm 0.1cm 0.2cm;" width="28%"><p align="center">
<font color="#f22b4f"><font face="courier" size="2"><b>RAM</b></font></font></p>
</td>
<td style="border-bottom: 1px solid rgb(169, 169, 169); border-left: 1px solid rgb(169, 169, 169); border-right: 1px solid rgb(169, 169, 169); border-top: none; padding-bottom: 0.1cm; padding-left: 0.2cm; padding-right: 0.2cm; padding-top: 0cm; padding: 0cm 0.2cm 0.1cm;" width="28%"><p align="center">
<font color="#f22b4f"><font face="courier" size="2"><b>RAM</b></font></font></p>
</td>
</tr>
</tbody>
<tbody>
<tr style="background: transparent;">
<td style="border-bottom: 1px solid rgb(169, 169, 169); border-left: 1px solid rgb(169, 169, 169); border-right: none; border-top: none; padding-bottom: 0.1cm; padding-left: 0.2cm; padding-right: 0cm; padding-top: 0cm; padding: 0cm 0cm 0.1cm 0.2cm;" width="12%"><p align="center">
<font face="courier" size="2">32 - 40k</font></p>
</td>
<td style="border-bottom: 1px solid rgb(169, 169, 169); border-left: 1px solid rgb(169, 169, 169); border-right: none; border-top: none; padding-bottom: 0.1cm; padding-left: 0.2cm; padding-right: 0cm; padding-top: 0cm; padding: 0cm 0cm 0.1cm 0.2cm;" width="16%"><p align="center">
<font face="courier" size="2">32768-40959</font></p>
</td>
<td style="border-bottom: 1px solid rgb(169, 169, 169); border-left: 1px solid rgb(169, 169, 169); border-right: none; border-top: none; padding-bottom: 0.1cm; padding-left: 0.2cm; padding-right: 0cm; padding-top: 0cm; padding: 0cm 0cm 0.1cm 0.2cm;" width="16%"><p align="center">
<font face="courier" size="2">8000-9FFF</font></p>
</td>
<td style="border-bottom: 1px solid rgb(169, 169, 169); border-left: 1px solid rgb(169, 169, 169); border-right: none; border-top: none; padding-bottom: 0.1cm; padding-left: 0.2cm; padding-right: 0cm; padding-top: 0cm; padding: 0cm 0cm 0.1cm 0.2cm;" width="28%"><p align="center"><b style="font-family: courier; font-size: small;">ROM</b><span style="font-family: courier;"><span style="font-size: x-small;"> </span><span style="font-size: xx-small;">(Copy 0000-08191)</span></span></p>
</td>
<td style="border-bottom: 1px solid rgb(169, 169, 169); border-left: 1px solid rgb(169, 169, 169); border-right: 1px solid rgb(169, 169, 169); border-top: none; padding-bottom: 0.1cm; padding-left: 0.2cm; padding-right: 0.2cm; padding-top: 0cm; padding: 0cm 0.2cm 0.1cm;" width="28%"><p align="center">
<font color="#f22b4f"><font face="courier" size="2"><b>RAM</b></font></font></p>
</td>
</tr>
</tbody>
<tbody>
<tr style="background: transparent;">
<td style="border-bottom: 1px solid rgb(169, 169, 169); border-left: 1px solid rgb(169, 169, 169); border-right: none; border-top: none; padding-bottom: 0.1cm; padding-left: 0.2cm; padding-right: 0cm; padding-top: 0cm; padding: 0cm 0cm 0.1cm 0.2cm;" width="12%"><p align="center">
<font face="courier" size="2">40 - 48k</font></p>
</td>
<td style="border-bottom: 1px solid rgb(169, 169, 169); border-left: 1px solid rgb(169, 169, 169); border-right: none; border-top: none; padding-bottom: 0.1cm; padding-left: 0.2cm; padding-right: 0cm; padding-top: 0cm; padding: 0cm 0cm 0.1cm 0.2cm;" width="16%"><p align="center">
<font face="courier" size="2">40960-49151</font></p>
</td>
<td style="border-bottom: 1px solid rgb(169, 169, 169); border-left: 1px solid rgb(169, 169, 169); border-right: none; border-top: none; padding-bottom: 0.1cm; padding-left: 0.2cm; padding-right: 0cm; padding-top: 0cm; padding: 0cm 0cm 0.1cm 0.2cm;" width="16%"><p align="center">
<font face="courier" size="2">A000-BFFF</font></p>
</td>
<td style="border-bottom: 1px solid rgb(169, 169, 169); border-left: 1px solid rgb(169, 169, 169); border-right: none; border-top: none; padding-bottom: 0.1cm; padding-left: 0.2cm; padding-right: 0cm; padding-top: 0cm; padding: 0cm 0cm 0.1cm 0.2cm;" width="28%"><p align="center"><b style="font-family: courier; font-size: small;">ROM</b><span style="font-family: courier;"><span style="font-size: x-small;"> </span><span style="font-size: xx-small;">(Copy 0000-08191)</span></span></p>
</td>
<td style="border-bottom: 1px solid rgb(169, 169, 169); border-left: 1px solid rgb(169, 169, 169); border-right: 1px solid rgb(169, 169, 169); border-top: none; padding-bottom: 0.1cm; padding-left: 0.2cm; padding-right: 0.2cm; padding-top: 0cm; padding: 0cm 0.2cm 0.1cm;" width="28%"><p align="center"><b style="font-family: courier; font-size: small;">ROM</b><span style="font-family: courier;"><span style="font-size: x-small;"> </span><span style="font-size: xx-small;">(Copy 0000-08191)</span></span></p>
</td>
</tr>
</tbody>
<tbody>
<tr style="background: transparent;">
<td style="border-bottom: 1px solid rgb(169, 169, 169); border-left: 1px solid rgb(169, 169, 169); border-right: none; border-top: none; padding-bottom: 0.1cm; padding-left: 0.2cm; padding-right: 0cm; padding-top: 0cm; padding: 0cm 0cm 0.1cm 0.2cm;" width="12%"><p align="center">
<font face="courier" size="2">48 - 56k</font></p>
</td>
<td style="border-bottom: 1px solid rgb(169, 169, 169); border-left: 1px solid rgb(169, 169, 169); border-right: none; border-top: none; padding-bottom: 0.1cm; padding-left: 0.2cm; padding-right: 0cm; padding-top: 0cm; padding: 0cm 0cm 0.1cm 0.2cm;" width="16%"><p align="center">
<font face="courier" size="2">49152-57343</font></p>
</td>
<td style="border-bottom: 1px solid rgb(169, 169, 169); border-left: 1px solid rgb(169, 169, 169); border-right: none; border-top: none; padding-bottom: 0.1cm; padding-left: 0.2cm; padding-right: 0cm; padding-top: 0cm; padding: 0cm 0cm 0.1cm 0.2cm;" width="16%"><p align="center">
<font face="courier" size="2">C000-DFFF</font></p>
</td>
<td style="border-bottom: 1px solid rgb(169, 169, 169); border-left: 1px solid rgb(169, 169, 169); border-right: none; border-top: none; padding-bottom: 0.1cm; padding-left: 0.2cm; padding-right: 0cm; padding-top: 0cm; padding: 0cm 0cm 0.1cm 0.2cm;" width="28%"><p align="center">
<font face="courier" size="2"><font color="#f22b4f"><b>RAM</b></font>
</font><span style="font-size: xx-small;"><font face="courier">(</font><font face="courier">Copy 4000-4FFF</font><font face="courier">)</font></span></p>
</td>
<td style="border-bottom: 1px solid rgb(169, 169, 169); border-left: 1px solid rgb(169, 169, 169); border-right: 1px solid rgb(169, 169, 169); border-top: none; padding-bottom: 0.1cm; padding-left: 0.2cm; padding-right: 0.2cm; padding-top: 0cm; padding: 0cm 0.2cm 0.1cm;" width="28%"><p align="center">
<font face="courier" size="2"><font color="#f22b4f"><b>RAM</b></font>
</font><span style="font-size: xx-small;"><font face="courier">(</font><font face="courier">During M1</font><font face="courier">)</font></span></p>
</td>
</tr>
</tbody>
<tbody>
<tr style="background: transparent;">
<td style="border-bottom: 1px solid rgb(169, 169, 169); border-left: 1px solid rgb(169, 169, 169); border-right: none; border-top: none; padding-bottom: 0.1cm; padding-left: 0.2cm; padding-right: 0cm; padding-top: 0cm; padding: 0cm 0cm 0.1cm 0.2cm;" width="12%"><p align="center">
<font face="courier" size="2">56 - 64k</font></p>
</td>
<td style="border-bottom: 1px solid rgb(169, 169, 169); border-left: 1px solid rgb(169, 169, 169); border-right: none; border-top: none; padding-bottom: 0.1cm; padding-left: 0.2cm; padding-right: 0cm; padding-top: 0cm; padding: 0cm 0cm 0.1cm 0.2cm;" width="16%"><p align="center">
<font face="courier" size="2">57344-65535</font></p>
</td>
<td style="border-bottom: 1px solid rgb(169, 169, 169); border-left: 1px solid rgb(169, 169, 169); border-right: none; border-top: none; padding-bottom: 0.1cm; padding-left: 0.2cm; padding-right: 0cm; padding-top: 0cm; padding: 0cm 0cm 0.1cm 0.2cm;" width="16%"><p align="center">
<font face="courier" size="2">E000-FFFF</font></p>
</td>
<td style="border-bottom: 1px solid rgb(169, 169, 169); border-left: 1px solid rgb(169, 169, 169); border-right: none; border-top: none; padding-bottom: 0.1cm; padding-left: 0.2cm; padding-right: 0cm; padding-top: 0cm; padding: 0cm 0cm 0.1cm 0.2cm;" width="28%"><p align="center">
<font face="courier" size="2"><font color="#f22b4f"><b>RAM</b></font>
</font><span style="font-size: xx-small;"><font face="courier">(</font><font face="courier">Copy 6000-7FFF</font><font face="courier">)</font></span></p>
</td>
<td style="border-bottom: 1px solid rgb(169, 169, 169); border-left: 1px solid rgb(169, 169, 169); border-right: 1px solid rgb(169, 169, 169); border-top: none; padding-bottom: 0.1cm; padding-left: 0.2cm; padding-right: 0.2cm; padding-top: 0cm; padding: 0cm 0.2cm 0.1cm;" width="28%"><p align="center">
<font face="courier" size="2"><font color="#f22b4f"><b>RAM</b></font>
</font><span style="font-size: xx-small;"><font face="courier">(</font><font face="courier">During M1</font><font face="courier">)</font></span></p>
</td>
</tr>
</tbody>
</table>
<div><br /></div><div>That's the basic 1k to 16k out of the way. If we have more memory the map changes. Each of the shadow copies of ROM can be switched out to accommodate extra RAM in 8k blocks (I'll post-fix that statement with normally). For example a 32k machine might switch out the first and second copies of the ROM located at 2000 to 3FFF and 8000 and 9FFF. This would give the ZX81 32k of contiguous RAM to play with. However it's worth noting that BASIC programs can only be located within a 16k area between 16384 and 32767, exactly the same 16k area as in the original memory map. That's not to say that the extra RAM is inaccessible to BASIC, you can PEEK and POKE the entire memory configuration. This ability is fortunate as memory mapping additional hardware requires this same functionality.</div><div><br /></div><div><h3>Memory Mapping Hardware Devices (Somewhere)</h3></div><div style="text-align: left;">Much like swapping in RAM, add-ons can assume the memory location designated for shadow ROM, additionally we can claim areas of RAM<span style="text-align: center;">. All well a good but where would we want to locate our </span>devices<span style="text-align: center;"> in the memory map. </span><span style="text-align: center;">This of course is not a new discussion, </span>Nick Lambert of Quicksilva proposed a Memory Map standard for Peripherals all the way back in 1982, where he lays out where exactly he feels certain types of p<span style="text-align: center;">eripherals</span> should live.</div><div><br /></div><div>The below table is taken from <a href="https://archive.org/details/sq-syntax-quarterly/SQ%20Syntax%20Quarterly%201-1/page/n53/mode/2up" target="_blank">SQ Quarterly Issue Volume 1, Issue 1</a>, where you'll find quite an extensive article on the ZX80 & 81's Memory Maps, well worth reading, and it covers quite some ground that I won't go into here.</div><div><br /></div><div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEgQVdPsOLsiiFBPTgBklN9SNOp3y_z7JvKhjG8l8Za8sM2DLXiSJ7sAeKJ_fX4AYjbwus0tSV1-8zaijySGx-e1wg1Rve6TH1dTjg4n0_uCOuuzaNTi9ido6lNyw-84n8EPcNvRRs7730QQwWhIHX2y3_L1tjHgF10v8pthliDoK4D47s5pIrSqK-QVNw" style="margin-left: auto; margin-right: auto;"><img alt="" data-original-height="892" data-original-width="1181" height="483" src="https://blogger.googleusercontent.com/img/a/AVvXsEgQVdPsOLsiiFBPTgBklN9SNOp3y_z7JvKhjG8l8Za8sM2DLXiSJ7sAeKJ_fX4AYjbwus0tSV1-8zaijySGx-e1wg1Rve6TH1dTjg4n0_uCOuuzaNTi9ido6lNyw-84n8EPcNvRRs7730QQwWhIHX2y3_L1tjHgF10v8pthliDoK4D47s5pIrSqK-QVNw=w640-h483" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Nick Lambert of Quicksilva's Proposed Memory Map for Peripherals (SQ Quarterly 1-1 1982) </td></tr></tbody></table><br />Of course Nick's standard probably saw very little traction, and by the time anybody cared enough to follow a 'standard' they'd most likely moved onto squabbling around similar issues with the ZX Spectrum. Regardless, he does highlight the 2 most common areas where manufacturers and purveyors of DIY kits would naturally choose to locate their add-ons, the shadow ROM areas.</div><div><br /></div><div>Now as mentioned in Part 1, in order to save wads of cash, address mapping was normally keep to a minimum, with large areas mapped to reduce IC counts. Now of course if you're playing around with a ZX81 you're going to want to maximise your RAM (just because you can, plus there really are applications the use it all), and all that RAM is already likely to be occupying the shadow ROM areas. This of course pretty much rules out every location (exaggerating a bit for effect). In reality we can get very specific on addressing, right down to the byte, a good scheme might be to map to the upmost ROM/RAM area unused by BASIC, say 16383. But if we're going to get that specific there is another creative option open to us.</div><div><br /></div><h3 style="text-align: left;">16507 and Friends</h3><div>The bytes in memory, 16384 to 16508 hold the ZX81 System Variables. Of the 124 bytes set aside for System Variables, there are 3 listed as not used in the ZX81 BASIC Programming Manual. (Why is this? <a href="https://en.wikipedia.org/wiki/Steve_Vickers_(computer_scientist)" target="_blank">Steven Vickers</a> might know, personally, I haven't a clue) These unused bytes are 16417, 16507 and 16508, they are perfect for our purposes.</div><div><br /></div><div style="text-align: left;">The major catch with mapping a p<span style="text-align: center;">eripheral into the unused System Variables space is that any programmer looking to claw free space (particularly those building 1k apps) is going to hunt these down and use them. Doing so will prevent our prospective IO device and such memory scrounging programs from running correctly. As with pretty much all memory mapping issues, this is easily solved by removing the offending device. Still it's both worth both pointing out and remembering in those cases where something odd happens, say when running that special copy of "1k Monkey Clown Car </span><span style="text-align: center;">Mega </span><span style="text-align: center;">Racer Game TM".</span></div><div style="text-align: left;"><span style="text-align: center;"><br /></span></div><h4 style="text-align: left;">In Theory</h4><div style="text-align: left;">For the first iterations of the ZXIO board I've chosen address 16507 as it affords the opportunity in latter revisions in claiming 16508, giving 2 adjoining addresses and some really interesting possibilities. Of course this is well into the future, first priorities are / were getting the initial prototype up and running.</div><div style="text-align: left;"><br /></div><h3 style="text-align: left;">Next Up </h3><div>We'll get onto designing and building the ZXIO, plus issues and I encountered along the way. Pretty much what you'd expect from a write up. </div><div><br /></div><div>See all the other entries for this project: <a href="https://www.zx81keyboardadventure.com/2023/02/zxio-interface-for-zx81-part-1.html">Part 1</a>, <a href="https://www.zx81keyboardadventure.com/2023/02/zxio-interface-for-zx81-part-2.html">Part 2</a>, <a href="https://www.zx81keyboardadventure.com/2023/03/zxio-interface-for-zx81-part-3.html">Part 3</a>, <a href="https://www.zx81keyboardadventure.com/2023/04/zxio-interface-for-zx81-part-4.html">Part 4</a>, <a href="https://www.zx81keyboardadventure.com/2023/05/zxio-interface-for-zx81-part-5.html">Part 5</a> and <a href="https://www.zx81keyboardadventure.com/2023/08/zxio-interface-for-zx81-part-6.html">Part 6.</a></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><p></p>
David Stephensonhttp://www.blogger.com/profile/11637474307612171656noreply@blogger.com0tag:blogger.com,1999:blog-255603189167868415.post-56291929144310084242023-02-14T20:35:00.013+11:002024-01-07T14:25:57.614+11:00ZXIO Interface for the ZX81: Part 1<p style="text-align: left;"></p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEhnjMQxm4Js8Z3MCeNR0blffszSVmLHmCGa5M6Igdqq49dFoK4OPn06Iom3XqXgY2cgHii7zYzUs7aveD0GClwMbWpMizmlcPmRc3rdM6k9zkLMbxfH6dxeDciq9fOQeLcePcrMs1vtxOz7AWMIevQlirUBcCI_OoA3EbgwghIb921X55bzzCSdznT9HA" style="margin-left: auto; margin-right: auto;"><img alt="" data-original-height="1144" data-original-width="2559" height="286" src="https://blogger.googleusercontent.com/img/a/AVvXsEhnjMQxm4Js8Z3MCeNR0blffszSVmLHmCGa5M6Igdqq49dFoK4OPn06Iom3XqXgY2cgHii7zYzUs7aveD0GClwMbWpMizmlcPmRc3rdM6k9zkLMbxfH6dxeDciq9fOQeLcePcrMs1vtxOz7AWMIevQlirUBcCI_OoA3EbgwghIb921X55bzzCSdznT9HA=w640-h286" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Testing a Prototype ZXIO interface</td></tr></tbody></table><p></p><p style="text-align: left;"><span style="font-size: large;">This is the first in a new series of articles where I explore building an Input / Output board for the ZX81 (and clones), where I start with the idea of keeping it simple and probably fail at the simple part. </span></p><h3 style="text-align: left;">Didn't You Already Make an IO Board?</h3>Um, yes, yes I did, way back in 2018 I Build an IO board based on the a design found in the book <a href="https://www.zx81keyboardadventure.com/search?q=Easy+add-on+Projects+for+Spectrum+ZX81&x=0&y=0" target="_blank">Easy Add-On Projects for the Spectrum, ZX81 & Ace</a>, this worked as intended and fun was had. Having used the Add-On Projects board for a while, I came to the conclusion that it was a overly complicated to engage with as a platform for experimentation. This applies physical and when paired with a ZX81 digitally. <div><br /></div><div><div>The Add-On Projects board has plenty of input/output pins, but I find them to be arranged in a slightly non-intuitive way, one that makes it difficult to expand / breakout from. That's my fault to an extent, the original design has the use of crocodile clips in mind, when I made my version I tailored towards dupont connections, dupont wires will only stretch so far from the computer. Still, I kept the layout and that's sub-optimal from today's perspective where we're used to breakout boards, hats and shields and the like for extended tinkering. </div><div><br /></div><div>The other main issue I have with the Add-On Projects board is that it's I/O Port mapped, meaning you can't access the device natively in ZX81 BASIC and must load a Binary program to access the hardware. Again, this is not a real obstacle, more of an annoyance, a limiting factor. A better approach (for BASIC use) is to memory map an IO board. It's worth noting that that's a ZX81 problem, if using the Add-On Projects board with a ZX Spectrum you can query any available port.</div></div><div><br /></div><div><h3 style="text-align: left;">What do I Want in a ZX81 IO Board?</h3><div>The main thing I'm after on a new IO board is simplicity; easy to build, easy to connect and interface with, and accessible from BASIC. All in all a not to complicated shopping list. To make this happen I could modify the Add-On Projects schematic, but since I'm looking at building something new, why not take some other examples out there as inspiration.</div><p><br /></p><p>So it was off to the various fantastic archive sites for some research. Emerging some time latter, having trawled through period books and many a magazines, I found pretty much exactly what I was after in <a href="https://worldradiohistory.com/CANADA/ETI/80s/ETI-1983-04-Canada.pdf" target="_blank">ETI Canada, Issue April 1983</a>. There presented within the dusty digital pages a perfectly simple IO board. Interestingly once again it's a board designed for both the ZX81 and the ZX Spectrum. This time though there was an option to map it to Memory Addresses rather than ports. </p><p><br /></p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHuQ4jUY0fsnLTZNDXHXqcRRhba5VggOjRTTCFHYF_3evl0tgCMXC8t-8fp3SnMcU8CyCvDN2L0hD3WBs6m45OVjEM8s7eIJpL674xTyiTW8FWdHvRh5gwbaI4IDpv0hOeT6t7IPrgN2aX/s1580/ZXIO-original-ETI-nice.png" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="1580" data-original-width="1513" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjHuQ4jUY0fsnLTZNDXHXqcRRhba5VggOjRTTCFHYF_3evl0tgCMXC8t-8fp3SnMcU8CyCvDN2L0hD3WBs6m45OVjEM8s7eIJpL674xTyiTW8FWdHvRh5gwbaI4IDpv0hOeT6t7IPrgN2aX/w612-h640/ZXIO-original-ETI-nice.png" width="612" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">ZX IO Interface as published in the April 1983 Edition of ETI Canada</td></tr></tbody></table><br /><p>Of course just about any device can be mapped to a memory address, I guess the main reason this interface sticks out is because it implicitly does so and that the IO meat of the circuit is a simple as simple can be. To directly quote the original article in ETI:</p></div><blockquote style="border: none; margin: 0px 0px 0px 40px; padding: 0px; text-align: left;"><div><blockquote><p>"The eight board outputs are via PL1 and PL2 from the outputs of the 8-bit latch, IC1. The eight inputs to IC1 are connected to the ZX data bus lines DO -D7, so that when IC3b pin 6 pulses low the data present on DO-D7 is clocked into the latches. It will be held there until another ZX 'write' operation, to a suitable memory or I/O address, updates it.</p></blockquote></div><div><blockquote><p>IC2 contains 8 'tri-state' buffers. The inputs to these buffers are connected to the I/O board input points on PL3 and PL4. The output of each buffer is connected to one of the ZX data bus lines, but normally has no effect because the IC2 outputs are held open-circuit by a 'high' input to pins 1 and 19. When, however, the ZX does a 'read' operation from a suitable memory or I/O address, so that pin 3 of IC3a goes low, the output circuits of the buffers are enabled, transferring the information present at IC2 inputs to the ZX data bus lines."</p></blockquote></div></blockquote><div><p>In a nutshell IC1 and IC2 are handling the input / output, the remaining IC's are performing the address decoding, read and write detecting and ROM disabling. All pretty clear from the circuit diagram (and explanation in the article, which you should read).</p><p><br /></p><p>Now about that memory mapping, The ETI IO board is mapped to 'All' addresses between 8192 and 16383 (8192 to 16383), that's an entire 8k Area, one normally reserved on a stock ZX81 as a ROM mirror. This broad approach in address mapping is quite normal, as is knocking out the ROM mirror and a good way to reduce costs by keeping IC costs / counts low. But cost is not a factor these days, so for my p<span style="text-align: center;">rototype</span> IO board I decided I'd rather map an individual address, and made the necessary changes to the schematic (among some other minor changes). I chose address 16507.</p><p><br /></p><p>Now 16507 is actually an unused address in the System Variable table. A very convenient free space, perfect for locating an IO board right? Of course nothing comes for free, still short answer is yes it makes the perfect locations for an Output Board, and an interesting, possibly flawed location for an Input Board. </p><p><br /></p><h3>The Board Worked... But.. Next Time?</h3><p>Bit of a cliff hanger and no real explanation, and a rather sudden slightly disjointed end to Part 1. Next time I'll get into some details about the prototype and why I'm a fair way from done with this 'Simple' project. I did mention I wanted a simple project at the beginning of the article right? Seems I lied to myself.</p><p><br /></p><div>See all the other entries for this project: <a href="https://www.zx81keyboardadventure.com/2023/02/zxio-interface-for-zx81-part-1.html">Part 1</a>, <a href="https://www.zx81keyboardadventure.com/2023/02/zxio-interface-for-zx81-part-2.html">Part 2</a>, <a href="https://www.zx81keyboardadventure.com/2023/03/zxio-interface-for-zx81-part-3.html">Part 3</a>, <a href="https://www.zx81keyboardadventure.com/2023/04/zxio-interface-for-zx81-part-4.html">Part 4</a>, <a href="https://www.zx81keyboardadventure.com/2023/05/zxio-interface-for-zx81-part-5.html">Part 5</a> and <a href="https://www.zx81keyboardadventure.com/2023/08/zxio-interface-for-zx81-part-6.html">Part 6.</a></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div></div>David Stephensonhttp://www.blogger.com/profile/11637474307612171656noreply@blogger.com0tag:blogger.com,1999:blog-255603189167868415.post-50298701810608854342021-08-15T14:41:00.010+10:002021-08-15T22:37:00.272+10:00Tut-Tut on the Commodore PET<p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXciX93IyJi0Hwkme0G0WxbgjetlaOuXvzwxcabLHibQaT4TMbdieeCW-Ar8PbaYdf6DCuZkgrmeEXk3YlweSUUnlTDeDR_0V68M2VTSOLz0rQg783mLSTGDOlJuz_pQtbUpuzyLjlPt96/" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img alt="" data-original-height="350" data-original-width="225" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjXciX93IyJi0Hwkme0G0WxbgjetlaOuXvzwxcabLHibQaT4TMbdieeCW-Ar8PbaYdf6DCuZkgrmeEXk3YlweSUUnlTDeDR_0V68M2VTSOLz0rQg783mLSTGDOlJuz_pQtbUpuzyLjlPt96/w257-h400/image.png" width="257" /></a></div><span style="font-size: large;">For a game that started out as type-in program for <a href="https://paleotronic.com/2019/11/05/tut-tut-a-new-game-for-the-zx-spectrum/" target="_blank">Paleotronic Magazine</a>, Tut-Tut has received a load of love. I'm constantly surprised at Tuts success throughout all the versions I and others have released. </span><p></p><p><span style="font-size: large;"><br /></span></p><p><span style="font-size: large;">The various <a href="https://www.zx81keyboardadventure.com/search/label/Tut-Tut" target="_blank">Spectrum versions</a> feature in YouTube videos, the ZX81 version made the review pages of Retro Gamer, George Becketts' Jupiter Ace port has become quite the hit in Forth Circles and the original type in version even made it to the <a href=" https://youtu.be/j2P5wuhX8iI" target="_blank">TRS-80 MC-10</a> courtesy of Jim Gerrie. Yes for a game that I wrote initially to prove Sinclair BASIC games didn't have to be a slow boring mess, Tut-Tut found it's mummified legs and ran with them.</span></p><p><span style="font-size: large;"><br /></span></p><p><span style="font-size: large;">All of which brings us around to the latest port, Dave Currans' 2021 Commodore <a href="https://www.thefuturewas8bit.com/cas024.html" target="_blank">PET release of Tut-Tut</a>. </span></p><p><br /></p><h2 style="text-align: left;">Pharaohs' 6502 Tomb of PETs</h2><p></p><p>Ostensibly the PET port is based on the source code from the ZX81 version of the game. Considering the graphical limitations of Commodores first line of computers, the ZX81 version provides the perfect starting point. Of course the source code is only the beginning, there are many challenges in transposing games from system to system. </p><p><br /></p><p>Dave has done a brilliant job of porting and preserving the overall feeling of the game. Game play is smooth and crisp, and you certainly don't ever feel cheated when caught out by Pharaohs' treasure guardians.</p><p><br /></p><p></p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiOw3oBOs5OhTPJv11nwFDkzGAdI4xvuzP6hxQRwO0TH1QdBBr-xzj1pja0Hvymd-3PHbXAjRWfp138ypvZU5X3uFAnpeNhWX6sDRV8SSBHB56cLuIpU10mcIPu4NknI7tKau8DnpZfR6ij/" style="margin-left: auto; margin-right: auto;"><img alt="" data-original-height="836" data-original-width="1230" height="434" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiOw3oBOs5OhTPJv11nwFDkzGAdI4xvuzP6hxQRwO0TH1QdBBr-xzj1pja0Hvymd-3PHbXAjRWfp138ypvZU5X3uFAnpeNhWX6sDRV8SSBHB56cLuIpU10mcIPu4NknI7tKau8DnpZfR6ij/w640-h434/image.png" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Tut-Tut on the Commodore Pet</td></tr></tbody></table><br /><br /><p></p><p></p>In the PETs favour, the limited music and sound effects from the Spectrum and Ace versions have been incorporated, along with the ability to pause the game. All features that lend to your immersion into the game world. (Why I forgot to include 'pause' in the ZX81 release I've been meaning to ask myself for ages.)<br /><p><br /></p><p>I'm not going to dive any deeper into reviewing the game, I feel that's best left to others, after all I've got quite a stake in this title in general. What I will say however is that PET Tut-Tut is every bit Tut-Tut, and if you've enjoyed the other varieties then you're sure to love this one as well.</p><p><br /></p><p>The game is now available from <a href="https://www.thefuturewas8bit.com/cas024.html" target="_blank">The Future was 8bit on Cassette</a> as part of their £4.99 range or digitally at <a href="https://tynemouth.itch.io/tut-tut-commodore-pet">Itch.io</a>. I strongly recommend loading up ASAP, Pharaohs' treasures await.</p><p><br /></p><p>One again, great Job Dave!</p><p><br /></p><p><br /></p><p><br /></p><hr style="background-color: white; box-sizing: border-box; color: #333333; font-family: lora; font-size: 15px;" /><h2 style="background-color: white; border-bottom: 4px solid rgb(238, 238, 238); box-sizing: border-box; color: #333333; font-family: Oswald, sans-serif; font-size: 36px; font-weight: normal; line-height: 44px; margin: 10px 0px; padding: 0px 0px 5px;">Raid the Pyramids for a Copy of TuT-TuT</h2><div><br /></div><p><b style="background-color: white; box-sizing: border-box; color: #333333; font-family: lora; font-size: 15px;"><span style="box-sizing: border-box; font-size: large; margin: 0px; padding: 0px;">ZX81 Versions</span></b><br /></p><ul style="background-color: white; box-sizing: border-box; margin: 0px 0px 0px 35px; padding: 10px 0px 20px;"><li style="box-sizing: border-box; list-style-type: circle; margin: 0px; padding: 0px 0px 5px;"><span style="color: #333333; font-family: lora;"><span style="font-size: 15px;"><a href="https://zx81keyboardadventure.itch.io/zx81-tut-tut" target="_blank">A Digital copy at Itch.io</a></span></span></li><li style="box-sizing: border-box; list-style-type: circle; margin: 0px; padding: 0px 0px 5px;"><span style="color: #333333; font-family: lora;"><a href="https://cronosoft.fwscart.com/TUT-TUT_Sinclair_ZX81_+_16K_RAM_on_cassette/p5357732_20270309.aspx" target="_blank">Get the Cassette from Cronosoft</a></span></li><li style="box-sizing: border-box; color: #333333; font-family: lora; font-size: 15px; list-style-type: circle; margin: 0px; padding: 0px 0px 5px;">Play it on you iPad or iPhone, get a copy of <a href="https://apps.apple.com/us/app/zx81/id1180117434" style="box-sizing: border-box; color: #f3153d; margin: 0px; outline: none; padding: 0px; text-decoration-line: none; transition: all 0.25s linear 0s;" target="_blank">ZX81 for IOS</a></li></ul><p><span style="background-color: white; box-sizing: border-box; color: #333333; font-family: lora; font-size: large; margin: 0px; padding: 0px;"><b style="box-sizing: border-box;">ZX Spectrum Versions</b></span><br style="background-color: white; box-sizing: border-box; color: #333333; font-family: lora; font-size: 15px;" /></p><ul style="background-color: white; box-sizing: border-box; margin: 0px 0px 0px 35px; padding: 10px 0px 20px;"><li style="box-sizing: border-box; color: #333333; font-family: lora; font-size: 15px; list-style-type: circle; margin: 0px; padding: 0px 0px 5px;"><a href="https://zx81keyboardadventure.itch.io/zx-spectrum-tut-tut-2020-edition" target="_blank">Tut-Tut 2020 Edition at Itch.io</a>: Based on the ZX81 version with extra levels (and glorious colour).</li><li style="box-sizing: border-box; list-style-type: circle; margin: 0px; padding: 0px 0px 5px;"><span style="color: #333333; font-family: lora;"><span style="font-size: 15px;"><a href="https://cronosoft.fwscart.com/TUT-TUT_Sinclair_ZX_Spectrum_48K_on_cassette/p5357732_20754892.aspx" target="_blank">Get the Cassette from Cronosoft</a></span></span></li><li style="box-sizing: border-box; color: #333333; font-family: lora; font-size: 15px; list-style-type: circle; margin: 0px; padding: 0px 0px 5px;"><a href="https://paleotronic.com/2019/11/05/tut-tut-a-new-game-for-the-zx-spectrum/" target="_blank">Classic BASIC</a>: Physical Paper type-in release and Digital Copies will be available from Paleotronic Magazine</li></ul><div><p><span style="background-color: white; box-sizing: border-box; color: #333333; font-family: lora; font-size: large; margin: 0px; padding: 0px;"><b style="box-sizing: border-box;">Jupiter Ace</b></span><br style="background-color: white; box-sizing: border-box; color: #333333; font-family: lora; font-size: 15px;" /></p><ul style="background-color: white; box-sizing: border-box; margin: 0px 0px 0px 35px; padding: 10px 0px 20px;"><li style="box-sizing: border-box; list-style-type: circle; margin: 0px; padding: 0px 0px 5px;"><span style="color: #333333; font-family: lora;"><span style="font-size: 15px;"><a href="https://github.com/markgbeckett/jupiter_ace/tree/master/tut-tut" target="_blank">Tut-tut for the Jupiter, Ace Digital Copy</a>: Based on the ZX81 version, with enhancements, by </span></span>George Beckett</li><li style="box-sizing: border-box; list-style-type: circle; margin: 0px; padding: 0px 0px 5px;"><span style="color: #333333; font-family: lora;"><span style="font-size: 15px;"><a href="https://cronosoft.fwscart.com/TUT-TUT_Jupiter_Ace_+16K_RAM/p5357732_20996395.aspx" target="_blank">Get the Cassette from Cronosof</a>t</span></span></li></ul><div><p><span style="background-color: white; box-sizing: border-box; color: #333333; font-family: lora; font-size: large; margin: 0px; padding: 0px;"><b style="box-sizing: border-box;">Commodore PET</b></span><br style="background-color: white; box-sizing: border-box; color: #333333; font-family: lora; font-size: 15px;" /></p><ul style="background-color: white; box-sizing: border-box; margin: 0px 0px 0px 35px; padding: 10px 0px 20px; text-align: left;"><li><span style="color: #333333; font-family: lora;"><span style="font-size: 15px;"><a href="https://tynemouth.itch.io/tut-tut-commodore-pet" target="_blank">Tut-Tut for the PET Digital Copy</a>: Based on the ZX81 version, with enhancements, by Dave Curran</span></span></li><li><span style="color: #333333; font-family: lora;"><span style="font-size: 15px;"><a href="https://www.thefuturewas8bit.com/cas024.html" target="_blank">Get the Cassette from The Future was 8bit</a></span></span></li></ul><div><p><span style="color: #333333; font-family: lora; font-size: medium;"><span style="background-color: white;"><b>TRS80 MC-10</b></span></span></p><ul style="background-color: white; box-sizing: border-box; margin: 0px 0px 0px 35px; padding: 10px 0px 20px;"><li><span style="color: #333333; font-family: lora;"><span style="font-size: 15px;"><a href=" https://youtu.be/j2P5wuhX8iI" target="_blank">Classic BASIC Digital Copy</a>: conversion to Tandys MC-10 by Jim Gerrie</span></span></li></ul></div></div></div><div><span style="background-color: white; box-sizing: border-box; color: #333333; font-family: lora; font-size: large; margin: 0px; padding: 0px;"><b style="box-sizing: border-box;">Love the Game?</b></span><br style="background-color: white; box-sizing: border-box; color: #333333; font-family: lora; font-size: 15px;" /><ul style="background-color: white; box-sizing: border-box; color: #333333; font-family: lora; font-size: 15px; margin: 0px 0px 0px 35px; padding: 10px 0px 20px;"><li style="box-sizing: border-box; list-style-type: circle; margin: 0px; padding: 0px 0px 5px;"><a href="https://www.buymeacoffee.com/LjITrcG" style="box-sizing: border-box; color: #f3153d; margin: 0px; outline: none; padding: 0px; text-decoration-line: none; transition: all 0.25s linear 0s;" target="_blank">Why not buy me a Coffee</a>, I needed quite a few writing it, and with more there could be a TuT-TuT II.</li></ul><div><span style="color: #333333; font-family: lora;"><span style="font-size: 15px;"><br /></span></span></div></div><div><span style="color: #333333; font-family: lora;"><span style="font-size: 15px;"><br /></span></span></div><div><span style="color: #333333; font-family: lora;"><span style="font-size: 15px;"><br /></span></span></div><div><span style="color: #333333; font-family: lora;"><span style="font-size: 15px;"><br /></span></span></div><div><span style="color: #333333; font-family: lora;"><span style="font-size: 15px;"><br /></span></span></div><div><span style="color: #333333; font-family: lora;"><span style="font-size: 15px;"><br /></span></span></div><div><span style="color: #333333; font-family: lora;"><span style="font-size: 15px;"><br /></span></span></div><div><span style="color: #333333; font-family: lora;"><span style="font-size: 15px;"><br /></span></span></div><div><br /></div>David Stephensonhttp://www.blogger.com/profile/11637474307612171656noreply@blogger.com0tag:blogger.com,1999:blog-255603189167868415.post-75217592330436382422021-08-13T19:33:00.007+10:002021-08-14T21:27:59.131+10:00Mini PET 40/80 Build & Review<p> </p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3Oz1EkTgw7yClR74GVT2n9E6WT3-VIXwPeXy_AI3SpSol3EIoCOLACxraobo45RWNHIyyWChqNA7JA1CD0r-4_Zu91SKDjW1CkhD7MP89EPqwhP7wDinOOIlgkgr59qgCvnQVC1FlgWcy/s2836/20210808_144710.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="2836" data-original-width="2214" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3Oz1EkTgw7yClR74GVT2n9E6WT3-VIXwPeXy_AI3SpSol3EIoCOLACxraobo45RWNHIyyWChqNA7JA1CD0r-4_Zu91SKDjW1CkhD7MP89EPqwhP7wDinOOIlgkgr59qgCvnQVC1FlgWcy/w500-h640/20210808_144710.jpg" title="The New Tynemouth Software & TFW8b.com Mini PET 40/80" width="500" /></a></div><br /><p></p><h2 style="text-align: left;"><a href="https://www.thefuturewas8bit.com/shop/commodore/minipet4080.html" target="_blank">The New Tynemouth & TFW8b.com Mini PET</a></h2><div style="text-align: left;"><span style="font-size: large;">Back in 2020 Tynemouth Software released the Mini PET onto a largely unsuspecting retro computer kit appreciating public. 2021 sees the release of a significant update to the standalone kit in the form of the Mini PET 40/80. What's it like? How easy is it to build? How usable is it? Lets find out.</span></div><p><br /></p><h3 style="text-align: left;">A new PET in a Kit</h3><p>At first the Commodore Personal Electronic Transactor (PET) seems an unlikely choice for a computer kit, being possibly the least widely used of the classic Commodore computer lines. Then again PETs are the raison d'être for all subsequent Commodores and for that reason alone places the PET line in a very special place.</p><div><br /></div><div>Now there were quite a variety PETs produced, the the first being the 2001 series, going all the way up to SuperPET 9000s. But what type of PET is a Tynemouth Mini PET 40/80? Well, it's most of them and none of them all at the same time (well kind of). Internally the Mini PET 40/80, as the name suggests is a 32k PET 4000 series / CBM 8000 series clone, yet it takes the stylised keyboard from the original 2001.</div><div><br /></div><div><div>Unlike Commodore PETs, Tynemouth / TFW8b PETs come unassembled, and in that state it's pretty damn impressive. Mr Tynemouth aka Dave Currans' kits are normally impressive enough, but with the powers of TFW8b & Tynemouth combined something special awaits the keen kit builder this time around. </div><div><br /></div><div>The kit comes in quite the box; A light blue Commodore Pin Stripping cover sleeve cloaks the contents, imparting that essential Commodore-ish-ness of what lays within. Once opened our container reveals an equally special spiral bound assembly booklet, a PCB, the required ICs and other components neatly arranged out on build trays, plus a host of laser cut perspex sheeting that will go on to form the computers case.</div></div><p><br /></p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhEXgaGr6Vf3A0KV30rxk9gBJnb5WcLkdssqAA3drXMP_n0OsnBrAjLVIVmWr0wGlxtMmYfACN2ICh7NxvlsrJa1BfwUoAqvsE64DG-419ZQmR2-arKy7vElsz_GttaUB26x5iYEz-JxiD-/s3999/20210804_195044.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="1750" data-original-width="3999" height="280" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhEXgaGr6Vf3A0KV30rxk9gBJnb5WcLkdssqAA3drXMP_n0OsnBrAjLVIVmWr0wGlxtMmYfACN2ICh7NxvlsrJa1BfwUoAqvsE64DG-419ZQmR2-arKy7vElsz_GttaUB26x5iYEz-JxiD-/w640-h280/20210804_195044.jpg" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">The Opened PET kit ready to roll.</td></tr></tbody></table><br /><p>Thanks to all the hard work that's gone into first impressions, there's no sense of dread to be had before embarking on the build, quite the opposite, you can't wait to get the PET together.</p><p><br /></p><h3 style="text-align: left;">Build a PET</h3><p>As alluded to earlier, the build manual is a kit highlight, not only striking in it's design references, it is perhaps more importantly for the purposes of kit building a very clear and well laid out reference. Being spiral bound the manual is easy to lay flat during the step by step kit building processes and each stage of the build is presented at the appropriate time. (with the possible exception of step 3, the Crystal and Transistor mounting, which I'd recommend swapping with step 4.)</p><p><br /></p><p>Building the PET is a breeze, well more of a long gust, there's a lot to solder after all. The PCB is cleanly laid out with part placement quickly referenced in the manual. Conveniently all the IC's / Sockets are laid parallel and facing the same direction, a trait shared with other matched components such as diodes, a nice touch that makes it quite difficult to solder polarised parts incorrectly rotated.</p><p><br /></p><p>One thing to note while building up the PCB; the solder pads around the IC's are on the smaller side, I found the use of a flux pen greatly improved my soldering experience. </p><p><br /></p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtBs63_im2syQJAkFX4SC7nyaBeL8g6cP_koWbN9HSqQ2jen2WSpJ-hw-K9IA0qcOgtEueOefcN-5V20EWOhJTi0MKaM8QCayF5jdw8pNojCxKQN_PjB-1xgWPfecVkBeZTfmd9npwRbMT/s3978/20210805_202917.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="2749" data-original-width="3978" height="442" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtBs63_im2syQJAkFX4SC7nyaBeL8g6cP_koWbN9HSqQ2jen2WSpJ-hw-K9IA0qcOgtEueOefcN-5V20EWOhJTi0MKaM8QCayF5jdw8pNojCxKQN_PjB-1xgWPfecVkBeZTfmd9npwRbMT/w640-h442/20210805_202917.jpg" title="Mini PET 40/80: Key Craft - Cut and Place" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Key Craft - Cut & Place</td></tr></tbody></table><p><br /></p><p>Perhaps the weakest point of the original Mini PET was its 'tack switch' based keyboard. Not having an example of the previous model I can't reliably comment fully, still I think we can all intuitively 'feel' the issue. The Mini PET 40/80 has addressed all concerns while managing to keep a satisfying retro feel. Omron B3f Series switches underpin the keyboard this time around, Cherry MX (or <a href="https://www.youtube.com/watch?v=DudpW2cwuPs&t=38s" target="_blank">9mm</a> <a href="https://youtu.be/zHAIuE5BQWk?t=906" target="_blank">Guy Preferred</a>) they are not, though they are rather pleasant to use and should serve extremely well. In situ surrounded by a bezel the keyboard looks the part, really completing out that retro PET styling. This keyboard gets an A+ from me for effort and details (and even feel).</p><p><br /></p><p>Once at the keyboard legend decal stage you'll have quite the arts and craft session ahead of you. 87 legend cutouts required for placement under clear keycap tops. Thankfully the kit comes equipt with several copies of the keyboard decal sheets should you make a mistake.</p><p><br /></p><p>That leaves us with the final case assembly, and what a fine bit of work that is. Held firm on a dark base plate, the white circuit board and bezel plates all topped off with a clear laser cut etched panel, completed and all together the Mini Pet 40/80 is gorgeous.</p><p><br /></p><h3 style="text-align: left;">PET Handling</h3><p>Of course the most exciting part of any kit is powering it on for the first time. I was instantly greeted with the "*** MINI PET BASIC 4.1 ***" header; for what must be a first for me it all worked straight out of the gate. Good omens!.</p><p><br /></p><p></p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghZNY2SyYicGI-7dBsIvI9WS-4ff91EOcC3L0g7rzBfifsCfWie2Tdir7YdZnQ_bQTpFOo5-TGHux3ZS5GyTmaQD9TqPyNuYIoEz6UHjPVNTkdzWIRrdeH0J36bBUOM3qJcr4DF0gbaV6p/s3024/20210808_140621.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="2148" data-original-width="3024" height="454" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghZNY2SyYicGI-7dBsIvI9WS-4ff91EOcC3L0g7rzBfifsCfWie2Tdir7YdZnQ_bQTpFOo5-TGHux3ZS5GyTmaQD9TqPyNuYIoEz6UHjPVNTkdzWIRrdeH0J36bBUOM3qJcr4DF0gbaV6p/w640-h454/20210808_140621.jpg" title="Mini PET 40/80 Assembled" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">One Mini Pet 40/80 All Together on the Workbench</td></tr></tbody></table><br /><br /><p></p><p>Next, to test some software, I'd grabbed some PET software off the Net and loaded all manner of things up, and no issues at all. The Mini PET seems perfectly compatible with all the software I'd tried in 40 and 80 column modes. </p><p><br /></p><p>I'd definitely recommend purchasing the "SD2PET Future" interface alongside the PET kit if you don't already have one, particularly if you don't a Commodore Datasette (or Disk Drive), else you'll need to load manually via person on keyboard entry, all old school like.</p><p><br /></p><h4 style="text-align: left;">PET Video</h4><p>We have a number of video modes to choose from, some of which are quite exciting if you happen to have the correct monitor. There are the usual composite PAL and NTSC, real PET Monitor Specific modes, of more interest to some are the options for RGBI/CGA and MDA/Hercules.</p><p><br /></p><p>Composite video quality is crystal clear when viewed on a CRT in either NTSC or PAL, and no less stunning through the my cheep and cheerful HD Video Converter. With the clarity available from composite there's not a lot of need fort RGBI or MDA except that it gives you the choice of switching on a retro green screen mode.</p><p><br /></p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDRyhCaRJWsf8XHj1fB1VoFqqlWJ8lN6vjoslG86LdIsaXjd6cWVbGs9p2G2Nyp_sNv5JbGIs5aeXSD-VHsFGvxMGnZwuBnesoaJ0UPB_NGc9XEeY4TddInJdVJjcdqhlgs4_WoC42G5oj/s3024/20210808_135506.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="3024" data-original-width="3024" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDRyhCaRJWsf8XHj1fB1VoFqqlWJ8lN6vjoslG86LdIsaXjd6cWVbGs9p2G2Nyp_sNv5JbGIs5aeXSD-VHsFGvxMGnZwuBnesoaJ0UPB_NGc9XEeY4TddInJdVJjcdqhlgs4_WoC42G5oj/w640-h640/20210808_135506.jpg" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Close up of Composite Video on an LCD screen</td></tr></tbody></table><br /><p><br /></p><p>I found CGA/RGBI mode is a mixed bag, although I believe that with a genuine CGA capable monitor (including the infamous Commodore 1024s series) RGBI would be quite stunning, however I have don't have an RGBI monitor to test with. What I do have are a number of CGA to VGA converters, and the picture from these was a touch disappointing, with colour ghosting and artefacting as if the phase was out. I couldn't find a way to rectify this easily. Your millage with video converters may vary significantly. On the other Hand MDA/Hercules I was able to convert perfectly. </p><div><br /></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyNGx8IaLLuZ418U0ypYrMyWmFvW25V_B-xyWjccG5Wri-66k0lqlipEcnI67X5CcrIxijWPJkb71TzRG0NgU3QLmkjDPsc8idH7iqe5izsy8Drpfd8SedQxPic4w4CNvhtTND9fgPucD7/s3024/20210808_134329.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="3024" data-original-width="3024" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyNGx8IaLLuZ418U0ypYrMyWmFvW25V_B-xyWjccG5Wri-66k0lqlipEcnI67X5CcrIxijWPJkb71TzRG0NgU3QLmkjDPsc8idH7iqe5izsy8Drpfd8SedQxPic4w4CNvhtTND9fgPucD7/w640-h640/20210808_134329.jpg" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Similar image through RGBI with colour bleeding (note this most likely an issue with the conversion process not the actual video output)</td></tr></tbody></table><p><br /></p><p>Regardless of RGBI issues, as stated above the Composite is so crystal clear that it's no major loss if you can't get a particular RGBI converter to work as expected, or if you don't have a CGA/RGBI monitor to hand.</p><p><br /></p><p><br /></p><hr /><p style="text-align: left;"><b><span style="font-size: large;"><br /></span></b></p><p style="text-align: left;"><b><span style="color: #e06666; font-size: large;"><i>An Update on CGA / RGBI Video Output</i></span></b></p><p><span style="color: #e06666;"><br /></span></p><p><span style="color: #e06666;">Not being satisfied with the CGA to VGA converter result, I dug out an RGBI to RGBS converter I had in a draw and married that up to a SCART to HDMI converter. The results are much clearer than I'd achieved with the CGA box. I think we can say definitively that the Mini PET puts out a pretty decent RGBI image (which would look brilliant on a CGA monitor).</span></p><p> </p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfEzx2vV6lG2rsOL4O7Upqih8phJ7rEtlNTeVSoEJuSBnVgWhJJ-o82WvxwGQePf1xD8JeFZQYG_I2minvkcHFW2HotvP7vFfCv67PGHmh6l5UGRvy9GIyL62ZFVwnHP2Hb7CAqg72TMH-/s3024/20210814_130030.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="3024" data-original-width="3024" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfEzx2vV6lG2rsOL4O7Upqih8phJ7rEtlNTeVSoEJuSBnVgWhJJ-o82WvxwGQePf1xD8JeFZQYG_I2minvkcHFW2HotvP7vFfCv67PGHmh6l5UGRvy9GIyL62ZFVwnHP2Hb7CAqg72TMH-/w640-h640/20210814_130030.jpg" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">RGBI converted to RGBS and run through a SCART to HDMI Converter. A much better Image.</td></tr></tbody></table><p><br /></p><p><span style="color: #e06666;">For sharpest results with minimal fuss I'd still recommend simply upping the Composite video to VGA or HDMI, or maybe going straight to a TV depending.</span></p><p><br /></p><hr /><p><br /></p><h3 style="text-align: left;">Should You Adopt a PET?</h3><div>In short YES! </div><div><br /></div><div>If you're interested in Commodore computers and kits, then this kit is for you. All in all this was a fun build and I'm certainly looking forward to experiencing the PET for what it is and was. The Mini Pet 40/80 is quite simply a brilliant kit computer, by far one of the most enjoyable kits I've ever built.</div><div><br /></div><div>Adopt your own PET today from<a href="https://www.thefuturewas8bit.com/shop/commodore/minipet4080.html" target="_blank"> Tynemouth Software & TFW8b.com</a></div><div><br /></div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgaHPHYp5W0yLTAQ9PmON2lr_17eeH6zAEGc7d-Iceclpw9KtrtwTKEPWlMWcGuEqKtIY6kXxjxJ87nddPNXBKxl8U2ke9XncCGhCyqQ2olQ1zq9YxvG3htpeM0wYUM7sV-5Xte3PPiNx4d/s3024/20210808_140452.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="3024" data-original-width="3024" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgaHPHYp5W0yLTAQ9PmON2lr_17eeH6zAEGc7d-Iceclpw9KtrtwTKEPWlMWcGuEqKtIY6kXxjxJ87nddPNXBKxl8U2ke9XncCGhCyqQ2olQ1zq9YxvG3htpeM0wYUM7sV-5Xte3PPiNx4d/w640-h640/20210808_140452.jpg" title="Tynemouth Software & TFW8b.com Mini PET 40/80 running some Screen Tests" width="640" /></a></div><br /><div><br /></div><div><br /></div>David Stephensonhttp://www.blogger.com/profile/11637474307612171656noreply@blogger.com4tag:blogger.com,1999:blog-255603189167868415.post-89589762100019694112020-11-29T15:59:00.003+11:002020-11-30T11:54:32.962+11:00ZX-Key: New Lite Version<p>Introducing the new ZX-Key Lite: A mechanical keyboard for the ZX81 that's very similar to the classic ZX-Key.</p><p><br /></p><p>The original ZX-Key has been available for some time now, and won't be going away anytime soon. However various requests have come my way asking about kit versions, versions that don't really need the Arduino for PC connectivity and similar, the Lite version should be the answer to many of these needs.</p><p><br /></p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoJ2ZDnBusrVEnAJhAqjQMG3U7sNXtbiv7TaMRuwrHQlq9aPYlBjWA7iJ3Cv-mF2YnOKuJgfzP-mxi4WhatT3wT3iRm8xoIfwutMPBbeY0qvgCEqJzvyBfGRFdxJJiFj7en0IfTcw7B-4p/s3911/20201111_210054.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="1647" data-original-width="3911" height="270" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoJ2ZDnBusrVEnAJhAqjQMG3U7sNXtbiv7TaMRuwrHQlq9aPYlBjWA7iJ3Cv-mF2YnOKuJgfzP-mxi4WhatT3wT3iRm8xoIfwutMPBbeY0qvgCEqJzvyBfGRFdxJJiFj7en0IfTcw7B-4p/w640-h270/20201111_210054.jpg" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">The ZX-Key Lite, ready for use with a ZX81</td></tr></tbody></table><br /><p>Fundamentally there are only very minor differences between the PCB of the Lite and Original; what changes there are afford the ability to provide options for selling differing levels of kits, or provide assembled units designed purely for use with a ZX81.</p><p><br /></p><p>The most noticeable difference between the Lite and Classic ZX-Keys is the now optional Arduino Pro Micro. (In reality the Pro Micro was an option on the Classic boards as well, however the LEDS in particular then have zero purpose without modification.) The presence of an Arduino allows the keyboard to be used with a regular PC, a function mainly intended for use in emulators. A great feature that isn't required if you're only intending to use the keyboard with a real ZX81.</p><p><br /></p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_V_gt_ZT50VE-jv7OsllmD1oMCo0fSQ7YVKXfbi5LlU2xO59Mt78LfrIzWQOb1n57W506WHeI9Giy490Q6KP3x7rNZIfj5ZHZhKanf80XxDfGLwe9SfvOlB6fbAParyD7D-8rjMDqVbLd/s3094/20201115_182632.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="2245" data-original-width="3094" height="464" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_V_gt_ZT50VE-jv7OsllmD1oMCo0fSQ7YVKXfbi5LlU2xO59Mt78LfrIzWQOb1n57W506WHeI9Giy490Q6KP3x7rNZIfj5ZHZhKanf80XxDfGLwe9SfvOlB6fbAParyD7D-8rjMDqVbLd/w640-h464/20201115_182632.jpg" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">ZX-Key Lite: Complete Unit fit for a ZX81</td></tr></tbody></table><br /><p>The ZX-Key Lite version can always be updated to a Full / Classic at a latter stage by installing the missing components and switching a jumper wire. The new board is more about providing choices, more than a fundamental redesign.</p><p><br /></p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhT8N2y_54L1fRZUEA5d1ymE9QiPiQAwWh3itiIiftl6HDKAkIRInLlJvxsq3GoamQmKUGqeNpYB4odvmsx3zSkgd10NsWNeHPdhvqFfwzmjpBcC3W0gDtvMXL135TGQyQFfJdO9UZOSTDk/s3239/20201124_211952.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="2173" data-original-width="3239" height="430" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhT8N2y_54L1fRZUEA5d1ymE9QiPiQAwWh3itiIiftl6HDKAkIRInLlJvxsq3GoamQmKUGqeNpYB4odvmsx3zSkgd10NsWNeHPdhvqFfwzmjpBcC3W0gDtvMXL135TGQyQFfJdO9UZOSTDk/w640-h430/20201124_211952.jpg" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">ZX-Key Lite: Board Upgraded to Classic and attached to a Minstrel ZX81 Clone</td></tr></tbody></table><br /><div><p>Housing the ZX-Key Lite Keyboard in an attractive case is just as simple as previously. There are 3 components available on Shapeways</p><p></p><ol style="text-align: left;"><li><a href="https://www.shapeways.com/product/PLQ54XNBU/zx-key-keyboard-starter-case?optionId=90806512&li=shops" target="_blank">ZX-KEY Keyboard 'Starter' Case</a></li><li><a href="https://www.shapeways.com/product/T9E79JQAC/zx-key-keyboard-case-top-plate-lite-version" target="_blank">ZX-KEY Keyboard Case 'Top Plate' - Lite Version</a></li><li><a href="https://www.shapeways.com/product/Z3367VKWZ/zx-key-keyboard-case-bottom-plate?optionId=105370548&li=shops" target="_blank">ZX-KEY Keyboard Case 'Bottom Plate'</a></li></ol><p></p><p>The starter case and bottom plate are the same parts as used for the Full / Classic ZX-Keys. A 'Top-Plate' - Lite Version has been designed specifically to house a non upgraded ZX-Key Lite, and comes without the redundant Serial Expansion slot and now un-required extra LED indicator holes.</p><p><br /></p><p></p><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg15MaqeBEVCSlvwOXsfGuXX05ppnE8Kvfw5csIj11pALcrk7dM4r1VPuv5dUwcNkBcGwl_U6LHT-aD9Sahr7fWtHuKd3_b0lH6Asvh24UgC47RRSQ-BobGOF_e3nPqPj0I91rwCPOJqyGB/" style="margin-left: auto; margin-right: auto;"><img data-original-height="873" data-original-width="1543" height="362" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg15MaqeBEVCSlvwOXsfGuXX05ppnE8Kvfw5csIj11pALcrk7dM4r1VPuv5dUwcNkBcGwl_U6LHT-aD9Sahr7fWtHuKd3_b0lH6Asvh24UgC47RRSQ-BobGOF_e3nPqPj0I91rwCPOJqyGB/w640-h362/image.png" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">ZX-Keys Lite Case Top Available at Shapeways</td></tr></tbody></table><br />Limited stocks of the ZX-Keys Lite are now available at <a href="https://www.sellmyretro.com/user/profile/dasteph" target="_blank">Sell My Retro</a>. It's predicted that kit versions will be available early in the new year, after supply chains and shipping times have returned to some normality.<p></p></div><div><br /></div><div><br /></div>David Stephensonhttp://www.blogger.com/profile/11637474307612171656noreply@blogger.com1tag:blogger.com,1999:blog-255603189167868415.post-45414834875624555132020-09-06T21:41:00.009+10:002021-04-21T11:12:24.307+10:00Commodore Educator 64 Mini: Part 3<span style="font-size: large;">Here we are at the final article in the Commodore Educator 64 Mini series and there are a surprising number of loose ends to tie off; very probably the reason why it's taken a while to actually get around to documenting them.</span><div><span style="font-size: large;"><br /></span></div><div><span style="font-size: large;">This article more or less sums things up and provides some instruction on how get the project up and running. If you haven't read <a href="https://draft.blogger.com/#">Part 1</a> or <a href="https://draft.blogger.com/#">Part 2</a>, I'd suggest starting from the beginning so that it all makes sense. <br /><br />All files required to build the Educator Mini are made available at the end of the post.</span><div style="text-align: left;"><br /></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhK4AOLgGREjY1KQr9egBLCTpIgdWbFqcywuNrYShghxOyFkQOtPTUeEyEyI90-Zzj0jicabb__JEMdZjypcBOxyT8TL2BO_2fWUjoPqOPWjZoFPNBWOmcsebEeoY-V8CxUTcsPDUMDwaso/s2235/20200620_143324.jpg" style="margin-left: auto; margin-right: auto;"><img alt="The Final Producst" border="0" data-original-height="2058" data-original-width="2235" height="590" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhK4AOLgGREjY1KQr9egBLCTpIgdWbFqcywuNrYShghxOyFkQOtPTUeEyEyI90-Zzj0jicabb__JEMdZjypcBOxyT8TL2BO_2fWUjoPqOPWjZoFPNBWOmcsebEeoY-V8CxUTcsPDUMDwaso/w640-h590/20200620_143324.jpg" title="commodore pet educator mini complete" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">The Final Product: The Commodore Educator 64 Mini</td></tr></tbody></table><div><br /><h2>Fitting the Keyboard and Daughter Board</h2><div>The keyboard is designed to sit quite firmly in the Educator case, it shouldn't require any glue but you may need to file and / or sand the 3D printed case lightly to gain that perfect fit.</div><div><br /></div><div>The Raspberry PI Daughter Board and monitor cables should be fitted before placing the Raspberry Pi in it's Educator case, as there is not a lot of height to play with right up the back. Cabling running to the keyboard can be inserted at any time.</div><div><br /></div><div><br /></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9cqBTVJqlxKj7KiWlzxk7U6z6SoVsP5UeD5BO9wu6gSn6lTBuaRvSE2W4ZPML-iIfUX0nn1nyHQO9LynKWEm9Jp_k8_r7LIkSTq8HuZy6WpOwGuchzI6gE6_9dnr1uvDqUEqDxj3nBFUj/s2426/20200614_115510.jpg" style="margin-left: auto; margin-right: auto;"><img alt="Raspberry Pi Daughter Board" border="0" data-original-height="2000" data-original-width="2426" height="528" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9cqBTVJqlxKj7KiWlzxk7U6z6SoVsP5UeD5BO9wu6gSn6lTBuaRvSE2W4ZPML-iIfUX0nn1nyHQO9LynKWEm9Jp_k8_r7LIkSTq8HuZy6WpOwGuchzI6gE6_9dnr1uvDqUEqDxj3nBFUj/w640-h528/20200614_115510.jpg" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Educator Min Keyboard to Raspberry Pi Daughter Board / Interface</td></tr></tbody></table><br /><div>When fitting the keyboard you need to pay attention to the labels at the header pins. The numbers and letters correspond with a similar arrangement found on the PI Daughter Board. As a plus, the naming scheme also matches that used on a real 64 keyboard.</div><div><br /></div><div><br /></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjX-jWBe2NbiNIp6SCcHY32DxEHGDZrGsiCG93frVja1xkkpbm6Y6fFpPXhliOBKSlwYjXMU_zPyPka0o8w1oTs-jVF-PBsPnUS8VAj9AjKCvTG9D_j-N3Mlo6gHzWB7-PYGm5fFJV3F0GM/s2566/Internals_keyboard_crop.png" style="margin-left: auto; margin-right: auto;"><img alt="Keyboard Fitted / back view" border="0" data-original-height="1226" data-original-width="2566" height="306" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjX-jWBe2NbiNIp6SCcHY32DxEHGDZrGsiCG93frVja1xkkpbm6Y6fFpPXhliOBKSlwYjXMU_zPyPka0o8w1oTs-jVF-PBsPnUS8VAj9AjKCvTG9D_j-N3Mlo6gHzWB7-PYGm5fFJV3F0GM/w640-h306/Internals_keyboard_crop.png" title="commodore pet educator mini keyboard installed" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Commodore 64 Mini Keyboard fitted Snuggly: Pay attention to the jumper setting.</td></tr></tbody></table><br /><div>In addition there is a jumper setting to be made, for use in the Mini. A Jumper should be set across pins 1 & 2. The Jumper determines the behaviour of the Shift Lock key, unfortunately there are not enough free GIPO pins on the PI to take advantage of this feature for now.</div><div><br /></div><div><br /></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhf4uonJBBb0K1vJJ32kKfJbMO3G-iM2BDBzoqrE-XQwuxWhud9-R1AjLGaYtB-hkWgb70-hmZ78W2_0FGZC4Z6svlxkXu-wBiErgoGpsyzASpTVOXEtdLdN2PGBLRi-ORbR6Mub_fKUljs/s2710/20200621_123549.jpg" style="margin-left: auto; margin-right: auto;"><img alt="The Educator Internals" border="0" data-original-height="2710" data-original-width="1953" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhf4uonJBBb0K1vJJ32kKfJbMO3G-iM2BDBzoqrE-XQwuxWhud9-R1AjLGaYtB-hkWgb70-hmZ78W2_0FGZC4Z6svlxkXu-wBiErgoGpsyzASpTVOXEtdLdN2PGBLRi-ORbR6Mub_fKUljs/w462-h640/20200621_123549.jpg" title="commodore pet educator mini Internals" width="462" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Inside the Educator MIni</td></tr></tbody></table><div><br /></div><h2 style="text-align: left;">Finalising Model Styling</h2><div style="text-align: left;">You'd have noticed by now that the Educator Mini 64 has a somewhat different set of stickers to Lorenzo's PET (much like the real thing really). I've made up a couple of additional mini replica decals to suit the 64, the most obvious of these being the BASIC reference panel.</div><div style="text-align: left;"><br /></div></div><div style="text-align: left;">The BASIC keyword panel is a fairly good approximation the original full sized version and depending on how good your eyes are and the resolution of the printers used to produce the decal sheet could well come in useful.</div><div style="text-align: left;"><br /></div><div style="text-align: left;">I've also included Lorenzo's decals for the back of the monitor and the Serial Number Name Plate for the sake of completeness.</div><div><br /></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqpu9CjvNk4LdEE8T1XS70hRDmeOoeZOY71Luua-0JoQG_3YUQ_aRvxwxRzatx-pPx7kcehjGtMORxo6Y2PHYcdr2enHbLlfzQrVqdDspXRXtbymMhgoHf8ArfvTSfSHsZLgyBGTVcGz1O/s734/educator_all.png" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="369" data-original-width="734" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiqpu9CjvNk4LdEE8T1XS70hRDmeOoeZOY71Luua-0JoQG_3YUQ_aRvxwxRzatx-pPx7kcehjGtMORxo6Y2PHYcdr2enHbLlfzQrVqdDspXRXtbymMhgoHf8ArfvTSfSHsZLgyBGTVcGz1O/s16000/educator_all.png" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Educator 64 Mini Decal Sheet, Including everything an old computer needs.</td></tr></tbody></table><div><br /></div><div><h2 style="text-align: left;">Getting the Educator Mini up and Running</h2><div><a href="https://retropie.org.uk/" target="_blank">RetroPie</a> is normally your friend for an easy Linux retro solution. Disclaimer time, I decided not to use RetroPie for this build and went with a standard versions of <a href="https://www.raspberrypi.org/downloads/raspberry-pi-os/" target="_blank">Raspberry Pi OS</a> (previously called Raspbian).</div><div><br /></div><div>There are a number of reasons I'm using Raspbian, the main ones for me being,</div><div><ol style="text-align: left;"><li>It's just simpler to get the keyboard working with the Vice emulator.</li><li>I'm only intending to use Vice and Commodore Emulation on the Mini.</li></ol><div>Of course your needs may vary, and what ever I've done is really only a suggestion.</div></div><div><br /></div><div><h3>Installing the Vice Emulator</h3></div><div>Raspberry Pi OS does not include the Vice Emulator as a standard package, or even an optional downloadable package, so you'll need to install it manually. I simply followed the<a href="https://krystof.io/installing-the-vice-commodore-emulator-for-console-mode-on-a-fresh-raspberry-pi-4/" target="_blank"> Installation guide on krystof.io</a> </div><div><br /></div><div>Once Vice is installed you'll be wanting to add a configuration file to get the emulator looking and feeling right.</div><div><br /></div><div><b>Run the following commands to create a sdl-vicerc config file:</b></div><div></div></div>
<div>
<pre style="background: rgb(255, 255, 255); border: none; line-height: 20px; overflow: auto; padding: 16px; text-align: left; width: 99%;"><span style="font-size: 14px;"><b>mkdir -p ~/.config/vice
nano ~/.config/vice/sdl-vicerc</b></span></pre></div><div>
<div>
<pre style="background: rgb(255, 255, 255); border: 1px dashed rgb(204, 204, 204); line-height: 20px; overflow: auto; padding: 16px; text-align: left; width: 99%;"><span style="color: red; font-size: 14px;"><b>[C64SC]
MenuKey=293
MenuKeyUp=273
MenuKeyDown=274
MenuKeyLeft=276
MenuKeyRight=275
MenuKeyPageUp=280
MenuKeyPageDown=281
MenuKeyHome=278
MenuKeyEnd=279
WarpMode=0
Sound=1
SoundDeviceName="sdl"
SoundSampleRate=8000
SoundBufferSize=100
SoundFragmentSize=0
SoundVolume=100
SoundOutput=1
AspectRatio="1.000000"
SDLCustomWidth=480
SDLCustomHeight=320
SDLWindowWidth=480
SDLWindowHeight=320
SDLGLAspectMode=0
VirtualDevices=1
IECReset=1
CIA1Model=0
CIA2Model=0
VICIIVideoCache=1
VICIIDoubleScan=0
VICIIDoubleSize=0
VICIIFilter=0
VICIIModel=0
SidEngine=0
SidModel=0
JoyPort4Device=0
JoyDevice1=4
JoyDevice2=4
AutostartBasicLoad=1
AutostartPrgMode=0
DriveSoundEmulation=0
Drive8Type=1571
GlueLogic=0
ETHERNETCARTBase=56832
Acia1Base=56832
AutostartWarp=1
KeyboardMapping=1</b></span></pre>
</div>
<h3 style="text-align: left;">Setting Up the keyboard</h3><div><div>There are multiple was to of configuring a keyboard for use with the vice Emulator, I've chosen the path of least resistance. Feel free to delve deeper into the heavy customisation that Vice affords. That said intense configuring is a little above what's really required for what is essentially a very cute desk toy.</div><div><br /></div><div>For the initial steps, we'll basically be following those documented in <a href="https://www.raspberrypi.org/magpi-issues/MagPi67.pdf" target="_blank">PJ Evens's MagPi issue 67 article</a> on page 26, make some changes specifically for the Commodore Educator 64 keyboard.</div><div><br /></div><div><div><b>1) install Libsuinput:</b> From your home directory:</div>
<div>
<pre style="background: rgb(255, 255, 255); border: none; line-height: 20px; overflow: auto; padding: 16px; text-align: left; width: 99%;"><span style="font-size: 14px;"><b>cd
sudo apt install get libudev-dev python-dev python-pip
sudo pip install wiringpi
cd git clone github.com/tuomasjjrasanen/libsuinput
cd libsuinput
./autogen
./configure
make
sudo make install</b></span></pre>
</div>
<div><div><div>Add the following line to <b>/etc/modules-load.d/modules.conf</b></div></div><div>
<div>
<pre style="background: rgb(255, 255, 255); border: none; line-height: 20px; overflow: auto; padding: 16px; text-align: left; width: 99%;"><span style="color: red; font-size: 14px;"><b>uinput</b></span></pre>
</div>
<div><div><b><br /></b></div><div><b>2) Install Python-uinput:</b> From your home directory:</div><div>
<div>
<pre style="background: rgb(255, 255, 255); border: none; line-height: 20px; overflow: auto; padding: 16px; text-align: left; width: 99%;"><span style="font-size: 14px;"><b>cd
git clone github.com/
tuomasjjrasanen/pythonuinput
cd python-uinput
sudo python setup.py build
sudo python setup.py install</b></span></pre></div><div><div><b><br /></b></div><div><b>3) Install cbmscanner python scripts: </b> Download these scripts and uncompress the file. We'll mimic the original Magi Article and install them in a subdirectory off the home dir.</div><div>
<div>
<pre style="background: rgb(255, 255, 255); border: none; line-height: 20px; overflow: auto; padding: 16px; text-align: left; width: 99%;"><span style="font-size: 14px;"><b>cd
wget -P ~ "http://dasteph.com/cgi/pet/files/cbmscanner.tar"
tar -xvf cbmscanner.tar</b></span></pre>
</div>
<div><div><b><br /></b></div><div><b>4) Create a new Service: </b>We need to setup a new service to run keyboard scanner on boot by creating a new config file.</div><div><div><pre style="background: rgb(255, 255, 255); border: none; line-height: 20px; overflow: auto; padding: 16px; text-align: left; width: 99%;"><span style="font-size: 14px;"><b>sudo nano /usr/lib/systemd/cbmscanner.service</b></span></pre>
</div>
<div>
<pre style="background: rgb(255, 255, 255); border: 1px dashed rgb(204, 204, 204); line-height: 20px; overflow: auto; padding: 16px; text-align: left; width: 99%;"><span style="font-size: 14px;"><b><span style="color: red;">[Unit]
Description=Commodore 64 Keyboard Scanner
After=multi-user.target
[Service]
Type=simple
ExecStart=/usr/bin/python /home/pi/cbmscanner/cbmscanner.py
Restart=on-abort
[Install]
WantedBy=multi-user.target</span><br /></b></span></pre>
</div>
<div><div><pre style="background: rgb(255, 255, 255); border: none; line-height: 20px; overflow: auto; padding: 16px; text-align: left; width: 99%;"><span style="font-size: 14px;"><b>sudo systemctl enable /usr/lib/systemd/cbmscanner.service<br /></b></span></pre>
</div>
<div><div><br /></div><div><b>5) Configure Keyboard Layout: </b>Edit the keyboard file and ensure we're setup for a US keyboard layout.</div><div>
<div><div><pre style="background: rgb(255, 255, 255); border: none; line-height: 20px; overflow: auto; padding: 16px; text-align: left; width: 99%;"><span style="font-size: 14px;"><b>sudo nano /etc/default/keyboard</b></span></pre>
</div>
<div>
<pre style="background: rgb(255, 255, 255); border: 1px dashed rgb(204, 204, 204); line-height: 20px; overflow: auto; padding: 16px; text-align: left; width: 99%;"><code style="overflow-wrap: normal;"><b style="font-size: 14px;"># KEYBOARD CONFIGURATION FILE
# Consult the keyboard(5) manual page.
<span style="color: red;">XKBMODEL="pc105"
</span></b><span style="color: red; font-size: 14px;"><b>XKBLAYOUT="us"</b></span><b style="font-size: 14px;">
XKBVARIANT=""
XKBOPTIONS=""
BACKSPACE="guess"</b></code></pre>
</div>
<div><div>We can the reboot the Raspberry Pi, the keyboard should then work as intended.</div><div><br /></div><div><br /></div><div><div><h2 style="text-align: left;">All the Educator 64 Files to Download</h2></div><div><ul style="text-align: left;"><li><a href="http://dasteph.com/cgi/pet/files/pet_min_blog_models.zip">The 3D Model Files</a>: Model changed for use with a PI 3A</li><li><a href="http://dasteph.com/cgi/pet/files/pet_mini_blog_gerbers.zip">The PCB Gerber Files</a>: Keyboard, PI daughter Board, Optional Monitor Plugin</li><li><a href="http://dasteph.com/cgi/pet/files/pet_min_blog_decals.zip">The Decals Set</a>: Educator 64 Styling</li><li><a href="http://dasteph.com/cgi/pet/files/cbmscanner.tar">The Python Code</a>: Keyboard Code (See above for required libraries)</li></ul><div><b>Please be sure to refer back to the official <a href="https://commodorepetmini.com/" target="_blank">Commodore PET Mini</a> site for the full build details and project history not covered in this series of blog articles.</b></div></div><div><h3><br style="font-size: 18.72px;" /></h3></div></div>See all entries for this project: <a href="https://www.zx81keyboardadventure.com/2020/05/commodore-educator-64-mini-part-1.html">Part 1</a>, <a href="https://www.zx81keyboardadventure.com/2020/06/commodore-educator-64-mini-part-2.html">Part 2</a> and <a href="https://www.zx81keyboardadventure.com/2020/09/commodore-educator-64-mini-part-3.html">Part 3</a></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div><div><br /></div><div><br /></div></div>David Stephensonhttp://www.blogger.com/profile/11637474307612171656noreply@blogger.com4tag:blogger.com,1999:blog-255603189167868415.post-71093921409932413882020-06-09T17:27:00.030+10:002020-09-14T10:52:17.824+10:00Commodore Educator 64 Mini: Part 2<span><div class="separator" style="clear: both;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgH3rsLLrKnDk7CWi9Y6yaIsReeqB_XPWJSLc0mvfaHP2SU_QvnPbQKom1c0DzFnYLwGqe_PBToijvsdsvOVZYeb4Uf7Mr53UgvgoaN15ECI9XB5jtpU_CvdZ-053vMrKg7fq4Y5wA3Fp3H/s2472/sketch1591589432019.png" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="2472" data-original-width="1524" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgH3rsLLrKnDk7CWi9Y6yaIsReeqB_XPWJSLc0mvfaHP2SU_QvnPbQKom1c0DzFnYLwGqe_PBToijvsdsvOVZYeb4Uf7Mr53UgvgoaN15ECI9XB5jtpU_CvdZ-053vMrKg7fq4Y5wA3Fp3H/w246-h400/sketch1591589432019.png" width="246" /></a>
</div></span><span style="font-size: large;">When I embarked on the Educator 64 journey I had no idea this would end up being my particular quarantine pass time. Who would have thought being stuck at home would be so useful.<br /> <br /> So where are we up to? By the end of <a href="https://draft.blogger.com/#">Part 1</a> I'd covered the printing of the Educator 64 Mini Case and very briefly mentioned sending a keyboard PCB of for manufacturing. This time around I'll get into the design of the keyboard and detail some additional modifications I've made to <a href="https://draft.blogger.com/#">Lorenzo Herreras' Commodore PET Mini</a>.</span><span><br /></span>
<div>
<font size="4"><br /></font>
</div>
<div>
<h2 style="text-align: left;">Mini Keyboards for Tiny LCDs</h2></div><div>On the whole I've not diverted much from the general design of the Commodore PET MINI. The main inclusion is that of the working keyboard, I did however choose to make things slightly easier where possible in other respects.</div>
<div><br /></div>
<div>As I was going to be ordering a PCB for the keyboard I decided I might as well design an extra PCB that would plug into the back of the LCD panel. Lorenzo's PET screen design has you dissecting a ribbon cable, then hand wiring the various bits to the back of the the Waveshare LCD screen. To much effort I thought, a nice little PCB would save all that hand rerouting trouble. I also thought mounting a reassuring yellow glowing LED at the back night add some CRT realism (or not, turned out you can't really see it once installed, oh well).</div><div><br /></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhtZJFZ-ZuaSokurQIuj8azjXoiSr_jjwGTDLz_it1X92rPGVTLLOEMwKhZ89TwjzxxsfJKfA4gZFym6fM_r30oBB19SY2ubgCDE2mtfujIMJz1RKI75dG3064UsuUxnBghww3rCRdIARF8/s688/LCD_connection_PCB.png" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="327" data-original-width="688" height="190" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhtZJFZ-ZuaSokurQIuj8azjXoiSr_jjwGTDLz_it1X92rPGVTLLOEMwKhZ89TwjzxxsfJKfA4gZFym6fM_r30oBB19SY2ubgCDE2mtfujIMJz1RKI75dG3064UsuUxnBghww3rCRdIARF8/w400-h190/LCD_connection_PCB.png" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">LCD Mounting PCB</td></tr></tbody></table><div><br /></div>
<div>I addition to the LCD mounting PCB I took the opportunity to deign and order a Pi Zero sized prototyping board which extended the pin header out and added had just enough space to the end of the board for some diodes and the like. The board was a bit of an after thought, although as it turned out I needed it.</div><div><br /></div>
<h3 style="text-align: left;">Keyboard Design</h3>
<div>
There's no shortage of people out there hacking old Commodore 64s and making
them work with modern equipment. One of the largest set of modifications to
dead 64s is in the re-purposing of their keyboards for use with emulators.
</div>
<div><br /></div>
<div>
To this end the schematics for the 64s keyboard are well know and have been
pretty convincingly documented by Simon Inns on his page
<a href="https://www.waitingforfriday.com/?p=470" target="_blank">Waiting for Friday</a>. Simon interestingly points out that the official Commodore Keyboard
Schematic is wrong; that certainly spared me some confusion as not having a
64 myself I had nothing else to go by other than the published designs.
</div>
<div><br /></div>
<div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;">
<tbody>
<tr>
<td style="text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8FddtxOW1n00DD_oLx74wcenMHnFl4wVXwEva3gYouYEyzp3AhyDb5RndzfirENYcncmubUqRqSGUPl-DEuVSTDsyUG2V-mKaO91E6gsUp4Etreiq7D3dzdU8KCc_LMpBJIqyOplxjJ3E/s2970/pet_min_keyboard_schem.png" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="1765" data-original-width="2970" height="380" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8FddtxOW1n00DD_oLx74wcenMHnFl4wVXwEva3gYouYEyzp3AhyDb5RndzfirENYcncmubUqRqSGUPl-DEuVSTDsyUG2V-mKaO91E6gsUp4Etreiq7D3dzdU8KCc_LMpBJIqyOplxjJ3E/w640-h380/pet_min_keyboard_schem.png" width="640" /></a>
</td>
</tr>
<tr>
<td class="tr-caption" style="text-align: center;">
Commodore Educator 64 Mini Keyboard Circuit
</td>
</tr>
</tbody>
</table>
</div>
<div><br /></div>
<div>
I made one minor change to the keyboard schematic; the inclusion of a jumper
allowing the SHIFT LOCK key to be placed on the same Column as the Restore Key, or in its normal state as an extra LEFT SHIFT key. On a Commodore 64 keyboard
the SHIFT LOCK actually locks in place if pressed, this functionality isn't possible with
the TAC switches I planned on using, so I opened the option to simulate that behaviour in
software latter (This option wasn't to be, read on).
</div>
<div><br /></div>
<div>
With a known working layout for a Commodore keyboard to hand, all that need to
be done was getting all to fit onto a 105x38mm PCB. As mentioned in Part 1 I'd found
the perfectly sized switch in the
<a href="https://au.element14.com/webapp/wcs/stores/servlet/ProductDisplay?catalogId=15001&langId=43&productSeoURL=c-k-components&storeId=10184&partNumber=2908778&krypto=Ee5VLri1FvC376XBl7BbImST99YGQI4nboa0nItVjJN5sWW4xJfK8gpOyVQhJP%2FEmRq8jOeMfMpLkM%2F9Dl34oQ%3D%3D" target="_blank">KMR431G</a>
which has a footprint of 4.2mm x 2.8mm. The resulting layout mimics the design
of a full sized Commodore keyboard. As there are to be no keycaps, Legends
are printed on the PCB, some additional PCB styling gives the impression of
a full space bar and a silk screened separator between the main keyboard and function keys implies the existence of the metal or plastic case shroud.
</div>
<div><br /></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;">
<tbody>
<tr>
<td style="text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtWM7SbVuV5unGuNRkX1BMliLoYPCMBqGSypzo8WHh67CoDZSCWocOffoqXIqKi2ozwkeM1fsHYlDHDHF4XLiRKMuD95WWeJ4nVWDr81jNKGqd5dpsocJoE-Tl2WbmxJ3cxI7TIOR8OYkZ/s3633/20200607_164055.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="1434" data-original-width="3633" height="252" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtWM7SbVuV5unGuNRkX1BMliLoYPCMBqGSypzo8WHh67CoDZSCWocOffoqXIqKi2ozwkeM1fsHYlDHDHF4XLiRKMuD95WWeJ4nVWDr81jNKGqd5dpsocJoE-Tl2WbmxJ3cxI7TIOR8OYkZ/w640-h252/20200607_164055.jpg" width="640" /></a>
</td>
</tr>
<tr>
<td class="tr-caption" style="text-align: center;">
The Commodore Educator 64 Mini Keyboard PCB
</td>
</tr>
</tbody>
</table>
<h3 style="text-align: left;">Reading the Keyboard</h3><div>
<div>
My initial plan was to use an Arduino Proc Micro acting in HID mode for
decoding the keyboard inputs and passing key presses onto the Pi. The other option I'd considered was procuring a
<a href="http://blog.tynemouthsoftware.co.uk/2016/05/commodore-usb-keyboard-kits.html" target="_blank">Commodore USB Keyboard Kit from Tynemouth Software</a>. Both of these methods required a spare USB port on the Raspberry PI,
being that by this time I'd decided to us a Pi 3A+ for the project (which only
has one port) I really didn't have a USB port to spare, particularly if I need
to connect another device such as a joystick.</div>
<div><br /></div>
<div>
A long time ago for the <a href="https://www.zx81keyboardadventure.com/search/label/AZ15" target="_blank">AZ15</a> build I'd considered connecting a ZX81 matrix
keyboard directly to a Pi, but thought the method a little to cumbersome
and unreliable. What I couldn't find at the time was a good way of sending key
presses back to the LINUX kernel, sure you could detect a keypad, but only
in the active program doing the decoding, not much use for emulators.
Fortunately time passes and things get developed and now there are off the
shelf solutions.
</div>
<div><br /></div>
<div>
Enter an article in
<a href="https://www.raspberrypi.org/magpi-issues/MagPi67.pdf" target="_blank">The MagPi</a>
Page 25 by PJ Evans, where he describes, and provides many of the
necessities required for reading a ZX Spectrum Keyboard directly, then injecting those key presses back into the LINUX kernel. This Sounded just
the ticket for the Commodore Educator keyboard, All that's needed are some software libraries,
<a href="https://github.com/tuomasjjrasanen/libsuinput" target="_blank">libsuinput</a>
for handling the kernel injection, and
<a href="http://wiringpi.com/" target="_blank">wiringpi</a> to run some
keyboard scanning code. The only possible road block being the availability of enough free GPIO
ports to handle the Commodore Keyboard.</div>
<div><br /></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;">
<tbody>
<tr>
<td style="text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjujNZm02i5UZMyXelv8j-tGou1JQ7rPS5S6fGzptCGYr4_DfMBrmDrCDxPFD_D_jFTpCzODLNw1BXbyHqkdA9rfLq7N5hiWS0EHcr2CuiDTmvaeg6RD8xnruqem4laihcEno2OUjTtWE4X/s1685/pi-wireing-pet-mini-mod.png" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="1236" data-original-width="1685" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjujNZm02i5UZMyXelv8j-tGou1JQ7rPS5S6fGzptCGYr4_DfMBrmDrCDxPFD_D_jFTpCzODLNw1BXbyHqkdA9rfLq7N5hiWS0EHcr2CuiDTmvaeg6RD8xnruqem4laihcEno2OUjTtWE4X/d/pi-wireing-pet-mini-mod.png" /></a>
</td>
</tr>
<tr>
<td class="tr-caption" style="text-align: center;">
Mapping Raspberry Pi GPIO pins to the Waveshare LCD and C64 Keyboard
</td>
</tr>
</tbody>
</table>
<div><br /></div>
<div>
<div>
At a minimum we need 17 free GPIO ports to read the c64 keyboard (without
worrying about multiplexing), 8 Data lines, 8 Address lines and 1 for
detecting the RESTORE key. In reality I has hoping for 18 spare GPIO pins
so we could enable SHIFT LOCKing. After consulting the
<a href="https://www.waveshare.com/3.5inch-rpi-lcd-a.htm" target="_blank">Waveshare LCD manual</a>
it appeared all requirements could be met, but appearances can be
deceptive.
</div>
<div><br /></div>
<div>
Out of 28 GPIO pins the LCD panel uses 8, leaving 20 pins. Not so fast,
GPIO23 is taken when using analogue audio (which we need) and on testing I
also found GPIO27 and GPIO22 also seemed to be in use by the LCD panel.
That left 17 ports. However GPIO14 & 15 are used as serial lines,
that's now down to 15 ports. Fortunately serial can be disabled in the
<b>/boot/config.txt</b> file. Phew, we have just enough ports free
without having to stuff around with multiplexing.
</div>
</div>
<div><br /></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1F5LnwHNsEwjMBwxWO0wwD8aEVQw6sY7X3aauuxn6H-CrUSBPj5H3NdITn8KCuCNNCer7fK4JIFQ4Golsi3ESu0_WEu0iiXPOARDvo5OLWDNDJIxunAYDHLYxN-sk7cJ1NJssJGl4QX-n/s4032/20200528_173459.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="2268" data-original-width="4032" height="225" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1F5LnwHNsEwjMBwxWO0wwD8aEVQw6sY7X3aauuxn6H-CrUSBPj5H3NdITn8KCuCNNCer7fK4JIFQ4Golsi3ESu0_WEu0iiXPOARDvo5OLWDNDJIxunAYDHLYxN-sk7cJ1NJssJGl4QX-n/w400-h225/20200528_173459.jpg" width="400" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">The rather messy prototyping Board full of Diodes</td></tr></tbody></table><div><br /></div><div>To get things moving along I wired up my prototyping PCB much as documented in <a href="https://www.raspberrypi.org/magpi-issues/MagPi67.pdf" target="_blank">The MagPi</a> article, I adjusting the data and address lines (see earlier image above). I then downloaded the required <a href="https://github.com/mrpjevans/zxscanner" target="_blank">zxscanner</a> code by PJ Evens, modifying sufficiently to accommodate the C64 keyboard, the result a working keyboard.</div>
<div><br /></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUk-gjoAdaNO5N5U-RNwvHFG9-7iju03n6KW5CtHY1zOMSWa20bS1T4qYxXq_nFPg01NOGb5hsMRhCKblzVebeGUUyMeUv-8wLEaDBSTuJFJyPqADTrUUT3KQc_yW50Cun9wakv80-6XCC/s3749/20200524_204948.jpg" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="3749" data-original-width="2268" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUk-gjoAdaNO5N5U-RNwvHFG9-7iju03n6KW5CtHY1zOMSWa20bS1T4qYxXq_nFPg01NOGb5hsMRhCKblzVebeGUUyMeUv-8wLEaDBSTuJFJyPqADTrUUT3KQc_yW50Cun9wakv80-6XCC/w387-h640/20200524_204948.jpg" width="387" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Testing the tiny Commodore 64 Keyboard</td></tr></tbody></table><div style="text-align: center;">
</div>
<div><br /></div>
<div>That is of course just the start, I still need to go back though the zxscanner code and turn it into c64scanner code. As it stands zxscanner is just that, it's geared towards ZX Spectrum emulators, Commodore emulators such as Vice take a somewhat different path when mapping keys from PC-like keyboards and that is something we can tackle in Part 3.</div><div><br /></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyxQMaY4AcK3Ge1PnW9-9bkH6utb_iNIYRuvEABanO0AstVFQA9Uh3g5_Mws2f9GN36wMEOfP5bBhmx4AqZu-g8PnusxmxYYQ4PRzPgmTj8WTta_3mH17PQQV-uYfUzsQMT2UwIATJ0-dW/s5184/1000029.jpg" style="margin-left: auto; margin-right: auto;"><img alt="Commodore Pet Mini" border="0" data-original-height="3888" data-original-width="5184" height="480" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyxQMaY4AcK3Ge1PnW9-9bkH6utb_iNIYRuvEABanO0AstVFQA9Uh3g5_Mws2f9GN36wMEOfP5bBhmx4AqZu-g8PnusxmxYYQ4PRzPgmTj8WTta_3mH17PQQV-uYfUzsQMT2UwIATJ0-dW/w640-h480/1000029.jpg" title="C64 Keyboard Installed and some Decals Added" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">C64 Keyboard Installed and some final Decals Added to the Case</td></tr></tbody></table><div><br /></div><div>Until the next article here's a quick preview of the keyboard in action:</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen="" class="BLOG_video_class" height="266" src="https://www.youtube.com/embed/ilid4WXrDJY" width="320" youtube-src-id="ilid4WXrDJY"></iframe></div><div><br /></div><div><br /></div><div><br /></div><div>See all entries for this project: <a href="https://www.zx81keyboardadventure.com/2020/05/commodore-educator-64-mini-part-1.html">Part 1</a>, <a href="https://www.zx81keyboardadventure.com/2020/06/commodore-educator-64-mini-part-2.html">Part 2</a> and <a href="https://www.zx81keyboardadventure.com/2020/09/commodore-educator-64-mini-part-3.html">Part 3</a></div><div><br /></div><div><br /></div>
<div><br /></div>
</div>
<div class="separator" style="clear: both; text-align: center;"><br /></div>
David Stephensonhttp://www.blogger.com/profile/11637474307612171656noreply@blogger.com0tag:blogger.com,1999:blog-255603189167868415.post-86628429699596982482020-05-30T21:15:00.014+10:002020-09-14T10:51:31.505+10:00Commodore Educator 64 Mini: Part 1<font size="5">What do you do with a new 3D printer, a governmental advised quarantine stay at home order and the freely available plans for a Commodore PET Mini build? Why build a Commodore Educator 64 with a functional keyboard of course.</font><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivUCpCXtDHOcxvmIztM-bO0-v4bz1L2T4zqAoeMj5PXk11HmMUJzBn2w_T3DnuGBMjZhvaP0odx9-xVNsOVfnlDgem2_NCaaqvXj9AhmC22AWBHucONs9FTOsYGwEf41E4biUK_l7rnDtI/" style="margin-left: 1em; margin-right: 1em;"><img alt="Commodore Educator 64 - drawing by David A Stephenson 2020" border="0" data-original-height="1522" data-original-width="1496" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEivUCpCXtDHOcxvmIztM-bO0-v4bz1L2T4zqAoeMj5PXk11HmMUJzBn2w_T3DnuGBMjZhvaP0odx9-xVNsOVfnlDgem2_NCaaqvXj9AhmC22AWBHucONs9FTOsYGwEf41E4biUK_l7rnDtI/w630-h640/commodore_educator_64.png" title="Commodore Educator 64" width="630" /></a></div><div><br /></div><h2 style="text-align: left;">Printing your own PETs.</h2><div><div>A little over a year ago <a href="https://commodorepetmini.com/">Lorenzo Herrera launched the Commodore Pet Mini</a> on the world, a very cute miniature PET model 8032 housing a Raspberry Pi. Nicely he also included all the 3D models and a full material list so you could build your own (and a lot of people have). </div><div><br /></div><div>This all looked like a really fun project, the only problem being I didn't have 3D printer. Then quite unexpectedly and just before the world locked down the family presented me a with a <a href="https://www.flashforge.com/consumer/detail/Finder?id=8" target="_blank">Flash Forge Finder</a> 3D printer for my birthday. Thanks Family!</div><div><br /></div></div><div>And so the initial stage of building a PET (soon to become an Educator 64) Mini began in earnest.</div><div><br /></div><h3 style="text-align: left;">The Making of a Model</h3><div>While the PET mini is quite the functional beauty as is, what with its Pi core, tiny LCD screen and USB ports, it does almost criminally lack the most important part of an early home / office / school computer, a functional keyboard.</div><div><br /></div><div>Before going to far along the process of 3D printing I first need to know if I could get a keyboard to fit into the PET Mini. I managed to find some very diminutive <a href="https://au.element14.com/c-k-components/kmr431g-ulc-lfs/tact-switch-spst-no-0-05a-32vdc/dp/2908778" target="_blank">KMR431G</a> surface mount TAC switches on Element 14, tiny but not tiny enough to build a full PET keyboard.</div><div><br /></div><div>The KMR431G switches would just squeeze in nicely when arranged in a 64 style. As luck would have it the Case design of the PET 8032 (and Lorenzo's 3D model) is near identical to that of a Educator 64. For those that don't know, an Educator 64 is basically a Commodore 64 in a PET case sold primarily to schools; possibly making it the best 80s game playing school computer ever.</div><div><br /></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjnvNXZcB6dmjPZ2iWXr0sZ4mqmdbLBsGdWzJlNfTPiuBuC2lQS9j7dlUlnF_ZnFwGxnZjqQCO3IvviURl_lMROngHB6j0RqPQxCg9p1wam1QAnIVlSeRLPhmglLz_vMVmMXYe8802RTR3G/" style="margin-left: auto; margin-right: auto;"><img alt="Educator 64 Mini Keyboard PCB" border="0" data-original-height="425" data-original-width="1148" height="236" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjnvNXZcB6dmjPZ2iWXr0sZ4mqmdbLBsGdWzJlNfTPiuBuC2lQS9j7dlUlnF_ZnFwGxnZjqQCO3IvviURl_lMROngHB6j0RqPQxCg9p1wam1QAnIVlSeRLPhmglLz_vMVmMXYe8802RTR3G/w640-h236/Educator_64_mini_keyboard_PCB_design.jpeg" title="Commodore Pet Educator 64 Mini Keyboard PCB" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Educator 64 Mini Keyboard PCB</td></tr></tbody></table><div><br />I'll cover the full details of the keyboard and how it's intended to work in Part 2: For now though I <span face="" style="background-color: white; color: #222222; font-size: 16px;">laid</span> out a PCB that followed the C64 key mappings and sent it off for Fabrication. The important part being that I now had the measurements required to adjust the top half of the PET case to fit the keyboard. </div><div><br /></div><h3 style="text-align: left;">Case Adjustments to be Made</h3><div>To fit the keyboard into the Mini I simply cutout the keyboard space from the original model and designed a shelf for the new keyboard PCB to sit on. Additionally I removed the magnet clips which would normally be located under a printed keyboard and replaced these with clips located on either side of the modified case design.</div><div><br /></div><div>Lorenzo provides bottom case templates for Raspberry Pi 2/3's and for the 4. I had a Pi 3A on hand and further modified the lower case to fit that in place. The shorter Pi 3A board would came in handy later when cramming many additional keyboard wires into the case. </div><div><br /></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_G34eWY-cxMO1PohhdLSCuckCRZoIDgMhrEMpwkCpAyqCmBIWEEDeH2EqzS93VvbHiDs6Kwlb5xfWZBoI0HXQNXTl7piZcwT0WKAP9IlGMNoNaggK9hexqtQJ6VTiobtSW9xJG08kd6wt/" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="2911" data-original-width="2262" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_G34eWY-cxMO1PohhdLSCuckCRZoIDgMhrEMpwkCpAyqCmBIWEEDeH2EqzS93VvbHiDs6Kwlb5xfWZBoI0HXQNXTl7piZcwT0WKAP9IlGMNoNaggK9hexqtQJ6VTiobtSW9xJG08kd6wt/d/explode003.png" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Exploded View of the Commodore Educator 64 Mini Case.</td></tr></tbody></table><div><br /></div><div>Unfortunately the cases main top and bottom sections proved slightly too large for my printer. So I broke these down into separate components with some additional tabs put in place to make gluing them together convenient and providing some structural strength. I also decided to divide the monitor stand into a bottom an top piece facilitating slightly easier 3D printing and finishing.</div><div><br /></div><div style="text-align: right;"><br /></div><div>The other large-ish change I made to the original model was in redesigning the monitor frame, that part holding the LCD panel. This I made this slightly wider and a little less ovaloid in keeping with the source material. The clasp holding the monitor in place I also reduced in size considerably, minimising the likelihood of snapping an LCD panel accidentally. </div><div><br /></div><h3 style="text-align: left;">Printing and Finishing the Model</h3><div>With all the adjustments made the model printed out quite easily. Finishing the the plastics took a little extra effort.</div><div><br /></div><div>From other modelling activities I had a set of small files and sandpaper which went to good use. Quite a lot of time went into smoothing of the rougher areas and obvious layering from the 3D printing process. I wasn't intent on removing all traces of the printing technique, the model should reflect the process at least to some extent. </div><div><br /></div><div>Once sanded down and finished, the little Educator 64 parts were spray painted with a couple of colour combinations. The white panels being a mix of Tamiya TS-26 Pure White for the under layers and TS-7 Racing White for the finishing coats, lending a nice retro feel as the Racing White is slightly creamy in colour.</div><div><br /></div><div>The black areas of the model were first painted in Citadel Lead Belcher, although any steel or silvery colour would be just as fine (It just happened to be the colour I had available). The top coat is a Tamiya TS-6 Matt Black, applied relatively lightly, just enough to appear black while allowing the metallic undercoat to maintain some presence. All the components were then sealed with a Satin Spray varnish. The end result being really quite pleasing.</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhssROeGbtlslgyMo7XJyg5hGQti8FUqRXZxyqlQvN4F94Rm0e_Z-fsnmYFN1gBPZPp0rNz3cCDmYgS60YFu53D7nB2455KsV_lFkfbVn-UooGNfm8MoatuszJ26aRUM4Rz6lR6vG-3W7Xl/" style="margin-left: 1em; margin-right: 1em;"><img alt="Commodore Educator 64 Mini based on the Commodore Pet Mini" border="0" data-original-height="2339" data-original-width="2135" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhssROeGbtlslgyMo7XJyg5hGQti8FUqRXZxyqlQvN4F94Rm0e_Z-fsnmYFN1gBPZPp0rNz3cCDmYgS60YFu53D7nB2455KsV_lFkfbVn-UooGNfm8MoatuszJ26aRUM4Rz6lR6vG-3W7Xl/w584-h640/20200529_150939.jpg" title="Commodore Pet Educator 64 Mini" width="584" /></a></div><div><br /></div><h3 style="text-align: left;">Next Time: The Electronics</h3><div>The Educator 64 fits together much as the PET mini. The major electronic components are pretty much listed at <a href="https://commodorepetmini.com/" target="_blank">commodorepetmini.com.</a> In Part 2 I'll attempt to go over how the keyboard is configured and how it works in conjunction with the original PET design.</div><div><br /></div><div><br /></div><div>See all entries for this project: <a href="https://www.zx81keyboardadventure.com/2020/05/commodore-educator-64-mini-part-1.html">Part 1</a>, <a href="https://www.zx81keyboardadventure.com/2020/06/commodore-educator-64-mini-part-2.html">Part 2</a> and <a href="https://www.zx81keyboardadventure.com/2020/09/commodore-educator-64-mini-part-3.html">Part 3</a></div><div><br /></div><div> </div>David Stephensonhttp://www.blogger.com/profile/11637474307612171656noreply@blogger.com1tag:blogger.com,1999:blog-255603189167868415.post-45161004235022653442020-05-12T19:25:00.004+10:002020-06-03T15:34:37.262+10:00TuT-TuT on the Jupiter Ace: Part 2<div><span style="font-size: large;"><font size="4">Welcome to the second and final article on Porting the ZX81 and ZX Spectrum Game Tut-Tut to the Jupiter Ace: This time George Beckett takes us through the gritty details of programming in Forth, leaving few treasures undiscovered in the process.</font></span></div><div><font size="4"><br /></font></div><div><font size="4">If you missed <a href="https://www.zx81keyboardadventure.com/2020/05/tut-tut-on-jupiter-ace-part-1.html">Part 1</a>, be sure to read up before continuing below.</font></div><div><span style="font-size: large;"><br /></span></div><table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody><tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbJPkFy3XasJF9cluUxGSLyP7JXka2se2jS9n5JOy9jw7wmPrzjDgIqtghwNx_wJm3ZbEHH3uzyb3B88mKS2xv2G5kNyCIOPaM-QrNaPD2v6CsJFKBXJihD_NG4bHlKOcy4Ing42lzOcTJ/" style="margin-left: auto; margin-right: auto;"><img alt="Jupiter Ace Game: TuT-TuT" border="0" data-original-height="477" data-original-width="638" height="478" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbJPkFy3XasJF9cluUxGSLyP7JXka2se2jS9n5JOy9jw7wmPrzjDgIqtghwNx_wJm3ZbEHH3uzyb3B88mKS2xv2G5kNyCIOPaM-QrNaPD2v6CsJFKBXJihD_NG4bHlKOcy4Ing42lzOcTJ/w640-h478/tut-tut-ace.png" width="640" /></a></td></tr><tr><td class="tr-caption" style="text-align: center;">Archaeology is just as fun in the Jupiter Ace version of TuT-TuT</td></tr></tbody></table><div><br /></div><h2>The Forth Tut-Tut is Ace</h2>Previously, I told you a little about what motivated me to port Tut-tut to the Ace and promised to describe how the game is written. However, before we get on to the game, I should explain a bit about the Forth language, which was developed in the late 1960s for the control system of a telescope. Since then, its scope has grown, being used for a range of scientific and other serious applications in the 1980s and 90s. Even today, Forth lives on and can be found at the heart of various embedded systems.<br />
<br />
The basis of any Forth system is a dictionary of words that encapsulate the functions of the machine. There are simple words for manipulating data (bytes of memory) or performing rudimentary arithmetic, as well as more complex words for printing on the screen, making sound, and saving or loading files. The programmer combines these words together to make new words, continuing to build up the functionality until the final program is represented by one top-level word. In that way, writing a Forth program is a bottom-up process, starting at the lowest-level elements and working up. In contrast, the design of a Forth program is a top-down process. You iteratively break the program’s function down into smaller and smaller elements until you reach the level of the built-in words.<br />
<br />
The overall structure of Tut-tut is relatively simple, with the player completing a sequence of levels, which involves collecting objects, unlocking doors, dodging mummies and finding the exit. The bulk of the logic is in how each level plays: how the player navigates the maze, collects objects and is chased by the mummies. <br />
<br />
In Rabbit Run, the core of the game was a loop in which the player first had the opportunity to make their move and then each possible outcome was tested for—in that case, eating carrots, falling down mole holes, or being caught by a fox. At the end of the loop, the fox made their move and it was back to the beginning. The same game loop could be used for Tut-tut, though replacing foxes by mummies, carrots by gems, and so on.<br />
<br />
For both Rabbit Run and Tut-tut, the game state is held in the display buffer. For example, to check the location the player wants to move to, you look up what is there in the display buffer. This is useful for saving both memory and time. In Tut-tut (and Rabbit Run) on the ZX Spectrum, objects are distinguished by colour. This makes it very fast to check what an object is by looking up its colour using the <span style="font-family: "courier new", courier, monospace;">ATTRIB</span> function (or <span style="font-family: "courier new", courier, monospace;">PEEK</span>-ing the right location in the display buffer). The Ace has a monochrome display, so this approach does not carry over immediately. However, the Ace display is very simple, formed from a two-dimensional array of characters, just like the attributes on the Spectrum is as two-dimensional array of colour values, and so it should be just as quick to look up the character code in the Ace’s screen memory as it is to look up a colour on the Spectrum. Thus, a crucial word to define in the Forth version of Tut-tut is <span style="font-family: "courier new", courier, monospace;">SCREEN</span>, which retrieves the character at a particular location in the level:<br />
<br />
<span style="font-family: "courier new", courier, monospace;"><b> : SCREEN ( X Y -- CHAR ) <br /> SWAP 32 * + ( 32 CHARS PER ROW )<br /> 9216 + ( START OF SCREEN MEMORY )<br /> C@<br /> ;</b></span><br />
<br />
For player movement, I decided to use the Rabbit Run core as the starting point for Tut-tut, though there were some differences. Surprisingly, Ace Forth does not include a <span style="font-family: "courier new", courier, monospace;">CASE</span> statement (which would allow a number of different program paths to be followed depending on the value of an input field—such as, a key-press or the object at a location). For example:<br />
<br />
<span style="font-family: "courier new", courier, monospace;"><b> ( X Y -- NEW_X NEW_Y )<br /> INKEY<br /> CASE<br /> ASCII P OF 1+ ENDOF ( RIGHT )<br /> ASCII O OF 1- ENDOF ( LEFT )<br /> ASCII A OF SWAP 1+ SWAP ENDOF ( DOWN )<br /> ASCII Q OF SWAP 1- SWAP ENDOF ( UP )<br /> ENDCASE</b></span><br />
<br />
Sadly, there is no <span style="font-family: "courier new", courier, monospace;">CASE</span> word in Ace Forth, so the above code would not work. I investigated options to implement a <span style="font-family: "courier new", courier, monospace;">CASE</span> structure (a big selling point of Forth is the ability to add your own commands). However, while I found a few candidates on the Internet and in 1980’s magazines, none of them proved to be very effective nor reliable. I therefore decided to use brute force, writing multiple <span style="font-family: "courier new", courier, monospace;">IF</span> statements. This is an ugly approach though has proved adequate for Tut-tut. <br />
<br />
Another weakness of FORTH (and, to a lesser extent, BASIC) is that it is difficult to define large input datasets—in this case, I was thinking about how to get the data for game levels into the game. In the BASIC version, David used <span style="font-family: "courier new", courier, monospace;">DATA</span> statements, <span style="font-family: "courier new", courier, monospace;">RESTORE</span>-ing to the correct line and then <span style="font-family: "courier new", courier, monospace;">READ</span>-ing the data for each level. However, FORTH does not have a <span style="font-family: "courier new", courier, monospace;">DATA</span> statement and the method for entering data described in the Ace manual is very laborious. In the end, I decided to bypass FORTH and to define the level data in binary code blocks to be loaded into memory inside suitable <span style="font-family: "courier new", courier, monospace;">ALLOT</span>’ed arrays. For example:<br />
<br />
<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0y-rPYpDRAmERBbNBAUrTu7x6QdMNcNJv10lDpGIW5tF3GwjWq0U_n8LDtMMeOQ8zgX_svB0F4R2nUeTJ9h0T972yR0yh0HqDKN5qfH-s3PpU7XyQeObtcIiS0bqy1VffGzKVD8FLUgs/s1600/tut-tut_charset.png" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" data-original-height="236" data-original-width="169" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0y-rPYpDRAmERBbNBAUrTu7x6QdMNcNJv10lDpGIW5tF3GwjWq0U_n8LDtMMeOQ8zgX_svB0F4R2nUeTJ9h0T972yR0yh0HqDKN5qfH-s3PpU7XyQeObtcIiS0bqy1VffGzKVD8FLUgs/s1600/tut-tut_charset.png" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Tut-tut UDGs and character codes on the Ace.</td></tr>
</tbody></table>
<b><span style="font-family: "courier new", courier, monospace;"> ( RESERVES 4,000 BYTES FOR LEVEL DATA )</span><br />
<span style="font-family: "courier new", courier, monospace;"> CREATE GAMELEVELS 4000 ALLOT <br /> GAMELEVELS 4000 BLOAD tut-tut.lev </span></b><br />
<br />
There is a reasonable amount of logic involved in drawing each level in Tut-tut, as a level is stored in a compressed form to save memory. In the original ZX Spectrum version, a technique based on trios of character cells was use to reduce the memory requirements of a level by a factor of three. However, since finishing the BASIC version, David updated the compression strategy to one inspired by the GIF image format and described on his website [<a href="http://www.zx81keyboardadventure.com/2017/02/lode-runner-on-zx81-part-2-level-design.html">link</a>]. This gives better compression and has been used in the ZX81 version to allow more levels to be added. Given that David planned to back-port his new compression algorithm to the ZX Spectrum, I decided to adopt the GIF-inspired approach for the Ace.<br />
<br />
On the Ace version of Tut-tut, the logic for drawing a level is encoded in a word called <span style="font-family: "courier new", courier, monospace;">DRAWLEVEL</span>. Using Forth is an advantage here, as it excels at integer arithmetic, which is fundamental to how the encoding works. The only complication, for the Ace version, comes because I needed to remap the character values encoded in the (ZX81) level data onto the correct Ace character codes. For example, in David’s level encoding, the four sliding walls are represented by values 5, 6, 7, and 8. For the Ace version, I need to map these onto inverse-video ASCII characters 177, 178, 179, and 180. The same is true for the keys, gems, bracelets, and so on. This remapping of the character encoding represents the majority of the work of <span style="font-family: "courier new", courier, monospace;">DRAWLEVEL</span>, as you can see if you look at the source code. <br />
<br />
As well as level data, Tut-tut also contains a reasonable amount of text for the instructions and splash screen, plus user-defined graphics. I also encoded these into two other binary code blocks, called <span style="font-family: "courier new", courier, monospace;">MESSAGES</span> and <span style="font-family: "courier new", courier, monospace;">CHARSET</span>, respectively. <span style="font-family: "courier new", courier, monospace;">CHARSET</span> includes two sets of graphics. There are stylised versions of capital letters that overwrite the default bitmaps for these letters, the same as on the ZX Spectrum version, and a set of objects, held in character code 1—14 (except character 13, which is reserved for carriage return). <br />
<br />
Otherwise, the port to Ace Forth was relatively straightforward (accepting I needed to brush up on my Forth skills). I tried to follow good Forth programming practice and to keep the most important game data (the position of the player plus temporary variables) on the stack. This, and the fact that the state of the level is kept in the display memory, means there are relatively few variables needed: for score, air, keys, mummy locations, and a couple of useful flags to help in quickly exiting from the depths of program loops.<br />
<br />
Some words involve a fair amount of stack acrobatics, which is a common trait of Forth programs. A particularly complex stack is required for the word <span style="font-family: "courier new", courier, monospace;">CHECKLOCK</span> (which moves a sliding wall, if possible). At one point, <span style="font-family: "courier new", courier, monospace;">CHECKLOCK</span> has a stack depth of 14 numbers, to hold the various permutations of player moving a sliding wall, not having the right key, and/ or a sliding wall being unable to move because of a blocking object behind it. <br />
<br />
The word <span style="font-family: "courier new", courier, monospace;">MOVEMUMMY</span> also descends into some scary stack manipulation when the mummy needs to change direction. What was a relatively simple logic in the BASIC version, to make the mummy follow the player, proved particularly challenging in Forth, because I tried to avoid using variables as much as possible. <span style="font-family: "courier new", courier, monospace;">MOVEMUMMY</span> is the element of the program that I most struggled with, spending a good few hours debugging mummies that wandered off the screen or worse still teleported into other parts of the Ace’s memory, typically causing it to crash.<br />
<br />
Talking about debugging, this was one of my bugbears with Ace Forth. The programming environment on the Ace is not typical for Forth. Most contemporary versions of Forth required the programmer to enter program source code into screens, which correspond to space reservation on disk (or tape). Manipulating screens was often a clumsy process, though it did mean the programmer could access and change any part of the program at any time. <br />
<br />
Instead, on the Ace, you interactively develop the dictionary using <span style="font-family: "courier new", courier, monospace;">:</span> (colon), <span style="font-family: "courier new", courier, monospace;">EDIT</span>, and <span style="font-family: "courier new", courier, monospace;">REDEFINE</span>, creating the new words that make up your program in the active dictionary. If you need to fix a bug or change a word, you must first <span style="font-family: "courier new", courier, monospace;">EDIT</span> the word, which creates a second copy of the word at the top of the dictionary. Then, to get rid of the old version of the word and update any references to the old definition, you must remember to <span style="font-family: "courier new", courier, monospace;">REDEFINE</span> the word, otherwise you can quickly end up with confused dictionaries with multiple versions of a word in use. Because the dictionary is a stack of words, if you forget to <span style="font-family: "courier new", courier, monospace;">REDEFINE</span> a word after changing it, and then define further words, you end up trapped in a situation where you cannot remove the out-of-date version of the word nor can you update the definition of any other words that link to that out-of-date version. The only work around is to <span style="font-family: "courier new", courier, monospace;">FORGET</span> everything that you did afterwards and then re-enter the lost words. On my first attempt at Tut-tut, I fell into this trap on several occasions, and ended up with a hopelessly corrupted dictionary with stale links that made the game unstable. <br />
<br />
Eventually, it became clear I needed to start again, from scratch. This was not all bad, as it gave me the opportunity to fix some wrong decisions I had made in that first attempt. I suspect that when writing a program on the Ace, this was a relatively common requirement. Unless you have a very thorough design, the first attempt at a program was likely to end up as a prototype, because once you had moved on from a word definition, you could not go back.<br />
<br />
Debugging is not a strong point for Ace Forth (nor Forth, in general). The common trick from the 1980s (because no one does that now!) of adding print statements at key points in a program is slightly more tricky in Forth, as you have to make sure not to affect the state of the stack. The Ace User Guide has a useful word, named <span style="font-family: "courier new", courier, monospace;">.S</span>, which prints out a full copy of the stack without affecting it. I took <span style="font-family: "courier new", courier, monospace;">.S</span> and extended it a little, so that the stack is printed on the first line of the display (a line that is not used in Tut-tut):<br />
<br />
<span style="font-family: "courier new", courier, monospace;"><b>: .S ( -- ) ( PRINT STACK ) <br /> 15419 @ HERE 12 + ( FIND THE TOP AND BOTTOM OF THE STACK )<br /> OVER OVER – ( IF TOP = BOTTOM, WE ARE DONE )<br /> IF<br /> DO<br /> I @ . 2<br /> +LOOP<br /> ELSE<br /> DROP DROP<br /> THEN<br />;<br /><br />: .T ( PRINT STACK ON ROW 0 )<br /> 0 0 AT 32 SPACES ( CLEAR ANY PREVIOUS TEXT )<br /> 0 0 AT .S<br />;</b></span><br />
<br />
Otherwise, debugging typically meant studying the source code and manually tracking the changes to the state of the stack after each line. It was sometimes quite laborious; though I noticed, as the game developed, I tended to make fewer mistakes, so suspect my Forth competence was growing. I also found useful tips by looking at other people’s code, especially some of the old magazine listings archived on www.jupiter-ace.co.uk, as well as the Ace ROM disassembly [link].<br />
<br />
The full listing of Tut-tut is available on GitHub [<a href="https://github.com/markgbeckett/jupiter_ace/tree/master/tut-tut">link</a>]. There are four files. The main file, called ‘tut-tut.fs’, is the Forth source for all of the words, including constants, arrays, and a small amount of machine code. The other three files contain the level data ‘tut-tut_levels.asm’, the help text ‘tut-tut_messages.asm’, and the user-defined graphics ‘tut-tut_charset.asm’. These need to be assembled using a Z80 assembler, such as <span style="font-family: "courier new", courier, monospace;">Z80ASM</span> [<a href="https://savannah.nongnu.org/projects/z80asm">https://savannah.nongnu.org/projects/z80asm</a>], to create binary files that can then be inserted into the memory on an Ace emulator, such as EightyOne; into arrays called <span style="font-family: "courier new", courier, monospace;">GAMELEVELS</span>, <span style="font-family: "courier new", courier, monospace;">MESSAGES</span>, and <span style="font-family: "courier new", courier, monospace;">CHARSET</span>, respectively, which have been pre-allocated appropriately.<br />
<br />
The process for inserting the binary blocks is a little involved, so I outline it here for <span style="font-family: "courier new", courier, monospace;">GAMELEVELS</span>.<br />
<br />
1. First, assemble the source file ‘tut-tut_levels.asm’ and make sure to write a label file, so you can work out how big the binary block is. Using Z80ASM, the following command would do the trick:<br />
<br />
<b><span style="font-family: "courier new", courier, monospace;">z80asm –L –o tut-tut_levels.bin tut-tut_levels.asm</span><br /></b>
<br />
The block is assembled to address 0x0000, though this is not significant. If you print the labels, you should see a label END, which is used to work out the length of the block. At the time of writing, my test version has three levels and END is reported as 0x017D (or, decimal 381).<br />
<br />
2. In your Ace emulator, with your in-progress Tut-tut dictionary loaded, create some space for the game levels, with:<br />
<br />
<b><span style="font-family: "courier new", courier, monospace;">CREATE GAMELEVELS 381 ALLOT</span><br /></b>
<br />
—substituting the right value for the length of the block.<br />
<br />
3. Check where <span style="font-family: "courier new", courier, monospace;">GAMELEVELS</span> is located in memory, using<br />
<br />
<span style="font-family: "courier new", courier, monospace;"><b>GAMELEVELS</b> .</span><br />
<br />
—and use the address returned as the start point to which you load the block—for example, using [File] [Load Memory Block] on EightyOne.<br />
<br />
4. If necessary, remember to:<br />
<br />
<b><span style="font-family: "courier new", courier, monospace;">REDEFINE GAMELEVELS</span><br /></b>
<br />
—if you have a previous version of the array earlier in the dictionary.<br />
<br />
I hope you will agree that the Ace version of Tut-tut is a reasonable tribute to David Stephenson’s original and that you will consider attempting to type in the game. I never found a way to automatically output the program from EightOne, so tut-tut.fs has been transcribed by hand. This means I have almost certainly made some mistakes—just like back in the 1980s!<br />
<br />
Having written the game, I have come to like Forth a little more, and I have developed a fondness for the Jupiter Ace. Richard and Steven were right that a micro powered by Forth is better able to run software without the need for machine code and I suspect I would indeed have produced more useful programs if I had discovered Forth in the 1980s. I like to think I would have been happy had I owned a Jupiter Ace rather than a ZX Spectrum, when I was younger. However, I suspect I would have been envious of my Commodore- and Spectrum-owning friends and would have missed classic games like Jet Pac and Manic Miner too much.<div><br /></div><div><br /></div>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-255603189167868415.post-31068710200920448062020-05-05T10:29:00.004+10:002020-06-03T15:34:57.234+10:00TuT-TuT on the Jupiter Ace: Part 1<br />
<div class="MsoNormal">
<span style="font-size: large;">Exciting news this week as Tut-Tut launches on the Jupiter Ace: As a special treat to celebrate, guest blogger George Beckett takes us through his journey in porting the game to the Forth Language an onto the Jupiter Ace.</span><br />
<span style="font-size: large;"><br /></span>
<span style="font-size: large;">George has spent the last few months converting the original BASIC source listings and some of the latter adaptations made for the ZX81 and 2020 Spectrum versions of the game.</span><br />
<span style="font-size: large;"><br /></span>
<span style="font-size: large;">Join us for a new series of articles as we dig up an ancient micro treasure and explore the depths of game conversion.</span><br />
<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcZNOYeAyrRY31I0buu9jq_iKo7GX3cjs0bvaRmWxoFFfqJWhrC8_GxFIMuA6F0K9cp3_fuQC5c_qLk7dYonWr_uPWauO0TGmF-Li2UIjFGboyvFEPOnrUxEKKaFec5kaRtMmMfus5Xdpo/s1600/tut-tut-evolution.png" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="300" data-original-width="1600" height="120" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcZNOYeAyrRY31I0buu9jq_iKo7GX3cjs0bvaRmWxoFFfqJWhrC8_GxFIMuA6F0K9cp3_fuQC5c_qLk7dYonWr_uPWauO0TGmF-Li2UIjFGboyvFEPOnrUxEKKaFec5kaRtMmMfus5Xdpo/s640/tut-tut-evolution.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Evolution of Tut-Tut: ZX Spectrum BASIC, ZX81, ZX Spectrum 2020 Edition, Jupiter Ace.</td></tr>
</tbody></table>
<h2>
Porting TuT-TuT to the ACE</h2>
Towards the end of August (2019), David Stephenson (a.k.a.
zx81adventures) started posting screenshots, on Twitter, from a new ZX Spectrum
game that he was working on. The previews showed an arcade, maze game with
bright, clear graphics and an Ancient Egyptian theme. What made the game stand
out was that David was using Sinclair BASIC to write the entire game: it was to
be a type-in game, harking back to the 1980’s home computing scene, when it was
not uncommon to invest many hours into typing in, debugging, and playing such
games. Given Sinclair BASIC’s sluggish performance and appetite for consuming
memory, David needed to employ some careful tuning and compression tricks to achieve
reasonable speed from, and to fit the game into, the rubber-keyed 48k Spectrum.<br />
<br /></div>
<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9Ft-MHwt_WQuLSP9JZYgnoyX_9JbBTprbV0zBBWu0kolNkAeCbJ9e6NtdCREtrbqOX6ElKL-qfDdEwTlsIF48CQL-mlcCcvbcle-qsUZDQsYK75ZB6JYmv68_tknk9h33IAGp-TDfFC8/s1600/zx-spectrum_tut-tut.png" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" data-original-height="287" data-original-width="381" height="482" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9Ft-MHwt_WQuLSP9JZYgnoyX_9JbBTprbV0zBBWu0kolNkAeCbJ9e6NtdCREtrbqOX6ElKL-qfDdEwTlsIF48CQL-mlcCcvbcle-qsUZDQsYK75ZB6JYmv68_tknk9h33IAGp-TDfFC8/s640/zx-spectrum_tut-tut.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Very Early BASIC version of Tut-Tut on the ZX Spectrum.</td></tr>
</tbody></table>
<div class="MsoNormal">
The game,
called Tut-tut, was finally published in the online retro-computing magazine
Paleotronic in early November [<span class="MsoHyperlink"><a href="https://paleotronic.com/2019/11/05/tut-tut-a-new-game-for-the-zx-spectrum/">link</a></span>],
along with a YouTube review and taster from Villordsutch [<span class="MsoHyperlink"><a href="https://www.youtube.com/watch?v=8xuOXKiVxmw&app=desktop">link</a></span>].
Those who did not want to type in the game could download a copy from
Paleotronic’s website. However, the download included a subtle warning that it was
not quite complete: If you wanted to be sure of having the full game, you
needed to invest the time to type it in yourself.<br />
<br /></div>
<div class="MsoNormal">
Tut-tut had some similarities to a very rudimentary game I
had made, called Rabbit Run, as part of a series of articles I had written on
programming for the Spectrum Show Magazine (issues 16—26) [<span class="MsoHyperlink"><a href="http://www.thespectrumshow.co.uk/Magazines.aspx">link</a></span>].
I had produced a few different versions, including several BASIC versions, a
machine-code version, and—a little more unusually—a version written in Forth.
The Forth version of Rabbit Run worked surprisingly well, being similar in
speed and size to the machine code version, though being much quicker to write.<br />
<br /></div>
<div class="MsoNormal">
I started to think about revisiting my Forth version of
Rabbit Run and using it as the basis for a port of Tut-tut. However, rather
than write it for the ZX Spectrum, I decided I would try to write it for the
Jupiter Ace, a less well-known British micro from the early 1980s that was
unusual in that it had Forth as its built-in language, rather than the ubiquitous
BASIC.<br />
<br /></div>
<div class="MsoNormal">
The Ace was developed by Richard Altwasser and Steven
Vickers, who had been designers at Sinclair Research until they left to form
their own company called Jupiter Cantab. The Ace was their first (and only)
computer, and was launched in 1983. The Ace had much in common with the ZX81,
which almost certainly inspired it but, by using Forth instead of BASIC, the
limited RAM (2 kilobytes, built-in, usable) was much less of a constraint than had been the case for the ZX81.
<br />
<br /></div>
<div class="MsoNormal">
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTxrZvcp4lC7zn2V593Vp9i6EiqE4fVUSai2t_tKKPOdRr-rQdEOkLug2VPaNKr_eSWbaVGQdta4seSzVXaIsn4S0qPnRUGMWWRQag61YJRzXMWeZxMWEzDE_Hme_EP1cjG2PtQmJ0IUI/s1600/jupiter_ace_advert.png" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="333" data-original-width="545" height="391" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgTxrZvcp4lC7zn2V593Vp9i6EiqE4fVUSai2t_tKKPOdRr-rQdEOkLug2VPaNKr_eSWbaVGQdta4seSzVXaIsn4S0qPnRUGMWWRQag61YJRzXMWeZxMWEzDE_Hme_EP1cjG2PtQmJ0IUI/s640/jupiter_ace_advert.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><div class="MsoCaption">
Source -
https://k1.spdns.de/Vintage/Sinclair/80/Jupiter%20Ace/Advertisements/</div>
<!--[if gte mso 9]><xml>
<o:OfficeDocumentSettings>
<o:AllowPNG/>
</o:OfficeDocumentSettings>
</xml><![endif]--><!--[if gte mso 9]><xml>
<w:WordDocument>
<w:View>Normal</w:View>
<w:Zoom>0</w:Zoom>
<w:TrackMoves/>
<w:TrackFormatting/>
<w:PunctuationKerning/>
<w:ValidateAgainstSchemas/>
<w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
<w:IgnoreMixedContent>false</w:IgnoreMixedContent>
<w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
<w:DoNotPromoteQF/>
<w:LidThemeOther>EN-GB</w:LidThemeOther>
<w:LidThemeAsian>X-NONE</w:LidThemeAsian>
<w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript>
<w:Compatibility>
<w:BreakWrappedTables/>
<w:SnapToGridInCell/>
<w:WrapTextWithPunct/>
<w:UseAsianBreakRules/>
<w:DontGrowAutofit/>
<w:SplitPgBreakAndParaMark/>
<w:EnableOpenTypeKerning/>
<w:DontFlipMirrorIndents/>
<w:OverrideTableStyleHps/>
</w:Compatibility>
<m:mathPr>
<m:mathFont m:val="Cambria Math"/>
<m:brkBin m:val="before"/>
<m:brkBinSub m:val="--"/>
<m:smallFrac m:val="off"/>
<m:dispDef/>
<m:lMargin m:val="0"/>
<m:rMargin m:val="0"/>
<m:defJc m:val="centerGroup"/>
<m:wrapIndent m:val="1440"/>
<m:intLim m:val="subSup"/>
<m:naryLim m:val="undOvr"/>
</m:mathPr></w:WordDocument>
</xml><![endif]--><!--[if gte mso 9]><xml>
<w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="false"
DefSemiHidden="false" DefQFormat="false" DefPriority="99"
LatentStyleCount="371">
<w:LsdException Locked="false" Priority="0" QFormat="true" Name="Normal"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 1"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 2"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 3"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 4"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 5"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 6"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 7"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 8"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 9"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 6"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 7"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 8"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 9"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 1"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 2"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 3"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 4"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 5"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 6"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 7"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 8"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 9"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Normal Indent"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="footnote text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="annotation text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="header"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="footer"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index heading"/>
<w:LsdException Locked="false" Priority="35" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="caption"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="table of figures"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="envelope address"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="envelope return"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="footnote reference"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="annotation reference"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="line number"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="page number"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="endnote reference"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="endnote text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="table of authorities"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="macro"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="toa heading"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Bullet"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Number"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Bullet 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Bullet 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Bullet 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Bullet 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Number 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Number 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Number 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Number 5"/>
<w:LsdException Locked="false" Priority="10" QFormat="true" Name="Title"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Closing"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Signature"/>
<w:LsdException Locked="false" Priority="1" SemiHidden="true"
UnhideWhenUsed="true" Name="Default Paragraph Font"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text Indent"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Continue"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Continue 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Continue 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Continue 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Continue 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Message Header"/>
<w:LsdException Locked="false" Priority="11" QFormat="true" Name="Subtitle"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Salutation"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Date"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text First Indent"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text First Indent 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Note Heading"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text Indent 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text Indent 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Block Text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Hyperlink"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="FollowedHyperlink"/>
<w:LsdException Locked="false" Priority="22" QFormat="true" Name="Strong"/>
<w:LsdException Locked="false" Priority="20" QFormat="true" Name="Emphasis"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Document Map"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Plain Text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="E-mail Signature"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Top of Form"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Bottom of Form"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Normal (Web)"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Acronym"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Address"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Cite"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Code"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Definition"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Keyboard"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Preformatted"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Sample"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Typewriter"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Variable"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Normal Table"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="annotation subject"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="No List"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Outline List 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Outline List 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Outline List 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Simple 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Simple 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Simple 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Classic 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Classic 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Classic 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Classic 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Colorful 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Colorful 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Colorful 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Columns 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Columns 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Columns 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Columns 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Columns 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 6"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 7"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 8"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 6"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 7"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 8"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table 3D effects 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table 3D effects 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table 3D effects 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Contemporary"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Elegant"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Professional"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Subtle 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Subtle 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Web 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Web 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Web 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Balloon Text"/>
<w:LsdException Locked="false" Priority="39" Name="Table Grid"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Theme"/>
<w:LsdException Locked="false" SemiHidden="true" Name="Placeholder Text"/>
<w:LsdException Locked="false" Priority="1" QFormat="true" Name="No Spacing"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading"/>
<w:LsdException Locked="false" Priority="61" Name="Light List"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 1"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 1"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 1"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 1"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 1"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 1"/>
<w:LsdException Locked="false" SemiHidden="true" Name="Revision"/>
<w:LsdException Locked="false" Priority="34" QFormat="true"
Name="List Paragraph"/>
<w:LsdException Locked="false" Priority="29" QFormat="true" Name="Quote"/>
<w:LsdException Locked="false" Priority="30" QFormat="true"
Name="Intense Quote"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 1"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 1"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 1"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 1"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 1"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 1"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 1"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 1"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 2"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 2"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 2"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 2"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 2"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 2"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 2"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 2"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 2"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 2"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 2"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 2"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 2"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 2"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 3"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 3"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 3"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 3"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 3"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 3"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 3"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 3"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 3"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 3"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 3"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 3"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 3"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 3"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 4"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 4"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 4"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 4"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 4"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 4"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 4"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 4"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 4"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 4"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 4"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 4"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 4"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 4"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 5"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 5"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 5"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 5"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 5"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 5"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 5"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 5"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 5"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 5"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 5"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 5"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 5"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 5"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 6"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 6"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 6"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 6"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 6"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 6"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 6"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 6"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 6"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 6"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 6"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 6"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 6"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 6"/>
<w:LsdException Locked="false" Priority="19" QFormat="true"
Name="Subtle Emphasis"/>
<w:LsdException Locked="false" Priority="21" QFormat="true"
Name="Intense Emphasis"/>
<w:LsdException Locked="false" Priority="31" QFormat="true"
Name="Subtle Reference"/>
<w:LsdException Locked="false" Priority="32" QFormat="true"
Name="Intense Reference"/>
<w:LsdException Locked="false" Priority="33" QFormat="true" Name="Book Title"/>
<w:LsdException Locked="false" Priority="37" SemiHidden="true"
UnhideWhenUsed="true" Name="Bibliography"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="TOC Heading"/>
<w:LsdException Locked="false" Priority="41" Name="Plain Table 1"/>
<w:LsdException Locked="false" Priority="42" Name="Plain Table 2"/>
<w:LsdException Locked="false" Priority="43" Name="Plain Table 3"/>
<w:LsdException Locked="false" Priority="44" Name="Plain Table 4"/>
<w:LsdException Locked="false" Priority="45" Name="Plain Table 5"/>
<w:LsdException Locked="false" Priority="40" Name="Grid Table Light"/>
<w:LsdException Locked="false" Priority="46" Name="Grid Table 1 Light"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark"/>
<w:LsdException Locked="false" Priority="51" Name="Grid Table 6 Colorful"/>
<w:LsdException Locked="false" Priority="52" Name="Grid Table 7 Colorful"/>
<w:LsdException Locked="false" Priority="46"
Name="Grid Table 1 Light Accent 1"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 1"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 1"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 1"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 1"/>
<w:LsdException Locked="false" Priority="51"
Name="Grid Table 6 Colorful Accent 1"/>
<w:LsdException Locked="false" Priority="52"
Name="Grid Table 7 Colorful Accent 1"/>
<w:LsdException Locked="false" Priority="46"
Name="Grid Table 1 Light Accent 2"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 2"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 2"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 2"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 2"/>
<w:LsdException Locked="false" Priority="51"
Name="Grid Table 6 Colorful Accent 2"/>
<w:LsdException Locked="false" Priority="52"
Name="Grid Table 7 Colorful Accent 2"/>
<w:LsdException Locked="false" Priority="46"
Name="Grid Table 1 Light Accent 3"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 3"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 3"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 3"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 3"/>
<w:LsdException Locked="false" Priority="51"
Name="Grid Table 6 Colorful Accent 3"/>
<w:LsdException Locked="false" Priority="52"
Name="Grid Table 7 Colorful Accent 3"/>
<w:LsdException Locked="false" Priority="46"
Name="Grid Table 1 Light Accent 4"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 4"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 4"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 4"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 4"/>
<w:LsdException Locked="false" Priority="51"
Name="Grid Table 6 Colorful Accent 4"/>
<w:LsdException Locked="false" Priority="52"
Name="Grid Table 7 Colorful Accent 4"/>
<w:LsdException Locked="false" Priority="46"
Name="Grid Table 1 Light Accent 5"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 5"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 5"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 5"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 5"/>
<w:LsdException Locked="false" Priority="51"
Name="Grid Table 6 Colorful Accent 5"/>
<w:LsdException Locked="false" Priority="52"
Name="Grid Table 7 Colorful Accent 5"/>
<w:LsdException Locked="false" Priority="46"
Name="Grid Table 1 Light Accent 6"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 6"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 6"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 6"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 6"/>
<w:LsdException Locked="false" Priority="51"
Name="Grid Table 6 Colorful Accent 6"/>
<w:LsdException Locked="false" Priority="52"
Name="Grid Table 7 Colorful Accent 6"/>
<w:LsdException Locked="false" Priority="46" Name="List Table 1 Light"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark"/>
<w:LsdException Locked="false" Priority="51" Name="List Table 6 Colorful"/>
<w:LsdException Locked="false" Priority="52" Name="List Table 7 Colorful"/>
<w:LsdException Locked="false" Priority="46"
Name="List Table 1 Light Accent 1"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 1"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 1"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 1"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 1"/>
<w:LsdException Locked="false" Priority="51"
Name="List Table 6 Colorful Accent 1"/>
<w:LsdException Locked="false" Priority="52"
Name="List Table 7 Colorful Accent 1"/>
<w:LsdException Locked="false" Priority="46"
Name="List Table 1 Light Accent 2"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 2"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 2"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 2"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 2"/>
<w:LsdException Locked="false" Priority="51"
Name="List Table 6 Colorful Accent 2"/>
<w:LsdException Locked="false" Priority="52"
Name="List Table 7 Colorful Accent 2"/>
<w:LsdException Locked="false" Priority="46"
Name="List Table 1 Light Accent 3"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 3"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 3"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 3"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 3"/>
<w:LsdException Locked="false" Priority="51"
Name="List Table 6 Colorful Accent 3"/>
<w:LsdException Locked="false" Priority="52"
Name="List Table 7 Colorful Accent 3"/>
<w:LsdException Locked="false" Priority="46"
Name="List Table 1 Light Accent 4"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 4"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 4"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 4"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 4"/>
<w:LsdException Locked="false" Priority="51"
Name="List Table 6 Colorful Accent 4"/>
<w:LsdException Locked="false" Priority="52"
Name="List Table 7 Colorful Accent 4"/>
<w:LsdException Locked="false" Priority="46"
Name="List Table 1 Light Accent 5"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 5"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 5"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 5"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 5"/>
<w:LsdException Locked="false" Priority="51"
Name="List Table 6 Colorful Accent 5"/>
<w:LsdException Locked="false" Priority="52"
Name="List Table 7 Colorful Accent 5"/>
<w:LsdException Locked="false" Priority="46"
Name="List Table 1 Light Accent 6"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 6"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 6"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 6"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 6"/>
<w:LsdException Locked="false" Priority="51"
Name="List Table 6 Colorful Accent 6"/>
<w:LsdException Locked="false" Priority="52"
Name="List Table 7 Colorful Accent 6"/>
</w:LatentStyles>
</xml><![endif]--><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:"Table Normal";
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin-top:0cm;
mso-para-margin-right:0cm;
mso-para-margin-bottom:8.0pt;
mso-para-margin-left:0cm;
line-height:107%;
mso-pagination:widow-orphan;
font-size:11.0pt;
font-family:"Calibri",sans-serif;
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;
mso-bidi-font-family:"Times New Roman";
mso-bidi-theme-font:minor-bidi;
mso-fareast-language:EN-US;}
</style>
<![endif]--></td></tr>
</tbody></table>
Sadly, while Forth was compact and efficient, its more
primitive functionality and idiosyncratic syntax (based on Reverse Polish notation
[<span class="MsoHyperlink"><a href="https://en.wikipedia.org/wiki/Reverse_Polish_notation">link</a></span>])
put people off, and the machine only ever sold a few thousand units. Also, the
arrival, soon after, of Sinclair’s next micro, the ZX Spectrum, which for
similar money gave you 16kb of RAM and full-colour, high-resolution graphics
would have made the Ace look a poor proposition. <br />
<br /></div>
<div class="MsoNormal">
The demise of the Ace signalled a change in the way people
viewed home computers. The hobbyists and electronics tinkerers of the 1970s had
been replaced by a new breed of users who wanted to play arcade-like games and do
useful things such as organise their accounts or run small businesses. The Ace,
which was billed as “the programmer’s computer”, arrived on the scene too late,
after most micro hobbyists had moved on.<br />
<br /></div>
<div class="MsoNormal">
I missed out on the Ace, in the early 1980s, instead being
lured by the pull of the ZX Spectrum. However, I probably spent at least as
much time trying to program my Spectrum as I did playing games. I soon outgrew
BASIC, so spent much of my time wrestling with machine code and crashing my
computer. Perhaps if I had started out with an Ace rather than the Spectrum, my
programming would have been more fulfilling (if a little less colourful). In an
attempt to find out if this was the case, I downloaded an Ace emulator (<span class="MsoHyperlink"><a href="https://sourceforge.net/projects/eightyone-sinclair-emulator/">EightyOne</a></span>),
purchased a copy of the 35<sup>th</sup>-anniversary Ace User Guide, and set to
work on a new version of Tut-tut.<br />
<br /></div>
<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkPAYWpRjpAFZyBAM8Ljx7AJ_4w_YVI9EqDkgWPC_jM2Fvfm0Af-YoHCW5drTaF07izvGh-ArqJETRia3TWCulztoZk8lkrKZoagbCS_8vIaVcZjUmKExD-cZB9uiKru56i51ids-Az-M/s1600/jupiter-ace_tut-tut.png" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img alt="" border="0" data-original-height="240" data-original-width="320" height="480" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkPAYWpRjpAFZyBAM8Ljx7AJ_4w_YVI9EqDkgWPC_jM2Fvfm0Af-YoHCW5drTaF07izvGh-ArqJETRia3TWCulztoZk8lkrKZoagbCS_8vIaVcZjUmKExD-cZB9uiKru56i51ids-Az-M/s640/jupiter-ace_tut-tut.png" title="Tut-Tut on the Jupiter Ace Screenshot" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Tut-Tut on Jupiter Ace.</td></tr>
</tbody></table>
<div class="MsoNormal">
The finished product
is available from GitHub [<span class="MsoHyperlink"><a href="https://github.com/markgbeckett/jupiter_ace/tree/master/tut-tut">link</a></span>]
as either a TAP file to be used in an emulator, such as EightyOne, or a source
code that you can type in and modify, consisting of a Forth program occupying
around 4kb once compiled and three assembly language files, which hold various
game data to be assembled and loaded into the Forth program as binary code
blocks. <br />
<br /></div>
<div class="MsoNormal">
While based on David’s Sinclair BASIC version, the Ace
version uses the newer levels from the ZX81 version and, thanks to some help
from David, includes the extra features such as bracelets, amulets, and a hidden
treasury for the final level.<br />
<br /></div>
<div class="MsoNormal">
The game requires roughly 12kb of memory, so if you are
lucky enough to own a real Jupiter Ace, you will also need a 16kb RAM pack as
well. Alternatively, you could buy and build a Minstrel 4th [<a href="http://blog.tynemouthsoftware.co.uk/2020/05/minstrel-goes-forth.html">link</a>], a modern day Z80 microcomputer that is compatible with the Ace and can run Tut-tut without any problems.<br />
<br /></div>
<div class="MsoNormal">
In the next blog post, I will provide some insight into how
the game is written in the hope it will encourage some to have a go at typing
in the game rather than loading it from a tape file. However, for now, I
suggest you power up your Ace (or Minstrel 4th), or install an Ace emulator, and get on with some
Egyptian-themed adventuring.<br />
<br />
<br />
<br /></div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-255603189167868415.post-83941631741414708652020-04-22T21:47:00.006+10:002022-05-04T13:29:10.938+10:00ZX Spectrum Game: TuT-TuT 2020 Ed<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwXHr6yAmeZ2r5ndUy7UjMMjohG6pMnoe7IqOPIrtuHnAwSD5vFQFvJqSI3vQc8JLReWJkMy_vGkGThyphenhyphencnMH4QcIlzYRw82E0VFmA2RiDbsptlxqYsoju6Gti5QWa6Xov33PG4uE6xnw8T/s1600/tut-tut-load-003.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="768" data-original-width="1024" height="480" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwXHr6yAmeZ2r5ndUy7UjMMjohG6pMnoe7IqOPIrtuHnAwSD5vFQFvJqSI3vQc8JLReWJkMy_vGkGThyphenhyphencnMH4QcIlzYRw82E0VFmA2RiDbsptlxqYsoju6Gti5QWa6Xov33PG4uE6xnw8T/s640/tut-tut-load-003.png" title="ZX Spectrum TuT-TuT 2020 Edition Loading Screen" width="640" /></a></div>
<span style="font-size: large;"><br /></span>
<span style="font-size: large;">After the success of the <a href="https://www.zx81keyboardadventure.com/2019/10/zx81-game-tut-tut.html">ZX81 version of Tut-Tut</a> it was suggested to me by several people that it should be ported to the ZX Spectrum. But didn't the game start on the Spectrum you say? Indeed, back in October 2019 the very first version of Tut-Tut was released as a good old fashioned type in game for <a href="https://paleotronic.com/" target="_blank">Paleotronic</a> Magazine. </span><br />
<span style="font-size: medium;"></span><br />
<h2>
Brining Tomb Raiding Back to the Speccy</h2>
<div>
<div>
The initial version of Tut-Tut was a sizeable challenge to get working in pure Sinclair BASIC. The ZX81 version proved a nice little conversion project in C. This time around I've taken both versions, squashed them together and used ZXbasic as the modern development tool of choice.</div>
</div>
<h4>
Keeping it Early 8bit</h4>
Despite constantly changing implementation languages, TuT's core game mechanics and functionality are all based around the algorithms and techniques outlined in the <a href="https://paleotronic.com/" target="_blank">Paleotronic</a> article.<br />
<br />
Staying true to the BASIC version of the game became a key style choice for new Spectrum edition of Tut-Tut. In particular the decision not to introduce fluid animation into the game was something that I'd much internally debated about.<br />
<br />
In the end I felt retaining character square based movement lead heavily to an early 80s home micro aesthetic, one that most retro games (understandably) shy away from. That's not to say the game feels old, it's just meant after a fashion to feel like a kick arse earlier tittle.<br />
<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0qzSQZDWr17qlFgEbLVDKKgXnMw3R4u88ctTKLhGCIJ0gTJmoEYcXZMnpVd3S6EdLyIA0gAGuSUh22OqE15pd4lU807JXEcPvtc3AR-FpCO2nGz8-7r0xvpzmwh5DTHgnVGYIoM5I0wNZ/s1600/tut-zxspectrum-screens.png" style="margin-left: auto; margin-right: auto;"><img alt="TuT-TuT for the ZX Spectrum Screen Shots" border="0" data-original-height="1600" data-original-width="1422" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0qzSQZDWr17qlFgEbLVDKKgXnMw3R4u88ctTKLhGCIJ0gTJmoEYcXZMnpVd3S6EdLyIA0gAGuSUh22OqE15pd4lU807JXEcPvtc3AR-FpCO2nGz8-7r0xvpzmwh5DTHgnVGYIoM5I0wNZ/s640/tut-zxspectrum-screens.png" title="TuT-TuT for the ZX Spectrum Screen Shots" width="568" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Screen Shots from ZX Spectrum TuT-TuT 2020 Edition</td></tr>
</tbody></table>
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<h4>
New Elements for the Ancient </h4>
Of course nothing stands still, the new edition includes all the enhanced game play elements introduced in the ZX81 version, including bracelets and amulets. All 29 ZX81 levels have been updated for the Spectrum; plus 6 new levels to discover if you've previously played the ZX81 game.<br />
<br />
Being that this game is for the ZX Spectrum I've really tried to give the Tut-Tut a great Ancient Egyptian tomb raiding colour vibe. All the graphics have had a good makeover from those in the original BASIC version. In addition the game now contains several minor graphic tile sets that weave together throughout the tombs.<br />
<br />
For ease of play-ability, the 2020 Spectrum edition adds joystick support and a much converted ability to pause the game; having to play the ZX81 version in one sitting without coffee became a little taxing.<br />
<div>
<h4>
<strike>Download</strike> Excavate a Copy of the Game</h4>
<div>
<ul>
<li><a href="https://zx81keyboardadventure.itch.io/zx-spectrum-tut-tut-2020-edition" target="_blank">Download A Digital copy of ZX Spectrum Tut-Tut</a>. <b><i>File last updated 05/05/22</i></b></li>
<li>Cassette copies of the game are available from <a href="https://cronosoft.fwscart.com/TUT-TUT_Sinclair_ZX_Spectrum_48K_on_cassette/p5357732_20754892.aspx" target="_blank">Cronosoft</a></li>
</ul>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUhvLmgsoaoeUWe2lUUbz19LSls29HZAiG8J5gKL0U5xo-2LlLYWw6Lz91gbObKeYaagXgidE9FYPJgCPJLqAuuDT8EUmGLtaNCdM0HIon4PSNFSfVNPdRIT8t43rrVGwnJ_5apTpMMfIH/s1600/tut-zxspectrum-cover.png" style="margin-left: 1em; margin-right: 1em;"><img alt="ZX Spectrum TuT-TuT 2020 Cassette Cover Art" border="0" data-original-height="815" data-original-width="634" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUhvLmgsoaoeUWe2lUUbz19LSls29HZAiG8J5gKL0U5xo-2LlLYWw6Lz91gbObKeYaagXgidE9FYPJgCPJLqAuuDT8EUmGLtaNCdM0HIon4PSNFSfVNPdRIT8t43rrVGwnJ_5apTpMMfIH/w496-h640/tut-zxspectrum-cover.png" title="ZX Spectrum TuT-TuT 2020 Cassette Cover Art" width="496" /></a></div>
<div>
<br /></div>
</div>
</div>
<h4>
Thanks for Helping it Happen</h4>
I'd really like to thank a number of people in particular for helping out and generally supporting the Tut-Tut project from the beginning till the present:<br />
<br />
<ul>
<li><b>Melody Ayres-Griffiths</b> for suggesting something Halloween inspired for the Paleotronic Article.</li>
<li><b>Rod (Villordsutch) Bell </b>and his support for the game, plus suggesting the ZX81 version really ought to be on a real tape.</li>
<li><b>Simon Ullyatt</b> of Cronosoft fame for publishing the game and being generally enthusiastic and awesome.</li>
<li><b>Jim (Magenta) Blimey</b> gets much thanks for play testing a lot of demo versions and providing some really useful dev tools. </li>
</ul>
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
David Stephensonhttp://www.blogger.com/profile/11637474307612171656noreply@blogger.com0tag:blogger.com,1999:blog-255603189167868415.post-51007705561685650142020-01-03T15:43:00.003+11:002020-01-04T10:30:50.321+11:00ZX-Key, Minstrel 3 Keyboard Adapter <table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqBh0bwn9oBYOIqor42LfWOd0ciID7bHSEEHOdWv9WF_wMHnOnEj-FHoJozO422EnuJd3KFOmfNd1HckdbtNZIbO8NQ6DkvxpYl8BnJaJvzSVO4PSQbbS2QnbknL11HS0g2Rs-JmLWdGWA/s1600/20200102_144413.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="1559" data-original-width="1600" height="622" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqBh0bwn9oBYOIqor42LfWOd0ciID7bHSEEHOdWv9WF_wMHnOnEj-FHoJozO422EnuJd3KFOmfNd1HckdbtNZIbO8NQ6DkvxpYl8BnJaJvzSVO4PSQbbS2QnbknL11HS0g2Rs-JmLWdGWA/s640/20200102_144413.jpg" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">The ZX-Keys Keyboard attached to the Minstrel Issue 3 via the ZX-Key Breakout Board.</td></tr>
</tbody></table>
<br />
Since building the ZX81 Minstrel 3 kit I've been using the initial kludge keyboard adapter I'd made up on protoboard with the ZX-Keys. All perfectly fine, although it was a little unsightly, missing the ability to reset the computer and devoid of the reassuring LED indicators.<br />
<br />
It's not all about making things tidy though. I still have further plans to encase the Minstrel and need to ensure everything is working as expected before finalising that design. But more of that in latter posts.<br />
<br />
The ZX-Key Minstrel adapter is really just a simple breakout board for the standar ZX-Key keyboard. The breakout board can be soldered directly in place, or clipped into the ZX81 keyboard header or slotted into a regular female header. Provision has been made for mounting it firmly to the Minstrel, held in with a bold<br />
<br />
To make simple use of the ZX-Keys Keyboard adapter nothing needs to be done other than plug it in and attach the keyboard. However an additional 3 wires may be soldered to the Minstrels 5v, GND and Reset lines to restoring computer reset and LED functionality to the Keyboard.<br />
<br />
In the coming weeks I plan to make the Minstrel 3 ZX-Keys Keyboard kit available on Tindie. This will be in addition to the regular fully assembled units designed for the ZX81 that I currently make available on Sell My Retro. So stay tuned for that.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuVZ1kbY-h6FwJb2Iwv8SekGNHL2seT73eF7-cgiaDL9M8NhSosFlkrQyAlfy9ABoreHe_ug51fi08bJeSEYnVBmArepJXA6_dwIMG4rgd4hrpANTGLULxRGoi8GmF-yBz-S1JZ_WoBRC1/s1600/20200102_115913.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="733" data-original-width="1600" height="292" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjuVZ1kbY-h6FwJb2Iwv8SekGNHL2seT73eF7-cgiaDL9M8NhSosFlkrQyAlfy9ABoreHe_ug51fi08bJeSEYnVBmArepJXA6_dwIMG4rgd4hrpANTGLULxRGoi8GmF-yBz-S1JZ_WoBRC1/s640/20200102_115913.jpg" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><span style="font-size: 12.8px;">Minstrel Issue 3 ZX-Key Breakout Board.</span></td></tr>
</tbody></table>
<br />David Stephensonhttp://www.blogger.com/profile/11637474307612171656noreply@blogger.com0tag:blogger.com,1999:blog-255603189167868415.post-15585356590154360352019-12-14T23:40:00.001+11:002020-01-23T22:29:30.503+11:00All New ZX81 : A Minstrel Issue 3 Kit<span style="font-size: large;">A long time ago in a land far far away Sinclair Research released unto the world a ZX81 kit computer. This is not that kit, this is a brand new Minstrel Issue 3 computer, that happens to be an enhanced reworked ZX81 clone with 32k RAM.</span><br />
<br />
<h2>
Part Minstrel Review, Part Not</h2>
Over the last couple of years Dave Curran of <a href="http://blog.tynemouthsoftware.co.uk/" target="_blank">Tynemouth Software</a> has been busy designing and producing modern recreations of Sinclair's early home computer kit, the ZX80. Although in fairness, to call them recreations is probably a disservice. One of the major goals has always been to take the project to the next level and launch a full ZX81 work alike.<br />
<br />
This of course is where the Minstrel Issue 3 comes into the picture, it being the first of Dave's fully functional ZX81 clones-ish computers. There are of course some differences, the most obvious being that there is no ULA, or modern equivalent, and the computer is entirely designed around discrete logic IC's . In a world full of FPGAs this refreshing.<br />
<br />
To find out more on the inner working of the <a href="http://blog.tynemouthsoftware.co.uk/2019/12/developing-the-minstrel-issue-3.html" target="_blank">Minstrel</a> family and the <a href="http://blog.tynemouthsoftware.co.uk/2019/11/minstrel-issue-3-zx81-compatible-computer-kit.html" target="_blank">Minstrel 3</a> in particular Dave has written a number of exceptional blog posts that deserve a good read through.<br />
<br />
<h3>
See a Kit, Build a Minstrel</h3>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRSyh_xXGnh4Kk3P2dwSZRGXnNKZcgn97AcyvBrfaskf-O2ppQm1MW3rMRNWFNYCPUhrIWIE_u8pr59RO-8OanX_enEhdNQ985N_tp5dbLruxgkp863tlM48GFdTM5vP9vTG4cfmxvQA_a/s1600/20191206_150022.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="1411" data-original-width="1600" height="564" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRSyh_xXGnh4Kk3P2dwSZRGXnNKZcgn97AcyvBrfaskf-O2ppQm1MW3rMRNWFNYCPUhrIWIE_u8pr59RO-8OanX_enEhdNQ985N_tp5dbLruxgkp863tlM48GFdTM5vP9vTG4cfmxvQA_a/s640/20191206_150022.jpg" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Kits Done Right: ICs Layed out as per the Minstrel Circuit Board</td></tr>
</tbody></table>
One of the first things I noticed when opening the kit is just how much thought and care has gone into producing it. From the PCB design to how the IC parts tray was laid out to match the PCB, all the way down to included documentation. First impressions count, and the overall presentation put me in a very good mood before I dared assemble anything.<br />
<br />
With 25 ICs, plenty of resistors and capacitors the Minstrel takes some time to put together. While It's certainly no picnic to build, thanks to the layout and documentation it never seemed an insurmountable chore. In the end I managed to construct my kit in 4 reasonable sittings with a similar amount of coffee (coffee being a very accurate measure of time).<br />
<br />
<h3>
Using the Minstrel</h3>
<div>
After completion comes the power on, will it work will it not work? It didn't, but that was entirely my fault. A quick inspection latter, seems I'd failed to solder exactly one IC pin leg. Power on two, success! Aside from being quite elated at a fully working Minstrel, I was immediately amazed at just how clear the image emanating from it was. Truly the image quality is better than using an emulator, which in the case of a ZX81 style computer is a brilliant thing.</div>
<div>
<br /></div>
<div>
Of course it's not all about image quality. The Minstrel is designed to fit within a standard UK ZX81 case, as such it makes a pretty perfect replacement for a dead ZX81 board. Note that American ZX81 and Timex 1000 cases would require some modification around the video output holes for the board to fit. </div>
<div>
<br /></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2iFzULYCIKEXdyY7lF0tW6vHMF8d4KWHY3EkPLSyE9EfFdb79Z6GobYLU7OHvZbWpoNG7B1QRX_IDaOtwjkOg5WgqPwvb8d2mRXanLTEUPPIZ1EG2MHD669qehugjlYRYJ6RIyCGEglPW/s1600/complete.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="1069" data-original-width="1600" height="426" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2iFzULYCIKEXdyY7lF0tW6vHMF8d4KWHY3EkPLSyE9EfFdb79Z6GobYLU7OHvZbWpoNG7B1QRX_IDaOtwjkOg5WgqPwvb8d2mRXanLTEUPPIZ1EG2MHD669qehugjlYRYJ6RIyCGEglPW/s640/complete.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Minstrel Issue 3 Mostly Assembled</td></tr>
</tbody></table>
If placed inside a ZX81 case the only real clue to it not being a ZX81 would be the swapping out of the mono phono jack power socket for a barrel style one. This is possibly one of the finest moves possible, at least to the user. Going out on a limb here, but in my experience a wobbly phono jack is far more likely to cause an unexpected reset than that legendary RAM pack wobble ever did.<br />
<br />
Like the original ZX81, the Minstrel does lack a of a power button. That's not really the Minstrels fault, it's more of a design limitation brought about by ZX81s case design. There are a number of solutions, the easiest is to just go out a buy an external switch from the '<a href="https://www.thefuturewas8bit.com/shop/sinclair/sinclair-spares/inline-power-switch.html" target="_blank">The Future was 8 Bit</a>'. It might be something that Tynemouth could include as an extra option at purchase time.<br />
<br />
<h3>
How Compatible is Compatible</h3>
<div>
<div>
I've not found any software so far that wouldn't work with the Minstrel, I dare say I won't be able to. The little computer is even compatible with a number of newer games and programs that take advantage of hires graphics modes, modes that required hardware modification on an actual ZX81.<br />
<br />
Hardware expansions on the other hand may be a little to harder to guarantee due to both the modern design of the Minstrel and the esoteric nature of ZX81 expansions.</div>
<div>
<br /></div>
<div>
I've only a couple of expansion that I can test with the Minstrel, and I don't any 80s period hardware to throw at it. The best news is that the most required modern add-on, the ZXpand works perfectly, indeed Dave Curran in consultation with Charlie Robson the creator of the ZXpand is planning a special edition of the ZXpand specifically for the Minstrel. </div>
<div>
<br /></div>
<div>
Also of note, the <a href="http://www.zx81keyboardadventure.com/2018/01/mystic-bbsing-with-wimodem232s.html">Zeddynet network interface</a>, a card I've had trouble with on some actual ZX81s work flawlessly. Internet meet Minstrel, a perfectly modern retro way to connect to the world.</div>
<div>
<br /></div>
<div>
<div>
Sadly for me one expansion didn't work, my <a href="https://www.zx81keyboardadventure.com/p/blog-page_9.html" target="_blank">ZX-Keys Expansion card</a>. After speaking to Dave on the matter I have some leads on as to why, I'll have to see what can be done on a revision 2 of my boards. For the moment the <a href="https://www.zx81keyboardadventure.com/p/zx-key-keyboard-guide-book.html" target="_blank">ZX-Keys keyboard</a> works perfectly using the Minstrels internal keyboard connector. </div>
</div>
</div>
<div>
<br /></div>
<h3>
Adding a ZX-Key Keyboard</h3>
<div>
I have some future plans for my Minstrel involving a custom case and a full sized keyboard. For the moment though I need a working keyboard (There are keyboard options at kit purchase time). As discovered earlier my ZX-Key Expansion card didn't work so I built a temporary adapter board for the ZX-Keyboard.</div>
<div>
<br /></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidwA0o4-2Kz_UEv5_w6dHV8CIDavgNAHvJlNm8-wX5RpVViJ66mYwTmiBhfTyPd5Wfn2o0H4JjtJXtGu83UGQ6XSd_ZXvbdy9XEiPFqtZ1W1GKrTeuiQ_noUeMsinALw2vv0duNAw4zY6I/s1600/20191208_175659.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="1117" data-original-width="1600" height="446" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidwA0o4-2Kz_UEv5_w6dHV8CIDavgNAHvJlNm8-wX5RpVViJ66mYwTmiBhfTyPd5Wfn2o0H4JjtJXtGu83UGQ6XSd_ZXvbdy9XEiPFqtZ1W1GKrTeuiQ_noUeMsinALw2vv0duNAw4zY6I/s640/20191208_175659.jpg" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Internal ZX-Key Keyboard Adaptor</td></tr>
</tbody></table>
The resulting kludge is a simple wire up job on some protoboard On the Minstrel I soldered on a Female Header Socket Strip to plug it into. Nothing groundbreaking here then. The next step will be to make up a proper PCB board. On the temporary one I've only wired up the bare essentials, the keys. The keyboards LEDs and reset button don't work and it all looks a little messy. Still I do have a nice modern-ish keyboard to use with a nice modern-ish ZX81 clone.<br />
<br />
<h3>
In Summary</h3>
I have to say I've been very pleased with the Minstrel kit. It's fun and rewarding to put together and in all honesty it's a much better computer than ZX81. If you enjoy assembling kits then go get one, if you don't know one end of a soldering iron from another Dave supplies them pre-built too.<br />
<br />
Now of to play some games, how about a nice game of <a href="http://www.zx81keyboardadventure.com/2019/11/zx81-game-tut-tut-editions.html">Tut-Tut</a>?<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhm6fcp4XbQnd6qxMc-ht1coaWd-O4XSKDDx5TncneA5LbTpaiWowMY4b4J8lfjMFRqWayrvu5jBm1Jpx8FsPW3Y9NqieZptyGJ3tMLTe416UChfnvCrY7p1bLWAgdCnRMZRmSlpxLrJJb2/s1600/20191208_172013.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="1600" data-original-width="873" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhm6fcp4XbQnd6qxMc-ht1coaWd-O4XSKDDx5TncneA5LbTpaiWowMY4b4J8lfjMFRqWayrvu5jBm1Jpx8FsPW3Y9NqieZptyGJ3tMLTe416UChfnvCrY7p1bLWAgdCnRMZRmSlpxLrJJb2/s1600/20191208_172013.jpg" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Minstrel up and running playing a little bit of Tut-Tut</td></tr>
</tbody></table>
<br />David Stephensonhttp://www.blogger.com/profile/11637474307612171656noreply@blogger.com0tag:blogger.com,1999:blog-255603189167868415.post-22296130177617593392019-11-20T18:57:00.002+11:002023-02-19T13:35:50.132+11:00The NEC PC-8401 Reexamined: Part 2<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrXmcVeJ86A-xXE5Ulzo4NhIt9n_apb0aV5w0LoBqoEAcxxb1oRGlmysItPHez5eRUiqqZhmR3oh8QfMlMcojkwZqRJr-Wj_kIC7J0jP5eux4RWFNXL0iZr1uXeE8ZFQD3PAsYt1IF6G1L/s1600/20190810_112836.jpg" style="margin-left: 1em; margin-right: 1em;"><img alt="" border="0" data-original-height="1228" data-original-width="1600" height="490" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrXmcVeJ86A-xXE5Ulzo4NhIt9n_apb0aV5w0LoBqoEAcxxb1oRGlmysItPHez5eRUiqqZhmR3oh8QfMlMcojkwZqRJr-Wj_kIC7J0jP5eux4RWFNXL0iZr1uXeE8ZFQD3PAsYt1IF6G1L/s640/20190810_112836.jpg" title="The PC-8406A 32k RAM Cartridge" width="640" /></a></div>
<h2>
RAM Expansion Cartridges</h2>
<div>
One of the shortcomings of the NEC PC-8401 is the lack of RAM. By default the computers base 64k is divided in half between file storage and system memory. While 32k is plenty for running the software available in ROM, this limits options when running other software that may require large amounts of memory. Conversely the remaining 32k of RAM dedicated to file storage as a RAM disk places similar constraints on user file and program retention.<br />
<br />
Fortunately memory limitations could be alleviated with the addition of RAM expansion cards. These RAM cartridges were to be available in 3 sizes, 128k, 64k and 32k. Rather than adding directly to available application memory, the expansions are used as RAM Disks and must be formatted by the Operating System before use. Once the additional storage is available the PC-8401s base memory may be configured to use the full base 64k as application memory or you may keep existing 32k shared memory split.<br />
<br />
<b>No RAM Expansion Attached</b><br />
32k: Applications RAM<br />
32k: RAM Disk Drive A:<br />
<br />
<b>RAM Expanded Machine Option 1</b><br />
32k: Applications RAM<br />
32k: RAM Disk Drive A:<br />
32/64/128k: RAM Disk Drive B:<br />
<br />
<b>RAM Expanded Machine Option 2</b><br />
64k: Applications RAM<br />
32/64/128k: RAM Disk Drive A:<br />
<div>
<br /></div>
<h3>
The PC-8406A 32k RAM Cartridge</h3>
The PC-8406A 32k cartridge internals are relatively compact, containing 74 Series logic chips and 16 D446G-15 NEC 2K X 8-BIT SRAM chips mounted on both sides of the circuit board. The SRAM contents are maintained by a CR2032 lithium battery; during battery changes the carts can be powered externally via a 5v barrel jack. Interestingly for the time, just about all the chips contained on the PCB are SMD variants.<br />
<div>
<br /></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhDJnIYqtKjQScCkOWFDwLaFMgw2yP5HgTvRds8sxsKM6OMu5xXbBPTOeelVu-ejEXXWA0FZzWFR6-k8H-l3lrKgQXP_Z6LkStlTKY89vkGwtbHP-0BFi8KCp-940tY5hi4MiryQ-zuWy3/s1600/pc-8401_ram_top.png" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="1287" data-original-width="1600" height="514" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhDJnIYqtKjQScCkOWFDwLaFMgw2yP5HgTvRds8sxsKM6OMu5xXbBPTOeelVu-ejEXXWA0FZzWFR6-k8H-l3lrKgQXP_Z6LkStlTKY89vkGwtbHP-0BFi8KCp-940tY5hi4MiryQ-zuWy3/s640/pc-8401_ram_top.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">The PC-8406A 32k RAM Cartridge.</td></tr>
</tbody></table>
<br />
Unfortunately the PC-8406A 32k pack is on the smaller side of useful, and probably best as a temporary storage device for moving files around. It's not a serious contender as a mass storage device. Even by the file and program sizes of the 1980s it's small. You could for example install MS BASIC on the drive, but then you have very little storage space left for saving programs.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_Ca_PCTCh_h6jzUObPTyedwgj_JtAaois80lnHStCA_VXS_qoG96hDGRFBMtubKqE6eVPVKNon1YbtTGkHkAchQXFS-wZ81g-9TyKDLcsMQ6XlwMMegl6RWHCqJrVqiK04f_eUXSCNsEI/s1600/pc-8401_ram_bot.png" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="886" data-original-width="1600" height="354" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_Ca_PCTCh_h6jzUObPTyedwgj_JtAaois80lnHStCA_VXS_qoG96hDGRFBMtubKqE6eVPVKNon1YbtTGkHkAchQXFS-wZ81g-9TyKDLcsMQ6XlwMMegl6RWHCqJrVqiK04f_eUXSCNsEI/s640/pc-8401_ram_bot.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Underside of the PC-8406A 32k RAM Cartridge.</td></tr>
</tbody></table>
<br />
Niggling issues with the NEC PC-8401s overall design choices only increase from there, being that other mass storage devices available of the computer such as the PC-8431A Micro Floppy Disk Unit make no provision for using the RAM carts at the same time, and even the CRT adaptor precludes the usage of the RAM cart as the PC-8401's expansion port provides no means of connecting multiple add-ons.<br />
<br />
Effectively there is no easy method of copying the contents of the RAM cart to less volatile floppy disk media. The limitations of the 32k cart apply to a lesser extent to the 64k and 128k expansions, however due to how the PC-8041's memory management works the higher rated cards are inherently more useful as storage mechanisms to begin with.<br />
<br />
Severe limitations and all, the RAM carts do help turn the base unit into a more practical computer. Even the 32k cart certainly enhances the PC-8401 user experience, especially in its predicted role as a word processing and spreadsheet powerhouse.<br />
<br />See all entries for this project: <a href="https://www.zx81keyboardadventure.com/2019/08/the-nec-pc-8401-reexamined-part-1.html">Part 1</a>, <a href="https://www.zx81keyboardadventure.com/2019/11/the-nec-pc-8401-reexamined-part-2.html">Part 2</a></div><div><br /></div><div><br />
<br /></div>
David Stephensonhttp://www.blogger.com/profile/11637474307612171656noreply@blogger.com0tag:blogger.com,1999:blog-255603189167868415.post-9389259221901959022019-11-17T21:41:00.005+11:002023-07-16T12:52:07.693+10:00ZX81 Game: TuT-TuT - Editions <div style="margin-left: 1em; margin-right: 1em;">
</div>
<br />
What news of the ZX81 version of the TuT-TuT since the initial release you ask? Well there are some exciting developments that need some sharing.<br />
<br />
<h3>
Physical Tape Release of TuT-TuT</h3>
I'd mentioned in the previous post that a physical tape release was in the works. Simon Ullyatt and his brilliant retro publishing label <a href="https://cronosoft.fwscart.com/ZX81_cassette_tape/cat5357733_4119465.aspx" target="_blank">Cronosoft</a> will be releasing the game in the not to distant future.<br />
<br />
Simon is busy putting the game through some additional testing on real hardware, checking the loading from real tapes and the like. Then of course there is the small matter of cassette production, once all is confirmed the release date will be announced, so stay tuned for exact dates.<br />
<br />
Of course what's a physical tape release without some good cover art? After an intense drawing session on my part and some quality layout work on Simon's side of things we have a tape inlay cover ready to go. Those mummies really look menacing, would you dare enter this tomb? (Of course you will)<br />
<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgh1vgIPlNFxXYTNuUnla7o2hX-_BvsYaO3R1ATvVbyvS5shXO417dAWcH_PCz6-Ikko5jsfATci4uJuvsK-HYk5JZhymfFTMiTmQiKYsnrFYp7npJ0Xx8ToJkh25rEUImdRE14IKzeQJRv/s1600/tut-tut-cronosoft-cover-extended.png" style="margin-left: auto; margin-right: auto;"><img alt="" border="0" data-original-height="1190" data-original-width="1123" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgh1vgIPlNFxXYTNuUnla7o2hX-_BvsYaO3R1ATvVbyvS5shXO417dAWcH_PCz6-Ikko5jsfATci4uJuvsK-HYk5JZhymfFTMiTmQiKYsnrFYp7npJ0Xx8ToJkh25rEUImdRE14IKzeQJRv/s640/tut-tut-cronosoft-cover-extended.png" title="TuT-TuT ZX81 16k Cronosoft Cassette Cover" width="602" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Coming to a Tape Player near you, the Soon to be released Tape version of TuT-TuT </td></tr>
</tbody></table>
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<h3>
UDG 4 ZXpand Edition </h3>
For those fortunate enough to own both a ZXpand and a UDG 4 ZXpand expansion cards for their ZX81s, Moggy from over on the <a href="https://sinclairzxworld.com/" target="_blank">Sinclair ZX World </a>forums created a User Defined Graphics set for TuT-TuT. Don't have the expansion or a ZX81, no need to worry the enhancements can be used with the excellent <a href="https://sourceforge.net/projects/eightyone-sinclair-emulator/" target="_blank">EightyOne Sinclair Emulator</a>.<br />
<br />
All instructions on how to use the UDG version in an Emulator or with a real ZX81, along with the required files are all now included in the <a href="https://www.zx81keyboardadventure.com/2019/10/zx81-game-tut-tut.html">TuT-TuT tape file download</a>.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9dybJ11Y9K9lVPtzbqW2nZ5ACxsVkiFlx9qS7EHp2sfwrTIsIpM7Gy2rWSUgX9uCGYF9XkwYVZqR_fXUJuZMB234p9VxfiTvwfUy8iQV-U9GOffS4vtLF2y0CbtAawuXXIqOdLZKZjI26/s1600/mastaba_both.png" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="600" data-original-width="1600" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9dybJ11Y9K9lVPtzbqW2nZ5ACxsVkiFlx9qS7EHp2sfwrTIsIpM7Gy2rWSUgX9uCGYF9XkwYVZqR_fXUJuZMB234p9VxfiTvwfUy8iQV-U9GOffS4vtLF2y0CbtAawuXXIqOdLZKZjI26/s640/mastaba_both.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Original ZX81 version and the enhanced UDG 4 ZXpand graphics set.</td></tr>
</tbody></table>
<br />
<h3>
Get TuTing on an iPhone</h3>
In need of a mobile on the go fix of some TuT-TuT action? Kevin Palser has your desires covered if you're an iPhone / IOS user. TuT-TuT is to be included in the next release of the his <a href="https://apps.apple.com/us/app/zx81/id1180117434" target="_blank">ZX81 for IOS</a> emulator. The latest version of the emulator should be appearing later this week (Late Nov 20119).<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQexKLkeXhnv7CiMy6JhiyWzty1Tx3QJ_z4W8B-F1nm_p0f6_EzeHKuNP6qdcbGALdIXfTK61YoyG3uJucRc_d8q2CrBL8eVtLYQFCQvNIzxpxE_ppypBgazfurJmvLP5sUi2GSd3oyQmU/s1600/ioszx81.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1024" data-original-width="768" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjQexKLkeXhnv7CiMy6JhiyWzty1Tx3QJ_z4W8B-F1nm_p0f6_EzeHKuNP6qdcbGALdIXfTK61YoyG3uJucRc_d8q2CrBL8eVtLYQFCQvNIzxpxE_ppypBgazfurJmvLP5sUi2GSd3oyQmU/s640/ioszx81.png" width="480" /></a></div>
<br />
<br />
<h3>
The ZX Spectrum Version</h3>
The ZX Spectrum version of TuT-TuT has been a huge success all off it's own. A big thanks for the overwhelmingly positive reviews circulating out there in the wild.<br />
<br />
A special shoutout to Ewan Spence for his play through of the game on his <a href="https://www.youtube.com/channel/UCmhhGN7erOtYvkfPMNHXz_A" target="_blank">Retro Spectrum</a> YouTube channel. It's been great to see so many great reactions to the game. Who would have thought a game written in Spectrum BASIC could be such a hit in 2019.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/XBsVaDmso4c/0.jpg" frameborder="0" height="266" src="https://www.youtube.com/embed/XBsVaDmso4c?feature=player_embedded" width="320"></iframe></div>
<br />
<br />
The Spectrum version of the game was all about challenging the idea that Sinclair BASIC couldn't be used effectively in games creation, I think I've managed to help in some way to bust that myth. If you haven't yet, go grab yourself a copy from <a href="https://paleotronic.com/2019/11/05/tut-tut-a-new-game-for-the-zx-spectrum/" target="_blank">Paleotroic Magazine</a> and get playing, remember to check out some of the other articles while there.<br />
<br />
<h3>
The ZX81 Version is more than a Conversion</h3>
If you've had fun playing TuT-TuT on the ZX Spectrum be sure to give the ZX81 version a play through.<br />
<br />
Unlike the Spectrum TuT-TuT, the ZX81 game is not written in BASIC, this left the door open for some enhancements of gameplay and features. While some of the levels will be familiar, many have been subtly changed and many more added, in fact there are almost twice the amount on the ZX81.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOWH5QDEde_b6RH9fF8DYnXw65JZkrR5dEkEEaS0UBPKBkiaWJdSJHntfsmK-r1mc6lCNbjz2AltPcpIuEXfkjMBuqW8Uhn-dW9amLnATkCrCXEmf3yqB6BOjg177dOCGt_308zSNtlwfn/s1600/20191030_183936a.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1600" data-original-width="1293" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOWH5QDEde_b6RH9fF8DYnXw65JZkrR5dEkEEaS0UBPKBkiaWJdSJHntfsmK-r1mc6lCNbjz2AltPcpIuEXfkjMBuqW8Uhn-dW9amLnATkCrCXEmf3yqB6BOjg177dOCGt_308zSNtlwfn/s640/20191030_183936a.jpg" width="516" /></a></div>
<br />
<br />
<br class="Apple-interchange-newline" />
<hr />
<h2>
Getting a Copy of TuT-TuT</h2>
<div>
<br /></div>
<b><span style="font-size: large;">ZX81 Versions</span></b><br />
<br />
<ul>
<li style="box-sizing: border-box; list-style-type: circle; margin: 0px; padding: 0px 0px 5px;"><span style="color: #333333; font-family: lora;"><span style="font-size: 15px;"><a href="https://zx81keyboardadventure.itch.io/zx81-tut-tut" target="_blank">A Digital copy at Itch.io</a></span></span></li>
<li><a href="https://cronosoft.fwscart.com/TUT-TUT_Sinclair_ZX81_+_16K_RAM_on_cassette/p5357732_20270309.aspx" target="_blank">Get the Cassette from Cronosoft.</a></li>
<li>Play it on you iPad or iPhone, get a copy of <a href="https://apps.apple.com/us/app/zx81/id1180117434" target="_blank">ZX81 for IOS</a></li>
</ul>
<br />
<span style="font-size: large;"><b>ZX Spectrum Versions</b></span><br />
<br />
<ul>
<li><a href="https://zx81keyboardadventure.itch.io/zx-spectrum-tut-tut-2020-edition">Brand new for 2020, Tut-Tut 2020 Edition</a>: Based on the ZX81 version</li>
<li>Original BASIC copy: Physical Paper type-in release and Digital Copies will be available from <a href="https://paleotronic.com/" target="_blank">Paleotronic Magazine</a></li>
</ul>
<br />
<span style="font-size: large;"><b>Love the Game?</b></span><br />
<br />
<ul>
<li><a href="https://www.buymeacoffee.com/LjITrcG" target="_blank">Why not buy me a Coffee</a>, I needed quite a few writing it, and with more there could be a TuT-TuT II.</li>
</ul>
<div>
<br /></div>
David Stephensonhttp://www.blogger.com/profile/11637474307612171656noreply@blogger.com0tag:blogger.com,1999:blog-255603189167868415.post-54059594758559121712019-10-29T14:14:00.002+11:002023-07-16T12:51:05.640+10:00ZX81 Game: TuT-TuT<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqgZBIasMkVTAb3gpGcBEfPOZYU_JkBxf95zvajzi-OSEXKBE8cw72qzuAmIEO2cDhM3woqUtK5IMMOG2-SADFHAA5vcGoFOxwYdZtO0r0qQnOy5v9UrwVfFZcCm5qBIF9mA2ssE2Mo0n5/s1600/tut.png" style="margin-left: 1em; margin-right: 1em;"><img alt="" border="0" data-original-height="576" data-original-width="1280" height="288" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhqgZBIasMkVTAb3gpGcBEfPOZYU_JkBxf95zvajzi-OSEXKBE8cw72qzuAmIEO2cDhM3woqUtK5IMMOG2-SADFHAA5vcGoFOxwYdZtO0r0qQnOy5v9UrwVfFZcCm5qBIF9mA2ssE2Mo0n5/s640/tut.png" title="ZX81 Tut Title Graphic" width="640" /></a></div>
<span style="font-size: medium;"><b>For the October 2019 issue of <a href="https://paleotronic.com/2019/11/05/tut-tut-a-new-game-for-the-zx-spectrum/" target="_blank">Paleotronic Magazine</a> I took on the challenge of writing a ZX Spectrum game in BASIC. The result being the fast paced Halloween inspired, Ancient Egyptian themed arcade puzzler Tut-Tut. Now with the Spectrum version sorted, how about a ZX81 version of the same game, only better?!</b></span><br />
<br />
<hr />
<h2>
Tomb Raiding with a ZX81</h2>
<div>
<div>
It's coming to the end of 1921's digging season in Egypt. Your excavations have not gone so well this year, failing to find any trace of the legendary and as yet undiscovered Pharaohs tomb. Then in your final weeks wild stories recounting the wrath of vengeful mummies strangling would be tomb local raiders filter back to base camp.</div>
<div>
<br /></div>
<div>
At last some concrete leads worth looking into, and opportunities to good to pass up. Oculist tales of curses be dammed, you're an Egyptologist and grand adventurer, such nonsense can't possibly hurt you. Or can it?<br />
<br /></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQVFrJCA_NiwZkAjbdSHFPqoOQqwia-X_1Ri7xFsm8A2MoGParqhnxquzsqYgZm8CLk76ROs9kf1YODKUBxflIl5NmvHPkiLom2Rl7XukIu81dJOS8v8P9R55dQWwe_ubwVd1Tuy9pm2ip/s1600/tut-tut-screen-example.png" style="margin-left: auto; margin-right: auto;"><img alt="" border="0" data-original-height="1338" data-original-width="1440" height="594" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiQVFrJCA_NiwZkAjbdSHFPqoOQqwia-X_1Ri7xFsm8A2MoGParqhnxquzsqYgZm8CLk76ROs9kf1YODKUBxflIl5NmvHPkiLom2Rl7XukIu81dJOS8v8P9R55dQWwe_ubwVd1Tuy9pm2ip/s640/tut-tut-screen-example.png" title="Tut-Tut ZX81 Screen Shot" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">How far into the tomb of the Pharaoh can you make it? </td></tr>
</tbody></table>
<div>
<h3>
Playing the Game</h3>
Tut-Tut is one part puzzle, two parts arcade action. The game is comprised of 28 levels, plus a hidden treasure chamber which may only be opened if you are deemed worthy.</div>
<div>
<br /></div>
<div>
Collect gems, amulets and bracelets for points, you'll need 5000 before the end of "Sutekh's Eye" (level 28) for the treasure chamber to open. Amulets and Bracelets will freeze the player or halt mummies respectively.<br />
<br />
To complete each level the player will need to collect keys, open doors, move blocks before finding exits to lower crypt levels. Keep an eye out for Pharaohs roaming guardians, they're not the smartest of the undead but they are relentless.</div>
<div>
<br /></div>
<div>
Keys are:<b> </b>‘<b>O</b>’ left, ‘<b>P</b>’ right, ‘<b>Q</b>’ up, ‘<b>A</b>’ for down and ‘<b>R</b>’ to reset the level (at a cost).</div>
</div>
<div>
<br />
<i><b>Details on where and how to acquire a copy of TuT-Tut are listed at the end of this blog entry.</b></i></div>
<h2>
<hr />
The <span style="color: #cccccc;">re</span>Making of TuT-TuT</h2>
<div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_BpjiqnEUXo0K0Yhq6DHUssmpzittein7v3udtXlAFG1hLzUyjEvJskxoiZBdDGYS7qLAH_Bvb8nNzCNYlDNhymJhXHVo6665I5QOFZQPbO-IftnpbSOXAh9it4T9Xcy2fYdGFFlyei3M/s1600/tut-tut_paleotronic1019i.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="833" data-original-width="1600" height="332" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh_BpjiqnEUXo0K0Yhq6DHUssmpzittein7v3udtXlAFG1hLzUyjEvJskxoiZBdDGYS7qLAH_Bvb8nNzCNYlDNhymJhXHVo6665I5QOFZQPbO-IftnpbSOXAh9it4T9Xcy2fYdGFFlyei3M/s640/tut-tut_paleotronic1019i.png" width="640" /></a></div>
<br />
The original version of Tut-Tut was written as a type-in game for the ZX Spectrum and published in <a href="https://paleotronic.com/2019/11/05/tut-tut-a-new-game-for-the-zx-spectrum/" target="_blank">Paleotronic Magazine</a>. The game was entirely constructed in BASIC, this presented numerous challenges, the the greatest being the problem of speed and squeezing enough of it out of the machine. The trials and tribulations of undertaking that task on the ZX Spectrum is pretty well documented in the magazine.<br />
<br />
I had considered re-pointing the BASIC game to the ZX81, but the challenge of writing a good game in BASIC had kind of been dealt with. The greater challenge on the ZX81 is in presenting an atmospheric game that transcends the limits imposed by the machines most obvious shortcomings; black and white predefined chunky graphics. To that end the ZX81 version of Tut-Tut has been written in C, targeted towards Z88dk for compilation.</div>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIqSsXzvp99HDoxLzZ8mCAHucg5_IgP8_E5x0MQA9dkKGEyoBziUjjLQyuLKTqM5V0o3-2MilQRT0z0_Ls3MIvw69Sl9T5R9wK4dNG2pNBxXHaqO310uP9-bjiX90EeqXe0n7A3ixBrLyT/s1600/tut_tut-compare.png" style="margin-left: auto; margin-right: auto;"><img alt="" border="0" data-original-height="600" data-original-width="1600" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIqSsXzvp99HDoxLzZ8mCAHucg5_IgP8_E5x0MQA9dkKGEyoBziUjjLQyuLKTqM5V0o3-2MilQRT0z0_Ls3MIvw69Sl9T5R9wK4dNG2pNBxXHaqO310uP9-bjiX90EeqXe0n7A3ixBrLyT/s640/tut_tut-compare.png" title="TuT-TuT: ZX Spectrum vs ZX81 version" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">TuT-TuT: ZX Spectrum vs ZX81 Version</td></tr>
</tbody></table>
I've been careful to maintain the core game play between versions. The choice not to use BASIC could have been a catalyst to greatly enhance elements such as enemy mummy movement for example. The choice not to change to much has however kept the feel of the game, and ensured the overall design feels consistent.<br />
<br />
Despite remaining essentially the same game, opportunities have been taken to add additional elements. The size and scope of TuT-TuT has increased, there are now 28 normal levels, plus 1 special level. Extra levels necessitated the creation of a couple of additional items to hold player interest; Amulets and Bracelets provide chances for scoring extra points alongside the potential disadvantage of actually interacting with the items.<br />
<br />
That's about it, be sure to check out the article in Paleotronic and enjoy both the original and especially this ZX81 enhancements. Special thanks to Paleotronic for both suggesting and providing the space the Spectrum game and a shout out to Rod Bell for supporting the project.<br />
<br />
Be sure to check out Rods video review of the <a href="https://youtu.be/ga4OQQQ4G54" target="_blank">ZX81 TuT-TuT Demo Version</a><br />
<br />
<hr />
<h2>
Getting a Copy of TuT-TuT</h2>
<div>
<br /></div>
<b><span style="font-size: large;">ZX81 Versions</span></b><br />
<br />
<ul>
<li style="box-sizing: border-box; list-style-type: circle; margin: 0px; padding: 0px 0px 5px;"><span style="color: #333333; font-family: lora;"><span style="font-size: 15px;"><a href="https://zx81keyboardadventure.itch.io/zx81-tut-tut" target="_blank">A Digital copy at Itch.io</a></span></span></li>
<li><a href="https://cronosoft.fwscart.com/TUT-TUT_Sinclair_ZX81_+_16K_RAM_on_cassette/p5357732_20270309.aspx" target="_blank">Get the Cassette from Cronosoft.</a></li>
<li>Play it on you iPad or iPhone, get a copy of <a href="https://apps.apple.com/us/app/zx81/id1180117434" target="_blank">ZX81 for IOS</a></li>
</ul>
<br />
<span style="font-size: large;"><b>ZX Spectrum Versions</b></span><br />
<br />
<ul>
<li>Physical Paper Type in release and Digital Copies will be available from <a href="https://paleotronic.com/" target="_blank">Paleotronic Magazine</a></li>
</ul>
<br />
<span style="font-size: large;"><b>Love the Game?</b></span><br />
<br />
<ul>
<li><a href="https://www.buymeacoffee.com/LjITrcG" target="_blank">Why not buy me a Coffee</a>, I needed quite a few writing it, and with more there could be a TuT-TuT II.</li>
</ul>
<br />
<br />
<br />
<br />
<br />David Stephensonhttp://www.blogger.com/profile/11637474307612171656noreply@blogger.com4tag:blogger.com,1999:blog-255603189167868415.post-37074874463172443482019-08-09T17:38:00.002+10:002023-02-19T15:11:08.098+11:00The NEC PC-8401 Reexamined: Part 1A few years back I came across an NEC PC-8401 and proceeded to write up a number of articles during a <a href="https://www.zx81keyboardadventure.com/search/label/Retro%20Challenge" target="_blank">Retro Challenge month on the machine</a>. Going by blog statistics since RC2017 ended, the NEC PC-8401 is just about as popular in 2019 as it was in 1984. Which is to say not at all. A sad state of affairs then, unlikely to be remedied by further posts concerning this laptop-esque computer. Still, no harm in trying is there?<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDodfT-c-lbQGJBUni2nyn-a7byrgXbiscEvor2UQvGCkMdlu9OWAFiAuA0zTDoPbNfg1-XsHOmJfUAJyK8fHnJKl496rtsGHfdxH8bn28Zqn_AqDhbcC8wUEvPcQXyQdYAoj_I-O8NLDb/s1600/pc-8401_kit_fix.png" style="margin-left: auto; margin-right: auto;"><img alt="" border="0" data-original-height="742" data-original-width="1600" height="296" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDodfT-c-lbQGJBUni2nyn-a7byrgXbiscEvor2UQvGCkMdlu9OWAFiAuA0zTDoPbNfg1-XsHOmJfUAJyK8fHnJKl496rtsGHfdxH8bn28Zqn_AqDhbcC8wUEvPcQXyQdYAoj_I-O8NLDb/s640/pc-8401_kit_fix.png" title="NEC PC-8401 with PC-8431A, PC-8441A & PC-8406A" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">NEC PC-8401 with PC-8431A, PC-8441A & PC-8406A Expansions</td></tr>
</tbody></table>
<div class="separator" style="clear: both; text-align: center;">
</div>
<h3>
A quick re-acquaintance With the PC-8401</h3>
For those who haven't read previous articles on the subject; the PC-8401 series of computers was one of NEC's attempts at introducing portable computing to the business masses. It's main focus is productivity applications, with Wordstar-To-Go, Calc-To-Go, Filer (card filing program) and telecommunications software built into ROM all spring boarding off a CP/M 2.2 OS core.<br />
<br />
On the hardware front the 8401 comes with a Z80A CPU, 64k battery backed static RAM (this is shared between RAM and RAM Disk), a rather splendid mechanical Alps keyboard and a just reasonable 80 column x 16 line reflective LCD display panel. Additionally some versions came with a built in 300 Baud modem (sadly not much use today).<br />
<br />
When at home or in the office, the machine is powered externally via a suitable 5v to 9v power brick. But what good is a laptop if you can't use it at the pub? Four C Cell batteries answer this pressing need, providing portable power while additionally retaining computer settings and program memory.<br />
<br />
<h3>
Not Quite the Standalone Computing Powerhouse</h3>
There are 2 major issues with the PC-8401 as a standalone laptop computer. Firstly and most importantly is the lack of physical memory. While the computer has 64k, 32k is devoted to file storage. This is just enough to keep some documents and spreadsheets stored on the device, but severally restricts what ever else you might like to store on the computer.<br />
<br />
Secondly, the screen is problematic, it is usable sure, but it isn't great by any stretch of the imagination. The contrast is poor, and compared to the LCD panel clarity of something like the Tandy model 100 it is not up to the task as a main display for extended periods of time.<br />
<br />
<h3>
It's the Peripherals that Make the PC-8401</h3>
It is the bewildering array of peripherals that lift the PC-8401 onto another level. Memory expansion modules, disk drive adapters and CRT monitor modules turn the basic unit into a fully functional C/PM workhorse. Turning the humble PC-8401 into just the kind of computer you'd want if determined to look oh so very serious about your office computing in 1985.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxOZMiOtsUAAquvQRn77DUOcN_iJmF9mWn7vKLCXJPYAYyU8lBZ6XXTJRiKXUd7OWXqGRUk0X9ONqbSnzQ2T65EY-DtektrthJ_vUIxsFO9hggiJk3BOkpAokh2N3EKEW7CG3jyoi7fQiF/s1600/PC-8401BM_Connection_of_Peripherals_cutout.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1158" data-original-width="1600" height="462" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxOZMiOtsUAAquvQRn77DUOcN_iJmF9mWn7vKLCXJPYAYyU8lBZ6XXTJRiKXUd7OWXqGRUk0X9ONqbSnzQ2T65EY-DtektrthJ_vUIxsFO9hggiJk3BOkpAokh2N3EKEW7CG3jyoi7fQiF/s640/PC-8401BM_Connection_of_Peripherals_cutout.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<br />
Perhaps the most valuable peripherals are the Disk adapter, CRT/disk adapter and memory expansions unlock the 32k constraints on storage. The base memory can be configured to use the full 64k, with all storage being taken care of by 3.5" DD disks or the memory expansion modules.<br />
<br />
<h3>
OK so Why the Renewed Interest?</h3>
<br />
Up until now I've not had more than the base unit to play with, and unfortunately even that started to suffer from some LCD problems with the conductive backing peeling of the panel. Luckily, over the past few months I've managed to secure a number of the much vaunted peripherals and a mostly working LCD panel.<br />
<br />
So with a (mostly) working LCD panel in place, we can begin exploring the following over the next couple of blog entries:<br />
<ul>
<li>PC-8406A 32k RAM Cartridge</li>
<li>PC-8441A CRT/Disk Adapter</li>
<li>PC-8431A Micro Floppy Disk Unit</li>
</ul>
<br />
I can confirm that the PC-8441A and PC-8406A are working just fine, however the PC-8431A is yet to be tested as it's a USA version with the wrong power supply for Australia. Not a huge obstacle, although it has delayed testing.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiM7XFjncLdyd27Fjp7MtubSpZrTAIfRGy91pNT-syq_FUEcYuOOD8PB8urtMe4lmV_yH6IKkah1hep6gJBaBbRfme0vw7EYCYwmyE4zFnlhVOsK9hXZRKFt2VQRTql8-K6L_dB8sYXH5ju/s1600/pc-8401-sw_fix.png" style="margin-left: auto; margin-right: auto;"><img alt="" border="0" data-original-height="1013" data-original-width="1600" height="404" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiM7XFjncLdyd27Fjp7MtubSpZrTAIfRGy91pNT-syq_FUEcYuOOD8PB8urtMe4lmV_yH6IKkah1hep6gJBaBbRfme0vw7EYCYwmyE4zFnlhVOsK9hXZRKFt2VQRTql8-K6L_dB8sYXH5ju/s640/pc-8401-sw_fix.png" title="NEC PC-8401 with working PC-8441A CRT/Disk Adapter" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">NEC PC-8401 with working PC-8441A CRT/Disk Adapter</td></tr>
</tbody></table>
In Part 2 we'll begin getting to grips with the expansion units and some of the issues I have with them. This all promises to be quite interesting, hopefully serving to bring this unique CP/M laptop somewhat out of obscurity.<div><br /></div><div>See all entries for this project: <a href="https://www.zx81keyboardadventure.com/2023/02/zxio-interface-for-zx81-part-1.html">Part 1</a>, <a href="https://www.zx81keyboardadventure.com/2023/02/zxio-interface-for-zx81-part-2.html">Part 2</a></div><div><br /></div><div><br />
<br /></div>David Stephensonhttp://www.blogger.com/profile/11637474307612171656noreply@blogger.com16