SYM-1 6502 mini sbc

The following article is from the site , all design and ‘me’ in the text below is by and (C)  Michael Cvetanovski
The copy here is for information and archiving only, the original is the place to go for the latest information.

Bit of History

Once upon a time .. I had a SYM-1 sbc board that I played around with. Wonderful microcomputer for its era (early 1980’s). Like most people due to non use and lack of interest I give that micro away. Since my recent eagerness to dabble with some of the older micros .. I had a go at trying to rebuild the SYM-1 to a reasonable design so I can use most of the SYM-1 features. Having a 6502 chip and a 6532 peripheral chip, I had most bits to be able to create a minimal system to say run the SYM-1 Supermon 1.1 monitor. Following is a prototype that I got working (must admit after some testing time) which is minimal in design in having basically 5 main chips and TTL-USB adapter for comms to a PC. This project is ongoing where I have also reproduced (to a reasonable degree) an imitation keypad similar to the original one from individual pcb type push button keys. Where possible I used particular IC’s (like GAL’s) to minimise the construction and size of the design.

Prototype Board

It mainly consist of the 6502 chip, 6532 peripheral chip, 2732 EPROM for Monitor, 2K 6116 Ram chip and 24pin Atmel GAL chip to provide some of the decoding and interfacing. Additional things on the board are 14pin 1Mhz crystal and an expansion socket to be able to interface to display/keypad. Flying wires are leads to a TTL to USB converter that connects to USB port of a PC. Monitor code is original version 1.1 that you can get from 6502.org. Memory map is original as per SYM-1 board for the monitor, 6532 chip and 2k RAM from 0000-07FF. Gal chip used is Atmel ATF22V10CQ/CQZ. No particular reason for this one .. but you can easily get them from RS components and not that expensive. I will provide the .pld and .jed file for the code to program these. See notes later on.

Prototype board was constructed using a vero type board with a bank of tracks to place the IC’s. Wiring was soldered point to point using wire wrap wire. After initial mounting of the components and testing for shorts etc the board was ready for use. When powered up the board draws about 220mA. See pic below.

Parts for construction

If you are an old micro buff you probably have some if not most parts to construct this mini board. In case you don’t here is few suggestions for major parts.

  • 6502, 6532 you might be lucky enough to get them from China supplies (via Alibaba or Ebay website)..be prepared to wait 3-4 weeks at least.
  • Atmel pdl (GAL chip) try RS components.. usually very quick delivery. If you cannot program pld’s I can supply the chip programmed.
  • 1Mhz crystal try element14
  • 2732 and 6116 try www.futurlec.com. If you cannot program the 2732 I can supply some Eproms as I have some spares left.
  • TTL to USB adaptor, Many supplies from China via Ebay ..take 3-4 weeks
  • Also look through some forums like this one.

Circuit Design

It basically follows from the original SYM-1 schematics, with simplification of decoding logic with a PLD chip. For minimal system you would need at least a Monitor program, some RAM and an I/O comms. Simplest would be to have RS232 type comms that you can connect to a PC and communicate to the board via terminal type program. So in that case from original design, 6532 chip did the job of communication via pins 16 and 19 to RS232 type interface. Since I was trying to use TTL to USB interface I did not have much success in interfacing the board to the PC. It wasn’t till I actually built an additional keypad to connect to the main board and played around with that I figured out the interface and comms settings. The final comms configuration involved using inverter gates for input and output to serial port (via PLD chip), and the following serial settings on comms port:

  • 4800 Baud
  • no parity
  • 8 bit
  • 1 stop bit
  • handshake none

Original notes and references to RS232 on SYM-1 refer to 3 stop bits .. which confused me initially .. hence it took a while to figure out what works properly.

Schematic and component functions

Following is a schematic of the design. It is using Diptrace software. Note I use point to point schematic (pin ID connections). It does reduce wires ..but for some people it gets bit harder to follow.

Caution: As with any circuit diagrams it is up to you to recheck and make sure it is OK before proceeding to any construction. To best of my ability this is representation of what I have used. I’ve followed other circuit diagrams on the web, only to find some info was wrong. So please check pin outs (especially against datasheets) to make sure all connections are correct. If there is any errors please email me.

Download Schematic

