Jump to content

Search the Community

Showing results for tags 'atari 8-bit'.



More search options

  • Search By Tags

    Type tags separated by commas.
  • Search By Author

Content Type


Marker Groups

  • Members

Forums

  • Atari Systems
    • Atari General
    • Atari 2600
    • Atari 5200
    • Atari 7800
    • Atari Lynx
    • Atari Jaguar
    • Atari VCS
    • Dedicated Systems
    • Atari 8-Bit Computers
    • Atari ST/TT/Falcon Computers
  • Classic Consoles
  • Classic Computing
  • Modern Consoles
  • Gaming General
  • Marketplace
  • Community
  • Community
  • Game Programming
  • Site
  • PC Gaming
  • The Club of Clubs's Discussion
  • I Hate Sauron's Topics
  • 1088 XEL/XLD Owners and Builders's Topics
  • Atari BBS Gurus's Community Chat
  • Atari BBS Gurus's BBS Callers
  • Atari BBS Gurus's BBS SysOps
  • Atari BBS Gurus's Resources
  • Atari Lynx Programmer Club's CC65
  • Atari Lynx Programmer Club's ASM
  • Atari Lynx Programmer Club's Lynx Programming
  • Atari Lynx Programmer Club's Music/Sound
  • Atari Lynx Programmer Club's Graphics
  • The Official AtariAge Shitpost Club's Shitty meme repository
  • The Official AtariAge Shitpost Club's Read this before you enter too deep
  • Arcade Gaming's Discussion
  • Tesla's Vehicles
  • Tesla's Solar
  • Tesla's PowerWall
  • Tesla's General
  • Harmony/Melody's CDFJ
  • Harmony/Melody's DPC+
  • Harmony/Melody's BUS
  • Harmony/Melody's General
  • ZeroPage Homebrew's Discussion
  • Furry Club's Chat/RP
  • PSPMinis.com's General PSP Minis Discussion and Questions
  • PSPMinis.com's Reviews
  • Atari Lynx 30th Birthday's 30th Birthday Programming Competition Games
  • 3D Printing Club's Chat
  • Drivers' Club's Members' Vehicles
  • Drivers' Club's Drives & Events
  • Drivers' Club's Wrenching
  • Drivers' Club's Found in the Wild
  • Drivers' Club's General Discussion
  • Dirtarians's General Discussion
  • Dirtarians's Members' Rigs
  • Dirtarians's Trail Runs & Reports
  • Dirtarians's Wrenching
  • The Green Herb's Discussions
  • Robin Gravel's new blog's My blog
  • Robin Gravel's new blog's Games released
  • Atari Video Club's Harmony Games
  • Atari Video Club's The Atari Gamer
  • Atari Video Club's Video Game Summit
  • Atari Video Club's Discsuuions
  • Star Wars - The Original Trilogy's Star Wars Talk
  • PlusCart User's Bug reports
  • PlusCart User's Discussion
  • DMGD Club's Incoming!
  • DASM's General
  • AtariVox's Topics
  • Gran Turismo's Gran Turismo
  • Gran Turismo's Misc.
  • Gran Turismo's Announcements
  • The Food Club's Food
  • The Food Club's Drinks
  • The Food Club's Read me first!
  • The (Not So) Official Arcade Archives Club's Rules (READ FIRST)
  • The (Not So) Official Arcade Archives Club's Feedback
  • The (Not So) Official Arcade Archives Club's Rumor Mill
  • The (Not So) Official Arcade Archives Club's Coming Soon
  • The (Not So) Official Arcade Archives Club's General Talk
  • The (Not So) Official Arcade Archives Club's High Score Arena
  • Adelaide South Australia Atari Chat's General Chat & Welcome
  • Adelaide South Australia Atari Chat's Meets
  • Adelaide South Australia Atari Chat's Trades & Swaps
  • KC-ACE Reboot's KC-ACE Reboot Forum
  • The Official Lost Gaming Club's Lost Gaming
  • The Official Lost Gaming Club's Undumped Games
  • The Official Lost Gaming Club's Tip Of My Tounge
  • The Official Lost Gaming Club's Lost Gaming Vault
  • The Official Lost Gaming Club's Club Info
  • GIMP Users's Discussion

Blogs

There are no results to display.

There are no results to display.

Calendars

  • AtariAge Calendar
  • The Club of Clubs's Events
  • Atari BBS Gurus's Calendar

Product Groups

  • Subscriptions

Find results in...

Find results that contain...


Date Created

  • Start

    End


Last Updated

  • Start

    End


Filter by number of...

Joined

  • Start

    End


Group


Website


Facebook


Twitter


Instagram


YouTube


eBay


GitHub


Custom Status


Location


Interests


Currently Playing


Playing Next

