                  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 <mcuddy@scitexdv.com>]
 * 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````(`,^^<B'<H%/0<P,``-X*```,````1DE.1$-(05(N4$%3[59=
M3]M*$'U'XC_,`U(=\(UL)U`4E(<0D]M()4%)"HD0JC;V&%LX=K2[+D&H_[W[
M9>,$:%^H[LO-`R8S9\^>.3.[SA7-[RE9P2#)PDNV)L&*9/V84':VO[>_]PS?
M&(;`<XA$'@*1(`%'RB#)@.8K$4Z1-:%<J1`,"$6@2-+T"3Q8)ISM[P&LD4*0
MISFU85EP*!A"G@E$GJ&.RVU"Y!AP8#%9([/!+U9K!LN<QR][2RZQ-1,+@4#+
M<S:>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*YSU2M<WYQ;_#$<`S!"D*-9)5F<@D'<!@/'E9V`479F,098(_EEFU6/X#
M51FW!FV[=W*!<_9.VOM]NE5+7XQ\)?5M->X;8G3U`E&"_W$-P\M64%<JL2>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&<AJJ
MV`19D?+!%FX6HYR_VAS6SX-/R:,\CM9-G`1QB;F)D>+<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<I]9
M`_O3RORD:![CIT9Y42$7*5=_/4_SX&&")!2ALM_.G7W@.HYCFTM-(_MISM`:
ME`5,D:^J7P:P^W:WS.VLEPKL39RGJ"YJJQ>&M,HW:O=,_^7EYKS[JIVK?ACH
MX6D#+L>^_/UBC%O4T^`/KZ'M-.`03DU>WKJRSA)BS^U%W<OW[(L^V+Z=>D4!
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%\$<I=#Q,FA]^G0.KWB.
MOU%Q[B+(8!4%.:SQX#EZ1F&<H#GD,3P@6&7X-8C@ZRK-%UA!DL9_(#_//E2*
M:QSTAZX]^:7=M1L'MX[M-`X`K)%#H;NSL4W:8R]$.1_U&<9Q$.4HO2)=CI\B
M%#VLOE9T)6F0HXI1C8/N:.BXA"?+Y\^/'EQ"PGH)GSMI'IJ>:9H&'.*_YA$=
M<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-&<IE=$CR@^<_N;&+_LPU
M7<L@"I9>"//46S,]*Z9H2X1(H>,PSL?!GRAL3HT9-\6/PS@EYOZ5HR,-0V<T
M;8[E7%SA0<8ZF.<+8X&"QT5>)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
MXAFO<C<(43,QYBC+=9_C5A^_/^+6/?5^3_5^I1P_#)($S7^$.+9J?YRD?P9-
M3MP=2O/`]T*8H#SU?+1K$NG$\0P!=ZF3>RE96RK-CO25[0;+B*PRP;,C0G0=
M0[0FJ<F_HD:EZ2K1]?7B^`GS-)T$H;GJ-,$QP1Z*4X2'9Q17_V8\L&_LH=MV
M^Z,AH53F$?"R#"T?0II<V\X-26`WHSMH3PW3Q`RDW1^Z)"TU#NRA=:5+4E+/
M5DGF3DFOR#=;-)R=FKS5P>/I^^T`ORM4^MZV+,(O.RP,CVP8"TZP'<.2O7VC
M+1KM@4$!2<[+WZW^%Z,]J#+H^S*B9J.P<F`[``3,[\D7KAV(38K=0.P2ED-A
M.[&7]M"6<]MAX^[[EMN3_9J9`-UI@5&2L)LH>"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^9JM<O2I68)"YD8GEJPBG2<P>X/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%N<?OQMD-/!LBRB*2_;YH"HI"6O+RDT[;SWNB
MR%<MPQWWK-0OHZ>1JA&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/,><VBU6.^[K!!S,R8VG&(?/;,)8O>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?&"<G1=6T]_RS\\6(O2Y:R@LE<<L\PR,
M=J^2H71A4OM!DSS2;#/LS=B+#SVVX*[NK[OG$5]R:9B+3T7QY+CI"NE(K0X<
M?O*E3/&AJJ\HP/]_:!S\#5!+`0(4`!0````(`,^^<B'<H%/0<P,``-X*```,
M``````````$`(`````````!&24Y$0TA!4BY005-02P$"%``4````"``&OW(A
M/Q9U)FL(```A+```"P`````````!`"````"=`P``34]$13$S2"Y005-02P4&
2``````(``@!S````,0P`````
`
end

M.3.6    Ms. PacMan ROMs are identical to PacMan?

   It turns out that the ROMs i was working with are pacman ROMs. I did a
   file comparison after I discovered this fact, and it turns out that the
   ROMs I took from the mspac.zip file (mspacman.6e -- 6j) aren't any
   different from the roms from goodpac.zip (pacman.6e -- 6j).

   Maybe this is the way it's supposed to be, because you can build a
   mspacman from a pacman by building in a daughter board. And the roms u5 u6
   u7 come from that board. But I can't figure those out (yet).

   So what's the value of this information for you:

   My previous information doesn't apply to mspacman, but to pacman!
   [Or possibly both...]

M.4   Phoenix [provided by Ralph Kimmlingen (ub2f@rz.uni-karlsruhe.de)]

M.4.1    Components

   - 8085 CPU @5.5 Mhz
   - 8x2kB ROM
   - Two plane display (CHARSET-A, CHARSET-B)
     CHAR-A: 2x2kB ROM, 4x0.5kB RAM
     CHAR-B: 2x2kB ROM, 4x0.5kB RAM
   - 2x3 bit color DAC
   - 8 bit vertical scroll register
   - MN6221AA 2voice melody module

   please note: as Phoenix uses a 90 degree rotated picture tube, all
                references to 'horizontal' positions actually mean VERTICAL
                ELECTRON BEAM positions.

M.4.2    Functionality

   The picture consists of two independent planes, where each pixel is
   represented two bits. As the lower plane is used for scrolling (CHAR-A,
   starfield), the first row is always invisible (scroll-buffer). All sprites
   and text are displayed in the upper plane (except for eagles).

   _____26x8 pixel___________
   |xxxxxxxxxxxxxxxxxxxxxxxx| <-- first row (score count etc.)
   |                        |
   |                        |
   |    /+\                 |
   .                        .
   :                        : <32x8 lines>
   |     |                  |
   |                        |
   |     |                  |
   |                        |
   |_____^__________________|

   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  ] { <silence>, <for luise>, <???>, <alarm beep> }
   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)</]8"<(]U[[KE7LF0?MM[LO-E!:$+F&)T)![L$77LQ^DS)F@CTI'<U
M=(`N%EA@)X*.ST2$E#/I(O^G"TJ$V*!;$CH\ZJ#)@C)NT___$%`V[]H$;*39
MIQ#/"?H^]PH7?.T`99?$!'G4)WK2&DG;RWSF>$D0DTWU2JWKV&C@7I92J@75
MKS#M[=K'#:QK#:Q+DC,?LB8N.B<XC`H2#*.#([-K4U;!_08>2"Q)KKGO$H;.
MXEHN<ZP;O6'IE.)!`Q_E)),%=OD:76+FP#P4Z;BZ<:0;A5.*>PULYB13"O6<
M.)BQ"@>*0EWKFZ53BLT&[N<D[S";HSO6*.Q@:.I=P9<5;#1P3^*DJIY<2^<K
M(67<W&06.ER]BHO$9@/W"PJ?0DDG&^9"1U%71SONXK`4Y>A:`^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<S5&$*;B,WNQ\/+MX?W5S
M.T8M#U#BT9I[\4A:/G'JHKN`L"OJ$T7Z@Q53T>\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"<S\;A`2K"&,,%ZU\HJ&*S;;15E^246
M-AC8N]9P9,-(-@`5_1J(=OOA#TM1L@!?@_7#OJ+%FGYRHAP=V*JJGIZF/TY.
M7'64'BZ9,,?G(5$*)8*0C$7VE$6ZI&'@XXV25R<I18#GQ-(@'QYA?Y:@+/=#
M0S.'ZH$NQU;.@F13!_6UXP[4KH/@MAF5A<;I[_OK<V#U*^6.2!R1KT/M(>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(;-B<Y+4;J^#](%4G,CNFQGS7Y..)Q>2AL0T*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)CXI<ZAUE9TK67':CON(#-#&[6]Z23/&6ZW'Z3F
MG/PY^YG<G_-<GK.E!]=3N&&.4J9I^S0JP^5WK?*7+F!#*WUJTS5[)!M[Y54H
MT\?+4N3^`H.*>GHZW':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%]#<B!3Q]U1]4]=^>@;EC,[3Q<NA&1.-!S0^HUP-#
MK`4.D4OE,4)@=J4_XAYR.0FE(A+3,*H),K8%]?Z1H-Y_)*BW+<C<%C3WXI?/
M_M:P\K8BK?[F?27QQ1%E<[0D2RXVB98M"?V:!+`,223ID[VC$;FVYF\Y=B4Y
MV")7ONMT4.`3'!*TQC3J=KN--5Z\F]672_FJE.]0=4-CVU!_T;"W;6A4X\MC
M%[3.EMPERO75S[.S3].[R_%T?#'--TDSVS0SM^(%9?0RP73\\[2ZUU:CY?N+
M/%/++0.*_"=02P$"%``4````"``GBR0BCBQ_B&$&``!<$```"@`````````!
I`"``````````4TA/5T-(05(N0U!+!08``````0`!`#@```")!@``````
`
end

M.6   Sega Vector (Converta) Games

M.6.1    Components

   Main Processor:   Z80 4Mhz
   Sound Processor:  8035

M.6.2    Memory Map

   0000 - 07ff    2k ROM on CPU board
   0800 - afff    48k ROM board
   c800 - cfff    2k RAM on CPU board
   d000 - dfff    downloadable RAM on sound board
   e000 - efff    4k Vector RAM

M.6.3    I/O Inputs

   cpu bd
   fc (374)

   fb (373)
   fa (372)
   f9 (371)
   f8 (370)

   xy control
   bf (277)
   be (276)
   bd (275)

   univ snd bd
   3f (077)

M.6.4    I/O Outputs

   cpu bd
   ------
   f9 (371)
   f8 (372)

   xy control
   ----------
   bf (277)
   be (276)
   bd (275)

   univ snd bd
   -----------
   3f (077)    bit 8 = reset 8035

M.6.5    Vector Processor

   The vector processor starts at vector ram adr 0

   Symbol Instructions (10 bytes / symbol)
   10 bits little-endian

   byte 1      <draw symbol, last symbol>    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      <draw/blank line, last line, color> 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@ <T+V[@MP7=!^NF.-0<U,'O*3[0:<&Z"C.758'
M*,Z95P<HSH.Z2#J*\VY]\L[>';+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+<W,@C71A'(Q(H"E-'"XIMI$>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#<K>I<:OGZBYD,SCGRJ";>;I&>4SRF>4SRB?43ZC?$;YC/+_ R46
MQ:885D5X@/];OPN?QWTV.2YR7\RDI[&(4BXAC555/.&36"Y!I[!K*S&N>4K5
M<X,%08-706.BZH@YR4WO$*"0&"0IBWPF_1*@_1",3<MQ<V,>"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>([<J^VWL"EQQ?$,WG&67] O*<R#D-DKXK1IIT[O:7BM&"(0@LYDX24ADYB
MK-6I0!:!\%B$=3N:A4VW%PZA-],M.IWVFOW'V*1-+]IST"M@KETFGJ7$QM N
M;5B1DUAS=",1%;!]!WY&Z(O@^%NC*H#]%LS7['#$',W9G*$T@:F*T5*!%L,J
MFD;(C<L9AT&7BZ6O;"969D/6QB/L;RQP-<8I2Q+N9[O"9D]Y)N\+TW?3V 2W
M58Q-Z[HP9M*WG;$NM46CZ24W(O7&8,LV6:!#>]: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&#6&U.;/#F6+*TJ%,
MT9B?QJ@FGP=L%J9'%;GH *XS%M,!D[ET'/M'-;$4E"MQ9Y1KV2/9!,4F8ZSU
MD=N="M<X5#UG0[<[4!Z<,6VI0+?F:#>XP<D:\](&$-W"J*-=5 ES23W.,2G9
MTN3F/C7B^BEOAR^#4?EO2Z^8N%:[.W>MSPS])O,4.O2BQ1WG;-_&V+1FBMBD
MM),'IRU)5*<0Z2"598>V<M";L<!P9$<[.Q2KK"RP;<GM[74OFABU/D]9^!GU
MTXS2GXIE!<;JHIF=T^AC&QT3'H*F:>$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;-N<UXE/*JUWW4M]M.; Z]?0.= IQ.@;
M_?4(W?]0=Q_FW6%%=QKP5G>LN@_:LN;"^2YKZ,<P3C^*!7^R@:[11*=((P:_
MJ2*38=VX:"V=[,S:]IQ'Y/D&(YTDS[$ZI<41LHVR_$"9TEB5VU L,RMTDC+,
MZW"A33S)>91MG*TS<Q"1Q]57)W!%F1Y3D7-72T%M3V$*3[1)KI9Z.L>G'LFN
M(3&DKW?*&)?Q#%>0R123557HFQ(K$R.Q&@<!<;_<(FS;L*##]0K'/Y0Q-FV/
MQM4+F]2[7-E2LC2_7I9 &,7]82_AY 3]CBC^A&[GK3FN3YB([M;?/U!VTS0:
M01*==A$G48Y+'1NG$M\#^\>/6+,ET+\8_-9_7_HPJOW?Z$<5?D8<BTC;K+E/
M(%.5!GJQ6;''FN^PJ@;Z\ 4+UUY7?0BA/R@TXY\H$RO;.Z4I'LY41KRN-5!P
M<?;]6/6KQX<2:8C)JQ=;?5G60M?\B\>!?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'5<O=0DCS0[0ZO*.Y:O,.M8GJB<8UG*
M.42 ,/B)YGB%F8FJ=11 #UO0L(4>MM##\,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<stdio.h>
   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| | | | | | | | | | | | | | | | | | |
+-----------------------------------------------------------------------------+