Looking at the schematic here is bit of explanation of some of the component functions:

  • Resistors are basically pullup resistors for inputs to CPU that are not needed.
  • R6 and D1 are just power indicator for the board.
  • S1 (on board pb switch), C5 and R5 are the reset input to 6502. Note also reset is provided from external input via terminal power block.
  • 6532 is wired similar to SYM-1 schematic: A0-A6 for on chip ram addressing. CS1 is A10 and Register Select (RS) is via  PLD chip. R/W is direct from 6502.
  • Chip selects for Rom, Ram and 6532 come from PLD.
  • CRT OUT is inverted to RxData ..so is TxData to CRT IN via PLD inverter gates.
  • PLD provides address decoding and 3 inverter gates. Phi2 and R/W are used to generate RD and WR signals for Rom/Ram.
  • 6116 and 2732 can be any brand as long as the pins are same. Also note which programming voltage is used for the 2732 chip, as they vary greatly.

PLD Function

Atmel PLD is used to provide address decoding and 3 gate inverts for A9 and serial signals. For more info see Atmel website and WinCupl software.

The code for the PLD is shown below:


Name SYM-1;
Partno 0001;
Revision 4k Mon, 2kRam, 6532 Comm;
Date 6/2/15;
Designer mc;
Company mcoz;
Location oz;
Assembly manual;
Device g22v10;

/** Inputs **/
pin [1..6] = [a10..15] ;
pin 7 = phi2;
pin 8 = rnw;
pin 9 = a9;
pin 10 = crtout;
pin 11 = crtin;

/** Outputs **/
pin 19 = !nr;
pin 20 = !nw;
pin 21 = !cs6532;
pin 23 = !csrom;
pin 22 = !csram;
pin 18 = !na9;
pin 16 = !ncrtin;
pin 17 = !ncrtout;

/** Declarations and Intermediate Variable Definitions **/

field ioaddr= [a15..9];
cs6532_eqn = ioaddr:[A4XX..A7XX];
csrom_eqn = (ioaddr:[80XX..8FXX])#(ioaddr:[F0XX..FFXX]) ;
csram_eqn = (ioaddr:[00XX..07XX]) ;

/** Logic Equations **/

ncrtout=crtout;
ncrtin=crtin;
na9=a9;
nr =phi2&rnw ;
nw = !rnw&phi2 ;
cs6532 = cs6532_eqn ;
csrom = csrom_eqn;
csram = csram_eqn;

The pinout for PLD is as follows:


View pld file

Download jed file

Testing the board

Obviously have the board connected to the PC and use appropriate comms software like Hyperterm (on XP) or RealTerm set to appropriate setting. Also set CAPS ON. (reduces errors). If all OK after pressing the RESET button …press the “Q” key on keyboard . The response should be “.” single dot …where you can give monitor commands after that. Following is snapshot of sample program that is given in Reference manual for SYM-1 that adds two numbers together from memory locations 200 and 201 and places result in 202. You can see that 202 changed from 0 to C6 which is = C1+05.

From this point on you can explore all the monitor commands. Save and Load will not work as provision is not made in this design for saving code to cassette tape. So another way of saving and loading the machine code is via SP an LP (paper tape commands).

Saving and loading code (via terminal)

Refer to paper tape format info in SYM-1 Reference manual (page D-1). So for example to save above code you would issue command

  SP 200-210

and before you press , set terminal program to capture file mode.. which will save text as it is output to the terminal.

Start capture mode and press

the listing should follow.. once character output had stopped ..Stop the capture …

To see what is captured open the captured file with Notepad..it should look like something like this …

Delete the space in first line and replace the “.” in the last line with “;00”. This creates the correct file to upload.

To retrieve the code type in

LP

and send the captured file as text using terminal program ..What you might need to do is delay the character and LF output to about 20ms so the board does not get swamped with incoming characters from the PC serial port. You can adjust the delay to smaller value till the sending of file stops working properly. 20ms+ is usually a safe bet.

Picture above shows loading of the file, listing the code, running it and then listing the result of the addition program. So there you are ..plenty of things to be able to examine ..with minimal system similar to the original SYM-1 board.

I/O via 6532 PIA chip

Ok If you are to use the mini board with RS232 interface only (that is … with NO keypad/display) then the port A (address A400) is free to use for any I/O control. The DDRA (address A401) can be set up for output or input. As a simple example using SYM monitor we can set the DDR to output on all eight PA pins (set DDRA to FF). Then changing the value of I/O Register A (A400 address) from FF to 00 will toggle output on the port A (pins 8-15) from high back to low.

