Started work on the controller side of the CompuMate emulation.

git-svn-id: svn://svn.code.sf.net/p/stella/code/trunk@2411 8b62c5a3-ac7e-4cc8-8f21-d9a121418aba
This commit is contained in:
stephena 2012-03-12 23:33:50 +00:00
parent 02ad41e60a
commit 80c43f175d
2 changed files with 69 additions and 33 deletions

View File

@ -98,6 +98,11 @@ class System;
by two 20K resistors, then it goes through a hex inverting schmitt trigger to
square it up. This then runs into bit 7 of portA.
This code was heavily borrowed from z26, and uses conventions defined
there. Specifically, IOPortA is treated as a complete uInt8, whereas
the Stella core actually stores this information in boolean arrays
addressable by DigitalPin number.
@author Stephen Anthony & z26 team
@version $Id$
*/

View File

@ -25,46 +25,77 @@
#include "Event.hxx"
/**
The Spectravideo CompuMate SV010 was a home computer expansion for the
Atari VCS / 2600 video game system.
Cartridge class used for SpectraVideo CompuMate bankswitched games.
It consists of a membrane keyboard unit with interface connectors. These
connectors were placed in the module slot and both controller ports of the
Atari console. As the user could place the keyboard on the old style VCS
consoles, the two devices resulted in one compact unit. When using with the
2600jr console, resulted in a desktop computer look with separated keyboard.
This is more than just a cartridge mapper - it's also a "computer" add-on.
There's two 8K EPROMs soldered on top of each other. There's two short
wires with DB-9's on them which you plug into the two controller ports.
A 42 or so key membrane keyboard with audio in and audio out, and 2K of RAM.
The CompuMate was equipped with an audio jack for use with a standard tape
connector as a possibility of permanent data storage.
There are 4 4K banks selectable at $1000 - $1FFF, and 2K RAM at
$1800 - $1FFF (R/W 'line' is available at SWCHA D5, so there's no separate
read and write ports).
Bankswitching is done though the controller ports
INPT0: D7 = CTRL key input (0 on startup / 1 = key pressed)
INPT1: D7 = always HIGH input (tested at startup)
INPT2: D7 = always HIGH input (tested at startup)
INPT3: D7 = SHIFT key input (0 on startup / 1 = key pressed)
INPT4: D7 = keyboard row 1 input (0 = key pressed)
INPT5: D7 = keyboard row 3 input (0 = key pressed)
SWCHA: D7 = tape recorder I/O ?
D6 = 1 -> increase key collumn (0 to 9)
D5 = 1 -> reset key collumn to 0 (if D4 = 0)
D5 = 0 -> enable RAM writing (if D4 = 1)
D4 = 1 -> map 2K of RAM at $1800 - $1fff
D3 = keyboard row 4 input (0 = key pressed)
D2 = keyboard row 2 input (0 = key pressed)
SWCHA: D7 = Audio input from tape player
D6 = Audio out to tape player and 4017 CLK
1 -> increase key column (0 to 9)
D5 = 4017 RST, and RAM direction. (high = write, low = read)
1 -> reset key column to 0 (if D4 = 0)
0 -> enable RAM writing (if D4 = 1)
D4 = RAM enable: 1 = disable RAM, 0 = enable RAM
D3 = keyboard row 1 input (0 = key pressed)
D2 = keyboard row 1 input (0 = key pressed)
D1 = bank select high bit
D0 = bank select low bit
Keyboard column numbering:
column 0 = 7 U J M
column 1 = 6 Y H N
column 2 = 8 I K ,
column 3 = 2 W S X
column 4 = 3 E D C
column 5 = 0 P ENTER SPACE
column 6 = 9 O L .
column 7 = 5 T G B
column 8 = 1 Q A Z
column 9 = 4 R F V
INPT0: D7 = CTRL key input (0 on startup / 1 = key pressed)
INPT1: D7 = always HIGH input (pulled high thru 20K resistor)
INPT2: D7 = always HIGH input (pulled high thru 20K resistor)
INPT3: D7 = SHIFT key input (0 on startup / 1 = key pressed)
INPT4: D7 = keyboard row 0 input (0 = key pressed)
INPT5: D7 = keyboard row 2 input (0 = key pressed)
The keyboard's composed of a 4017 1 of 10 counter, driving the 10 columns of
the keyboard. It has 4 rows. The 4 row outputs are buffered by inverters.
Bit 5 of portA controls the reset line on the 4017. Pulling it high will reset
scanning to column 0. Pulling it low will allow the counter to be clocked.
Bit 6 of portA clocks the 4017. Each rising edge advances the column one
count.
There's 10 columns labelled 0-9, and 4 rows, labelled 0-3.
Column
0 1 2 3 4 5 6 7 8 9
+---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+
| 7 | | 6 | | 8 | | 2 | | 3 | | 0 | | 9 | | 5 | | 1 | | 4 | 0
+---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+
+---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+
| U | | Y | | I | | W | | E | | P | | O | | T | | Q | | R | 1
+---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+ Row
+---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+
| J | | H | | K | | S | | D | |ent| | L | | G | | A | | F | 2
+---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+
+---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+
| M | | N | | < | | X | | C | |spc| | > | | B | | Z | | V | 3
+---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+
Function and Shift are separate keys that are read by 2 of the paddle inputs.
These two buttons pull the specific paddle input low when pressed.
Because the inputs are inverted, a low indicates a pressed button, and a high
is an unpressed one.
The audio input/output are designed to drive a tape player. The audio output is
buffered through an inverter and 2 resistors and a capacitor to reduce the level
to feed it into the tape player.
The audio input is passed through a .1uf capacitor and is pulled to 1/2 supply
by two 20K resistors, then it goes through a hex inverting schmitt trigger to
square it up. This then runs into bit 7 of portA.
This code was heavily borrowed from z26, and uses conventions defined
there. Specifically, IOPortA is treated as a complete uInt8, whereas