Designing a 6809 Coprocessor for the BBC microcomputer The 6809 and Flex DOS together provide a base for teaching microprocessor development using the BBC micro as an I/O engine. Huw Jones presents a detailed design to implement this arrangement As a descendant of the 6800 microprocessor, the 6809 is the preferred teaching model in many UK educational establishments. The paper describes the design philosophy and implementation of a 6809 second processor for the BBC microcomputer which runs the Flex disc operating system. A silicon disc is implemented for Flex within the 256 kbyte array of dynamic RAM that comprises the 6809 memory. Only a single disc drive is required to use the system to its full extent, thereby providing a low cost, yet powerful, route for 6809 project development. microsystems disc operating systems Flex BBC microcomputer Despite its proven value as a general purpose computing tool, the Acorn BBC microcomputer, in isolation, is less than ideal as a microprocessor development station, particularly in an educational environment. A Master series machine is equipped, as standard, with colour graphics, RS423 serial interface, four 10-bit A/D channels, disc interface and line printer port. However, the 6502, and its derivatives, is a poor model for illustrating microprocessor architecture and programming techniques. In addition, the BBC microcomputer has a chronic problem in terms of the memory available. Acorn provided the ability to communicate with an external microprocessor system via the Tube interface. When used with a coprocessor, the host BBC computer is treated simply as an I/O engine, in that all computation-intensive tasks are performed by the external processor leaving the BBC to handle all disc accesses, keyboard input and the VDU display[1]. This has three obvious effects • the second processor will not be constrained by memory • I/O is handled in a rapid manner by the host • software for a different microprocessor can be run. In the last of these effects, the user has access to programs developed for other operating systems. Tan and Sia2 have delineated a 6502-6800 interface, and it was decided to take this concept further by implementing a 6809 second processor card for the BBC microcomputer intended, specifically, to run the Flex disc operating system. Flex is a powerful and easy-to-use DOS, capable of being ported to different 6809 systems and is ideally suited to educational work. There is a wealth of support software available for Flex, including BASIC interpreters, PASCAL and c compilers, cross assemblers and text editors. The user is expected to write his own I/O handlers and append them to the core to form a new implementation of Flex. The required hardware drivers, once written, are linked into Flex by inserting their addresses into two fixed jump tables within Flex, after Flex has been loaded into memory. Flex is an extremely efficient operating system. It resides in 8 kbyte of RAM (from $C000-$DFFF) within the host system and will work quite happily with as little as 8 kbyte user RAM from the bottom of memory upwards. Ideally, 48 kbyte of RAM should be available (from $0000-$BFFF) to make best use of any Flex applications software. The area between $E000-$FFFF is invisible to Flex. Traditionally, this space is occupied by a machine code monitor and memory-mapped peripheral devices. It is not advisable to attempt to install Flex as firmware in the system; a bootstrap program which loads Flex from disc should be invoked. When formatted. Flex expects a disc to have track IDs in the range 0-39 with each track containing ten sectors numbered 1-10, whilst Acorn utilizes 0-9 as sector IDs on the BBC. This is not a hardware incompatibility problem, but simply a question of writing appropriate software for the 8271 (or 1770) floppy disc controller used in the BBC microcomputer. Early experiments involved writing disc access routines which showed that Flex format discs could be read from or written to properly. PRINCIPLE OF THE COMMUNICATIONS CHANNEL A block diagram of the two processor system is shown in Figure 1. All Flex I/O is performed via the BBC Tube parallel data transfer port, and it is the BBC which interfaces with the keyboard, screen display and disc drives etc and not the 6809 second processor. Two programs are needed to implement this resource sharing: one is resident on the BBC (written in 6502 assembly language) which interprets sequences of Flex I/O requests in terms of an action; and the other is 6809 machine code firmware on 'MPU09' (the second processor card) which forms the interface with Flex. Acorn's 'Tube' is simply the 2MHz 6502 data bus together with some address lines and control signals brought out to a 40 way IDC connector. A chip select line on the BBC goes active low for 6502 addresses in the range $FEEO-$FEFF, and the Tube simply appears as 32 consecutive memory addresses to the 6502. Additional hardware is required before the Tube can interface with an external system. Acorn developed a custom chip specifically for this purpose (called the Tube ULA) which operates as a bidirectional FIFO with tristate buffers. Figure 1. Overview of two processor system Figure 2. 'Tube' communications channel Figure 3. 'Tube' data transfer from host to 'MPU09'. H - BBC microcomputer 6821; S -second microprocessor 6821. 1 - 6502 writes data to PIA port B register if CRB.7 not set; 2 - on leading edge of Ø CB2 pulses low for one cycle; 3 - trailing edge of CB2 sets CA1 trigger on 6809 PIA; 4 - CR1 edge sets CBA.7 on 6809 side; 5 - 6809 polls CRA until bit 7 set, then reads port A; 6 - 6809 has accepted data to clear CRA.7; 7 - on next 6809 cycle CA2 pulses low; 8 - trailing edge of CA2 activates CB1 trigger on 6502 PIA; 9 - CB1 edge sets CRB.7 on 6502 side; 10 - 6502 polls CRB until bit 7 set, then reads port B (discard data); 11 - 6502 acknowledged transfer complete within CRB.7 clear. Two 68B21 PIAs connected 'back-to-back' comprise the data transfer link, so that the second processor can operate at 2 MHz (68B09). In this scheme, depicted in Figure 2, the 6502 and 6809 control two independent 68B21 PIAs which have their respective port A and port B lines cross-coupled as shown. By setting these devices up in 'pulsed handshake' mode during initialisation, single character I/O channels can be implemented. A typical data transfer sequence, the 6809 taking a byte from the 6502, is given in Figure 3. Flag bits are set in the relevant internal control registers of the 68B21s which are polled by the software to detect if the Tube interface requires service. Interrupts are not utilized on either side. For a data write operation from 'MPU09', an identical sequence occurs except that the second processor initiates the transfer. These dual simplex streams carry all console I/O in addition to disc based data. There is an obvious danger of not only losing synchronization between the two systems (for example, a 'hang-up' occurring as the 6809 and 6502 simultaneously expect a character to be input), but also of confusing the source/destination of any data. As the user enters information at the keyboard, each ASCII character is passed across the Tube and echoed back to the screen by Flex. Codes 0-127 are used for all terminal I/O, and Flex will execute 'MPU09' driver routines to implement the desired action after it has processed the command lines. A special command protocol then instructs the BBC that a particular function is to commence. A simple acknowledgement arrangement, shown in Figure 4, ensures that both systems will treat subsequent data bytes properly. Figure 4. Command protocol for 'MPU09' SYSTEM SPECIFICATION Although the 6809 has a maximum addressing space of 64 kbyte, it was envisaged that if 256 kbyte of memory was provided in the form of 8 X 4256 dynamic RAM chips, then a 'ramdisc' could be implemented, offering substantial performance improvements. Flex is very conservative with memory. All DOS commands are resident on the system disc (e.g., CAT.CMD, DELETE.CMD) and are 'pulled-down' as and when required. Any disc activity is very slow in relation to memory accesses and, therefore, is the prime source of operating delays. A 'ramdisc' is a sufficiently large area of memory to be treated as though it were an extremely fast disc. It is divided up into conceptual tracks and sectors and, to Flex, appears to be a normal floppy disc for reading and storage of information. Of course this 'silicon disc' will not preserve data in the absence of power - the user must transfer any files to be retained from 'ramdisc' to floppy disc before switching off. An access algorithm within the 'MPU09' firmware converts Flex disc sector IDs into absolute 18-bit addresses for the dynamic RAM array. The RAM is arranged as 195 X 1 kbyte pages, equivalent to 78 tracks of ten 256 byte sectors apiece. Flex reserves two jump tables for I/O vectors. There are ten disc drive routines required, which are executed via the appropriate pointer from a table at $DEOO. Since the table is part of the Flex kernel in RAM, it can be modified at run time. Many of these primary functions simply invoke the relevant BBC action by means of the command protocol discussed above. Flex inherently supports a maximum of four drives. Drive 0 is assumed to be the boot drive. After MPU09 has ensconced Flex in memory, it sets up this table so that Flex transfers control to a routine 'read' in EPROM whenever it wishes to access disc. Silicon disc is allocated as drive 3, a number it shares with the standard floppy disc drive. A flag is used in the 6809 software to determine whether any references to drive 3 appertain to 'ramdisc' or floppy disc. Manipulation of drive 3 selection is by means of 'RDISC', a custom Flex utility. The dynamic memory must be formatted as though it were a Flex disc. Flex stores and retrieves data from disc on the principle of a free sector chain. Basically, this means that the first two bytes in any sector serve as a 'link' identifier for the track/sector which contains the next sequential part of its constituent file. On a blank disc, a Flex format utility (which must be written as a custom program for non-standard hardware) will inscribe the various ID fields before creating directory and system information on track 0 and setting up free space on the disc by writing pointer bytes in every sector. During the initialisation phase, the 'ramdisc' is configured in this manner to create 78 'pseudo tracks' and an empty directory. Whenever a drive-3 request is intercepted in the disc drive handlers, the software must decide whether the conventional drive handlers or 'ramdisc' routines are executed. This selection is completely invisible to Flex. Before reading/writing any sector, tests proved that Flex always issues a 'set drive' directive. If the drive concerned is 3 and the user has enabled the 'ramdisc', then MPU09 will completely revise Flex's vector table to point to 'ramdisc' routines to implement a memory based action. Conversely, the 6809 firmware must restore this table for standard drive I/O requests. A reasonably efficient method for optimising this vector swapping was devised so that unnecessary time delays are not incurred on each call. After initialisation, standard Flex can be used to transfer any requisite file from magnetic media. Once enabled as 'ramdisc', drive 3 calls work as though an extremely fast disc unit were present. HARDWARE DESCRIPTION Figure 5 shows the second processor circuit, which can be disseminated into three distinct sections - CPU/clock generation, memory decoding and the dynamic RAM interface. An 8 MHz oscillator based around a 74HCU04 (IC1) generates the basic frequency for the CPU which also serves as the RAS strobe generator clock input for IC10 (the DP8409 dynamic RAM controller from National Semiconductor, RGCLK, pin 47). An external refresh clock is also required by this chip (RFCLK, pin 1). Figure 5. Schematic of second processor This defines the period of each refresh cycle. For most dynamic RAM chips, the refresh requirement is 128 rows (R0-R7) every 4ms, that is, one incremental refresh cycle every 15.6us. In this application, the DP8409 receives a 100 kHz clock signal from IC22, a 74HC4040 counter, arranged as 8us high : 2us low. This mark/space ratio was selected to improve the probability of the dynamic RAM controller being able to implement a hidden, or invisible refresh instead of an externally forced types A dynamic RAM controller was used primarily to reduce the chip count. Since a 256 kbyte bank is used, it replaces at least ten MSI chips which would be required for row/column address multiplexing, refresh count, gating logic and strobe signal derivation. There are a multitude of timing parameters associated with the dynamic RAM chips themselves3, which must be related to the operation of the DP8409 which, in turn, has to operate within the timing constraints of the 6809. The device has numerous operating modes4, but the only two used here are mode 1 (forced refresh) and mode 5 (hidden refresh). Pins M0, M1, M2 determine the mode of the dynamic RAM controller. If M2 is high, then the DP8409 will implement a hidden refresh cycle providing that the 6809 is accessing elsewhere (CE, pin 47, high) and RFCK is high4. Only one such hidden refresh cycle will occur during each RFCK period. Should the CPU be continuously selecting the dynamic RAM controller for the full 8us high portion of the RFCK waveform, then a hidden refresh will not be possible. Instead, a refresh request is issued to the 6809 via RFRQ, pin 46. This is synchronized with the falling edge of RFCK, and is connected to the DMA/BREQ pin on the processor. After finishing its current instruction, the 6809 will acknowledge the low condition on its pin 33 and release the address and data buses as signified by the status of BA and BS respectively. These two outputs are combined via IC4b to set M2 low and hence initiate a forced refresh cycle by the DP8409. From worst case estimates, four 6809 clock cycles are needed to guarantee completion of a forced refresh which gives rise to the 2us off-time of RFCK. This means that 16 normal cycles are available to perform a hidden refresh which is obviously preferred since there is no 6809 overhead. Once a convenient CPU interface has been implemented, the DP8409 makes the RAM bank appear as essentially static, each read/write cycle commencing with a low strobe on chip select (pin 47). A simplified timing diagram for dynamic RAM access is given in Figure 6. Only the lower 60 kbyte of RAM is available as program memory. Figure 7 gives details of the system memory map. A 'ramdisc' window (between $F000 and $F3FF) allows the 6809 to access the remaining 196kbyte of RAM as 1 kbyte pages. Before executing any CPU operations within this range, the appropriate page number is set by writing an 8-bit value to IC7, a 74HC373 octal latch. This appears as a single memory mapped write-only register at $F500. This latched value is used as the most significant eight address lines in any 'ramdisc' machine cycles. Figure 6. Dynamic RAM timing sequences: a, hidden refresh; b, forced refresh Eighteen address inputs are required by the DP8409 in the form of a 9-bit row address (R0-R8) and a corresponding column address (C0-C8). Two 74HC157 multiplexers, IC8 and IC9, route CPU address lines A10-A15 and the latched 'ramdisc' page number to column inputs C1-C8 respectively. In the former case, C7 and C8 will always be logic '0'. All other row/column signals to the dynamic RAM controller are connected directly to the 6809 bus. Any addresses outside the range $F000-$FFFF will disable IC5, a 74HC139 demultiplexer, via IC4a, a four input NAND gate (74HC20) and simultaneously select the dynamic RAM controller through IC2b. This gate, in addition, serves to enable 'ramdisc' memory accesses as straightforward MPU R/W, except that the multiplexer is 'toggled' for this address range of $F000-$F3FF. A 2716 EPROM contains the operating software with IC20 and IC21 comprising the communications interface as discussed above. Another PIA, IC24, is included for experimentation, the unit being powered by an external 5V DC source with a common ground required (see Figure 8). Figure 7. Second processor power supply Figure 8. Second processor memory map Table 1. BBC command codes for MPU09 system calls COMMAND PARAMETERS FUNCTION 80 CURSOR EDIT 81 " " 82 " " 83 " " 84 " " 85 " " 86 " " 87 " " 88 " " 89 " " 8A " " 8B " " 8C " " 8D " " 8E " " 8F " " 90 TRACK, SECTOR, DATA(256)> read disk sector 91 TRACK, SECTOR, DATA(256)< write disk sector 92 DRIVE NUMBER select drive 93 init drive 94 enable printer o/p 95 disable printer 96 enable vdu 97 disable screen 98 enable RS423 o/p 99 disable RS423 o/p 9A CHANNEL, SOUND GEN LIST generate sound 9B VDU CODE, VDU LIST vdu driver 9C CHANNEL, A/D> (MSB) read a/d value 9D STATUS> (NZ=CHAR READY) check keyboard status 9E STATUS> (NZ=CHAR READY) get RS4213 i/p status 9F STATUS> (NZ=BUF EMPTY) check RS423 o/p status A0 OFFSET, BYTE> read one byte from FRED A1 OFFSET, BYTE< write one byte to FRED A2 OFFSET, BYTE< read one byte from JIM A3 OFFSET, BYTE> write one byte to JIM A4 OFFSET, BYTE< read one byte from SHEILA A5 OFFSET, BYTE> write one byte to SHEILA A6 abort FLEX (not used) A7 MSGDIR=6809 to BBC A8 MSGDIR=BBC to 6809 A9 DISK ERROR CODE> request disk error info AA WP STATUS> ($B=WR PROT) request disk WP status AB ADDR(H,L), CNT(H,L), DATA transfer data to BBC memory AC enable RS423 i/p AD disable RS423 i/p AE BAUD RATE CODE set RS423 baud rate (I/O) AF NO. OF TRACKS format blank disk B0 A REG, X REG, Y REG perform OSBYTE call B1 user defined function NOTES 1. > direction of byte is BBC to 6809 2. < " " " " 6809 to BBC 3. Unless showm, parameter byte direction is '<' 4. Command $AB expects 'CNT' bytes from 6809 5. Unless show, parameters as per BBC MOS *FX calls Figure 9. Simplified flowchart of BBC software No error detection and correction is employed within the second processor memory. This was a conscious decision to reduce parts count. SYSTEM SOFTWARE Having decided that the coprocessor software must exist as a directly executable object code, the program was written in 6502 assembly language as a suitable language for handling the low-level routines involved, such as 'c', was not available. A simplified flowchart for the BBC software is given in Figure 9. After initialising the computer and Tube PIA, it merely has to check for console input using the MOS keyboard buffer or 6809 characters pending at the Tube. In the latter case, any simple ASCII characters are echoed to the screen whilst any valid command byte detected despatches control to the relevant routine via a jump table. Where possible, all I/O requests from Flex are interpreted as MOS calls. As stated, an acknowledgement sequence must take place both at the start and termination of any 'special operation' which must share the same data highway as console I/O. Codes 128-255 (non-ASCII) are reserved for initiating any of the functions catered for within the 6502 software as given in Table 1. As an example, if Flex wishes to read the contents of a disc sector, it would first issue command code $90 via the Tube. The BBC software acknowledges this byte and then expects Flex to send (via MPU09 firmware) the sector and track numbers. It is implicit that the correct number of subsequent parameter bytes will be expected by both systems, so that MPU09 will wait for the 256 byte to be read from disc, accept these data via the communications link, and pass to Flex for use. In the table, '<' indicates 6809 to 6502 and vice versa. To install the SBC software the user simply loads and runs the machine code on disc ('*:1.BBC6809' if BBC format disc is in drive 1) which initialises the machine and checks that the second processor is attached. Since MPU09 has its software in EPROM, no further action is required to start Flex. Booting Flex initially involves loading the contents of sector 0/1 (track 0, sector 1) of the disc in drive 0. If bytes 5,6 of this sector are now anything other than 00,01, the disc is assumed to have been set as a system disc by a previous Flex 'Link' command, in this case, the two data bytes specify a disc address where the first sector of Flex9.SYS (usually) can be found. This sector is now loaded from disc, and the linkage bytes used as the address for the next disc sector. Flex employs a simple binary file structure which embeds load/transfer addresses within the data bytes. This information is used to fetch Flex9.SYS, as a series of machine code blocks from disc, with each section then placed at the correct starting memory location. After loading 'MPU09' must set up the I/O tables, as explained above, before transferring control to Flex proper at the last transfer address obtained from the file. Apart from booting Flex from disc and providing all the exigent Flex I/O routines, the 6809 firmware only contains hardware initialisation and 'ramdisc' access procedures. To facilitate Flex system calls, a set of entry points are provided as jump statements at the start of the EPROM. These constitute fixed addresses so that, should the software ever have to be reassembled, no alteration will be needed in any program that invokes these routines. SUMMARY A 6809 second processor for the BBC microcomputer has been described which offers an inexpensive route for 6809 development. There are strong arguments for maintaining that Flex and the 6809 provide the most logical and lucid base for learning about microprocessors. In fact, where BBC computers are already available, adding the second processor need only involve an outlay of about £250, including enclosure, power supply and the single disc drive that is required as a minimum. One advantage of this two-fold computer scheme is that the programmer gains access to languages normally unobtainable for the BBC microcomputer, such as C, COBOL or micro PROLOG, that can be bought at very reasonable cost for Flex. Conversely, the BBC comes into its own for wordprocessing or spreadsheet applications. REFERENCES 1. James, M 'BBC second processor' Electronics and Computing Monthly (March 1984) 2. Tan, B T G and Sia, L C '6800 coprocessor for a 6502 bus' Microprocessors Microsyst. Vol 10 No 5 (1986) pp 278-281 3. Clements, A 'Designing with dynamic memory' Electronics Wireless World (August 1986) 4. Wilson, R '10 MHz dynamic RAM controller' Electronic Eng. (May 1985) Huw Jones graduated from Swansea University in 1979 with a first class honours degree in electrical engineering and received an MSc from the University of Wales in 1984. In 1985 he joined the Electrical Engineering department of the Polytechnic of Wales where he is a Senior Lecturer. His research interests include semicustom chip design methodologies and the application of high-level languages to realtime digital signal processing. 0141-9331/89/06396-07 $03.00 (c) 1989 Butterworth & Co. (Publishers) Ltd Microprocessors and Microsystems Vol 13 No 6 July/August 1989 P396-402 Department of Electrical and Electronic Engineering, Polytechnic of Wales, Pontypridd, Mid Glamorgan CF37 1DL, UK Paper received: 17 March :1988. Revised: 11 May 1988