Jump to content

Blogs

Our community blogs

  1. I'm feeling especially bored today so I worked on Tal Tal Heights. I'm around halfway finished, and that first half is complete, has no discernable issues. The latter half shouldn't be too hard. After I'm done with the other half, I'm going to add a second part which is going to be based on the Switch remake version of the piece. They're similar but different enough to be worth arranging separately. For example, in the original Gameboy version the main melody is played by the highest voice therefore is represented by the violin. In the Switch remake however, a lot of the melody is also played by the Cello.

    Anyways, here's first half of the Gameboy version of Tal Tal Heights. Enjoy.

    Tal Tal Heights.mp3

  2. Once again I am reseting development on my Sonic VCS homebrew, in this first log I've taken the liberty of making the game's "floor plan."

     

    Sonic VCS

     

    * Two Stages

    * Stage 1 is a Single Screen Platformer

    * 25 Playfields in Stage 1

    * 24 of them randomize

    * Stage 1 ends when collecting maguffin and hitting Robotnik

    * Stage 2 is a Boss Stage (Arena based shu'mup)

    * Sonic must battle Robotnik

    * Once Robotnik is defeated, the game starts over from Stage 1

    * Difficulty Switches toggle options

    * Left switch controls audio

    * A turns on Music during gameplay (but sacrifices sounds)

    * B is the default setting for audio (Sound FXs during gameplay)

    * B/W switch pauses game, color unpauses game

    * Right switch controls difficulty (B is default randomization for stage 1, A to Unrandomizes playfields for stage 1)

    * Uses existing code from @Random Terrain & @Atarius Maximus (Both users will be given credit)

    Any Suggestions on what to do next with the other switches (Different game variations maybe?

  3. And here we have another entry from the great Vidtec...or was it US Games? Whatever. Apparently Vidtec was just a brand label? No idea why. Moving on. So yeah, if you don't already know (and lucky you if you don't) "Sneak'n Peak" is a video game of...hide and seek. Yeah, real thrilling idea. Now, I understand that some publishers wanted to market games to children. There isn't really anything wrong with that, but this is a case where it really would just be easier for a child around the age of 5 to just go and play hide and seek. What kind of kid wants to sit with his friends and try to figure out what random spot on the screen will magically make your character hide? Or even worse, what kind of kid wants to play hide and seek alone? How sad is that!

     

    So, with the obvious out of the way, we get to the game play and things just get weirder. "Sneak'n Peak" consists of 4 screens making up the areas of the house: The Living Room, The Pink Bedroom, The Blue Bedroom, and The Yard. In each of these rooms there are various areas to hide. Now this is from the manual. Just take a look at this picture...really soak it in.

    image.thumb.png.e65b488a7e5f6b7af2a48bf215321368.png

     

    Each rectangle or series of dots is a hiding place. To get into one of these hiding places you have to move in the stated direction at a certain spot on the screen and you will go in. For some areas this makes sense. You would expect to hide in a closet or under a bed. But a random spot under the carpet? Or offscreen in a random place? Or, hell, what about under the pathway? There really isn't an indication of where you can hide either. Even if I know that you can hid under the bed, I have to be in a pixel perfect spot in order to actually make it work. This also works if you have to seek a person. Also, why would you bother printing the hiding places in the manual anyway? There are only 20 possible hiding spaces to begin with, and if you read the manual (or played it a lot) you could just check every space before the time limit runs out. 

     

    Really, this boils down to 2 main problems. This game was made for nobody, and it doesn't really play well anyway. You put those two together and you get a game that nobody would want. US Games apparently had a deal in which they would buy back their games you bought if you weren't satisfied within 5 days. I can't imagine how many copies of Sneak'n Peak were returned. Who knows. US Games went of business in 1983 and games like this probably didn't stop that from happening.

  4. Season 3, episode 20 of the podcast my brother rand I do about "growing up Atari" is about the local arcade we frequented in the 80's and how it was used as filming location for an episode of CHiPs.  We have a story about the arcade and then we recap the entire CHiPs episode.

    https://intotheverticalblank.com/2020/10/04/s3e20-the-ballad-of-castle-park-arcade/


     

    s3e20_new.thumb.png.8774d8162bbbccce6972396f9eafffa9.png

     

  5. Masterplay alike adapter with support for Sega Genesis (3 or 6 button) and Nintendo (NES or SNES) controllers and provides START and PAUSE keys functionality for convenience. Remaining functions can be accessed by a standard joystick connected on the 16 vias IDC connector on the board.  

     

    Buttons and keys are mapped as follows:

     

    image.png.c567a997cf2d8df4375a1172b039a50e.thumb.png.1b3b6a065a0be729aabba33c69ce7ce9.png

     

    Two printed circuit boards available. Compact board measures 1.6"x1.6" (41x41mm)

     

    image.png.c91e2015aaf57c92571e82de200de41a.png.3757bf17e7024ab93f38677f192f7d9b.png

     

    A second version of the board fits inside a Hammond 1593J case:

     

    image.thumb.png.aff1b3bdc44a532e17ac4a5ca9da2daa.png

     

    Work in progress.

    Project repository available at Github

     

  6. Title: Base Attack
    System: Atari 2600
    Game Information: Released Game
    Additional Information: 
    Copyrights ©:
    - Game: Home Vision

    IMG_8559.JPG

    IMG_8560.JPG

    IMG_8562.JPG

    IMG_8565.JPG

  7. Did a really quick little project last night. I'd been kicking this around in my head but decided to try it finally last night. The M.O.D.E. or Multi-Optical-Disc-Emulator from TerraOnion has a nifty set of additional pins along one side of it for adding in additional features. Among them are the ability to add in a wire for adding a physical reset button or button to simulate a Disc Swap process etc. One of the extra pins is for wiring in an additional LED in the system somewhere that is directly tied to the small SMD access LED on the M.O.D.E.'s PCB itself. Because this LED isn't usually visible with all inside the case of the console it makes sense that they would provide such a pin. I'm sure it was intended for an additional LED but I decided to instead change the actual power on LED on my Dreamcast to act as the access LED. This way, it still serves as a power on indicator when you see it blinking with 'disc' access activity taking place. 

     

    The way I did this wasn't difficult at all. I simply removed the power LED from the controller board. Reformed the + lead on the LED to be 90 degrees pointing toward the back of the DC when reinstalled. From that reformed lead, I soldered on about a foot of wire to it. That wire in turn would connect to the LED pin on the M.O.D.E.. I then soldered the power LED back in place on the controller board only soldering in the - or ground lead in place. This way, when the system is powered on and in use, the + voltage to feed the LED and light it up will come from the M.O.D.E. during disc access activity indications. Again this isn't difficult at all and I did add shrink tubing off my + lead and soldered wire to ensure no shorts would occur around the controller board. But here is an edited video example I took off my phone showing how it looks.

     

     

    • 1
      entry
    • 0
      comments
    • 500
      views

    Recent Entries

    For this first post, I will present a project –more precisely a rework of the project– that I recently released.

     

    Sporniket Nostalgie v2 is an opentype font that renders like the 8×16 system font (a.k.a the 'hires' font) of the Atari ST.

     

    The first version was kind of OK but it had 2 major flaws and a minor one : first, it required a weird size (25 pt at 72 dpi) to render correctly, as I wanted to have room for accented uppercase without deformation of the glyph ; second, I was not entirely faithfull in the shape of the glyph anyways as I wanted to remove what I considered as 'flaws', like serifs on a generally sans serif font, I made an '&' that looked like 'Et', and so on ; and last, the shape of my glyphes were stuck to the original pixels and used handcrafted curves, making a not so nice feeling on printed paper. That said, I enjoyed using this font for a few years before changing my computers, and the rendering on paper was as intended, with rounded shapes and all.

     

    Another fact that made the rework necessary was that nowadays, exporting the font gives an bugged files, lots of letters seems to have lost their width. In practice, you see several letters at the same location.

     

    So, I decided to do it again, with the following objectives :

     

    • faithfull to the original material at 8×16 pixels
    • beautiful on paper : I used the "spiro" tool of Font Forge to have very smooth transition between straight sections and rounded section of a curve (third or forth order continuity), and tricking the rasterization algorithm (no hinting) to get the rights pixels while having constant width strokes on paper.
    • A first release with the following unicode range supported : US-ASCII a.k.a Basic latin (any printable character from code 32 —space— to 127) ; Latin-1 supplement ; 'oe' ligatures and Ÿ to support french.

     

    The latest releases are here. You will find the font in 3 formats (opentype, truetype and woff), as well as a sample html demo to see the font on screen, and on paper if you print it.

     

    Since the release I set up my computer system (ubuntu linux) to use the font. I have yet to write a theme to use the font in the title bar.

     

    Following, some screenshots from my terminal.

     

    First, without anti-aliasing.

    SporniketNostalgie2-console-demo-aliased.png

     

     

    Then, with anti-aliasing –I prefer this rendering–.

    SporniketNostalgie2-console-demo-antialiased.png

     

    I plan to make the same work for the 8×8 font soon, and try to do the 6×6 font later.

  8. (Apologies for the short, and underwhelming review, I literally just finished this a couple of minutes ago since I honestly couldn't find anything to talk about)

     

    VS. Super Mario Bros. is a platforming game for the Nintendo VS. system released In 1986 by Nintendo.

     

    The game is hard... Really hard. Like, it compares to Mario 2 JP in terms of difficulty, I rarely get angry at games, but I was this close to throwing my Joycons while playing this.

     

    I'm not gonna talk about the graphics since they're just slightly enhanced versions of the SMB1 sprites.

     

    The controls, sadly, ruin the entire thing for me, in the Arcade Archives release, the controls are delayed. The delay can cause anything from a mild inconvenience to a matter of life and death.

     

    Overall, I'd say that the game itself is great and is a good step up if you've mastered the original SMB. But the delay on the controls on the Arcade Archives release is so bad, I can't justify getting it, especially for $7.99, 5/10.

     

  9. Busby the Bobcat
    Latest Entry

    1.) The same people made The Moo Family Holiday Hoe-Down (1992). The same Director, same Producers, same Production (Calico Entertainment), same Musicians, same Art Director… It even has close to have the same voiceactors. But Neil Ross wasn't in it and Brian Cummings was in it.

    DvQhhPJXQAEuyOP.thumb.jpg.fecf41907a3b4c1fe34798c0d88967d7.jpg1901556120_credit2.png.64d6602f1a3277b2962281f82dcc9a2f.png   Dvstzjuehrstj.thumb.jpg.1891301051c08d25a54def2a196d7dae.jpg2069489993_credit3.png.d040f420491134b2f2e5847e20a9a084.png

    Dvsdgrhz46.thumb.png.0445349de9ed811f298a0083633ebee6.png1395085078_credit5.png.cbf0fe4bc996e1ba16389f46061d61bf.png   DvQiWDWX4AEZi1M.jpg.17189fefeadd3157a7e1c92049f8fd3b.jpg52312509_credit18.png.8aee0626e9616084679277da5f8284d5.png

    Dv453645.thumb.png.6c2b6257b969be38863a75bb6f351476.png1295052933_credit19.png.be25a956884fe7a987ffef241484399a.png

     

    2.) Rob Paulsen, the voiceactor of Bubsy, also voiceacted him for Bubsy 2 (1994) and for Bubsy in Fractured Furry Tales (1994).

    Bubsy_II_Title.png   Bubsyjag.png

     

    3.) The cast and the production of it are interesting. Like, did you know, that the writer was Ray De Laurentis, who was a writer for the Fairly Odd Parents (2009-2017) and T.U.F.F. Puppy (2010-2015)? Did you know that it was animated by Sei Young animation, who also animated for Super Mario Bros. Super Show? And did you know, that the voiceactors of it are also the voices of Animaniacs, Tiny Toon Adventures... ? Here's more information about its cast and production: https://atariage.com/forums/blogs/entry/16780-2-the-production-and-cast/

     

    4.) In Super Bubsy version, they mention "What could possibly go wrong?" phrase 10 times (Bubsy says 8 times, Arnold says 2 times) but in TV version, they cut some of them and they mention 8 times (Bubsy says 6 times, Arnold says 2 times). Not much of a difference, but yea. Even the title is called that.

     

    5.) Bubsy has 8 quotes in this:

    • "What could possibly go wrong?"
    • "I'm a hero for crying out loud!"
    • "I was just testing ya!"
    • "I think I saw Elvis!"                                                                                                         
    • "And if that's a crime, then book me!"                                                                                      
    • "I think of something that really blows my hair back."                                                                                                    
    • "IIIII like it!"
    • "(Hey turkey! Surronder ; hend over that helmet) before I force to humble you!"

     

    6.) Three of his quotes are from Bubsy in Claws Encounters of the Furred Kind:

    • "What could possibly go wrong?" (He also says that in level 1)
    • "I think I saw Elvis!"  (He also says that in level 5: Hey, I thought I saw Elvis back there!)
    • "I think of something that really blows my hair back." (He also says that in level 4: Hey whatever blows your hair back!)

    And some of the quotes are used later:

    • "IIIII like it!" (He also says that on Bubsy 2 and on Bubsy: the Woolies Strikes Back)
    • "What could possibly go wrong?" (He also says that on Bubsy: the Woolies Strikes Back)

     

    7.) In Bubsy 3D, one of Bubsy's quotes mentions Arnold: "This would've killed Arnold!"[1 time: 2:55]

     

    8.) Oblivia, the assistant of Virgil was created by Michael Berlyn. The reason for it is because he was inspired by his relative.[2 time: 53:00 - 1:33:00]

     

    9.) Speaking of Oblivia, did you know, that in Bubsy: Paws on Fire! (2019) has an easter egg for her. And that is, if you look closer to the wall in this scene, it sprayed "Oblivia was here" 

    dfgjzz.thumb.png.3782cfa326addbeaded3f5a01f18e3a5.png

     

    10.) One of the clips that they used is very popular.

    A footage of Frank Richards (who stops cannonball by his stomach) was also used in many cartoons like "The Chip (Part 1)" of Freakazoid!, the episode "Fairly Oddbaby" of Fairly OddParents. It was also used in the documentary called "Ripley's Believe It or Not!"[3]

    1.thumb.png.6b5cc656cea4d6da4d1f6ffc998b042f.png

     

    11.) At the end, when you see a superhero flying in the sky is actually a scene from a movie called Invaders from Space (1965).[4                                                          9.thumb.png.c4bbcdd5d3771b50526eb5780a8fd5d4.png

     

    12.) Even tho' the Bubsy TV Pilot failed, there still some products of it. There is even Press kit character model sheets of Ally,Virgil,Oblivia,Buzz and more!

    Read more about other products in here: https://atariage.com/forums/blogs/entry/16788-9-products/ 

    533491740_unknownkopija.png.6c69f1d2799d521d0793daaa3a741690.png   

     

    13.) Someone has an original picture of Bubsy standing on 2 TVs while holding what appears to be a Bubsy Oscar 

    It was also used for the cover of MegaTech (Issue 31) and for promotion of Bubsy 2 on July of 1994.

    257615152_IMG_20190703_095811kopija.jpg.01dca3819b64758873e824ba08b51556.jpg  109223577_large.megatech31.jpg.1883ad86653d2ff605162c2a8359a387kopija.thumb.jpg.eabdb6f35ce4ce80b21765357310b221.jpg

     

    14.) There was a contest called Bubsy's Watch'n Win Contest. The Grand Prize was going to Hollywood for 3 days and spending 250$!

    Read more about it in here: https://atariage.com/forums/blogs/entry/16787-8-bubsys-watchn-win-contest/ 

    jhnhpzr.thumb.png.0e1180da52541f727a1739f00d7c86b5.png

     

    15.) Bubsy: What could Possibly go wrong? was part of Bohbot Entertainment's "Kids Day Off" three hour block on Thanksgiving 1993.

    image0.thumb.jpg.5f3437fdbbb46ce3be9e07c63116764f.jpg


    Source

    [1] https://www.youtube.com/watch?v=jXGCb38zVNQ (time: 2:55)

    [2] https://www.youtube.com/watch?v=jlYW3pof8JI&t (time: 53:00 - 1:33:00)

    [3] https://en.wikipedia.org/wiki/Frank_"Cannonball"_Richards

    [4] https://atariage.com/forums/blogs/entry/16792-10-footages-origins/

    [5] https://atariage.com/forums/blogs/entry/16788-9-products/

     

     

     

     

  10. For the past month and a half I have been furiously writing a sequel to my first story. I finished it several days ago and it is now live on the site!

    Currently it is just a first draft, its rough around the edges but I feel it gets the story across.

    Now I'm just gonna focus on shorter stories because juggling over 25 named characters gets really exhausting and I just want to do something simple for a while.

    I wrote the story with almost no roadmap, I just knew where the story started and where it ended with everything in between comprising entirely of improv, I think it turned out rather well for what it is.

    http://alcadon.home.blog/alcadon-2-the-citadel/

    As for the first book it's still in a constant state of editing limbo, I keep finding more and more spelling or grammatical errors that prevent me from wanting to put it up on Amazon. I'd also like to figure out how to get a print version so that may delay things further.

    (These are just stats for future reference cause I love editing on the fly and ruing the final word count)

    Started: May 16 2020 Finished: June 23 2020 Final Word Count: 104,829

     

  11. I just had to blog this. But spoiler alerts are due. So, if you haven't watched Seasons 3 or 4 of The Last Kingdom and intend watching it, feel free to come back later.

     

    I love historical shows and movies. An extreme example of what I've witnessed in The Last Kingdom was the Starz show, Black Sails. This was where the writers came up with a historical setting and shoehorned characters from books and actual historical pirates into the show. It was never intended to be historically accurate but a rough representation of what pirates dealt with and how life was for them in somewhere like Nasau.

     

    The Last Kingdom is based on a book. Fair enough. So you don't expect 100% accuracy but, given that it's based not just on the life of Uhtred but also those of actual historical people who lived at that time, you'd expect them to take more care with historical facts because people are going to look them up.

     

    It was nice to see that the Welsh, for once, weren't forgotten. If all you ever learned was what you saw in movies, you'd swear that it was just Scotland, England and Ireland in this part of the world. But let's get to the elephant in the room. The fact that they have completely screwed over the timeline.

     

    They seem to have gone to some lengths to get the Saxon aristocracy right.

    Alfred died in 899. He was succeeded by his son Edward, who would have been 25 at the time. That all seems to check out judging by the apparent age of the actor who plays him. But it seems to point to the fact that, certainly where the English are concerned, the writers were trying to stick to history as much as possible while keeping the story going. In fact, they even put in the story about his son, Aethelstan being possibly illegitimate. That is historically accurate in that nobody has ever known for certain. They managed to intertwine that into the story.

    All good so far. They do play fast and loose with Aethelred of Mercia. By the time he died in 911, he'd been on the throne for 30 years, so the actor is too young but at least the timing of his death is kind of within an acceptable range. The suspicions of the Mercians towards Edward's intentions for their lands in the show is also based on historical fact. Edward did eventually take over Mercia, but not for another 15 years.

    They're trying to be accurate-ish, but when it came to Wales, everything went out of the window.

     

    The Hywel that Wessex went to for aid was undoubtedly Hywel Dda (Hywel the Good). This was confirmed after a couple of episodes where he tells his right-hand man, Rhodri, that he's going on pilgrimage. Again, that was historically accurate because he did, becoming the first Welsh ruler to go on pilgrimage and return. When I heard Ealhswith ask Father Pyrlig to go to Hywel, I knew that it had to be Hywel Dda because if there's one thing the show does, is pick up on some of the better known characters from that time. But when I saw him, I had a feeling something was a little off. He was too old.

     

    In fact, the real Hywel was about 6 years YOUNGER than Edward, not 30 years OLDER!! When we're first introduced to the Welsh when Pyrlig is confronted by a couple of guards, the name Deheubarth appears across the screen to tell us all where they are. This show is currently set at some point between 899 and 905AD. Deheubarth didn't even exist. It wouldn't exist for at least another 15 years when Hywel created it after joining up two kingdoms he ruled over. What's more, Pyrlig would have had to cross at least one other Welsh kingdom to get to Hywel's domain because he had no lands that bordered the English kingdoms at that time.

    He ruled from around 918 and, contrary to his depiction in the show as being fiercely independent, he and his brother (joint ruler) submitted to Edward. He became sole ruler in 920 and expanded his domains to cover almost all of Wales.

    The shift in the timeline also leads to another huge inaccuracy. When Edward does die in 924, it's his alleged illegitimate son, Aethelstan, who takes over. Hywel became close friends with him. If Hywel was as old as he's depicted in the show, he'd probably be dead by the time Edward dies and would possibly never have even met Aethelstan.

    I think the problem for the writers was that they wanted to introduce a strong character who was well-known. Unfortunately, this was really a time when there were in fact few Welsh rulers who's names had resonated through the centuries. Rhodri Mawr (Rhodri the Great) died 25 years before Alfred. A better character for them to use would have been a guy called Anarawd, Rhodri's son and King of Gwynedd at the time of the events depicted in the show. If they had been clever, they could even have intertwined him with Aethelred's story because he invaded Gwynedd and had his ass handed to him by Anarawd. Anarawd also had to deal with an attack by Danes from Ireland in 902. Gwynedd's lands also bordered Saxon lands.

    So, given that I've just finished watching an episode where Hywel discovers that the Danes are coming for him from Ireland, I think what's happened is that the writers took Anarawd and replaced him with Hywel, changing the location and Hywel's age as well in the process. Few people have even heard of Anarawd, even though his father remains one of the most revered Welsh leaders. And we have places named after Hywel.

    I don't mind inaccuracy for the sake of pushing along a story but this was just too much.

  12. At least this is the thought that went through my mind this evening and after mention of the remake on the 'What Movies Have You Watched Recently?' thread. I must admit, I had actually looked forward to the 25th anniversary of The Lion King last year. There was hope of a chance to perhaps see the original film in the theaters again and a little bit of hope that some nice merchandise would appear to mark the occasion. (Had really hoped for a BIG Simba plush! Heehee!) Sadly, we didn't get any of that. What we got was a hollow, soulless cash grab remake that preyed on people's nostalgia. Yes it was a technical achievement and people will argue it was good, but it lacks the character, fun, and nuance of the original from what I have seen and heard. Of course, it made over 1.5 billion in the theaters when all was said and done, the only real thing that matters in the Iger era of Disney. Never mind that it got toppled by Hobbes & Shaw on it's third week! (Actually, I wonder if the remake would have done as well had there been any other solid family movies out over the summer?)

    Merchandise-wise, pathetic basically describes the toys I saw. What little came out for the original movie last summer was mostly revamped Lion Guard items that were of poor quality and seemed to be only out to promote the remake coming out. Even the merchandise for the remake was fairly thin and by the holidays it was already forgotten as the new Frozen movie and TROS was rolled out. I can recall the original Lion King having solid merchandise and sales for almost a year and you could get some nice swag at the Disney store for a while after that! Definitely recall shelves stuffed with toys through the 1994 holiday season. I actually remember having a shelf of plush Lion King toys let go and collapse on me at our local KB toys that summer! No harm done and it's funny to think of now as that moment got my interest started in The Lion King.

    I guess I got kinda spoiled with the Star Trek and Star Wars 25th (and even 20th!) anniversaries as they felt like actual events. I would have thought the original Lion King would have gotten a little bit more than it did being that it was the highest grossing and often held as the best traditional animated film of all time.  Disney, I give you a zero out of five stars for the handling of the 25th anniversary of one of your greatest animated films ever.

    Well, this is the end of my musing for today. Thanks for reading! :)

  13. The ELF computer, which first made its appearance in August 1976 in the Popular Electronics magazine, was a very basic experimenter's board based on the RCA CDP1802 CPU, a rather obscure processor primarily used in embedded systems by the likes of the DOD and NASA. It's main advantage was its simplicity of interfacing and ease of programming. Needless to say that the ELF developed a large following as many hobbyists built their own boards from scratch using the published details in the magazine, and several companies sprung up offering upgraded versions of it.

     

    1013535391_PopularElectronicsELF.thumb.png.4a8017342882044ef9517a31ff09584f.png

     

    Here's the original article: PopularElecELF.pdf

     

    A modern iteration of it is the so-called Membership Card designed by Lee Hart, which reduces the ELF to the size of an Altoids tin, adds 32K of memory (as compared to the original 256 bytes) and replaces the hexadecimal display with a row of LEDs. It also conveniently incorporates a DB25 connector with the computer signals routed to it for easy interfacing. In fact, it is still being developed and sold here.

     

    153053728_20200201_073647-Copy.thumb.jpg.ab67a8baf3fbf0da42a0339e0c656050.jpg

     

    The ELF is programmed by entering CDP1802 machine language in binary using the 8 data switches, and as you might imagine this could become extremely tedious for long programs and very error prone, not to mention the horrendous debugging process using just this set up. Incidentally, I did write a basic monitor for the ELF which could help alleviate the difficulty of program development called ELFMON, and it can be found on the attached disk, but it was still clunky at best.

     

    Happily, there was a far better way to go about programming the ELF, using a full-fledged computer to write the program in 1802 assembler, assemble it, and transfer it directly to the ELF using the DB25 connector. And while this could be done using any computer, I decided to do it using the TI 99/4A computer. Essentially it became a retrocomputing project inside another retrocomputer! ?

     

    The way to go about this is to place a byte on the data lines of the ELF's connector (pins 2-9), toggle the ELF's input switch using pin 1 to store the byte in the ELF's memory, then repeat the process for the rest of the instructions. Clearly, the TI's parallel port would be ideal for this, so I created an adapter cable to connect it to the ELF.

     

    1834028804_20200201_073708-Copy.thumb.jpg.43295fbc88d704d7135e3d6e8219b183.jpg

     

    The pinout is as follows:

     

         TI PIO                   ELF DB25

            1  -------------------->1

            2  -------------------->2

            3  -------------------->3

            4  -------------------->4

            5 --------------------->5

            6  -------------------->6

            7  -------------------->7

            8  -------------------->8

            9  -------------------->9

            12 ------------------->14

     

    From there, it was just a matter of software. The ELF program can written directly on the TI using any one of the available text editors, with the following format:

     

    <label><opcode><operand><comment>

     

    Each part needs to be separated by a single space. The label is optional and can be up to 6 alpha-numeric characters, the opcode cannot exceed 4 characters, the operand cannot exceed 7 characters, and the comment is optional and of arbitrary length.

    When referring to a label in the operand field, the label needs to be preceded by a *.

    Register numbers should be entered as a single hex digit from 0 to F. 

    Numbers should be entered as either 2 or 4 digit hex digits from 0 to F preceded by a >. For example F is entered as >0F. B41 is entered as >0B41.

    Finally, the last opcode of the program should be the reserved word END .

     

    If the formatting is wrong, then the assembler output will be wrong as well!

     

    Once the program is typed in, it should be saved in the standard TI DV/80 format.

     

    I wrote a primitive CDP 1802 assembler in Rich Extended Basic (RXB) which is my favorite interfacing language because it has facilities to access hardware at the low-level. The assembler is sloooooooooow, but hey it beats flipping switches! The operation of the assembler is self-explanatory: just follow the prompts. Below is a listing of the program:

     

     

    //1802 ASSEMBLER FOR ELF MEMBERSHIP CARD
    //BY WALID MAALOULI
    //JANUARY 2020
    //VERSION 0.1
    
    CALL CLEAR
    OPTION BASE 0
    DIM REFTABLE$(100),HEX$(16),REFADR(100)
    RESTORE HexData
    FOR I=0 TO 15
    	READ HEXVALUE$::
    	HEX$(I)=HEXVALUE$
    NEXT I
    CRU=2432 !RS232 CRU OF >1300 DIVIDED BY 2
    
    PRINT "    CDP 1802 ASSEMBLER"
    PRINT " WALID MAALOULI - JAN 2020"
    PRINT::PRINT::PRINT::PRINT
    
    //GET SOURCE FILE
    ON ERROR InputSource
    InputSource:
    INPUT "ENTER SOURCE FILE PATH:     ":SOURCE$
    OPEN #1:SOURCE$
    ON ERROR STOP
    PRINT::PRINT "1- SEND HEX FILE TO ELF"
    PRINT "2- ASSEMBLE FILE"
    PRINT::INPUT FCTN
    IF FCTN=1 THEN
    	SendELF
    	
    PRINT::PRINT "ENTER DECIMAL START ADDRESS:"
    INPUT OFFSET
    
    PRINT::PRINT "SELECT OUTPUT OPTION:"
    PRINT "1- LIST TO SCREEN"
    PRINT "2- SEND TO PRINTER"
    PRINT "3- SAVE TO FILE"
    PRINT "4- SEND TO MEMBERSHIP CARD"
    PRINT
    GetOutputSelect:
    INPUT OUTSEL
    IF OUTSEL<>1 AND OUTSEL<>2 AND OUTSEL<>3 AND OUTSEL<>4 THEN
    	GetOutputSelect
    IF OUTSEL=2 THEN
    	OPEN #2:"PIO",OUTPUT
    IF OUTSEL=4 THEN
    	SendELF
    IF OUTSEL<>3 THEN
    	StartAsm
    ON ERROR InputSource1
    InputSource1:
    PRINT
    INPUT "ENTER SAVE FILE PATH:       ":DEST$
    OPEN #2:DEST$,OUTPUT
    ON ERROR STOP
    GOTO StartAsm
    
    SendELF:
    PRINT
    PRINT "PREPARE ELF TO RECEIVE DATA:"
    PRINT 
    PRINT "1-CONNECT CABLE"
    PRINT "2-LOAD AND CLR SWITCHES DOWN"
    PRINT "3-READ SWITCH UP"
    PRINT "4-ALL DATA SWITCHES UP"
    PRINT
    PRINT "PRESS ANY KEY WHEN READY"
    CALL KEY("",0,K,S)
    IF FCTN=2 THEN
    	StartAsm
    
    //TRANSFER HEX FILE TO ELF
    TransferHex:
    IF EOF(1) THEN
    	CLOSE #1::
    	PRINT::
    	PRINT "TRANSFER COMPLETE!"::
    	STOP
    LINPUT #1:LINE$
    PRINT LINE$
    HVAL$=SEG$(LINE$,6,2)
    CALL HEXDEC(HVAL$,DECVAL)
    GOSUB SendByte
    IF SEG$(LINE$,9,1)="" OR SEG$(LINE$,9,1)=" " THEN
    	TransferHex
    HVAL$=SEG$(LINE$,9,2)
    CALL HEXDEC(HVAL$,DECVAL)
    GOSUB SendByte
    IF SEG$(LINE$,12,1)="" OR SEG$(LINE$,12,1)=" " THEN
    	TransferHex
    HVAL$=SEG$(LINE$,12,2)
    CALL HEXDEC(HVAL$,DECVAL)
    GOSUB SendByte
    GOTO TransferHex
    
    //START OF ASSEMBLY
    StartAsm:
    LINE=OFFSET
    RPOINT=0
    PASS=1
    PRINT::PRINT "FIRST PASS"::PRINT
    
    //READ LINE FROM FILE
    ReadLine:
    TEMP$=""
    TEMP1$=""
    LINPUT #1:LINE$
    IF PASS=1 THEN
    	PRINT SEG$(LINE$,1,19)
    IF PASS=2 THEN
    	SkipLabel
    LABEL$=SEG$(LINE$,1,6)
    FOR I=1 TO LEN(LABEL$)
    	IF SEG$(LABEL$,I,1)<>" " THEN
    		TEMP1$=TEMP1$&SEG$(LABEL$,I,1)
    NEXT I
    LABEL$=TEMP1$
    SkipLabel:
    OPCODE$=SEG$(LINE$,8,4)
    IF SEG$(OPCODE$,1,1)=">" AND PASS=1 THEN
    	OPRNUM=0::
    	GOTO FirstPass
    IF SEG$(OPCODE$,1,1)=">" THEN
    	HEXVAL$=SEG$(OPCODE$,2,2)::
    	OPRNUM=0::
    	OPERAND$=""::
    	GOTO FoundLabel
    FOR I=1 TO LEN(OPCODE$)
    	IF SEG$(OPCODE$,I,1)<>" " THEN
    		TEMP$=TEMP$&SEG$(OPCODE$,I,1)
    NEXT I
    OPCODE$=TEMP$
    OPERAND$=SEG$(LINE$,13,7)
    IF SEG$(OPERAND$,1,1)<>">" THEN
    	NotNumber
    OPERAND$=SEG$(OPERAND$,2,LEN(OPERAND$)-1)
    TEMP$=""
    FOR I=1 TO LEN(OPERAND$)
    	IF SEG$(OPERAND$,I,1)<>" " THEN
    		TEMP$=TEMP$&SEG$(OPERAND$,I,1)
    NEXT I
    OPERAND$=TEMP$
    
    NotNumber:
    IF OPCODE$="END" AND PASS=2 THEN
    	PRINT::
    	PRINT "ASSEMBLY COMPLETE!"::
    	CLOSE#1::
    	IF OUTSEL=3 THEN
    		CLOSE #2::
    		STOP
    	ELSE
    		STOP
    IF OPCODE$="END" THEN
    	RESTORE #1::
    	PASS=2::
    	LINE=OFFSET::
    	PRINT::
    	PRINT "SECOND PASS"::
    	PRINT::
    	GOTO ReadLine
    
    //ASSEMBLE LINE
    IF PASS=2 THEN
    	SearchData
    IF RPOINT=49 THEN
    	PRINT "REFERENCE TABLE FULL!"::
    	STOP
    IF LABEL$<>"" THEN 
    	REFTABLE$(RPOINT)=LABEL$::
    	REFADR(RPOINT)=LINE::
    	RPOINT=RPOINT+1
    		
    SearchData:
    IF SEG$(OPCODE$,1,1)="A" THEN
    	RESTORE AData
    IF SEG$(OPCODE$,1,1)="B" THEN
    	RESTORE BData
    IF SEG$(OPCODE$,1,1)="D" THEN
    	RESTORE DData
    IF SEG$(OPCODE$,1,1)="G" THEN
    	RESTORE GData
    IF SEG$(OPCODE$,1,1)="I" THEN
    	RESTORE IData
    IF SEG$(OPCODE$,1,1)="L" THEN
    	RESTORE LData
    IF SEG$(OPCODE$,1,1)="M" THEN
    	RESTORE MData
    IF SEG$(OPCODE$,1,1)="N" THEN
    	RESTORE NData
    IF SEG$(OPCODE$,1,1)="O" THEN
    	RESTORE OData
    IF SEG$(OPCODE$,1,1)="P" THEN
    	RESTORE PData
    IF SEG$(OPCODE$,1,1)="R" THEN
    	RESTORE RData
    IF SEG$(OPCODE$,1,1)="S" THEN
    	RESTORE SData
    IF SEG$(OPCODE$,1,1)="X" THEN
    	RESTORE XData
    ReadData:
    READ OPC$,HEXVAL$,OPRNUM
    IF OPC$="XXX" THEN
    	PRINT::
    	PRINT "INCORRECT OPCODE IN LINE ";LINE::
    	STOP
    IF OPC$<>OPCODE$ THEN
    	ReadData
    IF (OPRNUM>0 OR OPRNUM=-1) AND OPERAND$="       " THEN
    	PRINT::
    	PRINT "MISSING OPERAND IN LINE ";LINE::
    	STOP
    IF OPCODE$="INP" THEN
    	OPERAND$=HEX$(VAL(OPERAND$)+8)
    IF OPRNUM=-1 THEN
    	HEXVAL$=SEG$(HEXVAL$,1,1)&SEG$(OPERAND$,1,1)::
    	OPERAND$=""
    IF SEG$(OPERAND$,1,1)<>"*" OR PASS=1 THEN
    	FoundLabel
    OPERAND$=SEG$(OPERAND$,2,LEN(OPERAND$)-1)
    TEMP$=""
    FOR I=1 TO LEN(OPERAND$)
    	IF SEG$(OPERAND$,I,1)<>" " THEN
    		TEMP$=TEMP$&SEG$(OPERAND$,I,1)
    NEXT I
    OPERAND$=TEMP$	
    FOR I=0 TO 49
    	IF REFTABLE$(I)<>OPERAND$ THEN
    		NextEntry
    	CALL HEX(REFADR(I),OPERAND$)
    	IF OPRNUM=1 THEN
    		OPERAND$=SEG$(OPERAND$,3,2)
    	GOTO FoundLabel
    NextEntry:
    NEXT I
    PRINT "LABEL NOT FOUND IN LINE ";LINE::
    STOP
    FoundLabel:
    IF PASS=1 THEN
    	FirstPass
    CALL HEX(LINE,HEXLINE$)
    ASMLINE$=HEXLINE$&" "&HEXVAL$&" "&OPERAND$
    PRINT ASMLINE$
    IF OUTSEL=4 THEN
    	ElfSend
    IF OUTSEL=2 OR OUTSEL=3 THEN
    	PRINT #2:ASMLINE$
    GOTO FirstPass
    ElfSend:
    CALL HEX(HEXVAL$,DECVAL)
    GOSUB SendByte
    IF OPRNUM<=0 THEN
    	FirstPass
    IF LEN(OPERAND$)>2 THEN
    	OPR1$=SEG$(OPERAND$,1,2)::
    	CALL HEX(OPR1$,DECVAL)::
    	GOSUB SendByte::
    	OPERAND$=SEG$(OPERAND$,3,2)
    
    CALL HEXDEC(OPERAND$,DECVAL)
    GOSUB SendByte
    	
    FirstPass:
    IF OPRNUM=-1 THEN 
    	OPRNUM=0
    LINE=LINE+OPRNUM+1
    GOTO ReadLine
    	
    //OPCODE DATABASE
    AData:
    DATA ADC,74,0		
    DATA ADD,F4,0		
    DATA ADI,FC,1		
    DATA AND,F2,0		
    DATA ANI,FA,1	
    DATA XXX,XX,0
    BData:	
    DATA B1,34,1		
    DATA B2,35,1
    DATA B3,36,1		
    DATA B4,37,1		
    DATA BDF,33,1	
    DATA BN1,3C,1
    DATA BN2,3D,1
    DATA BN3,3E,1
    DATA BN4,3F,1
    DATA BNF,3B,1
    DATA BNQ,39,1
    DATA BNZ,3A,1
    DATA BQ,31,1
    DATA BR,30,1
    DATA BZ,32,1
    DATA XXX,XX,0
    DData:
    DATA DEC,20,-1	
    DATA DIS,71,0
    DATA XXX,XX,0
    GData:
    DATA GHI,90,-1
    DATA GLO,80,-1
    DATA XXX,XX,0
    IData:
    DATA IDL,00,0
    DATA INC,10,-1
    DATA INP,60,-1
    DATA IRX,60,0
    DATA XXX,XX,0
    LData:
    DATA LBDF,C3,2
    DATA LBNF,CB,2
    DATA LBNQ,C9,2
    DATA LBNZ,CA,2
    DATA LBQ,C1,2
    DATA LBR,C0,2
    DATA LBZ,C2,2
    DATA LDA,40,-1
    DATA LDI,F8,1
    DATA LDN,00,-1
    DATA LDX,F0,0
    DATA LDXA,72,0
    DATA LSDF,CF,0
    DATA LSIE,CC,0
    DATA LSKP,C8,0
    DATA LSNF,C7,0
    DATA LSNQ,C5,0
    DATA LSNZ,C6,0
    DATA LSQ,CD,0
    DATA LSZ,CE,0
    DATA XXX,XX,0
    MData:
    DATA MARK,79,0
    DATA XXX,XX,0
    NData:
    DATA NOP,C4,0
    DATA XXX,XX,0
    OData:
    DATA OR,F1,0
    DATA ORI,F9,1
    DATA OUT,60,-1
    DATA XXX,XX,0
    PData:
    DATA PHI,B0,-1
    DATA PLO,A0,-1
    DATA XXX,XX,0
    RData:
    DATA REQ,7A,0
    DATA RET,70,0
    DATA XXX,XX,0
    SData:
    DATA SAV,78,0
    DATA SD,F5,0
    DATA SDB,75,0
    DATA SDBI,7D,1
    DATA SDI,FD,1
    DATA SEP,D0,-1
    DATA SEQ,7B,0
    DATA SEX,E0,-1
    DATA SHL,FE,0
    DATA SHLC,7E,0
    DATA SHR,F6,0
    DATA SHRC,76,0
    DATA SKP,38,0
    DATA SM,F7,0
    DATA SMB,77,0
    DATA SMBI,7F,1
    DATA SMI,FF,1
    DATA STR,50,-1
    DATA STXD,73,0
    DATA XXX,XX,0
    XData:
    DATA XOR,F3,0
    DATA XRI,FB,1
    DATA XXX,XX,0	
    
    //Hexadecimal numbers
    HexData:
    DATA 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F	
    
    //SEND DATA TO ELF ROUTINE
    SendByte:
    CALL IO(3,1,CRU,1) !TURN ON RS232 CARD
    CALL IO(3,1,CRU+7,1) !TURN ON RS232 LED
    CALL IO(3,1,CRU+2,1) !SET HANDSHAKE OUT LINE TO HIGH
    CALL IO(3,1,CRU+1,0) !SET PIO PORT TO OUTPUT
    CALL LOAD(20480,DECVAL) !PLACE BYTE ON PIO PORT
    CALL IO(3,1,CRU+2,0) !CYCLE THE HANDSHAKE OUT LINE
    CALL IO(3,1,CRU+7,0)
    CALL IO(3,1,CRU+2,1) !TURN RS232 LED OFF
    CALL IO(3,1,CRU,0) !TURN OFF RS232
    RETURN

    The attached disk contains the assembler called ELFASM as well as 3 programs for the ELF. I use the extension _S to indicate that this is the text source file which contains the assembly language code as well as the program instructions, and the _HEX extension to indicate that this is the assembled hexadecimal version of the program suitable for downloading to the ELF. Feel free to use your own extensions as you see fit.

     

    1. ELFMON is the ELF monitor program I mentioned earlier
    2. CYLON is a small demo of the Cylon Eyes effect on the ELF's LED's (a.k.a Battlestar Galactica)
    3. HILO is a small game where you have to guess a random computer picked number with as few guesses as possible

     

    ELFASM can assemble a source file and then output it to the screen, to a file in HEX format, to the parallel printer, or transfer it to the ELF directly using the adapter cable. You can also load a previously assembled HEX file and transfer it to the ELF without the need of assembling it.

     

    And here's a video of the entire project. As is usual with my hobby projects, it is highly unlikely anyone else will find this useful outside of myself, but hey, it was a great learning experience :)

     

     

    ELF.dsk

     

  14. IMG_7994.thumb.JPG.a466a0a99c31df5dd2505c5f75f22b75.JPGAfter a month or so of waiting, the enhancement kit (consisting of four replacement roms and a 65C02 CPU) for my Apple IIe arrived. I decided to save a bit over ordering from Reactive Micro by buying it from a seller on Ebay, which was a mistake. It certainly appears to be vintage (which I honestly don't care about) but it took a month to arrive and was packed in such a way that the pins on half the ROMs were badly crushed. I'm shocked I was able to bend them all back into place without snapping any off.

     

    The enhancement kit made the IIe a bit more compatible with the IIc. It adds new characters (MouseText), a CPU upgrade (65C02 from 6502) and some other minor tweaks. The big deal for me was compatibility with ProTerm, a terminal software. I was ready to plug the WiModem232 in and flash back to my prime BBSing days when ... I realized I need a gender changer.

     

    Change of plans. I already have the IIe hooked up to my Raspberry Pi for ADTPro so I figured I'd get the Pi to act like a modem. This was much easier than I expected (so easy, that in retrospect I kind of wasted my money on the WiModem232) and basically consisted of using the serial <-> usb cables I already had hooked up, doing a quick compile from a git repo and running "tcpser -s 19200 -d /dev/ttyUSB0."

    83784612_10219321265656876_2855003347360940032_n.thumb.jpg.dbba5d0cf5f1108ffce4f5f23185d4b0.jpg

    And success! Spent a bit of time poking around the Captain's Quarters BBS, which I believe is running from an actual Apple II. I also tried visiting a few other BBS's I frequent (The Agency and The Black Flag) but none of them really work well from an Apple II. They're targeted towards the ANSI-heads of the mid 90's, and the poor Apple IIe just can't display or send the characters their menus expect. Tonight or tomorrow I'll telnet into the Pi and try using Alpine, Lynx and other tools to browse the Intarwebs.

     

    Next up on the TODO list: I have a BOOTI preordered, which will let me mount a USB drive as a hard drive (and then I can run stuff like the Total Replay game collection.) Then I need to get a Mockingboard or Phazor for sound. I'm still slowly playing my way through Wizardry too - don't want to jump to Ultima III before I have a Mockingboard.

     

  15. One of my back-burner projects, was a 2600 version of M.U.L.E. It was just an inkling of an idea, and I even toyed with the idea of a different sort of game in the same universe.

     

    I've posted about it before, but reworking the M.U.L.E theme for TIA was a hoot. I'm particularly proud of the section in the middle, where the original tune does a series of upward key changes. I managed to replicate the same same rising feeling without the problematic key changes, by laying down a series of ascending notes underneath the non-key-changed melody.

     

    mulemusic.bin

     

    I'm a big fan of TIA music that's in-tune, without needing to do the Pitfall II trick. TIA sounds great if you throw the right notes at her. The mule music was written before I came up with the idea of Perceptual Tuning, but I managed to keep it in tune by shifting the key until I found one that worked. Nowadays I'd just start off in A3. And while I'm at it I'd likely use a more advanced note priority systems, so I could cram more TIA goodness into the tune, like I did with the T:ME Salvo theme. That said, the TIA M.U.L.E theme was an instrumental experience that led to the Salvo theme, so there's no regrets.

     

    I wanted to add some visual interest to the music player, so I took the standard colorbars, and tweaked them a bit. I'm actually taking one upward set of colorbars, and one downward set of colorbars, and I'm ORing them together.

     

    mulemusic.thumb.png.339b32a86c04458e09aedb81eb999de7.png

     

    The result is interesting, I think. A bit hypnotic, with a backdrop of yellow patterns, that give way to splashes of color that soon disappear back to yellow. On the other hand, the patterns cycle after 256 frames, so I might have done better to move the two source colorbars a different rates, so they have a a longer period. 

     

    Colorbars on the 7800 are pretty much the same as on the 2600 - you change the color register and hit WSYNC. You can see that my interest in tweaking the traditional colorbars continued into my 7800 work, when you look at the Salvo titlescreen logo. Here chroma and luma are manipulated separately, with the colorbars getting shaded as a result.

     

    0006.png.71e46951e42ef23dff71c39000cb25b4.png

     

    I think there's some interesting ground to be covered in coming up with alternate colorbar styles. Nobody is excited to see plain old colorbars anymore, so why not amp them up a bit?

     

    Back to M.U.L.E, there's the M.U.L.E experimental "planet kernel" I came up with. I think I managed a reasonable approximation of the M.U.L.E planet elements here...

     

    muleplanet.thumb.png.ea3160df51e13986c89dd3576f789e26.png

     

    muleplanet.bin

     

    ...the plot "ownership" boxes has to be substituted with ownership bars, and the number of plots is reduced from the computer versions, but I think it's still essentially M.U.L.E.

     

    I hope my M.U.L.E music and planet kernel gives you a taste of what could been, in an alternate timeline where EA decided to support the 2600. On the down side, we'd have a dozen Madden 2600 games to contend with. :P

  16. This seems to be a relatively common issue for folks.  It certainly was for me when I started playing around with CC65.  Here's an example, CC65 linker config file, that should work out of the box.

    The following is a short example on how to use graphics mode 8 from CC65.  Before we get too far we need to create a few typedefs and defines.  These elements make later code easier to read (IMHO).  If you're familiar with ACTION you'll recognize what BYTE and WORD represent.  I leave it as an exercise to the reader as to the utility of upper casing BYTE and WORD.

    typedef unsigned char byte;
    typedef unsigned int word;
    
    #define SAVMSC *((word *) 0x0058)

    SAVMSC is a pointer to the lowest addressable area of screen memory.  It's a zero page variable maintained by the operating system of the Atari 8bit.  There are plenty of resources elsewhere discussing the importance of zero page variables, why you want to use them, as well as their relative lack of availability from within CC65 (you can use them, but the OS and the CC65 runtime consume a lot of page zero).

     

    With that out of the way we can now call a CC65 library routine to enter graphics mode.

    word gfxbuffer; 
    
    _graphics( 8 + 16 );
    gfxbuffer = SAVMSC;
    RAMTOP = RAMTOP - 32;

    _graphics() is an Atari 8bit specific routine that is part of the relatively small Atari specific library that comes with CC65.  The single parameter operates in a similar fashion to the Atari Basic GRAPHICS command.  In this example the parameter being passed to _graphics() is 24 (8, the graphics mode, plus 16 for full screen).  The next line of code saves the current value of SAVMSC to a global word variable named gfxbuffer.  Finally I modify RAMTOP by reducing it 32 pages to protect the ~8k of space used by the graphics 8 screen.  What's a page?  In the 6502 world a page of memory is 256 bytes.  Do the math...256 * 32 = 8192 bytes.

     

    So.  We have our defines.  We have code to enter graphics mode 8.  How do we use it?   The resolution of a graphics 8 screen is 320 x 192 pixels.  How does the Atari manage that much space with only 8k of ram?  Graphics 8 screen memory is laid out as a colletion of 192 rows of 40 bytes each.  Each byte contains 8 bits - so 40 bytes * 8 bits per byte = 320 pixels.  Each pixel on the graphics 8 screen is represented by a single bit.  This is why, by default, you can only use one color on a graphics 8 screen.  Yes.  You can do artifacting on tube monitors to get more colors and YES you can use DLIs and the like to force color changes on certain lines but those are advanced topics.  We're going to keep things simple for the time being.  Instead we're going to talk about plotting pixels on the screen or in other words how do you turn on the pixel at coordinate (100, 100)?  This is where bitmasks come in.

    In my early days of using CC65 I wrote code like the following.

    static const byte bitmasks[ 8 ] = {
      0b10000000,
      0b01000000,
      0b00100000,
      0b00010000,
      0b00001000,
      0b00000100,
      0b00000010,
      0b00000001
    };
    
    void plot( word buf, word x, word y ) {
      byte bitmask_to_use = (byte)x % 8;
      word b              = buf + ( y * 40 ) + x / 8;
      byte current_byte;
    
      if( x > 319 || y > 191 ) return;
      current_byte = PEEK( b ) |  bitmasks[ bitmask_to_use ];
      POKE( b, current_byte );
    }

    The function is pretty straight forward - it accepts a buffer to graphics memory and the X and Y coordinate of where to plot a pixel.  I calculate the bitmask to use by using the modulo (%) operator on the supplied X coordinate.  Remember that there are eight graphics 8 pixels packed into each byte - so, for example, if the passed X coordinate had the value of 3 the  result of X % 8 would equal 3 - or the 4th bitmap in the bitmasks array.

    The next line creates a variable B which points to the byte that is to be modified.  In this example we, naturally, want to multiply the Y coordinate by 40 (remember - each row in graphics 8 is 40 bytes long) and then add the result of the X coordinate divided by 8.

    Afterwards we do basic clip checking to ensure the coordinates can be plotted and then we OR the bitmask with whatever value is presently in RAM.  

    *BOOM*  We plot a pixel.

    If you're coming back to the 8bit world after about 30 years you may have forgotten the very basic fact that the 6502 doesn't have instructions to multiply and divide so the CC65 library has functions to do that sort of math for you.  Resulting in slow math.  Slow drawing.  Pain.  Suffering...

    Here's a better version.

    word indexes[ 192 ];
    
    void init_graphics( void ) {
      byte i;
      word index = 0;
      
      _graphics( 8 + 16 );
      for( i = 0; i < 192; i++, index += 40 )
        indexes[ i ] = index;
    }
    
    void plot( word buf, word x, word y ) {
      byte current_byte, bitmask_to_use;
      word b;
    
      if( x > 319 || y > 191 ) return;
    
      bitmask_to_use = (byte)x % 8;
      b              = buf + indexes[ y ] + ( x >> 3 );
    
      current_byte = PEEK( b ) |  bitmasks[ bitmask_to_use ];
      POKE( b, current_byte );
    }

    In this example we define a global array of words named indexes.  Each element in this array contains a memory offset for each row of a graphics 8 screen.  In the init_graphics() function we initialize the array. 

    In this second version of plot we perform the clipping check first and then proceed to the math.  We still leverage modulo (%) to determine which bitmask to use but our calculation to determine the byte offset is dramatically different.  In this case we leverage our index to quickly determine the offset for the specified Y coordinate and instead of dividing X by 8 we instead shift the value of X three bits to the right.  This has the effect of dividing the X coordinate by 8 - but quickly.

     

    How quickly?  The first plot() function which used multiplication and division is able to plot ~13.6 pixels per jiffy (or about 816 pixels per second) while the second, faster, version can do ~15.5 pixels per jiffy (or about 930 pixels per second).  There are, of course, other optimizations and the use of assembly language to get even faster.

     

    Here's a complete example.  Your results may vary but with the emulators I use the general plot routine does about 35 pixels per jiffy (2100 pixels per second) while the optimized version does 3.072 pixels per jiffy (or 184,320 pixels per second).  Anyway - I hope this is helpful to someone.  I have examples coming up of how to print text on graphics 8, plotting sprites, some graphics 7 stuff, double buffering in graphics 8 and 7, ....

     

    Etc....etc...etc...  Anyway - here's the example.  I've also attached the source code and the linker config at bottom.

    /*
     * build with:
     *  cl65 --static-locals -t atari -Osir -C atari.cfg -o gr8simple.xex gr8simple.c
     */
    
    #include <atari.h>
    #include <peekpoke.h>
    #include <string.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <stdbool.h>
    
    typedef unsigned char byte;
    typedef unsigned int  word;
    
    /*
     * important memory locations in the Atari OS
     */
    #define SAVMSC *((word *) 0x0058)
    #define COLOR0 *((byte *) 0x02c4)
    #define COLOR1 *((byte *) 0x02c5)
    #define COLOR2 *((byte *) 0x02c6)
    #define COLOR3 *((byte *) 0x02c7)
    #define COLBK  *((byte *) 0x02c8)
    #define RTCLOK *((byte *) 0x0012)
    #define RT2    *((byte *) 0x0013)
    #define RT3    *((byte *) 0x0014)
    
    /*
     * bitmasks for plotting gr.8 pixels
     */
    static const byte bitmasks[ 8 ] = {
      0b10000000,
      0b01000000,
      0b00100000,
      0b00010000,
      0b00001000,
      0b00000100,
      0b00000010,
      0b00000001
    };
    
    static word indexes[ 192 ];
    
    /*
     * Returns the current jiffy count.  A jiffy is approx. 1/60th of a second.
     */
    long jiffies( void ) {
      return RTCLOK * 65536 + RT2 * 256 + RT3;
    }
    
    /*
     * routines to change the default colors - nothing fancy.
     */
    void clear_screen( word buf )         {  bzero( (byte *)buf, 7680 ); }
    void regular_border( void )           { COLBK  = 0x00;               }
    void regular_drawing_color( void )    { COLOR1 = 0x0e;               }
    void regular_background_color( void ) { COLOR2 = 0x00;               }
    
    /*
     * go into full screen graphics mode 8, change colors
     * to white on black, and calculate our indexes.
     */
    void init_graphics( void ) {
      byte i;
      word index = 0;
      
      _graphics( 8 + 16 );
      
      regular_border();
      regular_drawing_color();
      regular_background_color();
      
      for( i = 0; i < 192; i++, index += 40 )
        indexes[ i ] = index;
    }
    
    
    /*
     * generic pixel plotter
     */
    void plot( word buf, word x, word y ) {
      byte *b;
    
      if( x > 319 || y > 191 ) return;
      b = (byte *)(buf + indexes[ y ] + ( x >> 3 ));
      *b |= bitmasks[ (byte)x % 8 ];
    }
    
    
    /*
     * optimized to plot a 320 pixel line at a 
     * specific Y coordinate
     */
    void plot_optimized( word buf, word y ) {
      byte *b = (byte *)(buf + indexes[ y ]);
      byte i = 40;
      while( i-- )
        *b++ = 0xff;
    }
    
    
    void main( void ) {
      word row, col;
      long s1,s2,f1,f2;
      
      init_graphics();
    
      clear_screen( SAVMSC );
      s1 = jiffies();
      for( row = 0; row < 192; row++ )
        for( col = 0; col < 320; col++ ) 
          plot( SAVMSC, col, row );
      s2 = jiffies();
    
      clear_screen( SAVMSC );
      f1 = jiffies();
      for( row = 0; row < 192; row++ )
          plot_optimized( SAVMSC, row );
      f2 = jiffies();
    
      _graphics( 0 );
      printf( "General Plot   = %6ld\n", s2 - s1 );
      printf( "Pixels/Jiffy   = %6ld\n\n", (long)(192 * 320) / (s2 - s1 ));
      printf( "Optimized Plot = %6ld\n", f2 - f1 );
      printf( "Pixels/Jiffy   = %6ld\n\n", (long)(192 * 320) / (f2 - f1 ));
      
      while( true )
        ;
    }

     

     

    gr8simple.c atari.cfg

  17. This is the last time I blog here forever.

     

    Farewell.

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    I will start blogging here:

    https://atariage.com/forums/forum/280-my-blogs/

     

    It's still on atariage.

  18. Hello

     

    I am going to be finishing my ASM 'guerrilla fighting fascists' game in the next few months

     

    I hope you're all doing well ?

    Vidak

    • 1
      entry
    • 14
      comments
    • 3215
      views

    Recent Entries

    Mike Harris
    Latest Entry

    This seems to be the end result when calling people out.

    Is it vulgar language.
    NOPE

     

    Is it personal insults.

    NOPE

     

    Call people out for the truth and you get banned.

    This was the case for the ColEM area and now the Collectorvison Phoenix

    Next it will be the Opcode Area.

    You people are a bunch of entitled, Millennial assholes that can't handle the truth.

    It doesn't matter the contributions, the help or any other things I do around here but as long as you aren't triggered.
     

  19. Most of what I experienced of the pre-Disney Star Wars EU was via 2003 Clone Wars, Pandemic Battlefront games, and Lucasarts TFU. Honestly, I was at first mildly-moderately shocked when Bob Iger and Kathleen Kennedy allowed for the EU wipe to happen. True, there were stupid and nonsensical things here and there in the old EU for sure; you could find stuff of that quality in the pre-2005 Star trek books as well. That doesn't cancel out any of the good parts, such as the Thrawn Trilogy, Splinter of the Mind's Eye, Republic Commando, 2003 Clone Wars animated series, the Yuuzhan Vong Invasion and Jango Fett Dark Horse comics, Droids Cartoon, Shadows of the Empire, New Jedi order book series, and Fate of the Jedi novels.

    >INB4 THE EU WAS NEVER CANON! 

    WRONG!

    The Star Wars continuity originally had several layers of canon/continuity. Before the time of the EU wipe in April of 2014, it went like this:

    G- Absolutely, positively canon. All of the films in the saga are in this category.

    T- Also canon, but not exactly as crucial as material in G level. Occupied primarily by 2008 CGI Clone Wars TV Show and the animated movie that directly preceded it. (This level is one of the few gripes I have with the old canon, as TCW is explicitly set in-between Episodes II and III, plus Lucas had quite more involvement in it than the 2003 series, mainly as the executive producer. Plus, the show was made in-house by Lucasfilm animation!)

    C- Canon as well, but can be overridden by material of higher-level. The bulk of the EU was in this category. Stuff in this category included the Jedi Academy novels, Lando Carlissian novel trilogy, Han Solo Origins and Han Solo Adventures books, most of the Dark Horse comics, Heir to the Empire novels aka "Thrawn trilogy", New Jedi Order novels, Fate of the Jedi novels, 1980s Droids cartoon, Ewoks cartoon, Kenobi novel, many of the SW video games by Lucasarts such as Shadows of the Empire, Dark Forces 1 and 2, both KOTOR games, Republic Commando, and the Pandemic Battlefront games, and the Darth Plageuis novel. 

    S- Secondary continuity. Material in this category is mostly stuff that has been overridden, but not so much that its entirely out of the window canon-wise, and thus could be seen as an alternate universe. Included most of the old 1970s-1980s Marvel comic books, Traviss Mandalorian novels, the "life day" part of the Holiday special, Galaxy of fear books, The Force Unleashed 1&2, Death Troopers book, and the Crystal Star novel.

    D- Detours level. An even lower form of canon than S. Reserved mostly for parodic works, such as Detours(A CGI show that had one season made but never officially released due to the Disney buyout), and maybe also the Robot Chicken sketches.

    N- Non-canon. Stuff in here is at best a "what-if" kind of story. stuff in this level included the majority of the Holiday Special, the 2003 2D animated Clone Wars mini-series after the coming of 2008 CGI Clone Wars TV show, some comics such as the Skippy the Droid comic mini-series and another comic where a cyborg Darth Maul gets into a fight with post-Phantom Menace Obi Wan Kenobi, and some novels.


    I am not one of the folks who believes that Star Wars cannot survive for long without George Lucas. The sequel trilogy that Disney is giving us would have been better had the post-IP sale Lucasfilm Story Group at most only slightly tweaked the canon policy, not wiped out every single non-film SW media that wasn't the 2008 TCW or the Son of Dathomir comic(the latter of which was kept likely because it directly tied in to TCW show).

    post-39329-0-96684900-1456518822.gif *sigh*

  20. I thought I was done with the ColecoVision, and had actually worked on a few Atari 7800 captures when I remembered I hadn't done any of the ColecoVision's unreleased prototypes.  So, I quickly knocked out screencaps of Mattel's Burger Time and Bump 'n' Jump, and AtariSoft's Dig Dug and Pac-Man, and then collected the audio files onto a USB thumb drive to clean them up.

     

    That was about six months ago.  I can be slow sometimes.

     

    I finally have those audio clips prepped and uploaded, so the ColecoVision captures done!  Now it's time for the (rest of the) Atari 7800 catalog!

  21. BuckoBrand
    Latest Entry

    Roblox is a very cool game where you can play millions and millions of minigames made by other users. If you want to friend me, my username is BrownCanoe46. You can edit your avatar to look really cool. Roblox Studio is what Pc-mac users get after playing their first game. Roblox studio is what people use to make their games.

  22. No, there isn't such thing as "Cartridge of the Week Club" but there almost should be. 

     

    When I bought my light-sixer a couple months ago, I decided that I would just collect the cartridges that I really wanted: Pac-Man, Breakout, Missile Command, Berzerk, Asteroids, and Adventure. That was it.

     

    But then, eBay lots came into play. I bought my first lot just because it was cheaper to get Adventure with a few throw-ins than it was to buy Adventure by itself. But now that I have a few other games that I didn't want, I may as well just get a few more that I liked when I was a kid that are part of another eBay lot.

     

    So, again, I went into my new hobby of collecting VCS games just wanting a few and ended up with 67... several of which are duplicates. Now, I love Pac-man enough to have him and friends tattooed on my arm, but I now have three working Pac-man carts. 

     

    I also don't have much space to store anymore. 

     

    That hasn't stopped me from venturing on eBay, filtering for games under $9.99 with free shipping and finding a few games that are on my expanded "must-have" list. They have literally been showing up every week now, much like a "Cartridge of the Week Club." 

     

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...