d8888 888 d88888 888 d88P888 888 d88P 888 888d888 .d8888b 8888b. .d88888 .d88b. d88P 888 888P" d88P" "88b d88" 888 d8P Y8b d88P 888 888 888 .d888888 888 888 88888888 d8888888888 888 Y88b. 888 888 Y88b 888 Y8b. d88P 888 888 "Y8888P "Y888888 "Y88888 "Y8888 8888888888 888 888 d8b 888 888 888 Y8P 888 888 888 8888888 88888b.d88b. 888 888 888 8888b. 888888 888 .d88b. 88888b. 888 888 "888 "88b 888 888 888 "88b 888 888 d88""88b 888 "88b 888 888 888 888 888 888 888 .d888888 888 888 888 888 888 888 888 888 888 888 Y88b 888 888 888 888 Y88b. 888 Y88..88P 888 888 8888888888 888 888 888 "Y88888 888 "Y888888 "Y888 888 "Y88P" 888 888 888 888 88888888888 888 888 888 888 888 888 8888888888 .d88b. 888 888 888 888 .d88b. 888 888 d88""88b 888 888 888 888 d88""88b 888 888 888 888 888 888 888 888888 888 888 888 888 888 Y88..88P Y88b 888 d88P 888 Y88..88P 888 888 "Y88P" "Y8888888P" 888 "Y88P" Version 0.25 Compiled by Michael Adcock email: adcock@menudo.uh.edu January 7, 1997 -------------------------------------------------------------------- Yb dP 8 w w dP"Yb Yb db dP 8d8b. .d88 w8ww ." d88b 8d8b. .d88b Yb db dP " d8 YbdPYbdP 8P Y8 8 8 8 `Yb. 8P Y8 8.dP' YbdPYbdP dP YP YP 8 8 `Y88 Y8P Y88P 8 8 `Y88P YP YP w -------------------------------------------------------------------- - Updated Q.2 - Added M.1, M.1.1, M.1.2, M.1.3, M.1.4 (Crazy Climber) - Updated M.5, M.5.2 and added M.5.8, M.5.11 (Sega System 16) - Added B.2, B.3.1, B.6, B.8, B.9, B.12, B.14 (Lot's of bits and things) - Added S.2, S.2.1, S.2.2, S.2.3, S.2.4 (Space Invaders step-by-step) - Updated R.1 (Emulator updates!) - Updated R.5 (Game listing updates!) -------------------------------------- 888b. 8 .8 8 8 8d8b 88b. .d8b. d88b .d88b 8wwP' 8b d8 8P 8 8 8' .8 `Yb. 8.dP' 8 `Y8P8 8 88P' `Y8P' Y88P `Y88P 8 -------------------------------------- This document is designed to aid anyone considering whether to write an emulator for an arcade game machine. It will attempt to answer frequently asked questions, give a step by step tutorial, and provide the resources necessary for a capable programmer to begin work on an emulator for an arcade game. Please note that although some of the information provided is generic enough to apply to emulation of any system, the primary focus of this document, and the resources provided, is arcade game emulation. This document contains no information about the commercial emulation packages that are available. If you have any information that should be added to this document, then please email adcock@menudo.uh.edu or moose@rocknet.net.au ! Table of Contents: Q and A ------- Q.0 Trying to write an arcade emulator is crazy, isn't it? Q.1 Which game would you recommend starting on? Q.1.1 Which games are 'easiest' to emulate? Q.1.2 Which games have the most available documentation? * Q.2 How do I START? Q.3 What language should I use? Q.3.1 Do I *have* to use Assembly? Q.3.1.1 Are you SURE about this Assembly business? :) Q.3.1.2 Doesn't the choice of language depend on the target game/system? Q.3.1.3 What about portability? Q.3.2 But haven't some arcade emulators been written in C/C++? Q.3.3 What about Java? Q.4 Could you explain CPU emulation? Q.4.1 CPU emulation sounds VERY complicated, how should I START? Q.4.1.1 Is the 68k series of processors 'easy' to emulate on PCs? Q.4.1.2 Why were only a handful of processors used in arcade games? Q.4.2 Should I use CPU emulation code that is freely available? Q.4.3 How do the CPU and ROMs interact? Q.4.4 How should I handle CPU opcodes? Q.4.5 What is Pokey? Q.4.6 What is Slapstic? Q.4.7 What about translation? Q.4.8 Is there anything else I should know about CPU emulation? Q.5 How useful are the switch settings and pinouts? Q.6 How do I produce a memory map? Q.7 How can I find what processor(s) the game uses? Q.7.1 Where can I find information for a specific processor? Q.8 Where might I find the ROMs? Q.8.1 How do I disassemble the ROMs? Q.8.2 How do I decode data from the ROMs? Q.9 Should the sound be emulated or should samples be used? Q.9.1 What about legal issues? Are samples copyrighted? Q.9.2 What is the difference between a speech synthesizer and a sample playback device? Q.9.3 What was used in Williams Arcade Classics? (It sounds good!) Q.9.4 Why is sound so *hard* to emulate? Q.10 Where can I find other documentation for the game? Q.10.1 What about schematics for the game? Q.11 How might I contact someone who owns the machine hardware? Q.11.1 Todd Krueger's offer to help Q.12 Where can I find general descriptions of arcade games? Q.13 Did other emulator authors keep any notes while they were working? Q.14 Where can I find more information on the internet and WWW? Q.15 Should I release my source code when I'm finished? Memory Maps ----------- * M.1 Crazy Climber * M.1.1 Video * M.1.2 Sound * M.1.3 Other Details * M.1.4 Memory Map M.2 Dig Dug M.2.1 Memory Map M.3 Ms. PacMan / PacMan M.3.1 ROM Files M.3.2 Memory Layout M.3.3 Memory Mapped Ports M.3.4 OUT ports M.3.5 Character Sets M.3.5.1 Pascal Source (ZIPed an UUencoded) M.3.6 Ms. PacMan ROMs are identical to PacMan? M.4 Phoenix M.4.1 Components M.4.2 Functionality M.4.3 Colors M.4.4 Memory Map * M.5 Sega System 16 Games M.5.1 Hardware Information * M.5.2 Memory Map M.5.3 Scroll Video RAM M.5.4 Fixed Video RAM M.5.5 Color Video RAM M.5.6 Main RAM M.5.7 Video Registers * M.5.8 I/O Registers M.5.9 ROM Files M.5.10 Graphics Formats * M.5.11 Sega GFX Viewer V1.0 Source Code (ZIPed an UUencoded) M.6 Sega Vector (Converta) Games M.6.1 Components M.6.2 Memory Map M.6.3 I/O Inputs M.6.4 I/O Outputs M.6.5 Vector Processor M.7 Space Invaders M.7.1 Board Spec M.7.2 Memory Map Graphics Hacking ---------------- G.1 Who wrote this section? G.2 Introduction G.3 Location of Graphics in Specific Game ROMs G.4 General Information G.4.1 Pixel Layout G.5 Notes and Requests G.6 Mode Q (256x256x256) Source Code (ZIPed an UUencoded) Pokey ----- P.1 Who wrote this description? P.2 You mean Pokey isn't just that guy that hangs around with Gumby? P.3 Where did they come up with a name like Pokey? P.4 General Description P.5 Technical Description P.5.1 Pin-outs P.5.2 Address Lines P.6 Where can I find source code and more info. for Pokey emulation? P.7 Finding and using *real* Pokeys AY-3-8910 --------- A.1 Who wrote this description? A.2 Introduction and Disclaimer From Original Document A.3 Technical Information Game Bits --------- B.1 What is this section about anyway? * B.2 Commando [provided by edoardo (gambare@iol.it)] B.3 Crazy Climber [provided by Vince Mayo (14u2c@diamond.nb.net)] * B.3.1 Decrypting the ROMs by Lionel Theunissen (lionelth@ozemail.com.au) B.4 Crush Roller [provided by Vince Mayo (14u2c@diamond.nb.net)] B.5 Gyruss [provided by Mike Cuddy ] * B.6 I, Robot [provided by John Manfreda (jmanfred@fh.us.bosch.com)] B.7 Juno First [provided by Mike Perry (mj-perry@uiuc.edu)] * B.8 Penia [provided by Perry McFarlane (ce596@torfree.net)] * B.9 Space Invaders [provided by John Manfreda (jmanfred@fh.us.bosch.com)] B.10 Star Wars [provided by Peter McDermott] B.11 Tapper [provided by Clay Cowgill (clay@supra.com)] * B.12 Toki [provided by David Winter (winter@worldnet.net)] B.13 Turbo [provided by Patrick J. O'Reilly (oreillyp@execpc.com)] * B.14 Tutankham [provided by Moose O' Malley (moose@rocknet.net.au)] Step-by-Step ------------ S.1 Step-by-step implementation of an emulator for Phoenix S.1.1 Part I: Pre-coding S.1.2 Part II: Low/High Endian S.1.3 Part III: Let's start coding! S.1.4 Part IV: Run it! S.1.5 Part V: To be continued... * S.2 Step-by-step discussion of an emulator for Space Invaders * S.2.1 My Background * S.2.2 Getting started * S.2.3 Disassemblers * S.2.4 Space Invaders Specifics References ---------- * R.1 List of Emulator Authors R.2 List of Currently Emulated Games R.3 List of Games People Want to See Emulated R.4 Internet Resources R.4.1 WWW Resources R.4.1.1 General Arcade Emulation Links R.4.1.2 ROM Images R.4.1.3 Processor Information R.4.1.4 Schematics R.4.1.5 Miscellaneous Information R.4.2 FTP Resources R.4.3 FSP Resources R.5 List of Arcade Games ----------------------------------------------------- 88888 8 8 88888 8 8d8b. .d88 8d8b. 8.dP d88b 8 .d8b. 8 8P Y8 8 8 8P Y8 88b `Yb. 8 8' .8 8 8 8 `Y88 8 8 8 Yb Y88P 8 `Y8P' o o o ----------------------------------------------------- - Suzanne Archibald (suzanne@crysalis.com) - Neil Bradley (neil@synthcom.com) - Don Carmical (dcarmical@tri-lakes.net) - Clay Cowgill (clay@supra.com) - Mike Cuddy (mcuddy@scitexdv.com) - Jim Dankiewicz (james.dankiewicz@resnet.ucsb.edu) - Laurent Desnogues (desnogue@aiguemarine.unice.fr) - Bryan Edewaard - Chris Hardy (chrish@kcbbs.gen.nz) - Ed Henciak (ethst3@pitt.edu) - Joe Husosky (scubajoe@ix.netcom.com) - Paul Kahler (phkahler@oakland.edu) - Ralph Kimmlingen (ub2f@rz.uni-karlsruhe.de) - Thierry Lescot (ShinobiZ@mygale.org) - Moose O' Malley (moose@rocknet.net.au) - Alan J McCormick (gonzothegreat@juno.com) - Ivan Mackintosh (ivan@rcp.co.uk) - Vince Mayo (14u2c@diamond.nb.net) - Phil Morris (pmorrisb@cix.compulink.co.uk) - Brian Peek (peekb@union.edu) - Mike Perry (mj-perry@uiuc.edu) - RisqMan (RisqMan@aol.com) - Pete Rittwage (bushwick@ix.netcom.com) - Adam Roach (adam.roach@exu.ericsson.se) - Joel Rosenzweig (joelr@an.hp.com) - Trevor Song (Sharrier@hotmail.com) - Gary Shepherdson (od67@dial.pipex.com) - Dave Spicer (emuchat@hubcap.demon.co.uk) - Brad Thomas (bradt@nol.net) - Allard van der Bas (avdbas@wi.leidenuniv.nl) - Nemoto Yohei (BYY03025@niftyserve.or.jp) - All the emulator authors out there... (And all the potential ones too!) - Ian Chai, Glen Chappell, and everyone else responsible for Figlet v2.1.1 (It generated the ASCII fonts you'll see in here!) - Everyone responsible for the creation and maintenance of Linux, X, and DOSemu. Believe it or not, but I've actually written *most* of this document using DOS's edit in a DOSemu window under Linux X!! ------------------------------------------------------------- 8 8 8 Yb dP w 8 8www8 .d88b 8 88b. Yb db dP .d88 8d8b. w8ww .d88b .d88 8 8 8.dP' 8 8 8 YbdPYbdP 8 8 8P Y8 8 8.dP' 8 8 8 8 `Y88P 8 88P' YP YP `Y88 8 8 Y8P `Y88P `Y88 8 ------------------------------------------------------------- Phil Morris brought an issue to my attention, and I decided to add this section. There are many arcade emulation projects in progress now. As far as I know, no emulator author is doing this full-time. In other words, it's a hobby, done in their spare time (They have *real* lives!). However, it seems that some emulation projects may have become 'stalled'. For some, new versions have not been released for a month or so. This is a plea to emulator authors whose projects may be stalled: Would it be possible to make your source code available? This is for two reasons: a) If you are tired/unable to do more work on your emulator(s), it would be a shame to see your hard work wasted. If you're not going to work on the emulations any more it would be great if someone else could pick up where you left off and implement things you've so far missed, such as sound, accurate colours, etc. b) One day the big companies may take legal action against all the emulator coders (I doubt it very much, but you never know) - if the source code for the emulators is in the public domain then at least it won't be forever lost. ------------------------------------- .d88b. 8 db 8P Y8 .d88 8d8b. .d88 dPYb 8b wd8 8 8 8P Y8 8 8 dPwwYb `Y88Pw `Y88 8 8 `Y88 dP Yb ------------------------------------- Q.0 Trying to write an arcade emulator is crazy, isn't it? Neil Bradley (author of Emu) said himself, "Being unbalanced REALLY helps." However, this has not stopped the dozens of emulator authors from pursuing their goal. Anyway, most programmers are a bit crazy, right?? :) Q.1 Which game would you recommend starting on? Neil Bradley suggests: "Good question. I'd recommend picking one you like, because if you're emulating a game just to emulating a game, there's no fun in it. Fun is what keeps an emulation project goin." Mike Perry suggests: "I will go off on limb and suggest that you try to successfully emulate a machine using the 6502 processor. The 6502 is a very simple and powerful processor with has the 'feature' of having an instruction set with a 1-1 correspondence to the x86 instruction set. By this, I mean that every instruction on the 6502 instruction set also exists on the intel x86. Better yet, in all but a few exceptions (1 or 2), the intel instructions modify the exact same flags as the corresponding 6502 instructions, so there is little work needed to generate the resulting 6502 flag register settings. To top it all off, the 6502 was WILDLY popular in the early-mid 80s so you can be sure that there are _many_ classic-era games which use this chip." Q.1.1 Which games are 'easiest' to emulate? I have been told by Moose that a number of sources suggest Phoenix is the easiest game to emulate. Wiretap appears to have some good documentation for Phoenix. See also Q.1.2. Chris Hardy (author of Phoenix emulator for Win95) agrees: "[Here are some reasons why I started with Phoenix...] - Most importantly it has a good concise accurate description of the hardware memory map. [Wiretap archive and section Q.1.2] - It uses a 8085 which has an instruction set which is a subset of the Z80, therefore you don't have to implement all the z80 instructions, only the 8085 ones. (or borrow Marat's one and solve the problem) - It only uses character graphics, which means you don't have to do any sprite routines. - The 8085 is slow enough to emulate completely in C. (ie. my emulator is completely C). Although it is important to remember that the graphics side of my emulator(s) is in assembler and hardware. It's just that I didn't have to write it ;-) (Microsoft did!)" Neil Bradley recommends: "I wouldn't attempt Crystal Castles or Marble Madness, for example, as a first emulation, because it has lots of custom chips that aren't documented anywhere. Something simple, like Space Invaders, might be a good place to start. Your biggest hurdle in making that one run will be the Z80 emulation. In a nutshell, don't bite off so much that you can't chew it. A new graphics system, new sound system, new processor, and new mathbox board all make things futile for you. Start with games that, for instance, use a CPU that you know, or a graphics chip that you know (if applicable)." Mike Perry has this to say: "Which game is easiest? Gah, thats relatively hard to say. As long as the game only has one processor (or two if one is used for sound) then it will probably not be a terribly difficult task. If the game is vector based, that will increase the difficulty level considerably. The simpler the processor, the easier the programming task will be and the more likely it is that the emulator will run at a decent speed on a slower computer. In other words, an emulated 8088/z80/6502/6809 will not be difficult to handle on intel 486, but a 68000 will be a challenge!" Q.1.2 Which games have the most available documentation? At the present time, there is very little documentation freely available. Phoenix, Sega (Converta) vector games, and Space Invaders are described in sections M.1, M.2, and M.3 (Memory Maps) of this document. You may also want to check section R.4 (References). If anyone can provide information on other games, I'll be happy to add it to this HowTo! Dave Spicer says: "I can't think of any with detailed documentation. The easiest game I ever wrote a driver for was Space Invaders. It was a doddle!" Q.2 How do I START? Neil Bradley suggests: "If you don't know at least one assembly language, emulation is going to be a very difficult thing for someone to accomplish for two big reasons: Most games written prior to 1985 were written all in assembly. That means you're not going to have the luxury of looking at wonderful source code - you're going to have to guess what it's doing by what a disassembly is doing. Secondly, the concepts of I/O & memory, paging, etc... are all familiar to the assembly programmer. Knowing hardware, and how to read schematics helps immensely. I find a game I want to emulate. Then I find out what other games are similar enough to the platform of the game I want to emulate. If there aren't any, I seriously reconsider doing it. If there are others, I go ahead. Implement the CPU emulator before anything else. Writing sound & graphics engines won't do you any good if you don't have anything to drive them with. ;-) You need to know at least one high level language and an assembly language - preferably the one contained on the video game you're trying to emulate." Neil Bradley summed it up on the emulator mailing list: "Pick a game you want to emulate and stick with it. Get a CPU emulator that you know and trust and use it to get things running. Grab a disassembler and write yourself a small debugger to allow you to step through code, stop at specific points, etc..." Mike Perry offers this informative list of things to obtain: "[You will need] information on the microprocessors used in the game. Knowing the manufacturer and device number should be sufficient. You must then seek out a technical reference for the appropriate processors. In many cases you can mail the manufacturer for a free (or cheap) copy of the tech specs. You will need the specs for 1) The opcode matrix: This will have the hexidecimal values for the opcodes. 2) Instruction details: This will tell you exactly what each instruction does. If the processor has a flags register (it probably will!), it will tell you which flags are modified/set/cleared and under what conditions. 3) Instruction cycle counts: Depending on the machine, it may be necessary to keep an exact count of emulated cycles so that interrupts can be triggered at an _exact_ time eg 50 mhz, no more, no less. On vector machines, this may be a big deal. According to the author of the Vectrex emulator, the interrupts had to be trigged on the exact cycle or the whole display could be screwed. For raster games, I seriously doubt a few cycles will hurt anything. 4) Interrupt information: You need to know what interrupts can be triggered and when. If the processor uses an interrupt vector, you need to know the locations of the vector entries. You also need to know whether interrupts are prioritized. 5) Addressing information: You need to know exactly what kind of addressing modes are available on the microprocessor of the machine. These modes must be emulated for memory reads and writes, including instruction fetches and stack operations." Chris Hardy had this to say: "Hints on starting an emulator: - Write a 8bit binary dumper. This allows you to dump the ROMs in a form so you can work out which roms are the character roms and how the graphics are formatted. - Contrary to popular belief you don't have to have a complete character graphics system going to have some fun. Work out where the ASCII and number characters are in the character ROM's and display the display memory as ASCII on the text screen.(Just replace anything else with an "X" or something). I played my first emulated Phoenix game this way. (It even scrolled the background!). If you have a background and forground, just put them side by side. 80 columns is usually enough for most arcade displays. - As part of your processor emulator have a table in which you have a count of the reads and writes to every memory location. This allows you to immediately find what memory locations are being used by the emulated code, ie. screen memory, other "device" memory locations. If you need to, this can also be done for IN's and OUT's. - You don't have to always draw the whole screen. If you use offscreen buffers and a change table, you can work out which characters have been changed and just update them. This speeded Phoenix quite a bit, as drawing 1664 characters every frame took a while." Dave Spicer offered this: "I start on an individual emulation by finding the character hardware of the game in question and implementing a simple version of it. This is usually enough to see text on the screen and get some idea of what the game is doing. Q.3 What language should I use? I suppose it's possible to use almost any language available. However, for performance, assembly is definately the language of choice. High level languages used in current emulators include C and C++. Neil Bradley had these comments about languages to use in an emulator: "You might be wise to learn C. The biggest reason is that it is the most widely used language, and there are plenty of experts in the field to help you out. Pascal is dead as a new development language, except maybe for hobbyists, though I must admit Borland did a pretty damn good job of making Turbo Pascal a viable entity. With all of their extensions and nicities, it rivals C in its functionality. The same holds true for Visual Basic. It's not really BASIC in the literal sense anymore - it's a C-like language. The other reason is that about 95% of the CPU emulators I've found are written in C. I think I found 1 that was written in Pascal. [If you decide to use C++] you'll never make it on anything less than a Penitum Pro 200. CPU emulation is very time consuming, and even a single instruction or two can kill processor performance. To give you an idea, my original 6502 emulator ran at 1.2MHZ when written in optimized C (not C++). That was on a Pentium 120, and I'm no slouch when it comes to optimizing. I rewrote my 6502 emulator in 32 bit assembly and it's running at 15MHZ. Compilers are still no match for a seasoned assembly programmer. Add in the extra overhead [of C++], and you're toast. You'll never get good performance out of OO CPU emulation code... Add in big-time overhead for class alignment [and the] CPU emulator will be HORRIBLY slow... This is a really bad place to use C++. C++ has its place in UI and API abstraction, but when you're talking performance it's a *BAD* idea... Not to be too frank, but writing something like a CPU emulator in C++ would be considered shitty programming practice. ;-) If you'll notice, all well-performed emulators are written in assembly - at least as far as the CPU emulation goes." Mike Perry adds: "I can tell you now that you do NOT want to use Delphi. Delphi is for rapid prototyping and for developing graphical applications. An emulator is not an application that is suited for development in Delphi. Additionally, Delphi applications are only usable in Win95 and NT. DOS, being a single user, single-tasking OS, is more likely to bring better performance. [Using] Pascal is a possibility but Borland Pascal has serious limitations in terms of efficiency. For instance, someone was handling opcodes using a case statement case op1: blah blah blah; return; case op2: blah blah blah; return; case op3: blah.....; return; .... Now any reasonable C compiler, including Borland C++, converts this to a jump table (ie, code array) for fast case determination. BPascal on the other hands generates a series of mov, cmp (compare) and jmp instructions, like a big if-else. This means that opcode 212 will take around (212 * 4) cycles just to GET to the code using BPascal while it takes less than 6 cycles using C!! Even if you DO use C, your task is made MUCH easier using inline assembly. Better yet, make assembly the main language and link in external C or pascal function if necessary. The graphics routines should DEFINITELY be in assembly. [You] WILL be better off learning [assembly]." Dave Spicer warns: "IMHO, writing an emulator in Pascal is not a particulatly good idea. You'll be emulating machine code, so you want something that resembles that in form." Q.3.1 Do I *have* to use Assembly? Neil Bradley says: "Regardless of what some academics would like to believe, a compiler can't outclass a good assembly programmer. You'll spend plenty of time optimizing, and if you rewrote it in assembly, you're almost assuredly going to get a 30-40% speed improvement. C compilers (and others for that matter) solve for the general case, and make assumptions on what registers/variables need to be saved. In assembly, you know the code, and can write, at the CPU level, and write the most optimal instruction sequence to match the common-case path of your code. You really do need to know assembly to do a project like this - that is to do it in an effective amount of time." Mike Perry says: "Normally I would not recommend writing an application primarily or entirely in assembly. Assembly is minimally portable and if an application spends 90% of its time executing 5% of its code, it does precious little good to hand optimize the remaining 95% in assembly. An emulator, on the other hand, is not your normal application. An emulator's job is to emulate hardware. In emulation, you will be dealing with registers, memory addressing and memory reads/writes. The instructions the real processors use to do this sort of stuff are very "basic". They are so basic that its actually easier to use x86 asm and the intel registers to do what you want than it is to use a high level language. Assembly makes it easy to manipulate 8-bit, 16-bit and 32-bit values. C and Pascal make it downright tedious to manipulate more than one size variable in an expression. At the least, your HLL code will contain many many typecasts, making it very hard to read." Q.3.1.1 Are you SURE about this Assembly business? :) Paul Kahler points out: "A number of people indicated that assembly is the only way to get good performance on anything short of a pentium pro. I'd just like to say that the first rev of the Cinematronics emulator was written in TURBO PASCAL and seemed to run just fine on a Pentium-90. That was almost 2 years ago, so we were trying to run on a 486 and had to move on to assembly. TP allowed me to create an array of functions so I could grab the opcode and call the proper function. That's really good performance considering the CineProcessor doesn't map at all to x86 or anything else, and it ran at 1.7 MIPS! A 6502 should be no problem for C code on a Pentium or even a 486. But then there's graphics and sound also... I just wanted to point out that ASM isn't the only way to go, and if you do things in C they'll be portable. BTW I used the BGI drivers for the vector display back then too!" Pete Rittwage adds: "I've been able to get stellar performance out of my 6502 purely in C, including graphics overhead, even on my lowly 486/100. I've also seen people get pretty good performance out of Marat's Z80 code in such things as the Donkey Kong emulators, and that code is FAR from optimized. It accesses things a couple of structures deep at times, which is very inefficient." Q.3.1.2 Doesn't the choice of language depend on the target game/system? Neil Bradley clears things up: "Writing an emulator strictly in C++, including CPU emulation and graphics emulation will not give you good performance on anything short of a pentium pro. The author of the Tempest emulator that runs under Windows runs fine at 150MHZ, and it's written in C. If that's your target platform, great. And if your target platform is a 486/66 and your graphics are heavily intensive or running on a slow ISA card, you better not use C or C++. To give you some benchmarks on some "famous" CPU emulators, here are some #'s (not including graphics - just RAW CPU time) that indicate the emulated speed on a 486/66 running Asteroids, compiled under Watcom C++ 10.6 with the 486 compile option thrown: Emulator Emulated speed Marat's 6502 1.6MHZ Apple IIe emu 800KHZ Optimized Apple IIe emu 1.9MHZ EMU's first 6502 C emulator 2.5MHZ EMU's 100% Assembly 6502 6.8MHZ My background is assembly & C optimization. I've spent greater than 20 years on numerous processors, and have programmed everything from tiny microcontroller circuits to multi-CPU applications, so I'm no slouch when it comes to C or assembly optimization. ;-) . The results above speak for themselves. Keep in mind that there aren't any graphics routines or sound routines in this code under this test. So I'll reiterate what I've tried to say in the past: If your target machine is a 486/66 with a crappy ISA card, you'd better squeeze everything out of the emulator that you possibly can, because you'll need it. EMU Uses a single page of 256 color graphics. It erases the prior frame and draws the new one. Typical frames are 300 vectors. 600 Lines per "frame", and roughly 25 frames per second. That's 15000 lines per second that must be drawn, and if we say that the average line is 50 pixels, that's 750,000 pixels a second. Most games, such as Donkey Kong or Space Invaders aren't coming even close to moving that many pixels on the screen. So in that case, you can get away with having a less than totally optimized CPU. But with EMU, I couldn't get away with it. There was too much to do. Linedraws are extremely expensive, and I spent days working on high speed linedraw routines (those of you who've been with EMU since the early days know what I'm talking about). The point I'm trying to make is that the more you optimize your CPU emulation, the less of an impact it will have on your graphics emulation, and the faster your code will run on a slower machine. If you want to make your minimum platform a Pentium 166, you can probably get away with writing it in Quick Basic. I want as little intrusion from the CPU emulation as I possibly can get, and I got better emulation by almost a factor of 3 by rewriting it in assembly. I don't think anyone said that ASM was the only way to go. I remember saying that it is the most optimal way to go." Laurent Desnogues says: "I got a two times speed-up when converting a 6809 emulator written in C to SPARC assembly language. So I'm one of the exceptions... I wrote a Phoenix emulator that should run on any Unix/X platform (one or eight graphics planes); it uses Marat's Z80 emulator package and I get decent speed even on low end Suns. The problem with Unix is that most of its implementations can not handle real-time programs; the game often freezes while the kernel is doing internal jobs... So I have to admit these platforms are not very well suited to arcade game playing; but programming an emulator is by itself enjoing, isn't it?" Q.3.1.3 What about portability? Neil Bradley answers: "Just because you do things in C doesn't mean they're portable. There are basically two platforms that need any attention for gaming: PC & Mac. That's it. I don't know of anyone owning a Silicon Graphics workstation saying to themselves, "Gee, wouldn't it be cool to fire up an emulated version of Space Invaders on this thing?". The people I know who own SparcStations or run Unix aren't interested in emulation or gaming in general. Granted there are exceptions to that rule, but for the most part the "other" platforms aren't really in the running. But if I'm forced into a corner where I can get 3X performance out of something by coding it in assembly for a platform I know, I'll do it and blow off "portability". At the same time, as I've said before, I'd gladly help out others on other platforms, giving them hints and helping them with their emulation projects that are for a platform that I'm not familiar with. Besides, most code written to be "portable" isn't. It starts off that way, but ends up using OS specific calls to improve speed, etc... The road to non-portable code is paved with portability in mind. ;-) BTW, I run Unix on synthcom, Win 95 on my sequencer/sound studio, Windows NT 4.0 Server on one of my development machines, and DOS on the other. Guess which one I use for games..." Q.3.2 But haven't some arcade emulators been written in C/C++? According to what I've heard, C and C++ have been *used* in some emulators, but an entire emulator has not been written in only C or C++. Neil Bradley says: "Name one emulator that was written in C++ that runs reasonably on anything less than a Pentium Pro 200. ;-) I don't know of an emulator that is ENTIRELY written in C. EMU, for example, is written in C and assembly. C for all the glue code and non-speed critical things, and assembly for everything else. That's why it runs reasonably on a 486/66 with a decent PCI video card. [Chris Hardy's Phoenix emulator was coded in VC++ using Direct/X... Note that it was written in C (not C++!) and compiled on VC++] Not to lessen anything that Chris has done, but Phoenix isn't exactly a CPU hogging game, as is something like Tempest, Battle Zone, or Red Baron. The vector emulation is very time consuming, and even the originals slow down in spots." Q.3.3 What about Java? Neil Bradley, after cringing in terror, says: "The only way that you'd even have a prayer to get something to run fairly quickly in Java is to make sure the client compiles it for their native CPU (Visual J++, anyone?). In the case where you write an emulator in Java, and it runs on a browser, you'd have an interpreter interpreting an interpreter of a CPU in addition to the interpreter interpreting the hardware actions as well. Interpreted Java is not built for speed. The guys at Microsoft are getting almost identical performance out of Visual J++ as the Visual C++ guys are (according to a Java proponent at the last PDC), so compiled Java apps are a possibility. It's hard enough getting optimal assembly emulations to run at full tilt on a 486/66 without having an interpreter interpreting the emulator. Your hit by doing that would be about 30:1. If we had 2 Gigahertz Pentium PROs, it might be possible, but not with the speed of the Java virtual machine interpreter. Don't bother unless you're compiling it. You might have a chance then, but interpreted, no way. I wouldn't bother trying it. ;-)" Q.4 Could you explain CPU emulation? The CPU emulation is the heart of any emulator. If the code is correct, it will handle the ROM data, so you don't necessarily have to worry about how the game ROM itself operates. Since the CPU is the 'brains' of the machine, it can get very complicated. Neil Bradley had this to say: "When doing something with the Z80, for example, it's quite extensive. You've got the functions of 300+ opcodes to deal with, and permutations. Not to mention that some arcade manufacturers' code use the Z80 'undocumented' opcodes (though they're not so 'undocumented' anymore...). Grab yourself a book on Z80, 6502, 6809, or whatever CPU you're working with. That's the best way to start. The 8080->Z80 processors are actually much more complex than the 6502." Q.4.1 CPU emulation sounds VERY complicated, how should I START? Mike Perry offers the following: "I recommend that you read a few good books on computer architecture and digital circuits and/or boolean algebra. If you understand how the basics behind the following, you'll be well prepared to emulate a microprocessor: 1) Fetch-decode-execute process 2) Buses and memory/data reading/writing 3) Interrupts and their implementations 4) Stack operations 5) Registers and flags 6) Binary arithmetic, two's complement representation, boolean algebra I suggest 'Computer Hardware' by M. Mano. Another good book is 'Computer Architecture: A Practitioners Approach' (or something like that) by Patterson and Hennesey. These are both college textbooks. Of the two, the Patterson book would probably be the most helpful as it covers architecture on the system level rather than the gate level. It covers MIPS assembly language, pipelining (unimportant to emulation, although you could use a similar technique to speed up the emulation), memory addressing, virtual memory and IO devices/DMA." Q.4.1.1 Is the 68k series of processors 'easy' to emulate on PCs? Phil Morris found the following on a UseNet newsgroup: "68k emulation can be done VERY quickly on intel... Check out ARDI's Executor. They use a combination of an interpreter and a dynamic recompiler. It reaches 68030 speeds on pentiums. Very cool. Their white paper is good reading for anyone looking to write an emulator. Maybe this White Paper is available on Ardi's Web site? (www.ardi.com)" Q.4.1.2 Why were only a handful of processors used in arcade games? Neil Bradley offers us a bit of history: "Most of the issue was cost back then. The 6502, Z80, and 6809 CPU's were the cheapest, and most of the games in the early 80's and late 70's didn't need 68000's or 8086/80286's. The cost of a 6502 compared to an 8086 was about a quarter the price. The 6502 got its start by doing about 30% of the functionality of the 8080. Throughout the years, the 6502 has been known by many programmers as being a collosal piece of garbage. I always did hate the chip. It worked, but barely. No 16 bit pointer registers, only 256 bytes of stack, etc... It was the first CPU at the time that actually chaged its flags by a register load. It was a pretty weak CPU in terms of functionality (as evidenced by BattleZone & Red Baron). They could have implemented that game with a higher CPU (like a Z80 @4 MHZ) and eliminated the mathbox altogether. I think at the time it would have almost been cheaper to do it this way. The 6809 made quite a few improvements over the 6502 and the 8080/Z80. It had the opportunity to learn from the 8080's & 6502's mistakes and was an all around better chip. In some aspects the 8080 was superior (I.E. more registers), but the 6809 had lots of nice features and was extremely consistent. The Z80 started when some guys who worked for Intel split off and made their own company (Zilog). They took the 8080 design and added lots of nice features to it to make it a REAL powerful chip. Of that era, the Z80 was the most popular CPU and the most powerful. Built in block move commands & all kinds of register indirection. Most games of that era used the Z80." Q.4.2 Should I use CPU emulation code that is freely available? Dave Spicer suggests: "Writing a processor emulator is a big job and is very difficult unless you know your your emulated processor fairly well. You might be better off starting out with Marat's C based emulation code as that's a proven, albeit slow, technology." Neil Bradley says: "If you are goal oriented, learn from their emulator first, then write your own. If you want an education, by all means, but that's a big chunk to bite off." Q.4.3 How do the CPU and ROMs interact? Neil Bradley instructs: "Create your entire memory space, including loading the ROMs, and start your execution wherever the processor starts. Don't try to interpret the ROMs - you'll never get it right because it's completely unpredictable." Mike Perry adds: "As for variables and stuff, thats the beauty. You aren't SUPPOSED to have to know how the processor is being used. You emulate all of the opcodes and interrupts, and have a simple fetch-decode-execute loop. You also emulate the supporting hardware (controls, gfx and sound) to be called during interrupts. If those are written correctly, the emulated game will run itself... You don't need to know the details of the game code." Q.4.4 How should I handle CPU opcodes? Neil Bradley has this to offer: "If you're going to be handing off a single opcode between classes, the overhead will completely nullify any speed you could even hope to get. Try using a pointer to the current virtual program counter and fetch bytes as you need them. Use an array of function calls - one for each opcode... Point invalid opcodes to a NOP function... [Pointers are] 4 bytes if you're doing 32 bit code." Q.4.5 What is Pokey? He is Gumby's friend! :) Seriously, for a great description of what the Atari Pokey is, see the Pokey section below. Q.4.6 What is Slapstic? It's a form of comedy. Nyyyuk nyyuuuk nyyyuuk... Woo woo woo woo woo! Actually, it's a security chip Atari introduced in some of their games. Suzanne Archibald provided this information: "Unfortunatly, I don't have any information on the chip per se, just how to avoid it in Gauntlet. See, for each machine using a slapstic chip (each was different - the name being a generic term to Atari's copy protection) the chip would have a unique function, in the case of Gauntlet I/II the chip decoded the top 2 bits of the Maze data. With this in mind, getting around Slapstic on Gauntlet isn't too difficult, you simply use a ROM that is available, that has the correct Maze layouts without needing decoding, you then disable the slapstic, and hey presto." Q.4.7 What about translation? Would it be easier to translate the code into a language the PC can compile rather than emulate the CPU? Here's what I mean by translation: Write a program that reads in each machine code instruction from the ROM (where the CPU instructions are stored) and outputs a line of code in say, Assembly or C. If you devise a set of translation rules from the machine code to your target code, and if this idea works, you should get a program that you can compile (and optimize if you like) that will perform the same operations as the original ROM. After I had this thought, Moose told me: "This idea was discussed in c.e.m years ago. The problem (as I understand it) with translation is : - How do you ever know when you have translated all instructions/data? Some bits of a game (say) only get called / run under real unusual conditions. - Where code is loopy, your translator would have to be super intelligent to recognise the loop (which might span 1,000's / millions of instructions). - How do you ever know when / if you have captured all instructions / data. The way I understand things, translation is extremely difficult, but not impossible. However, I think it is several orders of magnitude in difficulty above straight emulation. Then again, maybe it can be done." Neil remarked: "I've actually kicked around the idea of writing an emulation compiler, which would actually take the native object code of the game and convert it into the native machine's code, and execute THAT instead of emulating the processor. That would allow the game to run at the native processor's speed, and you'd get 5-10X speed improvement in CPU emulation. Even the simplest of instructions winds up taking 20-30 clock ticks in emulation land." Q.4.8 Is there anything else I should know about CPU emulation? Neil Bradley reminds: "[Don't forget] to include events that happen at regular or random intervals (like NMI's or interrupts)." Q.5 How useful are the switch settings and pinouts? Mike Perry suggests: "Switch settings are important, but only because you'll probably want to let the user initialize them to whatever they want. Even if you don't, you still will need to emulate them because they are probably memory mapped and the game code uses the information to set things like number of lives, etc. If you dont know exactly what they do, you'll probably have really weird settings in your game." Neil Bradley adds: "The switch settings are useful only once, usually. That's the time when you first fire up the code and wonder whether or not the code is going into self-diagnostic mode. Knowing what the switch settings were once helped [Emu] get out of diag or halt mode. Knowing the pinouts didn't do anything. Knowing where the address (from the CPU's standpoint) of the switches were was MUCH more helpful!" Dave Spicer says: "[A knowledge of] electronics helps because it means you can use schematics to fill in some awkward gaps. That said, most of the time I just work from the original program code and make guesstimates as to what everything should do." Q.6 How do I produce a memory map? Kevin Brisley offers: "Well, I've been plugging away at trying to figure out the inner workings of Burgertime and thought I'd try to get some discussion going in the area of trying to create a memory map for an arcade game. So far I've managed to determine the addresses the ROMs containing code mapped to by checking for IRQ/NMI/Reset vectors and then looking through the disassembled code for hints (eg. checking jmp's and jsr's to get an idea of where the ROM goes). The next step is determining where the rest of the ROMs go. I had planned on doing this by scouring the code for references to addresses that I had not found a ROM for and trying to determine the context of the access. For example, if a piece of code looks like it's copying the bits to make the letter 'A' and I know which ROM contains the charset then I'd have a place for the ROM. But I also have the schematic for Burgertime and was wondering if there was an easier way. I thought that there must be a way to determine from the schematic where the various ROMs go. Unfortunately I'm not an electrical engineer and my talent for interpreting schematics is not great. The question also holds for memory mapped I/O. I was going to apply the same logic to determining where the buttons mapped to but all of the buttons and joystick appear on the schematic. Is there a way to trace the connection to a button back through the schematic and figure out what bit gets flipped in memory? If this is not possible, how have the emulator authors out there determined this stuff? Through the scouring code method or some other method I haven't thought of?" [I'm sure everyone would be happy to get more information on this... anyone out there want to help?] (I received this information from someone who is staring to work on an emulator. He asked me not to reveal his name, because his time is limited and the emulator may not be finished any time soon) : "During the initial scan [of the ROMs] I used some tools that might be of use to other emulator developers. Specifically Marat's DASM that's supplied with the Z80 emulation package and a DOS tool that I found. It's intended for debugging PCB mounted CPU's but can also be used to disassemble and debug romfiles. It's called NOI25Z80.zip and is written by John Hartman. This one is specifically for the Z80 ,but there are versions for 6502 and other processors. It gives you a fully interactive disassembler and memory dumper (HEX and ASCII). It can also trace (debug) ROMS. Input files have to be in INTEL HEX format, so you need a utility like BIN2HEX to convert ROMS to HEX files. Use ftpsearch (http://ftpsearch.unit.no/ftpsearch) to find places to get it." Note: I found the files in the SimTel archives: (see section R.4.1.3) Directory SimTel/msdos/debug/ Filename Type Length Date Description ============================================== noi25370.zip B 179655 951111 NoICE 2.5 remote debugger for TMS370 noi25_02.zip B 167495 951111 NoICE 2.5 remote debugger for 65(C)02 noi25_09.zip B 185554 951111 NoICE 2.5 remote debugger for 6809 noi25_11.zip B 178389 951111 NoICE 2.5 remote debugger for 68HC11 noi25_51.zip B 170645 951111 NoICE 2.5 remote debugger for 8051 noi25_96.zip B 170411 951111 NoICE 2.5 remote debugger for 80(1)96 noi25_z8.zip B 180580 951111 NoICE 2.5 remote debugger for Z8 noi25z80.zip B 191219 951111 NoICE 2.5 remote debugger for Z80 Q.7 How can I find what processor(s) the game uses? See section R.5 under References. Q.7.1 Where can I find information for a specific processor? See section R.4.1.3 under References. Adam Roach also suggests: "...most processor manufacturers will provide free or cheap data on their processors if you call or write them." Dave Spicer had this to say: "I don't know of any really good info on the net. However, you might like to try and get hold of "Programming the Z80" by Rodney Zaks (ISBN 0-89588-069-5). This is the book I use if I need to look up any Z80 info... I'm not so sure about books for 6502. I always used to use the Commodore 64 programmer's reference guide!" Neil Bradley's source for the 6502 was: 'Programming the 6502' by Rodnay Zaks was my bible for developing the 6502 emulator used in EMU." Q.8 Where might I find the ROMs? Try the resources in R.4.1.2 and R.4.2. If all else fails, find someone who owns the machine, and see if they can help you (see Q.10). Q.8.1 How do I disassemble the ROMs? If you are lucky, someone may have already written a disassembler for the processor in your target game. Check sections R.4.1.3 and R.4.2 under References. Q.8.2 How do I decode instructions, variables, data, sprites, colors, graphics, etc. from the ROMs? Neil Bradley's answer: "Trial and error. Seriously. Anything beyond this explanation can't be described in 30 words or less... It's a mix of RAM and ROM in that space, in addition to hardware in that space as well. It's different for each platform." Dave Spicer says: "Use a debugger and a graphics viewer to find the data (I wrote my own). Other things require you to make sense of the original game code and work out what it's doing." Q.9 Should the sound be emulated or should sample be used? This has been a hotly debated question on Neil's emulator@synthcom.com mailing list, so I thought I'd address it here. It seems there are two factions in this debate: - Those who want an emulator to be 100% emulated. No samples should be used because this is 'cheating'. Even at the risk of having poorer quality sound, or slower overall emulation, these "purists" would like to see the sound emulated... - Those who want an emulator to be as close as possible to the real thing. Samples should be used because they provide better quality sound, and can produce bass effects that were produced by the arcade cabinet. Neil Bradley says: "The whole purpose of emulation is to EXACTLY DUPLICATE the look, feel, sound, etc... of the game. The Pokey uses a top octave divider that basically pulls pulses off the data & addressing bus to generate its sound. Because of the odd frequency of the Pokey, everything is slightly flat, and off key (musicians, ever notice this?). The sound of a top octave divider circuit sounds nothing like FM synthesis that's found on the SB and other boards. You can get somewhere in the ballpark, but you'll always find that FM synthesis in sound cards is somewhat thin. That's totally opposite of the Pokey. For other games that use more conventional synthesizer chips, sound is much easier, because they use standard waveforms, etc... Sampling gives you the truest to life representation of the real thing, which is exactly what emulation is going for. With all due respect, the average individual can't tell the difference between a sample and the real thing. The only thing that would make it fake to you is knowing that it was a sample. Sorry if I come across as a bit agressive about the sample issue, but it's one of my hot bottons. So I'll ask the question again - do you want the sound cards to attempt FM synthesis on something that doesn't sound like FM synthesis and won't sound like the original, or would you like it to sound like the original?" Ed Henciak adds: "I'd also like to emphasize sampling in game emulation. I have begun work on a Sega vector game emulator (primary focus is Star Trek). You may have seen this on Moose's page as my senior project here at Pitt. Anyway, I don't even plan on emulating the sound. I have a Star Trek set and will use samples for all audio. The goal of emulating old arcade games (to me) is to bring back the experience of playing these games. If you have a 'finished' emulator (i.e. the final revision you release) with weak/no sound, it just misses the point of emulation. I understand 'EMULATION' refers to emulating all hardware in the game, but I think an arcade emulation should be limited to only having to emulate the cpu and video. Audio is critical to any game playing experience (in my opinion, Gyruss would have been kinda lame w/o that killer soundtrack). And from what I have been reading in this group, it is way too wacky from game to game to make it 'perfectly emulated'. Plus, it hogs CPU time. In games such as Dave Spicer's Pac Man, the audio is perfectly emulated. I believe Pac Man uses 1 Z80 CPU and 1 Sound Chip. Not too much overhead!!! Star Wars, on the other hand, uses 4 POKEYS, and Major Havoc uses 3 CPUs in addition to the 4 POKEYS!!! I believe that if we want to see these games emulated w/o additional hardware, and, more importantly, the authors are up for it, we should focus on sampling audio from our games, make an 'audio archive' of sampled sounds at 44KHz (possibly make a small circuit to take this input from our machines directly to the sampler), and pray the authors take advantage of this. Granted, I have only been an 'emulator programmer in training' for a couple weeks now. I still have a long ways to go in this area and fully respect all you authors out there for such incredible work! I just want to push sampling because it helps to fully bring back the arcade experience!!! Q.9.1 What about legal issues? Are samples copyrighted? Neil Bradley counsels: "There are only two conditions where you can copyright a sound: #1 If the sound itself is a sample (as in the samples in the Star Wars & Empire Strikes Back games) #2 If the sound itself is contained within a sample playback unit (I.E. Joust, Robotron, etc...). There are some direct waveforms that can't be copyrighted (Sine/Sawtooth, etc...) If #1 is the case, the only way you can get legal right to redistribute is to license it. If #2 is the case, the only way you can legally utilize the sound is to re-sample it, otherwise you'd be copying the data right out of the EPROM. Both case #1 and Case #2 above are legally considered "creative works". The Pokey is a sound synthesizer chip (among other things). It is designed to generate a wide variety of sounds. If it were true that you couldn't legally sample a real world synthesized sound, then no one would be using synthesizers. Plenty of lawsuits were filed with large musical instrument corporations due to sample stealing (Roland & Yamaha both stole Fairlight's "chior" sample that's used on quite a few big-time hits in the 80's). In all cases, they were sample-sourced lawsuits. Not one has ever been filed where the source was synthesis. There have been suits filed under patches being stolen and reused in other synths, but under copyright law it's considered software since it's stored as data. Atari can't copyright the sound that the pokey generates. If that were the case, then any sample-playback synthesizer (like almost everything sold today) patch preset couldn't be used in a published song. As a published producer and musician, I can assure you all that this is not the case." Q.9.2 What is the difference between a speech synthesizer and a sample playback device? Joel Rosenzweig says: "The difference between a speech synthesizer and a sample playback device is a little fuzzy, but I'll describe the two so you'll see why I call Star Wars speech reproduction 'sample playback' instead of 'speech synthesis.' In sample playback, a waveform is stored in a compressed or decompressed state in memory. This waveform is generally longer than a phoneme, and when played, an entire word or phrase is heard. Generally, an entire sentence would be stored as 'one sample', so that when the microprocessor signals that some speech should occur, it says to the sound unit, play speech sample number 'x' which might be the entire sample 'Use the force, Luke.' This playback device then reads data from an EPROM starting at the location of the sound sample for this speech, and reads the data. After the decompression step, a digital to analog conversion step takes place, and the analog waveform is output. When this single operation is finished, the entire 'speech phrase' is complete. In a speech synthesizer, speech is produced by the catenation of small sounds called 'phonemes.' The English language has a little over 50 phonemes. You can create any English word with the right combination of phonemes. These phonemes can be stored as programming data for a 'synthesizer'' (it says to the FM synth, 'how to generate this sound programatically') OR the phoneme data could be live samples from a human. In order to create a 'WORD' the microprocessor determines the correct string of phonemes that need to be played in order to generate the correct sound. A string of phonemes are sent to the speech synthesizer which then will play the phonemes in order using the technology for that chip (either sample playback or by programming an FM synthesizer.) Many phonemes are read in precise order to generate a word, and then a sentence. Whereas only one read/playback cycle is needed to play a sentence with a sample playback device implementation, the speech synthesis implementation is required to do many shorter cycles to achieve a similar outcome. A speech synthesizer by nature, is able to reproduce ANY 'English' (say) word because rather than storing the words themselves, it just stores all the phonemes needed to produce these words. A sample playback device, is not capable of reproducing ANY English word because it only knows how to play back the samples that are stored in memory. (these might be words, or it could be a sound effect) Now, certainly, if you wanted to, you could record all the English phonemes, store them as samples, and then use a sample playback device and a microprocessor to ACT like a speech synthesizer. In fact, this scheme works quite well and you can get some 'human like' sounding speech out of them. But the main point is that a sample playback unit is capable of playing back ANY sampled sound and is not bounded to generate speech only. A speech synthesizer then is a more limited device that might employ the use of a sample playback device in order to play its phonemes (if they are stored that way). And yes, if perhaps a phoneme were stored as a sample, then you could store an entire speech sample as one 'phoneme' but then you'd technically have a sample playback device, and not a speech synthesizer. So, to wrap up, the biggest difference is that sample playback devices are used to play back any sample of sound imaginable, and can be used to play back whole samples of speech. A speech synthesizer is a device that in some instances behaves just like a sample playback device, but its VALUE is that it can produce any word from a set of phonemes, and is not limited to 'pre-recorded' speech or other sounds. In Star Wars, the TMS 5220 is a device that plays back pre-recorded samples of speech data, stored in the EPROMS of the sound board. It is not capable of producing any speech we could dream up, because it does not have individual phonemes stored anywhere accessable to it, hence it is not a speech synthesizer. The advantage here is that Luke's voice sounds like Luke, and Darth Vader sounds like Darth Vader, etc. A rudimentary speech synthesizer is not capable of copying different 'voices' and is usually limited to small changes in pitch, speed, etc. I believe that Atari named this chip a speech synthesizer because they used the word 'synthesizer' loosely, to mean 'speech production' which is what it does. Though, its not strictly limited to speech as they could have put any sounds in memory that they wanted to." Q.9.3 What was used in Williams Arcade Classics? (It sounds good!) Neil Bradley answers: "All of the WA classics are *SAMPLES*. Even the original sounds that go into the sound roms for Joust, Robotron, etc... are samples of synthesizers. They are mixed off line, and played back real-time." Joe Husosky says: "To recreate the sound they hooked up the sound board and instructed it to play each sound the game has one at a time. The really cool thing about the WIN95 WAC (DOS version also included) is that they have all the sounds included as WAV files. You can really customise WIN95 with all the WAC sounds." Q.9.4 Why is sound so *hard* to emulate? Neil Bradley complains: "I've been asked multiple times why I don't 'just add sound'. Well, the lousy sound cards we've been cursed with have different structures from almost every other form of synthesis known to man. I'm talking filtering, pitch, etc... Sorry to say it, but not even the most expensive Sound Cards are high quality. They are cheap, piles of garbage. Compared to their big brother counterparts (I.E. the digital or analog synthesizer), they are noisy, brash, cranky, and of such low quality it's amazing they work at all. Just so you all know, my reference equipment consists of racks of synthesizers, and compared to them, no sound card is even moderately close to their quality. So partly the reason I don't bother with sound is that the quality is so poor. It's better than a PC speaker, and it gives SOME sound, but saying that it has synthesis capabilities is like saying a Moped is well suited for transportation in all weather conditions. For specifics: The Pokey. The only proper way to emulate this chip is to sample it. FM Syntehsis doesn't sound like top octave divided square waves. FM Sounds thin by comparison. So if you want the character of the Pokey, you sample it. This is called true emulation. Anything else is an imitation. Lots of circuits have bass boost and image enhancers to get their "sound", and without sampling the real thing, you're going to get thin & cheesy sounds in a lot of cases. There aren't enough oscillators on all sound cards to emulate a 2-4 Pokey configuration, either. So what do you do? Sounds like a mixed sample playback is the correct thing. That means you'd better have damned efficient mixing code! I keep telling people over and over that if you want good performance on a particular low-end platform, machine code the thing! I've seen mixing code speed up 4X after being recoded in assembly. It doesn't make much difference on a Pentium 166, but the 486 users will really appreciate it. Okay, now that we've all decided that sampling is the way to go for Pokey emulation, let's consider a few things. First, you need to have access to the game. Second, you need to get every sound that a game will make sampled. In most cases, getting all these sounds seperately isn't possible (I.E. Battlezone's engine noise & firing sounds). Lastly, once you have each individual sample, you need to reverse engineer the commands to the Pokey that would cause that sound to occur, and more importantly, when it should stop. These aren't straightforward steps. Getting a correct sample (and I don't mean sampling it with a $20 Radio Shack mic and a Sound Blaster) is hard work. You'd spend hours getting a good, high quality sample, necessary for true emulation. In a lot of cases, there aren't enough oscillators or waveforms to choose from when emulating other sound chips. The envlope types don't match, Sound Blasters lack resonant filters or other filter modes, and waveforms don't match up to the ones availale on the game to be emulated. So what do you do? Sampling is the answer. This means that the CPU spends time mixing sounds, which makes the game slower. Recoding in assembly (hint hint) is a good way to maximize your performance. ;-) In most cases, sound chips used in video games don't have primitives that match up to the primitives that your average sound card has, so using the synthesis part of the card to emulate the sound is in a lot of cases a lost cause. So the lack of sound emulation in all kinds of emulators should tell you something. ;-) The sound architecture in sound cards is almost completely different from that of your favorite video game, and emulation is a collosal pain in the ass, if not impossible, to pull off. So have some mercy on us emulator authors, will ya? ;-)" Q.10 Where can I find other documentation for the game? You might try to contact someone who owns the machine. See Q.10. Q.10.1 What about schematics for the game? You might try to contact someone who owns the machine. See Q.10. Also, see R.4.1.4 under References for some schematics available on the web. Q.11 How might I contact someone who owns the machine hardware? The Video Arcade Preservation Society (VAPS) maintains a list of people who own arcade games. These folks might have technical documents that came with the machines. They may also be able to dump ROMs if they are not already available on the internet. If you ask nicely, you might be able to find what you are looking for... See section R.4.1.5 for information about VAPS on the WWW. Q.11.1 Todd Krueger's offer to help This message was sent to the emulator mailing list by Todd Krueger [ToddK52685@aol.com] : [I've taken some parts out of it that do not relate to arcade emulation...] "To all it may concern, My name is Todd Krueger. I have been (for many years now) a video game collector. At first I started with the likes of the original Atari machines then it followed with the Nintendos, Turbo Grafixs ect. Then my collection continued to include arcade machines starting with Golden Axe then back to Space Invaders then Pacman and so on. To date, my collection includes 200+ arcade titles (Some with books and docs some without) and near every home video game machine released. (Alot were donated) My intention of this is to start a museum in Las Cruces, NM. My collection started as a hobby and now is an honest attempt to save this important part of history. I believe that emulation is an important part of this preservation. So I would like to be a source for emulator programers. I can provide photos, sounds, some schematics or the loan of the original boards (on a case by case basis). All I ask in return is to be a beta tester. Some of the popular titles in the collection are: Space Invaders (original b/w, part II b/w & color), Galaga (original and plus), Pacman (orig., MS. & super), Gauntlet, Dig Dug, Bubble Bobble, Asteroids (orig. & deluxe), Tempest, Battlezone, Arkanoid (orig. and Revenge of Doh), Ikari Warriors, Contra, Donkey Kong (1, 3, and junior), Frogger, 1942, Berzerk, Star Wars (orig. and Empire), Defender, Golden Axe, Street Fighter II, Mortal Kombat (orig. and II), Time Pilot 84, Time Soldiers, Mr. Do, Galaxian, Block Out, Shinobi, Altered Beasts, and many others (new titles in all the time). Some of the systems are: Atari (400, 800, 520ST, 1040ST, Jaguar), Coleco, Sega (master, Genisis, CD, 32X, 32X CD, Saturn), Turbo Grafx, Nintendo (8-bit, Super, Pocket, Super Gameboy, N64, Virtual), 3DO, Playstation, Vectrex, Amiga, TI 99/4, and many others. Many references. I will give any help I can in your programming endeavors and I promice I will not use any of your products or betas for personal profit nor would I even show your products to anyone without your permission. I further promise to be an honest and good beta tester if you choose to use me. Also, if you or anyone you know has old video game equipment that they would like to donate to our Video Game Museum project (We need name suggestions) you may do so to: Mission Computer Enterprises c/o Todd Krueger 412 LaCrosse St. W.S.M.R., NM 88002 This address is temporary because the store is not fully open and I am still in the midst of my Army Retirement, but this should be good for a couple of months. Just in case, before you do or send anything, email me at ToddK52685@aol.com Todd H. Krueger" [Sounds like a damn good deal to me!!] Q.12 Where can I find general descriptions of arcade games? The VAPS (see Q.10) also maintains a searchable database containing information about virtually every arcade game ever made. Most entries include the company resposible, the year released, and a brief description of gameplay. The database is the KLOV (Killer List Of Video games). The search engine can be found as a link off the main VAPS site. Q.13 Did other emulator authors keep any notes while they were working? In Neil Bradley's case: "Mental notes. Sometimes printouts of my code when I knew it was buggy. Sometimes I collected info about the game platform in stacks of paper for reference, but nothing proprietary or non-commonly available material was kept (at least in my case)." Dave Spicer's experience: "Yup, I have about 10 notebooks full of scribbles. Usually my notes consist of rom locations and register lists with occasional outlines of various techniques for implementing a game's hardware. Lately I've tried to get into the habit of documentating hardware within the driver source code." [When asked if he wrote detailed specifications for each game...] "Not for individual emulations, no. It's usually impossible as I'm finding out how a game works, and what's required, whilst I'm writing the emulation. You can't spec something that you don't fully understand! Emulator core resources are another matter. Before adding anything to the emulator core (something I haven't had to do for months now), I write documentation covering what's required and how the programming interface will work." Q.14 Where can I find more information on the internet and WWW? See section R.4 under References. Also, Neil Bradley suggests: "Do an infoseek search on '+cpu +emulator'. There is a page that has emulators, and many, many other links that will give you more than you asked for. ;-)" Q.15 Should I release my source code when I'm finished? By all means YES!! :D It's really up to each individual author. Some people (I won't name names) have chose to keep their emulators from the public, with thoughts of a commercial release. Others have released their emulators as freeware. Still others plan to release the source code with their freeware emulators. I, personally, think that emulation is a hobby to be shared with the rest of the world... Mike Cuddy says: "I plan on releasing every scrap of code, documentation, etc. when I'm done. Making emulators is hard-enough without charging people money, or hoarding information (dig, dig ... you know who you are ;-) -- besides, given the quasi-legal status of most of the ROM images, it's hard to justify charging people -- I'd rather have more emulators floating around! And like I said, when this ordeal is done, the release will be a SOURCE release." -------------------------------------------------------------------- 8b d8 8b d8 8YbmdP8 .d88b 8d8b.d8b. .d8b. 8d8b Yb dP 8YbmdP8 .d88 88b. d88b 8 " 8 8.dP' 8P Y8P Y8 8' .8 8P YbdP 8 " 8 8 8 8 8 `Yb. 8 8 `Y88P 8 8 8 `Y8P' 8 dP 8 8 `Y88 88P' Y88P dP 8 -------------------------------------------------------------------- M.1 Crazy Climber CRAZY CLIMBER HARDWARE DETAILS AND MEMORY MAP by Lionel Theunissen (08/01/97) Please don't take any of this information as gospel. This is what I have gleaned from my analysis of the CC ROMs and circuits, and I could be wrong about a few things. Some of it is best guess, but most of it should be correct. Bear in mind that it was quite a while ago (3 years) that I was originally working on this, so coming back into it I'm a little fuzzy on details. M.1.1 Video The video circuitry for Crazy Climber is similar to other early 80's games, but has some unique features. The display is character generated, 32 characters across and 28 high, which makes 256*224 pixels. The 1k of screen RAM addresses the character ROMs (ROMs 3-6); a pair for each character set, which give two bits per pixel, and along with the colour RAM, determine the colour for each pixel. Each vertical character column (32 in all) can be scrolled independantly using the column scroll registers at 9800h. Note that unlike most other games of the time CC uses a horizontally oriented picture tube (as in a VGA monitor), rather than the vertically oriented tube as used in Pacman, Galaxians, and Space Invaders. As in most character generated displays of the time, the colour of each pixel is determined by a combination of the lower 4 bits of the colour RAM and the two bits per pixel from the character generator ROMS. Bit 4 of the colour RAM selects between two character sets. An unusual feature of the display circuitry is what I call the Big (or main) sprite. There are 256 bytes of RAM at 8800h which are attached to their own character generator ROMs (ROMs 1&2). This can be moved as one big block using the control registers at 98dch-98dfh. This sprite is used for the logo in the opening screen, the bird, and other large objects in the game. I have yet to work out much of the detail regarding the small sprites, but they seem to be similar to pacman/galaxian. Anyone who would like to help out with this please contact me (I have limited time at the moment.) M.1.2 Sound Crazy Climber uses an AY-3-8910 addressed at I/O 8&9 for music, and has a sample playback system for other sounds controlled by the two ports on the AY-3-8910 and registers at a004h, a800h, and b000h. ROMs 12&13 contain the sample data. From the circuit it appears that the sample information is 4 bit with two 4 bit nybbles per byte of ROM which are read sequentially. I haven't confirmed this though. M.1.3 Other Details There is a watchdog circuit which will reset the processor if the machine switches (coin, player start, etc) at b800h are not read for a certain period of time. This ensures that if the program crashes due to a power glitch or whatever, the program will reset. There is little point in emulating this. M.1.4 Memory Map Note that the address decoder on CC only decodes to 2k blocks, therefore 1k of RAM at 9800h will also appear at 9c00h. In places the software will write to a mirror address; Eg. the Colour RAM is addressed at 9c00h and the column scroll registers at 9800h. These are actually both part of the same 1k RAM on the CC boards. The column scroll registers take up the first 32 bytes of the colour RAM. Since these bytes correspond to an area of the screen which is not displayed they can be used for this purpose. 0000h-4fffh ;20k program ROMs. ROM11=0000h ROM10=1000h ROM09=2000h ROM08=3000h ROM07=4000h 8000h-83ffh ;1k scratchpad RAM. 8800h-87ffh ;256 bytes Bigsprite RAM. 9000h-93ffh ;1k screen RAM. 9800h-981fh ;Column smooth scroll position. Corresponds to each char column. *This is actually part of the colour RAM. 98dch ;big sprite control. 98ddh ;big sprite colour. 98deh ;big sprite y position. 98dfh ;big sprite x position. 9c00h-9fffh ;1k Colour RAM: Bits 0-3: char colour scheme. Bit 4: 0=charset1, 1=charset2. 0a000h ;RD: player 1 cntl. WR: NMI: 0=disable, 1=enable. 0a001h ;WR: Video horizontal invert. 0a002h ;WR: Video vertical invert 0a004h ;WR: dig sound trigger? 0a800h ;RD: player 2 cntl. WR: dig sound speed? 0b000h ;RD: dip switches. WR: dig sound volume? 0b800h ;RD: machine switches/watchdog. I/O 8 ;AY-3-8910 Reg? I/O 9 ;AY-3-8910 Reg? *If anyone can help fill in some of the blanks or has corrections please email me. Lionel Theunissen (lionelth@ozemail.com.au) M.2 Dig Dug [provided by Ivan Mackintosh (ivan@rcp.co.uk)] M.2.1 Memory Map Taken from the "Dig Dug CPU PCB Schematic Diagram" - Sheet 3a HEXA- R/W DATA FUNCTION DECIMAL ADDRESS D7 D6 D5 D4 D3 D2 D1 D0 0000-3FFF R D D D D D D D D 1st Priority Z80 CPU ROM (16K) 0000-1FFF R D D D D D D D D 2nd Priority Z80 CPU ROM (8K) 0000-0FFF R D D D D D D D D 3rd Priority Z80 CPU ROM (4K) 6800-680F W D D D D Audio Control 6810-681F W D D D D Audio Control 6820 W D 0 =3D Reset IRQ1 (Latched) 6821 W D 0 =3D Reset IRQ2 (Latched) 6822 W D 0 =3D Enable NMI3 (Latched) 6823 W D 0 =3D Reset 2nd and 3rd Z80 CPUs (Latched) 6825 W D Custom Chip 53 Mode Control (Latched) 6826 W D Custom Chip 53 Mode Control (Latched) 6827 W D Custom Chip 53 Mode Control (Latched) 6830 W Watchdog Reset 7000 R/W D D D D D D D D Custom Chip 06 - Data 7100 R/W D D D D D D D D Custom Chip 06 - Command 8000-87FF R/W D D D D D D D D 2K Playfield RAM 8800-8BFF R/W D D D D D D D D 1K Motion RAM (HPOS, VPOS) 9000-93FF R/W D D D D D D D D 1K Motion RAM 9800-9BFF R/W D D D D D D D D 1K Motion RAM (PIC) A000 W D Playfield Select (Latched) A001 W D Playfield Select (Latched) A002 W D Playfield Color Select (Latched) A003 W D Alphanumeric Color Select (Latched) A004 W D Playfield Select (Latched) A005 W D Playfield Select (Latched) A007 W D Flip Video B800-B83F W D D D D D D D D Write EAROM Address and Data B800 R D D D D D D D D Read EAROM Data B840 W D D D D Write EAROM Control M.3 Ms PacMan [provided by Allard van der Bas (avdbas@wi.leidenuniv.nl)] I'm stuck at the moment, so it wouldn't hurt to get some feedback on what I found out so far. The information holds for mspacman (non bootleg version, the bootleg version is only different in how it processes it's interrupt). [Note: This information also applies to PacMan. See section M.2.6] M.3.1 ROM Files name type location -------------------------------------- mspacman.6e code $0000-$0fff mspacman.6f code $1000-$1fff mspacman.6h code $2000-$2fff mspacman.6j code $3000-$3fff mspacman.5e char non memory mapped (see pascal source) mspacman.5f char ? non memory mapped (see pascal source) mspacman.u5 ??? non memory mapped mspacman.u6 ??? "" """ "" mspacman.u7 ??? "" """ "" M.3.2 Memory Layout ROM $0000-$3fff code + data RAM $4000-$43ff video 1 (filled with $40 means clear) $4400-$47ff video 2 (filled with $0f means clear) $4c00-$4fff general purpose RAM M.3.3 Memory Mapped Ports $5000-$5007,$5040,$5080,$50c0 ($5050-$505f). $5080 : dipswitches ? $50c0,$5040 : joystick / slots ? $5000 - $5007 : timers (for interrupt) ? $5050 - $505f : ??? <- referenced only once. M.3.4 OUT ports $00 : interrupt chooser An OUT $FA at port 00 chooses interrupt routine at $3000. This one is only activated once ($3000 has some sort of machine check). An OUT $FC at port 00 chooses interrupt routine at $008d. This is the general interrupt used throughout the game. The bootleg version handles interrupts in a different way, (not IM2). But accesses the same interrupt routines. M.3.5 Character Sets The chars are built up really weird, chars are encoded using 2 bits per pixel, but chars are 8x8, so 1 char takes 16 bytes. The first 8 bytes are the lower pixels and the second 8 bytes are the top pixels. Look at the include pascal source to figure the chars out. M.3.5.1 Pascal Source (ZIPed an UUencoded) I've ZIPed and UUencoded two pascal source files Allard van der Bas sent me. The information is much more compact in this form -- including the full pascal source would have taken up too much space! From the comments: { Used to find characters in rom files. Mspacman chars are really 2 bits per color, but use only one color to detect shapes, Dumps both character roms on a 320x200 screen } And Allard said: "The mode13h Unit isn't fast enough to support the screen updates needed for decent emulation. (I got about 30 fps using predefined sprites on my P120/Mach64; the overhead of the emulator will kill this to about 5 fps). But you're free to do what ever you want with it. (Just loose the (c) notice in mode13h.pas)." Just cut and paste this UUencoded block to a new file and decode it. If this is a problem, let me know and the source files can be distributed with the HowTo as separate files... begin 644 avdbas.zip M4$L#!!0````(`,^^,$:%^H[LO-`R8S9\^>.3.[SA7-[RE9P2#)PDNV)L&*9/V84':VO[>_]PS? M&(;`XP`+*&(&/Z7J;].+J41=YB&ZK5A5,GM:HXQ=D10Y1X`N]"@E3[=NL^D= MG]CBT;J#<03G3QS5"N%,@&$A2NF+6CA^C\@#?E^3%*QK0F%0?NN4G`UCF88+ M;2(K$FB#`YTN+%,2/-C`8^D-XS+T&"<"J#1?]R92W@^2%D*<(#4Z0'A39*)L M$1J*YSU2MX;8G3U`E&"_W$-P\M64%M M'3%0%_L'1*N&V,6X[W@A,V_;(#.O'2A]J)HLX5?UR5%@=>J0BZ@>3*?9/'"B M*%)3N2RG01ZXC*R$2S#E-,GN570`YM.!P?#KA8K-[449NQE/?+V'\57&+<5H^%V4`?"5.V1+FV M_.O5YWL<1;KL2I%17HNH=FVIJ::F7-X%I>;0/:D-W4+U0H[;Y]?3-N]TG:KM M2ERG:YIP:UB/!,,1G-Z=2<@SS$3CU%&+$LHX1'E!89UL,#6GKJ+13YA^F4![ M:PL/MI+E8%ZE.5=$EG;QJ/3Q:*$-:QC@<-2WYHW7E);F[(U\.'#:#47N_15R M3Y.['T5>Y_X(4E>2[K9Q(3I8:U^&&P[MMUJWW9[_>_?7>K=]-5:GLL=8&M,HW:O=,_^7EYKS[JIVK?ACH MX6D#+L>^_/UBC%O4T^`/KZ'M-.`03DU>WKJRSA)BS^U%WD4! MLN+CS_]%Q;HN$J:9KHD$#SR?X8;KV6K^`E!+`P04````"``&OW(A/Q9U)FL( M```A+```"P```$U/1$4Q,T@N4$%3[5IM;^)($OX>B?]0'R(-R3@CDV2S,\G- M*8"]"RL""#L)W&H^.*8G>&-LRS9A5]'\]^T7]YNQ(9D=Z70G/%+&75U=]51U M=757X]MAWX5E/$>ML\55XZ!Q\'(,*@V:_A&T/\"S%\$:9H&'.*_YA$= M>D`&C<-Z/\E87#QFGL8_FJQ1=`;Q@IZ`,8:^F@?<0H@R\5+H"^P&\$(N/ MO#QX1I`'2ZSJ&Y%WF\P]"O(2.G$<(B^BV-W`?\J`DN_C=,XGDCX$,)E,R-;K M(/<70?0(:9P'$=;:[/1'#K3,Q9'NYO%DU+6MVXD-&"//46S,]*Z9H2X1(H>,PSL?!GRAL3HT9-\6/PS@EYOZ5HR,-0V)T'"98&R"V0=7`?E]PL\!U1*,Y%(=)C=A1<] M(@>[(T1=`J5)`46QD:)Y8CRF46(\A*ND$F$G#-X"L(2P$WK1$POY>GS6:IGL MXAFORE96RK-CO25[0;+B*PRP;,C0G0= M0[0FJ/I^^T`ORM4^MZV+,(O.RP,CVP8"TZP'<.2O7VC M+1KM@4$!2<[+WZW^%Z,]J#+H^S*B9J.P"JE-V&4EJ*[Y!M,Z5''7`\N MZ3'@UND1P9H2YN>)/<9-QQTY]QHB9L!X-`8^,(SC!."ZTMU;-H!JGU)$%CVS M#"P'',VYV!Q3C9`S_R,U?73KDC8QC$1S%V2H8'M^OOB(#0ZIP8.1Y70VA@Q& MV)SKD!M&U&^:\N9-JFYA:-`I@4]3%'-H$AMG($JX>85]U8P$2'TO05CNK5@E M=;LBM&L70FD=8,=_-.EL622Z#R\NR/MT-*%Q3^+Z.FQ=5F?A%S@WZ9&.'(K3 M.`S1'+[&*60TSWXK"Q5!NB?NB7OBVXAVE^?QWX8VP'78D@GA-6?@ZHQ02N.E M/$Y/']KV3O9W9:^S^C+1DTQR3C()R1>J'7JZ6'I>6)LML)Q-'^R)>^*>N)M8 ME2'$&;#ZK/1#BEAQ0^3Y.3NBXQ?]E$YZLZ<@F1KD[XPG!+67%(F@/4KO$*VG M!OXSJ^AM''3L7_M#FBV)"KC\#.85;\YDDZDHFBI>(NTST->K@E[`)W3V*F!P M]9]ARFDS29L5HON_P!3^!2:X/9M"HZ3F%-XS/4?P;ZU3F$`>@8LHX2.N>"\S M4L$,)V*$8!+NQ$QT@.@1-@B_`-A#JW@9.'85"E.:-:LP:X9!,C?MLHN'!?84 M'M.3KN66S3BV@O-$CMHTCO"QQGMHLM''A7]5>V?P6H,E/,5B?=;.3DO6DWG6 MB;632=A.0,Y%MGLJ^9JMX/M`CZ>UR-H#RU**G@I MC2M3K"X.%_1>4AXPR,-/%47E+4@=MKP%C=3@K((ML0@:+70[I$(![7DY!@OE M*%T&$8)WYKN3),Z"/(@C&'V%N1JA&MJ4$7IP)%/X0)'`['H8M4W$@O)SJL8B/_^"E,3$)7 M=V>7LS+:Q!XKW:3V%H/)]M'5_2[N%U2`EB*.;D;**+HCR2U)R.61P<*<_U^[ M47W7#K7S`J,4E-RY\C9(WG=I-V$_(/PV0T\/.SE9/?U*"<-5PDP+&Q5K89(: M',4-5+NX@%(:,FAX="HW3DJ\%+%2<0I1N:UIE3G?>4IYW=TX#RW]>7M05%QT MG(+_EQ\&HDSA`;.3C032YK6)QL9"K$+I)SB!TTJ19>Z2R-KHE`#_6:2J(G_> MT$SGNU9S55S7.T<-]CJ#2TN@I%C!5UH:VR9/+IFMAFRNF"WL18"51=9$3O<5 MRD_E;2EL/B_PDRJ5W.F1N\7V8*MRMBZ?6YO2"D\VWR^/N#?)!46UZM+\%`M_ ME^5%4CBM50Y,.R;0^^SGU/,>Q_7(.^@\4 M.0@S7RJ9J'*.-B.3YKFM!KUZ0;S-0?6S`^]AN<,_2KZM4*>LERVY^)4U8W5* MWI:9]P7EOJ#<%Y3[@O+_O*#\GRHGMQ23Q8FFNK8D!Q3EQUSRT$,(.X6(XI!L MPN3$(1'18T6IG"Q5DUBV:-^,B]V>[??:;K]U/-OUE8)46O+]=>^&HK=5O9M? MRE07*\IO-*9YSGZC@=*O-#(RR.<6YL79H@@$9L[`N,`^6%]B?[%)L8I1KNVX MI/V1-7\;DBFZ7BLG@HT/?/[[(.LQD@^`(K1N9J4/@)2MGGUW*%+ZKRCO1_D= M\IN'+=^X+CY^]-DVX.B=_/,CUEDR?&" | | | | | | | | | | |_____^__________________| The graphic data for each plane is drawn from a 8x8 charset and an attached video ram of 2x1024 bytes. Only 26*32 bytes are actually used, representing a screen size of 26*32 characters. Each video ram consists of two banks, which allows for double buffering (see video control register). Vertical scrolling is controlled by a 8 bit value, which determines the first line to be drawn by the video logic. Example: scrollreg= 9 --> video logic starts reading video ram at byte 32 and charset-rom at the second byte. After finishing row 26, row 0 is drawn (->wraparound). M.4.3 Colors Two 8-to-3 lookup-tables (PAL's) are responsible for color output. These PAL's allow for a palette of 6 bit (64 colors) : 7 bit value --> Lookup-Table1 --> 3x1bit (RGB) --> DAC ] video out 7 bit value --> Lookup-Table2 --> 3x1bit (RGB) --> DAC ] (RGB) RED BLUE GREEN 2bit 2bit 2bit The 8 bit value for lookup tables is composed of the following signals: Bit from --------------- 0 ] 1 ] bit 5-7 of video ram value (divides 256 chars in 8 color sections) 2 ] 3 ] 2 bit pixelcolor 4 ] (either from CHAR-A or CHAR-B, depends on Bit5) 5 0= CHAR-A, 1= CHAR-B 6 palette flag (see video control reg.) 7 always 0 M.4.4 Memory Map 0000-3fff 16kB ROM (code + tables) 4000-43ff RAM A (1kB) lower 32x26 bytes used for video ram (CHAR-A), remaining 192 bytes for variables 4800-4bff RAM B (1kB) lower 32x26 bytes used for video ram (CHAR-B), remaining 192 bytes for variables 5000 2 bit video control register (write only) Bit Used for --------------- 0 switching between VIDEO RAM banks (double buffering) 0: r/w access to 4000-43ff or 4800-4bff is directed to bank0 1: r/w access to 4000-43ff or 4800-4bff is directed to bank1 1 color palette swap (blue/red eagles etc.) this bit represents A6 of color PAL chip 2-7 not used 5000-53ff video control (mirrored) 5800 8 bit vertical scroll register (CHARSET-B) this value determines the first of 32x8 vertical pixels to be shown (wraparound fashion) 5800-5bff scroll register (mirrored) 6000 sound control A Bit Used for --------------- 0 ] 1 ] frequency voice1 2 ] 3 ] 4 ] volume voice1 (probably) 5 ] 6 ] melody module command: 7 ] { , , , } 6000-63ff sound control A (mirrored) 6800 sound control B Bit Used for --------------- 0 ] 1 ] frequency voice2 2 ] 3 ] 4 ] volume voice2 (probably) 5 ] 6 ] noise channel (probably volume 0-3) 7 ] 6800-6bff sound control B (mirrored) 7000 8 bit game control (read only) Bit Used for --------------- 0 coin 1 start1 2 start2 3 - 4 fire 5 right 6 left 7 barrier 7000-73ff game control (mirrored) 7800 8 bit dip-switch (read only) Bit Used for --------------- 0 dip-settings 1 dip-settings 2 dip-settings 3 dip-settings 4 dip-settings 5 dip-settings 6 dip-settings 7 for video ciruits : flip picture vertical when read by CPU: ->horizontal sync: this signal is logical HIGH during video output of row 0*8-25*8, otherwise LOW. 7801-7bff dip-switch (mirrored) M.5 Sega System 16 Games Games : Shinobi, Altered Beast & Time Scanner Version : 1.2 Author : Thierry Lescot (thierry.lescot@ping.be) First edition : 30-11-96 Last update : 05-01-97 M.5.1 Hardware Information Main CPU is a Motorola 68000 at 10 Mhz with 64K RAM ( + video RAM ) Sound CPU is a Zilog Z80 (at 4 Mhz ?) Sounds chip are Yamaha 2151 (FM) and 3012 (DAC) M.5.2 Memory Map Location Size Function -0000 0000 256 K Main 68000 code + misc. data to 0003 FFFF -0040 0000 64 K Scroll video RAM to (see section M.4.3 for details) FFFF -0041 0000 4 K Fixed video RAM (text page) to + video registers 0FFF (see section M.4.4 for details) -0044 0000 1 K Sprites control registers to 03FF -0084 0000 4 K Color memory (2048 palette registers) to (see section M.4.5 for details) 0FFF -00C4 0000 I/O Registers (see section 1.6) -FFFE 0007 1 byte Used to control the Z80 program (for sound) -FFFF 0000 64 K Main RAM to (see section M.4.6 for details) FFFF M.5.3 Scroll Video RAM The scroll video RAM can contain up to 16384 tiles (256 lines of 64 characters). There are 2 bytes for each tile, this is the format: AAAAAAAA BBBBBBBB B7->B0 Tiles number in the bank (256) +76543210+76543210+ A3->A0 Bank selector (16) +--------+--------+ A4 Bank page selection (32 banks/page, 256 chars/bank) A5 Priority flag A7->A6 *function not found yet* Colors: the color base register number is (BANK AND 0x1C)*4 Bank selection: If bit A4=0 the bank selected is the value of A3 to A0, if A4 is set to 1 the bank number is: (value of A3 to A0)*16*(value of byte $FFFFF095) M.5.4 Fixed Video RAM The fixed video RAM can contain up to 2048 tiles (but only 26 lines of 42 characters are used). There are 2 bytes for each tile, this is the format: AAAAAAAA BBBBBBBB B7->B0 Tiles number in the bank (256) +76543210+76543210+ A0 Bank selector (0 or 1 only) +--------+--------+ A7->A1 Color selector M.5.5 Color Video RAM The color video RAM can contain up to 2048 color registers. The 1024 first registers are used for text and scroll video display and the last 1024 are used for sprites. There are 2 bytes for each register, this is the format: ????BBBB GGGGRRRR R3->R0 Red value (0-15) +76543210+76543210+ G7->G4 Green value (0-15) +--------+--------+ B3->B0 Blue Value Note: The 4 first bytes (marked ?) have the values 0, 3, 6 or 9. Anyone know what that means? M.5.6 Main RAM This memory contains, RAM, registers and SRAM. If anyone has more information about this part, please E-Mail me, thanks. Some special bytes: F018: if bit5 is set 1, the screen is not updated F01C: Timer ? F01E: Sprites inactive if set to 0xFF FF00-FFFF : SRAM in Altered Beast and normal RAM in Shinobi. M.5.7 Video Registers 410E81: Video page selection register for foreground (Byte) 410E83: Video page selection register for background (Byte) 410E98: Horizontal foreground scroll register (Word) 410E9A: Horizontal background scroll register (Word) 410E91: Vertical background scroll register (Byte) 410E93: Vertical foreground scroll register (Byte) 440000-4403FF: The sprites registers. There are 16 control bytes for each sprite (64 sprites maximum). This is the function of the 16 bytes. 00 : last sprite line on the screen 01 : first sprites line on the screen (sprites height = [00]-[01]) 02 : high value of the sprite X position 03 : low value of the sprite X position (X = [02]*256+[03]) 04 : horizontal sprite flipping flag (flip if value = 01) 05 : sprite width (real width = [05]*2) (!! signed byte) if the bit7 is set to 1, the sprite is flipped vertically 06 : high value of sprite rom position 07 : low value of sprite rom position 08 : sprite bank selector bit7-bit4 are always at 1 if the sprite is active bit3-bit0 is the sprite bank number (0-F) 09 : sprites priority and base color register selector bit7-bit6: 10 - foreground sprite 01 - background sprite 11 - sprite over everything bit5-bit0: base color registers (is 1024+16*value) 0A : zoom function \ 0B : zoom function - unknown format (never used in Shinobi) 0C to 0F are not used in current emulated games The sprite location in bank is ([06]*256+[07]+[05])*2 M.5.8 I/O Registers C41003 - 1 BYTE - 1ST PLAYER CONTROL Bit 0 - Magic Bit 4 - Down Bit 1 - Attack Bit 5 - Up Bit 2 - Jump Bit 6 - Right Bit 3 - Unused Bit 7 - Left C41007 - 1 BYTE - 2ND PLAYER CONTROL same as 1P C41001 - 1 BYTE - GENERAL CONTROLS Bit 0 - Coin 1 Bit 4 - 1P Start Bit 1 - Coni 2 Bit 5 - 2P Start Bit 2 - Test Bit 6 - Unused Bit 3 - Service Bit 7 - Unused C42001 - 1 Byte - Dip Switch settings #1 - Game configuration C42003 - 1 Byte - Dip Switch settings #2 - Coin configuration There are some other registers in this area but I don't know the function. M.5.9 ROM Files Shinobi ------- When you load the A1-A5 and B1-B8 roms, you must load the rom like this: bytes N of ROM loaded at start address+1+N*2 and bytes N of complement ROM loaded at address start address+N*2 Shinobi.A1 68000 code, loaded at 0000-0001 Shinobi.A2 68000 code, loaded at 0001-0001 Shinobi.A4 68000 code, loaded at 0000-0000 (complement of A1) Shinobi.A5 68000 code, loaded at 0001-0000 (complement of A2) Shinobi.A7 Z80 code + music data, loaded at 0000 Shinobi.A8 Z80 ROM, samples Shinobi.A9 Z80 ROM, samples Shinobi.B1 gfx sprites, not memory mapped Shinobi.B2 gfx sprites, not memory mapped Shinobi.B3 gfx sprites, not memory mapped Shinobi.B4 gfx sprites, not memory mapped Shinobi.B5 gfx sprites, not memory mapped (complement of B1) Shinobi.B6 gfx sprites, not memory mapped (complement of B2) Shinobi.B7 gfx sprites, not memory mapped (complement of B3) Shinobi.B8 gfx sprites, not memory mapped (complement of B4) Shinobi.B9 gfx tiles, not memory mapped (bit 0 of each pixels) Shinobi.B10 gfx tiles, not memory mapped (bit 1 of each pixels) Shinobi.B11 gfx tiles, not memory mapped (bit 2 of each pixels) M.5.10 Graphics Formats The sprites: there are 4 bits / pixels (16 colors), colors 0 and 15 are used for transparency. There are 2 pixels coded in each byte, the first pixel coded in bit7 to 4 and the second in bit3 to 0. The tiles: the size is 8x8 pixels and there are 3 bits / pixels (8 colors), color 0 is used for transparency. I found the same format in the following roms: Shinobi, Altered Beast, Golden Axe, Quartet I and II, Time Scanner, Shadow Dancer, Moonwalker, Choplifter, Alien Syndrome, Out Run, Turbo Out Run, After Burner II, E-Swat, Hang-On. It seems to be a standard for Sega games. M.5.11 Sega GFX Viewer V1.0 Source Code (ZIPed an UUencoded) I've ZIPed and UUencoded a C source file that Thierry Lescot sent me. The information is much more compact in this form -- including the full source would have taken up too much space! From the comments: Sega Arcade Gfx Viewer v1.0 - Character Version Thierry Lescot, ShinobiZ@ping.be Usage : showchar.exe file1 file2 file3 game name file1 file2 file3 Shinobi shinobi.b9 shinobi.b10 shinobi.b11 Altered Beast ab11674.bin ab11675.bin ab11676.bin Golden Axe ga12385.bin ga12386.bin ga12387.bin Shadow Dancer sd12712.bin sd12713.bin sd12714.bin Time Scanner ts10543.bin ts10544.bin ts10545.bin Hang On 6841.rom 6842.rom 6843.rom After Burner II 11113.rom 11114.rom 11115.rom Alien Syndrome c09.as c10.as c11.as Choplifter 7127.rom 7128.rom 7129.rom E-Swat e12624r e12625r e12626r Moonwalker m13216r m13217r m13218.r Out Run 10230.rom 10231.rom 10232.rom Out Run 10266.rom 10267.rom 10268.rom Quartet quartet.c9 quartet.c10 quartet.c11 Quartet II q7698.bin q7699.bin q7700.bin Turbo Out Run 12323.rom 12324.rom 12325.rom WonderBoy II ml8 ml9 ml10 Just cut and paste this UUencoded block to a new file and decode it. If this is a problem, let me know and the source files can be distributed with the HowTo as separate files... begin 644 showchar.zip M4$L#!!0````(`">+)"*.+'^(808``%P0```*````4TA/5T-(05(N0[57;5/C M-A?]7&;V/P@Z2^TD!-MQ0F@P4UX"RRQ;MB2[V^?9,AG9EA,-CN3*#G':\M][ MY7<[T)$D0DTWU2JWKV&C@7I92J@75 MKS#M[=K'#:QK#:Q+DC,?LB8N.B2"Q)KKGO$H;. MXEHNPULYB13"O6< M.)BQ"@>*0EWKFZ53BLT&[NA:`^N`I?_%@@<^ M3714+BCE454TX&$#'^<*Q@>3-8ZJWO(BNC$P3%''_08>"$GP@7.VQOYC7<)2 M[QGZ0-3Q40.#*,EPMXK0_:HY$[IF]+1JW0!7IT9B(\_B58K!H.XRJ!9&XF%. M\=,*BX@T*_%KVMMUCALX>]!*K%=)BM60&AT-CH?%.DSQ<0T?:5JQN%?"YEL) MZ9!L;54!KJTJP,6J^L*92\0YW]1T+/UA+;6E?]S`NI;L.:U#>?N6,L=?N02= M8-\G<\&[B].DWR4>9039FXB@%0OIG!$7R8U0COJ\R`^19`78>9QX'`\5C'70U MNQ^?7:JC9)1Z2/$LZ\=/M[>Y`UR!H"SRE+VQ$%QTT`UR,/LN0I("O0W1[B]L MKX,@1,KQ_&;GN=!Q3[![B2,<*D"!W)PTR298=X#:TE*W1*B=_DX3LE>>1X2E MI$A=0KFXHZ0UR&*EN0@(HJ36G:Q&H"T[ MOYE^./N(6D^A`U*9!2V.R,RFT1('2L\`-8:I57+TN\*2[3QI;6O02XE"$LT< M[G.A&/U^!^W#:#%ATD[;-C-K9DDCU?$5F!`6":*DHF!B.8LZ:.]B)4*8N-OQ MU?3P_N;ZW12J(;-B2AL0T*OQ[-?^D<7GY M<&!+'_2&9DO&'.6=CD^P4+(ZJD5WF#U)2=TAG/1!;]W#MRY$DZ"M5R>\K9>N M#=U/=>$982(XD=LO/=/EO9'K>[,+8N$F%S\D\$TV%LNQ.!V+B['<57INY).Q MJ0[EH](WEJ.%(PS/@E44T)CXIGHZW':6>Z:2F5KOQ_^;R26I[N\K<@IW+4U5DZD].!B]ZI&L MW]*E7`&9;[M=C_J,U@OJ$Y21["8DX\E%L:W(S6")*4MV72SF3B=]X%LM`$_Y M/I,TV2$THPSJEQ\#+`0%_BRB2R*:G;),'`M7J3X1^1%1^U#`2Q(FGPN7JV50 M?BZ<^]QYS#\5?F%[51Y9&JGWQ'S]_(&)CW",OD>3=W=?IO(4W/I(*%GA$B1: M":;HY?E4C;:;[:J6=)R%]#@;EC,[3Q L x x x x x x x byte 2,3 X start (DAC initial) x axis up/down counters byte 4,5 Y start (DAC initial) y axis up/down counters byte 6,7 adr of line instructions vector address counter byte 8,9 appearance, angle symbol angle latch byte 10 size serial multiplier Line Instructions ( 4 bytes / line ) byte 1 L R R G G B B D byte 2 length vector length counters byte 3 line angle vector angle byte 4 screen quadrant vector angle M.7 Space Invaders [provided by Nemoto Yohei (BYY03025@niftyserve.or.jp)] note - The Sound port is uncomplete! 1996.7.20 Ryusendo/Root M.7.1 Board Spec CPU 8080, i8080 is lower-compatible chip of Z80-CPU RAM 8kbytes, i8kSRAM @8 piece ROM 8kbytes, i16kEPROM @4 piece SOUND Sound Effect with analog circuit Input Device 2way stick + 1 button *2 coin switch, 1Player start, 2Player start TILT switch M.7.2 Memory Map 0000h +--------------------------+ | Program ROM | | | | | | | | | | | | | 1FFFh | | +--------------------------+ 2000h | Work RAM | 23ffh | | +--------------------------+ 2400h | | | Video RAM | | | | | | | 3FFFh +--------------------------+ | | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ FFFFh | Not Used | +--------------------------+ I/O map ------- *** Port 1 [IN]Controller bit 0=CREDIT (0 if deposit) bit 1=2P start(1 if pressed) bit 2=1P start(1 if pressed) bit 3=0 if TILT bit 4=shot(1 if pressed) bit 5=left(1 if pressed) bit 6=right(1 if pressed) bit 7=Always 1 *** Port 2 [IN]Controller bit 0=Always 0 bit 1=Always 0 bit 2=Always 0 bit 3=Always 1 bit 4=shot(0 if pressed) bit 5=left(0 if pressed) bit 6=Always 0 bit 7=Always 0 [OUT]Shift Value *** Port 3 [IN]Shifted Bitmap Port3=Port4<<(8-(Port2 & 7)) ex. LD a,3 OUT (2),a LD a,10110011b out (4),a in a,(3) ; reg a is 10011000b [OUT]Sound bit 0=UFO bit 1=Shot bit 2=??? bit 3=Hit bit 4=??? bit 5=??? bit 6=??? bit 7=??? *** Port 4 [OUT]Bitmap *** Port 5 [OUT]??? *** Port 6 [OUT]??? ---------------------------------------------------------------------------- .d88b 8 w 8 8 8 w 8P www 8d8b .d88 88b. 8d8b. w .d8b d88b 8www8 .d88 .d8b 8.dP w 8d8b. .d88 8b d8 8P 8 8 8 8 8P Y8 8 8 `Yb. 8 8 8 8 8 88b 8 8P Y8 8 8 `Y88P' 8 `Y88 88P' 8 8 8 `Y8P Y88P 8 8 `Y88 `Y8P 8 Yb 8 8 8 `Y88 8 wwdP ---------------------------------------------------------------------------- G.1 Who wrote this section? Brad Thomas (bradt@nol.net) spent some time hacking on the graphics in various ROMs, and these are the results he sent me. Expect more information on this in the future... (All references to 'I' are referring to Brad.) [Note: This refers only to sections G.1 to G.5] G.2 Introduction I decided to take up the task of seeing how the graphic shapes were stored in rom images to better help my understanding of the internals of arcade games. Below you will find the discussion of how graphics are stored in various games. At this time I will be detailing two different methods I have discovered. G.3 Location of Graphics in Specific Game ROMs This section will detail the following games: (Tant archives used for file listing) Centipede 136001.201 136001.202 Millipede 136013.106 136013.107 Donkey Kong dk.3n dk.3p <--Background blocks dk.7c dk.7e <--Top Half of sprites dk.7d dk.7f <--Bottom half of sprites Vanguard sk4_ic13.bin <--Special case rom Contains both parts merged into one file Scramble 5f 5h Frogger frogger.606 frogger 607 Bagman a2_1e.bin a2_1j.bin <--1st set a2_1c.bin a2_1f.bin <--2nd set Amidar Japanese amidar.5f amidar.5h Pool (Billards Game) pool.d pool.e Lost Tomb lostt.5f lostt.5h The End ic30 ic31 Zaxxon zaxxon.14 zaxxon.15 Others that probably apply: (I can almost see them but not all there yet...) Xevious Dig Dug G.4 General Information It took me a while to see what was happening with the graphics. First I thought the two files should be merged together as one but after some experimenting I found that the two files work in conjunction with one another. G.4.1 Pixel Layout The best way to describe this is to give an example. I will be using the Donkey Kong file dk.3n which has the first 8 bytes of: 38 00111000 7c 01111100 c2 11000010 82 10000010 86 10000110 7c 01111100 38 00111000 00 00000000 As you can see this makes the shape of a 0 (zero). Now here's the rub... You have two files that look very similar and are wondering what to make of them. Did they just include two copies of the same graphics. No they didn't. What they did was devise a way to get another color on the screen. Let's look at an example from the two files: 26 00100110 24 00100100 6f 01101111 6d 01101101 71 01110001 cf 11001111 78 01111000 ee 11101110 78 01111000 8e 10001110 71 01110001 df 11011111 35 00110101 51 01010001 00 00000000 00 00000000 To plot the pixels you have to use same number position from each file. [Chris Hardy suggested a new representation...] Pseudo color defs: 0 & 0 :" " 0 & 1 : + 1 & 0 : * 1 & 1 : X Take 26 and 24 from the first line: 26 00100110 24 00100100 -------- " X X* " The final example looks like: " X X* " " XX XX*X" "+X**+++X" "+XX*X++ " "+***X++ " "+X*X+++X" " +*X * X" " " The result is what would be plotted given whatever color scheme. The bytes run to the right in the file of course, but the line plotting runs from the right to the left essentially. The above would be the rightmost slice of the 8 slices and the 00 and 00 combo would be the leftmost slice. If you plot this on a mode 13 screen the graphic would be sideways, As would be on a long vertical monitor (which I am speculating). What I have described will only show a 8 x 8 pixels block on the screen. Some games use more than one to make the full character. Donkey Kong sprites are 16 x 16 so you would use 16 bytes to get the first half of the sprite on the screen (from the first file set) and 16 from the second file set. Millipede uses more than one block to make up bigger sprites/characters. In some games, the numbers are shown backwards or mirrored. This is just how they were stored. The one item that I cannot comment on this time is the color schemes used for the various games. In my trials I just picked 4 colors that were different enough to show the differences. G.5 Notes and Requests I pretty sure this is correctly transcribed from my notes. If anyone finds any errors I have made please let me know. I have written a small utility to view these but it is not user friendly at all so at this point I'm not going to release it. If by some chance someone else decides to make one, please let me know. Also, if anyone has anything to add to this document please email me. (bradt@nol.net) I am also looking for the following: Memory layout for Scramble, Amidar, Bagman and any other Stern game. Schematics and memory layout for Vanguard. Everything relating to Krull (Schems, memory layout, ROMS!!!!) I will be working on another part of this section that covers graphics storage for other games. G.6 Mode Q (256x256x256) Source Code Gary Shepherdson (od67@dial.pipex.com) sent the following code to me. Emulator authors have recently been asking for code that would let them use a video mode suitable for their target game(s). It seems Mode Q, 256x256x256, is the answer for many... Just cut and paste this UUencoded block to a new file and decode it. If this is a problem, let me know and the source files can be distributed with the HowTo as separate files... begin 644 modeq.zip M4$L#!!0 ( .?@B%IXM\LF0@ #,N ' ;6]D97$N8^T::V_C-O*S M N0_3'MH(26.(]M)-IMD%TCS6!2WKSAN[T-OL: ERB8J2P8E.W;W]K]WAJ1> MD;-)&GF! R(DLL0AA_/F#*G=K9T&KZW=S8W=+6CPTABM=Q_.+^ *[.[^P<+\ M.Y#R)(6IC$>231Z+L7D:FY;CYL:_1.2%,Y_#29+Z(FZ/7Y?;_#BYU>+%D>FE M1OL\$!&'T\&@?_;A_>?3\_.^9;F+GN<6P'>_7I\9B )U"]#O;TXOWI_^\O9" MPPG:*Z#7%U?E<7L%Y$W_M#H=+V!G_4%Y.K\T['IP.OCMNACF,\U&NIQR[ *S M*!&CB/O@C9F$X3+EQRN R3B6*=S$TC\N#TY2.?/2S8TOFQL6 :TI=L,>%N&Q M1.3S1?XV9^&,<'\E"9RSE!UK0KZA86-2V!\2GJ8B&B40Q!(F,:KEZC[[T,HV MD\$[''/UQR=XA?1\L;Z TDH+?UR7[KSWM840#?#W"L!^4 =TZ-Y; 5 (]]PZ MH$?WPVX=H.Y[IW7 /MU?K@ ';+J[&MNZ@#%>6<%58IS5A:)5U*4VZD#])V7 M ;P0>X4J SC0X#+ +62UUZD#>D;LV/[U^!Y+_X>Q#)T#(S9X<1C/)$Q9B%[" MGQAO&PS@&<;W'P871S 8<^B_^054($A@,L-59LA!1) B1+)HQ,%U80=ZEV#3 M[T'/N0-CTW+ZWK;TRZ%^(>WG3WE;-V_KYFV] MO*U7M%V64;J$E)I=M^/F3WE;-V_KYFV]O*U7M%V642)2W4Q(\Z>\K9NW=?.V M7M[6*]HN#I<:OGZBYD,SCGRJ";>;I&>4SRF>4SRB?43ZC?$;YC/+_ R46 MQ:885D5X@/];OPN?QWTV.2YR7\RDI[&(4BXAC555/.&36"Y!I[!K*S&N>4K5 M"S^3I4U;(C G M:AQ58LPB$4?0OWAS#5+9@B7;BS9;P"O=B[914/6'![8J.7^6^.?0;LKZ]&ZA MA8E(I UJJ<'+T/@K$BA8*!*L*,DC)&?^4FG>\_@T!18ML9J;#$7$4I)P'.!K M%(C13.J&&D;)1R(A'\NVG.XQEWMI?#JOMS%:@[%(L'">Q^$<^>81&X9(*=Q( MD>([]:TO8B\70J)OCC&10W%GTRY MA]$//(;Q[\CD 99%KY7SB2-JM3(/*!T).)A>((002XX!#^3N#02AF.X$83Q5 M"!&:.T(99PMD6_O]_]0.KW*9RH5(>92@)I69$))9"L+$*]3X?=C51J%!.\3 M_N=QB;W\A.4H;ZJ>K!Q5D6M)EM J BU?2.ZEX3(S614&U.;/#F6+*TJ%, MT9B?QJ@FGP=L%J9'%;GH *XS%M,!D[ET'/M'-;$4E"MQ9Y1KV2/9!,4F8ZSU MD=N="MXPMSPS])O,4.O2BQ1WG;-_&V+1FBMBD MM),'IRU)5*<0Z2"598>V$939<%:).&E6VVU%DP2"32/(Z*QR$^ M&C,H)TEG!_H4L)8]G1T:BW?JB=K9RY::I3X( :.[ $,#^!Z6Q<*P(3MH\"I; MUFP*1*-:ORJVE4 @XXF)3_I0Z^ZLZKL8&=%93=XM@6I47PA@@!FA9K6)4,BS M!>;M[C$(.*%S3GS <)+E0A)AJHQV;-NLN@_:LN;"^2YKZ,91MG*TSG'LFN M(3&DKW?*&)?Q#%>0R123557HFQ(K$R.Q&@/6+,ET+\8_-9_7_HPJOW?Z$<5?D8!?G-@-WLWZ;/S ()+8L85O>3=V:)^ M+XF&MM)B^QCM9_.?80F(L['R:8-1>7'>\&",)4]'WW[W[\^7'U&##)?0EOM8 MT\PH/)?L!L:Q%']AO<1"%2L3X'..Q'5MM##\,KCH4T>W"(,NXB!PIW>9[2^9JG" M0ZFMR &Y3H77B!3*,EC!3"Z#Q=TR6"&Z53)8/%D&]TOG/TRD*BR:"$F%.6;( M%#2QIAYR!'&][95F&]VER/;4H%61:"42%W',-7%,,?XW4$L! A0#% @ M Y^"(6GBWRR9" ,RX < 0 *2! &UO9&5Q+F-02P4& 2 $ 0 U O@@ end ----------------------------- 888b. 8 8 .8 .d8b. 8.dP .d88b Yb dP 8wwP' 8' .8 88b 8.dP' YbdP 8 `Y8P' 8 Yb `Y88P dP dP ----------------------------- P.1 Who wrote this description? Bryan Edewaard wrote this up and passed it along to Moose O' Malley, who passed it along to me... ;) P.2 You mean Pokey isn't just that guy that hangs around with Gumby? Nope. P.3 Where did they come up with a name like Pokey? POKEY (stands for: POts & KEYs) - Atari #CO12294 P.4 General Description Pokey is a custom IC developed by Atari for use in the Atari 400/800 Home Computers, but they eventually found their way into many classic Atari coin-ops, and are more flexible than the more common GI AY-3-8910 family of sound generators. Pokey sound effects have a unique sound that is easy to recognize once you know what to listen for. P.5 Technical Description The Pokey chip consists of 4 general purpose frequency dividers (cascadable), serial I/O ports, varying length feedback-shift registers (polynomial counters) to create unique sound effects, a keyboard decoding matrix, an IRQ line that can trigger on 8 separate events, 8 potentiometer inputs, and a random number generator that is used for noise effects and also to provide a RANDOM register for program use. P.5.1 Pin-outs 1. GND 40. D2 2. D3 39. D1 3. D4 38. D0 4. D5 37. Audio Out 5. D6 36. A0 6. D7 35. A1 7. Master Clock 34. A2 8. Pot 6 33. A3 9. Pot 7 32. R/!W 10. Pot 4 31. CS1 11. Pot 5 30. !CS0 12. Pot 2 29. !Interrupt 13. Pot 3 28. Ser. Out 14. Pot 0 27. Clk. Out 15. Pot 1 26. Clk. In 16. !Key Read1 25. !Key Read2 17. Vcc 24. Ser. In 18. !Key 5 23. !Key 0 19. !Key 4 22. !Key 1 20. !Key 3 21. !Key 2 CS1 & !CS0 are 2 chip select lines that are used in address decoding to put Pokey on the bus. One can be tied to Vcc(CS1) or GND(!CS0) if you do not need both. The Master Clock in the Atari Home Computer is 1.79MHz, the CPU clock. P.5.2 Address Lines The address lines of Pokey select the following registers: 00 AUDF1 - W 1st frequency divider POT0 - R Position of pot input 0 01 AUDC1 - W Each channel has a control register as follows: Bit 7,6,5 = Distortion 0-7 0 0 0 = 5 bit poly -> 17 bit poly 0 0 1 = 5 bit poly 0 1 0 = 5 bit poly -> 4 bit poly 0 1 1 = 5 bit poly 1 0 0 = 17 bit poly 1 0 1 = polys off - pure tone 1 1 0 = 4 bit poly 1 1 1 = polys off - pure tone Bit 4 = if 1, hold channel at vol level for D/A use Bit 3,2,1,0 = Volume POT1 - R Position of pot input 1 02 AUDF2 - W 2nd frequency divider POT2 - R Position of pot input 2 03 AUDC2 - W Control register 2 POT3 - R Position of pot input 3 04 AUDF3 - W 3rd frequency divider (used with AUDF4 for serial IO) POT4 - R Position of pot input 4 05 AUDC3 - W Control register 3 POT5 - R Position of pot input 5 06 AUDF4 - W 4th frequency divider POT6 - R Position of pot input 6 07 AUDC4 - W Control register 4 POT7 - R Position of pot input 7 08 AUDCTL W Master configuration for the sound channels Bit 7 = 17 or 9 bit poly counter (change noise sound) Bit 6 = Clock channel 1 with undivided clock Bit 5 = Clock channel 3 with undivided clock Bit 4 = Cascade dividers 2 and 1 (16 bit mode) Bit 3 = Cascade dividers 4 and 3 (16 bit mode) Bit 2 = Enable high-pass filter on channel 1, select frequency with channel 2 Bit 1 = Enable high-pass filter on channel 3, select frequency with channel 4 Bit 0 = Divided clock = clock/120 or clock/28 ALLPOT R Shows state of all 8 pot inputs (counting or done) 09 STIMER W Any non-zero value will start the dividers if they have been stopped KBCODE R Last key pressed Bit 7,6 = Modifier keys (Control & Shift on Atari Comp) 0A SKREST W Strobe this address to reset SKCTL bits 5-7 RANDOM R Returns the top 8 bits of the poly counter 0B POTGO - W Strobe this address to start testing the pots 0C unused 0D SEROUT W Put bytes to be sent serially here SERIN - R Read bytes received serially here 0E IRQEN - W Turn Pokey interrupts on and off Bit 7 = Special key ('BREAK' key on Atari Comp) Bit 6 = Any other key Bit 5 = Serial byte ready to read Bit 4 = Serial byte needed to send Bit 3 = Serial output done Bit 2 = Divider 4 reached 0 Bit 1 = Divider 2 reached 0 Bit 0 = Divider 1 reached 0 IRQST - R Determine what caused an interrupt - bits as above OF SKCTL - W Serial port control Bit 7 = Force break (zero state) in serial output Bit 6,5,4 = Serial mode 0 0 0 = Use external clock 0 0 1 = Use ex. clock for send, ch. 4 for read ( A) 0 1 0 = Use channel 4 as clock 0 1 1 = undefined 1 0 0 = Use ch. 4 for send, ex. clock for read 1 0 1 = undefined 1 1 0 = Use ch. 2 for send, ch. 4 for read 1 1 1 = Use ch. 2 for send, ch. 4 for read (A) (A) = async. mode using ch. 4 as bit shift clock Bit 3 = Two tone mode (analog casette)/ Logic mode Bit 2 = Fast pot scan - less accurate pot reading Bit 1 = Enable keyboard scanning Bit 0 = Enable keyboard debounce SKSTAT R Serial Port Status Bit 7 = Serial frame error (SKREST clears bits 7,6,5) Bit 6 = Serial data in overrun Bit 5 = Keyboard overrun Bit 4 = Current bit at serial input port Bit 3 = Realtime version of KBCODE bit 6 (shift) Bit 2 = Key at KBCODE is still pressed Bit 1 = Serial byte not ready to read Bit 0 = Always 1 P.6 Where can I find source code and more info. for Pokey emulation? Try doing a search for 'pokey' on the web. You might find something useful. Also, check out the following site: http://www.htw.uni-sb.de/people/mgietzen/atari/xl_intern.html This page has some interesting information about emulating the old Atari home computers, but it might be useful to anyone doing arcade emulators as well! (6502 CPU emulation, graphics, collisions, sound, etc.) P.7 Finding and using *real* Pokeys Check section R.4.1.5 (Miscellaneous Information) for a link to a site that has schematics for a Pokey card to plug into the parallel port of a PC! Here are some vendors that still sell Pokeys: B&C ComputerVisions 1725 De La Cruz Blvd Ste 7 Santa Clara CA 95050-3011 USA tel: (408) 986-9960 Phone Orders: Tue - Fri 10am-6pm FAX: (408) 986-9968 Store Hours: Thur & Fri 10am-6pm / Saturday 10am-5pm Vendor: new/used hardware, commercial/PD/freeware/shareware. MAJOR ATARI PARTS SOURCE Best Electronics 2021 The Alameda Ste 290 San Jose CA 95126-1127 USA tel: (408) 243-6950 1-5pm Pacific Time Mon-Fri FAX: (408) 243-8274 Vendor: new hardware, commercial software Developer: "XE" Touch, Best Joystick, Best Light Gun. MAJOR ATARI PARTS SOURCE Here is a link to other Atari vendors and developers: http://www.cis.ohio-state.edu/hypertext/faq/usenet/atari-8-bit/vendev/faq.ht ml ----------------------------------------------------- db Yb dP d88b .dPYb. .d88b d8 .d88b. dPYb YbdP wwP YbwwdP 8 8 8 8P Y8 dPwwYb YP wwww 8 wwww dP""Yb `8w88 8 8b d8 dP Yb 88 Y88P `YbdP' 8 8 `Y88P' ----------------------------------------------------- A.1 Who wrote this description? Chris Hardy sent this to me: "What follows is a description of the AY-3-8910 sound chip which was popular for many arcade games. (Bagman, Crazy Kong, Crazy Kong Jr., Gyruss, Juno First, Scramble, and others use this chip.) This came from a technical document about the Spectra Vision MSX machine which uses a AY-3-8910 for sound. (http://www.cs.umd.edu/users/fms/MSX/Portar.txt). I found it by doing a WWW search for "ay-3-8910". Also there is some source code for Marat's MSX emulator to emulate the AY-3-8910 (http://freeflight.com/fms/fMSX)" A.2 Introduction and disclaimer from original document MAYER's SV738 X'press I/O MAP version 1.5 Creation date: 1991. Last edition: Sunday 14-May-95 11:57:57. This I/O documentation was written 1991 by MAYER of WC HAKKERS. It consists of gathered info about the MSX computer SV738 X'Press (here upgraded to MSX 2 by changing ROM and VRAM - see documentation about MSX-2 upgrading). Thanks to Henrik Gilvad (Denmark) for info about the MSX-2 MVDP and the MSX-2 ROMs, to Pel F Hansen (Norway) for VRAM info and to Jonas Lindstrvm (Sweden) for some MVDP info. This documentation is not completed, but it includes the most important things when dealing with I/O ports on a MSX. I do not take any responsibility for changes done by anybody else later in the text. If you change anything I advise you to leave a note on the last page about the change. This text may not be sold, included in commercial software/hardware or firmware packages and it may not be duplicated by any means without the authors permission. This text is shareware; You might copy it an spread it as long as you don't sell the copies. So if you spread this documentation, leaving this page intact and without changes, you have my permission to duplicate it. A.3 Technical Information Note 6a1,6b1,6c1: PORT.A0,A1,A2 I AY-3-8910 PSG (Programmable Sound Generator) ---------- Port summary: A0 W 6a1 I AY-3-8910 PSG Register select A1 W 6b1 I AY-3-8910 PSG Data write A2 R 6c1 I AY-3-8910 PSG Data read The AY-3-8910 is a I/O chip whith 3 sound generators. It controls the three MSX std. audio channels, joystick and cassette. Function/register table: Frequency, audio channel A-C: 0...5 Noise freq.: 6 Mixer: 7 Volume: 8 ...10 Envelope: 11...13 Joystick and cassette: 14 Paddle,joystick sel,touchpad: 15 For register summary, see note 6a1 (port A0). For SOUND A,B (register write) example, see note 6b1 (port A1). For register read example, see note 6c1 (port A2). For joystick read example, see note 6c1 (port A2). Note 6a1: PORT.A0 I AY-3-8910 PSG Register select ------- Port A0h WRITE = PSG register select. This port selects the current PSG register (0-15). Registers are: 0 = Fine freq. channel A (0-255) 1 = Freq. channel A (0-15) 2 = Fine freq. channel B (0-255) 3 = Freq. channel B (0-15) 4 = Fine freq. channel C (0-255) 5 = Freq. channel C (0-15) Output frequency (tone): f = 3.579M/2 T ------------------- 16*(256*fine+coarse) Where "coarse" are one of the coarse frequency setting registers, 1, 3, or 5 and "fine" are one of the fine frequency setting registers, 1, 2 or 4. 6 = Noise period (0-31) Output frequency (noise): f = 3.579M/2 N -------------- 16*NoisePeriod Where "NoisePeriod" are register 6. 7 = Mixer bit Expl. 0 = Channel A tone enable (0=Enable,1=Disable) 1 = Channel B tone enable (0=Enable,1=Disable) 2 = Channel C tone enable (0=Enable,1=Disable) 3 = Channel A noise enable (0=Enable,1=Disable) 4 = Channel B noise enable (0=Enable,1=Disable) 5 = Channel C noise enable (0=Enable,1=Disable) 6 = I/O port A mode (0=input, 1=Output) 7 = I/O port B mode (0=input, 1=Output) 8 = Volume channel A (0-15, 16=Envelope) 9 = Volume channel B (0-15, 16=Envelope) 10= Volume channel C (0-15, 16=Envelope) 11= Envelope fine freq. (0-255) 12= Envelope freq. (0-255) Envelope frequency (tone or noise): f = 3.579M/2 E ---------------------- 256*(256*ECoarse+EFine) Where "ECoarse" are the coarse envelope frequency setting register 12 and "EFine" are the fine envelope frequency setting register 11. Note that the envelope period is 1 ----- f E 13= Envelope shape (0-15) C A A H O T L L N T T D T 0 0 X X \________ 0 0 1 X X /________ 4 1 0 0 0 \\\\\\\\\ 8 (Repeating, see figure) 1 0 0 1 \________ 9 1 0 1 0 \/\/\/\/\ 10 (Repeating, see figure) 1 0 1 1 \ 11 (See figure) 1 1 0 0 ///////// 12 (Repeating) 1 1 0 1 / 13 1 1 1 0 /\/\/\/\/\ 14 (Repeating) 1 1 1 1 / 15 14= I/O port A (Joystick and cassette) bit Expl. 0 = Joystick UP (0=Moved, 1=Not moved) 1 = Joystick DOWN (0=Moved, 1=Not moved) 2 = Joystick LEFT (0=Moved, 1=Not moved) 3 = Joystick RIGHT (0=Moved, 1=Not moved) 4 = Joystick trigger A 5 = Joystick trigger B 6 = Keyboard mode (On japanese machines only) 7 = Cassette input 15= I/O port B (Joystick select) bit Expl. 0 = 1 (Used as handshaking output if touchpad) 1 = 1 (Used as handshaking output if touchpad) 2 = 1 (Used as handshaking output if touchpad) 3 = 1 (Used as handshaking output if touchpad) 4 = Pulse 1 (Positive pulse starting a monostable timer) 5 = Pulse 2 (Positive pulse starting a monostable timer) 6 = Joystick select (0=Connector 1, 1=Connector 2) 7 = Kana LED (Keyboard mode indicator. On japanese machines only) Bits 4 and 5 is used by a program wich uses a paddle. A short positive edge pulse on bit 4 (or 5) starts a monostable timer (in the attatched paddle) and the paddle sets one of the joystick bits in register 14 low (FIRE A (FIRE B),L,R,D or U). When the monostable times out, the joystick bit in port 14 is set high again. The length of the counting period of the monostable timer is set (in the attatched paddle) by a variable resistor. The computer determine the position of the variable resistor by measuring the time while the joystick bit in register 14 is low. PULSE _________|-|______________________ FIRE A/B or ---------|______________|--------- L R D U | - - - - - - -| = Variable resistor Note 6b1: PORT.A1 I AY-3-8910 PSG Data write ------- Port A1h WRITE = PSG data write. Used to send data to current PSG register. Examples: This routine will do the same as the BASIC command SOUND A,B where A is the PSG register and B is the byte to write sound: out (0A0h),a ; Select register ld a,b out (0A1h),a ; Send data ret Note 6c1: PORT.A2 I AY-3-8910 PSG Data read ------- Port A2h READ = PSG data read. Used to read data from current PSG register. Examples: How to read a byte from a register is shown in this routine (Input: [a]=PSG register, Output: [a]=Data read) read_psg: out (0A0h),a ; Select register in a,(0A2h) ; Read data ret This routine will read joystick 1 or 2: F3 di 3E 0F ld a,0fh Write this for Write this for D3 A0 out (0a0h),a Joystick port 1: Joystick port 2: DB A2 in a,(0a2h) E6 DF / E6 AF and 11011111b; 0DFh and 10101111b; 0AFh F6 4C / F6 03 or 01001100b; 04Ch or 00000011b; 003h D3 A1 out (0a1h),a 3E 0E ld a,0eh D3 A0 out (0a0h),a DB A2 in a,(0a2h) Now register [a] will have the following configuration for joystick in port 1 (or port 2): Bit #: 76 5 4 3210 || | | |||| Name: 10 TRG2 TRG1 RLDU Where TRG2 is the second trigger button (not used on most Commodore joysticks). ------------------------------------------------ .d88b 888b. w w 8P www .d88 8d8b.d8b. .d88b 8wwwP w w8ww d88b 8b d8 8 8 8P Y8P Y8 8.dP' 8 b 8 8 `Yb. `Y88P' `Y88 8 8 8 `Y88P 888P' 8 Y8P Y88P ------------------------------------------------ B.1 What is this section about anyway? I've received lots of information from a number of different people. Most of it has found a specific place in the HowTo, but a few things just don't seem to fit anywhere. I'll put this miscellaneous information in this section, with a sub section for each game. Perhaps these bits of information will be useful to someone trying to emulate these games... B.2 Commando [provided by edoardo (gambare@iol.it)] I've got the original commando's board and my dream is see this game on my PC... MANUFACTURER: CAPCOM of America YEAR: 1985 CPU(s): 2 Nec D780-1 (It's a Z80 compatible chip) SOUND: 2 Yamaha YM2203c B.3 Crazy Climber [provided by Vince Mayo (14u2c@diamond.nb.net)] In case anyone might be intrested in emulating this game(besides me), here is some docs I have made to make Crazy Climber emulation: Uses one Z80, one AY3-8910 for sound ROMS Identification ----------------------- CC12 Sound CC13 Sound CC11 Loads at 0000 - 0fff CC10 Loads at 1000 - 1fff CC09 Loads at 2000 - 2fff CC08 Loads at 3000 - 3fff CC07 Loads at 4000 - 4fff CPU working area RAM is 8000-83ff (2 2114s) (1k x 4bit) CC06 All graphice ROMS I think. They are attached to six 2125s CC05 (512 x 4bit?) This would be 3000 bytes of RAM area (for video RAM CC04 possibly?) CC03 CC02 Character ROMS I think. They are attached to two 5101s CC01 (256 x 4bit) only 256 bytes being used. (also video RAM?) ------------------------- Other information in CC Schematics: RD0 - 8000 RD1 - 8800 RD2 - 9000 RD3 - 9800 RD4 - a000 RD5 - a800 RD6 - B000 RD7 - B800 I might be wrong about the 3K RAM from the six 2125s. (I believe they are (512 x 4) = (2 of them = 512 bytes) which would mean there would only be 1.5K total out of the six. B.3.1 Decrypting the ROMs by Lionel Theunissen (lionelth@ozemail.com.au) "HOW TO DECRYPT THE CRAZY CLIMBER ROMS" by Lionel Theunissen. Please note that if anyone does use this info for their own CC emulator project I do ask that credit be given where credit is due. I'm not asking for any money, just to be acknowledged in the emulator credits. It was a LOT of work to crack this! As for the decryption algorhythm, a few things; There are two sets of ROMS in the tant archive (Brian Peek's mirror). One is supposedly the genuine set, and the other a bootleg. The set I have on my boards seems to be a hybrid between the two. The program ROMS (7-11) are the same as the bootleg set and the others seem to be the same as the genuine set. The encryption on the bootleg set is different to the genuine set. The following description only applies to the bootleg program ROMs (Only the program ROMs are encrypted). If you look at ROM11 with a hex editor the first few bytes should be as follows if you have the right set: FE FF FF EE 73 00 A0 96 AC 00 44 54 44 54 44 54 The encryption is quite sophisticated and cannot be decrypted without dissassembling the code, working out where the data tables are, and then reassembling. I actually had to write a special Z80 disassembler/unscrambler to do this (This was written on a C64 if you want the program). NOTE: Don't panic! A Z80 emulator program can be easily modified to decode the encrypted ROMs on the fly. Please don't ask me for decrypted versions of the ROMs. On the Z80 there is a pin called M1 or 'machine cycle one'. This pin indicates when the processor is doing the opcode fetch of an instruction execution. In other words, for an instruction like a Jump which consists of 3 bytes, the first byte is the opcode and the following two bytes are the address to jump to. The M1 pin will only be active while reading the first byte. The decryption is only applied when the M1 pin is active. in other words for a Z80 jump instruction:- ROM bytes xx 00 40 -----> would become C3 00 40 ;xx is encrypted byte. ^^ ^^ Note that the bytes containing the jump address stay the same. Similarly, for a two byte instruction, only the first byte will be encrypted, and of course all one byte instructions would be encrypted. What this means is that decryption cannot be applied to the whole file because all data reads are unencrypted. Just to make life a little more difficult, the encryption is different on odd and even addresses. The encryption involves scrambling bits 0,2,4,6 through a prom which is toggled by A0. The following index tables taken from my disassembler/unscrambler program decode the opcode bytes. Use evetab for even addresses and oddtab for odd addresses. The values in the tables are all decimal. For example for encrypted value of 1 on an even address you would read 84 (decimal). For an encrypted value of 4 on an odd address you would read 64 (decimal). evetab: db 65, 84, 70, 19, 81, 20, 2, 82 db 73, 92, 78, 27, 89, 28, 10, 90 db 5, 16, 67, 86, 1, 85, 6, 22 db 13, 24, 75, 94, 9, 93, 14, 30 db 97, 116, 102, 51, 113, 52, 34, 114 db 105, 124, 110, 59, 121, 60, 42, 122 db 37, 48, 99, 118, 33, 117, 38, 54 db 45, 56, 107, 126, 41, 125, 46, 62 db 68, 17, 23, 66, 0, 80, 83, 87 db 76, 25, 31, 74, 8, 88, 91, 95 db 21, 64, 7, 18, 4, 69, 3, 71 db 29, 72, 15, 26, 12, 77, 11, 79 db 100, 49, 55, 98, 32, 112, 115, 119 db 108, 57, 63, 106, 40, 120, 123, 127 db 53, 96, 39, 50, 36, 101, 35, 103 db 61, 104, 47, 58, 44, 109, 43, 111 db 148, 193, 135, 215, 129, 196, 130, 210 db 156, 201, 143, 223, 137, 204, 138, 218 db 132, 208, 147, 194, 209, 197, 214, 150 db 140, 216, 155, 202, 217, 205, 222, 158 db 180, 225, 167, 247, 161, 228, 162, 242 db 188, 233, 175, 255, 169, 236, 170, 250 db 164, 240, 179, 226, 241, 229, 246, 182 db 172, 248, 187, 234, 249, 237, 254, 190 db 145, 192, 199, 211, 212, 149, 146, 134 db 153, 200, 207, 219, 220, 157, 154, 142 db 144, 128, 198, 131, 213, 133, 195, 151 db 152, 136, 206, 139, 221, 141, 203, 159 db 177, 224, 231, 243, 244, 181, 178, 166 db 185, 232, 239, 251, 252, 189, 186, 174 db 176, 160, 230, 163, 245, 165, 227, 183 db 184, 168, 238, 171, 253, 173, 235, 191 oddtab: db 80, 17, 18, 82, 64, 85, 86, 87 db 88, 25, 26, 90, 72, 93, 94, 95 db 81, 20, 3, 70, 69, 4, 66, 6 db 89, 28, 11, 78, 77, 12, 74, 14 db 112, 49, 50, 114, 96, 117, 118, 119 db 120, 57, 58, 122, 104, 125, 126, 127 db 113, 52, 35, 102, 101, 36, 98, 38 db 121, 60, 43, 110, 109, 44, 106, 46 db 84, 21, 22, 19, 16, 5, 2, 67 db 92, 29, 30, 27, 24, 13, 10, 75 db 68, 1, 71, 23, 0, 65, 83, 7 db 76, 9, 79, 31, 8, 73, 91, 15 db 116, 53, 54, 51, 48, 37, 34, 99 db 124, 61, 62, 59, 56, 45, 42, 107 db 100, 33, 103, 55, 32, 97, 115, 39 db 108, 41, 111, 63, 40, 105, 123, 47 db 129, 133, 215, 210, 193, 197, 151, 146 db 137, 141, 223, 218, 201, 205, 159, 154 db 212, 208, 131, 134, 213, 144, 195, 198 db 220, 216, 139, 142, 221, 152, 203, 206 db 161, 165, 247, 242, 225, 229, 183, 178 db 169, 173, 255, 250, 233, 237, 191, 186 db 244, 240, 163, 166, 245, 176, 227, 230 db 252, 248, 171, 174, 253, 184, 235, 238 db 145, 149, 199, 194, 209, 148, 135, 130 db 153, 157, 207, 202, 217, 156, 143, 138 db 196, 192, 147, 150, 132, 128, 211, 214 db 204, 200, 155, 158, 140, 136, 219, 222 db 177, 181, 231, 226, 241, 180, 167, 162 db 185, 189, 239, 234, 249, 188, 175, 170 db 228, 224, 179, 182, 164, 160, 243, 246 db 236, 232, 187, 190, 172, 168, 251, 254 I have been thinking that it would be a fairly simple matter to use these tables in a Z80 emulator so that when it decodes the opcodes it uses the above tables to index the encrypted ROMs. This would allow an emulator to use the original encrypted ROM images. If anyone needs any other help regarding Crazy Climber please email. I have worked out most of the memory map and have a partly working CC reconstruction already. B.4 Crush Roller [provided by Vince Mayo (14u2c@diamond.nb.net)] I have looked at the code from Crush Roller and Pacman posted at the Repository and have noticed serveral similarities (besides the same coding for graphics). I looked at the size of the ROMs and started placing them together, and gave this a try: copy /b cra+crc pacman.5e copy /b crb+crd pacman.5f copy /b cr1+cr5 pacman.6e copy /b cr2+cr6 pacman.6f copy /b cr3+cr7 pacman.6h copy /b cr4+cr8 pacman.6j After I have tried this, I loaded the appended ROMs into Dave Spicer's emulator (as Pacman), and it worked well with sound (except for the colors). One other thing about sound. After the game is over, the sound will hang on a note until a new game is started, or escape. Try it out. Its worth a look. I give avdbas@wi.leidenuniv.nl credit for this. I would not have known where to put the ROMs without the sample code. B.5 Gyruss [provided by Mike Cuddy (mcuddy@scitexdv.com)] Mike Cuddy has now set up a WWW page for his Gyruss emulator. He has provided technical information about Gyruss on his page: http://www.fensende.com/Users/mcuddy/gyruss/ Since this information is likely to change as Mike digs deeper into the inner workings of the game, I've decided not to copy the information into the HowTo. Check the above URL for Gyruss information... B.6 I, Robot [provided by John Manfreda (jmanfred@fh.us.bosch.com)] Sound uses a custom IC. The IC is actually 4 pokey chips, using a 'chip on board' packaging technique (flat piece of fiberglass with chips placed directly on and covered with epoxy). From what I am told, this is identical to the sound scheme used on Major Havoc. B.7 Juno First [provided by Mike Perry (mj-perry@uiuc.edu)] Well, someone with a Juno First board gave me the chip numbers and described one as white NEC D780D which is also found on his Galaga board. This has been verified to be a Z80 so that is the processor I will be emulating. The sound chip has been verified to be a SONY AY-3-8910, which has already been emulated in the Vectrex and MSX emulators, so even if I don't know squat about sound programming right now, the adlib/OPL3 code is out there. B.8 Penia [provided by Perry McFarlane (ce596@torfree.net)] Penia (a derivative of Pengo with the famous 'popcorn' music) has been found to have encrypted ROMs. Here is a C program that will decrypt a Penia file: #include main(int argc, char *argv[]){ FILE *fp,*fp2; int c; int i; fp=fopen(argv[1],"rb"); fp2=fopen(argv[2],"wb"); i=0; while((c=fgetc(fp))!=EOF){ if(!i){ fputc(f(c^0x0a),fp2); }else{ fputc(f2(c^0x82),fp2); i=!i; } } } f(a){ unsigned int b,c; b=(a<<4)&0xa0; c=(a>>4)&0x0a; a=(a&0x55)|b|c; return a; }f2(a){ unsigned int b,c; b=(a<<6)&0x80; c=(a>>6)&0x02; a=(a&0x7D)|b|c; b=(a<<2)&0x08; c=(a>>2)&0x02; a=(a&0xf5)|b|c; return a; } B.9 Space Invaders [provided by John Manfreda (jmanfred@fh.us.bosch.com)] Processor info: Intel 8080A Sound info: Discrete circuits are used to generate all of the sound on space invaders. Each sound generated has its own unique analog circuit. B.10 Star Wars [provided by Peter McDermott] I'm just basing this on my schematics. The StarWars sound board which is the sole item in the machine responsible for sound output, has the following parts: 1) a single "TMS-5220 Speech Synthesizer" 2) a "Speech Synthesizer Clock Generator" 3) a "Speech Synthesizer Power Switch" (which is just a circut) Yes, the sound sounds a lot like the movie. Maybe the 5220 is a DAC, not a speech synthesizer... However, they did label the DACs in the analog vector generator "DAC" and not "vector synthesizer." B.11 Tapper [provided by Clay Cowgill (clay@supra.com)] Tapper is based on the Bally/Midway MCR III architecture. Basically you have three PCB's -- the Super CPU, Video Generator II, and the Super Sound I/O. The Super Sound I/O contains about 48 lines of digital I/O (tapper only uses a few), two 8910 sound chips (the 8-bit dataports on the chips are used to drive a vibrato/tremelo/filter setup), all run from a Z-80 (at 2MHz) with 2K of RAM and about 10K Max ROM. The Super CPU is a 6MHz Z-80 board with some RAM and about 48K of address space for game code. The Super CPU also generates a low(er) resolution "background" image from two 8K ROMs. The Super CPU talks to the SSIO through a communication port with a little bit of TTL RAM. The Super CPU also control the Video Generator II. Video Generator II is essentially a Sprite engine. Bitplanes of sprite data are stored in sets of 4-ROM wide banks, one bit per pixel. There's line buffer and position/character selection RAM on the board. It's non-trivial hardware to emulate (the Sound system could be particularly vexing), but if you get it going you should be able to run Spy Hunter, Demolition Derby, and Discs of TRON on the same emulator with just changing the ROM images. B.12 Toki [provided by David Winter (winter@worldnet.net)] The sound chip is an YM-3812, as seen on the board. B.13 Turbo [provided by Patrick J. O'Reilly (oreillyp@execpc.com)] As you probably know from the FAQ and Moose's page, I am in the process of creating an emulator for Turbo. I have received a few responses from helpful individuals to get this project underway. I am still looking for more initial information so I can start to create the emulator. Here are my assumptions so far: 1) Turbo uses one Z80 microprocessor. 2) The screen is approximately 256x384x32 (2:3 aspect-ratio.) 3) Sound is not very complex. 4) Steering wheel is digital, gear-shift is digital, and pedal is analog. 5) Cockpit screen might be 4:3 aspect-ratio. I have no schematics, manuals, technical literature, or ROM images to support these assumptions. This comes from my knowledge of electronics and from playing the game many times. What can I say, I am a nut for this game. Has anyone attempted to create a turbo emulator? Is anyone privy to technical specifications or ROM images which they are willing to share? Does anyone has screen shots or sound samples? Most importantly, does anyone else like this game besides myself? If I can get enough information and the ROM images, I will definitely start producing the emulator. I will also be willing to beta out version to anyone who wants to test it and give me feedback. I plan on coding the entire emulator in IBM compatible assembly. Hopefully, it will be playable on my ancient 486DX50. Anyone interested can e-mail private at: oreillyp@execpc.com Thanks for your time and interest, all help and suggestions are welcome and appreciated. B.14 Tutankham [provided by Moose O' Malley (moose@rocknet.net.au)] Tutankham (1982 Konami, licensee Stern) Raid King Tut's tomb. Sideways-shooting only. CPU : 6809 Sound : Z80 and 2 x AY-3-8910's PinOut : Konami pinout (ala Amidar/Frogger) Hardware : Looks a lot like Amidar, Time Pilot and Scramble. Konami board number : GX350 - Tutankham BTW, Tutankham was my favourite arcade game !! -------------------------------------------------------------------- .d88b. w 888b. .d88b. w YPwww. w8ww .d88b 88b. 8wwwP Yb dP YPwww. w8ww .d88b 88b. d8 8 8.dP' 8 8 wwww 8 b YbdP wwww d8 8 8.dP' 8 8 `Y88P' Y8P `Y88P 88P' 888P' dP `Y88P' Y8P `Y88P 88P' 8 dP 8 -------------------------------------------------------------------- S.1 Step-by-step implementation of an emulator for Phoenix Written by Brian Peek (peekb@union.edu) and Chris Hardy PLEASE NOTE: Do not send email to Chris asking for help. He's got a real job and plenty of other things to do...:) BUT, please DO feel free to send email to me (Brian) if something doesn't work. I'm the one who has actually typed all of this from his emails and my own experiences, so it's my fault if anything has been ommitted or typed incorrectly. So you want to write an emulator for your favorite arcade game, eh? Well, this will HOPEFULLY take you step by step through the creation process of an emulator using the game Phoenix. Almost all of the technical information in this discussion comes from Chris Hardy, author of the awesome Windows 95 Phoenix/Pleiades emulator using DirectX. Chris has helped me along with my own emulator project, and taught me much about writing an emulator by having me write my own Phoenix emulator. This step-by-step will use the game Phoenix, Chris' technical information, and my own experiences. Also, keep in mind that our emulators were written using Marat Fayzullin's Z80 CPU emulation core. With the CPU stuff out of the way, we can concentrate on graphics and whatever else needs to be done. I'll try to give some basic/generic information for each step, and then give an example of what I'm talking about by using Phoenix. After following all of the steps of this guide, you should actually have Phoenix up and running on your screen! Before you even attempt to write an emulator, please be aware that you will need to know the following: 1) More than a basic knowledge of the C/C++ programming language, especially things dealing with bit operators. 2) Assembly language. It's not necessary to know a great deal about it, but you should know what opcodes are, what registers are, how they differ, and what a few opcodes do. You don't need to know what the game is really doing while it's running, so a basic understanding of assembly should be OK. 3) Graphics programming. You should know what bitplanes are, how to draw pixels, use of blitting functions, etc. Again, not a great deal of knowledge is required, but you should know the basics. 4) Hardware. You need to know what interrupts, cycles, vertical blanks, and things of that nature are. 5) Your compiler. Each compiler had it's own little idiosyncracies that need to be known. I work with Borland C++ 5.01 and all of the code contained in this section is guaranteed to run on it. I haven't tested it on any other compiler, so I don't know how it will react. [Note: I've got it to work on DOS-based Turbo C++ 3.0, and Borland C++ 3.1 (I know, I have ancient compilers...)] I will try to explain as much of the above as I can while describing the creation process of the emulator, but without a basic understanding of the above, you might not understand what I'm trying to say. Now, let's get started! S.1.1 Part I: Pre-coding Before you start coding, you'll need to do the following: 1) Pick a game you want to emulate, preferably one with a Z80 processor since that's what this guide will use, however I'm going to try to make this as generic as possible so any processor will work. 2) If the game uses a Z80, congratulations! Now go download the Z80 CPU emulator from http://www.freeflight.com/fms 3) READ AND STUDY IT! It's important to know what functions need to be written by you and how they fit into the whole scheme of things. 4) Download the Virtual Gameboy source code from the same site as above. This is an excellent example for the use of Marat's Z80 emulator. 5) READ AND STUDY IT! With this, you'll understand even more how the functions fit into place. 6) Obtain a memory map or make one yourself. In the case of Phoenix, there's an excellent memory map right in this text file. [See section M.3.4 -- In fact, look over all of section M.3...] S.1.2 Part II: Low/High Endian I'm giving this it's own section because it's so critical. And because I forgot to check it when I started my emulator. :) In the "gb.c" file, (you should have already downloaded it and read it!) there's a check for the "endian-ness" of the machine. This is very important because it determines which byte is the most significant for your machine/compiler. In my case (Borland C++ on a P166), it was requried that I had LSB_FIRST defined in the "z80.h" header file. I suggest you cut and paste the code from the "gb.c" file into a temporary file and run it. It will then tell you if it needs to be defined or not. The code is repeated here: /*** STARTUP CODE starts here: ***/ T=(int *)"\01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"; #ifdef LSB_FIRST if(*T!=1) { puts("********** This machine is high-endian. *********"); puts("Take #define LSB_FIRST out and compile VGB again."); return(0); } #else if(*T==1) { puts("********* This machine is low-endian. *********"); puts("Insert #define LSB_FIRST and compile VGB again."); return(0); } #endif You should #define LSB_FIRST and try running it. If it doesn't give an error, you should define it in the actual Phoenix emulator we'll be writing. Otherwise, try undefining LSB_FIRST and run it again. If no error is shown this time, then do not define it in the acutal emulator. S.1.3 Part III: Let's start coding! 1) Read the ROMs into a "virtual" address space as they would be in the real game. In the example of Phoenix, the following would be done: byte *RAM; RAM = malloc(0x8000); if (!RAM) ERROR; FILE *in; in = fopen("phoenix.45", "rb"); //read in the phoenix ROM in binary mode if (!in) ERROR; fread(&RAM[0x0000], 0x800, 1, in); //read in 0x800 bytes at position fclose(in); //0x0000 in = fopen("phoenix.46", "rb"); if(!in) ERROR; fread(&RAM[0x800], 0x800, 1, in); //read in 0x800 bytes at position fclose(in); //position 0x800 ...and so on. I used a "for" loop to do this, but wrote the steps out here to show what is happening. For Phoenix, we're loading 8 ROMs that are 2K each, or 2048 bytes, or 0x800. That's 16K to you and me. So, 16K = 16,384 bytes = 0x4000. We also have 8K of RAM in Phoenix, so that's another 16K, or 16,384 bytes = 0x4000 for a grand total of 32K (32,768 bytes), or 0x8000. Now, all of your ROMs should be located in "RAM". Please note that we are only loading PROGRAM ROMs, and NOT character ROMs. 2) Since we're using Marat's Z80 core, we must code the functions that are needed for the emulator to operate. In most cases, this should only be M_RDMEM, M_WRMEM, DoIn, DoOut, Interrupt, and Debug. In M_RDMEM and M_WRMEM we need to check to make sure we can read/write to/from the location requested, and emulate any hardware that might be in any of these locations (i.e. dipswitches). For Phoenix, only M_RDMEM, M_WRMEM are needed. However, please keep in mind that just because DoIn, DoOut, etc. are not being used for anything doesn't mean they don't exist. You need to create empty functions for ALL of the functions in the "z80.h" header file that aren't being used. These functions should be DoIn, DoOut, Patch, Interrupt, and Debug. a) Now we need some background stuff. Phoenix uses vertical blanks to update the screen instead of triggering an interrupt. In order to trigger a vertical blank to update the screen, we need to count the number of "cycles" that have occurred since the last vertical blank. A "cycle" is a set period of time in which the processor will do something. It is generally a time frame determined by the clock speed of the processor. So, every instruction that is passed to the CPU takes X amount of cycles to execute. We know (or can guess...) the amount of cycles that can be executed in one video frame (60th of a second for the US (NTSC), 30th of a second for Europe (PAL)). Therefore, if we add up all of the cycle counts for each instruction that the emulator executes, we can tell when we have executed a "video frames" worth of instructions. When this has happened, we can get the emulator to trigger a vertical blank or an interrupt. Marat's Z80 code counts down instead of up and checks when the cycle count is less than zero. If you've read through Marat's code like I told you to above, you've probably noticed a #define for INTERRUPTS and a couple of variables for working with interrupts, namely ICount and IPeriod, in the file "z80.c". IPeriod should be set to the number of cycles that should occur before triggering an interrupt (or in our case, a vertical blank flag) which is 12000 for Phoenix. So, the line in "z80.c" will read: IPeriod = 12000; So, ICount will count the number of cycles that have occurred, and when it is less than 0, we can trigger a vertical blank. The way Phoenix triggers a vertical blank is by setting bit 7 of the dipswitch to 1. The dipswitch for Phoenix is located at 0x7800, which is mirrored from 0x7801-0x7bff. For Phoenix, what I did was create a variable which would hold the current dipswitch settings. When this location is then read, it knows it's time to update the screen. So, when you are coding your M_RDMEM function, you need to return the proper value of the vertical blank bit, as well as reset it back to 0. To do this, I created a variable of type "byte" (defined in the "z80.h" file if you read it) to hold the dipswitch settings. For this example, we'll just use an int variable which will toggle between 0 and 1 as desired. b) Now we can code our M_RDMEM function! int DipSwitchSYNC = 0; //global variable defined earlier byte M_RDMEM (word A) { // decode the addresses (A) if(A >= 0x7800 && A <=0x7bff) //are we reading dip switch memory? { if(DipSwitchSYNC == 1) //if SYNC bit of switch is 1 { DipSwitchSYNC = 0; //set it to 0 return 128; //return value where bit 7 is 1 } else return 0; //return value where bit 7 is 0 } else if (A < 0x8000) //We're reading from ROMs or RAM return RAM[A]; //Default: Display a warning and return memory value printf("WARNING! Reading from location %04X\n", A); return RAM[A]; } c) Our M_WRMEM function will be much similar, except here we're assigning a value to a particular position in RAM instead of returning it. void M_WRMEM (word A, byte V) { //decode the addresses (A) if(A < 0x4000) //We're reading from the ROMs { printf("WARNING! Attempting to write to ROM") return; } else if(A > 0x3fff && A < 0x8000) //We're reading from RAM RAM[A] = V; } 3) Now we need to toggle the DipSwitchSYNC to 1 when the IPeriod number of cycles has been reached. In the "z80.c" file, you'll see in the Z80() function some code that reads: #ifndef INTERRUPTS blah blah blah #else blah blah blah Well, since we've defined interrupts in the "z80.h" header file, we're going to add some code that will trigger the vertical blank (but remember, we're not REALLY doing an interrupt...). So, under the line: #else we're going to add our own vertical blank trigger. We've already created the global variable that toggles between 1 and 0, so we need to toggle it to 1 when a "vertical blank's" number of cycles has occured (12000 for Phoenix). Our added code will look like this: extern int DipSwitchSYNC; //defined at top of "z80.c" extern byte *RAM; //also defined at top of "z80.c" ... if(ICount<=0) { //if we've exceeded the number of cycles ICount+=IPeriod; //reset the count to 12000 if(!CPURunning) break; DipSwitchSYNC = 1; //set the switch to 1 so when the dipswitch } //is read again, it will know it's time for a //VBlank, and reset it to 0 4) OK. You may not realize it, but all of the code is now in place to actually run Phoenix! But, we now have to write a bit more so it will display something to the screen. For simplicity's sake, we'll just add it to the above section of code, but normally this wouldn't be done. a) More background information is needed. Phoenix uses nothing but characters to display it's alphanumeric characters as well as anything else you see on the screen. This is pretty rare. Normally games use sprites to move objects around the screen (i.e. Pacman is a sprite, but the dots are characters). For Phoenix, all we need to do is emulate the characters, and no sprite routines are needed. What we're about to write will update the ENTIRE screen everytime a vertical blank is triggered. Normally we'd keep track of the previous screen and only update the characters which have changed. But, for the sake of simplicity and length of this guide, we'll just redraw the entire screen. The other thing to keep in mind is that Phoenix used a vertical monitor, so we need to compensate for this when writing the characters to the screen. The Phoenix display was 26 characters horizontally by 32 characters vertically. We also need to remember that the characters aren't stored in anything even close to ASCII. What is stored in the video portion of memory is a reference to the position of the appropriate character in the character ROM. Since we're not doing true graphics right now, we only need to convert the character reference to it's ASCII equivalent. Let's watch.... int x, y, pos; //defined at top of function unsigned char c; ... if(ICount<=0) { //this is the same code as above...we're ICount+=IPeriod; //just adding a bit to it....:) if(!CPURunning) break; DipSwitchSYNC = 1; gotoxy(1, 1); //start drawing at the top left //ONLY FOR PC's!!! for(y = 0; y < 32; y++) { //rows of characters int pos = 0x4000+32*(26-1)+y; //position into video memory for (x = 0; x < 26; x++) { //columns of characters c = RAM[pos]; //get character at current pos if(c>=1 && c<=27) //if it's a letter c+='A'-1; //turn it into one! else if (c == 31) //this is an asterisk c = '*'; else if (c > 30 && c < 42) //these are numbers c+= 16; else if (c == 43) //this is a hyphen c = '-'; else if (c == 42) //this is a period c = '.'; else if (c > 0x00) //let's just draw X's for the rest c = 'X'; printf("%c", c); //spit it out! pos -= 32; //move to next character in VRAM } //end for printf("\n"); //we're at end of row! } //end for } //end if I suppose that position line could use some explanation. Our video area of RAM for the foreground characters starts at 0x4000 according to our memory map. So, we're starting at 0x4000, adding the screen height, multiplying by screen width minus 1, and adding the current row we're on. You SHOULD be able to replace 26 and 32 above with the width and height of the game you want to emulate. Now whenever a vertical blank is called, it will redraw the screen! Neat, eh? 5) We've got the ROMs loaded, vertical blanking is setup, and the screen will be redrawn when necessary. Only one thing left to do... finish the main() function! Here, we need to reset the Z80 and start the actual emulation. You might also want to clear the screen before actually starting the emulation. So, right after the code that loads the ROM we'll add these things: reg R; //defined at top of main function textmode(C4350); //set display to 50 lines - ONLY FOR PCs!!! clrscr(); //guess...:) - ONLY FOR PCs!!! ResetZ80(&R); //This resets the Z80 to its proper starting values Z80(R); //Actually starts the emulation S.1.4 Part IV: Run it! 1) If you have all of the above things in place, you should now be able to compile and run this program! Make sure your Phoenix ROMs are in the proper directory, and make sure all of your header files are included as needed. You should need to include stdio.h, alloc.h, and conio.h. You also need a reference to the "z80.h" header file in your main file. Lastly, be sure that BOTH your main file (i.e. phoenix.c) AND "z80.c" are being compiled together! In Borland C++, you would do this by adding "phoenix.c" and "z80.c" to your project before compiling. That should do it! Hopefully you should see Phoenix running on your screen in a text display and you'll see something similar to this: SCORE1 HI-SCORE SCORE2 000000 000000 000000 X0 COIN00 X0 INSERT COIN etc. If not, try checking the "endian-ness" again and make sure you haven't made any typos in the above functions. Also be sure you've put everything in the right place. S.1.5 Part V: To be continued... I'm going to end it here for now. At this point you should have a basic understanding of what vertical blanks/interrupts are, how characters are stored in memory, how to load ROMs into a virtual space, and a few other things. The next installment (hopefully...) will contain some information on how to do character graphics and keyboard input. S.2 Step-by-step discussion of an emulator for Space Invaders How I wrote a Space Invaders emulator An essay in Arcade Emulation Neil Bradley - neil@synthcom.com Before I get into this, I want to stress that the Space Invaders mentioned in this document is not yet available in EMU 2.0, but it will be after mid-January 1997. It is basically a step by step of how I wrote a Space Invaders emulator from start to finish. S.2.1 My Background I spent 7 years at Intel corporation, most of that optimizing Intel based assembly language. I know many microprocessors and microcontrollers, and also have a hardware background. I also am fluent in C & C++ and have a good amount of PC hardware experience. I'm not trying to scare you off or brag at all, I'm just trying to explain where I am coming from when I say things. The "How did he know that?" question might come up during this document, and the answer most likely is "been there - done that". ;-) S.2.2 Getting started The SI emulator was to be the basis for me writing a Z80 emulator (which as of this writing is still in progress) in assembly for all to consume. One of the best ways to write a processor emulator is to make it emulate code you know runs. No video games I know of come up and execute garbage code, so you're pretty well assured that using video game code as a test case is a pretty good idea in the development stage. I must stress that the most valuable resource to us is the internet. Learn all you can from all that is available. That is partially how I did the Z80 emulator. Take what others have to offer, learn from it, and in turn produce something else that others can benefit or learn from. If you're not writing your own processor emulator, skip to section S.2.4, "Space Invaders Specifics". I had prior experience writing a 6502 emulator in assembly and knew what would work and what wouldn't. This time I wanted to write a general purpose extensible emulator that would be multi-processor aware, and would emulate as fast as possible. I also got beaten up for not "being portable". If you want portable, go grab any of the slower than desired CPU emulators available on the internet. If you want high performance on lower end machines, use assembly. Pick what architecture you're going to go with and do it! I also don't intend on getting into the C vs. Assembly argument. I'm getting 4X the performance AT A MINIMUM against various C emulators for the same CPU, so there is something to be said for assembly. The answer is written in stone for me. Judge for yourself. If you want it portable, you'll take a performance hit. Accept it now. I decided to first see what others had done with Z80 emulators, so I searched the web for "+z80 +emulator" and got a few links. It led me a few sites, so I downloaded Marat Fazyullin's Z80 emulator and xtrs (TRS-80 emulator for Unix) and had a peek. It's always good to have more than one person's interpretation as to how an emulated processor should function, so find as many as you can when something doesn't make sense. I also purchased several Z80 books, two of which I found to be particularly useful. One is "How to program the Z80" by Rodnay Zaks and "Z80 Assembly Language Programming" by Peter W. Steele and Ivan Tomek. These are handy references. Rodnay's book as timing information, but is missing some instructions. It's also nice to have two or more books to check against each other, as often there are discrepencies. Both books mentioned above are out of print, but can usually be found at tech book stores. I wrote the basic "main loop" routine to basically fetch instructions and jump into a large jump table to each of the corresponding Z80 instruction. I also predefined what some of the registers would hold while the Z80 was emulating. HL is stored in BX, BC is stored in CX, DH Contains the Z80's flags, and DL contains the accumulator. ESI Is the source execution address, and EAX & EDI are used for general purpose computation throughout the emulator. The only time I ever used the high part of EBX or ECX was to quickly save the state of some registers, do some operations that could use them, and shift them back. Something like this: shl edx, 16 ; Save flags & accumulator for later [do work with dx here] shr edx, 16 ; Restore flags & accumulator It functions just like a push, but doesn't take up a memory cycle and doesn't create a cache hit. There are several things you need to keep in mind when writing a processor emulator: 1) Get RID of CALL functions. They are very expensive. For example, the Z80 emulator has no calls. It's all handled by jumps. It might be convenient to have the different addressing modes in a nice callable table but your emulator will take a good hit when doing it this method. Consider using macros. 2) Minimize jumps whenever possible. 3) Keep the most commonly used virtual registers in native processor registers. 4) Minimize memory accesses. These are killers. 5) Keep total data & code accesses as far under 256K as possible. The smaller the total data & code accesses the better of a chance of fitting into the system's cache. 6) Use macros to handle things like flags - not jump or call tables. 7) Create a general purpose read memory/write memory (and read/write I/O if the processor you're emulating requires it). Use this when doing data access functions, but DO NOT use these to fetch instructions. Most of the time you'll be spending will be in emulating the actual instructions and not moving data around. 8) Don't branch if you don't have to. Keep the most commonly executed path one that doesn't take a conditional branch. This can cause performance hits as well. 9) Make use of the instructions available to you. Even if you think you know a processor through and through, I would advise sitting down for quite some time studying its instruction set and taking advantage of every possible instruction you can. 10) Use xchanges to temporarily save off registers you just aboslutely MUST use. 11) For flags, use lookup tables if you can find a convenient way to look up add/subtract/dec/inc flags. I did this with the Half carry & overflow flags in the Z80 emulator. 12) When using the Intel architecture, use the 486> instructions even if you're not doing 32 bit code (though I would recommend that you DO). You can still use the extended parts of registers even though you're in real mode. To anyone saying "I'd like my code to run on a 386 or lower", consider what you're saying. These are pretty weak machines, and even 486 motherboards with CPU's these days are going for $60-$100 new. The extra constraint you'll put on yourself by not having the extended registers and 32 bit addressing (and some 486 instructions) will cause you to spend more time trying to get good performance out of low end machines that would wind up hurting performance on a 486 or Pentium. Be careful, and consider the extra work for trying to go for a low-end system when the next to low end machines aren't that much more money. These are just some of the guidelines that have worked extremely well for me. S.2.3 Disassemblers Another thing that is a life saver for processor emulation is a disassembler. Get your hands on a disassembler that you can trust. I found such a beast at Riddle's Roost (Sean Riddle's excellent Williams page) at http://www.ionet.net/~sriddle/willy.shtml. (that is spelled correctly). Sean has given us a freeware disassembler to use (thank you Sean!). I modified the disassembler to do two things - disassemble a single instruction and display registers on a single line. I displayed all the registers I was interested in, and a disassembly including the program counter and the actual bytes that were being disassembled. This is what you need for a simple debugger. Before I did all this, I allocated 64K and loaded in the ROMs at the appropriate places, and set the program counter to 0 (for Z80's). Then it went into my main loop. The main loop would allow me to single step through the execution, run with a disassembly, and run to a specific address. This way you can watch the code modify the register & see if it's right or not, or if it takes a wrong turn somewhere. I started off with no instructions emulated. I ran the Space Invaders code and let it run until it hit an invalid opcode. I implemented that instruction, ran the code to that point, recompiled, etc... and kept going until things were completely implemented. This was a good way for me to keep an eye on each instruction, and to at least semi-verify that they were working as I implemented them. This is important, because once you have the basic code to handle one type of an instruction (like ADD or SUB), implementing other similar instructions using different registers is easier, and most likely your code will be debugged before the other variants are added. I kept at it until the code was running well enough to keep running without hitting unimplemented instructions. Onto the game information... S.2.4 Space Invaders Specifics The first thing I did was go looking for a memory map of this game. It turns out that I had gathered enough information just by watching what the code was doing to figure out where most everything was, but I wanted to see if things were where I thought they were. So I got ahold of Michael Adcock's Emulator How-To guide, and the Space Invaders memory map was there. It told me where the graphics RAM, ROM, and user RAM was, and a little bit of information about the I/O ports that were used. I also figured that SI used some form of interrupt because I did hit an "EI" instruction. On the Z80, you can either jump to a specific vector or have the hardware insert an instruction on the bus to execute when an interrupt happens. I didn't have schematics, but my guess was they were implementing an RST $xx instruction or something. Then I remembered - Space Invaders uses an 8080, where all interrupts go to 0008h and all NMI's go to 0010h. Sure enough, a quick disassembly of these addresses yielded intelligent code. ;-) So I threw down a magic interrupt to occur about every 20-30 milliseconds and now things started to happen. I didn't know the orientation of the graphics, but a few things I did know about graphics gave me some ideas. I knew that Space Invaders was black and white, so I figured 1 bit per pixel. I hooked any writes to Space Invaders video memory to call a function I had written to poke it directly into the monochrome card's memory. I got a blotchy image that looked as if my horizontal sync was off somehow. The width of the Space Invaders image turned out to be 20h bytes (32 * 8 pixles = 256 pixels). Once I mapped it to the video monitor, it displayed SI sideways! So I hacked together a routine to turn it from a horizontal image to a vertical image, and up came the game - until the invaders started to come. Space Invaders is 248 X 256 - bits packed vertically. I got one invader and that was it. After looking through all kinds of code, I came across a section that looped through 55 bytes checking to see if it was zero or non-zero. If it was zero, it would skip to the next byte. If it was non-zero, it would draw an alien. BTW, I modified the debugger to output to the monochrome card so I could watch what was going on. Also, there are 55 aliens in an invading fleet. ;-) That's where I made the connection. Something wasn't happening. I double checked the emulation of the instructions I had implemented, and everything looked in order (minus a few bugs and those didn't affect it). I hooked up another Z80 emulator to it and got the same results. At this point I wasn't debugging a problem with the CPU emulator itself - I was debugging a problem with game environment emulation. I then remembered that I hadn't implemented a periodic NMI, so I decided to hook it up with about 50 millisecond intervals. I reran it. Voila. The fleet came up and things worked great. I had also taken notes during the emulation process and discovered that several I/O addresses were being read. 02h, 03h, 04h, 05h, and 06h. 5 & 6 were being written to but never read from. I took a look in the emulation how-to and found a section on the actual I/O addresses. I hooked the port values up to basic keys on the keyboard and was able to start playing the game. I don't have schematics, and to this day still haven't figured out the correct NMI/INT ratio values, but increasing interrupts causes the shots to move much much faster, and increasing NMI's causes the fleet to invade faster. I must admit Space Invaders is a pretty simple game to emulate. Not much to it, so if you're considering emulating a video game for the first time, keep some of these ideas in mind, and try 'em out. The only thing I'd do differently is if I had a reference machine or schematics to work against. When a particular I/O address or memory address is puzzling me, I check the address decoders on the schematics to try and find out where it's wired to. It's similar to reading a roadmap without any road names or town names on it, and filling it in as you go. Having a good command of how hardware works will help immensely. ------------------------------------------------------- 888b. d8b 8 .8 .d88b 8' .d88b 8d8b .d88b 8d8b. .d8b .d88b d88b 8wwK' 8.dP' w8ww 8.dP' 8P 8.dP' 8P Y8 8 8.dP' `Yb. 8 Yb `Y88P 8 `Y88P 8 `Y88P 8 8 `Y8P `Y88P Y88P ------------------------------------------------------- R.1 List of Emulator Authors - Suzanne Archibald (suzanne@crysalis.com) Atari System I/II emulator (PROJECT TERMINATED) [??] - Neil Bradley (neil@synthcom.com) http://www.synthcom.com/~emu Emu v1.9 (emulates Asteroids, Asteroids Deluxe, Battlezone, Black Widow, Gravitar, Lunar Lander, Red Baron, and Space Duel) [Assembly, C++] Postal Address: Neil Bradley 1511 SW Park Avenue #317 Portland, Oregon 97201 - Kevin Brisley (kevin@isgtec.com) Burgertime emulator (NOT RELEASED) [??] - Mike Cuddy (mcuddy@scitexdv.com) http://www.fensende.com/Users/mcuddy/gyruss/ Gyruss emulator v0.03 Audio Board Simulator for Gyruss [C] - Laurent Desnogues (desnogue@aiguemarine.unice.fr) Phoenix emulator (NOT RELEASED -- Unix/X only!) [SPARC assembly] - Juan Jose Epalza (jepalza@arrakis.es) http://www.arrakis.es/~jepalza/ Ladybug v1.0 Mr Do! v2.1 (supports Mr Do and Mr Lo) Mr Do Run Run v1.2 Mr Do's Castle v2.0 Mr Do's Wild Ride v1.2 [??] - Keith Gerdes (k.gerdes@genie.com) Food Fight and Quantum emulator (NOT RELEASED) [Assembly] - Chris Hardy (chrish@kcbbs.gen.nz) Phoenix emulator v1.03 (Win95/NT4 only!) (emulates Phoenix and Pleiades) [C (compiled with VC++), Direct X] [Expect more from Chris soon: Galaxian, Super Galaxians, Scramble, Moon Cresta, War of the Bugs, Pisces, and maybe more!] - Tom Hafner (hafner@mail.aracnet.com) http://www.aracnet.com/~hafner Missile Command v1.0 [C] - Ed Henciak (ethst3+@pitt.edu) Star Trek emulator (NOT RELEASED) [??] - Ishmair (ishmair@vnet.es) http://valhalla.ph.tn.tudelft.nl/emul8 The End in asm v0.5 (LAST VERSION -- INCLUDES SOURCE) [C] - Ville Laitinen (ville@sms.fi) Crazy Kong emulator v0.3b (96/10/20) The End (Dec/27/1996) [??] - Jean-Marc Leang (jeanmarc.leang@ping.be) Rygar emulator (NOT RELEASED) [??] - Thierry Lescot (ShinobiZ@mygale.org, ShinobiZ@ping.be, Thierry.Lescot@ping.be) http://www.mygale.org/06/shinobiz/shinobi.html System 16 Arcade Emulator v0.5 (emulates Shinobi, Altered Beast, Shadow Dancer, Time Scanner (on side), and Golden Axe (not playable yet)) [32bit C (using DJGPP v2.0) and 32bit Assembly, Allegro v2.1 graphics library] Postal Address: Thierry Lescot Rue des Wagnons, 81 7380 Quievrain Belgium (Europe) - Letoram (letoram@algonet.se) Burgertime emulator (NOT RELEASED) [??] - Paco Lopez (jsellest@filnet.es) and Abel Bezunces (miguelfm@arrakis.es) Ghosts & Goblins emulator (NOT RELEASED) (Information is needed badly, if anyone can help, please contact them!) [??] - Ivan Mackintosh (ivan@dales.rmplc.co.uk) http://valhalla.ph.tn.tudelft.nl/emul8 http://dales.rmplc.co.uk/ivan/ Vanguard Emulator v0.02 [C] - Kurt Mahan and Paul Kahler (kmahan@novell.com) Cinematronics emulator (NOT RELEASED) (emulates Barrier, Boxing Bugs, Demon, Ripoff, Solar Quest, Space War, Speed Freak, Star Castle, Star Hawk, Tail Gunner, War of the Worlds, and Warrior) [C, Assembly] Postal Address: Kurt Mahan 4579 S. Suncrest Salt Lake City, UT 84117 - Vince Mayo (14u2c@diamond.nb.net) Crazy Climber emulator (NOT RELEASED) [??] - Mark McGregor (mmcgrego@uoguelph.ca) Battlezone emulator (NOT RELEASED) [Visual C++] - Warren Mills (100605,3262@compuserve.com) The Arcade Machine v0.01 (emulates Amidar (US/Japan), Galaxian, Galaxian X, Super Galaxian, War of the Bugs, Space Invaders, Space Invaders Deluxe) [C] - Sergio Munoz (sergio@webmedia.es) Pengo emulator v0.4 [??] - Patrick O'Reilly (oreillyp@execpc.com) Turbo emulator (NOT RELEASED) [??] - Mike Perry (mj-perry@uiuc.edu) Tron and Juno First emulator (NOT RELEASED) [??] - Pete Rittwage (bushwick@ix.netcom.com) Virtual PCB v0.4 (emulates Centipede and Millipede) [??] - Heinrich Rckeshuser (hr@elbatex.via.at) Xevious emulator (NOT RELEASED) [Assembly] - Nicola Salmoria (MC6489@mclink.it) http://valhalla.ph.tn.tudelft.nl/emul8 Multi Pacman arcade machine emulator v0.3 [C] - Will Schupp (thedr@dwx.com) Space Invaders (and others) emulator (NOT RELEASED) (This one will be freeware, and source code will be released!) [C] - Martin Scragg (mnm@onaustralia.com.au) http://valhalla.ph.tn.tudelft.nl/emul8 Galaga Moon Cresta [C] - Gary Shepherdson (od67@dial.pipex.com) http://dspace.dial.pipex.com/town/terrace/od67/kong.htm Kong emulator v0.2 (emulates Donkey Kong, Donkey Kong Jr., Mario Brothers) [C, Assembly] - Eric Smith Atari Vector Simulator (emulates Asteroids, Asteroids Deluxe, Battlezone, Black Widow, Gravitar, Lunar Lander, Red Baron, and Space Duel) Centipede Simulator (emulates Centipede and Millipede) (NOT RELEASED -- Unix and MAC only!) [C] - Dave Spicer (emuchat@hubcap.demon.co.uk) http://www.hubcap.demon.co.uk/sparcade.htm Sparcade v1.94 (Too many games to list. Visit the homepage!) [Assembly] - Roger Sunshine Tempest emulator (NOT RELEASED) [??] - Lee Taylor (qbert@defender.demon.co.uk) http://www.defender.demon.co.uk/qbert.html Q*bert emulator (NOT RELEASED) [??] - Lionel Theunissen (lionelth@ozemail.com.au) Crazy Climber emulator (NOT RELEASED) [??] - Brad Thomas (bradt@nol.net) http://valhalla.ph.tn.tudelft.nl/emul8 Donkey Kong Frogger [C] - Allard van der Bas (avdbas@wi.leidenuniv.nl) http://valhalla.ph.tn.tudelft.nl/emul8 Amidar Multi Pacman arcade machine emulator v0.3 Pengo RallyX The End (Dec/27/1996) [C] - Nemoto Yohei [Ryusendo/Root] (BYY03025@niftyserve.or.jp) http://svr1.exa.co.jp/~nemoto/ Space Invaders emulator v1.0 (MAC ONLY) [??] - unknown 1942 emulator (NOT RELEASED) [C/C++/Delphi] - unknown Bagman emulator (NOT RELEASED) [??] - unknown I, Robot emulator (NOT RELEASED) [??] - unknown Rastan emulator (NOT RELEASED) [??] - unknown (Moose is working on this one too!) Tutankham emulator (NOT RELEASED) [??] - unknown Star Wars emulator (NOT RELEASED) [Assembly] R.2 List of Currently Emulated Games For a comprehensive list of games that have been emulated, please see: - Moose O' Malley's Arcade Emulation Page http://www.rocknet.net.au/~moose/arcade_emulation_game_info.html - Phil's Arcade Emulation Page http://www.netcomuk.co.uk/~pmorrisb/index.html R.3 List of Games People Want to See Emulated Moose has been running an Arcade Emulation Survey. To see the current results, and to vote for the arcade game of your choice, please see: http://www.rocknet.net.au/~moose/arcade_emulation_survey.html It appears that Galaga is the most eagerly awaited game. This is definately one of the classics, and perhaps we will see one or more emulations of it soon! R.4 Internet Resources R.4.1 WWW Resources R.4.1.1 General Arcade Emulation Links - Moose O' Malley's homepage http://www.rocknet.net.au/~moose - Phil's Arcade Emulation Page http://www.netcomuk.co.uk/~pmorrisb/index.html - The Australian Arcade Emulation Mirror http://www.onthenet.com.au/~hunter/arcade.htm - Dave's Video Game Classics http://www.gamepen.com/gamewire/classic/classic.html - Arcade Emulation Programming Repository http://valhalla.ph.tn.tudelft.nl/emul8/arcade.html Also, see the pages for individual emulator authors under R.1. R.4.1.2 ROM Images - Michael's Arcade ROMs http://www.fangz.com/~aladdin/ziped.htm - Arcade ROMs (mirror of ftp.tant.com in tabular form) http://www.vu.union.edu/~peekb/arcade.html - AROM - [The arcade ROM site] http://www.mygale.org/11/hpmaniac/arom.htm - Williams pinball ROMs http://www.pinball.wms.com/tech/roms.html R.4.1.3 Processor Information - Chipdir sites http://www.xs4all.nl/~ganswijk/chipdir/ http://www.hitex.com/chipdir/ http://www.civil.mtu.edu/chipdir/ http://ftp.unina.it/pub/chipdir/chipdir.html - 2901 AMD (Advanced Micro Devices) 4-bit - Wiretap archive ftp://wiretap.spies.com/game_archive/emulation/processors/2901 - 6502 MOS Technologies/Rockwell 8-bit - Programming card listing opcodes http://www.comlab.ox.ac.uk/archive/cards/cards.html#list - Wiretap archive ftp://wiretap.spies.com/game_archive/emulation/processors/6502 - Marat Fayzullin's 6502 emulation code http://freeflight.com/fms/CPUs/ - NoICE debugger for 6502 ftp://ftp.coast.net/SimTel/msdos/debug/noi25_02.zip - "Monitor" -- a 6502 disassembler for the PC http://dales.rmplc.co.uk/ivan/atari/ - 6808 Motorola 8-bit (6802 without RAM) - Programming card listing opcodes http://www.comlab.ox.ac.uk/archive/cards/cards.html#list - Wiretap archive ftp://wiretap.spies.com/game_archive/emulation/processors/6808 - 6809 Motorola 8-bit - Programming card listing opcodes http://www.comlab.ox.ac.uk/archive/cards/cards.html#list - Wiretap archive ftp://wiretap.spies.com/game_archive/emulation/processors/6809 - 6809 disassembler and data files for Williams games http://www.ionet.net/~sriddle/willy3.html#soft - 6809 instruction set http://ironbark.bendigo.latrobe.edu.au/staff/mal/6809.htm - 6809 stuff http://www.brouhaha.com/~eric/embedded/6809/ - 6809 disassembler (Perl script!) http://www.oasis.leo.org/perl/scripts/misc/disassemble.6809.dsc.html - NoICE debugger for 6809 ftp://ftp.coast.net/SimTel/msdos/debug/noi25_09.zip - 68000 Motorola 16-bit - Programming card listing opcodes http://www.comlab.ox.ac.uk/archive/cards/cards.html#list - Wiretap archive ftp://wiretap.spies.com/game_archive/emulation/processors/68k - 8080A Intel 8-bit - Programming card listing opcodes http://www.comlab.ox.ac.uk/archive/cards/cards.html#list - 8085A Intel 8-bit - Programming card listing opcodes http://www.comlab.ox.ac.uk/archive/cards/cards.html#list - 8910 (sound chip) - Source code for Marat's MSX emulator to emulate the AY-3-8910 http://freeflight.com/fms/fMSX - Schematics and information on 8910 and its family of processors http://andercheran.aiind.upv.es/~amstrad/CPC_Guide/index.html - Z80 Zilog 8-bit - Programming card listing opcodes http://www.comlab.ox.ac.uk/archive/cards/cards.html#list - Wiretap archive ftp://wiretap.spies.com/game_archive/emulation/processors/Z80 - Marat Fayzullin's Z80 emulation code http://freeflight.com/fms/CPUs/ - Marcel's new and improved Z80 emulation engine http://www.komkon.org/~dekogel/misc.html - Z80 description http://www.ee.washington.edu/eeca/micro/z80.html - Z80 assembler/disassembler (for MAC) http://www.emagic.de/mmm/z80 - Small C development system for Z80 http://www.cs.uwa.edu.au/~mafm/robot/small-c-readme.html - Z80 disassembler http://www.ionet.net/~sriddle/midway.html - NoICE debugger for Z80 ftp://ftp.coast.net/SimTel/msdos/debug/noi25z80.zip - dZ80 v1.00 -- Freeware Z80 disassmbler http://www.inkland.demon.co.uk/dz80/index.htm R.4.1.4 Schematics - Schematics for sale ($15 each) http://www.webwrite.com/cgould/hbalde/lib3.html (Astro Fighter, Donkey Kong, Galaga, Mario Brothers, Pac Man, Popeye, Robotron, Space Invaders) - Free Schematics http://www.cyberpass.net/~jrok/schem.html (Burger Time, Dig Dug, Frogger, Galaga, Gyruss, Junior Pacman, Mappy, Moon Cresta, Q*Bert, Scramble, Time Pilot '84, Xevious) R.4.1.5 Miscellaneous Information - COMP.EMULATORS.MISC FAQ http://www.why.net/home/adam/cem - Denis Hruza'a Stern Page [Berserk/Frenzy info!] http://199.171.196.3/~king/stern.html - Denis Hruza's Crystal Castles Page http://199.171.196.3/~king/crystalc.html - Gyruss Emulation Page http://www.fensende.com/Users/mcuddy/gyruss/ - PacMan Memory Map http://control.indigita.com/david/arcade/memory-map.html - PacMan Information and Resources (some programs and C source!) http://control.indigita.com/david/arcade/own.html - Pokey Board in your Parallel Port! http://w3.one.net/~mhill/pokey/sound.html - Assault, Asteroids, Asteroids Deluxe, Battlezone, Black Widow, Dig Dug, Firefox, Lunar Lander, Majestic Twelve, Pengo, Quantum, Smash TV, Space Zap, Total Carnage, and more! (pinouts, switch settings) http://www.multipath.com/d.jefferys/vids/spacezap/spacezap.html - Video Arcade Preservation Society http://www.vaps.org - Wiretap Gopher Archive http://wiretap.spies.com/Gopher/game_archive R.4.2 FTP Resources The following FTP sites provide useful files for the development of arcade emulators: - Arcade ROM archive FTP.TANT.COM /pub/game_archive /incoming - Mirror of FTP.TANT.COM FTP.VESATEC.COM /pub/arcade/roms - Wiretap's arcade emulation information WIRETAP.SPIES.COM /game_archive R.4.3 FSP Resources Note: Don't ask me what FSP is, or how to use it. If you don't know, just use the FTP/WWW resources instead. There is a FAQ on FSP... - Arcade ROMs (a mirror of Brian Peek's archive) host: 129.7.12.229 port: 1980 R.5 List of Arcade Games (Compiled from the KLOV, ftp.tant.com, and others) Note: I need information about what processors each game uses. PLEASE email me with this information if you have it! Also, if there are other processors I should include, let me know! Key: C = Processor used as CPU S = Processor used for sound X = Processor used for something...? +-----------------------------------------------------------------------------+ | Name | Company |Year| Processors | +-----------------------------------------------------------------------------+ | | | |2|2|6|6|6|6|6|6|6|8|8|8|8|8|8|Z|P|T| | | | |2|9|5|8|8|8|8|8|8|0|0|0|0|0|9|8|o|T| | | | |0|0|0|0|0|4|0|0|0|3|3|8|8|8|1|0|k|L| | | | |3|1|2|8|9|0|0|1|2|5|9|0|5|8|0| |e| | | | | | | | | | | |0|0|0| | |A|A| | | |y| | +-----------------------------------------------------------------------------+ |'88 Games |Konami |1988| | | | | | | | | | | | | | | | | | | |005 |Sega | | | | | | | | | | | | | | | | | | | | |10-Yard Fight |Taito |1984| | | | | | | | | | | | | | | | | | | |1942 |Capcom |1984| | | | | | | | | | | | | | | | | | | |1943 |Capcom |1987| | | | | | | | | | | | | | | | | | | |19th Hole |Status |1986| | | | | | | | | | | | | | | | | | | |720 degrees |Atari |1986| | | | | | | |C| | | | | | | | | | | |8 Ball |Magicom |1984| | | | | | | | | | | | | | | | | | | |APB |Atari | | | | | | | | |C| | | | | | | | | | | |AV Mah Jong Part II |Nihon Bussan | | | | | | | | | | | | | | | | | | | | |Ace Attacker |Sega | |S| | | | | |C| | | | | | | | | | | | |Action Fighter |Sega | |S| | | | | |C| | | | | | | | | | | | |Adv. of Robby Roto |Midway | | | | | | | | | | | | | | | | | | | | |Aeroboto |Williams | | | | | | | | | | | | | | | | | | |S| |AfterBurner |Sega |1987| | | | | | | | | | | | | | | | | | | |AfterBurner II |Sega |1989| | | | | | | | | | | | | | | | | | | |Air Busters |Namco | | | | | | | | | | | | | | | | | | | | |Air Duel |Fabtek |1991| | | | | | | | | | | | | | | | | | | |Airwolf |Hokkadio |1987| | | | | | | | | | | | | | | | | | | |Ajax |Konami | | | | | | | | | | | | | | | | | | | | |Aladdin |Atari | | | | | | | | | | | | | | | | | | | | |Alcon |Taito | | | | | | | | | | | | | | | | | | | | |Alex Kid |Sega | |S| | | | | |C| | | | | | | | | | | | |Alien Invader |Universal |1979| | | | | | | | | | | | | | | | | | | |Alien Syndrome |Sega |1987|S| | | | | |C| | | | | | | | | | | | |Aliens |Konami |1990|S| | | | | |C| | | | | | | | | | | | |All-Amer. Football |Leland |1989| | | | | | | | | | | | | | | | | | | |Alley Master |Cinematronics |1985| | | | | | | | | | | | | | | | | |X| |Alley Rally |Exidy |1978| | | | | | | | | | | | | | | | | | | |Alpha Mission |SNK | | | | | | | | | | | | | | | | | | | | |Alpine Ski |Taito | | | | | | | | | | | | | | | | | | | | |Altered Beast |Sega |1988|S| | | | | |C| | | | | | | | | | | | |Ameri-Dart |Ameri |1989| | | | | | | | | | | | | | | | | | | |American Football |Temco |1987| | | | | | | | | | | | | | | | | | | |American Horseshoes |Strata |1990| | | | | | | | | | | | | | | | | | | |Amidar |Stern |1982| | | | | | | | | | | | | | | |C| | | |Anti-Aircraft |Atari | | | | | | | | | | | | | | | | | | | | |Apache 3 |Tatsumi | | | | | | | | | | | | | | | | | | | | |Aqua Jack |Taito | | | | | | | | | | | | | | | | | | | | |Aquattack |Romstar | | | | | | | | | | | | | | | | | | | | |Arabian |Atari |1983| | | | | | | | | | | | | | | | | | | |Arcade Driver |Atari | | | | | | | | | | | | | | | | | | | | |Arch Rivals |Midway | | | | | | | | | | | | | | | | | | | | |Area 88 |Capcom | | | | | | | | | | | | | | | | | | | | |Arkanoid |Taito |1986| | | | | | | | | | | | | | | | | | | |Arm Wrestling |Nintendo |1985| | | | | | | | | | | | | | | | | | | |Armored Attack |Cinematronics |1980| | | | | | | | | | | | | | | | | |X| |Armored Car |Stern | | | | | | | | | | | | | | | | | | | | |Assault |Atari |1988| | | | | | | |C| | | | | | | | | | | |Asterix & Obelix |unknown |1991| | | | | | | | | | | | | | | | | | | |Asteroids |Atari |1979| | |C| | | | | | | | | | | | | | |S| |Asteroids Deluxe |Atari |1980| | |C| | | | | | | | | | | | | |S|S| |Astro Blaster |Sega | | | | | | | | | | |S| | | | | |C| | | |Astro Chase |Exidy |1984| | | | | | | | | | | | | | | | | | | |Astro Fighter |Sega | | | | | | | | | | | | | | | | | | | | |Astro Invader |Stern |1980| | | | | | | | | | | | | | | | | | | |Astron Belt |Midway | | | | | | | | | | | | | | | | | | | | |Asuka 'N' Asuka |Taito | | | | | | | | | | | | | | | | | | | | |Atari Baseball |Atari |1978| | | | | | | | | | | | | | | | | | | |Atari System 1 |Atari |1983| | | | | | | |C| | | | | | | | |S| | |Atari System 2 |Atari |1984| | | | | | | | |C| | | | | | | | | | |Ataxx |Leland |1990| | | | | | | | | | | | | | | | | | | |Atomic Castle |LDCS |1984| | | | | | | | | | | | | | | | | | | |Atomic Punk |Irem |1991| | | | | | | | | | | | | | | | | | | |Aurail |Sega | | | | | | | | | | | | | | | | | | | | |Avalanche |Atari | | | | | | | | | | | | | | | | | | | | |Avenger |unknown |1980| | | | | | | | | | | | | | | | | | | |Avengers |Capcom | | | | | | | | | | | | | | | | | | | | |Aztarac |Centuri |1983| | | | | | | | | | | | | | | | | | | |B. R. & Plan. of Zom|Sega |1983| | | | | | | | | | | | | | | | | | | |Baby Pac-Man |Midway |1983| | | | | | | | | | | | | | | | | | | |Bad Dudes |Data East |1988| | | | | | | | | | | | | | | | | | | |Bad Dudes vs. Dragon|Data East |1988| | | | | | | | | | | | | | | | | | | |Badlands |Centuri |1983| | | | | | | | | | | | | | | | | | | |Badlands |Atari |1989| | | | | | | | | | | | | | | | | | | |Bag Man |Stern |1983| | | | | | | | | | | | | | |S|C| | | |Bandito |Exidy |1978| | | | | | | | | | | | | | | | | | | |Bank Panic |Sega | | | | | | | | | | | | | | | |S|C| | | |Barracuda |Coinex | | | | | | | | | | | | | | | | | | | | |Barrier |Cinematronics | | | | | | | | | | | | | | | | | | |X| |Baseball Season II |Leland | | | | | | | | | | | | | | | | | | | | |Basketball |Atari |1978| | | | | | | | | | | | | | | | | | | |Batman |Atari |1991| | | | | | | | | | | | | | | | | | | |Battlantis |Konami | | | | | | | | | | | | | | | | | | | | |BattleTech |ESP Productions|1989| | | | | | | | | | | | | | | | | | | |Battleshark |Taito | | | | | | | | | | | | | | | | | | | | |Battlewings |unknown | | | | | | | | | | | | | | | | | | | | |Battlezone |Atari |1980| | |C| | | | | | | | | | | | | |S|S| |Bay Route |Sega | |S| | | | | |C| | | | | | | | | | | | |Bazooka |unknown | | | | | | | | | | | | | | | | | | | | |Beast Busters |SNK |1990| | | | | | | | | | | | | | | | | | | |Beezer |Romstar | | | | | | | | | | | | | | | | | | | | |Bega's Battle |Data East | | | | | | | | | | | | | | | | | | | | |Bermuda Triangle |SNK | | | | | | | | | | | | | | | | | | | | |Berzerk |Stern | | | | | | |S| | | | | | | | | |C| | | |Big Event Golf |Taito | | | | | | | | | | | | | | | | | | | | |Big Run |Jaleco |1990| | | | | | | | | | | | | | | | | | | |Bionic Commando |Capcom | | | | | | | | | | | | | | | | | | | | |Birdie King |Taito |1982| | | | | | | | | | | | | | | | | | | |Birdie King II |Monroe |1984| | | | | | | | | | | | | | | | | | | |Birdie Try Golf |Data East | | | | | | | | | | | | | | | | | | | | |Black Tiger |Romstar | | | | | | | | | | | | | | | | | | | | |Black Widow |Atari |1982| | |C| | | | | | | | | | | | | |S| | |Blades of Steel |Konami |1987| | | | | | | | | | | | | | | | | | | |Blasted |Midway | | | | | | | | | | | | | | | | | | | | |Blaster |Williams |1983| | | | |C| | | | | | | | | | | | |S| |Blasteroids |Atari |1988| | | | | | | | | | | | | | | | | | | |Block Out |Cal. Dreams |1990| | | | | | | | | | | | | | | | | | | |Blood Brothers |Fabtek |1991| | | | | | | | | | | | | | | | | | | |Bloxeed |Sega | | | | | | | | | | | | | | | | | | | | |Blue Print |Midway |1982| | | | | | | | | | | | | | | |C| | | |Blue Shark |Midway |1978| | | | | | | | | | | | | | | | | | | |Body Slam |Sega | |S| | | | | |C| | | | | | | | | | | | |Bomb Jack |Tehkan | | | | | | | | | | | | | | | | | | | | |Boomer Rang'r |Data East |1983| | | | | | | | | | | | | | | | | | | |Boot Camp |Konami | | | | | | | | | | | | | | | | | | | | |Boot Hill |Midway | | | | | | | | | | | | | | | | | | | | |Bosconian |Midway |1981| | | | | | | | | | | | | | | |C| | | |Bottom of the Ninth |Konami |1989| | | | | | | | | | | | | | | | | | | |Boulder Dash |Exidy |1984| | | | | | | | | | | | | | | | | | | |Bouncer |Enter. Sciences|1984| | | | | | | | | | | | | | | | | | | |Bowl-o-Rama |Exidy | | | | | | | | | | | | | | | | | | | | |Bowling Alley |Midway |1978| | | | | | | | | | | | | | | | | | | |Boxing Bugs |Cinematronics |1981| | | | | | | | | | | | | | | | | |X| |BreakThru |Data East |1986| | | | | | | | | | | | | | | | | | | |Breakout |Atari |1976| | | | | | | | | | | | | | | | | | | |Breakout Deluxe |Atari | | | | | | | | | | | | | | | | | | | | |Bristles |Exidy |1984| | | | | | | | | | | | | | | | | | | |Brute Force |Leland |1990| | | | | | | | | | | | | | | | | | | |Bubble Bobble |Taito | | | | | | | | | | | | | | | | | | | | |Bubbles |Williams |1983| | | | |C| | | | | | | | | | | | |S| |Buggy Challenge |Data East |1986| | | | | | | | | | | | | | | | | | | |Bull's Eye |Sega |1988| | | | | | | | | | | | | | | | | | | |Bullet |Sega | |S| | | | | |C| | | | | | | | | | | | |Bump & Jump |Data East |1982| | | | | | | | | | | | | | | | | | | |Bump and Jump |Midway |1983| | | | | | | | | | | | | | | | | | | |Burger Time |Midway |1983| | | | | | | | | | | | | | | |C| | | |Burokushiido |Sega |1990| | | | | | | | | | | | | | | | | | | |Buster Bros. |Capcom | | | | | | | | | | | | | | | | | | | | |Cabal |Fabtek |1988| | | | | | | | | | | | | | | | | | | |Cadash |Taito | | | | | | | | | | | | | | | | | | | | |Calypso |unknown | | | | | | | | | | | | | | | | | | | | |Canyon Bomber |Atari | | | | | | | | | | | | | | | | | | | | |Cap. Amer. & Avengr.|Data East |1991| | | | | | | | | | | | | | | | | | | |Capcom Bowling |Capcom |1988| | | | | | | | | | | | | | | | | | | |Captain Commando |Capcom |1991| | | | | | | | | | | | | | | | | | | |Carnival |Gremlin |1980| | | | | | | | | | | | | | | | | | | |Carrier Airwing |Capcom |1991| | | | | | | | | | | | | | | | | | | |Castle of Dragon |Romstar | | | | | | | | | | | | | | | | | | | | |Castlevania |Konami |1987| | | | | | | | | | | | | | | | | | | |Caveman |Gottlieb | | | | | | | | | | | | | | | | | | |S| |Caveman Ninja |Data East |1991| | | | | | | | | | | | | | | | | | | |Centipede |Atari |1981| | |C| | | | | | | | | | | | | | | | |Cerberus |Cinematronics |1985| | | | | | | | | | | | | | | | | |X| |Challenger |unknown | | | | | | | | | | | | | | | | | | | | |Champion Baseball |Sega |1983| | | | | | | | | | | | | | | | | | | |Champion Baseball II|Sega |1984| | | | | | | | | | | | | | | | | | | |Champion Wrestler |Taito |1990| | | | | | | | | | | | | | | | | | | |Championship Sprint |Atari | | | | | | | | |C| | | | | | | | | | | |Change Lanes |Taito |1983| | | | | | | | | | | | | | | | | | | |Charon |Sega | |S| | | | | |C| | | | | | | | | | | | |Chase H.Q. |Taito |1988| | | | | | | | | | | | | | | | | | | |Cheyenne |Exidy |1984| | | | | | | | | | | | | | | | | | | |Chicken Shift |unknown |1984| | | | | | | | | | | | | | | | | | | |Chiller |Exidy | | | | | | | | | | | | | | | | | | | | |China Gate |Romstar |1988| | | | | | | | | | | | | | | | | | | |Chinese Hero |Kitcorp | | | | | | | | | | | | | | | | | | | | |Choplifter |Midway |1982| | | | | | | | | | | | | | | | | | | |Chopper I |SNK |1988| | | | | | | | | | | | | | | | | | | |Cinemat-System |Cinematronics |1983| | | | | | | | | | | | | | | | | |X| |Circus |Exidy | | | | | | | | | | | | | | | | | | | | |Circus Charlie |Centuri |1984| | | | | | | | | | | | | | | | | | | |Cisco Heat |Jaleco |1991| | | | | | | | | | | | | | | | | | | |Clash Road |Status | | | | | | | | | | | | | | | | | | | | |Cliff Hanger |Stern |1984| | | | | | | | | | | | | | | | | | | |Cloak & Dagger |Atari | | | | | | | | | | | | | | | | | | | | |Cloud 9 |unknown |1980| | | | | | | | | | | | | | | | | | | |Clowns |Midway |1979| | | | | | | | | | | | | | | | | | | |Cobra Command |Data East | | | | | | | | | | | | | | | | | | | | |Cocoon |Williams | | | | | | | | | | | | | | | | | | |S| |Colony 7 |Taito |1980| | | | | | | | | | | | | | | | | | | |Columns |Sega |1990| | | | | | | | | | | | | | | | | | | |Combat |Exidy | | | | | | | | | | | | | | | | | | | | |Combatribes |Technos |1990| | | | | | | | | | | | | | | | | | | |Commando |Capcom |1985|S| | | | | | | | | | | | | | |C| | | |Compugraph Foto |Atari | | | | | | | | | | | | | | | | | | | | |Computer Space |Nutting Ass. |1972| | | | | | | | | | | | | | | | | | | |Congo Bongo |Sega |1983| | | | | | | | | | | | | | | |X| | | |Congorilla |Falcon |1982| | | | | | | | | | | | | | | | | | | |Continental Circuit |Taito | | | | | | | | | | | | | | | | | | | | |Continental Circus |Taito | | | | | | | | | | | | | | | | | | | | |Contra |Konami | | | | | | | | | | | | | | | | | | | | |Cool Pool |Catalina |1991| | | | | | | | | | | | | | | | | | | |Cool Pool |Catalina |1991| | | | | | | | | | | | | | | | | | | |Cops 'n Robbers |Atari | | | | | | | | | | | | | | | | | | | | |Cosmic Avenger |Universal |1981| | | | | | | | | | | | | | | | | | | |Cosmic Chasm |Cinematronics |1983| | | | | | | | | | | | | | | | | |X| |Cosmic Guerilla |Universal |1979| | | | | | | | | | | | | | | | | | | |Cosmic Monsters |Universal |1979| | | | | | | | | | | | | | | | | | | |Crackdown |Sega |1989| | | | | | | | | | | | | | | | | | | |Crackshot |Exidy | | | | | | | | | | | | | | | | | | | | |Crash |unknown | | | | | | | | | | | | | | | | | | | | |Crash 'n Score |Atari | | | | | | | | | | | | | | | | | | | | |Crater Raider |Midway | | | | | | | | | | | | | | | |S| | | | |Crazy Climber |Nichibutsu |1980| | | | | | | | | | | | | | |S|C| |S| |Crazy Kong |Falcon |1981| | | | | | | | | | | | | | |S|C| | | |Crazy Kong Jr. |Falcon | | | | | | | | | | | | | | | |S|C| | | |Crime City |Taito | | | | | | | | | | | | | | | | | | | | |Crime Fighters |Konami |1989| | | | | | | | | | | | | | | | | | | |Crossbow |Exidy |1983| | | | | | | | | | | | | | | | | | | |Crossfire |Atari | | | | | | | | | | | | | | | | | | | | |Crowns Golf |SNK |1984| | | | | | | | | | | | | | | | | | | |Crowns Golf Hawaii |Sega | | | | | | | | | | | | | | | | | | | | |Cruisin' |Jaleco | | | | | | | | | | | | | | | | | | | | |Crush Roller |Exidy | | | | | | | | | | | | | | | | |C| | | |Crystal Castles |Atari |1984| | |C| | | | | | | | | | | | | | | | |Cube Quest |Simutek |1984| | | | | | | | | | | | | | | | | | | |Cyberball |Atari |1988| | | | | | | | | | | | | | | | | | | |D.J. Boy |Am. Sammy | | | | | | | | | | | | | | | | | | | | |Damp Matsumota |Sega | |S| | | | | |C| | | | | | | | | | | | |Dangar |Nichibutsu |1986| | | | | | | | | | | | | | | | | |S| |Danger Zone |Cinematronics |1986| | | | | | | | | | | | | | | | | |X| |Darius |Taito | | | | | | | | | | | | | | | | | | | | |Dark Adventure |Konami |1989| | | | | | | | | | | | | | | | | | | |Dark Mist |Taito | | | | | | | | | | | | | | | | | | | | |Dark Planet |Stern |1983| | | | | | | | | | | | | | | | | | | |Darwin 4096 |unknown | | | | | | | | | | | | | | | | | | | | |Dead Angle |Fabtek |1988| | | | | | | | | | | | | | | | | | | |Death Race 2000 |Exidy |1976| | | | | | | | | | | | | | | | | | | |Deep Scan |Gremlin |1979| | | | | | | | | | | | | | | | | | | |Defender |Williams |1980| | | | |C| | | | | | | | | | | | |S| |Demolition Derby |Midway |1984| | | | | | | | | | | | | | | | | | | |Depth Charge |Gremlin | | | | | | | | | | | | | | | | | | | | |Desert Assault |Data East |1991| | | | | | | | | | | | | | | | | | | |Destroyer |Atari | | | | | | | | | | | | | | | | | | | | |Devastators |Konami |1989| | | | | | | | | | | | | | | | | | | |Devil Zone |Nichibutsu | | | | | | | | | | | | | | | | | | |S| |Dig Dug |Namco |1983| | | | | | | | | | | | | | | |C| | | |Dirt Fox |Namco | | | | | | | | | | | | | | | | | | | | |Dirt Fox |Namco | | | | | | | | | | | | | | | | | | | | |Dirtbike |Atari | | | | | | | | | | | | | | | | | | | | |Discs of Tron |Midway | | | | | | | | | | | | | | | |S| | | | |Dodgem |Atari | | | | | | | | | | | | | | | | | | | | |Domino Man |Midway | | | | | | | | | | | | | | | | | | | | |Dominos |Atari | | | | | | | | | | | | | | | | | | | | |Donkey Kong |Nintendo |1981| | | | | | | | | |S| | | | | |C| |S| |Donkey Kong III |Nintendo |1984| | | | | | | | | | | | | | | |C| | | |Donkey Kong Jr |Nintendo |1982| | | | | | | | | |S| | | | | |C| |S| |Double Axle |Taito |1991| | | | | | | | | | | | | | | | | | | |Double Dragon |Romstar |1987|S| | | | | | | | | | | | | | | | |X| |Double Dragon 3 |Technos | | | | | | | | | | | | | | | | | | | | |Double Dragon II |Technos |1988| | | | | | | | | | | | | | | | | | | |Double Dribble |Konami |1986| | | | | | | | | | | | | | | | | | | |Double Play |Cinematronics |1986| | | | | | | | | | | | | | | | | |X| |Downtown |Romstar |1990| | | | | | | | | | | | | | | | | | | |Dr. Pong |Atari | | | | | | | | | | | | | | | | | | | | |Drag Race |Atari | | | | | | | | | | | | | | | | | | | | |Dragon Breed |Irem |1989| | | | | | | | | | | | | | | | | | | |Dragon Buster |Namco | | | | | | | | | | | | | | | | | | | | |Dragon Saber |Namco | | | | | | | | |C| | | | | | | | | | | |Dragon Spirit |Namco | |S| | | | | | |C| | | | | | | | | |X| |Dragon's Lair |Cinematronics |1983| | | | | | | | | | | | | | | | | |X| |Dragon's Lair II |Leland |1991| | | | | | | | | | | | | | | | | | | |Driving Force |unknown | | | | | | | | | | | | | | | | | | | | |Dungeons & Dragons |unknown | | | | | | | | | | | | | | | | | | | | |Dunk Shot |Sega | |S| | | | | |C| | | | | | | | | | | | |Dyger |Sharp Image | | | | | | | | | | | | | | | | | | | | |Dynamite Duke |Fabtek | | | | | | | | | | | | | | | | | | | | |Dynamite Dux |Sega | |S| | | | | |C| | | | | | | | | | | | |E-Swat |Sega |1990|S| | | | | |C| | | | | | | | | | | | |Eagle |Centuri | | | | | | | | | | | | | | | | | | | | |Eggs |unknown | | | | | | | | | | | | | | | | | | | | |Elevator Action |Taito |1984| | | | | | | | | | | | | | | | | | | |Elimination |Kee Games |1973| | | | | | | | | | | | | | | | | | | |Eliminator |Sega | | | | | | | | | | | | | | | | | | | | |Empire City 1931 |Romstar |1987| | | | | | | | | | | | | | | | | | | |Empire Strikes Back |Atari | | | |X| |C| | | | | | | | | | | |S| | |Enduro Racer |Sega | | | | | | | | | | | | | | | | | | | | |Esc. Planet Robot |Atari |1989| | | | | | | | | | | | | | | | | | | |Espial |unknown | | | | | | | | | | | | | | | | | | | | |Excite League |Sega | |S| | | | | |C| | | | | | | | | | | | |Exerion |Taito | | | | | | | | | | | | | | | | | | | | |Express Raiders |Data East |1986| | | | | | | | | | | | | | | | | | | |Extermination |Taito | | | | | | | | | | | | | | | | | | | | |Exterminator |Gottlieb |1989| | | | | | | | | | | | | | | | | |S| |Eyes |Rock-Ola |1981| | | | | | | | | | | | | | | | | | | |F-1 |Atari | | | | | | | | | | | | | | | | | | | | |F-1 Dream |Romstar | | | | | | | | | | | | | | | | | | | | |Fantasy |Rock-Ola | | | |C| | | | | | | | | | | | | | | | |Fantasy Zone |Sega | |S| | | | | |C| | | | | | | | | | | | |Fast Freddie |Atari |1983| | | | | | | | | | | | | | | | | | | |Fax |Exidy |1985| | | | | | | | | | | | | | | | | | | |Field Combat |unknown | | | | | | | | | | | | | | | | | | | | |Fighting Golf |SNK |1989| | | | | | | | | | | | | | | | | | | |Fighting Hawk |Taito | | | | | | | | | | | | | | | | | | | | |Final Blow |Taito | | | | | | | | | | | | | | | | | | | | |Final Fight |Capcom |1989| | | | | | | | | | | | | | | | | | | |Final Lap |Atari |1988| | | | | | | |C| | | | | | | | | | | |Final Lap 3 |Namco |1992| | | | | | | | | | | | | | | | | | | |Final Lap II |Namco |1991| | | | | | | | | | | | | | | | | | | |Final Round |Konami |1989| | | | | | | | | | | | | | | | | | | |Fire One |Exidy |1978| | | | | | | | | | | | | | | | | | | |Fire Trap |Data East | | | | | | | | | | | | | | | | | | | | |Fire Truck |Atari | | | | | | | | | | | | | | | | | | | | |Firefox |Atari |1983| | | | | | | | | | | | | | | | | | | |Flak Attack |Konami | | | | | | | | | | | | | | | | | | | | |Flash Gal |unknown | | | | | | | | | | | | | | | | | | | | |Flash Point |Sega | |S| | | | | |C| | | | | | | | | | | | |Flicky |Midway |1985| | | | | | | | | | | | | | | | | | | |Flip & Flop |Exidy |1984| | | | | | | | | | | | | | | | | | | |Flipull |unknown | | | | | | | | | | | | | | | | | | | | |Flying Shark |Taito | | | | | | | | | | | | | | | | | | | | |Flying Tiger |Taito | | | | | | | | | | | | | | | | | | | | |Food Fight |Atari |1983| | | | | | |C| | | | | | | | | |S| | |Football |Atari |1978| | | | | | | | | | | | | | | | | | | |Forgotten Worlds |Capcom |1988| | | | | | | | | | | | | | | | | | | |Formation Z |Jaleco | | | | | | | | | | | | | | | | | | | | |Formula K |Kee |1974| | | | | | | | | | | | | | | | | | | |Fourtrax |Atari |1989| | | | | | | | | | | | | | | | | | | |Free Kick |unknown |1985| | | | | | | | | | | | | | | | | | | |Frenzy |Stern |1982| | | | | |S| | | | | | | | | |C| | | |Frisky Tom |Nichibutsu | | | | | | | | | | | | | | | | | | |S| |Frogger |Sega |1981| | | | | | | | | | | | | | | |C| | | |Frogs |unknown |1979| | | | | | | | | | | | | | | | | | | |Front Line |Taito |1983| | | | | | | | | | | | | | | | | | | |Future Spy |Sega | | | | | | | | | | | | | | | | |X| | | |G.I. Joe |Konami |1992| | | | | | | | | | | | | | | | | | | |Galaga |Midway |1981| | | | | | | | | | | | | | | |C| |S| |Galaga '88 |Atari |1988| | | | | | | |C| | | | | | | | | | | |Galaga 3 |Namco | | | | | | | | | | | | | | | | | | | | |Galaga III |Midway | | | | | | | | | | | | | | | | | | | | |Galaga III |Midway | | | | | | | | | | | | | | | | | | | | |Galaga Plus |Midway | | | | | | | | | | | | | | | | | | | | |Galaxian |Midway |1979| | | | | | | | | | | | | | | |C| |S| |Galaxian X |unknown | | | | | | | | | | | | | | | | |C| | | |Galaxy Force |Sega |1988| | | | | | | | | | | | | | | | | | | |Galaxy Force II |Sega |1989| | | | | | | | | | | | | | | | | | | |Galaxy Ranger |Sega | | | | | | | | | | | | | | | | | | | | |Galaxy Wars |Universal |1979| | | | | | | | | | | | | | | | | | | |Gals Panic |Kaneko |1990| | | | | | | | | | | | | | | | | | | |Gang Wars |SNK | | | | | | | | | | | | | | | | | | | | |Gate of Doom |Data East |1991| | | | | | | | | | | | | | | | | | | |Gauntlet |Atari |1985|S| | | | | | |C| | | | | | | | | | | |Gauntlet II |Atari |1986|S| | | | | | |C| | | | | | | | | | | |Gemini Wings |Tecmo | | | | | | | | | | | | | | | | | | | | |Get Away |Universal |1979| | | | | | | | | | | | | | | | | | | |Ghost Busters |Data East | | | | | | | | | | | | | | | | | | | | |Ghosts 'n Goblins |Capcom |1986|S| | | | | | | | | | | | | | | | | | |Ghouls 'n Ghosts |Capcom |1988| | | | | | | | | | | | | | | | | | | |Gimme A Break |Sente |1985| | | | | | | | | | | | | | | | | | | |Gladiator |Taito |1988| | | | | | | | | | | | | | | | | | | |Goal To Go |Stern |1983| | | | | | | | | | | | | | | | | | | |Goalie Ghost |Sente | | | | | | | | | | | | | | | | | | | | |Goindol |Sun Electonics | | | | | | | | | | | | | | | | | | | | |Goindol |Sun Electonics | | | | | | | | | | | | | | | | | | | | |Gold Medal |Stern |1984| | | | | | | | | | | | | | | | | | | |Gold Medalist |Romstar | | | | | | | | | | | | | | | | | | | | |Golden Axe |Sega |1989|S| | | | | |C| | | | | | | | | | | | |Golden Axe : Return |Sega |1992| | | | | | | | | | | | | | | | | | | |Golf |Atari | | | | | | | | | | | | | | | | | | | | |GondoMania |Data East | | | | | | | | | | | | | | | | | | | | |Goonies |Nintendo | | | | | | | | | | | | | | | | | | | | |Gorf |Midway |1981| | | | | | | | | | | | | | | |C| | | |Gotcha |Atari | | | | | | | | | | | | | | | | | | | | |Gradius |Konami |1988| | | | | | | | | | | | | | | | | | | |Gradius III |Konami |1990| | | | | | | | | | | | | | | | | | | |Gran Trak 20 |Atari |1974| | | | | | | | | | | | | | | | | | | |Grand Champion |Taito |1981| | | | | | | | | | | | | | | | | | | |Granny & the Gators |Midway | | | | | | | | | | | | | | | | | | | | |Gravitar |Atari |1982| | |C| | | | | | | | | | | | | |S| | |Great Guns |Stern | | | | | | | | | | | | | | | | | | | | |Great Swordsman |Romstar | | | | | | | | | | | | | | | | | | | | |Gridiron Fight |Tecmo |1985| | | | | | | | | | | | | | | | | | | |Grobda |Namco | | | | | | | | | | | | | | | | | | | | |Growl |Taito |1991| | | | | | | | | | | | | | | | | | | |Guardians Of 'Hood |Atari |1992| | | | | | | | | | | | | | | | | | | |Guerilla War |Tradewest |1987| | | | | | | | | | | | | | | | | | | |Guided Missile |unknown | | | | | | | | | | | | | | | | | | | | |Gun Fight |Midway | | | | | | | | | | | | | | | | | | | | |Gunforce |Irem | | | | | | | | | | | | | | | | | | | | |Gunsmoke |Romstar |1985| | | | | | | | | | | | | | | | | | | |Guzzler |Centuri |1983| | | | | | | | | | | | | | | | | | | |Gyruss |Centuri |1983| | | | |X| | | | | |S| | | |S|S| | | |Halley's Comet |unknown | | | | | | | | | | | | | | | | | | | | |Hanaorizuru |Dainakksu | | | | | | | | | | | | | | | | | | | | |Hang On |Sega |1985| | | | | | | | | | | | | | | | | | | |Hangly Man |unknown | | | | | | | | | | | | | | | | |C| | | |Hangman |Status |1984| | | | | | | | | | | | | | | | | | | |Hard Drivin' |Atari |1989| | | | | | | | | | | | | | | | | | | |Hare Scare |unknown |1983| | | | | | | | | | | | | | | | | | | |Hat Trick |Midway |1984| | | | | | | | | | | | | | | | | | | |Hatris |Atari | | | | | | | | | | | | | | | | | | | | |Haunted Castle |Konami |1987| | | | | | | | | | | | | | | | | | | |Head On |Gremlin |1979| | | | | | | | | | | | | | | | | | | |Head On 2 |Gremlin |1979| | | | | | | | | | | | | | | | | | | |Heavy Barrel |Data East |1988| | | | | | | | | | | | | | | | | | | |Herbie's Olympics |unknown | | | | | | | | | | | | | | | | | | | | |High Impact Football|Williams |1990| | | | | | | | | | | | | | | | | |S| |Hit 'n Miss |Exidy | | | | | | | | | | | | | | | | | | | | |Hit the Ice |Williams |1991| | | | | | | | | | | | | | | | | |S| |Hoccer |Eastern Micro. |1983| | | | | | | | | | | | | | | | | | | |Holey Moley |Tai | | | | | | | | | | | | | | | | | | | | |Hollywood |unknown |1983| | | | | | | | | | | | | | | | | | | |Hot Chase |unknown | | | | | | | | | | | | | | | | | | | | |Hot Rod |Sega | | | | | | | | | | | | | | | | | | | | |Hot Shots Tennis |Strata |1988| | | | | | | | | | | | | | | | | | | |Hydra |Atari |1991| | | | | | | | | | | | | | | | | | | |Hypersports |Centuri |1984| | | | | | | | | | | | | | | | | | | |I, Robot |Atari |1984| | | | | | | |C| | | | | | | | | |S| |Ikari Warriors |Tradewest |1986| | | | | | | | | | | | | | | | | | | |Ikari Warriors III |SNK | | | | | | | | | | | | | | | | | | | | |Image Fight |Irem | | | | | | | | | | | | | | | | | | | | |In. Jones & Temple D|Atari |1986| | | | | | | |C| | | | | | | | |S| | |Indoor Soccer |Universal | | | | | | | | | | | | | | | | | | | | |Indy |Atari | | | | | | | | | | | | | | | | | | | | |Indy 500 |Atari | | | | | | | | | | | | | | | | | | | | |Indy 800 |Atari |1975| | | | | | | | | | | | | | | | | | | |Indy Heat |Leland |1991| | | | | | | | | | | | | | | | | | | |Inferno |Williams | | | | | | | | | | | | | | | | | | |S| |Inter Stellar Fantas|Funai | | | | | | | | | | | | | | | | | | | | |Interstellar 2 |Funai |1984| | | | | | | | | | | | | | | | | | | |Invinco |Gremlin |1979| | | | | | | | | | | | | | | | | | | |Iron Horse |Konami | | | | | | | | | | | | | | | | | | | | |J.E. Team Quarterbac|Leland |1988| | | | | | | | | | | | | | | | | | | |Jack Giant Killer |Cinematronics |1982| | | | | | | | | | | | | | | | | |X| |Jailbreak |Konami |1985| | | | | | | | | | | | | | | | | | | |Jaws |Atari | | | | | | | | | | | | | | | | | | | | |Jet Fighter |Kee |1974| | | | | | | | | | | | | | | | | | | |Journey |Midway |1983| | | | | | | | | | | | | | | | | | | |Joust |Williams |1982| | | | |C| | | | | | | | | | | | |S| |Joust II |Williams |1986| | | | | | | | | | | | | | | | | |S| |Jr. Pac-Man |Midway |1983| | | | | | | | | | | | | | | | | | | |Jump Bug |Rock-Ola |1981| | | | | | | | | | | | | | | | | | | |Jump Cycle |Atari | | | | | | | | | | | | | | | | | | | | |Jungle Hunt |Taito |1982| | | | | | | | | | | | | | | |C| | | |Jungle King |Taito |1982| | | | | | | | | | | | | | | |C| | | |Juno First |Konami |1983| | | | | | | | | | | | | | |S|C| | | |KLAX |Atari |1989| | | | | | | | | | | | | | | | | | | |Kageki |Romstar |1988| | | | | | | | | | | | | | | | | | | |Kangaroo |Atari |1982| | | | | | | | | | | | | | | | | | | |Karate Champ |Data East |1984| | | | | | | | | | | | | | | | | | | |Karate Master |Data East | | | | | | | | | | | | | | | | | | | | |Karate Master |Data East | | | | | | | | | | | | | | | | | | | | |Karnov |Data East | | | | | | | | | | | | | | | | | | | | |Kayos |unknown |1983| | | | | | | | | | | | | | | | | | | |Kick |Midway | | | | | | | | | | | | | | | |S| | | | |KickMan |Midway |1981| | | | | | | | | | | | | | |S| | | | |Kicker |Konami | | | | | | | | | | | | | | | | | | | | |Kid Niki |Data East | | | | | | | | | | | | | | | | | | | | |King and Balloon |unknown | | | | | | | | | | | | | | | | | | | | |Knights of the Round|Capcom |1992| | | | | | | | | | | | | | | | | | | |Konami GT |Konami | | | | | | | | | | | | | | | | | | | | |Kozmik Krooz'r |Midway |1983| | | | | | | | | | | | | | | | | | | |Krull |Gottlieb |1983| | | | | | | | | | | | | |C| | | |S| |Kung-Fu Master |Data East |1985| | | | | | | | | | | | | | | | | | | |Kuri Kinton |Taito | | | | | | | | | | | | | | | | | | | | |Kuuga |Data East | | | | | | | | | | | | | | | | | | | | |Kyros |Alpha Desnhi | | | | | | | | | | | | | | | | | | | | |L. T's Fighting Golf|SNK |1988| | | | | | | | | | | | | | | | | | | |LSA Squad |Taito | | | | | | | | | | | | | | | | | | | | |Ladybug |Universal |1981| | | | | | | | | | | | | | | |C| | | |Laguna Racer |Midway | | | | | | | | | | | | | | | | | | | | |Laser Grand Prix |Taito |1983| | | | | | | | | | | | | | | | | | | |Laser Shuffle |unknown | | | | | | | | | | | | | | | | | | | | |Last Apostle |unknown | | | | | | | | | | | | | | | | | | | | |Last Duel |Capcom |1988| | | | | | | | | | | | | | | | | | | |Last Mission |Data East |1986| | | | | | | | | | | | | | | | | | | |Last Starfighter |Atari |1984| | | | | | | | | | | | | | | | | | | |Lazarian |Sega | | | | | | | | | | | | | | | | | | | | |LeMans |Atari |1976| | | | | | | | | | | | | | | | | | | |Legend of Hero Tonma|Irem |1989| | | | | | | | | | | | | | | | | | | |Legend of Kage |Taito |1985| | | | | | | | | | | | | | | | | | | |Legendary Wings |Capcom | | | | | | | | | | | | | | | | | | | | |Legion |Nichibutsu | | | | | | | | | | | | | | | | | | |S| |Letal Enforcer |Konami |1992| | | | | | | | | | | | | | | | | | | |Libble Rabble |Namco | | | | | | | | | | | | | | | | | | | | |Liberator |Atari |1984| | |C| | | | | | | | | | | | | | | | |Life Force |Konami |1986| | | | | | | | | | | | | | | | | | | |Lock n' Chase |Sega |1983| | | | | | | | | | | | | | | | | | | |Lock-On |Data East |1986| | | | | | | | | | | | | | | | | | | |Locomotion |Centuri |1982| | | | | | | | | | | | | | | | | | | |Looping |Venture Line |1982| | | | | | | | | | | | | | | | | | | |Lost Tomb |Stern |1983| | | | | | | | | | | | | | | | | | | |Lunar Lander |Atari |1979| | |C| | | | | | | | | | | | | | |S| |Lunar Rescue |Taito | | | | | | | | | | | | | | | | | | | | |M.A.C.H. III |Mylstar |1983| | | | | | | | | | | | | |C| | | | | |MX5000 |unknown | | | | | | | | | | | | | | | | | | | | |Mad Dog McRee |Betson |1991| | | | | | | | | | | | | | | | | | | |Mad Planets |Gottlieb |1983| | | | | | | | | | | | | |C| | | |S| |Mag Max |Nichibutsu | | | | | | | | | | | | | | | | | | |S| |Magic Sword |Capcom |1991| | | | | | | | | | | | | | | | | | | |Mah Jongg Summer |Video System |1989| | | | | | | | | | | | | | | | | | | |Main Event |Konami |1988| | | | | | | | | | | | | | | | | | | |Major Havoc |Atari |1984| | |C| | | | | | | | | | | | | |S| | |Major League |Sega | |S| | | | | |C| | | | | | | | | | | | |Major League USA |Sega | |S| | | | | |C| | | | | | | | | | | | |Make Trax |Williams |1981| | | | |C| | | | | | | | | | |X| |S| |Mania Challenge |Taito |1986| | | | | | | | | | | | | | | | | | | |Mappy |Midway |1983| | | | | | | | | | | | | | | | | | | |Mappy II |Midway | | | | | | | | | | | | | | | | | | | | |Marble Madness |Atari |1984|S| | | | | | |C| | | | | | | | |S| | |Mario Bros. |Nintendo |1983| | | | | | | | | | | | | | | | | | | |Marvin's Maze |SNK | | | | | | | | | | | | | | | | | | | | |Mat Mania |Memetron |1985| | | | | | | | | | | | | | | | | | | |Max RPM |Midway |1987| | | | | | | | | | | | | | | | | | | |Mazer Blazer |Stern |1983| | | | | | | | | | | | | | | | | | | |Mechanized Attack |SNK | | | | | | | | | | | | | | | | | | | | |Mega Force |Tecmo | | | | | | | | | | | | | | | | | | | | |Megazone |Konami |1983| | | | | | | | | | | | | | | | | | | |Mermaid |Rock-Ola |1983| | | | | | | | | | | | | | | | | | | |Meta Fox |I-Vics | | | | | | | | | | | | | | | | | | | | |Metalhawk |Namco | | | | | | | | | | | | | | | | | | | | |Metro Cross (Part I)|Namco | | | | | | | | | | | | | | | | | | | | |Midnight Resistance |Data East |1989| | | | | | | | | | | | | | | | | | | |Mighty Guy |unknown | | | | | | | | | | | | | | | | | | | | |Mikie |Konami | | | | | | | | | | | | | | | | | | | | |Millipede |Atari |1981| | |C| | | | | | | | | | | | | | | | |Mini Golf |Sente |1985| | | | | | | | | | | | | | | | | | | |Mini Golf Deluxe |Sente |1989| | | | | | | | | | | | | | | | | | | |Missile Command |Atari |1980| | |C| | | | | | | | | | | | | | | | |Mission 660 |Taito |1986| | | | | | | | | | | | | | | | | | | |Mission : XX |U.A. | | | | | | | | | | | | | | | | | | | | |Mission X |Data East |1982| | | | | | | | | | | | | | | | | | | |Monaco G.P. |Sega |1980| | | | | | | | | | | | | | | | | | | |Money Money |Zaccaria |1982| | | | | | | | | | | | | | | | | | | |Monster Bash |Sega |1982| | | | | | | | | | | | | | | | | | | |Monster Lair |Sega | |S| | | | | |C| | | | | | | | | | | | |Monte Carlo |Atari |1979| | | | | | | | | | | | | | | | | | | |Moon Cresta |Nichibutsu |1980| | | | | | | | | | | | | | | |C| |S| |Moon Patrol |Williams |1982| | | | | | | | | | | | | | | | | |S| |Moon Shuttle |Nichibutsu | | | | | | | | | | | | | | | | | | |S| |Moon Wars |Stern | | | | | | | | | | | | | | | | | | | | |Moonwalker |Sega |1991| | | | | | | | | | | | | | | | | | | |Mortal Kombat |Midway |1992| | | | | | | | | | | | | | | | | | | |Motorace USA |Williams | | | | | | | | | | | | | | | | | | |S| |Motorace USA (Zippy)|Irem | | | | | | | | | | | | | | | | | | | | |Mousetrap |Exidy |1981| | | | | | | | | | | | | | | | | | | |Mr Do |Universal |1982| | | | | | | | | | | | | | | |C| | | |Mr Do Run Run |Universal |1984| | | | | | | | | | | | | | | |C| | | |Mr Do's Castle |Universal |1983| | | | | | | | | | | | | | | |C| | | |Mr Do's Wild Ride |Universal |1984| | | | | | | | | | | | | | | |C| | | |Mr F. Lea |unknown |1983| | | | | | | | | | | | | | | | | | | |Mr Lo |unknown |1982| | | | | | | | | | | | | | | |C| | | |Mr TNT |unknown | | | | | | | | | | | | | | | | | | | | |Mr. Heli |Irem | | | | | | | | | | | | | | | | | | | | |Ms Pac Man |Midway |1981| | | | | | | | | | | | | | | |C| | | |Munch Mobile |SNK |1983| | | | | | | | | | | | | | | | | | | |My Hero |Sega | | | | | | | | | | | | | | | | | | | | |Mystic Marathon |Williams | | | | | | | | | | | | | | | | | | |S| |N-Sub |unknown | | | | | | | | | | | | | | | | | | | | |N. Y. Captor |Taito | | | | | | | | | | | | | | | | | | | | |NARC |Williams |1988| | | | | | | | | | | | | | | | | |S| |NFL Football |Midway |1984| | | | | | | | | | | | | | | | | | | |Name That Tune |Sente |1985| | | | | | | | | | | | | | | | | | | |Naughty Boy |Jaleco |1982| | | | | | | | | | | | | | | |C| |S| |Nemesis |Konami | |S| | | | | | | | | | | | | | | | |X| |New York, New York |unknown | | | | | | | | | | | | | | | | | | | | |New Zealand Story |Taito | | | | | | | | | | | | | | | | | | | | |Nibbler |Rock-Ola | | | | | | | | | | | | | | | | | | | | |Night Driver |Atari |1976| | | | | | | | | | | | | | | | | | | |Night Stocker |Midway |1985| | | | | | | | | | | | | | | | | | | |Night Striker |Taito | | | | | | | | | | | | | | | | | | | | |Nile Flyer |Atari | | | | | | | | | | | | | | | | | | | | |Ninja Emaki |Nichibutsu | | | | | | | | | | | | | | | | | | |S| |Ninja Gaiden |Tecmo |1988| | | | | | | | | | | | | | | | | | | |Ninja Kids |Taito |1992| | | | | | | | | | | | | | | | | | | |Ninja Princess |Sega | | | | | | | | | | | | | | | | | | | | |Ninja Warriors |Romstar | | | | | | | | | | | | | | | | | | | | |Nova 2001 |unknown |1985| | | | | | | | | | | | | | | | | | | |OffRoad |Leland | | | | | | | | | | | | | | | | | | | | |Omega Fighter |UFL | | | | | | | | | | | | | | | | | | | | |Omega Race |Midway |1981| | | | | | | | | | | | | | | |C| | | |Operation Thunderbol|Taito |1989| | | | | | | | | | | | | | | | | | | |Operation Wolf |Taito |1987| | | | | | | | | | | | | | | | | | | |Orbit |Atari | | | | | | | | | | | | | | | | | | | | |Oscar |Data East | | | | | | | | | | | | | | | | | | | | |OutRun |Sega |1986| | | | | | | | | | | | | | | | | | | |Outlaw |Atari | | | | | | | | | | | | | | | | | | | | |P-47 |Jaleco |1988| | | | | | | | | | | | | | | | | | | |P.O.W. |SNK |1988| | | | | | | | | | | | | | | | | | | |Pac Land |Midway | | | | | | | | | | | | | | | | | | | | |Pac Man |Namco |1980| | | | | | | | | | | | | | | |C| |S| |Pac-Land |Namco |1984| | | | | | | | | | | | | | | | | | | |Pac-Man '88 |Midway |1988| | | | | | | | | | | | | | | | | | | |Pac-Man Plus |Midway |1982| | | | | | | | | | | | | | | |C| | | |Pac-Mania |Atari |1987| | | | | | | |C| | | | | | | | | | | |Paperboy |Atari |1985| | | | | | | |C| | | | | | | | | | | |Passing Shot |Sega | |S| | | | | |C| | | | | | | | | | | | |Pengo |Sega |1982| | | | | | | | | | | | | | | |C| |X| |Penia |Sega |1982| | | | | | | | | | | | | | | |C| | | |Pepper II |Exidy |1982| | | | | | | | | | | | | | | | | | | |Peter Packrat |Atari |1984|S| | | | | | |C| | | | | | | | |S|X| |Phoenix |Centuri |1980| | | | | | | | | | | | |C| | | | |S| |Phozon |Namco | | | | | | | | | | | | | | | | | | | | |Phraze Craze |Merit |1986| | | | | | | | | | | | | | | | | | | |Pig Out |Leland | | | | | | | | | | | | | | | | | | | | |Pigskin 621 A.D. |Midway |1990| | | | | | | | | | | | | | | | | | | |Pin Pong |Atari | | | | | | | | | | | | | | | | | | | | |Pinball Action |Tehkan |1986| | | | | | | | | | | | | | | | | | | |Pingo |Sega | | | | | | | | | | | | | | | | | | | | |Pioneer Balloon |Rock-Ola | | | | | | | | | | | | | | | | | | | | |Piranha |unknown | | | | | | | | | | | | | | | | | | | | |Pirate Pete |Taito |1983| | | | | | | | | | | | | | | | | | | |Pisces |unknown | | | | | | | | | | | | | | | | |C| | | |Pit Fighter |Atari |1991| | | | | | | | | | | | | | | | | | | |Pitchman |Las. Comp. Sys.|1983| | | | | | | | | | | | | | | | | | | |Pitfall II |Sega |1986| | | | | | | | | | | | | | | | | | | |Pleiades |Centuri | | | | | | | | | | | | | |C| | | | |S| |Plotting |unknown |1989| | | | | | | | | | | | | | | | | | | |Pole Position |Atari |1982| | | | | | | | | | | | | | | | | | | |Pole Position II |Atari |1984| | | | | | | | | | | | | | | | | | | |Pollux |Invega |1991| | | | | | | | | | | | | | | | | | | |Pong |Atari |1972| | | | | | | | | | | | | | | | | | | |Pong Doubles |Atari |1973| | | | | | | | | | | | | | | | | | | |Ponpoko |Venture Line |1982| | | | | | | | | | | | | | | | | | | |Pool |unknown | | | | | | | | | | | | | | | | |C| | | |Pooyan |Stern | | | | | | | | | | | | | | | | | | | | |Pop Flamer |Stern |1983| | | | | | | | | | | | | | | | | | | |Popeye |Nintendo |1982| | | | | | | | | | | | | | | |C| |S| |Popper |unknown | | | | | | | | | | | | | | | | | | | | |Port Man |unknown |1983| | | | | | | | | | | | | | | | | | | |Pot Shot |Atari |1988| | | | | | | | | | | | | | | | | | | |Power Drive |Midway |1989| | | | | | | | | | | | | | | | | | | |Power Ladies |unknown | | | | | | | | | | | | | | | | | | | | |Powerdrift |Sega |1988| | | | | | | | | | | | | | | | | | | |Pro Quarterback |Konami | | | | | | | | | | | | | | | | | | | | |Psychic Five |unknown | | | | | | | | | | | | | | | | | | | | |Psycho Soldier |SNK | | | | | | | | | | | | | | | | | | | | |Puckman |Midway |1980| | | | | | | | | | | | | | | |C| | | |Pulsar |Gremlin |1980| | | | | | | | | | | | | | | | | | | |Punch Out ! |Nintendo |1983| | | | | | | | | | | | | | | | | | | |Pursuit |Atari | | | | | | | | | | | | | | | | | | | | |Pushman |Am. Sammy | | | | | | | | | | | | | | | | | | | | |Puzznic |Taito |1989| | | | | | | | | | | | | | | | | | | |Pyros |Taito |1987| | | | | | | | | | | | | | | | | | | |Q*bert |Gottlieb |1983| | |S| | | | | | | | | | |C| | | |S| |Q*bert's Qubes |Mylstar | | | | | | | | | | | | | | | | | | | | |QB-3 |Rock-Ola |1982| | | | | | | | | | | | | | | | | | | |Qix |Taito |1981| | | | | | | | | | | | | | | | | | | |Quadrapong |Atari |1973| | | | | | | | | | | | | | | | | | | |Quantum |Atari |1983| | | | | | |C| | | | | | | | | |S| | |Quarterback |Leland |1987| | | | | | | | | | | | | | | | | | | |Quartet |Sega |1986|S| | | | | |C| | | | | | | | | | | | |Quartet II |Sega |1987|S| | | | | |C| | | | | | | | | | | | |Quasar |unknown | | | | | | | | | | | | | | | | | | | | |Quiz Show |Atari | | | | | | | | | | | | | | | | | | | | |Qwak! |Atari | | | | | | | | | | | | | | | | | | | | |R-360 |Sega |1991| | | | | | | | | | | | | | | | | | | |R-Type |Nintendo |1987| | | | | | | | | | | | | | | | | | | |R-Type II |Irem |1990| | | | | | | | | | | | | | | | | | | |Rabbit Punch |Taito | | | | | | | | | | | | | | | | | | | | |Race Drivin' |Atari |1990| | | | | | | | | | | | | | | | | | | |Rad Action |UPL | | | | | | | | | | | | | | | | | | | | |Rad Mobile |Sega |1991| | | | | | | | | | | | | | | | | | | |Radarscope |Nintendo | | | | | | | | | | | | | | | | | | |S| |Radical Radial |Nichibutsu |1982| | | | | | | | | | | | | | | | | |S| |Raiden |Fabtek | | | | | | | | | | | | | | | | | | | | |Raiders 5 |unknown | | | | | | | | | | | | | | | | | | | | |Rally Bike |Taito |1988| | | | | | | | | | | | | | | | | | | |Rally-X |Midway |1980| | | | | | | | | | | | | | | |C| |S| |Rampage |Midway |1986| | | | | | | | | | | | | | | |C| | | |Rampart |Atari |1991| | | | | | | | | | | | | | | | | | | |Rastan |Taito |1987| | | | | | | | | | | | | | | | | | | |Reactor |Gottlieb |1982| | | | | | | | | | | | | |C| | | |S| |Real Ghostbusters |Data East |1987| | | | | | | | | | | | | | | | | | | |Rear Guard |Exidy | | | | | | | | | | | | | | | | | | | | |Red Alert |Irem | | | | | | | | | | | | | | | | | | | | |Red Baron |Atari |1980| | |C| | | | | | | | | | | | | |S| | |Red Clash |unknown | | | | | | | | | | | | | | | | | | | | |Relief Pitcher |Atari |1992| | | | | | | | | | | | | | | | | | | |Renegade |Technos |1986| | | | | | | | | | | | | | | | | | | |Rescue |Stern |1983| | | | | | | | | | | | | | |S|C| | | |Return of the Jedi |Atari |1984| | | | | | | | | | | | | | | | | | | |Revenge of Doh |Taito |1987| | | | | | | | | | | | | | | | | | | |Rim Rockin' Basketba|Strata | | | | | | | | | | | | | | | | | | | | |Ring King |Data East |1985| | | | | | | | | | | | | | | | | | | |Ring King II |Data East |1986| | | | | | | | | | | | | | | | | | | |Rip Off |Cinematronics |1979| | | | | | | | | | | | | | | | | |X| |River Patrol |Kersten | | | | | | | | | | | | | | | | | | | | |Riviera |Merit |1986| | | | | | | | | | | | | | | | | | | |Road Blaster |Laser | | | | | | | | | | | | | | | | | | | | |Road Fighter |Konami | | | | | | | | | | | | | | | | | | | | |Road Riot 4WD |Atari |1991| | | | | | | | | | | | | | | | | | | |Road Runner |Atari | | | | | | | | |C| | | | | | | | |S| | |Roadblasters |Atari |1987| | | | | | | |C| | | | | | | | |S| | |Robocop |Data East |1988| | | | | | | | | | | | | | | | | | | |Robocop 2 |Data East |1991| | | | | | | | | | | | | | | | | | | |Robotron 2084 |Williams |1982| | | | |C| | | | | | | | | | | | |S| |Roc 'N' Rope |unknown | | | | | | | | | | | | | | | | | | | | |Rock 'N Rage |Konami | | | | | | | | | | | | | | | | | | | | |Rocket Racer |Rock-Ola |1983| | | | | | | | | | | | | | | | | | | |Roller Games |Konami |1990| | | | | | | | | | | | | | | | | | | |Roller Jammer |unknown | | | | | | | | | | | | | | | | | | | | |Rolling Thunder |Atari |1989|S| | | | | | | | | | | | | | | | |X| |Root Beer Tapper |Midway |1984| | | | | | | | | | | | | | |S| | | | |Rough Ranger |Sharp Image | | | | | | | | | | | | | | | | | | | | |Route 17 |Centuri |1983| | | | | | | | | | | | | | | | | | | |Runaway |unknown |1983| | | | | | | | | | | | | | | | | | | |Rush 'N Attack |Konami |1985| | | | | | | | | | | | | | | | | | | |Rygar |Tecmo |1986|S| | | | | | | | | | | | | | |C| | | |S. H. Imp. Football |Williams |1991| | | | | | | | | | | | | | | | | |S| |S.T.U.N. Runner |Atari |1989| | | | | | | | | | | | | | | | | | | |SCI |Taito |1990| | | | | | | | | | | | | | | | | | | |SDI |Sega | |S| | | | | |C| | | | | | | | | | | | |SF2 Champ. Ed. |Capcom |1992| | | | | | | | | | | | | | | | | | | |Saint Dragon |Jaleco |1989| | | | | | | | | | | | | | | | | | | |Salamander |unknown | | | | | | | | | | | | | | | | | | | | |Samurai |Taito |1987| | | | | | | | | | | | | | | | | | | |Sarge |Midway | | | | | | | | | | | | | | | | | | | | |Satan's Hollow |Midway |1982| | | | | | | | | | | | | | |S|C| | | |Savage Bees |unknown | | | | | | | | | | | | | | | | | | | | |Scion |unknown | | | | | | | | | | | | | | | | | | | | |Scramble |Stern |1981| | | | | | | | | | | | | | |S|C| | | |Scramble Spirits |unknown | | | | | | | | | | | | | | | | | | | | |Sea Wolf |Midway |1975| | | | | | | | | | | | | | | | | | | |Sea Wolf II |Midway |1979| | | | | | | | | | | | | | | | | | | |Search & Rescue |SNK | | | | | | | | | | | | | | | | | | | | |Sebring |Atari | | | | | | | | | | | | | | | | | | | | |Section Z |Capcom | | | | | | | | | | | | | | | | | | | | |Seicross |unknown | | | | | | | | | | | | | | | | | | | | |Sente System |Sente |1984| | | | | | | | | | | | | | | | | | | |Sex Trivia |Merit |1985| | | | | | | | | | | | | | | | | | | |Shackled |Data East |1986| | | | | | | | | | | | | | | | | | | |Shadow Dancer |Sega |1990| | | | | | | | | | | | | | | | | | | |Shadow Warrior |Tecmo | | | | | | | | | | | | | | | | | | | | |Shanghai |SUN | | | | | | | | | | | | | | | | | | | | |Shanghai Kid |Memetron |1985| | | | | | | | | | | | | | | | | | | |Shark Attack |unknown | | | | | | | | | | | | | | | | | | | | |Shinobi |Sega |1987|S| | | | | |C| | | | | | | | |S| | | |Shoot Out |Data East |1985| | | | | | | | | | | | | | | | | | | |Shooting Gallery |unknown | | | | | | | | | | | | | | | | | | | | |Shooting Master |Sega |1985| | | | | | | | | | | | | | | | | | | |Showdown |Exidy |1988| | | | | | | | | | | | | | | | | | | |Shuuz |Atari |1990| | | | | | | | | | | | | | | | | | | |Side Arms |Romstar | | | | | | | | | | | | | | | | | | | | |Side Track |Exidy |1978| | | | | | | | | | | | | | | | | | | |Sidearms |Capcom | | | | | | | | | | | | | | | | | | | | |SilkWorm |Tecmo |1988| | | | | | | | | | | | | | | | | | | |Simpsons |Konami |1991| | | | | | | | | | | | | | | | | | | |Sinbad 7 |unknown | | | | | | | | | | | | | | | | | | | | |Sinistar |Williams |1982| | | | |C| | | | | | | | | | | | |S| |Skate or Die |Atari | | | | | | | | | | | | | | | | | | | | |Skull & Crossbones |Atari |1990| | | | | | | | | | | | | | | | | | | |Sky Adventure |SNK | | | | | | | | | | | | | | | | | | | | |Sky Diver |Atari | | | | | | | | | | | | | | | | | | | | |Sky Raider |Atari |1979| | | | | | | | | | | | | | | | | | | |Sky Rider |unknown | | | | | | | | | | | | | | | | | | | | |Sky Shark |Romstar |1987| | | | | | | | | | | | | | | | | | | |Sky Soldiers |Romstar |1988| | | | | | | | | | | | | | | | | | | |Slap Fight |unknown | | | | | | | | | | | | | | | | | | | | |Slither |GDI | | | | | | | | | | | | | | | | | | | | |Sly Spy |Data East |1989| | | | | | | | | | | | | | | | | | | |Smash TV |Williams |1990| | | | | | | | | | | | | | | | | |S| |Smokey Joe |Atari | | | | | | | | | | | | | | | | | | | | |Snack Attack |Midway | | | | | | | | | | | | | | | | | | | | |Snake Pit |Sente |1984| | | | | | | | | | | | | | | | | | | |Snap-Jack |Universal | | | | | | | | | | | | | | | | | | | | |Snow Brothers |Technos | | | | | | | | | | | | | | | | | | | | |Soccer |Atari | | | | | | | | | | | | | | | | | | | | |Solar Fox |Midway |1982| | | | | | | | | | | | | | | | | | | |Solar Quest |Cinematronics |1981| | | | | | | | | | | | | | | | | |X| |Solar War |Atari | | | | | | | | | | | | | | | | | | | | |Solar Warrior |Memetron | | | | | | | | | | | | | | | | | | | | |Son Son |unknown | | | | | | | | | | | | | | | | | | | | |Sonic Boom |Sega | |S| | | | | |C| | | | | | | | | | | | |Sovalou |Namco |1991| | | | | | | | | | | | | | | | | | | |Space Ace |Cinematronics |1983| | | | | | | | | | | | | | | | | |X| |Space Attack II |unknown | | | | | | | | | | | | | | | | | | | | |Space Duel |Atari |1981| | |C| | | | | | | | | | | | | |S| | |Space Dungeon |Taito |1982| | | | | | | | | | | | | | | | | | | |Space Encounters |Midway |1980| | | | | | | | | | | | | | | | | | | |Space Firebird |Sega |1980| | | | | | | | | | | | | | | | | | | |Space Fury |Sega |1981| | | | | | | | | |S| | | | | |C| | | |Space Gun |Taito |1990| | | | | | | | | | | | | | | | | | | |Space Harrier |Sega | | | | | | | | | | | | | | | | | | | | |Space Hawk |Cinematronics | | | | | | | | | | | | | | | | | | |X| |Space Inv. Deluxe |Midway |1979| | | | | | | | | | | | | | | | | |S| |Space Invaders |Midway |1978| | | | | | | | | | | |C| | | | | |S| |Space Invaders II |Taito | | | | | | | | | | | | |C| | | | | |S| |Space Laser |Taito |1980| | | | | | | | | | | | | | | | | | | |Space Lords |Atari |1992| | | | | | | | | | | | | | | | | | | |Space Odyssey |Sega | | | | | | | | | | | | | | | | | | | | |Space Panic |Universal |1980| | | | | | | | | | | | | | | | | | | |Space Race |Atari |1973| | | | | | | | | | | | | | | | | | | |Space Tactics |Sega | | | | | | | | | | | | | | | | | | | | |Space Wars |Cinematronics |1977| | | | | | | | | | | | | | | | | |X| |Space Zap |Midway |1978| | | | | | | | | | | | | | | |C| | | |Spec. Criminal Inv. |Taito |1989| | | | | | | | | | | | | | | | | | | |Special Project Y |Konami | | | | | | | | | | | | | | | | | | | | |Spectar |Exidy |1980| | | | | | | | | | | | | | | | | | | |Spectra |Status |1986| | | | | | | | | | | | | | | | | | | |Speed Buggy |Data East | | | | | | | | | | | | | | | | | | | | |Speed Freak |Vectorbeam |1977| | | | | | | | | | | | | | | | | | | |Speed Rumbler |Capcom | | | | | | | | | | | | | | | | | | | | |Spiderman |Sega |1992| | | | | | | | | | | | | | | | | | | |Spiders |unknown | | | | | | | | | | | | | | | | | | | | |Spiker |Midway | | | | | | | | | | | | | | | | | | | | |Splat |Williams | | | | | |C| | | | | | | | | | | | |S| |Splatter House |Tecmo |1988| | | | | | | | | | | | | | | | | | | |Sprint |Atari |1975| | | | | | | | | | | | | | | | | | | |Sprint 8 |Atari | | | | | | | | | | | | | | | | | | | | |Sprint II |Atari |1976| | | | | | | | | | | | | | | | | | | |Spy Hunter |Midway |1983| | | | | | |S| | | | | | | |S|C| | | |Spy Hunter II |Midway | | | | | | | | | | | | | | | | | | | | |Star Base Omega |unknown |1988| | | | | | | | | | | | | | | | | | | |Star Castle |Cinematronics |1980| | | | | | | | | | | | | | | | | |X| |Star Fire |Exidy | | | | | | | | | | | | | | | | | | | | |Star Force |Tehkan | | | | | | | | | | | | | | | | | | | | |Star Hawk |Cinematronics |1978| | | | | | | | | | | | | | | | | |X| |Star Rider |Williams | | | | | | | | | | | | | | | | | | |S| |Star Trek |Sega |1983| | | | | | | | | |S| | | | | |C| | | |Star Wars |Atari |1983| | |X| |C| | | | | | | | | | | |S| | |StarBlade |Namco |1991| | | | | | | | | | | | | | | | | | | |Stargate |Williams |1981| | | | |C| | | | | | | | | | | | |S| |Starship I |Atari |1977| | | | | | | | | | | | | | | | | | | |Steel Talons |Atari |1991| | | | | | | | | | | | | | | | | | | |Steeple Chase |Atari | | | | | | | | | | | | | | | | | | | | |Stocker |Sente | | | | | | | | | | | | | | | | | | | | |Stompin' |Sente | | | | | | | | | | | | | | | | | | | | |Storming Party |unknown | | | | | | | | | | | | | | | | | | | | |Stratavox |Taito |1980| | | | | | | | | | | | | | | | | | | |Strategy X |Stern |1981| | | | | | | | | | | | | | | | | | | |Strato Fighter |Tecmo | | | | | | | | | | | | | | | | | | | | |Street Fighter |Capcom |1987| | | | | | | | | | | | | | | | | | | |Street Fighter II |Capcom |1991| | | | | | | | | | | | | | | | | | | |Street Football |Midway | | | | | | | | | | | | | | | | | | | | |Street Heat |unknown | | | | | | | | | | | | | | | | | | | | |Street Smart |SNK |1989| | | | | | | | | | | | | | | | | | | |Strength & Speed |unknown | | | | | | | | | | | | | | | | | | | | |Strider |Capcom |1989| | | | | | | | | | | | | | | | | | | |Strike Force |Midway |1991| | | | | | | | | | | | | | | | | | | |Strike Gunner S.T.G.|Tecmo | | | | | | | | | | | | | | | | | | | | |Strike Zone Baseball|Leland |1988| | | | | | | | | | | | | | | | | | | |Subroc-3D |Sega |1982| | | | | | | | | | | | | | | | | | | |Subs |Atari | | | | | | | | | | | | | | | | | | | | |Sundance |Cinematronics | | | | | | | | | | | | | | | | | | |X| |Sunset Riders |Konami |1991| | | | | | | | | | | | | | | | | | | |Super Basketball |Konami | | | | | | | | | | | | | | | | | | | | |Super Breakout |Atari | | | | | | | | | | | | | | | | | | | | |Super Cobra |Stern |1982| | | | | | | | | | | | | | | | | | | |Super Contra |Konami |1988| | | | | | | | | | | | | | | | | | | |Super Death Chase |Exidy | | | | | | | | | | | | | | | | | | | | |Super Dodge Ball |Leland | | | | | | | | | | | | | | | | | | | | |Super Don Quixote |Universal | | | | | | | | | | | | | | | | | | | | |Super Draw |Stern |1983| | | | | | | | | | | | | | | | | | | |Super Earth Invasion|unknown | | | | | | | | | | | | | | | | |C| | | |Super Flipper |Chicago Coin |1975| | | | | | | | | | | | | | | | | | | |Super Galaxian |unknown | | | | | | | | | | | | | | | | |C| | | |Super Hang On |Sega | | | | | | | | | | | | | | | | | | | | |Super League |Sega | |S| | | | | |C| | | | | | | | | | | | |Super Mario Bros. |Nintendo |1985| | | | | | | | | | | | | | | | | | | |Super Missile Attack|Atari |1983| | | | | | | | | | | | | | | | | | | |Super Monaco G.P. |Sega |1988| | | | | | | | | | | | | | | | | | | |Super OffRoad |Leland | | | | | | | | | | | | | | | | | | | | |Super Pac-Man |Midway |1982| | | | | | | | | | | | | | | | | | | |Super Punch Out |Nintendo |1984| | | | | | | | | | | | | | | | | | | |Super Qix |Romstar |1987| | | | | | | | | | | | | | | | | | | |Super Ranger |unknown | | | | | | | | | | | | | | | | | | | | |Super Speed Race |Williams | | | | | | | | | | | | | | | | | | |S| |Super Sprint |Atari |1986| | | | | | | |C| | | | | | | | | | | |Super Volleyball |Video System |1989| | | | | | | | | | | | | | | | | | | |Super Wonderboy |Sega | | | | | | | | | | | | | | | | | | | | |Super Zaxxon |Sega |1982| | | | | | | | | | | | | | | | | | | |SuperPong |Atari |1973| | | | | | | | | | | | | | | | | | | |Superbug |Atari | | | | | | | | | | | | | | | | | | | | |Superman |Taito |1988| | | | | | | | | | | | | | | | | | | |Sure Shot Pool |Status |1986| | | | | | | | | | | | | | | | | | | |Surround |Atari | | | | | | | | | | | | | | | | | | | | |Survival |Rock-ola | | | | | | | | | | | | | | | | | | | | |Swimmer |Tehkan | | | | | | | | | | | | | | | | |C| | | |System 1 |Atari | | | | | | | | |C| | | | | | | | | | | |TKO Boxing |Data East |1987| | | | | | | | | | | | | | | | | | | |TNK III |SNK |1985| | | | | | | | | | | | | | | | | | | |TX1 |Atari |1983| | | | | | | | | | | | | | | | | | | |Tac Scan |Sega | | | | | | | | | | | | | | | | |C| |S| |Tag Team Wrestling |Technos |1984| | | | | | | | | | | | | | | | | | | |Tailgunner |Cinematronics | | | | | | | | | | | | | | | | | | |X| |Tailgunner II |Cinematronics | | | | | | | | | | | | | | | | | | |X| |Taito Volleyball |Taito | | | | | | | | | | | | | | | | | | | | |Tank |Atari |1975| | | | | | | | | | | | | | | | | | | |Tank 8 |Atari | | | | | | | | | | | | | | | | | | | | |Tank Force |Namco |1992| | | | | | | | | | | | | | | | | | | |Tank II |Atari | | | | | | | | | | | | | | | | | | | | |Tanks |Kee Games |1974| | | | | | | | | | | | | | | | | | | |Tapper |Midway |1984| | | | | | | | | | | | | | |S|C| | | |Targ |Exidy |1980| | | | | | | | | | | | | | | | | | | |Tazmania |unknown | | | | | | | | | | | | | | | | | | | | |Tecmo Bowl |Tecmo |1987| | | | | | | | | | | | | | | | | | | |Tecmo Bowl II |Tecmo | | | | | | | | | | | | | | | | | | | | |Tecmo Knight |Tecmo | | | | | | | | | | | | | | | | | | | | |Teenage MNT |Konami |1989| | | | | | | | | | | | | | | | | | | |Tempest |Atari |1980| | |C| | | | | | | | | | | | | |S| | |Terminator 2 |Midway |1991| | | | | | | | | | | | | | | | | | | |Terra Cresta |Sega | | | | | | | | | | | | | | | | | | | | |Terra Force |Nichibutsu | | | | | | | | | | | | | | | | | | |S| |Tetris |Sega |1989|S| | | | | |C| | | | | | | | | | | | |Tetris |Atari |1989| | | | | | | | | | | | | | | | | | | |Thayer's Quest |RDI |1984| | | | | | | | | | | | | | | | | | | |The End |Stern |1980| | | | | | | | | | | | | | | | | | | |The Glob |Eagle | | | | | | | | | | | | | | | | |C| | | |The Pit |Centuri |1983| | | | | | | | | | | | | | | | | | | |Thief |Pacific Novelty|1981| | | | | | | | | | | | | | | | | | | |Three Stooges |Mylstar | | | | | | | | | | | | | | |C| | | | | |Thunder Blade |Sega | | | | | | | | | | | | | | | | | | | | |Thunder Crester |Sega |1985| | | | | | | | | | | | | | | | | | | |Thundercade |Romstar |1988| | | | | | | | | | | | | | | | | | | |Thunderjaws |Atari |1990| | | | | | | | | | | | | | | | | | | |Tiger Heli |Romstar |1986| | | | | | | | | | | | | | | | | | | |Tiger Road |Romstar | | | | | | | | | | | | | | | | | | | | |Timber |Midway | | | | | | | | | | | | | | | |S| | | | |Time Pilot |Konami |1982| | | | |C| | | | | | | | | |S|X| | | |Time Pilot '84 |Konami |1984| | | | |C| | | | | | | | | | |S| | | |Time Scanner |Sega | | | | | | | | |C| | | | | | | |S| | | |Time Soldiers |Romstar |1987| | | | | | | | | | | | | | | | | | | |Time Traveller |Sega |1991| | | | | | | | | | | | | | | | | | | |Time Warriors |Romstar |1987| | | | | | | | | | | | | | | | | | | |Tin Star |Taito |1983| | | | | | | | | | | | | | | | | | | |Toki |Fabtek | |S| | | | | |C| | | | | | | | |S| |X| |Tokio |Romstar | | | | | | | | | | | | | | | | | | | | |Toobin' |Atari |1988| | | | | | | | | | | | | | | | | | | |Top Gunner |Konami | | | | | | | | | | | | | | | | | | | | |Top Shooter |Taito |1988| | | | | | | | | | | | | | | | | | | |Top Speed |Romstar | | | | | | | | | | | | | | | | | | | | |Tornado Baseball |Midway | | | | | | | | | | | | | | | | | | | | |Total Carnage |Midway |1992| | | | | | | | | | | | | | | | | | | |Touch-Me |Atari | | | | | | | | | | | | | | | | | | | | |Touchdown Fever |SNK |1987| | | | | | | | | | | | | | | | | | | |Tough Turf |Sega | |S| | | | | |C| | | | | | | | | | | | |Tour. Cyberball 2072|Atari | | | | | | | | | | | | | | | | | | | | |Tournament Arkanoid |Taito | | | | | | | | | | | | | | | | | | | | |Tournament Table |Atari | | | | | | | | | | | | | | | | | | | | |Tower of Druaga |Namco | | | | | | | | | | | | | | | | | | | | |Track and Field |Centuri |1983| | | | | | | | | | | | | | | | | | | |Trak 10 |Atari |1974| | | | | | | | | | | | | | | | | | | |Tri-Sports |Midway |1983| | | | | | | | | | | | | | | | | | | |Trick Shot |Sente | | | | | | | | | | | | | | | | | | | | |Triple Hunt |Atari | | | | | | | | | | | | | | | | | | | | |Triple Punch |unknown |1982| | | | | | | | | | | | | | | | | | | |Triv-Quiz |Status |1982| | | | | | | | | | | | | | | | | | | |Trivia Whiz |Merit |1984| | | | | | | | | | | | | | | |C| | | |Trivial Pursuit |Sente |1986| | | | | | | | | | | | | | | | | | | |Trog |Exidy |1990| | | | | | | | | | | | | | | | | | | |Trojan |Capcom | | | | | | | | | | | | | | | | | | | | |Tron |Midway |1982| | | | | | | | | | | | | | |S|C| | | |Truxton |Sega | | | | | | | | | | | | | | | | | | | | |Tube Chase |Atari | | | | | | | | | | | | | | | | | | | | |Tumblepop |Data East |1991| | | | | | | | | | | | | | | | | | | |Tunnel Hunt |Centuri |1982| | | | | | | | | | | | | | | | | | | |Turbo |Sega |1981| | | | | | | | | | | | | | | | | | | |Turbo OutRun |Sega |1989| | | | | | | | | | | | | | | | | | | |TurboForce |System V |1991| | | | | | | | | | | | | | | | | | | |Turkey Shoot |Williams |1984| | | | | | | | | | | | | | | | | |S| |Turtles |Stern |1981| | | | | | | | | | | | | | | | | | | |Turtles in Time |Konami |1991| | | | | | | | | | | | | | | | | | | |Tutankham |Konami |1982| | | | |C| | | | | | | | | | |X| | | |Twin Cobra |Romstar |1987| | | | | | | | | | | | | | | | | | | |Twin Eagle |Taito |1988| | | | | | | | | | | | | | | | | | | |Twin Racer |Kee |1974| | | | | | | | | | | | | | | | | | | |Two Crude |Data East |1989| | | | | | | | | | | | | | | | | | | |Two Game Module |Atari | | | | | | | | | | | | | | | | | | | | |Two Tigers |Midway |1984| | | | | | | | | | | | | | | | | | | |U.N. Command |unknown | | | | | | | | | | | | | | | | | | | | |U.N. Squadron |Capcom | | | | | | | | | | | | | | | | | | | | |U.S. Classic Golf |Taito | | | | | | | | | | | | | | | | | | | | |UFO Invasion |unknown | | | | | | | | | | | | | | | | | | | | |UFO Robo Dangar |Nichibutsu | | | | | | | | | | | | | | | | | | |S| |Ultra Tank |Atari | | | | | | | | | | | | | | | | | | | | |Up 'n' Down |Midway |1984| | | | | | | | | | | | | | | | | | | |Us Vs. Them |Mylstar | | | | | | | | | | | | | | | | | | | | |V'Ball |Taito |1988| | | | | | | | | | | | | | | | | | | |Vampire |E. E. Ltd. |1982| | | | | | | | | | | | | | | | | | | |Vanguard |Centuri |1982| | |C| | | | | | | | | | | | | | | | |Vanguard II |SNK | | | |C| | | | | | | | | | | | | | | | |Vega |unknown | | | | | | | | | | | | | | | | | | | | |Vendetta |Konami |1991| | | | | | | | | | | | | | | | | | | |Venture |Exidy |1981| | |S| | | | | | | | | | | | | | | | |Vertigo |Exidy | | | | | | | | | | | | | | | | | | | | |Victory |Exidy |1982| | | | | | | | | | | | | | | | | | | |Victory Road |Tradewest |1986| | | | | | | | | | | | | | | | | | | |Video Pinball |Atari |1978| | | | | | | | | | | | | | | | | | | |Video Trivia |unknown | | | | | | | | | | | | | | | | | | | | |Video Trivia |unknown | | | | | | | | | | | | | | | | | | | | |Vigilante |Data East |1988| | | | | | | | | | | | | | | | | | | |Vindicators |Atari |1988| | | | | | | |C| | | | | | | | |S| | |Vindicators II |Atari |1990| | | | | | | |C| | | | | | | | |S| | |Viper |Leland |1988| | | | | | | | | | | | | | | | | | | |Vorfeed |Taito | | | | | | | | | | | | | | | | | | | | |Vs. 10 Yard Fight |Irem | | | | | | | | | | | | | | | | | | | | |Vs. Baseball |Nintendo | | | | | | | | | | | | | | | | | | | | |Vs. Castlevania |Konami |1988| | | | | | | | | | | | | | | | | | | |Vs. Dr. Mario |Nintendo |1990| | | | | | | | | | | | | | | | | | | |Vs. Duck Hunt |Nintendo |1985| | | | | | | | | | | | | | | | | | | |Vs. Excitebike |Nintendo |1987| | | | | | | | | | | | | | | | | | | |Vs. Freedom Force |Nintendo | | | | | | | | | | | | | | | | | | | | |Vs. Golf |Nintendo |1988| | | | | | | | | | | | | | | | | | | |Vs. Gradius |Konami |1988| | | | | | | | | | | | | | | | | | | |Vs. Gumshoe |Nintendo |1987| | | | | | | | | | | | | | | | | | | |Vs. Hogan's Alley |Nintendo |1985| | | | | | | | | | | | | | | | | | | |Vs. Ice Climber |Nintendo |1988| | | | | | | | | | | | | | | | | | | |Vs. Platoon |Sunsoft |1988| | | | | | | | | | | | | | | | | | | |Vs. RBI |Nintendo | | | | | | | | | | | | | | | | | | | | |Vs. Sky Kid |Sunsoft |1988| | | | | | | | | | | | | | | | | | | |Vs. Slalom |Nintendo |1986| | | | | | | | | | | | | | | | | | | |Vs. Super Mario Bro.|Nintendo | | | | | | | | | | | | | | | | | | | | |Vs. TKO Boxing |Nintendo | | | | | | | | | | | | | | | | | | | | |Vs. Tennis |Nintendo | | | | | | | | | | | | | | | | | | | | |Vs. The Goonies |Konami |1988| | | | | | | | | | | | | | | | | | | |Vs. Top Gun |Nintendo | | | | | | | | | | | | | | | | | | | | |Vulgus |Konami | | | | | | | | | | | | | | | | | | | | |WEC Le Mans |Konami | | | | | | | | | | | | | | | | | | | | |WWF Superstars |Technos |1989| | | | | | | | | | | | | | | | | | | |WWF Wrestlefest |Technos |1991| | | | | | | | | | | | | | | | | | | |Wacko |Midway |1983| | | | | | | | | | | | | | |S| | | | |Walter Payton Footb.|Sega | | | | | | | | | | | | | | | | | | | | |War of The Insects |unknown | | | | | | | | | | | | | | | | |C| | | |War of the Bugs |unknown |1981| | | | | | | | | | | | | | | |C| | | |War of the Worlds |Cinematronics | | | | | | | | | | | | | | | | | | |X| |Warlords |Atari | | | | | | | | | | | | | | | | | | | | |Warp Warp |Rock-Ola |1981| | | | | | | | | | | | | | | | | | | |Warriors |Cinematronics | | | | | | | | | | | | | | | | | | |X| |Warriors Fate |Capcom |1992| | | | | | | | | | | | | | | | | | | |Web Wars |unknown |1978| | | | | | | | | | | | | | | | | | | |Whack |Midway | | | | | | | | | | | | | | | | | | | | |Wheel of Fortune |unknown |1988| | | | | | | | | | | | | | | | | | | |Wheels Runner |unknown | | | | | | | | | | | | | | | | | | | | |Who Dunit |Exidy |1988| | | | | | | | | | | | | | | | | | | |Wild Western |Taito |1982| | | | | | | | | | | | | | | | | | | |Willow |Capcom |1989| | | | | | | | | | | | | | | | | | | |Winning Run |Namco | | | | | | | | | | | | | | | | | | | | |Winning Run Suzuka |Namco | | | | | | | | | | | | | | | | | | | | |Witch's Way |unknown | | | | | | | | | | | | | | | | | | | | |Wizard of Wor |Midway |1981| | | | | | | | | | | | | | | |C| | | |Wizz Quiz |unknown | | | | | | | | | | | | | | | | | | | | |Wonderboy |Sega | | | | | | | | | | | | | | | | | | | | |Wonderboy III |Sega | | | | | | | | | | | | | | | | | | | | |World Cup |Atari |1990| | | | | | | | | | | | | | | | | | | |World Series |Leland | | | | | | | | | | | | | | | | | | | | |World Series Basebal|Cinemetronics | | | | | | | | | | | | | | | | | | | | |World Series Season |Cinematronics |1985| | | | | | | | | | | | | | | | | |X| |World Stadium '89 |Taito |1989| | | | | | | | | | | | | | | | | | | |Wrestle War |Sega |1989| | | | | | | | | | | | | | | | | | | |X-Men |Konami |1992| | | | | | | | | | | | | | | | | | | |X-Multiply |Irem |1989| | | | | | | | | | | | | | | | | | | |Xenophobe |Midway |1987|S| | | | | |C| | | | | | | | |X| |X| |Xevious |Namco |1982| | | | | | | | | | | | | | | |C| |S| |Xexex |Konami |1992| | | | | | | | | | | | | | | | | | | |Xybots |Atari |1987| | | | | | | | | | | | | | | | | | | |Yie Ar Kung Fu |Konami |1985| | | | | | | | | | | | | | | | | | | |Zarzon |unknown | | | | | | | | | | | | | | | | | | | | |Zaxxon |Sega |1982| | | | | | | | | | | | | | | |X| |S| |Zector |Sega | | | | | | | | | | | | | | | | | | | | |Zero Hour |Universal |1980| | | | | | | | | | | | | | | | | | | |Zero Wing |Williams | | | | | | | | | | | | | | | | | | |S| |Zoar |unknown | | | | | | | | | | | | | | | | | | | | |Zookeeper |unknown |1980| | | | | | | | | | | | | | | | | | | |Zwackery |Midway | | | | | | | | | | | | | | | | | | | | |Zzyzzyxx |unknown |1983| | | | | | | | | | | | | | | | | | | +-----------------------------------------------------------------------------+