pcjs/devices/pc8080/machine/invaders
Repository files (latest commit first)
Filename Latest commit message Latest commit date
2016-04-21 11:57:10 -07:00
..
machine.xml Fixed Node rendering of PC8080 pages (all one of them) 2016-04-21 09:50:03 -07:00
README.md 8080 README update 2016-04-21 11:57:10 -07:00

layout title permalink sitemap machines
page Space Invaders (Under Construction) /devices/pc8080/machine/invaders/ false
type id debugger
pc8080 invaders true

Space Invaders (Under Construction)

This is the first test of PC8080, a new 8080-based machine emulator being added to the PCjs Project. It's a work-in-progress, so there's not much to look at yet. And the goal is not to build yet-another Space Invaders/Arcade Machine emulator -- that's been done many times over -- but to start with a well-understood 8080-based machine architecture that doesn't need a lot of peripherals, and use it as the first test case for another CPU that we can add to the PCjs toolbox.

The idea is to make PC8080 sufficiently configurable so that it will work with a variety of 8080-based systems, including those with memory-mapped video displays (like Space Invaders), as well as simpler terminal-based systems, like the CP/M-based systems of old.

In fact, as soon as Space Invaders is working, my next adaptation will be a DEC VT100 terminal emulator (itself an 8080-based machine) which can then "wired up" to other PCjs machine simulations.

Assorted Space Invaders Hardware Notes are collected below.

{% include machine.html id="invaders" %}

Space Invaders Hardware Notes

From emutalk.net:

Space Invaders, (C) Taito 1978, Midway 1979

CPU: Intel 8080 @ 2MHz (CPU similar to the (newer) Zilog Z80)

Interrupts: $cf (RST 8) at the start of vblank, $d7 (RST $10) at the end of vblank.

Video: 256(x)*224(y) @ 60Hz, vertical monitor. Colours are simulated with a
plastic transparent overlay and a background picture.
Video hardware is very simple: 7168 bytes 1bpp bitmap (32 bytes per scanline).

Sound: SN76477 and samples.

Memory map:
        ROM
        $0000-$07ff:    invaders.h
        $0800-$0fff:    invaders.g
        $1000-$17ff:    invaders.f
        $1800-$1fff:    invaders.e

        RAM
        $2000-$23ff:    work RAM
        $2400-$3fff:    video RAM

        $4000-:         RAM mirror

Ports:
        Read 1
        BIT     0       coin (0 when active)
                1       P2 start button
                2       P1 start button
                3       ?
                4       P1 shoot button
                5       P1 joystick left
                6       P1 joystick right
                7       ?

        Read 2
        BIT     0,1     dipswitch number of lives (0:3,1:4,2:5,3:6)
                2       tilt 'button'
                3       dipswitch bonus life at 1:1000,0:1500
                4       P2 shoot button
                5       P2 joystick left
                6       P2 joystick right
                7       dipswitch coin info 1:off,0:on

        Read 3          shift register result

        Write 2         shift register result offset (bits 0,1,2)
        Write 3         sound related
        Write 4         fill shift register
        Write 5         sound related
        Write 6         strange 'debug' port? eg. it writes to this port when
                        it writes text to the screen (0=a,1=b,2=c, etc)

        (write ports 3,5,6 can be left unemulated, read port 1=$01 and 2=$00
        will make the game run, but but only in attract mode)

I haven't looked into sound details.

16 bit shift register:
        f              0        bit
        xxxxxxxxyyyyyyyy

        Writing to port 4 shifts x into y, and the new value into x, eg.
        $0000,
        write $aa -> $aa00,
        write $ff -> $ffaa,
        write $12 -> $12ff, ..

        Writing to port 2 (bits 0,1,2) sets the offset for the 8 bit result, eg.
        offset 0:
        rrrrrrrr                result=xxxxxxxx
        xxxxxxxxyyyyyyyy

        offset 2:
          rrrrrrrr      result=xxxxxxyy
        xxxxxxxxyyyyyyyy

        offset 7:
               rrrrrrrr result=xyyyyyyy
        xxxxxxxxyyyyyyyy

        Reading from port 3 returns said result.

Overlay dimensions (screen rotated 90 degrees anti-clockwise):
        ,_______________________________.
        |WHITE            ^             |
        |                32             |
        |                 v             |
        |-------------------------------|
        |RED              ^             |
        |                32             |
        |                 v             |
        |-------------------------------|
        |WHITE                          |
        |         < 224 >               |
        |                               |
        |                 ^             |
        |                120            |
        |                 v             |
        |                               |
        |                               |
        |                               |
        |-------------------------------|
        |GREEN                          |
        | ^                  ^          |
        |56        ^        56          |
        | v       72         v          |
        |____      v      ______________|
        |  ^  |          | ^            |
        |<16> |  < 118 > |16   < 122 >  |
        |  v  |          | v            |
        |WHITE|          |         WHITE|
        `-------------------------------'

        Way of out of proportion :P