Mercurial > hg > Members > kono > os9 > sbc09
diff doc/origin/sbc09.tex @ 57:2088fd998865
sbc09 directry clean up
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 23 Jul 2018 16:07:12 +0900 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/doc/origin/sbc09.tex Mon Jul 23 16:07:12 2018 +0900 @@ -0,0 +1,874 @@ +\documentstyle[12pt,a4wide]{report} +\title{SBC09, an Emulator for a 6809-Based Single Board Compuer.} +\author{L.C. Benschop} +\begin{document} +\def\SetFigFont#1#2#3{\rm} + +\maketitle +\tableofcontents +\chapter{Introduction} + +The {\tt sbc09} package contains an emulator of a 6809-based single board +computer that runs under UNIX. It contains all the programs needed to work +with the emulator, such as the emulator itself, an assembler, a monitor +program, a BASIC interpreter, a Forth interpreter, several example programs +and several tools needed to build the programs. The program should work +under most more-or-less POSIX-compliant versions of UNIX and they were +developed under Linux. Of course I believe that the programs that currently +run on the emulator would also run on a real 6809 machine. + +\section{A Bit of Background on SBCs.} + +In the seventies you could buy single board microcomputers that had a +hexadecimal keypad and 7-segment displays. These computers typically had +less than 1 kilobyte of RAM and a simple monitor program in ROM. An +interface to a cassette recorder (or paper tape reader/writer) and a +terminal was possible, but not standard. The typical way to program the +machine was entering hexadecimal machine codes on the keypad. Machine code +was the only language in which you could program them, especially if you +only had a hexadecimal keypad and 7-segment led displays. You typically used +these machines to experiment with hardware interfacing, as games and +calculations were a bit limited with only six 7-sengment digits. + +Next came simple home computers, like the TRS80, the Apple ][ and the +Commodore PET. These machines had BASIC in ROM and they used a simple +cassette recorder to store data. These computers had a TV or a low quality +monitor as display and a QWERTY keyboard. These machines could be upgraded +with a floppy disk drive and a printer and then they could be used for +professional work. These machines had 4 to 64 kilobyts of memory. +Apart from assembly language you could use BASIC, Forth +and sometimes Pascal to program these machines. Most useful programs (and +the best games) were programmed in assembly language. Many of these machines +had BASIC in ROM and no machine code monitor. You had to load that +separately. + +Today we have personal computers that run DOS, Windows, UNIX or something +else. New computers have 4 to 16 megabytes of RAM and hard disks of more +than 500 Megabytes. Apart from having in the order of 1000 times more +storage, they are also 1000 times faster than the old 8-bit home computers. +Programming? You can use Visual BASIC, C++ and about +every other programming language on the planet. But programs have become +bigger and bigger. Programming is not the same as it was before. + +I guess there is some demand for small 8-bit computer systems that are simple +to build, easy to interface to all kinds of hobby projects, fun to program +and small enough to integrate into a home-built project. +Do we want to use hexadecimal keyboards and 7-segment displays? I guess not +many people want to use them. Do we want to use a cassette recorder for data +storage and a TV as a display? Not me. And if you build your own 8-bit +microprocessor, do you want to waste your time and money on a hexadecimal +keypad or a cassette interface that you do not like to use and that you do +not need anyway? PCs of five years ago are more than adequate to run an +editor, a terminal program and a cross assembler for your favourite 8-bit +processor. The terminal program can then be used to send the programs to the +8-bit micro. +If you equip an 8-bit system with some static CMOS RAM, a serial +interface and a monitor in ROM, you can use the keyboard, hard disk and +monitor of your PC for program development and the 8-bit micro can be +disconnected from the PC and do its task, once it is programmed. + +Cross development is nothing special. How do you think the microprocessor in +you microwave was programmed? But it is not practical for a hobbyist to +program an EPROM for each program change. Professional developers of +embedded processors have expensive tools, like ROM emulators, processor +emulators etc. to see what the processor is doing on its way to the next +crash. For a hobbyist it is much more practical to have a slightly more +expensive embedded computer that you can run an interactive debugger on. +And you are not even limited to assembly language. If you have 32k ROM you +can have both the monitor program and a BASIC interpreter and some +aplication code in ROM. Nothing prevents you from having Forth as well. + +\section{The Emulated System.} + +\begin{figure} +\input{sbc09fig.tex} +\caption{Block Diagram of SBC.} +\end{figure} + +The program {\tt sbc09} emulates the abovementioned single board computer +{\em plus} the terminal program that communicates with it. + +\chapter{Building the Programs.} + +\chapter{The 6809 Assembler {\tt a09}.} + +The assembler is a09. Run it with +\begin{verbatim} + a09 [-l listing] [-o object|-s object] source +\end{verbatim} + +Source is a mandatory argument. The -l listing and {\tt -o} or {\tt -s} + object arguments are +optional. By default there is no listing and the object file is the +sourcefile name without an extension and if the source file name has no +extension it is the source file name with {\tt .b} extension. + +A09 recognizes standard 6809 mnemonics. Labels should start in the first +column and may or may not be terminated by a colon. Every line starting with +a non-alphanumeric is taken to be a comment line. Everything after the +operand field is taken to be comment. There is a full expression evaluator +with C-style operators (and Motorola style number bases). + +There are the usual pseudo-ops such as ORG EQU SET SETDP RMB FCB FDB FCC etc. +Strings within double quotes may be mixed with numbers on FCB lines. There +is conditional assembly with IF/ELSE/ENDIF and there is INCLUDE. The +assembler is case-insensitive. + +The object file is either a binary image file (-o) or Motorola S-records (-s). +In the former case it contains a binary image of the assembled data starting +at the first address where something is assembled. In the following case +\begin{verbatim} + ORG 0 +VAR1 RMB 2 +VAR2 RMB 2 + + ORG $100 +START LDS #$400 + ... +\end{verbatim} + +the RMB statements generate no data so the object file contains the memory +image from address \$100. + +The list file contains no pretty lay-out and no pagination. It is assumed +that utilities (Unix pr or enscript) are available for that. + +There are no macros and no linkable modules yet. Some provisions are taken +for it in the code. + +After the assembler has finished, it prints the number of pass 2 errors. +This should be zero. So if you see +\begin{verbatim} + 0 Pass 2 Errors. +\end{verbatim} +then you are lucky. + +\chapter{The Virtual SBC {\tt v09}.} + +The simulator is v09. Run it with +\begin{verbatim} + v09 [-t tracefile [-tl tracelo] [-th tracehi]] [-e escchar] +\end{verbatim} + +{\tt tracelo} and {\tt tracehi} are addresses. They can be entered in +decimal, octal or hex using the C conventions for number input. + +If a tracefile is specified, all instructions at addresses between +{\tt tracelo} and {\tt tracehi} are traced. Tracing information such as program +location, register contents and opcodes are written to the trace file. + +{\tt escchar} is the escape character. It must be entered as a number. This is +the character that you must type to get the v09 prompt. This is control-] +by default. (0x1d) + +The program loads its ROM image from the file {\tt v09.rom}, which is a 32 +kiliobyte binary file. This file should have been generated by the {\tt +Makefile}. The program starts executing at the address found at \$FFFE in +the ROM, just like a real 6809 would do on reset. + +The address map is as follows. +\begin{description} +\item[\$0000--\$7FFF] RAM. +\item[\$8000--\$FFFF] ROM (except the I/O addresses). These addresses are +write-protected. +\item[\$E000--\$E0FF] I/O addresses. Currently only one ACIA is mapped. +\end{description} + +At addresses \$E000 and \$E001 there is an emulated serial port (ACIA). All +bytes sent to it (or read from it) are send to (read from) the terminal and +sometimes to/from a file. +Terminal I/O is in raw mode. + +If you press the escape char, you get the v09 prompt. At the prompt you +can enter the following things. +\begin{description} +\item[X] to exit the simulator. +\item[R] to reset the emulated 6809 (very useful). +\item[Lfilename] (no space in between) to log terminal output to a file. + Control chars and cr are filtered to make the output a normal + text file. L without a file name stops logging. +\item[Sfilename] to send a specified file to the simulator through its terminal + input. LF is converted to CR to mimic raw terminal input. +\item[Ufilename] (terminal upload command) to send a file to the 6809 using the + X-modem protocol. The 6809 must already run an X-modem receiving + program. +\item[Dfilename] (terminal download command) to receive a file from the 6809 using + the X-modem protocol. The 6809 must already run an X-modem + sending program. +\end{description} +All of these commands, except the R command, can be seen as commands of the +communication program that is used to access the single board computer. +The R command is a subsitute for pushing the RESET button on the emulated +computer. + +\chapter{Machine Language Monitor.} + +The program {\tt monitor.asm} is a program that is intended to be included +in the ROM of a 6809 based single board computer. The program allows a user +to communicate with the single board computer through a serial port. It +allows a user to enter machine code, examine memory and registers, to set +breakpoints, to trace a program and more. Furthermore, data can be sent to +and be received from the single board computer through the X-MODEM protocol. + +\subsection{Getting Started.} + +If you start v09 with the standard ROM, then you will run the monitor +program. +If all goes well you see something like +\begin{verbatim} +Welcome to BUGGY 1.0 +\end{verbatim} +and you can type text. Excellent, you are now running 6809 code. + +The following example programs you can run from the 6809 monitor. +All of them start at address \$400. For example to run the program bin2dec +you type. + +XL400 + +Then press your escape character (default is control-] ). + +Then at the v09 prompt type + +ubin2dec + +Now you see some lines displaying the progress of the X-modem session. +If that is finished, you type + +G400 + +Now it runs and exits to the monitor with SWI, so that the registers are +displayed. + +\begin{description} +\item[cond09.asm] +\item[cond09.inc] Nonsense program to show conditional assembly and the like. + +\item[bench09.asm] Benchmark program. Executes tight loop. Takes 83 secs on + 25 MHz 386. Should take about 8 sec. on 1MHz real 6809. :-( + +\item[test09.asm] Tests some nasty features of the 6809. Prints a few lines + of PASSED nn and should never print ERROR nn. + +\item[bin2dec.asm] Unusual way to convert numbers to decimal using DAA instruction. + Prints some test numbers. + +\item[basic.asm] Tiny BASIC by John Byrns. Docs are in basic.doc. + To test it start the monitor and run basic. + + Then press your escape char. + At the v09 prompt type: sexampl.bas + + Now a BASIC program is input. + Type RUN to run it. + + Leave BASIC by pressing the escape char and entering x at the + prompt. +\end{description} + + +\section{Use of the monitor commands} + + +\subsection{Single Letter Commands} + +\begin{description} +\item[D] Dump memory. + +Syntax: +\begin{description} +\item[Daddr,len] Hex/ascii dump of memory region. +\item[Daddr] length=64 bytes by default. +\item[D] address is address after previous dump by default. +\end{description} + +Examples: +\begin{verbatim} +DE400,100 +\end{verbatim} +Dump 256 bytes starting at \$E400 +\begin{verbatim} +D +\end{verbatim} +Dump the next 64 bytes. + +\item[E] Enter data into memory, + +\begin{description} +\item[Eaddr bytes] Enter hexadecimal bytes at address. +\item[Eaddr"ascii"] Enter ascii at address. +\item[Eaddr] Enter interactively at address (until empty line). +\end{description} + +Examples: +\begin{verbatim} +E0400 86449D033F +\end{verbatim} +Enter the bytes 86 44 9D 03 3F at address \$400. +\begin{verbatim} +E5000"Welcome" +\end{verbatim} +Enter the ASCII codes of "Welcome" at address \$400. + +\item[F] Find string in memory. + +Syntax: +\begin{description} +\item[Faddr bytes] Find byte string string from address. +\item[Faddr"ascii"] Find ASCII string. +\end{description} + +Find the specified string in memory, starting at the specified address. The +I/O addresses \$E000-\$E0FF are skipped. The addresses of the first 16 +occurrences are shown. + +Example: +\begin{verbatim} +FE400"SEX" +\end{verbatim} +Search for the word "SEX" starting in the monitor. + +\item[M] Move memory region. + +\begin{description} +\item[Maddr1,addr2,len] Move region of memory from addr1 to addr2. If addr2 is + 1 higher than addr1, a region is filled. +\end{description} + +Example: +\begin{verbatim} + M400,500,80 +\end{verbatim} +Move 128 bytes from address \$400 to \$500. + +\item[A] Assemble instructions. + +Syntax: +\begin{description} +\item[Aaddr] Enter line-by-line assembler. +\end{description} + +You are in the assembler until you make an error or until you enter an empty +line. + +Example: +\begin{verbatim} +A400 +LDB #$4B +JSR $03 +SWI +<empty line> +\end{verbatim} + +\item[U] Disassemble instructions. + +Syntax: +\begin{description} +\item[Uaddr,len] Disassemble memory region. +\item[Uaddr] (disassemble 21 bytes) +\item[U] +\end{description} + +Examples: +\begin{verbatim} +UE400,20 +\end{verbatim} +Diassemble first 32 bytes of monitor program. +\begin{verbatim} +U +\end{verbatim} +Disassemble next 21 bytes. + +\item[B] Set, clear and show breakpoints. + +Syntax: +\begin{description} +\item[Baddr] Set/reset breakpoint at address. +\item[B] Display active breakpoints. +\end{description} +Four breakpoints can be active simultaneously. + +Examples: +\begin{verbatim} +B403 +B408 +\end{verbatim} +Set the breakpoints at the addresses \$403 and \$408. +\begin{verbatim} +B +\end{verbatim} +Show the breakpoints. +\begin{verbatim} +B403 +\end{verbatim} +Remove the breakpoint at \$403. + +\item[J] Call a subroutine. +\item[G] Go to specified address. + +Syntax: +\begin{description} +\item[Jaddr] JSR to specified address. +\item[Gaddr] Go to specified address. +\item[G] Go to address in PC register. +\end{description} +The registers are loaded from where they are saved (on the stack) and at the +breakpoints SWI instructions are entered. Next the code is executed at the +indicated address. The SWI instruction (or RTS for the J command) returns to +the monitor, saving the registers. + +\item[H] Calculate HEX expression. + +Syntax: + +\begin{description} +\item[Hhexnum\{(+|-)hexnum\}] Calculate simple expression in hex with + and - +\end{description} + +Examples: +\begin{verbatim} +H4444+A5 +H4444-44F3 +\end{verbatim} + +\item[P] Put a temporary breakpoint after current instruction and exeucte it, + +P is similar to T, because it usually executes one instruction and returns +to the monitor after it. That does not work for jumps though. Normally you +use P only with JSR instructions if you want to execute the whole subroutine +without single-stepping through it. + +\item[R] Display or modify registers. + +Syntax: +\begin{description} +\item[R] Register display. +\item[Rregvalue] Enter new value into register Supported registers: + X,Y,U,S,A,B,D (direct page),P (program counter),C (condition code). +\end{description} +The R command uses the saved register values (on the stack). There are some +restrictions on changing the S register. + +Examples: +\begin{verbatim} +R +\end{verbatim} +Display all registers. +\begin{verbatim} +RB03 +RP4444 +\end{verbatim} +Load the B register with \$03 and the program counter with \$4444. + +\item[T] Single step trace. + +\item[I] Show the contents of one address. + +Syntax: +\begin{description} +\item[Iaddr] Display the contents of the given address. (used to read input + port) +\end{description} + +Example: +\begin{verbatim} + IE001 +\end{verbatim} +Show the ACIA status. +\end{description} + +\subsection{S-Records Related Commands.} + +\begin{description} +\item[S1bytes] Enter Motorola S records. +\item[S9bytes] Last S record in series. + +S records are usually entered from a file, either ASCII transfer (S command +from the v09 prompt) or X-MODEM transfer (XX command in monitor, U command +from v09 prompt). Most Motorola cross assemblers generate S records. + +\item[SSaddr,len] Dump memory region as Motorola S records. + +These S records can be loaded later by the monitor program. + +Usually you capture the S records into a file (use L command at v09 prompt) +or use XSS instead. +The XSS command is the same as SS, except that it outputs the S records +through the X-modem protocol (use D command at v09 prompt). + +\item[SOaddr] Set origin address for S-record transfer. + +Before entering S records, it sets the first memory address where S records +will be loaded, regardless of the address contained in the S records. + +Before the SS command, it sets the first address that will go into the S +records. + +Examples. +\begin{verbatim} +SO800 +S1130400etc... +\end{verbatim} +Load the S records at address \$800 even though the address in the S records +is \$400 +\begin{verbatim} +SO8000 +SS400,100 +\end{verbatim} +Save the memory region of 256 bytes starting at \$400 as S records. The S +records contain addresses starting at \$8000. +\end{description} + +\subsection{X-Modem Related Commands.} + +\begin{description} +\item[XLaddr] Load binary data using X-modem protocol + +Example: +\begin{verbatim} +XL400 +\end{verbatim} +Type your escape character and at the v09 prompt type +\begin{verbatim} +ubasic +\end{verbatim} +to load the binary file "basic" at address \$400. + +\item[XSaddr,len] Save binary data using X-modem protocol. + +Example: +\begin{verbatim} +XS400,100 +\end{verbatim} +to save the memory region of 128 bytes starting at \$400 +Type your escape character and at the v09 prompt type: +\begin{verbatim} +dfoo +\end{verbatim} +Now the bytes are saved into the file "foo". + +\item[XSSaddr,len] Save memory region as S records through X-modem protocol. + +See SS command for more details. + +\item[XX] Execute commands received through X-modem protocol + This is usually used to receive S-records. + +Example: +\begin{verbatim} +XX +\end{verbatim} +Now press the escape character and at the v09 prompt type +\begin{verbatim} +usfile +\end{verbatim} +where {\tt sfile} is a file with S-records. + +\item[XOnl,eof] Set X-modem text output options, first number type of newline. + 1=LF, 2=CR, 3=CRLF, second number filler byte at end of file + (sensible options include 0,4,1A) These options are used by + the XSS command. + +Example: Under a UNIX system you want X-modem's text output with just LF + and a filler byte of 0. Type: +\begin{verbatim} +XO1,0 +\end{verbatim} +\end{description} + +\section{Memory Map} + +\section{Operating System Facilities} + +\begin{description} +\item[getchar] address \$00. +\item[putchar] address \$03. +\item[getline] address \$06. +\item[putline] address \$09. +\item[putcr] address \$0C. +\item[getpoll] address \$0F. +\item[xopenin] address \$12. +\item[xopenout] address \$15. +\item[xabortin] address \$18. +\item[xclosein] address \$1B. +\item[xcloseout] address \$1E. +\item[delay] address \$21. On input the D register contains the number of +timer ticks to wait. Each timer tick is 20ms. +\end{description} + +\section{Extending the built-in Assembler} + +\chapter{The Forth Language.} + +\begin{verbatim} +kernel09 and the *.4 files. FORTH for the 6809. To run it, type + XX + + Then press the escape char and at the v09 prompt type + + ukernel09 + + Then type + + G400 + + From FORTH type + + XLOAD + + Then press your escape char and at the v09 prompt type + + uextend09.4 + + From FORTH type + + XLOAD + + Then press your escape char and at the v09 prompt type + + utetris.4 + + From FORTH type + + TT + + And play tetris under FORTH on the 6809! +\end{verbatim} + +\chapter{The BASIC Interpreter.} + +\chapter{History of the Project.} + +\section{Introduction.} + +Of all the 8-bit home computers only a few had the Motorola 6809 CPU, the +most famous of which was the Tandy Color Computer. Then there was its clone +(from Wales) the Dragon and there was an old obscure SuperPet that I have +never seen. The 6809 was the 8-bit processor finally done right, but it came +a bit too late to have a real influence on the market. + +The book that raised my enthousiasm for the Motorola 6809 processor was: +Lance A. Leventhal, ``6809 Assembly Language Programming", 1981 +Osborne/McGrawhill. ISBN 0-07-931035-4. I borrowed it several times from the +university library and finally I bought my own copy. + +The first sentence on the back of that book reads: +\begin{quote} +While everyone's been talking about new 16-bit microprocessors, the 6809 has +emerged as {\em the} important new device. +\end{quote} + +Though it was not the processor that changed the world, it certainly was the +processor that changed my idea of what a good instruction set should look +like. Before that I thought that the Z80 was superior to everything else on +the planet, at least superior to every other 8-bit processor. + +It was in April 1987. I borrowed the book for the first time and I had just +written a Forth interpreter for my Z80 machine. It struck me that the +following 7-instruction sequence on a Z80 +\begin{verbatim} +EX DE,HL +LD E,(HL) +INC HL +LD D,(HL) +INC HL +EX DE,HL +JMP (HL) +\end{verbatim} + +could be replaced by just {\em one} instruction on the 6809. +\begin{verbatim} +JMP [,Y++] +\end{verbatim} + +BTW the above instructions are the heart of a Forth interpreter and making +them more efficient has a tremendous effect on efficiency. + +\section{The 6809 Emulator in Forth.} + +The years went by and I had bought an XT compatible computer in 1988. I +didn't buy a 6809 system though I could have done so. But it would either be +too expensive or I would have to build it myself (I wasn't too handy with +soldering) or it would be a primitive machine like the Tandy Color Computer +without expansions and I didn't like to use cassettes and a 32-column +display. + +In 1989 I saw a 6502 simulator at a meeting of our Forth club. One could +interactively enter hex codes, page through memory, modify registers, trace +intructions etc. I just got to have this, but for a 6809 instead. + +Around Christmas of that year I wrote a 6809 Forth assembler and an +interactive simulator, like the one I had seen on the club meeting. +Everything was written in F-PC, a very comprehensive Forth system for the +PC. + +\begin{figure} +\begin{verbatim} + 0 1 2 3 4 5 6 7 8 9 A B C D E F 0123456789ABCDEF +0000 10 8E 00 40 E6 A0 D7 80 8E 00 81 3A 5D 27 07 A6 ...@f W ...:]'.& +0010 A0 A7 82 5A 26 F9 7E FF FF 00 00 00 00 00 00 00 '.Z&y~ ....... +0020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +0030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +0040 05 46 4F 52 54 48 00 00 00 00 00 00 00 00 00 00 .FORTH.......... +0050 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +0060 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +0070 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +0080 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +0090 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +00A0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +00B0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +00C0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +00D0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +00E0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +00F0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +CC=00000000 A=$00 B=$00 DP=$00 X=$0000 Y=$0000 U=$0000 S=$0000 + EFHINZVC PC=$0000 LDY # $0040 +\end{verbatim} +\caption{Screen snapshot of the Forth-based 6809 simulator.} +\end{figure} + +I even made a start with writing an implementation of Forth for it, but the +obvious lack of speed (among other things) witheld me from finishing it. +I had a fairly complete set of assembly routines though. +The estimated speed was around one thousand instructions per second, good +for an equivalent processor speed of around 4kHz. + +In May 1992 I changed my trusted 8MHz Turbo XT for a blistering fast 25MHz +80386 and it could run the simulator more than 5 times as fast. But then I +wasn't really working on it. In the summer of 1992 I changed to Linux, which +I have been using ever since. + +Around the summer of 1993 I was working with pfe, a brand new Forth system +for Unix written by Dirk Zoller. It had reached such state of completeness +and usability that porting the 6809 simulator to it would be feasible. +I ported it and by doing so I regained interest in the 6809 processor. +PFE is written in C instead of assembler and at least on the 80386 it is +considerably slower than a Forth written in Assembler, like FPC. My +simulated processor speed was around 5kHz, nothing to write home +about. It was faster than on the XT, but not much. + +\section{The Assembler and Simulator in C.} + +The switch from Forth to C was caused by the fact that I wanted a +traditional 6809 assembler, instead of the 'Forth' assembler, in which the +syntax is slightly tweaked to make the thing easy to implement in Forth and +easy to use within Forth. In the fall of 1993 I wrote a traditional two pass +assembler in a few days. It worked more or less, but only recently it has +become bug-free in that it assembles all the instructions and all the +addressing modes (even PC relative) without error. + +Now that I had a real assembler, I could write real 6809 assembly programs, +such as a BASIC interpreter (maybe kidding) or a monitor program or god +knows what. If I would ever run real code on that 6809 simulator, I had to +increase its speed considerably. So I wrote a very straightforward +6809 simulator in C using tables of function pointers. It did really well in +terms of speed, I could reach an equivalent processor clock speed of around +200kHz. The C simulator didn't have any fancy display, memory edit or single +step functions. Its only I/O was through the SWI2 instruction for character +output and SWI3 for character input, something I had added to the +Forth-based simulator quite some time ago. + +One afternoon in optimized hack mode brought me a crude port of E-Forth, a +tiny and very slow (most was interpreted, very few assembler words) +implementation of Forth. The original was written in MASM for the 8086 and +other ports (like the 8051) wre already around. That was the first time I +had Forth on an emulated 6809. BTW this Forth would also run, or should I +say crawl, on the Forth-based simulator. + +I released the assembler, simulator and EForth on {\tt alt.sources} in November +1993. + +Of course I also wrote some test and toy programs (what about a program to +convert binary numbers to decimal using that oddball DAA instruction?). + +In the spring of 1994 I picked up that old TINY BASIC interpreter written by +John Byrns. And tiny it was. Not even arrays were supported. I ported it to +my simulator and found some bugs, both in my simulator and in TINY BASIC +itself. + +I made some improvements to the 6809 simulator. Now I could send ASCII files +to it and log the output to another ASCII file. That way I could 'load' and +'save' BASIC programs for one thing. Further I had a trace facility to write +a trace of all the instructions in a certain address range to a file. Last I +cleaned up the I/O and signal handling somewhat, making it portable across +several Unix versions. + +That version of the software, along with some example programs, was also +released on {\tt alt.sources}. The assembler implemented includes and conditional +assembly in that version. + +\section{The Virtual SBC.} + +That blistering fast 80386 that I bought back in 1992 has become slow as +molasses. It has actually become slower since the memory upgrade with +slow memory (it was cheap) that necessitated an extra wait state. +Fortunately I recently pruchased a Pentium. + +At the moment I actually have plans to build (or have somebody build for me) +a single board computer containing a 6809. I would like to have 32k RAM plus +32k EPROM. I definitely like to have a monitor program with the features I +want. Hence another project was born, the virtual SBC that I could prototype +my monitor ROM and some other software on. + +The virtual SBC emulates a single board computer that communicates with a PC +through an ACIA. On that PC there runs a simple terminal program that +supports XMODEM file transfer. Things I recently did. + +\begin{itemize} +\item I rewrote the 6809 emulator engine with giant switch statements to hammer + out all unnecessary procedure calls and to gain some speed by enabling the + compiler to use register variables where appropriate. On my 386 the + speed increase was disappointing. The equivalent processor speed is now + 250kHz, up from about 170kHz (remember that extra wait state?). On a HPUX + workstation, I got a factor of 2 speed increase. That sucker runs at an + emulated processor speed of about 3.5MHz. A Pentium-90 is even faster, + more than any real 6809 can (officially) run. +\item I added XMODEM upload/download features to the 'terminal front end' of the + simulator. On the other end of the 'serial link' a 6809 machine code + program runs the other end of the XMODEM file transfer protocol. +\item I changed the SWI2/SWI3 hack to real ACIA emulation at a port address. +\item I write-protected the ROM area. +\item I added a 20ms timer interrupt. +\item I wrote a monitor program for the virtual SBC that has to followin + features. + \begin{itemize} + \item Simple (vectorized) operating system functions, like character I/O + line I/O, XMODEM transfer. Usable by application programs. + \item a hex/ascii dump command. + \item a hex/ascii enter command. + \item a hex/ascii memory search command. + \item memory move command. + \item S-record send and receive capabilities (directly in ASCII or + through XMODEM). + \item Binary load and save of memory region through XMODEM + \item register display and modify. + \item go to address (or current program counter) and call subroutine commands. + \item breakpoints. + \item program step tracing (breakpoint after next instruction), DEBUG P + command + \item single step tracing (based on timer interrupt). I had to cheat with the + emulator to implement this. + \item one-pass (no labels) disassembler (DEBUG U command). + \item line-by-line assembler (DEBUG A command) I wrote + this one such that an additional real assembler can use most of the guts of + it. + \end{itemize} +\end{itemize} + +Finally I wrote a real 6809 Forth, based on some other Forth I wrote for an +imaginary stack machine. Those old dusty primitives that I had written back in +1990 proved very useful now. This Forth can load programs through XMODEM +too. It can recompile (metacompile) itself and, very importantly, it runs +tetris! (crawls on the 386) This is the tetris implementation written in +ANSI Forth by Dirk Zoller and it is used as a test program. +Next I have to make this Forth ROM-able. + +What else will go into that 32k ROM area? The monitor will be around 7k, 1k +is reserved for the I/O space. Forth (with its own Forth assembler) will +take about 12k, 8k without. A few additional k could be used for a 'real' +assemler, but I doubt I will ever use that. A cross assembler is much more +convenient. BASIC no doubt. But I'm afraid I'll have to write it myself, +more so as I want to have {\em source code} of all my 6809 stuff. I already have +the floating point routines for it. + +\end{document}