If you want to use the port A as an input then set appropriate bits to 0 in DDRA. Image below shows a crude example of control via Monitor commands. Writing machine/assembly code for more complex task is possible and make the board useful as a micro controller.

Running mini @9600 Baud

It is possible to run the mini board @ 9600. Suggestions have been obtained from 6502 pages website, where following address have been changed:

8AE9 08 --> EA         '   NOP
8AEA 48 --> 60          '  RTS

8AB0 0B -->0A           ' CHANGE NUMBER OF STOP BITS

Changed binary file Supermon 1.1 file for 9600 baud can be downloaded from here. Please note as suggested, once this is changed it might not be possible to run the board at different speeds.

PCB for mini SYM-1

If you are like me I am not best at bread boarding circuits. From the mini board schematic diagram I have generated a pcb design and gerber files that you be able to make your own boards from. See link below.

Word of Caution First
I have not made any of these pcb’s so make sure you check the board out before any component mounting. In case there is any major faults let me know. One mistake that I am aware of is that the polarized caps C5,7 and 8 show the “+” on the wrong side. So make sure you mount polarized caps the correct way around. When I get time will try to correct that.

At this point I am only providing the full set of the gerber files from which you can get the boards manufactured. From more expensive pcb websites the board will work out about $30-$40 .. but if you shop around and get more than one board ..they will probably work out $10-15 each.

Top silk layout and component placement

Most of component placement is self explanatory. It is possible to power the board from TTL/USB connector (by getting +5 volts from PC USB port). But word of caution in doing that. The setup draws about 220mA, so make sure all the connection on J1 are solid. Also if you to use USB power then do not power the board from PWR/RST connector.
Bottom traces…

Top Traces …

Download set of zipped Gerber files here.

SYM-1 Keyboard

Following is info about keyboard and 6 digit 7 segment display expansion prototype board that was used with mini SYM board to run monitor program from the keypad. It is similar in layout to original SYM-1 board. Keys are made up of pcb push button switches, that have 2 square caps on them. One cap clips over the switch then another CLEAR plastic cap clips over the top again. By placing appropriate size bit of paper with text on it, ANY keyboard key indicator can be made up. (see picture)

The only issue with these switches is that they had too much horizontal (rotational) play and hence keys do not look all lined up. Placing the keys close would eliminate some of that, however mounting the switches on the pcb requires some distance between adjoining pins – so it is not possible to bring the rows close together.

post

65XX Datasheets

Datasheets

6530

The 6530 was produced by most 6502 manufactures, from MOS Technology/Commodore SG to Rockwell and Synertek. All production datasheets that I have seen afaik identical, here I present some clean Rockwell datasheets. The first one is a preliminary MOS datasheet for the MCS6530, missing the ordering pages of the production version.
MOS Technology preliminary MCS6530
Rockwell 6530 RRIOT
6531 RRIOC
6532 RIOT

6500/1 One chip microprocessor

14 page datasheet
24 page datasheet

Manuals

KIM-1 User manual in HTML format
KIM-1 Hardware manual in HTML format
KIM-1 Programming in HTML format
Scan-160408-0001 Cross assembler Manual, GE timeshare
post

Emma by L.J. Technical Systems

The EMMA and EMMA II SBC’s were produced by LJ Electronics Ltd, Norwich, a company established in 1979 to market training technology to colleges, schools and universities. The company behind LG Electronics still exists but is now known as LJ Create.

Here you find information on:
EMMA
EMMA II
EMMA emulator by Colin Grey

Emma

Emma, full name MS1 Emma Microcomputer, is a rudimentary 8-bit 6502 processor board, quite similar to the KIM-1 family, with attached hex-input keypad and 7-segment display that was marketed by LJ Electronics in the early eighties. Despite its mere 1K of RAM and 2K monitor in EPROM, it was deemed suitable for driving the Atlas arm. In addition to the processor itself, the Emma range,L.J. Electronics Basic Microprocessor Application System MA02/1, included a large number of sensing, simulation and input-output boards that Emma could be hand-coded to interact with. There was even a mini matrix printer for hard-copy output.
The images below show the Emma processor, keypad and display unit, plus many of the available add-on boards. More complex expansion options included an Eprom programmer and an A4 plotting table. Further capability could be added in the form of the Visa Expansion System – shown above connected to Emma. This added a video interface, 8K of RAM, 8K of BASIC, 6K of assembler and monitor and a full QWERTY keyboard.
EMMA uses 6502 with 1 MHz crystal, an INS8154 + 74145 RAM I/O IC for 24 keys scanning and 8 seven segment displays, a 6522 VIA for general purpose I/O, 2x 2114 SRAM and a 2716 for the monitor program. A group of CMOS CD4XXX IC’s delivers a Cassette interface