Found 42 results

  1. INTERVIEW WITH... F#Ready ! I am extremely pleased to present another interview with a well-known personality of the Atari community. At the "Silly Venture" 2018 computer party I came across one of the famous (The meritoriously :)) Atari-sceners of the of the 80s/90s era. And it turned out that I didn't need to persuade him so much for a few words about his history, which I proudly published for you here. So it's an interview with the living legend of western 8-bit Atari scene, the man known as F#READY and once Frankenstein from the High Tech Team. Interview time: December 2018. D : Dracon/TAQUART F: F#Ready F: Hi, my name is Freddy, $30 years old. I live in Hilversum with my girlfriend and our 10-years old daughter. I’m currently work as Software Engineer / Scrum Master at an hosting company in Amsterdam. Got my Atari 800XL in 1985, that’s when my passion for programming started. The Atari and retro computing in general is still one of my favourite hobbies. Next to that I’m crazy about bicycles. I have two recumbent bicycles and a rowing bike ( my recumbent Nazca Pioneer). D : So.... why did you choose ATARI computer (but not C64 or Amstrad?) and was it your first 8-bitter? How did you start your computer adventure then? F: Well, I was introduced to the home computer by my uncle. He had a ZX spectrum and that was like a magic box to me. At one time I could borrow it for a few weeks when my uncle went on holiday. I was hooked and remember typing all basic programs I could find. There was no tape recorder or anything to store the programs, so I kept the computer running through the night or typed a new one the next day. Anyhow, of course my uncle got his computer back and I saved money to buy my own computer. I had to do my research into which computer I should buy… In October 1985 I bought my own Atari 800XL with 1010 data-recorder. The other home computers were simply too expensive and I had seen the Atari computers before in a local shop. Again I typed in a lot of program listings from books and magazines. Each new Atari magazine was like a big birthday present and I read those several times. Soon I started programming my own (simple) games in Atari Basic. Even made some cassette inlays (still have those). So that's how it all started. D : And what's next ? You made huge progress through the years.... F: Next to Spectrum and Atari I had some experience with BBC computers during an internship at a school. I had to convert BBC Basic to Gw-Basic on the PC. They also had books about 6502, so that was a really nice working environment In the meantime I became member of a local Atari club in my region; Atari GebruikersGroep Friesland (AGGF). My long time friend André (The Exterminator) bought an 130XE, so we went together to play games, copy new stuff and have fun. There we meet the other HTT guys; Yeb (SolarSystems) and Eric (The DDT-Crew). In the beginning I was still programming machine language in hex codes using BASIC data statements or directly in Supermon. The other guys had access to assemblers, so I soon switched to Atmas II for all my assembler programming. I have to add that I really learned a lot from using Supermon and hacking existing programs (mostly games). I’m still not much into playing games, more discovering how things are done. That was the real excitement, looking inside a game to find new kinds of tricks with display lists or how DLI and VBI were used. Armed with ‘Mapping the Atari’ this was a nice way to learn more about the Atari hardware. As a group we had a lot of fun. We visited each other on a regular basis next to the local club meetings of course. And we exchanged letters and disks through the mail (yes, it was the time without internet!). There was no musician, so I ripped music from games to use in our intros. Personally I was inspired by the demos I saw on the Atari ST. We were not aware of a ‘demoscene’, even the word was never used at that time! High-Tech Team in 1989 year. From left to right: The Exterminator, The DDT-Crew, SolarSystems, Frankenstein D : Were there (in the Netherlands) proper computer literature and magazines that simplify Atari programming? F: There were quite a few in the beginning. Of course I got the Dutch magazines first; Atari magazine and Atari info. Our local Atari club AGGF did a few magazines called 'Reset' for which I wrote a few small articles. Next to that there were too many; Atari User, Page 6, Atari Magazin (German), Happy Computer (German), Analog and Antic. I could only afford to buy some and mostly bought Atari user and the German Atari Magazin. The Happy Computer special edition was the best one. A thick magazine packed full of listings with quality software (e.g. Turbo BASIC). So yes, I think I learned a lot from the magazines. There was not much more than that. D : So you were really lucky! Because in Poland at the time (1985-1990?) there were literally no serious, extensive books/articles on programming Atari 8-bit. Well, at least there were few books and texts only by one authors (Wojciech Zientara). That's why quite many Polish programmers had been trying to explore Atari system on their own (e.g. Henryk Cygert, known better for his amazing games like “Miecze Valdgira”). Can you imagine he has been analysing the whole Atari memory and system routines and wrote down (by hand) a big paper notebook on it?! F: Ah cool, I didn’t know that. I heard that ‘mapping the Atari’ was also made by reverse engineering instead of reading official Atari documents. I can imagine it was fun too. By the way, I have a few of these Polish Atari ‘school’ books and I think Poland was ahead of the rest because of teaching these things at school! A different perspective I guess. D : Didn't you have any difficulties to master Atari hardware ? What was the biggest challenge in it? F: Difficulties with the Atari? Not really. I gradually discovered more things. Whenever I learned something new I experimented until I understood how it worked. E.g. display lists. There were examples and it was easy to modify and later try it in the assembler. The book mapping the Atari helped greatly. It was my Atari bible. D : You said before about HTT-team. But how it what was born and how it evolved? F: The HTT started with four guys who made a few intros and the Big demo. After that a few joined us, but soon it all collapsed because of different reasons (e.g. read the articles in Mega Magazine #1). It was also one of the reasons I started Mega Magazine. So, in my humble opinion there was not much ‘evolving’ going on. It just ended around the time of the first Mega Magazine release. D : During MegaZine’s time one could say it already was there (the so-called small Atari European demoscene). The time was early nineties and there were people from The Netherlands, Germany, Poland, Sweden, Czech & Slovakia, Canary Island (!), Sweden, Hungary and even Turkey (!).... Many of them had created, let me say, MegaZine “family” of editors & readers, I guess. F: Yes, exactly that! It was one big (happy?) family. And just like making demos is was all for fun. For Mega Magazine I was much inspired by the first issues of Maggie on the ST (by TLB), some other disk magazines and Dr.Dobbs Journal. D : OK, you just mentioned about your inspiration from ST machine. Where did you had contact with it ? And weren’t you ”envious” about Commodore 64 computer (due to plenty of nice(r) games, etc.) and its big demoscene? Didn’t you plan to move into other computer during your Atari days’ period? F: Some people from the local Atari club had Atari ST’s and loads of software. A good friend also got an ST next to his 130XE, so I visited him often to watch demos and play games on the ST. I once bought an Atari STE in the early 90s but had more fun the the 8-bit. I sold the 1040STE after one year. And really, I’m not kidding you, I did not know anyone with a C64. I did saw some screenshots in magazines and knew more games were released for the C64, but that was about it. But on to this “controversial” photo with me (shot in early 90s): The one I'm holding was from Pirx/Our 5oft. They used it to rip gfx (for own games, etc.). Of course I seen it before, but I had no friends with C64. I did my research though, so I was aware of the Amiga and that it was designed by Jay Miner. D : So does it mean Atari (8/16-bit) was quite popular in the Netherlands in nineties ? In my country for example, there were full of small (8-bit) Ataris so there was quite a big market for making games in 1990-1995 year. F: I don’t think there was a big market here. Most people switched to ST, Amiga or PC. There still was a reasonably Atari community, but I think it was nothing compared to C64 and Amiga. D : So what about these: Stichting Pokey, Atari Club Eindhoven and other? In any case, not bad for a small country. Well, I'm afraid that in Poland in the eighties and nineties there were no active foundations or formal clubs (like ABBUC) as above…. There were few newspapers, a couple of publishers and certain amount of Atari demoscene people... F: Yes, and before Stichting Pokey there was Stichting Atari Gebruikers (SAG) with their Atari Magazine and regional meetings. Next to that there was an Atari division from the Hobby Computer Club (HCC). The HCC Commodore division survived and let other retro computer die-hards join them. This meeting is still happening every second month in Maarssen (near Utrecht). As you may know, in february the Atari 8-bit fans bring a lot of their Atari stuff to have a real Atari Invasion at the Commodore club See here: http://www.atari-invasion.nl/ and http://atariage.com/forums/topic/273530-atari-invasion-2k18/ and http://atariage.com/forums/topic/286339-atari-invasion-2k19/ D : Back to Mega Magazine… So what’s like to be main editor of such big magazine? Was it easy for you to manage all the contents, writers, etc. ? ;o F: Big? It really was just a hobby and the articles I got came from friends. I also liked to write a few articles myself. Sometimes there was a delay for an article, but than it could be used for the following issue. The hard part was to fit all the text on one disk side. D : From one moment (but not from the start?) MegaZine started to be distributed commercially... Why does it happen? And was it successful? I know ANG (A NEW GENERATION SOFTWARE - worth to show what it was) was responsible for this in the Netherlands and Mirage in Poland, but I’m afraid the magazine hadn’t been spreaded (by official way) as much as it could, isn’t it? F: IMHO it was spread enough through the usual channels, mainly Atari friends. Spreading it through ANG was an easy step (we were friends) and convenient for me because they did all the copying, labeling and they created nice looking covers D : The Mega Magazine (aka MegaZine) was a real gem for me. No other Atari magazine (formal or informal) had so much nice dose of humour, knowledge and overall good impression! It’s a pity it is not continued in this or another form. Why? Or maybe you are going to do so in future? F: Thank you for your kind words. All credits to the contributors, they made it possible. As you can see, MegaZine #8 was the last one mainly done by Jiří Bernášek and myself. The whole story can be found on the magazine itself TL;DR : in the age of internet there are enough other methods to get and spread the information. The last issue was done to release the remaining good articles, done by Jiří in 1995. I wanted to finish the whole series nicely with number #8. D : I remember that at later stage HTT was quite a big band, wasn’t it? And I always wondered about two facts: - What does “High Tech Team” name mean itself? Is it: the guys from High Technical school (aka Polytechnic ) ? - Why some HTT-members took their nicks in “plural” style? ;o F: How did we came up the name ‘HTT’? That’s a good question! No, it had absolutely nothing to do with a technical school. I’m sure it was simply a popular term at that time. High technology, meaning ‘cutting edge’. And the three letter abbreviation was probably inspired by groups on the Atari ST (TEX, TCB, TLB etc.). LOL, I really don’t know why some members decided to be not one, but more than one Solarsystems (there must be a great ego at work there) or why one guy calls himself a crew. It sure confused me at the time D : What is the origin of your nick in HTT ? Is it a homage to favourite fictional character in movie or book by Mary Shelley ? Or was it randomly taken ? F: I think it was inspired by (fragments of) the movie. “It’s alive!”, the feeling when you finally got that assembly program working OK, now is clear. But from a couple of last years you came back with another nickname… Why? ;o Maybe to indicate a fresh start, I don’t know. I felt it was time for a new name. People change and maybe the nick should change too. In detail: From the Atari BASIC screen. After boot, arrow up, insert 2x, press F. That's my name Since we don't have the inverse-space anymore, this was replaced by the modern day hash-tag. D : You forgot (?) to add you were releasing some cracktros (unprotected games with your custom, colorful intros) as HTT. So, that’s what some of demoscene members had started with. What about that? Who was doing what, if that’s not any secret nowadays? Is there any place one can see or download your releases (for brilliant games like BLACK LAMP, PLASTRON, BLINKY’S SCARY SCHOOL, anything else) ? F: Ah, yes, but I don’t have a complete overview of what we did on cracktros (yet!). D : What do you mean by this? I saw only three games with HTT’s intro… F: There should be more. I have a large collection of files which I did not check with the ones on the internet. Would love to preserve those cracks (not only HTT, also others). And as a side note, we didn’t even know we were doing cracktros, never even mentioned the word at that time. Call me naive, but we really didn’t know much about any ‘demoscene’ or even ‘demo parties’. D : So what made you write such intros? Any idea usually comes from somewhere… C64 was around the corner? F: Not from other systems, we didn’t know much about those at that time. We all had Atari. It must have been the intros from others before us, like Steve Zipp (who did this Black Lamp cracktro), CSS and CCA. 😧 Let me guess… CCA = Copy Crew Amsterdam? And CSS = Copy Service Stuttgart OR Chip Special Software? F: Yes, Amsterdam and Copy Service Stuttgart 🙂 Probably also saw the ABBUC hobbytronic demos before we did our things. I remember visiting an event where ABBUC showed one of their demos and they made a nice digitized photo for us which we used in the Little demo and Little Color demo. D : These „copy services” sounds little suspicious. Were them huge factory to copy stuff for free? ;))) F: LOL, you really should interview Steve Zipp or one of the CSS guys. It would be nice to hear those stories, since I really don’t know much what was going on there. D : Steve Zipp is (in a way) a legend. But I don’t know if he is so talkative as you! F: One thing I heard. Steve Zipp got his software from a guy reviewing new software for a magazine. So, it was first send to Steve and later send back to the reviewer. D : Wow, didn’t know it! In Poland in 80/90s were so-called „computer studios” which sold a lot of A8 programs, including even demos. So quite many times I saw „Big Atari 8bit” as one of the hits there. These were real „copy-services” in my country. I bet in Netherlands situation was more normal and demos were for available for free, right? F: Yes, I never heard of selling demos and we were really surprised that Page 6 offered us money because they told us the Big demo would be included in their public domain first. We even got a little assignment (and money!) to make a small intro ‘creator’ for the Page 6 magazine. Still have to find where they used it D : Not bad for non-professionals. What I heard about ABBUC, they ask various ppl to prepare intro to its magazine but without benefits (except fame) Correct. That was a big (!) difference with the UK. I got a thank you letter and they put the Big demo in their public domain, which was ok, we liked it. Still like their concept of intro for the magazine. It gives the disk something special. Ok, back to the intros (that’s what we called it). I remember making a cheat version for ‘tank commander’ and a little tool to generate accounts for ‘ghostbusters’ (I think it was on a Mega Magazine, called ‘account buster’). We all did a few game intros, but not much real game cracking. We got most already cracked file versions directly from Steve Zipp who had access to original software and was known for his cracking skills. D : Since you were not into demoscene (crackscene) when releasing any intro+game, what were you hoping for ? Was it for just pure fun or hope to make new friends in Atari-world or just for…. fame? F: Fun and being creative. That’s all. The goal was not to get new friends, but it obviously resulted in getting to know new people, some of those became good friends. No, don’t care about fame. I have much respect for all who are just creative, no matter what they do. It can be a real struggle to start coding on a new platform, so anything creative gives you a good feeling, it doesn’t even have to be something special for the rest of the world. D : Cool. So you did some demos, cracktros and very fine disk-magazine, but were not plans for any game or bigger utility? I only heard about announced stereo music-editor from one of the HTT members…. I mean here the time of HTT, not ANG afterwards. F: There was a plan to make a game with the code from the Platinum main menu, but since we all know what happened to that demo... Yeb (SolarSystems) worked on a music editor called ‘Atmus’. I still have the source code, but he did not even remember he ever made such a thing. D : Interesting! Is the source code almost ready to go? Would it have been better than other music editors at that time? I heard about Platinum demo in the past and know it as one of "impossible" productions which had too much expectations for.... But as of today, have you got some parts from it to use in future maybe? F: Don’t know the state of Atmus and it’s impossible to compare an unfinished product with other finished ones I do remember it was supposed to work with joystick and mouse. I still have all the source code from the unreleased Platinum, but some parts were already released as ABBUC intros years ago. To be honest, the unreleased stuff was quickly outdated and is not interesting compared to all the great demos that has been released over the years. For example, I used a little code from ‘Megadeth Scroller’ to create ‘The Lost Bytes’ 16K for Silly Venture 2k14. Also code from the ‘Plazma’ part was used by FRS and myself for the ‘Lets Rol’ 16K intro (Silly Venture 2k16). D : Oh, there was just one collaborative demo in which should HTT took part… Could you reveal more about this project? F: The Expo ‘91 demo was made for an Atari Benelux Expo in 1991. John from Pokey’s Magazine (The Missing Link, ANG Software) asked us to take part. I used a chiptune from Benjy ripped from the Hobbytronic demo and digi musix which I got from Detail (TACF) We did the final part for this demo and the small intro. The graphics was done by Prizm. Since Pokey’s Magazine was a Dutch magazine they wanted me to write the text in Dutch. I think I translated the English text back to Dutch including the group names in the greetinx. The result is funny if you can read Dutch language. The end part is difficult to reach since you had to read a large part of the scroller until you could press start. Digi music with screen on was not very common in 1991. D : Still speaking of demos, I must admit “Big Atari 8-bit Demo” was quite impressive at its time. I remember trying to read all texts from “the biggest scroller” there (but rather failed, as far as I remember ). Did "BIGA8Demo" made HTT somehow more popular in Atari world? Did you receive postcards, phone-calls or congratulation-letters from many other Atari freaks? F: Yes, we were all very surprised by the amount of letters we got in our P.O.Box. We decided to fairly distribute the new contacts we got. We got even more mail after the advertisement in Page 6, which was of course a great honour for us. While it might be considered to be a very simple demo nowadays, I’m still very proud of it. D : Well, especially digi-sound and music was surprising in "A8BD". But I bet you there are some fun facts about this production, hidden somewhere… F: Maybe a few, did you know... - the intro text was not decoded, but if you alter it with a sector editor the program will punish you (beware, it will destroy your disk if protection in disabled!) - the big scroller was decoded into 6-bit per character, an easy compression (25%) but fast enough to decompress - musix from the music menu was carefully chosen based on where we ripped it from memory. So, all musix from a menu don't overlap each other in memory - although the music menu is easy if you know about pm gfx,, I got questions on how we managed to get a screen with only 16 characters wide. for some this was already black art - the initial plan was to have a picture show instead of digi samples, but it turned out the guy who promised to do the pictures was not very good at it and gave up. - there were 17 master disks each with a unique serial number. the number is related to the person who got it directly from us. E.g. ABBUC, Page 6, etc. - the DOS menu is of course fake. when pressing return 3 times it shows a message and does a fake format. It all shows how much fun we had in making this demo D : Fine. What do you think about phenomenon of ripping on Atari 8-bit scene in mid 80/90s ? There were plenty of demos with ripped music from commercial games (is this due to lack of good musicians or music editors available at that time?). There were also demos with converted/ripped graphics from Commodore 64 (e.g. WFMH or HARD group) or even with some code/fx (HARD group). Do you condemn it? F: I’m not against it. Sometimes it is the only option. We had no musician in the early days and I liked to rip music from games. We had great respect for their work. On the other hand I would always prefer original music or graphics in a demo. It has a better chance of being a good demo when everything fits together nicely. D : Being longtime Atarian (with some years of break, right?) what keeps you still using Atari and visit different computer parties from time to time ? ;o F: There was a long break indeed. Did a few small things during that break, but really got back to the Atari when I decided to go to Silly Venture 2k14 to meet ‘old’ friends. Actually Grey talked me into coding something small and I rediscovered my hobby. Also, the great IDE (WUDSN) from JAC!, the MADS assembler and Altirra emulator helped a lot. Hereby a big thank you to the creators of these tools! At the moment the Atari as a hobby gives me great pleasure. I’m lucky to have a few good friends with the same hobby, so that helps too. It is always nice to go to parties to meet old and new friends who have the same interest. It’s also a very friendly and creative community. D : By the way, how do you like visiting Poland now (2018 year) and in the past (1991 year) ?Are there significant differences ? F: I’m not an expert, but I think the economy in Poland improved a lot. Prices went up, so I don’t feel like a rich dude anymore when visiting Poland. Transport and hotels are still much cheaper than in the Netherlands. I’m sure people in Poland are more wealthy now, maybe even rich compared to 1991. You should be able to answer this But from a personal point of view, people are still friendly and very hospitable. D : You said to me on last SV2k18 that you handed over “Atari Preservation Project” to somebody else. What is its status nowadays? F: Not exactly that. I try to do a few things and gave advice about best practices for software preservation since 2003 when the APP started. I see the current A8 preservation project is going very well. Farb and others from the AtariAge community are doing a wonderful job! It’s nice to see that the project is on the right track with good people and lots of knowledge about the A8. D : And now something quite different... Please tell me what is your favourite: - Demo (Atari / other) - Game (Atari / other) - Music (do you still listen to extreme metal bands?) F: Ah no! Demo, too difficult. Sorry, not possible to answer that. Game: Rescue on Fractalus and Boulderdash Construction Kit. Music, depends on my mood. Like to listen to industrial / martial music like Frontline Assembly, Laibach and Triarii. And of course chiptunes from different systems Don’t listen much to metal bands at the moment. Still like the old bands like Napalm Death. D : Does this kind of extreme/experimental music make you more quiet or vice versa??? ;o F: Yes it helps me to relax D : Well, we unfortunately have to finish this huuuuge (!) interview. What would you like to say at the end? F: There are probably important things I forgot to mention and things I remembered differently or are simply wrong. Feel free to correct me and restore my memory Thank you for taking the time to interview me. I can go on forever, since I really like to talk about the good old days, happy memories, it shaped my mind. I hope to see you and other Atari friends again sometimes, maybe next Silly Venture? D : We'll see! So, thanx a lot for taking your time as well and let us long live Atari (in our hearts) ! F: My pleasure P.S. Polish version can be found here.
  2. The first episode of a new Atari 8-bit podcast, Player/Missile, is available at http://playermissile.com It should be in iTunes soon. I'm going to look at games and classic magazines that covered the Atari 8-bit systems, and go chronologically. This first episode is an introduction, and next episode I'll start covering 1979. My goal is to review one game per episode as well, and for the first episode I'm going to review Star Raiders. Sort of like Ferg's 2600 game-by-game podcast, I'll be looking for feedback from folks about the games that I'll talk about, so I'll announce the games in advance if you'd like to send in stories about the games. I'm looking forward to playing some of these games again, and maybe finding games I missed. If you have any suggestions, let me know!
  3. Adventure Ponies - Atari XL/XE (64K Required) Dragon Trouble Applejack Smack Oh No! A Hydra Rainbow Dash-ed Uh Oh! It's Discord You Win! * Current Version * ----------------- 0.83 ----------------- - Modified the Pony Select Screen to show Locked as well as Unlocked characters. advponies.0.83.xex advponies.0.83.atr I posted a new thread as the images were broken on the previous thread. Here is a link to the previous thread.
  4. Adventure Ponies - Atari XL/XE (64K Required) Dragon Trouble Applejack Smack Oh No! A Hydra Rainbow Dash-ed Uh Oh! It's Discord You Win! Requires 64K This is a WIP and still being tested and optimized. * Current Version * ----------------- 0.90 ----------------- - Adjusted the volume of sound effects/level music so the music doesn't drown out the sound effects. advponies.0.90.xex advponies.0.90.atr * Older Versions * ----------------- 0.89 ----------------- - Replaced the old sound fx with new sound fx created by @Synthpopalooza. - Added the new tune to the Pony Select screen (Cutie Mark Crusaders Go Crusading). - Other changes to sound code so NTSC/PAL versions play at the same speed. - Changes to scoring. If you can beat the game with a Pony without losing any lives, get a bonus 9000 points for "PERFECT GAME". advponies.0.89.xex advponies.0.89.atr ----------------- 0.88 ----------------- - Replaced the old music with new music created by the talented @Synthpopalooza . There is another tune, that I couldn't fit but I will try to fit it in another update. advponies.0.88.xex advponies.0.88.atr ----------------- 0.87 ----------------- - Disable BASIC automatically, so the player doesn't have to hold down the [OPTION] key when booting. advponies.0.87.xex advponies.0.87.atr ----------------- 0.86 ----------------- - Added splash screen by Kaz at atarionline.pl, adjusted music volume advponies.0.86.xex advponies.0.86.atr ----------------- 0.85 ----------------- - Added the ability to turn the music on/off. On the "Select Pony" screen, press the [OPTION] key to toggle music on or off. advponies.0.85.xex advponies.0.85.atr ----------------- 0.84 ----------------- - Added background music to the game. (Stage tune and Enemy tune) advponies.0.84.xex advponies.0.84.atr ----------------- 0.83 ----------------- - Modified the Pony Select Screen to show Locked as well as Unlocked characters. advponies.0.83.xex advponies.0.83.atr ----------------- 0.82 ----------------- - Rewrite of all the animation code from C to assembly. This has improved game performance quite a bit. advponies.0.82.xex advponies.0.82.atr ----------------- 0.81 ----------------- - Optimization and refactoring of code. The game has improved performance especially on the Hydra level. advponies.0.81.xex advponies.0.81.atr ----------------- 0.80 ----------------- Original release advponies.0.80.xex advponies.080.atr
  5. Adventure Ponies - Atari XL/XE (64K Required) Dragon Trouble Applejack Smack Oh No! A Hydra Rainbow Dash-ed Uh Oh! It's Discord You Win! * Current Version * ----------------- 0.90 ----------------- - Adjusted the volume of sound effects/level music so the music doesn't drown out the sound effects. advponies.0.90.xex advponies.0.90.atr * Older Versions * ----------------- 0.89 ----------------- - Replaced the old sound fx with new sound fx created by @Synthpopalooza . Updated some existing music. - Added the new tune to the Pony Select screen (Cutie Mark Crusaders Go Crusading). - Other changes to sound code so NTSC/PAL versions play at the same speed. - Changes to scoring. If you can beat the game with a Pony without losing any lives, get a bonus 9000 points for "PERFECT GAME". advponies.0.89.xex advponies.0.89.atr ----------------- 0.88 ----------------- - Replaced the old music with new music created by the talented @Synthpopalooza . There is another tune, that I couldn't fit but I will try to fit it in another update. advponies.0.88.xex advponies.0.88.atr ----------------- 0.87 ----------------- - Disable BASIC automatically, so the player doesn't have to hold down the [OPTION] key when booting. advponies.0.87.xex advponies.0.87.atr ----------------- 0.86 ----------------- - Added splash screen by Kaz, adjusted music volume. advponies.0.86.xex advponies.0.86.atr ----------------- 0.85 ----------------- - Added the ability to turn the music on/off. On the "Select Pony" screen, press the [OPTION] key to toggle music on or off. advponies.0.85.xex advponies.0.85.atr ----------------- 0.84 ----------------- - Added background music to the game. There are two tunes, one for the element levels and one for the enemy levels. advponies.0.84.xex advponies.0.84.atr ----------------- 0.83 ----------------- - Modified the Pony Select Screen to show Locked as well as Unlocked characters. advponies.0.83.xex advponies.0.83.atr ----------------- 0.82 ----------------- - Rewrite of all the animation code from C to assembly. This has improved game performance quite a bit. advponies.0.82.xex advponies.0.82.atr ----------------- 0.81 ----------------- - Optimization and refactoring of code. The game has improved performance especially on the Hydra level. advponies.0.81.xex advponies.0.81.atr ----------------- 0.80 ----------------- Original release advponies.0.80.xex advponies.0.80.atr
  6. Who needs some 8-bit classics, especially some of the harder to find XE titles? All tested and working perfectly; cart-only unless otherwise noted. PM for pics and we can chat about a price that works for both of us. Thanks! Cartridge-based: Crime Buster XE Donkey Kong XE AtariArtist (silver label) AtariWriter Pilot Tape-based: Caverns of Khafka cassette tape + box UNTESTED but I received it brand new - only opened it because I needed the manual for my collection Let me know if you have any q's! Need a manual? Check out my "manual man" post for a semi-complete list (still worth inquiring about others that I may have)!
  7. Binary File I/O (Part 2 of 2) ============================================================== Part 1 - Introduction http://atariage.com/forums/blog/576/entry-13175-part-1-of-11-simple-assembly-for-atari-basic/ Part 2 - Learn 82.7% of Assembly Language in About Three Pages http://atariage.com/forums/blog/576/entry-13176-part-2-of-11-simple-assembly-for-atari-basic/ Part 3 - The World Inside a USR() Routine http://atariage.com/forums/blog/576/entry-13177-part-3-of-11-simple-assembly-for-atari-basic/ Part 4 - Implement DPEEK() http://atariage.com/forums/blog/576/entry-13178-part-4-of-11-simple-assembly-for-atari-basic/ Part 5 - Implement DPOKE http://atariage.com/forums/blog/576/entry-13180-part-5-of-11-simple-assembly-for-atari-basic/ Part 6 - Various Bit Manipulations http://atariage.com/forums/blog/576/entry-13181-part-6-of-11-simple-assembly-for-atari-basic/ Part 7 - Convert Integer to Hex String http://atariage.com/forums/blog/576/entry-13182-part-7-of-11-simple-assembly-for-atari-basic/ Part 8 - Convert Integer to Bit String http://atariage.com/forums/blog/576/entry-13183-part-8-of-11-simple-assembly-for-atari-basic/ Part 9 - Memory Copy http://atariage.com/forums/blog/576/entry-13184-part-9-of-11-simple-assembly-for-atari-basic/ Part 10 - Binary File I/O Part 1 (XIO is Broken) http://atariage.com/forums/blog/576/entry-13185-part-10-of-11-simple-assembly-for-atari-basic/ Part 11 - Binary File I/O Part 2 (XIO is Broken) http://atariage.com/forums/blog/576/entry-13186-part-11-simple-assembly-for-atari-basic-the-end/ ============================================================== New XIO in Mac/65 Assembler Code Many articles on this subject go by a simple route – use BASIC code to set up all the IOCB values for the 7/Get Bytes or 11/Put Bytes commands, and then provide a minimal assembly routine that simply calls the CIO vector. While BASIC mangles the binary read/write functions, XIO itself also is sufficiently broken to justify a complete machine language USR() routine that exercises CIO commands the way they were intended. For example, ICAX values are not always needed or even wanted, but XIO requires the values. In fact, ICAX values are rarely needed outside of the 3/Open command. Similarly, the filespec/buffer is often not necessary. This routine will perform the same purpose of XIO, but allow a variable number of arguments, adding more arguments only as needed: Always required (2 arguments): 1) Channel Number – Only low byte values 0 to 7 accepted. The high byte is ignored. 2) CIO Command – Only the low byte of the argument will be used. Optional (4 arguments): 3) Filespec/Buffer address – 16-bit value 4) Filespec/Buffer length – 16-bit value Additionally optional when the Filespec/Buffer is provided (5 arguments): 5) ICAX1 – the low byte of this argument is used. High byte is ignored. Additionally optional when the Filespec/Buffer and ICAX1 are provided (6 arguments): 6) ICAX2 – the low byte of this argument is used. High byte is ignored. Since the routine accepts 2, 4, 5, or 6 arguments it can support any of the following: 2) USR(NEWXIO,6,18) – Perform command 18/Fill for screen device (assuming channel 6) 4) USR(NEWXIO,1,254,ADR(F$),LEN(F$)) - Use channel 1 to format (254) the disk drive described by F$. This would also be the format/number of arguments needed for performing CIO Commands 7/Get Bytes and 11/Put Bytes. 5) USR(NEWXIO,5,3,ADR(F$),LEN(F$),6) - Use channel 5 to open (3) the disk directory (read/4 + directory/2 = 6) described by F$ 6) USR(NEWXIO,6,3,ADR(F$),LEN(F$),28,7) – Use channel 6 to open (3) as graphics mode 7 with a text window (read/4 + write/8 + window/16 = 28) assuming F$ describes “S:” Variable number of arguments means this program is organized differently from the prior utilities that copy stack arguments to Page Zero. Since this is just an interface for putting values into the IOCB it doesn't make use of Page Zero beyond returning a status value to BASIC. 0100 ; NXIO.M65 0105 ; 0110 ; NEW CIO/XIO INTERFACE 0115 ; 0120 ; SETUP IOCB WITH THE SUPPLIED 0125 ; ARGUMENTS AND CALL CIO 0130 ; 0135 ; USR 2, 4, 5, or 6 ARGUMENTS: 0140 ; CHANNEL == IOCB CHANEL (LOW BYTE) 0145 ; COMMAND == CIO COMMAND (LOW BYTE) 0150 ; BUF ADR == ADDRESS OF BUFFER 0155 ; BUF LEN == LENGTH OF BUFFER 0160 ; ICAX1 == CIO ICAX1 VALUE (LOW BYTE) 0165 ; ICAX2 == CIO ICAX2 VALUE (LOW BYTE) 0170 ; 0175 ; RETURN VALUE IS CIOV RESULT IN Y REG 0180 ; 0185 ZRET = $D4 ; FR0 $D4/$D5 Return Value 0190 ; 0195 CIOV = $E456 ; CIO Vector 0200 ; 0205 IOCB = $0340 ; Base IO Control Block 0210 ICHID = IOCB+$00 ; Handler ID 0215 ICDNO = IOCB+$01 ; Device number 0220 ICCMD = IOCB+$02 ; ** CIO Command 0225 ICSTA = IOCB+$03 ; CIO Status 0230 ICBAL = IOCB+$04 ; ** Buffer address (low) 0235 ICBAH = IOCB+$05 ; ** Buffer address (high) 0240 ICPTL = IOCB+$06 ; Put char routine (low) 0245 ICPTH = IOCB+$07 ; Put char routine (high) 0250 ICBLL = IOCB+$08 ; ** Buffer length (low) 0255 ICBLH = IOCB+$09 ; ** Buffer length (high) 0260 ICAX1 = IOCB+$0A ; ** Aux Byte 1 0265 ICAX2 = IOCB+$0B ; ** Aux Byte 2 0270 ICAX3 = IOCB+$0C ; Aux Byte 3 0275 ICAX4 = IOCB+$0D ; Aux Byte 4 0280 ICAX5 = IOCB+$0E ; Aux Byte 5 0285 ICAX6 = IOCB+$0F ; Aux Byte 6 0290 ; 0295 .OPT OBJ 0300 ; 0305 *= $9000 ; Arbitrary. this is relocatable 0310 ; 0315 INIT 0320 LDY #$FF ; Make the return 0325 STY ZRET ; value -1 ($FFFF) 0330 STY ZRET+1 ; by default. 0335 ; 0340 PLA ; Get argument count 0345 BEQ BYE ; Shortcut for no args. 0350 ; 0355 TAY 0360 ; 0365 CMP #$01 ; One arg is not enough. 0370 BEQ DISPOSE 0375 ; 0380 CMP #$03 ; Three args is not supported. 0385 BEQ DISPOSE 0390 ; 0395 CMP #$07 ; More than six is not valid. 0400 BCC DO_CHANNEL ; All good. Ready to pull args. 0405 ; 0410 ; Bad arg count. Clean up for exit. 0415 ; 0420 DISPOSE ; Any number of arguments 0425 PLA 0430 PLA 0435 DEY 0440 BNE DISPOSE 0445 RTS ; Abandon ship. 0450 ; 0455 ; Pull channel and multiply times 16 0460 ; 0465 DO_CHANNEL ; Arg 1 = Channel 0470 DEY ; subtract one arg 0475 PLA ; discard high byte 0480 PLA ; Channel number 0485 CMP #$08 ; More than 7 channels 0490 BCS DISPOSE ; is invalid. 0495 ASL A ; * 2 0500 ASL A ; * 4 0505 ASL A ; * 8 0510 ASL A ; * 16 0515 TAX 0520 ; 0525 DO_ICCMD ; Arg 2 = Command 0530 PLA ; discard high byte 0535 PLA ; command byte 0540 STA ICCMD,X ; Store Command in IOCB 0545 DEY ; subtract one arg 0550 BEQ DO_CIO0555 ; 0560 DO_ICBA ; Arg 3 = Buffer Address 0565 PLA ; Address high byte 0570 STA ICBAH,X 0575 PLA ; Address low byte 0580 STA ICBAL,X 0585 DEY ; subtract one arg 0590 ; 0595 DO_ICBL ; Arg 4 = Buffer Length 0600 PLA ; Length high byte 0605 STA ICBLH,X 0610 PLA ; Length low byte 0615 STA ICBLL,X 0620 DEY ; subtract one arg 0625 BEQ DO_CIO 0630 ; 0635 DO_ICAX1 ; Arg 5 = Aux Byte 1 0640 PLA ; discard high byte 0645 PLA ; Aux byte 0650 STA ICAX1,X ; Store AUX1 in IOCB 0655 DEY ; subtract one arg 0660 BEQ DO_CIO 0665 ; 0670 DO_ICAX2 ; Arg 6 = Aux Byte 2 0675 PLA ; discard high byte 0680 PLA ; Aux byte 0685 STA ICAX2,X ; Store AUX2 in IOCB 0690 DEY ; This should be zero args now... 0695 ; 0700 DO_CIO ; IOCB is set, now execute... 0705 STY ZRET ; Clear return value low 0710 STY ZRET+1 ; and high byte. 0715 JSR CIOV ; Engage, Mr Crusher. 0720 BPL BYE ; No error 0725 STY ZRET ; Copy Y to return value 0730 ; 0735 BYE 0740 RTS 0745 ; 0750 .END The initialization is similar to prior utilities. It begins by setting the return value to a known value ($FFFF) that cannot be returned by a successful exit. Then it pulls the argument count and does a series of value checks to identify any invalid number of arguments. If the code identifies an issue here it branches to cleaning the stack and then exits. One difference in the stack argument management is that this utility does not double the argument count to derive the number of bytes on the stack, because it will not be looping to copy the stack values into Page Zero. The channel handling is more involved than other arguments: 0455 ; Pull channel and multiply times 16 0460 ; 0465 DO_CHANNEL ; Arg 1 = Channel 0470 DEY ; subtract one arg 0475 PLA ; discard high byte 0480 PLA ; Channel number 0485 CMP #$08 ; More than 7 channels 0490 BCS DISPOSE ; is invalid. 0495 ASL A ; * 2 0500 ASL A ; * 4 0505 ASL A ; * 8 0510 ASL A ; * 16 0515 TAX The channel is pulled from the low byte of the argument. If the value exceeds the range of available channels, then it diverts to the stack cleanup to dispose of the remaining arguments and exits. Recall the earlier discussion about identifying the IOCB for a specific channel -- multiply the channel number times 16 and add to $340. Here the code multiplies the channel number by 16 allowing use of the value as an index to load values into the correct IOCB. The remaining arguments are handled similarly: 0525 DO_ICCMD ; Arg 2 = Command 0530 PLA ; discard high byte 0535 PLA ; command byte 0540 STA ICCMD,X ; Store Command in IOCB 0545 DEY ; subtract one arg 0550 BEQ DO_CIO The values are pulled from the stack and stored in the corresponding IOCB field. Then the argument counter is decremented. At the end of processing the arguments for command, buffer length, and ICAX1 (arguments 2, 4, and 5) the argument count is tested if it has reached zero. If this occurs then the program skips over the work for processing any subsequent arguments. Finally, it gets down to business: 0700 DO_CIO ; IOCB is set, now execute... 0705 STY ZRET ; Clear return value low 0710 STY ZRET+1 ; and high byte. 0715 JSR CIOV ; Engage, Mr Crusher. 0720 BPL BYE ; No error 0725 STY ZRET ; Copy Y to return value Recall that the Y register is used to count arguments and by the time the routine reaches this point the Y register is guaranteed to contain zero. So, this is a convenient source to clear the high byte of the return value for BASIC. Next, the code calls the CIO Vector ($E456). When the CIO routine returns the error code is in the Y register and the utility copies that value to the low byte of the return value. Let's go over a couple implications when this is used in BASIC: 1. The function accepts an absolute address and a length allowing access to any part of memory. While this is much more flexible than XIO it also means that this routine cannot directly accept a BASIC string. This routine can use a string passed by its address via ADR(). It is also up to the BASIC program to pass the correct length. LEN() is correct only when the string has defined content, so a BASIC program must fill or pad out the string to its expected length. 2. Since this is a USR() routine it is not integrated in BASIC's error handling. Therefore TRAP cannot trap any Input/Output errors. The BASIC program must check the return value of the NXIO routine or use the STATUS command to identify problems. Testing New XIO Now that we have some experience using files for binary data we're going to start with something different. The Atari BASIC program below, MAKENXIO.BAS, creates a binary file containing the machine language code for the NXIO routine. 1 REM MAKENXIO.BAS 5 REM CREATE NXIO.BIN FILE 10 OPEN #1,8,0,"H1:NXIO.BIN" 15 FOR I=1 TO 94 20 READ D:PUT #1,D 25 NEXT I 30 FOR I=95 TO 255 35 PUT #1,0 40 NEXT I 45 CLOSE #150 END 21996 REM H1:NXIO.OBJ 21997 REM SIZE = 94 21998 REM START = 36864 21999 REM END = 36957 22000 DATA 160,255,132,212,132,213,104,240 22001 DATA 84,168,201,1,240,8,201,3 22002 DATA 240,4,201,7,144,6,104,104 22003 DATA 136,208,251,96,136,104,104,201 22004 DATA 8,176,243,10,10,10,10,170 22005 DATA 104,104,157,66,3,136,240,34 22006 DATA 104,157,69,3,104,157,68,3 22007 DATA 136,104,157,73,3,104,157,72 22008 DATA 3,136,240,14,104,104,157,74 22009 DATA 3,136,240,6,104,104,157,75 22010 DATA 3,136,132,212,132,213,32,86 22011 DATA 228,16,2,132,212,96 22012 DATA 67,3,133,212,96 This will make managing the utility easier, allowing the test program (and any other BASIC program) to load the utility directly from the file without reading DATA statements. Note that the program purposely pads the output to 255 bytes, so that a BASIC program can use the (broken) XIO command to load the binary data. Next, is the test program that exercises the features of NXIO. It begins by loading the NXIO machine language routine into a string using XIO. This is acceptable for the tightly confined usage here – the program does only one operation to read a file of 255 bytes. The remaining CIO activity in the program is run by the shiny, new NXIO routine: 100 REM TSTNXIO1.BAS10 5 REM TEST THE NEW XIO USR ROUTINE 110 POKE 82,0:GRAPHICS 0 115 DIM NXIO$(255):NXIO$(255)=" " 120 NXIO=ADR(NXIO$) 125 REM READ NXIO FROM FILE 130 OPEN #1,4,0,"H1:NXIO.BIN" 135 XIO 7,#1,4,0,NXIO$ 140 CLOSE #1 145 REM 150 REM TEST THE BAD ARG EXIT 155 REM TEST BAD ARGS 0160 ? "TESTING BAD ARGUMENTS..." 165 BADARG=USR(NXIO) 170 ? "BAD ARGS 0 = ";BADARG 175 REM TEST BAD ARGS 1 180 BADARG=USR(NXIO,3) 185 ? "BAD ARGS 1 = ";BADARG 190 REM TEST BAD ARGS 3 195 BADARG=USR(NXIO,3,3,32000) 200 ? "BAD ARGS 3 = ";BADARG 205 REM TEST BAD ARGS 7 210 BADARG=USR(NXIO,3,3,32000,2,3,3,3) 215 ? "BAD ARGS 7 = ";BADARG 220 GOSUB 595 225 REM 230 REM DO CIO 3/OPEN TO SET UP 235 REM A GRAPHICS MODE AND RUN 240 REM THE 18/FILL COMMAND.2 45 REM FORCE "S:" CLOSED 250 CLOSE #6 255 REM OPEN AS GR MODE 5, NO WINDOW 260 GROPEN=USR(NXIO,6,3,ADR("S:"),2,12,5) 265 REM SAME AS EARLIER XIO FILL DEMO 270 COLOR 3 275 PLOT 70,45:DRAWTO 50,10 280 DRAWTO 30,10:POSITION 10,45 285 POKE 765,3290 XFILL=USR(NXIO,6,18) 295 GOSUB 600:REM WAIT FOR A KEY 300 REM REPORT THE RESULTS 305 GRAPHICS 0 310 ? "GROPEN = ";GROPEN 315 ? "XFILL = ";XFILL 320 GOSUB 595 325 REM 330 REM GAMES WITH BINARY FILES 335 REM LOAD THE 8 BYTE MEMORY FILE 340 DIM D$($="!!!!!!!!" 345 ? "LOADING 8 BYTE MEMORY.BIN..." 350 OPEN #1,4,0,"H1:MEMORYT0.BIN" 355 XREAD8=USR(NXIO,1,7,ADR(D$), 360 CLOSE #1 365 FOR I=1 TO 8 370 ? ASC(D$(I,I)), 375 NEXT I 380 ? "XREAD8 = ";XREAD8 385 GOSUB 595 390 REM 395 REM SAVE THE ROM CHARACTER SET 400 CR=57 344:REM ROM SET $E000 405 ? "SAVING ROM CHARACTER SET..." 410 OPEN #1,8,0,"H1:CSET.BIN" 415 XSAVE=USR(NXIO,1,11,CR,1024) 420 CLOSE #1 425 ? "XSAVE = ";XSAVE 430 GOSUB 595 435 REM 440 REM GAMES WITH THE BINARY LOAD 445 REM SETUP SCREEN FIRST... 450 GRAPHICS 0:POSITION 0,12 455 SC=PEEK(88)+256*PEEK(89) 460 FOR Y=0 TO 7 465 FOR X=0 TO 31 470 POKE SC+Y*40+X,Y*32+X 475 NEXT X 480 NEXT Y 485 ? "NORMAL CSET DISPLAYED" 490 ? "TO LOAD SOFT SET" 495 GOSUB 595 500 REM 505 REM LOAD THE SOFT SET IN 510 REM FLIPPED HALF SETS 515 CH=36864:REM SOFT SET $9000 520 POKE 756,144 525 OPEN #1,4,0,"H1:CSET.BIN" 530 CSLOAD1=USR(NXIO,1,7,CH+512,512) 535 CSLOAD2=USR(NXIO,1,7,CH,512) 540 CLOSE #1 545 ? "SWAPPED, SOFT CSET CSET DISPLAYED" 550 GOSUB 595 555 REM 560 REM THE END 565 GRAPHICS 0 570 ? "CSLOAD1 = ";CSLOAD1 575 ? "CSLOAD2 = ";CSLOAD2 580 END 585 REM 590 REM WAIT FOR A KEY 595 ? "PRESS A KEY" 600 OPEN #1,4,0,"K:" 605 POKE 764,255 610 GET #1,A 615 CLOSE #1620 RETURN The program begins by reading the machine language routine via XIO into a string 255 characters long. Yes, the routine is actually only 94 bytes long, so it wastes a bit of space. Such is life when using XIO. The first round of tests validates the argument management. There is a separate test for each bad argument possibility – 0, 1, 3, and 7 (or greater). Each failure to start results in error code 65535 from NXIO: The next round of tests uses NXIO with all the supported arguments to open a graphics mode 5 display with no text window. Then it draws a shape and uses NXIO to execute the 18/Fill command: After the fill completes press a key to continue and then the program prints the NXIO exit codes for the Graphics Open and the Fill: Press a key again and the program runs the next test which uses 7/Get Characters to read the 8-byte MEMORYT0.BIN file created earlier. After loading the file the program prints the ATASCII codes for the bytes in the string. It should report the values below, and then print the exit code from NXIO for the 8-byte read.: Press a key after this to run the next test. This will use the 11/Put Characters to save the entire 1,024 bytes of the Atari's ROM character set to a file. Then it will print the exit code from the NXIO routine for the operation: Press a key to run the next test. This will prepare the screen to demonstrate loading the character set from the file into memory. The characters are displayed in the internal order. Note the order of the characters. Press a key to continue the test. The program will use 7/Get Characters to load the first 512 bytes from the file into the second 512 bytes of the soft character set in memory, and then it loads the second set of 512 bytes from the file into the first 512 bytes of the soft character set in memory. This effectively swaps the images of the first half of the character set with the second half. Observe the “changed” order of the characters: Finally, press a key to return the display to the normal character set and the program will display the return codes from NXIO for the loading activities and then it ends: The tests all work as expected, especially all the uses of 7/Get Characters and 11/Put Characters. So, there is no problem with CIO. The problem really is that BASIC's XIO command unnecessarily manages the interface to CIO commands. Correct use of the CIO commands is so simple and the behavior XIO implements is so involved and complicated that it is difficult to consider it simply an accident. What could be the reason for XIO's bizarrely over-engineered behavior? Perhaps at the time Atari BASIC was designed there was an expectation that these I/O operations must work in increments no less and no more than 255 bytes. Perhaps a misunderstanding between OS design and BASIC design? Perhaps design requirements were in motion and it was too late to fix the behavior. Truly weird. Below is a list of the source files and test examples from the New XIO discussion available in the disk image and archive. The files are listed in the order presented during the discussion. The BASIC programs come in the tokenized BASIC format ending in .BAS. Two listings in text format are also provided: Atari ATASCII format as .LIS and unix/linux text format ending in .TLS. New XIO File List: MSAVEDAT BASIC program to PRINT eight values to a file. MSAVEDT0 BASIC program to PUT eight bytes to a file. MLOADDT0 BASIC program to GET eight bytes from a file. XIOFILL BASIC program performing the XIO fill command using device “Q:” MSAVEDT2 BASIC program using XIO for 11/Put Bytes to write a file. MSAVEDT3 BASIC program using XIO for 11/Put Bytes to write data to a file with a trailing string to identify the source of excess file data. MLOADDT BASIC program using XIO for 7/Get Bytes. MLOADDTX BASIC program using XIO for 7/Get Bytes with a trailing string to detect excess data read from the file. MSAVE512 BASIC program to generate a file containing 512 bytes. MLOAD512 BASIC program using XIO for 7/Get Bytes attempting to load 512 bytes from a file. MLOAD8 BASIC program using XIO for 7/Get Bytes attempting to load bytes from a file containing 8 bytes. NXIO.M65 Saved Mac/65 source NXIO.L65 Mac/65 source listing NXIO.T65 Mac/65 source listed to H6: (linux) NXIO.ASM Mac/65 assembly listing NXIO.TSM Mac/65 assembly listing to H6: (linux) NXIO.OBJ Mac/65 assembled machine language program (with load segments) NXIO.BIN Assembled machine language program without load segments with additional data padded to the end of the file to make it 255 bytes long. NXIO.DAT LISTed DATA statements for NXIO machine language routine. MAKENXIO BASIC program to create the BIN file with padding to 255 bytes so the file can be loaded using XIO to read the binary data. TSTNXIO1 BASIC program testing the NXIO USR() routines for various CIO commands. ZIP archive of files: NXIO_Disk.zip Tar archive of files (remove the .zip after download) NXIO_Disk.tgz.zip Game Over The movie really is over this time. Thanks for playing. Enjoy the new toys. Finally, welcome to the new world of assembly language. Try to think of new ways to accelerate and improve BASIC programs. - End - Blessed is the man who walks not in the counsel of the wicked, nor stands in the way of sinners, nor sits in the seat of scoffers; Psalm 1:1
  8. DPEEK ============================================================== Part 1 - Introduction http://atariage.com/forums/blog/576/entry-13175-part-1-of-11-simple-assembly-for-atari-basic/ Part 2 - Learn 82.7% of Assembly Language in About Three Pages http://atariage.com/forums/blog/576/entry-13176-part-2-of-11-simple-assembly-for-atari-basic/ Part 3 - The World Inside a USR() Routine http://atariage.com/forums/blog/576/entry-13177-part-3-of-11-simple-assembly-for-atari-basic/ Part 4 - Implement DPEEK() http://atariage.com/forums/blog/576/entry-13178-part-4-of-11-simple-assembly-for-atari-basic/ Part 5 - Implement DPOKE http://atariage.com/forums/blog/576/entry-13180-part-5-of-11-simple-assembly-for-atari-basic/ Part 6 - Various Bit Manipulations http://atariage.com/forums/blog/576/entry-13181-part-6-of-11-simple-assembly-for-atari-basic/ Part 7 - Convert Integer to Hex String http://atariage.com/forums/blog/576/entry-13182-part-7-of-11-simple-assembly-for-atari-basic/ Part 8 - Convert Integer to Bit String http://atariage.com/forums/blog/576/entry-13183-part-8-of-11-simple-assembly-for-atari-basic/ Part 9 - Memory Copy http://atariage.com/forums/blog/576/entry-13184-part-9-of-11-simple-assembly-for-atari-basic/ Part 10 - Binary File I/O Part 1 (XIO is Broken) http://atariage.com/forums/blog/576/entry-13185-part-10-of-11-simple-assembly-for-atari-basic/ Part 11 - Binary File I/O Part 2 (XIO is Broken) http://atariage.com/forums/blog/576/entry-13186-part-11-simple-assembly-for-atari-basic-the-end/ ============================================================== Since one byte can hold the value 0 to 255 a value larger than 255 requires two bytes. The second byte takes the place value 256. Just as Base10 has “ones” values 0 to 9, and then “tens” value for the next position, so the two bytes provide a Base256 value – “ones” value 0 to 255 in the first position and then 256 as the “tens” in the second position. The two-digit value limit for Base10: multiply the maximum base value by 10 for the “tens” value and add the maximum base value of the “ones”, or 9 * 10 + 9 = 99. The same applies for Base256: multiply the maximum base value by 256 for the “tens” and then add the maximum base value as the “ones”, or 255 * 256 + 255 == 65,535. (Or, in hex this is $FF * $100 + $FF == $FFFF.) So, the real value limit of 16-bits starts at 0 and ends at 65,535 or $FFFF. The 64K address space of an 8-bit computer is described by a 16-bit value. So, the Atari environment is liberally sprinkled with 16-bit values as addresses, pointers, and larger integer values. Manipulating 16-bit values is complementary to working in the Atari computing environment, but Atari BASIC does not provide a direct and easy method for this. OSS BASIC XL provides the Dpeek() function to perform a 16-bit, two-byte PEEK of the value at a specified memory location. This can also be duplicated in regular Atari BASIC, although slower. In BASIC XL the action: Value = Dpeek( Address ) is frequently seen in Atari BASIC programs expressed as: VALUE = PEEK( ADDRESS ) + 256 * PEEK( ADDRESS + 1 ) That’s not very complicated. A little programming grease mixed with Atari BASIC’s ability to GOSUB to a variable produces this reusable subroutine: 10 DPEEK=28000 20 ADDRESS=560:GOSUB DPEEK 30 ? "DPEEK(560)= ";VALUE 40 END. . . 27997 REM IMPLEMENT DPEEK 27998 REM INPUT = ADDRESS 27999 REM OUTPUT = VALUE 28000 VALUE=PEEK(ADDRESS)+256*PEEK(ADDRESS+1) 28001 RETURN The routine is simple; just one real line of BASIC code. But, execution in Atari BASIC is fairly slow, since it includes a floating point multiplication. Infrequent slothfulness is forgivable, but repeated use causes obvious performance drag. What this problem needs is a little assembly language propulsion... DPEEK Mac/65 Assembler Code 0100 ; DPEEK 0105 ; 0110 ; Return the 16-bit contents 0115 ; at the specified address. 0120 ; 0125 ; USR 1 arguments: 0130 ; Addr == address of value. 0135 ; 0140 ; USR return value is 16-bit 0145 ; contents of address. 0150 ; 0155 ; Use the FR0 FP register. 0160 ; The return value for BASIC 0165 ; goes in FR0. 0170 ; No FP is used so all of FR0 0175 ; (and more FP registers) can 0180 ; be considered available. 0185 ; 0190 ZRET = $D4 ; FR0 $D4/$D5 Return value 0195 ZARGS = $D5 ; $D6-1 for arg Pulldown loop 0200 ZADDR = $D6 ; FR0 $D6/$D7 Address 0205 ; 0210 .OPT OBJ 0215 ; 0220 ; Arbitrary. This is relocatable. 0225 ; 0230 *= $9700 0235 ; 0240 INIT 0245 PLA ; argument count 0250 TAY 0255 BEQ EXIT_ERR ; shortcut for no args 0260 ASL A ; now number of bytes 0265 TAY 0270 CMP #$02 ; Address 0275 BEQ PULLDOWN 0280 ; 0285 ; Bad args. Clean up for exit. 0290 ; 0295 DISPOSE ; any number of args 0300 PLA 0305 DEY 0310 BNE DISPOSE 0315 ; 0320 EXIT_ERR ; return "error" 0325 STY ZRET ; Y is Zero 0330 STY ZRET+1 ; 0335 RTS ; bye. 0340 ; 0345 ; This code works the same 0350 ; for 1, 4, 8 ... arguments. 0355 ; 0360 PULLDOWN 0365 PLA 0370 STA ZARGS,Y 0375 DEY 0380 BNE PULLDOWN 0385 ; 0390 ; Y is already zero here. 0395 ; 0400 LDA (ZADDR),Y 0405 STA ZRET 0410 INY 0415 LDA (ZADDR),Y 0420 STA ZRET+1 0425 ; 0430 RTS ; bye. 0435 ; 0440 .END In this first example I’ll walk through all the setup and safety checks. This will be similar for most of the other utilities. Some programmers would consider that there is much more code here than required. The safety checks look like overkill, because the working code for this particular utility is so short. Protecting the BASIC programmer from torpedoing the system is important enough to justify protection. From the point of view of execution timing this overhead is inconsequential compared to the speed of BASIC. First of all, the routine is relocatable which means the code makes no absolute references to locations within itself. All branches are relative to the current location, so the code could execute from almost anywhere in memory. However, it does need a couple of fixed locations for working values in the program: 0155 ; Use the FR0 FP register. 0160 ; The return value for BASIC 0165 ; goes in FR0. 0170 ; No FP is used so all of FR0 0175 ; (and more FP registers) can 0180 ; be considered available.0185 ; 0190 ZRET = $D4 ; FR0 $D4/$D5 Return value 0195 ZARGS = $D5 ; $D6-1 for arg Pulldown loop 0200 ZADDR = $D6 ; FR0 $D6/$D7 Address The program needs two values – the address from which to PEEK the 16-bit value, and a place to put the 16-bit value for BASIC to reference. Specifically, the code is using the Page Zero locations. “Page Zero” means all the address locations where the high byte of the address is $00. (The 256 locations from address $0000 to $00FF). Page Zero locations are chosen for several reasons: 6502 instructions referencing Page Zero are one byte shorter and usually execute faster than instructions referencing other pages. The 6502 has useful addressing modes that only work for Page Zero references. BASIC already defines a place in Page Zero for the value the machine language routine returns to BASIC. Since Page Zero locations are so useful they are also highly contested. The Atari OS defines and uses just about every byte in the first half of Page Zero. BASIC and the Floating Point routines use almost all of the second half of Page Zero. As it turns out the locations used by this machine language routine are “claimed” by the Floating Point routines. However, as long as the machine language routine does not need to use the Floating Point routines then these locations are free for use. Now to the working code. The routine begins by pulling the argument count from the stack and checking for zero arguments. If it finds no arguments to process then the routine branches to another location for an early exit. Yes, the TAY instruction is not needed to correctly branch for no arguments. The PLA instruction sets the zero flag when the argument count popped from the stack is zero. However, the exit code will use the Y register to return an error value (which is zero) to BASIC: 0240 INIT 0245 PLA ; argument count 0250 TAY 0255 BEQ EXIT_ERR ; shortcut for no args Next, the routine converts the number of arguments into the number of bytes to pull from the stack. It uses ASL which is the same as multiplying the value in the Accumulator times two. This is stored in the Y register which is used as an index for later loops. The routine verifies the argument count is correct (only 1 argument – the address to PEEK) which is 2 bytes. If this is correct the routine branches to the code that will pull the stack values and place them in Zero page memory for use later: 0260 ASL A ; now number of bytes 0265 TAY 0270 CMP #$02 ; Address 0275 BEQ PULLDOWN If the argument count is incorrect then the routine discards the argument values on the stack, so it can safely exit. Remember the Y register already contains the number of argument bytes on the stack: 0295 DISPOSE ; any number of args 0300 PLA 0305 DEY 0310 BNE DISPOSE Next, the routine falls into the exit section. Earlier, if there were no arguments the routine branched here directly. Note that if there are no arguments the Y register contained 0 when it branched here directly, and at the conclusion of cleaning up the stack in the DISPOSE loop the Y register will also be 0. So, in either case of bad arguments, too many or too few, the return value to BASIC is cleared to 0: 0320 EXIT_ERR ; return "error" 0325 STY ZRET ; Y is Zero 0330 STY ZRET+1 ; 0335 RTS ; bye. Clearing the return value really isn’t necessary and isn’t exceedingly useful beyond insuring random values are not returned to BASIC in the case of an error. Returning a real error would require the USR() pass another argument from BASIC that the routine would use to indicate success or failure. However, the DPEEK action is so simple that this level of error detection begins to enter the arena of silly. The error detection shown here already leans toward overkill and is done for design consistency with the other utilities covered later. At this point the arguments are correct. The routine pulls the values from the stack and places them in Page Zero locations $D6/$D7 referred to as ZADDR. On entry to this point in the code the Y register contains the number of bytes to pull from the stack (always 2 for this routine). The loop pulls them off the stack and places them into memory descending as it goes, because the high byte is pulled first, then the low byte. The base address is not ZADDR, but ZARGS, a value defined one byte less than ZADDR. This is because the Y value will be used as an index from the number of argument bytes (2, 4, 6, etc.) counting down to 1, not to 0. Counting backwards results in the stack values placed in memory in the correct low byte, high byte order used by the 6502. When Y reaches 0 it falls out of the loop: 0360 PULLDOWN 0365 PLA 0370 STA ZARGS,Y 0375 DEY 0380 BNE PULLDOWN This code works for any number of arguments as long as the destination can be sequential bytes in memory. However, this is admittedly overkill for only one argument. More explicit code that directly pulls one 16-bit argument from the stack requires the same number of instructions, but is one byte less (and executes faster). Just for reference: 0360 PULLDOWN 0365 PLA 0370 STA ZADDR+1 ; high byte first. 0375 PLA 0380 STA ZADDR ; low byte next. The actual work to perform the double byte peek is just the five instructions before the final RTS. The routine reads two bytes through the address contained in ZADDR ($D6/$D7) and copies the bytes to the return value, ZRET ($D4/$D5): 0400 LDA (ZADDR),Y 0405 STA ZRET 0410 INY 0415 LDA (ZADDR),Y 0420 STA ZRET+1 After the routine exits Atari BASIC converts the value stored in locations $D4/$D5 (ZRET in the code) into a floating point value. This becomes the return value from USR(). So, in the following BASIC statement the variable X is assigned the value taken from $D4/$D5: 250 X=USR(DPEEK,560): REM DISPLAY LIST ADDRESS Below are source files and examples of how to load the machine language routine into BASIC included in the disk image and archive: DPEEK File List: DPEEK.M65 Saved Mac/65 source DPEEK.L65 Mac/65 source listing DPEEK.T65 Mac/65 source listed to H6: (linux) DPEEK.ASM Mac/65 assembly listing DPEEK.TSM Mac/65 assembly listing to H6: (linux) DPEEK.OBJ Mac/65 assembled machine language program (with load segments) DPEEK.BIN Assembled machine language program without load segments MKDPEEK.BAS BASIC program to create the DPEEK.BIN file. This also contains the DPEEK routine in DATA statements. MKDPEEK.LIS LISTed version of MKDPEEK.BAS MKDPEEK.TLS LISTed version of MKDPEEK.BAS to H6: (linux) DPEEK.BAS BASIC program that loads DATA statements into a string. DPEEK.LIS LISTed version of DPEEK.BAS DPEEK.TLS LISTed version of DPEEK.BAS to H6: (linux) The next task should be a test program to demonstrate using DPEEK in BASIC. But, since DPEEK isn’t much use without DPOKE, we will visit DPOKE first before using the machine language routines together in a BASIC program. ZIP archive of files: Dpeek_Disk.zip Tar archive of files (remove the .zip after download) Dpeek_Disk.tgz.zip Therefore I tell you, do not be anxious about your life, what you will eat or what you will drink, nor about your body, what you will put on. Is not life more than food, and the body more than clothing? Look at the birds of the air: they neither sow nor reap nor gather into barns, and yet your heavenly Father feeds them. Are you not of more value than they? And which of you by being anxious can add a single hour to his span of life? And why are you anxious about clothing? Consider the lilies of the field, how they grow: they neither toil nor spin, yet I tell you, even Solomon in all his glory was not arrayed like one of these. Matthew 6:25-34
  9. I'm working on getting Atari 8-Bit set up in RetroPie using the Atari800 emulator and most everything seems to be working just fine except for this: My WASD keys don't deliver any input at all. I've tried multiple keyboards, checked to make sure they aren't currently bound to joystick controls in the emulator and I assume there is somewhere in the emulator which is binding them to "movement" but I can't seem to find it. So right now, any game that requires pressing "S" to start, like the Scott Adams adventure games, I can't do anything with because my "S" key doesn't work. I've scoured Google looking for solution but it seems there aren't many people who have set up Atari800 on the RetroPie because it most certainly isn't the most user friendly of emulators. Anyone else run into this same issue and found a solution? Thank you in advance for your help!
  10. On Tuesday I plan to mail @Allan the following unarchived (or needs-better-archiving-quality) Atari items. The shipping can get quite expensive and the funds come directly from the pockets of Allan and myself. I have a hope that some people can donate funds to me via PayPal to contribute to this on-going Atari archiving project. As of right now, I'm not sure how much shipping will cost. I'll give a sum total after the items have been shipped. I have been exchanging many, many pictures with Allan over the last year or so. He goes through the pictures and chooses what needs to be archived, or what needs to be archived in a better format. Occasionally, I send him large batches of items and he scans them and uploads them to archive.org. This can get quite expensive, as he and I send the items back and forth. If you feel like making a donation to me, then send me a personal message and I will send you my PayPal account. I will have @Allan chime in on this thread so that you know this is legitimate. Here are pictures of everything that I'll be sending to Allan this coming week. Thanks for considering making a donation-- the Atari community rocks! Adam
  11. I am digging out some of the rare stuff in my collection (after 20+ years of storage) and wondering what the value on some of them are... Specifically, here's an Atari 1200 prototype unit. I haven't tried to turn it on, but it worked years ago when I last powered it up. I have a couple of 8-bit prototypes, 5200 prototypes, and quite a few 2600 prototypes I'll be asking about soon, too! Thanks for your help...
  12. I picked up this cart and I didn't recall seeing it before, and I'm betting it is on every cart, but it's neat anyway. Kinda makes me want to put paper over it and scribble out the pattern. ian
  13. pmgraphics

    chiseler 30677

    From the album: Chiseler

    Atari computer classic type-in-code video game. Youtube link to video since album doesn't seem to take videos.
  14. pmgraphics

    chiseler 30001

    From the album: Chiseler

    Atari computer classic type-in-code video game. Youtube link to video since album doesn't seem to takevideos.
  15. Hello all! I did a lot of Atari 8-bit coding as a teenager on my Atari 400 and wrote about a few games including about SIX in Atari BASIC, and ONE in 100% assembly language. Some of you may recall that I posted about the assembly language game about 12 years ago. It is a Shoot 'em up called 'Sector Wars" and at the time I was trying to raise money for a charity and when the target was reached I was going to release the game. Unfortunately the target wasn't reached but some very kind people (some of which I believe frequent this forum) did donate at the time and the money went straight to the charity via JustGiving. I always wanted to finish the game but with one thing and another I never got around to it. Original Thread for anyone interested : O Anyway to cut a long story short I am just finishing it off now, and I will release it here next week :). In the meantime for the next few days, I will upload some of my games written in BASIC. A couple were published in the UK Home Computing Weekly magazine in the 1980s, and the rest I never got around to sending off to anyone. Some are okay but others a not so good but I will upload them for completeness. Something for lockdown anyway ;). For Friday (17th April 2020) I will upload the two BASIC games published by Home Computing Weekly magazine. The Chaotic Crossing (chaotic.bas) - Published in the UK Home Computing Weekly magazine Magazine Link: https://archive.org/details/home-computing-weekly-066/page/n27/mode/2up HCWMan (Pacman Clone): This isn't great - and ran quite slow. Magazine Link: https://archive.org/details/home-computing-weekly-054/page/n47/mode/2up Over the next few days I will release some more BASIC games including one which is a Yars Revenge clone. Cheers Vic chaotic.bas hcwman.bas
  16. I have read comments, here and on YouTube, over the past 3 years. I have made some updates to all of these games here! A quick note about the hacks: I have decided to place all of my hacks in one, convenient thread. As I grew up with my Atari 5200 and Atari 800XL, there were certain games that I thought had a little more potential. I had created basic hacks for a few of these games. I always thought that my 5200 Popeye could look better. Brutus didn't have a number "5" for a head in the arcade version. I knew I had drawn more accurate Mario characters on my 800XL. If only I could plug them into the games. I teamed up with Playsoft, who provided the tools and wisdom to make these games possible. Some of these games have other contributors. Tep392 helped us tweak the collision and touchy controls in DK Jr. I believe that Tep392 and Kjmann worked on the original Donkey Kong RMT sound version. I believe there is another member who helped Playsoft in some of the A8 to 5200 conversions. I am not sure who drew the giant Popeye head. If anybody has clarity on this, let me know, so credit can go where it is due. These are truly community projects, and I had a great time watching them transform. Playsoft did an amazing job of hacking display list interrupts, giving me a little more height area (eg. thicker 5200 Mario Bros floors, as well as multiple floor types). I have been holding off on releasing the latest Mario Bros hacks, because I didn't want to release as many revisions. I was also hoping for some upgraded sound effects for Mario, but there's not always enough time in the day. There's a bonus hack for the 7800 Mario Bros. I found the 7800 graphics tedious to hack. The characters were drawn too small and flat, and the game itself plays horribly. That version has the least number of animation frames, so the animation is poor regardless. It is my "Lipstick on a Pig" release. Donkey Kong: Atari 8-bit Computer Arcade version -- DK_A8_Arcade.xex Atari 8-bit Computer RMT version (Updated sound) -- DK_A8_RMT.xex Atari 5200 Supersystem version -- DK5200_Arcade.bin Donkey Kong Jr: (Arcade & Enhanced versions) Atari 8-bit Computer Arcade version -- DKJr_A8_Arcade.xex Atari 8-bit Computer Enhanced version -- DKJr_A8_Enhanced.xex Atari 5200 Supersystem Arcade version -- DKJr_5200_Arcade.bin Atari 5200 Supersystem Enhanced version -- DKJr_5200_Enhanced.bin Popeye Arcade: Atari 8-bit Computer version --PopeyeArcade_A8_Final.xex Atari 5200 Supersystem version -- Popeye5200_ArcadeFinal.bin Mario Bros (1983, 5200 version): Atari 5200 Supersystem bin version -- MarioBros_Arcade_52.bin Atari 5200 Supersystem car format -- MarioBros_Arcade_52.zip Mario Bros XE: Atari XL/XE version - MarioBrosArcade_XE.zip Mario Bros 7800: Atari 7800 version - Mariobros_7800_Arcade.a78
  17. I'm presently in the market for an Atari XE game system. The bare minimum I want is the console & keyboard with any accessories for TV hookup. If anyone has the whole setup - console, keyboard, joystick, light gun, Flight Simulator and Bug Hunt Cartridges, hookup accessories - that's even better. I reside in the USA. While I am willing to pay for shipping in the USA and Canada, I will not pay shipping costs for any units from elsewhere (UK, Europe, etc). Anyone who has the above and is willing to part with it can either reply here or contact me via DM. If we decide to do business and close the deal, I'm willing to cut a check but can negotiate other payment terms.
  18. Hi, New/old A8 basic coder here (haven't touched it in ~30y). Trying to remember how to use ML strings to redefine character sets... My most immediate problem is that I can't get certain characters on the screen. CHR$(127) does not output the right-facing triangle character. I need to get that in a string to redefine my character set but I'm forgetting how. The screenshot attached shows another person's program that contains said character in a string, but I don't know how it was done. I have access to Atari800MacX, Envision on a windows XP VM, and I'm open to other mac/win/a8 tools if there's an easy-peasy character set generator that outputs what I need. I also don't mind converting the values by hand into ATASCII but I figure there's easier ways My requirements are that the code be self-contained in the basic file and that it be as compact as possible, so I can't use external files to load the charset data, and I figure strings are better than data statements.
  19. Rewindgames will release ANG Software's Greatest Hits on October 24th 2016. Worldwide premiere at the Abbuc JHV Meeting on October 22nd in Herten Germany. This premium collectors edition features the 6 best Dutch puzzle games for the Atari 8-bit: Johnny the Ghost, Mines!, Simple Minds, Shit!, Thinx and Whoops 2 on one disk! For sale at Rewindgames.com from October 24th 2016 for only € 12.99. Exclusive premiere discount at the Abbuc JHV. Buy it in Herten, Germany for only € 9.95! https://youtu.be/OBwwmjXkwQo
  20. SOLD For Sale: Indus GT for Atari 8-bit machines. Tested, fully working, smoked door intact. The whole unit is very nice. Sorry I just realized the pictures are out of focus. If you need better pics, let me know. Has all the disks with their manuals, plus the overall disk drive manual. I rarely see one of these for sale with all of the disks and manuals... in their original Indus sleeves too. Has original working power supply with the "For use with Indus GT only" sticker wrapped around the input side. No disappointments here... goes great with your 800xl, 1200xl or any other Atari computer. $100 plus actual shipping. I'll double box it and pack it carefully. Prefer cash (PayPal), but will consider trades, tell me what you have, I'll tell you if I'm intersted!
  21. Convert Integer To Hex String ============================================================== Part 1 - Introduction http://atariage.com/forums/blog/576/entry-13175-part-1-of-11-simple-assembly-for-atari-basic/ Part 2 - Learn 82.7% of Assembly Language in About Three Pages http://atariage.com/forums/blog/576/entry-13176-part-2-of-11-simple-assembly-for-atari-basic/ Part 3 - The World Inside a USR() Routine http://atariage.com/forums/blog/576/entry-13177-part-3-of-11-simple-assembly-for-atari-basic/ Part 4 - Implement DPEEK() http://atariage.com/forums/blog/576/entry-13178-part-4-of-11-simple-assembly-for-atari-basic/ Part 5 - Implement DPOKE http://atariage.com/forums/blog/576/entry-13180-part-5-of-11-simple-assembly-for-atari-basic/ Part 6 - Various Bit Manipulations http://atariage.com/forums/blog/576/entry-13181-part-6-of-11-simple-assembly-for-atari-basic/ Part 7 - Convert Integer to Hex String http://atariage.com/forums/blog/576/entry-13182-part-7-of-11-simple-assembly-for-atari-basic/ Part 8 - Convert Integer to Bit String http://atariage.com/forums/blog/576/entry-13183-part-8-of-11-simple-assembly-for-atari-basic/ Part 9 - Memory Copy http://atariage.com/forums/blog/576/entry-13184-part-9-of-11-simple-assembly-for-atari-basic/ Part 10 - Binary File I/O Part 1 (XIO is Broken) http://atariage.com/forums/blog/576/entry-13185-part-10-of-11-simple-assembly-for-atari-basic/ Part 11 - Binary File I/O Part 2 (XIO is Broken) http://atariage.com/forums/blog/576/entry-13186-part-11-simple-assembly-for-atari-basic-the-end/ ============================================================== OSS BASIC XL includes the Hex$() function that converts an integer value to a string of hexadecimal digits. That would be a useful accessory to the bit manipulation test program, since byte values are easier to visualize in hexadecimal. The integer to hexadecimal string conversion sounds more simple than it is. An integer made of low byte value, $12, and high byte value, $34, exists in memory in the order: $12, $34. However, the hexadecimal text representation is in reverse order with high byte first, “3412”. Furthermore, the text representation is four characters (bytes) as “3”, “4”, “1”, “2”. This means the two bytes of the integer must be separated into individual nybble values and reorganized in the string order. Next, the actual binary values of each nybble (0 to 15) must be converted into a text character. The ASCII/ATASCII characters “0” through “9” are not contiguous with the characters “A” through “F”. A look-up table of 16 text characters would be the most simple and direct method, but that would not be relocatable. So, a comparison/computation method is used, and discussed below: INT2HEX in Mac/65 Assembler Code 0100 ; INT2HEX.M65 0105 ; 0110 ; Convert 16-bit integer into 0115 ; hex string. 0120 ; 0125 ; INT2HEX USR 2 arguments: 0130 ; Value == Integer to convert. 0135 ; StrAdr == Address of string 0140 ; which must be able 0145 ; to hold 4 characters 0150 ; 0155 ; USR return value 0 means no 0160 ; conversion. Non-Zero means 0165 ; STRADR contains hex string. 0170 ; 0175 ; Use the FR0/FR1 FP register. 0180 ; The return value for BASIC 0185 ; goes in FR0. 0190 ; No FP is used so all of FR0 0195 ; (and more FP registers) can 0200 ; be considered available. 0205 ; 0210 ZRET = $D4 ; FR0 $D4/$D5 Return value 0215 ZARGS = $D5 ; $D6-1 for arg Pulldown loop 0220 ZSTR = $D6 ; FR0 $D6/$D7 STRADR 0225 ZVAL = $D8 ; FR0 $D8/$D9 Integer value 0230 ; 0235 .OPT OBJ 0240 ; 0245 ; Arbitrary. This is relocatable. 0250 ; 0255 *= $9400 0260 ; 0265 INIT 0270 LDA #$00 ; Make sure return 0275 STA ZRET ; value is cleared 0280 STA ZRET+1 ; by default. 0285 PLA ; Get argument count 0290 BEQ EXIT ; Shortcut for no args 0295 ASL A ; Now number of bytes 0300 TAY 0305 CMP #$04 ; Integer Value1, StrAdr 0310 BEQ PULLDOWN 0315 ; 0320 ; Bad args. Clean up for exit. 0325 ; 0330 DISPOSE ; any number of args 0335 PLA 0340 DEY 0345 BNE DISPOSE 0350 RTS ; Abandon ship 0355 ; 0360 ; This code works the same 0365 ; for 1, 4, 8 ... arguments. 0370 ; 0375 PULLDOWN 0380 PLA 0385 STA ZARGS,Y 0390 DEY 0395 BNE PULLDOWN 0400 ; 0405 ; Arg validation. 0410 ; StrAdr may not be null. 0415 ; 0420 LDA ZSTR 0425 ORA ZSTR+1 0430 BEQ EXIT ; zstr is null 0435 ; 0440 CLD 0445 ; 0450 ; Split Integer Value into 0455 ; nybbles and temporarily store 0460 ; in the String output... 0465 ; 0470 LDX #$01 ; X index bytes. 0475 ; Y is already 0 0480 ; Y index string. 0485 ; 0490 SPLIT_BYTES 0495 LDA ZVAL,X ; Byte 0500 ; 0505 ; Right shift 4 to keep 0510 ; the high nybble. 0515 LSR A 0520 LSR A 0525 LSR A 0530 LSR A 0535 STA (ZSTR),Y ; Save for later 0540 ; 0545 ; Now, do the low nybble 0550 LDA ZVAL,X ; Byte again 0555 AND #$0F ; low nybble 0560 INY ; Next char in string 0565 STA (ZSTR),Y ; Save for later 0570 ; 0575 INY ; Next char in string 0580 DEX ; Next integer byte 0585 BPL SPLIT_BYTES 0590 ; 0595 ; Next, convert the nybbles 0600 ; saved in the string into the 0605 ; final ASCII form. 0610 ; 0615 DEY ; Correct string index. 0620 BYTE2HEX 0625 LDA (ZSTR),Y 0630 CMP #$0A ; 10 or greater? 0635 BCC ADD_48 ; No, 0 to 9. 0640 ; 0645 ADC #$06 ; "A"-"0"-$0A-Carry 0650 ADD_48 0655 ADC #$30 0660 STA (ZSTR),Y 0665 DEY ; 3, 2, 1, 0 will continue 0670 BPL BYTE2HEX ; -1 ends loop 0675 ; 0680 INC ZRET ; Successful return 0685 EXIT 0690 RTS 0695 ; 0700 .END There is a new bit of code in the initialization: 0405 ; Arg validation. 0410 ; StrAdr may not be null. 0415 ; 0420 LDA ZSTR 0425 ORA ZSTR+1 0430 BEQ EXIT ; zstr is null 0435 ; 0440 CLD This shows a short way to compare an address (or integer) to NULL/zero. It simply OR's the low and high bytes together. Then if any bit is set it means the address is not NULL. Any non-zero value is considered legitimate (which is not a purely correct assumption, but reasonably good enough for this exercise.) The long way to check the string address would be to load low byte, compare to zero. If it is not zero, then the value is valid and so branch to the code to continue the routine. If it is zero, then load the high byte, compare to zero, and take the successful branch for non-zero and exit the routine if it is zero. That would take six instructions, handily duplicated by the three here. Full validation (not done here) would mean a lot more code making sure the value is a valid address for a BASIC string, or otherwise not anywhere near low memory and not in the ROM area. Finally, this code turns off BCD mode (CLD) because it will use Add instructions on binary values later. The conversion is separated into two activities: First is separating the bytes into nybbles and placing them in the correct order. The second phase is converting the nybbles into the corresponding ASCII/ATASCII characters. The code could be done in just one loop, but that would mean duplicating the nybble to text conversion code twice in the loop. (And that idea could be implemented more efficiently as a subroutine called by JSR, but then the code would not be relocatable.) The first part of the conversion: 0490 SPLIT_BYTES 0495 LDA ZVAL,X ; Byte 0500 ; 0505 ; Right shift 4 to keep 0510 ; the high nybble. 0515 LSR A 0520 LSR A 0525 LSR A 0530 LSR A 0535 STA (ZSTR),Y ; Save for later 0540 ; 0545 ; Now, do the low nybble 0550 LDA ZVAL,X ; Byte again 0555 AND #$0F ; low nybble 0560 INY ; Next char in string 0565 STA (ZSTR),Y ; Save for later 0570 ; 0575 INY ; Next char in string 0580 DEX ; Next integer byte 0585 BPL SPLIT_BYTES There are two loops happening here. One loop, indexed by X, counts in reverse, 1 to 0, from the high byte to the low byte of the integer. Within that loop is the activity to separate the two nybbles in the byte. Mixed in this loop is another loop, indexed by Y, counting from 0 to 3 to index each character position of the string. After the routine liberates the nybbles from their byte it stores the nybbles in their respective positions in the string. The Y index is thus incremented twice (two characters) for each decrement (one byte) of the X loop. The end result is a “string” containing the four, binary nybble values each in a separate “character”. The binary values are not human readable, so the routine must convert the binary values to corresponding ASCII/ATASCII characters: 0620 BYTE2HEX 0625 LDA (ZSTR),Y 0630 CMP #$0A ; 10 or greater? 0635 BCC ADD_48 ; No, 0 to 9. 0640 ; 0645 ADC #$06 ; "A"-"0"-$0A-Carry 0650 ADD_48 0655 ADC #$30 0660 STA (ZSTR),Y 0665 DEY ; 3, 2, 1, 0 will continue 0670 BPL BYTE2HEX ; -1 ends loop This second part of the conversion code loops though the string in reverse converting each byte value into the corresponding ASCII/ATASCII value. The obvious method to do this would be a lookup table that translates the 16 possible values into the corresponding character. However, a lookup table is not easily relocatable, so this version does the conversion by value comparisons and math. Here is the problem laid out in one table. The math must convert one series of values (“Values”) into another series of values (“Text Values”) that will print as text characters. Values ASCII Text Text Values Difference $00 “0” $30 $30 $01 “1” $31 $30 $02 “2” $32 $30 $03 “3” $33 $30 $04 “4” $34 $30 $05 “5” $35 $30 $06 “6” $36 $30 $07 “7” $37 $30 $08 “8” $38 $30 $09 “9” $39 $30 $0A “A” $41 $37 $0B “B” $42 $37 $0C “C” $43 $37 $0D “D” $44 $37 $0E “E” $45 $37 $0F “F” $46 $37 This tells us a few facts. The original series (“Values”) breaks down to two destination series with different offsets, $30 and $37, and that the value of the offset increases rather than decreases ($30 < $37) with each series. Since the $A to $F text values are after the $0 to $9 values, then only addition is needed to convert the binary “Values” series into the “Text Values” series. So, the code merely needs to determine whether the value is in the first series or the second series and then add the difference accordingly. However, to squeeze code size a small bit of cleverness is added that capitalizes on the relationship between the offsets for each series. At each position the code tests to determine if the value is in the $0 to $9 range or the $A to $F range. Values $0 to $9 result in a branch to code that adds $30 to the value, converting binary values $0 to $9 to ASCII/ATASCII values “0” to “9” (or $30 to $39). That branch bypasses other code below for handling values $A to $F. The conversion for values $A to $F is in two parts – first, the code adds an offset. On first glance at the table above this offset should be the difference of $37 - $30 or $7. The first two conditions below do result in the $07 offset. But, an easily overlooked condition in the code is the carry bit acquired by the comparison. So, the offset value is decremented to $6 to compensate for the carry bit: 1. the difference between the “A” and “0” characters ($41 - $30 = $11) and then 2. it subtracts the integer value of the start of the $A to $F range ($11 - $A == $7) and then 3. it removes the Carry bit that is acquired by the comparison operation ($7 - $1 == $6). After adding the offset the execution path falls into the same section used for $0 to $9 which adds $30 to the value. So, for binary value $A the end result is $A + $6 + Carry + $30 which is $41 or ASCII/ATASCII “A”. The entire working code is 15 bytes long. The actual code using a lookup table to convert binary to ASCII would be much shorter (and faster), but still require an additional 16 bytes of supporting data for the translation table. Since BASIC can pass the address of the string data, not not the control information of the string, the machine language routine has no way of knowing the size of the string – either the DIM'ensioned size or the actual string length. Therefore the machine language code can neither limit itself to the maximum string length nor change the string's current length while populating the text value. A BASIC program using the results of the conversion must insure that it sets the real length of the string prior to calling the conversion function. This is simple – the BASIC program need only assign a value to the string that is four characters long prior to using the machine language routine. Such as: 130 DIM A$(4) 140 A$=" ":REM FOUR SPACES The conversion routine overwrites the contents of the string replacing the blank spaces with the hexadecimal text string. The BASIC program can then safely refer to the string contents, like this: 150 RH=USR(INT2HEX,4660,ADR(A$)) 160 ? 4660;"(dec) = $";A$ 170 ? "Low Byte = $";A$(3,4) 180 ? "High Byte = $";A$(1,2) which results in this output: 4660(dec) = $1234 Low Byte = $34 High Byte = $12 Below are the source files and examples of how to load the machine language routine into BASIC included in the disk image and archive: INT2HEX File List: INT2HEX.M65 Saved Mac/65 source INT2HEX.L65 Mac/65 source listing INT2HEX.T65 Mac/65 source listed to H6: (linux) INT2HEX.ASM Mac/65 assembly listing INT2HEX.TSM Mac/65 assembly listing to H6: (linux) INT2HEX.OBJ Mac/65 assembled machine language program (with load segments) INT2HEX.BIN Assembled machine language program without load segments INT2HEX.LIS LISTed DATA statements for INT2HEX.BIN routine. INT2HEX.TLS LISTed DATA statements for INT2HEX.BIN routine to H6: (linux) MAKEI2H.BAS BASIC program to create the INT2HEX.BIN file. This also contains the INT2HEX routine in DATA statements. MAKEI2H.LIS LISTed version of MAKEI2H.BAS MAKEI2H.TLS LISTed version of MAKEI2H.BAS to H6: (linux) TESTI2H.BAS BASIC program that tests the INT2HEX USR() routines. TESTI2H.LIS LISTed version of TESTI2H.BAS. TESTI2H.TLS LISTed version of TESTI2H.BAS to H6: (linux) But, let's say that you're really so lazy that its still too much effort for you to visualize the bits in each hex value. The solution to that problem is the next routine that converts a 16-bit integer into a string of 16 characters where each character represents a bit value, 0 or 1. ZIP archive of files: Convert_Disk.zip Tar archive of files (remove the .zip after download) Convert_Disk.tgz.zip Do not be anxious about anything, but in everything by prayer and supplication with thanksgiving let your requests be made known to God. And the peace of God, which surpasses all understanding, will guard your hearts and your minds in Christ Jesus. Philippians 4:6-7
  22. Bit Operations ============================================================== Part 1 - Introduction http://atariage.com/forums/blog/576/entry-13175-part-1-of-11-simple-assembly-for-atari-basic/ Part 2 - Learn 82.7% of Assembly Language in About Three Pages http://atariage.com/forums/blog/576/entry-13176-part-2-of-11-simple-assembly-for-atari-basic/ Part 3 - The World Inside a USR() Routine http://atariage.com/forums/blog/576/entry-13177-part-3-of-11-simple-assembly-for-atari-basic/ Part 4 - Implement DPEEK() http://atariage.com/forums/blog/576/entry-13178-part-4-of-11-simple-assembly-for-atari-basic/ Part 5 - Implement DPOKE http://atariage.com/forums/blog/576/entry-13180-part-5-of-11-simple-assembly-for-atari-basic/ Part 6 - Various Bit Manipulations http://atariage.com/forums/blog/576/entry-13181-part-6-of-11-simple-assembly-for-atari-basic/ Part 7 - Convert Integer to Hex String http://atariage.com/forums/blog/576/entry-13182-part-7-of-11-simple-assembly-for-atari-basic/ Part 8 - Convert Integer to Bit String http://atariage.com/forums/blog/576/entry-13183-part-8-of-11-simple-assembly-for-atari-basic/ Part 9 - Memory Copy http://atariage.com/forums/blog/576/entry-13184-part-9-of-11-simple-assembly-for-atari-basic/ Part 10 - Binary File I/O Part 1 (XIO is Broken) http://atariage.com/forums/blog/576/entry-13185-part-10-of-11-simple-assembly-for-atari-basic/ Part 11 - Binary File I/O Part 2 (XIO is Broken) http://atariage.com/forums/blog/576/entry-13186-part-11-simple-assembly-for-atari-basic-the-end/ ============================================================== The fun and games in programming for the Atari environment often requires manipulating hardware registers. Many features are enabled and disabled by individual bits in a byte. Additionally, the data used for many graphics features in the Atari 8-bit environment makes more sense when dealt with at the bit level. For instance, a character on the Atari's normal text screen (ANTIC Mode 2) can be flipped between inverse video and normal video by switching the high bit in the character byte on and off. The same bit in ANTIC modes 4 and 5 chooses between COLPF2 or COLPF3 color for certain bit patterns in the character data. The text color in ANTIC modes 6 and 7 is controlled by manipulating the two highest bits of the character byte. Pixels in a map mode are specified by single bits, pairs of bits, or groups of four bits. Bit-wise operations, simple in 6502 machine code, are painful and very slow in BASIC. Isolating a byte's individual bits in BASIC code is a horrible sight to behold. This is nothing like the two-byte DPeek and DPoke that BASIC can duplicate (slowly) with a multiply or divide. Bit work in BASIC requires repeated value testing and computation to identify which bits are set and which are clear. A simple example of the terror is presented here: 100 REM DISSECT BITS IN 16-BIT WORD 105 REM SHOWBITS.BAS 110 REM 115 WORD=35235:REM $89A3 120 BVAL=32768:REM $8000 125 ? "WORD = ";WORD 130 ? "BITS ="; 135 FOR BIT=0 TO 15 140 IF INT(BIT/4)=BIT/4 THEN ? " "; 145 IF WORD>=BVAL THEN ? "1";:WORD=WORD-BVAL:GOTO 155 150 ? "0"; 155 BVAL=BVAL/2 160 NEXT BIT 165 ? 170 END The code starts with the value of the highest (that is, 16th) bit of a word. If the test value is greater than or equal to the bit value then the bit is set. If not, then the bit is 0. Then the value of the bit position is divided by 2 to get the value of the next position. This evaluation and test action loops 16 times until all the bits are evaluated. One optional extra is inserted – before every four bits it outputs a space to separate the bits into groups corresponding to nybbles (half bytes). In terms of code this is about as simple as it gets. The routine could be made faster by packaging the bit values in an array and testing from the array. But the same problem remains: BASIC is looping and performing multiple operations in each loop. In this simple example it is scanning one 16-bit integer. Implementing useful bit operations requires dissecting two 16-bit integers and assembling output in another 16-bit integer. We really don't want to go there in BASIC. In defense of Atari BASIC, though it lacks bit operations, so do most other BASIC languages, because the original purpose of BASIC is to protect beginner programmers from the hardware. But, we're working on an Atari here and want to embrace the hardware. OSS BASIC XL provides several operator symbols for actions on bits: & == Bit-wise AND two 16-bit values ! == Bit-wise OR two 16-bit values % == Bit-wise EOR (Exclusive OR) two 16-bit values The 6502 supports these operations and also supports other bit manipulations that BASIC XL (and other more modern BASICs) do not support. Shifting bits and rotating bits in a byte are simple in the 6502. These could be interesting in a utility for BASIC. So, we will plan for machine language routines that do bitwise AND, OR, EOR operations and also support left and right shift, and left and right rotate. Since the USR() environment automatically provides 16-bit argument values to the machine language code a choice needs to be made: implement the routines to work on 16-bit values or just a single byte. In the case of AND, OR, and EOR there's little difference between supporting a byte or 16-bit operation. If the supplied argument values are only 8-bits (with 0 as the high byte) then the resulting computation will also appear to be 8-bits. Rotating and Shifting bits is a different situation. The results of shifting and rotating an 8-bit value is different from the same action on a 16-bit value. In most situations the Atari environment uses 8-bits as data (character sets, map graphics, player/missile data), so these bit operations are more likely to be useful on just a byte. Below is the list of operations to design. Each operation has two values, an operator, and a return value: Result == 16-bit value AND 16-bit value Result == 16-bit value OR 16-bit value Result == 16-bit value EOR 16-bit value Result == 8-bit value RIGHT SHIFT number of bits Result == 8 bit value LEFT SHIFT number of bits Result == 8-bit value RIGHT ROTATE number of bits Result == 8-bit value LEFT ROTATE number of bits Given the earlier Dpeek and Dpoke examples most readers are probably not looking forward to the tedious repetition of the argument setup and validation code for seven similar, separate routines. Nothing like that will happen. Instead, all the operations can be combined into one utility. This is simple (and sensible) to do, because all these operations use the same number of arguments and all return a value to BASIC. Since BASIC converts all arguments to 16-bit values, the operations that work on 8-bit values will use only the low byte of the value and ignore the high byte. The reader will be relieved to learn there will be just one instance of the initialization code for managing the stack and arguments. This is where the perceived overkill factor of the generic initialization code pays off. The next problem is how to choose one of seven different operations in one machine language utility. There are always several ways to solve a problem. One possibility is that each routine will have its own entry point relative to the start. Each bit operation routine would have to call the initialization and then somehow find its way back to the proper bit operation code. This has the problem that it is difficult to share the initialization code between all the operations and keep the routines relocatable. Simple relative branching keeps the code relocatable, but using JSR (Jump To Subroutine) to call the initialization code or the actual routines makes the code non-relocatable without a heap of other work. Another possibility is that the machine language routine uses the value identifying the bit operation as the basis for branching to the specific routine. This has more promise. It means the machine language code will test the argument for each bit operation identifier and then branch accordingly. A table of addresses for JMP or JSR would be faster, but it would not be easily relocatable. Keeping the code relocatable requires the entry for all routines fall within branching range of the decision making code. Generally speaking, the maximum distance of a branch is plus or minus about 127 bytes. The assembler is always more than happy to tell the programmer when target code is out of range of a branch. These bit-wise features are simple concepts for 6502 machine language, so the routines will not be large, but even if they were, there are ways around the problem of the half-page branch distance. BITS in Mac/65 Assembler Code 1000 ; BITS.M65 1005 ; 1010 ; Perform bit level operations 1015 ; for Atari BASIC. 1020 ; 1025 ; USR 3 arguments: 1030 ; Oper == Operation (1,2,...7) 1035 ; Val1 == First value. 1040 ; Val2 == Second Value. 1045 ; 1050 ; Operations: 1055 ; 1 = 16-bit Val1 OR 16-bit Val2 1060 ; 2 = 16-bit Val1 AND 16-bit Val2 1065 ; 3 = 16-bit Val1 EOR 16-bit Val2 1070 ; 4 = 8-bit Val1 LSR 8-bit num bits Val2 1075 ; 5 = 8-bit Val1 LSL 8-bit num bits Val2 1080 ; 6 = 8-bit Val1 ROR 8-bit num bits Val2 1085 ; 7 = 8-bit Val1 ROL 8-bit num bits Val2 1090 ; 1095 ; USR return value is the result. 1100 ; 1105 ; Use the FR0/FR1 FP register. 1110 ; The return value for BASIC 1115 ; goes in FR0. 1120 ; No FP is used so all of FR0 1125 ; (and more FP registers) can 1130 ; be considered available. 1135 ; 1140 ZRET = $D4 ; FR0 $D4/$D5 Return value 1145 ZARGS = $D5 ; $D6-1 for arg Pulldown loop 1150 ZVAL2 = $D6 ; FR0 $D6/$D7 Value 1155 ZVAL1 = $D8 ; FR0 $D8/$D9 Value 1160 ZOPER = $DA ; FR1 $DA/$DB Operation 1165 ; 1170 ; Define operations1175 ; 1180 OPER_OR = $01 1185 OPER_AND = $02 1190 OPER_EOR = $03 1195 OPER_LSR = $04 1200 OPER_LSL = $05 1205 OPER_ROR = $06 1210 OPER_ROL = $07 1215 ; 1220 .OPT OBJ 1225 ; 1230 ; Arbitrary. This is relocatable. 1235 ; 1240 *= $9500 1245 ; 1250 INIT 1255 LDA #$00 ; Make sure return 1260 STA ZRET ; value is cleared 1265 STA ZRET+1 ; by default. 1270 PLA ; Get argument count 1275 TAY 1280 BEQ EXIT ; Shortcut for no args 1285 ASL A ; Now number of bytes 1290 TAY 1295 CMP #$06 ; Value1, Value2, Oper 1300 BEQ PULLDOWN 1305 ; 1310 ; Bad args. Clean up for exit. 1315 ; 1320 DISPOSE ; any number of args 1325 PLA 1330 DEY 1335 BNE DISPOSE 1340 RTS ; Abandon ship 1345 ; 1350 ; This code works the same 1355 ; for 1, 4, 8 ... arguments. 1360 ; 1365 PULLDOWN 1370 PLA 1375 STA ZARGS,Y 1380 DEY 1385 BNE PULLDOWN 1390 ; 1395 ; Like a Switch/Case 1400 ; 1405 LDY ZOPER 1410 BEQ EXIT ; Zero operator 1415 ; 1420 DEY ; #$01 OR 1425 BEQ DO_OR 1430 ; 1435 DEY ; #$02 AND 1440 BEQ DO_AND 1445 ; 1450 DEY ; #$03 EOR 1455 BEQ DO_EOR 1460 ; 1465 DEY ; #$04 LSR 1470 BEQ DO_LSR 1475 ; 1480 DEY ; #$05 LSL 1485 BEQ DO_LSL 1490 ; 1495 DEY ; #$06 ROR 1500 BEQ DO_ROR 1505 ; 1510 DEY ; #$07 ROL 1515 BEQ DO_ROL 1520 ; 1525 EXIT 1530 RTS ; bye. 1535 ; 1540 ; 1 = 16-bit Val1 OR 16-bit Val2 1545 DO_OR 1550 LDA ZVAL1 1555 ORA ZVAL2 1560 STA ZRET 1565 LDA ZVAL1+1 1570 ORA ZVAL2+1 1575 STA ZRET+1 1580 RTS 1585 ; 1590 ; 2 = 16-bit Val1 AND 16-bit Val2 1595 DO_AND 1600 LDA ZVAL1 1605 AND ZVAL2 1610 STA ZRET 1615 LDA ZVAL1+1 1620 AND ZVAL2+1 1625 STA ZRET+1 1630 RTS 1635 ; 1640 ; 3 = 16-bit Val1 EOR 16-bit Val2 1645 DO_EOR 1650 LDA ZVAL1 1655 EOR ZVAL2 1660 STA ZRET 1665 LDA ZVAL1+1 1670 EOR ZVAL2+1 1675 STA ZRET+1 1680 RTS 1685 ; 1690 ; 4 = 8-bit Val1 LSR 8-bit num bits Val2 1695 DO_LSR 1700 LDA ZVAL1 1705 STA ZRET 1710 LDX ZVAL2 1715 BEQ EXIT 1720 LSR_LOOP 1725 LSR A 1730 DEX 1735 BNE LSR_LOOP 1740 STA ZRET 1745 RTS 1750 ; 1755 ; 5 = 8-bit Val1 LSL 8-bit num bits Val2 1760 DO_LSL 1765 LDA ZVAL1 1770 STA ZRET 1775 LDX ZVAL2 1780 BEQ EXIT 1785 LSL_LOOP 1790 ASL A 1795 DEX 1800 BNE LSL_LOOP 1805 STA ZRET 1810 RTS 1815 ; 1820 ; 6 = 8-bit Val1 ROR 8-bit num bits Val2 1825 DO_ROR 1830 LDA ZVAL1 1835 STA ZRET 1840 LDX ZVAL2 1845 BEQ EXIT 1850 ROR_LOOP 1855 CLC 1860 ROR A 1865 BCC OVER_ROR_INC 1870 ORA #$80 1875 OVER_ROR_INC 1880 DEX 1885 BNE ROR_LOOP 1890 STA ZRET 1895 RTS 1900 ; 1905 ; 7 = 8-bit Val1 ROL 8-bit num bits Val2 1910 DO_ROL 1915 LDA ZVAL1 1920 STA ZRET 1925 LDX ZVAL2 1930 BEQ EXIT 1935 ROL_LOOP 1940 CLC 1945 ROL A 1950 BCC OVER_ROL_INC 1955 ORA #$01 1960 OVER_ROL_INC 1965 DEX 1970 BNE ROL_LOOP 1975 STA ZRET 1980 RTS 1985 ; 1990 .END Now for the take-apart. The common initialization has these extra lines of code: 1255 LDA #$00 ; Make sure return 1260 STA ZRET ; value is cleared 1265 STA ZRET+1 ; by default. The program starts by clearing the response data. Since early exit may occur for different reasons in different places of the code, it makes sense to do this once rather than in several different places. When the code finds an error it can just return (RTS) to BASIC. There is nothing new with the DISPOSE and PULLDOWN loops – they are the same as prior examples. The next section is a simple switch/case-like decision blocks to identify which operator to use: 1395 ; Like a Switch/Case 1400 ; 1405 LDY ZOPER 1410 BEQ EXIT ; Zero operator 1415 ; 1420 DEY ; #$01 OR 1425 BEQ DO_OR 1430 ; 1435 DEY ; #$02 AND 1440 BEQ DO_AND . . . 1510 DEY ; #$07 ROL 1515 BEQ DO_ROL Zero is not a valid operation identifier, so that can be discarded quickly. Ordinarily, testing a list of values would look something like this which requires four bytes for each test: CPY #$01 BEQ DO_OR Since operator identifiers are sequential beginning from 1 the code can use a shortcut – it decrements the operator identifier and branches when reaching zero to the appropriate routine. This is still two instructions, but only three bytes (for a total of 21 bytes rather than 28 bytes to test 7 values). The OR, AND, and EOR routines are similar: 1540 ; 1 = 16-bit Val1 OR 16-bit Val2 1545 DO_OR 1550 LDA ZVAL1 1555 ORA ZVAL2 ; <- OR 1560 STA ZRET 1565 LDA ZVAL1+1 1570 ORA ZVAL2+1 ; <- OR 1575 STA ZRET+1 1580 RTS The only difference between each routine is the actual 6502 operation (ORA, AND, EOR) combining Value 1 and Value 2 which it then outputs to the return value for BASIC. The shift routines must loop since the 6502 shift instructions move the data by only one bit: 1690 ; 4 = 8-bit Val1 LSR 8-bit num bits Val2 1695 DO_LSR 1700 LDA ZVAL1 1705 STA ZRET 1710 LDX ZVAL2 1715 BEQ EXIT 1720 LSR_LOOP 1725 LSR A ; <- Can only move bits one position at a time 1730 DEX 1735 BNE LSR_LOOP 1740 STA ZRET 1745 RTS Each routine loops to shift only the low byte of Value 1 by the number of bits in Value 2 with the result output in the low byte of the return value for BASIC. Since the initialization cleared the entire return value, these routines do not need to worry about clearing the return value's high byte. The bit rotation routines: 1820 ; 6 = 8-bit Val1 ROR 8-bit num bits Val2 1825 DO_ROR 1830 LDA ZVAL1 1835 STA ZRET 1840 LDX ZVAL2 1845 BEQ EXIT 1850 ROR_LOOP 1855 CLC 1860 ROR A 1865 BCC OVER_ROR_INC 1870 ORA #$80 1875 OVER_ROR_INC 1880 DEX 1885 BNE ROR_LOOP 1890 STA ZRET 1895 RTS This is a little more complicated. The 6502 bit rotations can be thought of as operations using nine bits, not eight. The Carry bit does double duty. It provides the source bit value to move into the byte and then accepts the value of the bit that was rotated out of the byte. The problem here is that the bit moving out of the byte has to immediately be moved back into the other end of the byte. How the code solves this: it forces the Carry bit to zero (CLC) insuring a zero bit always rotates into the byte. After the rotation the code checks the bit that rotated out of the byte (in Carry). If the Carry bit is set then the code turns on the bit that should have rotated into the other end of the byte (here, ORA #$80). Testing BITS The Atari BASIC program below, TESTBITS.BAS, demonstrates the routines: 100 REM TEST BIT OPERATIONS UTILITY 105 REM 110 GRAPHICS 0:POKE 710,0:POKE 82,0 115 DIM B(3,1),N$(21) 120 GOSUB 10000:REM BITS UTILITY 125 RESTORE 155:REM BIT PATTERNS 130 FOR X=0 TO 1 135 FOR Y=0 TO 3 140 READ D:B(Y,X)=D 145 NEXT Y 150 NEXT X 155 DATA 0,257,0,257,0,0,258,258 160 REM ENUMERATE BIT OPERATIONS 165 READ BOR,BAND,BEOR,BLSR,BLSL,BROR,BROL 170 DATA 1,2,3,4,5,6,7 175 N$="OR ANDEORLSRLSLRORROL" 180 REM 185 REM TEST OR, AND, EOR 190 REM 195 FOR OPER=BOR TO BEOR 200 FOR Y=0 TO 3 205 V=USR(BITS,OPER,B(Y,0),B(Y,1)) 210 ? B(Y,0);" "; 215 ? N$(OPER*3-2,OPER*3);" "; 220 ? B(Y,1);" = ";V 225 NEXT Y 230 ? 235 NEXT OPER 240 REM 245 REM TEST SHIFT AND ROTATE 250 REM 255 V=129:REM $81 260 FOR OPER=BLSR TO BROL 265 FOR Y=0 TO 8 270 W=USR(BITS,OPER,V,Y) 275 ? V;" "; 280 ? N$(OPER*3-2,OPER*3);" "; 285 ? Y;" = ";W 290 NEXT Y 295 ? 300 NEXT OPER 305 END 9997 REM 9998 REM SETUP BITS ML UTILITY 9999 REM 10000 DIM BT$(162) 10001 BITS=ADR(BT$) 10002 RESTORE 27000 10003 FOR I=0 TO 161 10004 READ D:POKE BITS+I,D 10005 NEXT I 10006 RETURN 26996 REM H1:BITS.OBJ 26997 REM Size = 162 26998 REM Start = 38144 26999 REM End = 38305 27000 DATA 169,0,133,212,133,213,104,240 27001 DATA 43,10,168,201,6,240,5,104 27002 DATA 136,208,252,96,104,153,213,0 27003 DATA 136,208,249,164,218,240,21,136 27004 DATA 240,19,136,240,29,136,240,39 27005 DATA 136,240,49,136,240,61,136,240 27006 DATA 73,136,240,90,96,165,216,5 27007 DATA 214,133,212,165,217,5,215,133 27008 DATA 213,96,165,216,37,214,133,212 27009 DATA 165,217,37,215,133,213,96,165 27010 DATA 216,69,214,133,212,165,217,69 27011 DATA 215,133,213,96,165,216,133,212 27012 DATA 166,214,240,208,74,202,208,252 27013 DATA 133,212,96,165,216,133,212,166 27014 DATA 214,240,193,10,202,208,252,133 27015 DATA 212,96,165,216,133,212,166,214 27016 DATA 240,178,24,106,144,2,9,128 27017 DATA 202,208,247,133,212,96,165,216 27018 DATA 133,212,166,214,240,158,24,42 27019 DATA 144,2,9,1,202,208,247,133 27020 DATA 212,96 The program starts by building a table of bit combinations for testing OR, AND, and EOR. The non-zero decimal values correspond to integers with one bit set in the high byte, and a bit set in the low byte. However the low byte values are different bits. This helps demonstrate that the bit operations are working on both the high bytes and low bytes, and that the bits are combined as expected by the operation. The code loops through the OR, AND, and EOR operations, and for each operation loops through the table of bits displaying the results of the operations. The next section loops through the shift and rotate operations and for each operation it performs zero through 8 bit shifts displaying the results. Test program output: 0 OR 0 = 0 257 OR 0 = 257 0 OR 258 = 258 257 OR 258 = 259 0 AND 0 = 0 257 AND 0 = 0 0 AND 258 = 0 257 AND 258 = 256 0 EOR 0 = 0 257 EOR 0 = 257 0 EOR 258 = 258 257 EOR 258 = 3 129 LSR 0 = 129 129 LSR 1 = 64 129 LSR 2 = 32 129 LSR 3 = 16 129 LSR 4 = 8 129 LSR 5 = 4 129 LSR 6 = 2 129 LSR 7 = 1 129 LSR 8 = 0 129 LSL 0 = 129 129 LSL 1 = 2 129 LSL 2 = 4 129 LSL 3 = 8 129 LSL 4 = 16 129 LSL 5 = 32 129 LSL 6 = 64 129 LSL 7 = 128 129 LSL 8 = 0 129 ROR 0 = 129 129 ROR 1 = 192 129 ROR 2 = 96 129 ROR 3 = 48 129 ROR 4 = 24 129 ROR 5 = 12 129 ROR 6 = 6 129 ROR 7 = 3 129 ROR 8 = 129 129 ROL 0 = 129 129 ROL 1 = 3 129 ROL 2 = 6 129 ROL 3 = 12 129 ROL 4 = 24 129 ROL 5 = 48 129 ROL 6 = 96 129 ROL 7 = 192 129 ROL 8 = 129 That shows the operations are working as expected. That is, assuming one is willing to sit and visualize the bit patterns corresponding to each decimal value. For these purposes the output is less than ideal. Atari BASIC prints numbers as decimals. There is no built-in option to display bytes and integer values in ways more meaningful for 8-bit computer programming. There must be a better way… (Stay tuned for the next episode.) Below are the source files and examples of how to load the machine language routine into BASIC included in the disk image and archive: BITS File List: BITS.M65 Saved Mac/65 source BITS.L65 Mac/65 source listing BITS.T65 Mac/65 source listed to H6: (linux) BITS.ASM Mac/65 assembly listing BITS.TSM Mac/65 assembly listing to H6: (linux) BITS.OBJ Mac/65 assembled machine language program (with load segments) BITS.BIN Assembled machine language program without load segments BITS.LIS LISTed DATA statements for BITS.BIN routine. BITS.TLS LISTed DATA statements for BITS.BIN routine to H6: (linux) MAKEBITS.BAS BASIC program to create the BITS.BIN file. This also contains the BITS routine in DATA statements. MAKEBITS.LIS LISTed version of MAKEBITS.BAS MAKEBITS.TLS LISTed version of MAKEBITS.BAS to H6: (linux) SHOWBITS.BAS Example BASIC program dissecting bits in a 16-bit integer. SHOWBITS.LIS LISTed version of SHOWBITS.BAS SHOWBITS.TLS LISTed version of SHOWBITS.BAS to H6: (linux) TESTBITS.BAS BASIC program that tests the BITS USR() routines. TESTBITS.LIS LISTed version of TESTBITS.BAS. TESTBITS.TLS LISTed version of TESTBITS.BAS to H6: (linux) ZIP archive of files: Bits_Disk.zip Tar archive of files (remove the .zip after download) Bits_Disk.tgz.zip For everyone who has been born of God overcomes the world. And this is the victory that has overcome the world—our faith. 1 John 5:4
  23. Hi, I have the following items for sale: Atari 8-bit Computer Tape Games* EURO 20 European Countries and Capitals (Atari) TIB EURO 7 Meltdown (Cosmi) TB EURO 40 Richard Petty's Rennzirkus (Ariolasoft) TIB EURO 40 Strätos (Adventure International) TB (incl. Xerox instructions) EURO 15 The E Factor (Cosmi) TIB EURO 20 Zaxxon (Datasoft) TB * For more pictures just scroll down to the update post Atari Memorabilia EURO 25 Atari T-Shirt Berzerk (Size S, unused) EURO 25 Atari T-Shirt Defender (Size S, unused) Activision Patches EURO 10 Chopper Command EURO 35 Decathlon Bronze Make an offer Decathlon Gold EURO 10 Dragster EURO 25 Freeway EURO 20 Kaboom! EURO 30 Megamania EURO 125 Pitfal 2 EURO 25 Pitfall! Make an offer Robot Tank Star of Honor EURO 25 Spider Fighter EURO 70 Tennis EURO 50 Stampede Belt All patches are original, no repros. Atari 2600 Original Releases - Atari 2600 Reproductions EURO 175.00 Good Luck, Charlie Brown! - CIB - NTSC Made by CPUWIZ; #22, shrinkwrapped EURO 45.00 Music Machine - CIB - NTSC - Reproduction; Made by CPUWIZ *** Pending ***Atari 2600 Stella gets a new Brain Original Release (serial number #012, signed manual, very good condition): EURO 130 Atari 7800 - Atari Lynx - Atari 8-bit Computer Disk Wargame Construction Set (SSI) - complete: EURO 15 Springer - Tigervision/NTSC - CIB: EURO 60 The Great American Cross-Country Road Race - Activision/NTSC - DIB: EURO 25 Gauntlet: The Deeper Dungeons Data Disk - Mindscape/NTSC - DIB: EURO 35 Infiltrator - Mindscape/NTSC - DIB: EURO 30 Pinball Construction Set - Electronic Arts/NTSC - DIB: EURO 15 One on One - Electronic Arts/NTSC - DIB: EURO 15 Atari Standees + Mobile All items are made of cardboard (no posters) and all are original. The shipping to the USA (EURO 37) is so expensive because of the individual sizes are too big to ship as a small parcel/letter. Megamania – Activision 2600 – Standee – 31 cm x 22 cm – US – good condition – EURO 175 Merchandise Contra III Promo Puzzle from 1992 (shrink-wraped, bent because of the foil): EURO 100 Intellivision - Intellivision Poster - More Pictures For more detailed pictures please check this Gallery Please check also my other sale listings: Atari 2600 Reproductions + Homebrews Atari 5200 Prototypes Shipping Information I am located in Germany. The shipping options are: - GERMANY Regular Parcel (EURO 7.50) - EU Regular Parcel (EURO 17.00) - USA/CANADA Airmail Parcel (EURO 37.00, runtime about 14 to 21 days, insured, tracking) or Airmail Letter option for USA & Canada: I can offer airmail letter in robust box for 2 regular-sized boxed Atari games/parcel for EURO 4/parcel (no tracking, no insurance, runtime about 5 to 7 days) *** Payment Information Payment by Paypal/EURO only. If you have any questions, please drop me a PM. Exchange rate is about 1.00 EURO -> 1.20 US$ Be sure to check this topic from time to time, I am adding games on a daily base. Thanks for watching, Marc.
  24. I know you can turn on or off the key click (POKE 731,0 or POKE 731,255), but I'm wondering if it's possible to generate the key click sound on command? Is there a bit of code to call from basic, or possibly a way in basic to generate the same or very similar noise? I don't remember my sound coding from back in the day or I'd probably be able to figure it out myself. I don't mind cheating by calling the existing key click routine
  25. Introduction Atari Jam is a Windows tool for developing Atari 8-bit computer software. The theoretical concept is that it is a PBI device that maps the memory, allowing an external device to monitor and change things in real-time. In practice, this is accomplished by attaching to an external emulator and accessing the RAM. The program gives the user a suite of tools to interactively modify, tweak, test and program software. It is not intended to be a replacement for a development IDE but rather to let the user experiment and rapidly develop small projects or pieces of something larger. It currently compatible with an Atari 800XL with 64K of RAM. Features Live memory viewer/editor Interactive disassembler Assembler Character editor Character map editor Player/missile editor Graphics control (GRACTL, DMACTL, GPRIOR) and color picker Display list editor Experimental video player (AVI) Vector control Notes The video player is very limited in the input it will accept. It uses a dither pattern that will be applied each frame, using the current palette. The user can adjust colors to find the best match. The program monitors GRACTL and PM registers through the addition of an OS patch that removes shadowing for the paddles. This patch slightly reduces the cycles used by the OS during a refresh. Hopefully, this is something people will find useful. I plan to have a version ready to try by March 1st.
×
×
  • Create New...