PIPBUG CODING/GAMING GUIDE
--------------------------
This document was written on 3/6/08, and last updated on 27/1/13,
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.
ANNOTATE and HOWDIF now both support PIPBUG-based machines; remember to
use the appropriate PIPBUG_J, PIPBUG_K, PIPBUG_L, PIPBUG_M or PIPBUG_P
(for ANNOTATE) or ASCII (for HOWDIF) argument. TOGGLER should not be used
on PIPBUG PGM files, only on Elektor PGM files.
You should ensure that your SYMbol file has the correct start address for
your game.
ANNOTATEd disassemblies of every available game are now available, so
therefore you should not normally need to use DASMX or ANNOTATE.
Disassembly of PGM Files
------------------------
See also the Emerson Arcadia 2001 Coding Guide for information about usage
of DASMX and VACS, and comprehension of these disassemblies.
1. Make a backup of the .PGM file, to verify against later.
2. Optional: If the game makes heavy use of calls to the PIPBUG monitor,
you could copy the monitor to $4..$3FF.
3. Disassemble with DASMX.
4. Annotate with ANNOTATE.
5. Assemble with VACS.
6. Use HOWDIF to verify that the newly generated binary is identical to
the original binary.
Overview
--------
KHz: 1000
ROM: 1K PIPBUG
RAM: varies
Output: Teletype
Input: Teletype
Storage: 110 baud Kansas City (audio cassette tape or papertape)
These machines have been available since 1975 or 1976. They have been
offered as kits and as assembled systems, in various configurations by
various manufacturers, including Signetics (ie. Philips), Applied
Technology, etc.
Their defining characteristic is the use of the 1K PIPBUG ROM BIOS by
Signetics as their operating system ("monitor"). This in turn dictates
the use of a 2650-family CPU at 1MHz.
Generally, there is software compatibility betweem these machines.
However, issues such as the differing locations (and amounts) of expansion
RAM in different machines can cause problems.
These machines are not frame-based; they lack a graphics coprocessor
(eg. PVI or UVI). The system is effectively CPU + ROM + RAM. There are
thus no graphics. However, the output can of course be sent to a Visual
Display Unit (VDU) aka monitor (as is done by Ami/WinArcadia), or to a
printer-style device, eg. a teletype machine.
The ROM (BIOS), as mentioned, is 1K and consists of the PIPBUG monitor
firmware.
Reading input from a keyboard or teletype is achieved by reading the
Sense bit of the CPU. Writing output to a VDU or teletype is achieved by
writing the Flag bit of the CPU. Or, you can use the Flag bit to output
sound. But you cannot do text output and sound output simultaneously. All
I/O is done in ASCII format. Loading and saving from/to papertape and
cassette is also supported (on the real machine, but not the emulators).
They are designed to be used in conjunction with a standard 110-baud
ASCII-based teletype device, such as the DEC VT50, VT52 or VT100, or the
Electronics Australia Low Cost VDU.
Some machines possess a S-100 ("Altair") bus or other such features
(which are not currently emulated).
The optional 4-digit LED display lacks decimal points, in contrast
to the Signetics Instructor 50 and Dolphin platforms.
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);
PORTC = 0; // disable tape reader
DLY();
r4 = 0;
for (r5 = 8; r5 > 0; r5--)
{ DLAY();
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, 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.
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.
These games do their own I/O directly, bypassing the PIPBUG BIOS. Thus,
they are not currently compatible with Ami/WinArcadia. Patched versions
of these games are available, which are compatible.
Memory Maps
-----------
Five machines of this type are currently supported by AMI/WINARCADIA and
ANNOTATE:
* type "J": with 256 bytes of RAM; eg. the Electronics Australia (EA)
77up2 (aka "Baby") machine.
* type "K": with 512 bytes of RAM; eg. the Signetics Adaptable Board
Computer. (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/WinArcadia nor Annotate.)
* type "L": with 1024 bytes of RAM; eg. the basic (unexpanded)
Electronics Australia (EA) 78up5 (aka "2650 Mini Computer") machine.
* type "M": with 4096 bytes of RAM; eg. the expanded Electronics
Australia (EA) 78up5 (aka "2650 Mini Computer") machine.
* type "P": with 11K of RAM and 1K of EPROM; eg. the expanded EA 78up5
with the utility EPROM.
Note that, in Ami/WinArcadia 18.6+, $7800..$7FFF is RAM in all memory
maps (to enable DG640 support for BINBUG).
J: EA 77up2 ("Baby")
1K ROM + 256b RAM
$0000..$03FF: PIPBUG monitor ROM
$0000..$03FD: used
$03FE..$03FF: unused?
$0400..$0436: 55 bytes of motherboard RAM (for use by PIPBUG monitor)
$0437..$04FF: 201 bytes of motherboard RAM
(for storage of and use by games)
$0500..$07FF: mirrors of $0400..$04FF
$0800..$0FFF: mirror of $0000..$07FF
$1000..$7FFF: mirrors of $0000..$0FFF
K: Signetics Adaptable Board Computer
1K ROM + 512b RAM
$0000..$03FF: PIPBUG monitor ROM
$0000..$03FD: used
$03FE..$03FF: unused?
$0400..$0436: 55 bytes of motherboard RAM (for use by PIPBUG monitor)
$0437..$05FF: 457 bytes of motherboard RAM
(for storage of and use by games)
$0600..$07FF: mirror of $0400..$05FF
$0800..$0FFF: mirror of $0000..$07FF
$1000..$7FFF: mirrors of $0000..$0FFF
You will observe that all ROM and RAM is mirrored a total of 16 times
(1 "nominal" address and 15 mirrors).
The Adaptable Board Computer is in fact another name for the Signetics
PC1500 (which is the assembled version of the KT9500). The source for this
claim is the fact that the part number of the ABC board is 2650PC1500, as
well as the fact that the technical specifications are identical.
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.
L: EA 78up5 ("1K Mini Computer") or Signetics PC1001:
1K ROM + 1K RAM
$0000..$03FF: PIPBUG monitor ROM
$0000..$03FD: used
$03FE..$03FF: unused?
$0400..$0436: 55 bytes of motherboard RAM (for use by PIPBUG monitor)
$0437..$07FF: 969 bytes of motherboard RAM?
(for storage of and use by games)
$0800..$6CFF: unused?
$6D00..$7FFF: RAM (eg. for Linearisatie)?
These two machines presumably do have some differences between them, but
none that are relevant to emulation are currently known.
M: EA 78up5+78up10 ("8K Mini Computer"), contiguous configuration:
1K ROM + 7K RAM
$0000..$03FF: PIPBUG monitor ROM
$0000..$03FD: used
$03FE..$03FF: unused?
$0400..$0436: 55 bytes of expansion RAM (for use by PIPBUG monitor)
$0437..$1FFF: 7113 bytes of expansion RAM
(for storage of and use by games)
$2000..$7FFF: unused?
P: EA 78up5 ("11K Mini Computer with EPROM"):
1K ROM + 11K RAM + 1K EPROM
$0000..$03FF: PIPBUG monitor ROM
$0000..$03FD: used
$03FE..$03FF: unused?
$0400..$0436: expansion RAM (for use by PIPBUG monitor)
$0437..$2FF9: expansion RAM (for storage of and use by games)
$2FFA..$2FFF: expansion RAM (for use by EPROM)
$3000..$3BFF: unused?
$3C00..$3FFF: utility EPROM
$4000..$6CFF: unused?
$6D00..$7FFF: RAM? (eg. for Linearisatie)
Supporting the $6D00..$7FFF region as RAM for Linearisatie and the VDU
on memory map "P" and not on any the other memory maps has been done
arbitrarily. The machine as defined above would actually have 15.75K.
The mappings of the serial and parallel I/O ports and clock are unknown.
The following memory maps are not currently supported by AMI/WINARCADIA
nor ANNOTATE:
Q: EA 78up5+78up10 ("Expanded Mini Computer"), non-contiguous
configuration, without 2K motherboard RAM expansion:
1K ROM + 9K RAM
$0000..$03FF: PIPBUG monitor ROM
$0000..$03FD: used
$03FE..$03FF: unused?
$0400..$0436: 55 bytes of motherboard RAM (for use by PIPBUG monitor)
$0437..$07FF: 1K-55b of motherboard RAM
(for storage of and use by games)
$0800..$1FFF: unused?
$2000..$3FFF: 8192 bytes of expansion RAM
(for storage of and use by games)
$4000..$7FFF: unused?
R: EA 78up5+78up10 ("Expanded Mini Computer"), non-contiguous
configuration, with 2K motherboard RAM expansion:
1K ROM + 11K RAM
$0000..$03FF: PIPBUG monitor ROM
$0000..$03FD: used
$03FE..$03FF: unused?
$0400..$0436: 55 bytes of motherboard RAM (for use by PIPBUG monitor)
$0437..$0FFF: 3K-55b of motherboard RAM
(for storage of and use by games)
$1000..$1FFF: unused?
$2000..$3FFF: 8192 bytes of expansion RAM
(for storage of and use by games)
$4000..$7FFF: unused?
S: EA 78up5 ("4K Mini Computer"):
1K ROM + 4K RAM
$0000..$03FF: PIPBUG monitor ROM
$0000..$03FD: used
$03FE..$03FF: unused?
$0400..$0436: 55 bytes of motherboard RAM (for use by PIPBUG monitor)
$0437..$13FF: motherboard RAM
(for storage of and use by games)
$1400..$7FFF: unused?
The DG640 is mapped as follows:
$7800..$7BFF: bit 7: inverse video on/off
bits 6..0: character ($00..$7F)
$7C00..$7FFF: bits 7..2: unused
bit 1: graphics on/off
bit 0: flash on/off
;Hardware Equates/Memory Map (PIPBUG-based machines)----------------------
; $0000..$03FF: (R/-) 2K of PIPBUG monitor ROM
; $0400..$0436: (R/W) PIPBUG monitor RAM
; $0437..$04FF: (R/W) game RAM
; $0500..$05FF: (*/*) J: mirror of $0400..$04FF
; (R/W) K-M, P: game RAM
; $0600..$07FF: (*/*) J, K: mirror of $0400..$05FF
; (R/W) L, M, P: game RAM
; $0800..$0FFF: (*/*) J, K: mirror of $0000..$07FF
; (?/?) L: unused?
; (R/W) M, P: game RAM
; $1000..$1FFF: (*/*) J, K: mirror of $0000..$0FFF
; (?/?) L: unused?
; (R/W) M, P: game RAM
; $2000..$2FFF: (*/*) J, K: mirror of $0000..$0FFF
; (?/?) L, M: unused?
; (R/W) P: game+utility RAM
; $3000..$3BFF: (*/*) J, K: mirror of $0000..$0BFF
; (?/?) L, M, P: unused?
; $3C00..$3FFF: (*/*) J, K: mirror of $0C00..$0FFF
; (?/?) L, M: unused?
; (R/w) P: utility EPROM
; $4000..$4FFF: (*/*) J, K: mirror of $0000..$0FFF
; (?/?) L, M, P: unused?
; $5000..$5FFF: (*/*) J, K: mirror of $0000..$0FFF
; (?/?) L, M, P: unused?
; $6000..$6FFF: (*/*) J, K: mirror of $0000..$0FFF
; (?/?) L, M, P: unused?
; $7000..$7FFF: (*/*) J, K: mirror of $0000..$0FFF
; (?/?) L, M, P: unused?
;Official PIPBUG Monitor ROM Label Equates--------------------------------
;INIT equ $0 (R/-) ROM code
AINI equ $3 ;(R/-) ROM code
VEC equ $19 ;(R/-) ROM data (pointers)
EBUG equ $1D ;(R/-) ROM code
MBUG equ $22 ;(R/-) ROM code
LINE equ $5B ;(R/-) ROM code
LLIN equ $60 ;(R/-) ROM code
ALIN equ $79 ;(R/-) ROM code
ELIN equ $7D ;(R/-) ROM code
CLIN equ $7F ;(R/-) ROM code
DLIN equ $84 ;(R/-) ROM code
CRLF equ $8A ;(R/-) ROM code
BLIN equ $95 ;(R/-) ROM code
STRT equ $A4 ;(R/-) ROM code
ALTE equ $AB ;(R/-) ROM code
LALT equ $AE ;(R/-) ROM code
CALT equ $D2 ;(R/-) ROM code
DALT equ $E3 ;(R/-) ROM code
SREG equ $F4 ;(R/-) ROM code
LSRE equ $F7 ;(R/-) ROM code
ASRE equ $116 ;(R/-) ROM code
BSRE equ $12A ;(R/-) ROM code
CSRE equ $132 ;(R/-) ROM code
GOTO equ $13A ;(R/-) ROM code
BK01 equ $160 ;(R/-) ROM code
BK02 equ $16E ;(R/-) ROM code
BKEN equ $17A ;(R/-) ROM code
CLBK equ $1AB ;(R/-) ROM code
CLR equ $1CA ;(R/-) ROM code
NOK equ $1D7 ;(R/-) ROM code
BKPT equ $1E5 ;(R/-) ROM code
DISP equ $222 ;(R/-) ROM code
BIN equ $224 ;(R/-) ROM code
CBCC equ $23D ;(R/-) ROM code
LKUP equ $246 ;(R/-) ROM code
ALKU equ $248 ;(R/-) ROM code
ABRT equ $250 ;(R/-) ROM code
ANSI equ $259 ;(R/-) ROM data
BOUT equ $269 ;(R/-) ROM code
CHIN equ $286 ;(R/-) ROM code
ACHI equ $28F ;(R/-) ROM code
BCHI equ $296 ;(R/-) ROM code
DLAY equ $2A8 ;(R/-) ROM code
DLY equ $2AD ;(R/-) ROM code
COUT equ $2B4 ;(R/-) ROM code
ACOU equ $2C1 ;(R/-) ROM code
ONE equ $2CA ;(R/-) ROM code
ZERO equ $2CC ;(R/-) ROM code
DNUM equ $2D5 ;(R/-) ROM code
GNUM equ $2DB ;(R/-) ROM code
LNUM equ $2E1 ;(R/-) ROM code
BNUM equ $2F2 ;(R/-) ROM code
CNUM equ $2F5 ;(R/-) ROM code
DUMP equ $310 ;(R/-) ROM code
FDUM equ $325 ;(R/-) ROM code
CDUM equ $351 ;(R/-) ROM code
FORM equ $35B ;(R/-) ROM code
GAP equ $35F ;(R/-) ROM code
AGAP equ $361 ;(R/-) ROM code
ADUM equ $369 ;(R/-) ROM code
BDUM equ $36B ;(R/-) ROM code
DDUM equ $386 ;(R/-) ROM code
EDUM equ $39A ;(R/-) ROM code
LOAD equ $3B5 ;(R/-) ROM code
ALOA equ $3D4 ;(R/-) ROM code
BLOA equ $3E1 ;(R/-) ROM code
CLOA equ $3F5 ;(R/-) ROM code
;Official PIPBUG Monitor RAM Variable Equates-----------------------------
COM equ $400 ;(R/W) RAM data
XGOT equ $409 ;(R/W) RAM code?
TEMP equ $40D ;(R/W) RAM data
TEMQ equ $40F ;(R/W) RAM data
TEMR equ $411 ;(R/W) RAM data
TEMS equ $412 ;(R/W) RAM data
BUFF equ $413 ;(R/W) RAM data
BPTR equ $427 ;(R/W) RAM data
MCNT equ $428 ;(R/W) RAM data
CNT equ $429 ;(R/W) RAM data
CODE equ $42A ;(R/W) RAM data
OKGO equ $42B ;(R/W) RAM data
BCC equ $42C ;(R/W) RAM data
MARK equ $42D ;(R/W) RAM data
HDAT equ $42F ;(R/W) RAM data
LDAT equ $431 ;(R/W) RAM data
HADR equ $433 ;(R/W) RAM data
LADR equ $435 ;(R/W) RAM data
;Official Utility RAM Label Equates---------------------------------------
START equ $2FFA ;(R/W) RAM data
END equ $2FFC ;(R/W) RAM data
NEW equ $2FFE ;(R/W) RAM data
;Official Utility EPROM Label Equates-------------------------------------
GPAR equ $3C07 ;(R/w) EPROM subroutine
INCRT equ $3C2A ;(R/w) EPROM subroutine
PADR equ $3C3C ;(R/w) EPROM subroutine
HEXLIST equ $3C50 ;(R/w) EPROM subroutine
SEARCH equ $3C6A ;(R/w) EPROM subroutine
HEXIN equ $3C8A ;(R/w) EPROM subroutine
VERIFY equ $3CDD ;(R/w) EPROM subroutine
OK equ $3CF8 ;(R/w) EPROM code section
FAULTY equ $3D0E ;(R/w) EPROM code section
MOVE equ $3D3B ;(R/w) EPROM subroutine
Z3OUT equ $3DBE ;(R/w) EPROM subroutine (300 baud)
Z3IN equ $3DE4 ;(R/w) EPROM subroutine (300 baud)
ZDUMP equ $3E02 ;(R/w) EPROM subroutine (300 baud)
ZLOAD equ $3E53 ;(R/w) EPROM subroutine (300 baud)
ZVERIFY equ $3EA2 ;(R/w) EPROM subroutine (300 baud)
R/W: read/write
R/-: read-only
R/w: read/write (but writing requires "burning" EPROM)
*/*: mirror (resolve address to ascertain R/W attributes)
$000..$01C: -
$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 1MHz clock
$2A8..$2B3: delay for one bit time
$2B4..$2D4: -
$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?
Utility EPROM:
$2FFA START (RAM) (data) (1st CLI parameter) ($2FFA/$2FFB)
$2FFC END (RAM) (data) (2nd CLI parameter) ($2FFC/$2FFD)
$2FFE NEW (RAM) (data) (3rd CLI parameter) ($2FFE/$2FFF)
$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)
GuessingGame:
STRT = $440 code
INPT = $493 code
PRNT = $4A6 code
MSAG = $4B1 data
Life-MachineCode:
$C00..$C59: baud rate initialization routine?
$C26: LIFECRLF
$C39: LIFECOUT
$C5A: LIFECHIN
$C76..$EEC: Life game code
$EED..$F54: Life game variables
Nim:
STRT = $440 code
F1..F6, F8..FA: code
$4B3 = PRNT code
$4BC = MSGE data
PIPBUG Commands
---------------
A: ALTE Alter Memory
B: BKPT Set Breakpoint 1/2
C: CLR Clear Breakpoint 1/2
D: DUMP Dump to Papertape
G: GOTO Go To
L: LOAD Load from Papertape
S: SREG See and Set the Microprocessor
*A
Alter Memory
1234 56 #
to exit
to display the next address
to change to and exit
to change to and display the next address
*B 1 Set Breakpoint 1
no output if successful
*B 2 Set Breakpoint 2
no output if successful
*C 1 Clear Breakpoint 1
no output if successful
? if unsuccessful
*C 2 Clear Breakpoint 2
no output if successful
? if unsuccessful
*D Dump to Papertape
*G Go To
*L Load from Papertape
*S See and Set the Microprocessor
0..6 = r0..r6
7 = PSU
8 = PSL
56 ?
to exit
to display the next register
to change register to and exit
to change register to and display the next register
Uppercase input is required at all times.
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)
Cassette I/O
------------
A set (1) bit (Sense bit on) is represented by a quickly pulsing signal.
About 20 quickly pulsing cycles represents a set bit.
A clear (0) bit (Sense bit off) is represented by a slowly pulsing signal.
About 10 slowly pulsing cycles represents a clear 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 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.
As an example, here's the Blackjack game in AOF format:
:08EFFF00740F75FF0464C8D2BBA5043EBBA03F06A1E54E980F0402CC0B00040DCC0B010403CC0B02E54C982A3F07873F09923F0498E5031853E50D980F05413F05133F053205413F04E71B6301BBC0B480185F1F08F7E545980A20CC09C9CD09FF1F09A0E5419804C9F21B72E549980720C8ECC8E71BEBE54798063F07871F0731E5501C0000E5589C08F33B0F3F04E13F04F83F026902C13BFA1BED3F04BA3F0498E50398791705413F0513BBA53F062B04209BA03F078707003F049801CF2400E50D1806E503987107003F04D53F04E105423F04E7CF0A063B4C0700044118110F2400E4031808E40D1804BBA01B71FB003F06A1E5089807FB00039A741B59CD0A7428
:09EEFF0CE57F980407001B0801CF2400E50D985F0441980320C801A7001E04AC3F09870C84A9CFE4A93F04ACCB1405423F05133F04E13F05443F0560C8063F04FA07000400985C07003B9B0F2400CC84A9E40D987405413BD83F05323F07891F09A33F04CA3F0498C90A3BC803C106FF3F053C0500CD84623BC5E503986705423F05133F05383F04C2040DE47F18501F0A310001BBA00F85233F04F40E852303C102F800E4FF9806E5001873F900B4801870CC85233F0504CD8523042ABBA01F06DE184FE5259C07273F04F83F051C1BEFE541980A3F06A13F069C3B961B20E54F980B3B8E3B913BE102BBA01B97E55D98103F0498C9073F05133F053205543F04E7E551
:0AEDFF185B9C07353BEAC9733BEB3F05381B92D2DAC1F5020D5022424C41434B4A41434B220D50204C3130303D460D5022594F552048415645202422460D502050205022594F555220424554222049570D54573E46205022544F4F204D554348222047330D54573C3130205022544F4F204C4954544C45222047340D5334360D5022594F55522031535420434152442049532022205333380D4C593D412C323D540D5334360D5022594F5552205345434F4E4420434152442049532022205333380D4C593D420D5334360D50224445414C45522053484F57532022205334390D4C593D430D4C41422B3D410D5022594F552048415645222C412C2253484F57494E472236
:0BECFF140D54543E34204C572A3D57204733370D54413E3231205022594F552752452042555354454422204733320D50224849543F2220415A20545A3A38392047353E0D5334360D5022594F5552204E45585420434152442049532022205333380D4C593D42205D540D47383C0D5334360D50224445414C455220474554532022205334390D4C59432B3D432050224445414C45522053484F5753222C430D54433C31372047333C0D54433E32312050224445414C455220425553544544222047383E0D54413E432047373E0D5022594F55204C4F5345220D4C46572D3D462054463E31302047330D5022594F55275245204F5554220D502257414E5420544F20504CEB
:0CEBDE72415920414741494E3F220D41412054413D38392047320D450D502220202A2A594F552057494E2A2A22204C46572B3D462047330D54583A312047343E0D2722414345222050224F5054494F4E222049510D54513D3120520D4C31313D5920520D54583D31312027224A41434B2220520D54583D3132202722515545454E2220520D54583D31332027224B494E472220520D275820520D50204C313321312B3D592C593D580D54593E3130204C31303D590D520D54583A312047373C0D27224143452220543131432B3E323120520D543131432B3E41204731303C0D520D03AA
PIPBUG Decompilation
--------------------
Be aware 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).
LIFECOUT has the following side effects when called:
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.
LIFECHIN 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 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.
Monitor Variables---------------------------------------------------------
*(BPTR): current digit - 1 (ie. buffer size - 1)
*(CODE): set by LINE
1 = CR
2 = LF
3 = msg + CR
4 = msg + LF
*(TEMR): current register (0..8)
*(COM)..*(COM + 6): contents of r0..r6
*(COM + 7): contents of PS?
*(COM + 8): contents of PS?
Subroutine LINE-----------------------------------------------------------
;The return code is r1, as follows:
; 0 = failure?
; 1 = CR
; 2 = LF
; 3 = msg + CR
; 4 = msg + LF
*(BPTR) := r3 := -1;
LLIN:
for (;;)
{ if (r3 == BLEN) goto ELIN; // #define BLEN 20
r0 := CHIN();
if (r0 == DELE) // #define DELE $7F
{ if (r3 != -1)
{ r0 := *(BUFF + r3);
gosub COUT(r0);
r3--;
}
continue;
} // implied else
if (r0 == CR) // #define CR 13
{
ELIN:
r1 := 1; // we will return 1 or 3
CLIN:
r0 := r3;
if (r3 >=) r1 += 2; // ie. if something is in buffer
or, if (r3 >= 0 && r3 <= $7F) r1 += 2;
*(CODE) := r1;
*(CNT) := r3;
CRLF:
COUT(CR); // #define CR 13
COUT(LF); // #define LF 10
return;
} // implied else
r1 := 2;
if (r0 == LF) goto CLIN; // we will return 2 or 4
*(BUFF + ++r3) = r0;
COUT(r0);
}
End of Subroutine---------------------------------------------------------
Subroutine SREG-----------------------------------------------------------
SREG: ;$F4
r2 = GNUM();
for (;;)
{ if (r2 > 8) goto EBUG;
*(TEMR) = r2;
r0 = r1 = *(COM + r2);
BOUT(r1); // show old value (byte in r1 output in hex)
gosub FORM; // printf(" ");
r0 = *(CODE) = LINE();
if (r0 < 2) goto MBUG; // exit from "S" command
if (r0 == 0) goto CSRE; // failure? never executed anyway?
ASRE: ;$116
*(TEMQ) = r0; // ie. *(CODE)
r0 = GNUM();
r2 = *(TEMR);
*(COM + r2) = r0; // write new value
if (r2 != 8) goto BSRE;
*(XGOT + 1) = r0; // operand!
BSRE: ;$12A
r0 = *(TEMQ); // ie. *(CODE)
if (r0 == 3) goto MBUG; // if msg+CR, exit from "S" command
CSRE: ;$132
r2 = *(TEMR) + 1;
}
End of Subroutine---------------------------------------------------------
Subroutine DNUM-----------------------------------------------------------
DNUM:
r0 := *(CODE);
if (r0 == 0) goto LNUM;
// implied else
return;
GNUM:
r0 := r1 := r2 := *(CODE) := 0;
LNUM:
r3 := *(BPTR);
if (*(BPTR) == *(CNT)) return;
r0 := *(*(BUFF) + ++r3);
*(BPTR) := r3;
if (r0 == ' ') goto DNUM;
BNUM:
gosub LKUP;
CNUM:
r1 = ( r1 << 4) & %11110000; // 1st digit
r0 = (oldr2 << 4) & %00001111; // 3rd digit
newr2 = (oldr2 << 4) & %11110000; // 2nd digit
r0 |= r1;
r1 := r0;
r2 |= r3;
r0 := 1;
*(CODE) := r0 [1];
goto LNUM;
End of Subroutine---------------------------------------------------------
Subroutine CHIN-----------------------------------------------------------
CHIN: ;$286
*(DATABUS) = %10000000; // enable tape reader
r4 := 0;
while (PSU & Sense); // look for start bit
*(DATABUS) = %00000000; // disable tape reader
gosub(DLY); // waste 3+1460=1463 cycles
for (r5 := 8; r5 > 0; r5--) // loop eight times
{ gosub(DLAY); // wait to middle of data (waste 3+2996=2999 cycles)
r0 = PSU & Sense;
r4 >>= 1;
r4 |= r0;
}
/* Bits are read from least significant (low bits) to most significant
(high bits). This example assumes $FF (or at least $7F) is being
received:
1st time: r4 is $00 %........
now r4 becomes $80 %0.......
2nd time: r4 has become $40 %.0......
now r4 becomes $C0 %10......
3rd time: r4 has become $60 %.10.....
now r4 becomes $E0 %210.....
4th time: r4 has become $70 %.210....
now r4 becomes $f0 %3210....
5th time: r4 has become $78 %.3210...
now r4 becomes $F8 %43210...
6th time: r4 has become $7C %.43210..
now r4 becomes $FC %543210..
7th time: r4 has become $7E %.543210.
now r4 becomes $FE %6543210.
8th time: r4 has become $7F %.6543210
now r4 becomes $FF %76543210 High bit (bit 7) is parity! */
gosub(DLAY); // waste 3+2996=2999 cycles
r4 &= %01111111; // delete parity bit
r0 := r4;
;clear With Carry bit
retc,un
End of Subroutine---------------------------------------------------------
Subroutine DLAY-----------------------------------------------------------
DLAY: // delay for one bit time ;$2A8
r0 = 0; ;2
512 iterations of BDRR,R0 ;1536
DLY:
;$2AD: ;1460
;alternate entry point
256 iterations of BDRR,R0 ;768
r0 = $E5; ;2
229 iterations of BDRR,R0 ;687
retc,un ;3
End of Subroutine---------------------------------------------------------
I/O Timing
----------
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'=3uS.
At 110 baud, each bit ideally lasts for 9090.90' uS.
At 300 baud, each bit ideally lasts for 3333.3' uS.
At 1200 baud, each bit ideally lasts for 833.3' uS.
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=9003uS.
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=4389uS.
For a 1200 baud RS232 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=825uS.
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 cycles=552uS.
Note that these delays are shorter than the ideals. However, keep in mind
that there is also code that must be run by the caller to process (emit/
receive) each bit; this takes a certain amount of 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.
Game Help
---------
Biorhythm:
Dates are expected to be in mm/dd/yy format.
Biorhythm, Funny Farm Races, Lunar Lander (machine code version):
These are incompatible with the emulator (because they do direct output
rather than going through the PIPBUG BIOS). There are patched versions in
the Enhancements Pack which are compatible.
Funny Farm Races:
1. At the "PLAYER 1-" prompt:
Type in the name of the first player and press ENTER.
2. For each additional player you want to add:
Press P. The machine will say "PLAYER 2-" (or whatever).
Type in the name of the player and then press ENTER.
3. Press ENTER to begin.
4. For each player:
The machine will ask "BET?".
For each bet you want to place:
Press Y and then press ENTER.
The machine will ask "DOG NO?".
Press the number (0..9) of your preferred dog and then press ENTER.
The machine will ask "HOW MUCH?".
Press N when this player has placed all their bets.
5. Watch the race and then press ENTER.
6. Go to 4.
Furnace:
This program requires extra hardware (eg. various motors), which is not
emulated by AmiPIPBUG/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.
Guessing Game (machine code version):
"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."
Life-MachineCode:
"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:
1 2 3
4 X 5
6 7 8
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.
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.
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.
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 32x16 versions are intended for use with the Low Cost VDU of EA
February and April 1978. The 32x24 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
and then switch to the appropriate baud rate (110, 300 or 1200 baud). Then
type a U for 110 baud operation, or a Y for 300 or 1200 baud (depending on
the program version) baud operation.
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
O
GENERATION 2 OO
O
OO
GENERATION 3 OO
OO
OO
GENERATION 4 O O
OO
OO
GENERATION 5 O O
OO
One of the most interesting and simple patterns has been named the
"Glider". The seed for this is shown below:
O
O
OOO
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.
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."
The original (unpatched) version does not (currently) work under Ami/
WinArcadia. There is a patched version available which does work, under
V8.22 and later.
Linearisatie:
This program requires extra hardware, eg. light pen, which is not
supported by AmiPIPBUG/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.
Lunar Lander (machine code version):
The display is as follows:
F = Fuel (out of 40)
V = Velocity (- is down (towards surface), + is up (away from surface))
D = Distance from surface (- is underground, + is above ground)
Maths Demonstration:
"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."
Memory Test:
You use the program as follows:
G48F
where is "01".."7F". ("80".."$FF" give infinite tests.)
Eg.:
G48F 0500 3FFF 7F
If there is no resulting output other than linefeeds (just goes back to
the "*" prompt), this indicates success.
Errors are as follows:
Z or S mean that cleared (zeroed) memory did not read back as $00.
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.
The address of the error then follows the error code.
Message Editor:
"Upon being called, this program will give a prompt character, and await a
command character. Command T allows a message to be entered, C allows a
stored message to be checked, and R allows it to be repeated until the CPU
is reset. In text input mode, the Del character acts as a destructive
backspace for correcting errors. To return to command mode, type an Esc.
If the message being stored is too long for the buffer, an F will be
displayed. Starts at $0440."
Micro BASIC programs (eg. Guessing Game (Micro BASIC version), Lunar
Lander (Micro BASIC version), Radio Log, Temperature Conversion):
Type G1 and then press ENTER to begin execution.
Mini-Disassembler:
You must type 6 consecutive hex digits. These are not echoed to the
screen (except that Ami/WinArcadia V15.72+ 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.:
0440FF
will disassemble $440..$4FF.
Note that the mnemonics used are not always standard Signetics. Eg.:
HLT = HALT
LPU = LPSU
LPL = LPSL
PPU = PPSU
PPL = PPSL
To disassemble another region, type:
G440
at the command prompt ("*"). If you get another "*", retry; otherwise,
now enter a new 6-digit address range.
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:
"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.
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 [] []
The last two parameters are optional. If they are not given, the program
will use the previous values. Thus, to play "Yankee Doodle", type:
G58C 5D4 2800
and for "Bach" type:
G58C 6B8 7000"
-v. low-- ---low--- -middle-- ---high-- -v. high-
$30 E $40 E $50 E $60 E $70 E
$31 F $41 F $51 F $61 F $71 F
$32 F#/Gb $42 F#/Gb $52 F#/Gb $62 F#/Gb $72 F#/Gb
$33 G $43 G $53 G $63 G $73 G
$34 G#/Ab $44 G#/Ab $54 G#/Ab $64 G#/Ab $74 G#/Ab
$35 A $45 A $55 A $65 A $75 A
$36 A#/Bb $46 A#/Bb $56 A#/Bb $66 A#/Bb $76 A#/Bb
$37 B $47 B $57 B $67 B $77 B
$38 C $48 C $58 C $68 C $78 C
$39 C#/Db $49 C#/Db $59 C#/Db $69 C#/Db $79 C#/Db
$3A D $4A D $5A D $6A D $7A D
$3B D#/Eb $4B D#/Eb $5B D#/Eb $6B D#/Eb $7B D#/Eb
$80 rest
For the purposes of the above table, each "octave" is assumed to begin at
E.
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 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 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.
Rotate:
"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:
A B C D
E F G H
I J K L
M N O P
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.
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
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.
Here is a sample printout. The "Z" command was used to terminate the
game.
*G440
PRESS ANY KEY
OJMD
EPLI
BFHK
CNAG
ROTATE: F
OJMD
EPLI
BNFK
CAHG
ROTATE: N
OJMD
EFLI
BANK
CHFG
ROTATE: N
OJMD
EPLI
BAFN
CHGK
ROTATE: F
OJMD
EPLI
BAGF
CHKN
ROTATE:
EXCHANGE: L,M
OJLD
EPMI
BAGF
CHKN
ROTATE: P
OJLD
EAPI
BGMF
CHKN
ROTATE: M
OJLD
EAPI
BGKM
CHNF
ROTATE: CANCEL
OJLD
EAPI
GMNF
CHKN
ROTATE: G
OJLD
EAPI
BHGF
CKMN
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.
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).
Othello (Reversi) 2.0:
Input must be in Y,X (row,col) format.
Printer Routines, Trace Routine:
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.
Solitaire:
This game expects a display with more than 16 rows. The SVT-100 terminal
which is emulated by Ami/WinArcadia is only one of the output devices that
could be hooked up to a real PIPBUG machine. The game was probably
designed for a teletype. We suggest using the "Log|Echo I/O to console?"
option.
Time:
This program uses cycle counting techniques. Under Ami/WinArcadia 8.41,
this programs appears to run too fast (ie. the "game" time goes faster
than the emulator 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:
This program expects extra input (eg. various sensors) and output (eg.
pitch and roll indicators) hardware, which is not supported by AmiPIPBUG/
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).
Alternative Operating Systems
-----------------------------
Various alternative operating systems were available, eg. C-BUG,
MIKEBUG, PIPBUG2 and SBCBUG, with various levels of compatibility with
programs designed for the original PIPBUG. If you have dumps, manuals,
etc. for any of these, please email us (at amigansoftware@gmail.com).
The following routines are cross-compatible between PIPBUG 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 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 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
Some variables may also be cross-compatible.
BINBUG outputs both to the serial port (at 300 baud) and to the VDU. This
VDU RAM is 1K at $7800..$7FFF. The data is stored left-to-right, top-to-
bottom, in 16 rows of 64 columns, as ASCII values, as follows:
$7800..$783F 1st row of characters
$7840..$787F 2nd row of characters
: : :
$7BFF..$7BFF 16th row of characters
Apparently $7C00..$7FFF is also used for the VDU (PDC graphics? driver
software? colour RAM?).
Unarchived Software
-------------------
The following are confirmed but unavailable:
1. TCT BASIC
2. PIPBUG2/PIPLA (eg. as contained on the Signetics CP1002 chip)
3. "the program supplied with the PROM Programmer article (Jan 1979)"
4. Hunt the Wumpus
5. Disassembler by Ian Binnie
6. "EA 1978 Software Record" (plastic on cardboard record)
See the relevant magazine article for more details.
This is the same item as the Dick Smith Electronics floppy vinyl
record B-6300.
7. Astro-Trek
8. 2650 Chess aka Sargon
9. other software as mentioned in EA Feb 78 p. 73.
10. MultiBug
If you know of any other software, or have dumps/tapes/listings of any of
the above software, please email us (at amigansoftware@gmail.com).
END OF DOCUMENT-----------------------------------------------------------