Any additional information, like software, is appreciated!

EMMA manual in PDF format. L.J. Electronics Basic Microprocessor Application System MA02/1, consisting of the MS1 Emma Microcomputer and numerous components, as listed in the MA-02 manual.

Hardware Manual for the EMMA  – 46 pages plus large appendices If ou have it, plaese help me scan and publish it! I only have three pages as seen in a recent ebay listing:




Emma computer with Visa upgrade, controlling an early Atlas robot arm

Emma II

Emma II was a more compact and complete successor of the Emma. Quite similar, but the keyboard encoding is now done with a 6821 PIA. A VIA 6522 is also present and the usual hex keybaord and seven segment display.

Emma II is well documented (thanks John Evans)

EMMA II Technical manual in PDF format, including schematics and monitor source, 115 pages.

 

 

 

 

 

 

EMMA II User manual in PDF format, 109 pages full of experiments.

Token-ring with EMMA II
Running lights with EMMA II
Flashing text with EMMA II
EMMA II EPROM bin
EMMA II EPROM hex
EMMA II EPROM memory expansion bin
EMMA II EPROM memory expansion hex

Memory Expansion module with RAM ROM and EPROM Programmer (Photo John Evans)

EMMA emulator by Colin Grey

This is a 6502 simulator. It is loosely based on the LJ Technical Systems EMMA board. Although quite useful it is not a full implementation. Download here.

post

John Bell Engineering SBC’s

John Bell Engineering was a small firm producing microprocessor many boards between 1980 and 1990.
The early boards were 6502 and Z80 SBC’s, later boards were for the Apple II, and the last ones for the IBM PC bus.

I present here, what I have found, of three boards in the spirit of http://retro.6502.nl. Any additional information, like software, is appreciated!

82-300 Three IC’s SBC 6502, 6532 2716
80-153 SBC 6522, 6502

82-300 (circuit drawn by Mike K8LH)

One of the smallest 6502 based computers possible with the technology of the 1980ties!

Any additional information, like software, is appreciated!

Three IC’s SBS 6502 CPU, 6532 RIOT, EPROM  2532 or 2716, expansion connector, RC oscillator, one transistor decoder


80-153 6502 micro

Five IC’s SBS 6502, 6522 VIA,  2716 EPROM, 2x 2114 SRAM, 74LS10 decoder

There was a revision, connecting phi2 to pin 11 of the ‘LS10, “to improve memory response”

(Clock modification with crystal,  Don Sawyer)

There was a revision, connecting phi2 to pin 11 of the ‘LS10, “to improve memory response”, so the wire is soldered!

There was a revision, connecting phi2 to pin 11 of the ‘LS10, “to improve memory response”


KIM Clone Corsham Technologies

A new KIM CLone kit is coming!

Bob Applegate is filling in the gap left by Vince Briel, with his own design.

  • 6502 for now, but will probably ship with a 65C02 (extra instructions).
  • Fully KIM-1 software compatible.
  • 5K memory from 0000 to 13FF, then another 56K from 2000 to FFF7.
  • The top 8K of RAM can be turned off and 8K of EEPROM can be enabled (socket on board for the EEPROM).
  • Has an 8V power plug and on/off switch.
  • No cassette interface.
  • USB serial board.  Ie, plug a USB cable between your computer and the KIM clone to use the TTY port.
  • Has connector to plug in our SD System.  Store/retrieve programs from a micro SD card.

KIM Clone Progress

 

post

EhBASIC bug Ibuffs location

Bug in EhBASIC 2.22 Daryl Rictor et al (from a discusson on 6502.org)

The following works:

; Ibuffs can now be anywhere in RAM, ensure that the max length is < $80
IRQ_vec   = VEC_SV+2      ; IRQ code vector
Ibuffs      = IRQ_vec+$14

Whereas the following doesn’t:

; Ibuffs can now be anywhere in RAM, ensure that the max length is < $80
Ibuffs      = $0400
Ibuffe      = Ibuffs + $47    ; end of input buffer

Of course be careful to make sure that Ram_base is quite faraway from Ibuffs.

