Microware's RT/68MX Real Time OS for the Motorola 6800 (1977).
RT68mx is a real time OS by Microware. Microware has been kind enough to allow us to make the code available. It's a very interesting OS as it's quite small, about 1K in size, has very little overhead using 128 bytes of RAM for the OS. The rest is for programs/applications/processes.
RT68mx can handle 8 processes.
I grew up working with systems such as SWTPC and operating systems such as TSC FLEX, Microware's OS-9 and RT/68MX. It was a fun and interesting time. While today we have much more resources and better tools the past wasn't all that bad. Things were a lot more manual but the learning experience was what helped us to build what we have today.
RT/68MX, RT/Edit and A/BASIC are software packages from Microware Systems Corporation, Copyright 1977. This package is an interesting environment in that it's designed to run on the embedded board and with a cheap cassette recorder. Since we're in computers, it's called a cassette drive. No matter what it's called it was a common and inexpensive, from $40-$100. Compared to a floppy drive which cost many times more, you just needed to learn to deal with the cassettes. But you have a development environment that reduced the cost significantly.
These pages and files will attempt to put all the files and documents together so as to demonstrate what this development env was like. It is a much different development environment thatn we have today. But it was exciting to be pioneers. And it is an understatement to say that it's amazing to look back and see what we accomplished.
This version of RT68mx source code has been modified to specifically assemble properly with the asl macro assembler (links below). I've also taken the liberty to clean up and reformat the source. Sorry I understand why it was done but I've always hated the way the source code looked.
RT/68 provides three modes which are mutually exclusive: Console Monitor to load, save and debug programs; Single Task Mode to execute existing Mikbug(TM) software without modification; and Multi-Task Mode which is the real time multiprogramming mode.
This file is just the rt68mx.asm modified to work on the 68Retro board. I have the ACIA at $E000, the PIA at $8004 and the ROM from $E000-$FFFF ($E100-$E1FF are for IO). Initial testing suggets this version works. I don't have the cassette tape interface built yet.
A/BASIC is a basic compiler for use with RT68mx. The compiled code can be run as a process under RT68mx. The compiler itself runs as a process.
This is a work in progress. Currently there appear to be a few different 'ABASIC's. One is the ABASIC/RTEDIT that belongs with RT/68MX. This doesn't run under an operating system like FLEX or OS-9 but rather RT/68MX and is loaded, compiles and saves to tape. This version can run mulit-task or single task. We currently have an rtbasic-10c.s19 file (A/BASIC) from the manual. We're working to disassemble the code and will post that here. Then there is a modified version that runs under 6800 FLEX. This version is single task only. Then there appears to be another that I don't have details for yet.
The code in the ABASIC-FLEX directory is the 6800(?) FLEX version.
I'll update this as I get things sorted out better.
RTEDIT is an editor that runs under RT68mx that can be used to edit the A/BASIC code.
This is a work in progress. There are some files under the FuFu Flex collection which we think is a modified version to work under Flex. We do have a file: rtedit.s19, which we are in the process if disassembling. We will post the results here.
This version of 6800 mikbug source code has been modified to specifically assemble properly with the asl macro assembler. Sorry I understand why it was done but I've always hated the way the source code looked.
MIKBUG is a ROM monitor from Motorola for the Motorola 6800 8-bit microprocessor. It is intended to "be used to debug and evaluate a user's program".[1]
MIKBUG was distributed by Motorola in 1974[2] on a 1 K ROM chip part number MCM6830L7. It occupied 512 bytes on the chip, where the remainder was occupied by a 256 byte MINIBUG monitor—a stripped-down version of MIKBUG—and a 256 byte "test pattern" (really just a different and unused revision of MINIBUG). It requires 128 bytes of random-access memory for operation. Its functionality was similar to other monitors of the early microcomputer era, such as the Intel MON-80 for the Intel 8080.
MIKBUG is initiated when power is first applied to the system, or when the system RESET button is pressed. It assumes the presence of a terminal that the user will use to issue commands.
List of commands and functions
Command | Function |
---|---|
L | Load a program from a paper tape reader on the attached terminal. The program tapes may be a "formatted binary object tapes or MIKBUG punched memory dump tapes". |
M | Examine or change memory contents. |
P | Print and/or punch memory contents. The user stores the beginning address in locations A002h and A003h, and the ending address in A004h and A005h before entering this command. The data is punched in absolute binary format. |
R | Display the contents of the CPU registers. |
A | Change the contents of a register. |
G | Run a user's program. |
Callable functions include input and output of a character on the terminal, input and output of a byte in hexadecimal format, print a string terminated by EOT, and terminate the current program and return control to MIKBUG.
MIKBUG allows the user to install an interrupt handler using the M command to specify the handler address.
Range | Function |
---|---|
FFFE-FFFF | Restart Vectors |
FF80-FFFd | ? |
FF00-FF7F | RAM (6810) |
FE00-FEFF | Minibug |
FCF6-FDFF | ? |
FCF4-FCF5 | UART |
L M R P G
E000-E1FF - Minibug ???
The beginning of the monitor ROM consists of a jump table to common routines further into the ROM.
RETURN EQU $C000 RETURN TO PROMPT
OUTCHAR EQU $C003 OUTPUT CHAR ON CONSOLE
INCHAR EQU $C006 INPUT CHAR FROM CONSOLE AND ECHO
PDATA EQU $C009 PRINT TEXT STRING @ X ENDED BY $04
OUTHR EQU $C00C PRINT RIGHT HEX CHAR @ X
OUTHL EQU $C00F PRINT LEFT HEX CHAR @ X
OUT2HS EQU $C012 PRINT 2 HEX CHARS @ X
OUT4HS EQU $C015 PRINT 4 HEX CHARS @ X
INHEX EQU $C018 INPUT 1 HEX CHAR TO A. CARRY SET = OK
INBYTE EQU $C01B INPUT 1 BYTE TO A. CARRY SET = OK
BADDR EQU $C01E INPUT ADDRESS TO X. CARRY SET = OK
https://www.waveguide.se/?article=mc3-monitor-11
Vector table The monitor sets up a vector table in RAM for access to various routines. Each vector consists of three bytes. A jump ($7E) and then the address to the routine. This allows software to use different routines for these functions.
CONSVEC EQU $7FE5 CONSOLE STATUS VECTOR
CONOVEC EQU $7FE8 CONSOLE OUTPUT VECTOR
CONIVEC EQU $7FEB CONSOLE INPUT VECTOR
TMOFVEC EQU $7FEE TIMER OVER FLOW INTERUPT VECTOR
TMOCVEC EQU $7FF1 TIMER OUTPUT COMPARE INTERUPT VECTOR
TMICVEC EQU $7FF4 TIMER INPUT CAPTURE INTERUPT VECTOR
IRQVEC EQU $7FF7 IRQ INTERUPT VECTOR
SWIVEC EQU $7FFA SWI INTERUPT VECTOR
NMIVEC EQU $7FFD NMI INTERUPT VECTOR
The interrupt vectors are a mirror of the CPU vectors. After initialization these all points to an RTI that effectively disables the interrupt. One exception is the SWI vector that points to a stack printout and then back to the monitor prompt. Pressing 'G' will continue execution after an SWI. The three vectors for handling the console I/O are CONSVEC, CONOVEC and CONIVEC. Think of them as stdin and stdout in the Unix world. They point to the routines for the console interface and can be changed and redirected for other output or input.
Command | Function |
---|---|
CONSVEC | Status vector. Returns the number of characters in buffer in A-acc. |
CONIVEC | Input vector. Returns a character in A-acc. |
CONOVEC | Output vector. Sends a character in A-acc. |
Jump table The beginning of the monitor ROM consists of a jump table to common routines further into the ROM.
RETURN EQU $C000 RETURN TO PROMPT
OUTCHAR EQU $C003 OUTPUT CHAR ON CONSOLE
INCHAR EQU $C006 INPUT CHAR FROM CONSOLE AND ECHO
PDATA EQU $C009 PRINT TEXT STRING @ X ENDED BY $04
OUTHR EQU $C00C PRINT RIGHT HEX CHAR @ X
OUTHL EQU $C00F PRINT LEFT HEX CHAR @ X
OUT2HS EQU $C012 PRINT 2 HEX CHARS @ X
OUT4HS EQU $C015 PRINT 4 HEX CHARS @ X
INHEX EQU $C018 INPUT 1 HEX CHAR TO A. CARRY SET = OK
INBYTE EQU $C01B INPUT 1 BYTE TO A. CARRY SET = OK
BADDR EQU $C01E INPUT ADDRESS TO X. CARRY SET = OK
The reason for using a jump table is that the contents of the monitor ROM can be altered without affecting these addresses meaning that programs utilizing these routines will not have to be changed.
I'll be using the MP-02 from https://github.com/crsjones/68Retro . I ordered up some boards from JLCPCB and I'm building those. I also have Corsham SS50 6800 board, which I'll build later. I would expect this code to also work with real SWTPC 6800 processor boards and Motorola MEK6800D2 (with some mods). Fredric Brown of Peripheral Technology also has 6800 boards that should work: https://peripheraltech.com/SWTPC%20Reprodution.htm
Device | Description |
---|---|
RAM | $0000 at least 128 bytes, $A000 |
ROM | $E000 or $FC00 (2764) |
ACIA | $8000-8001 (where FLEX expects it) |
PIA | $8004-8007 |
Start | End | |
---|---|---|
E400 | FFFF | Images of RT/68 ROM due to |
partial address decoding | ||
to allow access to interrupt | ||
vector addresses | ||
E000 | E3FF | RT/68 Program (ROM) |
A080 | DFFF | Not used - available for |
RAM, ROM or I/O | ||
A000 | A07F | Operating system RAM: |
A000-A013 = Monitor temp RAM | ||
A014-A04F = Stack | ||
A050-A07F = Status table (not | ||
used in single tasking mode) | ||
8004 | 8007 | PIA (control or console) |
8000 | 8001 | ACIA (console, optional) |
000C | 7FFF | Avail. For RAM, ROM or I/O |
0000 | 000B | RT/68 multiprogramming exec. |
temp. (multi-task mode only) |
There are several points a program or rask may jump to to enter various system modes or functions.
Description | Addr | Label | Addr |
---|---|---|---|
Console/System cold start | E147 | INIT | FD47 |
Console monitor soft start/reentry | E16A | CONENT | FD6A |
or ... | E0E3 | CONTRL | FCE3 |
Console monitor error entry | E1E8 | ERTEST | FDE8 |
RT Exec cold start | E20C | SYSCOM | FE0C |
RT Exec warm start | E2F3 | EXEC03 | FEF3 |
3.1 Console Driver Routine Descriptions
A small portion of the 8K space where FLEX resides has been set aside for the Console Drivers. This area begins at $B390 and runs through $B3E4. If the user's driver routines do not fit in this space, the overflow will have to be placed somewhere outside the 8K FLEX area. To inform FLEX where each routine begins, there is a table of addresses located between $B3E5 and $B3FC. This table has 12 two-byte entries, each entry being the address of a particular routine in the Console I/O Driver package. It should look something like this:
* CONSOLE I/O DRIVER VECTOR TABLE
ORG $B3E5 TABLE STARTS AT $B3E5
INCHNE FDB XXXXX INPUT CHARACTER W/O ECHO
IHNDLR FDB XXXXX IRQ INTERRUPT HANDLER
SWIVEC FDB XXXXX SWI VECTOR LOCATION
IRQVEC FDB XXXXX IRQ VECTOR LOCATION
TMOFF FDB XXXXX TIMER OFF ROUTINE
TMON FDB XXXXX TIMER ON ROUTINE
TMINT FDB XXXXX TIMER INITIALIZATION
MONITR FDB XXXXX MONITOR ENTRY ADDRESS
TINIT FDB XXXXX TERMINAL INITIALIZATION
STAT FDB XXXXX CHECK TERMINAL STATUS
OUTCH FDB XXXXX OUTPUT CHARACTER
INCH FDB XXXXX INPUT CHARACTER W/ ECHO
Entry points?
"ACIAIN": "FF84",
"ACOUT": "FFC0",
"BOUT": "FCCE",
"CHKSTB": "FF78",
"CMSRCH": "FD81",
"IN1CHR": "FF50",
"INBYTE": "FF59",
"INCH": "FC78",
"INEEE": "FDAC",
"INHEX": "FCAA",
"INIT": "FD47",
"INTBAD": "FE95",
"INTRET": "FF2B",
"JOUT1C": "FD09",
"OUT1CH": "FFA6",
"OUT2H": "FCBF",
"OUT2HS": "FCCA",
"OUT4HS": "FCC8",
"OUTCH": "FC75",
"OUTEEE": "FDD1",
"OUTHL": "FC67",
"OUTHR": "FC6B",
"OUTLDR": "FCF4",
"OUTS": "FCCC",
"PIAIN": "FF5E",
"PIAIN2": "FF6D",
"POUT1": "FFB5",
"RNINT2": "FED4",
"RNINT3": "FED6",
"RUNINT": "FECB",
"SINT": "FE80",
"TAPOUT": "FCEE",
The addresses of the RT/68 ROM range from E000 to E3FF. However, the restart and interrupt vectors are also contained in the ROM so it must be able to respond to all addresses
MCM6830 is not a 27xx compatible chip
CPU | ROM | Notes |
---|---|---|
A0 - A9 | A0 - A9 | |
Ph2 | CS0 | Ph2 == E |
R/-W | CS1 | |
A15 | CS2 | |
A13+A14 | CS3 |
from E000 - FFFF. This menas that address lines A10 through A12 can not be decoded. A circuit that will accomplish this is illustrated above.
If full decode is desired, a separate PROM that has the correct interrupt vectors included can be placed at the top of memory. The vector data is found on the last page of the source listing.
Any circuit that accepts the MC6830L7-L8 Mikbug(TM) ROM will properly decode the addresses for the RT/68 ROM.
The circuits on the following pages give example configurations for several option features. The abort switch may be connected to the control terminal PIA input CA2. The switch circuit must have a normally low, debounced function. If this feature is not used, ground the CA2 pin.
Two circuits are shown that can provide a stable, precise clock signal for the RT/68 multitask executive, This is also an optional feature. Both circuits cost less than a dollar or so to construct and are extremely simple, but provide an accurate reference signal. This clock signal should be in the range if 10 to 100 Hz for optimum operation.
The MP02 clone isn't built like the MEK6800 so there is no adding the RT68MX ROM and modifying the board. Instead the actually RT68MX ROM is modified to be the only ROM in the system. Future version will be further modified so that all the ROM fits in $F000-$FFFF.
Addr | Description |
---|---|
0000 | RT68MX Real Time OS variables |
A000 | RT68MX Monitor and stack |
E000 | Start of ROM code |
F000 | ACIA ($F000-02) and PIA ($F004-08) |
FFF8 | Interupt vectors for RT68MX ROM |
I'm experimenting with the RT68MX code but keeping the entry points so existing code (RT/EDIT & A/BASIC) works. I don't have a tape interface, so that's next.
Date | Description |
---|---|
20240503 | Well I'll be ... it works. I was able to load the existing original rtedit-10c.s19, commands work, I added a few lines of BASIC, LIST, SAVE (to the console) and return to RT68MX. |
asl -cpu 6800 -D ROMORIG -L rt68-mp02.asm # assemble
p2hex +5 -F Moto -r \$-\$ rt68-mp02.p rt68mx-t.s19 # convert to s19
srec_cat rt68mx-t.s19 -o rt68mx-mp02.s19 # cleanup s19
#memsim2 rt68mx-mp02.s19 # Memory EPROM simulator hardware
I don't have a full understanding of the mods need for RT68MX, RT/Edit and A/BASIC to work with the cassette yet. But I do have the S19 files modifications to support the Motorola MEK6800D2. Both abasic-d2.s19 and rtedit-d2.s19 have those modifications.
I've currently added an IFDEF to allow the RT/68MX to be compiled at $FC00 which should allow us to avoid the cutting and bodging of the address lines.
File | Description |
---|---|
abasic-10c.s19 | |
abasic-d2.s19 | Modified S19 code to support MEK6800D2 and dual cassettes |
abasic.asm | A/BASIC Disassembly (WIP) |
ABASIC-FLEX | Dir |
abasic.info | f9dasm info file |
docs | Dir |
LICENSE | |
Makefile | |
mikbug.asm | |
minibug.asm | |
README.md | |
rt68mx.asm | RT68mx 6800 asm source |
rt68mx.inc | |
docs/RT68MX-Manual.pdf | RT68MX Manual |
rtbasic-10c.s19 | |
rtedit-10c.s19 | |
rtedit-d2.s19 | Modified S19 code to support MEK6800D2 and dual cassettes |
rtedit.asm | RTEdit disaeembly |
rtedit.info | f9dasm info file |
rtedit.s | |
rtedit.s19 | |
s0.sh | Shell script to create S0 record |
src | Safe place for original source and sample files |
src/rt68mx.s | Code that closely matches the original S19 file in the RT68MX Manual |
src/rt68mx-s.lst | Listing generated by ASL |
- FuFu mail list - mailto:fufu-subscribe@flexusergroup.com
- http://www.swtpcemu.com/swtpc/Downloads.htm
- http://www.flexusergroup.com:8080/
- AS (I call it ASL) - http://john.ccac.rwth-aachen.de:8000/as/
- Microware, creaters of RT68mx & OS9.
- Stanley Ruppert
- Michael Evenson