Amigan Software
Signetics-based Machines Coding/Gaming Guide
This document was written on 29/8/08, and last updated on 2/6/25,
by James Jacobs of Amigan Software.
Information herein is believed to be generally accurate, though some is
tentative. If you have anything to contribute, please
email us.
This page is part of Emerson Arcadia 2001 Central. Emulators, ROMs, manuals and other resources can be found there.
Emerson Arcadia 2001
├ Paddles
├ Graphics
├ Sound
├ Timing
├ Compiler 2001
├ Compatibility Notes
└ Gaming Guide
Interton VC 4000
├ Coding Guide
└ Gaming Guide
Elektor TV Games Computer
├ Coding Guide
└ Gaming Guide
PIPBUG/BINBUG-based machines
├ Teletype I/O
├ Cassette I/O
├ Papertape I/O
├ Printer I/O
├ Unarchived Software
├ Timeshare Software
├ BINBUG Hardware
├ BINBUG BIOS
├ Floppy Disk I/O
└ Game Help
Signetics Instructor 50
├ I/O Devices
├ USE BIOS
└ Game Help
Signetics TWIN
└ I/O Ports
Central Data 2650
├ Supervisor BIOS
├ Unarchived Software
└ Game Help
PHUNSY
├ Mini-PHUNSY
└ Game Help
Ravensburger Selbstbaucomputer
├ Monitor BIOS
└ Game Help
MIKIT 2650
└ Game Help
Coin-ops
├ Malzak
├ Astro Wars & Galaxia
├ Laser Battle & Lazarian
├ Zaccaria Pinball for Android
├ Zaccaria Pinball for Switch
└ Zaccaria Pinball for Windows
Multiplatform
├ Comparative Tables
├ 2650 CPU
├ Project Numbers
├ Component Numbers
├ Programming Languages Overview
├ File Formats Overview
└ Signetics AOF (Absolute Object Format)
Emerson Arcadia 2001
Region | Size | Emerson Arcadia 2001 | Tele-Fever | Palladium | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$0000..$0FFF | 4K | cartridge ROM | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$1000..$10FF | 256 bytes | mirror of $1800..$18FF | CPU RAM | cartridge ROM | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$1100..$11FF | 256 bytes | mirror of $1900..$19FF | cartridge ROM | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$1200..$12FF | 256 bytes | mirror of $1A00..$1AFF | CPU RAM | cartridge ROM | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$1300..$13FF | 256 bytes | mirror of $1B00..$1BFF | cartridge ROM | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$1400..$17FF | 1K | mirror of $1000..$13FF | cartridge ROM | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$1800..$1AFF | 768 bytes | CPU+UVI RAM:
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$1B00..$1BFF | 256 bytes | mirror of $1900..$19FF | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$1C00..$1FFF | 1K | mirror of $1800..$1BFF | cartridge ROM | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$2000..$2FFF | 4K | cartridge ROM | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$3000..$3FFF | 4K | mirror of $1000..$1FFF | cartridge ROM | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$4000..$4FFF | 4K | mirror of $0000..$0FFF? | cartridge ROM | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$5000..$5FFF | 4K | mirror of $1000..$1FFF | cartridge ROM | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$6000..$6FFF | 4K | mirror of $0000..$0FFF? | cartridge ROM | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
$7000..$7FFF | 4K | mirror of $1000..$1FFF | cartridge ROM |
The architecture of the system is quite straightforward. A Signetics 2650 or 2650A CPU runs the programs and a Signetics 2637 UVI handles input and output. There are a pair of 2114 RAM chips. (There are also a few "glue" chips but these are irrelevant to programming (or emulating) the system.)
The ROM (game cartridge) is mapped to memory as already described. Execution starts from address $0000. (The CPU branches to address $0003 if an interrupt is generated at any time.) Addresses $1800..$1AFF are mapped to the UVI, I/O hardware and/or RAM. The game is not copied to RAM; it is instead run directly from ROM.
The chips may be in any state after a reset, and thus their contents should be cleared to known values at the start of the program to ensure proper operation.
The display is drawn by the UVI 60 times per second (for NTSC). The display is character-based (each character measuring 8*8 pixels), with programmable vertical and horizontal offsets. A choice of two resolutions (128*104 pixels or 16*13 characters, and 128*208 pixels or 16*26 characters) is available. The display is character-mapped, and thus does not need to be generated on the fly. There are 8 colours in the palette: black, white, red, green, blue, yellow, cyan and purple.
There are 56 characters stored in ROM, and 4 which are stored in RAM (and thus user-definable). Lowercase letters and most punctuation marks are not available. There is also a set of 64 "block graphics" characters which can be effectively "swapped in". Each character is displayed in a foreground and background colour. In mode 0 ("normal mode"), there are 4 foreground colours and 1 background colour available. In mode 1 ("board mode"), there are 2 foreground colours and 2 background colours available.
There are also four user-definable single-colour 8*8 sprites which can be freely positioned independently of the character display. The four sprite image definitions can also be used as user-defined graphics, just as with the four "true" user-defined graphics.
There are three buttons on the master console which can be detected by software. There are also twelve or more distinct buttons on each of the two controllers. Each controller also has a paddle, which can be digital or analogue.
There are two sound channels: a square wave channel (with 128 different frequencies possible), and a white noise channel (with 128 different modulations possible). There are 8 volume levels available.
Games are synchronized with the raster beam, as is usual for most systems. Many of the UVI registers can only be read or written at certain points in the frame. The vertical retrace status is available in the Sense pin of the CPU. (The Flag pin of the CPU can be used to invert the colours of all or part of the display.) All other UVI data is mapped to memory locations; specialized I/O commands are not used. The current character row being drawn by the UVI is available as a UVI register (mapped to a memory location). The current raster line being drawn by the UVI is not available but can of course be deduced by cycle counting. Horizontal retrace status is not available (but would deducable if bus DMA contention timings were known).
Arcadia-family BINs are stored and loaded as follows:
ROM Size | On disk | In memory | ORG | ||
4K | $0000..$0FFF | 1st 4K chunk | $0000..$0FFF | 1st half of 1st page | $0000 |
8K | $1000..$1FFF | 2nd 4K chunk | $2000..$2FFF | 1st half of 2nd page | $0000 |
12K | $2000..$0FFF | 3rd 4K chunk | $4000..$4FFF | 1st half of 3rd page | $0000 |
16K | $3000..$0FFF | 4th 4K chunk | $6000..$6FFF | 1st half of 4th page | $0000 |
20K | $4000..$0FFF | 5th 4K chunk | $3000..$3FFF | 2nd half of 2nd page | $1000 |
24K | $5000..$0FFF | 6th 4K chunk | $5000..$5FFF | 2nd half of 3rd page | $1000 |
28K | $6000..$0FFF | 7th 4K chunk | $7000..$7FFF | 2nd half of 4th page | $1000 |
30K | $7000..$77FF | 2K chunk | $1000..$17FF | 3rd quarter of 1st page | $1000 |
31K | $7800..$7BFF | 1K chunk | $1C00..$1FFF | 8th eighth of 1st page | $1C00 |
Since no cartridges larger than 12K are known, this is somewhat
arbitrary beyond 12K and definitely arbitrary beyond 16K.
Although Palladium supports up to 31K ROMs (presumably),
Emerson and probably Tele-Fever support only up to 8K ROMs.
Cartridge RAM is not possible on any of these machines.
It is not possible to load from a cartridge into the
7th eighth of the 1st page ($1800..$1BFF); thus 32K ROMs are not possible.
Valid programs have certain startup requirements. Omitting these will not
cause problems on most emulators but will cause problems on the genuine
console. The machine at startup cannot be assumed to be in a known state;
you should explicitly initialize it. A soft reset does not reinitialize
the contents and status of the UVI, RAM, or even the CPU.
The fourth byte (ie. byte 3) should be $17, which is a RETC,UN
instruction. You should use bytes 0..2 to jump past that byte. You would
then typically clear then set the PSU and PSL, then wait, then clear
memory.
Your code can begin immediately following this code, at byte $20 (32).
Of course, some programs use a zero page jump table, so will have this
routine stored elsewhere.
Corrections to some common misconceptions about these machines:
There are 8 colours in the palette, not 9.
There is a clock of 3,579,545Hz at the 2621 USG (pin 12 clock). At pin
11 (PCK) there is a 3,579,545Hz clock which is connected to the 2637
UVI. At pin 10 (CK4) the 2650 is connected with a frequency of
894,886.25Hz, because the output divides the input frequency by 4.
The frequency measured at the input pin of the 2650 is still the
same.
Therefore, the effective speed is approx. 0.89MHz (approx. 3.58MHz
4), the same as the Interton VC 4000 has.
RAM is 1K (but Emerson-type has access to only half of this), not 28K.
"The Arcadia's makers didn't hook up the highest address line on
their pair of 2114 RAM chips; so what should be 1K of RAM is only
½K of RAM." - Ward Shrake.
Even Tele-Fever and Palladium don't appear to have any way to access more than 768 bytes
(the last 256 bytes should be mapped to $1B00..$1BFF but is not, and is thus wasted).
The are two sound channels (one tone and one noise), not one.
The "White MPT-03": there is no such system. This misconception
arises from erroneous stickers affixed to some MPT-03 games, saying: "For use
White Intelligent Game MPT-03". The intended meaning is "For use with Intelligent Game MPT-03".
Paddles
"The potentiometers [ie. P1PADDLE and P2PADDLE] read from $00 to $FE, and going to $FF when VRESET is low. I would assume the other Arcadia titles check to see if the potentiometer is [much] higher than $80 rather than simply looking for a value of $FF which doesn't happen on the real machine."
There are two paddles available. At any given moment they will either both contain X-coordinates or they will both contain Y-coordinates. Bit 6 of BGCOLOUR controls the paddle interpolation for both paddles. If this bit is 0, the Y-coordinates are available for reading. If it is 1, the X- coordinates are available. It seems that read the coordinates and then you set bit 6 of BGCOLOUR for which axis you want to read *next* frame. If you are only interested in one axis there is no need to flip the bit every frame, of course. You can only read the coordinates during vertical blank; reading them while the screen is being drawn will always give $FF.
Also, the Emerson and Schmid (at least) have ports to connect up to two additional hand controllers. The MPT-03 (at least) does not. No known games seem to support these. The hardware in question (unpluggable hand controllers) does not seem to have ever been officially produced, though it would presumably be trivial to develop such hardware, or to modify a "non-unpluggable" hand controller (by cutting the cable and adding a plug) for the purpose. The memory addresses at which these hand controllers would appear is not known (most likely somewhere in the $1909..$190F and/ or $19C0..$19F7 regions). Support for these hand controllers could be added to the emulators if the addresses were known.
The ranges used by each game for each direction are somewhat different. The values returned by the paddles are in fact different on each individual machine, and probably somewhat different for each individual hand controller. A value of $66 or $6A for a centred paddle appears most common.
Game | Left/Up | Centred | Right/Down |
Alien Invaders | $00..$35 | $36..$7D | $7E..$FE |
Circus | $00..$3A | $3B..$93 | $94..$FE |
Hobo | $00..$37 | $38..$98 | $99..$FE |
Space Squadron | $00..$2F | $30..$A8 | $A9..$FE |
Only rough values are used in the table below:
X Y Paddle is being pushed
------------------------------------
$00 $00 up and left
$70 $00 up +---------+---------+---------+
$FE $00 up and right | 0,0 | $70,0 | $FE,0 |
$00 $70 left +---------+---------+---------+
$70 $70 centred | 0,$70 | $70,$70 | $FE,$70 |
$FE $70 right +---------+---------+---------+
$00 $FE down and left | 0,$FE | $70,$FE | $FE,$FE |
$70 $FE down +---------+---------+---------+
$FE $FE down and right
Note that these are read-once registers: they can only be read (once) during vblank, and can never be written.
$19FE: P2PADDLE: Right paddle status (8 bits) (read-once)
$19FF: P1PADDLE: Left paddle status (8 bits) (read-once)
During VRST, returns $00..$FE
When mux=0: about $00=up, about $70=middle, about $f1=down
When mux=1: about $07=left, about $70=middle, about $f1=right
While not in VRST, returns $FF
Graphics
3-bit colour codes (eg. as used for background and sprite colours) are as follows (referred to as "standard format" hereafter):
GRB | With Flag off | With Flag on |
%000 | White | Black |
%001 | Yellow | Blue |
%010 | Cyan | Red |
%011 | Green | Purple (magenta) |
%100 | Purple (magenta) | Green |
%101 | Red | Cyan |
%110 | Blue | Yellow |
%111 | Black | White |
Other colours are not available but can of course be simulated by dithering or multiplexing across multiple pixels or frames, eg.:
black | + white | = grey | |
red | + white | = pink | |
red | + yellow | = orange | |
black | + yellow | = dark yellow | |
black | + yellow | + red | = brown |
Colour artefacting also occurs on the real machine (even in PAL).
This is especially noticeable for eg. Robot Killer walls and
Parashooter player sprite.
There are two colour modes, selected by the high bit (bit 7) of PITCH ($18FD). Mode 0 allows four character colours over one background colour. Mode 1 ("board mode") allows two character colours over two background colours.
In mode 0 (non-board mode):
bits 5..4 of BGCOLOUR are unused.
bit 3 of BGCOLOUR chooses foreground colour set (see table below).
bits 0..2 of BGCOLOUR are background colour (in standard format).
bits 5..0 of GFXMODE are unused.
In this mode, foreground colours are:
Screen contents (with Flag off) | Screen contents (with Flag on) | |||||||
$00..$3F | $40..$7F | $80..$BF | $C0..$FF | $00..$3F | $40..$7F | $80..$BF | $C0..$FF | |
BGCOLOUR of %x,x,xx0,xxx | White | Cyan | Purple | Blue | Black | Red | Green | Yellow |
BGCOLOUR of %x,x,xx1,xxx | Yellow | Green | Red | Black | Blue | Purple | Cyan | White |
In mode 1 (board mode):
bits 5..3 of BGCOLOUR are 2nd foreground colour (in standard format).
bits 0..2 of BGCOLOUR are outer background colour (in standard format).
bits 5..3 of GFXMODE are 1st foreground colour (in standard format).
bits 0..2 of GFXMODE are inner background colour (in standard format).
In this mode, foreground and background colours are:
Screen contents of | ||||
$00..$3F | $40..$7F | $80..$BF | $C0..$FF | |
Foreground colour | 1st | 2nd | 1st | 2nd |
Background colour | Inner | Outer |
In this mode, the screen is filled with the inner background colour, but is surrounded by a border filled with the outer background colour (although of course if the inner and outer background colours are the same the border will not be apparent). The two background and two foreground colours can all be chosen and used freely. Bit 7 of each character specify whether to use the inner (%0) or outer (%1) background colour for the background (off bits in the image definition). Bit 6 of each character specify whether to use the 1st (%0) or 2nd (%1) foreground colour for the foreground (on bits in the image definition).
Block graphics mode can be set by a $C0 at the start of a line, and terminated by a $40 at the start of a line, or controlled by the high bit (bit 7) of GFXMODE ($19F8). The format is:
22211100
22211100
22211100
22211100
55544433
55544433
55544433
55544433
where each digit is the bit position corresponding with that pixel. Bits 7..6 are the colour, as normal. Examples:
%xx000001 %xx000010 %xx000011 %xx000100 %xx000101 %xx000110
......## ...###.. ...##### ###..... ###...## ######..
......## ...###.. ...##### ###..... ###...## ######..
......## ...###.. ...##### ###..... ###...## ######..
......## ...###.. ...##### ###..... ###...## ######..
........ ........ ........ ........ ........ ........
........ ........ ........ ........ ........ ........
........ ........ ........ ........ ........ ........
........ ........ ........ ........ ........ ........
Character vs. block mode, and mode 0 vs. mode 1, are separate issues, and
thus the modes can be freely combined.
If you want low-res mode, you should set:
GFXMODE as %x,0,xxx,xxx
and BGCOLOUR as %0,x,xxx,xxx
If you want hi-res mode, you should set:
GFXMODE as %x,1,xxx,xxx
and BGCOLOUR as %1,x,xxx,xxx
Although it is possible to set them independently, it is generally pointless. The exception would be if you wanted low-resolution mode but did want the $1A00..$1ACF region drawn, and were using VSCROLL to vertically scroll the screen to reveal that area.
VSCROLL ($18FC) is "the complement of the number of lines from the
trailing edge of vertical drive to start character display". In other
words, you use this register to vertically scroll the entire display. All
8 bits of the register are used for this. Higher values indicate
positions towards the top of the screen, lower values indicate positions
towards the bottom of the screen (as for sprites).
$FF pushes the display to the top of the screen.
$ED seems to be used by most games.
$DF is the lowest which will show the entire display under MESS V2.
CHARLINE ($18FF) is a read-only hardware register.
Bits 7..4 are apparently unused? (these bits are always set?)
Bits 3..0 indicate the current character line (row) being rendered:
0..12 = which line
13 ($D) = end of DMA (ie. start of vertical blank)
14 ($E) = unused?
15 ($F) = beginning of DMA (ie. end of vertical blank)
Note that BGCOLOUR appears to be latched during the entire $F0..$FC
CHARLINE period; writes to it (to eg. change the background colour) do
not take immediate effect. (However, you can switch black/white (eg.
3D Bowling), red/cyan, green/purple (eg.
Ocean Battle) or blue/yellow (eg.
Dr. Slump,
Horse Racing,
Pleiades)
at any time by toggling the flag pin.)
Therefore, blue water with black road in
Frogger is not actually possible.
The horizontal resolution is 128 pixels; 16 tiles per row. The vertical resolution is either 104 (13 tiles per column) or 208 (26 tiles per column) pixels tall, Each tile is 8x8 in size. Graphics are character- based (ie. tile-based), not bitmapped. The screen is organized as a 16*13 or 16*26 grid of tiles, one byte per tile. There are also four freely positionable monochrome sprites. You can offset the display horizontally on a per-row (8 rasters) basis and vertically on a per-frame basis.
The "upper screen" is stored from $1800..$18CF; the top row is $1800.. $1810, the 2nd row is $1810..$181F, etc., to the 13th row from $18C0.. $18CF. In low-resolution mode this is all that is used. However, in high- resolution mode, the 13 rows of the "lower screen", stored from $1A00.. $1ACF, are also shown. These 208 "lower screen" bytes are available for use as extra RAM in low-resolution mode.
There are 64 characters In the character set. In non-block mode, these consist of 56 PDGs and 8 UDGs:
Decimal | Hex | Description |
0 | $00 | built-in empty space (' ') |
1..2 | $01..$02 | built-in diagonal lines ('/', '\') |
3 | $03 | built-in solid ('■') |
4..7 | $04..$07 | built-in side lines |
8..11 | $08..$0B | built-in corners ('┐', '┌', '└', '┘') |
12..15 | $0C..$0F | built-in right-angled triangles ('◢', '◣', '◤', '◥') |
16..25 | $10..$19 | built-in numbers 0..9 |
26..51 | $1A..$33 | built-in uppercase letters A..Z |
52..55 | $34..$37 | built-in punctuation ('.', ',', '+', '$') |
56..59 | $38..$3B | sprites #0..#3 |
60..63 | $3C..$3F | user defined graphics #0..#3 |
$0123456789ABCDEF
-----------------
$00: /\#il_jwqasrtgf $00 : space
$10: 0123456789ABCDEF $01-$0F : graphics characters
$20: GHIJKLMNOPQRSTUV $38-$3B (zxcv): sprites 0-3
$30: WXYZ.,+$zxcvbnmh $3C-$3F (bnmh): user defined graphics 0-3
$00 ( ): ........ $01 (/): .......# $02 (\): #....... $03 (#): ########
........ ......#. .#...... ########
........ .....#.. ..#..... ########
........ ....#... ...#.... ########
........ ...#.... ....#... ########
........ ..#..... .....#.. ########
........ .#...... ......#. ########
........ #....... .......# ########
$04 (i): ######## $05 (l): ......## $06 (_): ........ $07 (j): ##......
######## ......## ........ ##......
........ ......## ........ ##......
........ ......## ........ ##......
........ ......## ........ ##......
........ ......## ........ ##......
........ ......## ######## ##......
........ ......## ######## ##......
$08 (w): ######## $09 (q): ######## $0A (a): ##...... $0B (s): ......##
######## ######## ##...... ......##
......## ##...... ##...... ......##
......## ##...... ##...... ......##
......## ##...... ##...... ......##
......## ##...... ##...... ......##
......## ##...... ######## ########
......## ##...... ######## ########
$0C (r): .......# $0D (t): #....... $0E (g): ######## $0F (f): ########
......## ##...... #######. .#######
.....### ###..... ######.. ..######
....#### ####.... #####... ...#####
...##### #####... ####.... ....####
..###### ######.. ###..... .....###
.####### #######. ##...... ......##
######## ######## #....... .......#
These occupy the low 6 bits (bits 5..0) of the byte. The upper 2 bits (bits 7..6) are used for the foreground colour, as previously described. Block mode is no different, except that a different set of image definitions is used (as previously described), and these occupy all characters 0..63; therefore sprite and UDG imagery cannot be used in block mode.
Strictly speaking there are eight UDGs (User Defined Graphics),
but the first four of them always have the same imagery as the four sprites.
The sprite UDGs (imagery at $1980..$199F) are characters
$38..$3B/$78..$7B/$B8..$BB/$F8..$FB.
The sprite colours, as stored in SPRnnCTRL, have no influence
on the colours of these when used as UDGs (only when used as actual
sprites); the colours used will be determined in the same
way as for any other tile.
The four dedicated UDGs (imagery $19A0..$19BF)
are characters $3C..$3F/$7C..$7F/$BC..$BF/$FC..$FF,
and are not usable as sprites.
Most consoles implement the Flag line (bit 7 of the PSU): while this is set, all colours are inverted. This even applies to sprites. The Tempest MPT-03 (and presumably all other MPT-03s) and Australian Emerson Arcadia 2001, for example, definitely do implement this. However, some consoles, such as the American Emerson Arcadia 2001, do not implement this and therefore the colours will never be inverted on such machines.
The Sense pin (bit 6 of the PSU) is read-only. It is set (to 1) as described elsewhere, to signify that the vertical retrace interval has begun, and cleared (to 0) to signify that the interval has ended.
Only 84 bytes are assigned for use exclusively as user RAM. There is a 32- byte block from $18D0..$18EF, a 4-byte block from $18F8..$18FB, and a 48- byte block from $1AD0..$1AFF. However, as the screen memory can be read and written to it is also possible to use that for storage; eg. in low- resolution the lower screen memory at $1A00..$1ACF will not be displayed and there is no reason in that case not to use it as 208 bytes of extra RAM, increasing the total available to 292 bytes.
There are 4 sprites, each measuring 8*8 pixels. Their colours and position are independent of the underlying character display. Similar to the way the character display can be vertically "squashed" or "stretched" with bit 7 of BGCOLOUR, each sprite can be vertically "squashed" or "stretched" independently of the character display and the other sprites (using bit 7 or 6 of SPRITESnnCTRL).
The foreground colour (1 bits in the image definition) of a sprite is chosen with bits 5..3 or 2..0 of SPRITESnnCTRL; all of the 8 colours are available. The background of a sprite (0 bits in the image definition) is transparent and thus never drawn (and not collision-checked either).
The coordinates of each sprite are relative to the bottom-left corner of the screen. That is to say, lower Y-coordinates are near the bottom of the screen, and higher Y-coordinates are near the top of the screen. Lower X- coordinates are near the left of the screen, and higher X-coordinates are near the right of the screen.
$18F0: SPRITE0Y
$18F1: SPRITE0X
$18F2: SPRITE1Y
$18F3: SPRITE1X
$18F4: SPRITE2Y
$18F5: SPRITE2X
$18F6: SPRITE3Y
$18F7: SPRITE3X (all read/write)
The horizontal and vertical coordinates of the four sprites will be
accessed by the UVI at DMA 15.
$18FC: VSCROLL (read/write)
The vertical offset will be accessed by the UVI at DMA 15.
$18FF: CHARLINE: Row status - last DMA number (4 bits) (read-only)
The status can be accessed anytime in the field when the microprocessor is not paused.
The sequence in 13-row mode is (from start to end of frame):
$FF, $F0, $F1, $F2, $F3, $F4, $F5, $F6, $F7, $F8, $F9, $FA, $FB, $FC, $FD, $FF
The sequence in 26-row mode is (from start to end of frame):
$FF, $F0, $F1, $F2, $F3, $F4, $F5, $F6, $F7, $F8, $F9, $FA, $FB, $FC, $F0, $F1, $F2, $F3, $F4, $F5, $F6, $F7, $F8, $F9, $FA, $FB, $FC, $FD, $FF
$19FA: SPRITES23CTRL (8 bits) (write-only)
Bit 7 : sprite #2 height (0=tall, 1=short)
Bit 6 : sprite #3 height (0=tall, 1=short)
Bits 5..3: sprite #2 colours
Bits 2..0: sprite #3 colours
$19FB: SPRITES01CTRL (8 bits) (write-only)
Bit 7 : sprite #0 height (0=tall, 1=short)
Bit 6 : sprite #1 height (0=tall, 1=short)
Bits 5..3: sprite #0 colours
Bits 2..0: sprite #1 colours
$19FC: BGCOLLIDE: Sprite collision with characters (4 bits) (read-once)
Bits 7..4: always %1111
Bit 3: sprite #3 collision with any character (%0=hit, %1=miss)
Bit 2: sprite #2 collision with any character (%0=hit, %1=miss)
Bit 1: sprite #1 collision with any character (%0=hit, %1=miss)
Bit 0: sprite #0 collision with any character (%0=hit, %1=miss)
It should be read during the vertical reset period.
The bits are reset (to 0) on collision and set (to 1) by reading or the trailing edge of VRST.
Each bit is set to 1 when the AND of the appropriate sprite and
background videos is high. Each bit is reset to 0 when accessed or at
the end of the vertical blanking period.
Waiting until CHARLINE is $FD or $FF does not seem to work reliably on
the real machine. It seems necessary to wait for the Sense bit (like
eg. Combat does).
$19FD: SPRITECOLLIDE: Inter-sprite collision (6 bits) (read-once)
Bits 7..6: always %11
Bit 5: sprites #2/#3 collision (%0=hit, %1=miss)
Bit 4: sprites #1/#3 collision (%0=hit, %1=miss)
Bit 3: sprites #1/#2 collision (%0=hit, %1=miss)
Bit 2: sprites #0/#3 collision (%0=hit, %1=miss)
Bit 1: sprites #0/#2 collision (%0=hit, %1=miss)
Bit 0: sprites #0/#1 collision (%0=hit, %1=miss)
It should be read during the vertical reset period.
The bits are reset (to 0) on collision and set (to 1) by reading or the trailing edge of VRST.
Each bit is set to 0 when the AND of the appropriate two sprite
videos is high. Each bit is reset to 1 when accessed or at the end of
the vertical blanking period.
Sound
Here are the optimal PITCH register values for harmonic melodies, in hexadecimal and decimal notations:
Note | Ideal Freq. | PITCH | Actual Freq. |
- | $7F (127) | 61.52 Hz | |
- | $7E (126) | 62.00 Hz | |
- | $7D (125) | 62.49 Hz | |
B1 | 61.73 Hz | $7C (124) | 62.99 Hz |
- | $7B (123) | 63.50 Hz | |
- | $7A (122) | 64.02 Hz | |
- | $79 (121) | 64.54 Hz | |
- | $78 (120) | 65.07 Hz | |
C2 | 65.40 Hz | $77 (119) | 65.62 Hz |
- | $76 (118) | 66.17 Hz | |
- | $75 (117) | 66.73 Hz | |
- | $74 (116) | 67.30 Hz | |
- | $73 (115) | 67.88 Hz | |
- | $72 (114) | 68.47 Hz | |
- | $71 (113) | 69.07 Hz | |
C#2/D♭2 | 69.29 Hz | $70 (112) | 69.68 Hz |
- | $6F (111) | 70.30 Hz | |
- | $6E (110) | 70.94 Hz | |
- | $6D (109) | 71.58 Hz | |
- | $6C (108) | 72.24 Hz | |
D2 | 73.41 Hz | $6B (107) | 72.91 Hz |
- | $6A (106) | 73.59 Hz | |
- | $69 (105) | 74.28 Hz | |
- | $68 (104) | 74.99 Hz | |
- | $67 (103) | 75.71 Hz | |
- | $66 (102) | 76.45 Hz | |
- | $65 (101) | 77.20 Hz | |
D#2/E♭2 | 77.78 Hz | $64 (100) | 77.96 Hz |
- | $63 ( 99) | 78.74 Hz | |
- | $62 ( 98) | 79.54 Hz | |
- | $61 ( 97) | 80.35 Hz | |
- | $60 ( 96) | 81.18 Hz | |
E2 | 82.40 Hz | $5F ( 95) | 82.02 Hz |
- | $5E ( 94) | 82.88 Hz | |
- | $5D ( 93) | 83.77 Hz | |
- | $5C ( 92) | 84.67 Hz | |
- | $5B ( 91) | 85.59 Hz | |
- | $5A ( 90) | 86.53 Hz | |
F2 | $59 ( 89) | 87.49 Hz | 87.30 Hz |
- | $58 ( 88) | 88.47 Hz | |
- | $57 ( 87) | 89.48 Hz | |
- | $56 ( 86) | 90.51 Hz | |
- | $55 ( 85) | 91.56 Hz | |
F#2/G♭2 | 92.49 Hz | $54 ( 84) | 92.64 Hz |
- | $53 ( 83) | 93.74 Hz | |
- | $52 ( 82) | 94.87 Hz | |
- | $51 ( 81) | 96.02 Hz | |
- | $50 ( 80) | 97.21 Hz | |
G2 | 98.00 Hz | $4F ( 79) | 98.42 Hz |
- | $4E ( 78) | 99.67 Hz | |
- | $4D ( 77) | 100.95 Hz | |
- | $4C ( 76) | 102.26 Hz | |
G#2/A♭2 | 103.82 Hz | $4B ( 75) | 103.61 Hz |
- | $4A ( 74) | 104.99 Hz | |
- | $49 ( 73) | 106.41 Hz | |
- | $48 ( 72) | 107.86 Hz | |
- | $47 ( 71) | 109.36 Hz | |
A2 | 110.00 Hz | $46 ( 70) | 110.90 Hz |
- | $45 ( 69) | 112.49 Hz | |
- | $44 ( 68) | 114.12 Hz | |
- | $43 ( 67) | 115.79 Hz | |
A#2/B♭2 | 116.54 Hz | $42 ( 66) | 117.52 Hz |
- | $41 ( 65) | 119.30 Hz | |
- | $40 ( 64) | 121.14 Hz | |
B2 | 123.47 Hz | $3F ( 63) | 123.03 Hz |
- | $3E ( 62) | 124.98 Hz | |
- | $3D ( 61) | 127.00 Hz | |
- | $3C ( 60) | 129.08 Hz | |
C3 | 130.81 Hz | $3B ( 59) | 131.23 Hz |
- | $3A ( 58) | 133.46 Hz | |
- | $39 ( 57) | 135.76 Hz | |
C#3/D♭2 | 138.59 Hz | $38 ( 56) | 138.14 Hz |
- | $37 ( 55) | 140.61 Hz | |
- | $36 ( 54) | 143.16 Hz | |
D3 | 146.83 Hz | $35 ( 53) | 145.81 Hz |
- | $34 ( 52) | 148.57 Hz | |
- | $33 ( 51) | 151.42 Hz | |
- | $32 ( 50) | 154.39 Hz | |
D#3/E♭2 | 155.56 Hz | $31 ( 49) | 157.48 Hz |
- | $30 ( 48) | 160.69 Hz | |
E3 | 164.81 Hz | $2F ( 47) | 164.04 Hz |
- | $2E ( 46) | 167.53 Hz | |
- | $2D ( 45) | 171.17 Hz | |
F3 | 174.61 Hz | $2C ( 44) | 174.98 Hz |
- | $2B ( 43) | 178.95 Hz | |
F#3/G♭3 | 184.99 Hz | $2A ( 42) | 183.12 Hz |
- | $29 ( 41) | 187.48 Hz | |
- | $28 ( 40) | 192.05 Hz | |
G3 | 196.00 Hz | $27 ( 39) | 196.85 Hz |
- | $26 ( 38) | 201.90 Hz | |
G#3/A♭3 | 207.65 Hz | $25 ( 37) | 207.21 Hz |
- | $24 ( 36) | 212.81 Hz | |
A3 | 220.00 Hz | $23 ( 35) | 218.72 Hz |
- | $22 ( 34) | 224.97 Hz | |
A#3/B♭3 | 233.08 Hz | $21 ( 33) | 231.59 Hz |
- | $20 ( 32) | 238.61 Hz | |
B3 | 246.94 Hz | $1F ( 31) | 246.06 Hz |
- | $1E ( 30) | 254.00 Hz | |
C4 | 261.63 Hz | $1D ( 29) | 262.47 Hz |
- | $1C ( 28) | 271.52 Hz | |
C#4/D♭4 | 277.18 Hz | $1B ( 27) | 281.21 Hz |
D4 | 293.66 Hz | $1A ( 26) | 291.63 Hz |
- | $19 ( 25) | 302.84 Hz | |
D#4/E♭4 | 311.13 Hz | $18 ( 24) | 314.96 Hz |
E4 | 329.63 Hz | $17 ( 23) | 328.08 Hz |
- | $16 ( 22) | 342.35 Hz | |
F4 | 349.23 Hz | $15 ( 21) | 357.91 Hz |
F#4/G♭4 | 369.99 Hz | $14 ( 20) | 374.95 Hz |
G4 | 392.00 Hz | $13 ( 19) | 393.70 Hz |
G#4/A♭4 | 415.30 Hz | $12 ( 18) | 414.42 Hz |
A4 | 440.00 Hz | $11 ( 17) | 437.44 Hz |
A#4/B♭4 | 466.16 Hz | $10 ( 16) | 463.18 Hz |
B4 | 493.88 Hz | $0F ( 15) | 492.12 Hz |
C5 | 523.25 Hz | $0E ( 14) | 524.93 Hz |
C#5/D♭5 | 554.37 Hz | $0D ( 13) | 562.43 Hz |
D5 | 587.33 Hz | - | |
D#5/E♭5 | 622.25 Hz | $0C ( 12) | 605.69 Hz |
E5 | 659.26 Hz | $0B ( 11) | 656.17 Hz |
F5 | 698.46 Hz | $0A ( 10) | 715.82 Hz |
F#5/G♭5 | 739.99 Hz | - | |
G5 | 783.99 Hz | $09 ( 9) | 787.40 Hz |
G#5/A♭5 | 830.61 Hz | - | |
A5 | 880.00 Hz | $08 ( 8) | 874.89 Hz |
A#5/B♭5 | 932.30 Hz | - | |
B5 | 987.80 Hz | $07 ( 7) | 984.25 Hz |
C6 | 1046.50 Hz | - | |
C#6/D♭6 | 1108.70 Hz | $06 ( 6) | 1124.86 Hz |
D6 | 1174.70 Hz | - | |
D#6/E♭6 | 1244.50 Hz | - | |
E6 | 1318.50 Hz | $05 ( 5) | 1312.33 Hz |
F6 | 1396.90 Hz | - | |
F#6/G♭6 | 1480.00 Hz | - | |
G6 | 1568.00 Hz | $04 ( 4) | 1574.80 Hz |
G#6/A♭6 | 1661.20 Hz | - | |
A6 | 1760.00 Hz | - | |
A#6/B♭6 | 1864.66 Hz | - | |
B6 | 1975.53 Hz | $03 ( 3) | 1968.50 Hz |
C7 | 2093.00 Hz | - | |
C#7/D♭7 | 2217.46 Hz | - | |
D7 | 2349.32 Hz | - | |
D#7/E♭7 | 2489.02 Hz | - | |
E7 | 2637.02 Hz | $02 ( 2) | 2624.67 Hz |
F7 | 2793.83 Hz | - | |
F#7/G♭7 | 2959.96 Hz | - | |
G7 | 3135.96 Hz | - | |
G#7/A♭7 | 3322.44 Hz | - | |
A7 | 3520.00 Hz | - | |
A#7/B♭7 | 3729.31 Hz | - | |
B7 | 3937.00 Hz | $01 ( 1) | 3951.07 Hz |
Rest | - | $00 ( 0) | - |
This should assist in illustrating why tones are off-key.
High-pitched notes (3..1) cause aliasing effects.
The algorithm for tone generation is:
frequency = 7874 ÷ ((PITCH & %01111111) + 1);
and the following algorithm also holds true:
frequency = 2 * ((PITCH & %01111111) + 1) * horizontal line period;
so for $01, at 3937 Hz:
1÷3937 = 2 * (1 + 1) * horizontal line period
0.000254 = 4 * horizontal line period
0.0000635 = horizontal line period
and for $02, at ~2624 Hz:
1÷2624 = 2 * (2 + 1) * horizontal line period
0.000381 = 6 * horizontal line period
0.0000635 = horizontal line period
Thus, the horizontal line period is 63.5 µS.
The table below is similar to the table above, but is laid out as a piano-style keyboard (with unusable keys omitted):
Note | B1 | C2 | C#2
D♭2 | D2 | D#2
E♭2 | E2 | F2 | F#2
G♭2 | G2 | G#2
A♭2 | A2 | A#2
B♭2 | B2 | C3 | C#3
D♭3 | D3 | D#3
E♭3 | E3 | F3 | F#3
G♭3 | G3 | G#3
A♭3 | A3 | A#3
B♭3 | B3 | C4 | C#4
D♭4 | D4 | D#4
E♭4 | E4 | F4 | F#4
G♭4 | G4 | G#4
A♭4 | A4 | A#4
B♭4 | B4 | C5 | C#5
D♭5 | D#5
E♭5 | E6 | E5 | F5 | G5 | A5 | B5 | C#6
D♭6 | G6 | B6 | E7 | B7 |
PITCH | 7C | 77 | 70 | 6D | 64 | 5F | 59 | 54 | 4F | 4B | 46 | 42 | 3F | 3B | 38 | 35 | 31 | 2F | 2C | 2A | 27 | 25 | 23 | 21 | 1F | 1D | 1B | 1A | 18 | 17 | 15 | 14 | 13 | 12 | 11 | 10 | 0F | 0E | 0D | 0C | 0B | 0A | 09 | 08 | 07 | 06 | 05 | 04 | 03 | 02 | 01 |
The noise generator works much like the tone generator. As with the tone
generator, it only ever generates square waves (ie. the speaker is only
ever at maximum plus or maximum minus (here designated as +127 and -128
for convenience), not any intermediate values). However, whereas the tone
generator flips from +127 to -127 and vice versa at regular, predictable
intervals, the noise generator only flips, on average, on half of those
occasions; the rest of the time, the output value is held steady.
Or, to put it a different way, the difference is that whenever the tone
generator would flip the amplitude (eg. change from -127 to +127 or vice
versa), the amplitude will be randomly chosen to be -127 or +127.
Eg. if you set a noise of $40, this is equivalent to 121.1385Hz. So,
approximately every 121th of a second, the following pseudocode would be
executed:
if ((rand() % 2) == 0) value = 127; else value = -127;
So, whereas a tone waveform might look like this:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
|_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |_| |
a noise waveform of the same frequency might look like this:
___ _ _ ___ _____ _ _ _ ___ _ ___ _
| | | | | | | | | | | | | | | | | | | | | | | | | |
| | | | | | | | | | | | | | | | | | | | | | | | | |
| | | | | | | | | | | | | | | | | | | | | | | | | |
|_| |_| |_| |___| |_| |_| |_| |___| |___| |_| |_| |_| |_|
The higher the pitch (frequency), the more random the noise will sound. Ie. lower values are more regular and rhythmic.
Sample values are (with acknowledgements to Tom Pittman):
$7F = static
$10 = rocket exhaust
$04 = machine gun
$02 = engine racing
$00 = silence
Note that the preceding discussion of the noise hardware also applies to systems such as the Interton VC 4000 and expanded Elektor TVGC.
Arcadia sound is inferior to Interton sound in three ways:
Lowest pitches are not possible on Arcadia;
Only 8 volume levels on Arcadia instead of 16; and
No explosion circuit ("banger").
Timing
Anything in this section that contradicts the information here or here is probably wrong.
3D Bowling waits for approximately 284 CPU cycles for a scanline?
Circus exhibits different behaviour depending on whether the vertical
blanking interval takes <= 621 CPU cycles or not (<= approx. 32 rastlines).
Green background (or purple, if theres is no Flag pin) is when the CPU is slow and the UVI is fast (vblank done in not many CPU cycles) (NTSC),
Black background (or white, if there is no Flag pin) is when the CPU is fast and the UVI is slow (vblank takes a lot of CPU cycles) (PAL).
NTSC vertical blank takes 18.91667 CPU cycles per rastline * 20 rastlines = 378.3' CPU cycles per vblank.
PAL vertical blank takes 18.91667 CPU cycles per rastline * 43 rastlines = 813.41681 CPU cycles per vblank.
This is based on information found in the 2637 UVI manual:
While drawing the top area (ie. VOFFSET area):
DMA is $FF.
UVI and RAM are accessible.
Sense is probably pulled low now.
Sprite coordinates and vertical offset are read now.
UDGs may be changed now.
While drawing main area:
DMA is $F0..$FC.
UVI is inaccessible.
RAM may be locked out.
Sense is pulled low now if it wasn't already.
After drawing main area, now it is drawing the bottom area (ie. rest of VOFFSET area):
DMA is $FD.
UVI is accessible.
Sense is maybe pulled high now.
RAM may be locked out.
Now it is doing 3 more (undisplayed) rasters. During this time the
electron beam is actually moving diagonally up the screen in preparation
for drawing the next frame (ie. this is the true vertical retrace
interval):
UVI and RAM are accessible.
DMA is $FF.
Sense is pulled high now if it wasn't already.
UDGs may be changed now.
To wait for the START of the vertical blank period, the usual method is:
WAITVBLSTART:
;start of loop
tpsu $80 ;test bits %10000000 of PSU;
bcfr,eq WAITVBLSTART ;if != goto WAITVBLSTART;
;end of loop
To wait for the END of the vertical blank period, the usual method is:
WAITVBLEND:
;start of loop
tpsu $80 ;test bits %10000000 of PSU;
bctr,eq WAITVBLEND ;if == goto WAITVBLEND;
;end of loop
So, BCFR is used when waiting for the START of vertical blank (ie. the END of the display frame), and BCTR is used when waiting for the END of vertical blank (ie. the START of the display frame).
To wait for a specified CHARLINE, the usual method is:
WAITLINE:
;start of loop
loda,r0 CHARLINE
andi,r0 $0F
comi,r0 $03 ;change the operand according to desired line
bcfr,eq WAITLINE
;end of loop
The example above waits until line 3 (ie. CHARLINE == $F3). Change the operand of the COMI instruction as appropriate for other lines.
Compiler 2001
Here is a dissassembly of sync_example.bin, with corresponding source
lines shown.
Note that the raw output of Compiler 2001 is encrypted and requires
decrypting into ordinary 2650 code. Also, its output is buggy, as
indicated below.
set sound off (actual): set sound off (corrected):
set noise off (actual): set noise off (corrected):
set text mode (actual): set text mode (corrected):
set hi resolution:
set vertical scroll n:
set horizontal scroll n:
set extended colour mode off set extended colour mode off
repeat:
cls:
EORZ r0 ;$00
LODI,r1 $D0 ;$01..$02
cls_1:
STRA,r0 $17FF,r1 ;$03..$05
BDRR,r1 CLS_1 ;$06..$07
EORZ r0 ;$08 (useless!)
LODI,r1 $D0 ;$09..$0A
cls_2:
STRA,r0 $19FF,r1 ;$0B..$0D
BDRR,r1 CLS_2 ;$0E..$0F
LODA,r3 PITCH ;$10..$12 LODA,r3 VOLUME
ANDI,r3 $F7 ;$13..$14 ANDI,r3 $F7
STRA,r3 VOLUME
LODA,r3 PITCH ;$15..$17 LODA,r3 VOLUME
ANDI,r3 $EF ;$18..$19 ANDI,r3 $10
STRA,r3 VOLUME
LODA,r0 GFXMODE ;$1A..$1C LODA,r0 GFXMODE
ANDI,r0 $7F ;$1D..$1E ANDI,r0 $7F
STRA,r0 $1918 ;$1F..$21 STRA,r0 GFXMODE
LODA,r3 BGCOLOUR ;$22..$24
IORI,r3 $80 ;$25..$26
STRA,r3 BGCOLOUR ;$27..$29
LODI,r3 n ;$2A..$2B
STRA,r3 VSCROLL ;$2C..$2E
LODA,r3 VOLUME ;$2F..$31
ANDI,r3 $0F ;$32..$33
IORI,r3 n ;$34..$35
STRA,r3 VOLUME ;$36..$38
(actual): (corrected):
LODA,r3 PITCH ;$39..$3B LODA,r3 PITCH
ANDI,r3 $7F ;$3C..$3D ANDI,r3 $7F
STRA,r3 PITCH
set screen colour green
set screen colour blue
forever
LODA,r3 BGCOLOUR
ANDI,r3 $F8
IORI,r3 green [3]
STRA,r3 BGCOLOUR
LODA,r3 BGCOLOUR
ANDI,r3 $F8
IORI,r3 blue [6]
STRA,r3 BGCOLOUR
BCTA,un repeat
Built-in constants:
WHITE=0 |
YELLOW=1 |
CYAN=2 |
GREEN=3 |
PURPLE=4 |
RED=5 |
BLUE=6 |
BLACK=7 |
Label styles:
label code
label
.label
Comment styles:
REM comment
/comment
Endless loop styles:
DO
body
LOOP
REPEAT
body
FOREVER
Miscellaneous:
: | statement separator (same as in BASIC) |
variable=value | LODI,r0 value
STRA,r0 variable |
constant=value | constant EQU value |
Statements:
BRANCH address | BCTA,un |
BRANCH SUB address | BSTA,un |
RETURN | RETC,un |
DIM variable AS BYTE|INTEGER | ? |
CLS | ? |
SCREEN colour | Same as SET SCREEN COLOR colour? |
SET SOUND OFF | ? |
SET NOISE OFF | ? |
SET TEXT MODE | ? |
SET HI RESOLUTION | ? |
SET VERTICAL SCROLL 0..255 | ? |
SET HORIZONTAL SCROLL 0..7 | ? |
SET EXTENDED COLOR MODE ON|OFF | ? |
SET SCREEN COLOR colour | Same as SCREEN colour? |
SYNC | ? |
SYNC number | DMA line, eg. 1 or 25 |
Compatibility Notes
Observations from a real Australian PAL Emerson Arcadia 2001:
The Flag line is enabled (so colours can be inverted by games).
Joysticks are purely digital; no analog is possible. They are self-centring.
The plastic tab on the left side of cartridge slot must be snapped off for
compatibility with American Emerson Arcadia 2001 cartridges.
The paddles return the following values for their extreme and centred positions:
Left player | Right player | ||||
$07,$00 | $68,$00 | $FE,$00 | $07,$00 | $63..$64,$00 | $FE,$00 |
$07,$70..$71 | $68,$70..$71 | $FE,$70..$71 | $07,$69..$6A | $63..$64,$69..$6A | $FE,$69..$6A |
$07,$FE | $68,$FE | $FE,$FE | $07,$FE | $63..$64,$FE | $FE,$FE |
8 Sprites:
It doesn't work on the emulator or the real machine.
It needs $7Ds at addresses $E and $12 changed to $7Cs.
Failing that, it is dependent on the value of r0.
Circus:
It has a black background on a real Australian PAL Emerson Arcadia
(means PAL detected; green background means NTSC detected).
Counter, Message:
These don't fully initialize the system at startup.
You will need to issue a POKE VSCROLL $FF command to be able to see the on-screen text.
Frogger 1.4::
On Ami/WinArcadia 34.32, at least, on NTSC, on level 2, collision
detection is bad (empty road killing frog sometimes, snakes taking
two lives). It is unknown whether this happens on a real NTSC machine.
On a real PAL machine, at least, some movement clicks are inaudible
(presumably their duration is too short).
Multiplex::
P1PADDLE is always reading as $FF; presumably it is being read at the
wrong moment. (So the sprite constantly moves down and right).
Target 1::
It doesn't work on the emulator or the real machine.
He is turning on block mode for some reason; it works if that is changed
(change byte $0009 from $BF to $03).
Tester1..3::
See the relevant source code (TESTER?.ASM in the Homebrews Pack) for results.
VScroll::
The range of values that are completely visible on the TV is $CC..$FB.
Definite emulator compatibility issues as at V34.32 (these don't happen on real machine):
Doraemon: There is sometimes a blank line between your head and body when moving down.
Dr. Slump: There is sometimes a flickering horizontal line at the top of the "tea-can" and "tea-can man".
Parashooter,
Pleiades: The sound is different.
Possible emulator compatibility issues (not retested on emulator nor real machine recently):
Baseball: There are very occasional graphics/collision problems?
Jungler: Some of your bullets are ineffective?
Parashooter: There are graphics glitches when losing a life?
Space Attack: Enemies glitch sometimes when attacking?
Space Raiders,
Space Squadron:
These occasionally "drop" frames, especially when the action is busy?
Player bullets sometimes pass through aliens (the yellow enemies)?
Does it ever happen when we are a reasonable distance from them, and alive? If so, it is an emulator bug.
PIPBUG/BINBUG-based Machines
Writing an output character is done from right to left (bit #0 first, then #1..#7), as follows:
Flag on
r5 = r0;
DLAY();
DLAY();
Flag off
for (r4 = 8; r4 > 0; r4--)
{ DLAY();
r5 >>= 1;
if (r5 & %10000000)
{ Flag on
} else
{ Flag off
} }
DLAY();
Flag on
CHIN returns with an input character in R0, but not until there is input
(ie. it is synchronous). The high bit is used for parity and is always
masked out by CHIN; therefore, only 7-bit input is supported. (Ie. the
extended ASCII set values $80..$FF are unsupported.)
The Sense bit is normally high. It pulses low during key transmission
(ie. whilst receiving clear bits of a byte). Waiting for the Sense bit to
become clear is therefore equivalent to "press any key to continue".
Randomization is normally done by asking the user for a keystroke, then
rapidly incrementing a register while waiting for the Sense bit to become
clear. Eg.
printf("PRESS ANY KEY");
HERE:
addi,r1 1
tpsu $80
bctr,eq HERE ;if Sense bit is set
will generate a random number (0..255) in r1.
There is also an optional 4-digit 7-segment LED display which can be
attached to the system as an additional output device. Writing to this is
done via the WRTD command. The operand is interpreted as follows:
bit 7: 1st digit
bit 6: 2nd digit
bit 5: 3rd digit
bit 4: 4th digit
bits 3..0: digit ($0..$9 = '0'..'9', $A..$F = ' ')
Eg. to write '7' to the 3rd digit would require an operand of $27. A delay is necessary between digit writes on the real machine, but not on the emulator. See the relevant magazine article for more information.
CHIN is used for cassette/papertape/keyboard. It works like this:
do
{ switch to alternate register bank
PORTC = $80; // enable tape reader
} while (Sense bit is set); // ie. until start of start bit
PORTC = 0; // disable tape reader
DLY(); // wait for half a bit (ie. until centre of start bit)
r4 = 0;
for (r5 = 8; r5 > 0; r5--)
{ DLAY(); // wait for one bit
r0 = PSU & %10000000;
r4 <<= 1;
r0 |= r4;
r4 = r0;
}
DLAY();
r4 &= %01111111; // delete parity bit
r0 = r4;
switch to main register bank
clear With Carry flag
return;
So it is expecting the following format:
.01234567#
and it returns in the middle of the stop bit (#).
So, we enable the tape reader, wait for the Sense bit to become clear,
and then disable the tape reader. Then, we read the eight bits from right
to left (bits 0..7) via direct sampling of the PSU at the appropriate
moment. The parity bit (bit 7) is then discarded (without checking it).
COUT is used for cassette/papertape/keyboard. r0 is passed as an argument; it is the ASCII character to be output. It works like this:
set Flag bit
r5 = r0;
DLAY();
DLAY();
clear Flag bit
for (r4 = 8; r4 > 0; r4--)
{ DLAY();
r5 >>= 1;
if (r5 & %10000000 == %10000000)
{ set Flag bit
} else
{ clear Flag bit
} }
DLAY();
set Flag bit
return;
So, we set the Flag bit, wait, and clear the Flag bit.
Then, we write the eight bits from left to right (bits 0..7).
The high bit is not treated any differently to the others. Then we wait
again, set the Flag bit and return.
Effectively, we write this for each byte:
##.01234567
where # means Flag set, . means Flag clear, and digits mean Flag is set/ cleared according to the relevant bit. We set the Flag before returning.
When loading, it waits until the input line goes low, then looks for the start character (':').
Some games have 110 baud and 300 baud versions. These are still all stored on cassette at 110 baud; the baud rate in this case actually refers to the speed of keyboard and screen operations, rather than cassette speed.
Various memory configurations are possible. Here are some examples, but this is not exhaustive:
Region | Size | EA 77up2 ("Baby") | ABC/PC1500/KT9500 | EA 78up5 or PC1001 | EA 78up5 + 78up10 | Modified ABC1500 with CP1002 |
$0000..$03FF | 1K | PIPBUG 1 monitor ROM | PIPBUG 1 monitor ROM | PIPBUG 1 monitor ROM | PIPBUG 1 monitor ROM | PIPBUG 2 monitor ROM |
$0400..$0436 | 55 bytes | RAM for PIPBUG 1 | RAM for PIPBUG 1 | RAM for PIPBUG 1 | RAM for PIPBUG 1 | PIPLA |
$0437..$04FF | 201 bytes | user RAM | user RAM | user RAM | user RAM | PIPLA |
$0500..$05FF | 256 bytes | mirror of $0400..$04FF | user RAM | user RAM | user RAM | PIPLA |
$0600..$07FF | 512 bytes | mirrors of $0400..$04FF | mirror of $0400..$05FF | user RAM | user RAM | PIPLA |
$0800..$0861 | 98 bytes | mirror of $0000..$0061 | mirror of $0000..$0061 | user RAM on 4K version | user RAM | SMI RAM used by PIPBUG 2 + PIPLA |
$0862..$087F | 30 bytes | mirror of $0062..$007F | mirror of $0062..$007F | user RAM on 4K version | user RAM | SMI RAM unused by PIPBUG 2 + PIPLA |
$0880..$0BFF | 896 bytes | mirror of $0080..$03FF | mirror of $0080..$03FF | user RAM on 4K version | user RAM | unused |
$0C00..$0DFF | 512 bytes | mirror of $0400..$05FF | mirror of $0400..$05FF | user RAM on 4K version | user RAM | motherboard RAM |
$0E00..$0FFF | 512 bytes | mirror of $0600..$07FF | mirror of $0600..$07FF | user RAM on 4K version | user RAM | optional RAM |
$1000..$13FF | 1K | mirror of $0000..$03FF | mirror of $0000..$03FF | user RAM on 4K version | user RAM | unmapped? |
$1400..$1EFF | 2.75K | mirror of $0400..$0EFF | mirror of $0400..$0EFF | unused? | user RAM | unmapped? |
$1F00..$1FFF | 256 bytes | mirror of $0F00..$0FFF | mirror of $0F00..$0FFF | unused? | user RAM | mirror of $0F00..$0FFF |
$2000..$2FF9 | 4090 bytes | mirror of $0000..$0FF9 | mirror of $0000..$0FF9 | unused? | user RAM | unmapped? |
$2FFA..$2FFF | 6 bytes | mirror of $0FFA..$0FFF | mirror of $0FFA..$0FFF | unused? | RAM (for use by EPROM) | unmapped? |
$3000..$3FFF | 4K | mirror of $0000..$0FFF | mirror of $0000..$0FFF | unused? | EPROM | unmapped? |
$4000..$41FF | 512 bytes | mirror of $0000..$01FF | mirror of $0000..$01FF | unused? | ROM? (for eg. ETI-686) | unmapped? |
$4200..$57FF | 5.5K | mirrors of $0000..$0FFF | mirrors of $0000..$0FFF | unused? | RAM (for eg. ETI-686?) | unmapped? |
$5800..$7CFF | 5.25K | mirrors of $0000..$0FFF | mirrors of $0000..$0FFF | unused? | RAM (for eg. ETI-686?) | unmapped? |
$6D00..$7FFF | 4.75K | mirrors of $0000..$0FFF | mirrors of $0000..$0FFF | unused? | RAM? (eg. for Linearisatie) | unmapped? |
EA 77up2 ("Baby"): 1K ROM + 256 bytes RAM
Signetics Adaptable Board Computer aka Signetics PC1500 aka Signetics KT9500: 1K ROM + 512 bytes RAM
EA 78up5 ("1K Mini Computer" aka "2650 Mini Computer") or Signetics PC1001: 1K ROM + 1K RAM
EA 78up5+78up10 ("Expanded Mini Computer with EPROM"): 1K ROM + 15.75K RAM + 4K EPROM
Modified ABC1500 with CP1002 (see TN132): 2K ROM + 1152 bytes RAM
The ABC also supports parallel and serial I/O, has an on-board clock,
and can be expanded to up to 24K of RAM. These features are not supported
by Ami/WinPIPBUG, as the mappings of the serial and parallel I/O ports and
clock are unknown.
The Signetics PC1001 Microprocessor Prototyping Card (1K RAM)
(assembled) is a different, though closely related, machine.
The Signetics PC2000 is a 4K expansion RAM board suitable for (at least)
the PC1001/PC1500/KT9500.
The Signetics PC3000 is another "evaluation kit" (as are the other
Signetics-manufactured machines), about which almost nothing is known.
A progression of mostly Applied Technology products can be traced from
Baby 2650 to
Mini 2650 to
ETI-636 to
BINBUG-based machines to
DG680 to
Microbee.
While using PIPBUG 1 "A" and "S" commands, valid inputs are:
<CR> (ie. ENTER) to exit
<LF> (ie. Ctrl+J) to display the next address/register
<nn><CR> to change contents address/register to <nn> and exit
<nn><LF> (ie. type the value then press Ctrl+J) to change contents of address/register to
<nn> and display the next address/register.
PIPBUG 1 ROM areas are as follows:
$000..$01C: initialization
$01D..$05A: command handler
$05B..$0A3: input a cmd line into buffer
$0A4..$0AA: subr that stores double precision into temp
$0AB..$0F3: display and alter memory
$0F4..$139: selectively display and alter registers
$13A..$15F: goto address
$160..$1AA: breakpoint runtime code
$1AB..$1C9: subr to clear a bkpt
$1CA..$223: break point
$224..$23C: input two hex chars and form as byte in R1
$23D..$245: calculate the BCC char, EOR and then rotate left
$246..$24F: lookup ASCII char in hex value table
$250..$268: abort exit from any level of subr
$269..$285: byte in R1 output in hex
$286..$2A7: 110 baud input for papertape and char 1 MHz clock
$2A8..$2B3: delay for one bit time
$2B4..$2D4: COUT (Character OUT) routine
$2D5..$30F: get a number from the buffer into R1-R2
$310..$35A: dump to paper tape in object format
$35B..$3B4: subrs for outputting blanks
$3B5..$3FD: load from papertape in object format
$3FE..$3FF: unused?
Note that that PIPBUG, and programs for it, generally run with signed (arithmetic) comparisons, as opposed to the Arcadia, etc. which generally run with unsigned (logical) comparisons.
COUT has the following side effects when called:
PSL: CC = lt;
PSL: primary register bank (r1..r3) is always selected
PSU: Flag pin is always set
r0 = r4 = 0;
r5 = the old r0 (ie. what you passed)
You should not call it when SP > 5 (you need one level of stack for
COUT's return address and another level for DLAY's return address).
CHIN has the following side effects when called:
PSL: CC = gt;
PSL: primary register bank (r1..r3) is always selected
PSL: With Carry bit is always set
r0 = r4 = return code (1..127)
r5 = *(DATABUS) = 0;
You should not call it when SP > 5 (you need one level of stack for
CHIN's return address and another level for DLAY's/DLY's return
address).
Utility EPROM areas are as follows:
Region | Label | Area | Type |
$2FFA..$2FFB | START | RAM | data (1st CLI parameter) |
$2FFC..$2FFD | END | RAM | data (2nd CLI parameter) |
$2FFE..$2FFE | NEW | RAM | data (3rd CLI parameter) |
$3C07 | GPAR | EPROM | subroutine |
$3C2A | INCRT | EPROM | subroutine |
$3C3C | PADR | EPROM | subroutine |
$3C50 | HEXLIST | EPROM | subroutine |
$3C6A | SEARCH | EPROM | subroutine |
$3C8A | HEXIN | EPROM | subroutine |
$3CDD | VERIFY | EPROM | subroutine |
$3CF8 | OK | EPROM | code section |
$3CCB | ? | EPROM | subroutine |
$3CCE | ? | EPROM | subroutine |
$3D0E | FAULTY | EPROM | code section |
$3D3B | MOVE | EPROM | subroutine |
Some useful Ctrl-codes are:
Ctrl+G = BEL (7)
Ctrl+H = BS (8)
Ctrl+I = TAB (9)
Ctrl+J = LF (10)
Ctrl+M = CR (13)
Teletype I/O
At 1MHz, there are 1,000,000 short/fast cycles per second, which is 333,333.3' long/slow cycles per second. So each long/slow cycle lasts for 1,000,000÷333,333.3' = 3 µsecs.
At 110 baud, each bit ideally lasts for 9090.90' µsecs.
At 300 baud, each bit ideally lasts for 3333.3' µsecs.
At 1200 baud, each bit ideally lasts for 833.3' µsecs.
For a 110 baud teletype, a full bit delay is:
bsta,un TDLA ;3
TDLA:
eorz r0 ;2
bdrr,r0 $ ;256*3
bdrr,r0 $ ;256*3
TDLY:
bdrr,r0 $ ;256*3
lodi,r0 229 ;2
bdrr,r0 $ ;229*3
retc,un ;3
= 3001 long/slow cycles = 9003 µsecs
and a half bit delay is:
bsta,un TDLY ;3
TDLY:
bdrr,r0 $ ;256*3
lodi,r0 229 ;2
bdrr,r0 $ ;229*3
retc,un ;3
= 1463 long/slow cycles = 4389 µsecs
For a 1200 baud RS-232 terminal, a full bit delay is:
bsta,un DLAY ;3
DLAY:
lodi,r0 89 ;2
DL1:
bdrr,r0 DL1 ;3
retc,un ;3
3+2+(3*89)+3 = 275 long/slow cycles = 825 µsecs
and a half bit delay is:
bsta,un DLY ;3
DLY:
lodi,r0 58 ;2
bctr,un DL1 ;2
DL1:
bdrr,r0 DL1 ;3
retc,un ;3
3+2+2+(3*58)+3 = 184 long/slow cycle s = 552 µsecs
Note that these delays are shorter than the ideals. However, there is also code that must be run by the caller to process (emit/receive) each bit, which takes additional time to run.
Each character begins with a start bit (%0). Then data bits 0..6 are sent
(least significant bits first). Then a parity bit is sent. Then stop
bits are sent.
The letter "U" has the 7-bit ASCII code of $55 (%1010101). This would be
transmitted as %0,1010101,1,00.
Cassette I/O
A clear (0) bit (Sense bit off) is represented by a slowly pulsing signal.
About 10 slowly pulsing cycles represents a clear bit.
A set (1) bit (Sense bit on) is represented by a quickly pulsing signal.
About 20 quickly pulsing cycles represents a set bit.
The length of each bit, in time, is identical regardless of its value. (This is in contrast to the system used on the Elektor, which has identical pulses for all values and differentiates values by the positioning of the pulses.)
PIPBUG 1 encodes/decodes the files as Signetics Absolute Object Format (AOF) at 110 baud. There is a low start bit preceding each byte, and two high stop bits following each byte. The parity bit (bit 7 of the data) is always thrown away when reading. The data rate is approximately 10 raw data bytes per second. As values are encoded into ASCII pairs, the actual number of bytes loaded/saved per second from the user's point of view is about 5.
PIPBUG, BINBUG (except ACOS), CD2650 and (presumably) Selbstbaucomputer use a standard Kansas City Computer Users Tape Standard (CUTS) cassette interface to transform standard teletype I/O into cassette tape I/O (ie. high and low bits are turned into the appropriate pulse trains when recording, and pulse trains are analyzed and decoded into high and low bits during playback), usually at 110 baud:
Every "0" bit becomes 21.81' cycles (pulses) of a 2400 Hz tone, and
Every "1" bit becomes 10.90' cycles (pulses) of a 1200 Hz tone.
In practice, exactly 22 or 11 pulses should be done (as it is best to
wait until the next zero crossing before doing the next bit).
The BIOS and games only see the teletype Sense and Flag lines, they
cannot see the pulse trains. The cassette interface is invisible to the
software; as far as it knows there is only an ordinary teletype attached.
This means that you can record/play any sort of teletype I/O directly to/
from the tape, not just formal dumps.
300 baud is identical to 110 baud except that only 8 (instead of 22) or
4 (instead of 11) pulses are done; the pulses themselves are identical.
To load a tape, translate it to teletype format:
22 2400 Hz pulses in 9.09' msec = having teletype Sense low for 9.09' msec ("0").
11 1200 Hz pulses in 9.09' msec = having teletype Sense high for 9.09' msec ("1").
If we see a zero crossing every 413.2231 µsec it is a "0", and we should see 22 of those (or more if there are several 0 bits).
If we see a zero crossing every 826.4463 µsec it is a "1", and we should see 11 of those (or more if there are several 1 bits).
and vice versa when saving:
While teletype Sense is 0, flip the tape Sense every 413.2231 ÷ 2 µsec.
While teletype Sense is 1, flip the tape Sense every 826.4463 ÷ 2 µsec.
This is sufficient for all baud rates and encodings.
Here are diagrammatic views of the system, in record mode:
At computer | Tape | Terminal (VDU/keyboard) | ||
Flag | -> | tape can save this | -> | VDU |
Sense | <- | input comes from kybd | <- | Keyboard |
and in playback mode:
At computer | Tape | Terminal (VDU/keyboard) | ||
Flag | -> | tape ignores this | -> | VDU |
Sense | <- | input comes from tape | Neither |
Papertape I/O
The "teletype tape reader" mentioned in the Prometheus manual is a slow
one built into the teletype machine (but not the same as the printer +
keyboard). It runs at 10 characters per second, which is 110 baud
equivalent. 10 bytes = 10 characters = 1 inch = 1 second.
The "fast paper-tape reader" is a High Speed Paper Tape (HSPT) reader unit.
It run at 300 characters per second, which is 3300 baud equivalent.
For input:
If you're using a slow paper tape reader, Prometheus (and PIPBUG 1) can
control it directly via the I/O control port.
If you're using a fast paper tape reader, you need your own code (in
EPROM) at $2000..$21FF for Prometheus, and it is not supported in PIPBUG 1.
For output:
Prometheus will print a listing to the teletype as normal,
and also will punch a tape for the AOF (Signetics Absolute Object Format)
file.
Prometheus writes $C0 to the control port to read & advance the papertape.
PIPBUG 1 writes $80 in a rather tight loop (at $28A) to the I/O control
port when idle (to read from any papertape that may be present). Only
when there is no papertape in the unit can the keyboard and audio
cassette be used for input.
Writing $80 to I/O control port "enable[s paper]tape reader".
(The papertape punch must not require it, only the reader.)
So presumably when that happens the papertape reader unit reads the next
byte and then sends it one bit at a time in a teletype-like manner via
the Sense pin, and advances the papertape.
The papertape would continue to advance automatically until the motor was
turned off.
As soon as the start bit (a %0) is sent by the papertape unit and heard by
PIPBUG 1, it stops the tape reader by writing $0 to the I/O control port.
But then it reads the rest of the byte so obviously the tape reader
finishes the entire byte regardless once it has started. When it has
finished sending, it will then check again whether to send another (at
least that is how the emulator works).
When loading, PIPBUG 1 just emits $80s to the I/O control port.
When dumping, all I/O ports are idle (everything is done via the Flag
bit). The punch listens to that and when it has heard an entire byte it
punches the byte and advances the papertape (ie. it is event-driven
rather than continuous).
Printer I/O
EA printer interface:
Uses the data port for (parallel) input and output.
Does not use buffering.
Can accept a new character every 64th of a second (in condensed mode)
or every 32nd of a second (in expanded mode).
As soon as the game writes to the data port, it prints the character.
While printing is in progress, the high bit of the input data port
is low. It is high while idle.
ETI-641 printer interface:
Uses extended port $19 (25) for (parallel) input and output.
Uses an internal 128-byte buffer.
Can accept a new character every 200,000th of a second (5 µsecs).
Once the internal buffer fills, or a CR is received by the printer, it
prints (and empties) the entire buffer.
While printing is in progress, the high bit of the input extended port
$19 (25) is low. It is high while idle.
To convert from ASCII to EUY format:
output = (input & 0x1F)
| ((input & 0x60) << 1);
output = ^output;
ASCII | EUY |
$00..$1F | $00..$1F |
$20..$3F | $40..$5F |
$40..$5F | $80..$9F |
$60..$7F | $C0..$DF |
$80..$9F | $00..$1F |
$A0..$BF | $40..$5F |
$C0..$DF | $80..$9F |
$E0..$FF | $C0..$DF |
Eg. 'A' would be $41 in ASCII format or $81 in EUY format.
The above table is before the one's complement (ie. flip all bits) operation.
Matsushita EUY-10E023LE printer model number can be decomposed as follows:
E = Electrosensitive
2 = 250mm flat cable, 372mm connector cable
3 = 32/21/16 cpl with 2 spacing dots (horizontally between each character)
L = left-to-right scanning, MSD character generator
E = manufacturer code
Unarchived Software
The following are confirmed but unavailable:
C-BUG, MultiBug, MATBUG, SBCBUG, etc.
"the program supplied with the PROM Programmer article (Jan 1979)"
(what article? which magazine?).
If you know of any other software, or have dumps/tapes/listings of any of
the above software, please
email
us.
Timeshare Software
Various official Signetics 2650 cross-development software was available for the NCSS (National Computer Software Systems) timesharing system (running the VP/CSS OS on IBM System/370 hardware) and the GE (General Electric) Timesharing System Mark III (running the GECOS-III OS on Honeywell 645 hardware):
PIPHASM: Programmable Integrated Processor Hex Assembler
- takes ASCII source code (on disk) as input
- produces AOF file (on disk) as output
- written in FORTRAN IV
- two versions: AS1100 (16-bit) and AS1000 (32-bit).
PIPHTAP: Programmable Integrated Processor Hex Tape
- takes AOF file (on disk) as input
- punches AOF file (on paper tape) as output (for 2650 PC 1001)
- written in FORTRAN IV
PIPSTAP: Programmable Integrated Processor SMS Tape
- takes AOF file (on disk) as input
- punches SMS file (on paper tape) as output (for burning a PROM)
- written in FORTRAN IV
PIPSIM: Programmable Integrated Processor (cross-)Simulator
- takes AOF file (on disk) and ASCII command file (on disk) as input
- written in FORTRAN IV
- two versions: SM1100 (16-bit) and SM1000 (32-bit).
PLµS: Programming Language for Micro Systems
- compiler (produces AOF format as output?)
- extended version of PL/M language
- written in ? language by Gary Kildall for Signetics
- two versions: 2650PC1100 (16-bit) and 2650PL000 (32-bit).
None of this software has been dumped. The PLµS manual is sought so that this language can be reimplemented from the specification.
BINBUG Hardware
The FPGA640 + TCT PCG are mapped as follows:
Region | Description |
$7000..$700F | 1st..16th rows of UDG #0 imagery |
$7010..$701F | 1st..16th rows of UDG #1 imagery |
... | ... |
$77F0..$77FF | 1st..16th rows of UDG #127 imagery |
$7800..$783F | Contents and inverse video of 1st character row (1st..64th columns):
Bit 7: inverse video (0=off, 1=on) Bits 6..0: character ($00..$7F) |
$7840..$787F | Contents and inverse video of 2nd character row (1st..64th columns) |
... | ... |
$7BC0..$7BFF | Contents and inverse video of 16th character row (1st..64th columns) |
$7C00..$7C3F | Colours and attributes of 1st character row (1st..64th columns):
Bit 7: red (0=off, 1=on) Bit 6: green (0=off, 1=on) Bit 5: blue (0=off, 1=on) Bits 4..3: unused Bit 2: 0=PDG (Pre-Defined Graphic), 1=UDG (User-Defined Graphic) Bit 1: graphics (0=off, 1=on) Bit 0: flash (0=off, 1=on) |
$7C40..$7C7F | Colours and attributes of 2nd character row (1st..64th columns) |
... | ... |
$7FC0..$7FFF | Colours and attributes of 16th character row (1st..64th columns) |
To read the joystick buttons, you REDE from port $09. Bits are:
Bits 7..6: unused
Bits 5..3: switch bits for joystick A:
Switch '1' = %000 (fire/serve)
Switch '2' = %001
Switch '3' = %010
Switch '4' = %011
Switch '5' = %100
Switch '6' = %101
Switch '7' = %110
Nothing = %111
Bits 2..0: switch bits for joystick B (same format as for joystick A)
To read the joystick paddles, first WRTE a value of $00..$07 to port $EF, according to what you want to read:
Channel '1' (%000): 2nd joystick horizontal
Channel '2' (%001): 2nd joystick vertical
Channel '3' (%010): 1st joystick horizontal
Channel '4' (%011): 1st joystick vertical
Channel '5' (%100): 3rd joystick horizontal
Channel '6' (%101): 3rd joystick vertical
Channel '7' (%110): 4th joystick horizontal
Channel '8' (%111): 4th joystick vertical
Now REDE from port $EF in a loop until the MSB is low (ie. until something
in the $00..$7F range is returned).
The X-axis is inverted, ie. $00=right..$7F=left.
The Y-axis is normal, ie. $00=up..$7F=down.
BINBUG BIOS
The following routines are cross-compatible between PIPBUG 1 and BINBUG:
Address | Label |
$1D | EBUG |
$5B | LINE |
$8A | CRLF |
$A4 | STRT |
$269 | BOUT |
$27D | AGAP |
$286 | CHIN |
$2B4 | COUT |
$2DB | GNUM |
The following routines have the same names, and roughly equivalent functionality, under both PIPBUG 1 and BINBUG; however, they have different addresses and therefore are not directly cross-compatible. They may also have different register usage, stack usage, side effects, etc.:
PIPBUG 1 | BINBUG | Label |
$1F | $22 | MBUG |
$AB | $B9 | ALTE |
$F4 | $F1 | SREG |
$131 | $121 | GOTO |
$160 | $14A | BK01 |
$1AB | $17B | CLBK |
$1CA | $197 | CLR |
$1E5 | $1A1 | BKPT |
$246 | $28C | LKUP |
$2A8 | $39B | DLAY |
$2AD | $39F | DLY |
$310 | $2E5 | DUMP |
$35B | $27B | FORM |
$35F | $2FB | GAP |
$3B5 | $3C4 | LOAD |
Here is a useful table comparing various BIOSes for these machines. As there is insufficient information regarding C-BUG, SBCBUG, etc. they are not listed:
OS | Input baud | Output baud | Tape baud | MHz | Range | Year | Notes |
![]() | 110 | 110 | 110 | 1 | $0..$3FF | ? | EA 300 baud mod is possible |
![]() | 110/300 | 110/300 | 110/300? | 1 | $0..$3FF | ? | Supports both rates |
![]() | 300 | 300 | High-speed | 1 | ? | ? | 600 and 1200 baud mods are possible |
![]() | 300/parallel? | DG640 | 300 | 1? | $0..$7FF | ? | - |
![]() | 300/parallel? | DG640 | 300 | 1 | $0..$7FF | 1979 | BINBUG3.6.pdf |
![]() | 300 | DG640 | ACOS | 1? | $0..$7FF | ? | Supports ACOS and DOS |
![]() | ? | DG640 | ACOS | 1? | $0..$7FF | ? | Supports ACOS and DOS |
![]() | 1200 | 1200 | ACOS | 1? | $0..$7FF | ? | Supports ACOS and DOS |
![]() | ? | serial | ACOS | ? | $0..$7FF | ? | - |
![]() | Eurocard | Eurocard | ACOS | ? | $0..$7FF | ? | - |
![]() | 150?/300/1200/2400/parallel | DG640 | ACOS | ? | $0..$7FF | 1982 | sbcos_manual.pdf . Supports ACOS and VHSDOS |
![]() | 300/1200/2400/parallel | 300/1200/2400 | ACOS | ? | $0..$7FF | 1982 | sbcos_manual.pdf . Supports ACOS and VHSDOS |
![]() | 300 | DG640 | ? | 1/2 | $0..$7FF | ? | Optional parallel keyboard support |
![]() | Eurocard | DG640 | ? | ? | $0..$7FF | ? | matbug_monitor_for_eurocard_system_notes.pdf |
![]() | 300 | DG640 | ? | 1? | $0..$7FF | ? | - |
![]() | 300 | 300 | 300 | ? | $0..$7FF | 1981 | ETI-685 |
![]() | parallel | DG640 | 300 | ? | $0..$7FF | 1981 | ETI-685 |
![]() | 300 | DG640 | ? | 1? | $0..$7FF | ? | - |
![]() | - | - | Control & data I/O ports | 1? | $6000..$63FF | ? | - |
![]() | - | - | Extended I/O ports? | 1? | $6000..$63FF | ? | - |
![]() | - | - | Extended I/O ports | 1 | $6000..$63FF | 1982 | sbcos_manual.pdf |
![]() | - | - | - | 1? | $6800..$6FFF | 1981 | vhs_dos_v26a_source_listing.pdf |
![]() | - | - | - | 1? | $6800..$6FFF | ? | MICRODOS.SRC |
Baud rates given assume 1 MHz operation (and are therefore doubled at 2 MHz).
BINBUG outputs both to the serial port (at 300 baud) and to the VDU (1K RAM at $7800..$7FFF).
According to ETI Oct 1982, BINBUG can work at 300, 1200 & 2400 baud (!).
SBCOS = SBCBUG = BINBUG 6.1 + BINBUG 7.1 + ACOS 3.E
BINBUG 6.1 & 7.1 support/expect ETI-685 processor board.
Floppy Disk I/O
Each block is 256 bytes, as follows:
0: next track (0..39).
1: next sector (1..10).
2..255: data bytes
CMD files are used by VHSDOS and MicroDOS for storage of games. They normally consist of two or more chunks concatenated together. Each chunk has a 3-byte header:
0..1: load address of chunk (big-endian)
2: length of payload in bytes (normally <= $FB)
then the payload itself (if any) follows.
The CMD file is terminated by a chunk like this:
0..1: start address of game (big-endian)
2: $00
with no payload.
CMD chunks can seamlessly cross block boundaries.
Note that the above assumes that the block header (ie. "next track" and
"next sector" bytes) have already been skipped.
The 10 sectors per track are numbered 1..10 and have an interleave of 7, ie.
1, 8, 5, 2, 9, 6, 3, 10, 7, 4. (The available disk images are already deinterleaved.)
At the flux level, there are 250,000 flux transitions per second.
Each bit is 1 clock flux + 1 data flux, so there are 125,000 bits per sec.
So theoretically 15,625 bytes per sec, if there were no sector headers,
inter-sector gaps, etc.
However, post-read processing must occur, so we can only really achieve
1/8th of that speed (hence the interleaving). Thus, an effective speed of
12,800 bytes ÷ 8 = 1,600 bytes per second.
After each 20 msec sector read, there is about 140 msec of post-processing
as the disk continues to spin. But the CPU has to keep up with the
drive as it reads each byte, because the drive has no buffer. Therefore most
of the time the CPU is not bothering to read the data passing under the head,
but is instead post-processing previously read data.
With an infinitely fast disk, it takes about 30,642 clocks. ie. about
30.642 msec, between reading an arbitrary byte in a given sector and
reading the equivalent byte in the next sector.
It also takes additional time to change tracks, and to start or stop the
motor.
Game Help
These do nothing very useful, but are not expected to (eg. they are for controlling unemulated hardware, or are code fragments for incorporation into your own games):
2708 EPROM Programmer
Linearization (Linearisatie)
Vector Magnetometer
Wind Furnace Controller
most routines
These games are hardcoded for 110 baud:
On-screen Clock
PPI-based EPROM Programmer
110 baud version of Lunar Lander (machine code)
110 baud version of Biorhythms
110 baud version of Funny Farm Races
These games are hardcoded for 300 baud:
Astro Trek (but an official 110 baud patch is provided with the listing)
Reaction Timer
300 baud version of Lunar Lander (machine code)
300 baud version of Biorhythms
300 baud version of Funny Farm Races
2650 Line Assembler:
"It is not identical but is very similar to the Line Assembler described in the article "2650 mini assembler simplifies programming" by Jamieson Rowe published in the April 1979 issue of Electronics Australia (p. 76-80) and the follow-up article "Improving the 2650 mini line assembler" by A. M. Kollosche in February 1980 (p. 76)." - Chris Burrows.
The start address begin at 2, and increments by 2 every time F5 (reset) is pressed, for some reason.
2650 Micro BASIC programs (eg.
Acey-Deucy,
Blackjack,
Guessing Game (2650 Micro BASIC version),
Life (2650 Micro BASIC version),
Lunar Lander (2650 Micro BASIC version),
Number Game,
Radio Log,
Temperature Conversion):
Type G1 and then press ENTER to begin execution.
Type L1 and then press ENTER to list the program.
Type E1 and then press ENTER to replace lines starting from 1.
Ctrl-C when done.
Some program statements are:
Letter | Description | Example | Standard BASIC |
A | ASCII input | AD | INPUT D$:LET D=ASC(LEFT$(D$,1)) |
E | End | E | END |
G | GoTo | G5 | GOTO 5 |
I | Numeric input | ID | INPUT D |
L | Let | L0=D | LET D=0 |
P | P"HELLO" | PRINT "HELLO" | |
T | Test (if) | TD>0 | IF D>0 THEN |
$ | Remark | $HELLO$ | REM HELLO |
Reverse Polish Notation is used. Eg. LVD+#=D,FT-=F means:
L Let
V push V onto the stack
D push D onto the stack
+ add them together
# unary negation of the result (ie. result = -result)
= store the result in
D variable D
, Let again
F push F onto the stack
T push T onto the stack
- subtract T from F
= store the result in
F variable F
Alien Hunt:
Has ! and " at end of table rows, for some reason.
Assembler, AssemblerPlusDemonstration, AssemblerPlusAssemblerList:
AssemblerPlusDemonstration.pgm will assemble without errors, but the generated machine code is not being written to memory anywhere (we are asking in this case for ORG $2000, but it doesn't seem to matter where we ask for, it is never generated anywhere). Hence, the current dump of Assembler.pgm should be considered suspect (although it has been verified). As the other two are based on that dump, they are likewise suspect.
Astro Trek:
Here is a map of all 2401 (7*7*7*7) sectors of the galaxy:
Quadrant 1
Quadrant 2
Quadrant 3
Quadrant 4
Quadrant 5
Quadrant 6
Quadrant 7
S1
S2
S3
S4
S5
S6
S7
S1
S2
S3
S4
S5
S6
S7
S1
S2
S3
S4
S5
S6
S7
S1
S2
S3
S4
S5
S6
S7
S1
S2
S3
S4
S5
S6
S7
S1
S2
S3
S4
S5
S6
S7
S1
S2
S3
S4
S5
S6
S7
Q1
S1
1,1
1,1
1,1
2,1
1,1
3,1
1,1
4,1
1,1
5,1
1,1
6,1
1,1
7,1
2,1
1,1
2,1
2,1
2,1
3,1
2,1
4,1
2,1
5,1
2,1
6,1
2,1
7,1
3,1
1,1
3,1
2,1
3,1
3,1
3,1
4,1
3,1
5,1
3,1
6,1
3,1
7,1
4,1
1,1
4,1
2,1
4,1
3,1
4,1
4,1
4,1
5,1
4,1
6,1
4,1
7,1
5,1
1,1
5,1
2,1
5,1
3,1
5,1
4,1
5,1
5,1
5,1
6,1
5,1
7,1
6,1
1,1
6,1
2,1
6,1
3,1
6,1
4,1
6,1
5,1
6,1
6,1
6,1
7,1
7,1
1,1
7,1
2,1
7,1
3,1
7,1
4,1
7,1
5,1
7,1
6,1
7,1
7,1
S2
1,1
1,2
1,1
2,2
1,1
3,2
1,1
4,2
1,1
5,2
1,1
6,2
1,1
7,2
2,1
1,2
2,1
2,2
2,1
3,2
2,1
4,2
2,1
5,2
2,1
6,2
2,1
7,2
3,1
1,2
3,1
2,2
3,1
3,2
3,1
4,2
3,1
5,2
3,1
6,2
3,1
7,2
4,1
1,2
4,1
2,2
4,1
3,2
4,1
4,2
4,1
5,2
4,1
6,2
4,1
7,2
5,1
1,2
5,1
2,2
5,1
3,2
5,1
4,2
5,1
5,2
5,1
6,2
5,1
7,2
6,1
1,2
6,1
2,2
6,1
3,2
6,1
4,2
6,1
5,2
6,1
6,2
6,1
7,2
7,1
1,2
7,1
2,2
7,1
3,2
7,1
4,2
7,1
5,2
7,1
6,2
7,1
7,2
S3
1,1
1,3
1,1
2,3
1,1
3,3
1,1
4,3
1,1
5,3
1,1
6,3
1,1
7,3
2,1
1,3
2,1
2,3
2,1
3,3
2,1
4,3
2,1
5,3
2,1
6,3
2,1
7,3
3,1
1,3
3,1
2,3
3,1
3,3
3,1
4,3
3,1
5,3
3,1
6,3
3,1
7,3
4,1
1,3
4,1
2,3
4,1
3,3
4,1
4,3
4,1
5,3
4,1
6,3
4,1
7,3
5,1
1,3
5,1
2,3
5,1
3,3
5,1
4,3
5,1
5,3
5,1
6,3
5,1
7,3
6,1
1,3
6,1
2,3
6,1
3,3
6,1
4,3
6,1
5,3
6,1
6,3
6,1
7,3
7,1
1,3
7,1
2,3
7,1
3,3
7,1
4,3
7,1
5,3
7,1
6,3
7,1
7,3
S4
1,1
1,4
1,1
2,4
1,1
3,4
1,1
4,4
1,1
5,4
1,1
6,4
1,1
7,4
2,1
1,4
2,1
2,4
2,1
3,4
2,1
4,4
2,1
5,4
2,1
6,4
2,1
7,4
3,1
1,4
3,1
2,4
3,1
3,4
3,1
4,4
3,1
5,4
3,1
6,4
3,1
7,4
4,1
1,4
4,1
2,4
4,1
3,4
4,1
4,4
4,1
5,4
4,1
6,4
4,1
7,4
5,1
1,4
5,1
2,4
5,1
3,4
5,1
4,4
5,1
5,4
5,1
6,4
5,1
7,4
6,1
1,4
6,1
2,4
6,1
3,4
6,1
4,4
6,1
5,4
6,1
6,4
6,1
7,4
7,1
1,4
7,1
2,4
7,1
3,4
7,1
4,4
7,1
5,4
7,1
6,4
7,1
7,4
S5
1,1
1,5
1,1
2,5
1,1
3,5
1,1
4,5
1,1
5,5
1,1
6,5
1,1
7,5
2,1
1,5
2,1
2,5
2,1
3,5
2,1
4,5
2,1
5,5
2,1
6,5
2,1
7,5
3,1
1,5
3,1
2,5
3,1
3,5
3,1
4,5
3,1
5,5
3,1
6,5
3,1
7,5
4,1
1,5
4,1
2,5
4,1
3,5
4,1
4,5
4,1
5,5
4,1
6,5
4,1
7,5
5,1
1,5
5,1
2,5
5,1
3,5
5,1
4,5
5,1
5,5
5,1
6,5
5,1
7,5
6,1
1,5
6,1
2,5
6,1
3,5
6,1
4,5
6,1
5,5
6,1
6,5
6,1
7,5
7,1
1,5
7,1
2,5
7,1
3,5
7,1
4,5
7,1
5,5
7,1
6,5
7,1
7,5
S6
1,1
1,6
1,1
2,6
1,1
3,6
1,1
4,6
1,1
5,6
1,1
6,6
1,1
7,6
2,1
1,6
2,1
2,6
2,1
3,6
2,1
4,6
2,1
5,6
2,1
6,6
2,1
7,6
3,1
1,6
3,1
2,6
3,1
3,6
3,1
4,6
3,1
5,6
3,1
6,6
3,1
7,6
4,1
1,6
4,1
2,6
4,1
3,6
4,1
4,6
4,1
5,6
4,1
6,6
4,1
7,6
5,1
1,6
5,1
2,6
5,1
3,6
5,1
4,6
5,1
5,6
5,1
6,6
5,1
7,6
6,1
1,6
6,1
2,6
6,1
3,6
6,1
4,6
6,1
5,6
6,1
6,6
6,1
7,6
7,1
1,6
7,1
2,6
7,1
3,6
7,1
4,6
7,1
5,6
7,1
6,6
7,1
7,6
S7
1,1
1,7
1,1
2,7
1,1
3,7
1,1
4,7
1,1
5,7
1,1
6,7
1,1
7,7
2,1
1,7
2,1
2,7
2,1
3,7
2,1
4,7
2,1
5,7
2,1
6,7
2,1
7,7
3,1
1,7
3,1
2,7
3,1
3,7
3,1
4,7
3,1
5,7
3,1
6,7
3,1
7,7
4,1
1,7
4,1
2,7
4,1
3,7
4,1
4,7
4,1
5,7
4,1
6,7
4,1
7,7
5,1
1,7
5,1
2,7
5,1
3,7
5,1
4,7
5,1
5,7
5,1
6,7
5,1
7,7
6,1
1,7
6,1
2,7
6,1
3,7
6,1
4,7
6,1
5,7
6,1
6,7
6,1
7,7
7,1
1,7
7,1
2,7
7,1
3,7
7,1
4,7
7,1
5,7
7,1
6,7
7,1
7,7
Q2
S1
1,2
1,1
1,2
2,1
1,2
3,1
1,2
4,1
1,2
5,1
1,2
6,1
1,2
7,1
2,2
1,1
2,2
2,1
2,2
3,1
2,2
4,1
2,2
5,1
2,2
6,1
2,2
7,1
3,2
1,1
3,2
2,1
3,2
3,1
3,2
4,1
3,2
5,1
3,2
6,1
3,2
7,1
4,2
1,1
4,2
2,1
4,2
3,1
4,2
4,1
4,2
5,1
4,2
6,1
4,2
7,1
5,2
1,1
5,2
2,1
5,2
3,1
5,2
4,1
5,2
5,1
5,2
6,1
5,2
7,1
6,2
1,1
6,2
2,1
6,2
3,1
6,2
4,1
6,2
5,1
6,2
6,1
6,2
7,1
7,2
1,1
7,2
2,1
7,2
3,1
7,2
4,1
7,2
5,1
7,2
6,1
7,2
7,1
S2
1,2
1,2
1,2
2,2
1,2
3,2
1,2
4,2
1,2
5,2
1,2
6,2
1,2
7,2
2,2
1,2
2,2
2,2
2,2
3,2
2,2
4,2
2,2
5,2
2,2
6,2
2,2
7,2
3,2
1,2
3,2
2,2
3,2
3,2
3,2
4,2
3,2
5,2
3,2
6,2
3,2
7,2
4,2
1,2
4,2
2,2
4,2
3,2
4,2
4,2
4,2
5,2
4,2
6,2
4,2
7,2
5,2
1,2
5,2
2,2
5,2
3,2
5,2
4,2
5,2
5,2
5,2
6,2
5,2
7,2
6,2
1,2
6,2
2,2
6,2
3,2
6,2
4,2
6,2
5,2
6,2
6,2
6,2
7,2
7,2
1,2
7,2
2,2
7,2
3,2
7,2
4,2
7,2
5,2
7,2
6,2
7,2
7,2
S3
1,2
1,3
1,2
2,3
1,2
3,3
1,2
4,3
1,2
5,3
1,2
6,3
1,2
7,3
2,2
1,3
2,2
2,3
2,2
3,3
2,2
4,3
2,2
5,3
2,2
6,3
2,2
7,3
3,2
1,3
3,2
2,3
3,2
3,3
3,2
4,3
3,2
5,3
3,2
6,3
3,2
7,3
4,2
1,3
4,2
2,3
4,2
3,3
4,2
4,3
4,2
5,3
4,2
6,3
4,2
7,3
5,2
1,3
5,2
2,3
5,2
3,3
5,2
4,3
5,2
5,3
5,2
6,3
5,2
7,3
6,2
1,3
6,2
2,3
6,2
3,3
6,2
4,3
6,2
5,3
6,2
6,3
6,2
7,3
7,2
1,3
7,2
2,3
7,2
3,3
7,2
4,3
7,2
5,3
7,2
6,3
7,2
7,3
S4
1,2
1,4
1,2
2,4
1,2
3,4
1,2
4,4
1,2
5,4
1,2
6,4
1,2
7,4
2,2
1,4
2,2
2,4
2,2
3,4
2,2
4,4
2,2
5,4
2,2
6,4
2,2
7,4
3,2
1,4
3,2
2,4
3,2
3,4
3,2
4,4
3,2
5,4
3,2
6,4
3,2
7,4
4,2
1,4
4,2
2,4
4,2
3,4
4,2
4,4
4,2
5,4
4,2
6,4
4,2
7,4
5,2
1,4
5,2
2,4
5,2
3,4
5,2
4,4
5,2
5,4
5,2
6,4
5,2
7,4
6,2
1,4
6,2
2,4
6,2
3,4
6,2
4,4
6,2
5,4
6,2
6,4
6,2
7,4
7,2
1,4
7,2
2,4
7,2
3,4
7,2
4,4
7,2
5,4
7,2
6,4
7,2
7,4
S5
1,2
1,5
1,2
2,5
1,2
3,5
1,2
4,5
1,2
5,5
1,2
6,5
1,2
7,5
2,2
1,5
2,2
2,5
2,2
3,5
2,2
4,5
2,2
5,5
2,2
6,5
2,2
7,5
3,2
1,5
3,2
2,5
3,2
3,5
3,2
4,5
3,2
5,5
3,2
6,5
3,2
7,5
4,2
1,5
4,2
2,5
4,2
3,5
4,2
4,5
4,2
5,5
4,2
6,5
4,2
7,5
5,2
1,5
5,2
2,5
5,2
3,5
5,2
4,5
5,2
5,5
5,2
6,5
5,2
7,5
6,2
1,5
6,2
2,5
6,2
3,5
6,2
4,5
6,2
5,5
6,2
6,5
6,2
7,5
7,2
1,5
7,2
2,5
7,2
3,5
7,2
4,5
7,2
5,5
7,2
6,5
7,2
7,5
S6
1,2
1,6
1,2
2,6
1,2
3,6
1,2
4,6
1,2
5,6
1,2
6,6
1,2
7,6
2,2
1,6
2,2
2,6
2,2
3,6
2,2
4,6
2,2
5,6
2,2
6,6
2,2
7,6
3,2
1,6
3,2
2,6
3,2
3,6
3,2
4,6
3,2
5,6
3,2
6,6
3,2
7,6
4,2
1,6
4,2
2,6
4,2
3,6
4,2
4,6
4,2
5,6
4,2
6,6
4,2
7,6
5,2
1,6
5,2
2,6
5,2
3,6
5,2
4,6
5,2
5,6
5,2
6,6
5,2
7,6
6,2
1,6
6,2
2,6
6,2
3,6
6,2
4,6
6,2
5,6
6,2
6,6
6,2
7,6
7,2
1,6
7,2
2,6
7,2
3,6
7,2
4,6
7,2
5,6
7,2
6,6
7,2
7,6
S7
1,2
1,7
1,2
2,7
1,2
3,7
1,2
4,7
1,2
5,7
1,2
6,7
1,2
7,7
2,2
1,7
2,2
2,7
2,2
3,7
2,2
4,7
2,2
5,7
2,2
6,7
2,2
7,7
3,2
1,7
3,2
2,7
3,2
3,7
3,2
4,7
3,2
5,7
3,2
6,7
3,2
7,7
4,2
1,7
4,2
2,7
4,2
3,7
4,2
4,7
4,2
5,7
4,2
6,7
4,2
7,7
5,2
1,7
5,2
2,7
5,2
3,7
5,2
4,7
5,2
5,7
5,2
6,7
5,2
7,7
6,2
1,7
6,2
2,7
6,2
3,7
6,2
4,7
6,2
5,7
6,2
6,7
6,2
7,7
7,2
1,7
7,2
2,7
7,2
3,7
7,2
4,7
7,2
5,7
7,2
6,7
7,2
7,7
Q3
S1
1,3
1,1
1,3
2,1
1,3
3,1
1,3
4,1
1,3
5,1
1,3
6,1
1,3
7,1
2,3
1,1
2,3
2,1
2,3
3,1
2,3
4,1
2,3
5,1
2,3
6,1
2,3
7,1
3,3
1,1
3,3
2,1
3,3
3,1
3,3
4,1
3,3
5,1
3,3
6,1
3,3
7,1
4,3
1,1
4,3
2,1
4,3
3,1
4,3
4,1
4,3
5,1
4,3
6,1
4,3
7,1
5,3
1,1
5,3
2,1
5,3
3,1
5,3
4,1
5,3
5,1
5,3
6,1
5,3
7,1
6,3
1,1
6,3
2,1
6,3
3,1
6,3
4,1
6,3
5,1
6,3
6,1
6,3
7,1
7,3
1,1
7,3
2,1
7,3
3,1
7,3
4,1
7,3
5,1
7,3
6,1
7,3
7,1
S2
1,3
1,2
1,3
2,2
1,3
3,2
1,3
4,2
1,3
5,2
1,3
6,2
1,3
7,2
2,3
1,2
2,3
2,2
2,3
3,2
2,3
4,2
2,3
5,2
2,3
6,2
2,3
7,2
3,3
1,2
3,3
2,2
3,3
3,2
3,3
4,2
3,3
5,2
3,3
6,2
3,3
7,2
4,3
1,2
4,3
2,2
4,3
3,2
4,3
4,2
4,3
5,2
4,3
6,2
4,3
7,2
5,3
1,2
5,3
2,2
5,3
3,2
5,3
4,2
5,3
5,2
5,3
6,2
5,3
7,2
6,3
1,2
6,3
2,2
6,3
3,2
6,3
4,2
6,3
5,2
6,3
6,2
6,3
7,2
7,3
1,2
7,3
2,2
7,3
3,2
7,3
4,2
7,3
5,2
7,3
6,2
7,3
7,2
S3
1,3
1,3
1,3
2,3
1,3
3,3
1,3
4,3
1,3
5,3
1,3
6,3
1,3
7,3
2,3
1,3
2,3
2,3
2,3
3,3
2,3
4,3
2,3
5,3
2,3
6,3
2,3
7,3
3,3
1,3
3,3
2,3
3,3
3,3
3,3
4,3
3,3
5,3
3,3
6,3
3,3
7,3
4,3
1,3
4,3
2,3
4,3
3,3
4,3
4,3
4,3
5,3
4,3
6,3
4,3
7,3
5,3
1,3
5,3
2,3
5,3
3,3
5,3
4,3
5,3
5,3
5,3
6,3
5,3
7,3
6,3
1,3
6,3
2,3
6,3
3,3
6,3
4,3
6,3
5,3
6,3
6,3
6,3
7,3
7,3
1,3
7,3
2,3
7,3
3,3
7,3
4,3
7,3
5,3
7,3
6,3
7,3
7,3
S4
1,3
1,4
1,3
2,4
1,3
3,4
1,3
4,4
1,3
5,4
1,3
6,4
1,3
7,4
2,3
1,4
2,3
2,4
2,3
3,4
2,3
4,4
2,3
5,4
2,3
6,4
2,3
7,4
3,3
1,4
3,3
2,4
3,3
3,4
3,3
4,4
3,3
5,4
3,3
6,4
3,3
7,4
4,3
1,4
4,3
2,4
4,3
3,4
4,3
4,4
4,3
5,4
4,3
6,4
4,3
7,4
5,3
1,4
5,3
2,4
5,3
3,4
5,3
4,4
5,3
5,4
5,3
6,4
5,3
7,4
6,3
1,4
6,3
2,4
6,3
3,4
6,3
4,4
6,3
5,4
6,3
6,4
6,3
7,4
7,3
1,4
7,3
2,4
7,3
3,4
7,3
4,4
7,3
5,4
7,3
6,4
7,3
7,4
S5
1,3
1,5
1,3
2,5
1,3
3,5
1,3
4,5
1,3
5,5
1,3
6,5
1,3
7,5
2,3
1,5
2,3
2,5
2,3
3,5
2,3
4,5
2,3
5,5
2,3
6,5
2,3
7,5
3,3
1,5
3,3
2,5
3,3
3,5
3,3
4,5
3,3
5,5
3,3
6,5
3,3
7,5
4,3
1,5
4,3
2,5
4,3
3,5
4,3
4,5
4,3
5,5
4,3
6,5
4,3
7,5
5,3
1,5
5,3
2,5
5,3
3,5
5,3
4,5
5,3
5,5
5,3
6,5
5,3
7,5
6,3
1,5
6,3
2,5
6,3
3,5
6,3
4,5
6,3
5,5
6,3
6,5
6,3
7,5
7,3
1,5
7,3
2,5
7,3
3,5
7,3
4,5
7,3
5,5
7,3
6,5
7,3
7,5
S6
1,3
1,6
1,3
2,6
1,3
3,6
1,3
4,6
1,3
5,6
1,3
6,6
1,3
7,6
2,3
1,6
2,3
2,6
2,3
3,6
2,3
4,6
2,3
5,6
2,3
6,6
2,3
7,6
3,3
1,6
3,3
2,6
3,3
3,6
3,3
4,6
3,3
5,6
3,3
6,6
3,3
7,6
4,3
1,6
4,3
2,6
4,3
3,6
4,3
4,6
4,3
5,6
4,3
6,6
4,3
7,6
5,3
1,6
5,3
2,6
5,3
3,6
5,3
4,6
5,3
5,6
5,3
6,6
5,3
7,6
6,3
1,6
6,3
2,6
6,3
3,6
6,3
4,6
6,3
5,6
6,3
6,6
6,3
7,6
7,3
1,6
7,3
2,6
7,3
3,6
7,3
4,6
7,3
5,6
7,3
6,6
7,3
7,6
S7
1,3
1,7
1,3
2,7
1,3
3,7
1,3
4,7
1,3
5,7
1,3
6,7
1,3
7,7
2,3
1,7
2,3
2,7
2,3
3,7
2,3
4,7
2,3
5,7
2,3
6,7
2,3
7,7
3,3
1,7
3,3
2,7
3,3
3,7
3,3
4,7
3,3
5,7
3,3
6,7
3,3
7,7
4,3
1,7
4,3
2,7
4,3
3,7
4,3
4,7
4,3
5,7
4,3
6,7
4,3
7,7
5,3
1,7
5,3
2,7
5,3
3,7
5,3
4,7
5,3
5,7
5,3
6,7
5,3
7,7
6,3
1,7
6,3
2,7
6,3
3,7
6,3
4,7
6,3
5,7
6,3
6,7
6,3
7,7
7,3
1,7
7,3
2,7
7,3
3,7
7,3
4,7
7,3
5,7
7,3
6,7
7,3
7,7
Q4
S1
1,4
1,1
1,4
2,1
1,4
3,1
1,4
4,1
1,4
5,1
1,4
6,1
1,4
7,1
2,4
1,1
2,4
2,1
2,4
3,1
2,4
4,1
2,4
5,1
2,4
6,1
2,4
7,1
3,4
1,1
3,4
2,1
3,4
3,1
3,4
4,1
3,4
5,1
3,4
6,1
3,4
7,1
4,4
1,1
4,4
2,1
4,4
3,1
4,4
4,1
4,4
5,1
4,4
6,1
4,4
7,1
5,4
1,1
5,4
2,1
5,4
3,1
5,4
4,1
5,4
5,1
5,4
6,1
5,4
7,1
6,4
1,1
6,4
2,1
6,4
3,1
6,4
4,1
6,4
5,1
6,4
6,1
6,4
7,1
7,4
1,1
7,4
2,1
7,4
3,1
7,4
4,1
7,4
5,1
7,4
6,1
7,4
7,1
S2
1,4
1,2
1,4
2,2
1,4
3,2
1,4
4,2
1,4
5,2
1,4
6,2
1,4
7,2
2,4
1,2
2,4
2,2
2,4
3,2
2,4
4,2
2,4
5,2
2,4
6,2
2,4
7,2
3,4
1,2
3,4
2,2
3,4
3,2
3,4
4,2
3,4
5,2
3,4
6,2
3,4
7,2
4,4
1,2
4,4
2,2
4,4
3,2
4,4
4,2
4,4
5,2
4,4
6,2
4,4
7,2
5,4
1,2
5,4
2,2
5,4
3,2
5,4
4,2
5,4
5,2
5,4
6,2
5,4
7,2
6,4
1,2
6,4
2,2
6,4
3,2
6,4
4,2
6,4
5,2
6,4
6,2
6,4
7,2
7,4
1,2
7,4
2,2
7,4
3,2
7,4
4,2
7,4
5,2
7,4
6,2
7,4
7,2
S3
1,4
1,3
1,4
2,3
1,4
3,3
1,4
4,3
1,4
5,3
1,4
6,3
1,4
7,3
2,4
1,3
2,4
2,3
2,4
3,3
2,4
4,3
2,4
5,3
2,4
6,3
2,4
7,3
3,4
1,3
3,4
2,3
3,4
3,3
3,4
4,3
3,4
5,3
3,4
6,3
3,4
7,3
4,4
1,3
4,4
2,3
4,4
3,3
4,4
4,3
4,4
5,3
4,4
6,3
4,4
7,3
5,4
1,3
5,4
2,3
5,4
3,3
5,4
4,3
5,4
5,3
5,4
6,3
5,4
7,3
6,4
1,3
6,4
2,3
6,4
3,3
6,4
4,3
6,4
5,3
6,4
6,3
6,4
7,3
7,4
1,3
7,4
2,3
7,4
3,3
7,4
4,3
7,4
5,3
7,4
6,3
7,4
7,3
S4
1,4
1,4
1,4
2,4
1,4
3,4
1,4
4,4
1,4
5,4
1,4
6,4
1,4
7,4
2,4
1,4
2,4
2,4
2,4
3,4
2,4
4,4
2,4
5,4
2,4
6,4
2,4
7,4
3,4
1,4
3,4
2,4
3,4
3,4
3,4
4,4
3,4
5,4
3,4
6,4
3,4
7,4
4,4
1,4
4,4
2,4
4,4
3,4
4,4
4,4
4,4
5,4
4,4
6,4
4,4
7,4
5,4
1,4
5,4
2,4
5,4
3,4
5,4
4,4
5,4
5,4
5,4
6,4
5,4
7,4
6,4
1,4
6,4
2,4
6,4
3,4
6,4
4,4
6,4
5,4
6,4
6,4
6,4
7,4
7,4
1,4
7,4
2,4
7,4
3,4
7,4
4,4
7,4
5,4
7,4
6,4
7,4
7,4
S5
1,4
1,5
1,4
2,5
1,4
3,5
1,4
4,5
1,4
5,5
1,4
6,5
1,4
7,5
2,4
1,5
2,4
2,5
2,4
3,5
2,4
4,5
2,4
5,5
2,4
6,5
2,4
7,5
3,4
1,5
3,4
2,5
3,4
3,5
3,4
4,5
3,4
5,5
3,4
6,5
3,4
7,5
4,4
1,5
4,4
2,5
4,4
3,5
4,4
4,5
4,4
5,5
4,4
6,5
4,4
7,5
5,4
1,5
5,4
2,5
5,4
3,5
5,4
4,5
5,4
5,5
5,4
6,5
5,4
7,5
6,4
1,5
6,4
2,5
6,4
3,5
6,4
4,5
6,4
5,5
6,4
6,5
6,4
7,5
7,4
1,5
7,4
2,5
7,4
3,5
7,4
4,5
7,4
5,5
7,4
6,5
7,4
7,5
S6
1,4
1,6
1,4
2,6
1,4
3,6
1,4
4,6
1,4
5,6
1,4
6,6
1,4
7,6
2,4
1,6
2,4
2,6
2,4
3,6
2,4
4,6
2,4
5,6
2,4
6,6
2,4
7,6
3,4
1,6
3,4
2,6
3,4
3,6
3,4
4,6
3,4
5,6
3,4
6,6
3,4
7,6
4,4
1,6
4,4
2,6
4,4
3,6
4,4
4,6
4,4
5,6
4,4
6,6
4,4
7,6
5,4
1,6
5,4
2,6
5,4
3,6
5,4
4,6
5,4
5,6
5,4
6,6
5,4
7,6
6,4
1,6
6,4
2,6
6,4
3,6
6,4
4,6
6,4
5,6
6,4
6,6
6,4
7,6
7,4
1,6
7,4
2,6
7,4
3,6
7,4
4,6
7,4
5,6
7,4
6,6
7,4
7,6
S7
1,4
1,7
1,4
2,7
1,4
3,7
1,4
4,7
1,4
5,7
1,4
6,7
1,4
7,7
2,4
1,7
2,4
2,7
2,4
3,7
2,4
4,7
2,4
5,7
2,4
6,7
2,4
7,7
3,4
1,7
3,4
2,7
3,4
3,7
3,4
4,7
3,4
5,7
3,4
6,7
3,4
7,7
4,4
1,7
4,4
2,7
4,4
3,7
4,4
4,7
4,4
5,7
4,4
6,7
4,4
7,7
5,4
1,7
5,4
2,7
5,4
3,7
5,4
4,7
5,4
5,7
5,4
6,7
5,4
7,7
6,4
1,7
6,4
2,7
6,4
3,7
6,4
4,7
6,4
5,7
6,4
6,7
6,4
7,7
7,4
1,7
7,4
2,7
7,4
3,7
7,4
4,7
7,4
5,7
7,4
6,7
7,4
7,7
Q5
S1
1,5
1,1
1,5
2,1
1,5
3,1
1,5
4,1
1,5
5,1
1,5
6,1
1,5
7,1
2,5
1,1
2,5
2,1
2,5
3,1
2,5
4,1
2,5
5,1
2,5
6,1
2,5
7,1
3,5
1,1
3,5
2,1
3,5
3,1
3,5
4,1
3,5
5,1
3,5
6,1
3,5
7,1
4,5
1,1
4,5
2,1
4,5
3,1
4,5
4,1
4,5
5,1
4,5
6,1
4,5
7,1
5,5
1,1
5,5
2,1
5,5
3,1
5,5
4,1
5,5
5,1
5,5
6,1
5,5
7,1
6,5
1,1
6,5
2,1
6,5
3,1
6,5
4,1
6,5
5,1
6,5
6,1
6,5
7,1
7,5
1,1
7,5
2,1
7,5
3,1
7,5
4,1
7,5
5,1
7,5
6,1
7,5
7,1
S2
1,5
1,2
1,5
2,2
1,5
3,2
1,5
4,2
1,5
5,2
1,5
6,2
1,5
7,2
2,5
1,2
2,5
2,2
2,5
3,2
2,5
4,2
2,5
5,2
2,5
6,2
2,5
7,2
3,5
1,2
3,5
2,2
3,5
3,2
3,5
4,2
3,5
5,2
3,5
6,2
3,5
7,2
4,5
1,2
4,5
2,2
4,5
3,2
4,5
4,2
4,5
5,2
4,5
6,2
4,5
7,2
5,5
1,2
5,5
2,2
5,5
3,2
5,5
4,2
5,5
5,2
5,5
6,2
5,5
7,2
6,5
1,2
6,5
2,2
6,5
3,2
6,5
4,2
6,5
5,2
6,5
6,2
6,5
7,2
7,5
1,2
7,5
2,2
7,5
3,2
7,5
4,2
7,5
5,2
7,5
6,2
7,5
7,2
S3
1,5
1,3
1,5
2,3
1,5
3,3
1,5
4,3
1,5
5,3
1,5
6,3
1,5
7,3
2,5
1,3
2,5
2,3
2,5
3,3
2,5
4,3
2,5
5,3
2,5
6,3
2,5
7,3
3,5
1,3
3,5
2,3
3,5
3,3
3,5
4,3
3,5
5,3
3,5
6,3
3,5
7,3
4,5
1,3
4,5
2,3
4,5
3,3
4,5
4,3
4,5
5,3
4,5
6,3
4,5
7,3
5,5
1,3
5,5
2,3
5,5
3,3
5,5
4,3
5,5
5,3
5,5
6,3
5,5
7,3
6,5
1,3
6,5
2,3
6,5
3,3
6,5
4,3
6,5
5,3
6,5
6,3
6,5
7,3
7,5
1,3
7,5
2,3
7,5
3,3
7,5
4,3
7,5
5,3
7,5
6,3
7,5
7,3
S4
1,5
1,4
1,5
2,4
1,5
3,4
1,5
4,4
1,5
5,4
1,5
6,4
1,5
7,4
2,5
1,4
2,5
2,4
2,5
3,4
2,5
4,4
2,5
5,4
2,5
6,4
2,5
7,4
3,5
1,4
3,5
2,4
3,5
3,4
3,5
4,4
3,5
5,4
3,5
6,4
3,5
7,4
4,5
1,4
4,5
2,4
4,5
3,4
4,5
4,4
4,5
5,4
4,5
6,4
4,5
7,4
5,5
1,4
5,5
2,4
5,5
3,4
5,5
4,4
5,5
5,4
5,5
6,4
5,5
7,4
6,5
1,4
6,5
2,4
6,5
3,4
6,5
4,4
6,5
5,4
6,5
6,4
6,5
7,4
7,5
1,4
7,5
2,4
7,5
3,4
7,5
4,4
7,5
5,4
7,5
6,4
7,5
7,4
S5
1,5
1,5
1,5
2,5
1,5
3,5
1,5
4,5
1,5
5,5
1,5
6,5
1,5
7,5
2,5
1,5
2,5
2,5
2,5
3,5
2,5
4,5
2,5
5,5
2,5
6,5
2,5
7,5
3,5
1,5
3,5
2,5
3,5
3,5
3,5
4,5
3,5
5,5
3,5
6,5
3,5
7,5
4,5
1,5
4,5
2,5
4,5
3,5
4,5
4,5
4,5
5,5
4,5
6,5
4,5
7,5
5,5
1,5
5,5
2,5
5,5
3,5
5,5
4,5
5,5
5,5
5,5
6,5
5,5
7,5
6,5
1,5
6,5
2,5
6,5
3,5
6,5
4,5
6,5
5,5
6,5
6,5
6,5
7,5
7,5
1,5
7,5
2,5
7,5
3,5
7,5
4,5
7,5
5,5
7,5
6,5
7,5
7,5
S6
1,5
1,6
1,5
2,6
1,5
3,6
1,5
4,6
1,5
5,6
1,5
6,6
1,5
7,6
2,5
1,6
2,5
2,6
2,5
3,6
2,5
4,6
2,5
5,6
2,5
6,6
2,5
7,6
3,5
1,6
3,5
2,6
3,5
3,6
3,5
4,6
3,5
5,6
3,5
6,6
3,5
7,6
4,5
1,6
4,5
2,6
4,5
3,6
4,5
4,6
4,5
5,6
4,5
6,6
4,5
7,6
5,5
1,6
5,5
2,6
5,5
3,6
5,5
4,6
5,5
5,6
5,5
6,6
5,5
7,6
6,5
1,6
6,5
2,6
6,5
3,6
6,5
4,6
6,5
5,6
6,5
6,6
6,5
7,6
7,5
1,6
7,5
2,6
7,5
3,6
7,5
4,6
7,5
5,6
7,5
6,6
7,5
7,6
S7
1,5
1,7
1,5
2,7
1,5
3,7
1,5
4,7
1,5
5,7
1,5
6,7
1,5
7,7
2,5
1,7
2,5
2,7
2,5
3,7
2,5
4,7
2,5
5,7
2,5
6,7
2,5
7,7
3,5
1,7
3,5
2,7
3,5
3,7
3,5
4,7
3,5
5,7
3,5
6,7
3,5
7,7
4,5
1,7
4,5
2,7
4,5
3,7
4,5
4,7
4,5
5,7
4,5
6,7
4,5
7,7
5,5
1,7
5,5
2,7
5,5
3,7
5,5
4,7
5,5
5,7
5,5
6,7
5,5
7,7
6,5
1,7
6,5
2,7
6,5
3,7
6,5
4,7
6,5
5,7
6,5
6,7
6,5
7,7
7,5
1,7
7,5
2,7
7,5
3,7
7,5
4,7
7,5
5,7
7,5
6,7
7,5
7,7
Q6
S1
1,6
1,1
1,6
2,1
1,6
3,1
1,6
4,1
1,6
5,1
1,6
6,1
1,6
7,1
2,6
1,1
2,6
2,1
2,6
3,1
2,6
4,1
2,6
5,1
2,6
6,1
2,6
7,1
3,6
1,1
3,6
2,1
3,6
3,1
3,6
4,1
3,6
5,1
3,6
6,1
3,6
7,1
4,6
1,1
4,6
2,1
4,6
3,1
4,6
4,1
4,6
5,1
4,6
6,1
4,6
7,1
5,6
1,1
5,6
2,1
5,6
3,1
5,6
4,1
5,6
5,1
5,6
6,1
5,6
7,1
6,6
1,1
6,6
2,1
6,6
3,1
6,6
4,1
6,6
5,1
6,6
6,1
6,6
7,1
7,6
1,1
7,6
2,1
7,6
3,1
7,6
4,1
7,6
5,1
7,6
6,1
7,6
7,1
S2
1,6
1,2
1,6
2,2
1,6
3,2
1,6
4,2
1,6
5,2
1,6
6,2
1,6
7,2
2,6
1,2
2,6
2,2
2,6
3,2
2,6
4,2
2,6
5,2
2,6
6,2
2,6
7,2
3,6
1,2
3,6
2,2
3,6
3,2
3,6
4,2
3,6
5,2
3,6
6,2
3,6
7,2
4,6
1,2
4,6
2,2
4,6
3,2
4,6
4,2
4,6
5,2
4,6
6,2
4,6
7,2
5,6
1,2
5,6
2,2
5,6
3,2
5,6
4,2
5,6
5,2
5,6
6,2
5,6
7,2
6,6
1,2
6,6
2,2
6,6
3,2
6,6
4,2
6,6
5,2
6,6
6,2
6,6
7,2
7,6
1,2
7,6
2,2
7,6
3,2
7,6
4,2
7,6
5,2
7,6
6,2
7,6
7,2
S3
1,6
1,3
1,6
2,3
1,6
3,3
1,6
4,3
1,6
5,3
1,6
6,3
1,6
7,3
2,6
1,3
2,6
2,3
2,6
3,3
2,6
4,3
2,6
5,3
2,6
6,3
2,6
7,3
3,6
1,3
3,6
2,3
3,6
3,3
3,6
4,3
3,6
5,3
3,6
6,3
3,6
7,3
4,6
1,3
4,6
2,3
4,6
3,3
4,6
4,3
4,6
5,3
4,6
6,3
4,6
7,3
5,6
1,3
5,6
2,3
5,6
3,3
5,6
4,3
5,6
5,3
5,6
6,3
5,6
7,3
6,6
1,3
6,6
2,3
6,6
3,3
6,6
4,3
6,6
5,3
6,6
6,3
6,6
7,3
7,6
1,3
7,6
2,3
7,6
3,3
7,6
4,3
7,6
5,3
7,6
6,3
7,6
7,3
S4
1,6
1,4
1,6
2,4
1,6
3,4
1,6
4,4
1,6
5,4
1,6
6,4
1,6
7,4
2,6
1,4
2,6
2,4
2,6
3,4
2,6
4,4
2,6
5,4
2,6
6,4
2,6
7,4
3,6
1,4
3,6
2,4
3,6
3,4
3,6
4,4
3,6
5,4
3,6
6,4
3,6
7,4
4,6
1,4
4,6
2,4
4,6
3,4
4,6
4,4
4,6
5,4
4,6
6,4
4,6
7,4
5,6
1,4
5,6
2,4
5,6
3,4
5,6
4,4
5,6
5,4
5,6
6,4
5,6
7,4
6,6
1,4
6,6
2,4
6,6
3,4
6,6
4,4
6,6
5,4
6,6
6,4
6,6
7,4
7,6
1,4
7,6
2,4
7,6
3,4
7,6
4,4
7,6
5,4
7,6
6,4
7,6
7,4
S5
1,6
1,5
1,6
2,5
1,6
3,5
1,6
4,5
1,6
5,5
1,6
6,5
1,6
7,5
2,6
1,5
2,6
2,5
2,6
3,5
2,6
4,5
2,6
5,5
2,6
6,5
2,6
7,5
3,6
1,5
3,6
2,5
3,6
3,5
3,6
4,5
3,6
5,5
3,6
6,5
3,6
7,5
4,6
1,5
4,6
2,5
4,6
3,5
4,6
4,5
4,6
5,5
4,6
6,5
4,6
7,5
5,6
1,5
5,6
2,5
5,6
3,5
5,6
4,5
5,6
5,5
5,6
6,5
5,6
7,5
6,6
1,5
6,6
2,5
6,6
3,5
6,6
4,5
6,6
5,5
6,6
6,5
6,6
7,5
7,6
1,5
7,6
2,5
7,6
3,5
7,6
4,5
7,6
5,5
7,6
6,5
7,6
7,5
S6
1,6
1,6
1,6
2,6
1,6
3,6
1,6
4,6
1,6
5,6
1,6
6,6
1,6
7,6
2,6
1,6
2,6
2,6
2,6
3,6
2,6
4,6
2,6
5,6
2,6
6,6
2,6
7,6
3,6
1,6
3,6
2,6
3,6
3,6
3,6
4,6
3,6
5,6
3,6
6,6
3,6
7,6
4,6
1,6
4,6
2,6
4,6
3,6
4,6
4,6
4,6
5,6
4,6
6,6
4,6
7,6
5,6
1,6
5,6
2,6
5,6
3,6
5,6
4,6
5,6
5,6
5,6
6,6
5,6
7,6
6,6
1,6
6,6
2,6
6,6
3,6
6,6
4,6
6,6
5,6
6,6
6,6
6,6
7,6
7,6
1,6
7,6
2,6
7,6
3,6
7,6
4,6
7,6
5,6
7,6
6,6
7,6
7,6
S7
1,6
1,7
1,6
2,7
1,6
3,7
1,6
4,7
1,6
5,7
1,6
6,7
1,6
7,7
2,6
1,7
2,6
2,7
2,6
3,7
2,6
4,7
2,6
5,7
2,6
6,7
2,6
7,7
3,6
1,7
3,6
2,7
3,6
3,7
3,6
4,7
3,6
5,7
3,6
6,7
3,6
7,7
4,6
1,7
4,6
2,7
4,6
3,7
4,6
4,7
4,6
5,7
4,6
6,7
4,6
7,7
5,6
1,7
5,6
2,7
5,6
3,7
5,6
4,7
5,6
5,7
5,6
6,7
5,6
7,7
6,6
1,7
6,6
2,7
6,6
3,7
6,6
4,7
6,6
5,7
6,6
6,7
6,6
7,7
7,6
1,7
7,6
2,7
7,6
3,7
7,6
4,7
7,6
5,7
7,6
6,7
7,6
7,7
Q7
S1
1,7
1,1
1,7
2,1
1,7
3,1
1,7
4,1
1,7
5,1
1,7
6,1
1,7
7,1
2,7
1,1
2,7
2,1
2,7
3,1
2,7
4,1
2,7
5,1
2,7
6,1
2,7
7,1
3,7
1,1
3,7
2,1
3,7
3,1
3,7
4,1
3,7
5,1
3,7
6,1
3,7
7,1
4,7
1,1
4,7
2,1
4,7
3,1
4,7
4,1
4,7
5,1
4,7
6,1
4,7
7,1
5,7
1,1
5,7
2,1
5,7
3,1
5,7
4,1
5,7
5,1
5,7
6,1
5,7
7,1
6,7
1,1
6,7
2,1
6,7
3,1
6,7
4,1
6,7
5,1
6,7
6,1
6,7
7,1
7,7
1,1
7,7
2,1
7,7
3,1
7,7
4,1
7,7
5,1
7,7
6,1
7,7
7,1
S2
1,7
1,2
1,7
2,2
1,7
3,2
1,7
4,2
1,7
5,2
1,7
6,2
1,7
7,2
2,7
1,2
2,7
2,2
2,7
3,2
2,7
4,2
2,7
5,2
2,7
6,2
2,7
7,2
3,7
1,2
3,7
2,2
3,7
3,2
3,7
4,2
3,7
5,2
3,7
6,2
3,7
7,2
4,7
1,2
4,7
2,2
4,7
3,2
4,7
4,2
4,7
5,2
4,7
6,2
4,7
7,2
5,7
1,2
5,7
2,2
5,7
3,2
5,7
4,2
5,7
5,2
5,7
6,2
5,7
7,2
6,7
1,2
6,7
2,2
6,7
3,2
6,7
4,2
6,7
5,2
6,7
6,2
6,7
7,2
7,7
1,2
7,7
2,2
7,7
3,2
7,7
4,2
7,7
5,2
7,7
6,2
7,7
7,2
S3
1,7
1,3
1,7
2,3
1,7
3,3
1,7
4,3
1,7
5,3
1,7
6,3
1,7
7,3
2,7
1,3
2,7
2,3
2,7
3,3
2,7
4,3
2,7
5,3
2,7
6,3
2,7
7,3
3,7
1,3
3,7
2,3
3,7
3,3
3,7
4,3
3,7
5,3
3,7
6,3
3,7
7,3
4,7
1,3
4,7
2,3
4,7
3,3
4,7
4,3
4,7
5,3
4,7
6,3
4,7
7,3
5,7
1,3
5,7
2,3
5,7
3,3
5,7
4,3
5,7
5,3
5,7
6,3
5,7
7,3
6,7
1,3
6,7
2,3
6,7
3,3
6,7
4,3
6,7
5,3
6,7
6,3
6,7
7,3
7,7
1,3
7,7
2,3
7,7
3,3
7,7
4,3
7,7
5,3
7,7
6,3
7,7
7,3
S4
1,7
1,4
1,7
2,4
1,7
3,4
1,7
4,4
1,7
5,4
1,7
6,4
1,7
7,4
2,7
1,4
2,7
2,4
2,7
3,4
2,7
4,4
2,7
5,4
2,7
6,4
2,7
7,4
3,7
1,4
3,7
2,4
3,7
3,4
3,7
4,4
3,7
5,4
3,7
6,4
3,7
7,4
4,7
1,4
4,7
2,4
4,7
3,4
4,7
4,4
4,7
5,4
4,7
6,4
4,7
7,4
5,7
1,4
5,7
2,4
5,7
3,4
5,7
4,4
5,7
5,4
5,7
6,4
5,7
7,4
6,7
1,4
6,7
2,4
6,7
3,4
6,7
4,4
6,7
5,4
6,7
6,4
6,7
7,4
7,7
1,4
7,7
2,4
7,7
3,4
7,7
4,4
7,7
5,4
7,7
6,4
7,7
7,4
S5
1,7
1,5
1,7
2,5
1,7
3,5
1,7
4,5
1,7
5,5
1,7
6,5
1,7
7,5
2,7
1,5
2,7
2,5
2,7
3,5
2,7
4,5
2,7
5,5
2,7
6,5
2,7
7,5
3,7
1,5
3,7
2,5
3,7
3,5
3,7
4,5
3,7
5,5
3,7
6,5
3,7
7,5
4,7
1,5
4,7
2,5
4,7
3,5
4,7
4,5
4,7
5,5
4,7
6,5
4,7
7,5
5,7
1,5
5,7
2,5
5,7
3,5
5,7
4,5
5,7
5,5
5,7
6,5
5,7
7,5
6,7
1,5
6,7
2,5
6,7
3,5
6,7
4,5
6,7
5,5
6,7
6,5
6,7
7,5
7,7
1,5
7,7
2,5
7,7
3,5
7,7
4,5
7,7
5,5
7,7
6,5
7,7
7,5
S6
1,7
1,6
1,7
2,6
1,7
3,6
1,7
4,6
1,7
5,6
1,7
6,6
1,7
7,6
2,7
1,6
2,7
2,6
2,7
3,6
2,7
4,6
2,7
5,6
2,7
6,6
2,7
7,6
3,7
1,6
3,7
2,6
3,7
3,6
3,7
4,6
3,7
5,6
3,7
6,6
3,7
7,6
4,7
1,6
4,7
2,6
4,7
3,6
4,7
4,6
4,7
5,6
4,7
6,6
4,7
7,6
5,7
1,6
5,7
2,6
5,7
3,6
5,7
4,6
5,7
5,6
5,7
6,6
5,7
7,6
6,7
1,6
6,7
2,6
6,7
3,6
6,7
4,6
6,7
5,6
6,7
6,6
6,7
7,6
7,7
1,6
7,7
2,6
7,7
3,6
7,7
4,6
7,7
5,6
7,7
6,6
7,7
7,6
S7
1,7
1,7
1,7
2,7
1,7
3,7
1,7
4,7
1,7
5,7
1,7
6,7
1,7
7,7
2,7
1,7
2,7
2,7
2,7
3,7
2,7
4,7
2,7
5,7
2,7
6,7
2,7
7,7
3,7
1,7
3,7
2,7
3,7
3,7
3,7
4,7
3,7
5,7
3,7
6,7
3,7
7,7
4,7
1,7
4,7
2,7
4,7
3,7
4,7
4,7
4,7
5,7
4,7
6,7
4,7
7,7
5,7
1,7
5,7
2,7
5,7
3,7
5,7
4,7
5,7
5,7
5,7
6,7
5,7
7,7
6,7
1,7
6,7
2,7
6,7
3,7
6,7
4,7
6,7
5,7
6,7
6,7
6,7
7,7
7,7
1,7
7,7
2,7
7,7
3,7
7,7
4,7
7,7
5,7
7,7
6,7
7,7
7,7
The upper pair of numbers are the quadrant X,Y coordinates.
The lower pair of numbers are the sector X,Y coordinates.
In the game, objects are represented thusly on the long-range scanner ("galaxy display"):
1st number = number of aliens in quadrant
2nd number = number of space stations in quadrant
3rd number = number of stars in quadrant
In the game, objects are represented thusly on the short-range scanner:
<O> = position of your ship
+++ = position of enemy ship (alien)
H = position of space station
* = position of star
These issues are known, under Ami/WinArcadia 34.01, at least. The reasons for these issues have not yet been investigated.
For the PIPBUG version only:
The energy display can be incorrect (eg. "08VU", "15\\", etc.).
When firing phasors, the user input prompts are not shown.
For the BINBUG versions only:
The galaxy display is prepended with junk.
Commands are:
0: Move (specify a direction ("course") and distance ("warp factor") in sectors)
1: Short range scan & status
2: Long range scan ("galaxy display")
3: Transfer energy to shield ("shield energy transfer")
4: Fire phasor (specify energy)
5: Fire torpedo (specify direction)
Directions are:
06 | 05 | 04 | 03 | 02 |
07 | 01 | |||
08 | 00 | |||
09 | 15 | |||
10 | 11 | 12 | 13 | 14 |
Game variables are as follows. All are numbers in ASCII format ('0'..'9') (eg. the value 1234 is represented as $31 $32 $33 $34):
Address(es) | Description | Range |
$60C..$60D | stardate (ie. time remaining) | 00..99 |
$62B | quadrant X | 1..7 |
$62D | quadrant Y | 1..7 |
$63A | sector X | 1..7 |
$63C | sector Y | 1..7 |
$649..$64C | energy | 0000..9999 |
$659 | torpedos | 0..9 |
$666..$669 | shields | 0000..9999 |
$917..$947 | aliens in each of the 49 quadrants | 0..9 |
$948..$978 | space stations in each of the 49 quadrants | 0..9 |
$979..$9A9 | stars in each of the 49 quadrants | 0..9 |
Binary Floating Point Routines (Application Note AS57):
The program's prompt is corrupt (maybe the emulated teletype is not ready
for it).
Each pair of hex digits is not shown until it has been completely input.
The spaces around operators are added automatically by the program rather
than by the user.
The start address determines the rounding mode, as follows:
G6A6 will run with rounding.
G6AA will run without rounding.
Give 8 hex digits, then an operator, then another 8 hex digits, then =
Supported operators are +, -, * and : (which is division).
Biorhythm:
Dates are expected to be in dd/mm/yy format.
Invalid dates will cause the program to hang.
Bit Echo:
Prints flashing garbage after each letter, for some reason.
Cricket:
Doesn't randomize very well, for some reason.
DG640 Driver:
To get the flashing cursor, you need PIPBUG (not BINBUG).
ETI-685 Memory Tester:
This expects BINBUG 6.1. It is used as follows:
G440
where 1. At the "PLAYER 1-" prompt:
2. For each additional player you want to add:
3. Press ENTER to begin.
4. For each player:
5. Watch the race and then press ENTER.
6. Go to 4.
This program requires extra hardware (eg. various motors), which is not
emulated by Ami/WinPIPBUG. Although it will load and run, it will
not do anything useful on the emulators, and, intentionally, does not
produce output on the screen. Also, it expects a data table (starting at
!6000), which is not present.
"When called, the program will wait until you enter any character. It will
then generate a random number between 1 and 99, which you must guess.
Starting address is $0440."
Enter source address (2 hex digits).
Here is the map:
Rooms 1 and E are connected.
"Life is a matrix game concerned with the life, death and birth of cells.
Imagine each cell to be in a two-dimensional linear matrix, such that each
cell location has eight possible neighbours, as shown:
The rules of cell life, death and birth are as follows:
1. A live cell will survive if it has two or three live neighbours.
To work with practical terminals the program operates with a limited size
matrix, but makes it effectively "infinite" by having "wrap around" from
side to side and from top to bottom.
and then switch to the appropriate baud rate (110 or 300 baud). Then
type a U for 110 baud operation, or a Y for 300 baud operation.
..O. GENERATION 2
.OO. GENERATION 3
.OO. GENERATION 4
.OO. GENERATION 5
One of the most interesting and simple patterns has been named the
"Glider". The seed for this is shown below:
If you are running Life at 1200 baud, it is better to use the autoprint
version, which prints out after every generation, and stops automatically
when the pattern stabilises.
For 110 baud, you just need to press U, as documented.
$C00..$C59: baud rate initialization routine?
LIFECOUT has the following side effects when called:
LIFECHIN has the following side effects when called:
This program requires extra hardware, eg. light pen, which is not
supported by Ami/WinPIPBUG. Although it will load and run, it will
not do anything useful on the emulators, and, apparently intentionally,
does not produce output on the screen.
F = Fuel (out of 40)
The * is a graphical indicator of your distance from the surface.
The pseudocode is:
Your burn will not take effect until the turn after you make it.
You need to use Ctrl-L instead of ENTER after each line of input.
"This program provides the functions of a simple, 3-function calculator.
It will multiply, add or subtract two single digit decimal numbers. Normal
plus, minus and equals signs are used, with an asterisk symbol for
multiplication. Starts at $0440."
Note that the listing is self-contradictory (the
machine code bytes do not match the assembly source code).
SUBT:
MULT: // $48E
SUB1:
ZEND:
You use the program as follows:
where <loops> is "01".."7F". ("80".."$FF" give infinite tests.)
Eg.:
If there is no resulting output other than linefeeds (just goes back to
the "*" prompt), this indicates success.
Z or S mean that cleared (zeroed) memory did not read back as $00.
The address of the error then follows the error code.
"Upon being called, this program will give a prompt character, and await a
command character. Commands:
T allows a message to be entered
In text input mode, the DEL character acts as a destructive
backspace for correcting errors. To return to command mode, type an Esc.
Due to its length, this has now been split off into a
separate document.
Note that this is *not* byte-for-byte identical to the official PIPBUG release
of MicroWorld BASIC, as evidenced by the fact that eg. the official BINBUG
patch (aka "personality module") for it will not work. The available dump
was originally for PIPBUG, then was ported to PHUNSY, then was ported back to
PIPBUG.
You must type 6 consecutive hex digits. These are not echoed to the
screen (except that Ami/WinArcadia do this for you). The first 4
digits are the starting address (including any leading zeroes) and the
last 2 digits are the least significant byte of the ending address (the
most significant byte is always the same as that of the starting address).
Eg.:
will disassemble $440..$4FF.
To disassemble another region, type:
at the command prompt ("*"). If you get another "*", retry; otherwise,
now enter a new 6-digit address range.
"The "Music" program occupies locations $4A0 to $5D3, and uses PIPBUG
routines. It contains absolute addresses, and is not easily relocated. The
music is generated at the flag output of the 2650, and some form of audio
transducer is required. This can simply be an audio amplifier and speaker,
connected via a suitable attenuator, to the buffered flag output of the
CPU.
The last two parameters are optional. If they are not given, the program
will use the previous values. Thus, to play "Yankee Doodle", type:
and for "Bach", type:
These print garbage while playing, for some reason.
For the purposes of the above table, each "octave" is assumed to begin at
E.
"The game of Nim: starting with 23 you and the program take turns at
subtracting a number from 1 to 3. The one that leaves 1 after their move
wins. Starting address is $0440."
The ! prompt means to hit ENTER (it presumably uses this user-dependant
delay for randomization).
The original published version has a bug at $505 ($00 should be $0C).
There is a fixed version in the Games Pack.
This program needs the starting time to be poked into memory and registers
before execution.
Pause the machine and then set the time like this before starting at $500:
When the time reaches 13:00, it will reset back to 01:00
(ie. it is a 12-hour rather than a 24-hour clock).
Input must be in Y,X (row,col) format.
Of course, the provided binaries do nothing (ie. do not "work") by
themselves, as they are only subroutines. See the relevant magazine
articles for more information about how to use them in your own programs.
You have to react when the cursor is in the leftmost column.
Enter source address (4 hex digits).
"The computer generates a 4*4 array of the first 16 letters of the
alphabet, arranged in a random order. The object of the game is to
rearrange the array into the following form:
The array can only be rearranged by rotating [2*2] blocks of four letters
clockwise. The block to be rotated is specified by the letter in its top
left hand corner. It is invalid to try to rotate by calling letters on
either the bottom row or the right hand column of the array.
and the computer will respond with "PRESS ANY KEY". Once this has been
done, a random pattern will be generated and printed, and the prompt
message "ROTATE:" given.
PRESS ANY KEY
OJMD
ROTATE: F
OJMD
ROTATE: N
OJMD
ROTATE: N
OJMD
ROTATE: F
OJMD
ROTATE: EXCHANGE: L,M
OJLD
ROTATE: P
OJLD
ROTATE: M
OJLD
ROTATE: CANCEL
OJLD
ROTATE: G
OJLD
ROTATE: YOU TOOK 07 MOVES If you wish to rotate a particular block, type the letter in the top left
hand corner of that block. If you wish to cancel a move, type carriage
return, and the program will respond with "CANCEL", and then reprint the
last but one block.
This program does not echo your input to the screen.
This game expects a display with more than 16 rows.
The objective is to reach the end configuration shown below in as few
moves as possible, by shooting stars. Each move consists of a digit 1-9
corresponding to the position of the star to shoot:
The only valid first move is 5. Shots have these results:
. means the star becomes a dot
This program uses cycle counting techniques. Under Ami/WinArcadia 8.41,
it appears to run too fast (ie. the "game" time goes faster
than the emulator time).
This program expects extra input (eg. various sensors) and output (eg.
pitch and roll indicators) hardware, which is not supported by
Ami/WinPIPBUG. (The LED display, used for output of heading data, is
supported.) Although it will load and run, it will not do anything useful
on the emulators, and, intentionally, does not produce output on the main
screen (only via the LED display).
This machine is a "microprocessor development board" aka "trainer".
MON, RST and ENT NXT are white on orange. All other keys are white on
blue. There are no paddles.
Each of the 8 digits is divided into 8 segments, as shown:
+0+ The + don't really exist, therefore it is really like this:
5 1
+6+ 0
4 2 5 1
+3+ 7 6
4 2
3 7
Eg. the bottom segment is controlled by bit 3 (so, $08 would set it, $00
would clear it).
The display is controllable at the segment level (ie. you can get 256
combinations) via direct hardware access (ie. bypassing USE BIOS functions
and using the WRTE instruction), using the bit numbers listed above.
In NON-EXTENDED I/O mode:
REDD,rn to read from the toggle switches
In EXTENDED I/O mode:
REDE,rn $07 to read from the toggle switches
In MEMORY MAPPED I/O mode:
LODA,rn $0FFF to read from the toggle switches
"It appears to be on all the time. It is on in monitor
mode, during stepping, and remains on at breakpoints. It will turn off
after the processor executes a HALT ($40) instruction. It won't turn
back on again until you hit MON, RST, in that order. You can't just
break back into monitor mode after hitting a HALT instruction. Hitting
MON, RST somehow brings the machine back to life and into monitor mode;
otherwise the machine is dark." - Tyler Whitney.
When an interrupt is generated/received, the Instructor 50
writes $07 or $87 to the data bus, depending on the position of the
DIRECT/INDIRECT INTERRUPT switch. Then it does a ZBSR $07 or ZBSR *$07, as
appropriate.
"A.C. LINE" (ie. 50Hz) or
The cassette subsystem is somewhat like that of the Elektor TV Games
Computer, but uses 6 pulses for a "0" and 3 pulses for a "1", except that
3 extra pulses are appended to the last bit of each byte (giving 6+3=9
pulses for a "0" or 3+3=6 pulses for a "1").
USE is an acronym for "User System Executive".
"When in Monitor mode, pressing anything on the hex keypad generates
Error 2 on the real machine. On the control keypad, you can hit most keys
with impunity. Hitting STEP while in monitor mode generates Error 9 on the
real machine." - Tyler Whitney.
The USRDSP (USeR DiSPlay) command is used as follows:
R0: Return code.
Note the trailing dots for "b." and "d.".
Beat the Odds:
You can make a bet on any of the following results:
Note that in the table above, the bet "6..8 lamps lit" is listed twice, with different odds. This is authentic to the original Signetics documentation.
This game is intended to be played by multiple humans using real money.
One player would act as the "house" (ie. banker/dealer) and call for bets, take and record wagers, operate the computer, and pay winners according to the above odds.
The computer is used merely as a randomizer. There is no logic in the game for showing odds, taking bets, ascertaining winners, paying winners, etc.
Dice with Display:
The rightmost parallel I/O switch (bit 0) needs to be on, otherwise
the 7-segment LED digit area of the display will never change.
Game of Memories:
This is a Game of Life according to the rules from John
Horton Conway. It was written for the Ami/WinInstructor emulator.
The particularity of Game of Memories is that the field for the Game of Life is laid out
in a 16*16 byte grid storage area that the emulator can graphically represent and so the view can be resembled - whereby the
name of the program: Game of Memories.
When the progam is loaded into WinArcadia, the field is still not seen.
"Tools|Memory editor..." must be invoked. The field is in the memory bank
$0E00..$0EFF. You should set "Region" to that memory region, and "View as" to "Characters".
The original listing has an error in byte $125:
which causes an infinite loop. It should instead be:
The version in the Games Pack incorporates this fix.
Train:
Train components are:
The resident (non-overlay) part of SDOS contains:
TWIN stands for Test Ware Instrument.
The master CPU runs DOS and handles all I/O (keyboard, CRT, floppies, etc.).
The slave CPU merely runs programs in its own memory, and asks the master
to perform I/O for it via service requests (and, of course,
can access prototype hardware, depending on which mode is in use).
To switch from master to slave, the master just executes a HALT instruction.
To switch from slave to master, any master interrupt (but not slave
interrupt) can be used. Eg. timer/keyboard/etc. interrupts and Service
Requests.
The master CPU has 16 interrupt priority levels. Master CPU interrupt handlers start at $0000 of master RAM and go up by 2 per entry.
The slave CPU has 8 interrupt priority levels. Slave CPU interrupt handlers start at $0000 of slave RAM and go up by 2 per entry.
Interrupt priorities 1 and 3 are used for master and slave RAM parity errors, respectively.
Lower priority numbers represent "higher" (more important) priorities.
Note that, in MOD headers, the destination base address specified by the Set Base
command start is always as viewed from the master CPU, even when loading
into slave RAM (as the loading as always done by the master CPU).
Errata: On page 1-17 of the Tektronix 8002A Service Manual, ITD should be OTD. Thus, to read a sector the steps are:
1. Go RST mode. Check disk status.
SDOS supports these formats:
Here are the contents of the various "DOS areas" aka "bootblocks" (tracks 1..4) of the disks:
word_star_work_disk.img is only 311,296 bytes (missing the first track?).
TOS 1.0 asks for the current date and time on boot. If those are
entered, the timer is enabled.
DOS command filename and return code cross-reference (with no arguments supplied):
Most of these filenames are stored on disk with a prepended "@" (and are displayed by "LDIR ." with a prepended ".").
Parenthesized filenames mean the head is over that file at the end of the operation but it is not read from.
For reads:
For writes:
"Product: 2650 Single Board Computer
A typical configuration is:
$1000..$103F: "In the first CD2650 Newsletter, April 1978, Jeff Roloff
says: '...if you get hold of some slow RAM for use in the display section,
the first four characters will be illegible because of timing problems.'
If the RAM was fast enough for the rest of the display it would be fast
enough at the beginning. I suspect that he had problems with resetting his
counters which made the first character spaces too narrow. I remember
designing a frequency synthesiser with 74 series ICs where the downcounter
had to start resetting at count 3 to be ready at count 0!" - Richard
Rogers.
The layout of display RAM is unusual:
To access a given cell, the formula is:
where x is 0..79 and y is 0..15.
Characters $00..$3F use the 1st character generator PROM. They are the uppercase alphabetic characters, numeric characters and punctuation characters.
Red is non-chessmen ("lowercase") character set.
A period (.) indicates that the supervisor program is ready for a command.
A: Alter or display memory
B: Set a breakpoint address
The registers and memory can now be examined as you see fit. After
the breakpoint has been executed, it is cleared and the program will be
allowed to run past the point next time through.
C: Clear a breakpoint address
E: Execute a program
I: Inspect CPU registers
The microcomputer will then display the data that was in this register
just before the program returned to the supervisor. You now have three
options:
There are also the D, L, R and V commands, which are used for tape
operations.
The available scan of the supervisor is poor; the following bytes could
conceivably be wrong:
The following unnamed variables are used by the supervisor:
The WCHR routine masks its character to the $00..$3F range (ie. it
prints everything as uppercase).
Ideally, full autodocs for the supervisor (and for the BIOSes of the TVGC,
PIPBUG and the SI50) would be available, eg.:
WRAD:
The following are confirmed but unavailable:
If you know of any other software, or have dumps/tapes/listings of any of
the above software, please
8KBASIC.pgm:
To start a game: press R then ENTER.
In editor (at COMMAND prompt):
In BASIC (at OPTION prompt):
The interpreter doesn't like blank lines (gives ARG ERROR),
but an empty comment (* only) is acceptable.
A normal floating point variable is 8..22 bytes:
1 byte for type ($0x)
A floating point array is 4+ bytes:
1 byte for type ($4x)
A string is 5..274 bytes:
1 byte for type ($8x)
Here is a summary of the differences between V1.0 and V1.3 of 8K BASIC
(all values in hex):
The handwritten annotations on the listing are generally transcriptions of
the V1.3 changes.
Accurate PSL emulation (as provided by Ami/WinArcadia 33.91+) is needed
for the floating point subsystem to work correctly.
There is still one remaining problem to be investigated: using the ^
(power of) operator (eg. LET A=3^2) will cause a hang.
Numbers are stored using 1 exponent byte and 3 mantissa bytes, as follows:
Bit 31 is the sign of the exponent (0=positive, 1=negative).
Bit 23 is the sign of the mantissa (0=positive, 1=negative).
The integer part is obtained by right-shifting (halving) the mantissa, 23 - exponent times.
Int. digits: number of meaningful digits at left of integer part.
12KBASIC-A.aof, 12KBASIC-B.aof:
It obeys one-letter commands of the form Xn, where X tells it
what to do and n is the line number (or number of lines?).
It only needs line numbers as GOTO (and GOSUB, etc.) destinations.
12KBASIC-A.aof was probably typed in by me from the listing.
Need to compare with 12KBASIC-B, which may have been modified for PHUNSY
or PoP, as there are 982 differences (4%) between them.
ALP.bin:
Neither of these has been typed in by me from the listing.
Need to verify these dumps against the listing and compare with each
other. One or both may have been modified for PHUNSY or PoP, as there
are 831 differences (4%) between them.
AlphaChess.aof, CDChess.aof, Chess3.aof:
The chessboard is laid out as follows:
Moves are entered as source-destination. Eg. B1-A3.
AntennaComputer.bin:
This is a good dump, as regards the actual antenna
computer program. The accompanying BASIC interpreter is why it is marked
as a suspect dump. Overflows are very easy to generate, eg. attempting a
LOOP of 1000 MHz.
Backup.aof:
This program appears to be incomplete. Eg. execution flows
beyond the listing into $15C3, it expects a TAPe OUT subroutine at $15C7
and a CLear SCReen subroutine at $1602. There is probably another
unscanned page to this listing.
Bootstrap.aof:
Might be the same as the IPL; needs reinvestigation.
Chess3.aof:
This does not appear to have been correctly ported to the CD2650. Eg.
the KBIN function of the BIOS will echo the keystroke, but the game itself
also echoes the keystroke, resulting in double echoing.
Also note that it swallows (ignores) the first keypress after booting
(although it might use the timing of that keypress for randomization or
similar purposes).
DOS.aof:
Got a "NOT READY" error, presumably due to incomplete disk
emulation. Needs reinvestigation.
Editor/Assembler:
Commands are similar to the 12K BASIC editor, except:
G: goes to the supervisor
Hamurabi.aof:
You start with 100 men, 2800 bushels and 1000 acres. Turn phases are:
The random factors each turn are:
a. the value of land (17..22 bushels per acre, average 19.5);
In this version, there is no real scoring system nor game end (except with zero acres).
Input.aof:
This program is similar in purpose to TVTypewriter.aof except
that it supports both uppercase and lowercase I/O.
Life.aof:
Move around the screen with U/D/L/R for up/down/left/right.
Use O (not 0) to set cells (they will appear as small o characters or as
squares, depending on VDU setting) and the spacebar to clear them. To
begin the simulation, move (with D key) the cursor to the bottom row of
the screen. Never move the cursor above the top of the screen.
LunarLander.aof:
Here is the disassembly of the machine code routine:
MemoryTest.aof:
The provided dump tests the RAM at $2000..$7FFF. The
normal result of running this program is no output (ie. success). The byte
at $1512 is the high byte of the starting address. The low byte of the
starting address is always $00. The byte at $1513 is the high byte of the
(ending address + 1). The low byte of the ending address is always $FF.
Therefore, you must test $xx00..yyFF (a multiple of 256 bytes, aligned at
a 256-byte boundary). Eg. storing $80 at $1513 gives an ending address of
$7FFF, and storing $48 there would give an ending address of $47FF. Ie.
If you want to see error messages, you could change $1512 to $00 and $1513
to $80, to test $0000..$07FF (which is ROM and therefore fails the test).
Output will loop until a key is pressed. Memory is tested destructively.
Therefore, you must not test the $1510..$15A8 area, otherwise you will
overwrite the program. Contrary to what is stated in the instructions, the
are where the program is located ($1510..$15A8) is normal (ie. non-
display) user RAM, not display RAM.
MorseCode.aof:
This program lacks documentation. It might be originally
designed to be interactive rather than to use stored text.
NumbersGame.aof:
INT seems to round to the nearest integer, rather than
just dropping the fractional part. Therefore, "digits" range in value from
1..12.
Pattern.aof:
"The program has been typed into SCREENs 5 and 6. LOAD does
not work unless LIST has been used first." - Richard Rogers. To run this
program, type the following:
You can change the 123 to a different number; it controls the number of
blobs to write.
ScreenPrinter.aof:
This program refers to (external) printer routines at
$4000 and $4147.
TVTypewriter.aof:
This program seems to expect the address of KBIN to be
$309. However, the correct address is $30F. This change has been made to
the available dump. Also, the screen is filled with $00 ("@" symbol). This
may be authentic.
PHUNSY means [Frank] PHilipse UNiversal SYstem.
Banks are:
U0: RAM
To run a BASIC game (after loading it):
To make BASIC usable (after loading it):
To use the label program:
There are various versions of the PHUNSY monitor:
Control port (ie. WRTC operand):
IOAD is the WRTZV pointer: normally $7AB (SROUT)
SERIN waits for a key to be pressed, then returns it. Its pseudocode is:
CHINP returns a key if one is currently being pressed, otherwise it
returns $7F (DEL). Its pseudocode is:
KEYIN waits for a key to be pressed, then returns it. Its pseudocode is:
The 24-key keyboard is as follows:
which in the emulator is (by default):
Cas = Cassette
Output is 6 7-segment digits and 7 decimal points, as follows:
The first decimal point is always lit. The second to seventh are lit when IOPORT($13) is 1..6, respectively.
These PHUNSY BINs are compatible with Ami/WinPHUNSY:
50-THEME
These dumps are incompatible, problematic or otherwise unusable:
300-BAUD
The reasons are various, eg.:
the program is accessing unemulated hardware (eg. SER-I/O);
Translations of game names:
"Selbstbaucomputer" translates to "Self-built computer".
The subsystems of this system are:
The system could also be operated without any monitor!
With this mode, you enter your code with a binary address switch and
data switch in single step mode ;-)
You start at address $0.
After entering your program, you could run it at 1 Hz or 1 MHz, or
stay in single step mode.
From the games book (autotranslated from "At the beginning of all programs is the hardware used.
"Basic version" means: CPU, data and address input and output,
RAM memory and port module, without EPROM and without keyboard and
display unit. In these cases is the switch on the memory card in
Position "1" to bring so that the RAM area begins at address $0000.
If you have the keyboard and display unit use the switch
on the memory card in position "2" standing, so that the EPROM is at
the beginning of the addressing area.
Then you can use the data and address input and output units from
detach from the bus plate. You can but also leave them connected. In
the case need the data switch
There in position DAFLOT and the
Address switch Adr in position ADFLOT
standing, otherwise nothing works.
These two construction stages are of use to you
then if you have a program in
Single-STEP or single-CLOCK
clock through then the switch must
STEP-RUN on the keyboard in
stand in the STEP position so that the
seven-segment displays in case of her
activation not be overloaded.
You can then observe the program progress
on the data and observe address input and output."
The 24-key keyboard is as follows:
By default, these are mapped to the following host keys (on Ami/WinSelbstbaucomputer):
Diode colours are:
V0.9 BIOS functions:
Note that byte $673 of the V0.9 BIOS is not listed in the PDF. Its correct value has been ascertained to be $82.
V2.0 BIOS functions:
Monitor commands are:
Alter
These programs are contained in the "2650 Programme.pdf" book:
DecCalculation.aof:
The entire program is as follows:
GDEZ:
Dice.bin:
This shows the number in binary on the glow LEDs; ie:
DiceGame.bin:
The entire program is as follows:
SUMME:
RANDOM:
LottoNumbers.aof:
The entire program is as follows:
RANDOM:
$830 is the number that has just been drawn (1..49).
The randomizer constantly cycles through 1..49 and stops as soon as the Sense bit changes.
Morse Code Practice:
The data table is as follows:
Both versions support keypad input and LED output.
The 8 glow LEDs controlled by writing to the Control port (WRTC).
The 24-key keyboard is as follows:
BLANK = ?
By default, these are mapped to the following host keys (on Ami/WinMIKIT):
Stufenzaehler (Program 5):
The entire program is as follows:
Ein- und Aus-Schaltbare Blinklampe (Program 7):
The entire program is as follows:
Elektronischer Würfel (Program 8):
The entire program is as follows:
Reaktionzeittest (Program 12):
Press any key to begin.
Codiertes Schloss (Program 13):
You have to press three keys in succession within limited times.
MAME 0.277 compatibility table (non-pinball non-bootleg coin-ops only):
Conversion kits are:
OR = Original
These Zaccaria non-pinball coin-ops do not use a 2650 (all others do):
Coin-op originals of (presumably or explicitly) licenced ports to Arcadia-family consoles:
malzak.1 (containing tile imagery) is not accessible to the CPU,
nor is the teletext character imagery. Both are identical
between Malzak 1 and Malzak 2.
For Malzak 2, if *($14CC) is $00 (ie. test switch is at position 4), the
game will enter test mode when booting. When it enters test mode, it
clears the settings first.
Input devices are:
8-way digital joystick
Input bits are:
Bit 7: up (active high)
Maps of Malzak 1 and 2 are available in the Maps Pack at
http://amigan.yatho.com/maps.rar.
When you run out of fuel, your ship falls out of the sky, but your
exhaust continues to burn and does not fall. This is probably authentic.
In Astro Wars, the yellow sprites are meteors, not bullets; this
explains why they do not emanate from the enemy ships.
Extended I/O port $02 is multiplexed among four inputs. The games write
to extended I/O port $06 to control which input is selected. The input
ports are (all active low):
Here is how to run the latest version of Zaccaria Pinball (on Android
4.4+), with all tables. Unfortunately an internet connection is required
during play and there is only one ball (man/life) per game.
1. Go to https://d.apkpure.com/b/XAPK/hu.magicpixel.Zaccaria?versionCode=25
which will download Zaccaria Pinball_4.0.3_APKPure.apkx
(1,049,698,248 bytes).
2. Rename Zaccaria Pinball_4.0.3_APKPure.apkx
as Zaccaria Pinball_4.0.3_APKPure.zip
3. Extract this ZIP.
4. Make a new directory (folder):
Internal storage/Android/obb/hu.magicpixel.Zaccaria
5. Move main.25.hu.magicpixel.Zaccaria.obb
from wherever it was unZIPped to (typically Downloads), to
Internal storage/Android/obb/hu.magicpixel.Zaccaria
6. Install hu.magicpixel.Zaccaria.apk as normal (by clicking on it).
Here is how to emulate the Switch version of Zaccaria Pinball on 64-bit Windows 11 (at least), with all tables.
Unfortunately the emulator crashes a lot, so perhaps an alternative
emulator should be used instead (but Yuzu EA 4176 has similar issues).
1. Download the emulator + keys + firmware package:
Nintendo Switch Emulator ryujinx 1.1.1403 win x64.torrent
.
2. Extract ryujinx-1.1.1403-win_x64.rar to eg. C:\EMULATORS .
3. Extract prod.keys and title.keys from Prodkeys.net_v19.0.0.zip to
C:\Users\username\AppData\Roaming\Ryujinx\system
, replacing username with your username.
4. Make a directory C:\EMULATORS\ryujinx-1.1.1403-win_x64\BIOS
and extract all files from Firmware 19.0.0.zip to there.
5. Download Zaccaria Pinball [010092400A678000]+[v1.0.4+72DLC][US]_Patched.xci.rar (1,370,161,805 bytes)
from https://send.cm/u79fqcimms2j.
6. Make a directory C:\EMULATORS\ryujinx-1.1.1403-win_x64\GAMES
and extract
Zaccaria Pinball [010092400A678000]+[v1.0.4+72DLC][US](nsw2u)_Patched.xci
into it.
7. Click "Options|Settings...|User Interface|Game Directories|Add...",
choose C:\EMULATORS\ryujinx-1.1.1403-win_x64\GAMES and click OK.
8. Right-click the Zaccaria Pinball icon, click "Manage Title Updates",
click "Bundled: Version 1.0.4", click "Save".
9. Right-click the Zaccaria Pinball icon, click "Manage DLC",
click "Enable All", click "Save".
10. Double-click the Zaccaria Pinball icon to run the game.
Pull the plunger back and release to launch the ball.
Click the left or right side of the screen to operate the appropriate flipper.
Here is how to run the latest version of Zaccaria Pinball (on Windows
7/8/8.1/10/11), which otherwise would require Steam, without Digital
Restrictions Management (DRM) and with all tables:
1. Download Zaccaria_Pinball_v20220905_Steam_RiP from
https://filecrypt.cc/Container/066D918234.html .
2. Download Zaccaria_Pinball_v20220905_Cracks_Only from
https://filecrypt.cc/Container/C2CFA101D4.html .
3. Optionally, you can create a desktop shortcut as follows:
5. At this point, you may be able to run SmartSteamLoader.exe to launch
the game. If this does not work, undertake the below steps as necessary.
6. If you get errors about missing MSVCP100.dll and/or MSVCR100.dll files,
or error 0xc000007b, you need either of these (your choice):
7. If you get errors about missing OpenAL32.dll, you need OpenAL.
Links were valid as at January 2023. The support thread is at
https://cs.rin.ru/forum/viewtopic.php?f=10&t=72437&e=0.
If any links are no longer working, please advise; we have copies of all
files archived.
Pinball games using a 2650 and/or made by Zaccaria:
MAME: MAME 0.277.
1974-1977 games are electro-mechanical ("EM").
Multiplatform
* The 4.73 MHz (approx.) version of the Central Data 2650 operates at 1200 instead of 300 baud.
Speed = bytes per sector * sectors per track * revolutions per second.
Data is stored on the bottom (ie. non-label) side of a single-sided disk
(the read-write head of a single-sided drive is on the bottom).
Viewing the disk from below (ie. viewing the data side),
the disk spins clockwise (thus sectors are numbered anticlockwise).
.RAW files are raw disk files of 100K (102,400 bytes) (BINBUG) or 78.75K
(80,640 bytes) CD2650), lacking sector and block numbers.
BIOS/DOS command cross-reference:
Timing table:
Astro Wars and Lazarian, although they use PAL USGs (2621), have NTSC master clocks
(14,318,180 Hz ÷ 4 = 3,579,545 Hz and 14,318,000 Hz ÷ 4 = 3,579,500 Hz, respectively).
Addressing mode notation (for eg. LODx instruction):
Program Status Word (PSW) bits:
Directive cross-reference (exhaustive for IEEE-694 only):
Instruction cross-reference:
Notes:
F (Flag) column is also used for UF1 (User Flag #1) and UF2 (User Flag #2) bits on 2650B.
CALM uses @ for indirection, but emulator uses * (as @ is used for octal).
Colours used in the above table are:
Relative branches are calculated these from the next instruction,
ie. the IAR is incremented by 2 so it points to the start of the next
instruction, then the branch is calculated. Indirect branches are the same
as direct ones except that you must add $80 to the operand value.
Eg. if you found the bytes $C8 and $50 at addresses $0100 and $0101:
Four-digit decimal numbers can be implemented as follows.
Two decimal digits can be packed into each byte, one digit per nybble.
To add 1 to a four-digit decimal number, use the following code:
High byte, bits 7..4: thousands digit (%0000..%1001)
If your game is larger than 4K, you will need to be aware of the
following rules.
Execution of code cannot flow across page boundaries (wraparound will
occur instead).
because address $3800 will be written to instead of address $1800. But
you can do an indirect load/store to any address. Eg.
will work correctly (although unfortunately it is slower than a direct access).
Also, sometimes you can take advantage of mirroring to perform your work on the current page and
let the machine mirror it to the other pages. For example, the $3800 in
the example above is a mirror of $1800 on Emerson and Tele-Fever and therefore
would in fact work on those machines (but not on a Palladium).
The operand field (two bytes) for absolute non-branch instructions is as follows (for eg. LODA,reg opcode):
Absolute branch instructions (BCTA, BSTA, etc.) are not subject to this restriction
(since they use 15 rather than 13 bits for the address)
and therefore can perform direct (or indirect) branches to anywhere in the 32K memory map.
The effective address is decoded by a real 2650 after the decision is made
about whether a branch will be taken, not before. This is important
because "entering the indirect addressing sequence adds two cycles (6
clock periods) to the execution time of an instruction." The 2650 manual
seems to imply elsewhere that the effective address is calculated before
the instruction itself is executed. However, this has now been proven
to be wrong. The time penalty for indirection is applied only if the
branch is actually taken.
ANDI,Rn $FF
All set CC according to r0.
LODZ r0 (indeterminate!)
Both set CC according to r0.
Note that LODZ r0 can (and in fact does, on the particular real
Australian PAL Emerson Arcadia 2001 tested) have indeterminate side effects
(and therefore is not really equivalent to IORZ r0).
LODI,rn $FF
Both set rn to $FF and set CC to LT.
LODI,rn $0
ANDI,rn $0
Both set rn to $00 and set CC to EQ.
Electronics Australia:
Electronics Today International:
ETI-630 scan is missing because the available scan of ETI AU Dec '76 is missing pages 55-62.
Other magazines and non-projects:
CT750 was "adapted from a design described in Radio Electronics" (presumably sometime in Nov '75-May '77)
but this design has not been located.
* Eg. BA 127, BA 217, BA 218, BA 221, BA 222, BA 317, BA 318, BAX 13, BAY 61, 1N914, 1N4148.
Colours used in table are:
Disassemblers are not listed.
A yellow background behind the machine glyph means autosense is supported by the emulator for that machine and file format combination. These are the recommended file formats for everyday use:
Each block is as follows:
Files are normally terminated by a zero-length block. The load address of
this block is used as the start address of the game.
Eg. the following program:
would be encoded as follows:
For the 1st header:
For the 1st data:
For the 2nd header:
G440 1000 1FFF
Funny Farm Races:
Type in the name of the first player and press ENTER.
Press P. The machine will say "PLAYER 2-" (or whatever).
Type in the name of the player and then press ENTER.
The machine will ask "BET?".
For each bet you want to place:
a. Press Y and then press ENTER.
b. The machine will ask "DOG NO?".
c. Press the number (0..9) of your preferred dog and then press ENTER.
d. The machine will ask "HOW MUCH?".
Press N when this player has placed all their bets.
Furnace:
Guessing Game (machine code version):
STRT = $440 code
INPT = $493 code
PRNT = $4A6 code
MSAG = $4B1 dataHexCal aka HexCalc:
/ appears.
Enter destination address (2 hex digits).
= and result appears.
The first digit of each pair entered is not echoed to the display until the
second digit has been input.
Result is the relative offset (ie. the distance between the addresses). Eg.:
01/02=01
03/04=7F
05/05=00
20/30=10PAIR equ $45E
gosub CRLF;
for (r1 = 3; r1 >= 1; r1--)
{
PAIR = BINOUT();
COUT('/');
PAIR = (BINOUT() - PAIR) & $7F;
COUT('=');
BOUT(PAIR); // Byte output in hex
COUT(' ');
}
goto $3F00;
BINOUT: ;$46D
// Input two hex chars and output in hex
*($476) = BIN(); // Input two hex chars and form as byte
BOUT(*($476)); // Byte output in hex
return *($476);Hunt the Wumpus:
----0----
/ / \ \
--2---5---8---B--
/ | | | | \
(E)<---1---3---6---9---C---E--->(1)
\ | | | | /
--4---7---A---D--
\ \ / /
----F----
Room
0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
0
2
5
8
B
1
2
3
4
E
2
0
1
3
5
3
1
2
4
6
4
1
3
7
F
5
0
2
6
8
6
3
5
7
9
7
4
6
A
F
8
0
5
9
B
9
6
8
A
C
A
7
9
D
F
B
0
8
C
E
C
9
B
D
E
D
A
C
E
F
E
1
B
C
D
F
4
7
A
D
Life-MachineCode:
1 2 3
4 X 5
6 7 8
2. A live cell will die if it has less than two or more than three
live neighbours.
3. A birth in an empty cell will occur if it has exactly three live
neighbours.
4. Births and deaths take place simultaneously.
In our version of Life, live cells are represented by Os, and dead or
empty cells as blanks. The program starts with an initial pattern (fed in
by the player), and calculates the new patterns "generation by
generation".
The 32*16 versions are intended for use with the Low Cost VDU of EA
February and April 1978. The 32*24 versions are intended for terminals
such as the EME-1 VDU, described in the EA January and February 1977
issues.
To use the program, type:
GC00<CR>
The program will respond with the word "LIFE", followed by the prompt
character ":".
If you respond with "N", the program will expect a new matrix to be
supplied. The program will echo the N, followed by a carriage return and
line feed. A pattern may then be written in (or "seeded") by using the
space bar for blanks (these are printed as dots), Os for live cells, and
line feeds (LF) [Ctrl+J in Ami/WinArcadia] for new lines.
Blanks are not required on the right hand side of the pattern. Carriage
return (CR) will permit overwriting of a line, allowing error correction.
Once your pattern is complete, use LFs if necessary to advance to the
bottom of the matrix.
Once the pattern is completed, the program will reprint it, and give
the prompt sign again. If you now respond with a Gxx, $xx generations
will be evolved, with a printout after the last generation. G00 will
produce printout after 256 generations, while G01 will produce a
printout after only one generation. And so on...
Immediately after you have typed in this command, the program will
respond with a message such as <15S, to indicate that in less than 15
seconds it will print out the result of the Gxx instruction. After
printing the result the new generation count and prompt will appear at
the bottom left hand corner of the screen. This may overwrite live cells,
so try and keep your patterns in the centre of the screen (patterns to the
right will wrap around to the left).
The remaining instruction is P, which causes the program to print out
the existing matrix. The instruction is not used a great deal.
This is the result of a simple pattern. This stabilises after four
generations, and then continues forever unchanged:
..O. GENERATION 1
OOO.
....
.OO.
.O..
.OO.
.OO.
O..O
.OO.
O..O
.OO..O.
..O
OOO
Simply feed in a starting pattern (using the N command), and sit back
and watch. The program will continue until a stable pattern is achieved,
at which time it will stop. Note, however, that it cannot detect recurring
cyclical patterns, so watch out for these. To stop them, you will have to
use the reset facility of the 2650."
For 300 baud, you need to press U (not Y), then ENTER, contrary to the
documentation.
Then press N for a new field and set it up with Os and
spaces, using Ctrl-J repeatedly to move down.
$C26: LIFECRLF
$C39: LIFECOUT
$C5A: LIFECHIN
$C76..$EEC: Life game code
$EED..$F54: Life game variables
PSL: CC = eq;
PSL: primary register bank (r1..r3) is always selected
PSU: Flag pin is always set
r1 = *(DATABUS);
r0 = r6 = 0;
You should not call it when SP > 4 (you need one level of stack for
LIFECOUT's return address, another level for LIFEDELAY's return address,
and another level for LIFEDELAY_ALT's return address.
PSL: CC = gt;
PSL: primary register bank (r1..r3) is always selected
PSL: With Carry bit is always clear
r0 = r4 = return code (1..127)
r5 = r6 = 0;
You should not call it when SP > 4 (you need one level of stack for
LIFECHIN's return address, another level for LIFEDELAY's return address,
and another level for LIFEDELAY_ALT's return address.
Linearization (Linearisatie):
Lunar Lander (machine code version):
V = Velocity (- is down (towards surface), + is up (away from surface))
D = Distance from surface (- is underground, + is above ground)
B = Burn
You must give a 2-digit burn each turn.
Neither digit is displayed until both have been entered.
Lunar Lander (2650 Micro BASIC version):
input fuel (F), velocity (V), height (D)
V = -V; // convert velocity from "down" (towards) to "up" (away from)
for (;;)
{ do
{ print fuel (F), velocity (V), height (D)
W = D; // ceiling = height
input burn (T)
D += V; // move lander
F -= T; // deduct burn from fuel
if (D > 150) G=-2; // G is the
elif (D > 100) G=-3; // gravity factor
elif (D > 50) G=-4; // (stronger closer
elif (D < 50) G=-5; // to surface)
else
{ assert(D == 50);
G (gravity factor) is uninitialized and will retain its
value from the previous turn or game (or zero for first run).
}
V += T + G; // velocity += burn + gravity factor (applied next turn)
K = -D * 100; // depth of crater = height below ground * 100
} while (D > 0 && D <= W); // still above ground but at or below ceiling
if (D > W) escaped gravity, game over
elif (D < 0) new crater, game over
else
{ assert(D == 0);
if (V > 0) moving away, continue game
elif (V == 0) perfect, game over
elif (V > -5) not bad, game over
elif (V > -10) damage sustained, game over
elif (V < -10) lander destroyed, game over
else
{ assert(V == -10);
no message given, game over
(result should really be damage sustained or lander destroyed)
} } }
Any movement away from the moon will be considered to have escaped gravity,
regardless of how near you are to it and how much fuel you have.
The weight of your fuel is not taken into consideration by the game.
Gravity is taken into consideration but not in an accurate way.
A good landing must have a height of exactly zero and a velocity (for
next turn) towards the moon as small as possible.
An example of an easy perfect (if unrealistic) landing would be to start
with 6 (or more) units of fuel, velocity down of 1, height of 1, burn of 6.
The game changes your height to 1 to 0, and your velocity up from -1 to 0
(it adds the burn of 6 and the gravity factor of -5 to it).
Mastermind, Revised Mastermind:
Maths Demonstration:
STRT:
*(MOD) = ADDZ r3;
r3 = SUB1();
for (;;)
{ r0 = CHIN();
if (r0 == '+') goto PLUS;
elif (r0 == '-') goto SUBT;
elif (r0 == '*') goto MULT;
}
*(MOD) = SUBZ r3;
PLUS: // $45C
gosub COUT(r0); // print operation symbol ('+' or '-')
r2 = r3; // 1st argument
r3 = SUB1(); // 2nd argument
r0 = r2; // 1st argument
MOD:
r0 += r3, or r0 -= r3, depending on the desired operation
if (r0 < 0)
{ r0 = r3 - r2;
*(A1) = '-'; // store '-' as 1st character
r0 |= $30; // format for display
*(A2) = r0; // store r0 as 2nd character
} elif (r0 >= 10)
{ *(A1) = '1'; // store '1' as 1st character
r0 -= 10;
r0 |= $30; // format for display
*(A2) = r0; // store r0 as 2nd character
} else
{ r0 |= $30; // format for display
*(A1) = r0; // store as 1st character
r0 = NUL;
*(A2) = r0 [NUL]; // store as 2nd character
}
goto ZEND;
gosub COUT(r0); // print operation symbol ('*')
r2 = r3; // 1st argument
r3 = SUB1(); // 2nd argument
r0 = 0;
while (r2 != 0)
{ r0 += r3;
r2--;
}
while (r0 >= 10)
{ r0 -= 10;
r2++;
}
r2 |= $30; // format for display
*(A1) = r2;
r0 |= $30; // format for display
*(A2) = r0;
goto ZEND;
do
{ r0 = CHIN();
clear With Carry and COMpare bits
} while (r0 < '0' || r0 > '9');
r3 = r0;
gosub COUT(r0);
r3 &= $0F; // remove display formatting
return r3;
r1 = 0;
while (*(MSAG + ++r1) != 0)
{ COUT(r0);
}
gosub CRLF;
goto STRT;Memory Test:
G48F <start-address> <end-address> <loops>
G48F 0500 3FFF 7F
Errors are as follows:
W means that a single bit of memory (eg. $10) did not read back
correctly.
L means that set memory did not read back as $FF.
Message Editor:
C allows a stored message to be checked
R allows it to be repeated until the CPU is reset
If the message being stored is too long for the buffer, an F will be
displayed. Starts at $0440."
MicroByte Adventure:
MicroWorld BASIC:
The first command you should issue is OLD. Then you can RUN or LIST the
program.
Mini-Disassembler:
0440FF
Note that the mnemonics used are not always standard Signetics. Eg.:
HLT = HALT
LPU = LPSU
LPL = LPSL
PPU = PPSU
PPL = PPSLG440
There are bugs in the published program listing, causing incorrect
disassembly of some instructions. There is a fixed version in the
Enhancements Pack.
There is also the following unfixed bug: Some situations (eg. 3-byte
instruction at $1FE..$200 when range
argument was "0100FF") result in the mini-disassembler not detecting the
end of the range and instead wrapping back around.
Music:
Monotonic musical notes are generated by pulsing the flag output at
suitable rates, with the program "reading" the music from a section of
memory. The timing of the music is determined by a time value called
"UNIT", which is an even number of up to 15 bits, such that $5160 is about
1/32 of a second.
Each note is specified by two bytes. The first byte represents the
number of UNITs that the note will last: $01 gives a duration of 1 UNIT,
while $00 gives 256 UNITs, or 8 seconds with a UNIT value of $5160.
The second byte is split into three fields. The most significant bit,
bit 7, indicates either a note (%0) or a rest (%1). The next three bits,
bits 4, 5 and 6, specify the octave. %111 represents the top octave, while
%000 represents the lowest. In practice, the three lowest octaves are not
usable, giving a range of only five octaves.
The remaining four bits in the second byte represent the note within the
octave. The first note in any octave is E, represented by $0, while the
last note is D# (D sharp), represented by $B.
For rests, bits 6 to 0 are not used, so all rests become $80.
It is best to start and end all programs (tunes!) with $80 $80, a long
rest, to separate the music from the noises PIPBUG makes while
communicating with the terminal. To signify the end of a tune, insert $02
$FF after the long rest.
"Yankee Doodle" occupies locations $5D4 to $6B7, and requires a unit
value of $2800, while "Bach" occupies locations $6B8 to $7A3, and requires
a unit value of $7000.
To run the program, type:
G58C [<address of first note>] [<value of UNIT>] <CR>
G58C 5D4 2800<CR>
G58C 6B8 7000<CR>
"
Note
Very low
Low
Middle
High
Very high
E
$30
$40
$50
$60
$70
F
$31
$41
$51
$61
$71
F#/Gb
$32
$42
$52
$62
$72
G
$33
$43
$53
$63
$73
G#/Ab
$34
$44
$54
$64
$74
A
$35
$45
$55
$65
$75
A#/Bb
$36
$46
$56
$66
$76
B
$37
$47
$57
$67
$77
C
$38
$48
$58
$68
$78
C#/Db
$39
$49
$59
$69
$79
D
$3A
$4A
$5A
$6A
$7A
D#/Eb
$3B
$4B
$5B
$6B
$7B
Rest
$80
$80
$80
$80
$80
Note that there is a short delay for Yankee Doodle, and a long delay for
Bach, before they actually begin to play the song.
Nim:
The winning strategy is as follows:
You will have a turn where there are 6..8 widgets. Taking 1..3 widgets
accordingly on this turn will leave 5 widgets.
The computer must then take 1..3 widgets, leaving 2..4 widgets.
You should then take 1..3 widgets accordingly, to leave 1 widget and
therefore win.
Ie.:
If 23 remaining on your turn, take 2 leaving 21.
If 22 remaining on your turn, take 1 leaving 21.
If 21 remaining on your turn, take 3 leaving 18 but you are in danger.
If 20 remaining on your turn, take 3 leaving 17.
If 19 remaining on your turn, take 2 leaving 17.
If 18 remaining on your turn, take 1 leaving 17.
If 17 remaining on your turn, take 3 leaving 14 but you are in danger.
If 16 remaining on your turn, take 3 leaving 13.
If 15 remaining on your turn, take 2 leaving 13.
If 14 remaining on your turn, take 1 leaving 13.
If 13 remaining on your turn, take 3 leaving 10 but you are in danger.
If 12 remaining on your turn, take 3 leaving 9.
If 11 remaining on your turn, take 2 leaving 9.
If 10 remaining on your turn, take 1 leaving 9.
If 9 remaining on your turn, you will eventually lose.
If 8 remaining on your turn, take 3 leaving 5.
If 7 remaining on your turn, take 2 leaving 5.
If 6 remaining on your turn, take 1 leaving 5.
If 5 remaining on your turn, you will soon lose.
If 4 remaining on your turn, take 3 leaving 1 and winning.
If 3 remaining on your turn, take 2 leaving 1 and winning.
If 2 remaining on your turn, take 1 leaving 1 and winning.
If 1 remaining on your turn, you have already lost.
Number Game:
Numbers up to 65535 are possible.
The target number is stored at $486..$487 in little-endian format.
The number of turns taken is stored at $4A8.
On Screen Clock:
*($573) = tens of hours
r3 = ones of hours
r2 = tens of minutes
r1 = ones of minutes
All values are stored in ASCII format. Eg. for '5', use $35 (ASCII '5'),
not $05.
Eg. use this sequence of debugger commands for 11:58:
P
E $573 '1'
E R3 '1'
E R2 '5'
E R1 '8'
J $500
POthello (Reversi) 2.0:
Printer Routines, Trace Routine:
Reaction Timer:
Relative Branch Calculator:
Enter destination address (4 hex digits), then "=" appears, and tells you
the relative offset (or "?" if out of range).
The first digit of each pair entered is not echoed to the display until the
second digit has been input.
Rotate:
A B C D
E F G H
I J K L
M N O P
If a mistake is made, it can be corrected once between valid rotations.
Any two adjacent letters can be exchanged, with the proviso that only one
exchange is permitted. When the required pattern has been achieved, or
when the game is aborted, the program will print out the number of moves
used.
The program occupies locations $440 to $5C7, and uses routines from
PIPBUG. To run the program, type:
G440<CR>
Here is a sample printout. The "Z" command was used to terminate the
game.
*G440
EPLI
BFHK
CNAG
EPLI
BNFK
CAHG
EFLI
BANK
CHFG
EPLI
BAFN
CHGK
EPLI
BAGF
CHKN
EPMI
BAGF
CHKN
EAPI
BGMF
CHKN
EAPI
BGKM
CHNF
EAPI
GMNF
CHKN
EAPI
BHGF
CKMN
If you wish to exchange two adjacent letters, type X. The program will
respond with "EXCHANGE:", and expect you to type in the two desired
letters. If you cannot solve a particular pattern, type Z, and this will
abort the game.
An average pattern, with only one exchange permitted, should take
between 25 and 30 moves. Early attempts may take more."
Note that the game does not enforce the rule about only permitting one
exchange per game.
The unpatched version (ie. as found in the Games Pack) will not work on
Ami/WinArcadia. You should use the patched version (ie. as found in the
Enhancements Pack).
RYTMON:
Solitaire:
Star Shoot:
No.
Start
End
123
...
***
456
.*.
*.*
789
...
***
1
2
3
4
5
6
7
8
9
.!-
!!-
---
!.!
---
---
-!.
-!!
---
!--
.--
!--
-!-
!.!
-!-
--!
--.
--!
---
!!-
.!-
---
---
!.!
---
-!!
-!.
! means the star or dot becomes a dot or star (respectively).
- are unchanged.
It is possible to reach a configuration with zero stars and thus no
possible moves, losing the game.
Time:
The two most likely possibilities would be:
(a) the program was not originally tested and tuned to a sufficient
precision by its programmer; and/or
(b) the real machine is spending a certain number of cycles servicing
interrupts (which don't occur in the emulator).
Of course, since it starts counting from minute 1 rather than minute 0,
the time as shown in this program will be minute later than that shown by
the emulator.
When this program says "0100" (ie. "one hour"), emulator time should be
approximately "00:59:00.00" (though it would be fair to allow a few
milliseconds for initialization). However, emulator time when this event
occurs is actually only "00:58:47.20". So this program is 12.80 seconds
fast over that 59 minutes. (Or, conversely, you could suggest that the
emulator is slow by that amount, or a combination of both.)
Such accuracy is approximately 1:276.5625 (slightly worse than 1 second
fast per 5 minutes), which makes this program rather useless over lengthy
periods.
Vector Magnetometer:
Signetics Instructor 50
The start address for user programs can be specified at runtime by the
user as with eg. the Elektor TV Games Computer.
BIOS calls are made via
eg. ZBSR *DISPLY; there is a zero page jump table at $1FE6..$1FFF.
Region
Size
Basic version
Expanded version
$0000..$01FF
512 bytes
user RAM
user RAM
$0200..$0FFE
3582 bytes
unused
expansion RAM
$0FFF
1 byte
I/O port
I/O port
$1000..$177F
1920 bytes
unused
unused
$1780..$17BF
64 bytes
user RAM
user RAM
$17C0..$17FF
64 bytes
monitor RAM
monitor RAM
$1800..$1FFF
2K
monitor ROM
monitor ROM
$2000..$7FFF
24K
unused
expansion RAM
I/O Devices
The 28-key keyboard is as follows:
------Left Keypad------ ---------Right Keypad----------
.SENS.. .WCAS.. .BKPT.. ...C... ...D... ...E... ...F...
..INT.. .RCAS.. ..REG.. ...8... ...9... ...A... ...B...
..MON.. .STEP.. ..MEM.. ...4... ...5... ...6... ...7...
..RST.. ..RUN.. ENT NXT ...0... ...1... ...2... ...3...8-digit 8-segment LED display (red on black):
"PARALLEL I/O" section, consisting of:
8 glow LEDs ("7".."0");
8 corresponding toggle switches (unlabelled);
Toggle switch with 3 possible positions
(up, middle and down, corresponding to "MEMORY $0FFF", "EXTENDED I/O PORT $07"
and "NON-EXT DATA PORT", respectively).
"The default is probably EXTENDED I/O PORT $07."
WRTD,rn to write to the glow LEDs
WRTE,rn $07 to write to the glow LEDs
STRA,rn $0FFF to write to the glow LEDs
"RUN" glow LED:
"FLAG" glow LED, showing the state of the Flag pin of the CPU.
"INTERRUPT" toggle switch: "DIRECT" or "INDIRECT":
"INTERRUPT SELECTOR" jumper (on underside of machine):
"KEYBOARD" (ie. INT key).
"The default is probably keyboard."
S-100 bus (at rear) (not emulated).
"CASSETTE" jacks: "PHONE" and "MIC":
As with the Elektor, the rate at which bits (and thus bytes) can be
loaded/saved depends the actual data payload (ie. depends on whether they
are "0"s or "1"s).
Port $F8 bit 4 is FREQ. The BIOS is flipping that at a constant regular
rate (at least while recording).
Port $F8 bit 3 is ENV. That is high whilever we are actually recording a
bit, and goes low between bits. It stays high for longer for a "0" bit
than for a "1" bit.
So whilever ENV is high, we just write the current status of the FREQ bit
to the tape, and whilever ENV is low, we just write silence.
It gets NANDed, so if ENV and FREQ are both high, we are low, and
otherwise, we are high.
It sets port $F8 to $10 and $18 while writing, and $00 at rest.
During playback, the Sense bit is set directly from the tape
based on whether above or below the zero-crossing point.
USE BIOS
Error 2 means: "Restricted command."
Error 9 means: "Next instruction is in the MONITOR area."
Ie. if the STEP button is pressed and the next instruction would be in
the monitor area, it will be reported by the appearance of Error 9.
R1..R2: Pointer to byte preceding string.
R3: $00/$01/$80. $01 returns immediately.
The USE BIOS only allows character-level (ie. glyph-level) access. The
character set is as follows:
$00
$01
$02
$03
$04
$05
$06
$07
$08
$09
$0A
$0B
$0C
$0D
$0E
$0F
$10
$11
$12
$13
$14
$15
$16
$17
$18
$19
$1A
$1B
$1C
0 or O
1 or I
2
3
4
5
6
7
8
9
A
b.
C
d.
E
F
P
L
U
r
H
o
=
space
J
-
.
Y
n
### ..# ### ### #.# ### ### ### ### ### ### #.. ### ..# ### ### ### #.. #.# ... #.# ... ... ... ..# ... ... #.# ...
# # . # . # . # # # # . # . . # # # # # # # # . # . . # # . # . # # # . # # . . # # . . . . . . . # . . . . # # . .
#.# ..# ### ### ### ### ### ..# ### ### ### ### #.. ### ### ### ### #.. #.# ### ### ### ### ... ..# ### ... ### ###
# # . # # . . # . # . # # # . # # # . # # # # # # . # # # . # . # . # . # # # . # # # # . . . . . # . . . . . # # #
### ..# ### ### ..# ### ### ..# ### ..# #.# ### # ### ### # ### #.. #.. ### ### #.. #.# ### ### ... ### ... ... # ### #.#
Available letters: ABCDEFGHIJLNOPRSUY
Unavailable letters: KMQTVWXZ
Game Help
Event
Odds
0 lamps lit
250:1
1 lamp lit
15:1
2 lamps lit
7:1
3 lamps lit
7:2 (3.5:1)
4 lamps lit
5:2 (2.5:1)
5 lamps lit
7:2 (3.5:1)
6 lamps lit
7:1
7 lamps lit
15:1
8 lamps lit
250:1
0..1 lamps lit
25:1
2..3 lamps lit
2:1
4..5 lamps lit
1:1
6..8 lamps lit
6:1
0..2 lamps lit
11:2 (5.5:1)
3..5 lamps lit
2:5 (1:10)
6..8 lamps lit
11:2 (5.5:1)
Specific 2-digit number
250:1
Specific MS digit
15:1
Specific LS digit
15:1
Any one of 5 specified 2-digit numbers
50:1
Any one of 10 specified 2-digit numbers
25:1
The program relies on random data in uninitialized RAM for its random
number generation, hence you should ensure that "Settings|Emulator|
Randomize memory?" is on before loading the game.
0124 F9 7C BDRR,r1 $122
0124 F9 7E BDRR,r1 $124
Bits 6..4
Bits 3..0
%000: 0 mph (stopped)
%0000: oP...... HSE
%001: 80 mph
%0001: oPOOO... HSE + 3 FC
%010: 40 mph
%0010: oPOUU... HSE + 1 FC + 2 EC
%011: 27 mph
%0011: oPOUAo.. HSE + 1 FC + 1 EC + 1 HC + 1 C
%100: 19 mph
%0100: oPOOo... HSE + 2 FC + 1 C
%101: 15 mph
%0101: oPooo... HSE + 3 C
%110: 12 mph
%0110: oPUUUo.. HSE + 3 EC + 1 C
%111: 10 mph
%0111: o=ooo... LSE + 3 C
-
%1000: o=UUo... LSE + 2 EC + 1 C
-
%1001: o=AAo... LSE + 2 HC + 1 C
-
%1010: o=UUo... LSE + 2 EC + 1 C
-
%1011: o=OOOo.. LSE + 3 FC + 1 C
-
%1100: o=...... LSE
-
%1101: M....... MT
-
%1110: doooo... EM + 4 C
-
%1111: Mooo.... MT + 3 C
Abbreviation
Display
Description
EM
d
electric-powered mine engine
MT
M
battery-powered mine tractor
HSE
oP
high speed engine
LSE
o=
low speed engine
FC
O
full car
HC
A
half-full car
EC
U
empty car
C
o
caboose
Signetics TWIN
Region
Size
Master CPU
Slave CPU
$0000..$00FF
256 bytes
bootstrap ROM (to boot SDOS from disk)
slave RAM
$0100..$14FF
5K
master RAM (for SDOS)
slave RAM
$1500..$187F
896 bytes
master RAM (overlay area 1)
slave RAM
$1880..$1BFF
896 bytes
master RAM (overlay area 2)
slave RAM
$1C00..$3FFD
9214 bytes
master RAM
slave RAM
$3FFE..$3FFF
2 bytes
DOS version number (except for very early versions)
slave RAM
$4000..$7FFF
16K
window into (ie. mirror of) slave RAM
unexpanded system: unmapped
expanded system: slave RAM
job dispatcher
SVC processor
device handlers
GO, LOAD, SYSTEM, XEQ commands
2. Go SIO mode. Check disk status.
3. Go OTD mode. Send Normal Read command.
4. Go OTD mode. Send drive number.
5. Go OTD mode. Send sector number.
6. Go OTD mode. Send track number.
7. Go IND mode. Read 1st byte.
: : :
134. Go IND mode. Read 128th byte.
135. Go RST mode. Check disk status.
"Hex" - Appendix C (AOF)
"SMS" - Appendix D (for PROM programmer)
"MOD" - "Binary load module"
"Com" - "Command file" (ie. batch/script file)
DOS (tracks 1..4)
Disk(s)
DIP4
diag_4.4_5-23-79
EXOS
HM19..22
PMON (expects 8080 slave)
pascal_I.4b
CP/M
0517-0135-01_8002_cpm_adm3_pe_ws_palasm
CP/M
0517-0136..0142-01
CP/M
8002_cpm_ws_hk
CP/M
88000141_8088_thor_of_ops
CP/M
arb_mgr_work_disk
CP/M
asm09src_cpm
CP/M
cpm_on_tek_ws_utilities
CP/M
cpm_trace_theory_of_ops
CP/M
cpm_whitesmiths_c
CP/M
debug_card_programmable_parts_2-3-81
CP/M
tek_cpm_prom_document_format
CP/M
wordstar_perkin-elmer_terminal
SDOS 2.0
van_erp
SDOS 2.0
HM02..04
SDOS 2.0
HM06..07
SDOS 2.0
HM13..14
SDOS 2.0
HM16..18
SDOS 2.0
HM23..25
SDOS 4.0
HM01
SDOS 4.0
HM10
SDOS 4.2
config42
SDOS 4.2
HM05
SDOS 4.2
HM15
SDOS 4.2
system42
SDOS 4.2
tss40
TEKDOS 2650 VER 1.6 REV A (aka UDOS)
tekdos_v1.6_2650
TEKDOS 6500 3.1
tekdos_3.1_6500_copy
TEKDOS 6800 1.9
tekdos_1.9_bkup_8-79
TEKDOS 6800 1.9
99900761-01-A_tekdos_1.9
TEKDOS 6800 3.1
99900809-01_9508
TEKDOS 6800 3.1
99900817-01_9508_9508_link_cpy2
TEKDOS 6800 3.1
99900818-01_9508_executive_copy2
TEKDOS 6800 3.1
99900819-01_9508_io_module_copy2
TEKDOS 6800 3.1
99900820-01_9508_system_subroutines_cpy2
TEKDOS 6800 3.1
99900821-01_9508_emulator_ctl_cpy2
TEKDOS 6800 3.1
99900822-01_9508_cmd_line_proc_cpy2
TEKDOS 6800 3.1
99900823-01_9508_9508_real_time_analyzer_cpy2
TEKDOS 6800 3.1
99900824-01_9508_memory_cpy2
TEKDOS 6800 3.1
99900825-01_9508_comm_cpy2
TEKDOS 6800 3.1
99900924-01_9508_executable_modules_cpy2
TEKDOS 6800 3.1
Tek8002_1a
TEKDOS 6800 3.1
Tek8002_2
TEKDOS 6800 3.3
TekDOS_3.3_6800_cpy1..2
TEKDOS 6801 3.1
6801_tekdos_v3.1_f001
TEKDOS 680X 3.2
Tek8002_12..14
TEKDOS 8048 3.1
chuck_tekdos_ice
TEKDOS 8080 3.0
Tek8002_3
TEKDOS 8080 3.1
Tek8002_4
TEKDOS 8080 3.1
Tek8002_6a
TEKDOS 8080 3.1
Tek8002_11
TEKDOS 8085 3.1
Tek8002_5
TEKDOS 8085 3.1
Tek8002_7a
TEKDOS Z80 2.2
99900862-01
TEKDOS Z80 2.2
99901253-01_9516_boot_listing
TEKDOS Z80 2.2
99901254-01_9516_boot_src_obj
TEKDOS Z80 2.2
99902585-01
TEKDOS Z80 3.1
0517-0143..0147-01
TEKDOS Z80 3.1
8048_v3.1_9-6-79
TEKDOS Z80 3.1
8086_fpgas
TEKDOS Z80 3.1
9516_debug_diagnostic_with_diagnostic_emulator
TEKDOS Z80 3.1
ed_lenox_z80_3.3
TEKDOS Z80 3.1
editor_for_slave_adapter_d0
TEKDOS Z80 3.1
hal_gillette_z80_v3.1_system
TEKDOS Z80 3.1
master_cmd_files_for_slave_adapter
TEKDOS Z80 3.1
master_cmd_files_for_slave_adapter_run_disk_0
TEKDOS Z80 3.1
progfpga_slave_adapter_ed_lennox_0
TEKDOS Z80 3.1
slave_adapter_drive_1_programmable_parts_hist
TEKDOS Z80 3.1
supervsrctl
TEKDOS Z80 3.1
Tek8002_8
TEKDOS Z80 3.1
Tek8002_10
TEKDOS Z80 3.1
Tek8002_17b
TEKDOS Z80 3.1
Tek8002_21
TEKDOS Z80 3.1
tekdosz80v3.1slaveadaptersupervisorrun
TEKDOS Z80 3.1
test_files_for_8086
TEKDOS Z80 3.1
z80_3.1_debug_checkout_8086_vehicle
TEKDOS Z80 3.2
Tek8002_16
TEKTIP 1.5
tektip_1.5
TOS 1.0
TWINBoot
"EMPTY" (all zeroes)
Tek8002_15
"EMPTY" (all zeroes)
Tek8002_23b
"SDOS" (all zeroes)
cmd_src_5b
"SDOS" (all zeroes)
HM08..09
"SDOS" (all zeroes)
HM11..HM12
"SDOS" (all zeroes)
margriet1
"SDOS" (all zeroes)
sdos42_link
"SDOS" (all zeroes)
TWINData
"TEKDOS" (all zeroes)
99900827-01_hazel_6809_cpy2
"TEKDOS" (all zeroes)
99900828-01_hazel_8080-85_cpy2
"TEKDOS" (all zeroes)
99900829-01_hazel_6800_cpy2
"TEKDOS" (all zeroes)
99900831-01_hazel_8048_cpy2
"TEKDOS" (all zeroes)
cpm-wordstar_ed_lennox
"TEKDOS" (all zeroes)
files
"TEKDOS" (all zeroes)
supv_edit_disk_slave_adapter_drive_1
"TEKDOS" (all zeroes)
supvhis2
"TEKDOS" (all zeroes)
supvhis3
"TEKDOS" (all zeroes)
Tek8002_1b
"TEKDOS" (all zeroes)
Tek8002_17a
"TEKDOS" (all zeroes)
Tek8002_22
"TEKDOS" (all zeroes)
Tek8002_25
Other file(s)
99900826-01_h2lasm_cpy2
Other file(s)
99900830-01_hazel_z80_cpy2
Other file(s)
99900878-01_com-ram-05_part1_v1.0_cpy2
Other file(s)
99900884-01_com-ram-05_part2_v1.0_cpy2
Other file(s)
99900889-01_com-ram-05_part3_v1.0_cpy2
Other file(s)
99901441-01
Other file(s)
sdos42_cmd_src_1..5
Other file(s)
Tek8002_9
Other file(s)
Tek8002_18..20
Other file(s)
Tek8002_23a
Other file(s)
Tek8002_24a
Other file(s)
Tek8002_24b
Other file(s)
Tek8002_26
Other file(s)
pas_src
Other file(s)
prom_mod9
Other file(s)
rasm
Other file(s)
sdos42_hwa
Other file(s)
sdos42_macro_src
Other file(s)
sdos42_opt_drv
Other file(s)
sdos42_res_link
Other file(s)
sdos42_res_master
Other file(s)
sdos42_util
Corrupt/missing
word_star_work_disk.img
Dark grey disks do not contain a valid bootable DOS for the Signetics 2650 CPU.
TEKDOS (apart from UDOS) switches to the slave CPU. Slave memory is all zeroes (why!?) so we just run endlessly through the first 8K page of slave memory. Changing the HALT at $1DC1 of master memory to NOP is sufficient to get TEKDOS working.
TEKTIP 1.5 doesn't like to get interrupts 4 and 5 (teletype I/O).
Command
EXOS
TOS
SDOS 2.0
UDOS
SDOS 4.0
SDOS 4.2
Filename(s)
Return code
Filename(s)
Return code
Filename(s)
Return code
Filename(s)
Return code
Filename(s)
Return code
Filename(s)
Return code
Abort
P, (O)
Yes
E
ABT 31
P, (N)
ABT 31
M, (O)
ABT 31
L, (K)
ABT 31
M, (L1)
ABT 31
ASM
-
ASM 3
Z, 8, 7
No
U, T, S, Z, 5, 4, 3
No
Z, Y, SZ, Z
No
Y, Z, 2, 1, 0, Z
No
Z, 6, 5, Z
No
ASsign
D, (C)
ASsign 31
3, (R)
ASN 31
E
ASN 31
E
ASN 31
E
ASN 31
8
ASN 31
CLose
D, (C)
CLose 31
3, (R)
CLS 31
E
CLS 31
E
CLS 31
E
CLS 31
8
CLS 31
Cont
P, (O)
Yes
E
CON 31
P, (N)
CON 31
M, (O)
CON 31
L, (K)
CON 31
M, (L1)
CON 31
CMpf
-
CMpf 3
-
TOS 3
-
DOS 3
P1, Z
CMP 31
M1, M, (L1)
CMP 31
D, E
CMP 31
COPy
B, (A)
COPy 16
G
COP 13
E
COP 30
E
COP 30
E
COP 30
2, (1)
COP 16
CProm
-
CProm 3
S, (W)
PRM EOJ
K, (J)
Yes
I, X, (W)
PRM 62
P1, P, (O)
Yes
Q1, Q, (P1)
Yes
CSms
-
CSms 3
-
TOS 3
E, (R)
SMS 6
E, (P)
SMS 6
E, (M1)
SMS 6
N, (M1)
SMS 6
DEBug
A, 7, @
Yes
N, M, (O)
Yes
E, 1, (Z)
Yes
E, (D)
No
E, Z, (8)
Yes
I, C, (4)
Yes
DELete
C, (B)
DELete EOJ
4, (3)
DEL 31
E
DEL 31
E
DEL 31
E
DEL 31
8
DEL 31
DEv
DEVice
Q, (P)
DEv 31
(as DEv)
W, (E)
DEV 31
(as DEVice)
R, (P)
DEV 31
(as DEVice)
N, (M)
DEV 31
(as DEVice)
L1, (L)
DEV 31
(as DEVice)
M1, (M)
DEV 31
(as DEVice)
DFil
-
DFil 3
-
TOS 3
-
DOS 3
-
DOS 3
O, N1, (N)
DFL 31
P1, P, (O)
DFL 31
Dump
4, (3)
Dump 31
H, (G)
DMP 31
Z
DMP 31
4, (3)
DMP 31
Z
DMP 31
1, (D)
DMP 31
DUP
R, (Q)
DUP 9
T, (S)
DUP 9
Z, (W)
DUP 9
T, (S)
DUP 9
V, (U)
DUP 9
T1, (T)
DUP 9
EDIT
9, G, F, E
No
E, K, 8
No
D, C, B, A, H, G, F, E
No
D, C, B, A, H, G, F, E
Yes
D, C, B, A, H, G, F, E
No
E, I1, Y
No
Ex
Exam
7
Ex 31
(as Ex)
H, (G)
EXM 31
(as Exam)
2, (1)
EXM 31
(as Exam)
COPYSYS, (BOOT)
EXM 31
(as Exam)
Z
EXM 31
(as Exam)
0, (C)
EXM 31
(as Exam)
Fill
-
Fill 3
-
TOS 3
-
DOS 3
P, (N)
FIL 31
71, (7)
FIL 31
Z
FIL 31
FORMAT
E
FORMAT 9
V, (F)
FMT 9
E
FMT 9
E
FMT 8
E
FMT 8
8
FMT 9
Go
-
Go 31
-
TOS 31
-
No
-
DOS 37
-
DOS 37
-
DOS 37
Ice
-
Ice 3
-
TOS 3
-
DOS 3
-
DOS 3
Q, (P1)
ICE EOJ
R, (Q1)
ICE EOJ
Kill
Q, (P)
Kill 31
W, (E)
KIL 31
R, (P)
KIL 31
N, (M)
KIL 31
L1, (L)
KIL 31
M1, (M)
KIL 31
LDir
Ldir
O, L
Yes
(as LDir)
R, 6
Yes
(as LDir)
N, M
Yes
(as Ldir)
O, L
Yes
(as Ldir)
K, J
Yes
(as Ldir)
L1, L
Yes
(as LDir)
LOad
-
LOad 49
-
ONA 49
-
DOS 49
-
DOS 49
-
DOS 49
DOS 49
Module
N, M, (L)
Module 34
2, D, (N)
MOD 12
O, L, (K)
MOD 12
K, J, (I)
MOD 12
I1, I, (R)
MOD 12
K, J, (H)
MOD 12
MOVe
-
MOVe 3
-
TOS 3
-
DOS 3
P, (N)
MOV 31
8
MOV 31
#B, (#)
MOV 31
Patch
-
Patch 3
-
TOS 3
Z
PAT 31
4, (3)
PAT 31
71, (7)
PAT 31
Z
PAT 31
PRint
E, (Q)
PRint 30
C, (1)
PRN 30
E
PRN 30
E
PRN 30
E
PRN 30
8, (N)
PRN 30
PRINTL
E, (Q)
PRINTL 30
C, (1)
PRN 30
E
PRN 30
E
PRN 30
E
PRN 30
8, (N)
PRN 30
PROm
-
PROm 3
-
TOS 3
-
DOS 3
-
DOS 3
8
PRM 52
!, (9)
PRM 52
REad
-
REad 3
-
TOS 3
-
DOS 3
-
DOS 3
X, (W)
RDW 31
N1, W, (V)
RDW 31
REName
C, (B)
REName 8
4, (3)
REN 31
E
REN 31
E
REN 31
E
REN 31
8
REN 31
Rhex
-
Rhex 3
L, (J)
No
J, (Z)
No
W, (V)
No
N, (X)
No
O, (N1)
No
RProm
K, (J)
RProm EOJ
S, (W)
PRM EOJ
K, (J)
PRM EOJ
I, X, (W)
PRM 62
P1, P, (O)
PRM EOJ
Q1, Q, (P1)
PRM EOJ
SEArch
Q, (P)
SEArch 31
W, (E)
SCH 31
R, (P)
SCH 31
-
DOS 3
-
DOS 3
-
DOS 3
SLave
T, (S)
SLave 31
P, (U)
SLV 31
Z
SLV 31
V, (U)
SLV EOJ
-
DOS 3
-
DOS 3
STatus
S, (R)
Yes
U, (V)
Yes
Z
Yes
U, (T)
Yes
W, (V)
Yes
V, U, T1
Yes
Sus
Suspend
P, (O)
Yes
(as Sus)
E
SUS 31
(as Suspend)
P, (N)
SUS 31
(as Suspend)
M, (O)
SUS 31
(as Suspend)
L, (K)
SUS 31
(as Suspend)
M, (L1)
SUS 31
(as Suspend)
SYstem
-
Yes
-
Yes
-
Yes
-
DOS 9
-
Yes
-
Yes
TYpe
Q, (P)
TYpe 31
W, (E)
TYP 31
R, (P)
TYP 31
N, (M)
TYP 31
L1, (L)
TYP 31
M1, (M)
TYP 31
Upr
-
Upr 3
-
TOS 3
-
DOS 3
-
DOS 3
E
UPR EOJ
8
UPR EOJ
Verify
Q
Verify 31
F, (T)
TOS 48
W, (V)
VER 31
S, (R)
VER 31
U, (T)
VER 31
T, (S1)
VER 31
WHex
-
WHex 3
J, (P)
WHX 30
V, (U)
WHX 30
R, (P1)
WHX 30
T, (S1)
WHX 30
S1, (X)
WHX 30
WProm
K, (J)
WProm EOJ
S, (W)
PRM EOJ
K, (J)
PRM EOJ
I, X, (W)
Yes
P1, P, (O)
Yes
Q1, Q, (P1)
Yes
WRite
-
WRite 3
-
TOS 3
-
DOS 3
-
DOS 3
X, (W)
RDW 31
N1, W, (V)
RDW 31
WSms
-
WSms 3
-
TOS 3
E, (R)
Yes
E, (P)
Yes
E, (M1)
Yes
N, (M1)
Yes
Xeq
XEQ
-
Xeq 49
(as Xeq)
-
ONA 49
(as Xeq)
-
DOS 49
(as XEQ)
-
DOS 49
(as XEQ)
-
DOS 49
(as XEQ)
-
DOS 49
(as XEQ)
Return codes are:
3
Command file not found.
6
Device read error.
8
Device not specified when required.
9
Invalid drive number.
12
Invalid file name.
13
Input file not found.
16
Input device assign failure.
30
Invalid parameter.
31
Parameter required.
34
Invalid address.
37
Invalid go address.
48
Load file not found.
49
Load file assign failure.
62
Device not operational.
EOJ
End of Job.
I/O Ports
Port
Description
$E8
Data Byte
$E9
Status Byte:
bits 7..5: unused
bit 4: parity error
bit 3: framing error
bit 2: data overrun
bit 1: transmit buffer empty
bit 0: data available
$EA
"Controller Flag Byte"
$EB
"Disk Status Byte"
Port
Name
Description
$D0
PCPT
High Speed Paper Tape (HSPT) control port
$D1
PDPT
PDPT High Speed Paper Tape (HSPT) data port
$E8
?
CRT/TTY output
$E9
?
Bits 7..3: unused
Bit 2: enable TTY interrupts
Bit 1: parity select
Bit 0: TTY paper tape reader
$EA
?
Control Device (floppy drive and printer)
$EB
?
Data Device (floppy drive and printer)
$EC
?
Bits 7..1: ?
Bit 0: interval timer (0=disabled, 1=enabled)
$ED
?
"Master Memory Protect"
$EE
BSPT
Common memory bank select:
$00 = map slave RAM $0000..$3FFF to master RAM $4000..$7FFF
$01 = map slave RAM $4000..$7FFF to master RAM $4000..$7FFF
$02 = map slave RAM $8000..$BFFF to master RAM $4000..$7FFF
$03 = map slave RAM $C000..$FFFF to master RAM $4000..$7FFF
Central Data 2650
Company: Central Data Company
Features: Employs Signetics 2650 microprocessor.
There is an in-built 80 character by 16 line video display character
generator (64 upper case ASCII character set) with a user programmable
set of 64 characters (8x8 matrix) for non-standard characters.
There is a Kansas City Standard cassette interface, a 1024 byte PROM
monitor program, 2048 bytes of programmable memory of which 768 are
available for programming with the balance dedicated to the display,
one 8 bit input port and one 8 bit output port.
In addition there are sockets for 3K of PROM (which may include the
Central Data Company's editor and assembler).
A BASIC software package is available on cassette tape.
The user needs to supply 3A at 5V power supply, an ASCII keyboard, a
video monitor and possibly some additional memory."
- "Small Systems Computer Sourcebook" [sic], by J. C. Boonham.
Central Data 2650 computer (including CUTS cassette interface)
ASCII-encoded keyboard
video monitor
tape deck
power supply
Region
Size
Description
$0000..$03FF
1K
monitor ("supervisor") ROM BIOS
$0400..$0FFF
3K
expansion ROM (optional)
$1000..$103F
64 bytes
display RAM (unusable)
$1040..$14FF
1216 bytes
display RAM
$1500..$150F
16 bytes
monitor RAM (unusable)
$1510..$17E9
730 bytes
user RAM
$17EA..$17FF
26 bytes
monitor RAM
$1800..$1FFF
2K
unused
$2000..$7FFF
24K
expansion RAM/ROM (optional)
$1500..$150F: "You can't use $1500..$150F because when you reach the end
of the line, WCHR at $0396 sends you to LFCR at $0024 which immediately
writes a space at the current (too big) cursor position." - Richard
Rogers.
$1000: 0,0
$1001: 0,1
$1002: 0,2
: : :
$100F: 0,15
$1010: 1,0
$1011: 1,1...address = $1000 + (x * 16) + y;
Characters $40..$7F use the optional 2nd character generator PROM, if available. These are generally used for eg. lower case characters, Star Trek characters, card symbols and chessmen.
Characters $80..$FF are not normally used.
The character sets are:
Code
$0
$1
$2
$3
$4
$5
$6
$7
$8
$9
$A
$B
$C
$D
$E
$F
$0
$1
$2
$3
$4
$5
$6
$7
$8
$9
$A
$B
$C
$D
$E
$F
$0
$1
$2
$3
$4
$5
$6
$7
$8
$9
$A
$B
$C
$D
$E
$F
$0x
@
A
B
C
D
E
F
G
H
I
J
K
L
M
N
O
@
A
B
C
D
E
F
G
H
I
J
K
L
M
N
O
@
A
B
C
D
E
F
G
H
I
J
K
L
M
N
O
$1x
P
Q
R
S
T
U
V
W
X
Y
Z
[
·
]
↑
←
P
Q
R
S
T
U
V
W
X
Y
Z
[
·
]
↑
←
P
Q
R
S
T
U
V
W
X
Y
Z
[
·
]
↑
←
$2x
!
"
#
$
%
&
'
(
)
*
+
,
-
.
/
!
"
#
$
%
&
'
(
)
*
+
,
-
.
/
!
"
#
$
%
&
'
(
)
*
+
,
-
.
/
$3x
0
1
2
3
4
5
6
7
8
9
:
;
<
=
>
?
0
1
2
3
4
5
6
7
8
9
:
;
<
=
>
?
0
1
2
3
4
5
6
7
8
9
:
;
<
=
>
?
$4x
`
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
♔
♕
♗
♖
♘
♙
♚
♛
♝
♜
♞
♟
■
◫
▣
□
@
A
B
C
D
E
F
G
H
I
J
K
L
M
N
O
$5x
p
q
r
s
t
u
v
w
x
y
z
{
|
}
~
■
p
q
r
s
t
u
v
w
x
y
z
{
|
}
~
■
P
Q
R
S
T
U
V
W
X
Y
Z
[
·
]
↑
←
$6x
!
"
#
$
%
&
'
(
)
*
+
,
-
.
/
-
!
"
#
$
%
&
'
(
)
*
+
,
-
.
/
-
`
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
$7x
0
1
2
3
4
5
6
7
8
9
:
;
<
=
>
?
0
1
2
3
4
5
6
7
8
9
:
;
<
=
>
?
p
q
r
s
t
u
v
w
x
y
z
{
|
}
~
■
Green is chessmen character set.
Character $4D (shown here as ◫) is actually a square with a horizontal (not vertical) bisecting line. Unicode sux :-(
Blue (ASCII) is used for Central Data DOS and P1 DOS.
Characters shown here in dark blue are control codes which will be displayed as inverse video.
Supervisor BIOS
An A indicates that it is waiting for you to type in an address.
At any time the supervisor is looking for a keyboard input, you can press Esc
which will terminate the present command and wait for a new one.
Press A.
It will then ask for a hexadecimal address.
The address and the data then appear on the next line.
You can now:
press Esc to quit the alter/display routine;
enter C to change the data at that location;
type in two hex characters to fill the memory location; or
press space to display the next memory location.
Press B.
It will then ask you for the address of the breakpoint.
When this address is reached in the program, the supervisor will save
all of the registers and wait for a new command. It signifies that the
breakpoint address has been reached by writing the message:
BP 1703
Press C.
The supervisor responds by typing the address that the breakpoint was
set at. Note that you must set breakpoints at an address position where
an instruction would begin. In other words, you cannot set a breakpoint
to be executed at an address which is the second or third byte of an
instruction.
Press E.
It will then ask for the address that is should start executing at.
It will then jump to the address and start executing instructions.
Press I.
It will then ask you to type a register number corresponding to the
register that you want, as follows:
0 register 0 (r0)
1 register 1, bank 0 (r1)
2 register 2, bank 0 (r2)
3 register 3, bank 0 (r3)
4 register 1, bank 1 (r4)
5 register 2, bank 1 (r5)
6 register 3, bank 1 (r6)
7 Program Status Word, Lower (PSL)
8 Program Status Word, Upper (PSU)
to stop by pressing Esc;
to change the register value by entering C; or
to inspect another register by pressing Space.
It seems to be possible to "hang" the supervisor; eg. by pressing E
repeatedly. This is because RETN ($288) branches to *ADD1, and sometimes
ADD1 has garbage such as $6EEE.
$13A, $16C, $181: probably $EB but maybe $E8
$316: probably $F8 but maybe $FB
$3C4: probably $2E but maybe $28 or $2B$17EB..$17F3
$17F8
$17FC
$17FD?
The KBIN routine can return characters in the $00..$7F range. However,
it can only print them as uppercase (because it uses WCHR).
The supervisor internally works with letters in the $41..$5A (65..90)
(ASCII uppercase "A".."Z") range. It relies on the masking performed by
WCHR to output them as $01..$2A (1..26) (CD2650 uppercase "A".."Z").
Stack required: 2.
Functions called: LFCR, HXOT, WRBL.
Pages: 3.
Addresses: $DB..$EF.
Can branch to: None.
RAM data accessed: ADD1/2.
ROM data accessed: None.
ROM constants used: INCD ($10), CUCD ($1C), SPCD ($20).
Subsections: L2.
Called by: ?.
Registers: r0 will be SPCD ($20), r3 will be CUCD ($1C).
PSW: WC is cleared.
Unarchived Software
Spacewar (clone of "Scelbi's Galaxy Game for the 8008/8080"), by Roger Miskowicz
Star Trek
Target
email
us.
Game Help
Now, from the "OPTION" prompt, press R.
- = go to beginning of file
+ = go to end of file
/ = go backwards 15 lines
Bx = go backwards x lines
space = go forwards 15 lines
Fx = go forwards x lines
Cx = change line x
Ix = insert after line x
Ctrl+C = done changing/inserting
Dx = delete x lines from top of screen
R = go to BASICI = Inspect variable
L = RUN to line
R = RUN
Esc = stop running
S = Single step
Esc = go to editor
Standard BASIC
8K BASIC
CLS
ERASE
var=PEEK(addr)
PEEK addr,var
PRINT"string"
PRINT'string'
PRINT var
PRINT #var
PRINT AT y,x
PRINT@y,x
'comment
*comment
IF a=b THEN
IF a=b
String concatenation (eg. A$='FOO'+'BAR') is not allowed.
String assignments (eg. A$='FOO') must exactly fill the
allocated (DIMensioned) storage.
When running programs: for multi-variable INPUT statements, each entry
should be terminated with the RETURN key (not a comma).
2 bytes for pointer to next variable
1..15 bytes for name
4 bytes for contents
2 bytes for pointer to next variable
1..15 bytes for name
(0..255)*4 bytes for contents
2 bytes for pointer to next variable
1..15 bytes for name
1 byte for length
0..255 bytes for contents
Range
V1.0
V1.3
1780..17AA
00s
<various>
25B9..25BB
70 F4 80
1F 3E 98
2C25..2C27
3F 34 0D
3F 3F EE
2E6F..2E74
EE 14 A5 9C 30 5A
CE 14 A5 C0 C0 C0 (unofficial)
33B9..33BC
1A 64 19 6F
9C 4F D1 C0
3995
04
03
3E88..3EAA
<various>
<various>
3F2F..3F31
3F 3C F5
1F 17 96
3F78..3F7A
1F 38 91
1F 17 82
3FD1..3FED
<none>
<various>
3FEE..3FF3
<none>
<various>
Bytes $3D90..$3D91 (in the COSine() function handler) are ambiguous (due
to a poor quality printout/photocopy). But logically they would be $06 $04 (LODI,r2 4).
Positive exponents represent large positive or negative numbers.
Negative exponents represent small positive or negative numbers (-0.5..0.5).
Bits 30..24 are the exponent itself, ie. the position of the "decimal" (really binary) point,
ie. how many bits are needed to store the integer part of the number.
Very small numbers will have negative exponents (and will have leading zeroes in the fractional part).
Bits 22..0 are the mantissa itself.
Positive numbers that have been properly normalized will have mantissa bytes of $400000..$7FFFFF.
Negative numbers that have been properly normalized will have mantissa bytes of $C00000..$FFFFFF.
Values of $0..$3FFFFF and $800000..$BFFFFF should never occur.
The fractional part is obtained by left-shifting (doubling) the mantissa, exponent times.
This represents the fractional part in units of 1/8,388,608.
So by dividing this value by 8,388,608 you would obtain the fractional part.
Exponent
Range
Int. digits
Int. zeroes
.
Frac. zeroes
Frac. digits
Example
-128
About 10^-38
0
0
.
128
23
0.000001 = $80 00 00 08
...
...
...
...
.
...
...
...
-3
1/16..1/8
0
0
.
3
23
0.0625 = $FD 40 00 00
-2
1/8..¼
0
0
.
2
23
0.125 = $FE 40 00 00
-1
¼..½
0
0
.
1
23
0.25 = $FF 40 00 00
0
½..1
0
0
.
0
23
0.5 = $00 40 00 00
+1
1..2
1
0
.
0
22
1.0 = $01 40 00 00
+2
2..4
2
0
.
0
21
2.0 = $02 40 00 00
+3
4..8
3
0
.
0
20
5.0 = $03 50 00 00
+4
8..16
4
0
.
0
19
10.0 = $04 50 00 00
+5
16..32
5
0
.
0
18
20.0 = $05 50 00 00
+6
32..64
6
0
.
0
17
50.0 = $06 64 00 00
+7
64..128
7
0
.
0
16
100.0 = $07 64 00 00
+8
128..256
8
0
.
0
15
200.0 = $08 64 00 00
+9
256..512
9
0
.
0
14
500.0 = $09 7D 00 00
+10
512..1K
10
0
.
0
13
1000.0 = $0A 7D 00 00
+11
1K..2K
11
0
.
0
12
+12
2K..4K
12
0
.
0
11
+13
4K..8K
13
0
.
0
10
+14
8K..16K
14
0
.
0
9
+15
16K..32K
15
0
.
0
8
+16
32K..64K
16
0
.
0
7
+17
64K..128K
17
0
.
0
6
+18
128K..256K
18
0
.
0
5
+19
256K..512K
19
0
.
0
4
+20
512K..1M
20
0
.
0
3
+21
1M..2M
21
0
.
0
2
+22
2M..4M
22
0
.
0
1
+23
4M..8M
23
0
.
0
0
+24
8M..16M
23
1
.
0
0
+25
16M..32M
23
2
.
0
0
...
...
...
...
.
...
...
...
+127
about 10^37
23
104
.
0
0
~10^37 = $7F 7F FF FF
Int. zeroes: number of trailing zeroes at right of integer part.
Frac. zeroes: number of leading zeroes at left of fractional part.
Frac. digits: number of meaningful digits at right of fractional part.
Ie. <integer digits><integer zeroes>.<fractional zeroes><fractional digits>
Eg. for an exponent of -2, the number is %0.00xxxxxxxxxxxxxxxxxxxxxxx (where x are mantissa digits).
At +24 and greater exponents, there are not enough mantissa digits to even hold the complete integer number
(let alone any fractions).
S - save to tape (pauses during save)
L - load from tape
R - runs the BASIC program
Cn - change from line n onwards
D - deletes line 1
Dn - deletes lines from 1 to n
E - exits to supervisor
An - append after line n. If you have just inserted some lines, it will add them again after the designated line
F - scrolls forwards 1 line
Fn - scrolls forwards n lines
I - insert after line 1 - type in program, Ctrl-C (=ETX) ends input
In - insert after line n - type in program, Ctrl-C (=ETX) ends input
Bn - scrolls backwards n lines
X - scrolls forwards 1 line
Xn - ?
P - modify string?
G - go and run program with following options:
D - direct execution of a typed-in line
R - run the program
S - single step
Esc - exits
At $5800 there is a small test program. It looks as if whoever saved the
program first ran it with the extended functions deleted and wrote a small
program before saving. So some of the extended functions may be corrupted
or they may all be missing.
When an error is encountered: these OPTIONs are available:
D - direct mode
R - rerun the program
S - single step
Esc - exits
A
B
C
D
E
F
G
H
8
A8
□♜
BR
B8
■♞
BN
C8
□♝
BB
D8
■♛
BQ
E8
□♚
BK
F8
■♝
BB
G8
□♞
BN
H8
■♜
BR
7
A7
■♟
BP
B7
□♟
BP
C7
■♟
BP
D7
□♟
BP
E7
■♟
BP
F7
□♟
BP
G7
■♟
BP
H7
□♟
BP
6
A6
□
B6
■
C6
□
D6
■
E6
□
F6
■
G6
□
H6
■
5
A5
■
B5
□
C5
■
D5
□
E5
■
F5
□
G5
■
H5
□
4
A4
□
B4
■
C4
□
D4
■
E4
□
F4
■
G4
□
H4
■
3
A3
■
B3
□
C3
■
D3
□
E3
■
F3
□
G3
■
H3
□
2
A2
□♙
WP
B2
■♙
WP
C2
□♙
WP
D2
■♙
WP
E2
□♙
WP
F2
■♙
WP
G2
□♙
WP
H2
■♙
WP
1
A1
■♖
WR
B1
□♘
WN
C1
■♗
WB
D1
□♕
WQ
E1
■♔
WK
F1
□♗
WB
G1
■♘
WN
H1
□♖
WR
Additionally, the byte at $29C7 is erroneous. Presumably BSTA,un $2400
was meant rather than BSTA,un *$2400 [$7710]; therefore $A4 should be
changed to $24.
R: runs the assembler
Z: frees (zeroes) memory (changes BLOCKS LEFT from 00 to 50)
#1: Buy land: how many acres? (at 17..22 bushels per acre) (average of 19.5 bushels per acre)
Generally, at a price of 17..19 bushels per acre, you should buy.
#2: Sell land: how many acres? (at 17..22 bushels per acre) (average of 19.5 bushels per acre)
Generally, at a price of 20..22 bushels per acre, you should sell.
#3: Distribute food: how many bushels?
Requirement is 20 bushels per man.
Overfeeding will bring immigrants at 40 bushels per man.
There is never any reason to overfeed by more than 1960 bushels
(which would bring 49 overfeeding immigrants, plus 1 hungry immigrant in a good harvest (and more in average or bad harvests), thus hitting the maximum of 50 immigrants per turn).
Deaths from starvation, and overfeeding immigrants, are calculated here but not applied yet.
#4: Plant land: how many acres?
There is never any reason not to plant the maximum possible amount of land.
Limiting factors are (ie. use whichever of these is the lowest):
a. acres
b. bushels * 2
c. men * 10
Bushels are used up (although you will always get more back as harvest than what you plant as seed).
1 bushel can plant 2 acres and a bad (minimum) harvest is 1 bushel per planted acre.
Acres and men are not used up (you just need enough of them available).
Harvest/rats:
Harvest per planted acre is 1..5 (average of 3 bushels).
Rats eat 0..7% of total (stored+harvest) bushels per turn (average of 3.5%).
Population changes:
Immigrants are those from overfeeding as previously calculated in phase #3, plus these hungry immigrants:
((total bushels * (5 - harvest per acre)) ÷ 600) + 1
So, to bring immigrants, you should overfeed, have many total bushels, and a bad harvest.
There is a limit of 50 total immigrants per turn.
Deaths from starvation are as previously calculated in phase #3.
Additionally, there is a 10% chance of a plague which will kill 50% of your men
(ie. average 5% plague deaths per turn).
This is applied after immigrants and deaths from starvation have already been applied
(in fact, strictly speaking it is applied at the start of the next turn).
b. the harvest per planted acre (1..5 bushels per planted acre, average 3);
c. rat appetite (0..7% of total bushels, average 3.5%); and
d. whether a plague occurs (10% chance of killing 50% of your men) (average 5% plague deaths per turn).
Scoring could be measured in land and/or food (and/or men, but the only reason to want men is for planting the land).
One possible algorithm is: score = bushels + (acres * 19.5) + men.
Since the code for backspace is the same as that for lowercase "h" (8),
and the code for a carriage return is the same as that for lowercase "m"
(13), these two lowercase letters are unusable in this program.
Note that this program has not been tested on the genuine machine and
the key bindings are mostly guesswork.
$5BF6: 73 REDD,r3
$5BF7: 3F 01 9A BSTA,un DECR
$5BFA: CB 02 STRR,r3 $5BFE
$5BFC: 17 RETC,un
$5BFD: ?? <unused>
$5BFE: <vv> <value>start address = *($1512) * $100;
end address = (*($1513) * $100) - 1;5 LIST 6 LIST 5 LOAD
123 PATTERNPHUNSY
Region
Size
Mini-PHUNSY
Full version
$0000..$07FF
2K
RAM
EPROM (PHUNSY BIOS)
$0800..$0BFF
1K
RAM (optional)
user RAM
$0C00..$0E40
577 bytes
RAM (optional)
MDCR RAM
$0E41..$0EDF
159 bytes
RAM (optional)
user RAM
$0EE0..$0EFF
32 bytes
RAM (optional)
monitor RAM (scratchpad)
$0F00..$0FFF
256 bytes
RAM (optional)
monitor RAM (command input buffer)
$1000..$17FF
2K
RAM (optional)
RAM (screen memory)
$1800..$1DFF
1536 bytes
RAM (for use by BIOS)
banked RAM ("U" bank)
$1E00..$1FFF
512 bytes
ROM (Mini-Monitor BIOS)
banked RAM ("U" bank)
$2000..$3FFF
8K
unmapped?
general purpose RAM
$4000..$7FFF
16K
unmapped?
banked RAM ("Q" bank)
U1: EPROM (PDCR (Portable Digital Cassette Recorder))
U2: EPROM (DASS (DisASSembler))
U3: EPROM (LABHND (LABel HaNDler))
U4..UF: RAM
Q0: EPROM (MWB (MicroWorld BASIC)) ($4000..$5983)
Q1..QF: RAM
Q (if necessary)
OLD
RUN
NEW
3UU
PMON0400.BIN is 04-0 from 1982 (as used in Ami/WinArcadia)
PMON0401.BIN is 04-1 from 1982
PMON0402.BIN is 04-2 from 1983
PMON0403.BIN is 04-3 from 1982 (sic)
03A-PMON0404.BIN and 04A-PMON0404.bin are 04-4 from 1983
Bits 7..4 select which U-bank to use at $1800..$1FFF
Bits 3..0 select which Q-bank to use at $4000..$7FFF
Control port reads (REDC) are for serial input.
Data port reads (REDD) are for parallel input.
If high bit of data port is clear, a key is down.
If high bit of data port is set, no key is down.
Sound is generated by rapidly toggling bit 1 of the data port (via WRTD).
Writing to extended port $7E (WRTE) sets the timer countdown. It is
specified in units of 10 milliseconds (ie. 1/100ths of a second), and
thus can range from 0.01 to 2.55 seconds ($01..$FF). After expiration,
an interrupt is generated, causing execution to jump to $001D. The timer
is automatically reloaded whenever it expires. Writing $00 disables the
timer.
IIAD is the REDZV pointer $7D8 (SERIN)
ICAD is the CHIZV pointer $7C4 (DCHIN)
r5 = 0;
r4 = 8;
do
{
r0 = PORTC & 1;
} while (r0 != 0);
gosub DELAYC;
for (r4 = 8; r4 >= 1; r4--)
{
gosub DELAY;
r0 = (PORTC & 1) | r5;
r5 = r0 >> 1;
}
gosub DELAY;
r0 = r5 & %01111111;
return;r0 = PORTD;
if (r0 & %10000000 == %10000000)
{
r0 = $7F [DEL];
}
else
{
PORTD = 4;
r0 = PORTD;
PORTD = 0;
do
{
r5 = PORTD;
} while (r5 & %10000000 == %10000000);
r0 &= $7F;
}
return;do
{
r0 = PORTD;
} while (r0 & %10000000 == %10000000);
PORTD = 4;
r0 = PORTD;
PORTD = 0;
do
{
r5 = PORTD;
} while (r5 & %10000000 == %10000000);
r0 &= $7F;
return;Mini-PHUNSY
...0... ...4... ...8... ...C... ..D->M. .Reset.
...1... ...5... ...9... ...D... ..M->D. ..Halt.
...2... ...6... ...A... ...E... ...G... DumpCas
...3... ...7... ...B... ...F... ...Cl.. LoadCas
...a1.. ...a2.. ...a3.. NumLock ...n/.. ...n*..
...Q... ...W... ...E... ...n7.. ...n8.. ...n9..
...A... ...S... ...D... ...n4.. ...n5.. ...n6..
...Z... ...X... ...C... ...n1.. ...n2.. ...n3..
Cl = Clear
D = Display
G = Go to
M = Memory
.1.2.3.4.5.6.
Game Help
64>374
BELMACH
BELMACH0
BIG-CHAR:
This is a subroutine designed to be called by other programs, by putting
the desired ASCII value in r0 and calling $3700. The imagery for the
character set is at $3000..$32FF. See the commented disassembly of this
program for more details.
BMK
CHRPRNTR
CLEARMEM:
This works but takes a few moments.
COPY
This installs these routines:
800G show this help
803G read cassette to RAM
806G save RAM to cassette
809G continue read after error
DASS6800
FORTH-01
FUN-CLOCK
GEINTJE
GETS-002:
Unsure what it is showing.
Eventually gets into an infinite output loop.
GRAPJE-1..5
KLOK:
The emulator is too fast, or the "game" is too slow, by a 1:120 ratio (0.8%).
KRANT
L-KRANT
MODESTA,B,C,N (all except MODEST itself)
MWBAS-04,05,06 (all except 00 and M6):
Type NEW at startup, otherwise it will always just say "FILE ERROR".
MWBAS, 14A-MWBAS-06, 20A-MWBAS-06, MWBAS-M6 are the 24/12/1983 version.
13A-MWBAS-06 is the 23/4/1984 version.
MWBAS-07 is the 6/11/2010 version.
MWBAS-00, MWBAS-05 are undated.
OTHELLO
PASS (both dumps)
PAUZE
PEDT-004
PEDT-0A3
PIANO
PMONmini
QASS-003
RAMTEST
RUNLIGHT
SEE-C374:
Usage: U
Type eg. U0 to start viewing memory from address $0000.
SEE-CHAR:
Usage: 800G
Type eg. 800G0 to start viewing memory from address $0000.
SEE-EXT (all dumps)
all games in the MicroWorldBASIC/ directory
BASIO-20 (It reads from extended I/O port(s) for some reason; possibly non-PHUNSY.
Maybe it's eg. the CD2650 extended basic functions. Needs investigation.)
CASSDISK
CDC-I/O (It's expecting there to be code at $6003 and there isn't any.)
CLOCK (10-A and 16-A. FUN.MDCR version is OK.)
CONV2>0 (This gosubs to $19EC (which doesn't contain anything) for some reason.)
CONV6>2
COPYOV
DAME (This is an ASCII picture.)
DISK
FLXWR-02
FORTH-00
FPRINTER
GRAPHICS
GRAPHS
HEXDUMP
I/OPACK (This seems to expect a different BIOS.)
LKRANT
MEMTA (Flashes INPUT ERR very briefly. Probably needs arguments to be provided.)
MODEST (both dumps)
MWBAS-00
MWBAS-M6
PALASM
PCITALK (Reads/writes from/to extended I/O port(s) for some reason.)
PH-CHR
PHCSRD (This tries to read from the cassette (via the Sense pin).)
PHEDTR2 (both dumps) (This reads from extended I/O ports for some reason.)
PORT9600
PRPRG ((E)PR(OM) Pr(o)g(rammer)?
Has PHUNSY monitor 04-P4 (special edition?) in it, and Malotaux
programmer, and data for various non-Signetics chips.
READHEX
ROW->COL (both dumps)
SCR
SEND-JET (This jumps to $1914 (which doesn't contain anything) for some reason.)
SER-I/O
SOUTCASS
TERML
TPRINT-S
TPRINTER (both dumps)
TRNR-001
ZOOI
the "program" is really just a subroutine library for use by other programs (eg. BIG-CHAR);
the "program" is really just data;
the program might just have bugs (eg. FORTH-00?);
the program might be a bad dump;
the program is expecting command line arguments (eg. SEE-CHAR);
the program is not intended to produce any output (eg. CLEARMEM);
etc.
Dutch
English
Dame
Lady
Krant
Newspaper
Liedjes
Songs
Zooi
Mess
Ravensburger Selbstbaucomputer
Region
Size
No BIOS
With BIOS
$0000..$07FF
2K
user RAM
2716 BIOS ROM or 28C16 BIOS EEPROM (bottom left of memory card)
$0800..$08FF
0.25K
user RAM?
6116 BIOS RAM (top left of memory card)
$0900..$0FFF
1.75K
user RAM?
6116 user RAM (top left of memory card)
$1000..$17FF
2K
user RAM?
6116 RAM, 2716 ROM, or 28C16 EEPROM (bottom right of memory card)
$1800..$1FFF
2K
user RAM?
6116 RAM, 2716 ROM, or 28C16 EEPROM (top right of memory card)
$2000..$7FFF
24K
unmapped?
unmapped?
No.
German
English
Pages
1
Netzteil
Power supply
69-80
2
Busplatte
Bus board or backplane
81-92
3
Daten eingabe anzeige
Data input display
93-110
4
CPU
CPU
111-140
5
Addressen eingabe anzeige
Address input display
141-147
6
Speicher
Memory
148-172
7
Porteinheit
Port unit
173-189
8
A/D-Wandler
A/D converter (analog-to-digital converter)
190-212
9
Tastatur & anzeige
Keyboard & display
213-239
10
Casetten-interface
Cassette interface
240-249
German):
...C... ...D... ...E... ...F... ..CMD.. .FLAG..
...8... ...9... ...A... ...B... ..RUN.. ..MON..
...4... ...5... ...6... ...7... ..GOTO. ..PC...
...0... ...1... ...2... ...3... ..RST.. ..NXT.....a1.. ...a2.. ...a3.. .NumLk. ...n/.. ...n*..
...Q... ...W... ...E... ...n7.. ...n8.. ...n9..
...A... ...S... ...D... ...n4.. ...n5.. ...n6..
...Z... ...X... ...C... ...n1.. ...n2.. ...n3..
Diode
Colour
CLOCK
red
OPACK
green
OPREQ
yellow
M/IO
red
RUN/WAIT
green
WRP
red
FLAG
red
Monitor BIOS
HEXDEZ (ZBSR,un *$3) @ $5E9 HEXBCD
CONV (ZBSR,un *$5) @ $230 CONVT
SEP (ZBSR,un *$7) @ $207 SEPNIB
COMB (ZBSR,un *$9) @ $21E COMNIB
DIS (ZBSR,un *$B) @ $E5 DISP
KIN (ZBSR,un *$D) @ $C4 KIN1
INIT (ZBSR,un *$F) @ $235 INIT1
SAVE (ZBSR,un *$11) @ $24E INIT2
RECAL (ZBSR,un *$13) @ $272 INIT3
CDIS (ZBSR,un *$15) @ $296 CDISP
BPGOT (ZBSR,un *$17) @ $574 BPFND
LODAT (ZBSR,un *$19) @ $149 LOAD
ADDSUB (ZBSR,un *$1B) @ $6A0 ADSB
MULT (ZBSR,un *$1D) @ $6CD MPYS
DIV (ZBSR,un *$1F) @ $700 DIVS
DEZHEX (ZBSR,un *$21) @ $649 BCDHEX
SEPD (ZBSR,un *$23) @ $197 SEPDIS
HEXD (ZBSR,un *$25) @ $774 HEXD1
DHEX (ZBSR,un *$27) @ $79D DHEX1
HEX (ZBSR,un *$29) @ $79F DHEX2
DEZ (ZBSR,un *$2B) @ $776 HEXD2
ERROR (ZBSR,un *$2D) @ $432 ERRKIN (ZBSR,un *$14) @ $384 KBIN
WBL (ZBSR,un *$16) @ $16A WRBL
WCH (ZBSR,un *$18) @ $425 WCHR
INPHX (ZBSR,un *$1A) @ $1B6 INHX
OUTHX (ZBSR,un *$1C) @ $4F HXO
LINEF (ZBSR,un *$1E) @ $45 LFC
PUT (ZBSR,un *$20) @ $2C1 SERO
GET (ZBSR,un *$22) @ $35E SERI
HXTAB (ZBSR,un *$24) @ $19A TABL
ADRES (ZBSR,un *$26) @ $185 ADDR
CONTR (ZBSR,un *$28) @ $48C CR
HO (ZBSR,un *$2A) @ $4E5 HOME1
CURSL (ZBSR,un *$2C) @ $4EE CURL3
CURSR (ZBSR,un *$2E) @ $52B CURR1
CURSU (ZBSR,un *$30) @ $5E6 CUUP1
CURSD (ZBSR,un *$32) @ $4C2 LF1
SCCLR (ZBSR,un *$34) @ $4CA CLR2
BACK (ZBSR,un *$36) @ $51A BACK1
B
C
Dump
E
I
Load
R
Verify
Game Help
German Name
English Translation
440-Hz-Programm zum Abgleich des CLOCK-Oszillators
440 Hz program for the adjustment of clock oscillator
Portadressierung
Port addressing
Einfache Addition
Simple addition
Einfache Subtraktion
Simple subtraction
Einfache Multiplikation
Simple multiplication
Einfache Division
Simple division
Verkehrsampel 1
Traffic lights 1
Blinklicht
Beacon
Würfel
Dice
Metronom
Metronome
Lauflicht
Running light
Voltmeter mit dualer Anzeige
Dual display voltmeter
Denkzeitbegrenzer
Think time limiter
Verkehrsampel 2
Traffic lights 2
VU-Meter
Vumeter
Laufschrift
Scrolling text
Würfelspiel
Dice game
Reaktionstest
Reaction test
Stoppuhr
Stopwatch
Digitaluhr
Digital clock
HEX-DEZ-HEX-Wandlung
Hexadecimal-decimal-hexadecimal conversion
HEX-Rechnen
Hexadecimal calculation
DEZ-Rechnen
Decimal calculation
Lottozahlen
Lotto numbers
Morse-Übungsprogramm
Morse code practice
Voltmeter 2 (3stellig dezimal)
Voltmeter 2 (3-digit decimal)
for (;;)
{ gosub GDEZ;
*($827) = r3;
*($828) = r2;
do
{ gosub KIN;
r3 = *($800);
REGS = r3;
} while (r3 <= $0F || r3 >= $50);
gosub GDEZ;
*($829) = r3;
*($82A) = r2;
r3 = REGS;
switch (r3)
{
case '-': PSL |= COM ; gosub ADDSUB;
acase '+': PSL &= ~(COM); gosub ADDSUB;
acase '*': gosub MULT;
acase '/': gosub DIV;
adefault: r3 = *($812) = '3'; // 6th digit
goto ERROR;
}
gosub HEXD;
gosub KIN;
}
do
{ gosub CDIS;
gosub KIN;
PSL &= ~(WC);
r3 = *($800);
if (r3 == '+')
{ *($8FF) = '+';
r3 = *($80D) = 'P'; // 1st digit
} elif (r3 == '-')
{ *($8FF) = '-';
r3 = *($80D) = '-'; // 1st digit
} }
while (*($800) != '+' && *($800) != '-');
r2 = *($82D) = 5;
gosub LODAT;
r3 = $20;
if (*($8FF) != '-')
{ *($81A) |= $90;
}
*($82E..$830) = *($81A..$81C);
gosub DEZHEX;
r3 = *($82B);
r2 = *($82C);
return;.......* means 1 was rolled
......*. means 2 was rolled
......** means 3 was rolled
.....*.. means 4 was rolled
.....*.* means 5 was rolled
.....**. means 6 was rolledfor (;;)
{ *($80D..$812) = 0;
*($81B) = 0;
for (i = 0; i < 3; i++)
{ gosub RANDOM;
gosub SUMME;
gosub CONV;
*($80D + i) = r3; // 1st..3rd segments
gosub KIN;
} }
*($81C) = r3;
*($81B) += r3;
*($82B) = 0;
*($82C) = r3;
gosub HEXDEZ;
r3 = *($830);
*($801) = r3;
gosub SEP;
r3 = *($801);
gosub CONV;
*($811) = r3; // 5th segment
r3 = *($802);
gosub CONV;
*($812) = R3; // 6th segment
r3 = *($81C);
return;
r0 = PSU & Sense;
NEW:
r3 = 0;
LOOP:
r3++;
if (r3 == 7) goto NEW;
r0 = PSU & Sense;
compare r0 against *($815);
if (==) goto LOOP;
return;gosub CDIS; // clear display
*(LOTTO..LOTTO+14) = 0; // or, *($8F0..$8FE) = 0;
RSLT = 0;
for (*($8F7) = 1; *($8F7) <= 7; *($8F7)++)
{ *(LOTTO + *($8F7)) = RANDOM();
*($82C) = *($8F7);
gosub HEXDEZ;
r3 = *($830);
DATA2 = r3;
gosub SEP;
*($812) = CONV(DATA3); // 6th digit
*($811) = CONV(DATA2); // 5th digit
*($80D) = CONV(*($8F7)); // 1st digit
gosub KIN;
}
goto START;
WBUF = PSU & Sense;
for (r3 = 1; r3 <= 49; r3++)
{ if ((PSU & Sense) != WBUF)
{ r0 = r3;
for (r2 = 1; r2 <= 7; r2++)
{ if (r0 == *(LOTTO + r2))
{ goto RANDOM;
} } } }
return; // result is in r0 and also in r3
$8F1..$8F6 are the drawn numbers.
$8F7 is the sequence number (1..3).
Character
Data
Morse
Notes
A
$0240
%.-000000
-
B
$0480
%-...0000
-
C
$04A0
%-.-.0000
-
D
$0380
%-..00000
-
E
$0100
%.0000000
-
...
...
...
...
Z
$04C0
%--..0000
-
0
$05F8
%-----000
-
1
$0578
%.----000
-
...
...
...
...
9
$05F0
%----.000
-
=
$0588
%-...-000
-
;
$06A8
%-.-.-.00
-
,
$06CC
%--..--00
-
-
$0684
%-....-00
-
/
$0590
%-..-.000
-
:
$06E0
%---...00
-
?
$0630
%..--..00
-
.
$0654
%.-.-.-00
-
$05A8
%-.-.-000
Starting signal (/KA aka /CT)
+
$0550
%.-.-.000
New message follows (/RN aka /AR)
MIKIT 2650
Region
Size
MIKIT 2650-K1, 2650-P1
MIKIT 2650-K21, 2650-P21, 2650-K1+2650-K2
$0000..$01FF
512 bytes
BIOS ROM
BIOS ROM
$0200..$03FF
512 bytes
unmapped?
BIOS ROM
$0400..$041F
32 bytes
BIOS RAM
BIOS RAM
$0420..$04FF
234 bytes
user RAM
user RAM
$0500..$07FF
768 bytes
unmapped?
user RAM
$0800..$7FFF
30K
unmapped?
unmapped?
MIKIT 2650-K1, 2650-P1 have 4 I/O ports, 512 bytes of ROM, 256 bytes of RAM.
MIKIT 2650-K21, 2650-P21, 2650-K1+2650-K2 have 8 I/O ports, 1K of ROM, 1K of RAM,
and support cassette and teletype I/O.
The 6 LED digits are at $402..$407 (in BIOS RAM).
$FD is the entry point to the BIOS display routine.
The cassette recorder uses port 227 ($E3) for input and port 228 ($E4) for output.
The teletype uses port 229 ($E5) for input and port 226 ($E2) for output.
.BLANK. ...R... ...C... ...D... ...E... ...F...
...+... ...G... ...8... ...9... ...A... ...B...
...H... ...P... ...4... ...P... ...6... ...7...
...L... ...S... ...0... ...1... ...2... ...3...
R = Read
+ = Add?
G = Go
H = Halt
P = Punch
L = Load
S = Store
...a1.. ...a2.. ...a3.. .NumLk. ...n/.. ...n*..
...Q... ...W... ...E... ...n7.. ...n8.. ...n9..
...A... ...S... ...D... ...n4.. ...n5.. ...n6..
...Z... ...X... ...C... ...n1.. ...n2.. ...n3..Game Help
enable interrupts
use main register bank
clear With Carry
set signed compare
for (;;)
{ for (r1 = 1, r3 = N; r3 > 0; r1++, r3--)
{ r0 = *(&A + r3);
if (r1 == r0)
{ PORTC = r1;
}
while (PORTC != *(&B + r3));
} }enable interrupts
use main register bank
clear With Carry
set signed compare
AUS:
use main register bank
PORTC = ........; // clear glow LEDs
while (PORTC & %10000000);
for (;;)
{ PORTC = .......#; // light one glow LED
for (r4 = 256; r4 > 0; r4--)
{ for (r5 = 48; r5 > 0; r5--)
{ if (PORTC & %00000001 == %00000000)
{ goto AUS;
} } }
PORTC = ........; // clear glow LEDs
for (r4 = 256; r4 > 0; r4--)
{ for (r5 = 48; r5 > 0; r5--)
{ if (PORTC & %00000001 == %00000000)
{ goto AUS;
} } } }enable interrupts
use main register bank
clear With Carry
set unsigned compare
*($402..$407) = $66;
for (;;)
{ for (r1 = 6; r1 > 0; r1--)
{ gosub $FD;
if (PORTC & %10000000 == %00000000)
{ *($407) = r1;
do
{ gosub $FD;
r0 = PORTC;
} while (r0 >= 1 && r0 <= 127);
} } }
As soon as the numbers begin incrementing, press eg. the '1' key.
The keys you have to press are stored in *($52A..$52C) (in reverse order).
COD is $529.
Press 1, then 2, then 3.
The entire game is as follows:
enable interrupts
use main register bank
clear With Carry
set unsigned compare
PORTC = 0; // clear glow LEDs
while (PORTC != *($52D)); // wait for first key
for (r1 = 2; r1 >= 0; r1--)
{ for (r2 = 256; r2 > 0; r2--)
{ wait
if (PORTC == *(&COD + r1)) // if pressed correct key
{ goto S1;
} }
PORTC = ########; // lose
for (;;);
S1:
;
}
PORTC = #.#.#.#.; // win
for (;;);Coin-ops
Name
Company
Year
Colours
Graphics
Sound
Flipping
Conversion kit
OR
CE
DK
GA
PM
SC
3-D Bowling
Meadows
1978
100%
100%
0%
Yes
OR
8 Ball Action
Meadows
1978
100%
100%
100%
Yes
DK
PM
Astro Wars
Zaccaria
1980
100%
99%
99%
No
OR
Bigfoot Bonkers
Meadows
1976
100%
100%
100%
Yes
OR
Bulls Eye Darts
Senko/Shinkai
1985
0%
99/100%
100%
Yes
CE
GA
Cat and Mouse
Zaccaria
1982
100%
100%
99%
Yes
OR
Continental (bingo)
Bally
1980
-
-
0%
-
OR
Cosmos
Century
1981
100%
100%
99%
No
OR
Dark Warrior
Century
1981
100%
100%
99%
No
OR
Dazzler
Century
1982
100%
100%
99%
No
OR
Dead Eye
Meadows
1978
100%
100%
100%
Yes
OR
Digger
Century
1982
100%
100%
99%
No
OR
Dodgem
Zaccaria
1979
100%
100%
99%
Yes
OR
Driving Force
Shinkai
1984
100%
100%
100%
Yes
GA
PM
Embargo
Cinematronics
1977
100%
100%
0%
Yes
OR
Galaxia
Zaccaria
1979
100%
99%
99%
No
OR
Gold Bug
Century
1982
100%
100%
99%
No
OR
Gypsy Juggler
Meadows
1978
100%
99%
100%
Yes
OR
Heart Attack
Century
1983
100%
100%
99%
No
OR
Herbie at the Olympics
Seatongrove
1984
100%
100%
100%
Yes
DK
Hero 1
Seatongrove
1984
100%
100%
100%
Yes
OR
Hero 2
Seatongrove
1984
100%
100%
100%
Yes
DK
Hex Pool
Senko
1985
100%
100%
100%
Yes
GA
Hunchback
Century
1983
100%
100%
99/100%
No/Yes
OR
DK
GA
SC
Hunchback Olympic
Seatongrove
1984
100%
100%
99/100%
No/Yes
OR
SC
Inferno
Meadows
1978
100%
100%
0%
Yes
OR
Laser Battle & Lazarian
Zaccaria
1981
100%
100%
99%
Yes
OR
Lazer Command
Meadows
1976
100%
100%
100%
Yes
OR
Logger
Century
1982
100%
100%
99%
No
OR
Malzak 1 & 2
Kitronix
198x
1%
1%
1%
-
OR
Outline & Radar Zone
Century
1982
100%
100%
99%
No
OR
Porky
Shinkai
1985
100%
100%
100%
Yes
PM
Quasar
Zaccaria
1980
100%
100%
99%
No
OR
Quiz Show
Kee
1976
-
-
-
-
OR
Raiders
Century
1983
100%
100%
99%
No
OR
Rack + Roll
Senko
1986
100%
100%
100%
Yes
GA
Sea Battle & Armada
Zaccaria
1980
99%
99%
0%
Yes
OR
Shooting Gallery
Seatongrove
1984
100%
100%
99%
Yes
DK
Space Fortress
Century
1981
100%
100%
99%
No
OR
Space Warp?
Cosmos
1983
0%
-
-
-
GA
Special Forces 1 & 2
Senko
1985
100%
100%
100%
Yes
DK
Sub Hunter
Model Racing
1979
-
-
0%
-
OR
Superbike
Century
1983
100%
100%
99%
No
OR
DK
GA
The Invaders
Zaccaria
1979?
100%
100%
99%
Yes
OR
Trivia Challenge
Senko
1985
-
-
-
-
GA
Video 8 Ball
Century
1982
100%
100%
99%
No
OR
Wall Street
Century
1982
100%
100%
99%
No
OR
CE = Centipede
DK = Donkey Kong/Donkey Kong Jr.
GA = Galaxian [sic]
PM = Pac-Man
SC = Scramble
Jack Rabbit
Money Money
Motor Show
Scorpion
Name
Licensor
Year
Graphics
Sound
Flipping
CPU(s)
Astro Invader
Konami
1981
100%
99%
Yes
Z80
Circus
Exidy?
1977
100%
99%
Yes
6502
Crazy Climber
Nichibutsu?
1980
100%
100%
Yes
Z80
Funky Fish
Tekhan
1981
100%
100%
Yes
2*Z80
Jump Bug
Coreland
1981
100%
99%
Yes
Z80
Jungler
Konami
1981
100%
100%
Yes
2*Z80
Pleiades
Tekhan
1981
99%
100%
Yes
8085A
R2D Tank
Sigma
1980
100%
100%
Yes
6802+6809
Red Clash
Tehkan
1981
99%
99%
Yes
Z80
Route 16
Tekhan
1981
100%
100%
Yes
2*Z80
Spiders
Sigma
1981
100%
99%
Yes
6802+6809
The End
Konami
1980
100%
100%
Yes
2*Z80
Turtles/Turpin
Konami
1981
100%
100%
Yes
2*Z80
Malzak
Region
Size
Malzak 1
Malzak 2
$0000..$07FF
2K
from $0000..$07FF of malzak.5 (ROM code)
from $0000..$07FF of malzak.1a (ROM code)
$0800..$0BFF
1K
from $0000..$03FF of malzak.4 (ROM code)
from $0000..$03FF of malzak.2b (ROM code)
$0C00..$0FFF
1K
from $0000..$03FF of malzak.3 (ROM data) (screen data?)
banked area (controlled by bit 6 of I/O port $40)
Malzak 1: from $0000..$03FF of malzak.4d (ROM data) (screen data)
Malzak 2: from $0400..$07FF of malzak.4d (ROM data) (screen data)
$1000..$13FF
1K
RAM
RAM
$1400..$14FF
256 bytes
1st PVI
1st PVI
$1500..$15FF
256 bytes
2nd PVI
2nd PVI
$1600..$16FF
256 bytes
playfield tilemap
playfield tilemap
$1700..$17FF
256 bytes
RAM
NVRAM
$1800..$1E3F
1600 bytes
teletext screen contents
teletext screen contents
$1E40..$1FFF
448 bytes
RAM?
RAM?
$2000..$27FF
2K
from $0800..$0FFF of malzak.5 (ROM code)
from $0800..$0FFF of malzak.1a (ROM code)
$2800..$2BFF
1K
empty
from $0800..$0BFF of malzak.2b
$2C00..$2FFF
1K
empty
empty
$3000..$3FFF
4K
mirror of $1000..$1FFF
mirror of $1000..$1FFF
$4000..$43FF
1K
from $0400..$07FF of malzak.4 (ROM code) (terrain code)
from $0400..$07FF of malzak.2b (ROM code) (terrain code)
$4400..$4BFF
2K
from $0000..$07FF of malzak.3 (ROM data) (terrain data)
banked area? If so...
Malzak 1: from $0000..$07FF of malzak.3 (ROM data) (terrain data)
Malzak 2: from $0000..$07FF of malzak.3c (ROM data) (terrain data)
$4C00..$4FFF
1K
empty
empty
$5000..$5FFF
4K
mirror of $1000..$1FFF
mirror of $1000..$1FFF
$6000..$63FF
1K
empty
from $0C00..$0FFF of malzak.2b
$6400..$6FFF
3K
empty
empty
$7000..$7FFF
4K
mirror of $1000..$1FFF
mirror of $1000..$1FFF
$1xxx is deliberately mirrored at $3xxx, $5xxx, $7xxx, because on
the 2650, you can only access data on the same 8K page, so mirroring is
very useful for the game programmer (otherwise code in the $2000..$7FFF
region could not directly access any of the RAM).
P1, P2 buttons
Firebutton
Coin slot
Test switch (Malzak 2 only)
Bit 6: left (active high)
Bit 5: right (active high)
Bit 4: fire (active high)
Bit 3: 2P (active high)
Bit 2: 1P (active high)
Bit 1: down (active high)
Bit 0: coin slot (active low)
Astro Wars & Galaxia
Region
Size
Astro Wars
Galaxia
$0000..$03FF
1K
from $0000..$03FF of 08h.bin (ROM)
from $0000..$03FF of 08h.bin (ROM)
$0400..$07FF
1K
from $0000..$03FF of 10h.bin (ROM)
from $0000..$03FF of 10h.bin (ROM)
$0800..$0BFF
1K
from $0000..$03FF of 11h.bin (ROM)
from $0000..$03FF of 11h.bin (ROM)
$0C00..$0FFF
1K
from $0000..$03FF of 13h.bin (ROM)
from $0000..$03FF of 13h.bin (ROM)
$1000..$13FF
1K
from $0000..$03FF of 08i.bin (ROM)
from $0000..$03FF of 08i.bin (ROM)
$1400..$14FF
256 bytes
RAM
banked:
when Flag bit of PSU is clear: bullet RAM
when Flag bit of PSU is set: palette RAM (16 bytes)
$1500..$15FF
256 bytes
PVI
1st PVI
$1600..$16FF
256 bytes
unmapped?
2nd PVI
$1700..$17FF
256 bytes
unmapped?
3rd PVI
$1800..$1BFF
1K
banked:
when Flag bit of PSU is clear: screen colours
when Flag bit of PSU is set: screen contents
banked:
when Flag bit of PSU is clear: screen colours
when Flag bit of PSU is set: screen contents
$1C00..$1CFF
256 bytes
banked:
when Flag bit of PSU is clear: bullet RAM
when Flag bit of PSU is set: palette RAM (16 bytes)
RAM
$1D00..$1FFF
768 bytes
unmapped?
RAM
$2000..$23FF
1K
from $0000..$03FF of 10i.bin (ROM)
from $0000..$03FF of 10i.bin (ROM)
$2400..$27FF
1K
from $0000..$03FF of 11i.bin (ROM)
from $0000..$03FF of 11i.bin (ROM)
$2800..$2BFF
1K
from $0000..$03FF of 13i.bin (ROM)
from $0000..$03FF of 13i.bin (ROM)
$2C00..$2FFF
1K
from $0000..$03FF of 11l.bin (ROM)
from $0000..$03FF of 11l.bin (ROM)
$3000..$33FF
1K
from $0000..$03FF of 13l.bin (ROM)
from $0000..$03FF of 13l.bin (ROM)
$3400..$3FFF
3K
mirror of $1400..$1FFF
mirror of $1400..$1FFF
$4000..$53FF
5K
unknown
unknown
$5400..$5FFF
3K
mirror of $1400..$1FFF
mirror of $1400..$1FFF
$6000..$73FF
5K
unknown
unknown
$7400..$7FFF
3K
mirror of $1400..$1FFF
mirror of $1400..$1FFF
Laser Battle & Lazarian
Region
Size
Laser Battle
Lazarian
$0000..$03FF
1K
from $0000..$03FF of lb02.7c/laz.7c/02-1.7c
from $0000..$03FF of lb02.7c/laz.7c/02-1.7c
$0400..$07FF
1K
from $0000..$03FF of lb02.6c/laz.6c/02-2.6c
from $0000..$03FF of lb02.6c/laz.6c/02-2.6c
$0800..$0BFF
1K
from $0000..$03FF of lb02.5c/laz.5c/02-3.5c
from $0000..$03FF of lb02.5c/laz.5c/02-3.5c
$0C00..$0FFF
1K
from $0000..$03FF of lb02.3c/laz.3c/02-4.3c
from $0000..$03FF of lb02.3c/laz.3c/02-4.3c
$1000..$13FF
1K
from $0000..$03FF of lb02.2c/laz.2c/02-5.2c
from $0000..$03FF of lb02.2c/laz.2c/02-5.2c
$1400..$14FF
256 bytes
unused
unused
$1500..$15FF
256 bytes
1st PVI
1st PVI
$1600..$16FF
256 bytes
2nd PVI
2nd PVI
$1700..$17FF
256 bytes
3rd PVI
3rd PVI
$1800..$1BFF
1K
display RAM (write-only)
display RAM (write-only)
$1C00..$1FFF
1K
user RAM
user RAM
$2000..$23FF
1K
from $0000..$03FF of lb02.7b/laz.7b/02-6.7b
from $0000..$03FF of lb02.7b/laz.7b/02-6.7b
$2400..$27FF
1K
from $0000..$03FF of lb02.6b/laz.6b/02-7.6b
from $0000..$03FF of lb02.6b/laz.6b/02-7.6b
$2800..$2BFF
1K
from $0000..$03FF of lb02.5b/laz.5b/02-8.5b
from $0000..$03FF of lb02.5b/laz.5b/02-8.5b
$2C00..$2FFF
1K
from $0000..$03FF of lb02.3b/laz.3b/02-9.3b
from $0000..$03FF of lb02.3b/laz.3b/02-9.3b
$3000..$33FF
1K
from $0000..$03FF of lb02.2b
from $0800..$0BFF of laz10-62.2b
$3400..$37FF
1K
mirror of $1400..$17FF
mirror of $1400..$17FF
$3800..$3BFF
1K
mirror of $1800..$1BFF?
from $0000..$03FF of laz10-62.2b
$3C00..$3FFF
1K
mirror of $1C00..$1FFF
mirror of $1C00..$1FFF
$4000..$43FF
1K
from $0400..$07FF of lb02.7c/laz.7c/02-1.7c
from $0400..$07FF of lb02.7c/laz.7c/02-1.7c
$4400..$47FF
1K
from $0400..$07FF of lb02.6c/laz.6c/02-2.6c
from $0400..$07FF of lb02.6c/laz.6c/02-2.6c
$4800..$4BFF
1K
from $0400..$07FF of lb02.5c/laz.5c/02-3.5c
from $0400..$07FF of lb02.5c/laz.5c/02-3.5c
$4C00..$4FFF
1K
from $0400..$07FF of lb02.3c/laz.3c/02-4.3c
from $0400..$07FF of lb02.3c/laz.3c/02-4.3c
$5000..$53FF
1K
from $0400..$07FF of lb02.2c/laz.2c/02-5.2c
from $0400..$07FF of lb02.2c/laz.2c/02-5.2c
$5400..$5FFF
3K
mirror of $1400..$1FFF?
mirror of $1400..$1FFF?
$6000..$63FF
1K
from $0400..$07FF of lb02.7b/laz.7b/02-6.7b
from $0400..$07FF of lb02.7b/laz.7b/02-6.7b
$6400..$67FF
1K
from $0400..$07FF of lb02.6b/laz.6b/02-7.6b
from $0400..$07FF of lb02.6b/laz.6b/02-7.6b
$6800..$6BFF
1K
from $0400..$07FF of lb02.5b/laz.5b/02-8.5b
from $0400..$07FF of lb02.5b/laz.5b/02-8.5b
$6C00..$6FFF
1K
from $0400..$07FF of lb02.3b/laz.3b/02-9.3b
from $0400..$07FF of lb02.3b/laz.3b/02-9.3b
$7000..$73FF
1K
from $0C00..$0FFF of lb02.2b/laz10-62.2b/02-10-11.2b
from $0C00..$0FFF of lb02.2b/laz10-62.2b/02-10-11.2b
$7400..$77FF
1K
mirror of $1400..$17FF?
mirror of $1400..$17FF?
$7800..$7BFF
1K
mirror of $1800..$1BFF?
from $0400..$07FF of laz10-62.2b
$7C00..$7FFF
1K
mirror of $1C00..$1FFF?
mirror of $1C00..$1FFF?
Input
Bit(s)
Laser Battle
Lazarian
$00
7
Button 4 (0=pressed, 1=unpressed)
Button 4 (0=pressed, 1=unpressed)
$00
6
Button 3 (0=pressed, 1=unpressed)
Button 3 (0=pressed, 1=unpressed)
$00
5
Button 2 (0=pressed, 1=unpressed)
Button 2 (0=pressed, 1=unpressed)
$00
4
Button 1 (0=pressed, 1=unpressed)
Button 1 (0=pressed, 1=unpressed)
$00
3
Service A (0=pressed, 1=unpressed)
Service A (0=pressed, 1=unpressed)
$00
2
Coin B (0="pressed", 1="unpressed")
Coin B (0="pressed", 1="unpressed")
$00
1
P2 start (0=pressed, 1=unpressed)
P2 start (0=pressed, 1=unpressed)
$00
0
P1 start (0=pressed, 1=unpressed)
P1 start (0=pressed, 1=unpressed)
$10
7
Reset (0="pressed", 1="unpressed")
Reset (0="pressed", 1="unpressed")
$10
6
Coin A (0="pressed", 1="unpressed")
Coin A (0="pressed", 1="unpressed")
$10
5
?
?
$10
4
?
?
$10
3
?
?
$10
2
?
?
$10
1
?
?
$10
0
?
?
$20
7
Collision detection (0=off, 1=on)
Collision detection (0=off, 1=on)
$20
6
Infinite lives (0=off, 1=on)
Calibration display (0=off, 1=on)
$20
5..4
Lives:
%00 = 2 lives
%01 = 3 lives
%10 = 5 lives
%11 = 6 lives
Lives:
%00 = 2 lives
%01 = 3 lives
%10 = 4 lives
%11 = 5 lives
$20
3..2
Coin B generosity:
%00 = 2 credits
%01 = 3 credits
%10 = 5 credits
%11 = 7 credits
Coin B generosity:
%00 = 2 credits
%01 = 3 credits
%10 = 5 credits
%11 = 7 credits
$20
1..0
Coin A generosity:
%00 = 1 credit
%01 = 2 credits
%10 = 3 credits
%11 = 5 credits
Coin A generosity:
%00 = ½ credit
%01 = 1 credit
%10 = 2 credits
%11 = 3 credits
$30
7
Joystick down (0=yes, 1=no)
Joystick down (0=yes, 1=no)
$30
6
Joystick up (0=yes, 1=no)
Joystick up (0=yes, 1=no)
$30
5
Joystick right (0=yes, 1=no)
Joystick right (0=yes, 1=no)
$30
4
Joystick left (0=yes, 1=no)
Joystick left (0=yes, 1=no)
$30
3
?
?
$30
2
?
Freeze (0=off, 1=on)
$30
1
?
Firing (0=rapid, 1=normal)
$30
0
?
?
Zaccaria Pinball for Android
Zaccaria Pinball for Switch
If WinRAR complains that the file is corrupt, your WinRAR version is
probably too old (eg. WinRAR 3.62 and earlier are definitely too old);
you will need to download and install a more recent version of WinRAR
from https://www.rarlab.com .
Zaccaria Pinball for Windows
Extract it all to somewhere (eg. C:\GAMES\ZACCARIA). The password is cs.rin.ru .
If WinRAR complains that the file is corrupt, your WinRAR version is
probably too old (eg. WinRAR 3.62 and earlier are definitely too old);
you will need to download and install a more recent version of WinRAR
from https://www.rarlab.com .
Extract everything from SSE_v1.4.3 directory into the same directory as
previously (thus overwriting ZaccariaPinball.exe and steam_api.dll).
The password is cs.rin.ru .
3a. Click on an empty part of the desktop, right-click and choose
"New|Shortcut".
3b. Click "Browse...".
3c. Navigate to where SmartSteamLoader.exe is located (eg.
C:\GAMES\ZACCARIA), click the SmartSteamLoader.exe file, and click
"OK".
3d. Click "Next...".
3e. Change the shortcut name to eg. "Zaccaria Pinball" or whatever and
press ENTER.
4. If you want a better icon for the shortcut:
4a. Download the icon from
https://cdn.cloudflare.steamstatic.com/steamcommunity/public/images/apps/444930/08bf6c6da88227cce20ef9e1993f128235a8a46f.ico
(or "Save as.." the icon here on the right)
into the same directory as SmartSteamLoader.exe (C:\GAMES\ZACCARIA or wherever).
4b. Click on the shortcut, right-click and choose "Properties".
4c. Click "Change Icon...".
4d. Click "Browse...".
4e. Double-click the 08bf6c6da88227cce20ef9e1993f128235a8a46f.ico file.
4f. Click "OK" twice.
6a. Microsoft Visual C++ 2008 Redistributable Package (4,483,040 bytes)
from
https://download.microsoft.com/download/5/D/8/5D8C65CB-C849-4025-8E95-C3966CAFD8AE/vcredist_x86.exe. Run the installer.
Or:
6b. Microsoft Visual C++ 2010 SP1 Redistributable Package MFC Security
Update (8,993,774 bytes) from
https://download.microsoft.com/download/1/6/5/165255E7-1014-4D0A-B094-B6A430A6BFFC/vcredist_x86.exe. Run the installer and choose the "Repair" option.
(You need the x86 (32-bit) version even if you have an x64 (64-bit) CPU.)
You can get this from https://openal.org/downloads/oalinst.zip.
Extract oalinst.exe anywhere and run it.
Name
Company
Year
MAME
ZP
Bonus
CPU(s)
Aerobatics
Zaccaria
1977
No
Yes
?
None
Black Belt
Zaccaria
1986
0%
Yes
Yes
2650
Cinestar
Zaccaria
1974
No
Yes
?
None
Circus (pinball)
Zaccaria
1977
No
Yes
?
None
Clown (pinball)
Zaccaria
1985
0%
Yes
Yes
2650
Combat (pinball)
Zaccaria
1977
No
Yes
?
None
Devil Riders
Zaccaria
1984
0%
Yes
Yes
2650
Earth, Wind, Fire
Zaccaria
1981
0%
Yes
Yes
2650+8035
Farfalla
Zaccaria
1983
0%
Yes
Yes
2650
Fire Mountain
Zaccaria
1980
0%
Yes
No
2650
Future World
Zaccaria
1978
0%
Yes
No
2650
Granada
Zaccaria
1974
No
Yes
?
None
Hot Wheels
Zaccaria
1979
0%
Yes
No
2650
House of Diamonds
Zaccaria
1978
0%
Yes
No
2650
Locomotion
Zaccaria
1981
0%
Yes
Yes
2650+8035
Lucky Fruit
Zaccaria
1975
No
Yes
?
None
Magic Castle
Zaccaria
1984
0%
Yes
Yes
2650
Mexico '86
Zaccaria
1986
0%
Yes
Yes
2650
Moon Flight
Zaccaria
1976
No
Yes
?
None
Mystic Star
Zaccaria
1986
0%
Yes
No
6800
Nautilus
Zaccaria
1977
No
Yes
?
None
New Star's Phoenix
Zaccaria
1987
0%
No
?
2650
Pinball Champ '82
Zaccaria
1982
No
Yes
Yes
?
Pinball Champ '83
Zaccaria
1983
0%
Yes
Yes
2650
Pool Champion
Zaccaria
1985
0%
Yes
Yes
2650
Red Show
Zaccaria
1975
No
Yes
?
None
Robot
Zaccaria
1985
0%
Yes
Yes
2650
Scramble (pinball)
Tecnoplay
1987
0%
No
?
2650
Shooting the Rapids
Zaccaria
1979
0%
Yes
No
2650
Ski Jump (prototype)
Zaccaria
1978
0%
No
?
SC/MP
Soccer Kings
Zaccaria
1982
0%
Yes
Yes
2650
Space City (prototype)
Zaccaria
1979
0%
No
?
SC/MP
Space Shuttle
Zaccaria
1980
0%
Yes
No
2650+8035
Spooky
Zaccaria
1987
0%
Yes
Yes
2650
Star God
Zaccaria
1980
0%
Yes
No
2650
Star's Phoenix
Zaccaria
1987
0%
Yes
Yes
2650
Strike
Zaccaria
1978
0%
Yes
No
SC/MP
Supersonic
Zaccaria
1977
No
Yes
?
None
Thunder Man
Apple Time
1987
0%
No
?
2650
Time Machine
Zaccaria
1983
0%
Yes
Yes
2650
Top Hand
Zaccaria
1974
No
Yes
?
None
Tropical
Zaccaria
1974
No
Yes
?
None
Universe
Zaccaria
1977
No
Yes
?
None
Winter Sports (pinball)
Zaccaria
1978
0%
Yes
No
2650
Wood's Queen
Zaccaria
1976
No
Yes
?
None
Zankor
Zaccaria
1986
0%
Yes
Yes
2650
ZP: Zaccaria Pinball v20220905.
Bonus: whether the table has an annoying time-limited bonus ball.
1978-1981 games are 1st generation solid state ("SS").
1982-1987 games are 2nd generation solid state ("SS").
Comparative Tables
Platform
Keyboard input
VDU output
Tape input
Tape output
Tape format
Motor control
Emerson Arcadia 2001
Memory mapped
Memory mapped
n/a
n/a
n/a
n/a
Interton VC 4000
Memory mapped
Memory mapped
n/a
n/a
n/a
n/a
Elektor TV Games Computer
Memory mapped
Memory mapped
1515+ baud raw via CASIN
1515+ baud raw via CASOUT
EOF
No
PIPBUG 1
110 baud teletype via Sense
110 baud teletype via Flag
110 baud CUTS via Sense
110 baud CUTS via Flag
AOF
No
PIPBUG 2
110/300 baud teletype via Sense
110/300 baud teletype via Flag
110/300 baud CUTS via Sense
110/300 baud CUTS via Flag
AOF?
No?
HYBUG
300/600/1200 baud teletype?
300/600/1200 baud teletype?
300/600/1200 baud?
300/600/1200 baud?
?
?
BINBUG 3.6
300 baud teletype via Sense
Memory mapped
?
?
?
Yes, with ACOS
Signetics Instructor 50
Memory mapped
?
? baud via Sense
? baud via extended I/O port $F8
AOF
No?
Central Data 2650
Parallel keyboard via Data port
Memory mapped, 80*16 characters
Monochrome
300* baud CUTS via Sense
clear bit = 4 cycles of 1200Hz
set bit = 8 cycles of 2400Hz
300* baud CUTS via Flag
clear bit = 4 cycles of 1200Hz
set bit = 8 cycles of 2400Hz
AOF
Yes
PHUNSY
?
Memory mapped, 64*32 characters
8-level greyscale
?
?
?
?
Ravensburger Selbstbaucomputer
Parallel keyboard via port $07
Ports $1B & $1C
110 baud CUTS? via Sense
110 baud CUTS? via Flag
?
Yes
Platform
Drives
Size
Tracks
Track size
Sectors/track
Sector size
Sectors
Capacity
Format(s)
Dir sectors
DOS sectors
Max files
Controller
RPM
Speed
BINBUG
0+
5.25"
40 (0..39)
2.5K
10 (1..10)
256 bytes
400
100K
RAW
10
3
100
1 MHz FD1771
300
12.5K/sec
Central Data 2650
0-4
5.25"
35 (0..34)
2.25K
9 (1..9)
256 bytes
315
78.75K
RAW
18
128
64
1 MHz FD1771
300
11.25K/sec
Signetics TWIN
2
8"
77 (0..76)
4K
32 (0..31)
128 bytes
308
308K
IMG, TWIN
4
27
78
?
360
24K/sec
(Speed of reading/writing processed bytes, assuming an infinitely fast CPU.)
The drive motor on 8" floppy drives runs on 230V AC and is always on.
The drive is kept spinning at all times. The head is unloaded when idle,
but the disk is always spinning within its sleeve.
The drive motor on 5.25" floppy drives is turned on and off as required.
.IMG files are raw disk files of 308K (315,392 bytes), lacking sector and
block numbers.
.TWIN files are disk files of 320,320 bytes, the same as .IMG except that
each 128-byte sector is prepended with the track and sector numbers (thus
becoming 130 bytes per sector).
Printer
EUY-10E023LE
Centronics Model 306C
Condensed width
32 columns * 8 dots = 256 dots
132 columns
Normal width
32 columns * 8 dots = 256 dots
80 columns
Expanded width
16 columns * 16 dots = 256 dots
?
Speed
2 lines/sec (512 dots/sec)
?
Paper size (printable area)
? cm * 60 m
2.5..8" * 11"
Paper size (total)
6 cm * 60 m
4..9.5" * 11"
Horizontal characters per inch (condensed mode)
?
16.5
Horizontal characters per inch (normal mode)
?
10
Vertical characters per inch
?
6
CPU:
TVGC
PIPBUG 1
BINBUG 3.6
SI50
SDOS 3.0
Supervisor
Selbst
Ami/WinArcadia
See & alter IAR
PC
REG C
PC
J|JUMP
See & alter PSU
REG
S 7
S7
REG 7
SEt PSU
I8
CMD A
E|POKE PSU
See & alter PSL
REG
S 8
S8
REG 8
SEt PSL
I7
CMD A
E|POKE PSL
See & alter registers
REG
S 0..6
S0..S6
REG 0..6
SEt R0..R6
I0..I6
CMD A
E|POKE R0..R6
Set slave CPU mode
Ice
Memory:
TVGC
PIPBUG 1
BINBUG 3.6
SI50
SDOS 3.0
Supervisor
PHUNSY
Selbst
MIKIT
Ami/WinArcadia
Compare (verify) memory
V
COMP
Copy (move) memory
MOVe
M
NXT
COPY|MOVE
Dump memory to screen
D address1 address2
Dump
I
D|PEEK
Fill memory
Fill
P
FILL
Patch memory
REG F
Patch
:
See & alter memory
MEM
A address
A
MEM
Exam
WRite
A
:
NXT
Read
E|POKE
D|PEEK
Program control:
TVGC
PIPBUG 1
BINBUG 6/7
SI50
SDOS 3.0
CD2650
PHUNSY
Selbst
MIKIT
Ami/WinArcadia
Abort program
Abort
Cold start DOS
K
Continue program
Cont
G|P
Execute program
START
G address
G
RUN
Go
E (supervisor)
EXEC (CD DOS)
G
RUN
GOTO
PC
Go
G|P
Generate an interrupt
INT
GI
Reset machine
RST
RST
MON
F5 key
Step instruction
STEP
S
Suspend program
Suspend
G|P
Warm start DOS
W
Debugging:
TVGC
PIPBUG 1
BINBUG 3.6
SI50
SDOS 3.0
Supervisor
PHUNSY
Selbst
MIKIT
Ami/WinArcadia
Clear breakpoint
BP
C 1|2
C
BKPT
CLBp
C
BP1/2
CMD C
BC
Load debugger
DEBug
Relocate debug utility programs
Upr
Set breakpoint
BP
B 1|2 address
B
BKPT
BKpt
B
BP1/2
CMD B
Halt
BP
Set trace mode
TRace
T
Show status of debugger
DStat
V|VIEW CPU
BL, IL, WL
Show status of slave program
STatus
Tapes:
TVGC
PIPBUG 1
BINBUG 3.6
SI50
Supervisor
PHUNSY
Selbst
MIKIT
Adjust tape
REG A
Issue MDCR command
T
Load memory as AOF/EOF from tape
RCAS
L
L
RCAS
L
R
CMD F
Load
Run tape recorder
R
Save (dump) memory as AOF/EOF to tape
WCAS
D address1 address2
D
WCAS
D
W
CMD D
Store
Verify (check) tape
V
CMD E
Disks:
SDOS 3.0
CD DOS
Ami/WinArcadia
Copy disk
DUP
DISKCOPY
Format (initialize) disk
FORMAT
List files on disk
Ldir
LIST
DIR
List open files
LOPEN
Raw read
DISKRD
Raw write
DISKWR
Relabel disk
REName
Reset disk drives
RESTORE
Set default drive
DUNIT
Set system drive
SYstem
Show free disk space
Ldir
FREE
DIR
Show (inspect) raw sector(s)
INSPECT
Verify (check) disk
Verify
Files on disk:
SDOS 3.0
CD DOS
Ami/WinArcadia
Assemble source code
ASM
ASM
Compare files
CMPf
Copy file(s)
COPy
Delete file
DELete
DELETE
DEL
Dump file (to screen) as hex and ASCII
DFil
Edit file on disk
EDIT
Load (read) AOF file from device
Rhex
Load (read) IMAG file from disk
LOAD
Load (read) & run IMAG file from disk
RUN
Load (read) binary? file from disk
READ
Load (read) MOD file from device
LOad
Load (read) & run MOD file from device
XEQ
Rename file
REName
RENAME
Print file without line numbers
PRint
Print file with line numbers
PRINTL
Reserve disk space for a new file
ALLOC
Save (write) AOF file to device
WHex
Save (write) binary? file to disk
WRITE
Save (write) MOD file to device
Module
Save (write) IMAG file to disk
IMAGE
Set change code on file
CCODE
Set inspection code on file
ICODE
Truncate file
DEALLOC
Channels:
SDOS 3.0
CD DOS
Assign device to channel
ASSign
Close channel/file
CLose
CLOSE
Inform OS of peripheral availability
DEVice
Open file
OPEN
PROMs:
SDOS 3.0
MIKIT
Compare PROM against slave memory
CProm
Compare SMS file against slave memory
CSms
Punch memory as BPNF file to papertape
Punch
Read/write/verify PROM
PROm
Read PROM into slave memory
RProm
Write slave memory to PROM
WProm
Save (write) SMS file to device
WSms
Command (script) files:
SDOS 3.0
Comment
*
Toggle termination condition
Kill
Toggle echoing
TYpe
Memory banks:
PHUNSY
"Q" bank select/execute
Q
"U" bank select/execute
U
Show selected banks
=
I/O ports:
SDOS 3.0
Ami/WinArcadia
Read from I/O port
REad
READPORT
Write to I/O port
WRite
WRITEPORT
Miscellaneous:
SDOS 3.0
CD DOS
PHUNSY
Ami/WinArcadia
Log in/on
SIGNON
Set date
DATE
Set default file type
DTYPE
Set default codeword
ENTER
Show date
WHEN
Show error message
S
ERROR
Show OS ID
X
Letters in lowercase are optional.
Area
Arcadia (2622)
2621
BINBUG (DG640)
CD2650
PHUNSY
AY-3-8500-1
AY-3-8550
Horizontal back porch (pre-colourburst)
-17..-16 (2)
-21..-19 (3)
?
-
58..65 (8)
?
?
Horizontal back porch (colourburst)
-15..-7 (9)
-18..-10 (9)
?
-
66..81 (16)
?
?
Horizontal back porch (post-colourburst)
-6..-1 (6)
-9..-1 (9)
?
-
82..127 (46)
?
?
Horizontal back porch (total)
-17..-1 (17)
-21..-1 (21)
702?..767 (66?)
776..903 (128)
58..127 (70)
0..26 (27)
0..26 (27)
Main display area (horizontal)
0..-40 (188)
0..-44 (184)
0..575 (576)
0..639 (640)
128..511 (384)
27..99 (73)
27..99 (73)
Horizontal front porch
-39..-35 (5)
-43..-39 (5)
576..641? (66?)
640..711 (72)
0..25 (26)
100..115 (16)
100..115 (16)
Horizontal retrace
-34..-18 (17)
-38..-22 (17)
642?..701? (60?)
712..775 (64)
26..57 (32)
116..127 (12)
116..127 (12)
Total (horizontal)
-49..177 (227)
-49..177 (227)
0..767 (768)
0..903 (904)
0..511 (512)
0..127 (128)
0..127 (128)
Vertical back porch
-14..-1 (14)
-28..-1 (28)
~286.5?..312.5 (~26?)
228..263 (36)
273..312 (40)
0..41 (42)
0..43 (44)
Main display area (vertical)
0..241 (242)
0..268 (269)
0..255 (256)
0..191 (192)
0..255 (256)
42..233 (192)
44..275 (232)
Vertical front porch
-20..-18 (3)
-43..~-30.5 (~13.5)
256..281? (26?)
192..215 (24)
256..268 (13)
234..257 (24)
276..305 (30)
Vertical retrace
-17..-15 (3)
~-30.5..-29 (~2.5)
282?..~286.5? (~4.5?)
216..227 (12)
269..272 (4)
258..261 (4)
306..311 (6)
Total (vertical)
0..261 (262)
0..311 (312)
0..311.5 (312.5)
0..263 (264)
0..312 (313)
0..261 (262)
0..311 (312)
Main display
188*242=45,496
188*269=50,572
576*256=147,456
640*192=122,880
384*256=98,304
73*192=14,016
73*232=16,936
Entire display
227*262=59,474
227*312=70,824
768*312.5=240,000
904*264=238,656
512*313=160,256
128*262=33,536
128*312=39,936
Pixels per CPU cycle
4
4
12
12
8
-
-
Pixels per second (method A)
59,474*60=3,568,440
70,824*50=3,541,200
240,000*50=12,000,000
238,656*60=14,319,360
160,256*50=8,012,800
33,536*60=2,012,160
39,936*50=1,996,800
Pixels per second (method B)
227÷64=3,546,875
227÷64=3,546,875
768÷64=12,000,000
904÷64=14,125,000
512÷64=8,000,000
128÷64=2,000,000
128÷64=2,000,000
Pixels per second (method C)
3,579,545 (+/- 10)
3,546,895 (+/- 35)
?
14,192,640
?
?
?
CPU speed (Hz) (method A)
3,568,440÷4=892,110
3,541,200÷4=885,300
12,000,000÷12=1,000,000
14,319,360÷12=1,193,280
8,012,800÷8=1,001,600
-
-
CPU speed (Hz) (method B)
227÷4÷64=886,718.75
227÷4÷64=886,718.75
768÷12÷64=1,000,000
904÷12÷64=1,177,083'
512÷8÷64=1,000,000
-
-
CPU speed (Hz) (method C)
3,579,545÷4=894,886.25
3,546,895÷4=886,723.75
?
14,192,640÷12=1.18272
?
-
-
Frames per second (method A)
60÷1.001=~59.94 (NTSC)
50 (PAL)
50 (PAL)
60÷1.001=~59.94 (NTSC)
50 (PAL)
60÷1.001=~59.94 (NTSC)
50 (PAL)
Frames per second (method B)
3,546,875
÷59,474=~59.63740
3,546,875
÷70,824=~50.08013
12,000,000
÷240,000=50
14,125,000
÷238,656=~59.18561
8,000,000
÷160,256=~49.92013
2,000,000
÷33,536=~59.63740
2,000,000
÷39,936=~50.08013
Frames per second (method C)
3,579,545
÷59,474=~60.18672
3,546,895
÷70,824=~50.08040
?
14,192,640
÷238,656=~59.46903
?
?
?
To calculate pixels per µsec:
Divide width of screen (eg. 227) by duration of line (64 µsecs) = 3.546875 pixels per µsec.
To calculate µsecs per pixel:
Divide duration of line (64 µsecs) by width of screen (eg. 227) = 0.281938 µsecs per pixel (datasheet says 282 nsecs).
Method A assumes exactly 50/60 frames per second, and calculates all timings relative to that. (60÷1.001 would be more accurate than 60 for
colour NTSC.)
Method B assumes exactly 64 µsecs per rastline, and calculates all timings relative to that.
Method C uses the master clock frequency as documented in eg. service manual, and calculates all timings relative to that.
This is the most accurate method.
2650 CPU
Addressing Mode
Signetics Format
Signetics Example
CALM Format
CALM Example
IEEE-694 Format
IEEE-694 Example
Register
LODZ
reg
LODZ
r1
LOAD
A,reg
LOAD
A,B
LD
.0,.reg
LD
.0.,1
Immediate
LODI,reg
imm
LODI,r0
12
LOAD
reg,#imm
LOAD
A,#12
LD
.reg,#imm
LD
.0,#12
Relative direct
LODR,reg
rel
LODR,r0
1234
LOAD
reg,^rel
LOAD
A,^1234
LD
.reg,$rel
LD
.0,$1234
Relative indirect
LODR,reg
*rel
LODR,r0
*1234
LOAD
reg,^@rel
LOAD
A,^@1234
LD
.reg,$@rel
LD
.0,$@1234
Absolute direct
LODA,reg
abs
LODA,r0
1234
LOAD
reg,abs
LOAD
A,1234
LD
.reg,/abs
LD
.0,/1234
Absolute indirect
LODA,reg
*abs
LODA,r0
*1234
LOAD
reg,@abs
LOAD
A,@1234
LD
.reg,/@abs
LD
.0,/@1234
Indexed direct
LODA,r0
abs,reg
LODA,r0
1234,r1
LOAD
A,(reg)+abs
LOAD
A,(B)+1234
LD
.0,/abs(.reg)
LD
.0,/1234(.1)
Indexed indirect
LODA,r0
*abs,reg
LODA,r0
*1234,r1
LOAD
A,(reg)+@abs
LOAD
A,(B)+@1234
LD
.0,/@abs(.reg)
LD
.0,/@1234(.1)
Indexed direct with pre-increment
LODA,r0
abs,reg+
LODA,r0
1234,r1+
LOAD
A,(+reg)+abs
LOAD
A,(+B)+1234
LD
.0,/abs(+.reg)
LD
.0,/1234(+.1)
Indexed indirect with pre-increment
LODA,r0
*abs,reg+
LODA,r0
*1234,r1+
LOAD
A,(+reg)+@abs
LOAD
A,(+B)+@1234
LD
.0,/@abs(+.reg)
LD
.0,/@1234(+.1)
Indexed direct with pre-decrement
LODA,r0
abs,reg-
LODA,r0
1234,r1-
LOAD
A,(-reg)+abs
LOAD
A,(-B)+1234
LD
.0,/abs(-.reg)
LD
.0,/1234(-.1)
Indexed indirect with pre-decrement
LODA,r0
*abs,reg-
LODA,r0
*1234,r1-
LOAD
A,(-reg)+@abs
LOAD
A,(-B)+@1234
LD
.0,/@abs(-.reg)
LD
.0,/@1234(-.1)
Register
Bit(s)
Readable/Writable
Signetics
CALM
IEEE-694 Letter
2650/2650A
2650B
Name
Abbrev.
Letter
Name
Abbrev.
Letter
PSU
7
R/-
Sense
S
S
Input
I
I
?
PSU
6
R/W
Flag
F
F
Output
O
O
?
PSU
5
R/W
Interrupt Inhibit
II
I
Interrupt mask bit
IOF
F
I
PSU
4
-/-
R/W
User Flag #1
UF1
1
User Flag #1
UF1
1
?
PSU
3
-/-
R/W
User Flag #2
UF2
2
User Flag #2
UF2
2
?
PSU
2..0
R/W
Stack Pointer
SP
-
Stack Pointer
SP
-
?
PSL
7..6
R/W
Condition Code
CC
-
?
?
-
?
PSL
5
R/W
Inter-Digit Carry
IDC
D
Half carry
H
H
?
PSL
4
R/W
Register Select
RS
R
BANK1
B
B
?
PSL
3
R/W
With Carry
WC
W
WITHCARRY
W
W
?
PSL
2
R/W
Overflow
OVF
O
OVERFLOW
V
V
V
PSL
1
R/W
Compare
COM
M
LOGICOMP
L
L
?
PSL
0
R/W
Carry
C
C
CARRY
C
C
C
Signetics
CALM
IEEE-694
DFLT
-
BASE
DATA
.DATA.8
DATA
END
.END
END
EQU
.EQU
EQU
ORG
.LOC
ORG
PAGE
.PAGE
PAGE
RES
.BLK.8
RES
TITL
.TITLE
TITLE
Hex
Octal
Signetics
CALM
IEEE-694
Signetics pseudocode
PSU
PSL
Note
Opcode
Operands
Opcode
Operands
Opcode
Operands
S
F
II
SP
CC
IDC
RS
WC
OVF
COM
C
00
0
LODZ
r0
LOAD
A,A
MOV
.0,.0
if (r0 & $80) CC = LT; elif (r0 == 0) CC = EQ; else CC = GT;
-
-
-
-
W
-
-
-
-
-
-
1
01
1
LODZ
r1
LOAD
A,B
MOV
.0,.1
r0 = r1;
-
-
-
-
W
-
R
-
-
-
-
-
02
2
LODZ
r2
LOAD
A,C
MOV
.0,.2
r0 = r2;
-
-
-
-
W
-
R
-
-
-
-
-
03
3
LODZ
r3
LOAD
A,D
MOV
.0,.3
r0 = r3;
-
-
-
-
W
-
R
-
-
-
-
-
04
4
LODI,r0
imm
LOAD
A,#imm
LD
.0,#imm
r0 = imm;
-
-
-
-
W
-
-
-
-
-
-
-
05
5
LODI,r1
imm
LOAD
B,#imm
LD
.1,#imm
r1 = imm;
-
-
-
-
W
-
R
-
-
-
-
-
06
6
LODI,r2
imm
LOAD
C,#imm
LD
.2,#imm
r2 = imm;
-
-
-
-
W
-
R
-
-
-
-
-
07
7
LODI,r3
imm
LOAD
D,#imm
LD
.3,#imm
r3 = imm;
-
-
-
-
W
-
R
-
-
-
-
-
08
10
LODR,r0
rel
LOAD
A,^rel
LD
.0,$rel
r0 = *rel;
-
-
-
-
W
-
-
-
-
-
-
-
09
11
LODR,r1
rel
LOAD
B,^rel
LD
.1,$rel
r1 = *rel;
-
-
-
-
W
-
R
-
-
-
-
-
0A
12
LODR,r2
rel
LOAD
C,^rel
LD
.2,$rel
r2 = *rel;
-
-
-
-
W
-
R
-
-
-
-
-
0B
13
LODR,r3
rel
LOAD
D,^rel
LD
.3,$rel
r3 = *rel;
-
-
-
-
W
-
R
-
-
-
-
-
0C
14
LODA,r0
abs
LOAD
A,abs
LD
.0,/abs
r0 = *abs;
-
-
-
-
W
-
-
-
-
-
-
-
0D
15
LODA,r1
abs
LOAD
B,abs
LD
.1,/abs
r1 = *abs;
-
-
-
-
W
-
R
-
-
-
-
-
0E
16
LODA,r2
abs
LOAD
C,abs
LD
.2,/abs
r2 = *abs;
-
-
-
-
W
-
R
-
-
-
-
-
0F
17
LODA,r3
abs
LOAD
D,abs
LD
.3,/abs
r3 = *abs;
-
-
-
-
W
-
R
-
-
-
-
-
10
20
LDPL
abs
LOAD
L,abs
LD
.L,/abs
PSL = *abs;
-
-
-
-
W
W
W
W
W
W
W
2
11
21
STPL
abs
LOAD
abs,L
ST
.L,/abs
*abs = PSL;
-
-
-
-
R
R
R
R
R
R
R
2
12
22
SPSU
LOAD
A,U
MOV
.0,.U
r0 = PSU;
R
R
R
R
W
-
-
-
-
-
-
-
13
23
SPSL
LOAD
A,L
MOV
.0,.L
r0 = PSL;
-
-
-
-
B
R
R
R
R
R
R
-
14
24
RETC,eq
RET,EQ
RETEQ
if (CC == EQ) return;
-
-
-
B
R
-
-
-
-
-
-
-
15
25
RETC,gt
RET,GT
RETGT
if (CC == GT) return;
-
-
-
B
R
-
-
-
-
-
-
-
16
26
RETC,lt
RET,LT
RETLT
if (CC == LT) return;
-
-
-
B
R
-
-
-
-
-
-
-
17
27
RETC,un
RET
RET
return;
-
-
-
B
-
-
-
-
-
-
-
-
18
30
BCTR,eq
rel
JUMP,eq
^rel
BEQ
$rel
if (CC == EQ) goto rel;
-
-
-
-
R
-
-
-
-
-
-
-
19
31
BCTR,gt
rel
JUMP,gt
^rel
BGT
$rel
if (CC == GT) goto rel;
-
-
-
-
R
-
-
-
-
-
-
-
1A
32
BCTR,lt
rel
JUMP,lt
^rel
BLT
$rel
if (CC == LT) goto rel;
-
-
-
-
R
-
-
-
-
-
-
-
1B
33
BCTR,un
rel
JUMP
^rel
BR
$rel
goto rel;
-
-
-
-
-
-
-
-
-
-
-
-
1C
34
BCTA,eq
abs
JUMP,eq
abs
BEQ
/abs
if (CC == EQ) goto abs;
-
-
-
-
R
-
-
-
-
-
-
-
1D
35
BCTA,gt
abs
JUMP,gt
abs
BGT
/abs
if (CC == GT) goto abs;
-
-
-
-
R
-
-
-
-
-
-
-
1E
36
BCTA,lt
abs
JUMP,lt
abs
BLT
/abs
if (CC == LT) goto abs;
-
-
-
-
R
-
-
-
-
-
-
-
1F
37
BCTA,un
abs
JUMP
abs
BR
/abs
goto abs;
-
-
-
-
-
-
-
-
-
-
-
-
20
40
EORZ
r0
XOR
A,A
XOR
.0,.0
r0 = 0;
-
-
-
-
W
-
-
-
-
-
-
3
21
41
EORZ
r1
XOR
A,B
XOR
.0,.1
r0 ^= r1;
-
-
-
-
W
-
R
-
-
-
-
-
22
42
EORZ
r2
XOR
A,C
XOR
.0,.2
r0 ^= r2;
-
-
-
-
W
-
R
-
-
-
-
-
23
43
EORZ
r3
XOR
A,D
XOR
.0,.3
r0 ^= r3;
-
-
-
-
W
-
R
-
-
-
-
-
24
44
EORI,r0
imm
XOR
A,#imm
XOR
.0,#imm
r0 ^= imm;
-
-
-
-
W
-
-
-
-
-
-
-
25
45
EORI,r1
imm
XOR
B,#imm
XOR
.1,#imm
r1 ^= imm;
-
-
-
-
W
-
R
-
-
-
-
-
26
46
EORI,r2
imm
XOR
C,#imm
XOR
.2,#imm
r2 ^= imm;
-
-
-
-
W
-
R
-
-
-
-
-
27
47
EORI,r3
imm
XOR
D,#imm
XOR
.3,#imm
r3 ^= imm;
-
-
-
-
W
-
R
-
-
-
-
-
28
50
EORR,r0
rel
XOR
A,^rel
XOR
.0,$rel
r0 ^= *rel;
-
-
-
-
W
-
-
-
-
-
-
-
29
51
EORR,r1
rel
XOR
B,^rel
XOR
.1,$rel
r1 ^= *rel;
-
-
-
-
W
-
R
-
-
-
-
-
2A
52
EORR,r2
rel
XOR
C,^rel
XOR
.2,$rel
r2 ^= *rel;
-
-
-
-
W
-
R
-
-
-
-
-
2B
53
EORR,r3
rel
XOR
D,^rel
XOR
.3,$rel
r3 ^= *rel;
-
-
-
-
W
-
R
-
-
-
-
-
2C
54
EORA,r0
abs
XOR
A,abs
XOR
.0,/abs
r0 ^= *abs;
-
-
-
-
W
-
-
-
-
-
-
-
2D
55
EORA,r1
abs
XOR
B,abs
XOR
.1,/abs
r1 ^= *abs;
-
-
-
-
W
-
R
-
-
-
-
-
2E
56
EORA,r2
abs
XOR
C,abs
XOR
.2,/abs
r2 ^= *abs;
-
-
-
-
W
-
R
-
-
-
-
-
2F
57
EORA,r3
abs
XOR
D,abs
XOR
.3,/abs
r3 ^= *abs;
-
-
-
-
W
-
R
-
-
-
-
-
30
60
REDC,r0
LOAD
A,&CTRL
IN
.0,CTRL
r0 = IOPORT(PORTC);
-
-
-
-
W
-
-
-
-
-
-
-
31
61
REDC,r1
LOAD
B,&CTRL
IN
.1,CTRL
r1 = IOPORT(PORTC);
-
-
-
-
W
-
R
-
-
-
-
-
32
62
REDC,r2
LOAD
C,&CTRL
IN
.2,CTRL
r2 = IOPORT(PORTC);
-
-
-
-
W
-
R
-
-
-
-
-
33
63
REDC,r3
LOAD
D,&CTRL
IN
.3,CTRL
r3 = IOPORT(PORTC);
-
-
-
-
W
-
R
-
-
-
-
-
34
64
RETE,eq
RETION,EQ
RETIEQ
if (CC == EQ) { PSU &= ~PSU_II; return; }
-
-
W
B
R
-
-
-
-
-
-
-
35
65
RETE,gt
RETION,GT
RETIGT
if (CC == GT) { PSU &= ~PSU_II; return; }
-
-
W
B
R
-
-
-
-
-
-
-
36
66
RETE,lt
RETION,LT
RETILT
if (CC == LT) { PSU &= ~PSU_II; return; }
-
-
W
B
R
-
-
-
-
-
-
-
37
67
RETE,un
RETION
RETI
PSU &= ~PSU_II; return;
-
-
W
B
-
-
-
-
-
-
-
-
38
70
BSTR,eq
rel
CALL,EQ
^rel
CALLEQ
$rel
if (CC == EQ) gosub rel;
-
-
-
B
R
-
-
-
-
-
-
-
39
71
BSTR,gt
rel
CALL,GT
^rel
CALLGT
$rel
if (CC == GT) gosub rel;
-
-
-
B
R
-
-
-
-
-
-
-
3A
72
BSTR,lt
rel
CALL,LT
^rel
CALLLT
$rel
if (CC == LT) gosub rel;
-
-
-
B
R
-
-
-
-
-
-
-
3B
73
BSTR,un
rel
CALL
^rel
CALL
$rel
gosub rel;
-
-
-
B
-
-
-
-
-
-
-
-
3C
74
BSTA,eq
abs
CALL,EQ
abs
CALLEQ
/abs
if (CC == EQ) gosub abs;
-
-
-
B
R
-
-
-
-
-
-
-
3D
75
BSTA,gt
abs
CALL,GT
abs
CALLGT
/abs
if (CC == GT) gosub abs;
-
-
-
B
R
-
-
-
-
-
-
-
3E
76
BSTA,lt
abs
CALL,LT
abs
CALLLT
/abs
if (CC == LT) gosub abs;
-
-
-
B
R
-
-
-
-
-
-
-
3F
77
BSTA,un
abs
CALL
abs
CALL
/abs
gosub abs;
-
-
-
B
-
-
-
-
-
-
-
-
40
100
HALT
WAIT
HALT
for (;;);
-
-
-
-
-
-
-
-
-
-
-
4
41
101
ANDZ
r1
AND
A,B
AND
.0,.1
r0 &= r1;
-
-
-
-
W
-
R
-
-
-
-
-
42
102
ANDZ
r2
AND
A,C
AND
.0,.2
r0 &= r2;
-
-
-
-
W
-
R
-
-
-
-
-
43
103
ANDZ
r3
AND
A,D
AND
.0,.3
r0 &= r3;
-
-
-
-
W
-
R
-
-
-
-
-
44
104
ANDI,r0
imm
AND
A,#imm
AND
.0,#imm
r0 &= imm;
-
-
-
-
W
-
-
-
-
-
-
-
45
105
ANDI,r1
imm
AND
B,#imm
AND
.1,#imm
r1 &= imm;
-
-
-
-
W
-
R
-
-
-
-
-
46
106
ANDI,r2
imm
AND
C,#imm
AND
.2,#imm
r2 &= imm;
-
-
-
-
W
-
R
-
-
-
-
-
47
107
ANDI,r3
imm
AND
D,#imm
AND
.3,#imm
r3 &= imm;
-
-
-
-
W
-
R
-
-
-
-
-
48
110
ANDR,r0
rel
AND
A,^rel
AND
.0,$rel
r0 &= *rel;
-
-
-
-
W
-
-
-
-
-
-
-
49
111
ANDR,r1
rel
AND
B,^rel
AND
.1,$rel
r1 &= *rel;
-
-
-
-
W
-
R
-
-
-
-
-
4A
112
ANDR,r2
rel
AND
C,^rel
AND
.2,$rel
r2 &= *rel;
-
-
-
-
W
-
R
-
-
-
-
-
4B
113
ANDR,r3
rel
AND
D,^rel
AND
.3,$rel
r3 &= *rel;
-
-
-
-
W
-
R
-
-
-
-
-
4C
114
ANDA,r0
abs
AND
A,abs
AND
.0,/abs
r0 &= *abs;
-
-
-
-
W
-
-
-
-
-
-
-
4D
115
ANDA,r1
abs
AND
B,abs
AND
.1,/abs
r1 &= *abs;
-
-
-
-
W
-
R
-
-
-
-
-
4E
116
ANDA,r2
abs
AND
C,abs
AND
.2,/abs
r2 &= *abs;
-
-
-
-
W
-
R
-
-
-
-
-
4F
117
ANDA,r3
abs
AND
D,abs
AND
.3,/abs
r3 &= *abs;
-
-
-
-
W
-
R
-
-
-
-
-
50
120
RRR,r0
RR
A
ROR
.0
r0 >>= 1;
-
-
-
-
W
W
-
R
W
-
B
4
51
121
RRR,r1
RR
B
ROR
.1
r1 >>= 1;
-
-
-
-
W
W
R
R
W
-
B
4
52
122
RRR,r2
RR
C
ROR
.2
r2 >>= 1;
-
-
-
-
W
W
R
R
W
-
B
4
53
123
RRR,r3
RR
D
ROR
.3
r3 >>= 1;
-
-
-
-
W
W
R
R
W
-
B
4
54
124
REDE,r0
port
LOAD
A,&port
IN
.0,/port
r0 = IOPORT(port);
-
-
-
-
W
-
-
-
-
-
-
-
55
125
REDE,r1
port
LOAD
B,&port
IN
.1,/port
r1 = IOPORT(port);
-
-
-
-
W
-
R
-
-
-
-
-
56
126
REDE,r2
port
LOAD
C,&port
IN
.2,/port
r2 = IOPORT(port);
-
-
-
-
W
-
R
-
-
-
-
-
57
127
REDE,r3
port
LOAD
D,&port
IN
.3,/port
r3 = IOPORT(port);
-
-
-
-
W
-
R
-
-
-
-
-
58
130
BRNR,r0
rel
JUMP,ANE
^rel
BNZ
.0,$rel
if (r0 != 0) goto rel;
-
-
-
-
-
-
-
-
-
-
-
-
59
131
BRNR,r1
rel
JUMP,BNE
^rel
BNZ
.1,$rel
if (r1 != 0) goto rel;
-
-
-
-
-
-
R
-
-
-
-
-
5A
132
BRNR,r2
rel
JUMP,CNE
^rel
BNZ
.2,$rel
if (r2 != 0) goto rel;
-
-
-
-
-
-
R
-
-
-
-
-
5B
133
BRNR,r3
rel
JUMP,DNE
^rel
BNZ
.3,$rel
if (r3 != 0) goto rel;
-
-
-
-
-
-
R
-
-
-
-
-
5C
134
BRNA,r0
abs
JUMP,ANE
abs
BNZ
.0,/abs
if (r0 != 0) goto abs;
-
-
-
-
-
-
-
-
-
-
-
-
5D
135
BRNA,r1
abs
JUMP,BNE
abs
BNZ
.1,/abs
if (r1 != 0) goto abs;
-
-
-
-
-
-
R
-
-
-
-
-
5E
136
BRNA,r2
abs
JUMP,CNE
abs
BNZ
.2,/abs
if (r2 != 0) goto abs;
-
-
-
-
-
-
R
-
-
-
-
-
5F
137
BRNA,r3
abs
JUMP,DNE
abs
BNZ
.3,/abs
if (r3 != 0) goto abs;
-
-
-
-
-
-
R
-
-
-
-
-
60
140
IORZ
r0
OR
A,A
OR
.0,.0
if (r0 & 80) CC = LT; elif (r0 == 0) CC = EQ; else CC = GT;
-
-
-
-
W
-
-
-
-
-
-
-
61
141
IORZ
r1
OR
A,B
OR
.0,.1
r0 |= r1;
-
-
-
-
W
-
R
-
-
-
-
-
62
142
IORZ
r2
OR
A,C
OR
.0,.2
r0 |= r2;
-
-
-
-
W
-
R
-
-
-
-
-
63
143
IORZ
r3
OR
A,D
OR
.0,.3
r0 |= r3;
-
-
-
-
W
-
R
-
-
-
-
-
64
144
IORI,r0
imm
OR
A,#imm
OR
.0,#imm
r0 |= imm;
-
-
-
-
W
-
-
-
-
-
-
-
65
145
IORI,r1
imm
OR
B,#imm
OR
.1,#imm
r1 |= imm;
-
-
-
-
W
-
R
-
-
-
-
-
66
146
IORI,r2
imm
OR
C,#imm
OR
.2,#imm
r2 |= imm;
-
-
-
-
W
-
R
-
-
-
-
-
67
147
IORI,r3
imm
OR
D,#imm
OR
.3,#imm
r3 |= imm;
-
-
-
-
W
-
R
-
-
-
-
-
68
150
IORR,r0
rel
OR
A,^rel
OR
.0,$rel
r0 |= *rel;
-
-
-
-
W
-
-
-
-
-
-
-
69
151
IORR,r1
rel
OR
B,^rel
OR
.1,$rel
r1 |= *rel;
-
-
-
-
W
-
R
-
-
-
-
-
6A
152
IORR,r2
rel
OR
C,^rel
OR
.2,$rel
r2 |= *rel;
-
-
-
-
W
-
R
-
-
-
-
-
6B
153
IORR,r3
rel
OR
D,^rel
OR
.3,$rel
r3 |= *rel;
-
-
-
-
W
-
R
-
-
-
-
-
6C
154
IORA,r0
abs
OR
A,abs
OR
.0,/abs
r0 |= *abs;
-
-
-
-
W
-
-
-
-
-
-
-
6D
155
IORA,r1
abs
OR
B,abs
OR
.1,/abs
r1 |= *abs;
-
-
-
-
W
-
R
-
-
-
-
-
6E
156
IORA,r2
abs
OR
C,abs
OR
.2,/abs
r2 |= *abs;
-
-
-
-
W
-
R
-
-
-
-
-
6F
157
IORA,r3
abs
OR
D,abs
OR
.3,/abs
r3 |= *abs;
-
-
-
-
W
-
R
-
-
-
-
-
70
160
REDD,r0
LOAD
A,&DATA
IN
.0,DATA
r0 = IOPORT(PORTD);
-
-
-
-
W
-
-
-
-
-
-
-
71
161
REDD,r1
LOAD
B,&DATA
IN
.1,DATA
r1 = IOPORT(PORTD);
-
-
-
-
W
-
R
-
-
-
-
-
72
162
REDD,r2
LOAD
C,&DATA
IN
.2,DATA
r2 = IOPORT(PORTD);
-
-
-
-
W
-
R
-
-
-
-
-
73
163
REDD,r3
LOAD
D,&DATA
IN
.3,DATA
r3 = IOPORT(PORTD);
-
-
-
-
W
-
R
-
-
-
-
-
74
164
CPSU
imm
BIC
U,#imm
AND
.U,#~imm
PSU &= ~(imm & %01100111); (for 2650/2650A)
PSU &= ~(imm & %01111111); (for 2650B)
-
W
W
W
-
-
-
-
-
-
-
5
75
165
CPSL
imm
BIC
L,#imm
AND
.L,#~imm
PSL &= ~imm;
-
-
-
-
W
W
W
W
W
W
W
5
76
166
PPSU
imm
OR
U,#imm
OR
.U,#imm
PSU |= imm & %01100111; (for 2650/2650A)
PSU |= imm & %01111111; (for 2650B)
-
W
W
W
-
-
-
-
-
-
-
-
77
167
PPSL
imm
OR
L,#imm
OR
.L,#imm
PSL |= imm;
-
-
-
-
W
W
W
W
W
W
W
-
78
170
BSNR,r0
rel
CALL,ANE
^rel
CALLNZ
.0,$rel
if (r0 != 0) gosub rel;
-
-
-
B
-
-
-
-
-
-
-
-
79
171
BSNR,r1
rel
CALL,BNE
^rel
CALLNZ
.1,$rel
if (r1 != 0) gosub rel;
-
-
-
B
-
-
R
-
-
-
-
-
7A
172
BSNR,r2
rel
CALL,CNE
^rel
CALLNZ
.2,$rel
if (r2 != 0) gosub rel;
-
-
-
B
-
-
R
-
-
-
-
-
7B
173
BSNR,r3
rel
CALL,DNE
^rel
CALLNZ
.3,$rel
if (r3 != 0) gosub rel;
-
-
-
B
-
-
R
-
-
-
-
-
7C
174
BSNA,r0
abs
CALL,ANE
abs
CALLNZ
.0,/abs
if (r0 != 0) gosub abs;
-
-
-
B
-
-
-
-
-
-
-
-
7D
175
BSNA,r1
abs
CALL,BNE
abs
CALLNZ
.1,/abs
if (r1 != 0) gosub abs;
-
-
-
B
-
-
R
-
-
-
-
-
7E
176
BSNA,r2
abs
CALL,CNE
abs
CALLNZ
.2,/abs
if (r2 != 0) gosub abs;
-
-
-
B
-
-
R
-
-
-
-
-
7F
177
BSNA,r3
abs
CALL,DNE
abs
CALLNZ
.3,/abs
if (r3 != 0) gosub abs;
-
-
-
B
-
-
R
-
-
-
-
-
80
200
ADDZ
r0
ADD
A,A
ADD
.0,.0
r0 += r0;
-
-
-
-
W
W
-
R
W
-
B
4
81
201
ADDZ
r1
ADD
A,B
ADD
.0,.1
r0 += r1;
-
-
-
-
W
W
R
R
W
-
B
4
82
202
ADDZ
r2
ADD
A,C
ADD
.0,.2
r0 += r2;
-
-
-
-
W
W
R
R
W
-
B
4
83
203
ADDZ
r3
ADD
A,D
ADD
.0,.3
r0 += r3;
-
-
-
-
W
W
R
R
W
-
B
4
84
204
ADDI,r0
imm
ADD
A,#imm
ADD
.0,#imm
r0 += imm;
-
-
-
-
W
W
-
R
W
-
B
4
85
205
ADDI,r1
imm
ADD
B,#imm
ADD
.1,#imm
r1 += imm;
-
-
-
-
W
W
R
R
W
-
B
4
86
206
ADDI,r2
imm
ADD
C,#imm
ADD
.2,#imm
r2 += imm;
-
-
-
-
W
W
R
R
W
-
B
4
87
207
ADDI,r3
imm
ADD
D,#imm
ADD
.3,#imm
r3 += imm;
-
-
-
-
W
W
R
R
W
-
B
4
88
210
ADDR,r0
rel
ADD
A,^rel
ADD
.0,$rel
r0 += *rel;
-
-
-
-
W
W
-
R
W
-
B
4
89
211
ADDR,r1
rel
ADD
B,^rel
ADD
.1,$rel
r1 += *rel;
-
-
-
-
W
W
R
R
W
-
B
4
8A
212
ADDR,r2
rel
ADD
C,^rel
ADD
.2,$rel
r2 += *rel;
-
-
-
-
W
W
R
R
W
-
B
4
8B
213
ADDR,r3
rel
ADD
D,^rel
ADD
.3,$rel
r3 += *rel;
-
-
-
-
W
W
R
R
W
-
B
4
8C
214
ADDA,r0
abs
ADD
A,abs
ADD
.0,/abs
r0 += *abs;
-
-
-
-
W
W
-
R
W
-
B
4
8D
215
ADDA,r1
abs
ADD
B,abs
ADD
.1,/abs
r1 += *abs;
-
-
-
-
W
W
R
R
W
-
B
4
8E
216
ADDA,r2
abs
ADD
C,abs
ADD
.2,/abs
r2 += *abs;
-
-
-
-
W
W
R
R
W
-
B
4
8F
217
ADDA,r3
abs
ADD
D,abs
ADD
.3,/abs
r3 += *abs;
-
-
-
-
W
W
R
R
W
-
B
4
90
220
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
91
221
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
92
222
LPSU
LOAD
U,A
MOV
.U,.0
PSU = (PSU & %10000000) | (r0 & %01100111); (for 2650/2650A)
PSU = (PSU & %10000000) | (r0 & %01111111); (for 2650B)
-
W
W
W
-
-
-
-
-
-
-
-
93
223
LPSL
LOAD
L,A
MOV
.L,.0
PSL = r0;
-
-
-
-
W
W
W
W
W
W
W
-
94
224
DAR,r0
DA
A
ADJ
.0
r0 = DAR(r0);
-
-
-
-
W
R
-
-
-
-
R
-
95
225
DAR,r1
DA
B
ADJ
.1
r1 = DAR(r1);
-
-
-
-
W
R
R
-
-
-
R
-
96
226
DAR,r2
DA
C
ADJ
.2
r2 = DAR(r2);
-
-
-
-
W
R
R
-
-
-
R
-
97
227
DAR,r3
DA
D
ADJ
.3
r3 = DAR(r3);
-
-
-
-
W
R
R
-
-
-
R
-
98
230
BCFR,eq
rel
JUMP,NE
^rel
BNE
$rel
if (CC != EQ) goto rel;
-
-
-
-
R
-
-
-
-
-
-
-
99
231
BCFR,gt
rel
JUMP,LE
^rel
BLE
$rel
if (CC != GT) goto rel;
-
-
-
-
R
-
-
-
-
-
-
-
9A
232
BCFR,lt
rel
JUMP,GE
^rel
BGE
$rel
if (CC != LT) goto rel;
-
-
-
-
R
-
-
-
-
-
-
-
9B
233
ZBRR
zero
JUMP
∝zero
BR
!zero
goto zero;
-
-
-
-
-
-
-
-
-
-
-
-
9C
234
BCFA,eq
abs
JUMP,NE
abs
BNE
/abs
if (CC != EQ) goto abs;
-
-
-
-
R
-
-
-
-
-
-
-
9D
235
BCFA,gt
abs
JUMP,LE
abs
BLE
/abs
if (CC != GT) goto abs;
-
-
-
-
R
-
-
-
-
-
-
-
9E
236
BCFA,lt
abs
JUMP,GE
abs
BGE
/abs
if (CC != LT) goto abs;
-
-
-
-
R
-
-
-
-
-
-
-
9F
237
BXA,r3
abs
JUMP
(D)+abs
BR
/abs(.3)
goto abs + r3;
-
-
-
-
-
-
R
-
-
-
-
-
A0
240
SUBZ
r0
SUB
A,A
SUB
.0,.0
r0 -= r0;
-
-
-
-
W
W
-
R
W
-
B
4
A1
241
SUBZ
r1
SUB
A,B
SUB
.0,.1
r0 -= r1;
-
-
-
-
W
W
R
R
W
-
B
4
A2
242
SUBZ
r2
SUB
A,C
SUB
.0,.2
r0 -= r2;
-
-
-
-
W
W
R
R
W
-
B
4
A3
243
SUBZ
r3
SUB
A,D
SUB
.0,.3
r0 -= r3;
-
-
-
-
W
W
R
R
W
-
B
4
A4
244
SUBI,r0
imm
SUB
A,#imm
SUB
.0,#imm
r0 -= imm;
-
-
-
-
W
W
-
R
W
-
B
4
A5
245
SUBI,r1
imm
SUB
B,#imm
SUB
.1,#imm
r1 -= imm;
-
-
-
-
W
W
R
R
W
-
B
4
A6
246
SUBI,r2
imm
SUB
C,#imm
SUB
.2,#imm
r2 -= imm;
-
-
-
-
W
W
R
R
W
-
B
4
A7
247
SUBI,r3
imm
SUB
D,#imm
SUB
.3,#imm
r3 -= imm;
-
-
-
-
W
W
R
R
W
-
B
4
A8
250
SUBR,r0
rel
SUB
A,^rel
SUB
.0,$rel
r0 -= *rel;
-
-
-
-
W
W
-
R
W
-
B
4
A9
251
SUBR,r1
rel
SUB
B,^rel
SUB
.1,$rel
r1 -= *rel;
-
-
-
-
W
W
R
R
W
-
B
4
AA
252
SUBR,r2
rel
SUB
C,^rel
SUB
.2,$rel
r2 -= *rel;
-
-
-
-
W
W
R
R
W
-
B
4
AB
253
SUBR,r3
rel
SUB
D,^rel
SUB
.3,$rel
r3 -= *rel;
-
-
-
-
W
W
R
R
W
-
B
4
AC
254
SUBA,r0
abs
SUB
A,abs
SUB
.0,/abs
r0 -= *abs;
-
-
-
-
W
W
-
R
W
-
B
4
AD
255
SUBA,r1
abs
SUB
B,abs
SUB
.1,/abs
r1 -= *abs;
-
-
-
-
W
W
R
R
W
-
B
4
AE
256
SUBA,r2
abs
SUB
C,abs
SUB
.2,/abs
r2 -= *abs;
-
-
-
-
W
W
R
R
W
-
B
4
AF
257
SUBA,r3
abs
SUB
D,abs
SUB
.3,/abs
r3 -= *abs;
-
-
-
-
W
W
R
R
W
-
B
4
B0
260
WRTC,r0
LOAD
&CTRL,A
OUT
.0,CTRL
IOPORT(PORTC) = r0;
-
-
-
-
-
-
-
-
-
-
-
-
B1
261
WRTC,r1
LOAD
&CTRL,B
OUT
.1,CTRL
IOPORT(PORTC) = r1;
-
-
-
-
-
-
R
-
-
-
-
-
B2
262
WRTC,r2
LOAD
&CTRL,C
OUT
.2,CTRL
IOPORT(PORTC) = r2;
-
-
-
-
-
-
R
-
-
-
-
-
B3
263
WRTC,r3
LOAD
&CTRL,D
OUT
.3,CTRL
IOPORT(PORTC) = r3;
-
-
-
-
-
-
R
-
-
-
-
-
B4
264
TPSU
imm
TEST
U,#imm
TEST
.U,#imm
CC = (PSU & imm == imm) ? EQ : LT;
R
R
R
R
W
-
-
-
-
-
-
-
B5
265
TPSL
imm
TEST
L,#imm
TEST
.L,#imm
CC = (PSL & imm == imm) ? EQ : LT;
-
-
-
-
B
R
R
R
R
R
R
-
B6
266
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
B7
267
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
B8
270
BSFR,eq
rel
CALL,NE
^rel
CALLNE
$rel
if (CC != EQ) gosub rel;
-
-
-
B
R
-
-
-
-
-
-
-
B9
271
BSFR,gt
rel
CALL,LE
^rel
CALLLE
$rel
if (CC != GT) gosub rel;
-
-
-
B
R
-
-
-
-
-
-
-
BA
272
BSFR,lt
rel
CALL,GE
^rel
CALLGE
$rel
if (CC != LT) gosub rel;
-
-
-
B
R
-
-
-
-
-
-
-
BB
273
ZBSR
zero
CALL
∝zero
CALL
!zero
gosub zero;
-
-
-
B
-
-
-
-
-
-
-
-
BC
274
BSFA,eq
abs
CALL,NE
abs
CALLNE
/abs
if (CC != EQ) gosub abs;
-
-
-
B
R
-
-
-
-
-
-
-
BD
275
BSFA,gt
abs
CALL,LE
abs
CALLLE
/abs
if (CC != GT) gosub abs;
-
-
-
B
R
-
-
-
-
-
-
-
BE
276
BSFA,lt
abs
CALL,GE
abs
CALLGE
/abs
if (CC != LT) gosub abs;
-
-
-
B
R
-
-
-
-
-
-
-
BF
277
BSXA,r3
abs
CALL
(D)+abs
CALL
/abs(.3)
gosub abs + r3;
-
-
-
B
-
-
R
-
-
-
-
-
C0
300
NOP
NOP
NOP
;
-
-
-
-
-
-
-
-
-
-
-
-
C1
301
STRZ r1
LOAD
B,A
MOV
.1,.0
r1 = r0;
-
-
-
-
W
-
R
-
-
-
-
-
C2
302
STRZ r2
LOAD
C,A
MOV
.2,.0
r2 = r0;
-
-
-
-
W
-
R
-
-
-
-
-
C3
303
STRZ r3
LOAD
D,A
MOV
.3,.0
r3 = r0;
-
-
-
-
W
-
R
-
-
-
-
-
C4
304
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
C5
305
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
C6
306
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
C7
307
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
C8
310
STRR,r0
rel
LOAD
^rel,A
ST
.0,$rel
*rel = r0;
-
-
-
-
W
-
-
-
-
-
-
-
C9
311
STRR,r1
rel
LOAD
^rel,B
ST
.1,$rel
*rel = r1;
-
-
-
-
W
-
R
-
-
-
-
-
CA
312
STRR,r2
rel
LOAD
^rel,C
ST
.2,$rel
*rel = r2;
-
-
-
-
W
-
R
-
-
-
-
-
CB
313
STRR,r3
rel
LOAD
^rel,D
ST
.3,$rel
*rel = r3;
-
-
-
-
W
-
R
-
-
-
-
-
CC
314
STRA,r0
abs
LOAD
abs,A
ST
.0,/abs
*abs = r0;
-
-
-
-
W
-
-
-
-
-
-
-
CD
315
STRA,r1
abs
LOAD
abs,B
ST
.1,/abs
*abs = r1;
-
-
-
-
W
-
R
-
-
-
-
-
CE
316
STRA,r2
abs
LOAD
abs,C
ST
.2,/abs
*abs = r2;
-
-
-
-
W
-
R
-
-
-
-
-
CF
317
STRA,r3
abs
LOAD
abs,D
ST
.3,/abs
*abs = r3;
-
-
-
-
W
-
R
-
-
-
-
-
D0
320
RRL,r0
RL
A
ROL
.0
r0 <<= 1;
-
-
-
-
W
W
-
R
W
-
B
4
D1
321
RRL,r1
RL
B
ROL
.1
r1 <<= 1;
-
-
-
-
W
W
R
R
W
-
B
4
D2
322
RRL,r2
RL
C
ROL
.2
r2 <<= 1;
-
-
-
-
W
W
R
R
W
-
B
4
D3
323
RRL,r3
RL
D
ROL
.3
r3 <<= 1;
-
-
-
-
W
W
R
R
W
-
B
4
D4
324
WRTE,r0
port
LOAD
&port,A
OUT
.0,/port
IOPORT(port) = r0;
-
-
-
-
-
-
-
-
-
-
-
-
D5
325
WRTE,r1
port
LOAD
&port,B
OUT
.1,/port
IOPORT(port) = r1;
-
-
-
-
-
-
R
-
-
-
-
-
D6
326
WRTE,r2
port
LOAD
&port,C
OUT
.2,/port
IOPORT(port) = r2;
-
-
-
-
-
-
R
-
-
-
-
-
D7
327
WRTE,r3
port
LOAD
&port,D
OUT
.3,/port
IOPORT(port) = r3;
-
-
-
-
-
-
R
-
-
-
-
-
D8
330
BIRR,r0
rel
INCJ,NE
A,^rel
IBNZ
.0,$rel
if (++r0 != 0) goto rel;
-
-
-
-
-
-
-
-
-
-
-
-
D9
331
BIRR,r1
rel
INCJ,NE
B,^rel
IBNZ
.1,$rel
if (++r1 != 0) goto rel;
-
-
-
-
-
-
R
-
-
-
-
-
DA
332
BIRR,r2
rel
INCJ,NE
C,^rel
IBNZ
.2,$rel
if (++r2 != 0) goto rel;
-
-
-
-
-
-
R
-
-
-
-
-
DB
333
BIRR,r3
rel
INCJ,NE
D,^rel
IBNZ
.3,$rel
if (++r3 != 0) goto rel;
-
-
-
-
-
-
R
-
-
-
-
-
DC
334
BIRA,r0
abs
INCJ,NE
A,abs
IBNZ
.0,/abs
if (++r0 != 0) goto abs;
-
-
-
-
-
-
-
-
-
-
-
-
DD
335
BIRA,r1
abs
INCJ,NE
B,abs
IBNZ
.1,/abs
if (++r1 != 0) goto abs;
-
-
-
-
-
-
R
-
-
-
-
-
DE
336
BIRA,r2
abs
INCJ,NE
C,abs
IBNZ
.2,/abs
if (++r2 != 0) goto abs;
-
-
-
-
-
-
R
-
-
-
-
-
DF
337
BIRA,r3
abs
INCJ,NE
D,abs
IBNZ
.3,/abs
if (++r3 != 0) goto abs;
-
-
-
-
-
-
R
-
-
-
-
-
E0
340
COMZ
r0
COMP
A,A
CMP
.0,.0
CC = EQ;
-
-
-
-
W
-
-
-
-
R
-
-
E1
341
COMZ
r1
COMP
A,B
CMP
.0,.1
if (r0 > r1) CC = GT; elif (r0 < r1) CC = LT; else CC = EQ;
-
-
-
-
W
-
R
-
-
R
-
-
E2
342
COMZ
r2
COMP
A,C
CMP
.0,.2
if (r0 > r2) CC = GT; elif (r0 < r2) CC = LT; else CC = EQ;
-
-
-
-
W
-
R
-
-
R
-
-
E3
343
COMZ
r3
COMP
A,D
CMP
.0,.3
if (r0 > r3) CC = GT; elif (r0 < r3) CC = LT; else CC = EQ;
-
-
-
-
W
-
R
-
-
R
-
-
E4
344
COMI,r0
imm
COMP
A,#imm
CMP
.0,#imm
if (r0 > imm) CC = GT; elif (r0 < imm) CC = LT; else CC = EQ;
-
-
-
-
W
-
-
-
-
R
-
-
E5
345
COMI,r1
imm
COMP
B,#imm
CMP
.1,#imm
if (r1 > imm) CC = GT; elif (r1 < imm) CC = LT; else CC = EQ;
-
-
-
-
W
-
R
-
-
R
-
-
E6
346
COMI,r2
imm
COMP
C,#imm
CMP
.2,#imm
if (r2 > imm) CC = GT; elif (r2 < imm) CC = LT; else CC = EQ;
-
-
-
-
W
-
R
-
-
R
-
-
E7
347
COMI,r3
imm
COMP
D,#imm
CMP
.3,#imm
if (r3 > imm) CC = GT; elif (r3 < imm) CC = LT; else CC = EQ;
-
-
-
-
W
-
R
-
-
R
-
-
E8
350
COMR,r0
rel
COMP
A,^rel
CMP
.0,$rel
if (r0 > *rel) CC = GT; elif (r0 < *rel) CC = LT; else CC = EQ;
-
-
-
-
W
-
-
-
-
R
-
-
E9
351
COMR,r1
rel
COMP
B,^rel
CMP
.1,$rel
if (r1 > *rel) CC = GT; elif (r1 < *rel) CC = LT; else CC = EQ;
-
-
-
-
W
-
R
-
-
R
-
-
EA
352
COMR,r2
rel
COMP
C,^rel
CMP
.2,$rel
if (r2 > *rel) CC = GT; elif (r2 < *rel) CC = LT; else CC = EQ;
-
-
-
-
W
-
R
-
-
R
-
-
EB
353
COMR,r3
rel
COMP
D,^rel
CMP
.3,$rel
if (r3 > *rel) CC = GT; elif (r3 < *rel) CC = LT; else CC = EQ;
-
-
-
-
W
-
R
-
-
R
-
-
EC
354
COMA,r0
abs
COMP
A,abs
CMP
.0,/abs
if (r0 > *abs) CC = GT; elif (r0 < *abs) CC = LT; else CC = EQ;
-
-
-
-
W
-
-
-
-
R
-
-
ED
355
COMA,r1
abs
COMP
B,abs
CMP
.1,/abs
if (r1 > *abs) CC = GT; elif (r1 < *abs) CC = LT; else CC = EQ;
-
-
-
-
W
-
R
-
-
R
-
-
EE
356
COMA,r2
abs
COMP
C,abs
CMP
.2,/abs
if (r2 > *abs) CC = GT; elif (r2 < *abs) CC = LT; else CC = EQ;
-
-
-
-
W
-
R
-
-
R
-
-
EF
357
COMA,r3
abs
COMP
D,abs
CMP
.3,/abs
if (r3 > *abs) CC = GT; elif (r3 < *abs) CC = LT; else CC = EQ;
-
-
-
-
W
-
R
-
-
R
-
-
F0
360
WRTD,r0
LOAD
&DATA,A
OUT
.0,DATA
IOPORT(PORTD) = r0;
-
-
-
-
-
-
-
-
-
-
-
-
F1
361
WRTD,r1
LOAD
&DATA,B
OUT
.1,DATA
IOPORT(PORTD) = r1;
-
-
-
-
-
-
R
-
-
-
-
-
F2
362
WRTD,r2
LOAD
&DATA,C
OUT
.2,DATA
IOPORT(PORTD) = r2;
-
-
-
-
-
-
R
-
-
-
-
-
F3
363
WRTD,r3
LOAD
&DATA,D
OUT
.3,DATA
IOPORT(PORTD) = r3;
-
-
-
-
-
-
R
-
-
-
-
-
F4
364
TMI,r0
imm
TEST
A,#imm
TEST
.0,#imm
CC = (r0 & imm == imm) ? EQ : LT;
-
-
-
-
W
-
-
-
-
-
-
-
F5
365
TMI,r1
imm
TEST
B,#imm
TEST
.1,#imm
CC = (r1 & imm == imm) ? EQ : LT;
-
-
-
-
W
-
R
-
-
-
-
-
F6
366
TMI,r2
imm
TEST
C,#imm
TEST
.2,#imm
CC = (r2 & imm == imm) ? EQ : LT;
-
-
-
-
W
-
R
-
-
-
-
-
F7
367
TMI,r3
imm
TEST
D,#imm
TEST
.3,#imm
CC = (r3 & imm == imm) ? EQ : LT;
-
-
-
-
W
-
R
-
-
-
-
-
F8
370
BDRR,r0
rel
DECJ,NE
A,^rel
DBNZ
.0,$rel
if (--r0 != 0) goto rel;
-
-
-
-
-
-
-
-
-
-
-
-
F9
371
BDRR,r1
rel
DECJ,NE
B,^rel
DBNZ
.1,$rel
if (--r1 != 0) goto rel;
-
-
-
-
-
-
R
-
-
-
-
-
FA
372
BDRR,r2
rel
DECJ,NE
C,^rel
DBNZ
.2,$rel
if (--r2 != 0) goto rel;
-
-
-
-
-
-
R
-
-
-
-
-
FB
373
BDRR,r3
rel
DECJ,NE
D,^rel
DBNZ
.3,$rel
if (--r3 != 0) goto rel;
-
-
-
-
-
-
R
-
-
-
-
-
FC
374
BDRA,r0
abs
DECJ,NE
A,abs
DBNZ
.0,/abs
if (--r0 != 0) goto abs;
-
-
-
-
-
-
-
-
-
-
-
-
FD
375
BDRA,r1
abs
DECJ,NE
B,abs
DBNZ
.1,/abs
if (--r1 != 0) goto abs;
-
-
-
-
-
-
R
-
-
-
-
-
FE
376
BDRA,r2
abs
DECJ,NE
C,abs
DBNZ
.2,/abs
if (--r2 != 0) goto abs;
-
-
-
-
-
-
R
-
-
-
-
-
FF
377
BDRA,r3
abs
DECJ,NE
D,abs
DBNZ
.3,/abs
if (--r3 != 0) goto abs;
-
-
-
-
-
-
R
-
-
-
-
-
1: Indeterminate.
2: 2650B only.
3: Or CLR A (for CALM) or CLR .0 (for IEEE-694).
4: For CALM, ADDC/SUBB/RLC/RRC are equivalent to ADD/SUB/RL/RR respectively, depending on PSW.
For IEEE-694, ADDC/SUBC/ROLC/RORC/WAIT are equivalent to ADD/SUB/RL/RR/HALT respectively, depending on PSW.
5: For IEEE-694, pseudocode is (assuming user used ~imm):
CPSU: .U &= (imm & %01100111); (for 2650/2650A)
CPSU: .U &= (imm & %01111111); (for 2650B)
CPSL: .U &= imm;
R=Read, W=Written, B=Both, -=Neither.
reg = register.
imm = 1-byte immediate value.
port = 1-byte immediate value (representing an extended I/O port address).
rel = 1-byte relative address (direct or indirect).
zero = 1-byte zero page address (direct or indirect).
abs = 2-byte absolute address (direct or indirect,
also with optional pre-increment/pre-decrement/indexing for non-branch
instructions).
CALM uses $ for I/O ports, but emulator uses & (as $ is used for hex).
CALM uses ∝ for zero page addresses, but emulator uses / .
Arithmetic, transfer
I/O, PSW, mixed
Branch
Special
Illegal
Relative to next instruction
Relative to this instruction
Operand value
-64 = $-40 -62 = $-3E $40
-63 = $-3F -61 = $-3D $41
-62 = $-3E -60 = $-3C $42
-61 = $-3D -59 = $-3B $43
-60 = $-3C -58 = $-3A $44
-59 = $-3B -57 = $-39 $45
-58 = $-3A -56 = $-38 $46
-57 = $-39 -55 = $-37 $47
-56 = $-38 -54 = $-36 $48
-55 = $-37 -53 = $-35 $49
-54 = $-36 -52 = $-34 $4A
-53 = $-35 -51 = $-33 $4B
-52 = $-34 -50 = $-32 $4C
-51 = $-33 -49 = $-31 $4D
-50 = $-32 -48 = $-30 $4E
-49 = $-31 -47 = $-2F $4F
-48 = $-30 -46 = $-2E $50
-47 = $-2F -45 = $-2D $51
-46 = $-2E -44 = $-2C $52
-45 = $-2D -43 = $-2B $53
-44 = $-2C -42 = $-2A $54
-43 = $-2B -41 = $-29 $55
-42 = $-2A -40 = $-28 $56
-41 = $-29 -39 = $-27 $57
-40 = $-28 -38 = $-26 $58
-39 = $-27 -37 = $-25 $59
-38 = $-26 -36 = $-24 $5A
-37 = $-25 -35 = $-23 $5B
-36 = $-24 -34 = $-22 $5C
-35 = $-23 -33 = $-21 $5D
-34 = $-22 -32 = $-20 $5E
-33 = $-21 -31 = $-1F $5F
-32 = $-20 -30 = $-1E $60
-31 = $-1F -29 = $-1D $61
-30 = $-1E -28 = $-1C $62
-29 = $-1D -27 = $-1B $63
-28 = $-1C -26 = $-1A $64
-27 = $-1B -25 = $-19 $65
-26 = $-1A -24 = $-18 $66
-25 = $-19 -23 = $-17 $67
-24 = $-18 -22 = $-16 $68
-23 = $-17 -21 = $-15 $69
-22 = $-16 -20 = $-14 $6A
-21 = $-15 -19 = $-13 $6B
-20 = $-14 -18 = $-12 $6C
-19 = $-13 -17 = $-11 $6D
-18 = $-12 -16 = $-10 $6E
-17 = $-11 -15 = $-F $6F
-16 = $-10 -14 = $-E $70
-15 = $-F -13 = $-D $71
-14 = $-E -12 = $-C $72
-13 = $-D -11 = $-B $73
-12 = $-C -10 = $-A $74
-11 = $-B -9 = $-9 $75
-10 = $-A -8 = $-8 $76
-9 = $-9 -7 = $-7 $77
-8 = $-8 -6 = $-6 $78
-7 = $-7 -5 = $-5 $79
-6 = $-6 -4 = $-4 $7A
-5 = $-5 -3 = $-3 $7B
-4 = $-4 -2 = $-2 $7C
-3 = $-3 -1 = $-1 $7D
-2 = $-2 0 = $0 $7E
-1 = $-1 +1 = $+1 $7F
0 = $0 +2 = $+2 $00
+1 = $+1 +3 = $+3 $01
+2 = $+2 +4 = $+4 $02
+3 = $+3 +5 = $+5 $03
+4 = $+4 +6 = $+6 $04
+5 = $+5 +7 = $+7 $05
+6 = $+6 +8 = $+8 $06
+7 = $+7 +9 = $+9 $07
+8 = $+8 +10 = $+A $08
+9 = $+9 +11 = $+B $09
+10 = $+A +12 = $+C $0A
+11 = $+B +13 = $+D $0B
+12 = $+C +14 = $+E $0C
+13 = $+D +15 = $+F $0D
+14 = $+E +16 = $+10 $0E
+15 = $+F +17 = $+11 $0F
+16 = $+10 +18 = $+12 $10
+17 = $+11 +19 = $+13 $11
+18 = $+12 +20 = $+14 $12
+19 = $+13 +21 = $+15 $13
+20 = $+14 +22 = $+16 $14
+21 = $+15 +23 = $+17 $15
+22 = $+16 +24 = $+18 $16
+23 = $+17 +25 = $+19 $17
+24 = $+18 +26 = $+1A $18
+25 = $+19 +27 = $+1B $19
+26 = $+1A +28 = $+1C $1A
+27 = $+1B +29 = $+1D $1B
+28 = $+1C +30 = $+1E $1C
+29 = $+1D +31 = $+1F $1D
+30 = $+1E +32 = $+20 $1E
+31 = $+1F +33 = $+21 $1F
+32 = $+20 +34 = $+22 $20
+33 = $+21 +35 = $+23 $21
+34 = $+22 +36 = $+24 $22
+35 = $+23 +37 = $+25 $23
+36 = $+24 +38 = $+26 $24
+37 = $+25 +39 = $+27 $25
+38 = $+26 +40 = $+28 $26
+39 = $+27 +41 = $+29 $27
+40 = $+28 +42 = $+2A $28
+41 = $+29 +43 = $+2B $29
+42 = $+2A +44 = $+2C $2A
+43 = $+2B +45 = $+2D $2B
+44 = $+2C +46 = $+2E $2C
+45 = $+2D +47 = $+2F $2D
+46 = $+2E +48 = $+30 $2E
+47 = $+2F +49 = $+31 $2F
+48 = $+30 +50 = $+32 $30
+49 = $+31 +51 = $+33 $31
+50 = $+32 +52 = $+34 $32
+51 = $+33 +53 = $+35 $33
+52 = $+34 +54 = $+36 $34
+53 = $+35 +55 = $+37 $35
+54 = $+36 +56 = $+38 $36
+55 = $+37 +57 = $+39 $37
+56 = $+38 +58 = $+3A $38
+57 = $+39 +59 = $+3B $39
+58 = $+3A +60 = $+3C $3A
+59 = $+3B +61 = $+3D $3B
+60 = $+3C +62 = $+3E $3C
+61 = $+3D +63 = $+3F $3D
+62 = $+3E +64 = $+40 $3E
+63 = $+3F +65 = $+41 $3F
$C8 is the opcode STRR,R0 (you can find this out from eg. WinArcadia's
"Help|Opcodes..." subwindow).
We look up the operand value $50 on the above table (right-hand column).
Now, looking at the central column, we see that it means -46 (which is
$-2E in hex), relative from this instruction.
So, the instruction is STRR,R0 $0100+$-2E, or, in other words,
STRR,R0 $00D2.
If we had instead found the bytes $C8 and $D0 at addresses $0100 and
$0101, the instruction would instead be STRR,R0 *$00D2 (since
$D0-$80=$50).
The numbers are relative to $66, eg:
addi,r0 $65
means -1
addi,r0 $66
means ±0
addi,r0 $67
means +1
ppsl $08 ;PSL |= %00001000; // set WC (With Carry) bit
cpsl $01 ;PSL &= %11111110; // clear C (Carry/Borrow) bit
loda,r0 LOWBYTE
addi,r0 $67
dar,r0
stra,r0 LOWBYTE
loda,r0 HIGHBYTE
addi,r0 $66 ;add 0, but any carry is applied
dar,r0
stra,r0 HIGHBYTE
cpsl $08 ;PSL &= %11110111; // clear WC (With Carry) bit
High byte, bits 3..0: hundreds digit (%0000..%1001)
Low byte, bits 7..4: tens digit (%0000..%1001)
Low byte, bits 3..0: ones digit (%0000..%1001)
The CPU divides the 32K address space into 4 pages, each of 8K, as
follows:
PAGE0 equ $0000 ;$0000..$1FFF: 1st page
PAGE1 equ $2000 ;$2000..$3FFF: 2nd page
PAGE2 equ $4000 ;$4000..$5FFF: 3rd page
PAGE3 equ $6000 ;$6000..$7FFF: 4th page
For absolute non-branch instructions (LODA, STRA, etc.), direct loads
and stores can be done only on the current page. Eg. this will not work
as expected:
$2000: lodi,r0 $51
$2002: stra,r0 $1800
$2005: retc,un
$2000: lodi,r0 $51
$2002: stra,r0 *$2007
$2005: retc,un
$2007: dw $1800
bit 15: indirect addressing flag
bits 14..13: index control:
%00 = no indexing
reg is destination register
%01 = pre-increment indexing (++)
reg is index register
r0 is destination register
%01 = pre-decrement indexing (--)
reg is index register
r0 is destination register
%11 = normal indexing
reg is index register
r0 is destination register
bits 12.. 0: offset ($0000..$1FFF) (8K range) from start of page ($0/$2000/$4000/$6000)
The operand field (two bytes) for absolute branch instructions is:
bit 15: indirect addressing flag
bits 14.. 0: absolute address ($0000..$7FFF) (32K range)
EORZ r0 is always better than LODI,r0 $00.
BCTA,un $003F (or less), or BCTA,un $7FC0 (or more), are never
better than ZBRR. And likewise for BSTA vs. ZBSR.
COMZ r0 is always better than CPSL $C0. Both yield CC=EQ.
These are all the same in effect, size and speed:
EORI,Rn $00
IORI,Rn $00
These are both the same in effect, size and speed:
IORZ r0
These are both the same in effect, size and speed:
IORI,rn $FF
These are both the same in effect, size and speed:
Project Numbers
Project
Reference
Description
EA Issue
Pages
Main chip(s)
Retailer
77ut2
2/CC/16
2/CC/17
Video Data Terminal
Jan 1977
Feb 1977
32-37
42-47
Signetics 2513 character generator
Nat. Semi. MM5740AAF keyboard encoder
?
77up2
2/CC/18
2650 Baby Computer
Mar 1977
68-69,71-73
Signetics 2650 CPU
AT ($75 in Feb '78)
77cc4
2/CC/19
CUTS cassette interface
Apr 1977
40-45
Signetics 555 timer
?
77up5
8/M/13
"Mini-SCAMP" computer
Apr 1977
?
SC/MP CPU
?
?
2/CC/23
Low Cost VDU
Feb 1978
64-65,67-68
Signetics 2513 character generator
AT ($99.50 in Feb-Apr '78)
78m5
2/CC/25?
├ Video modulator (& power supply) for Low Cost VDU
Apr 1978
48-49,51,53,55-56
-
AT ($22.50 in Feb '78)
78ut4
2/CC/25
├ Keyboard for Low Cost VDU
Apr 1978
48-49,51,53,55-56
-
?
?
2/CC/30
└ Alternative keyboard for Low Cost VDU
Sep 1978
92-93
MM5303M
?
78up5
2/CC/26
2650 Mini Computer
May 1978
54-58
Signetics 2650 CPU
?
78up9
2/CC/32
├ Expansion Board for 2650 Mini Computer
Nov 1978
70-73,75-76
-
?
78up10
2/CC/33
├ Extra RAM for 2650 Mini Computer
Dec 1978
83,85,87-88
2114 SRAMs
?
79up1
2/CC/35
└ EPROM Programmer for 2650 Mini Computer et al.
Feb 1979
84-86,88-89
2704/2708 EPROMs
?
78ut9
2/CC/28
2/CC/29
Ultra Low Cost VDU
Aug 1978
Sep 1978
82-86
82-83,85-87
Signetics 2513 character generator
Motorola 6800 CPU
?
?
2/CC/46
└ Serial Interface for Ultra Low Cost VDU
Nov 1979
83,85,87-88
Signetics 2536 UART
?
Project
Description
Magazine
Pages
Main chip(s)
Retailer
ETI-560
Mains Cable Seeker
ETI AU May 80
?
-
?
ETI-560
Low Cost VDU
ETI UK Aug 76
ETI UK Sep 76
ETI UK Oct 76
56-57
10-16
30-31
Signetics 2513 character generator
RF Equipment Spares (£445 in Oct '76)
ETI-632
VDU
ETI AU Jan 77
ETI AU Feb 77
ETI AU Mar 77
95-99
69-77
81-84,87-89
Signetics 2513 character generator
AT ($158.50 in Mar '77), Orbit
ETI-630
├ Hex display for ETI-631 or SCMPIO
ETI AU Dec 76
56-?
?
AEC, AT ($13.75 in Dec '76)
ETI-631
├ ASCII keyboard & encoder
ETI AU Dec 76
47-52
Harris HD0165 keyboard encoder
AEC, AT, Orbit
ETI-631F
├ ASCII keyboard & encoder for System 68
ETI UK Apr 77
25-30
Harris HD0165 keyboard encoder
?
ETI-631-2
├ ASCII keyboard & encoder
ETI AU Apr 77
55-59
4078 glue logic
AEC, AT, Orbit
ETI-633
└ TV Sync Generator for ETI-632 (and others)
ETI AU Jan 77
65-68
4072 counter
AEC, AT ($17.75 in Mar '77)
ETI-634
EDU interface
ETI AU Aug 78
?
Intel 8080 CPU
-
ETI-635
S-100 Microcomputer Power Supply
ETI AU Sep 77
66-69
-
-
ETI-636
├ Low Cost S-100 Motherboard
ETI AU May 80
52-54
-
?
ETI-642
├ 16K S-100 RAM card
ETI AU Feb 79
53-57
2114 SRAMs
?
ETI-682
└ S-100 PROM board
ETI AU Mar 81
?
?
?
ETI-637
CUTS cassette interface
ETI AU Jan 78
25-28
Signetics 555 timer
AEC, AT, DSE, SV
ETI-638
EPROM programmer
ETI AU Jul 78
?
Motorola 6800 CPU
AEC, AT
ETI-639
Computerized musical doorbell
ETI AU Mar 78
?
?
AT
ETI-640
aka DG640, MW640
S-100 VDU for 2650-based machines (and others)
ETI AU Apr 78
ETI AU May 78
ETI AU Jun 78
32-35
89-95
57-60
MCM6574/MCM6674 character generator
AT, Orbit, SV
ETI-681 aka TCT PCG
└ S-100 Programmable Character Generator for ETI-640 (and others)
ETI AU Jun 80
67-74
2114 SRAMs
AT ($150-$175 (est.) in Jun '80; $140 in Jul '80)
ETI-641
S-100 thermal printer based on Philips EUR-10E023LE
ETI AU Sep 78
?
Intel 8080 CPU
-
ETI-643
Universal EPROM programmer card
ETI AU Dec 79
ETI AU Jan 80
?
?
Intel 8080 CPU
?
ETI-644
Modem
ETI AU Oct 82
ETI Computer Projects #1
?
?
?
Altronics, Jaycar, Microtrix, RIE
ETI-644A
└ A revision for the ETI-644 modem
ETI Computer Projects #1
?
?
?
ETI-645
A turtle robot (aka "Tasman Turtle")
ETI AU Feb 82
ETI AU Apr 82
ETI AU May 82
ETI AU Jun 82
82
29-35
24-29,32,36
42-46,48,51
SAA1027 motor controllers
Flexible Systems (assembled) ($799 in Feb '82)
ETI AU (minimum kit) ($349 in Apr-Jul '82)
ETI-646
├ A hand controller for the turtle robot
ETI AU Jul 82
84-86
4011 quad NAND gates
Flexible Systems ($55 (kit) and $79 (assembled) in Jul '82)
ETI-647
└ Speech synthesizer for the turtle robot (and others)
(aka "Turtle Talk")
ETI AU Sep 82
ETI AU Oct 82
81-86
81-84,86-89
MM54104 SPC
Flexible Systems ($240 in Jun '82), ETI AU ($250 in Oct '82), RIE
ETI-648
Micro-Grasp robot arm
ETI Computers & Computing #4
6-13,15-19
-
?
ETI-649
Light pen for Microbee
ETI Computers & Computing #4
?
?
?
ETI-650
STAC (Standard Timer And Controller) timer
ETI AU Nov 78
?
?
AT
ETI-651
Binary-to-hex number converter
ETI AU Jun 79
?
Signetics 2650 CPU
?
ETI-652
Atari joystick interface for System 80
ETI AU Aug 82
?
?
?
ETI-653
16-channel computer output driver
ETI Computers & Computing #4
?
?
?
ETI-654
General purpose Apple I/O card
ETI Computers & Computing #4
?
?
?
ETI-656
EPROM debugger
ETI Computer Projects #1
35-37
2716 EPROM
?
ETI-658
RS-232 breakout box
ETI Computer Projects #1
?
?
?
ETI-659
VIC-20 audio cassette interface
ETI AU May 84
?
?
?
ETI-660
Learner's microcomputer
ETI AU May-Jun 81, Oct-Nov 81
?
1802 CPU
AEC ($99 in Apr '82)
ETI-661
└ Chord tutor adaptor for ETI-660
ETI AU Nov 84
?
?
?
ETI-662
6802 processor board
ETI AU Apr 84
?
Motorola 6802 CPU
?
ETI-664
Hobbybot robot
ETI AU Nov-Dec 85
?
?
?
ETI-665
Computing routing switch
ETI AU Oct 85
?
?
?
ETI-666
Printer switch
ETI AU Feb 85
?
?
?
ETI-667
Printer sharer
ETI AU Apr 85
?
?
?
ETI-668
Microbee EPROM programmer
ETI AU Feb 83
?
?
?
ETI-669
└ Upgrade for ETI-668
ETI AU Sep 88
?
?
?
ETI-671
Microbee parallel printer interface
ETI Computer Projects #1
?
?
?
ETI-672
Microbee teletype printer interface
ETI Computer Projects #1
?
?
?
ETI-673
Microbee multi-PROM interface
ETI Computer Projects #1
?
?
?
ETI-674
Microbee joystick controller
ETI AU Dec 83
?
?
?
ETI-675
Microbee serial-parallel interface
ETI Computer Projects #1
?
?
?
ETI-676
Microbee RS-232 interface
ETI Computer Projects #1
?
?
?
ETI-677
Chatterbox voice synthesiser for Centronics parallel port
ETI AU Jan 85
?
Votrax SC-01 synthesizer
?
ETI-678
Microbee ROM reader
ETI Computer Projects #1
?
?
?
ETI-679
Microbee joystick adapter
ETI AU Jun 85
?
?
?
ETI-680 aka DG680
Microcomputer
ETI AU Nov 79
?
Zilog Z80 CPU
?
ETI-683
Computer controller
ETI AU Dec 84
?
?
?
ETI-684
Intelligent modem
ETI AU Dec 85, Feb-Mar 86, Jun-Aug 86
?
?
?
ETI-685
2650-based Single Board Computer for S-100 bus
ETI AU Dec 81
?
Signetics 2650A/2650A-1 CPU
?
ETI-670
├ Low Cost ASCII Keyboard for ETI-685 (and others)
ETI AU May 82
99-103
GI AY-5-2376 keyboard encoder
AEC, Amtex, Electronic Agencies, RIE
ETI-686
└ PPI-based EPROM Programmer for ETI-685 (and others)
ETI AU Oct 82
ETI Computer Projects #1
72-73,75-78
40-44,75
2708/2716 EPROMs
Ron Koenig
ETI-687
VZ-200 update
ETI AU Jul 86
?
?
?
ETI-688
Bipolar PROM Programmer
ETI AU Jun 83
ETI Computers & Computing #4
46-49
20-23
-
?
ETI-689
Bus sharing switch
ETI Jan 86
?
?
?
ETI-690
"Little Big Board" computer
ETI Computer Projects #1
?
Zilog Z80A CPU
?
ETI-692
Current Loop Interface (TTY to RS-232 adapter)
ETI AU Jan 85
68-69,72
?
?
ETI-804
Pong game (B&W)
ETI AU Nov 76
ETI UK May 77
44-51
12-16
General Instrument AY-3-8500
Appollo ($52.50 in Jan '77), AT, DSE
ETI-804
├ Pong game (colour)
-
-
GI AY-3-8500 + AY-3-8515
Appollo ($82.50 in Jan '77)
ETI-804
├ Colour converter
-
-
General Instrument AY-3-8515
Appollo ($34.50 in Jan '77)
ETI-804-1
└ Rifle kit
ETI AU Mar 77
54-55
-
Appollo ($25 in Jan '77), DSE
ETI-810
Stunt cycle game
ETI AU Jun 78
31-37
General Instrument AY-3-8760
DSE, Orbit
ETI-811
Tank game
ETI AU Oct 78
?
General Instrument AY-3-8710
AEC, DSE, Orbit
ETI-638,641,643,647 can be connected to any CPU (but the provided software is not written for the 2650).
ETI-645 (and therefore also its accessory projects) is compatible with ETI-685 as mentioned in ETI Aug 1982, p. 91.
ETI-685 can use PIPBUG, BINBUG or SBCBUG (which is basically BINBUG + ACOS).
It is compatible with
ETI-635,636,640,642,645,670,681,682,686.
The cassette interface (promised in ETI AU Dec 1981, p.
104) and real-time clock/calendar (promised in ETI AU
Mar 1982, p. 95) were never published.
All dollar prices in the preceding two tables are in $AUD. Prices are generally for kits,
except where otherwise specified, and are generally inclusive of taxes but exclusive of postage.
Appollo (with two Ps) is really how the company name was spelt.
AEC = All Electric Components (formerly ED&E Sales), AT = Applied Technology, DSE = Dick Smith Electronics, RIE = Rod Irving Electronics, SV = Silicon Valley.
Project
Description
Retailer
Magazine
Price
CT750
Kansas City cassette interface (assembled)
Applied Technology
EA Nov '77, p. 98
$AUD37.50
?
Kansas City cassette interface (kit)
Applied Technology
EA Nov '77, p. 98
$AUD22.50
MW850
S-100 motherboard
Applied Technology (Owen J. Hill)
?
?
MW864
64K SRAM
Applied Technology
?
?
MW6545
CRT controller (S-100 card)
(based around MOS/Rockwell 6545 CRT controller chip?)
Applied Technology (John Wilmshurst)
?
?
KB04
Universal Keyboard in Teletype Model 33 ASR layout
Applied Technology
ETI AU Feb '78, p. 70
$AUD59.50
KB05
├ Number pad
Applied Technology
ETI AU Feb '78, p. 70
$AUD16.50
KB06
├ Cursor control
Applied Technology
ETI AU Feb '78, p. 70
$AUD7.50
KB10
└ Spare key switches
Applied Technology
ETI AU Feb '78, p. 70
$AUD2
KT9500
Signetics KT9500 (fully buffered kit)
Signetics/Philips
Applied Technology
EA Sep '76, p. 64-67
EA Dec '77, p. 72
$AUD165
$AUD199
KT9500
Signetics KT9500 (motherboard with component kit)
Applied Technology
EA Dec '77, p. 72
$AUD35
PC1001
Prototyping card
Signetics/Philips
EA Sep '76, p. 64-67
$AUD345
PC1500 aka ABC1500
Evaluation kit (Adaptable Board Computer)
Signetics/Philips
EA Sep '76, p. 64-67
$AUD245
PC1600SC
Prometheus assembler
Signetics/Philips
?
?
PC2000
4K RAM expansion board
Signetics/Philips
EA Sep '76, p. 64-67
$AUD400
SCMPIO
Front panel kit (TTY replacement) (for Baby 2650)
Applied Technology
EA Mar '77, p. 64
$AUD49.50
?
EA Baby 2650 -> KT9500 conversion kit
Applied Technology
EA Dec '77, p. 72
$AUD142
EPS 9965 (KB05)
Fully encoded ASCII keyboard
Elektor
Elektor Nov '78, p. 6-11
£6.50/$USD14.35
EPS 9966
Elekterminal
Elektor
Elektor Dec '78, p. 16-24
£10.85/$USD23.95
EPS 77084
AY-3-8500-based Pong game
Elektor
Elektor Jul/Aug '77, p. 40-41
£2.05/$USD4.50
Dark grey items are irrelevant. Light grey items are semi-relevant (eg. could be feasibly adapted).
Elektor magazine articles pertaining to the Elektor TV Games Computer are covered in
its Coding Guide
.
Component Numbers
Component
Manufacturer
Description
Used in
?
?
Main transformer, 10V/2A secondary
Elektor power supply [Tr1]
?
?
Zener diode
Voltmace power supply [D10]
?
?
5.6V/400mW zener diode
Elektor EPROM [D1]
1N4001
?
Silicon diode
Arcadia [D1]
1N4003
?
Silicon diode
Astro Wars CPU [44]
1N4004
?
Silicon diode
Lazarian game, Lazarian sound
1N4148
1N484A
1N914
1N914A
?
Silicon diode
Voltmace processor/video [D9], Voltmace A/V [D1..8,12],
Elektor modulator [D1], Elektor EPROM [D2],
PC1001 [D20], EA 78up5, ETI-685 [D1..3], ETI-692 [D1,2],
ETI-640 [D1..11], ETI-681 [D3,4],
Selbstbaucomputer data input display, Selbstbaucomputer address input display, Selbstbaucomputer keyboard & display,
Astro Wars CPU [45], Astro Wars sound [D1..4], Lazarian game, Lazarian sound
1702A
Intel
MOS erasable PROM
TWIN PROM burner [PROM 1]
OA91
?
Germanium diode
ETI-640 [D12..15]
2N2219
?
Silicon NPN transistor
Elekterminal [T4]
2N2894
2N4258
?
Silicon NPN transistor
ETI-640 [Q2]
2N3055
?
Silicon NPN transistor
Elektor power supply [T2],
ETI-636 [Q3]
2SB561C
?
Transistor
Arcadia [Q1]
2101-1N
?
256*4-bit (128-byte) SRAM
Astro Wars CPU [27]
2102
2102-1
2102A4
2102AL4
21L02-1
Signetics
1024*1-bit (128-byte) SRAM
EA LCVDU [IC40..45], Elekterminal [IC1..6],
ETI-640 [IC22..31], ETI-681 [IC7,8],
CD2650 [IC30..45],
Galaxia
2112B
2112-2
2112-A4
MM2112-4
?
256*4-bit (128-byte) SRAM
Basic Elektor [IC13..28],
EA 77up2, ETI LCVDU [IC24,25], Prometheus [IC15..22,24..31],
Instructor 50,
Astro Wars CPU [28]
2114
2114-A4
2114L-4
Fairchild
1024*4-bit (512-byte) SRAM
Arcadia [U11..12], Palladium [A1..2],
Interton,
expanded Elektor [IC4..9],
EA 78up5, ETI-685 [IC11..14,26..29],
ETI-681 [IC14..17],
Astro Wars CPU [29], Galaxia, Lazarian game
2332
Commodore
4K PROM
Arcadia cartridges
?
?
Inductor? 1µH
Elektor modulator [L1]
2410077
?
Ferrite choke coil (resistor type) 10µH
Arcadia [L1,4..5]
2410144
?
Ferrite bead 4T
Arcadia [L2..3]
2504
Signetics
1024-bit DSR (Dynamic Shift Register)
?
2513
RO-3-2513
Signetics
General Instrument
Character Generator
EA LCVDU [IC35], ETI LCVDU [IC7], Elekterminal [IC11]
2519
Signetics
40-bit SSR (Static Shift Register)
?
2602
Signetics
1024*1-bit (128-byte) SRAM
?
2606
Signetics
256*4-bit (128-byte) SRAM
PC1001 [IC6..9,15..18]
2608 (CN0035)
Signetics
1K PROM (PIPBUG 1 monitor)
EA77 up2, EA 78up5
?
?
Trimmer capacitor, 0..22pF
Basic Elektor [C9]
2610007
?
Trimmer capacitor, 7..25pF
Arcadia [C8]
2616
Signetics
2K PROM
Interton,
basic Elektor [IC2] (monitor BIOS)
2621
2621-I
2621 N
Signetics
PAL USG (Universal Sync Generator)
PAL Arcadia, Palladium [U8],
Fountain [IC7], Voltmace processor/video [U?], Rowtron,
basic Elektor [IC4],
Astro Wars CPU [24], Galaxia, Lazarian game
2622
Signetics
NTSC USG (Universal Sync Generator)
NTSC Arcadia [U7]
2632
Signetics
4K PROM
Interton
2636
2636-I
2636 N
Signetics
PVI (Programmable Video Interface)
Fountain [IC2], Voltmace processor/video [U2], Rowtron,
basic Elektor [IC3],
Astro Wars CPU [25], Galaxia, Lazarian game
2637
Signetics
UVI (Universal Video Interface)
Arcadia [U9], Palladium [A8]
2650
Signetics
CPU (<= 1.25 MHz, 1975)
Arcadia [U10],
PC1001 [IC23], EA 77up2, EA 78up5,
Instructor 50,
CD2650 [IC1],
main PHUNSY,
Galaxia, Lazarian
2650-1
Signetics
CPU (<= 2 MHz, <= 1976)
?
2650A
2650-AI
2650A N
Signetics
CPU (<= 1.25 MHz, 1977)
Palladium [A9],
Fountain [IC1], Voltmace processor/video [U1], Rowtron,
basic Elektor [IC1],
ETI-685 [IC30],
Astro Wars CPU [26]
MAB 2650A
Philips
CPU (<= 1.25 MHz, 197x)
Selbstbaucomputer CPU [IC1]
2650A-1
Signetics
CPU (<= 2 MHz, 1977)
Malzak
2650B
Signetics
CPU (<= 1.25 MHz, 1977)
None?
2650B-1
Signetics
CPU (<= 2 MHz, 1977?)
None?
2650-P-02
Synertek
*NOT* Signetics 2650-compatible!
-
2651
Signetics
PCI (Programmable Communications Interface)
MIKIT?
2652
Signetics
Multi-Protocol Comms Circuit (incl. Sync. Data Link Control (SDLC))
?
2653
Signetics
Polynomial Generator/Checker
?
2655
8255A
Signetics
Intel
PPI (Programmable Peripheral Interface)
ETI-685 [IC32]
2656
Signetics
SMI (System Memory Interface)
Instructor 50
2657
Signetics
DMA (Direct Memory Access) controller
?
2661
Signetics
EPCI (Enhanced Programmable Communication Interface)
?
2670
Signetics
Display Character and Graphics Generator
?
2671
Signetics
Programmable Keyboard and Communications Controller
?
2672
Signetics
Programmable Video Timing Controller
?
2673
Signetics
Video Attributes Controller
?
2681
Signetics
DUART (Dual Asynchronous Receiver/Transmitter)
?
?
?
Capacitor, 8.2pF
Elektor modulator [C3..5]
?
?
Capacitor, 15pF
Voltmace A/V [29]
?
?
Capacitor, 22pF
Elektor modulator [C1,6], expanded Elektor [C1..2]
?
?
Capacitor, 27?pF
Voltmace A/V [C28]
?
?
Capacitor, 33pF
Elektor modulator [C7]
?
?
Capacitor, 120pF
Elektor modulator [C2]
?
?
Capacitor, 220pF
Expanded Elektor [C3..5]
?
?
Capacitor, 470pF
Basic Elektor [C8]
?
?
Capacitor, 1nF
Voltmace processor/video [C18,37], Voltmace A/V [C27],
basic Elektor [C2,4,14], Elektor EPROM [C1]
?
?
Capacitor, 3.3nF
Basic Elektor [C3]
?
?
Capacitor, 3.9nF
Basic Elektor [C5]
?
?
Capacitor, 4.7nF
Elektor randomizer [C1]
?
?
Capacitor, 10nF
Elektor EPROM [C3]
?
?
Capacitor, 47nF
Voltmace user I/O [C1..2], Voltmace A/V [C17],
Basic Elektor [C6..7]
?
?
Capacitor, 100nF
Voltmace processor/video [C7], Voltmace power supply [C3..6,8,10..11,36,Cx], Voltmace A/V [C9,12..14,24,36], Voltmace cartridges [C1,?],
Elektor randomizer [C3..5], expanded Elektor [C6..26]
?
?
Capacitor, 150nF MKH
Basic Elektor [C1,15..18,20]
?
?
Capacitor, 220nF
Voltmace power supply [C21..22]
?
?
Capacitor, 2.2µF
Voltmace A/V [C16]
?
?
Capacitor, 10µF/16V
Voltmace A/V [C25..26,32],
Elektor randomizer [C2]
?
?
Capacitor, 47µF
Voltmace cartridges [C?]
?
?
Capacitor, 100µF/6V
Voltmace power supply [C23],
Basic Elektor [C19]
?
?
Capacitor, 220µF/6V
Basic Elektor [C13]
?
?
Capacitor, 1mF
Voltmace power supply [C19]
?
?
Capacitor, 4.7mF/16V
Voltmace power supply [Cx],
Elektor power supply [C1]
?
?
Tantalum capacitor, 220nF/16V
Elektor EPROM [C2]
?
?
Tantalum capacitor, 1µF/16V
Elektor modulator [C8..9]
?
?
Tantalum capacitor, 2.2µF/16V
Elektor power supply [C2..3]
?
?
Electrolytic or tantalum capacitor, 1.5µF/35V
EA77up2
2703 10 2
?
Electrolytic capacitor, 10µF/10V
Arcadia [C1]
2703 20 3
?
Electrolytic capacitor, 200µF/10V
Arcadia [C21]
2703 22 4
?
Electrolytic capacitor, 2.2mF/16V
Arcadia [C17]
2708
?
1024*8-bit (1K) EPROM
ETI-685 [IC15,16],
Astro Wars [31..42], Galaxia
2716
Texas Instruments
2K*8-bit (2K) EPROM
Elektor,
ETI-685 [IC15,16],
Selbstbaucomputer memory [IC3],
Galaxia, Lazarian game
?
?
NPO ceramic capacitor, 47pF
EA77up2
?
?
Ceramic capacitor, 56pF
Basic Elektor [C12]
?
?
Ceramic capacitor, 68pF
Basic Elektor [C10..11]
2722 27 3-3
?
Ceramic capacitor, 270pF/25V
Arcadia [C6..7,12]
?
?
NPO ceramic capacitor, 330pF
EA77up2
2722 50 3-3
?
Ceramic capacitor, 500pF/25V
Arcadia [C10..11]
2722 10 4-1
?
Ceramic capacitor, 1nF/25V
Arcadia [C9,20]
?
?
LV polyester capacitor, 47nF
EA77up2
?
?
LV polyester capacitor, 220nF
EA77up2
2722 40 5-1
?
Ceramic capacitor, 40nF/25V
Arcadia [C19]
2732
D2732D
?
NEC
4K*8-bit (4K) EPROM
Voltmace cartridges [U1],
Elektor,
Lazarian game
2732 47 5-3
?
Mylar capacitor, 47nF/50V
Arcadia [C2]
2732 10 6-1
?
Mylar capacitor, 100nF/25V
Arcadia [C13,16]
2732 10 6-3
?
Mylar capacitor, 100nF/50V
Arcadia [C3,5,14..15,18]
2732 47 6-3
?
Mylar capacitor, 470nF/50V
Arcadia [C4]
28C16
Intel
2K EEPROM
Selbstbaucomputer
2981
?
?
Instructor 50
?
?
Potentiometer 220Ω
Basic Elektor [P2]
?
?
Potentiometer 1,000Ω
Elektor power supply [P1]
?
?
Potentiometer 47,000Ω
EA77up2
?
?
Joystick potentiometer 680,000Ω
Basic Elektor [P3..6]
?
?
Preset potentiometer 1,000Ω
Elektor modulator [P2]
?
?
Preset potentiometer 2,200Ω
Basic Elektor [P1]
?
?
Preset potentiometer 2,500Ω (2,200Ω)
Elektor modulator [P1]
?
?
Resistor ⅛W 1,800Ω
Elektor EPROM [R4]
?
?
Resistor ⅛W 22,000Ω
Elektor EPROM [R3]
?
?
Resistor ⅛W 150,000Ω
Elektor EPROM [R2]
?
?
Resistor ⅛W 180,000Ω
Voltmace A/V [R38,59],
Elektor EPROM [R1]
3200 39 1
?
Resistor ¼W 3.9Ω
Elektor power supply [R2]
3200 56 2
?
Resistor ¼W 56Ω
Arcadia [R51]
3200 68 2
?
Resistor ¼W 68Ω
Elektor modulator [R13]
3200 10 3
?
Resistor ¼W 100Ω
Voltmace A/V [R81],
Elektor modulator [R10..11]
3200 15 3
?
Resistor ¼W 150Ω
Elektor modulator [R7],
EA77up2
3200 18 3
?
Resistor ¼W 180Ω
Arcadia [R30]
3200 22 3
?
Resistor ¼W 220Ω
Arcadia [R40,46],
Voltmace processor/video [R56],
Elektor modulator [R5], basic Elektor [R68]
3200 27 3
?
Resistor ¼W 270Ω
Elektor modulator [R6]
3200 33 3
?
Resistor ¼W 330Ω
Arcadia [R22?,41],
Voltmace A/V [R81]
3200 39 3
?
Resistor ¼W 390Ω
Arcadia [R43]
3200 47 3
?
Resistor ¼W 470Ω
Arcadia [R42,52],
Voltmace A/V [R61,63,VR3],
Elektor modulator [R3,9], basic Elektor [R61]
3200 68 3
?
Resistor ¼W 680Ω
Voltmace A/V [R65],
Basic Elektor [R60]
3200 82 3
?
Resistor ¼W 820Ω
Basic Elektor [R58..59]
3200 10 4
?
Resistor ¼W 1,000Ω
Arcadia [R6,9,21,44,47],
Voltmace processor/video [R24..27,30,52], Voltmace user I/O [RV2], Voltmace A/V [R73..74],
Elektor modulator [R4], basic Elektor [R36..38,62,64..66,69], Elektor randomizer [R4..5], expanded Elektor [R15..16],
EA77up2
3200 12 4
?
Resistor ¼W 1,200Ω
Arcadia [R31,36],
Voltmace processor/video [R29,54]
3200 15 4
?
Resistor ¼W 1,500Ω
Arcadia [R33,37,50],
Elektor modulator [R12], basic Elektor [R54], expanded Elektor [R1..2,9],
EA77up2
3200 20 4
?
Resistor ¼W 2,000Ω
Arcadia [R7]
3200 22 4
?
Resistor ¼W 2,200Ω
Arcadia [R1..5,45,48],
Voltmace processor/video [R28], Voltmace power supply [R71], Voltmace A/V [R62,RV1],
Elektor power supply [R3..4], basic Elektor [R29,44..45,56,67], expanded Elektor [R11,18],
EA77up2
3200 27 4
?
Resistor ¼W 2,700Ω
Arcadia [R34,53]
3200 33 4
?
Resistor ¼W 3,300Ω
Arcadia [R28..29,38],
Voltmace power supply [D10], Voltmace user I/O [R53], Voltmace A/V [R57,64,66]
3200 47 4
?
Resistor ¼W 4,700Ω
Arcadia [R32,49],
Voltmace processor/video [R1..4,16], Voltmace user I/O [R8..15], Voltmace A/V [R36,67,72],
basic Elektor [R22..23,26..27,30..31,39..42,46..53,57], Elektor randomizer [R1..2], expanded Elektor [R7..8,12..13,19..20],
EA77up2
3200 56 4
?
Resistor ¼W 5,600Ω
Arcadia [R35,39],
Voltmace [R35]
3200 68 4
?
Resistor ¼W 6,800Ω
Elektor modulator [R8]
3200 10 5
?
Resistor ¼W 10,000Ω
Arcadia [R10..15,18..19,23..26],
Voltmace processor/video [R17,21,80], Voltmace A/V [R18..20,39..40,68],
basic Elektor [R1..21,25,33,35,55], Elektor randomizer [R3], expanded Elektor [R4,14,21],
EA77up2
3200 12 5
?
Resistor ¼W 12,000Ω
Voltmace A/V [R49],
Expanded Elektor [R10,17]
3200 15 5
?
Resistor ¼W 15,000Ω
Voltmace user I/O [R6..7],
basic Elektor [R24,71]
3200 18 5
?
Resistor ¼W 18,000Ω
Voltmace A/V [R51],
expanded Elektor [R5]
3200 22 5
?
Resistor ¼W 22,000Ω
Elektor modulator [R2],
EA77up2
?
?
Resistor 27,000Ω
Voltmace A/V [R47,60]
3200 33 5
?
Resistor ¼W 33,000Ω
Elektor modulator [R1], basic Elektor [R43]
3200 39 5
?
Resistor ¼W 39,000Ω
Voltmace A/V [R46],
Expanded Elektor [R6]
3200 47 5
?
Resistor ¼W 47,000Ω
Voltmace processor/video [R55], Voltmace A/V [R43,45,VR4],
basic Elektor [R32,34,70]
?
?
Resistor 56,000Ω
Voltmace A/V [R50]
3200 82 5
?
Resistor ¼W 82,000Ω
Expanded Elektor [R3]
3200 10 6
?
Resistor ¼W 100,000Ω
Voltmace processor/video [R5,22..23], Voltmace A/V [R41..42,44,48],
basic Elektor [R63],
Basic Elektor [R63]
3200 18 6
?
Resistor ¼W 180,000Ω
Arcadia [R8,20]
3200 22 6
?
Resistor ¼W 220,000Ω
Arcadia [R27]
3200 47 6
?
Resistor ¼W 470,000Ω
Arcadia [R16..17],
basic Elektor [R28]
?
?
Resistor 3W 0.22Ω
Elektor power supply [R1]
?
?
Resistor 3,900Ω
Voltmace A/V [R39]
?
?
Resistor 1,000,000Ω
Voltmace A/V [R34]
?
?
Resistor 1,500,000Ω
Voltmace A/V [R31]
?
?
Resistor 2,000,000Ω
Voltmace user I/O [RVH,VV]
?
?
Resistor 2,200,000Ω
Voltmace A/V [R32..33]
3410025
?
3.579545 MHz oscillator
Arcadia [X'TAL1]
SKY8867
?
8.867 MHz oscillator
Voltmace processor/video [X1],
Basic Elektor [Xtal]
?
?
~27 MHz oscillator
Elektor modulator [X1]
?
?
100Ω/500mW loudspeaker
Basic Elektor
3450012
?
NTSC modulator
Arcadia
3624
Intel?
512*8-bit (512-byte) PROM
CD2650 [IC13..20,48..49]
4N28
?
Opto-coupler
ETI-692 [IC1..2]
4011
HEF 4011
?
Quad 2-input NAND gate
Elekterminal [IC16],
Selbstbaucomputer cassette interface [IC2]
4015
?
Dual 4-stage shift register
Elektor randomizer [IC2]
4016
HEF4016
4066
HEF4066BP
?
Quad analog switch
Arcadia [U4], Palladium [U3],
Rowtron,
expanded Elektor [IC14],
Selbstbaucomputer cassette interface [IC4],
Lazarian sound
4024
?
7-stage binary ripple counter
Elekterminal [IC14,15]
CD 4040
?
12-stage binary ripple counter
ETI-640 [IC38,39]
4049
?
Hex inverter (CMOS)
PC1001 [IC30]
4051
?
Single 8-channel analog multiplexer/demultiplexer
ETI-681 [IC28]
CD4053
CD4053B
HEF4053B
TC4053BP
?
?
?
Toshiba
Triple 2-channel multiplexer/demultiplexer
Fountain [IC6], Voltmace user I/O [U7],
basic Elektor [IC10]
4069
CD4069CN
?
Hex inverter gate
Arcadia [U6], Palladium [U7]
4070
CD4070BE
?
RCA
Quad 2-input XOR gate
Elektor randomizer [IC1]
4072
?
Dual 4-input OR gate
ETI-685 [IC50]
4081
CD4081BE
?
RCA
Quad 2-input AND gate
Elekterminal [IC17,21]
4097
?
Single differential 8-channel analog multiplexer/demultiplexer
Galaxia
CD 4099
?
8-bit addressable latch
Basic Elektor [IC9]
40097
?
3-state hex driver
Astro Wars CPU [30], Lazarian game
4116
?
2K DRAM
PHUNSY memory
HEF 4528
?
Dual monostable multivibrator
Selbstbaucomputer cassette interface [IC3]
5082-4870450
Hewlett-Packard
LED indicator
DS [L1..41]
555
NE555
Signetics
?
Timer
Elektor EPROM [IC1],
ETI-685 [IC40], EA LCVDU [IC8], ETI LCVDU [IC1..4,28],
ETI-640 [IC8], ETI-681 [IC31..33],
CD2650 [IC72],
main PHUNSY,
Astro Wars sound [IC5], Galaxia
555-3007
Dialco
LED indicator
PC1001 [D1..19]
6116
IDT
2048*8-bit (2K) SRAM
Selbstbaucomputer memory [IC2]
7400
74LS00
?
Quad 2-input NAND gate
Arcadia [U1],
Voltmace cartridges [U2A..E,?A..E],
Basic Elektor [IC37], expanded Elektor [IC30..31], Elektor EPROM [IC2],
PC1001 [IC28], ETI-685 [IC5,39], EA LCVDU [IC4], ETI LCVDU [IC5,13,14,16,20,21,29], Elekterminal [IC19], Prometheus [IC32,36],
ETI-640 [IC16], ETI-681 [IC4,30],
Instructor 50,
CD2650 [IC25,71,76],
PHUNSY interface, PHUNSY video, PHUNSY memory,
Selbstbaucomputer CPU [IC5,6], Selbstbaucomputer port unit [IC2], Selbstbaucomputer A/D converter [IC4],
Astro Wars CPU [2], Lazarian game
741
?
Operational amplifier
ETI-685 [IC6]
7402
74LS02
HD74LS02P
?
Quad 2-input NOR gate
Rowtron,
EA 78up9, ETI-685 [IC44], EA LCVDU [IC1,11,21],
Instructor 50,
PHUNSY memory,
Selbstbaucomputer port unit [IC3], Selbstbaucomputer display [IC2],
Astro Wars CPU [3], Galaxia, Lazarian game
7403
74LS03
?
Quad 2-input NAND gate
ETI LCVDU [IC8,9],
Instructor 50
7404
74LS04
74LS04N
74S04
MM74C04N
?
Nat. Semi.
Hex 1-input inverter gate
Arcadia [U2], Palladium [A12,U1],
Basic Elektor [IC31], expanded Elektor [IC24,26,28],
ETI-685 [IC31,36], EA LCVDU [IC23,28], ETI LCVDU [IC10], Elekterm,48inal [IC18],
ETI-640 [IC9,32],
Instructor 50,
CD2650 [IC53,63,67],
main PHUNSY, PHUNSY video,
Astro Wars CPU [4,5], Astro Wars sound [IC2], Lazarian game, Lazarian sound
74LS05
?
Hex 1-input inverter gate
Rowtron,
Basic Elektor [IC30],
Selbstbaucomputer data input display [IC1,2], Selbstbaucomputer CPU [IC4], Selbstbaucomputer address input display [IC1,2]
7406
?
Hex 1-input open collector inverter gate
DS [IC5..9],
PHUNSY interface,
Astro Wars CPU [6], Lazarian game, Lazarian sound
7407
?
Hex buffer gate
Main PHUNSY, PHUNSY video
7408
74LS08
?
Quad 2-input AND gate
Basic Elektor [IC29], expanded Elektor [IC25],
PC1001 [IC29,33], ETI-685 [IC19], EA LCVDU [IC9,11,21,31],
Instructor 50,
CD2650 [IC11,64,69],
Astro Wars CPU [7], Astro Wars sound [IC1], Lazarian game
7410
74LS10
?
Triple 3-input NAND gate
Basic Elektor [IC41],
EA LCVDU [IC12],
ETI-640 [IC33],
Instructor 50,
main PHUNSY, PHUNSY interface, PHUNSY video, PHUNSY memory,
CD2650 [IC54],
Astro Wars CPU [8], Galaxia, Lazarian game
7411
74LS11
?
Triple 3-input AND gate
Instructor 50,
CD2650 [IC61,68]
74LS13
?
Dual 4-input NAND gate
Main PHUNSY
7414
74LS14
?
Hex 1-input inverter gate
ETI-685 [IC17],
Instructor 50,
CD2650 [IC12],
Selbstbaucomputer CPU [IC3],
Astro Wars CPU [11], Lazarian game
7420
74LS20
?
Dual 4-input NAND gate
Expanded Elektor [IC32],
ETI-685 [IC45], EA LCVDU [IC15,20],
CD2650 [IC62],
PHUNSY video
7421
74LS21
?
Dual 4-input AND gate
Palladium [A10],
Expanded Elektor [IC29],
ETI LCVDU [IC15],
Lazarian game
7425
?
Dual 4-input NOR gate with strobe
CD2650 [IC70]
74LS26
?
Quad 2-input NAND gate
Lazarian game
74LS27
?
Triple 3-input NOR gate
Instructor 50,
Lazarian game
7430
74LS30
?
Single 8-input NAND gate
Expanded Elektor [IC16..17,27],
PC1001 [IC19], EA LCVDU [IC24], ETI LCVDU [IC30], Prometheus [IC33..34],
main PHUNSY, PHUNSY video, PHUNSY memory,
Astro Wars CPU [9]
7432
74LS32
?
Quad 2-input OR gate
Expanded Elektor [IC21..23],
ETI-685 [IC38],
ETI-681 [IC24],
Instructor 50,
CD2650 [IC59],
PHUNSY interface,
Lazarian game
7438
74LS38
?
Quad 2-input NAND open collector gate
PC1001 [IC34], DS [IC11], EA 77up2, EA 78up5
7442
?
BCD to decimal decoder
ETI LCVDU [IC11],
P1 [IC24]
74LS51
?
?
Instructor 50
7470
?
AND-gated positive edge triggered J-K flip-flop, asynchronous preset and clear
PHUNSY video
7473
74LS73
?
Dual J-K flip-flop, asynchronous clear
ETI-640 [IC1,2]
7474
74LS74
?
Dual D positive edge triggered flip-flop, asynchronous preset and clear
Voltmace processor/video [U10A,10B],
expanded Elektor [IC20],
DS [IC12], ETI-685 [IC43,46], EA LCVDU [IC5],
ETI-640 [IC18],
Instructor 50,
CD2650 [IC23,24,65,75,77],
Astro Wars CPU [12], Galaxia, Lazarian game
7475
74LS75
?
4-bit bistable latch, complementary outputs
PC1001 [IC36..39], ETI LCVDU [IC26,27],
ETI-681 [IC29]
74LS76
?
Dual J-K flip-flop, asynchronous preset and clear
Selbstbaucomputer CPU [IC2]
7485
74LS85
?
4-bit magnitude comparator
Elektor randomizer [IC4..7],
EA LCVDU [IC37,38],
Lazarian game
7486
74LS86
74LS86N
?
Quad 2-input XOR gate
Arcadia [U3,5], Palladium [U2,6],
basic Elektor [IC32],
ETI LCVDU [IC22,23],
ETI-640 [IC17], ETI-685 [IC5,23],
PHUNSY video, PHUNSY memory,
Astro Wars CPU [10], Lazarian game
7490
74LS90
?
Decade counter
Palladium [U9],
ETI LCVDU [IC6,12],
ETI-640 [IC13],
Lazarian game
7492
74LS92
?
Divide-by-12 counter
EA LCVDU [IC26,36],
ETI-640 [IC40]
7493
74LS93
?
4-bit binary counter
EA LCVDU [IC2,3,10,17..19,27,34,39], ETI LCVDU [IC17..19],
ETI-640 [IC10..12,15],
main PHUNSY
7495
?
4-bit shift register, parallel in, parallel out, serial input
EA LCVDU [IC25,33]
74LS107
?
Dual J-K flip-flop, clear
ETI-685 [IC42]
74109
74LS109
?
Dual J-NotK positive-edge-triggered flip-flop, clear and preset
Basic Elektor [IC34],
Instructor 50,
CD2650 [IC66]
74S112
72LS112
?
Dual J-K negative-edge-triggered flip-flop, clear and preset
Astro Wars CPU [17], Galaxia, Lazarian game
74LS113
?
Dual J-K negative-edge-triggered flip-flop, preset
Basic Elektor [IC33,35,36]
74123
74LS123
?
Dual monostable Schmitt trigger
EA 77up2, EA 78up5, EA LCVDU [IC6,7,13,14,32],
CD2650 [IC73],
Selbstbaucomputer A/D converter [IC5]
74125
74LS125
?
Quad bus buffer, negative enable
Elekterminal [IC20],
CD2650 [IC46,47],
Lazarian game
74126
?
Quad bus buffer, positive enable
CD2650 [IC2..10,21,22,78,79]
74LS132
?
Quad 2-input NAND gate
ETI-685 [IC21],
Selbstbaucomputer A/D converter [IC3]
74LS135
?
Quad XOR/XNOR gate, two inputs to select logic type
Galaxia
74LS136
?
Quad 2-input XOR gate
Basic Elektor [IC40]
74LS138
?
3:8 line decoder/demultiplexer, inverting outputs
Basic Elektor [IC7], expanded Elektor [IC19],
EA 78up9, ETI-685 [IC9,49],
Selbstbaucomputer memory [IC1], Selbstbaucomputer display [IC1]
74LS139
?
Dual 2:4 line decoder/demultiplexer, inverting outputs
Basic Elektor [IC6], expanded Elektor [IC15],
ETI-685 [IC18],
Instructor 50,
Astro Wars CPU [13], Lazarian game
74145
74LS145
?
4-bit D flp-flp w/ complementary outputs & reset (keypad inputs)
Arcadia [U14], Palladium [A6]
74148
?
8:3 line priority encoder
Selbstbaucomputer keyboard [IC4,5]
74153
74LS153
?
Dual 4:1 line selector/multiplexer, non-inverting outputs
ETI-640 [IC14]
74154
74LS154
Valvo
4:16 line decoder/demultiplexer, inverting outputs
Prometheus [IC13],
Selbstbaucomputer port unit [IC1]
74LS155
?
Dual 2:4 line decoder/demultiplexer, totem pole
Astro Wars CPU [14], Galaxia, Lazarian game
74LS156
?
Dual 2:4 line decoder/demultiplexer, open collector
Palladium [A3],
Fountain [IC4], Voltmace user I/O [U5], Rowtron,
basic Elektor [IC11],
Astro Wars CPU [15], Galaxia, Lazarian game, Lazarian sound
74157
74LS157
?
Quad 2:1 line selector/multiplexer, non-inverting outputs
ETI-640 [IC5,6,19..21], ETI-685 [IC6,9..12],
CD2650 [IC27..29],
PHUNSY video,
Astro Wars CPU [16], Galaxia, Lazarian game
74LS161
?
Synchronous presettable 4-bit binary counter, asynchronous clear
Expanded Elektor [IC18],
Instructor 50,
Astro Wars CPU [18], Galaxia, Lazarian game, Lazarian sound
74163
74LS163
74LS163A
?
Synchronous presettable 4-bit binary counter, synchronous clear
Elekterminal [IC13],
CD2650 [IC50..52,55..58],
PHUNSY video, PHUNSY memory
74LS164
?
8-bit SIPO shift register, asynchronous clear, not output latch
Astro Wars CPU [19], Galaxia, Lazarian game
74165
74LS165
?
8-bit PISO shift register, parallel load, complementary outputs
Elekterminal [IC12],
ETI-640 [IC7]
74166
74LS166
?
Parallel-load 8-bit shift register
CD2650 [IC60],
PHUNSY video,
Astro Wars CPU [20], Galaxia, Lazarian game
74174
74LS174
?
Hex D flip-flop, common asynchronous clear
DS [IC1..4], Elekterminal [IC9],
Astro Wars CPU [21], Lazarian game
74LS175
?
Quad D edge-triggered flip-flop, comp. outputs and async. clear
ETI-685 [IC8],
Instructor 50
74191
?
Synchronous presettable up/down 4-bit binary counter
EA LCVDU [IC29,30]
74LS193
?
Synchronous presettable up/down 4-bit binary counter, clear
ETI-681 [IC25,26]
74LS221
?
Dual monostable multivibrator
ETI-640 [IC3,41]
74LS240
?
?
TWICE cable [U2..5,7..8]
74LS241
?
Octal buffer, non-inverting outputs
Expanded Elektor [IC10..11]
74LS243
?
?
Instructor 50
74244
74LS244
L4LS244
?
Octal buffer, non-inverting outputs
Expanded Elektor [IC1..2], Elektor randomizer [IC3],
Instructor 50,
PHUNSY interface, PHUNSY video, PHUNSY memory,
Astro Wars CPU [22], Galaxia, Lazarian game
74LS245
8T245
?
Octal bus transceiver, non-inverting outputs
Expanded Elektor [IC3],
main PHUNSY,
Selbstbaucomputer port unit [IC5],
Lazarian game
74LS251
?
8:1 selector/multiplexer, complementary outputs
Basic Elektor [IC8,38..39]
74LS253
?
?
Instructor 50
74258
?
Quad 2:1 multiplexer (3-state) (keypad inputs)
Arcadia [U8]
74LS258
?
Quad 2:1 selector/multipler, inverting outputs
Palladium [A7],
Fountain [IC5], Voltmace user I/O [U?], Rowtron,
basic Elektor [IC12]
74LS260
74S260
?
Dual 5-input NOR gate
PHUNSY video,
Astro Wars CPU [23], Galaxia
74273
74LS273
?
8-bit register, asynchronous clear
Instructor 50,
P1 (printer port),
Main PHUNSY, PHUNSY interface,
Selbstbaucomputer port unit [IC4]
74LS283
?
4-bit binary full adder
Lazarian game
74LS365
?
Hex buffer, non-inverting outputs
Main PHUNSY, PHUNSY video
74367
74LS367
8097
8T97
?
Hex buffer, non-inverting outputs
ETI-685 [IC20,35,41],
ETI-640 [IC35..37], ETI-681 [IC2,19..22,27],
2650 test socket
74368
74LS368
8098
8T98
?
Hex buffer, inverting outputs
PC1001 [IC40..42],
ETI-640 [IC35..37], ETI-681 [IC2,19..22,27],
TWICE cable [U11]
74LS373
?
Octal transparent latch
PHUNSY memory,
Selbstbaucomputer A/D converter [IC1],
Lazarian game
74C374
74LS374
?
Octal tri-state latch
EA 78up9,
PHUNSY video,
Selbstbaucomputer A/D converter [IC1],
Lazarian game, Lazarian sound
74LS378
?
6-bit clock enable
Fountain [IC8], Voltmace processor/video [U8], Rowtron,
expanded Elektor [IC1]
74LS379
?
4-bit clock enable and complementary outputs
PHUNSY video
74S387
SFC 71301E 1-0
?
256*4-bit (128-byte) PROM
Elekterminal [IC7]
74LS393
?
Dual 4-bit binary counter, asynchronous clear
PHUNSY memory
74S471
?
256*8-bit (256-byte) PROM
Dolphin
74LS514?**
?
?
ETI-681 [IC1]
74LS640
74LS640-1
?
Octal bus transceiver, inverting outputs
Selbstbaucomputer keyboard & display [IC3]
7805
µA7805
LM340T-5.0
?
Signetics
TI
+5V power regulator
Arcadia [U13], Palladium [U4..5],
Fountain [IC11], Voltmace power supply [U?],
Elektor modulator [IC1],
, EA 78up5, ETI-636 [IC1],
ETI-681 [IC34],
Selbstbaucomputer power [IC1]
7812
µA7812
?
Signetics
+12V power regulator
Voltmace,
ETI-636 [IC2], ETI-685 [IC1]
7905
79L05
?
-5V power regulator
ETI-685 [IC2],
PHUNSY memory,
Selbstbaucomputer power [IC2]
7912
79L12
?
-12V power regulator
ETI-636 [IC3], ETI-685 [IC4]
79G
?
Communications controller
Elektor power supply [IC1]
8131
?
128*8-bit (128-byte) SRAM?
ETI-685 [IC33,37],
ETI-640 [IC34], ETI-681 [IC3,18]
81LS95
?
Octal tri-state buffer
EA 78up9
81LS97
?
Octal buffer
ETI-685 [IC22..25]
81LS98
?
Octal buffer
ETI-685 [IC10]
8250
?
1 of 8 decoder
PC1001 [IC20], Prometheus [IC35]
N82S100
Signetics
FPLA (PROM)
Lazarian game
82S103
Signetics
Bipolar FPGA
Instructor 50
82S115
Signetics
512*8-bit (512-byte) PROM
Prometheus [IC1..12],
TWIN PROM burner [PROM 2],
CD2650 (eg. IPL 1.1), P1 [IC13..20,48,49],
PHUNSY video
82S123
Signetics
32*8-bit (32-byte) PROM
PC1001 [IC35], ETI-685 [IC34],
Instructor 50,
Main PHUNSY
82S129
Signetics
512*8-bit (512-byte) PROM?
PC1001 [IC2..5,11..14] (CK267..274)
82S130
Signetics
256*4-bit (256-byte) PROM?
Galaxia
8T15
?
E1A driver (RS232)
PC1001 [IC26]
8T16
?
E1A receiver (RS232)
PC1001 [IC43]
8T26
?
Quad bus driver/receiver
PC1001 [IC1,10,24,25]
8T28
?
?
Prometheus [IC14,23]
899-5 R220/330
Beckman
Resistor network
TWICE cable [U1,6,9]
9344
Fairchild
4-bit by 2-bit multiplier
CD2650 [IC26]
AM25LS2520
?
Octal D-type flip-flop
ETI-685 [IC47]
AM9519PC
AMD
DMA (Direct Memory Access) controller
ETI-685 [IC7]
AY-3-8900
General Instrument
Standard Television Interface Chip
?
AY-3-8910
General Instrument
PSG (Programmable Sound Generator)
Expanded Elektor [IC12..13]
AY-5-1013
MM5303
General Instrument
Motorola
UART (Universal Asynchronous Receiver/Transmitter)
Elekterminal [IC8]
AY-5-2376
General Instrument
Keyboard encoder
ETI-670, Elektor KB05
B40C5000
?
Power transistor
Elektor power supply [B1]
BC107B
BC547
BC547B
?
NPN bipolar transistor
Elekterminal [T1], ETI-692 [Q1..3]
BC108
BC548
?
NPN bipolar transistor
EA 77up2, EA 78up5, ETI-685 [Q1..3],
ETI-640 [Q1,3], ETI-681 [Q1],
Lazarian game
BC177B
BC557
BC557B
?
Audio amplifier
Elekterminal [T2], Lazarian sound
BC327
?
PNP bipolar transistor?
Selbstbaucomputer display
BC337
?
NPN bipolar transistor
PHUNSY interface,
Astro Wars CPU [46], Lazarian game
BC517
?
NPN bipolar transistor
Basic Elektor [T1]
BC558
?
NPN bipolar transistor
ETI-686 [Q1]
BD135
BD137
BD139
?
Transistor
Elektor power supply [T1]
BD140
?
NPN bipolar transistor
ETI-686 [Q2]
BFY90
?
Transistor
Elektor modulator [T3]
BF194
BF195
BF254
BF255
BF494
BF495
?
Transistor
Elektor modulator [T1..2]
BF451
?
NPN bipolar transistor
Elekterminal [T3]
BS170
?
Field effect transistor
Elektor randomizer [T1]
CA324E
?
NPN transistor array
Lazarian game
CA3081
?
NPN transistor array
Lazarian game
CA3130
?
Operational amplifier
CD2650 [IC74]
EM401
?
Silicon diode
EA 78up5
HDSP 3531
HP 5082-7611
Hewlett-Packard
7-segment LED display
Selbstbaucomputer display
SF.F 96364
Thomson-CSF (Sescosem)
CRT (Cathode Ray Tube) Controller (more advanced than EF9364)
Elekterminal [IC10]
DUS
-
Diode, Universal, Silicon*
Elekterminal [D1..4]
EF9364
Thomson
CRT (Cathode Ray Tube) Controller (less advanced than SF.F 96364)
Selbstbaucomputer
LF356
LF357
?
Operational amplifier?
Selbstbaucomputer A/D converter [IC6,7]
LM309
LM309K
Texas Instruments
+5V power regulator
ETI LCVDU [REG1],
ETI-640 [IC42],
Selbstbaucomputer power
LM323K
?
?
ETI-685 [IC3]
LM339
Nat. Semi.
Quad differential comparator
Basic Elektor [IC5],
PHUNSY interface
3403
?
Quad operational amplifier?
Voltmace A/V [U9A..E]
LM393
?
Differential comparator?
Instructor 50
LM3900
?
Quad operational amplifier
Astro Wars sound [IC4]
LVM-2A-34
?
?
Arcadia
MCM6574
MCM6674
Motorola
Character Generator
ETI-640 [IC4], ETI-681 [IC13]
PEIX
?
?
Fountain [IC3]
SAA5050
Signetics
Teletext Character Generator
Malzak
SN76477
Texas Instruments
Sound effect generator
Malzak,
Laser Battle, Lazarian sound
S9014
?
NPN transistor?
Voltmace processor/video [Q1,2,5], Voltmace power supply [Q6], Voltmace A/V [Q3..4,7..8,12]
TCA 520B
?
Cassette interface
Selbstbaucomputer cassette interface [IC1]
TDA 1010
TDA 1010A
?
Audio amplifier
Astro Wars sound [IC6], Lazarian sound
TEA 1002
Mullard
PAL Colour Encoder & Video Summer
Interton, Voltmace processor/video [U3]
TIL220
?
Red LED
ETI-681 [D1]
TIL222
?
Green LED
ETI-681 [D2]
TL084
?
Operational amplifier
Expanded Elektor [IC33]
TMS2516
Texas Instruments
16,384*8-bit (2K) EEPROM
Main PHUNSY
TMS2532
Texas Instruments
32,768*8-bit (4K) EEPROM
Voltmace cartridges [U?]
TMS3615
Texas Instruments
OMTS (Octave Multiple Tone Synthesizer)
Lazarian sound
TMS4045
TMS4045-20
Texas Instruments
1024*4-bit (512-byte) SRAM
1024*4-bit (512-byte) SRAM (200 ns)
Main PHUNSY, PHUNSY video
ULN2003
?
Darlington transistor array?
Instructor 50
UM1233
Astec
PAL modulator
Voltmace A/V
UM1285-8
Astec
NTSC VHF modulator
Arcadia
ZN425E
?
Monolithic 8-bit D-A converter
Selbstbaucomputer A/D converter [IC2]
** Misprint of 74LS541?
Components listed together are not necessarily interchangable drop-in equivalents (eg. speeds, power requirements, etc. may differ).
For most machines, only semiconductors are listed, not capacitors, resistors, etc. Mechanical components and connectors are not listed.
Capacitor
Connector/mechanical (not currently listed)
Diode
Resistor
Transistor
Basic IC
Advanced IC
Miscellaneous
Programming Languages Overview
Name
Language
Coder/porter
Year
Size
Notes
Assembler
Assembler
Peter Marschat
198x
2K ($1000..$17FF)
-
2650 Line Assembler
Assembler
?
19xx
1,332 bytes ($15CC..$1AFF)
-
Assembler
Assembler
Applied Technology (David Curtis)
197x
2½K ($1200..$1BFF)
-
PIP Line Assembler (PIPLA)
Assembler
Signetics
1979
1K ($400..$7FF)
PIPBUG 2 is $0..$3FF
Prometheus
Assembler
Signetics
1977
5½K ($2200..$37FF)
-
2650 Micro BASIC
BASIC
Alan Peek
1978-1979
?
-
MicroWorld BASIC
BASIC
Applied Technology (Ian Binnie & Martin Hood)
1979
?
-
TCT BASIC
BASIC
TCT Micro Design
19xx
?
-
BASIC
BASIC
MicroByte (Ian Binnie & Martin Hood)
19xx
6K
Undumped
FORTH
FORTH
MicroByte (Ian Binnie & Martin Hood)
1982
~8K
Undumped
TWIN assembler
Assembler
Signetics
1976
?
-
TWIN relocatable assembler
Assembler
Signetics
1979
?
-
BASIC
BASIC
Signetics
1982
8K
GN007
Pascal
Pascal
Signetics
1982
?
GN007
Editor/Assembler
Assembler
Central Data?
19xx
5¼K ($2000..$34FF)
-
"8K" BASIC
BASIC
Central Data
1978
6,271 bytes ($2781..$3FFF)
Editor is $2000..$2780
"12K" BASIC
BASIC
Central Data
1978
15,010 bytes ($2000..$5AA1)
Including editor
FORTH
FORTH
D. P. Hildyard
1981
?
-
2650 Assembler (PASS)
Assembler
?
19xx
?
-
QASS
Assembler?
?
19xx
?
-
FORTH
FORTH
Frank Philipse?
19xx
?
Converted from CD2650 to PHUNSY?
MicroWorld BASIC
BASIC
Frank Philipse
19xx-2010
?
Converted from PIPBUG to PHUNSY
Cross-Assembler
Assembler
Signetics
197x
?
Written in FORTRAN. Ran on PDP-11/40 (NCSS & GE Mark III timeshares). Undumped.
PLµS
PL/M superset
Signetics (Gary Kildall)
1978
?
Cross-compiler. Written in FORTRAN. Ran on NCSS timeshare and (other) "16- and 32-bit machines". Undumped.
MicroWorld (and later Microbee and Honeysoft) are variant names of Applied Technology.
Ian Binne & Martin Hood wrote MicroWorld BASIC for Applied Technology but would later form MicroByte.
File Formats Overview
A
u
t
o
s
e
n
s
e
Extn.
Meaning
Description
Loaded from
Run from
Efficiency
BIN
Binary
Headerless raw binary.
Represents a ROM cartridge.
Represents a partial RAM image (loaded from tape).
Always $0
Always $0
Very good
TVC
TV (Television) Games Computer
Ami/Droid/WinElektor-only format. Represents a partial RAM image (loaded from tape).
Yes
Yes
Very good
EOF
Elektor TVGC Object Format
Native on-tape file format for Elektor TVGC (and Hobby Module). Similar to AOF.
Yes
Yes
OK
8SVX
IFF 8-bit Sampled Vox (Voice)
Entire (side of) analog (audio) tape.
Yes
Yes
Extremely poor
AIFF
Audio Interchange File Format
Entire (side of) analog (audio) tape.
Yes
Yes
Extremely poor
WAV
RIFF (Rip-off of IFF) Waveform
Entire (side of) analog (audio) tape.
Yes
Yes
Extremely poor
PAP
Papertape
Headerless raw binary. Represents an entire roll of papertape.
(Note: MIKIT papertape is not yet supported in Ami/WinArcadia, as of V34.3.)
No/Yes*
No/Yes*
Very good/OK*
AOF
Signetics Absolute Object Format
Native on-tape (audio cassette tape and papertape) file format for
SI50/PIPBUG/BINBUG/CD2650, also used on TWIN. Similar to EOF.
Yes
Yes
OK
CMD
Command
Native on-disk file format for BINBUG-based machines.
Yes
Yes
Good
RAW
Raw disk image
Entire (side of) BINBUG or CD2650 floppy disk (5¼"), raw.
n/a
n/a
Very good
MOD
Module
Native on-disk file format for TWIN.
Yes
Yes
Good
TWIN
Test Ware Instrument disk image
Entire (side of) TWIN floppy disk (8"), with sector headers.
n/a
n/a
Good
IMG
Raw disk image
Entire (side of) TWIN floppy disk (8"), raw.
n/a
n/a
Very good
SMS
"ASCII-Hex SMS"
For PROM burners. Probably invented by
SMS Microcomputer Systems
.
TWIN can load/save this format, but its own built-in PROM burner does not require it
(instead it just reads from a user-specified region of slave RAM).
Always $0
Always $0
Poor
IMAG
Image
Native on-disk file format for CD2650.
Yes
Yes
Good
MDCR
Mini Digital Cassette Recorder
Entire digital tape.
Yes
Yes
Good
BPNF
Begin Plus Negative Finish
For PROM burners.
No
No
Very poor
COS
Common saved state
Ami/Droid/WinArcadia-only format.
Represents a complete machine state.
Always $0
Yes
Good
COR
Common recording
Ami/WinArcadia-only format.
Represents a complete machine state and subsequent user input.
Always $0
Yes
Good
HEX
Intel hexadecimal object format
Roughly similar to AOF, though without game start address feature.
Yes
No
OK
ASM
Assembly language
2650 CPU assembly language source code (in ASCII).
Yes
No
Poor
SYM
Symbol table
Symbol table, ie. label definitions (in ASCII). No effect on guest.
No
No
n/a
BIN for Arcadia/Interton/SI50/PHUNSY;
TVC for Elektor; and
AOF for PIPBUG/BINBUG/CD2650/Selbstbaucomputer/MIKIT.
Plus the floppy disk formats (IMG/TWIN/RAW) when using disk-based software (ie. any of the DOSes).
COS and COR files can be used for any purpose as desired; they are the most powerful and flexible of all formats.
Use of the tape formats (8SVX/AIFF/WAV/MDCR) should normally only be needed when dumping tapes.
Use of the PROM burner formats (BPNF/SMS) should never be needed unless you actually have, and want to use,
an old PROM burner that expects its data in one of these formats.
There is not much necessity to use EOF format but you can do so if you want.
If it mostly equivalent to TVC except it is less efficient, has checksums, and has a file ID ($0..$F range) (and is
not supported for autosensing).
Use of the on-disk formats (CMD/MOD/IMAG) should not normally be needed; usually it is more convenient to just use
the disk (IMG/TWIN/RAW) containing the program.
Any of the file formats can be used inside a ZIP archive if desired.
Note that AOF/ASM/BIN/HEX/SYM/etc. files can be force-loaded/saved to/from practically any guest using the debugger
(even where blank in the table above).
"Loaded from" of "yes" means the file format contains start and end addresses for where it should be loaded.
"Run from" of "yes" means the file format can contain a game start address for where it should begin execution from.
Efficiency is in terms of storage space, as a means of storing games for emulator users. In case your host machine is down to its last terabyte ;-) .
*: The 1st value is inherent. The 2nd value assumes an AOF is stored on it.
Signetics AOF (Absolute Object Format)
Offset(s)
Description
0
colon (:) ($3A)
1..2
load address (big-endian)
3
block length:
0 = last block
1..255 = 2..256 bytes (respectively)
4
checksum for header bytes 0..3
5..n-1
data (ASCII-encoded hex, each character representing 1 nybble)
n
checksum for data
Checksums start as $00. For each emitted byte, the following algorithm is
applied:
SUMC ^= data;
SUMC <<= 1;$1600: C0 C0 C0 C0
3A 16 00 03 15 (1st block header)
C0 C0 C0 C0 88 (1st block data)
3A 00 00 00 A3 (2nd block header)SUMC = 0; // SUMC is %00000000 [$00];
SUMC ^= $3A; // SUMC is %00111010 [$3A];
SUMC <<= 1; // SUMC is %01110100 [$74];
SUMC ^= $16; // SUMC is %01100010 [$62];
SUMC <<= 1; // SUMC is %11000100 [$C4];
SUMC ^= $00; // SUMC is %11000100 [$C4];
SUMC <<= 1; // SUMC is %10001001 [$89];
SUMC ^= $03; // SUMC is %10001010 [$8A];
SUMC <<= 1; // SUMC is %00010101 [$15];SUMC = 0; // SUMC is %00000000 [$00];
SUMC ^= $C0; // SUMC is %11000000 [$C0];
SUMC <<= 1; // SUMC is %10000001 [$81];
SUMC ^= $C0; // SUMC is %01000001 [$41];
SUMC <<= 1; // SUMC is %10000010 [$82];
SUMC ^= $C0; // SUMC is %01000010 [$42];
SUMC <<= 1; // SUMC is %10000100 [$84];
SUMC ^= $C0; // SUMC is %01000100 [$44];
SUMC <<= 1; // SUMC is %10001000 [$88];SUMC = 0; // SUMC is %00000000 [$00];
SUMC ^= $3A; // SUMC is %00111010 [$3A];
SUMC <<= 1; // SUMC is %01110100 [$74];
SUMC ^= $00; // SUMC is %01110100 [$74];
SUMC <<= 1; // SUMC is %11101000 [$E8];
SUMC ^= $00; // SUMC is %11101000 [$E8];
SUMC <<= 1; // SUMC is %11010001 [$D1];
SUMC ^= $00; // SUMC is %11010001 [$D1];
SUMC <<= 1; // SUMC is %10100011 [$A3];