So, Ibuffs can be anywhere in RAM that’s not $0400??
Any reason $0400 is magical?
Nope. $0400 is an example. $0500 gives you the same result: negative.
As long as Ibuffs is in the same page as ccflag and friends, it works. And ccflag can be at $0400.

Now, if you reference Ibuffs in relation to IRQ_vec (copy it over from min_mon.asm), then things work.
Perhaps someone somewhere made some assumptions of the page where Ibuffs need to be e.g. be in the same page as ccflag and friends etc.

The other problem is what I’ve already observed: the EhBASIC binary has to be located in memory higher than Ram_base and Ram_top. Otherwise strange things happen.

With Ibuffs set to $0400 AND Ram_base set to $0500, I did a Cold start and entered this line – 10 PRINT “HELLO WORLD”

I examined the memory at Ram_base and found that the stored line was formatted correctly. However, when I typed LIST, all I got back was HELLO WORLD, as if I had typed RUN. Typing RUN also returned HELLO WORLD. When I ran the SYS command (my added command to return me to my Monitor), it just ignored it and returned to the BASIC input prompt.

Next, I changed Ibuffs to $0401 and reassembled. This time, everything performed as it should.

Next, I set Ram_base to $0600 with Ibuffs set to $0400 and entered the same line. This time, LIST returned nothing. Examining memory at $0600, the stored line is there and is correct. RUN and SYS also return nothing.

Finally, I set Ram_base to $0600 and Ibuffs to $0401 and all worked as it should.
I think I found the problem… and it would explain the issue with Ibuffs and Ram_base being 1 page apart too.

This piece of code is the problem:

LAB_142A
   INY            ; increment pointer
   INY            ; increment pointer (makes it next line pointer high byte)
   STA   Ibuffs,Y      ; save [EOL] (marks [EOT] in immediate mode)
   INY            ; adjust for line copy
   INY            ; adjust for line copy
   INY            ; adjust for line copy
   DEC   Bpntrl      ; allow for increment (change if buffer starts at $xxFF)
   RTS

Previously in the code, Bpntrl gets set to Ibuffs. When the DEC instruction gets executed, Bpntrl get set to $FF. Later in the code, we have this:

LAB_15F6
   JSR   LAB_IGBY      ; increment and scan memory

LAB_15F9
   JSR   LAB_15FF   

The routine LAB_IGBY is located in zero page (to increase speed). it looks like this:

LAB_2CEE
   INC   Bpntrl      ; increment BASIC execute pointer low byte
   BNE   LAB_2CF4      ; branch if no carry
               ; else
   INC   Bpntrh      ; increment BASIC execute pointer high byte

; page 0 initialisation table from $C2
; scan memory

LAB_2CF4
   LDA   $FFFF         ; get byte to scan (addr set by call routine)
   CMP   #TK_ELSE      ; compare with the token for ELSE
   BEQ   LAB_2D05      ; exit if ELSE, not numeric, carry set

   CMP   #':'         ; compare with ":"
   BCS   LAB_2D05      ; exit if >= ":", not numeric, carry set

   CMP   #' '         ; compare with " "
   BEQ   LAB_2CEE      ; if " " go do next

   SEC            ; set carry for SBC
   SBC   #'0'         ; subtract "0"
   SEC            ; set carry for SBC
   SBC   #$D0         ; subtract -"0"
               ; clear carry if byte = "0"-"9"
LAB_2D05
   RTS

The code at LAB_2CEE will INC Bpntrl, which becomes $00 and then INC’s Bpntrh to $05. Now this pointer is pointing to the wrong page. And depending upon what is stored there, different things will happen.

This note is incorrect:

   DEC   Bpntrl      ; allow for increment (change if buffer starts at $xxFF)

It should read (change if buffer starts at $xx00).

My fix would be to add this:

LAB_142A
   INY            ; increment pointer
   INY            ; increment pointer (makes it next line pointer high byte)
   STA   Ibuffs,Y      ; save [EOL] (marks [EOT] in immediate mode)
   INY            ; adjust for line copy
   INY            ; adjust for line copy
   INY            ; adjust for line copy

; add patch for when Ibuffs is $xx00 - Daryl Rictor 
   LDA  Bpntrl         ; test for $00
   BNE  LAB_142P      ; not $00
   DEC   Bpntrh      ; allow for increment when $xx00
LAB_142P
; end of patch
   DEC   Bpntrl      ; allow for increment
   RTS

I have tested this fix and it worked for me.

Daryl