OSI 300 Replica

The OSI-300 was a 1970's era single board computer trainer powered by the ubiquitous 6502 processor. I purchased this kit at Vintage Computer Festival Midwest 10. It seemed like an inexpensive way to experience the "homebrew" aspect of early computing which I wanted to learn more about. The assembly instructions were straightforward and soldering went smoothly in spite of my limited skills. This kit may still be available from randomvariations.com

Programming the kit requires OSI-300 manual, which is available here. However, I highly recommend the Rodnay Zacks book, Programming the 6502, as a reference.

Powering the kit

The OSI-300 requires a 5 volt power source and there are two header pins for connecting it.
The digital electronics teacher where I work, generously supplied a "Breadboard Companion" which can supply the 5 volts needed by the OSI-300. The picture on the right shows the OSI-300 wired to a BBC for the 5v power source.

You could also use the header pins on a Raspberry Pi to supply the 5 volts. I would personally recommend the Raspberry Pi approach, as the BBC chewed through 9v batteries which rapidly overheated.

In either case, you will need two jumper wires to connect your power source to the power pins on the board.

Basic Operation

To look in memory:

(OSI-300 wired to a BBC)
Set switches as follows:
Run to left
RST to left
Load to the right
NMI to left
ROM to left
Now toggling an address will show the data at that address.

To enter a program:

Configure switches as stated above.
Set the address and data switches to the desire values.
Push the load switch to the left, then back to right
Repeat this for each byte of the program. (listed below)

To enter the Reset Vector:

The processor loads the program's start address from an address called the Reset Vector. On the 6502, the reset vector is stored in bytes 0xFFFC and 0xFFFD. However, since we only have 12 address lines (switches), the start vector will be at the 0xFFC and 0xFFD.

In the following two example, we need to set these bytes to 0, since that's where we're putting our program in memory.

Load the following data to set the Reset Vector.
000000001111 1111 1100 (0xFFC)
000000001111 1111 1101 (0xFFD)

Running a program

Once the reset vector and program have been toggled in...
push Reset right (to load the reset vector)
push Run right
(lights go nuts as the data lights show the op-code being run)
push Reset switch back to left

Halting the program

push Reset right
push Run left

Now you can look in memory to see if you have the results you expected.

A simple program

Here's a program that sticks the number 5 into hex address 0x0008
LDX 5 (load immediate register x with 5)
STX $0008 (write x to memory location 8)
JMP $0000 (loop infinitely)

That program written as binary

LDX (Immediate)0xA21010 00100000 0000 0000
50x050000 01010000 0000 0001
STX0x8E1000 11100000 0000 0010
80x080000 10000000 0000 0011
00x000000 00000000 0000 0100
JMP0x4C0100 11000000 0000 0101
00x000000 00000000 0000 0110
00x000000 00000000 0000 0111
(Note: STX $008 has to be entered as STX, 8, 0 because the 6502 flips address bytes)

After running this program, there should be 5 in address 8 (as shown below)

Another short program

LDX #5 (load register x with the number 5)
INX (increment x)
INX (increment x)
STX $0x000A (store x to memory location 0x000A)
JMP $0007
(jump to self - the 6502 doesn't have a HALT or SYNC instruction)

That program written as binary

LDX (Immediate)0xA21010 00100000 0000 0000
50x050000 01010000 0000 0001
INX0xE81110 10000000 0000 0010
INX0xE81110 10000000 0000 0011
STX0x8E1000 11100000 0000 0100
100x0A0000 10100000 0000 0101
00x000000 00000000 0000 0110
JMP0x4C0100 11000000 0000 0111
70x070000 01110000 0000 1000
00x000000 00000000 0000 1001
(Note: JMP $007 has to be entered as JMP, 7, 0 because the 6502 flips address bytes)

If the program worked properly, there should be a decimal 7 (0000 0111) in address 10 (0000 0000 1010). You should now see this...
(OK, I didn't get this far...the 9v battery died)