ELEKTOR TV GAMES COMPUTER CODING GUIDE -------------------------------------- This document was written on 7/2/07, and last updated on 4/12/23, by James Jacobs of Amigan Software. Information herein is believed to be generally accurate, though most is tentative and incomplete. If you have anything to contribute, please email amigansoftware@gmail.com. Thanks to Manfred Schneider and Peter Trauner for their contributions. ANNOTATE and HOWDIF both support the Elektor TV Games Computer; use the appropriate ELEKTOR_E or ELEKTOR_F (for ANNOTATE) or ELEKTOR (for HOWDIF) argument. Annotated disassemblies of every Elektor Software Service (ESS) game/ utility are now available, so therefore you should not normally need to use DASMX or ANNOTATE. Note, however, that the first byte of these disassemblies should be changed back to $00, and any labels in the $0000.. $08BF range should be deleted. Eg. org RESET ; RESET: bcta,un L0900 ;goto L0900; ;3,3 $0000..$0002: 00 09 00 becomes: org $0000 ; db $00 ;0,1 $0000: 00 dw $0900 ;0,2 $0001..$0002: 09 00 Some available disassemblies were made using older versions of ANNOTATE; the memory maps included in such disassemblies are obsolete and inaccurate. You should always use the latest version of ANNOTATE. Disassembly of PGM Files ------------------------ See also the Emerson Arcadia 2001 Coding Guide for information about usage of DASMX and VACS, and comprehension of TVGC disassemblies. 1. Make a backup of the .PGM file, to verify against later. 2. Change byte 0 of the .PGM file from $00 to $1F (BSTA,un), either manually or by running TOGGLER. 3. Optional: If the game makes heavy use of calls to the monitor, you could copy the monitor to $3..$8BF. 4. Disassemble with DASMX. 5. Annotate with ANNOTATE, using ELEKTOR_E or ELEKTOR_F as the machine, as appropriate. 6. Change byte 0 of the .PGM file from $1F to $00, either manually or by running TOGGLER. 7. Change the first line of code in the .ASM file, from eg. bcta,un $0900 to eg.: db $00 dw $0900 so that the first byte of the generated .PGM file will be $00 rather than $1F. 8. Assemble with VACS. 9. Use HOWDIF to verify that the newly generated binary is identical to the original binary. TOGGLER is provided with ANNOTATE. Memory Maps ----------- There are two versions of the Elektor TV Games Computer: the standard "base" version (type "E"), and the "extended" version (type "F"). The base and extended versions have 2K and 5K of RAM, respectively. There are also other differences. They use the following memory maps: E: Base version $0000..$07FF: monitor ROM $0800..$08BF: 192 bytes of motherboard RAM (for use by monitor) $08B9..$08BA: interrupt vector $08BE..$08BF: start address of game $08C0..$0FFF: 1856 bytes of motherboard RAM (for storage of and use by games) $1000..$15FF: unused $1600..$17FF: mirror of $1E00..$1FFF $1800..$18FF: mirror of $1D00..$1DFF $1900..$19FF: mirror of $1D00..$1DFF $1A00..$1AFF: mirror of $1D00..$1DFF $1B00..$1BFF: mirror of $1D00..$1DFF $1C00..$1CFF: mirror of $1D00..$1DFF $1D00..$1D3F: I/O #0 $1D40..$1D7F: I/O #1 $1D80..$1DBF: input lines, and mirrors of them (see "I/O Lines" section) $1DC0..$1DFF: output lines, and mirrors of them (see "I/O Lines" section) $1E00..$1EFF: "I/O area" $1E00..$1E7F: unmapped $1E80: optional Interton-style noise generator $1E81..$1EFF: see detailed memory map $1F00..$1FFF: PVI area (see detailed memory map) $2000..$3FFF: mirror of $0000..$1FFF $4000..$5FFF: mirror of $0000..$1FFF $6000..$7FFF: mirror of $0000..$1FFF F: Extended version $0000..$07FF: monitor ROM $0800..$08BF: 192 bytes of motherboard RAM (for use by monitor) RLG: also used as data for load routine $08B9..$08BA: interrupt vector $08BE..$08BF: start address of game $08C0..$199B: 4316 bytes of motherboard RAM (for storage of and use by games) $199C..$199F: if (*($73E) == $19) mirror of $1D9C..$1D9F (obscures 4 bytes of RAM) if (*($73E) == $1D) 4 bytes of motherboard RAM (for storage of and use by games) $19A0..$19BB: 28 bytes of motherboard RAM (for storage of and use by games) $19BC..$19BF: if (*($73E) == $19) mirror of $1DBC..$1DBF (obscures 4 bytes of RAM) if (*($73E) == $1D) 4 bytes of motherboard RAM (for storage of and use by games) $19C0..$1BFF: 576 bytes of motherboard RAM (for storage of and use by games) $1BD0..$1BFF: 48 bytes of motherboard RAM (for storage of and use by games) (or data for/from RLG save/calculation routines) $1C00..$1C1F: unused or EPROM (RLG loader or saver routine) $1C20..$1C7F: mirror of $1D20..$1D7F or RLG loader or save routine $1C80..$1CFF: mirror of $1D80..$1DFF $1D00..$1D0F: I/O #0: 1st PSG (Programmable Sound Generator) $1D10..$1D1F: I/O #0: 2nd PSG (Programmable Sound Generator) $1D20: I/O #0: optional random number generator #2 (suggested in English and German books, on pages 161 and 173) RANDOM1G equ $1FFA ;(R/-) 1st German randomizer? RANDOM1E equ $1FFF ;(R/-) 1st English randomizer? $1D20: I/O #0: optional random number generator #2 - suggested in English book, p. 161 - suggested in English magazine (Sep 1981), p. 24 - suggested in German book, p. 173 - suggested in German magazine (Sep 1981), p. 49 $1D21..$1D3F: I/O #0 $1D40..$1D7F: I/O #1 $1D80..$1DBF: input lines, and mirrors of them (see "I/O Lines" section) $1DC0..$1DFF: output lines, and mirrors of them (see "I/O Lines" section) $1E00..$1EFF: "I/O area" $1E00..$1E7F: unmapped or EPROM (RLG loader or saver routine) $1E80: optional Interton-style noise generator $1E81..$1EFF: see detailed memory map $1F00..$1FFF: PVI area (see detailed memory map) $2000..$21FF: unused or EPROM (RLG calculation routine) $2200..$7FFF: unused or EPROM (RLG games storage area) "$2000..$7FFF: It is not used by any other known hardware extension, but it could be used. In fact in one of the Elektor magazines is a project from them which uses this area. It is called in the German Elektor magazine "Schnelle Spiele", meaning fast games. It was developed by Elektor for computer fairs where they presented the TVGC. They didn't want to load the games from cassette, because this would take too long for loading during the fair. So they decided to build this which loads them out of EPROMs instead from tape. It is connected to the Interton-connector of the extension board and a couple of other wires. The Interton-connector was also modified. They connected addressline A13 and A14 onto pins which they didn't use. The new board then has access to the address ranges $2000..$7FFF and $1C00..$1C7F and $1E00..$1E7F." - Manfred Schneider. For more details about the "rapid loading games" enhancement, see the relevant article in Elektor magazine (also available at EA2001 Central). Semi-mirroring: "The 'I/O and control' field is actually repeated four times: $1FC0.. $1FCD, $1FD0..$1FDF, $1FE0..$1FEF, $1FF0..$1FFF. This proves of particular interest for the data stored at addresses $1FCA and $1FCB (collisions, VRLE, etc.). Both of these bytes are cleared when read, which can be a nuisance. However, one reader has pointed out that reading $1FCA, say, only clears this one byte - it does not clear $1FDA, $1FEA or $1FFA! This means that a different address can be used for retrieving data for each object, as required, without affecting the information required later on for one of the other objects. Useful!" - Elektor magazine. Presumably this also applies to the Interton VC 4000 console family. ;Hardware Equates/Memory Map (Elektor TVGC, type "E")--------------------- ; $0000..$07FF: (R/-) 2K of monitor ROM ; $0800..$08BF: (R/W) monitor RAM ; $08C0..$0FFF: (R/W) game RAM ; $1000..$15FF: (-/-) unused (these return $FF) ; $1600..$17FF: (*/*) mirror of $1E00..$1FFF ; $1800..$18FF: (*/*) mirror of $1D00..$1DFF ; $1900..$19FF: (*/*) mirror of $1D00..$1DFF ; $1A00..$1AFF: (*/*) mirror of $1D00..$1DFF ; $1B00..$1BFF: (*/*) mirror of $1D00..$1DFF ; $1C00..$1CFF: (*/*) mirror of $1D00..$1DFF ; $1D00..$1D3F: (R/W) I/O #0 ; $1D40..$1D7F: (R/W) I/O #1 ; $1D80..$1DBF: (R/-) input lines (& mirrors thereof) CASIN equ $1DBF ;(R/-) cassette input ; $1DC0..$1DFF: (-/W) output lines (& mirrors thereof) CASOUT equ $1DFF ;(-/W) cassette output ; $1E00..$1E7F: (-/-) unused NOISE equ $1E80 ;(?/W) optional noise register ; bits 7..6: unused? ; bit 5: bkgrnd colour inversion on/off ; bit 4: noise on/off ; bit 3: unknown ; bit 2: tones on/off? ; bits 1..0: unused? ; $1E81..$1E87: (-/-) unmapped P1LEFTKEYS equ $1E88 ;(R/-) ; bit 7: 'RCAS' key ; bit 6: 'BP1/2' key ; bit 5: 'PC' key ; bit 4: '-' key ; bits 3..0: unused, but always set (to %1111) P1MIDDLEKEYS equ $1E89 ;(R/-) ; bit 7: 'WCAS' key ; bit 6: 'REG' key ; bit 5: 'MEM' key ; bit 4: '+' key ; bits 3..0: unused, but always set (to %1111) P1RIGHTKEYS equ $1E8A ;(R/-) ; bit 7: 'C' key ; bit 6: '8' key ; bit 5: '4' key ; bit 4: '0' key ; bits 3..0: unused, but always set (to %1111) CONSOLE equ $1E8B ;(R/-) ; bit 7: 'UC' key ; bit 6: 'START' key ; bit 5: 'LC' key ; bit 4: 'RESET' key ; bits 3..0: unused, but always set (to %1111) P2LEFTKEYS equ $1E8C ;(R/-) ; bit 7: 'D' key ; bit 6: '9' key ; bit 5: '5' key ; bit 4: '1' key ; bits 3..0: unused, but always set (to %1111) P2MIDDLEKEYS equ $1E8D ;(R/-) ; bit 7: 'E' key ; bit 6: 'A' key ; bit 5: '6' key ; bit 4: '2' key ; bits 3..0: unused, but always set (to %1111) P2RIGHTKEYS equ $1E8E ;(R/-) ; bit 7: 'F' key ; bit 6: 'B' key ; bit 5: '7' key ; bit 4: '3' key ; bits 3..0: unused, but always set (to %1111) ; $1E8F..$1E97 (-/-) unmapped ; $1E98..$1E9B (R/-) mirror of $1E88..$1E8B ; $1E9C..$1EA7 (-/-) unmapped ; $1EA8..$1EAE (R/-) mirror of $1E88..$1E8E ; $1EAF..$1EB7 (-/-) unmapped ; $1EB8..$1EBB (R/-) mirror of $1E88..$1E8B ; $1EBC..$1EC7 (-/-) unmapped ; $1EC8..$1ECE (R/-) mirror of $1E88..$1E8E ; $1ECF..$1ED7 (-/-) unmapped ; $1ED8..$1EDB (R/-) mirror of $1E88..$1E8B ; $1EDC..$1EE7 (-/-) unmapped ; $1EE8..$1EEE (R/-) mirror of $1E88..$1E8E ; $1EEF..$1EF7 (-/-) unmapped ; $1EF8..$1EFB (R/-) mirror of $1E88..$18EB ; $1EFC..$1EFF (-/-) unmapped ; $1F00..$1F09: (R/W) imagery for sprite #0 (8*10) SPRITE0AX equ $1F0A ;(R/W) SPRITE0BX equ $1F0B ;(R/W) SPRITE0AY equ $1F0C ;(R/W) SPRITE0BY equ $1F0D ;(R/W) ; $1F0E..$1F0F: (R/W) PVI RAM ; $1F10..$1F19: (R/W) imagery for sprite #1 (8*10) SPRITE1AX equ $1F1A ;(R/W) SPRITE1BX equ $1F1B ;(R/W) SPRITE1AY equ $1F1C ;(R/W) SPRITE1BY equ $1F1D ;(R/W) ; $1F1E..$1F1F: (R/W) PVI RAM ; $1F20..$1F29: (R/W) imagery for sprite #2 (8*10) SPRITE2AX equ $1F2A ;(R/W) SPRITE2BX equ $1F2B ;(R/W) SPRITE2AY equ $1F2C ;(R/W) SPRITE2BY equ $1F2D ;(R/W) ; $1F2E..$1F3F: (-/-) unmapped ; $1F40..$1F49: (R/W) imagery for sprite #3 (8*10) SPRITE3AX equ $1F4A ;(R/W) SPRITE3BX equ $1F4B ;(R/W) SPRITE3AY equ $1F4C ;(R/W) SPRITE3BY equ $1F4D ;(R/W) ; $1F4E..$1F6D: (R/W) PVI RAM ; $1F6E..$1F7F: (-/-) unmapped ; $1F80..$1FA7 ;(R/W) vertical grid HORIZ1 equ $1FA8 ;(R/W) horizontal grid #1 HORIZ2 equ $1FA9 ;(R/W) horizontal grid #2 HORIZ3 equ $1FAA ;(R/W) horizontal grid #3 HORIZ4 equ $1FAB ;(R/W) horizontal grid #4 HORIZ5 equ $1FAC ;(R/W) horizontal grid #5 ; $1FAD: (R/W) PVI RAM ; $1FAE..$1FBF: (-/-) unmapped (these return $00?) SIZES equ $1FC0 ;(-/W) SPR01COLOURS equ $1FC1 ;(-/W) ; bits 7..6: unused ; bits 5..3: colour of sprite #0 ; (inverted RGB mask) ; bits 2..0: colour of sprite #1 ; (inverted RGB mask) SPR23COLOURS equ $1FC2 ;(-/W) ; bits 7..6: unused ; bits 5..3: colour of sprite #2 ; (inverted RGB mask) ; bits 2..0: colour of sprite #3 ; (inverted RGB mask) SCORECTRL equ $1FC3 ;(-/W) ; bits 7..2: unused ; bit 1: score format ; 0 = 2 groups of 2 digits ; 1 = 1 group of 4 digits ; bit 0: score position ; 0 = top of screen ; 1 = bottom of screen ; $1FC4..$1FC5: (-/-) unused BGCOLOUR equ $1FC6 ;(-/W) ; bit 7: unused ; bits 6..4: grid colour (normal RGB FB/HB ; mask) ; bit 3: grid/background enable flag ; (0=off, 1=on) ; bits 2..0: screen colour (normal RGB FB/HB ; mask) (black if bit 3 is clear) PITCH equ $1FC7 ;(-/W) ; bits 7..0: pitch SCORELT equ $1FC8 ;(-/W) left digit pair ; bits 7..4: BCD value of 1st digit ; bits 3..0: BCD value of 2nd digit SCORERT equ $1FC9 ;(-/W) right digit pair ; bits 7..4: BCD value of 3rd digit ; bits 3..0: BCD value of 4th digit BGCOLLIDE equ $1FCA ;(R/-) read-once! ; bit 7: sprite #0 collision with bkgrnd ; bit 6: sprite #1 collision with bkgrnd ; bit 5: sprite #2 collision with bkgrnd ; bit 4: sprite #3 collision with bkgrnd ; bit 3: sprite #0 display complete ; bit 2: sprite #1 display complete ; bit 1: sprite #2 display complete ; bit 0: sprite #3 display complete SPRITECOLLIDE equ $1FCB ;(R/-) read-once! ; bit 7: unused ; bit 6: vertical reset flag ; bit 5: sprites #0/#1 collision ; bit 4: sprites #0/#2 collision ; bit 3: sprites #0/#3 collision ; bit 2: sprites #1/#2 collision ; bit 1: sprites #1/#3 collision ; bit 0: sprites #2/#3 collision P1PADDLE equ $1FCC ;(R/-) P2PADDLE equ $1FCD ;(R/-) ; $1FCE..$1FCF ;(-/-) unused ; $1FD0..$1FDF: (*/*) semi-mirror of $1FC0..$1FCF ; $1FE0..$1FEF: (*/*) semi-mirror of $1FC0..$1FCF ; $1FF0..$1FFF: (*/*) semi-mirror of $1FC0..$1FCF ; $2000..$3FFF: (*/*) mirror of $0000..$1FFF ; $4000..$5FFF: (*/*) mirror of $0000..$1FFF ; $6000..$7FFF: (*/*) mirror of $0000..$1FFF ;Hardware Equates/Memory Map (Elektor TVGC, type "F")--------------------- ; $0000..$07FF: (R/-) 2K of monitor ROM ; $0800..$08BF: (R/W) monitor RAM ; RLG: also data for load routine ; $08C0..$1BDF: (R/W) game RAM ; $1BE0..$1BFF: (R/W) game RAM or ; (R/W) data for/from RLG save/ ; calculation routines ; $1C00..$1C1F: (-/-) unused or ; (R/w) EPROM (RLG load OR save routine) ; $1C20..$1CFF: (*/*) mirror of $1D20..$1DFF or ; (R/w) EPROM (RLG load OR save routine) ; $1D00..$1D0F: (-/W) I/O #0: 1st PSG PITCHA1_L equ $1D00 ;(-/W) PITCHA1_H equ $1D01 ;(-/W) PITCHB1_L equ $1D02 ;(-/W) PITCHB1_H equ $1D03 ;(-/W) PITCHC1_L equ $1D04 ;(-/W) PITCHC1_H equ $1D05 ;(-/W) PITCHD1 equ $1D06 ;(-/W) MIXER1 equ $1D07 ;(-/W) AMPLITUDEA1 equ $1D08 ;(-/W) AMPLITUDEB1 equ $1D09 ;(-/W) AMPLITUDEC1 equ $1D0A ;(-/W) PERIOD1_L equ $1D0B ;(-/W) PERIOD1_H equ $1D0C ;(-/W) SHAPE1 equ $1D0D ;(-/W) PORTA1 equ $1D0E ;(-/W) PORTB1 equ $1D0F ;(-/W) ; $1D10..$1D1F: (-/W) I/O #0: 2nd PSG PITCHA2_L equ $1D10 ;(-/W) PITCHA2_H equ $1D11 ;(-/W) PITCHB2_L equ $1D12 ;(-/W) PITCHB2_H equ $1D13 ;(-/W) PITCHC2_L equ $1D14 ;(-/W) PITCHC2_H equ $1D15 ;(-/W) PITCHD2 equ $1D16 ;(-/W) MIXER2 equ $1D17 ;(-/W) AMPLITUDEA2 equ $1D18 ;(-/W) AMPLITUDEB2 equ $1D19 ;(-/W) AMPLITUDEC2 equ $1D1A ;(-/W) PERIOD2_L equ $1D1B ;(-/W) PERIOD2_H equ $1D1C ;(-/W) SHAPE2 equ $1D1D ;(-/W) PORTA2 equ $1D1E ;(-/W) PORTB2 equ $1D1F ;(-/W) RANDOM2 equ $1D20 ;(R/-) I/O #0: 2nd randomizer ; $1D21..$1D3F: (R/W) I/O #0 ; $1D40..$1D7F: (R/W) I/O #1 ; $1D80..$1DBF: (R/-) input lines (& mirrors thereof) CASIN equ $1DBF ;(R/-) cassette input ; $1DC0..$1DFF: (-/W) output lines (& mirrors thereof) CASOUT equ $1DFF ;(-/W) cassette output ; $1E00..$1E7F: (-/-) unused or ; (R/w) EPROM (RLG load OR save routine) NOISE equ $1E80 ;(?/W) noise register ; bits 7..6: unused? ; bit 5: bkgrnd colour inversion on/off ; bit 4: noise on/off ; bit 3: unknown ; bit 2: tones on/off? ; bits 1..0: unused? ; $1E81..$1E87: (-/-) unmapped P1LEFTKEYS equ $1E88 ;(R/-) ; bit 7: 'RCAS' key ; bit 6: 'BP1/2' key ; bit 5: 'PC' key ; bit 4: '-' key ; bits 3..0: unused, but always set (to %1111) P1MIDDLEKEYS equ $1E89 ;(R/-) ; bit 7: 'WCAS' key ; bit 6: 'REG' key ; bit 5: 'MEM' key ; bit 4: '+' key ; bits 3..0: unused, but always set (to %1111) P1RIGHTKEYS equ $1E8A ;(R/-) ; bit 7: 'C' key ; bit 6: '8' key ; bit 5: '4' key ; bit 4: '0' key ; bits 3..0: unused, but always set (to %1111) CONSOLE equ $1E8B ;(R/-) ; bit 7: 'UC' key ; bit 6: 'START' key ; bit 5: 'LC' key ; bit 4: 'RESET' key ; bits 3..0: unused, but always set (to %1111) P2LEFTKEYS equ $1E8C ;(R/-) ; bit 7: 'D' key ; bit 6: '9' key ; bit 5: '5' key ; bit 4: '1' key ; bits 3..0: unused, but always set (to %1111) P2MIDDLEKEYS equ $1E8D ;(R/-) ; bit 7: 'E' key ; bit 6: 'A' key ; bit 5: '6' key ; bit 4: '2' key ; bits 3..0: unused, but always set (to %1111) P2RIGHTKEYS equ $1E8E ;(R/-) ; bit 7: 'F' key ; bit 6: 'B' key ; bit 5: '7' key ; bit 4: '3' key ; bits 3..0: unused, but always set (to %1111) ; $1E8F..$1E97 (-/-) unmapped ; $1E98..$1E9B (R/-) mirror of $1E88..$1E8B ; $1E9C..$1EA7 (-/-) unmapped ; $1EA8..$1EAE (R/-) mirror of $1E88..$1E8E ; $1EAF..$1EB7 (-/-) unmapped ; $1EB8..$1EBB (R/-) mirror of $1E88..$1E8B ; $1EBC..$1EC7 (-/-) unmapped ; $1EC8..$1ECE (R/-) mirror of $1E88..$1E8E ; $1ECF..$1ED7 (-/-) unmapped ; $1ED8..$1EDB (R/-) mirror of $1E88..$1E8B ; $1EDC..$1EE7 (-/-) unmapped ; $1EE8..$1EEE (R/-) mirror of $1E88..$1E8E ; $1EEF..$1EF7 (-/-) unmapped ; $1EF8..$1EFB (R/-) mirror of $1E88..$18EB ; $1EFC..$1EFF (-/-) unmapped ; $1F00..$1F09: (R/W) imagery for sprite #0 (8*10) SPRITE0AX equ $1F0A ;(R/W) SPRITE0BX equ $1F0B ;(R/W) SPRITE0AY equ $1F0C ;(R/W) SPRITE0BY equ $1F0D ;(R/W) ; $1F0E..$1F0F: (R/W) PVI RAM ; $1F10..$1F19: (R/W) imagery for sprite #1 (8*10) SPRITE1AX equ $1F1A ;(R/W) SPRITE1BX equ $1F1B ;(R/W) SPRITE1AY equ $1F1C ;(R/W) SPRITE1BY equ $1F1D ;(R/W) ; $1F1E..$1F1F: (R/W) PVI RAM ; $1F20..$1F29: (R/W) imagery for sprite #2 (8*10) SPRITE2AX equ $1F2A ;(R/W) SPRITE2BX equ $1F2B ;(R/W) SPRITE2AY equ $1F2C ;(R/W) SPRITE2BY equ $1F2D ;(R/W) ; $1F2E..$1F3F: (-/-) unmapped ; $1F40..$1F49: (R/W) imagery for sprite #3 (8*10) SPRITE3AX equ $1F4A ;(R/W) SPRITE3BX equ $1F4B ;(R/W) SPRITE3AY equ $1F4C ;(R/W) SPRITE3BY equ $1F4D ;(R/W) ; $1F4E..$1F6D: (R/W) PVI RAM ; $1F6E..$1F7F: (-/-) unmapped ; $1F80..$1FA7 ;(R/W) vertical grid HORIZ1 equ $1FA8 ;(R/W) horizontal grid #1 HORIZ2 equ $1FA9 ;(R/W) horizontal grid #2 HORIZ3 equ $1FAA ;(R/W) horizontal grid #3 HORIZ4 equ $1FAB ;(R/W) horizontal grid #4 HORIZ5 equ $1FAC ;(R/W) horizontal grid #5 ; $1FAD: (R/W) PVI RAM ; $1FAE..$1FBF: (-/-) unmapped (these return $00?) SIZES equ $1FC0 ;(-/W) SPR01COLOURS equ $1FC1 ;(-/W) ; bits 7..6: unused ; bits 5..3: colour of sprite #0 ; (inverted RGB mask) ; bits 2..0: colour of sprite #1 ; (inverted RGB mask) SPR23COLOURS equ $1FC2 ;(-/W) ; bits 7..6: unused ; bits 5..3: colour of sprite #2 ; (inverted RGB mask) ; bits 2..0: colour of sprite #3 ; (inverted RGB mask) SCORECTRL equ $1FC3 ;(-/W) ; bits 7..2: unused ; bit 1: score format ; 0 = 2 groups of 2 digits ; 1 = 1 group of 4 digits ; bit 0: score position ; 0 = top of screen ; 1 = bottom of screen ; $1FC4..$1FC5: (-/-) unused BGCOLOUR equ $1FC6 ;(-/W) ; bit 7: unused ; bits 6..4: grid colour (normal RGB FB/HB ; mask) ; bit 3: grid/background enable flag ; (0=off, 1=on) ; bits 2..0: screen colour (normal RGB FB/HB ; mask) (black if bit 3 is clear) PITCH equ $1FC7 ;(-/W) ; bits 7..0: pitch SCORELT equ $1FC8 ;(-/W) left digit pair ; bits 7..4: BCD value of 1st digit ; bits 3..0: BCD value of 2nd digit SCORERT equ $1FC9 ;(-/W) right digit pair ; bits 7..4: BCD value of 3rd digit ; bits 3..0: BCD value of 4th digit BGCOLLIDE equ $1FCA ;(R/-) read-once! ; bit 7: sprite #0 collision with bkgrnd ; bit 6: sprite #1 collision with bkgrnd ; bit 5: sprite #2 collision with bkgrnd ; bit 4: sprite #3 collision with bkgrnd ; bit 3: sprite #0 display complete ; bit 2: sprite #1 display complete ; bit 1: sprite #2 display complete ; bit 0: sprite #3 display complete SPRITECOLLIDE equ $1FCB ;(R/-) read-once! ; bit 7: unused ; bit 6: vertical reset flag ; bit 5: sprites #0/#1 collision ; bit 4: sprites #0/#2 collision ; bit 3: sprites #0/#3 collision ; bit 2: sprites #1/#2 collision ; bit 1: sprites #1/#3 collision ; bit 0: sprites #2/#3 collision P1PADDLE equ $1FCC ;(R/-) P2PADDLE equ $1FCD ;(R/-) ; $1FCE..$1FCF ;(-/-) unused ; $1FD0..$1FDF: (*/*) semi-mirror of $1FC0..$1FCF ; $1FE0..$1FEF: (*/*) semi-mirror of $1FC0..$1FCF ; $1FF0..$1FF9: (*/*) semi-mirror of $1FC0..$1FC9 RANDOM1G equ $1FFA ;(R/-) 1st German randomizer ; $1FFB..$1FFE: (*/*) semi-mirror of $1FCB..$1FCE RANDOM1E equ $1FFF ;(R/-) 1st English randomizer ; $2000..$21FF: (-/-) unused or ; (R/w) EPROM (RLG calculation routine) ; $2200..$7FFF: (-/-) unused or ; (R/w) EPROM (RLG games storage area) R/W: read/write R/-: read-only (write attempts are ignored) -/-: unmapped -/W: write-only R/w: read/write (but writing requires "burning" EPROM) */*: mirror (or semi-mirror) (resolve address to ascertain R/W attributes) Also, some addresses are read-once (as noted in the text). Note that writes to $1E80..$1EFF affect the NOISE register ($1E80) (if it is present). Reads within this range are handled as shown above. (This applies to both Interton and Elektor.) The NOISE generator ($1E80) is optional. Configuration "E" (base machine) generally does not have it, and configuration "F" (expanded machine) generally does. However, many games which are nominally intended for the base machine do access this register; thus, it is included in both memory maps. Vertical and horizontal grid registers are of course usable as ordinary user RAM by games which do not use the grid (such games do not set the "grid/background enable" flag in BGCOLOUR, or set the grid colour to be the same as the screen (background) colour). "The object descriptor areas and background definition range can also be read at all times in the normal way. In the I/O and control section, however, reading data causes that location to be reset to $00." - 2636 PVI datasheet. The Flag pin of the PSU (in the 2650 CPU) controls the paddle "interpolation" (multiplexing) (ie. whether horizontal or vertical). ;Official Monitor ROM Label Equates--------------------------------------- RESET equ $0000 ;(R/-) ROM code INTRR equ $0003 ;(R/-) ROM code BVEC1 equ $0006 ;(R/-) ROM data? BVEC2 equ $0008 ;(R/-) ROM data? START equ $000A ;(R/-) ROM code INIT0 equ $0023 ;(R/-) ROM code INIT1 equ $0028 ;(R/-) ROM code START1 equ $0038 ;(R/-) ROM code MWAIT0 equ $0045 ;(R/-) ROM code MWAIT1 equ $0047 ;(R/-) ROM code MONINT equ $004B ;(R/-) ROM code FREFR0 equ $004E ;(R/-) ROM code FREEF1 equ $0057 ;(R/-) ROM code FILELN equ $0071 ;(R/-) ROM code FREFR1 equ $0077 ;(R/-) ROM code FREFR2 equ $007A ;(R/-) ROM code (display last line only) MPOBJ1 equ $00AD ;(R/-) ROM data MPOBJ2 equ $00B1 ;(R/-) ROM data MPOBJ3 equ $00B5 ;(R/-) ROM data MPOBJ4 equ $00B9 ;(R/-) ROM data MKEY equ $00BD ;(R/-) ROM code MKEY1 equ $00CA ;(R/-) ROM code MKEY2 equ $00CD ;(R/-) ROM code MKEYR equ $00D4 ;(R/-) ROM code MKEY3 equ $00DE ;(R/-) ROM code MKEY5 equ $00EF ;(R/-) ROM code MKEY6 equ $00FD ;(R/-) ROM code FNOP equ $010C ;(R/-) ROM code FMEM equ $010D ;(R/-) ROM code FBK equ $0110 ;(R/-) ROM code FREG equ $0113 ;(R/-) ROM code FINIT equ $0116 ;(R/-) ROM code FPC equ $0119 ;(R/-) ROM code FRC equ $011C ;(R/-) ROM code FWC equ $011F ;(R/-) ROM code KBFTBL equ $0122 ;(R/-) ROM data SAVE equ $013E ;(R/-) ROM code SAVE1 equ $0161 ;(R/-) ROM code (initiate PVI) CLROBJ equ $016E ;(R/-) ROM code (clear objects) PVIPAR equ $0177 ;(R/-) ROM code (ROM data) KBSCAN equ $0181 ;(R/-) ROM code (keyboard scan) KBSC0 equ $018A ;(R/-) ROM code KBSC12 equ $0193 ;(R/-) ROM code IA00 equ $0195 ;(R/-) ROM code IA01 equ $0198 ;(R/-) ROM code IA02 equ $019B ;(R/-) ROM code IA03 equ $01A0 ;(R/-) ROM code IA04 equ $01A3 ;(R/-) ROM code KBSC5 equ $01B6 ;(R/-) ROM code KBSC6 equ $01B8 ;(R/-) ROM code KBSC7 equ $01BD ;(R/-) ROM code KBSC1 equ $01C0 ;(R/-) ROM code KBSC2 equ $01C3 ;(R/-) ROM code KBSC3 equ $01CF ;(R/-) ROM code KBSC8 equ $01D9 ;(R/-) ROM code KBSC11 equ $01DC ;(R/-) ROM code KBSC10 equ $01DF ;(R/-) ROM code KBSC4 equ $01E3 ;(R/-) ROM code KBSC9 equ $01E9 ;(R/-) ROM code KBSBR equ $01EE ;(R/-) ROM code KBSBR0 equ $01F4 ;(R/-) ROM code KBSBR4 equ $01FB ;(R/-) ROM code KBSBR2 equ $01FD ;(R/-) ROM code KBSBR1 equ $01FF ;(R/-) ROM code LINE equ $020E ;(R/-) ROM code (trnslte MLINE to dsply) LINE2 equ $0212 ;(R/-) ROM code LINE07 equ $021E ;(R/-) ROM code LINE6 equ $0234 ;(R/-) ROM code LINE7 equ $023A ;(R/-) ROM code LINE8 equ $023C ;(R/-) ROM code CHARPS equ $024B ;(R/-) ROM code LINE05 equ $0255 ;(R/-) ROM code LINE09 equ $025B ;(R/-) ROM code LINE06 equ $025F ;(R/-) ROM code IMGTBL equ $027B ;(R/-) ROM data SCROLL equ $02CF ;(R/-) ROM code (scroll, 8 spcs to MLINE) SCROL1 equ $02D1 ;(R/-) ROM code SCROL3 equ $02D9 ;(R/-) ROM code (load 8 spaces to MLINE) SCROL4 equ $02DB ;(R/-) ROM code NEWMES equ $02E3 ;(R/-) ROM code (scroll, msg to MLINE) MESSAG equ $02EA ;(R/-) ROM code (output message to MLINE) MESSL equ $02F5 ;(R/-) ROM data ASMDAT equ $031D ;(R/-) ROM code (assemble data) ASSMC equ $0328 ;(R/-) ROM code ASSMC1 equ $0332 ;(R/-) ROM code STRDAT equ $0339 ;(R/-) ROM code RESDAT equ $0340 ;(R/-) ROM code LOADAT equ $0346 ;(R/-) ROM code OUTADD equ $034E ;(R/-) ROM code (otpt dbl byte to MLINE) OUTADR equ $0350 ;(R/-) ROM code (otpt dbl byte to MLINE) OUTBYT equ $0354 ;(R/-) ROM code (otpt sngl byte to MLINE) NIBL equ $035E ;(R/-) ROM code (split register) OUTNAD equ $0368 ;(R/-) ROM code OUTADS equ $036C ;(R/-) ROM code SPACES equ $0377 ;(R/-) ROM code STDATA equ $0381 ;(R/-) ROM code STDAT1 equ $0392 ;(R/-) ROM code STDAT2 equ $039B ;(R/-) ROM code INCADR equ $039F ;(R/-) ROM code (increment double byte) REG01 equ $03B0 ;(R/-) ROM code REG1 equ $03B8 ;(R/-) ROM code REG7 equ $03D1 ;(R/-) ROM code REG2 equ $03D6 ;(R/-) ROM code IAREG equ $03DB ;(R/-) ROM code REG3 equ $03E0 ;(R/-) ROM code REG4 equ $03F4 ;(R/-) ROM code REG5 equ $0400 ;(R/-) ROM code MEM0 equ $040C ;(R/-) ROM code MEM1 equ $0415 ;(R/-) ROM code MEM2 equ $041C ;(R/-) ROM code MEM3 equ $042E ;(R/-) ROM code MEM4 equ $043E ;(R/-) ROM code MEM7 equ $044D ;(R/-) ROM code MEM9 equ $0452 ;(R/-) ROM code MEM8 equ $0465 ;(R/-) ROM code MEM5 equ $0467 ;(R/-) ROM code MEM6 equ $046A ;(R/-) ROM code MEMFS3 equ $047D ;(R/-) ROM code MEMBYT equ $0480 ;(R/-) ROM code (otpt sngl byte to scrn) MEMLIN equ $0483 ;(R/-) ROM code MEMFS7 equ $0486 ;(R/-) ROM code FMEM1 equ $0495 ;(R/-) ROM code FMEM3 equ $0499 ;(R/-) ROM code FMEM2 equ $04A2 ;(R/-) ROM code BKSC equ $04A9 ;(R/-) ROM code FBK1 equ $04C3 ;(R/-) ROM code FBK2 equ $04CB ;(R/-) ROM code FBK3 equ $04D1 ;(R/-) ROM code IABK equ $04D6 ;(R/-) ROM code FBK4 equ $04DB ;(R/-) ROM code FBK5 equ $04DD ;(R/-) ROM code FBK20 equ $04F5 ;(R/-) ROM code FBK21 equ $050A ;(R/-) ROM code GO0 equ $050E ;(R/-) ROM code GO4 equ $0515 ;(R/-) ROM code GO3 equ $0529 ;(R/-) ROM code (otpt dbl byte to scrn) GOLIN equ $052C ;(R/-) ROM code GO1 equ $052F ;(R/-) ROM code (assemble data on screen) GO2 equ $0532 ;(R/-) ROM code ZBRR1 equ $0537 ;(R/-) ROM data? ZBRR2 equ $0539 ;(R/-) ROM data? UMODE equ $053B ;(R/-) ROM data STRTUP equ $0540 ;(R/-) ROM code BREAK1 equ $0594 ;(R/-) ROM code BREAKM equ $05A4 ;(R/-) ROM code BREAK2 equ $05B2 ;(R/-) ROM code PCEQBK equ $05C4 ;(R/-) ROM code BRKSBR equ $05CD ;(R/-) ROM code BRKSB1 equ $05E0 ;(R/-) ROM code WCAS0 equ $05E8 ;(R/-) ROM code WCAS1 equ $05F3 ;(R/-) ROM code WCAS2 equ $05F7 ;(R/-) ROM code WCAS3 equ $0602 ;(R/-) ROM code (scroll, msg to scrn) WCALIN equ $0605 ;(R/-) ROM code WCAS4 equ $0608 ;(R/-) ROM code WCAS6 equ $0610 ;(R/-) ROM code WCAS2A equ $0626 ;(R/-) ROM code WCAS7 equ $0628 ;(R/-) ROM code WCAS8 equ $063C ;(R/-) ROM code WCASF1 equ $0642 ;(R/-) ROM code WCAS9 equ $064A ;(R/-) ROM code BLOCK equ $0655 ;(R/-) ROM code WCASB equ $0671 ;(R/-) ROM code WCAS10 equ $0681 ;(R/-) ROM code IBOUT equ $0690 ;(R/-) ROM code WCAS11 equ $0699 ;(R/-) ROM code WCAS12 equ $06A4 ;(R/-) ROM code WCAS13 equ $06B8 ;(R/-) ROM code BOUT equ $06D0 ;(R/-) ROM code COUT equ $06D3 ;(R/-) ROM code COUT1 equ $06DA ;(R/-) ROM code COUT2 equ $06E1 ;(R/-) ROM code COUT3 equ $06E3 ;(R/-) ROM code ONE equ $06EA ;(R/-) ROM code ZERO equ $06EE ;(R/-) ROM code DELAY equ $06F2 ;(R/-) ROM code PULSE equ $06F7 ;(R/-) ROM code (delay) CHIN equ $0709 ;(R/-) ROM code CHI1 equ $070D ;(R/-) ROM code CHI2 equ $0710 ;(R/-) ROM code CHI3 equ $0712 ;(R/-) ROM code CHI4 equ $071B ;(R/-) ROM code CBCC equ $0726 ;(R/-) ROM code RBIT equ $0731 ;(R/-) ROM code RBIT1 equ $0734 ;(R/-) ROM code RBIT2 equ $0739 ;(R/-) ROM code RBIT3 equ $073B ;(R/-) ROM code RBIT4 equ $073D ;(R/-) ROM code RBIT5 equ $0747 ;(R/-) ROM code RCAS0 equ $0758 ;(R/-) ROM code RCAS7 equ $0764 ;(R/-) ROM code CHLINE equ $076A ;(R/-) ROM code CHLIN1 equ $076D ;(R/-) ROM code RCAS8 equ $0774 ;(R/-) ROM code RCAS2 equ $0778 ;(R/-) ROM code RCAS1 equ $0788 ;(R/-) ROM code ICHIN1 equ $0797 ;(R/-) ROM code IOBJA equ $079E ;(R/-) ROM code RCAS3 equ $07A8 ;(R/-) ROM code RCAS4 equ $07B0 ;(R/-) ROM code RCAS9 equ $07CE ;(R/-) ROM code ICHIN equ $07D1 ;(R/-) ROM code RCAS5 equ $07D9 ;(R/-) ROM code RCAS6 equ $07EE ;(R/-) ROM code RCASER equ $07F4 ;(R/-) ROM code ;Official Monitor RAM Variable Equates------------------------------------ MONOB equ $0800 ;(R/W) RAM data MLINE equ $0890 ;(R/W) RAM data FSEQ equ $0898 ;(R/W) RAM data (aka SILENC) SILENC equ $0898 ;(R/W) RAM data (aka FSEQ) ENTM equ $0899 ;(R/W) RAM data MFUNC equ $089A ;(R/W) RAM data MSCR equ $089B ;(R/W) RAM data RKBST equ $089D ;(R/W) RAM data LKBST equ $089E ;(R/W) RAM data MKBST equ $089F ;(R/W) RAM data FSCRM equ $08A0 ;(R/W) RAM data REGM equ $08AC ;(R/W) RAM data BK1 equ $08B5 ;(R/W) RAM data BK2 equ $08B7 ;(R/W) RAM data INTADR equ $08B9 ;(R/W) RAM data PC equ $08BE ;(R/W) RAM data Display Frame ------------- See the Interton VC 4000 Coding Guide. Sound ----- For PVI sound, see the Interton VC 4000 Coding Guide. For PSG sound: ENABLEn bits are: noi ton %uu,CBA,CBA where u are unused. Bits are inverted, ie. %0 to enable a channel, %1 to disable it. Eg. Tiny Tim uses the ENABLEn registers as follows: ENABLE1: $FF %11,111,111 no sound $F8 %11,111,000 all noises off all tones on $FD %11,111,101 all noises off tone B is on ENABLE2: $3B %00,111,011 while falling tone C is on, all other channels are off $07 %00,000,111 when you hit the ground all noises on all tones off See also the "TV Games Computer" book, p. 176-184, 204-205. Colours ------- The TVGC seems to use halfbrite mode for at least some games, eg. Catapult. Fullbrite mode may also perhaps be available. The following information is for fullbrite mode; see the Interton VC 4000 Coding Guide for halfbrite mode information. The background and grid fullbrite colours: R,G,B ----- 0: black 0,0,0 1: blue 0,0,1 2: green 0,1,0 3: cyan 0,1,1 4: red 1,0,0 5: purple 1,0,1 6: yellow 1,1,0 7: white 1,1,1 RGB values of 0: zero intensity 1: full intensity Background colour is: (bits 2..0 of BGCOLOUR ) (ie. 0..7) Grid colour is: ((bits 6..4 of BGCOLOUR ) >> 4) (ie. 0..7) Digit colours are: 7 - ((bits 6..4 of BGCOLOUR ) >> 4) (ie. 0..7) Sprite #0 colours are: 7 - ((bits 5..3 of SPR01COLOURS) >> 3) (ie. 0..7) Sprite #1 colours are: 7 - (bits 2..0 of SPR01COLOURS) (ie. 0..7) Sprite #2 colours are: 7 - ((bits 5..3 of SPR23COLOURS) >> 3) (ie. 0..7) Sprite #3 colours are: 7 - (bits 2..0 of SPR23COLOURS) (ie. 0..7) The digit colour is always dependent on the grid colour, and vice versa, as shown: BGCOLOUR Grid Digits ---------------------------------- %x000xxxx black white %x001xxxx blue yellow %x010xxxx green purple %x011xxxx cyan red %x100xxxx red cyan %x101xxxx purple green %x110xxxx yellow blue %x111xxxx white black Digits ------ See the Interton VC 4000 Coding Guide. Sprites ------- See the Interton VC 4000 Coding Guide. Keyboard -------- The keyboard is laid out as follows (see "TV Games Computer" book, p. 31-32): $1E8B $1E88 $1E89 $1E8A $1E8C $1E8D $1E8E --------------------------------------------- .UC.. RCAS. WCAS. ..C.. ..D.. ..E.. ..F.. bit 7 ($80) START BP1/2 .REG. ..8.. ..9.. ..A.. ..B.. bit 6 ($40) .LC.. .PC.. .MEM. ..4.. ..5.. ..6.. ..7.. bit 5 ($20) RESET ..-.. ..+.. ..0.. ..1.. ..2.. ..3.. bit 4 ($10) Eg. the "9" key corresponds to bit 6 of $1E8C. Timing ------ See the Interton VC 4000 Coding Guide. I/O Lines --------- 768 (type "E") or 256 (type "F" without support for bad monitor ROM) bytes are used for input/output lines, and mirrors of them, as shown below. Each register is available at 48 (type "E") or 16/17 (type "F") addresses. The nominal (ie. resolved) addresses are: Input line #7 (nominally $1DBF) is the CASIN register (for reading data from cassette). Output line #7 (nominally $1DFF) is the CASOUT register (for writing data to cassette). $1D9C..$1D9F: input lines 0..3 $1DBC..$1DBF: input lines 4..7 $1DDC..$1DDF: output lines 0..3 $1DFC..$1DFF: output lines 4..7 The bad monitor ROM requires mirroring of $1DBF at $19BF. This is explained in the "TV Games Computer" book, p. 161. Sorted by resolved address: Input line 0 is at: $1880, $1884, $1888, $188C, $1890, $1894, $1898, $189C, (type "E" only) $1980, $1984, $1988, $198C, $1990, $1994, $1998, $199C, (type "E" only) ($199C mirror also recommended for type "F" with bad monitor ROM) $1A80, $1A84, $1A88, $1A8C, $1A90, $1A94, $1A98, $1A9C, (type "E" only) $1B80, $1B84, $1B88, $1B8C, $1B90, $1B94, $1B98, $1B9C, (type "E" only) $1C80, $1C84, $1C88, $1C8C, $1C90, $1C94, $1C98, $1C9C, (types "E" & "F") $1D80, $1D84, $1D88, $1D8C, $1D90, $1D94, $1D98, $1D9C (types "E" & "F") Input line 1 is at: $1881, $1885, $1889, $188D, $1891, $1895, $1899, $189D, (type "E" only) $1981, $1985, $1989, $198D, $1991, $1995, $1999, $199D, (type "E" only) ($199D mirror also recommended for type "F" with bad monitor ROM) $1A81, $1A85, $1A89, $1A8D, $1A91, $1A95, $1A99, $1A9D, (type "E" only) $1B81, $1B85, $1B89, $1B8D, $1B91, $1B95, $1B99, $1B9D, (type "E" only) $1C81, $1C85, $1C89, $1C8D, $1C91, $1C95, $1C99, $1C9D, (types "E" & "F") $1D81, $1D85, $1D89, $1D8D, $1D91, $1D95, $1D99, $1D9D (types "E" & "F") Input line 2 is at: $1882, $1886, $188A, $188E, $1892, $1896, $189A, $189E, (type "E" only) $1982, $1986, $198A, $198E, $1992, $1996, $199A, $199E, (type "E" only) ($199E mirror also recommended for type "F" with bad monitor ROM) $1A82, $1A86, $1A8A, $1A8E, $1A92, $1A96, $1A9A, $1A9E, (type "E" only) $1B82, $1B86, $1B8A, $1B8E, $1B92, $1B96, $1B9A, $1B9E, (type "E" only) $1C82, $1C86, $1C8A, $1C8E, $1C92, $1C96, $1C9A, $1C9E, (types "E" & "F") $1D82, $1D86, $1D8A, $1D8E, $1D92, $1D96, $1D9A, $1D9E (types "E" & "F") Input line 3 is at: $1883, $1887, $188B, $188F, $1893, $1897, $189B, $189F, (type "E" only) $1983, $1987, $198B, $198F, $1993, $1997, $199B, $199F, (type "E" only) ($199F mirror also recommended for type "F" with bad monitor ROM) $1A83, $1A87, $1A8B, $1A8F, $1A93, $1A97, $1A9B, $1A9F, (type "E" only) $1B83, $1B87, $1B8B, $1B8F, $1B93, $1B97, $1B9B, $1B9F, (type "E" only) $1C83, $1C87, $1C8B, $1C8F, $1C93, $1C97, $1C9B, $1C9F, (types "E" & "F") $1D83, $1D87, $1D8B, $1D8F, $1D93, $1D97, $1D9B, $1D9F (types "E" & "F") Input line 4 is at: $18A0, $18A4, $18A8, $18AC, $18B0, $18B4, $18B8, $18BC, (type "E" only) $19A0, $19A4, $19A8, $19AC, $19B0, $19B4, $19B8, $19BC, (type "E" only) ($19BC mirror also recommended for type "F" with bad monitor ROM) $1AA0, $1AA4, $1AA8, $1AAC, $1AB0, $1AB4, $1AB8, $1ABC, (type "E" only) $1BA0, $1BA4, $1BA8, $1BAC, $1BB0, $1BB4, $1BB8, $1BBC, (type "E" only) $1CA0, $1CA4, $1CA8, $1CAC, $1CB0, $1CB4, $1CB8, $1CBC, (types "E" & "F") $1DA0, $1DA4, $1DA8, $1DAC, $1DB0, $1DB4, $1DB8, $1DBC (types "E" & "F") Input line 5 is at: $18A1, $18A5, $18A9, $18AD, $18B1, $18B5, $18B9, $18BD, (type "E" only) $19A1, $19A5, $19A9, $19AD, $19B1, $19B5, $19B9, $19BD, (type "E" only) ($19BD mirror also recommended for type "F" with bad monitor ROM) $1AA1, $1AA5, $1AA9, $1AAD, $1AB1, $1AB5, $1AB9, $1ABD, (type "E" only) $1BA1, $1BA5, $1BA9, $1BAD, $1BB1, $1BB5, $1BB9, $1BBD, (type "E" only) $1CA1, $1CA5, $1CA9, $1CAD, $1CB1, $1CB5, $1CB9, $1CBD, (types "E" & "F") $1DA1, $1DA5, $1DA9, $1DAD, $1DB1, $1DB5, $1DB9, $1DBD (types "E" & "F") Input line 6 is at: $18A2, $18A6, $18AA, $18AE, $18B2, $18B6, $18BA, $18BE, (type "E" only) $19A2, $19A6, $19AA, $19AE, $19B2, $19B6, $19BA, $19BE, (type "E" only) ($19BE mirror also recommended for type "F" with bad monitor ROM) $1AA2, $1AA6, $1AAA, $1AAE, $1AB2, $1AB6, $1ABA, $1ABE, (type "E" only) $1BA2, $1BA6, $1BAA, $1BAE, $1BB2, $1BB6, $1BBA, $1BBE, (type "E" only) $1CA2, $1CA6, $1CAA, $1CAE, $1CB2, $1CB6, $1CBA, $1CBE, (types "E" & "F") $1DA2, $1DA6, $1DAA, $1DAE, $1DB2, $1DB6, $1DBA, $1DBE (types "E" & "F") Input line 7 (read cassette) is at: $18A3, $18A7, $18AB, $18AF, $18B3, $18B7, $18BB, $18BF, (type "E" only) $19A3, $19A7, $19AB, $19AF, $19B3, $19B7, $19BB, $19BF, (type "E" only) ($19BF mirror also vital for type "F" with bad monitor ROM) $1AA3, $1AA7, $1AAB, $1AAF, $1AB3, $1AB7, $1ABB, $1ABF, (type "E" only) $1BA3, $1BA7, $1BAB, $1BAF, $1BB3, $1BB7, $1BBB, $1BBF, (type "E" only) $1CA3, $1CA7, $1CAB, $1CAF, $1CB3, $1CB7, $1CBB, $1CBF, (types "E" & "F") $1DA3, $1DA7, $1DAB, $1DAF, $1DB3, $1DB7, $1DBB, $1DBF (types "E" & "F") Output line 0 is at: $18C0, $18C4, $18C8, $18CC, $18D0, $18D4, $18D8, $18DC, (type "E" only) $19C0, $19C4, $19C8, $19CC, $19D0, $19D4, $19D8, $19DC, (type "E" only) $1AC0, $1AC4, $1AC8, $1ACC, $1AD0, $1AD4, $1AD8, $1ADC, (type "E" only) $1BC0, $1BC4, $1BC8, $1BCC, $1BD0, $1BD4, $1BD8, $1BDC, (type "E" only) $1CC0, $1CC4, $1CC8, $1CCC, $1CD0, $1CD4, $1CD8, $1CDC, (types "E" & "F") $1DC0, $1DC4, $1DC8, $1DCC, $1DD0, $1DD4, $1DD8, $1DDC (types "E" & "F") Output line 1 is at: $18C1, $18C5, $18C9, $18CD, $18D1, $18D5, $18D9, $18DD, (type "E" only) $19C1, $19C5, $19C9, $19CD, $19D1, $19D5, $19D9, $19DD, (type "E" only) $1AC1, $1AC5, $1AC9, $1ACD, $1AD1, $1AD5, $1AD9, $1ADD, (type "E" only) $1BC1, $1BC5, $1BC9, $1BCD, $1BD1, $1BD5, $1BD9, $1BDD, (type "E" only) $1CC1, $1CC5, $1CC9, $1CCD, $1CD1, $1CD5, $1CD9, $1CDD, (types "E" & "F") $1DC1, $1DC5, $1DC9, $1DCD, $1DD1, $1DD5, $1DD9, $1DDD (types "E" & "F") Output line 2 is at: $18C2, $18C6, $18CA, $18CE, $18D2, $18D6, $18DA, $18DE, (type "E" only) $19C2, $19C6, $19CA, $19CE, $19D2, $19D6, $19DA, $19DE, (type "E" only) $1AC2, $1AC6, $1ACA, $1ACE, $1AD2, $1AD6, $1ADA, $1ADE, (type "E" only) $1BC2, $1BC6, $1BCA, $1BCE, $1BD2, $1BD6, $1BDA, $1BDE, (type "E" only) $1CC2, $1CC6, $1CCA, $1CCE, $1CD2, $1CD6, $1CDA, $1CDE, (types "E" & "F") $1DC2, $1DC6, $1DCA, $1DCE, $1DD2, $1DD6, $1DDA, $1DDE (types "E" & "F") Output line 3 is at: $18C3, $18C7, $18CB, $18CF, $18D3, $18D7, $18DB, $18DF, (type "E" only) $19C3, $19C7, $19CB, $19CF, $19D3, $19D7, $19DB, $19DF, (type "E" only) $1AC3, $1AC7, $1ACB, $1ACF, $1AD3, $1AD7, $1ADB, $1ADF, (type "E" only) $1BC3, $1BC7, $1BCB, $1BCF, $1BD3, $1BD7, $1BDB, $1BDF, (type "E" only) $1CC3, $1CC7, $1CCB, $1CCF, $1CD3, $1CD7, $1CDB, $1CDF, (types "E" & "F") $1DC3, $1DC7, $1DCB, $1DCF, $1DD3, $1DD7, $1DDB, $1DDF (types "E" & "F") Output line 4 is at: $18E0, $18E4, $18E8, $18EC, $18F0, $18F4, $18F8, $18FC, (type "E" only) $19E0, $19E4, $19E8, $19EC, $19F0, $19F4, $19F8, $19FC, (type "E" only) $1AE0, $1AE4, $1AE8, $1AEC, $1AF0, $1AF4, $1AF8, $1AFC, (type "E" only) $1BE0, $1BE4, $1BE8, $1BEC, $1BF0, $1BF4, $1BF8, $1BFC, (type "E" only) $1CE0, $1CE4, $1CE8, $1CEC, $1CF0, $1CF4, $1CF8, $1CFC, (types "E" & "F") $1DE0, $1DE4, $1DE8, $1DEC, $1DF0, $1DF4, $1DF8, $1DFC (types "E" & "F") Output line 5 is at: $18E1, $18E5, $18E9, $18ED, $18F1, $18F5, $18F9, $18FD, (type "E" only) $19E1, $19E5, $19E9, $19ED, $19F1, $19F5, $19F9, $19FD, (type "E" only) $1AE1, $1AE5, $1AE9, $1AED, $1AF1, $1AF5, $1AF9, $1AFD, (type "E" only) $1BE1, $1BE5, $1BE9, $1BED, $1BF1, $1BF5, $1BF9, $1BFD, (type "E" only) $1CE1, $1CE5, $1CE9, $1CED, $1CF1, $1CF5, $1CF9, $1CFD, (types "E" & "F") $1DE1, $1DE5, $1DE9, $1DED, $1DF1, $1DF5, $1DF9, $1DFD (types "E" & "F") Output line 6 is at: $18E2, $18E6, $18EA, $18EE, $18F2, $18F6, $18FA, $18FE, (type "E" only) $19E2, $19E6, $19EA, $19EE, $19F2, $19F6, $19FA, $19FE, (type "E" only) $1AE2, $1AE6, $1AEA, $1AEE, $1AF2, $1AF6, $1AFA, $1AFE, (type "E" only) $1BE2, $1BE6, $1BEA, $1BEE, $1BF2, $1BF6, $1BFA, $1BFE, (type "E" only) $1CE2, $1CE6, $1CEA, $1CEE, $1CF2, $1CF6, $1CFA, $1CFE, (types "E" & "F") $1DE2, $1DE6, $1DEA, $1DEE, $1DF2, $1DF6, $1DFA, $1DFE (types "E" & "F") Output line 7 (write cassette) is at: $18E3, $18E7, $18EB, $18EF, $18F3, $18F7, $18FB, $18FF, (type "E" only) $19E3, $19E7, $19EB, $19EF, $19F3, $19F7, $19FB, $19FF, (type "E" only) $1AE3, $1AE7, $1AEB, $1AEF, $1AF3, $1AF7, $1AFB, $1AFF, (type "E" only) $1BE3, $1BE7, $1BEB, $1BEF, $1BF3, $1BF7, $1BFB, $1BFF, (type "E" only) $1CE3, $1CE7, $1CEB, $1CEF, $1CF3, $1CF7, $1CFB, $1CFF, (types "E" & "F") $1DE3, $1DE7, $1DEB, $1DEF, $1DF3, $1DF7, $1DFB, $1DFF (types "E" & "F") Sorted by unresolved address (assuming good monitor ROM): $1880..$1883: input lines 0..3 (type "E" only) $1884..$1887: input lines 0..3 (type "E" only) $1888..$188B: input lines 0..3 (type "E" only) $188C..$188F: input lines 0..3 (type "E" only) $1890..$1893: input lines 0..3 (type "E" only) $1894..$1897: input lines 0..3 (type "E" only) $1898..$189B: input lines 0..3 (type "E" only) $189C..$189F: input lines 0..3 (type "E" only) $18A0..$18A3: input lines 4..7 (type "E" only) $18A4..$18A7: input lines 4..7 (type "E" only) $18A8..$18AB: input lines 4..7 (type "E" only) $18AC..$18AF: input lines 4..7 (type "E" only) $18B0..$18B3: input lines 4..7 (type "E" only) $18B4..$18B7: input lines 4..7 (type "E" only) $18B8..$18BB: input lines 4..7 (type "E" only) $18BC..$18BF: input lines 4..7 (type "E" only) $18C0..$18C3: output lines 0..3 (type "E" only) $18C4..$18C7: output lines 0..3 (type "E" only) $18C8..$18CB: output lines 0..3 (type "E" only) $18CC..$18CF: output lines 0..3 (type "E" only) $18D0..$18D3: output lines 0..3 (type "E" only) $18D4..$18D7: output lines 0..3 (type "E" only) $18D8..$18DB: output lines 0..3 (type "E" only) $18DC..$18DF: output lines 0..3 (type "E" only) $18E0..$18E3: output lines 4..7 (type "E" only) $18E4..$18E7: output lines 4..7 (type "E" only) $18E8..$18EB: output lines 4..7 (type "E" only) $18EC..$18EF: output lines 4..7 (type "E" only) $18F0..$18F3: output lines 4..7 (type "E" only) $18F4..$18F7: output lines 4..7 (type "E" only) $18F8..$18FB: output lines 4..7 (type "E" only) $18FC..$18FF: output lines 4..7 (type "E" only) $1980..$1983: input lines 0..3 (type "E" only) $1984..$1987: input lines 0..3 (type "E" only) $1988..$198B: input lines 0..3 (type "E" only) $198C..$198F: input lines 0..3 (type "E" only) $1990..$1993: input lines 0..3 (type "E" only) $1994..$1997: input lines 0..3 (type "E" only) $1998..$199B: input lines 0..3 (type "E" only) $199C..$199F: input lines 0..3 (type "E" only) $19A0..$19A3: input lines 4..7 (type "E" only) $19A4..$19A7: input lines 4..7 (type "E" only) $19A8..$19AB: input lines 4..7 (type "E" only) $19AC..$19AF: input lines 4..7 (type "E" only) $19B0..$19B3: input lines 4..7 (type "E" only) $19B4..$19B7: input lines 4..7 (type "E" only) $19B8..$19BB: input lines 4..7 (type "E" only) $19BC..$19BF: input lines 4..7 (type "E" only) $19C0..$19C3: output lines 0..3 (type "E" only) $19C4..$19C7: output lines 0..3 (type "E" only) $19C8..$19CB: output lines 0..3 (type "E" only) $19CC..$19CF: output lines 0..3 (type "E" only) $19D0..$19D3: output lines 0..3 (type "E" only) $19D4..$19D7: output lines 0..3 (type "E" only) $19D8..$19DB: output lines 0..3 (type "E" only) $19DC..$19DF: output lines 0..3 (type "E" only) $19E0..$19E3: output lines 4..7 (type "E" only) $19E4..$19E7: output lines 4..7 (type "E" only) $19E8..$19EB: output lines 4..7 (type "E" only) $19EC..$19EF: output lines 4..7 (type "E" only) $19F0..$19F3: output lines 4..7 (type "E" only) $19F4..$19F7: output lines 4..7 (type "E" only) $19F8..$19FB: output lines 4..7 (type "E" only) $19FC..$19FF: output lines 4..7 (type "E" only) $1A80..$1A83: input lines 0..3 (type "E" only) $1A84..$1A87: input lines 0..3 (type "E" only) $1A88..$1A8B: input lines 0..3 (type "E" only) $1A8C..$1A8F: input lines 0..3 (type "E" only) $1A90..$1A93: input lines 0..3 (type "E" only) $1A94..$1A97: input lines 0..3 (type "E" only) $1A98..$1A9B: input lines 0..3 (type "E" only) $1A9C..$1A9F: input lines 0..3 (type "E" only) $1AA0..$1AA3: input lines 4..7 (type "E" only) $1AA4..$1AA7: input lines 4..7 (type "E" only) $1AA8..$1AAB: input lines 4..7 (type "E" only) $1AAC..$1AAF: input lines 4..7 (type "E" only) $1AB0..$1AB3: input lines 4..7 (type "E" only) $1AB4..$1AB7: input lines 4..7 (type "E" only) $1AB8..$1ABB: input lines 4..7 (type "E" only) $1ABC..$1ABF: input lines 4..7 (type "E" only) $1AC0..$1AC3: output lines 0..3 (type "E" only) $1AC4..$1AC7: output lines 0..3 (type "E" only) $1AC8..$1ACB: output lines 0..3 (type "E" only) $1ACC..$1ACF: output lines 0..3 (type "E" only) $1AD0..$1AD3: output lines 0..3 (type "E" only) $1AD4..$1AD7: output lines 0..3 (type "E" only) $1AD8..$1ADB: output lines 0..3 (type "E" only) $1ADC..$1ADF: output lines 0..3 (type "E" only) $1AE0..$1AE3: output lines 4..7 (type "E" only) $1AE4..$1AE7: output lines 4..7 (type "E" only) $1AE8..$1AEB: output lines 4..7 (type "E" only) $1AEC..$1AEF: output lines 4..7 (type "E" only) $1AF0..$1AF3: output lines 4..7 (type "E" only) $1AF4..$1AF7: output lines 4..7 (type "E" only) $1AF8..$1AFB: output lines 4..7 (type "E" only) $1AFC..$1AFF: output lines 4..7 (type "E" only) $1B80..$1B83: input lines 0..3 (type "E" only) $1B84..$1B87: input lines 0..3 (type "E" only) $1B88..$1B8B: input lines 0..3 (type "E" only) $1B8C..$1B8F: input lines 0..3 (type "E" only) $1B90..$1B93: input lines 0..3 (type "E" only) $1B94..$1B97: input lines 0..3 (type "E" only) $1B98..$1B9B: input lines 0..3 (type "E" only) $1B9C..$1B9F: input lines 0..3 (type "E" only) $1BA0..$1BA3: input lines 4..7 (type "E" only) $1BA4..$1BA7: input lines 4..7 (type "E" only) $1BA8..$1BAB: input lines 4..7 (type "E" only) $1BAC..$1BAF: input lines 4..7 (type "E" only) $1BB0..$1BB3: input lines 4..7 (type "E" only) $1BB4..$1BB7: input lines 4..7 (type "E" only) $1BB8..$1BBB: input lines 4..7 (type "E" only) $1BBC..$1BBF: input lines 4..7 (type "E" only) $1BC0..$1BC3: output lines 0..3 (type "E" only) $1BC4..$1BC7: output lines 0..3 (type "E" only) $1BC8..$1BCB: output lines 0..3 (type "E" only) $1BCC..$1BCF: output lines 0..3 (type "E" only) $1BD0..$1BD3: output lines 0..3 (type "E" only) $1BD4..$1BD7: output lines 0..3 (type "E" only) $1BD8..$1BDB: output lines 0..3 (type "E" only) $1BDC..$1BDF: output lines 0..3 (type "E" only) $1BE0..$1BE3: output lines 4..7 (type "E" only) $1BE4..$1BE7: output lines 4..7 (type "E" only) $1BE8..$1BEB: output lines 4..7 (type "E" only) $1BEC..$1BEF: output lines 4..7 (type "E" only) $1BF0..$1BF3: output lines 4..7 (type "E" only) $1BF4..$1BF7: output lines 4..7 (type "E" only) $1BF8..$1BFB: output lines 4..7 (type "E" only) $1BFC..$1BFF: output lines 4..7 (type "E" only) $1C80..$1C83: input lines 0..3 (types "E" and "F") $1C84..$1C87: input lines 0..3 (types "E" and "F") $1C88..$1C8B: input lines 0..3 (types "E" and "F") $1C8C..$1C8F: input lines 0..3 (types "E" and "F") $1C90..$1C93: input lines 0..3 (types "E" and "F") $1C94..$1C97: input lines 0..3 (types "E" and "F") $1C98..$1C9B: input lines 0..3 (types "E" and "F") $1C9C..$1C9F: input lines 0..3 (types "E" and "F") $1CA0..$1CA3: input lines 4..7 (types "E" and "F") $1CA4..$1CA7: input lines 4..7 (types "E" and "F") $1CA8..$1CAB: input lines 4..7 (types "E" and "F") $1CAC..$1CAF: input lines 4..7 (types "E" and "F") $1CB0..$1CB3: input lines 4..7 (types "E" and "F") $1CB4..$1CB7: input lines 4..7 (types "E" and "F") $1CB8..$1CBB: input lines 4..7 (types "E" and "F") $1CBC..$1CBF: input lines 4..7 (types "E" and "F") $1CC0..$1CC3: output lines 0..3 (types "E" and "F") $1CC4..$1CC7: output lines 0..3 (types "E" and "F") $1CC8..$1CCB: output lines 0..3 (types "E" and "F") $1CCC..$1CCF: output lines 0..3 (types "E" and "F") $1CD0..$1CD3: output lines 0..3 (types "E" and "F") $1CD4..$1CD7: output lines 0..3 (types "E" and "F") $1CD8..$1CDB: output lines 0..3 (types "E" and "F") $1CDC..$1CDF: output lines 0..3 (types "E" and "F") $1CE0..$1CE3: output lines 4..7 (types "E" and "F") $1CE4..$1CE7: output lines 4..7 (types "E" and "F") $1CE8..$1CEB: output lines 4..7 (types "E" and "F") $1CEC..$1CEF: output lines 4..7 (types "E" and "F") $1CF0..$1CF3: output lines 4..7 (types "E" and "F") $1CF4..$1CF7: output lines 4..7 (types "E" and "F") $1CF8..$1CFB: output lines 4..7 (types "E" and "F") $1CFC..$1CFF: output lines 4..7 (types "E" and "F") $1D80..$1D83: input lines 0..3 (types "E" and "F") $1D84..$1D87: input lines 0..3 (types "E" and "F") $1D88..$1D8B: input lines 0..3 (types "E" and "F") $1D8C..$1D8F: input lines 0..3 (types "E" and "F") $1D90..$1D93: input lines 0..3 (types "E" and "F") $1D94..$1D97: input lines 0..3 (types "E" and "F") $1D98..$1D9B: input lines 0..3 (types "E" and "F") $1D9C..$1D9F: input lines 0..3 (types "E" and "F") $1DA0..$1DA3: input lines 4..7 (types "E" and "F") $1DA4..$1DA7: input lines 4..7 (types "E" and "F") $1DA8..$1DAB: input lines 4..7 (types "E" and "F") $1DAC..$1DAF: input lines 4..7 (types "E" and "F") $1DB0..$1DB3: input lines 4..7 (types "E" and "F") $1DB4..$1DB7: input lines 4..7 (types "E" and "F") $1DB8..$1DBB: input lines 4..7 (types "E" and "F") $1DBC..$1DBF: input lines 4..7 (types "E" and "F") $1DC0..$1DC3: output lines 0..3 (types "E" and "F") $1DC4..$1DC7: output lines 0..3 (types "E" and "F") $1DC8..$1DCB: output lines 0..3 (types "E" and "F") $1DCC..$1DCF: output lines 0..3 (types "E" and "F") $1DD0..$1DD3: output lines 0..3 (types "E" and "F") $1DD4..$1DD7: output lines 0..3 (types "E" and "F") $1DD8..$1DDB: output lines 0..3 (types "E" and "F") $1DDC..$1DDF: output lines 0..3 (types "E" and "F") $1DE0..$1DE3: output lines 4..7 (types "E" and "F") $1DE4..$1DE7: output lines 4..7 (types "E" and "F") $1DE8..$1DEB: output lines 4..7 (types "E" and "F") $1DEC..$1DEF: output lines 4..7 (types "E" and "F") $1DF0..$1DF3: output lines 4..7 (types "E" and "F") $1DF4..$1DF7: output lines 4..7 (types "E" and "F") $1DF8..$1DFB: output lines 4..7 (types "E" and "F") $1DFC..$1DFF: output lines 4..7 (types "E" and "F") 2636 PVI Datasheet Example -------------------------- See the Interton VC 4000 Coding Guide. Unresolved PVI Questions ------------------------ See the Interton VC 4000 Coding Guide. Monitor Character Set --------------------- HOWDIF can (by using the ELEKTOR argument) extract and display these: 0/O 1 2/Z 3 4 5/S 6 7 $00 $01 $02 $03 $04 $05 $06 $07 --- --- --- --- --- --- --- --- ### ..# ### ### #.# ### ### ### #.# .## ..# ..# #.# #.. #.. ..# #.# ..# ### ### #.# ### #.. ..# #.# ..# #.. ..# ### ..# ### ..# #.# ..# #.. ..# ..# ..# #.# ..# ### ..# ### ### ..# ### ### ..# $27B..$280 $281..$286 $287..$28C $28D..$292 8 9 A b C d E F $08 $09 $0A $0B $0C $0D $0E $0F --- --- --- --- --- --- --- --- ### ### ### #.. ### ..# ### ### #.# #.# #.# #.. #.. ..# #.. #.. ### ### ### ### #.. ### ### ### #.# ..# #.# #.# #.. #.# #.. #.. #.# ..# #.# #.# #.. #.# #.. #.. ### ### #.# ### ### ### ### #.. $293..$298 $299..$29E $29F..$2A4 $2A5..$2AA G L I n P r = + $10 $11 $12 $13 $14 $15 $16 $17 --- --- --- --- --- --- --- --- ### #.. ### ... ### ... ... ... #.. #.. .#. ... #.# ... ... ... #.. #.. .#. ### ### ### ... ... #.. #.. .#. #.# #.. #.. ### ... #.# #.. .#. #.# #.. #.. ... ... ### ### ### #.# #.. #.. ### ... $2AB..$2B0 $2B1..$2B6 $2B7..$2BC $2BD..$2C2 + - : x ? _ ! N $18 $19 $1A $1B $5F $8A $A2 $AA --- --- --- --- --- --- --- --- .#. ... ... ... ### ... .#. ... .#. ... .#. #.# ..# ... .#. ### ### ### ... .#. ..# ... ... #.# .#. ... .#. #.# ### ... .#. #.# .#. ... ... ... #.. ... ... #.# ... ... ... ... #.. #.# ... #.# $2C3..$2C8 $2C9..$2CE l T i : . $BB $BC $DF $E6 $F7 --- --- --- --- --- #.. ### ..# ##. ... #.. ### ... ##. ... #.. .#. .## ... ... #.. .#. ..# ... ... #.. .#. ..# ##. ... #.. .#. ..# ##. .#. Case-insensitive: Present: ABCDEFG I L NOP RST X Z Missing: H JK M Q UVW Y Uppercase: Present: A C EFG I L NOP ST Z Missing: B D H JK M QR UVWXY Lowercase: Present: b d i l n r x Missing: a c efgh jk m opq stuvw yz $27B..$580: character imagery: $27B..$2CE: official, ie. intentional $2CF..$580: unofficial, ie. unintentional Character imagery is stored left-justified, two characters per byte (ie. one character per nybble). Each character requires 6 nybbles. Eg. "0" and "1" are stored as follows: $27B: $E2 ###. ..#. $27C: $A6 #.#. .##. $27D: $A2 #.#. ..#. $27E: $A2 #.#. ..#. $27F: $A2 #.#. ..#. $280: $E2 ###. ..#. and are followed by the "2" and "3" pair at $281..$286, and so on. You can determine the ROM storage area of a character with this formula (assuming integer division; ie. round fractions down): startaddress = $27B + ((character � 2) * 6) endaddress = $280 + ((character � 2) * 6) Therefore, for "?" ($5F = 95): startaddress = $27B + (( 95 � 2) * 6) = $27B + ( 47 * 6) = $27B + 282 = $27B + $11A = $395 and for "T" ($BC = 188): startaddress = $27B + ((188 � 2) * 6) = $27B + ( 94 * 6) = $27B + 564 = $27B + $234 = $4AF and for "5" ($05 = 5): startaddress = $27B + (( 5 � 2) * 6) = $27B + ( 2 * 6) = $27B + 12 = $27B + $C = $287 Monitor RAM ----------- $800..$88F (144 bytes): MONOB : monitor object images $800..$817: 1st character row (original sprites) $818..$82F: 2nd character row (1st duplicates) $830..$847: 3rd character row (2nd duplicates) $848..$85F: 4th character row (3rd duplicates) $860..$878: 5th character row (4th duplicates) $878..$88F: 6th character row (5th duplicates) --sprite #0-- --sprite #1-- --sprite #2-- --sprite #3-- ###..... $800 ###.###. $806 ###.###. $80C ###.###. $812 ] #.#..... $801 #.#.#... $807 ###..#.. $80D #...#... $813 ] ###.###. $802 ###.#... $808 .#...#.. $80E #...###. $814 ] original #...#... $803 #.#.#... $809 .#...#.. $80F #...#... $815 ] sprites #...#... $804 #.#.#... $80A .#...#.. $810 #...#... $816 ] #...#... $805 #.#.###. $80B .#..###. $811 ###.###. $817 ] ###..... $818 ###.###. $81E ###.###. $824 ###.###. $82A ] #.#..... $819 #.#.#... $81F ###..#.. $825 #...#... $82B ] ###.###. $81A ###.#... $820 .#...#.. $826 #...###. $82C ] 1st dup. #...#... $81B #.#.#... $821 .#...#.. $827 #...#... $82D ] #...#... $81C #.#.#... $822 .#...#.. $828 #...#... $82E ] #...#... $81D #.#.###. $823 .#..###. $829 ###.###. $82F ] ###..... $830 ###.###. $836 ###.###. $83C ###.###. $842 ] #.#..... $831 #.#.#... $837 ###..#.. $83D #...#... $843 ] ###.###. $832 ###.#... $838 .#...#.. $83E #...###. $844 ] 2nd dup. #...#... $833 #.#.#... $839 .#...#.. $83F #...#... $845 ] #...#... $834 #.#.#... $83A .#...#.. $840 #...#... $846 ] #...#... $835 #.#.###. $83B .#..###. $841 ###.###. $847 ] ###..... $848 ###.###. $84E ###.###. $854 ###.###. $85A ] #.#..... $849 #.#.#... $84F ###..#.. $855 #...#... $85B ] ###.###. $84A ###.#... $850 .#...#.. $856 #...###. $85C ] 3rd dup. #...#... $84B #.#.#... $851 .#...#.. $857 #...#... $85D ] #...#... $84C #.#.#... $852 .#...#.. $858 #...#... $85E ] #...#... $84D #.#.###. $853 .#..###. $859 ###.###. $85F ] ###..... $860 ###.###. $866 ###.###. $86C ###.###. $872 ] #.#..... $861 #.#.#... $867 ###..#.. $86D #...#... $873 ] ###.###. $862 ###.#... $868 .#...#.. $86E #...###. $874 ] 4th dup. #...#... $863 #.#.#... $869 .#...#.. $86F #...#... $875 ] #...#... $864 #.#.#... $86A .#...#.. $870 #...#... $876 ] #...#... $865 #.#.###. $86B .#..###. $871 ###.###. $877 ] ###..... $878 ###.###. $87E ###.###. $884 ###.###. $88A ] #.#..... $879 #.#.#... $87F ###..#.. $885 #...#... $88B ] ###.###. $87A ###.#... $880 .#...#.. $886 #...###. $88C ] 5th dup. #...#... $87B #.#.#... $881 .#...#.. $887 #...#... $88D ] #...#... $87C #.#.#... $882 .#...#.. $888 #...#... $88E ] #...#... $87D #.#.###. $883 .#..###. $889 ###.###. $88F ] $890..$897 ( 8 bytes): MLINE : text line $898 : FSEQ or SILENC: function sequence indicator (BP1/2) $899 : ENTM : +, - ENTER key memory $89A : MFUNC : monitor function index $89B..$89C ( 2 bytes): MSCR : scratch RAM for keyboard routine $89D : RKBST : right keyboard status $89E : LKBST : left keyboard status $89F : MKBST : monitor keyboard status $8A0..$8AB ( 12 bytes): FSCRM : function scratch memory $8A0..$8A1 ( 2 bytes): ? $8A2..$8A3 ( 2 bytes): SADR : start address of write file $8A4..$8A5 ( 2 bytes): BEGA : memory begin address $8A6..$8A7 ( 2 bytes): ? $8A8..$8A9 ( 2 bytes): ENDA : memory end address $8AA ( 1 byte ): BCC : check char for read and write $8AB ( 1 byte ): MCNT : block byte count for read and write $8AC..$8B4 ( 9 bytes): REGM : 2650 register status $8AC : r0 $8AD : r1 $8AE : r2 $8AF : r3 $8B0 : r4 $8B1 : r5 $8B2 : r6 $8B3 : PSL $8B4 : PSU $8B5..$8B6 ( 2 bytes): BK1 : breakpoint address 1 $8B7..$8B8 ( 2 bytes): BK2 : breakpoint address 2 $8B9..$8BD ( 5 bytes): INTADR : space for startup program $8BE..$8BF ( 2 bytes): PC : 2650 PC (ie. IAR) Elektor TVGC Cassette (EOF) File Format --------------------------------------- This format (Elektor Object Format) is similar to the Signetics Absolute Object Format (see the CD2650 Coding Guide) but has some differences, primarily: * block header is 'L' rather than ':'; * BCC header calculation includes block header (unlike AOF); * all data is stored in binary format (AOF encodes all data except the block header into ASCII format); * typical payload length is 16 bytes rather than 30. The native tape format is as follows, for each block: 0: 'L' ($4C) 1: file number ($01..$0F) 2..3: load address (big-endian) 4: block length, in bytes 5: checksum for header bytes 0..4 6..n-1: data n: checksum for data (bytes 6..n-1) Here are the addresses of the relevant BIOS code that reads these bytes: $797: L $7A5: $7B5: $7B5: $7BF: $7D1:
$7D9: <16 (usually) payload bytes> $7D9: Checksums start as $00. For each emitted byte, the following algorithm is applied: SUMC ^= data; SUMC <<= 1; Eg. for a header of $4C $0A $09 $00 $10, the checksum would be: SUMC = 0; // SUMC is %00000000 [$00]; SUMC ^= $4C; // SUMC is %01001100 [$4C]; SUMC <<= 1; // SUMC is %10011000 [$98]; SUMC ^= $0A; // SUMC is %10010010 [$92]; SUMC <<= 1; // SUMC is %00100101 [$25]; SUMC ^= $09; // SUMC is %00101100 [$2C]; SUMC <<= 1; // SUMC is %01011000 [$58]; SUMC ^= $00; // SUMC is %01011000 [$58]; SUMC <<= 1; // SUMC is %10110000 [$B0]; SUMC ^= $10; // SUMC is %10100000 [$A0]; SUMC <<= 1; // SUMC is %01000001 [$41]; Normally, each block contains 16 actual data bytes (for a total block size of 23 bytes). Each game finishes with a block which has 0 data bytes (and thus no data checksum either). The address field of that block is the starting address of the game. Note that the Elektor BIOS seems not to bother checking the BCCs of the last block (ie. the "start address" block). Which is just as well since that data BCC isn't correct. PULSE is called with the desired number of pulses in R3 (1..256). Each pulse is as follows: CASW = $FF; wait 8 moments (=80 microsex) CASW = $00; wait 7 moments (=70 microsex) Each of these pulses consists of first a positive and then a negative excursion of the waveform. So it must be the case that while CASW is $FF it is writing the ascending part of the waveform and while CASW is $00 is is writing the descending part. But then CASW remains at $00 afterwards and the waveform has only silence then. To write the PULSE TRAIN, we call PULSE(7680), then wait 500 microseconds. To write a ONE, we call PULSE(6), then wait 500 microseconds. To write a ZERO, we call PULSE(3), then wait 500 microseconds. While we are emitting $00 on CASW, that is silence. What would happen if we just held CASW at $FF indefinitely? When reading, it looks for transitions where CASR is different from its previous value. There are 2 zero crossings (and 2 edges) for each pulse. To read a bit: r1 = CASR; for (SILENC = 256; SILENC > 0; SILENC--) { r2 = 119; // transition counter RBIT2: for (r3 = 3; r3 > 0; r3--) // pause counter { NOP (ie. delay) r0 = r1; r1 = CASR; r0 ^= r1; if high bit is set (ie. there was a transition) { r2++; if (r2 > 255) { r2 = 255; } // r2 will be 120..254 for the 1st..135th iterations, and 255 for the 136th and later iterations goto RBIT2; } } if (r2 >= 122) // 3 or more edges { return r2; } } // timeout after 54 milliseconds if (*($8A8) == 0) // ie. if verify mode { goto RBIT; // BCC error } // implied else goto RCAS1; // restart reading To read a byte: set alternate register bank, with carry, logical compare for (MSCR = 8; MSCR > 0; MSCR--) { CHI2: r5 = RBIT(); if (r5 <= 133) { // r5 <= 127 (ie. 8 or less edges) is an 0 bit // r5 >= 128 && r5 <= 133 (ie. 9..14 edges) is a 1 bit r0 = *($89C); r5 <<= 1; // this puts the high bit of r2 into the Carry bit r0 <<= 1; // this puts the Carry bit into the low bit of r0 *($89C) = r0; } else { if (++r5 != 256) { goto CHI2; } // implied else { goto RCAS1; // new leader (pulse train) detected } } } set main register bank, clear with carry r1 = r0; r0 ^= BCC; r0 <<= 1; BCC = r0; return; To read a file: do { r2 = RBIT(); } while (r2 < 134 || r2 > 140); // wait until we read 15..21 edges 3 pulses is a clear bit (%0). 6 pulses is a set bit (%1). 9 pulses occur in inter-block gaps (sync). Each pulse lasts 110 microseconds, so there are 9090.90' pulses per second. Unlike with CUTS or similar formats, all pulses are the same width, and therefore all bits are different widths, and therefore there is no fixed data rate; it depends on the data. Also, there are silent gaps between bits and between bytes (wheras CUTS has no gaps), and sync pulses (not used on CUTS). Assuming all the data was 0s, and there weren't any gaps, the baud rate would be 3030.30' baud. Assuming all the data was 1s, and there weren't any gaps, the baud rate would be 1515.15' baud. The CASIN/CASOUT registers correspond directly to what is on the cassette; ie. the cassette interface does not encode or decode the data but passes it directly between the computer and the cassette recorder (unlike a typical CUTS cassette interface). Technical notes about various games ---------------------------------- Table 48 will not "work" in the emulator: you need to fill in the correct data bytes first. See the book for more details. Ami/WinArcadia (as of V11.61) are not fully compatible with Explosion and Gunshot (due to incomplete PSG emulation). Specifically: * sound effect should not play until START button is pressed * sound effect probably sounds quite different * sound effect should "fade out" (ie. decay) ESS-003-6: Demonstration Program apparently has a missing II? (See Elektor magazine, Oct 1979, p. 31 and 37). ESS-009-C: Circledrive introduction doesn't seem to work? but it seems to just be a joystick calibration routine rather than an introduction. 02-a, 02-b: These are identical except that they have different junk at $912..$917 (which is never used anyway). 03-1, 06-5: These are variants of Example2.pgm. 05-1: This is identical to Example3.pgm, except that it has different junk at $979..$9FF, $A8A..$AFF, and $BD1..$BFF (which are never used anyway) and different values in the data blocks area ($B1B..$B8B). 06-1: This is identical to 05-1.pgm, except that it has different operands in the RESET routine, and different values in the data blocks area ($B3B..$BDB). 08-1a: This is identical to Example2.pgm except with different data ($939..$94B). 10-1a: The picture is invisible as it is drawn in blue on a blue background. To see it, you can eg. POKE BGCOLOUR $78 10-1b: This is identical to 08-1a.pgm except that it also contains the exploding man (jump to $9DA for unexploded version, $A1B for exploded version). 28-7 (Animated S): You must enable interrupts (E CPU 0 in debugger) for this to work. Example5 (PVI Art): Paddle movement seems to be erratic for some reason. TVC ("TVGC Cassette") File Format --------------------------------- byte 0: must be $02 bytes 1..2: load address (where to start loading the program) bytes 3..4: loaded into $8BE.. $8BF (program start vector) bytes 5+: loaded into load address and onwards Dragster variables ------------------ German English -------------------------------------------------- $1F0E: Loeschenspeicher fuer R0 von Hauptprogramm Erasure store for R0 from main program $1F0F: Joystick Daten Joystick data $1F1E: Gengenzeige (linke und rechte Haelfte) ? (left and right half) $1F1F: Flaggen (bit nr.): Flags (bit no.): 7: Taste gedrueckt Flag links 7: Key depressed flag left 6: Taste gedrueckt Flag rechts 6: Key depressed flag right 5: Rundenzaehler Flag links 5: Round counter flag left 4: Rundenzaehler Flag rechts 4: Round counter flag right 3: Farbinvertierung 3: Colour inversion 2: Stopflagge linker Spieler 2: Stop flag left player 1: Stopflagge recht Spieler 1: Stop flag right player 0: Startflagge 0: Start flag $1F4E: Hauptuhr (rechter Teil) Main clock (right part) $1F4F: Hauptuhr (linker Teil) Main clock (left part) $1F50: Leituhr Links (rechter Teil) Route clock left (right part) $1F51: Leituhr Links (links Teil) Route clock left (left part) $1F52: Leituhr Rechts (rechter Teil) Route clock right (right part) $1F53: Leituhr Rechts (links Teil) Route clock right (left part) $1F54: Univerzalzaehler (loeschbar, ?) Universal counter (erasable, ?) $1F55: Timingzaehler (vorwaertz) Timing counter (before) $1F56: Offset Dragster (linke + rechte Haelfte): Offset Dragster (left + right half): 0 = Dragster 0 = Dragster 1 = Stall 1 = Stall 2 = Blown 2 = Blown 3 = ? 3 = ? 4 = Gear 4 = Gear $1F57: Dragsterposition links Dragster position left $1F58: Dragsterposition rechts Dragster position right $1F59: Drehzahlmonposition links Speed position left $1F5A: Drahzahlmonposition rechts Speed position right $1F5B: Invertierungsflagge: Inversion flag: $00 = normal $00 = normal $FF = invertiert $FF = inverted $1F5C: Linke Haelfe: Blinkzaehler in Left half: Blink counter in Kombination mit $1F55 -> $D0 = 1 Minute combination with $1F55 - > $D0 = 1 Minute Rechte Haelfe: SPIELVERSIONSZAEHLER Right half: GAME VERSION COUNTER $1F5D: Offset Hinterrad (rechte + links Haelfte): Back wheel offset (right + left half): ? = 0 ? = 0 ? = 1 ? = 1 weg = 2 off = 2 $1F5E: Duplikathoehe (links + rechte Haelfte): Duplicate height (left + right half): 0 = normal 0 = normal 1 = schrift 1 = writing $1F5F: Rundenzaehler (links + rechte Halfte) Round counter (left + right half) $1F60: Startampelfarben Start traffic lights colours $1F61: Marker delay links Marker delay left $1F62: Marker delay rechte Marker delay right $1F63: Dragster ? links Dragster ? left $1F64: Dragster ? rechts Dragster ? right $1F65: Dragster delay (rechte und linke Haelfte) Dragster delay (right and left halves) Game Startup ------------ $540: ZPC = SADR; // $8BE..$8BF = $8A2..$8A3 SADR = BK1; // $8A2..$8A3 = $8B5..$8B6 BEGA = BK2; // $8A4..$8A5 = $8B7..$8B8 BK1 = ZBRR1; // $8B5..$8B6 = $537..$538 BK2 = ZBRR2; // $8B7..$8B8 = $539..$53A INTADR..INTADR+4 = UMODE..UMODE+4; // $8B9..$8BD = $53B..$53F *($8BC) = *($8B3); // PSL status r1..r3 = *($8AD..$8AF); r4..r6 = *($8B0..$8B2); PSU = *($8B4); PSL = %00000000; goto $8BB; $8BB: goto $900; Major Components ---------------- Main circuit ICs are: IC1 is Signetics 2650A CPU IC2 is Signetics 2616 PROM (containing monitor BIOS) IC3 is Signetics 2636 PVI IC4 is Signetics 2621 USG IC5 is Nat. Semi. LM339 quad differential comparator IC6 is Signetics? 74LS139 dual 2-to-4 line decoder/demultiplexer, inverting outputs or address decoder IC7 is Signetics? 74LS138 3-to-8 line decoder/demultiplexer, inverting outputs or address decoder IC8 is Signetics? 74LS251 8-line to 1-line data selector/multiplexer, complementary outputs or I/O selector IC9 is Signetics? CD 4099 8-bit addressable latch or I/O selector IC10 is Signetics? CD 4053 triple 2-channel multiplexer/demultiplexer or joystick selector IC11 is Signetics? 74LS156 dual 2-to-4 line decoder/demultiplexer, inverting outputs or keyboard interface IC12 is Signetics? 74LS258 quad 2-line to 1-line data selector/multipler, inverting outputs or keyboard interface IC13..28 are ? MM2112-4 SRAM (256 nybbles each) *16=2K RAM IC29 is Signetics? 74LS08 quad 2-input AND gate IC30 is Signetics? 74LS05 hex inverter gate IC31 is Signetics? 74LS04 hex inverter gate or 8.867 MHz crystal oscillator IC32 is Signetics? 74LS86 quad 2-input XOR gate or divider IC33 is Signetics? 74LS113 dual J-K negative-edge-triggered flip-flop, preset or divider IC34 is Signetics? 74LS109 dual J-NotK positive-edge-triggered flip-flop, clear and preset IC35 is Signetics? 74LS113 dual J-K negative-edge-triggered flip-flop, preset or divider IC36 is Signetics? 74LS113 dual J-K negative-edge-triggered flip-flop, preset or divider IC37 is Signetics? 74LS00 quad 2-input NAND gate IC38 is Signetics? 74LS251 8-line to 1-line data selector/multiplexer, complementary outputs IC39 is Signetics? 74LS251 8-line to 1-line data selector/multiplexer, complementary outputs IC40 is Signetics? 74LS136 quad 2-input XOR gate IC41 is Signetics? 74LS10 triple 3-input NAND gate Separate to this are the other components of the basic system: * VHF/UHF modulator * power supply * keyboard * joysticks, loudspeaker, cassette interface, cassette deck * TV Random number generator: T1 is ? BS 170 IC1 is ? 4070 IC2 is ? 4015 IC3 is Signetics? L4LS244 IC4 is Signetics? L4LS85 IC5 is Signetics? L4LS85 IC6 is Signetics? L4LS85 IC7 is Signetics? L4LS85 EPROM module (German): D1 is ? 5.6V/400mW Z-diode D2 is ? 1N4148 IC1 is Signetics 555 timer IC2 is Signetics? 74LS00 Extension board: IC1 is Signetics? 74LS244 IC2 is Signetics? 74LS244 IC3 is Signetics? 74LS245 IC4 is ? 2114 (1024 nybbles of RAM) IC5 is ? 2114 (1024 nybbles of RAM) IC6 is ? 2114 (1024 nybbles of RAM) IC7 is ? 2114 (1024 nybbles of RAM) IC8 is ? 2114 (1024 nybbles of RAM) IC9 is ? 2114 (1024 nybbles of RAM) IC10 is Signetics? 74LS241 IC11 is Signetics? 74LS241 IC12 is GI AY-3-8910 Programmable Sound Generator IC13 is GI AY-3-8910 Programmable Sound Generator IC14 is ? 4066 IC15 is Signetics? 74LS139 IC16 is Signetics? 74LS30 IC17 is Signetics? 74LS30 IC18 is Signetics? 74LS161 IC19 is Signetics? 74LS138 IC20 is Signetics? 74LS74 IC21 is Signetics? 74LS32 IC22 is Signetics? 74LS32 IC23 is Signetics? 74LS32 IC24 is Signetics? 74LS04 IC25 is Signetics? 74LS08 IC26 is Signetics? 74LS04 IC27 is Signetics? 74LS30 IC28 is Signetics? 74LS04 IC29 is Signetics? 74LS21 IC30 is Signetics? 74LS00 IC31 is Signetics? 74LS00 IC32 is Signetics? 74LS20 IC33 is ? TL 084 Cartridge expansion: 2616 or 2716 (on cartridge) Magazine Articles ----------------- Elektor magazine articles relevant to the TVGC: ENG HOL FRA GER ITA SPA Notes ----- ----- ----- ----- ----- ----- ----- Elektor Software Service JUN78 Apr78 SEP78 MAY78 VHF/UHF TV modulator OCT78 Oct78 NOV78 OCT78 Dec79 Jan81 EPS-9967 VHF/UHF TV modulator (errata) JUN79 Feb79 - - - - Joysticks NOV78 Nov78 - NOV78 Jan80 Jul81 Programmable Sound Generator JAN79 Jan79 - JAN79 Microprocessor TV Games APR79 Apr79 NOV79 APR79 Dec79 Nov80 Building the TVGC APR79 Apr79 NOV79 APR79 Dec79 Nov80 Building the TVGC (errata) JUN79 Jun79 - - - May81 I played TV games (Part 1) OCT79 Oct79 SEP80 OCT79 Mar80 Jan81 I played TV games (Part 2) NOV79 Nov79 OCT80 DEC79 Apr80 Apr81 Surround (errata) NOV79 Nov79 - DEC79 Apr80 - ESS-003 Elektor microprocessors MAY80 JUN80 - JUN80 Apr81 May80 More on TV games: promises... JUN80 JAN81 NOV80 JUN80 Jan81 Dec81 More TV games: over 20K on tape OCT80 - - OCT80 Oct81 ESS-007 We haven't forgotten the TVGC! APR81 - - - Random number generator JUL81 JUL81 JUL81 JUL81 Jul82 Jul82 TV games extended SEP81 SEP81 SEP81 SEP81 Jan82 Feb82 TV games extended (errata) OCT81 - Nov81 OCT81 - Mar82 Plug-in EPROM programmer OCT81 OCT81 DEC81 OCT81 Mar82 - aka 2716 Programming Device 15 new programs - - - OCT81 ESS-009 Sound effects generator JUL82 JUL82 JUL82 JUL82 Jul83 Jul83 Rapid loading games SEP82 SEP82 SEP82 SEP82 Dec82 Jul83 Rapid loading games (errata) - NOV82 NOV82 - - - VAM: Video/Audio Modulator FEB83 JAN83 - JAN83 Jun83 Sep83 VAM: Video/Audio Modulator (errata) - - - - - Jun84 Universal memory card MAR83 MAR83 MAR83 MAR83 Sep83 Jun84 2650 single step JUL83 JUL83 JUL83 JUL83 Jul84 Jul84 Retronics OCT08 OCT08 NOV08 OCT08 Mailbox APR09 FEB09 - - Elektor magazine articles relevant to other Signetics-based machines (ASCII keyboard for PIPBUG-based machines, sound generators for Laser Battle, Lazarian and Malzak coin-ops): ENG HOL FRA GER ITA SPA ----- ----- ----- ----- ----- ----- Complex Sound Generator SEP78 Sep78 - SEP78 ASCII Keyboard NOV78 Nov78 JAN79 NOV78 Jan80 Jun81 KB05 ASCII Keyboard (errata) DEC78 - - - - - Capitals from the ASCII Keyboard MAY79 May79 JUN79 SEP79 Feb80 Shift-Lock for ASCII Keyboard JUL79 Jul79 JUL79 JUL79 Multiple sound effects generator MAR81 FEB81 MAY81 MAR81 Nov81 Oct81 aka Imitator ASCII keyboard MAY83 MAY83 MAY83 MAY83 Nov83 Nov83 Publication started Dec74 Apr61 May78 May70 Jun79 Jan80 Publication ended never never never never Apr85 20xx "The first Elektor in Italian, subtitled electronic - technical science and pleasure, was founded by Jacopo Castelfranchi Editore (JCE) in June 1979. In 1982 it passed to the Jackson Publishing Group. 71 issues were released until April 1985, then Jackson renamed it Elettronica Hobby (later becoming Fare Elettronica). In January 1987 the electronics magazine Progetto of the JCE obtained the rights to Elektor and became, only for a part of the pages, the Italian edition, changing its name to Progetto - the pages of Elektor, then Progetto - Elektor and its pages, finally Progetto Elektor. It continued until 1998, when it was replaced by Progetto PC Upgrade. In July/August 2008 a new Italian Elektor was born, published by Inware Edizioni, which then became digital only and ended with the July/August 2013 issue." Needed magazines: elektor6septiembre1980.pdf or elektor6septiembre-octubre1980.pdf (Spanish) elektor7noviembre1980.pdf or elektor7noviembre-diciembre1980.pdf (Spanish) END OF DOCUMENT-----------------------------------------------------------