tag:blogger.com,1999:blog-55436086445850147942024-03-20T11:11:14.947-04:00Winterground Fairlands - A World Of Funmagineering!Various projects being worked on by the Funmagineering Gang at the Winterground Fairlands in Sklarsville, Maine!Scott Lawrencehttp://www.blogger.com/profile/15740562503843879527noreply@blogger.comBlogger97125tag:blogger.com,1999:blog-5543608644585014794.post-83391010497023049492022-10-07T20:00:00.002-04:002022-10-07T22:52:59.677-04:00RetroChallenge 2022-10: The Map, a Spreadsheet, and a disk image...<div class="separator" style="clear: both; text-align: center;"><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6BVGCbkYjfEgEQlkWk1pG_GGtwsvQrPPC3HpXb5qA3Ld7r72wgpCNbofhc9cwIA5h165UZfHD_O-qzTnLO1YayqaDaJyycPc88GNB_NS2sEdjHS7pZSBGgpm4yhRiKk3409j69i5f7Cb8SUIVZKni0Z1p73qx7WzGKdHFNUTLtv7VEBozmBCmIj2Y/s1543/my_map.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="402" data-original-width="1543" height="166" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6BVGCbkYjfEgEQlkWk1pG_GGtwsvQrPPC3HpXb5qA3Ld7r72wgpCNbofhc9cwIA5h165UZfHD_O-qzTnLO1YayqaDaJyycPc88GNB_NS2sEdjHS7pZSBGgpm4yhRiKk3409j69i5f7Cb8SUIVZKni0Z1p73qx7WzGKdHFNUTLtv7VEBozmBCmIj2Y/w640-h166/my_map.png" width="640" /></a></div><div class="separator" style="clear: both; text-align: left;">I now once again have a map to use! The black circle in the Atlantic is the starting position. The open circles are all of the locations you can visit. (China, Japan, San Francisco, Washington DC, New York City, The Caribbean, England, Switzerland, Greece, Egypt and India.) The black lines are "preferred" ways to go, and the pink lines are unnecessary loops, dead ends, and game-ending branches of the maze</div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;">I started with a printout of the image from the previous post, and played the game a bunch just to explore the map. I also started writing down what items you can get from which locations, which I've condensed down into a <a href="https://docs.google.com/spreadsheets/d/1rnHhsoz8V4-MN0aOVd8MNiWmuolQBBr2Q8_MEyBeJx0/edit?usp=sharing" target="_blank">google sheet which is available as I work on it here</a>. </div><div class="separator" style="clear: both; text-align: left;"><br /></div><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGNNKWm5co2VwW2NzrUReqVZmQan1Q3VtfVyC_LMwhdxH2_DN9TV0-m2u6jgkUjlsV9sUJTel8slb4cmurrDctw2x-W4-HNNyqzaiVkk3SpQ2NK1uqsAAEA5utw0b9XPfS7_PKr31QgML480fRnlF_aBc_9ZMt-2C9ccFkDvjXsTs3JGlX-7sQQvZ-/s837/IMG_9138.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="441" data-original-width="837" height="338" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGNNKWm5co2VwW2NzrUReqVZmQan1Q3VtfVyC_LMwhdxH2_DN9TV0-m2u6jgkUjlsV9sUJTel8slb4cmurrDctw2x-W4-HNNyqzaiVkk3SpQ2NK1uqsAAEA5utw0b9XPfS7_PKr31QgML480fRnlF_aBc_9ZMt-2C9ccFkDvjXsTs3JGlX-7sQQvZ-/w640-h338/IMG_9138.jpg" width="640" /></a></div><br /><br /><div class="separator" style="clear: both;">I checked it against maps online, and it seems to be 100% the same as those. I really wanted to make the map entirely by myself rather than using one from the 'net.</div><div class="separator" style="clear: both;"><br /></div><div class="separator" style="clear: both;">Once I mapped it out the entire thing, I re-opened Photoshop and added a new map layer, and reduced down the map to only the segments that I should use in the game... eliminating dead ends, unnecessary loops, and places that will just end the game. </div><p>Last night I also played a bit, streaming to my <a href="https://www.twitch.tv/bleullama" target="_blank">BleuLlama account on Twitch</a>, which was my first time doing that too. I learned a lot about how NOT to do it, and things to improve for the next time I play... I also need to figure out how to get it to record the stream for later viewing. </p><p>One of the snagging points was that my disk image for C64 of the game was corrupted, so I also had to track down another copy that worked. I think I'll prefer playing on the C64 because after the game is loaded, the transitions are much quicker than they are on the Amiga version.</p>Scott Lawrencehttp://www.blogger.com/profile/15740562503843879527noreply@blogger.com0tag:blogger.com,1999:blog-5543608644585014794.post-67789517167976997122022-10-06T12:43:00.001-04:002022-10-06T12:43:13.847-04:00RetroChallenge 2022-10: Beginnings<p> </p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgG4HY76cnTU7zN8OwnVM1P02k4NZR0qbUKBA8ydKzdw7tPmAVq1Hzd_Aermsk1_owaHFS3aZWNmcWFMiRzhgK6LUn6kxxaJmQVvgxfqOfxeqIkmAtok4R1XCxbS4cE7RLRbz_KmeMOcgGidkfhrUpAExHpHf4jiCgZztbOTuGdhi_6SUi29LSTWVWK/s1543/map_base.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="402" data-original-width="1543" height="166" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgG4HY76cnTU7zN8OwnVM1P02k4NZR0qbUKBA8ydKzdw7tPmAVq1Hzd_Aermsk1_owaHFS3aZWNmcWFMiRzhgK6LUn6kxxaJmQVvgxfqOfxeqIkmAtok4R1XCxbS4cE7RLRbz_KmeMOcgGidkfhrUpAExHpHf4jiCgZztbOTuGdhi_6SUi29LSTWVWK/w640-h166/map_base.png" width="640" /></a></div>Just to get started, I quickly mashed together a couple screenshots from the game, drew a grid and adjusted colors so that I had this map template. Every possible place on the planet that you can move the robot to is here. Most of these positions you cannot actually get to, but that's fine. I printed out a copy and will run through the game, just to map it all out, without actually doing any of the "talking with spies" nonsense. I know enough to avoid a certain area, but i'm gonna map out the maze there anyway. ;D<p></p>Scott Lawrencehttp://www.blogger.com/profile/15740562503843879527noreply@blogger.com0tag:blogger.com,1999:blog-5543608644585014794.post-45380911539042770092022-10-06T10:18:00.006-04:002022-10-06T10:18:52.842-04:00RetroChallenge 2022-10 : Hacker!<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKGhnCazrsTCHjB9SiPoisByKW6autdXM2PpZZvfMpmzXdc2cWGE5r2XuOV_ViLBK9v0kZUTJPcCM52nCelG3r7eob1l2HS93zrJgNyQ08SXzP8Dj4NaKxXMjLKn20xG5r2nLPct_o5c3CyNINihsYmalgmhupoJSBJb7bvCe3sTKGeyKOXVfk5OwH/s2061/Screen%20Shot%202022-10-06%20at%2010.14.07%20AM.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1489" data-original-width="2061" height="462" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKGhnCazrsTCHjB9SiPoisByKW6autdXM2PpZZvfMpmzXdc2cWGE5r2XuOV_ViLBK9v0kZUTJPcCM52nCelG3r7eob1l2HS93zrJgNyQ08SXzP8Dj4NaKxXMjLKn20xG5r2nLPct_o5c3CyNINihsYmalgmhupoJSBJb7bvCe3sTKGeyKOXVfk5OwH/w640-h462/Screen%20Shot%202022-10-06%20at%2010.14.07%20AM.png" width="640" /></a></div><p>I've decided that for RetroChallenge 2022-10, I'm gonna finally win the game "Hacker" from Activision. I will probably play it on an Amiga emulator on my modern laptop, perhaps streaming gameplay on <a href="https://www.youtube.com/channel/UClSAzzF1__x7JsOzkxUwA9Q" target="_blank">my YouTube channel</a> or <a href="https://www.twitch.tv/bleullama" target="_blank">my Twitch channel</a> (which I've not set up yet.) I'll send a tweet through on <a href="https://twitter.com/yorgle" target="_blank">my twitter</a> when I'm gonna stream or whatever.</p><p>The basic premise of "Hacker" game is that... well, you don't know when you start it up. The only instructions included with it originally were "insert game disk, turn on computer"... that's it. You have to figure things out, how to use the interface, everything, just by playing it. I love this. You have to navigate this robot around the earth, trading stuff from your inventory with various spies, to get all of the pieces of a shredded document. Some spies will trade for multiple items and some spies will only trade for specific things, so you need to get it right.</p><p>"Hacker 2" had a similar concept, but it was controlling a robot inside of a building where you also had control of four video screens, four tape recorders, and a bunch of surveillance cameras to be bypassed. It's a lot more complicated of a puzzle... for another time..</p><p>Anyway, I've loved the concept of this game since I first got it in the mid-80s for my Amiga. I got pretty far in it, but my map got thrown out or lost, and I never really returned to it. So part of this will be recreating a map so that I can figure out where I am and how to get around in the maze of game... especially once the map disappears.</p><p>Additional update posts will be made here to this blogger thingy as I progress.</p><p>I'd like to solve it for the first time on my actual Amiga 1000 if possible, which is in storage/on display in my office right now, so I may need to do some quick restoration of it to get it running for this. ;D</p><p>I may also stream/do a run through of the game on C64 since I have that one set up and ready to go right now.</p><p>Hm. It might be fun to solve it on every platform I have. I also have an Apple IIc that's easy to set up... hmmm... :D</p>Scott Lawrencehttp://www.blogger.com/profile/15740562503843879527noreply@blogger.com0tag:blogger.com,1999:blog-5543608644585014794.post-20795237556378970432022-08-24T20:29:00.009-04:002022-08-24T20:29:57.661-04:00My Lego/Technic Saab 900 and Popup Camper<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyGLNhqIKtHp_MOq-hrMR3YDgacEB6ll4cguxhmR-hoawIbTVWJvHsv2DLl3XZfCSfczE3rWoJ_lXhIi6iuhOrelYeaXTP1Hifb_9CzVrqMDPUTGpBTR6myCcWZzdO43wgg0dfux6l0YxKGptrDxO89JgIjq8_0IejxXRY_TGiXKZdILPLkCzgNfjd/s1024/IMG_8718.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="768" data-original-width="1024" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjyGLNhqIKtHp_MOq-hrMR3YDgacEB6ll4cguxhmR-hoawIbTVWJvHsv2DLl3XZfCSfczE3rWoJ_lXhIi6iuhOrelYeaXTP1Hifb_9CzVrqMDPUTGpBTR6myCcWZzdO43wgg0dfux6l0YxKGptrDxO89JgIjq8_0IejxXRY_TGiXKZdILPLkCzgNfjd/s320/IMG_8718.jpg" width="320" /></a></div><div class="separator" style="clear: both; text-align: center;">My mid-80s (flatnose) 1:12 scale Saab 900 Turbo. I 3D printed my own set of 24-spoke "manhole cover" wheel covers for it. I have a design for the "Inca" wheels too, but I can't get them to print right.</div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRaEWogH0vD6OEqST7fxZgVTERNIdzIj2eDfgrRDqD772QeBGM9_VI49xAiz1h8ktXPPktDGFJW53B8ZvU-hXqfceTad21Pe30JjOJ5KPR4cq4v3zSDpXvNjkTlqjlyZM7luWclvl8CAgbLG0kv7nNUAMPX6bcrfAp62LQ6EQngzcKxSJEvbTMlAQJ/s1024/IMG_8720.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="768" data-original-width="1024" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgRaEWogH0vD6OEqST7fxZgVTERNIdzIj2eDfgrRDqD772QeBGM9_VI49xAiz1h8ktXPPktDGFJW53B8ZvU-hXqfceTad21Pe30JjOJ5KPR4cq4v3zSDpXvNjkTlqjlyZM7luWclvl8CAgbLG0kv7nNUAMPX6bcrfAp62LQ6EQngzcKxSJEvbTMlAQJ/s320/IMG_8720.jpg" width="320" /></a></div><div class="separator" style="clear: both; text-align: center;">Rear shot showing the back lights and trailer hitch.</div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtSZYRUELfp3NIDH0OAhkvf2WC5xHIgLxIMl-RfmvKKvTn4wy8-Gm19YUf9V5ZAGlY69d8frf7375ISvOSlVCehB_oqgi6BK5cL29zIlti0bBJx1bLmeJPHOT9lio8Ci7efMDrZbi3H69z--ViC1TZOQZvELcZdEkM4bskPmf9_p6eXDdnVBgwFuyE/s1024/IMG_8721.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="768" data-original-width="1024" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjtSZYRUELfp3NIDH0OAhkvf2WC5xHIgLxIMl-RfmvKKvTn4wy8-Gm19YUf9V5ZAGlY69d8frf7375ISvOSlVCehB_oqgi6BK5cL29zIlti0bBJx1bLmeJPHOT9lio8Ci7efMDrZbi3H69z--ViC1TZOQZvELcZdEkM4bskPmf9_p6eXDdnVBgwFuyE/s320/IMG_8721.jpg" width="320" /></a></div><div class="separator" style="clear: both; text-align: center;">The trunk hatch opens!</div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhypM4c88lqbIh6WsBiktFOPj9Sv3h4XLzfM8OCnZD4j9s0Ex5J2pbkwpVVjNkU-aFnlpAMUFrNDfDfbGImNM3GL0gKKH0K5-WFX2XD8o0YPvgMk3-8P3ky_eVkIKA9B0fI-Oj3IYhrj0BULTpCIhASZDlH8kHfT0OL4IQNgauXBdsrlLS8lX-2-tbr/s1024/IMG_8722.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="768" data-original-width="1024" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhypM4c88lqbIh6WsBiktFOPj9Sv3h4XLzfM8OCnZD4j9s0Ex5J2pbkwpVVjNkU-aFnlpAMUFrNDfDfbGImNM3GL0gKKH0K5-WFX2XD8o0YPvgMk3-8P3ky_eVkIKA9B0fI-Oj3IYhrj0BULTpCIhASZDlH8kHfT0OL4IQNgauXBdsrlLS8lX-2-tbr/s320/IMG_8722.jpg" width="320" /></a></div><div class="separator" style="clear: both; text-align: center;">And the hood slides open just like the real one. Also you can see the 3D printed steering wheel.</div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgP7TNKwc8IZpiMkgSWVDTQJZhduamfR4ALZ1J6PeLveiZtn6ornliS_TMOoWe5eOrKm3mIiS2Ki7R11Hzcc2pkSdxS1O9GagrtKDT9DChW2zjj8-_CPXcbfDS8oowYLdATrjkZqEVBTNiLF_Loirtqd4WGNWoy3zN868CQU5zrDmhQtR5Ze6YWaUWE/s1024/IMG_8723.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="768" data-original-width="1024" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgP7TNKwc8IZpiMkgSWVDTQJZhduamfR4ALZ1J6PeLveiZtn6ornliS_TMOoWe5eOrKm3mIiS2Ki7R11Hzcc2pkSdxS1O9GagrtKDT9DChW2zjj8-_CPXcbfDS8oowYLdATrjkZqEVBTNiLF_Loirtqd4WGNWoy3zN868CQU5zrDmhQtR5Ze6YWaUWE/s320/IMG_8723.jpg" width="320" /></a></div><div class="separator" style="clear: both; text-align: center;">Trailer hitch? Let's hook up a trailer!</div><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: center;">This is a 1:12 scale reproduction of our Forest River 2318G pop up camper... </div><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: center;">Let's look at that and all of its features in more detail now!</div><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: center;"><br /></div><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/AVvXsEiBtIXn4OyrWdfuMdqZUlcOWhHvn1HoBQCp5QAPgpShaFBME9A36Ool7wVi7clRw_Lp2Jce78_qDX32Z3E2Fe_cEgBvWSma57kibVJ28dSWAE-XJvJLv_pHVafYOwnXCvIOFRqRDSNZQXL28DpWykAL70SoR0u-_WRXjpiGvW_Xis10nlsmd41PZgTk/s1024/IMG_8724.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="768" data-original-width="1024" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBtIXn4OyrWdfuMdqZUlcOWhHvn1HoBQCp5QAPgpShaFBME9A36Ool7wVi7clRw_Lp2Jce78_qDX32Z3E2Fe_cEgBvWSma57kibVJ28dSWAE-XJvJLv_pHVafYOwnXCvIOFRqRDSNZQXL28DpWykAL70SoR0u-_WRXjpiGvW_Xis10nlsmd41PZgTk/s320/IMG_8724.jpg" width="320" /></a></div><div class="separator" style="clear: both; text-align: center;">First, let's detach it from the car.</div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5CB_94Wmo6nRBB-5gqvnYKaYlcePz-Z3nuzifCL_I8Dm8QNqmhCaS_Qr5kiunnckIAy70lksjPeVYgcVS7qn51kdE6OhJDqfvo6YWGgKqSMKVAjaNW_mhXpNbfBNZSW5Qiwr8Dlp8p1KLZJ7X0zoG518_-Hsxipb7968EvX1Pj8-gPyw8zap5IgdJ/s1024/IMG_8727.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="768" data-original-width="1024" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5CB_94Wmo6nRBB-5gqvnYKaYlcePz-Z3nuzifCL_I8Dm8QNqmhCaS_Qr5kiunnckIAy70lksjPeVYgcVS7qn51kdE6OhJDqfvo6YWGgKqSMKVAjaNW_mhXpNbfBNZSW5Qiwr8Dlp8p1KLZJ7X0zoG518_-Hsxipb7968EvX1Pj8-gPyw8zap5IgdJ/s320/IMG_8727.jpg" width="320" /></a></div><div class="separator" style="clear: both; text-align: center;">Lower the small support wheel first of course!</div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisjOEbehuGYftXUGyfvGMOKXPQoCz3sC1PfRfpp3_Fp1CqYmaSl3kvG3MJQIqsfs7Xv47_4xdADsq-QYavBMBT-JQ48F2d03IXLRWohJJE4X6f5-Gw9EzJDQ5xmgXkH7Fb46fZpwzEp56CwprohrXCbu0YKyRTTnWOMACFD-bmV9kArmaPmP2AniIT/s1024/IMG_8728.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="768" data-original-width="1024" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisjOEbehuGYftXUGyfvGMOKXPQoCz3sC1PfRfpp3_Fp1CqYmaSl3kvG3MJQIqsfs7Xv47_4xdADsq-QYavBMBT-JQ48F2d03IXLRWohJJE4X6f5-Gw9EzJDQ5xmgXkH7Fb46fZpwzEp56CwprohrXCbu0YKyRTTnWOMACFD-bmV9kArmaPmP2AniIT/s320/IMG_8728.jpg" width="320" /></a></div><div class="separator" style="clear: both; text-align: center;">Lower the four stabilizers in each of the four corners.</div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijyHnDQkQd6jNo6lSTBeJ0np5D5UieyHK9NahHU7xYs05_NHnqVFunrnjXc45gM9yznecUrgJWn1LHNm_KHOGxtbcXCknEnmvENq7tFY3KQnKWLMfTSl1eDrpOMIlLcRXujtuEJ7JIpm2uoOlYXSN7QINC-7RIZF5aUdb5Xc8xyQUd40UdAPe8L4K6/s1024/IMG_8729.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="768" data-original-width="1024" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijyHnDQkQd6jNo6lSTBeJ0np5D5UieyHK9NahHU7xYs05_NHnqVFunrnjXc45gM9yznecUrgJWn1LHNm_KHOGxtbcXCknEnmvENq7tFY3KQnKWLMfTSl1eDrpOMIlLcRXujtuEJ7JIpm2uoOlYXSN7QINC-7RIZF5aUdb5Xc8xyQUd40UdAPe8L4K6/s320/IMG_8729.jpg" width="320" /></a></div><div class="separator" style="clear: both; text-align: center;">Next, let's turn the crank to raise the top!</div><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/AVvXsEjTBxvuKWVV5VkefYGs9HU87RlsPU9TxtgADmQhENCjzGhBleTDJ8LFXbPDmSmMKkOl--7wevBM9sAbBMUh_uJUHdVVRIbfgbFiObqECclRy3rrvEnH7jPbY53btdKRtbI01jrZZOgqhsKX8LsFPO12U75lmTsQ3TNP9PnGaDvvcflc6a2S8qlOj0_7/s1024/IMG_8726.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1024" data-original-width="768" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjTBxvuKWVV5VkefYGs9HU87RlsPU9TxtgADmQhENCjzGhBleTDJ8LFXbPDmSmMKkOl--7wevBM9sAbBMUh_uJUHdVVRIbfgbFiObqECclRy3rrvEnH7jPbY53btdKRtbI01jrZZOgqhsKX8LsFPO12U75lmTsQ3TNP9PnGaDvvcflc6a2S8qlOj0_7/s320/IMG_8726.jpg" width="240" /></a></div><div class="separator" style="clear: both; text-align: center;">The lifting mechanism is based on the real one. One string from the crank pulls a liftarm that slides, which pulls the four additional strings that go to each corner's telescoping lifter. I used some "rigid" tubes to help guide the strings better.</div><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: center;">The only issue is that by the time the force of the string pulling gets to the end bits of the liftarm, there's not a lot of power left... so it can lift the arms just fine, but not when the roof is in place. So we need to remove the roof first...</div><div class="separator" style="clear: both; text-align: center;"><br /></div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhEPp9v3fxYQsRk1gE0oI2kXByp1jpXcgsdugURFHeMApN3WsNxFNjyJbGtEalaUashCXTvAm6dmfqvsXr6iO11NMjr5f-Kp-fjVbEhvxQ4X2Xi6iKMKTknhd2u7kI1wvV6M-xUkzn_tbhBCVjHopREb8aodXPi249712-bDkj0XCwOLqvOFBoBKDqD/s1024/IMG_8730.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="768" data-original-width="1024" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhEPp9v3fxYQsRk1gE0oI2kXByp1jpXcgsdugURFHeMApN3WsNxFNjyJbGtEalaUashCXTvAm6dmfqvsXr6iO11NMjr5f-Kp-fjVbEhvxQ4X2Xi6iKMKTknhd2u7kI1wvV6M-xUkzn_tbhBCVjHopREb8aodXPi249712-bDkj0XCwOLqvOFBoBKDqD/s320/IMG_8730.jpg" width="320" /></a></div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNTxrQKazJWRLNg0TVnDgPekFAarekGqcWZraH8gbObzXsdTV-judyfMAeWb9oJO_t9BaWhkYT2AcdktGfTZj50sXyZxwPJsB8n1OhV9hJ3yAuAjb4EUDfK6clu46q2xfvSH66qc_alsC2EFRhQY7OLuIiV3HFtvhCoG5ACgyDiVejRCuQnEGPZ9QF/s1024/IMG_8731.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="768" data-original-width="1024" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNTxrQKazJWRLNg0TVnDgPekFAarekGqcWZraH8gbObzXsdTV-judyfMAeWb9oJO_t9BaWhkYT2AcdktGfTZj50sXyZxwPJsB8n1OhV9hJ3yAuAjb4EUDfK6clu46q2xfvSH66qc_alsC2EFRhQY7OLuIiV3HFtvhCoG5ACgyDiVejRCuQnEGPZ9QF/s320/IMG_8731.jpg" width="320" /></a></div><div class="separator" style="clear: both; text-align: center;">Turn the crank and it lifts the four corners!</div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJKS_khtXtVL6g133eV7u1dlTbX1SgPv7fjP2U7QYY5CkvqCTDPiqQu5HFSZlV2_mrKXZCQuAgsC_SEunoeO0NbTS2SafzanzGRuQexLb03v-p27-KnsNgxblZuukOMJGfPLPLzmbT4_fszRSp6C_mMuDu-GJgXpbzrx6aZIG9vrN64nu-Z7_gfzTt/s1024/IMG_8732.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="768" data-original-width="1024" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJKS_khtXtVL6g133eV7u1dlTbX1SgPv7fjP2U7QYY5CkvqCTDPiqQu5HFSZlV2_mrKXZCQuAgsC_SEunoeO0NbTS2SafzanzGRuQexLb03v-p27-KnsNgxblZuukOMJGfPLPLzmbT4_fszRSp6C_mMuDu-GJgXpbzrx6aZIG9vrN64nu-Z7_gfzTt/s320/IMG_8732.jpg" width="320" /></a></div><div class="separator" style="clear: both; text-align: center;">And now we can put the roof back in place.</div><div class="separator" style="clear: both; text-align: center;"><br /></div><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/AVvXsEgYIgcZkU-38Q9OwoqoEZdxKmPZndt5X69Pl6vQqUff5hnTGOqE0D55AK_hlsyNkLVEF0Pr5v70LFjIWsinLKNXE-4ID_ZP33-OU1OehtiAXHUiE0KTL-8CCaSKfrqgePLVlkzTzqluG64ysstrDptwlcghPbMiZQDXt1qbrczUdxACYkMIS9Axr6ZV/s1024/IMG_8733.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="768" data-original-width="1024" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgYIgcZkU-38Q9OwoqoEZdxKmPZndt5X69Pl6vQqUff5hnTGOqE0D55AK_hlsyNkLVEF0Pr5v70LFjIWsinLKNXE-4ID_ZP33-OU1OehtiAXHUiE0KTL-8CCaSKfrqgePLVlkzTzqluG64ysstrDptwlcghPbMiZQDXt1qbrczUdxACYkMIS9Axr6ZV/s320/IMG_8733.jpg" width="320" /></a></div><div class="separator" style="clear: both; text-align: center;">Slide out the front bed...</div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVtvNVkOlLJTx250NQGISnfnbkOq59EQbX99bbJgqTOC-NfDnWu-YWC57Hye5hFgVt5Pjn_JG9luJqli7dHR60DXjfL-t8a8yPkV3CN1g6fAvk7hTKkiJy-PWTr_O48TmWmWqM652vboKzECpWHnLmRDzMnEa_O3RhyQ_wo_ZGquKtfsnpAVt-AjqO/s1024/IMG_8734.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="768" data-original-width="1024" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVtvNVkOlLJTx250NQGISnfnbkOq59EQbX99bbJgqTOC-NfDnWu-YWC57Hye5hFgVt5Pjn_JG9luJqli7dHR60DXjfL-t8a8yPkV3CN1g6fAvk7hTKkiJy-PWTr_O48TmWmWqM652vboKzECpWHnLmRDzMnEa_O3RhyQ_wo_ZGquKtfsnpAVt-AjqO/s320/IMG_8734.jpg" width="320" /></a></div><div class="separator" style="clear: both; text-align: center;">and lower its support stabilizers</div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgH_lDr3OppfXKGyDjchvGDFqaK8Bhp7haUa0VXXI_obH7ZexZnZlT9i-ma0OsrS7gOkls3dWtBSf3gATsMgmrrwA9tKCz6wpxn6As18pIGjKecGJf8ZEPehuZvDuEbeQDMH3D8ZXVzJPu6zzgC3clkSx4z6N3akZw4hna299NCQ-sE97MLvg-gmWk1/s1024/IMG_8735.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="768" data-original-width="1024" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgH_lDr3OppfXKGyDjchvGDFqaK8Bhp7haUa0VXXI_obH7ZexZnZlT9i-ma0OsrS7gOkls3dWtBSf3gATsMgmrrwA9tKCz6wpxn6As18pIGjKecGJf8ZEPehuZvDuEbeQDMH3D8ZXVzJPu6zzgC3clkSx4z6N3akZw4hna299NCQ-sE97MLvg-gmWk1/s320/IMG_8735.jpg" width="320" /></a></div><div class="separator" style="clear: both; text-align: center;">Next we fold up the end fabric support frame</div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKrtB6JpbSw3Lj8XG7fnCRhx1rXc1dJdUd6fVq1Sd7ECRnuGL1aFEfhtnTZdRgFLwtLyFGss65gLrxkaSRrQtPtAGpmOJbjd37aRGdzid8neu0bK-KQ9LMl6iDKkvV1M1M5IpJVHGPyMHTCriBoXrXGOZvg8m92Cx9sqLynzzqPZrk6tWGOMZIqWDh/s1024/IMG_8736.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="768" data-original-width="1024" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjKrtB6JpbSw3Lj8XG7fnCRhx1rXc1dJdUd6fVq1Sd7ECRnuGL1aFEfhtnTZdRgFLwtLyFGss65gLrxkaSRrQtPtAGpmOJbjd37aRGdzid8neu0bK-KQ9LMl6iDKkvV1M1M5IpJVHGPyMHTCriBoXrXGOZvg8m92Cx9sqLynzzqPZrk6tWGOMZIqWDh/s320/IMG_8736.jpg" width="320" /></a></div><div class="separator" style="clear: both; text-align: center;">and hook in the roof support bar</div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9ma0S6bDyIHfNaPAwRiT_R_d6Lm5ppwSrzxVzHj6VCp14w-RryqRvMyV_dYC2IAhMyY4fe2VeHPPSnz1QVkQ2f0rO-GN8o57s16wY2KBs0sVGk4qewIYu5FHw4xPDXMrZsLeWKxLj1xVe9CFQ1hOpfXt1oD1XTRnghE808btLlN3wZ1u1ukC6y5AD/s1024/IMG_8737.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="768" data-original-width="1024" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9ma0S6bDyIHfNaPAwRiT_R_d6Lm5ppwSrzxVzHj6VCp14w-RryqRvMyV_dYC2IAhMyY4fe2VeHPPSnz1QVkQ2f0rO-GN8o57s16wY2KBs0sVGk4qewIYu5FHw4xPDXMrZsLeWKxLj1xVe9CFQ1hOpfXt1oD1XTRnghE808btLlN3wZ1u1ukC6y5AD/s320/IMG_8737.jpg" width="320" /></a></div><div class="separator" style="clear: both; text-align: center;">and then we repeat this for the rear bed.</div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiiG4JGkUgx1Q6bgLfhMfk6lSKSlmbgeilv8-9gZrLlmPU_JaG1Uskatu1dFAglAXk9RRK4E4ndhKvQh2HU57yn5_nzyNR011ofeMut0IfNdQ08HeUQq1pjgKUI8aYUXJkSreVMajPVN74kEXsivLxCn8Tg_w1eOv-3YZO5qLvAz6vedJOcBmBCSFdo/s1024/IMG_8738.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="768" data-original-width="1024" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiiG4JGkUgx1Q6bgLfhMfk6lSKSlmbgeilv8-9gZrLlmPU_JaG1Uskatu1dFAglAXk9RRK4E4ndhKvQh2HU57yn5_nzyNR011ofeMut0IfNdQ08HeUQq1pjgKUI8aYUXJkSreVMajPVN74kEXsivLxCn8Tg_w1eOv-3YZO5qLvAz6vedJOcBmBCSFdo/s320/IMG_8738.jpg" width="320" /></a></div><div class="separator" style="clear: both; text-align: center;">Looking good! Next we need to slide out the dinette. </div><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: center;">Look, i know it's ridiculous to have a slide-out on a popup camper, but this is based on my real camper that does this. And it is ridiculous. :D</div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2d6NeiFkIPq-YLEKqfS3n5zsAuOydCf2AJim2eQH-EFobqTozdryXHAIq9alGj25e7YbC7QPUfLOwTclIrW-29c_IJf2oev2yczDK3sLtSAmfHyZq31bV2WN-zTvRvmWVEcGq5uC3ICM9mQFBewRdeKarIvLq4K6jqVTPLmJO1SBNBTvT_pL7Bx6s/s1024/IMG_8739.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="768" data-original-width="1024" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2d6NeiFkIPq-YLEKqfS3n5zsAuOydCf2AJim2eQH-EFobqTozdryXHAIq9alGj25e7YbC7QPUfLOwTclIrW-29c_IJf2oev2yczDK3sLtSAmfHyZq31bV2WN-zTvRvmWVEcGq5uC3ICM9mQFBewRdeKarIvLq4K6jqVTPLmJO1SBNBTvT_pL7Bx6s/s320/IMG_8739.jpg" width="320" /></a></div><div class="separator" style="clear: both; text-align: center;">It just slides right out, no supports underneath needed.</div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsCzyZ1Q3xdmB6-VewgRvY6wjfNFU6GvVLVgLz5bdZdNCezpiuCgcuddHG4MPuNtsEBCnaUmOgaXhzEy96M3oNV93-H8ojQm5KcYUTyNaPQZj9Hg_OqZRx9yczJDG4-GPeNcU3qhmVz8ncHHQLS6nUmKH7spPHdDWcWT-yBTGTMXTsfbgN5NqLGBrE/s1024/IMG_8741.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="768" data-original-width="1024" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsCzyZ1Q3xdmB6-VewgRvY6wjfNFU6GvVLVgLz5bdZdNCezpiuCgcuddHG4MPuNtsEBCnaUmOgaXhzEy96M3oNV93-H8ojQm5KcYUTyNaPQZj9Hg_OqZRx9yczJDG4-GPeNcU3qhmVz8ncHHQLS6nUmKH7spPHdDWcWT-yBTGTMXTsfbgN5NqLGBrE/s320/IMG_8741.jpg" width="320" /></a></div><div class="separator" style="clear: both; text-align: center;">Fold out the side frame and insert the roof support</div><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/AVvXsEiA0vZSbFy6wMTpKa6V3TUUC88ahjAja0_No6Leu-7s_rrmSXHwwFc3HrX32hHKRVY5wZtQg9l--5-oRxXOTeG_56H4pxJG5kuR7ZimNH4ozlCAtBuuFiLJWVrr-F0ekQkKXLctMkxIcNOZvAG5I9k2KsQJ0rn_fAayDsVEbPiCs-C844koCK4Pqa1b/s1024/IMG_8743.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="768" data-original-width="1024" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiA0vZSbFy6wMTpKa6V3TUUC88ahjAja0_No6Leu-7s_rrmSXHwwFc3HrX32hHKRVY5wZtQg9l--5-oRxXOTeG_56H4pxJG5kuR7ZimNH4ozlCAtBuuFiLJWVrr-F0ekQkKXLctMkxIcNOZvAG5I9k2KsQJ0rn_fAayDsVEbPiCs-C844koCK4Pqa1b/s320/IMG_8743.jpg" width="320" /></a></div><div class="separator" style="clear: both; text-align: center;">The only remaining thing to do is to pull out the step that helps you get in easier!</div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxHVc4txogxZw0CGhXb27o6OkQ-kvpES6UuWjZnygKCYZONCSEQXD3gi5t0dVNCGFPTrVCnqO2y38ua9XFgORUyNuWI1ziiiLW0TmQ-2RI-rByzLILfvauVHXZ11Kb8_IxZSZisoS0W4Zaq-1-mR9H9WCf94QoazOWdQFMiUl9W2WfG_ZXiA6CUt34/s1024/IMG_8744.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="768" data-original-width="1024" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxHVc4txogxZw0CGhXb27o6OkQ-kvpES6UuWjZnygKCYZONCSEQXD3gi5t0dVNCGFPTrVCnqO2y38ua9XFgORUyNuWI1ziiiLW0TmQ-2RI-rByzLILfvauVHXZ11Kb8_IxZSZisoS0W4Zaq-1-mR9H9WCf94QoazOWdQFMiUl9W2WfG_ZXiA6CUt34/s320/IMG_8744.jpg" width="320" /></a></div><div class="separator" style="clear: both; text-align: center;">There we go! On the real camper, the entrance door is right there in front of the wheel.</div><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: center;"><div class="separator" style="clear: both;">And that's it! The camper is all set up now!</div><div class="separator" style="clear: both;">Here are some more pics of the completely setup camper, as well as the real one that it's based on...</div><div class="separator" style="clear: both;">which it's been sitting on this whole time! HA!</div></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMz6TrB8heAl1UHA8usNMZzsehD279QFoP_li5lBM6RK8-1Wa_Kai54935GvSoxIdNwLwPSFkbXHPAuTfmp4XOIcbMsNnJyrD_Nj35WbkiXZZurIyGu5eYBMvSqooKXdw8YLCVMXnQfuTt_YPrywZ0d93m2qwyIHLNedJ3aU7isNgLJ2egxgCGg0zQ/s1024/IMG_8745.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="768" data-original-width="1024" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMz6TrB8heAl1UHA8usNMZzsehD279QFoP_li5lBM6RK8-1Wa_Kai54935GvSoxIdNwLwPSFkbXHPAuTfmp4XOIcbMsNnJyrD_Nj35WbkiXZZurIyGu5eYBMvSqooKXdw8YLCVMXnQfuTt_YPrywZ0d93m2qwyIHLNedJ3aU7isNgLJ2egxgCGg0zQ/s320/IMG_8745.jpg" width="320" /></a></div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhoPvNC5RAC6Z3V8y8X-QHQxXcl1HArdxcbYm5rHVkxxePMuiZ-2JeoKO90dugfLY_xcsZM3CmiHgZM_C-bamcMEX9gG06UVgUVrd-_e_S_ogn5kQOHfPeqm6v_KLpLuWKHPkrvm7b8k7ne7CoPDhGEkkcWskchIbzKg_ADPbTkPOWdq2mKIbNzCTGx/s1024/IMG_8746.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="768" data-original-width="1024" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhoPvNC5RAC6Z3V8y8X-QHQxXcl1HArdxcbYm5rHVkxxePMuiZ-2JeoKO90dugfLY_xcsZM3CmiHgZM_C-bamcMEX9gG06UVgUVrd-_e_S_ogn5kQOHfPeqm6v_KLpLuWKHPkrvm7b8k7ne7CoPDhGEkkcWskchIbzKg_ADPbTkPOWdq2mKIbNzCTGx/s320/IMG_8746.jpg" width="320" /></a></div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUiQV3w_epp7ljx3tCR-leIfb7KlKV9vsbKrShndPj7b4njp3IXtAJBktzvUqnFFSdcwaJnP9w3G14hwh4HG3LYxuwfagLrSXiOQQEbNKzyT7AU8t1PkSFjbnW_-S1O89j-syZb4jwUb_8cdKEjBEZDfN2-DfI6_KxSmuahQBKZToXE_KzufYlrVdD/s1024/IMG_8747.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="768" data-original-width="1024" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUiQV3w_epp7ljx3tCR-leIfb7KlKV9vsbKrShndPj7b4njp3IXtAJBktzvUqnFFSdcwaJnP9w3G14hwh4HG3LYxuwfagLrSXiOQQEbNKzyT7AU8t1PkSFjbnW_-S1O89j-syZb4jwUb_8cdKEjBEZDfN2-DfI6_KxSmuahQBKZToXE_KzufYlrVdD/s320/IMG_8747.jpg" width="320" /></a></div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxokrhM2gNMIaiJqYJe5DUtTgYti26iWyEiTDtPdhImcyr1OcnSV8gJ-t8ifqeignyP7-3rY0I1w_7VTEY3Kb3mvzW-JFWvZYCoJN2b85FjqPi1uSJmGT_Z92QYUwTi3lSLOlv_AjGxHxwg6rgQAoL5won43lsL6lpKJyHB8PGlnIHZtUQEBzuvRB-/s1024/IMG_8748.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="768" data-original-width="1024" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxokrhM2gNMIaiJqYJe5DUtTgYti26iWyEiTDtPdhImcyr1OcnSV8gJ-t8ifqeignyP7-3rY0I1w_7VTEY3Kb3mvzW-JFWvZYCoJN2b85FjqPi1uSJmGT_Z92QYUwTi3lSLOlv_AjGxHxwg6rgQAoL5won43lsL6lpKJyHB8PGlnIHZtUQEBzuvRB-/s320/IMG_8748.jpg" width="320" /></a></div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhEgXGnIpOiG-2HHiLwSadOiAdLagl38Apjm91IOi96j0y4rM3-UoWpjY2a85i8jv5JkGXm9uQ3pnPKAcnL1pM4oaENG9Xb3-dbkyZOSsZzKdMQTznvktneZlPnilI7gikBr290bKP1d7BtAGqlLWVR4xnUk3I-CB0c4EWwqhxM4GDtXP3tS3BS2bWk/s1024/IMG_8749.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="768" data-original-width="1024" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhEgXGnIpOiG-2HHiLwSadOiAdLagl38Apjm91IOi96j0y4rM3-UoWpjY2a85i8jv5JkGXm9uQ3pnPKAcnL1pM4oaENG9Xb3-dbkyZOSsZzKdMQTznvktneZlPnilI7gikBr290bKP1d7BtAGqlLWVR4xnUk3I-CB0c4EWwqhxM4GDtXP3tS3BS2bWk/s320/IMG_8749.jpg" width="320" /></a></div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijuevCJX5UwFv0zL1KEo2SdqQ1jP1_nDt9h8FSCiNTtRoWXh__1Ps6eKdTBFeuPvpFfgnfrPfm5fSYFP4dFUYanlHGvuwo2d5dOhBIrksgUdzmzJy1hFwp-TdN25xjeZ5V3lXfAGSMQZu4b5Zr5bn0Qmm7cLxUG3NN-NV6uIAJMb_wD6e8AYWEeL2C/s1024/IMG_8750.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="768" data-original-width="1024" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijuevCJX5UwFv0zL1KEo2SdqQ1jP1_nDt9h8FSCiNTtRoWXh__1Ps6eKdTBFeuPvpFfgnfrPfm5fSYFP4dFUYanlHGvuwo2d5dOhBIrksgUdzmzJy1hFwp-TdN25xjeZ5V3lXfAGSMQZu4b5Zr5bn0Qmm7cLxUG3NN-NV6uIAJMb_wD6e8AYWEeL2C/s320/IMG_8750.jpg" width="320" /></a></div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEixxP_P58WanpKGegqZqcy5VyFU9TZXOwscGa-b0ptRqvUfvNPru7Wiiaz0lCuWkLecEcKO7PLrfNwn2-tT9CnKQUY-bzokBMsoDUzml3i76VpNYJ3kdS8u4JH5LjDHs_HmDRH3Ej6yE4CvAFJrHEi1Mh8cc1V6VcQRdKxa_ClxkWsRB_5vRljoN3Pg/s1024/IMG_8752.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="768" data-original-width="1024" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEixxP_P58WanpKGegqZqcy5VyFU9TZXOwscGa-b0ptRqvUfvNPru7Wiiaz0lCuWkLecEcKO7PLrfNwn2-tT9CnKQUY-bzokBMsoDUzml3i76VpNYJ3kdS8u4JH5LjDHs_HmDRH3Ej6yE4CvAFJrHEi1Mh8cc1V6VcQRdKxa_ClxkWsRB_5vRljoN3Pg/s320/IMG_8752.jpg" width="320" /></a></div><br /><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitgQ_ICaCQmQGA-Mw9HQl-TCikFOshNuwbHrFlHs4jXCgUnnz7l78HWAnzggdgL_acpzZ2J_jB6g4m58muBOWCkkc3u53EPX5U3vlMJY1490qIjDad8Wg5ubXB4JLoUW54YxJwQE_EM1csDQDBniQM--6LlUOj6jMQxoqbk8IpLs736spWtrm6HHnQ/s1024/IMG_8753.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="768" data-original-width="1024" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitgQ_ICaCQmQGA-Mw9HQl-TCikFOshNuwbHrFlHs4jXCgUnnz7l78HWAnzggdgL_acpzZ2J_jB6g4m58muBOWCkkc3u53EPX5U3vlMJY1490qIjDad8Wg5ubXB4JLoUW54YxJwQE_EM1csDQDBniQM--6LlUOj6jMQxoqbk8IpLs736spWtrm6HHnQ/s320/IMG_8753.jpg" width="320" /></a></div><br /><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: center;">Yay!</div><br /><div class="separator" style="clear: both; text-align: center;"><br /></div><br /><p><br /></p>Scott Lawrencehttp://www.blogger.com/profile/15740562503843879527noreply@blogger.com0tag:blogger.com,1999:blog-5543608644585014794.post-59874296698307201382021-11-19T23:40:00.006-05:002021-11-19T23:40:51.863-05:00Rochester Maker Faire 2021 - Exhibit info!<p>Welcome! If you're here you either from using the QR code I had at Maker Faire, <a href="https://twitter.com/yorgle" target="_blank">follow me as @yorgle on twitter</a>, or perhaps from <a href="https://www.youtube.com/channel/UClSAzzF1__x7JsOzkxUwA9Q" target="_blank">my YouTube channel</a> ... regardless... welcome! This is my project blog thing and I post info about all of the esoteric and weird things I work on here.</p><p>This post is meant to provide more information to you about all of the projects involved. Follow this blog for more updates about these projects; links to videos, source code, etc.</p><p><br /></p><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-ceQzULjoBA8/YZh76eWifTI/AAAAAAAAIEY/ZwET-DAhXfodGsShusFV-mAzWoadntCPACLcBGAsYHQ/s1024/IMG_7328.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="1024" data-original-width="1024" height="400" src="https://1.bp.blogspot.com/-ceQzULjoBA8/YZh76eWifTI/AAAAAAAAIEY/ZwET-DAhXfodGsShusFV-mAzWoadntCPACLcBGAsYHQ/w400-h400/IMG_7328.jpg" width="400" /></a></div><h3 style="text-align: left;">Projection Mapping</h3><p>For this, I got inspiration from <a href="https://www.youtube.com/watch?v=QT1YD3MTeG4&t=32s&ab_channel=TheChaosWorkshopandMenagerie">this video on YouTube</a> where they played <a href="https://www.youtube.com/watch?v=d7FFFENv6i4&t=31s&ab_channel=TheDIS" target="_blank">this video of the Happily Ever After fireworks show at Walt Disney World</a> onto a <a href="https://www.lego.com/en-us/product/the-disney-castle-71040" target="_blank">Lego model of "The Disney Castle"</a>. It came out awesome, and I wanted to do something similar.</p><p>While I'd love to have that Lego set, I don't have any place to put it, and on top of that, I don't have $350 to spend on it... however, Lego released the much more budget-friendly <a href="https://www.lego.com/en-us/product/mini-disney-castle-40478" target="_blank">Mini Disney Castle</a> which sells for $35 and still has some excellent details and even comes with a Mickey minifig! I used this as my starting point.</p><p>I dug out my Dell short-throw 1080p DLP projector, and projected it onto the castle. It didn't match up perfectly, which I had expected. I bought a second Lego Mini Disney Castle for parts, and made a bunch of modifications to the model to add a few small spires, adjust heights and proportions.</p><p>Then I built a base using some gray rocks made out of Lego, to line it up perfectly with the projector.</p><p>For MakerFaire, I also made a projection screen to set up behind it. For this I used some 1/2" PVC pipe and fittings, and made space for a roughly 2x3 foot screen. For the screen itself, I used about a yard light-blocking fabric from Joann Fabrics for about $8. The fabric I picked out was tan, with a white backing. I'm using the white backing side for the screen. The main criteria I was looking for in a fabric was something with as little surface texture and depth as possible. I think this material choice was a great find!</p><p><br /></p><h3 style="text-align: left;"><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-XHgjJ0tXaYY/YZh8C26e2_I/AAAAAAAAIEc/eqZupyUYuY4DuGr8WqAXqyWn55aNx4H_gCLcBGAsYHQ/s1024/IMG_7210.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="1024" data-original-width="1024" height="320" src="https://1.bp.blogspot.com/-XHgjJ0tXaYY/YZh8C26e2_I/AAAAAAAAIEc/eqZupyUYuY4DuGr8WqAXqyWn55aNx4H_gCLcBGAsYHQ/w320-h320/IMG_7210.jpg" width="320" /></a></div></h3><h3 style="text-align: left;">Lighting Effects for Lego Models</h3><div>I've loved the idea of using small vignettes to display my favorite minifigs, and I was super happy to find i<a href="https://benbuildslego.gumroad.com">nstructions from @benbuildslego</a> to build a <a href="https://benbuildslego.gumroad.com/l/pJgg">super tiny Cinderella Castle</a>, long before the "Mini Disney Castle" was released. I highly recommend his instructions. And I have no plans to make a tiny projection mapped version onto this model. Lol. Anyway, one of the other instructions of his that I ordered included my favorite geodesic sphere in the world... <a href="https://benbuildslego.gumroad.com/l/vvUfj" target="_blank">Spaceship Earth from EPCOT</a>. (aka "that big golf ball thing").</div><div><br /></div><div>I thought it would be great to light it up just like the real thing, so that's what I did.</div><div><br /></div><div>I built up his design, but I added some supports around the edge for some Technic pieces to support some lights. I also 3D printed some Technic-compatible holders that I used to mount some <a href="https://www.adafruit.com/product/4356" target="_blank">of these tiny NeoPixels</a> into. I designed the element so that the lights can be adjusted and pointed exactly where I wanted them to go.</div><div><br /></div><div>The NeoPixels are wired together using some kynar/wire wrap wire so that I could be sure it could be routed well, and not be too obvious. All of this is wired back to an Arduino to control it all. Any model of Arduino (Uno, Leonardo, Mega, etc) would work, but I used a "<a href="https://www.aliexpress.com/item/32820096996.html" target="_blank">SS Micro</a>" as I had an extra one and I love the formfactor of it.</div><div><br /></div><div>The code, soon to be available in Github, consists of a set series of "scenes", which the 10 Neo Pixels can display. The scenes can be faded between, randomized in intensity so that they've got some life to them, and randomized in duration and sequence. The code demonstrated just cycles through the four animated scenes forever.</div><div><br /></div><div>The scenes are: </div><div><ul style="text-align: left;"><li>"Night" - dark blue, as though it's just night time by itself</li><li>"Glow 1" - the wonderful color mix of orange, reds, gold and lavender</li><li>"Glow 2" - same as Glow 1, but roughly mirrored left-to-right for some variation</li><li>"Twinkle" - just like "night" but with a twinkle of cyan on the lights occasoinally</li></ul></div><div>There's also two special lights; one for the obelisk/fountain in front of the sphere, and one for a spotlight on the Mickey minifig atop the sphere. These operate externally to the animation sequences described above.</div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div><div><br /></div>Scott Lawrencehttp://www.blogger.com/profile/15740562503843879527noreply@blogger.com1tag:blogger.com,1999:blog-5543608644585014794.post-71129358867678362482021-11-01T11:30:00.002-04:002021-11-01T11:30:44.371-04:00Handheld RC2014 System (RetroChallenge (sorta))<p style="text-align: center;"><a href="https://1.bp.blogspot.com/-Yb7EIARCjrk/YYACxwoUJoI/AAAAAAAAIDI/CmSvAGKTZpIQJR_MMPzj9-rArGbBZfJAQCLcBGAsYHQ/s1024/IMG_7271.jpg" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em; text-align: center;"><img border="0" data-original-height="768" data-original-width="1024" height="300" src="https://1.bp.blogspot.com/-Yb7EIARCjrk/YYACxwoUJoI/AAAAAAAAIDI/CmSvAGKTZpIQJR_MMPzj9-rArGbBZfJAQCLcBGAsYHQ/w400-h300/IMG_7271.jpg" width="400" /></a></p><p>One of the great things about making stuff is that you can make stuff that doesn't yet, or shouldn't exist. </p><p>I honestly didn't get anything done on my RC2014 projects for RetroChallenge this year, other than an idea, and some 3D printed stuff within the final few days of the month.</p><p>I've had it in my head for a while to make a gameboy formfactor RasPi system for a while now, even though I already have a portable Pi emulation system in my Atari Lynx enclosure. So I found a model for the <a href="https://www.thingiverse.com/thing:3293876" target="_blank">"super retropipod" enclosure on Thingiverse</a> and printed it out, and ordered and then modified a 3.5" lcd and shoved it all into the case.</p>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-pqK7rxET6KQ/YYACz0pH34I/AAAAAAAAIDY/L58Dr5TYksUu7Vd_H3HBOZiNnuRC8mgSgCPcBGAYYCw/s1024/IMG_7258.jpg"><img border="0" data-original-height="768" data-original-width="1024" height="240" src="https://1.bp.blogspot.com/-pqK7rxET6KQ/YYACz0pH34I/AAAAAAAAIDY/L58Dr5TYksUu7Vd_H3HBOZiNnuRC8mgSgCPcBGAYYCw/w320-h240/IMG_7258.jpg" width="300" /></a><a href="https://1.bp.blogspot.com/-zvmXSj4Js0g/YYACziH4WwI/AAAAAAAAIDU/GWyDyljgfnYzbc1y3hmZfl4T2neP1dZNQCPcBGAYYCw/s1024/IMG_7257.jpg"><img border="0" data-original-height="768" data-original-width="1024" height="240" src="https://1.bp.blogspot.com/-zvmXSj4Js0g/YYACziH4WwI/AAAAAAAAIDU/GWyDyljgfnYzbc1y3hmZfl4T2neP1dZNQCPcBGAYYCw/w320-h240/IMG_7257.jpg" width="300" /></a></div>
<br /><p>I decided i didn't want to make a PCB or hack up a perfboard to support tact switches, and I had a bunch of largeish 12mm tact switches, so I modeled and 3d printed mounting boards for those too.</p><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-HBq3h4-r4nQ/YYADaCXfwZI/AAAAAAAAIDk/d8U2SGPKcPQJRVsDGwJrZqT5n-WyMlpFwCPcBGAYYCw/s1024/IMG_7270.jpg" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="768" data-original-width="1024" height="240" src="https://1.bp.blogspot.com/-HBq3h4-r4nQ/YYADaCXfwZI/AAAAAAAAIDk/d8U2SGPKcPQJRVsDGwJrZqT5n-WyMlpFwCPcBGAYYCw/s320/IMG_7270.jpg" width="320" /></a></div><br />Then I had an awesome-horrible idea. I would mount a RC2014 inside the enclosure as well! If I managed to make the enclosure a little thicker (about 1cm) I could easily fit a RC2014 mini or micro inside the case along with the pi and all of its fun stuff. I could even probably also fit in the TMS9918A video card piggybacked onto it inside the enclosure. So I modeled and <a href="https://www.thingiverse.com/thing:5078604" target="_blank">printed out the thickness extension too</a>!<p></p><p></p><div style="text-align: left;"><a href="https://1.bp.blogspot.com/-BONa5M8nek8/YYADbMNfa3I/AAAAAAAAIDg/s-JLdnVQ3oUygz5KFxXIVHjXSXxzgoNRACLcBGAsYHQ/s1024/IMG_7278.jpg" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="1024" data-original-width="1024" height="320" src="https://1.bp.blogspot.com/-BONa5M8nek8/YYADbMNfa3I/AAAAAAAAIDg/s-JLdnVQ3oUygz5KFxXIVHjXSXxzgoNRACLcBGAsYHQ/w320-h320/IMG_7278.jpg" width="320" /></a></div><div style="text-align: left;">Long story short, I have the beginnings of my ultimate multipurpose Pi/RC2014/Llichen-80 handheld! And she's a chonky beast too!</div><p></p><p>I modeled and printed a piece to sandwich between the layers of the "pi-boy" enclosure I printed, and added a space for a nice switch for power on the side. I still need to wire it all up, but I'm on my way to having this thing be AWESOME! </p><p>Although I still want to make a "tall-boy" at some point... take two GB DMG enclosures, and extend the screen space to be taller, and put in a rotated, vertical monitor in the space there. eg, use a 4" or 5" lcd in portrait instead of a 3.5" in landscape...</p><p><br /></p><p><br /></p><p>Next actions on this project:</p><div><ul style="text-align: left;"><li>Wire up the buttons to the GPIO header</li><li>Wire up the LED on the front panel to the GPIO header</li><li>figure out a power solution for the system (batteries, recharging, etc)</li><li>Mounting solution for RC2014 inside the enclosure without it moving around</li><li>Make a 2-board backplane for the RC2014 so I can also have the TMS board internally</li><li>Wire the TMS to the monitor too, and figure out a quick way to switch inputs... perhaps two NC momentary buttons that disconnect the monitor from each of the two inputs, so it will auto-switch to the other input. (or short the input to ground via 75Ω resistor?)</li></ul></div><div>Links:</div><div><ul style="text-align: left;"><li><a href="https://www.thingiverse.com/thing:3293876" target="_blank">Super Retropiepod enclosure</a></li><li><a href="https://www.thingiverse.com/thing:5078604" target="_blank">Retropiepod enclosure extension and tact switch mounts</a></li><li><a href="https://github.com/mholgatem/GPIOnext" target="_blank">GPIOnext</a> (formerly GPIOneer) software to use GPIO inputs as keyboard presses</li></ul></div><p></p>Scott Lawrencehttp://www.blogger.com/profile/15740562503843879527noreply@blogger.com0tag:blogger.com,1999:blog-5543608644585014794.post-17031012389456564642021-10-05T10:33:00.004-04:002021-10-05T10:33:51.819-04:00Lego Lighting braindump (for Rochester Maker Faire 2021)<p>For this year's Rochester Maker Faire, I'm going to be showing off a couple things related to lighting up Lego stuff. This post is just meant to show where I am with the two things (for now) that I'll be showing off and what's left to do. This year, I will be showing off stuff in the "dark room". I've wanted to do something back there for a while, and without Interlock or RLUG exhibiting this year, and at Dan's suggestion, it seemed like a perfect time to do it!</p><h3 style="text-align: left;">Spaceship Earth lit with LEDs</h3><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-wJEhIdNTesk/YVxdwSfUUVI/AAAAAAAAIBs/uakZrThWSt8AT6Eg6p8MqK9lXlLz8XV7gCLcBGAsYHQ/s1024/ZZIMG_7058%2B2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="862" data-original-width="1024" height="336" src="https://1.bp.blogspot.com/-wJEhIdNTesk/YVxdwSfUUVI/AAAAAAAAIBs/uakZrThWSt8AT6Eg6p8MqK9lXlLz8XV7gCLcBGAsYHQ/w400-h336/ZZIMG_7058%2B2.jpg" width="400" /></a></div><p>This one is setting up an "SS Micro" Arduino (my favorite 'ardy form factor) to drive a handful of tiny neopixels to simulate the nighttime illumination of Spaceship Earth in EPCOT. This is based on <a href="https://rebrickable.com/mocs/MOC-43102/benbuildslego/epcot-skyline/#details" target="_blank">@BenBuildsLego's EPCOT design</a>. <a href="https://rebrickable.com/users/benbuildslego/mocs/" target="_blank">Buy his instructions</a>, they're great!</p><p>Currently, I have everything as seen above. The model is essentially complete, and the arduino code is written with a LED strand "scene" concept. I've started to add a few transitions to go between scenes, randomize them, etc. Here's the current TODO list for it:</p><p></p><ul style="text-align: left;"><li>Add illumination for Mickey</li><li>Add illumination (and update the baseplates) for the fountain to be lit up</li><li>More decoration around SSE</li><li>Redo the wiring to be less conspicuous - replace the servo wiring with kynar/wire wrap wire</li><li>New version of the light mounts?</li></ul><div>Now, that all said, everything as it is now is sufficient to be exhibited, the above are all icing. :D</div><div><br /></div><p></p><h3 style="text-align: left;">Projection Mapping on the Mini Disney Castle</h3><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-Eg_sIbax5p8/YVxdwN8LseI/AAAAAAAAIBo/azSTzID5QjE8kmz_zS_gja67lwq5GlFtACLcBGAsYHQ/s1024/ZZIMG_7054.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1024" data-original-width="1024" height="400" src="https://1.bp.blogspot.com/-Eg_sIbax5p8/YVxdwN8LseI/AAAAAAAAIBo/azSTzID5QjE8kmz_zS_gja67lwq5GlFtACLcBGAsYHQ/w400-h400/ZZIMG_7054.jpg" width="400" /></a></div><div class="separator" style="clear: both; text-align: left;">After seeing this done with the fullsized castle, I had to do it for myself on my <a href="https://www.lego.com/en-us/product/mini-disney-castle-40478" target="_blank">"Mini Disney Castle", set #40478</a>. I tried it with the same source video, and it has promising results. There are a few issues with it that I can fix by Maker Faire.</div><div class="separator" style="clear: both; text-align: left;"><ul style="text-align: left;"><li>The proportions differ a little from the real Cinderella castle slightly, and do not include the side walls. </li><ul><li>I need to buy a second MDC and use it for parts to adjust the model to fit the one in the video properly.</li><li>Until they're back in stock, I can mock up the additions using Lego elements I already have.</li></ul><li>Video needs to be edited</li><ul><li>about 70% through, there's a slight jostling where everything shifts by a few pixels</li><li>There is no fadeout at the end, so that needs to be done</li><li>or remove the fadein from the beginning so it just runs forever.</li></ul><li>Playback device needs to be figured out. </li><ul><li>Perhaps a Pi connected directly to the DLP, that launches OMXPlayer or VLC on boot, with looping?</li></ul><li>Need to figure out a good tabletop + back screen system that's easily reproducable rather than the quick test seen in the photo above. </li><ul><li>I need to be able to just plop everything down at MakerFaire without needing to spend lots of time to tweak things endlessly.</li><li>The geometries need to be 100% figured out and perfected before then.</li></ul><li>Try my other DLPs for best fit</li><ul><li>The above is with my Dell Short-Throw projector, which means it can be closer, and the background will be larger, which is really nice</li><li>The BenQ projectors might have better results though and need to be tested.</li><li>Perhaps figure out all of the geometries for both projectors and bring one as a backup, since they're all self-refurbed anyway. (leave the backup(s) in the car)</li></ul></ul></div><p></p>Scott Lawrencehttp://www.blogger.com/profile/15740562503843879527noreply@blogger.com0tag:blogger.com,1999:blog-5543608644585014794.post-67366987807622933662021-10-02T11:46:00.011-04:002021-10-02T16:24:03.690-04:00RetroChallenge 2021-10 intentions (RC2014 Projects Braindump)<p>Hi all. So I've decided to settle on working on various RC2014-based projects for this <a href="https://www.retrochallenge.org" target="_blank">RetroChallenge</a>. I have a few related projects that I'm kind of in the middle of and have set aside for various reasons... the primary of which being my "ooh... shiny!" reason, where I get pulled off existing projects to start something else thanks to my brain. ;)</p><p>Most of my RC2014 projects are all intertwined so it makes sense to kinda work on all or each of them simultaneously...</p><p>Anyway, here's a few things I'd like to work on this month:</p><h4 style="text-align: left;"><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-rMC2QS5TP5o/YVi90fNRlAI/AAAAAAAAIAo/Thbaur1G8PcRzJl_9JY98FKuYgomESt0gCLcBGAsYHQ/s1024/IMG_7031.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="768" data-original-width="1024" height="300" src="https://1.bp.blogspot.com/-rMC2QS5TP5o/YVi90fNRlAI/AAAAAAAAIAo/Thbaur1G8PcRzJl_9JY98FKuYgomESt0gCLcBGAsYHQ/w400-h300/IMG_7031.jpg" width="400" /></a></div><br />"Lego Brick" RC2014</h4><div><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-3lf0JCcCp8M/YVi91DecbII/AAAAAAAAIA4/RTNbSX2yAGs7bT-rfOFrMQN4mQqTt9-0wCPcBGAYYCw/s1024/IMG_7032.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="768" data-original-width="1024" height="240" src="https://1.bp.blogspot.com/-3lf0JCcCp8M/YVi91DecbII/AAAAAAAAIA4/RTNbSX2yAGs7bT-rfOFrMQN4mQqTt9-0wCPcBGAYYCw/s320/IMG_7032.jpg" width="320" /></a></div>This is my main RC2014 <span style="font-family: inherit;">system. The display on it somehow developed a weird glitch on it that looks like <span style="background-color: white; caret-color: rgb(17, 17, 17); color: #111111;">Lichtenberg</span><span style="background-color: white; caret-color: rgb(17, 17, 17); color: #111111;"> lightning print. </span></span></div><div><span style="font-family: inherit;"><span style="background-color: white; caret-color: rgb(17, 17, 17); color: #111111;">I have a spare LCD panel that I can swap into place, i just haven't done it yet. <br /></span></span><p></p><h4 style="text-align: left;">Llama Vampire-Storage system (LLVS)</h4><p>This is my "storage over serial" system that I started working on in the past. It basically uses something like ANSI escape sequences over your serial console to do disk accesses. It could eventually be used for other devices as well like network and printer access, reatime clock, GPIO, etc.</p><p>Eventually, it would be great to have the LLVS "type in" a BASIC program that is a simple bootloader that will load in a custom CP/M kernel with LLVS routines, so that a super cheap (and slow) CP/M system can be booted without boot roms, CF card module, or any of that expensive stuff. </p><p>Also to be included with this are tools that natively talk the LLVS protocol so that you can retrieve and store content to your host machine from "standard" CP/M systems.</p><p>Obviously this also requires a host/terminal side of things too, which is being implemented in python currently, but could easily be reimplemented in C/C++ to be compiled in with t<span style="font-family: inherit;">he <span style="background-color: white;">Pi Zero Serial Terminal module, so that you can use the Pi Zero's SD card as your CP/M storage device.</span></span></p><h4 style="text-align: left;">RC2014 Pro Build<div class="separator" style="clear: both; text-align: right;"><a href="https://1.bp.blogspot.com/-zVYn2Mg6n1k/YVi9zM2azhI/AAAAAAAAIA0/MGCEhksvGFccXB7W0Dos2fSueKadRzZ_gCPcBGAYYCw/s1024/IMG_7028.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="768" data-original-width="1024" height="240" src="https://1.bp.blogspot.com/-zVYn2Mg6n1k/YVi9zM2azhI/AAAAAAAAIA0/MGCEhksvGFccXB7W0Dos2fSueKadRzZ_gCPcBGAYYCw/s320/IMG_7028.jpg" width="320" /></a></div><br /></h4><p>I have most of an RC2014 Pro kit around, and I'd like to build up the various parts of it including the backplane, compact flash storage, and so on, so that I can finally do a native CP/M boot up. This could be combined with the LLVS above to allow for easy transfers to and from the CP/M system and your "host" system.</p><p>I have a few modules that I want to build up and test and experiment with... i've just never really dug in to work on it.</p><h4 style="text-align: left;">Llichen-80</h4><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-2zZyIPKF5Rs/YVi90esZd2I/AAAAAAAAIA4/Agm7dA26Qjo-6V_A-PJj6KZB2onbvAclwCPcBGAYYCw/s1024/IMG_7029.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="1024" data-original-width="768" height="320" src="https://1.bp.blogspot.com/-2zZyIPKF5Rs/YVi90esZd2I/AAAAAAAAIA4/Agm7dA26Qjo-6V_A-PJj6KZB2onbvAclwCPcBGAYYCw/s320/IMG_7029.jpg" width="240" /></a></div>Llichen-80 is a CP/M kernel-based system that takes my LLVS-based system a step further, and adds in the TMS-9918A video card as its main graphics display. This could be used simultaneously with the standard terminal, or as a replacement to it. I haven't quite figured all of that out yet. <p></p><p></p><p>I plan on making a few CP/M programs that configure the TMS and download files from the mass storage device into it, for loading fonts, graphics, etc. Or just to use it for console output.</p><p>For use with a single composite display, I also have an hardware video switcher (simply two relays with a digital gpio input) that could be connected to a digital out from the RC2014 or as a GPIO line from the Pi Zero on the Pi Zero Serial Terminal card.</p><p>I have some of the basics of this working, but nothing really solidified.</p><p>The Llichen-80 system consists of an RC2014 CPU, Clock, Pi Zero Serial Terminal cards, along with the TMS9918A video card. The Pi Zero Serial card is set up with a PiZero W, and is not running the standard PiGfx kernel, but instead running linux, so that it can run my python terminal application, so that i can add in all of the LLVS code</p><h4 style="text-align: left;">RC2014 Mini / Micro Mods for CP/M</h4><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-56mMBAqLZI0/YVi_XDguoeI/AAAAAAAAIBE/VQv4UKfDansNhxoajX_1L5fsiocY-VUvACPcBGAYYCw/s1024/IMG_7034.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="1024" data-original-width="971" height="320" src="https://1.bp.blogspot.com/-56mMBAqLZI0/YVi_XDguoeI/AAAAAAAAIBE/VQv4UKfDansNhxoajX_1L5fsiocY-VUvACPcBGAYYCw/s320/IMG_7034.jpg" width="303" /></a></div>It's well known that by removing some components on these boards, you can use them as a standard CPU module when upgrading to a CP/M system... replacing the fixed RAM/ROM for the switchable RAM/ROM and so on. But it would be nice to be able to simplify this so that the RAM/ROM on the <a href="https://rc2014.co.uk/full-kits/rc2014-mini/">RC2014 Mini</a> or <a href="https://rc2014.co.uk/full-kits/rc2014-micro/">RC2014 Micro</a> could be made to be switchable using a simple jumper to connect to the logic needed to do the switching. Not sure that this even makes sense being that the <a href="https://rc2014.co.uk/full-kits/rc2014-mini-cp-m-upgrade-kit/">Mini CP/M upgrade</a> exists, but I'll be thinking about it...<p></p><h4 style="text-align: left;">RC2014 Peripheral and IO Switcher Traffic Cop Thing</h4><p>This one is more of a musing about a new Z80 system architecture, but it could be prototyped using lightly modified RC2014 modules.</p><p>I feel like a peripheral manager type of card might be useful for a new system... one board that has ALL of the logic for peripherals, to switch them on and off, so that peripheral cards needn't have this logic repeated on all of them. Then it could be vastly simplified for chip count. It could handle catching bus requests for reading/writing memory or port based io, and work it out to be a single enable/disable line to be run to your peripherals. That way peripheral cards could be made much simpler, and more easily moved around in the RC2014 memory and IO space... perhaps even live while the system is running. It would be easy to make it such that any peripheral could be moved to any address, enabled, disabled, etc. Hmm...</p></div>Scott Lawrencehttp://www.blogger.com/profile/15740562503843879527noreply@blogger.com2Rochester, NY, USA43.156577899999988 -77.608846514.846344063821142 -112.7650965 71.46681173617884 -42.4525965tag:blogger.com,1999:blog-5543608644585014794.post-1933801880156124082020-08-27T23:01:00.001-04:002020-08-27T23:01:45.139-04:00LaserDisc Capture Device Ecosystem<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-fp861MBQAso/X0fAcqY_b5I/AAAAAAAAHoU/6o3ogqhELHcvFZ4Mss1-FRGCtdBf6NXRwCLcBGAsYHQ/s1600/IMG_5179%2B2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="688" data-original-width="2083" src="https://1.bp.blogspot.com/-fp861MBQAso/X0fAcqY_b5I/AAAAAAAAHoU/6o3ogqhELHcvFZ4Mss1-FRGCtdBf6NXRwCLcBGAsYHQ/s640/IMG_5179%2B2.jpg" style="text-align: left;" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<i>Diagram of the capture system</i></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
I've been doing a bit off and on with my Apple IIc (Early model, upgraded to Rom4X) and my LaserDisc player (Pioneer CLD-V2400), now that I have it all working. I've created a video switching device (less prototype-ish version of it coming soon) and have made a few different serial interface adapters so I can control the LDP from the Apple IIc, Tandy "Model T" line, and my Amiga. I plan on having stub BASIC programs for each in github eventually, <a href="https://github.com/BleuLlama/LlamaLlaser" target="_blank">here on my LaserDisc catch-all repository</a>.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
But this brings up the issue that it's a niche project for a very esoteric and specific audience. That is to say, vintage computer enthusiasts WHO ALSO have a LaserDisc player, WHO ALSO have specific LaserDisc titles... It's the Sega 32X issue all over again. ;)</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
So... how to bring playability ("play" in the sense of "playing games created" as well as "playing the video discs") to a larger subset of the vintage computer enthusiasts... and also reduce reliance on super heavy players with large spinning plastic discs in them... Of course the answer is Raspberry Pi!</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<h3>
The Idea </h3>
<div class="separator" style="clear: both; text-align: left;">
The basic idea is to use a Raspberry Pi (Zero hopefully) as a standalone LaserDisc Player simulator. More on that specifically in a future post, but the goal of this post is to talk about getting content for this simulator. And, yes, there are LD simulators/emulators out there, like "Daphne", but they're generally for Arcade machine use, and simulate older players (like for Dragon's Lair), and they work VERY well, but they're quite expensive. This will be a solution that may not work for arcade machine applications, but for home/game/toy/experimenter use, it will be super-cheap (no more than $20 total for the Pi + Serial interface... lowering the bar of entry substantially.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
So for capturing a disc, One method might be to just capture the audio and composite output of a disc, and have the PI run something like the VLC player application, which might still be the solution, but I thought I'd experiment with making a custom player, since it will probably be cumbersome to do this with VLC, being how there is a large level of control needed.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
The issue comes in when you realize that playback requires frame-specific actions being done with the disc itself. This is usually fine, but for some content, there's a 2-3 pulldown put in to convert the original 24fps film content to 29.97fps NTSC composite-video LaserDisc content. The short-short version of this is that if you were to just step through frame by frame, you'd see repeated frames, as well as some frames that are interleaved with each other. This is not what consumers expect when they hit frame-forward or frame-backwards on their player. Instead, when you use those functions, the player jumps around, skipping duplicated as well as interleaved frames. This is handled invisibly by the player, as it accesses the frames from the disc, which are marked as being "full frames". (this is a gross overview, but generally correct-ish.)</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
So you can capture the video stream, and play that back via VLC (or other media player) but the results won't be accurate to a LDP. You'll have to manually skip frames, and offset per the 2-3 pulldown... it gets messy, but you can get an "okayish" approximation. This is what my Javascript "Rollercoaster" laserdisc simulation did. And it worked decently. But it's not good enough.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<h3>
The Domesday Duplicator Project</h3>
<div class="separator" style="clear: both; text-align: left;">
I had the idea to capture discs in a more "raw" form, so I started looking into what was available for this. I looked into the <a href="https://www.domesday86.com/?page_id=978" target="_blank">Domesday Duplicator</a> for capturing LaserDiscs, and use their "<a href="https://github.com/happycube/ld-decode" target="_blank">ld-decode</a>" software to decode it and play it back, since it would be ideal. I could capture the raw RF content stored on the LD, and play it back exactly as a LDP. There are some issues with this though...</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
First of all, I do not have the right LaserDisc player to capture the content, nor full documentation about the hack necessary, nor the expensive hardware needed to sample the RF stream... It is a substantial overhead to capture discs. Perfect for their archival use, but it's massive overkill for playing some homebrew games.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Secondly, for their captures, each side of a disk requires approximately 103 gigabytes of storage space, which is inconvenient. ;)</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<h3>
My Solution</h3>
<div class="separator" style="clear: both; text-align: left;">
The solution I decided to run with is to simply step through the disc, frame by frame, and capture each composite video frame individually, then capture the audio separately, and sync them back up in the playback application.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Video would be captured frame-specific on the disc... that is to say only unique 480p-ish frames will be captured, so file "32908.png" will be frame 32908. No need to convert or deal with if a title has </div>
<div class="separator" style="clear: both; text-align: left;">
a 3-2 pulldown, or it's 29.97 fps, or whatever... Playback of video might be odd, but this could always be augmented with video files for playback of segments, using these files as still-frame files.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
For video capture, I'm using my Canon Optura Xi DV camcorder as a video-firewire bridge, and capturing the video frames using <a href="https://github.com/rharder/imagesnap" target="_blank">imagesnap</a>, which can save jpeg or png images captured from standard Mac video sources, including firewire-DV connected devices. It could just as easily been done through some USB Composite AV capture device, but I do not have access to one.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Each of the pairs of audio tracks will be captured directly from the analog audio output from the player. (I have not done this part, but I plan on using <a href="https://github.com/chirlu/sox" target="_blank">sox</a> to do this, probably, although some tests I've done so far have had dropouts while recording... which is less than ideal... audio capture could be accomplished using a more modern computer or recording device...)</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
The diagram at the top of this post shows this workflow.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
For controlling the LDP, I have a simple python script that connects using the standard serial libraries to a USB-Serial interface, which is wired to my player via RS/232 (4800 baud). I don't have a store-bought USB serial device, but any of them should work fine. I decided to just throw together something using stuff I had, which can be seen in this image:</div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-JH-QkAcH_IM/X0fAgdJzi1I/AAAAAAAAHoY/fL3TuDU6KKIu6aKFov6YIkMYd-yH_R5VQCLcBGAsYHQ/s2048/IMG_5181.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: left;"><img border="0" data-original-height="2048" data-original-width="2048" height="320" src="https://1.bp.blogspot.com/-JH-QkAcH_IM/X0fAgdJzi1I/AAAAAAAAHoY/fL3TuDU6KKIu6aKFov6YIkMYd-yH_R5VQCLcBGAsYHQ/s320/IMG_5181.jpg" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<i>This is my USB-RS232 interface. There are many functionally like it, but this one is mine.</i></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
There really is nothing special to this, it's just a USB-RS232 adapter.... using an old USB-Ipod serial dock adapter, FTDI extension wire, and then a cobbled-together TTL-RS232 level shifter. :)</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<h3>
Results</h3>
<div class="separator" style="clear: both; text-align: left;">
All of this is working as expected. (python script will be posted to github soon.) I have the LDP spin up the disk ("PL"), seek to the lead-out (end) of the side ("FRLOSE"), get the frame count ("F?"), then seek back to frame 0 ("FR00000SE"). Most discs seem to have between 32,000 and 45,000 frames per side, providing about 30 minutes of content.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Each frame of 704x480 (I know, i was expecting 720x480, but this is what I got.) as JPG is about 140 kilobytes, and as PNG is about 600 kilobytes. The issue with it though is that it was slow to capture. The frame seek and stepping was quick, but the capture tool was slow, capturing about 27 PNG frames per minute, or about 35 JPG files per minute. This would be hours to capture a single side of a disc. Which is fine, since it's completely automated. It would produce about 7 gigabytes of video frames per side.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
I experimented with capturing audio as well. I couldn't capture from the firewire/DV stream, but I just hooked the LDP directly in to the Mac Mini I was testing with. I used SOX to capture some content, and it had a few dropouts. This could have been because the computer is ancient... So more tests are necessary on that front.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
The plan for the capture software is to have it query the LDP to get more meta-content out of the disc as well. It can get data about the disc, player serial number, number of audio tracks, etc. From that it could completely automate capturing each of the two potential pairs of audio streams, or as individual tracks, depending on the needs of the disc... as well as all video frames, and perhaps a DV stream as well... maybe. </div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-WBmzWgVvn5c/X0fAgmfY0rI/AAAAAAAAHoc/jyJ4KduwJ2c6m3EOK0gFtCwtytdLNL5_gCLcBGAsYHQ/s2048/IMG_5183.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: left;"><img border="0" data-original-height="2048" data-original-width="2048" height="320" src="https://1.bp.blogspot.com/-WBmzWgVvn5c/X0fAgmfY0rI/AAAAAAAAHoc/jyJ4KduwJ2c6m3EOK0gFtCwtytdLNL5_gCLcBGAsYHQ/s320/IMG_5183.JPG" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<i>Remember to set the DV Camcorder/Bridge for "video in"</i></div>
<br />
Currently, I've got the software doing the following process:<br />
<br />
<ul>
<li>Initialize the player:</li>
<ul>
<li>"PL" Spin up the disc, and "Play"</li>
<li>"FRLOSE" When that's done, seek to the frame at the lead-out at the end of the disk</li>
<li>"F?" Query to get the current frame number (the number of frames)</li>
<li>"FR1SE" seek back to frame 1 on the disc (*)</li>
<li>"SR" Step in reverse, back 1 step (*)</li>
</ul>
<li>For each frame:</li>
<ul>
<li>"FRxSE" seek to frame x (the current frame number)</li>
<li>run: "imagesnap outdir/x.png" to capture a video frame to a PNG file</li>
</ul>
</ul>
<br /><br />
This is currently working. Eventually, I'll add in the additional commands to query available audio tracks, and run "sox -d discname_audio.wav" to capture that.Scott Lawrencehttp://www.blogger.com/profile/15740562503843879527noreply@blogger.com0Rochester, NY, USA43.156577899999988 -77.608846514.846344063821142 -112.7650965 71.46681173617884 -42.4525965tag:blogger.com,1999:blog-5543608644585014794.post-66416343118222360412020-07-27T19:53:00.001-04:002020-07-27T19:55:25.097-04:00IR Remote to LANC bridge for my Sony Video Walkman GV-S50<div style="text-align: center;"><a href="https://1.bp.blogspot.com/-5Mujx4wIzEE/Xqtvju_qH9I/AAAAAAAAHgg/ibIeV6py5u8-zA1pVDvHKeHcocG2-GIRQCLcBGAsYHQ/s1600/Screen%2BShot%2B2020-04-30%2Bat%2B3.03.37%2BPM.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1096" data-original-width="1600" height="436" src="https://1.bp.blogspot.com/-5Mujx4wIzEE/Xqtvju_qH9I/AAAAAAAAHgg/ibIeV6py5u8-zA1pVDvHKeHcocG2-GIRQCLcBGAsYHQ/s640/Screen%2BShot%2B2020-04-30%2Bat%2B3.03.37%2BPM.png" width="640" /></a></div><div style="text-align: center;"><span style="font-style: italic;">The new, complete schematic</span></div><div style="text-align: right;"><br /></div>This second portion of the project involved IR code decoding and integration. The short version is that I extended the LANC-Serial example to also include portions of the IR receiver code, using Ken Shirriff's IR library for Arduino.<div><br /><div style="text-align: left;">The changes to the hardware included adding the IR receiver device, along with its passive components as recommended in its datasheet. It's basically a combination of the LANC interface (J1, D1, Q1, R1, R2, plus SW1 for power), along with the IR interface (U1, C1, R3, R4).</div>
<br />
Aside from just jamming everything together in the source code, I also disabled interrupts when it's sending out LANC codes, and re-enable them when it's done, since that's timing-critical, and the IR stuff works mostly via interrupts so that it can get its timing correct. ;)<br />
<br />
IR decoding is not perfect, and some of the codes seem to confuse the decoding algorithm, but if I only handle received SONY codes, and specifically only compare the received code with a list of codes i'm looking for, it gives the impression of being super reliable. ;)<br />
<br />
The best part is that this works REALLY well. I've been using it all day on this deck and it's been perfect. I can also add additional remote codes to do other things as well; control lighting, toggle solid state relays to turn on and off lamps and devices, etc. Lots of leftover data ports for activities!<br />
<br />
The list of Sony IR codes for VTR1/VTR2/VTR3 didn't seem to be available, so I found all of the codes using my RMT-V119 remote, and have documented them in <a href="https://docs.google.com/spreadsheets/d/1t3htAkWQzkkg0GTj4lvOOrYaGf4XkqisefB_9nhRVms/edit?usp=sharing" target="_blank">this google spreadsheet.</a> Consider this information to be fully public domain; it's just numbers. Feel free to use this information for your project or repurpose/reformat it for any other use.<br />
<div style="text-align: left;"><br /></div>
<div style="text-align: left;">
All of the content for this project can be found in github at the project repository.</div><div style="text-align: left;"><br /></div><div style="text-align: left;">Everything seems to work well enough, however one issue is that if the LANC plug is attached to my VTR, it will not turn off. I've tried disconnecting signal and power to that TRS plug, but it seems to be internally forced on if the player powers down and there's a plug physically in the jack. </div><div style="text-align: left;"><br /></div><div style="text-align: left;">Git repository: <a href="https://github.com/BleuLlama/IR-Lanc-Bridge" target="_blank">https://github.com/BleuLlama/IR-Lanc-Bridge</a></div><div style="text-align: left;"><br /></div><div style="text-align: left;">(This post was accidentally forgotten in the publish queue, so it was published on 7/27 instead of a month earlier when it was written. oops.)</div>
<div style="text-align: right;">
<span style="text-align: start;"><br /></span>
<span style="text-align: start;"><br /></span></div>
</div>Scott Lawrencehttp://www.blogger.com/profile/15740562503843879527noreply@blogger.com0tag:blogger.com,1999:blog-5543608644585014794.post-49120934183781349052020-04-29T10:35:00.003-04:002020-04-29T10:35:59.261-04:00Experiments with LANC on my Sony GV-S50 Video Walkman<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-COyYVHTiqoU/XqmI4O3HRcI/AAAAAAAAHfo/qt3_TOqeN-oZR7BWf7JFJgGzbyyFdCrowCLcBGAsYHQ/s1600/IMG_4708.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1236" data-original-width="1600" height="308" src="https://1.bp.blogspot.com/-COyYVHTiqoU/XqmI4O3HRcI/AAAAAAAAHfo/qt3_TOqeN-oZR7BWf7JFJgGzbyyFdCrowCLcBGAsYHQ/s400/IMG_4708.JPG" width="400" /></a></div>
<div style="text-align: center;">
<i>An Arduino Uno with a LANC interface on a horrible looking shield.</i></div>
<br />
I've been working from home, and I've of course been playing stuff while I work from my LaserDisc player, and 8mm Video Walkman GV-S50 playing some stuff I recorded in the 90s... MTV AMP and a few hours of a local WRUR electronica/trance show called "Digitalis".<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-DlfeBvEv_nw/XqmI2a1qU8I/AAAAAAAAHfk/5PB5A6zSLogx-0dFqPpmGCGwGqQV9arcgCLcBGAsYHQ/s1600/IMG_4704.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1600" data-original-width="1431" height="400" src="https://1.bp.blogspot.com/-DlfeBvEv_nw/XqmI2a1qU8I/AAAAAAAAHfk/5PB5A6zSLogx-0dFqPpmGCGwGqQV9arcgCLcBGAsYHQ/s400/IMG_4704.JPG" width="357" /></a></div>
<div style="text-align: center;">
<i>Sony Video Walkman GV-S50</i></div>
<br />
But of course, since I've got the deck right here next to me, and it doesn't have an IR receiver or any way to remote control it, I need to solve this major problem. ;D<br />
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-lsh4fEAfxSY/XqmI4MImK3I/AAAAAAAAHfs/uLaFRVdLoX0uVsl4mUiWCykJVU5Vo3dhgCLcBGAsYHQ/s1600/IMG_4706.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1277" data-original-width="1600" height="318" src="https://1.bp.blogspot.com/-lsh4fEAfxSY/XqmI4MImK3I/AAAAAAAAHfs/uLaFRVdLoX0uVsl4mUiWCykJVU5Vo3dhgCLcBGAsYHQ/s400/IMG_4706.JPG" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<i>LANC port is the 2.5mm jack on the bottom labelled "REMOTE"</i></div>
<br />
The deck has a LANC connector on the back, and I happened to find a 2.5mm plug the other day, so this seemed like an obvious thing to do. Obviously.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-H5wq1eC9EPw/XqmL5jWvBeI/AAAAAAAAHgE/QCfX3-vIJjQc_yH0sVjTIWnPoLNEYSGtACLcBGAsYHQ/s1600/lanc-interface_oQNRmI9g4a.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="771" data-original-width="800" height="385" src="https://1.bp.blogspot.com/-H5wq1eC9EPw/XqmL5jWvBeI/AAAAAAAAHgE/QCfX3-vIJjQc_yH0sVjTIWnPoLNEYSGtACLcBGAsYHQ/s400/lanc-interface_oQNRmI9g4a.png" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<i>The schematic I based my circuit on. I did not include the 'push rec' button,</i></div>
<div class="separator" style="clear: both; text-align: center;">
<i>and I added a switch between LANC +5 and this circuit so I can decouple the power.</i></div>
<div class="separator" style="clear: both; text-align: center;">
<i>The transistor diagram shows the view of the transistor looking at the bottom of the device.</i></div>
<br />
I found this schematic to interface to the LANC port, along with <a href="https://create.arduino.cc/projecthub/L-Rosen/serial-to-lanc-control-l-70f735" target="_blank">this arduino sketch</a> that lets you just send the two byte commands out from a serial interface. Thanks to getting totally confused from the article I found, I re-read through <a href="http://www.boehmel.de/lanc.htm" target="_blank">this doc about the LANC commands</a> and figured out that what I need to do is send the standard command byte (0x18) followed by a standard command, and the deck will do what i command it to do! So I did have it working, and better yet, the deck provides enough current to power the Arduino directly from the port.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-DnW1K2Asm04/XqmQjMeOppI/AAAAAAAAHgQ/MnYi2tyolWIsF6QHllUqE3kzTCkyrXMsgCLcBGAsYHQ/s1600/IMG_4710.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1600" data-original-width="1600" height="400" src="https://1.bp.blogspot.com/-DnW1K2Asm04/XqmQjMeOppI/AAAAAAAAHgQ/MnYi2tyolWIsF6QHllUqE3kzTCkyrXMsgCLcBGAsYHQ/s400/IMG_4710.JPG" width="400" /></a></div>
<br />
<div style="text-align: center;">
<i>My very slightly tweaked circuit</i></div>
<br />
I made a tweak to the circuit just so that I could not worry about the 5V from my computer mingling with the 1990s 5v coming out of the VCR, so I added a switch. In the pic of the shield above, the blue pushbutton switch can be seen by the second usb port. That board has been re-used for a few projects, so there's only a couple of components on there that are actually for this one.<br />
<br />
The only things on this board that are for this project are the blue switch in the bottom left, the transistor and zener diode in the middle and 4 of the resistors. The schematic only shows two, but I didn't have a 5.6kΩ resistor so I cobbled one together using three in series.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-jou8mtd8Leg/XqmI7whOAKI/AAAAAAAAHfw/uESGbpU3KK0uZznn5etkNFNhfJ5nnUGnACLcBGAsYHQ/s1600/IMG_4709.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1079" data-original-width="1600" height="215" src="https://1.bp.blogspot.com/-jou8mtd8Leg/XqmI7whOAKI/AAAAAAAAHfw/uESGbpU3KK0uZznn5etkNFNhfJ5nnUGnACLcBGAsYHQ/s320/IMG_4709.JPG" width="320" /></a></div>
<br />
The docs there weren't complete for this deck (Sony Video Walkman GV-S50), and I found a few more commands (volume, megabass) so I thought I'd put the list of commands here for future reference:<br />
<br />
<b>Group: (0001 1000) (0x18) - Normal Command to VTR or Video Camera </b><br />
<br />
<ul>
<li>1830 stop</li>
<li>1836 rew</li>
<li>1838 ffwd</li>
<li>1834 play</li>
<li>1832 pause (still)</li>
<li>1840 still</li>
<li>1860 frame reverse</li>
<li>1862 frame forward</li>
<li>1850 search - (scan until 'play' or 'pause')</li>
<li>1852 search + (scan until 'play' or 'pause')</li>
<li>185E power off</li>
</ul>
<ul>
<li>18b4 counter display/data screen</li>
<li>188c counter reset</li>
<li>18b0 tape speed (LP/SP)</li>
</ul>
<ul>
<li>183a rec (untested, assumed to work)</li>
<li>183c rec-pause (untested, assumed to work)</li>
<li>18d0 audio dub? (untested, might work?)</li>
</ul>
<i>These were not listed on the LANC page, but I poked around until I found them:</i><br />
<br />
<ul>
<li>1876 megabass toggle *</li>
<li>1824 volume +</li>
<li>1826 volume -</li>
<li>18fc still/shuttle (still frame)</li>
<li>1846 slow</li>
<li>184c x9 speed (scan forward)</li>
</ul>
<br />
<b>Group: (0001 1110) (0x1e) - Normal command to still video camera)</b><br />
<br />
<ul>
<li>1e52 photo preview (scan forward)</li>
<li>1e5e power off</li>
</ul>
<br />
I tried a lot of the commands with the TV Tuner card installed, and none that I tried seemed to control it at all. (channel up/down, timer functions, menu functions). In general, none of the menu interaction commands worked at all, sadly, other that direct tape speed, counter reset, megabass mentioned above.<br />
<br />
I eventually want to have an IR Receiver module on there, and program it to receive commands from my mega sony remote, but for now, i can type the commands out to the serial port. For example. if I type <b>1834[RETURN]</b>, it is the equivalent of pressing<b> [PLAY]</b> on the deck.<br />
<br />
<b>Reference Links:</b><br />
<br />
<ul>
<li><a href="http://www.boehmel.de/lanc.htm" target="_blank">The SONY LANC Protocol</a></li>
<li><a href="https://create.arduino.cc/projecthub/L-Rosen/serial-to-lanc-control-l-70f735" target="_blank">Arduino.cc project: Serial-to-LANC</a></li>
<li><b><a href="http://controlyourcamera.blogspot.com/2011/02/arduino-controlled-video-recording-over.html" target="_blank">Another LANC-arduino interface</a></b></li>
</ul>
Scott Lawrencehttp://www.blogger.com/profile/15740562503843879527noreply@blogger.com0tag:blogger.com,1999:blog-5543608644585014794.post-72237854286064873502019-11-09T16:02:00.002-05:002019-11-09T16:05:10.198-05:00RC2019-10 - A102 project - The end of the month of hacking<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-Bu9-iQHfEzM/XccmHyzIDjI/AAAAAAAAHQ4/-ln0vewAgy0CKuQQK6O-okoZgKDYh4QxACEwYBhgL/s1600/IMG_3213.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1158" data-original-width="1600" height="460" src="https://1.bp.blogspot.com/-Bu9-iQHfEzM/XccmHyzIDjI/AAAAAAAAHQ4/-ln0vewAgy0CKuQQK6O-okoZgKDYh4QxACEwYBhgL/s640/IMG_3213.jpg" width="640" /></a></div>
<br />
<br />
The short version is that I was super productive on these projects this past month. I didn't complete it, but I never realistically thought I would be able to. I lost a week's worth of time, or so, prepping our yearly Halloween Hack (blog post soon)... not to mention losing some time to work on building my Lego Saab 900... (blog post soon too).<br />
One thing I will say, is that by combining the projects together, I tricked my brain into quite effectively "being okay with" working on one project or another, by them all being part of the same project. So I would say that the month was quite successful.<br />
<br />
<br />
So Anyway, I'm going to first go through a bunch of goals for the month, for the RC challenge, and in general, and briefly discuss my progress on them at a meta-level. Then I'll get more into details about the actual work.<br />
<br />
<h4>
Overview and goals</h4>
<div>
<br /></div>
<h3>
Raspberry Pi / Emulation</h3>
I wanted to get the Pi 3 configured and booting right into an emulated Amiga/Amibian environment. I got the pi configured with standard raspian instead of Amibian, since I wanted this to be more of a general use machine. It'd be nice to be able to use it for firmware development of the LL530 as well as the machine that it's targeted for. <br />
<br />
So the target changed on this, but it is complete for now.<br />
<br />
<h3>
LL530 Development</h3>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-H6DfET5VT4U/Xccl3WAG8gI/AAAAAAAAHQQ/1hZ7HZ0B1sAlhp2XbmIa7jD6HyMdw02owCLcBGAsYHQ/s1600/IMG_3206.JPG" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="1200" data-original-width="1600" height="300" src="https://1.bp.blogspot.com/-H6DfET5VT4U/Xccl3WAG8gI/AAAAAAAAHQQ/1hZ7HZ0B1sAlhp2XbmIa7jD6HyMdw02owCLcBGAsYHQ/s400/IMG_3206.JPG" width="400" /></a></div>
I wanted to have the LL530 (USB Interface to Amiga serial keyboards, Amiga/Atari controllers and mice) fully finished. Although I did not finish the firmware this month, I got more done on the project this month than I had in the past 6 months. However, I was able to test the DIN pinout to discover that it's backwards, so I need to rev the board for those...<br />
<br />
I didn't fully succeed, but I was successful.... if that makes any sense.<br />
<br />
<h3>
RC2014 Integration</h3>
I wanted to have an RC2014 Z80 computer built in as well, that I can connect to via serial port, for doing RC dev work without an emulator. This aspect sadly got the least amount of attention. I have an RC2014 mini installed, connected to the serial port on the Pi 3. I've rewired the connection twice now, and I still cannot get it to connect using this wiring.<br />
<br />
I spent time focusing on the other aspects. So... 25% success.<br />
<br />
<h3>
Integration / Battery / Monitor / Enclosure</h3>
<a href="https://1.bp.blogspot.com/-3KlwjJJxHLw/Xccl3jpsvfI/AAAAAAAAHQY/UHVoAaK_PkcSTTnB6yuKtcwsUjmvYhGlACLcBGAsYHQ/s1600/IMG_3205.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="1183" data-original-width="1600" height="295" src="https://1.bp.blogspot.com/-3KlwjJJxHLw/Xccl3jpsvfI/AAAAAAAAHQY/UHVoAaK_PkcSTTnB6yuKtcwsUjmvYhGlACLcBGAsYHQ/s400/IMG_3205.jpg" width="400" /></a>Most of the effort this past month was in this area. I wanted to have the entire thing as a finished unit; to be able to be brought to a coffee shop, pull it out, turn it on and use it wirelessly. I can do all of these things right now with it.<br />
<br />
So I would say this aspect was completely successful... although It does need improvements, particularly with the screen.<br />
<br />
<br />
<h4>
Installing The Linux</h4>
I started with a base Raspian image from their site. I had the Pi hooked up to a HDMI monitor with USB keyboard and mouse. After using Balena Etcher to get the image onto an SD card, I booted the machine up. I went through the basic setup, and updates.<br />
<br />
I launched raspi-config from a terminal window, and went through to enable ssh, i2c, and serial.<br />
<br />
Next I installed some useful software packages:<br />
<br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>apt-get install screen fs-uae-launcher stella</span><br />
<br />
I made sure that serial was enabled in /boot/config.txt,<br />
<br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>enable_uart=1</span><br />
<br />
I use screen as my quick and dirty way to connect to the RC2014 which is wired up to the uart on the raspi per the diagram above. The reset line is wired to GPIO 4, so i use this shell script to "hit the reset button":<br />
<br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>#!/usr/bin/python</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>import RPi.GPIO as GPIO</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>import time</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>print "Resetting the RC2014."</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span># setup GPIO4 as an output</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>GPIO.setmode(GPIO.BCM)</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>GPIO.setwarnings(False)</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>GPIO.setup(4,GPIO.OUT)</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span># send LOW (reset) for 1 second, then restore HIGH (normal run)</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>GPIO.output(4,GPIO.LOW)</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>time.sleep(1)</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>GPIO.output(4,GPIO.HIGH)</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>print "Done."</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span># return to high-z state</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>GPIO.setup(4,GPIO.IN)</span><br />
<br />
The Red and Green LEDs are wired to GPIO18 and GPIO12, and I can run this script to do a nice fadey display on them:<br />
<br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>#!/usr/bin/python</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>import RPi.GPIO as GPIO</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>import time</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>red = 18</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>green = 12</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>GPIO.setmode(GPIO.BCM)</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>GPIO.setup(red,GPIO.OUT)</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>GPIO.setup(green,GPIO.OUT)</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>r = GPIO.PWM(red, 100) # channel=12 frequency=50Hz</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>g = GPIO.PWM(green, 100) # channel=12 frequency=50Hz</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>r.start(0)</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>g.start(1)</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>try:</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>while 1:</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>for dc in range(0, 101, 5):</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>r.ChangeDutyCycle(dc)</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>g.ChangeDutyCycle(100-dc)</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>time.sleep(0.01)</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>r.ChangeDutyCycle( 100 )</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>g.ChangeDutyCycle( 0 )</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>time.sleep( 1 )</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>for dc in range(100, -1, -5):</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>r.ChangeDutyCycle(dc)</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>g.ChangeDutyCycle(100-dc)</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>time.sleep(0.01)</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>r.ChangeDutyCycle( 0 )</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>g.ChangeDutyCycle( 100 )</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>time.sleep( 1 )</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>except KeyboardInterrupt:</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>pass</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>r.stop()</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>g.stop()</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>GPIO.cleanup()</span><br />
<br />
I may rewire these, or wire up additional LEDs to the ones specified with the Amibian/UAE led indicators, which are defined as GPIO4 for activity, GPIO16 for "Power", and GPIO16 for a clean shutdown button.<br />
<br />
<h4>
<a href="https://1.bp.blogspot.com/-fhaQycvvhJk/Xccl3mfnC9I/AAAAAAAAHQU/I0N4Bfppf8kHfOsoRiLXDYFtMcf1cI7DACLcBGAsYHQ/s1600/IMG_3204.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="1166" data-original-width="1600" height="233" src="https://1.bp.blogspot.com/-fhaQycvvhJk/Xccl3mfnC9I/AAAAAAAAHQU/I0N4Bfppf8kHfOsoRiLXDYFtMcf1cI7DACLcBGAsYHQ/s320/IMG_3204.jpg" width="320" /></a>
LCD Monitor</h4>
<div>
<br /></div>
For a monitor, I'm using a $10 3.5" composite monitor. I had to do a few things to get it to work however.<br />
<br />
I had to hack the power input so that it would run off of 5v. These are made to be used in cars, so they expect 12v of power. At the time I did this, there were examples of doing this modification on<br />
other displays, but not this model. I powered it up using 12v, then probed the outputs in the power supply section for a 5v rail... and I soldered a 5V input there.<br />
<br />
Once I had done this, I connected it to the 5v power in the enclosure, and hooked up the video input from the composite output on the Pi 3.<br />
<br />
One snag I hit though, is that it wouldn't work right, It would flash on when the Pi booted, but it wouldn't show the desktop. Testing the Pi with HDMI or a known working composite input worked just fine though.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-q-BjfEdhwvI/XccmJp3sbDI/AAAAAAAAHQs/VjipcgpS3cUQt6LjFl6_ufP4-fBj0ttGACLcBGAsYHQ/s1600/IMG_3214.JPG" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="1200" data-original-width="1600" height="240" src="https://1.bp.blogspot.com/-q-BjfEdhwvI/XccmJp3sbDI/AAAAAAAAHQs/VjipcgpS3cUQt6LjFl6_ufP4-fBj0ttGACLcBGAsYHQ/s320/IMG_3214.JPG" width="320" /></a></div>
I was trying all sorts of things, and eventually decided upon trying PAL video modes instead of NTSC, and that worked. I spent some time tweaking the overscan settings as well, to stretch the screen to fit. I also noticed that the contrast viewing range was substantially better on the top side of the display, so I ended up mounting it in the enclosure upside down, and I flip the video in the pi's config too.<br />
<br />
So the changes that all this amounts to for /boot/config.txt are:<br />
<br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>disable_overscan=1</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>display_rotate=2</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>overscan_left=0</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>overscan_right=0</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>overscan_top=5</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>overscan_bottom=5</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>sdtv_mode=2</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>sdtv_disable_colourburst=0</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>framebuffer_width=320</span><br />
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>framebuffer_height=288</span><br />
<br />
Although, as you can see from the screenshot above, it's basically unreadable. So I was able to get it to work, but any future development on this will need to be with a different display. Something with at least 480 rows, so that Amiga emulation can be reasonable on it.<br />
<br />
<h4>
Combining it all, and the Future...</h4>
<a href="https://1.bp.blogspot.com/-9oGteRkSjtY/XccmHspfazI/AAAAAAAAHQg/t9MZFqNkScAMxMi6VMuA8M3s8xgSIK9BACLcBGAsYHQ/s1600/IMG_3208.JPG" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" data-original-height="1200" data-original-width="1600" height="240" src="https://1.bp.blogspot.com/-9oGteRkSjtY/XccmHspfazI/AAAAAAAAHQg/t9MZFqNkScAMxMi6VMuA8M3s8xgSIK9BACLcBGAsYHQ/s320/IMG_3208.JPG" width="320" /></a>I spent a few evenings rewiring that keyboard which mostly works really well. I'm using a 5000mAh battery and get an undetermined-but-better-than-my-old-iBook amount of time with it.<br />
<br />
The display is garbage. I'm currently looking into replacing it with an HDMI-based 4" Waveshare IPS display with an 800x480 resolution for about $40. Surely that will require moving around hardware inside of this enclosure, and since the display is meant to piggyback on the Pi, I will lose my integration board. <br />
<br />
Obviously, I'll need to install the Amiga emulator, Tandy 102 emulator, my Model-T-Shell, and the Arduino IDE so that I can continue development on the LL530<br />
<br />
In short, I'm super happy with where things are now, it just needs some tweaks to get it to be usable as a primary system. :D<br />
<br />Scott Lawrencehttp://www.blogger.com/profile/15740562503843879527noreply@blogger.com0tag:blogger.com,1999:blog-5543608644585014794.post-61826677291707955222019-10-12T13:38:00.000-04:002019-10-12T13:38:02.944-04:00RC2019-10 Update 1: A102 Amiga/Tandy/RC2014 Frankenstein<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-irLaMvZjfGU/XZbW6n-MEyI/AAAAAAAAHLo/g3LvMr22-bMgixmHPnagPKFRzWVvc7NrACLcBGAsYHQ/s1600/IMG_3031.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1200" data-original-width="1600" height="480" src="https://1.bp.blogspot.com/-irLaMvZjfGU/XZbW6n-MEyI/AAAAAAAAHLo/g3LvMr22-bMgixmHPnagPKFRzWVvc7NrACLcBGAsYHQ/s640/IMG_3031.JPG" width="640" /></a></div>
<h2>
The Enclosure</h2>
<div class="" style="clear: both; text-align: left;">
Since I had started working on this last year, the enclosure is partially completed. I had removed some plastic ribbing prior to the RetroChallenge, and mounted both a Rasperry Pi 3 and a <a href="https://www.tindie.com/products/BleuLlama/ll530-amiga-keyboard-and-controller-usb-widget/" target="_blank">LL530</a> keyboard interface board inside of it. That's about as far as I had gotten last year, so that's a good start. (pics in the next update post)</div>
<h2>
The Keyboard</h2>
<div class="" style="clear: both; text-align: left;">
I started out with trying to get the keyboard working. This seems to be the most time consuming portion of the hardware at this point, and has the most question marks associated with it.</div>
<div class="" style="clear: both; text-align: left;">
The big issue is using the Tandy 102 keyboard with a spare "two header" Amiga 500 keyboard "encoder" board. I had toyed with the idea of perhaps just wiring up the row/columns to the Tandy keyboard's rows and columns, but this brought up some issues. Obviously, the matrix would be different... ie; row 2 column 2 would be different keys on the two keybaords. This would be fine as I could just change the code in the LL530 to convert the fakey-102-500 keycode to be the correct keypress. I kinda wanted to use the LL530 stock though, so this meant rewiring the 102 keyboard.</div>
<div class="" style="clear: both; text-align: left;">
The 102 keyboard has diodes at most of the junctions, and there were a different ratio of rows/columns. but I plan on ignoring those by cutting the traces on the board and wiring around them, ignoring them.</div>
<div class="" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-nowfq8cG5nE/XZbW4Xd7ViI/AAAAAAAAHLk/HIdHOu-0YI425ywjjNjR6FB7dya_zLzZgCLcBGAsYHQ/s1600/IMG_3030.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1200" data-original-width="1600" height="480" src="https://1.bp.blogspot.com/-nowfq8cG5nE/XZbW4Xd7ViI/AAAAAAAAHLk/HIdHOu-0YI425ywjjNjR6FB7dya_zLzZgCLcBGAsYHQ/s640/IMG_3030.JPG" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="" style="clear: both; text-align: left;">
I measured resistance for each key on both keyboards. The Tandy 102 keys ("<a href="https://deskthority.net/wiki/Alps_integrated_dome" target="_blank">Alps Mount Round Slider</a>") came out at about 100 ohms when pressed. The Amiga keys ("<a href="https://deskthority.net/wiki/Mitsumi_KPR_Type" target="_blank">Mitsumi KPR Hybrid Switches</a>") were 0 ohms (no resistance). Could this be an issue with the custom Commodore key matrix scanner on the Amiga encoder board? Only one way to find out... Wire it up!</div>
<div class="separator" style="clear: both; text-align: center;">
<br /><a href="https://1.bp.blogspot.com/-Ygt3BDj1B2U/XaILsfqnJKI/AAAAAAAAHNo/aI_o_03cu7UXvpOHf4mxf1_19wuDeM8bwCLcBGAsYHQ/s1600/IMG_3032.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="541" data-original-width="1514" height="228" src="https://1.bp.blogspot.com/-Ygt3BDj1B2U/XaILsfqnJKI/AAAAAAAAHNo/aI_o_03cu7UXvpOHf4mxf1_19wuDeM8bwCLcBGAsYHQ/s640/IMG_3032.JPG" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="" style="clear: both; text-align: left;">
I wired up a couple of the Alps keys to the scanner, hooked it up to my LL530 and tried it. Turns out it all works great, so no worries there! I apparently picked "9" and the left spare key usually between 'left shift' and 'z', which apparently maps to a "section character" (<span style="background-color: #f8f9fa; caret-color: rgb(34, 34, 34); color: #222222; font-family: sans-serif; font-size: 14px;">§)</span></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-ktYLHb5J5Hg/XaIMG6iBnAI/AAAAAAAAHNw/d1JqCyH6gaUvb82wKpzRHdyxBoBrmGBfwCLcBGAsYHQ/s1600/IMG_3029.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="406" data-original-width="1517" height="170" src="https://1.bp.blogspot.com/-ktYLHb5J5Hg/XaIMG6iBnAI/AAAAAAAAHNw/d1JqCyH6gaUvb82wKpzRHdyxBoBrmGBfwCLcBGAsYHQ/s640/IMG_3029.JPG" width="640" /></a></div>
<br />
Next, I wanted to try to clean up the keys. They seem to bind a little as you press them down, as the plastic tube is getting snagged in the mechanism. This is probably due to wear, dirt, etc. I removed one from the board (four through-hole solder pins), and disassembled it carefully to see what I was dealing with. <br />
<br />
The keys popped off using an official key cap removal tool... a pair of tweezers wedged under the key. Then the plunger and dome could be removed from the enclosure by flexing out the two T shaped tabs on the enclosure top. From left to right: the key cap, top cover (snaps on using the two large T shaped tabs), round plunger, rubber dome with carbonized contact, and finally the enclosure with the contacts in the bottom. <br />
<br />
<a href="https://1.bp.blogspot.com/-6TKygd48Edo/XZj27yrTOGI/AAAAAAAAHMs/23o3MNOW0BsBkumxrB37T5Ha8qeDNXbtQCLcBGAsYHQ/s1600/IMG_3038.JPG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="1600" data-original-width="1600" height="640" src="https://1.bp.blogspot.com/-6TKygd48Edo/XZj27yrTOGI/AAAAAAAAHMs/23o3MNOW0BsBkumxrB37T5Ha8qeDNXbtQCLcBGAsYHQ/s640/IMG_3038.JPG" width="640" /></a><br />
As far as I know, all of the keys are contacting/switching okay, but if i need to replace components, they're easy to swap in or replace the entire key.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-RiWMiMy4v0o/XZj28rDS2zI/AAAAAAAAHMw/2EQGjpKHi_wXcVWl8L-3pvAPQkTBC50TQCLcBGAsYHQ/s1600/IMG_3039.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1600" data-original-width="1600" height="640" src="https://1.bp.blogspot.com/-RiWMiMy4v0o/XZj28rDS2zI/AAAAAAAAHMw/2EQGjpKHi_wXcVWl8L-3pvAPQkTBC50TQCLcBGAsYHQ/s640/IMG_3039.JPG" width="640" /></a></div>
<br />
I also took this opportunity to replace the "caps lock" and "num lock" keys, which are latching, with two spare keys, since I wanted to reuse the Num key for "right Amiga" and the caps lock key needs to be momentary for the Amiga matrix scanner. The pin layouts were different, so i needed to drill new holes in the board for the momentary switches. The switch labelled "56" above is the replaced caps lock, while "57" is the control key next to it.<br />
<br />
Four of the "top row" keys of the 102 keyboard, the arrow keys, don't have quite the right snap/click that the others do, due to 30 years of use and wear. I happened to have a bunch of exact replacements, which I got on ebay for another project a couple years back, "<a href="https://www.ebay.com/sch/i.html?_from=R40&_trksid=m570.l1313&_nkw=12x12x7.3mm+Tact+Switches&_sacat=0&LH_TitleDesc=0&_osacat=0&_odkw=12*12*7.3mm+Tact+Switches" target="_blank">12x12x7.3mm Tact Switches</a>"<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-QRy6hIHA2v8/XZbXgOS9gbI/AAAAAAAAHMI/zFvrBCLxD74BPp-U_1TWt1ZXrjE_FxxiwCLcBGAsYHQ/s1600/IMG_3036.JPG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em; text-align: center;"><img border="0" data-original-height="1200" data-original-width="1600" height="240" src="https://1.bp.blogspot.com/-QRy6hIHA2v8/XZbXgOS9gbI/AAAAAAAAHMI/zFvrBCLxD74BPp-U_1TWt1ZXrjE_FxxiwCLcBGAsYHQ/s320/IMG_3036.JPG" width="320" /></a></div>
<br />
<a href="https://1.bp.blogspot.com/-jJQxNZmd96U/XZbXjdbShEI/AAAAAAAAHMQ/0lvwBuiE-moTQ8VJJkBWbChCejZAeYa8gCLcBGAsYHQ/s1600/IMG_3037.JPG" imageanchor="1" style="clear: left; display: inline !important; margin-bottom: 1em; margin-right: 1em;"><img border="0" data-original-height="1600" data-original-width="1200" height="320" src="https://1.bp.blogspot.com/-jJQxNZmd96U/XZbXjdbShEI/AAAAAAAAHMQ/0lvwBuiE-moTQ8VJJkBWbChCejZAeYa8gCLcBGAsYHQ/s320/IMG_3037.JPG" width="240" /></a><br />
Next is the task of remapping the matrix. I found some commonalities between the two matrices, seen color coded above... the keys in yellow share the same x/y indexing with the Amiga layout, and the other colors only share the same column. I traced out the schematic on the keyboard, and cut a bunch of traces. Next up is rewiring it and wiring it up to the Amiga Encoder board.<br />
<br />
More to come....<br />
<br />
<br />Scott Lawrencehttp://www.blogger.com/profile/15740562503843879527noreply@blogger.com0tag:blogger.com,1999:blog-5543608644585014794.post-6732110083794084572019-10-02T20:54:00.002-04:002019-10-02T20:56:32.745-04:00RC2019-10 - The Globbing Of The Projects... Globjects?<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-VkFPzxsdqCo/XZVBqimVbzI/AAAAAAAAHKk/1aqvuI0dEvA28qb_k-MKEjxc5SP-Kef2ACLcBGAsYHQ/s1600/IMG_3022.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1200" data-original-width="1600" height="300" src="https://1.bp.blogspot.com/-VkFPzxsdqCo/XZVBqimVbzI/AAAAAAAAHKk/1aqvuI0dEvA28qb_k-MKEjxc5SP-Kef2ACLcBGAsYHQ/s400/IMG_3022.JPG" width="400" /></a></div>
<br />
<br />
Hey. Long time no post. How y'all doing? I'm still here. I've gotten a lot of small things done over the past half year, and a lot of things almost done as well... and some long-standing projects not done too. So, I've been almost productive... Anyway, I hope to try something different this month for the RetroChallenge RC2019-10... Let me explain...<br />
<br />
The main projects I've been trying to work on recently are:<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-JEO176Wqylg/XZVBhXfMWvI/AAAAAAAAHKc/d5DmzbXpH-A2KDL-CKIvhbZ5LM3NtgDKwCLcBGAsYHQ/s1600/29468059_590801124617158_4080385773499580416_o.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1600" data-original-width="1600" height="320" src="https://1.bp.blogspot.com/-JEO176Wqylg/XZVBhXfMWvI/AAAAAAAAHKc/d5DmzbXpH-A2KDL-CKIvhbZ5LM3NtgDKwCLcBGAsYHQ/s320/29468059_590801124617158_4080385773499580416_o.jpg" width="320" /></a></div>
<h3>
LL530 USB interface for Amiga serial keyboards and controllers</h3>
I've been poking at it a little over time, and am really damn close to getting the proper firmware done for it, but I just haven't finished it. Which is stupid because I can actually sell these things once I'm ready! I have keyboard working for all but my A1000 keyboards, and I have joystick/mouse/paddle working... but not at the same time in a way that I'd be proud of. I also will eventually need to rev the board to fix three layout issues; a power/ground short, lack of ICSP programming header, and lack of pull-up resistor for VCS paddle sampling.<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-O1-ddZ70fww/XZVBjwc1TzI/AAAAAAAAHKg/VljoCL77KOwTsnZZ6oIgtQeDi_OEjFJ7gCLcBGAsYHQ/s1600/EEq55sSXkAEpIR5.jpeg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1600" data-original-width="1600" height="320" src="https://1.bp.blogspot.com/-O1-ddZ70fww/XZVBjwc1TzI/AAAAAAAAHKg/VljoCL77KOwTsnZZ6oIgtQeDi_OEjFJ7gCLcBGAsYHQ/s320/EEq55sSXkAEpIR5.jpeg" width="320" /></a></div>
<h3>
Llichen-80 Computer (LL80)</h3>
Okay, so it's not really a whole other completely new computer... but it is a specific configuration of the RC2014 Z80 computer. It started out this year as a whole lot of customizations to standard (but old, obsoleted) RC2014 boards to add bank switching, using the 8 bit parallel IO board (the one with all the LEDs and switches!). Now, I reworked the idea so that I just use the standard "Switching ROM" board and the "64k RAM" board. That simplifies the design; making it easier to get to the LL80 spec, since just using those two cards replaces two RAM boards, one ROM board, and one IO board... plus no modifications to any of the boards are necessary.<br />
<br />
The other part of the LL80 computer is the "LLSuper" board. This is an arduino-based supervisor of sorts that sits on the serial console port. It acts as your usb-serial interface for when you use a desktop computer as a console. This board used a CH376S USB Drive interface to access any flash drive as mass storage (it's a neat part.. like $2 for a board with a USB A port... it talks TTLRS232, SPI or parallel, and handles all of the disk switching, FAT filesystem etc. So there's very little overhead on a tiny ATmega micro. I also have an I2C based clock chip board for this. This sits between your console and the RC, and lets you have a kind of shell access to the disk from the console, as well as from the RC. The RC side of things also got direct access to virtual disk image files with a sector-based interface, as well as direct fileio...<br />
<br />
The next steps would have been to write a CPM BIOS and make the thing boot into that.<br />
<br />
But I've come to realize that even the LLSuper board is unnecessary. I can accomplish near-similar things using the standard "Pi Serial Console" board. If i use a RasPi Zero, and boot linux on it (or adapt the code in the PiGFX kernel, I can put in my serial-disk IO stuff, for cheaper, without needing to fab up my own board. I started to mess around with this using my new RC2014 Micro, a Pi Zero, and a slight hack to attach the reset line of the RC to a GPIO of the Pi, so i can now reset the RC from the Pi.<br />
<br />
I do have the protocol all worked out for the serial interface using unused ANSI escape codes, which are made for custom purposes like this.<br />
<br />
<h3>
A102 - Portable Emulated Amiga in a Tandy 102 shell</h3>
This is one i've wanted to work on since last year. I was trying to get it done before Rochester MakerFaire last November, but burned out on it. It essentially is a project that joins together a bunch of parts... all of which I have:<br />
<br />
<ul>
<li>Raspberry Pi 3, with Amibian... booting right into an emulated Amiga environment</li>
<li>Tandy 102 shell, rescued from some unrepairable 102's</li>
<li>Tandy 102 keyboard, also rescued (keys bind as they're pressed though)</li>
<li>Amiga 500 keyboard interface board, from a long-gone computer</li>
<li>My LL530 USB serial keyboard interface board</li>
<li>Amiga mouse</li>
<li>3.5" composite LCD panel (new, $10 online!)</li>
<li>large Power Bank battery pack</li>
</ul>
<div>
This project entailed hacking the keyboard (removing the wiring/traces on the board) to convert the scan matrix to match an Amiga 500 keyboard. This gets connected to the LL530, which is plugged into the Pi. All of it gets jammed into the 102 shell, and becomes a portable computer. </div>
<div>
<br /></div>
<div>
I waffled a bit on this... mainly because the keyboard stuff would be a chore. I want to remove every key, and clean their travel tubes, to eliminate the keys binding. Wiping out the traces and rewiring the board seems like it's going to be a tedious process... So i kept thinking that maybe I should make a cherry-mx switch based board to fit the keyboard space instead... and... yeah... i just kept going down that same path of "maybe i should do this other thing" instead... instead of actually moving forward on any of it.</div>
<div>
<br /></div>
<div>
I also pondered putting the entire Llichen 80 computer into this shell... which brings us to...</div>
<br />
<h3>
RC2019-10!</h3>
So that's where RC2019-10 comes in. Why almost fail at three projects when I can almost fail at ONE project! Seems a lot more efficient!<br />
<br />
The end result for this month will be to have a working portable laptop computer that runs Amibian (Linux), RC2014 (via serial connection to the Pi) and general Linuxy stuff.<br />
<br />
Or, more granularly, here are the tasks as I see them now: (in no particular order)<br />
<br />
<ul>
<li>Finish the Keyboard + Joystick/Mouse firmware for the LL530</li>
<li>remove the wires on the 102 keyboard PCB</li>
<li>clean the travel tubes on the keyboard</li>
<li>rewire the keyboard to match the Amiga's matrix</li>
<li>Wire the keyboard to the Amiga 500 interface board</li>
<li>Connect the RC2014 Micro via the Pi's serial interface pins</li>
<li>Additional buttons on the device to cleanly shut it all down</li>
<li>Have it all powered from a 5V/USB powerbank mounted internally</li>
<li>Serial-console textmode app for Linux that provides the beginnings of a backchannel to </li>
</ul>
<div>
Stretch goals:</div>
<div>
<ul>
<li>Full drive interface for the RC2014</li>
<li>CP/M BIOS for the RC2014 that uses the serial protocol</li>
<li>Fit the RC2014 Mini + 64k RAM + switching ROM + TMS9918A cards inside the case</li>
<li>Have the video switchable between the Pi and the TMS9918A video card</li>
</ul>
<div>
<br /></div>
</div>
<div>
Not sure how far i'll get, but it globs together all of the recent projects in a way that I won't feel like I'm neglecting one project by working on the others... since they're all the same project now. :D</div>
Scott Lawrencehttp://www.blogger.com/profile/15740562503843879527noreply@blogger.com0tag:blogger.com,1999:blog-5543608644585014794.post-48975180890655921242019-03-21T13:42:00.002-04:002019-03-21T13:42:54.493-04:00Llichen-80 (Retrochallenge 2019-03 Update)<a href="http://2.bp.blogspot.com/-1ij0FHfSfuI/XJPIvyW1EDI/AAAAAAAAG_o/9ojBlBpAOCwH-uUDeeXMuADibXI3HyoGwCK4BGAYYCw/s1600/Screen%2BShot%2B2019-03-20%2Bat%2B4.51.34%2BPM.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://2.bp.blogspot.com/-1ij0FHfSfuI/XJPIvyW1EDI/AAAAAAAAG_o/9ojBlBpAOCwH-uUDeeXMuADibXI3HyoGwCK4BGAYYCw/s400/Screen%2BShot%2B2019-03-20%2Bat%2B4.51.34%2BPM.png" /></a>I had originally intended for any time I could devote this month to the <a href="http://retro challenge deck" target="_blank">2019-03 Retro Challenge</a> was going to be for a new version of my <a href="https://rc2014.co.uk/" target="_blank">RC2014 Z80 computer</a> emulator, adding support for the TMS9918A video display chip. But my plans have changed. With the recent advancements with The 8-bit Guy's "Commander X16" 6502 computer, I decided to start reviving a project I was considering for a while. The great thing is that there's so many aspects to it that it's like a grab-bag of things to do.<br />
<br />
The original idea was to sit down with a C64, floppy drive, monitor, joystick, mouse and reference books, and start with BASIC, writing a text editor, assembler, IDE, etc and work my way up to having a windowed operating system like GEOS with a few utilities and such.<br />
<br />
Except now, the spec of the system is designed by me, and I'm building that too.... Which meshes in perfectly with my original intention to build a RC2014+TMS9918 emulator, which I can use for initial development, and kickstarting the boot rom onto it.<br />
<h3>
Hardware</h3>
I wanted some sort of related name for the project, so I was thinking Llama, TMS, which became Llitmus, like the PH sensitive dye. I was gonna go with Llitmus-80 with the '80' because it uses a z80, but then once I read that the litmus was made from lichen, I just went with the name Llichen-80.<br />
<br />
First, let's get into the Llichen-80 system specification.<br />
<br />
<ul>
<li>RC2014 backplane/base system</li>
<li>7.37 MHz clock speed</li>
<li>32k RAM from 8000-FFFF</li>
<li>8k BASIC ROM from 0000-1FFF (*)</li>
<li>32k RAM from 0000-7FFF (*)</li>
<li>Digital IO board at port 00</li>
<li>TMS 9918A video board at port 10,11</li>
<li>ACIA Serial port at 80</li>
<li>ACIA Serial port 2 at C0 - connected to CH376S USB drive interface</li>
</ul>
<div>
So (*) Indicates something... there's an overlap of these two items. My existing design piggybacks bit 0 of the output from the digital board to select which of the two of these that memory READs come from. That is to say that writing 0x00 to the digital out board will select ROM, and 0x01 will select RAM. Writes to these locations always go to RAM. So one way I can test this is:</div>
<div>
<ul>
<li>Start up the computer</li>
<li>select ROM bank</li>
<li>Write a basic program to peek from the ROM and write to the RAM</li>
<li>select the RAM bank</li>
<li>Yank out the ROM board, and everything still works fine</li>
</ul>
<blockquote class="tr_bq">
10 OUT 0,0<br />20 FOR A=0 TO 8192<br />30 B = PEEK(A)<br />40 POKE( A, B)<br />50 NEXT A<br />60 OUT 0,1<br />RUN</blockquote>
This all works great! One addition I made was to intercept the VCC to the RAM chip and have it also connected to some CR2032 batteries for a backup. It's not perfect, but it works well enough for my system for now. I also added a switch to force the use of the ROM, since sometimes the bank switching can get into a messed up state and you need to force reboot off of the ROM.<br />
<br />
The other thing I created was a second ACIA serial port, essentially duplicating the circuit of the stock ACIA serial port, but changing it to look at ports C0 and C1 instead of 80 and 81.<br />
<br />
The TMS could be configured for anywhere, for the most part, but the ACIA chip IO port mapping is messy so they consume essentially from 80 to FF. I went with the SORD-M5 configuration of putting it at 10 and 11h. Although there might be issues with this...<br />
<br />
Anyway, more about these modifications and such at the end of the month.<br />
<br />
<h3>
Experiments </h3>
</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-mDUUiX-7cZo/XJPKO8MrYdI/AAAAAAAAG_0/mAJear6SrroM6K5EgQ9njrFPZQj15_muwCK4BGAYYCw/s1600/IMG_1375.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="https://4.bp.blogspot.com/-mDUUiX-7cZo/XJPKO8MrYdI/AAAAAAAAG_0/mAJear6SrroM6K5EgQ9njrFPZQj15_muwCK4BGAYYCw/s400/IMG_1375.jpg" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
I ended up reassembling my RC2014 system, and started working on testing out the configuration. I Was able to write a few BASIC programs to output to the video chip and to a TV I had hooked up, as you can see in the photo above. I was noticing some weirdness though. The LEDs on the IO board were flickering when I was doing writes to the TMS, so I may need to move the port around to another location. I think I'm gonna go with the MSX setting of 98 and 99h.<br />
<br />
I also became very aware that I do not yet understand how to get the chip to do what I want.<br />
<br />
<h3>
Emulation</h3>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-Nqm9BDTOISs/XJPEpMnGzII/AAAAAAAAG_c/MdtviuquY6w6VDIEUYFXx6HVNlDkmY6IQCK4BGAYYCw/s1600/Screen%2BShot%2B2019-03-20%2Bat%2B4.51.26%2BPM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="75" src="https://4.bp.blogspot.com/-Nqm9BDTOISs/XJPEpMnGzII/AAAAAAAAG_c/MdtviuquY6w6VDIEUYFXx6HVNlDkmY6IQCK4BGAYYCw/s400/Screen%2BShot%2B2019-03-20%2Bat%2B4.51.26%2BPM.png" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
I was going to write the emulator using QT Creator for maximum portability, and also using the Z80 emulation core and frameworks I created for <a href="https://github.com/BleuLlama/z80-machine" target="_blank">my existing RC2014 emulators</a>. But recently, after thinking about it for a little bit, I realizes that 90% or the emulator I need is already out there and already very well supported. MSX.<br />
<br />
There was really no need to get a whole video display system working with my existing emulator when I could start with an existing, debugged, well supported emulator, <a href="https://openmsx.org/" target="_blank">openMSX</a>, and just create a new hardware profile for the RC2014 with my system's configuration... and with some changes to support my bank switching hardware and such.<br />
<br />
I made <a href="https://github.com/BleuLlama/openMSX" target="_blank">a branch of openMSX on github</a> to handle any/all of the changes I've made for it, which at the moment is just getting it to build on OSX/Darwin 10.14 correctly. <br />
<br />
I also was messing around with my good old friend, the Texas Instruments TI-99/4A as it uses the TMS9918 chip. I figured that I could experiment around with how color and graphics look. I'm not a fan of the TI's font, nor the MSX's font for that matter, but I figured it's a good platform to get reacquainted with the weirdness of the TMS and to see how this all might look in the future, perhaps.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-0mzdpO5Uibs/XJPMXZqut8I/AAAAAAAAHAA/PZNoePYIz6QEWiryz-mILPhnmgPV3v2YQCK4BGAYYCw/s1600/Screen%2BShot%2B2019-03-20%2Bat%2B4.59.14%2BPM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="https://1.bp.blogspot.com/-0mzdpO5Uibs/XJPMXZqut8I/AAAAAAAAHAA/PZNoePYIz6QEWiryz-mILPhnmgPV3v2YQCK4BGAYYCw/s400/Screen%2BShot%2B2019-03-20%2Bat%2B4.59.14%2BPM.png" width="400" /></a></div>
<br />
This is of course just a screenshot from the impressive web-javascript <a href="http://js99er.net/" target="_blank">TI emulator at js99er.net.</a><br />
<br />
More as it develops...<br />
<br />Scott Lawrencehttp://www.blogger.com/profile/15740562503843879527noreply@blogger.com0tag:blogger.com,1999:blog-5543608644585014794.post-49863815762824607562018-09-28T10:45:00.002-04:002018-09-28T10:45:46.250-04:00More Laserdisc Stuff! A wild Pioneer CLD-V2400 appears!<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-TFqq6Yh_i1Y/W643AC9gpWI/AAAAAAAAGxM/eeGhrUW7RaoU5YC5e_LEXP_4ucTH7a5AgCK4BGAYYCw/s1600/IMG_0107.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="https://1.bp.blogspot.com/-TFqq6Yh_i1Y/W643AC9gpWI/AAAAAAAAGxM/eeGhrUW7RaoU5YC5e_LEXP_4ucTH7a5AgCK4BGAYYCw/s400/IMG_0107.JPG" width="400" /></a></div>
<br />
<br />
I just picked up this Pioneer CLD-V2400 in full working order, and in excellent condition. It was made in 1993, around the same vintage as my Pioneer CLD-S201... but with one major difference... a SERIAL PORT!<br />
<br />
<br />
It's missing a couple of the more "industrial" commands that allow it to seek quickly (+/- 100 frames) without noticeable glitches/squelching.. so it's not ideal for laserdisc video games, which were crafted so that you could play a game non sequentially without seeing pauses as the disc seeks. I guess it's able to move the head super quickly within the VBLANK section of the disk<br />
<br />
I'm getting ahead of myself...<br />
<br />
<a href="http://1.bp.blogspot.com/-FIPukddxcHg/W642_3BlJ2I/AAAAAAAAGw0/77HcSZMNdOkWvKvOWLzjr4NUcT5FaFsRwCK4BGAYYCw/s1600/IMG_0124.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="243" src="https://1.bp.blogspot.com/-FIPukddxcHg/W642_3BlJ2I/AAAAAAAAGw0/77HcSZMNdOkWvKvOWLzjr4NUcT5FaFsRwCK4BGAYYCw/s400/IMG_0124.jpg" width="400" /></a><br />
<br />
This thing has a DB-15 connector On the back for the RS-232 serial interface, which includes TTL Serial (0-5v) and RS-232 serial (+/- 12v). <br />
<br />
Since I couldn't find my USB-Serial interface, I tried making a TTL cable, and connecting that via FTDI cable to my Mac... I wasn't able to get it to reliably work. I think it might be a that the FTDI/Mac combo couldn't do the 4800 baud rate or something.<br />
<br />
<br />
<br />
<a href="http://2.bp.blogspot.com/-Gqw6HFsJjh0/W643AQwQN_I/AAAAAAAAGxU/8aNFRlnrwS4Ivnk7ZmjrVxtPo4fVTGP1ACK4BGAYYCw/s1600/IMG_0112.JPG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="320" src="https://2.bp.blogspot.com/-Gqw6HFsJjh0/W643AQwQN_I/AAAAAAAAGxU/8aNFRlnrwS4Ivnk7ZmjrVxtPo4fVTGP1ACK4BGAYYCw/s320/IMG_0112.JPG" width="320" /></a><br />
<br />
Instead I made a DB15-DB9 Null modem cable, and decided to plug it into the 9 pin serial port on... something?<br />
<br />
I had a hard time finding any of my machines with DB9 serial, but eventually remembered that my tiny Toshiba Libretto 50 has one! So yeah! Windows 98 and HyperTerminal it is... and it worked great! <br />
<br />
Next, I went through the V2400/V2600 manual, (and the V4400 manual) to figure out some commands that I could do. <br />
<br />
I had some experiments I wanted to do with using the "user area" of the on screen text of the player.<br />
<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-JAJPZ1xQIAE/W643AJoaKXI/AAAAAAAAGxE/RLfKP6BQPaURui7John4rQ3QmisCzARlwCK4BGAYYCw/s1600/IMG_0117.JPG" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="320" src="https://3.bp.blogspot.com/-JAJPZ1xQIAE/W643AJoaKXI/AAAAAAAAGxE/RLfKP6BQPaURui7John4rQ3QmisCzARlwCK4BGAYYCw/s320/IMG_0117.JPG" width="320" /></a></div>
<br />
First of all, I wanted to see how to do it.. which you can see in this pic. I had my CAV Duran Duran disc playing, obviously.<br />
<br />
My thought is that I can do thing similar to the "Rollercoaster" project and just command the thing to play scenes, but it can be taken a step further.<br />
<br />
Another option available is to get a user number press from the remote. The user presses 0..9 and you get that back through the serial port.<br />
<br />
It would be possible to make a modern game or interactive video thing using onscreen text for the output, and remote for the input.<br />
<br />
<br />
<br />
<br />
<a href="http://2.bp.blogspot.com/-9TrZtlAFDuw/W643AXkEBvI/AAAAAAAAGxc/9gXyAI7b4RwdSRE0DyAUFokotVBCbJiQQCK4BGAYYCw/s1600/IMG_0121.JPG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="240" src="https://2.bp.blogspot.com/-9TrZtlAFDuw/W643AXkEBvI/AAAAAAAAGxc/9gXyAI7b4RwdSRE0DyAUFokotVBCbJiQQCK4BGAYYCw/s320/IMG_0121.JPG" width="320" /></a><br />
<br />
The display area on this player is 10 lines of 20 characters each. Not a lot, but enough for activities.<br />
<br />
Perhaps I could encapsulate the game and logic inside of an Arduino would work... but that still brings up the TTL serial issue.<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<a href="http://2.bp.blogspot.com/-VcXNM5P8yUc/W643AQYoitI/AAAAAAAAGxY/iYqO1d-UU5E3ybC7m4zzx75ak31xZwSOwCK4BGAYYCw/s1600/IMG_0131.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="320" src="https://2.bp.blogspot.com/-VcXNM5P8yUc/W643AQYoitI/AAAAAAAAGxY/iYqO1d-UU5E3ybC7m4zzx75ak31xZwSOwCK4BGAYYCw/s320/IMG_0131.jpg" width="320" /></a><br />
<br />
I scoured my basement, looking for my Belkin USB-Serial dongle, which I'm starting to believe I never actually had... I eventually gave up and decided to kludge together this monstrosity.<br />
<br />
The nice serial cable I made was a null-modem cable, but the serial level interface (blue board) had the wrong gender and pins for my use, so i tacked on some wires to the correct connector.<br />
<br />
The Arduino is a Pro Micro (ATmega 32u4/"Leonardo") made for another project. so it already had the microSD socket and external FTDI connector for a serial peripheral, so this went together substantially quicker than looking for the USB interface.<br />
<br />
<br />
<br />
Regardless, this somehow worked... really well. I needed to make a simple Arduino program that just reads in from "Serial" port, the USB side of the Leonardo and writes to the "Serial1" port, which is on pins D0 and D1.<br />
<br />
The trick was to have both open at 4800 baud. I had the LD side at 4800 baud, and the USB side at 115200, but that didn't work.<br />
<br />
I've made it so I can type on my mac, and control the player... or have the Arduino autonomously control the player.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe width="320" height="266" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/WlKfIr-iVs4/0.jpg" src="https://www.youtube.com/embed/WlKfIr-iVs4?feature=player_embedded" frameborder="0" allowfullscreen></iframe></div>
<br />
One of the things you can monkey with is disabling the squelch of the video and audio. This is what blanks/blues the screen and mutes the audio while seeking, or while doing pause in CLV mode. When it's off, you can play multispeed/stillframe with audio, stillframe on CLV (which doesn't really work, but it's neat!) and do chapter seeks while still seeing the content. It's really fun to mess around with...<br />
<br />
I think I need to make a script that seeks to the end of the disc to get the duration, then randomly seeks around, plays a second or two, and then repeats that... Especially with squelch off!Scott Lawrencehttp://www.blogger.com/profile/15740562503843879527noreply@blogger.com0tag:blogger.com,1999:blog-5543608644585014794.post-58739597778716154932018-08-14T11:05:00.000-04:002018-08-14T11:16:39.897-04:00Commanding Laserdiscs<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://2.bp.blogspot.com/-7vlWWAHa6rU/W3LyO30nQhI/AAAAAAAAGuU/OLW2fB8NzE0Gv2aQTDDiZLppASQw6uShQCLcBGAs/s1600/Screen%2BShot%2B2018-08-14%2Bat%2B1.17.47%2BAM.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="1093" data-original-width="1600" height="272" src="https://2.bp.blogspot.com/-7vlWWAHa6rU/W3LyO30nQhI/AAAAAAAAGuU/OLW2fB8NzE0Gv2aQTDDiZLppASQw6uShQCLcBGAs/s400/Screen%2BShot%2B2018-08-14%2Bat%2B1.17.47%2BAM.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Coming soon...</td></tr>
</tbody></table>
For the past couple evenings, I've been poking at controlling video playback programmatically... I was inspired by <a href="http://monsterfeet.com/grue/notes/19" target="_blank">Kevin Savetz' recent project to resurrect the Rollercoaster Apple ][ Laserdisc game</a>. He got it working, fixed it, enhanced it to work for the DVD version of the game, and was showing it off at KansasFest.<br />
<br />
My first quick hack, <a href="https://www.wintergroundfairlands.com/2018/08/4-hour-projects-adding-video-to.html" target="_blank">as seen before on this blog</a>, was to screen-scrape an Infocom game (Hitchhiker's Guide to the Galaxy), and based on text from that, force VLC to play back certain frames or tracks of video from the Hitchhiker's Guide TV show.<br />
<br />
I've been poking at actually making Rollercoster be playable inside the browser for my next trick. I'm basing it all on the <a href="https://github.com/savetz/AdventuresInVideoland" target="_blank">source code, which Kevin has made available to us</a>, and using a HD transfer of the movie, which hopefully is the same edit of the film as the Discovision Laserdisc.<br />
<br />
There will be more on this later, but the short version is that I'm using jsbasic to run Applesoft Basic right in the browser (no emulation of an Apple ][ ), simulating the Super Serial port (6551 ACIA chip), capturing the BASIC game's laserdisc commands being sent to said serial port, and then using that information to control a fakeo-laserdisc player, which is just an HTML 5 video player. I'm still working through all of this. The cool thing is that when I'm done with this, it could be a great test system for people wanting to make more LD-AppleII games. As long as you use video files that can be properly frame-associated with real discs, it should be a drop-in kind of thing.<br />
<br />
<b><i>NOTE</i></b>: if I learn more information, I'll note it in this post. I'm really green when it comes to Apple II hardware, and really Apple II programming in general. This is really my first deep-dive into Apple II serial hardware and specifics of Applesoft BASIC!<br />
<h3>
Super Serial card</h3>
The Super Serial for this game is in slot 2, and is fitted with a 6551 ACIA serial interface chip. Writes to the ACIA get sent out immediately, they are not buffered. The ACIA has one bit on its status port <b>0x08</b> or <b>b00001000</b> that goes high when there's a byte to read. The LDP will send a '<b>R</b>' when its current task is complete.<br />
<br />
The Super Serial card, being in slot 2 means that its four registers are at decimal locations:<br />
<br />
<ul>
<li><b><span style="font-family: "courier new" , "courier" , monospace;">49320</span></b> - Data </li>
<ul>
<li>Read from here to read characters sent to the Apple</li>
<li>Write to this to send out characters to the LDP</li>
</ul>
<li><b><span style="font-family: "courier new" , "courier" , monospace;">49321</span></b> - Status</li>
<ul>
<li>Read from here to get error codes, </li>
<li>Read and mask off 0x08 to get the "is a character ready to be read from the LDP?</li>
</ul>
<li><b><span style="font-family: "courier new" , "courier" , monospace;">49322</span></b> - Command</li>
<li><b><span style="font-family: "courier new" , "courier" , monospace;">49323</span></b> - Control</li>
<ul>
<li>These two are used to configure the port, for baud rate, parity, etc. For this project, I'm simulating the behavior of the device at a very high level, so i basically ignore all of this stuff.</li>
<li>The real hardware runs at 4800 baud, 8-N-1</li>
</ul>
</ul>
<div>
This means that to write a character (newline) out to the LDP:</div>
<div>
<ul>
<li><span style="font-family: "courier new" , "courier" , monospace;"><b>POKE 49320,13</b></span></li>
</ul>
<div>
<span style="font-family: "courier new" , "courier" , monospace;"><b><br /></b></span></div>
</div>
<h3>
LDP Simulation</h3>
Anyway. there's been some interest in others wanting to simulate the Laserdisc player (LDP) using other methods (using VLC for example), so I thought I'd just do a quick post to explain <i>my current understanding</i> of the specific commands used by the game. You can look up specifics of the protocol in the <a href="http://www.dragons-lair-project.com/tech/manuals/LD-V4400Users.pdf" target="_blank">LD-V4400 User's Manual</a>, or in the <a href="https://www.rent4event.de/fileadmin/dateien/PDF/pioneer-dvd-v8000-manual.pdf" target="_blank">DVD-V8000 User's Manual</a> All commands are two-letter sequences, uppercase (although the manual says that it accepts lowercase as well.) and can have a number BEFORE the opcode.<br />
<br />
There are a lot of commands that these can handle, but these are the commands that we care about for this game:<br />
<br />
<b>FR</b><br />
<blockquote class="tr_bq">
Go into "frame mode". This means that any addresses will be in number of frames from the start of the disc. Frame 0 is the first frame on the disc, the final frame is dependent on the duration of the disc. CAV discs are about 30 minutes of content. at 29.97FPS (NTSC), that is roughly 54,000 frames.</blockquote>
<br />
<b>(address) SE</b><br />
<blockquote class="tr_bq">
Seek to the address (frame number) and go into still-frame mode. Reading from the ACIA, </blockquote>
<br />
<b>(address) PL</b><br />
<blockquote class="tr_bq">
Play, and go to still-frame mode when the address (frame number) is reached.</blockquote>
<br />
Additionally, the game's command strings use '/' to indicate a carriage return (CR) character, which is sent as decimal value 13. The player will then execute the command, and will send back an "R" character (decimal 82) when it completes.<br />
<br />
Let's go through a couple real examples...<br />
<br />
<br />
<b><span style="font-family: "courier new" , "courier" , monospace;">"FR2818SE/"</span></b><br />
<ul>
<li>Switch the LDP into frame mode</li>
<li>Seek to frame 2818, and still-frame there</li>
<li>LDP will send "R" when it has completed.</li>
</ul>
<blockquote class="tr_bq">
AKA: Still frame on frame 2818, will send "R" when done.</blockquote>
<br />
<br />
<b><span style="font-family: "courier new" , "courier" , monospace;">"FR2134PL/"</span></b><br />
<ul>
<li>Switch the LDP into frame mode</li>
<li>From the current position, play until the frame number reaches 2134, and still-frame there</li>
<li>LDP will send an "R" when it has completed</li>
</ul>
<blockquote class="tr_bq">
AKA: Play until frame 2134, will send "R" when it reaches there.</blockquote>
<br />
<b><span style="font-family: "courier new" , "courier" , monospace;">"FR6726SE/FR6959PL/"</span></b><br />
<ul>
<li>Switch the LDP into frame mode</li>
<li>Seek to frame 6726, and stillframe</li>
<li>LDP will send "R" when ready</li>
<li>(switch to frame mode)</li>
<li>Play until frame 6959, and then stillframe</li>
<li>LDP will send "R" when ready</li>
</ul>
<blockquote class="tr_bq">
AKA: Play from frame 6726 through 6959, send "R" when done.</blockquote>
<h3>
</h3>
<h3>
Game implementations</h3>
The serial port configuration and setup is at line <b>31000</b>. The sequence it does is that it <b>POKE</b>s <b>11</b> to <b>49322</b>, and <b>28</b> to <b>49323</b>, which sets up the serial port configuration (baud, parity, etc). It also does something with <b>CHR$(4); "PR#2" or "PR#0"</b>. I'm honestly not entirely sure what those are for, something with sending data to the serial card.<br />
<br />
The BASIC code to send the command strings is at line <b>40000</b>, and the command string is stored in <b>VC$</b>. So in the program you'll see stuff like:<br />
<blockquote class="tr_bq">
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;">34000 VC$ = "FR2818SE/": GOSUB 40000 </span></blockquote>
<blockquote class="tr_bq">
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;">34011 VC$ = "FR6726SE/FR6959PL/": GOSUB 40000</span></blockquote>
You already know what these do from the above examples!<br />
<br />
<br />
The LDP communication code at 40000 is:<br />
<blockquote class="tr_bq">
<span style="font-size: x-small;"><span style="font-family: "courier new" , "courier" , monospace;">40000 REM PLAY VIDEO CLIP<br />40010 IF NOT DISC THEN RETURN<br />40020 FOR I = 1 TO LEN (VC$)<br />40030 IF MID$ (VC$,I,1) = "/" THEN POKE 49320,13: WAIT 49321,8:J = PEEK (49320): GOTO 40060<br />40040 POKE 49320, ASC ( MID$ (VC$,I,1))<br />40060 NEXT I<br />40070 RETURN</span></span></blockquote>
Or, in human readable terms:<br />
<ul>
<li>if "DISC" is set 0, then there's no VDP, so just return</li>
<li>For each character of the command string:</li>
<ul>
<li>if the character is a '/', then send the VDP a carriage return, and wait for "R" response</li>
<li>otherwise just send the current command string character to the VDP</li>
</ul>
</ul>
<br />
The code also uses the "<b>WAIT</b>" command, which was not implemented in the javascript library I was using. This command essentially blocks, and waits until the conditions are met. In the above code it essentially is <b>PEEK</b>ing at <b>49321</b> (ACIA status) for bit 8 to be set; for a character to be ready to read in.. It then reads the character to variable <b>J</b>, which is then ignored. ;) But it knows the LDP is done with the task.<br />
<div>
</div>
<div>
<br /></div>
Scott Lawrencehttp://www.blogger.com/profile/15740562503843879527noreply@blogger.com0tag:blogger.com,1999:blog-5543608644585014794.post-53068475986328692622018-08-10T16:44:00.000-04:002018-08-10T16:46:51.672-04:004 Hour Projects: Adding Video to Interactive Fiction<div style="background-color: white; box-sizing: border-box; caret-color: rgb(36, 41, 46); color: #24292e; font-size: 16px; margin-bottom: 16px;">
<div style="text-align: center;">
<a href="https://github.com/BleuLlama/llifvid/blob/master/screenshot.jpg" style="background-color: transparent; box-sizing: border-box; color: #0366d6; text-decoration: none;" target="_blank"><span style="font-family: inherit;"><img height="375" src="https://github.com/BleuLlama/llifvid/raw/master/screenshot.jpg" style="border-style: none; box-sizing: content-box; max-width: 100%;" width="640" /></span></a></div>
</div>
<h2>
<span style="font-family: inherit;">Overview</span></h2>
<div style="background-color: white; box-sizing: border-box; caret-color: rgb(36, 41, 46); color: #24292e; font-size: 16px; margin-bottom: 16px;">
<span style="font-family: inherit;">After listening to the <a href="http://monsterfeet.com/grue/notes/19" rel="nofollow" style="background-color: transparent; box-sizing: border-box; color: #0366d6; text-decoration: none;">Eaten By A Grue podcast:19</a> about the interactive laserdisc-based game for the movie "Rollercoaster", and then following that up with the <a href="http://monsterfeet.com/grue/notes/16" rel="nofollow" style="background-color: transparent; box-sizing: border-box; color: #0366d6; text-decoration: none;">episode about Hitchhiker's Guide:16</a>, a spark popped in my head. It should be possible to somehow "watch" the Hitchhiker's Guide (H2G2) Infocom game and play clips of the TV show, movie, etc, syncronized to the scenes and what you're looking at.</span></div>
<div style="background-color: white; box-sizing: border-box; caret-color: rgb(36, 41, 46); color: #24292e; font-size: 16px; margin-bottom: 16px;">
<span style="font-family: inherit;">All of the distributable code for this is available <a href="https://github.com/BleuLlama/llifvid" target="_blank">at the github page for the project</a>.</span></div>
<div style="background-color: white; box-sizing: border-box; caret-color: rgb(36, 41, 46); color: #24292e; font-size: 16px; margin-bottom: 16px;">
<span style="font-family: inherit;">Just about all of this project is based on existing stuff, but I glued it all together.</span></div>
<ul style="background-color: white; box-sizing: border-box; caret-color: rgb(36, 41, 46); color: #24292e; font-size: 16px; margin-bottom: 16px; margin-top: 0px; padding-left: 2em;">
<li style="box-sizing: border-box;"><span style="font-family: inherit;"><a href="http://frotz.sourceforge.net/" rel="nofollow" style="background-color: transparent; box-sizing: border-box; color: #0366d6; text-decoration: none;">Frotz</a> - runs the Z-code, in a text-based terminal</span></li>
<li style="box-sizing: border-box; margin-top: 0.25em;"><span style="font-family: inherit;"><a href="https://www.videolan.org/vlc/index.html" rel="nofollow" style="background-color: transparent; box-sizing: border-box; color: #0366d6; text-decoration: none;">VLC media Player</a> - plays back the video</span></li>
<li style="box-sizing: border-box; margin-top: 0.25em;"><span style="font-family: inherit;"><a href="https://www.google.com/search?q=buy+hitchhiker%27s+guide+tv+dvds" rel="nofollow" style="background-color: transparent; box-sizing: border-box; color: #0366d6; text-decoration: none;">H2G2 TV on DVD</a> - the DVDs</span></li>
<li style="box-sizing: border-box; margin-top: 0.25em;"><span style="font-family: inherit;"><a href="https://en.wikipedia.org/wiki/Netcat" rel="nofollow" style="background-color: transparent; box-sizing: border-box; color: #0366d6; text-decoration: none;">Netcat</a> - so my client can talk to the server</span></li>
<li style="box-sizing: border-box; margin-top: 0.25em;"><span style="font-family: inherit;"><a href="https://en.wikipedia.org/wiki/Tee_(command)" rel="nofollow" style="background-color: transparent; box-sizing: border-box; color: #0366d6; text-decoration: none;">Tee</a> - to split the output from frotz</span></li>
<li style="box-sizing: border-box; margin-top: 0.25em;"><span style="font-family: inherit;">Perl script (in this repo) - "reads" the text, matches text, tells VLC what to play</span></li>
</ul>
<div style="background-color: white; box-sizing: border-box; caret-color: rgb(36, 41, 46); color: #24292e; font-size: 16px; margin-bottom: 16px;">
<span style="font-family: inherit;">The whole thing kinda works, is buggy, unoptimized, but that's the nature of a 4 hour hack.</span></div>
<h2 style="text-align: center;">
<span style="font-family: inherit;"><iframe allowfullscreen="" frameborder="0" height="270" src="https://www.youtube.com/embed/T9Bvh-acHZc" style="font-weight: normal;" width="480"></iframe></span></h2>
<h2>
<span style="font-family: inherit;">Architecture</span></h2>
<div style="background-color: white; box-sizing: border-box; caret-color: rgb(36, 41, 46); color: #24292e; font-size: 16px; margin-bottom: 16px;">
<div style="text-align: center;">
<a href="https://github.com/BleuLlama/llifvid/blob/master/diagram.jpg" style="background-color: transparent; box-sizing: border-box; color: #0366d6; text-decoration: none;" target="_blank"><span style="font-family: inherit;"><img height="235" src="https://github.com/BleuLlama/llifvid/raw/master/diagram.jpg" style="border-style: none; box-sizing: content-box; max-width: 100%;" width="640" /></span></a></div>
</div>
<div style="background-color: white; box-sizing: border-box; caret-color: rgb(36, 41, 46); color: #24292e; font-size: 16px; margin-bottom: 16px;">
<span style="font-family: inherit;">This is the basic system... This was a quick sketch I made to get the idea down. Essentially there are two halves. (I also called it "zvid" instead of "llifvid". pls ign. thx.)</span></div>
<h3>
<span style="font-size: 1.25em;"><span style="font-family: inherit;">Server/Video player</span></span></h3>
<div style="background-color: white; box-sizing: border-box; caret-color: rgb(36, 41, 46); color: #24292e; font-size: 16px; margin-bottom: 16px;">
<span style="font-family: inherit;">The server on the left is essentially a perl script that:</span></div>
<ul style="background-color: white; box-sizing: border-box; caret-color: rgb(36, 41, 46); color: #24292e; font-size: 16px; margin-bottom: 16px; margin-top: 0px; padding-left: 2em;">
<li style="box-sizing: border-box;"><span style="font-family: inherit;">Matches text from the interactive fiction</span></li>
<li style="box-sizing: border-box; margin-top: 0.25em;"><span style="font-family: inherit;">has a simple interpreted language that can perform sequential functions</span></li>
<li style="box-sizing: border-box; margin-top: 0.25em;"><span style="font-family: inherit;">outputs "remote" commands for VLC</span></li>
</ul>
<div style="background-color: white; box-sizing: border-box; caret-color: rgb(36, 41, 46); color: #24292e; font-size: 16px; margin-bottom: 16px;">
<span style="font-family: inherit;">The output of that perl script is piped into VLC. If you're going to reproduce this, be aware that enabling the VLC shell it was a bit tricky, and I didn't document the process. I think I needed to enable extended preferences in VLC to see the bit to turn on that feature.</span></div>
<div style="background-color: white; box-sizing: border-box; caret-color: rgb(36, 41, 46); color: #24292e; font-size: 16px; margin-bottom: 16px;">
<span style="font-family: inherit;">Also on this side are the video files for H2G2 episodes 1 and 2. I used <a href="https://handbrake.fr/" rel="nofollow" style="background-color: transparent; box-sizing: border-box; color: #0366d6; text-decoration: none;">Handbrake</a> to decode them off of my DVDs. I do know that the episodes exist online, but those may be set up for web streaming, and will need to be transcoded via handbrake or some other tool. It basically just needs to add some information in that isn't there.</span></div>
<div style="background-color: white; box-sizing: border-box; caret-color: rgb(36, 41, 46); color: #24292e; font-size: 16px; margin-bottom: 16px;">
<span style="font-family: inherit;">Netcat (nc) is setup as a listener for the text output from the game engine. That is piped into the perl script, whose output is piped into VLC.</span></div>
<h3>
<span style="font-size: 1.25em;"><span style="font-family: inherit;">Client/Game engine</span></span></h3>
<div style="background-color: white; box-sizing: border-box; caret-color: rgb(36, 41, 46); color: #24292e; font-size: 16px; margin-bottom: 16px;">
<span style="font-family: inherit;">The client on the right is some bash script piping and connection of Frotz with the game file. I used the ms-dos version of the data file, although I do not know if any other versions differ in any way. This was just easiest for me to grab without digging out and setting up my Amiga to pull the files off of my game's floppy.</span></div>
<div style="background-color: white; box-sizing: border-box; caret-color: rgb(36, 41, 46); color: #24292e; font-size: 16px; margin-bottom: 16px;">
<span style="font-family: inherit;">The output of frotz is piped through tee. Tee takes the output and splits it to two different places. First, is the console so you can see what you're doing, but it also usually saves it to a file. I've changed that path to be piping the output to netcat, setup as a transmitter to the server.</span></div>
<h2>
<span style="font-family: inherit;">Interpreter</span></h2>
<div style="background-color: white; box-sizing: border-box; caret-color: rgb(36, 41, 46); color: #24292e; font-size: 16px; margin-bottom: 16px;">
<span style="font-family: inherit;">In the perl script is a quick interpreter that I hacked together to run little micro scripts of code. I started doing this as an array of arrays, but if you've ever done that in perl, you'd know that such things are never good ideas in that language. I briefly considered hopping over to python to do it, but I already had stuff done, and was still toying with the idea of having the perl script itself listening to a socket, which i was unsure of how to do in python. So it's in perl.</span></div>
<div style="background-color: white; box-sizing: border-box; caret-color: rgb(36, 41, 46); color: #24292e; font-size: 16px; margin-bottom: 16px;">
<span style="font-family: inherit;">Anyway, I switched it over to be a plain text blob in the source file. At startup, it cleans up the text, removing comments, and empty lines. It also breaks it up as two elements per line; the opcode and the parameter, and store that as the runtime program. This vastly simplified runtime routines.</span></div>
<div style="background-color: white; box-sizing: border-box; caret-color: rgb(36, 41, 46); color: #24292e; font-size: 16px; margin-bottom: 16px;">
<span style="font-family: inherit;">The two main entry bits for the language are the label and the text match. It's sort of event driven, sequential language, with no nesting, no calls, no iterations, none of that... one operation per line. I did include comments though which are denoted by pound sign, # and continue to the end of the line. They can be put anywhere, as they are filtered out before runtime.</span></div>
<blockquote class="tr_bq">
<span style="font-family: "courier new" , "courier" , monospace;">: label</span></blockquote>
<div style="background-color: white; box-sizing: border-box; caret-color: rgb(36, 41, 46); color: #24292e; font-size: 16px; margin-bottom: 16px;">
<span style="font-family: inherit;">Labels are used for 'goto' statements, or calling the goto function to set the current PC (program counter). If you call the doGoto() function, it will adjust the PC to the line after that label, or to -1, indicating that it was not found, and there's nothing to do.</span></div>
<blockquote class="tr_bq">
<span style="font-family: "courier new" , "courier" , monospace;">? text to match</span></blockquote>
<div style="background-color: white; box-sizing: border-box; caret-color: rgb(36, 41, 46); color: #24292e; font-size: 16px; margin-bottom: 16px;">
<span style="font-family: inherit;">This denotes text that should be matched. As the program runs, it reads in byte by byte from the client and accumulates it. When it hits a newline 0x0d, or 0x0a, it sends the accumulated text to the "got a line" function. That one tries to match each "text to match" string to see if it matches any part of the current line. If it does, it sets the PC to the next line, and returns.</span></div>
<div style="background-color: white; box-sizing: border-box; caret-color: rgb(36, 41, 46); color: #24292e; font-size: 16px; margin-bottom: 16px;">
<span style="font-family: inherit;">From there, there are a few opcodes that can be called:</span></div>
<blockquote class="tr_bq">
<span style="font-family: "courier new" , "courier" , monospace;">seek 100</span></blockquote>
<div style="background-color: white; box-sizing: border-box; caret-color: rgb(36, 41, 46); color: #24292e; font-size: 16px; margin-bottom: 16px;">
<span style="font-family: inherit;">This will seek the current video file to 100 seconds in.</span></div>
<blockquote class="tr_bq">
<span style="font-family: "courier new" , "courier" , monospace;">until 110</span></blockquote>
<div style="background-color: white; box-sizing: border-box; caret-color: rgb(36, 41, 46); color: #24292e; font-size: 16px; margin-bottom: 16px;">
<span style="font-family: inherit;">This will wait until the timer hits 110 seconds in in the video. Due to limitations of time, this is implemented as a hack. Instead of looking at the video file to get the time, it remembers the last 'seek' number called, does a difference, and sleeps for that many seconds, blocking. For the above two codes the "until 110" call will essentially sleep for 10 seconds</span></div>
<blockquote class="tr_bq">
<span style="font-family: "courier new" , "courier" , monospace;">done</span></blockquote>
<div style="background-color: white; box-sizing: border-box; caret-color: rgb(36, 41, 46); color: #24292e; font-size: 16px; margin-bottom: 16px;">
<span style="font-family: inherit;">Indicates that a sequence of opcodes is done. "do until done" will stop here" this leaves the PC at -1, indicating it's done.</span></div>
<blockquote class="tr_bq">
<span style="font-family: "courier new" , "courier" , monospace;">player play</span></blockquote>
<div style="background-color: white; box-sizing: border-box; caret-color: rgb(36, 41, 46); color: #24292e; font-size: 16px; margin-bottom: 16px;">
<span style="font-family: inherit;">This sends the "play" command to VLC. It can send anything. Useful things are:</span></div>
<blockquote class="tr_bq">
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><span style="color: #24292e;"><span style="caret-color: rgb(36, 41, 46);">play # press play on the current video</span></span><span style="color: #24292e;"><span style="caret-color: rgb(36, 41, 46);">pause # toggle pause!</span></span><span style="color: #24292e;"><span style="caret-color: rgb(36, 41, 46);">frame # advance one frame. forces a paused state</span></span><span style="color: #24292e;"><span style="caret-color: rgb(36, 41, 46);">stop # stops the player</span></span><span style="color: #24292e;"><span style="caret-color: rgb(36, 41, 46);">fullscreen on # makes the video full screen (on|off)</span></span><span style="color: #24292e;"><span style="caret-color: rgb(36, 41, 46);">seek 100 # you can manuall call this as well</span></span><span style="color: #24292e;"><span style="caret-color: rgb(36, 41, 46);">rate 2 # twice speed... or "0.25" for quarter speed. etc</span></span><span style="color: #24292e;"><span style="caret-color: rgb(36, 41, 46);">add FILENAME # adds a file to the playlist, and switches to it</span></span></span></blockquote>
<div style="background-color: white; box-sizing: border-box; caret-color: rgb(36, 41, 46); color: #24292e; font-size: 16px; margin-bottom: 16px;">
<span style="font-family: inherit;">These essentially just print out the command, as the VLC shell is consuming the commands directly.</span></div>
<h3>
<span style="font-family: inherit;">Determining match strings</span></h3>
<div style="background-color: white; box-sizing: border-box; caret-color: rgb(36, 41, 46); color: #24292e; font-size: 16px; margin-bottom: 16px;">
<span style="font-family: inherit;">For this I basically ran "frotz hhg.z3" and copy-pasted long lines of text from the game to match that seemed unique. It worked okay but was kinda tedious.</span></div>
<div style="background-color: white; box-sizing: border-box; caret-color: rgb(36, 41, 46); color: #24292e; font-size: 16px; margin-bottom: 16px;">
<span style="font-family: inherit;">I was originally going to extract out the room names/descriptions from the z3 files using the tools, but gave up on that for this simpler, quicker approach.</span></div>
<h3>
<span style="font-family: inherit;">Determining timing</span></h3>
<div style="background-color: white; box-sizing: border-box; caret-color: rgb(36, 41, 46); color: #24292e; font-size: 16px; margin-bottom: 16px;">
<span style="font-family: inherit;">So to get the second counts, I ran VLC, playing the video file, directly: "vlc episode1.m4v", and did a lot of typing in the shell of the above commands. I would type "play" to let it play, then "pause" or "frame" to get it to stop. You can get the current time with "get_time", manually seek to specific times like "seek 300" or differences from the current time, "seek -10" for ten seconds ago, etc.</span></div>
<div style="background-color: white; box-sizing: border-box; caret-color: rgb(36, 41, 46); color: #24292e; font-size: 16px; margin-bottom: 16px;">
<span style="font-family: inherit;">I could use the GUI for this, but it shows time as mm:ss rathe than time as seconds only.</span></div>
<div style="background-color: white; box-sizing: border-box; caret-color: rgb(36, 41, 46); color: #24292e; font-size: 16px;">
<span style="font-family: inherit;">It was tedious, but it worked. An easier to use mechanism for this would be advantageous.</span></div>
<div style="background-color: white; box-sizing: border-box; caret-color: rgb(36, 41, 46); color: #24292e; font-size: 16px;">
<span style="font-family: inherit;"><br /></span></div>
<h2>
<span style="font-family: inherit;">Conclusions...</span></h2>
<div>
<span style="font-family: inherit;">So yeah... it worked. With a lot more work it could be made to be reliable, have a nice editor, and be easily streamlined into more games. I'd personally want to see an integrated executable as well, to get rid of all of this netcat and shell weirdness, and just have one exe that runs, reading in a language file. Game packages could be created with the language file, audio, video, etc. But I feel like I've accomplished what I wanted to for this. </span></div>
<div style="background-color: white; box-sizing: border-box; caret-color: rgb(36, 41, 46); color: #24292e; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; font-size: 16px;">
<br /></div>
Scott Lawrencehttp://www.blogger.com/profile/15740562503843879527noreply@blogger.com0tag:blogger.com,1999:blog-5543608644585014794.post-63865397753529023962018-07-28T00:37:00.001-04:002018-07-28T00:37:21.120-04:00Digital Logic in Javascript...<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-puevX-4J2Eg/W1tqhUk4jtI/AAAAAAAAGtU/W4lFMJXlx-wsC0jqyQWxrO1Zqp3VgpnXACLcBGAs/s1600/Screen%2BShot%2B2018-07-27%2Bat%2B2.54.39%2BPM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="846" data-original-width="978" height="345" src="https://4.bp.blogspot.com/-puevX-4J2Eg/W1tqhUk4jtI/AAAAAAAAGtU/W4lFMJXlx-wsC0jqyQWxrO1Zqp3VgpnXACLcBGAs/s400/Screen%2BShot%2B2018-07-27%2Bat%2B2.54.39%2BPM.png" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
I needed some time off from my main project right now, and I had this bug in my brain to try out some of this, so I did a thing. It uses javascript, jquery, bootstrap, and css stuff to do the whole thing. I use some of this at work, so this was a great chance to learn a bit more about that tech.<br />
<br />
So here's a <a href="http://umlautllama.com/llmin/logicr" target="_blank">link to the quickly and horribly named "Logicr"</a>, pronounced "lä-jik-<span style="color: #222222; font-family: sans-serif; font-size: 14px;">ər".</span><br />
<br />
It's essentially a tiny javascript library/set of classes that simulate digital logic. I'm not going to start drawing out diagrams of class hierarchies because that would take too long to do. Instead, i'll quickly explain a bit of it, and then explain what the interface is showing.<br />
<br />
At the bottom level, there are objects that are "pins". This is a thing that can be set with a low, high, or floating data level. I made the level actually a value from 1-100, below 25 is "low", above 75 is "high" and in the middle is "floating". When you read them, you get back a true/false value, and you can write the 0..100 level, or true/false. I made it this way so that i can eventually simulate pullups/pulldowns in the circuits. <br />
<br />
Those pins are included in "nodes", which have a collection of inputs and outputs. One example of a node is a logic gate. A typical gate has two inputs, A, B, and one output, Y. When the nodes get their update() call, they do whatever math is necessary to read in from their inputs and set their outputs. Currently the system supports the basic 1-2 input logic gates: Not, And, Nand, Or, Nor, Xor, as well as one-pin output "sources" that generate High, Low, and Float output.<br />
<br />
Another node is a "clock". This one toggles its output once a second (1000ms) between high and low levels.<br />
<br />
Another type of thing in the system is a "wire". Wires are just lists of connections "from" and "to" pins on nodes in the system.<br />
<br />
In the above example, there's a clock node (XTAL1), whose output Y goes to the first LED, named "clk". There's a second wire from XTAL1's output that goes to the input of a Not gate (Inverter), in-turn, whose output goes to the second LED, "!clk".<br />
<br />
You may notice that they don't change instantaneously. That's because the system is set up to update all of the nodes first, then update all of the wires. This prevented having to actually generate a real directed graph, and deal with loops and recursion and loops and recursion and stuff. It probably simulates propagation delay on real parts, but i'm sure it has its own unique quirks.<br />
<br />
So every 50ms, it goes through and tells all of the nodes to do their math, then immediately goes through the list of wires, reading from their FROM and writing to their TO.<br />
<br />
So for the clock circuit:<br />
<br />
<ul>
<li>Nodes:</li>
<ul>
<li>Clock XTAL1 running at 1000ms</li>
<li>LED D1, blue, labelled "clk"</li>
<li>LED D2, blue, labelled "!clk"</li>
<li>Not gate IC1</li>
</ul>
<li>Wires</li>
<ul>
<li>XTAL1.Y to D1.A -- connects the clock to the first LED</li>
<li>XTAL1.Y to IC1.A -- connects the clock to the not gate</li>
<li>IC1.Y to D2.A -- connects the not gate to the second LED</li>
</ul>
</ul>
<br />
That's the basics of it.<br />
<br />
But there's more.<br />
<br />
I added a few input devices and output devices. First is the switch. The switch is essentially a html checkbox at its core. When the switch node gets called to update, it reads the value directly out of the checkbox widget in the browser, and sets its output pin to the appropriate value. Similarly, the LEDs are just a "div" that's made round and the right color (dim/bright red, etc) via CSS. When the LED nodes are updated, they read the value from their input pin, then apply the appropriate "on" or "off" class to their html div. The browser and CSS take care of the rest.<br />
<br />
There's a couple other things happening in the circuit there too...<br />
<br />
The amber switches are the A and B inputs to an XOR gate. The A and B switches also go to the amber LEDs with the same labels, so that you can see what's going on there. The output from the XOR gate goes to the green LED labelled Y.<br />
<br />
The four red switches labelled 0x01, 0x02, 0x04, and 0x08 are run into a sort-of ROM, implemented as just a simple 16 value lookup table. The ROM has 4 inputs and 8 outputs. The 8 outputs are wired to the red seven-segment display node's "a"-"g" inputs, which light up the segments of the display on the web interface. As you toggle the switches, the appropriate number is displayed. The ROM data is basically a lookup table of which segments to drive for each value 0x0..0x9,0xA-0xF. The equivalent of the 74LS47 ic chip. I was originally going to build this circuit using logic gates, but it got really complex... I may still do it eventually, once i have a better editor.<br />
<br />
Mess with it...<br />
<br />
In the interface, if you scroll down, you'll see an editor section at the bottom. Press the "Load Default" button to fill the text box with the circuit description that's running, and you can see all of the logic nodes and wire connections. Press the "Run Circuit" button to read in the JSON content from that window and rebuild the internal logic to use it. The content there has to be valid JSON, otherwise it won't work. The "Run" button will have a green border when it's valid, red when it's not.<br />
<br />
Future<br />
<br />
So yeah. This was meant to be a quick test to see how well it could quickly be done, and expanded upon for a possible future project that I've been thinking about for a while. There are still more component classes I want to add, such as "packages" which can group together circuits... for example, creating flip-flops using gate logic, or building that 7-segment decoder, or more complex things...<br />
<br />
I also would like to make an in-browser editor of the circuits. I've been looking at jsPlumb as well as a few other solutions for doing "create movable boxes with connection magnets that are connected with wires" type of things. I may just spin up something of my own, as having draggable boxes is fairly easy to do using CSS/JS and then connections are just SVG lines between them, etc... Although i'm sure the nuances of the interface make it more complex than it seems...<br />
<br />
Oh. and this is running in my tiny page thingy, llmin... It's basically a wrapper for a page that sets up jQuery, bootstrap, and some other stuff, so that I don't have to create that boilerplate every time I want to make a page to test stuff. ;)Scott Lawrencehttp://www.blogger.com/profile/15740562503843879527noreply@blogger.com0tag:blogger.com,1999:blog-5543608644585014794.post-36258963386461485402018-06-02T00:09:00.001-04:002018-06-02T00:11:09.875-04:00Finishing touches on LL530 v1.00 firmware<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-eoIOLQ0xhwQ/WxIHACoDjQI/AAAAAAAAGpg/3m1koEjOfmooBIBPS2BvjVTQTTlZ4_OKgCLcBGAs/s1600/IMG_8875.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1600" data-original-width="1600" height="400" src="https://3.bp.blogspot.com/-eoIOLQ0xhwQ/WxIHACoDjQI/AAAAAAAAGpg/3m1koEjOfmooBIBPS2BvjVTQTTlZ4_OKgCLcBGAs/s400/IMG_8875.JPG" width="400" /></a></div>
I'm currently cramming to get the first version of the firmware for my LL530 project out, so I can ship the first few ordered boards. (YAY!).<br />
<br />
<h4>
Quick backstory...</h4>
LL530 is a board with an Atmega32u4 (Arduino Leonardo/Pro Micro) and a few connectors on it so that you have a USB interface for Amiga/Atari ST/Atari mice, Atari controllers, and Amiga 500, 1000, 2000, 3000 keyboards. Yes it even supports weird Atari controllers like Basic Programming's "Keyboard Controller" and Star Raiders' Video Touchpad, as well as the Indy 500 "Driving" controller that they made look identical to Paddles,... which are also supported.<br />
<br />
Yes, there are other versions of portions of this, but I wanted more flexibility. I want to be able to just connect to the device, tell it that i have a mouse plugged in now, and it will just work... and in the future, auto-configuring the ports without even connecting... but i digress...<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-gSYtpvo5e1U/WxIG_vxIc4I/AAAAAAAAGpk/fBOR3wWUPPEYV6U4GPf5hLG26eVKandEACEwYBhgL/s1600/IMG_8931.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1600" data-original-width="1600" height="400" src="https://2.bp.blogspot.com/-gSYtpvo5e1U/WxIG_vxIc4I/AAAAAAAAGpk/fBOR3wWUPPEYV6U4GPf5hLG26eVKandEACEwYBhgL/s400/IMG_8931.JPG" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<i>Yeah. I wrote a program in VCS Basic Programming via the Stella</i></div>
<div class="separator" style="clear: both; text-align: center;">
<i>emulator on my Mac. Yeah. it's as cumbersome as it looks, but I'm</i></div>
<div class="separator" style="clear: both; text-align: center;">
<i>still freaking impressed that BASIC is even possible... it means only</i></div>
<div class="separator" style="clear: both; text-align: center;">
<i>one thing.. <b>Warren Robinett is a god among men!</b></i></div>
<div class="separator" style="clear: both; text-align: center;">
<i>I'm getting off the subject here... okay...</i></div>
<h4>
<br /></h4>
<h4>
Hey, Scott... don't forget the reason for this post...</h4>
<div>
Oh right.. Thank you Document McSubheading for reminding me.</div>
<h4>
<br /></h4>
<h4>
No Prob..... now get on with it!</h4>
<div>
RIGHT. So I'm trying to get all of the non-keyboard stuff working in one firmware. I have a decent shell interface that lets you do all sorts of configuration stuff of the two ports, which I call "Port A" and "Port B". I have a framework where you can pick the input device (joystick, mouse, paddle, etc) and then pick what it sends out to the host computer (mouse movements, joystick movements, various keyboard configurations.)</div>
<div>
<br /></div>
<div>
Now, the Arduino framework is kind of notorious for being slow in some respects. That's the price you pay for ease of use. One of the slowest is the port pin reads and writes. For example:</div>
<div>
<br /></div>
<div>
digitalWrite( Pin3, HIGH )</div>
<div>
<br /></div>
<div>
is a function that sets Arduino Digital Pin 3 as a HIGH value. So internally, it looks at "Pin3", and figures out where on the ATmega microprocessor that maps to... The digital/analog pins from the Arduino are abstractions of the ATmega's actual ports. for example digital pin 3 might actually be "PORTD" bit 5. This function makes it so that beginners don't need to know that stuff... and what's more, all arduinos have digital pins 0, 1,2, 3, etc but generally map to different ATmega ports/pins... it might be PORTD bit 5 on a 328P, but it might be PORTG bit2 on a 32u4. </div>
<div>
<br /></div>
<div>
<b>Too much info. TL;DR:</b> digitalWrite() digitalRead() are an order of magnitude slower than just reading PORTG and masking off bit 2, which is near instantaneous. (I should note that analog reads are slow, regardless, as the micro needs time to make the reading.)</div>
<div>
<br /></div>
<div>
I noticed this on the Eastman Theater sign project. I was using digitalWrite() calls to bit-bang out the data to the sign's shift register/LED drivers. I was getting roughly 5 frames per second, when driving all 240 columns of 8 pixels... When I switched it to direct bit writes, it went well over 60 FPS!</div>
<div>
<br /></div>
<div>
<b><i>Mouse support....</i></b></div>
<div>
<br /></div>
<div>
I have all of the other controllers working, at least somewhat, and I've had a USB-Mouse interface using a 32u4/Pro Micro on my RaspberryPi/Amibian system for years now, so I knew it would work... but i was surprised when I finally got to working on the mouse device reading to find it wasn't working. It was getting readings, but it was missing some... it was missing a lot of them.</div>
<div>
<br /></div>
<div>
To read a joystick, you only need to know "is it up now?" "is it left now?"... not very time critical between readings. However, for reading a mouse, you need to read all of the "gray code" sequence state numbers that it generates. As it rotates left-right (the up-down axis is identical), it sends out, over two bits of the connector, a sequence of digits.</div>
<div>
<br /></div>
<div>
<div style="text-align: center;">
<b>00 <span style="font-family: "arial" , sans-serif;">⇨ </span>01 <span style="font-family: "arial" , sans-serif;">⇨</span><span style="font-family: "arial" , sans-serif;"> 11</span> <span style="font-family: "arial" , sans-serif;">⇨</span><span style="font-family: "arial" , sans-serif;"> 10</span> <span style="font-family: "arial" , sans-serif;">⇨</span><span style="font-family: "arial" , sans-serif;"> </span>00 <span style="font-family: "arial" , sans-serif;">⇨ </span>01 <span style="font-family: "arial" , sans-serif;">⇨</span><span style="font-family: "arial" , sans-serif;"> 11</span> <span style="font-family: "arial" , sans-serif;">⇨ ....etc</span></b></div>
</div>
<div style="text-align: center;">
<i>Moving left</i></div>
<div style="text-align: center;">
<br /></div>
<div>
<div style="text-align: center;">
<b>00 <span style="font-family: "arial" , sans-serif;">⇨ 10</span> <span style="font-family: "arial" , sans-serif;">⇨</span><span style="font-family: "arial" , sans-serif;"> 11</span> <span style="font-family: "arial" , sans-serif;">⇨</span><span style="font-family: "arial" , sans-serif;"> 01</span> <span style="font-family: "arial" , sans-serif;">⇨</span><span style="font-family: "arial" , sans-serif;"> </span>00 <span style="font-family: "arial" , sans-serif;">⇨ 10</span> <span style="font-family: "arial" , sans-serif;">⇨</span><span style="font-family: "arial" , sans-serif;"> 11</span> <span style="font-family: "arial" , sans-serif;">⇨ ....etc</span></b></div>
</div>
<div style="text-align: center;">
<i>Moving right</i></div>
<div>
<br /></div>
<div>
The mouse generates these regardless of you reading them. </div>
<div>
<br /></div>
<div>
There was some slowdown in reading the mouse, so i was missing some of the readings... so instead of getting 00, 01, 11, 10, 00, 01, 11, ... I was reading 00, ... 11, 10, 00, .. 11, .. .. 01, ... 00, which generated bad mouse movements, since those are sometimes recognized as left, sometimes as right, sometimes as completely invalid changes.</div>
<div>
<br /></div>
<div>
So it must've been the port reading? Right? That was my first thought too. This thought was cemented further, when I tried out some stripped down firmware, which worked, but once i read from all three possible buttons, it would fail again. I thought maybe the arduino framework was doing an analog read on one of those ports or something. I wrote some code to profile read/write times, and found that it was just as fast as expected. (I had switched the port IO for this project to direct reads, without the framework long ago.) (sidenote: Still not sure why commenting out button 3 had any affect... weird.)</div>
<div>
<br /></div>
<div>
<b>So that wasn't it.</b></div>
<div>
<br /></div>
<div>
I eventually moved some simple mouse reading/generation code as a dedicated loop, which worked.. </div>
<div>
<br /></div>
<div>
Next, I re-enabled my big switch statement that checks the input types, and checks the output types and does the right thing... to my surprise, it still worked.</div>
<div>
<br /></div>
<div>
I re-enabled some of the other polling routines... some are timing based, so they use the millis() function which of course has some overhead... and surprisingly, everything still worked.</div>
<div>
<br /></div>
<div>
Then I re-enabled the serial shell interface... and things broke... quickly!</div>
<div>
<br /></div>
<div>
But... the serial interface wasn't doing ANYTHING?! what?! All it's doing is first doing a</div>
<blockquote class="tr_bq" style="text-align: left;">
<span style="font-family: "courier new" , "courier" , monospace;"><b>if( !Serial ) return;</b></span></blockquote>
<div>
The 32u4/Leonardo/Pro Micro will have major issues if you try to send out Serial data before it's done initializing that HID device. This call just checks to see if the port is active.. I littered my code with them before Serial.print() blocks to prevent the thing from bricking <b>again</b>... But even when the shell is active, i do a standard</div>
<blockquote class="tr_bq" style="text-align: left;">
<span style="font-family: "courier new" , "courier" , monospace;"><b>if( Serial.available()) { .... }</b></span></blockquote>
<div>
to check if the user typed anything... then it pretty much returns...</div>
<div>
<br /></div>
<div>
The problem is... my assumptions were <b>WRONG</b>.</div>
<div>
<br /></div>
<div>
I threw some of these calls into my profiler, which is basically this kind of thing</div>
<blockquote class="tr_bq">
<b><span style="font-family: "courier new" , "courier" , monospace;">startTime = millis();</span><span style="font-family: "courier new" , "courier" , monospace;">for( x=0 ; x<1000 ; x++ ) {</span><span style="font-family: "courier new" , "courier" , monospace;"> /* do the thing to test in here */</span><span style="font-family: "courier new" , "courier" , monospace;">}</span><span style="font-family: "courier new" , "courier" , monospace;">endTime = millis();</span></b></blockquote>
<div>
then it prints out (endTime - startTime)/1000, and you get the average time per loop.</div>
<div>
<br /></div>
<div>
<br class="Apple-interchange-newline" />
<blockquote class="tr_bq">
<b><span style="font-family: "courier new" , "courier" , monospace;">if( Serial.available() ) { /* do nothing */ }</span></b></blockquote>
</div>
<div>
<br /></div>
<div>
This took roughly 0ms per loop, so it's probably just checking a bit inernally...</div>
<div>
<br /></div>
<div>
<br /></div>
<blockquote class="tr_bq">
<b><span style="font-family: "courier new" , "courier" , monospace;">if( !Serial ) { /* do nothing */ }</span></b></blockquote>
<div>
I thought this did the same sort of thing... Nope. No matter what I did, 10ms. Every time this is called, it blocks for 10ms. No wonder that my mouse polling was failing! it was missing tons of gray code sequence states since the thing was almost constantly blocking in the "!Serial" check.</div>
<div>
<br /></div>
<div>
<b><i>BLAGH!</i></b></div>
<div>
<br /></div>
<div>
It's feeling better now. :D</div>
<div>
<br /></div>
<div>
<br /></div>
<h4>
Anyway... Here's some more info on the project in general:</h4>
Links for the project are in flux right now; once I get the first version of the firmware packaged up, i'll be setting up a proper website/hub for it with full documentation of the project. Until then, here are some links:<br />
<br />
<br />
<ul>
<li><a href="https://www.tindie.com/products/BleuLlama/ll530-amiga-keyboard-and-controller-usb-widget/" target="_blank">LL530 at my Tindie store</a></li>
<li><a href="https://docs.google.com/spreadsheets/d/1oiasWowPqfLd65Nviks10itDrAlb_mDwj0-1A_5GubE/edit?usp=sharing" target="_blank">Controller Compatibility Chart</a>... and my general notebook for research for the project </li>
<li><a href="https://docs.google.com/spreadsheets/d/1cie8D4gBfsOB4FqS9Zl8iIO6TD0ATzgsHPnaTWJ99QI/edit?usp=sharing" target="_blank">Firmware Version Roadmap</a></li>
</ul>
<br />
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-vOgUKu3lcTI/WxIHAIKE4iI/AAAAAAAAGpo/oMsOdFGqkHAThv6Rcj1Y0VuOBOmmSRlMwCEwYBhgL/s1600/IMG_8879%2B2.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1600" data-original-width="1600" height="400" src="https://2.bp.blogspot.com/-vOgUKu3lcTI/WxIHAIKE4iI/AAAAAAAAGpo/oMsOdFGqkHAThv6Rcj1Y0VuOBOmmSRlMwCEwYBhgL/s400/IMG_8879%2B2.JPG" width="400" /></a></div>
<div style="text-align: center;">
<i>Testing the system is kinda fun! Although that 7800 controller is pretty horrible.</i></div>
<div style="text-align: center;">
<br /></div>
Scott Lawrencehttp://www.blogger.com/profile/15740562503843879527noreply@blogger.com0tag:blogger.com,1999:blog-5543608644585014794.post-4573541815586667752017-09-26T21:41:00.001-04:002017-09-26T21:44:47.120-04:00Arduino-Midi for Sim City Music Playback...<br />
<br />
<div style="text-align: center;">
<a href="http://1.bp.blogspot.com/-PSx8GoF0aC4/Wcr-lSfzjwI/AAAAAAAAGYE/8UsJntRX0HADjDWzoOfY-Pa9W8fXOhT8ACK4BGAYYCw/s1600/DKsVXGEXkAAFG-h.jpg"><img border="0" src="https://1.bp.blogspot.com/-PSx8GoF0aC4/Wcr-lSfzjwI/AAAAAAAAGYE/8UsJntRX0HADjDWzoOfY-Pa9W8fXOhT8ACK4BGAYYCw/s640/DKsVXGEXkAAFG-h.jpg" /></a></div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: center;">
<i>Roland Sound Canvas SC-55, hooked up through a hacked cable to an Arduino Uno,</i></div>
<div style="text-align: center;">
<i>which is connected to... NOT THE MACBOOK because I FORGOT</i></div>
<div style="text-align: center;">
<i>THE STUPID USB-C ADAPTER AT HOME. GEEZ.</i></div>
<br />
Was thinking in the car on the way to Interlock of a way to make the Sim City 2000 music thing better. <br />
<br />
The project I'm talking about is to play the weird Sim City 2000 midi files at random intervals throughout the day, so that life feels more like Sim City. ;)<br />
<br />
I have a python script that will play the songs on my laptop... (see below) but I want something more physical..<br />
<br />
<div style="text-align: center;">
<a href="http://2.bp.blogspot.com/-uFfxCodUcuk/WcsApm4KGFI/AAAAAAAAGYQ/ou5AP5eZp54lvwbIjru0phFPCr36736cgCK4BGAYYCw/s1600/IMG_5797.JPG"><i><img border="0" src="https://2.bp.blogspot.com/-uFfxCodUcuk/WcsApm4KGFI/AAAAAAAAGYQ/ou5AP5eZp54lvwbIjru0phFPCr36736cgCK4BGAYYCw/s400/IMG_5797.JPG" /></i></a></div>
<div style="text-align: center;">
<i><br /></i></div>
<div style="text-align: center;">
<i>Roland MT-90. It plays midi files off of floppy disks to a builtin Sound Canvas.</i></div>
<div style="text-align: center;">
<i>Yes. I think it's a weird thing as well, but at least it sounds nice!</i></div>
<br />
Was thinking of putting an Arduino inside of the MT-90, which would press the button sequence to: (switch on shuffle mode), (switch on random play), then (wait) then (play the next track)... (The arduino would press the buttons via relays, the way I did it inside the Yamaha Tape deck..<br />
<br />
I was thinking that it might be nice to not have to hack the device, and have just a midi thing i could plug in to any midi device... I'd have it do the above with the MT-90, but it doesn't have any midi control sequences to control playback... just midi notes/tone generation stuff.<br />
<br />
Then I took a step back and thought that if i just stored the midi files on a sd card, and just had the arduino play them itself out to a sound canvas, that'd do the trick! I found a 5 pin din cable, hacked in connections.... but I forgot my USB-C to USB adapter at home. Dang!<br />
<br />
So it's not really a failure of a project *YET*, but it was a definite lack of success...<br />
<br />
Here's the python script. It expects to be run on a Mac, with timidity installed, which will play the music. Also it expects the midi files to be in a "SC2000/" subdirectory. It's not the most elegant thing, but I hacked it together in a couple days... <br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><br /></span>
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><br /></span>
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><br /></span>
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">#!/usr/bin/python</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">#</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"># an attempt to make real life more like playing SimCity</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">#</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"># It picks a random amount of time from 15-90 seconds</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"># if there's silence for the entire thing, it will pick a random </span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"># track in the SC2000 directory and play it.</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"># then it repeats... until you ctrl-c out of it</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">#</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"># v2 2017-07-28 - made more configurable, quieter output, class</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"># v1 2017-07-27 yorgle@gmail.com</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">#</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">#<span style="white-space: pre;"> </span>Requires: - timidity to be installed (brew install timidity)</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">#<span style="white-space: pre;"> </span> - OS X (10.12 tested)</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><br /></span>
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><br /></span>
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">import sys</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">import os</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">import time</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">import random</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">import subprocess</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">sys.dont_write_bytecode = True</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><br /></span>
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><br /></span>
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">class SimMusic:</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><br /></span>
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span style="white-space: pre;"> </span># defaults</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span style="white-space: pre;"> </span>midicmd = "/usr/local/bin/timidity --no-loop {} 2> /dev/null" </span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span style="white-space: pre;"> </span>mididir = "SC2000/"</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span style="white-space: pre;"> </span>silenceTimer = 0</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span style="white-space: pre;"> </span>timerMin = 15</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span style="white-space: pre;"> </span>timerMax = 90</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span style="white-space: pre;"> </span>disabled = 999999</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span style="white-space: pre;"> </span>timeout = disabled</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><br /></span>
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span style="white-space: pre;"> </span># constructor</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span style="white-space: pre;"> </span>def __init__( self, tmin = None, tmax = None ):</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span style="white-space: pre;"> </span>if( tmin != None ):</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span style="white-space: pre;"> </span>self.timerMin = tmin</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><br /></span>
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span style="white-space: pre;"> </span>if( tmax != None ):</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span style="white-space: pre;"> </span>self.timerMax = tmax</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><br /></span>
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span style="white-space: pre;"> </span>self.setupTimer()</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><br /></span>
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span style="white-space: pre;"> </span>def setupTimer( self ):</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span style="white-space: pre;"> </span>self.silenceTimer = 0</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span style="white-space: pre;"> </span>self.timeout = random.randint( self.timerMin, self.timerMax )</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><br /></span>
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span style="white-space: pre;"> </span>def resetTimer( self ):</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span style="white-space: pre;"> </span>self.silenceTimer = 0</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><br /></span>
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span style="white-space: pre;"> </span>def stopTimer( self ):</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span style="white-space: pre;"> </span>self.silenceTimer = 0</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span style="white-space: pre;"> </span>self.timeout = self.disabled</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><br /></span>
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span style="white-space: pre;"> </span>def systemIsPlayingAudio( self ):</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span style="white-space: pre;"> </span>process = os.popen('/usr/bin/pmset -g' );</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span style="white-space: pre;"> </span>text = process.read()</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span style="white-space: pre;"> </span>process.close()</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span style="white-space: pre;"> </span>if( "coreaudio" not in text ):</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span style="white-space: pre;"> </span>return False</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span style="white-space: pre;"> </span>return True</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><br /></span>
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><br /></span>
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span style="white-space: pre;"> </span>def playRandomMIDI( self ):</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span style="white-space: pre;"> </span>self.stopTimer()</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><br /></span>
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span style="white-space: pre;"> </span>files = os.listdir( self.mididir )</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span style="white-space: pre;"> </span>fname = self.mididir + random.choice( files )</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><br /></span>
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span style="white-space: pre;"> </span>print( "Timidity: {}".format( fname ))</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span style="white-space: pre;"> </span>process = subprocess.Popen( self.midicmd.format( fname ), shell=True )</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span style="white-space: pre;"> </span>process.wait()</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><br /></span>
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span style="white-space: pre;"> </span>self.setupTimer()</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><br /></span>
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><br /></span>
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span style="white-space: pre;"> </span>def run( self ):</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span style="white-space: pre;"> </span>playingTimer = 0</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span style="white-space: pre;"> </span>print( "scanning..." );</span><br />
<span style="white-space: pre;"><span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"> </span></span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span style="white-space: pre;"> </span>self.setupTimer()</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span style="white-space: pre;"> </span>while True:</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span style="white-space: pre;"> </span>if( self.systemIsPlayingAudio() ):</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span style="white-space: pre;"> </span>if( playingTimer == 0 ):</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span style="white-space: pre;"> </span>print( "\n" )</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span style="white-space: pre;"> </span>sys.stdout.write( '\033[2K' )</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span style="white-space: pre;"> </span>sys.stdout.write( "\rAudio is playing... Waiting. ({})".format( playingTimer ))</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span style="white-space: pre;"> </span>sys.stdout.flush()</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><br /></span>
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span style="white-space: pre;"> </span>time.sleep( 1 )</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span style="white-space: pre;"> </span>playingTimer = playingTimer + 1</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span style="white-space: pre;"> </span>self.resetTimer()</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span style="white-space: pre;"> </span>else:</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span style="white-space: pre;"> </span>playingTimer = 0</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span style="white-space: pre;"> </span>if( self.silenceTimer == 0 ):</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span style="white-space: pre;"> </span>self.setupTimer()</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><br /></span>
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span style="white-space: pre;"> </span>self.silenceTimer = self.silenceTimer+1</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><br /></span>
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span style="white-space: pre;"> </span>if( self.silenceTimer > 0 ):</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span style="white-space: pre;"> </span>if( self.silenceTimer == 1 ):</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span style="white-space: pre;"> </span>print( "\n" )</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span style="white-space: pre;"> </span>sys.stdout.write( '\033[2K' )</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span style="white-space: pre;"> </span>sys.stdout.write( "\rShhh! {} of {} seconds has passed".format( self.silenceTimer, self.timeout ))</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span style="white-space: pre;"> </span>sys.stdout.flush()</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span style="white-space: pre;"> </span>if( self.silenceTimer >= self.timeout ):</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span style="white-space: pre;"> </span>self.playRandomMIDI()</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span style="white-space: pre;"> </span>self.setupTimer()</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span style="white-space: pre;"> </span>self.silenceTimer = 0</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span style="white-space: pre;"> </span>else:</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span style="white-space: pre;"> </span>time.sleep( 1 )</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><br /></span>
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">################################################################################</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><br /></span>
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"># put this in your main app as well.</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;">if __name__ == "__main__":</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span style="white-space: pre;"> </span>simMusic = SimMusic( )</span><br />
<span style="font-family: Courier New, Courier, monospace; font-size: xx-small;"><span style="white-space: pre;"> </span>simMusic.run()</span>Scott Lawrencehttp://www.blogger.com/profile/15740562503843879527noreply@blogger.com0tag:blogger.com,1999:blog-5543608644585014794.post-29827819972834754652017-05-01T22:35:00.003-04:002017-05-01T22:38:36.579-04:00RC2017/4 Final! (Replica Results and Post-Mortem)<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="http://3.bp.blogspot.com/-O9O7ccrqj1o/WQfc0kPLBQI/AAAAAAAAEUc/rKpnOneq80ALiDQAVb9sRcUiUwtRqE5wACK4B/s1600/treachery-1.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="247" src="https://3.bp.blogspot.com/-O9O7ccrqj1o/WQfc0kPLBQI/AAAAAAAAEUc/rKpnOneq80ALiDQAVb9sRcUiUwtRqE5wACK4B/s400/treachery-1.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">"The Treachery Of Pop Pixel Art" - Scott Lawrence, 4/30/17<br />
Inspired by Andy Warhol and René Magritte's works</td></tr>
</tbody></table>
As you might know, I spent time this past month working on what I nicknamed "The Andy Project". The idea was to re-create some of Andy Warhol's art pieces on an Amiga, well, an emulated Amiga, using appropriate tools, as pixel-accurately as possible.<br />
<br />
This blog post will be a summary of results, mentions of pitfalls, and that kind of thing. The previous three blog posts cover most of the other information for the project. Links for these are on the bottom of this post.<br />
<h2>
Philosophical musings...</h2>
Andy's work is interesting because you don't see any other of the "classic" artists doing their work in such a media, where you can get pixel-for-pixel copies of the originals. Nowadays, sure, you get photographs of the original, but with these digital art works, you can get essentially the EXACT same content that was originally produced. This is likely why the "originals" have never been made public directly... Understandably so.... That floppy gets out, and we see posters of pop-pixel-art available in every mall. That said, I want to make poster blow-ups of some of these. ;)<br />
<br />
This actually got me thinking a lot about the resulting media files that I will be produced. These will be virtually indistinguishable from the originals. Are they the same as the originals? In some of these, I am the person who drew all of the individual pixels in Deluxe Paint. It is distinctly not the original files, which are still under lock-and-key. But those may surface, and you may find that mine are nearly identical with respect to which color pixels are where on the digital canvas.<br />
<br />
In the music industry, if you were to make a copy of a waveform, by looking at numerical representations of the wave, and typing them in to a computer, making a replica of the original waveform. When played back, it's still Debbie Harry's "Rush Rush"... but you actually created it from scratch by copying the numbers from the original. It's a replica... that is functionally and actually identical to the original. In fact, if you were to write a computer program that did this for you; go through the audio file, and look at the numbers, then write those numbers into another file... then the computer has generated a replica of the original... That's exactly the same as I'm doing here, right? <br />
<br />
That software already exists.. it's "cp", "copy" or "drag-and-drop the icon to another folder."<br />
<br />
Does that mean that I cannot take credit for my reproductions? This is kind of why I had wanted to add specific mistakes/changes to mine, so even if you were to compare them at the pixel level, mine would be at the least, a derivative work. ... but is that enough? Couldn't Andy's estate come after me and say "that imagery is exactly the same as the original, and you're putting it up online for free! Stop that now!"<br />
<br />
<b><i>I</i></b> know that mine are replicas... perhaps that's enough.<br />
<div>
<br /></div>
But then, if you think about the pop-art movement of the '50s and onward, it delves DIRECTLY into this, head on. Andy, for example, took iconic things (soup cans, Marilyn Monroe) and used them as the basis for his iconic works. If the Campbell's Soup can looked different, so would have his artwork.<br />
<br />
So in that vein... My reproductions are essentially my brand new art pieces, just using his pieces as the inspiration...<br />
<br />
Wait.. are mine replicas of his works? Are mine new works, like the originals under the pop-art umbrella?<br />
<br />
I don't know how to resolve this.<br />
<br />
<h2>
The Andy Project</h2>
I started out with a list of 11 images to pick from. I thought I might get a few done, but I never set specific goals for myself... so I only got three of them done. I still feel like this is a major success. Mainly because I can now do many of the other ones at my leisure using all of the tools and frameworks I've already set in place, with full knowledge of the pitfalls for the various steps.<br />
<br />
I also created two pieces that I was inspired to make from the project, so I included those in the ZIP and slideshow ADF as well. Links to the slideshow ADF downloads are at the bottom of this blog post, along with an in-browser emulator that can play it in-browser.<br />
<br />
Everything provided here is to be considered to be Creative-Commons BY-NC-SA. (Attribution, Non-Commercial, Share-Alike).<br />
<h2>
What went wrong</h2>
I think the big thing that went wrong was wrangling with tools. There are two instances that come to mind.<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="http://3.bp.blogspot.com/-VXgb3oRZ4mk/WQffaEYVYnI/AAAAAAAAEUw/yNC621WzGV8hFUm0mQ3ynYiulllSXNIYgCK4B/s1600/campbells.done.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="221" src="https://3.bp.blogspot.com/-VXgb3oRZ4mk/WQffaEYVYnI/AAAAAAAAEUw/yNC621WzGV8hFUm0mQ3ynYiulllSXNIYgCK4B/s320/campbells.done.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Nothing really went wrong here, I just thought it would almost<br />
be appropriate for this to be my end-state of this image. :)<br />
I feel like Andy might have accepted this.</td></tr>
</tbody></table>
<h4 style="text-align: left;">
ObeseBits</h4>
<div style="text-align: left;">
First of all, my tool "ObeseBits" was giving me trouble. It's the first Javascript-Processing app I've ever really made. Most of the time for Processing, I just use Java mode. That seemed a bit excessive, and I wanted to make something I could easily share, so I went Javascript instead. </div>
<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; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://4.bp.blogspot.com/-VK7ApxhlMRw/WQffOSHhE7I/AAAAAAAAEUo/7hTSj8oSWWMWQIbE5eoQTELjeUMnf9hxACK4B/s1600/campbells.frustration.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="276" src="https://4.bp.blogspot.com/-VK7ApxhlMRw/WQffOSHhE7I/AAAAAAAAEUo/7hTSj8oSWWMWQIbE5eoQTELjeUMnf9hxACK4B/s400/campbells.frustration.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">If you watch the time lapse, you may see bits like this roll through.<br />
The frustration was real.</td></tr>
</tbody></table>
This is a fine choice, but I had a problem where... I'm not exactly sure what was going wrong, but I was re-drawing the entire screen every frame. It seemed to be chewing on more RAM that it should, especially after it sits for 5 minutes... especially running in Chrome on a 8 year old mac with 2 gig of RAM. Yes, I see the irony here that I'm creating these images on a machine that could do this with 1/2 megabyte of memory... hehe Anyway, it would get so unresponsive that it would essentially lock up the machine, but it always seemed like it was JUST ABOUT TO wake up. But no... spinny rainbow pizza instead... Force reboots were my friends.<br />
<h4>
FS-UAE emulator</h4>
The other main issue was that I couldn't get the ADF file exported from the emulator I was working in! Seems like a pretty straightforward thing to do:<br />
<br />
<ol>
<li>Mount an ADF disk image</li>
<li>Diskcopy Amiga Workbench 1.3 to it</li>
<li>Make space by removing printer drivers, fonts, utilities, etc that aren't needed</li>
<li>Copy my "Files" folder from the virtual hard disk to the virtual floppy</li>
<li>Set the startup-sequence to just add disk buffers and then run the slideshow (DPShow)</li>
<li>Quit out of the emulator</li>
<li>The ADF disk image file you have there has all of the above done to it, right?</li>
</ol>
<b> RIGHT?</b><br />
<div>
<b><br />WRONG</b>. I was using FS-UAE that, because of reasons that kinda make sense, treats all mounted ADF disk images as read-only, and creates an "overlay" in a separate directory with all of your changes. So... here's the list of things I tried to get the modified ADF out of the thing:<br />
<br />
<ol>
<li>"apply" the changes to the ADF.</li>
<ul>
<li>Can't do this. The change overlay is in a custom format.</li>
<li>No tools exist to do this. (!!s)</li>
</ul>
<li>Turn on the UAE emulator flag "writable_floppy_iamges=1", which tells the emulator that it's okay to write directly to disk images for new disks.</li>
<ul>
<li>Then you must mount a new disk, once this is set, diskcopy the content over, and you'll end up with an ADF with all of these changes. Right?</li>
<li>WRONG. FS-UAE ignores this flag. There is literally NO WAY to write to an ADF that I have found directly from FS-UAE. (let it be noted: otherwise, FS-UAE is freaking awesome. this just really frustrated me.)</li>
</ul>
<li>At some point in here, I needed to edit the startup-sequence on the ADF, and I couldn't do it via the emulator's mounted-folder-as-disk-image, so i grabbed "Vim" from Fred Fish disk 591.</li>
<ul>
<li>This required ARP for some reason, so I grabbed ARP and ran the installer. </li>
<li>It replaced a bunch of AmigaDOS commands, added a library, etc.</li>
<li>Vi now worked. Yay!</li>
</ul>
<li>Make a disk image to a file within the emulated Amiga.</li>
<ul>
<li>Sounds ridiculous, but in fact, yes...<b> it is ridiculous.</b></li>
<li>The only one I found that "should" work in AmigaDOS 1.3 was "TransADF"</li>
</ul>
<ol><ul>
<li>Grabbed TransADF off Aminet, put it on my "Work13" disk (which is a mounted folder from my Mac). </li>
<li>Ran TransADF, and... GURU MEDITATION</li>
</ul>
</ol>
<ul>
<li>Fumbled for a while and realized I could boot an emulated AmigaDOS 3.1 system.</li>
<li>Booted up AmigaDOS 3.1, ran TransDisk, created the ADF, looked good.</li>
<li>Booted back into 1.3, and suddenly, on "loadwb", the system just locked up with a blank blue screen.</li>
<li>Eventually traced it back to ARP being an issue.</li>
<li>Luckily, my Work13: disk was being maintained by Git, so i just reverted the changes that the ARP installer did... and now it all worked again. blerg.</li>
</ul>
</ol>
So yeah. Cumbersome as all get out, but I managed to get the ADF made, and I now know I can just boot into 3.1 and run TransDisk to do this again.<br />
<h2>
What went right...</h2>
I got three image replicas done! YAY!<br />
<br />
I feel super proud of the fact that I was able to do it to the best of my abilities, to the best effort I could provide and do. I tried my best to be pixel-perfect, to be color-accurate, and I think the results paid off really well!<br />
<br />
You can see me work on these in <a href="https://www.youtube.com/watch?v=QeM9T3qxU3w" target="_blank">a time-lapse on YouTube</a> too!<br />
<br />
What you see here are EXACTLY what I was doing this project to avoid. Incorrect aspect ratio, wrong file format, etc. ;) But they show the effort. I left the Deluxe Paint panels up just for fun, and to show that these are in fact the ones that I made, and not the source Warhol material. If you want the proper files, they're downloadable at the bottom of this file.<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="http://4.bp.blogspot.com/-1KC7R87ERP4/WQfj-r2YLTI/AAAAAAAAEVA/_0rX4Q-vQUAPLWvkg3AM7Tt8vKi5IKiSQCK4B/s1600/campDpaint.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="443" src="https://4.bp.blogspot.com/-1KC7R87ERP4/WQfj-r2YLTI/AAAAAAAAEVA/_0rX4Q-vQUAPLWvkg3AM7Tt8vKi5IKiSQCK4B/s640/campDpaint.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">"campbells.pic" (As seen in Deluxe Paint III)<br />
<span style="font-size: 12.8px;">Original by Andy Warhol, Replica by Scott Lawrence</span><br />
<div style="text-align: left;">
<span style="font-size: small;"><br /></span></div>
<div style="text-align: left;">
<span style="font-size: small;">"Campbells" took full advantage of the foray into GraphiCraft, as I used the palette generated from the saved out Graphicraft 1.2 image, but then tweaked by hand to accurately match the pre-release palette that Andy would have had available to him. I feel like this is a great representative pice of his work on the Amiga, as well as for this project itself.</span></div>
</td></tr>
</tbody></table>
<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="http://3.bp.blogspot.com/-MEvxjYaowtA/WQfknqFzM3I/AAAAAAAAEVM/tF3Nix5yxDE7YYUWREQ7xWV38hkTkewUwCK4B/s1600/venus.dpaint.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="460" src="https://3.bp.blogspot.com/-MEvxjYaowtA/WQfknqFzM3I/AAAAAAAAEVM/tF3Nix5yxDE7YYUWREQ7xWV38hkTkewUwCK4B/s640/venus.dpaint.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">"venus" (As seen in Deluxe Paint III)<br />
Original by Andy Warhol, Replica by Scott Lawrence<br />
<div style="text-align: left;">
<span style="font-size: small;"><br /></span></div>
<div style="text-align: left;">
<span style="font-size: small;">I had originally thought that "venus" was going to be pretty simple. It was mostly the "venus.iff" file that is included with every copy of Deluxe Paint. (<a href="https://upload.wikimedia.org/wikipedia/en/d/d3/DeluxePaint_Screenshot.png" target="_blank">Here's a link to the original as seen in Deluxe Paint IV.</a>) Well, there's those two orange dots on the left, the scribble on one eye, and the third eye... so it should be easy. <b>Right?</b> <b>Nope</b>. </span></div>
</td></tr>
</tbody></table>
<br />
<ol>
<li>The source material that I had was a JPEG, with its entire color palette completely wonky. Browns looked violet... whites looked yellow... that kind of thing</li>
<li>This means that I had to spend time not just picking the right color, but also cross-referencing the pixel in the jpeg with another of the same wrong color, but unchanged by andy... then find THAT color in my DPaint version, and use that color. </li>
<li>The forehead. I don't know how... I don't know why, but Andy replaced MOST of the forehead with the version that's there... He probably just grabbed a brush and pasted it down a lot. There's some evidence of this being the case along the left side. Perhaps I'll analyze it more for another blog post in the future. I ended up having to wipe out the entire forehead and re-do it entirely.</li>
</ol>
<div>
I do feel it necessary to note that many of the pixels in this are "close".. not specifically the exact correct shade of the colors. There are a lot of orange/browns that are VERY similar and with the process of cross-referencing mentioned above, I know that I made a few mistakes here and there on this one.</div>
<div>
<br /></div>
<div>
I had felt a bit uneasy looking at this one for a while, but couldn't place exactly why... but it turned out that the forehead's replacement was a huge subconscious "something's not right here" flag in my head that I couldn't quite place. </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 class="tr-caption" style="text-align: center;"></td></tr>
</tbody></table>
<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="http://3.bp.blogspot.com/-12aovqE-NM4/WQfk14Am1KI/AAAAAAAAEVU/esbN7Pp-nQkQ1tEHzCLjmi9fXP5o42twQCK4B/s1600/flower.dpaint.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="458" src="https://3.bp.blogspot.com/-12aovqE-NM4/WQfk14Am1KI/AAAAAAAAEVU/esbN7Pp-nQkQ1tEHzCLjmi9fXP5o42twQCK4B/s640/flower.dpaint.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">"flower" (As seen in Deluxe Paint III)<br />
<span style="font-size: 12.8px;">Original by Andy Warhol, Replica by Scott Lawrence</span></td></tr>
</tbody></table>
<br />
This one looked like it was going to be fairly straightforward to make... and it in fact was! There were a lot of stepped lines, and the source material was scaled up and fuzzy, but I was able to work around this. I remembered that DPaint has a tool "Coords" (press | to enable) which shows where your cursor is in X and Y, and also length of lines you're drawing. This took was invaluable for doing this replica.<br />
<h2>
Notes...</h2>
Yes, I did notice that "Flower" and "Campbells" are missing the red rectangles in the upper right of the imagery on the provided ZIP and ADF files below.. Those are the screen raise/lower tools from AmigaDOS shining through. Much like the "GraphiCraft" drag bar being visible, those should also have been visible. That's my mistake. The next version I cut of the slideshow will have that fixed.<br />
<br />
Oops!<br />
<h2>
Links!</h2>
Here's a list of links of products and stuff that may be interesting:<br />
<ul>
<li>See the slideshow via <a href="http://umlautllama.com/rc/2017-4/sae/">SAE emulation in your web browser</a> (Select "AndyProjectSlideshow" config, click "Start")</li>
<li>Download the <a href="http://umlautllama.com/rc/2017-4/AndyFiles.zip">slideshow folder, zipped with IFF file</a> (80k Zip file)</li>
<li>Downlaod the <a href="http://umlautllama.com/rc/2017-4/AndyProjectSlideshow.zip">slideshow ADF</a> (350k Zip, ADF Disk Image, autoboot, needs Kickstart 1.3)</li>
<li>Watch the <a href="https://www.youtube.com/watch?v=QeM9T3qxU3w">Timelapse video (with annotations)</a> Over on the YewToobz</li>
<li>Try out <a href="http://umlautllama.com/rc/2017-4/ObeseBits/">ObeseBits</a> - Made with Processing 3.3, using the JavaScript (p5.js) mode.</li>
<li>And finally, here's <a href="http://umlautllama.com/rc/2017-4/">my umlautllama page collecting all of the materials</a></li>
</ul>
<div>
<i>Everything provided here is to be considered to be Creative-Commons BY-NC-SA. (Attribution, Non-Commercial, Share-Alike). </i></div>
<div>
<br /></div>
<div>
And previous blog posts about the topic:</div>
<div>
<ul>
<li><a href="http://www.wintergroundfairlands.com/2017/03/rc201704-new-direction-andy-warhol.html">Post 1: Announcement of my intentions</a></li>
<li><a href="http://www.wintergroundfairlands.com/2017/04/rc20174-update-andy-project-tools.html">Post 2: Configuring the tools</a></li>
<li><a href="http://www.wintergroundfairlands.com/2017/04/rc20174-update-obesebits-is-now-online.html">Post 3: ObeseBits information</a></li>
</ul>
</div>
</div>
Scott Lawrencehttp://www.blogger.com/profile/15740562503843879527noreply@blogger.com0tag:blogger.com,1999:blog-5543608644585014794.post-31215450607662846432017-04-28T15:43:00.001-04:002017-04-28T15:43:35.352-04:00RC2017/4 Update - ObeseBits is now online!I've not gotten more images done yet, but I have exported the tool "ObeseBits" to the interwebs. You can play with it here:<div>
<br /></div>
<div>
<a href="http://umlautllama.com/p5/ObeseBits/">http://umlautllama.com/p5/ObeseBits/</a></div>
<div>
<br /></div>
<div>
Press 'I' (uppercase) to pick a different image, 'G' and 'g' to change grid mode and settings, drag the mouse to move around in the image, and shift-drag to adjust the size of the grid.</div>
<div>
<br /></div>
<div>
I made it in Processing 3.3.1, in "JavaScript Mode". When I got to this point, i just copied the entire directory to umlautllama.com, and there it is!</div>
<div>
<br /></div>
<div>
Enjoy! Or dont! Whatever!</div>
Scott Lawrencehttp://www.blogger.com/profile/15740562503843879527noreply@blogger.com0tag:blogger.com,1999:blog-5543608644585014794.post-64573452988357781842017-04-28T14:05:00.003-04:002017-04-28T14:05:59.384-04:00Building some RC2014 upgrades...<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-DxnaC3PESjY/WQNmG7lLqHI/AAAAAAAAETs/6ZB_0APX3AEqC95JVy-Vnpn62jwkAjNJACLcB/s1600/FullSizeRender.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="https://3.bp.blogspot.com/-DxnaC3PESjY/WQNmG7lLqHI/AAAAAAAAETs/6ZB_0APX3AEqC95JVy-Vnpn62jwkAjNJACLcB/s400/FullSizeRender.jpg" width="400" /></a></div>
<span id="goog_1452658302"></span><span id="goog_1452658303"></span><br />
I've been working on upgrading my RC2014 Z80 computer for the past few months, but in a very low-impact-to-my-finances-that-can't-support-it-otherwise way. This post will just go into explaining a few of the upgrades I have in mind,<br />
<br />
First of all, my current hardware scheme, the "RC2014/LL MicroLlama" as I call it, is and has been fully functional in its current state, and is emulated well in my emulator.<br />
<br />
I started working on a mass-storage solution for the MicroLlama, which I have slightly back-burnered this month so that I could attempt to focus on the 2017-04 RetroChallenge ("The Andy Project"), but I'll likely pick it up again next month, especially with some of the upgrades I now have in my hands, which I will now briefly talk about...<br />
<br />
<h3>
Dr. Scott M. Baker's Bus Supervisor Board</h3>
<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://3.bp.blogspot.com/-4KwJ1c8g-Rs/WQNmG3qN7YI/AAAAAAAAETo/LNwLwLqt5nk-nL1ZMneaov1kIWUKThdLACEw/s1600/IMG_4119.JPG" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="240" src="https://3.bp.blogspot.com/-4KwJ1c8g-Rs/WQNmG3qN7YI/AAAAAAAAETo/LNwLwLqt5nk-nL1ZMneaov1kIWUKThdLACEw/s320/IMG_4119.JPG" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">A ton of chips and a well packed board!</td></tr>
</tbody></table>
I just received a "kitted" version of <a href="http://www.smbaker.com/z80-retrocomputing-4-bus-supervisor">Dr. S.M.Baker's RC2014 Bus Supervisor board</a>. Major kudos to Rob Leisenfeld from the RC2014 community...<br />
<br />
The short description of this is that it has some I2C I/O Expanders that sit on the entire bus (Data, Address, Control) as well as replaces the system's 7.37 Mhz clock board. This can be used to snoop on the system, read/write IO, read/write RAM, etc... taken one level above that, you can use SMB's python scripts to upload data right into RAM, thus eliminating the need for a ROM module.<br />
<br />
People have successfully used this to run 64k RAM-only RC2014 computers, and upload the program ROM from their Raspberry Pi. (<a href="http://www.smbaker.com/wordpress/wp-content/uploads/2016/07/z80-supervisor.jpg">Schematic</a>, <a href="https://github.com/sbelectronics/rc2014/tree/master/supervisor">GitHub link to software</a>)<br />
<br />
<br />
<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://3.bp.blogspot.com/-ZeTpAvni1Go/WQNmHRdx2JI/AAAAAAAAETw/djBu5awy2_w5LVkIk8VVKacVltPXDJRugCEw/s1600/IMG_4122.JPG" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="300" src="https://3.bp.blogspot.com/-ZeTpAvni1Go/WQNmHRdx2JI/AAAAAAAAETw/djBu5awy2_w5LVkIk8VVKacVltPXDJRugCEw/s400/IMG_4122.JPG" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">It took me about 15 minutes to figure out the orientation of that crystal.<br />
(Pin 1, the pointy corner, is in the bottom right)<br />
Also, I'm not sure the jumper configuration is correct yet.</td></tr>
</tbody></table>
That's where my personal problem with it comes in. As it stands, his project uses a RasPi to communicate with the board over I2C. This is fine, however it does not fit within my workflow.<br />
<br />
I do not really have a RasPi to use for dev work, so my solution is to take a tiny Arduino Leonardo clone (<a href="https://www.aliexpress.com/item/Mini-SS-Micro-ATMEGA32U4-Module-Board-Compatible-For-Arduino-Pro-Micro/32775220354.html?spm=2114.01010208.3.1.vVxQ4K&ws_ab_test=searchweb0_0,searchweb201602_3_10152_10065_10151_10068_10130_10136_10137_10060_10138_10155_10062_10156_10154_10056_10055_10054_10059_10099_10103_10102_10096_10148_10147_10052_10053_10142_10107_10050_10051_10084_10083_10080_10082_10081_10178_10110_10111_10112_10113_10114_10181_10182_10078_10079_10073_10070_10123_10124-10050,searchweb201603_1,ppcSwitch_5&btsid=e8084764-49b8-43d9-85bb-4ce4e66ef129&algo_expid=79257850-f89b-48d5-a1d0-452d9a7d3bcf-0&algo_pvid=79257850-f89b-48d5-a1d0-452d9a7d3bcf">"Micro-SS" like this one</a>), with a cable connecting its I2C lines to the Bus Supervisor Board. Then, I'll make a thin Serial-I2C bit of software and making some desktop tools, perhaps in python to fit with the original from SMB.<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://4.bp.blogspot.com/-9msDqmFLzaQ/WQNmG0gtkKI/AAAAAAAAET4/T8NaYt5uaakw6pui5eFfdO_tBvJhRnuvwCEw/s1600/IMG_4112.JPG" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="400" src="https://4.bp.blogspot.com/-9msDqmFLzaQ/WQNmG0gtkKI/AAAAAAAAET4/T8NaYt5uaakw6pui5eFfdO_tBvJhRnuvwCEw/s400/IMG_4112.JPG" width="300" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">My "proof of concept" for USB-I2C communications.<br />
Here it's connected to an RGB color sensor.</td></tr>
</tbody></table>
The end result is that in my Z80 project makefiles, i can add a target for the generated .HEX files to be downloaded directly to the physical RC2014.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-uFYwaPvrRvo/WQNmHppaJjI/AAAAAAAAET4/AeCGDTqaLbIUoU7Ww0nmV_K1DQcuxf2MgCEw/s1600/IMG_4123.JPG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="320" src="https://3.bp.blogspot.com/-uFYwaPvrRvo/WQNmHppaJjI/AAAAAAAAET4/AeCGDTqaLbIUoU7Ww0nmV_K1DQcuxf2MgCEw/s320/IMG_4123.JPG" width="240" /></a></div>
I've made a cable for my Micro-SS and have built my Bus Supervisor Board. As you can see in the photo, this is it set up on a powered RC2014 backplane with only the standard IO module, and a few LEDs on a few data lines, so that I can test out everything before putting the CPU and RAM on there, potentially damaging them.<br />
<br />
Obviously, it would also be possible to include a couple of ROM programs directly into the MicroSS, and possibly store a small one in the ATmega 32u4's EEprom as well. Some buttons on the MicroSS could be used for injeting these pre-stored programs. i could even see a program that generates a menu that the arduino can basically farm out to the Z80 to get user responses/menu options, etc.<br />
<br />
Additionally, I can make a RC2014 bus - to - pac-man bus adapter, and actually deploy code-in-development directly to the machine from my desktop from the makefile/build scripts. ... This is a dev tool I've wanted for about 20 years now!<br />
<br />
Lots of possibilities!<br />
<br />
I will put out another blog post and a github link for the supporting software, when I've got this working. (estimated - mid next month)<br />
<h3>
64k RAM and Pageable ROM</h3>
I also received this past month the boards for these two official RC2014 boards: the <a href="https://www.tindie.com/products/Semachthemonkey/64k-ram-module-for-rc2014-z80-homebrew-computer/?pt=full_prod_search">64k RAM</a> and <a href="https://www.tindie.com/products/Semachthemonkey/pageable-rom-module-for-rc2014-homebrew-computer/?pt=full_prod_search">Pageable ROM</a>. As you can see in the pic, i still need to order quite a bit to make these work. Now that I have the Bus Supervisor board, the Pageable ROM is less interesting to my needs, although I may still adapt my RC2014/LL design to use these pieces instead.<br />
<br />
You can see pics of these in the top of this blog post.<br />
<br />
The 64k RAM will definitely work well with the Bus Supervisor board, however the Pageable ROM board has definitely taken a bit of a slip down my plate... Until I can get the parts in for the RAM (sockets, etc) I can use my existing unmodified 32k RAM board for the upper segment of memory ($8000-$FFFF) and my slightly modified second 32k RAM board for the lower segment of memory, I just have to manually enable it for read/write.Scott Lawrencehttp://www.blogger.com/profile/15740562503843879527noreply@blogger.com0tag:blogger.com,1999:blog-5543608644585014794.post-54648588542691017642017-04-17T11:10:00.004-04:002017-04-17T11:11:38.656-04:00RC2017/4 Update: The Andy Project - ToolsJust an update to show some progress on the project.<br />
<br />
This project is to reproduce a near-pixel-perfect reproduction of a few of Andy Warhol's pieces that he created on the Amiga 1000 back in the 1985 timeframe, on native tools.<br />
<br />
We're 12 days in, and I do not have any completed images to show y'all. But don't be fooled into thinking I haven't done anything! I've been running a timelapse of the entire process, and here's the segment for the tool setup work:<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/CphVx2Ok2XU/0.jpg" frameborder="0" height="266" src="https://www.youtube.com/embed/CphVx2Ok2XU?feature=player_embedded" width="320"></iframe></div>
<br />
Here's a summary of the tasks done so far, and the direction I'm going.<br />
<h3>
Graphic editor tools</h3>
First of all I did a kind of survey of a few tools to figure out what would work best. I had originally thought that I would use the pre-release GraphiCraft to generate the files, however I ran into a few snags. This software crashes. <b>A lot.</b> More importantly, it <b>does not have the "save" function</b> implemented. It DOES however have something very important... Andy's works used some of the pattern flood fills that GraphiCraft (nee ProPaint) used. These were removed before GraphiCraft was actually released. But I'm getting ahead of myself here. My feeling is that with this project, GraphiCraft will only be used to generate more sample and reference materials. Mainly the fill patterns and how they are aligned, as well as the color palette, which seems to be untouched for many of Andy's pieces.<br />
<br />
I have three versions of GraphiCraft here. I have a pre-release version on a "v29 DOS" disk. This is the one with patterns, correct palette, is unstable, and cannot save. I also have two disks labelled "GraphiCraft 1.1" and "GraphiCraft 1.2". As far as I can tell, the applications are the same, but one is on a Workbench 1.1 bootable disk, while the other is on a Workbench 1.2 bootable disk. For some starting points of GraphiCraft images, I'll use this to generate the file, and perhaps I'll use them as the final save step, so that we get GraphiCraft /ProPaint ILBM files instead of DPaint ILBM files.<br />
<br />
I have also settled on Deluxe Paint III for the main amount of the work. 1 and 2 are fine, but 3 just feels more stable and complete, at least with my 30+ years of experience with the Deluxe Paints... Deluxes Paint? hmm. DPaint 4 would work as well, but I've never really gotten completely used to/comfortable with it.<br />
<h3>
Slideshow tool</h3>
I also looked around a bit for a slideshow application. I want the end product to be a bootable ADF that can be dropped onto a 1.3 system, or perhaps on an AROS-replacement-kick system. I wanted to use a program where I could just script it easily, without having to fire up a gui to add in or replace files. So tools that were out included AmigaVision (2.x+), Deluxe Video (needs gui to make slides, palette limited anyway), and so on.<br />
Early on, I was considering the "Slideshow" application that came with the "Deluxe Paint Art and Utilities" disk from Electronic Arts. I've used it quite a bit in the past, and it has exactly the type of "script it in a text file" interface that I want. However that one seems to not function on anything newer than AmigaDOS 1.1. There is an updated version of this on the "Impressionists" art disk also from Electronic Arts, but that one did not work with 1.3 either.<br />
<br />
Anyway, this is the exact feature list I want, in bullet form:<br />
<br />
<ul>
<li>Must run in AmigaDOS 1.3</li>
<li>Fade in/out to black</li>
<li>supports10-15 slides</li>
<li>supports 320x200 32 color IFF-ILBM image files</li>
<li>delay time while a slide is up</li>
<li>(optional) user input to advance to next slide</li>
<li>(optional) user input to exit from the slideshow</li>
<li>should not require loading a GUI to add files, tweak sequence</li>
</ul>
<br />
<br />
Here's a quick summary of some of the tools I've experimented with, and my thoughts. Some of them are from commercial products, some from Fred Fish disks, etc.<br />
First: these were not suitable:<br />
<br />
<ul>
<li>EA Slideshow (DPaint Arts & Utilites Disk) - requires AmigaDOS 1.1</li>
<li>EA Slideshow (The Impresisonists) - requires AmigaDOS 1.1</li>
<li>EA Deluxe Video - requires gui editing to edit/tweak slideshow, 16 color images</li>
<li>AmigaVision - requires gui editing, AmigaDOS 2.x+</li>
<li>PPShow - Don't remember why. ;) I think it was doing weird palette things.</li>
<li>Mostra - requires AmigaDOS 2.x (Aminet)</li>
</ul>
<div>
And these are potentials:</div>
<ul>
<li>dpslide - okay, can't seem to exit (Fish disk 11)</li>
<li>slidemaster - okay as well (Fish disk 274)</li>
</ul>
<div>
Possibilities:</div>
<ul>
<li>ALook - TBD</li>
<li>Show (Fish Disk 323) (early version of Mostra)</li>
<li>Mostra (early version on Fish Disk 330)</li>
</ul>
<br />
One person on Facebook had recommended a trick that some demo disks did, which was to set the system colors to all black, then images could be loaded one by one from a startup-sequence or the like. That's something I'll consider as well. (also, ref Fish Disk 323, "Color Tools")<br />
<br />
One AmigaDOS reminder; to make a CLI script executable, you use the "protect" command line tool like so:<br />
<br />
<span style="font-family: "courier new" , "courier" , monospace;">protect slidehowScript +s</span><br />
<br />
<h3>
AmigaDOS 1.3</h3>
All of this will be worked on in a virtual NTSC Amiga 1000 (or Amiga 500) provied by the FS-UAE emulator running on my Mac OSX laptop. I've set up a Workbench 1.3 filesystem disk, onto which I have installed the basic 1.3 system, Deluxe Paint III and GraphiCraft 1.2. This is honestly nothing too extravagant.<br />
I set up a new FS-UAE config file with the specs:<br />
<br />
<ul>
<li>NTSC chipset</li>
<li>512k chip (Amiga 500)</li>
<li>2 meg fast (not really necessary)</li>
<li>DH0: "WORK13:" is a filesystem-based hard drive, with a "Files" folder containing all the works-in-progress, and completed imagery</li>
</ul>
<div>
And I also set up a second config for obtaining and analyzing reference materials from GraphiCraft</div>
<br />
<h3>
ObeseBits</h3>
I discovered early on that it was going to be necessary to have some way to apply a grid to the reference images from the internet (PNG and JPEG images), so that I can recreate their content pixel-for-pixel. Since they had differetn scaling, different compression and in some cases, different pixel aspect ratios (non-square or stretched-to-square) pixels.<br />
<br />
The Amiga in the modes that Andy used had non-square pixels. Well, the representation on disk was a 4:3 display of a 320x200 pixel image. This means that each pixel is slightly rectangular at 1.1:1 or something like that. However, when they are displayed on an Amiga monitor or TV set, they are displayed-as-square. This sounds confusing, but rest assured, it really is.<br />
<br />
The tool that I eventually made, "ObeseBits" (the name is a play on the MacPaint magnifyer tool which it called "FatBits", but it's for much larger images. see?) has been made using the "<a href="https://processing.org/">Processing</a>" development environment. I used the most recent "Processing v3.3" to create it, using the "p5.js" JavaScript mode. That way I could just run it in any browser without the need to install Java.<br />
<br />
As I worked on it this past week, I rolled in a bunch of features which I figured would be useful for this project:<br />
<br />
<ul>
<li>Load in any image (scaled most images to 2xxx by 15xxx pixels for consistency)</li>
<li>Show the image zoomed in (4x zoom defined in the code, nonadjustable)</li>
<li>Grid is applied over the displayed image</li>
<li>Grid has selectable white/black/yellow color with a few levels of opacity</li>
<li>Grid has slightly bolder 5th lines, making 5x5 grid of pixels</li>
<li>left-click drag to move the target zoom area around</li>
<li>shift left-click drag to adjust the grid spacing/scale</li>
<li>Scaled down to 160x100 thumbnail showing where the zoom area is in the "big picture"</li>
<li>display of the current pixel color under the mouse</li>
</ul>
<div>
After using this tool on the same machine as the emulation for an evening, I've determined that it will be substantially more efficient to run this tool on a second computer, and dedicate the primary computer purely for the emulation environment.</div>
<h3>
Current State...</h3>
<div>
After the weekend, I've created the following content, using the above tools to be detailed in an upcoming blog post:</div>
<div>
<ul>
<li>GraphiCraft reference image </li>
<ul>
<li>320x200 IFF ILBM image</li>
<li>Created from observations, documentation from GraphiCraft v27r6</li>
<li>Recreated in Deluxe Paint III</li>
<li>32 colors with the exact palette from v27r6</li>
<li>"purple balls" pattern reproduced with exact pattern-grid alignment</li>
</ul>
<li>"Campbells" image started</li>
<ul>
<li>Started with the reference image above, kept the palette and header bar</li>
<li>Some of the top of the can is converted.</li>
</ul>
</ul>
<h3>
A Minor Dilemma...</h3>
<div>
I am caught in a dilemma of sorts though that I need to figure out at some point...</div>
</div>
<div>
<br /></div>
<div>
Andy did a lot of his work in ProPaint, which was the original name for GraphiCraft. This can be seen on the video on youtube where he is capturing and editing a picture of Debbie Harry. The header bar says "ProPaint V27 Release 14". All of the released images from the recent effort show "GraphiCraft v27 Release 6"... Which is correct? My gut is telling me that the software that he used, specifically, on that day for the presentation, it put that text atop the screen. Perhaps that was the exact text on his copies as well. I can only assume that the restoration team was using the software they had, not necessarily the specific application disks Andy was using... although I could be wrong. I am trying to get into contact with them to determine exactly what is going on there.</div>
<div>
<br /></div>
<div>
For now, I'll stick with the GraphiCraft heading. ;)</div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
Scott Lawrencehttp://www.blogger.com/profile/15740562503843879527noreply@blogger.com0