------------------------------------------------------------------------

   ****************************************************************
   * MIDI8031 Mikrocontroller-Entwicklungssystem fr ATARI ST/STE *
   ****************************************************************

   Autor:
   Jrgen Piscol, Rastatterstr. 144, W-7500 Karlsruhe 51

   Tools:
   Alle Programme von mir (JP) wurden mit LASER C entwickelt
   (bis auf TESTRAM.PRG)

   WICHTIGER HINWEIS:
   ==================
   ALLE PROGRAMME DIESES ENTWICKLUNGSSYSTEMS SIND PUBLIC DOMAIN!
   SIE DRFEN ABER NUR UNTER DER VORAUSSETZUNG KOPIERT WERDEN,
   DASS KEIN TEIL DES ENTWICKLUNGSSYSTEMS VERNDERT WIRD! DIE
   VORLIEGENDE SOFTWARE WURDE MIT GRSSTER SORGFALT ERSTELLT.
   TROTZDEM LASSEN SICH FEHLER NICHT MIT SICHERHEIT AUSSCHLIESSEN.
   DAHER KANN ICH KEIN HAFTUNG FR IRGENDWELCHE SCHDEN BERNEHMEN,
   DIE DURCH DEN GEBRAUCH DIESER SOFTWARE ODER HARDWARE ENTSTEHEN 
   KNNTEN.

------------------------------------------------------------------------


Inhalt:
=======

1.) Vorwort, bersicht
2.) Die Hardware MIDI8031
3.) Installation, Zusatzprogramme
4.) Shell (SHELL51.PRG)
5.) Assembler (A51.TTP)
6.) Disassembler (DIS51.TTP)
7.) Execute (EX51.TTP)
8.) Monitor/Source-Level-Debugger (MON51.TTP)
9.) Interrupts des MIDI8031
10.) Tips zur Fehlersuche
11.) Die Demoprogramme
12.) Sprachsynthese mit SMSSEDIT.PRG
13.) Zusatzhardware, MIDI8031-Powerport
14.) Stromsparmechanismen des 80C31
15.) Fileformate
16.) Programme ins EPROM brennen, das OS-EPROM, EPROM Service
17.) Literatur zum Thema


1.) Vorwort, bersicht
======================

Ein Entwicklungssystem fr Mikrocontroller gab es bis jetzt meines
Wissens nach fr ATARI Computer noch nicht. Aus aktuellem Anlass
habe ich die vorliegende Software/Hardware entwickelt:
Sie bezieht sich auf das Mikrocontrollerprojekt in der 

***************************************************
* Zeitschrift ST-Computer, Ausgaben Mai-Juli 1992 *
***************************************************

In diesen Ausgaben finden sie auch die Grafiken und Bauplne 
zur Hardware! Schreibfehler und andere kleinere Unzulnglichkeiten
in diesem Text bitte ich zu entschuldigen. Ich bitte sie, aus 
diesen Fehlerchen auch keine Rckschlsse auf die Qualitt der
Software zu ziehen: Die Software wurde von mir sehr sorgfltig
entwickelt, da ich sie vor allem auch fr den eigenen Gebrauch
konzipiert habe. Soft- und Hardware wurden monatelang intensiv
ausgetestet, bevor ich mich dazu entschloss sie der Allgemeinheit
( = Public Domain) zugnglich zu machen!

Mikrocontroller? What's this?
-----------------------------

Was ein Mikroprozessor ist, weiss inzwischen ja wohl jeder. Dagegen ist
der Begriff Mikrocontroller den meisten weniger gelufig. Der Grund:
Mikrocontroller sind 'Heinzelmnnchen'; sie arbeiten fast immer im
Verborgenen: in Videorecordern, Waschmaschinen, Aufzgen, in Spielzeug, 
Alarmanlagen und sogar in Bohrmaschinen! Mit Sicherheit gibt es 
heutzutage bedeutend  mehr Mikrocontroller auf der Welt als "reine"
Mikroprozessoren. Was aber ist der Unterschied: Zum Aufbau eines 
"klassischen" Computersystems werden  mindestens die folgenden 
Komponenten bentigt:

     Mikroprozessor                       \
     Schnittstellen                         \
     Etwas RAM                                =  Mikrocontroller 
     ROM oder EPROM als Programmspeicher    /
     Taktgenerator                        /

Ein Mikrocontroller ist die Summe dieser 5 Teile in einem einzigen IC.
Daher werden Mikrocontroller oft auch als Ein-Chip-Computer bezeichnet,
was den Sachverhalt sehr genau beschreibt: Die gesamte Peripherie eines
Mikrocontrollers besteht im Minimalfall aus einer Batterie und einem
Quarz.

Durch den massenhaften industriellen Einsatz ist der Preis fr
Mikrocontroller ziemlich niedrig: Einfache Typen sind bereits fr 
weniger als 5.-- DM zu erhalten!

Fr den Amateur sind Mikrocontroller prinzipiell nicht weniger 
interessant als fr die Industrie: Die Wahrscheinlichkeit, dass eine
selbstgebastelte Schaltung funktioniert, sinkt eben mit der Anzahl
der Bauteile.

Es gibt eigentlich nur ein Haupthindernis: Ein Entwicklungssystem fr 
Mikrocontroller kostete bis heute mindestens 1000 DM, davon abgesehen, 
dass es sowas fr ATARIs bis jetzt berhaupt nicht gab.

Doch jetzt, brandneu, gibt es MIDI8031, ein komplettes Entwicklungs-
system fr die industriell am hufigsten verbreitete Mikrocontroller-
Familie: Die "80x1x"-er . Und es kostet keine 1000 DM, keine 500 DM, 
und auch nicht 100 DM, nein: es ist UMSONST, Public Domain!
Sie bentigen lediglich die Hardware, die sie als kompletten Bausatz
preiswert selbst herstellen knnen.

      !   Speicher auf dem Chip !
Name  !   ROM/EPROM   !   RAM   !   Besonderheiten
------+---------------+---------+-------------------
8051      4kB ROM         128B
8751      4kB EPROM       128B
8031      keines          128B
8052      8kB ROM         256B
87C71     4kB EPROM       128B  /  Das 'C' bedeuted CMOS =
80C31     keines          128B  \  niedrigen Stromverbrauch
80C515    8kB ROM         256B  /  8 AD-Wandler sind mit auf dem
80C535    keines          256B  \  auf dem Chip!
...       ...             ... 
Die "80x1x"-Mikrocontroller-Familie umfasst einige Dutzend
Mitglieder.


Einige der "80x1x" besitzen keinen Programmspeicher auf dem Chip
(wie etwa der 8031). Diese sind dann keine echten Ein-Chip-Computer,
da sie zustzlich ein ROM oder EPROM bentigen. Manche der Typen
sind fr Amateure ungeeignet (zum Beispiel der 8051): Ein ROM kann 
nur bei der Herstellung des Chips programmiert werden, soetwas lohnt
sich erst bei hohen Stckzahlen. Typen mit EPROM (8751,87C51, ...) 
lassen sich mit etlichen handelsblichen EPROM-Programmiergerten 
programmieren. Das 'C' im Namen mancher Typen (etwa 80C31) bedeutet, 
dass es sich um einen  CMOS-Typ handelt. CMOS-Typen brauchen nur sehr 
wenig Strom. Die Verwandschaft der Familie liegt an zwei Dingen: 
Zum einen besitzen  alle eine minimale gemeinsame Anzahl von Ports, 
Timern und RAM, zum anderen sind die CPUs aller Typen identisch! 
Das heisst: Der Befehlssatz der CPUs ist 100% identisch. Der Befehls-
satz an sich ist sehr einfach zu erlernen. Einige Literaturhinweise
zu Bchern, die den Befehlssatz beschreiben finden sie in Kapitel 17. 
Obwohl er an sich recht einfach ist, ist er trotzdem auch effizient, 
und vor allem schnell: Fr eine 8*8-Bit Multiplikation oder eine 
16/8-Bit Divison  bentigten selbst die Langsamsten der Familie nur 
4 Mikrosekunden! Alle "80x1x" sind somit Software-aufwrtskompatibel 
zum 8031. Die zustzlichen Funktionen der grsseren  Geschwister des 
8031 (sie haben mehr Ports, mehr RAM, ROM oder EPROM, Timer; sie 
sind schneller; ...) lassen sich durch ein schlaues Softwarekonzept 
ohne nderungen mit einem Standard-8031-Assembler nutzen. Doch davon 
spter mehr.

Das Entwicklungssystem
----------------------

Das Entwicklungssystem MIDI8031 besteht aus 2 Komponenten: Soft-
und Hardware. Die Software selbst ist sehr umfangreich, aber,
wie bereits erwhnt, vllig Public Domain! Hier eine kurze
bersicht:

     Software:
          80x1x-Crossassembler, fr die ganze "Familie"
          Source-Level-Debugger (!!! Ein echter Leckerbissen !!!)
          Monitorprogramm
          80x1x-Disassembler
          GEM-Editor 
          Demo-Programmen (sogar ein Sprachsynthesizer ist dabei)
          Shell
          ausfhrliche Anleitung: Sie lesen sie gerade

Die MIDI8031-Hardware besteht aus einem Mikrocontroller 80C31
einem EPROM (das ein kleines "Betriebssystemchen") enthlt, einer 
MIDI-Schnittstelle, und einem 32kB-RAM. MIDI8031 ist ein 
kompletter Mikrocomputer! Einige Daten:

      Hardware (Name: "MIDI8031")
          80C31-8-Bit CMOS-Mikrocontroller: 
               - Softwarekompatibel zum 8031
               - getaktet mit 12 MHz
               - 16 bidirektionale I/O-Pins
               - 128 Bytes On-Chip-RAM
          32kB RAM
          max. 32kB EPROM
          MIDI-Schnittstelle

Der Entwicklungsablauf ist folgendermassen: Das 8031-Programm wird auf 
einem ATARI geschrieben. Per 'Tastendruck' wird es ber MIDI in das
RAM des MIDI8031 transferiert, wo es getestet werden kann. Luft es
korrekt, bestehen 3 Mglichkeiten: 

1.) Sie brennen das Programm in ein EPROM und ersetzen das Original-EPROM
  des MIDI8031 durch Ihr eigenes. 
2.) Oder aber, sie verwenden ihr EPROM fr eine komplette 
  Eigenentwicklung. 
3.) Als dritte Alternative kann das Programm in einen Mikrocontroller 
  mit eingebautem EPROM gebrannt werden, womit sie sich ihren 
  persnlichen Ein-Chip-Computer verwirklicht htten, sofern ihr
  Programm in das EPROM des entsprechenden Chips passt.

Besonders durch die eingebaute MIDI-Schnittstelle steht Ihnen mit der
MIDI8031-Hardware aber auch die Welt der Musik offen!


2.) Die Hardware MIDI8031
=========================

Die Hardware wurde mglichst einfach gehalten, sie besteht nur aus
wenigen Bauteilen, im wesentlichen:

- 80C31-Mikrocontroller
- EPROM wahlweise 32kB- oder 8kB-Typ (enthlt das "Betriebs-
  systemchen")
- RAM 32kB (CMOS-Ausfhrung)
- Optokoppler zur Steuerung der MIDI-Schnittstelle
- 2 MIDI-Buchsen (IN/OUT)
- Softwaregesteuerte LED
- Spannungsstabilisierung 9-20 Volt auf 5 Volt
- Reset-Taste
- Einige Gatter: Normalerweise kann der 8031 keine Programme im
  RAM ausfhren. Mit einem Extra-Gatter geht das aber trotzdem.
- 20 Polige Buchsenleiste an der die 16 Ports, etc. anliegen.

Den Schaltplan finden Sie in den oben genannten Zeitschriften,
oder aber:

Service
-------

Nicht jeder hat zuhause eine "tzkche" fr die Platinenher-
stellung. Daher knnen Sie folgendes Angebot wahrnehmen: Der 
komplette Bausatz MIDI8031 mit einer hochwertigen Platine 
(Epoxydharz, verzinnt, mit Bestckungsaufdruck), smtlichen 
Bauteilen (incl. 6 Sockel fr die ICs), dem gebrannten Entwicklungs-
system-EPROM, einer ausfhrlichen Aufbauanleitung und einer Diskette 
mit dem vollstndigen Public-Domain-Entwicklungs-system fr alle 
ATARI ST/STE ab 512 kB, knnen Sie fr DM 89.-- (Nachnahme) unter 
dieser Adresse bestellen:

Jrgen Piscol
Rastatter Str. 144
W-7500 Karlsruhe 51


3.) Installation, Zusatzprogramme
=================================

Dieses Entwicklungssystem arbeitet Dateiorientiert, das heisst
der Informationsaustausch zwischen den einzelnen Programmen
erfolgt ber Dateien. Die Software luft zwar auch von Floppy-Disk,
aber eben nur recht langsam. Auch wenn sie eine Festplatte
besitzen, empfehle ich ihnen die Verwendung einer RAM-Disk.
Nicht alle Programme des Entwicklungssystems stammen von mir:
Den Editor und die RAM-Disk habe ich anderen Public-Domain-
Disketten entnommen. Sie sind unverndert, die Anleitungen dazu
sind separat in den Dateien: VDISK35.DOC, EDITOR.DOC (Textdateien).
Falls sie eine Festplatte besitzen: Kopieren sie zur Installation 
den ganzen Ordner MIDI8031 darauf, bei Bedarf kopieren sie die RAM-
Disk VDISK.ACC ins Bootlaufwerk. Falls sie keine Festplatte
besitzen: Fertigen Sie sich eine Kopie dieser Disk an und kopieren
sie die RAM-Disk VDISK.ACC ins Wurzelverzeichnis. Die RAM-Disk
belegt nach dem Booten nur einen Eintrag in der Menueleiste, jedoch
noch keinen RAM-Speicher! Um mit MIDI8031 zu arbeiten melden sie
die RAM-Disk mit einer entsprechenden Gre an (bei 1 MB RAM z. Bsp.
mit 500kB) und kopieren Sie die gewnschten Dateien des Entwicklungs-
systems (oder gleich den ganzen Ordner MIDI8031) hinein, nun kann es
losgehen ... Beachten sie, da die RAM-Disk reset-fest ist!
Zum Anschluss von MIDI8031 an ihren ATARI bentigen sie 2 Stereo-
berspielkabel von etwa 1-2 Meter Lnge. Falls sie sich ber die
Eignung der Kabel nicht ganz sicher sind, finden sie dazu auch einen
Hinweis im Kapitel 7.

Booten von dieser Disk
----------------------

Damit sie sofort loslegen knnen, habe ich
auf dieser Disk bereits einige Voreinstellungen getroffen:

- Booten sie ihren Rechner (sofern er mind. 1 MB RAM besitzt) von
  dieser Disk.
- Auf Ihrem Desktop finden sie rechts oben ein RAM-Disk Zeichen.
- Gehen sie auf den Menuepunkt "Ramdisk". Die RAM-Disk bietet 
  ihnen nun die Grsse 512kB an. Klicken sie auf "ANMELDEN".
- Kopieren sie nun den kompletten Ordner MIDI8031 auf die
  RAM-Disk.
- Klicken sie doppelt auf eine beliebige "*.S51"-Datei um die
  Shell aufzurufen.


4.) Shell (SHELL51.PRG)
=======================

Die meisten Programme des Entwicklungssystems werden ber
Kommandozeilen gesteuert. Um Ihnen dazu die Arbeit etwas zu
vereinfachen, existiert die Shell (SHELL51.PRG):
Per Tastendruck wird das Programm assembliert, gestartet,
editiert, gelistet, ...
Die Shell ist mssig intelligent: Sie versucht sich zu merken,
ob z. Bsp. Assemblierung wirklich notwendig ist. Kommandos:

'e': Aufruf des Editors und bergabe der Projekt-Sourcedatei an ihn.
'x': Wenn ntig wird das Projekt assembliert und gestartet.
     Das Programm luft dann auf MIDI8031, bis sie auf MIDI8031
     Reset drcken.
'm': Wie 'x'. Das Projekt wird aber nicht gestartet, sondern an
     den MIDI8031-Monitor bergeben (Debugging).
'd': Wie 'm', zustzlich erzeugt die Shell aber eine Source-Level-
     Debugger-Datei.
'p': Um den Assemblervorgang zu kontrollieren, kann hier eine
     Liste erzeugt werden: LISTE.LST
'n': Manuelle Eingabe des Projektnamens (Immer ohne Extender)!

Hinweis: Wenn sie SHELL51 als GEM-Anwendung anmelden, auf die
         Extender 'S51', und dann das Desktop sichern (Arbeit sichern),
         reicht es, wenn Sie in Zukunft auf das jeweilige Projekt
         klicken, den Namen trgt dann die Shell selbst ein.


5.) Assembler (A51.TTP)
=======================

Konvention: 8051-Sourcedateien enden mit ".S51". Dateien mit
Programmcode fr MIDI8031 enden mit ".O51". Diese Dateien werden
im folgenden auch als Objektdateien bezeichnet.

Der Assembler kann prinzipiell Code fr alle 51-er erzeugen. Die
Definition der Spezialfunktionen der einzelnen Typen befindet
sich in der Datei reg51.inc fr 80(C)31,80(C)51,87(C)51. Wenn Sie
Programme fr andere Typen schreiben wollen, wenden Sie sich bitte
an mich.

Im Wesentlichen unterscheidet sich der Assembler nicht von anderen.
Falls was unklar sein sollte: Lassen Sie sich die Demos ausdrucken.

Bedienung
---------

Kommentarzeilen beginnen immer mit einem Semikolon.
Symbolnamen drfen maximal 8 Zeichen lang sein. Gross-/Klein-Schreibung
wird ignoriert, Umlaute ('A') und '' drfen nicht verwendet werden!
Das Rechnen mit Symbolnamen ist jederzeit mglich. Ausdrcke wie
z. Bsp. "100-(('a'/$16)+symbol-num*4)" sind erlaubt.

Zahlenwerte:
------------

   [Dezimalzahl]       Byte kann sein: -256..255
                       Wort: -32768..65535
   '[ASCII]'           Bsp.: '@' hat den Wert 64
   $[Hexzahl]          Bsp.: $FFFF hat den Wert 65535
   %[Binaerzahl]       Bsp.: %11111110 hat den Wert 254
   [Symbolname]        Es wird der Name des Symbols verwendet.
   !                   Wert des PCs bei Zeilenanfang: Bsp.
                           mov R0,#10       =      mov R0,#10
                           djnz R0,!        =   w: djnz R0,w
                       spart ein Label!

Symbole:
--------

Symbole (auch 'Label' genannt) mit Doppelpunkt am Ende, werden als 
Adressdefinitionen behandelt. Doppelte Definitionen von Adressen 
sind verboten! Symbole mit '=' am Ende werden als Variable behandelt.
Bei Variablendefinitionen sind mehrfache Zuweisungen erlaubt, jeweils 
die letzte gilt: Bsp:     

         nr = 11
         mov A,#nr  ; ACC mit 11 laden
         nr = 21
         mov A,#nr  ; ACC mit 21 laden

Symbole, die mit '?' beginnen, werden als 'versteckt' gekennzeichnet.
Sie tauchen in der Symbolliste nicht auf. Sinnvoll z. Bsp. bei sehr
kurzen Sprngen. Symbolnamen drfen keine deutschen Umlaute enthalten 
(Bsp.: 'fnf') und auch kein ''.

Operatoren:
-----------

Es gilt natrlich "Punkt vor Strich". Da der Assembler aber
noch mehr sogenannte 'Operatoren' kennt als nur Plus, Minus,
Multiplikation und Division, dient die folgende Liste als
bersicht: 

Hierarchie und Art der mglichen Operatoren:

Prioritt: Hoch
 ( )             Normale Klammer
 .               Bitadressen Bsp. ACC.7: Bit 7 von ACC
 * /
 + -
 &               Logisches Und (Bsp: %110 & %010 = %010)
 |               Logisches Oder (%110 | %011 = %111)
 ^               Logisches Exlusiv-Oder (%110 ^ %011 = %101)
Prioritt: Nieder


Direktiven
----------

.registers [Datei] whlt die Definition der Register fr
                   Spezialfunktionen, hier nur beigelegt reg51.inc:
                   Fr die Typen: 80(C)31,80(C)51,87(C)51

.text_org [Zahlenwert] Adresse des 1. Codebytes. Nur einmal pro
                   Sourcefile erlaubt. Fr Programme, die im RAM des
                   MIDI8031 getestet werden sollen, muss der Zahlenwert
                   grsser als $8000 sein, da nur dieser Bereich RAM ist.
                   Das RAM in MIDI8031 betrgt 32kB ab dieser Adresse.

.var_org [Zahlenwert] ffnet ein (uninitialisiertes) Variablen-Segment. 
                   in Variablensegmenten sind keine Definitionen er-
                   laubt, nur Reservierungen (.ds.b und .ds.w, siehe
                   nachfolgend). Es sind beliebig viele .var_org pro
                   Sourcedatei mglich. Diese Direktive ist hilfreich 
                   beim Aufbau von Variablenfeldern im internen oder 
                   externen RAM des 8031.

.ds.w, ds.b        Reserviert Speicher (Wort/Byte), .w: 2 Bytes pro 
                   Wort. Bsp.:
                          test:  .ds.w 50   
                   reserviert fr 'test' 100 Bytes (die es im Text-
                   segment mit dem Wert 0 initialisiert)

.dc.b              Definiert ein Byte, oder einen String, d.h. der
                   Speicher wird an dieser Stelle initialisiert. Bsp.:
                          .dc.b "HALLO!",0
                   Wichtig: Strings werden nicht automatisch beendet,
                   daher hier die Null.

.dc.w              Schreibt Worte im Intel-Format: Zuerst Low-, dann
                   Highbyte. Bsp.:
                          .dc.w go,hello,$8000,%11111111000

.ibytes [Datei]    Fgt an dieser Stelle eine Datei ein. Verwendung
                   Beispielsweise in der Demo PHONEM

.hide              Versteckt den nachfolgenden Teil des Listing, z. Bsp.
                   beim Source-Level-Debugging, bis zu einem .show:

.show              Hebt .hide wieder auf. Bsp.:
                          test:
                              .hide
                              .ibytes lange_da.tei
                              .show
                   Verhindert, dass in Listings des Assemblers alle
                   Bytes der langen Datei einzeln erscheinen.

.nlist             Bei Ausgabe eines Assemblerlistings (z. Bsp.
                   die Funktion 'p' in der Shell) wird ab hier 
                   die Ausgabe unterdrckt.

.list              hebt .nlist wieder auf, nicht aber .show

Der Unterschied zwischen .hide/.show und .nlist/.list ist der, dass
.hide/.show eine Ebene tiefer ist als .nlist/.list, Bsp.:

      Sourcefile       Assembler-Listing         Debugger
------------------------------------------------------------------
       .hide                 .hide                 .hide
       .dc.w $1234
       .show
       .dc.w $2345     45 23 .dc.w $2345     45 23 .dc.w $2345 
       .nlist                                      .nlist
       .hide                                       .hide
       .dc.w $1234                                 
       .show
       .dc.w $2345                           45 23 .dc.w $2345
       .list                                       .list


Variablenzugriffe
-----------------

Will der 8031 einen Befehlscode holen oder Daten aus dem
Programmspeicher (Tabellen, Konstanten), so gibt der die
Adresse aus und setzt danach das Signal PSEN- auf LOW.
Bei Lesezugriffen auf den RAM-Speicher wird nach der
Adressausgabe das Signal RD- auf LOW gesetzt, bei
Schreibzugriffen das Signal WR-. Normalerweise wrden
also bei gleicher Adresse verschiedene Speicherbausteine
angesprochen! 

Leider gibt es normalerweise keine Mglichkeit Programme im 
RAM eines 8031-Systems ablaufen zu lassen. Durch den Schaltungs-
kniff mit dem NAND-Gatter 74HCT00 werden beide Adressrume
bei Zugriffen auf Adressen oberhalb von $8000 vereinigt. 

Hinweis zum "Linken"
--------------------

Der Assembler in der vorliegenden Version 2.x ist nicht in der
Lage Programmteile zu linken. Bedeutung des Befgriffs "linken":
Normalerweise bestehen grssere Programme immer aus mehreren
kleineren Modulen, die getrennt editiert und assembliert werden.
Beim "linken" werden diese kleinerern Module zu einem funktions-
fhigen Programm zusammengesetzt. Ein "Linker" ist zwar in diesem
Paket nicht enthalten, trotzdem ist mit MIDI8031 die Entwicklung
mehrteiliger Programme mglich: Solange MIDI8031 mit Strom versorgt
wird, bleiben Daten im RAM-Speicher erhalten. Auch bei Drcken der
Reset-Taste! Zustzlich ist es mit der Assembler-Direktive 
".text_org" mglich, Code an beliebige Adressen im RAM zu laden.
Mein Vorschlag wre: Verteilen sie ihr Programm in mehrer Blcke,
die jeweils bei markanten Adressen beginnen (etwa bei $8000,
$9000, $A000 ...). Zwischen den einzelnen Blcken liegt dann zwar
jede Menge unbenutzter Speicher, aber das ist ja in der Entwicklungs-
phase nicht ausschlaggebend. Wenn das Programm spter ordnungsgemss
arbeitet, knnen die Lcken immer noch zusammengeschoben werden.
Jedes der Module beginnt mit einer Liste von Sprngen, zu den vom
Modul angebotenen Funktionen. Der erste Sprung geht jeweils 
entweder zu einer Endlosschleife oder zum Hauptprogramm. Jedenfalls
darf der 8031 nie ins "Leere" springen, da sonst Daten zerstrt
werden knnten. Sie knnen nun an jeweils einem der Module 
arbeiten. Ein Beispiel:

--------------------------------------------------------------
;* Datei 1, Hauptprogramm:

         .registers reg51.inc
datei1 = $8000           ; Hier beginnen die Module
datei2 = $9000

         .var_org datei2 ; Funktionen im Unterprogrammmodul
         .ds.b 3         ; Einsprungroutine
led_on:  .ds.b 3         ; ljmp belegt 3 Bytes 
led_off: .ds.b 3

       .text_org datei1  ; Modul beginnt bei $8000
stop:  ljmp stop         ; Endlosschleife oder ljmp go
go:    mov SP,#$30       ; Stack fuer lcall setzen
       lcall led_on      ; Fremdes Unterprogramm aufrufen
       lcall wait
       lcall led_off
       lcall wait
       sjmp go

; * Unterprogramm: Wartet etwa 0.2 sec.
wait:  mov R0,#0
       mov R1,#1
?w0:   djnz R0,?w0
       djnz R1,?w0
       ret

--------------------------------------------------------------     
; *Datei 1, Unterprogramme:

         .registers reg51.inc
datei1 = $8000
datei2 = $9000

       .text_org datei2
stop:  ljmp datei1+3       ; Sprung ins Hauptprogramm oder stop
led_on: ljmp ?lonn
led_off: ljmp ?loff

?lon:  setb P3.5           ; MIDI8031 LED an
       ret
?loff: clr P3.5            ; aus
       ret
--------------------------------------------------------------

Angenommen, sie mchten an den Unterprogrammen arbeiten:
Editieren sie Datei1, setzen sie den ersten ljmp als
Endlosschleife und starten sie datei1 auf MIDI8031.
Whlen sie nun den neuen Projektnamen datei2, sorgen sie dafr,
dass der erste ljmp das Hauptprogramm aufruft....
Natrlich ist diese Methode zur Entwicklung mehrteiliger
Programme schon etwas aufwendiger. Vor allen Dingen kann man
nicht mehr einfach schnell mal so "drauflosprogrammieren",
da hier schon ein gewisses Mass an Programmierdisziplin
ntig wird. Aber mit etwas Konsequenz knnen sie mit dieser
Methode Programme beliebiger Lnge entwickeln. 

Vorschau
--------

Der Assembler ist im Moment noch nicht besonders schnell. Fr die
Zukunft habe ich folgende Erweiterungen geplant:
1.) Umstellung auf Tokenisierende Assemblierung (Faktor 100 schneller)
2.) Makros
3.) Bedingte Assemblierung
4.) Linkfhige Objektdateien


6.) Disassembler (DIS51.TTP)
============================

Der Disassembler kann O51-Dateien wieder in disassemblieren (was sonst).
Parameter der Kommandozeile:
1.) Name O51-Datei ohne Extender
2.) '>'+Ausgabedatei (vollstndiger Name)

Diese Kommandozeile disassembliert die Datei TEST.O51 in 
die Datei LIST.LST:     

         TEST >LIST.LST


7.) Execute (EX51.TTP)
======================

Um vorhandene O51-Dateien an MIDI8031 zu senden und sofort zu
starten dient dieses Programm. Es kann mit der TOS-Funktion
Pexec() auch von anderen Programmen aufgerufen werden.
Wichtig: Bei Pexec muss das 1. Byte der Kommandozeile ihre
Lnge enthalten (Pascal-Format). Parameter ist der Name der
zu startenden O51-Datei ohne den Extender .O51.
Es ist zu empfehlen, vor Aufruf von EX51.TTP MIDI8031 zu resetten,
falls das momentan laufende Programm Interrupts verwendet.

Datensicherheit, MIDI-Kabel
---------------------------

Die Datenbertragung ber MIDI ist sehr zuverlssig, solange
sie (abgeschirmte) MIDI-Kabel verwenden, deren Lnge 2 Meter
nicht bersteigt. Eine Fehlererkennung bei der Datenbertragung
wurde deshalb nicht vorgesehen. Das Programm TESTRAM.PRG dieser
Disk dient zum Test der Datenbertragung und des MIDI8031 RAMs.
Bei MIDI werden die Daten mit einer Rate von 31500 Baud bertragen.
Das sind maximal etwa 3 Kilobyte pro Sekunde! Zustzlich wurde
MIDI eigentlich als Schnittstelle zwischen Synthesizern fr Musik
entwickelt. Um der Gefahr von Brummschleifen zu entgehen, sind
MIDI-Gerte immer galvanisch (also ber Optokoppler) voneinander
getrennt. Als MIDI-Kabel eignen sich gewhnliche Stereo-berspiel-
kabel. Mit Mono-Kabeln gibt es normalerweise Probleme, da im ATARI
die (normalerweise) freien PINs der MIDI-Buchsen teilweise belegt
sind! Spezielle sogenannte "MIDI-Kabel", wie sie oft in Musik-
geschften angeboten werden, sind zwar auch geeignet, aber
bedeutend teuerer und keinesfalls besser als Stereo-berspielkabel.


8.) Monitor/Source-Level-Debugger (MON51.TTP)
=============================================

Um Fehler in Programmen zu suchen, dient diese Programm.
Ein bergebens Programm wird an MIDI8031 gesendet, danach
wird ein Bildschirm aufgebaut, der die wichtigsten Register
anzeigt, sowie Teile des Programmes. 

Die Fhigkeiten von MON51:
- bis zu 10 Breakpoints
- Single-Step-Betrieb
- stndige Anzeige wichtiger Register und Flags
- Anzeigen des internen und externen RAMs von MIDI8031
- Disassembler
- Source-Level-Debugger

MON51 wird durch die SHELL51 gestartet. bergibt die Shell an MON51
eine Source-Level-Debugger-Datei (Extender 'M51'), so integriert 
MON51 diese folgendermassen:

Cursortasten Hoch/Runter: Scrollen im Sourcetext, 1 Zeile. Mit 'Shift' 
     jeweils 10, mit 'Control' 50 Zeilen.
     Im Sourcetext knnen sie Teile mit der Assemblerdirektive
     .hide verstecken! Scrollen ist nur im Sourcetext mglich, nicht
     aber bei disassemblierten Programmteilen.

PC befindet sich an einer Stelle, zu der Sourcecode vorliegt:
     Sourcecode wird angezeigt.

PC befindet sich an einer Stelle im RAM, zu der kein Sourcecode
     vorliegt: RAM wird disassembliert.

PC befindet sich im EPROM (etwa bei Programmfehlern): Nichts wird
     angezeigt, ausser die Adresse des PCs.

Bei Berechnungen: Mit dem Sourcecode bergibt die Shell an MON51 auch
     eine Symbolliste, so dass die Symbolnamen verwendet werden
     knnen.

Befehle des Monitors
--------------------

- 'g' ohne Zustze: Das Programm wird an der Stelle fortgesetzt, auf
  den der PC zeigt. Das Programm kann per Tastendruck unterbrochen
  werden, oder wenn es auf einen Breakpoint trifft.
- 'g + Zahlenwert': Programm starten ab Zahlenwert. Bsp.:
          g schleife+$16

- Die wichtigste Taste ist wohl 'Undo': Sie enthlt 'g <NL>'.

- 's+': Single-Step-Ein: Pro 'g' wird nun nur ein Schritt ausgefhrt.
- 's-': Single-Step-Aus

- 'b': Liste der Breakpoints anzeigen
- 'b-': Alle Breakpoints aufheben
- 'b0-' bis 'b9-': Einzelnen Breakpoint aufheben
- 'b0 = Zahlenwert' bis 'b9 = Zahlenwert': Setzen eines Breakpoints
  (Beachten Sie dazu die Hinweise am Ende des Kapitels)
- 'd': Erneuter Download: Oft ist es wnschenswert das gleiche
  Programm nocheinmal zu starten. Dazu dient 'd'. Vor 'd' kann
  MIDI8031 evtl. mit der Reset-Taste neu gestartet werden, falls
  ntig.

- '?' Dient zur Berechnung von Ausdrcken Bsp.:
          ? $8000+(schleife+nr)*3
  Ausgabe als Dezimal- und Hexadezimal-Zahl.

- 'x Zahlenwert': Zeigt externes RAM des MIDI8031 an, Bsp.:
      x $8000

- 'r Zahlenwert': Zeigt internes RAM des MIDI8031 an, maximal-
  Adresse ist 127! Bsp.:
     r 120   

- 'q': Verlsst MON51, MIDI8031 bleibt angehalten, wird aber
  nicht resettet (das knnen sie ja bei Bedarf manuell am MIDI8031
  machen).

Troubleshooting
---------------

MON51 untersttzt keinen selbstmodifitzierenden Code. Ausserdem
bentigt er etwa 10 Bytes auf dem Stack des MIDI8031. Treten
beim Debuggen wiederholt unerklrliche Zustnde auf, so liegt das
oft an falsch gesetztem (oder garnicht gesetztem) Stack des MIDI8031.

Ein weiteres "Problemchen" liegt an dem geringen MIDI-Buffer des
ATARI: Gelegentlich kann es vorkommen, dass dieser berluft,
z. Bsp. bei sehr schnellem Single-Steppen: Pltzlich werden
'seltsame' Registerinhalte angezeigt, Adressen die es nicht gibt...
Abhilfe: Einfach noch einen Step mehr machen: Der PC des MIDI8031 wird
von diesem selbst verwaltet und nur bei Bedarf verndert etwa bei 
explizitem Go (Bsp 'g $8000').

Interrupts: Jedesmal wenn MON51 sich meldet (Breakpoints, Singlestep)
werden die Interrupts des 8031 disabled. Bei der Verwendung von
Interrupts sollten sie also die Interruptroutine vielleicht zuerst
als 'normales' Unterprogramm austesten, und erst dann auf einen
Interrupt legen.

Breakpoints: Breakpoints auf MIDI8031 werden dadurch erzeugt, dass
MON51 an die Stelle des Breakpoints eine (im Moment 7 Bytes lange)
Routine schreibt. Nun kann folgendes Problem auftreten: Angenommen
sei folgender Sourcetext:

 test:    ret
 nixgut:  inc R0
          ret

Wenn Sie nun einen Breakpoint an die Stelle 'test' setzen, wird auch
das Unterprogramm 'nixgut' berschrieben, was zu seltsamen Effekten
fhren wrde... Also, behalten Sie diese Tatsache im Hinterkopf und
setzen Sie nie Breakpoints zu nahe vor derartigen Sprungbefehlen.

Trotz alledem glaube ich, dass MON51 ein sehr gutes Hilfsmittel bei
der Softwareentwicklung fr MIDI8031 ist.


9.) Interrupts des MIDI8031
===========================

Der 8031 springt bei Auftreten eines Interrupts immer auf eine
fest vorgegebene Adresse:

$0003   Externer Interrupt 0 (Pin -INT0)
$000B   Timer 0 Interrupt
$0013   Externer Interrupt 1 (Pin -INT1)
$001B   Timer 1 Interrupt
$0023   Serieller Interrupt (Senden und Empfangen)

Im Entwicklungssystem MIDI8031 liegen diese Adressen im EPROM,
ausserdem stehen fr die einzelnen Interruptroutinen so nur je
8 Bytes zur Verfgung. Daher befindet sich an dieser Stelle im
Enntwicklungssystem-EPROM folgender Code:

$0000:     reset:     ljmp ...          ; Systeminitialisierung
$0003:     int0:      ljmp $8003
                      .ds.b 5
$000B:     timer0:    ljmp $800b
                      .ds.b 5
$0013:     int1:      ljmp $8013
                      .ds.b 5
$001B:     timer1:    ljmp $801b
                      .ds.b 5
$0023:     serial:    jnb PSW.5,?ose     ; F0=0: MIDI abfangen 
                      ljmp $8023         ; F1=1: USER-MIDI
           ?ose:      ajmp ...

Bei Auftreten eines Interrupts springt der 8031 also zur
entsprechenden Adresse im RAM! Verwendet werden Interrupts
z. Bsp. im Schrittmotorprogramm oder im Sprachsynthesizer.
Eine Besonderheit stellt der serielle Interrupt dar: Normaler-
weise dient er ja zur Steuerung des Entwicklungssystems. Wollen
sie jedoch den seriellen Interrupt fr eigene Programme verwenden,
mssen sie das Prozessorflag F0 setzen, was natrlich auch heisst,
dass dieses Flag anderweitig nicht verwendet werden darf!

Verwendet Ihr Programm Interrupts, und luft es im RAM korrekt,
und beginnt es normalerweise an Adresse $8000, knnen Sie es ohne 
Probleme in ein EPROM brennen, indem Sie einfach die Anfangsadresse
in $0 ndern und mit diesem Sourcecode eine O51-Datei erzeugen,
mehr dazu spter...

Allerdings laufen die Interrupts im EPROM etwas schneller ab, da
ja nun jeweils ein Sprungbefehl fehlt!


10.) Tips zur Fehlersuche
=========================

ber dieses Thema liesse sich natrlich sehr viel sagen. Oft aber
liegen Fehler an so elementaren Dingen, dass man fast nicht drauf-
kommt:

-  Initialisierung von Interrupts: Interrupts werden durch
   3 Bits initialisiert: 1.) Das Enable-Bit des Interrupts im
   IE-Spezialfunktionsregister, 2.) Das Prioritts-Bit des
   Interrupts im IP-Register, 3.) Das Generelle Interrupt-Enable-
   Bit EA, es ist das oberste Bit im Register IE (also IE.7).
   Speziell zu bei Timern gibt es auch noch das Zusammenspiel
   zwischen Timer-Overflow-Flag (TF0/1) und Timer-Run-Flag (TR0/1): 
   Immer wenn ein Timer dir Grenze 255->0 berschreitet wird sein
   Overflow-Flag (TF0/1) gesetzt. TF0/1 wird bei Ausfhrung eines
   Interrupts automatisch rckgesetzt. Bevor sie Timer-Interrupts
   verwenden, sollten sie zustzlich diese Sequenz in Ihrer Software
   einbauen: 1.) Timer Interrupt disablen, 2.) TR-Bit lschen, 3.) 
   TF-Bit rcksetzen ( = auf 0).

-  Stack: der Stack wchst nach oben! Vergessen Sie niemals ihn
   zu initialisieren. Das Entwicklungssystem bentigt etwa
   10 Bytes auf dem Stack.

-  Read-Modify-Write: Jedem Port ist noch ein Zwischenspeicher
   vorgeschaltet, der den Ausgabepegel des Ports speichert.
   Manche Befehle lesen nun den Wert des Port-Latches, andere
   wiederum den wirklichen Pegel am Port. Insbesondere im
   Zusammenhang mit Port 3 kann dies zu Problemen fhren:
   Der Befehl   mov A,P3  etwa liest den am Port aussen
   anliegenden Pegel, indem einfach der Port auf LOW geschaltet
   wird, und dann gemessen wird, ob ein Strom fliesst. Leider
   hngen auch die Signale -RD und -WR an diesem Port. Durch
   den Lesebefehl ist deshalb das RAM der Meinung, es soll
   beschrieben werden, was sofort zum Absturz von MIDI8031 fhrt!
   Dagegen ist das Lesen des Portlatches vllig ungefhrlich.
   Zu diesem Thema finden Sie Informationen unter dem Stichwort:
   Read-Modify-Write-Befehle in jedem Buch zum Thema 51-er 
   Controller.
   

11.) Die Demoprogramme
======================

A
-

Dieses Minimalprogramm bringt die LED von MIDI8031 zum
Blinken

MORSE
-----

Dieses Programm gibt einen Text als Morsezeichen aus, indem
es mit der LED blinkt, und auch Tne am Pin P1.0 ausgibt.
Ausserdem zeigt es auch, wie Portpins abgefragt werden knnen:
Wenn Sie zwischen Pin P3.3 und GND (Buchsenleiste Pin 15 und 20)
eine Taste anschliessen, knnen sie durch Drcken der Taste die 
Tonhhe des Morsesignals verstellen. Der Lautsprecher wird zwischen 
Pin 2 und 3 der Buchsenleiste angeschlossen. Der Port kann im LOW-
Zustand pro Pin nur wenige Miliampere ziehen. Daher muss dem Laut-
sprecher ein Wiederstand vorgeschaltet werden. Je nach Wiederstand 
des Lautsprechers sollte der Gesamtwiederstand mindestens 200 Ohm 
betragen, um Schden am Port des MIDI8031 zu vermeiden. Leider
bleibt aufgrund des Vorwiederstandes nicht mehr viel Leistung fr
den Lautsprecher brig, wenn seine Impendanz klein ist (4-8 Ohm).
Empfehlenswerter sind hier sogenannte 'Mittelohmige Lautsprecher',
deren Impendanz etwa 40-45 Ohm betrgt. Als besonders geeignet 
fr Tonausgabe hat sich die Schaltung bewhrt, wie sie im Text 
des Programmes PHONEM.S51 beschrieben ist, wie noch folgt.

SCHRITT
-------

Dieses Programm dient zur gleichzeitigen Ansteuerung zweier
Schrittmotoren. Prinzipiell soll es eigentlich mur zeigen,
wie problemlos sich auch Interrupts in eigenen Programmen
verwenden lassen. Die Schrittmotoren werden ber Port P1 gesteuert. 
Es knnen nur sogenannte 4-Strang-Motoren verwendet werden, die aber 
auch am verbreitetsten sind. Dazu wird die spezielle MIDI8031-
Hardware-Erweiterung MIDI8031-Powerport verwendet, die im 3. Teil 
der Serie beschrieben worden ist. MIDI8031-Powerport ist aber 
bedeutend mehr als nur eine einfache Schrittmotorkarte: Auf der 
Platine befinden sich 8 preiswerte SIPMOS-Leistungs-MOSFET-
Transistoren, von denen jeder(!) maximal 20 Ampere ziehen kann 
(Summe also 160 Ampere!). Dabei kann die Taktrate bis zu 500 kHz 
betragen. Prinzipiell knnen sie an den MIDI8031-Powerport alles
anschliessen, das sich mit maximal 30 Volt und 20 Ampere betreiben
lsst: Kleinbohrmaschinen, Ltkolben, Halogenlampen, Relais, ...
Die Bauanleitung zu dieser Karte finden sie, wie bereits erwhnt 
im 3. Teil der Serie.

Zu SCHRITT gehrt auch die Datei SCHRITT.TXT: Ein GFA-Basic-Programm:
Starten sie SCHRITT von der Schell aus und verlassen sie dann die
Shell. Starten sie nun GFA-Basic und laden Sie mit MERGE SCHRITT.TXT.
SCHRITT.TXT gibt fr jeden Motor ein individuelles Fahrprogramm aus
und zeichnet es auf dem Bildschirm.

CODE
----

Ein Software-Rauschgenerator.

OS
--

Das ist der Sourcecode des Entwicklungssystem-EPROMS

PHONEM
------

Das wohl interessanteste Demo-Programm berhaupt: Ein Sprach-
synthesizer mit linearem 7-Bit-Pulswandler. Mithilfe 
von SMSEDIT.PRG, einem Programm zur digitalen Signalverarbeitung, 
das im nchsten Kapitel beschrieben wird, knnen aus gesampelten 
Sprachsignalen Dateien erzeugt werden, mit denen PHONEM gesteuert 
wird. In ein 32KB-EPROM passen  ohne Aufwand bis zu 1 Minute Sprache 
in guter Qualitt.  Einige fertige Text befinden sich bereits mit 
im Paket, sie mssen nur noch den jeweiligen Namen der Datei im 
Sourcecode zu PHONEM einsetzen.

PHONEM ist in der vorliegenden Fassung nur ein Fragment: ver-
bessert man die Datenverwaltung noch etwas, lassen sich der
Speicherverbrauch ohne Qualittseinbusen auf etwa 1/5 senken!
Geht man noch weiter, lassen sich aus den Daten die Grundbausteine
menschlicher Sprache, die sogenannten Phoneme isolieren. Dann
allerdings sinkt die Qualitt etwas ab, aber der Speicherverbrauch l
iegt bei weniger als 50 Bytes pro Sekunde Sprache! In jedem Fall
bleibt die Sprache noch ziemlich gut verstndlich.

Wollen Sie PHONEM in ein EPROM brennen, beachten Sie bitte die
Hinweise im Kapitel Interrupts: Das Timing von PHONEM ist auf
den Zyklus genau berechnet. In der EPROM-Version mssen daher
3 zustzliche Zyklen in die Timer0-Interruptroutine eingebaut 
werden (Z. Bsp. 3 mal NOP).

Die Arbeitsweise von PHONEM: Aus dem gesprochenen und gesampelten
Text isoliert SMSSEDIT die wesentlichen Merkmale der Sprache:
Jede Sekunde Sprache wird in etwa 60 Abschnitte zerlegt. Fr
jeden Abschnitt wird eine Hartley-Transformation durchgefhrt
(das ist eine der FFT verwandte Transformation). Aus dem 
Leistungsdichte-Spektrum eines jeden Fensters werden die
12 wichtigsten Frequenzen entnommen, zusammen mit ihrer
Amplitude. Die Synthese in PHONEM erfolgt nun derart, dass 
die jeweiligen 6 Frequenzen mithilfe einer Tabelle einer
Sinusschwingung wieder zusammmengesetzt werden. Leider kann
der 8031 nur vorzeichenlose Zahlen miteinander multiplizieren.
Daher ist zu jedem Datensatz noch ein Extrabyte zugefgt, das
einen Offset angibt, der jeweils addiert wird.

Pro Sekunde synthetisiert MIDI8031 etwa 8000 Werte des Signals.
Um das Signal hrbar zu machen, wird es als Pulsweite-Moduliertes
Signal am Portpin P1.0 ausgegeben. Leider pfeift das Signal
noch etwas. Leidliche Abhilfe schafft ein Tiefpass, wie im Source-
text beschrieben. Besser noch wre ein aktives Filter, was aber
auch den Aufwand in die Hhe treiben wrde.

Interessante Bilder ergeben sich, wenn man den Frequenzverlauf
der einzelnen Komponenten zeichnet: SMSSEDIT sortiert die Daten
nach Frequenz. Zeichnet man also den Verlauf der Frequenz-
komponenten auf, deren Amplitude grsser als 1 ist, ergeben sich
interessante Muster, die fr jeden Menschen (der den gleichen
Text spricht) in etwa gleich sind! Die meisten Spracherkennungs-
programme arbeiten nach diesem System.


12.) Sprachsynthese mit SMSSEDIT
================================

Dieses Programm wurde ursprnglich fr einen anderen Zweck
geschrieben. Daher enthlt es viele Funktionen, die hier
nicht notwendig sind. Vorgehensweise:

Mit 'l' (Bereich laden) wird eine bereits gesampelte Datei
eingeladen (eine, ZAHL1_10.PAT, befindet sich bereits auf Disk).

'r': Falls sie einen Sampler zum Anschluss am Druckerport
des STs besitzen, probieren sie einfach mal aus, ob er mit SMSSEDIT
zusammenarbeitet: 'r'+ '<Taste>' startet die Aufnahme.

Mit 'p' wird der geladene Bereich abgespielt (Monitorlautsprecher
dazu voll aufdrehen).

Mit 'b' knnen sie mit der Maus einen Ausschnitt des Bereichs zoomen,
mit 'o' kommen sie wieder zurck.

mit 'i' wird eine Sprachanalyse des Bereichs durchgefhrt und das
synthetisierte Signal anstelle des Originals eingesetzt. Haben sie
ihr MIDI8031 am ATARI angeschlossen, knnen sie auch das synthetische
Signal dort ausgeben, indem sie vor 'i' das '~' drcken. Die Analyse
ist enorm rechenaufwendig. Ich habe dazu die schnellsten derzeit
bekannten Analysealgorithmen verwendet (selbstverstndlich in
100% optimiertem Assembler). Wenn sie das synthetisierte Signal
ber MIDI8031 ausgegeben haben, empfiehlt es sich, es durch
Druck der Reset-Taste zu beenden.

'0' speichert die gewonnen Koeffizienten auf Disk ab (Format PHO)

'1' ldt eine PHO-Koeffizientendatei ein. Es befindet sich bereits
eine mit auf Disk.

'2' fhrt nur eine Synthese mit den bereits vorhandenen Koeffizienten
durch (Bsp.: erneute Augabe an MIDI8031)

'3' whlt einen anderen Analyse-Verstrkungsfaktor

'4' speichert die Koeffizienten im Format P51 ab, so dass sie mit
PHONEM verwendet werden knnen. Der Filestruktur ist folgendermassen:
- Jede Sekunde Sprache wird in ca. 60 Fenster zerlegt, von denen
  jedes durch 13 Bytes beschrieben wird.
- Die ersten 6 Bytes eines Fensters enthalten die 6 Frequenzen der
  Komponenten (0..127), danach kommen die 6 Lautstrken der 
  Komponenten,(0..255), zum Schluss noch ein Offset der das
  Synthesesignal auf Wandlermitte justiert.

Falls sie an einer genauen Anleitung zu SMSSEDIT interessiert sind:
SMSSEDIT ist Teil des SMS Synthesisers V1.10, den sie in jeder gut
sortierten Public-Domain-Sammlung finden. Auf der SMS-Diskette ist
auch eine detailierte Anleitung zu SMSSEDIT enthalten.


13.) Zusatzhardware, MIDI8031-Powerport
=======================================

Die Menge der mglichen Hardware-Erweiterungen zu MIDI8031
ist vllig beliebig. MIDI8031-Powerport ist lediglich ein
eine Mglichkeit. Es sind nur einige Dinge zu beachten:

Die Ports des 80C31 enthalten stark vereinfacht:

   (+ 5 Volt) ---------------+
                             |
                   [ Pull-Up-Wdst etwa 20kOhm ]
                             |
                             +----------> Portpin                
                             |
                         | <--  FET, kann bis etwa 20 Mili-Ampere
            -  - - ------| <--  aufnehmen, mehr ist gefhrlich
                             |
                           -----  
                            ---  GND
                             -

- Nach Reset befinden sich Portpins immer auf High.

- Eingabegerte: Taster, Schalter, ... werden immer zwischen
  dem Portpin des 80C31 und GND angeschlossen. Aus Schutzgrnden
  knnen sie dem Taste, Schalte, ..., einen 150 Ohm Wiederstand
  vorschalten (Struktur des Portes ist in Wirklichkeit komplizierter,
  auch zwischen +5V und dem Pin liegt noch ein zweiter FET, der aber 
  nur fr wenige Mikrosekunden bei Schreibzugriffen auf den Portpin
  durchschaltet).

- Ausgabe: Im LOW-Zustand ist der FET durchgeschaltet. Trotzdem
  ist die Verwendung von Puffern (wie etwa im MIDI8031-Powerport,
  wie in ST-Computer 7/92 beschrieben) zum Schutz des 80C31 zu 
  empfehlen.


14.) Stromsparmechanismen des 80C31
===================================

Die CMOS-Mikrocontrollertypen der 51er-Familie, wie auch der 80C31, 
besitzen 2 softwaermssige Mechanismen zur Reduzierung der Leistungs-
aufnahme des Mikrocontrollers. Die beiden Zustnde sind als
'IDLE-Mode' und als 'POWER-DOWN-Mode' bezeichnet. Zur Aktivierung
der Moden gibt es das SF-Register 'PCON'. Das Register PCON ist
nicht bitadressierbar!

IDLE-Mode
---------

Durch Setzen des Bits PCON.0 lsst sich der IDLE-Mode setzen.
Im IDLE-Mode bleibt der Prozessor stehen, hlt aber die 
Zustnde der Ports. Bei Auftreten eines nicht gesperrten 
Interrupts (Intern oder Extern) wird der IDLE-Mode wieder 
aufgehoben und der entsprechende Interrupt ausgefhrt.
Der IDLE-Mode kann durch folgenden Befehl aktiviert werden:
orl PCON,#%1. Sind alle Ports auf High, und die LED aus,
verbraucht MIDI8031 nur noch etwa 6 Miliampere, von denen
etwa 3 Miliampere auf den 80C31 entfallen, der Rest auf die
brigen ICs, vor allem Optokoppler und Spannungsregler.

POWER-DOWN-Mode
---------------

Durch Setzen des Bits PCON.1 gelangt der 80C31 in den
POWER-DOWN-Mode. In diesem Modus ist der Prozessor
praktisch eingefroren. Der Zustand kann nur durch einen
Reset beendet werden! Im POWER-DOWN-Mode verbraucht
der Prozessor 80C31 nur noch etwa 10 Mikroampere bei
einer Versorgungs-Spannung von 2 Volt. Dabei ist der
Erhalt der Daten im internern RAM garantiert, sofern
der POWER-DOWN-Mode vor Absinken der Versorgunsspannung
unter 4.5 Volt aktiviert worden ist. Die Zustnde der Ports
bleiben ebenfalls erhalten. Da der 80C31 auch im POWER-DOWN-
Mode bei einer Versorgungsspannung von 5 Volt etwa 1 Mili-
Ampere verbraucht, ist dieser Modus fr MIDI8031 eigentlich
ungeeignet, da er wie gesagt nur durch Reset beendet werden
kann. Fr Batteriebetriebene Eigenentwicklungen kann
folgendes Schema verwendet werden:

- Bei Absinken der Versorgungsspannung unter eine bestimmte
  Schwelle wird ein Interrupt ausgelst.
- Der Interrupt sichert relevante Daten im internen RAM, 
  setzt mglichst alle Portbits auf 1 und aktiviert den 
  POWER-DOWN-Mode.
- ber eine Schaltung mit einer Schottky-Diode wird nur der
  Prozessor Ruhestromversorgt:

          Schottky-Diode  
+5Volt        !\ !     +4.8Volt
o-------------! >!----------------------+
+Allgemein    !/ !                      !
                                        !
                                        !
Batterie                                !
o--------------------------[ Wdst. ]----+------->
+U-Bat                                  !  zum Pin1
                                        !   80C31
                               Kond.  -----
                               100nF  -----
                                        !
                                        !                                          
                                        !
                                       --- Gnd
                                        -

Der Wiederstand wird so bemessen, dass im POWER-DOWN-Mode
auch bei schwcherer Batterie eine Spannung von mindestens 2 
Volt am Pin1 anliegt.


15.) Fileformate
===============

Assembler:
  Das Format ist total primitiv (Format O51):
  zuerst kommen die Codebytes. Die letzten 2 Bytes einer O51-Datei
  geben die Startadresse an (also zwischen $8000 und $FFFF bei
  wenn das Programm in's RAM des MIDI8031 soll)

SMSSEDIT, PHO:
  Zu jeweils 128 Bytes des Samples werden die 6 wichtigsten
  Frequenzanteile bestimmt und als Worte abgespeichert:
     6 * ( Frequenz.w, Amplitude.w )
  Am Ende der Datei folgt 4 * -1L 
  Die Frequenz bezieht sich immer auf eine 256-Schritte lange
  Sinusschwingung, d.h. der Frequenz '256' wrde die
  Tonfrequenz 7980 Hertz entsprechen, der Frequenz '1' die
  Tonfrequenz 7980/256 Hertz. Die Amplitude liegt normalerweise 
  immer im Bereich von 0..127.


16.) Programme ins EPROM brennen, das OS-EPROM, EPROM-Service
=============================================================

Leider vergisst MIDI8031 alles, wenn ihm der Strom fehlt.
Ich habe weiter oben bereits erwhnt, dass Besteller des MIDI8031-
Bausatzes einen besonderen Service in Anspruch nehmen knnen:

* Ich brenne EPROMs fr Besteller des MIDI8031-Bausatzes zum
* Selbstkostenpreis.

Dadurch sparen sie sich die Anschaffung eines teuren EPROM-Brenners
und sie knnen die erprobte MIDI8031-Hardware fr ihr eigenes
Programm benutzen.

EPROM-Dateien, OS-EPROM
-----------------------

Um ein 8051-Programm in ein EPROM zu brennen, gengt es, wenn
sie im Sourcetext die Zieladresse mit .text_org $0 angeben.
Falls ihr Programm Interrupts verwendet, stellen sie sicher,
dass Interrupts wie im gleichnamigen Kapitel initialisiert worden
sind.
Der Assembler kann auch direkt aufgerufen werden: Klicken sie auf
A51.TTP. Angenommen Ihre Sourcedatei heisst TEST.S51. Um eine
Objektdatei (O51) zu erzeugen, mssen sie folgende Kommandozeile
angeben:

test o

A51 erzeugt daraus die Datei TEST.O51

OS-EPROM, Hardwaretest
----------------------

Genauso knnen sie auch ein anderes "Betriebssystemchen" fr 
MIDI8031 basteln, indem sie OS.S51 ndern. Falls sie Ihre
Hardware selbst basteln: Die Datei OS.O51 ist die assemblierte
Version von OS.S51. Brennen sie also einfach OS.O51 in ein
EPROM vom Typ 27C64 oder 27C256. Zum Austesten ihrer Hardware
braucht sich kein RAM auf MIDI8031 befinden. Beim Einschalten
der Versorgungsspannung muss MIDI8031 zuerst einige Male schnell,
dann langsam (ca. 1 mal pro Sekunde) blinken. Schalten sie nun
die Spannung ab und setzen sie ein RAM ein. Auch nun muss sich
MIDI8031 wieder mit Blinken melden. Zum weiteren Test dient ein
kleines Programm:

Testprogramm
------------

Auf dieser Disk befindet sich auch ein Programm TESTRAM.PRG. Es dient
zum Austesten des MIDI8031-RAMs und der Verbindung MIDI8031/ATARI.
Die beiden MIDI-Kabel sind folgendermassen anzuschliessen:

ATARI:       MIDI-OUT <---------->   MIDI-IN      :MIDI8031
             MIDI-IN  <---------->   MIDI-OUT

Als Kabel knnen 2 normale Stereo-berspielkabel von max. etwa 2 Metern
Lnge verwendet werden, wie auch bereits in 7. beschrieben.

Mit 's' wird ein Bild gezeichnet und ber MIDI ins RAM von MIDI8031
geladen. Die Quittung der Daten durch MIDI8031 wird nicht abgefragt,
d. h. sie knnen auch quasi ins 'Leere' senden. Gesendete Blcke werden
vom Bildschirm entfernt. MIDI8031 hrt zu Blinken auf, sobald es zum
erstenmal angesprochen worden ist.

'l' versucht die Daten wieder vom MIDI8031 RAM in den Bildschirm des
ATARI zu holen.

EPROM-Service
-------------

Fr Besteller des MIDI8031 Bausatzes brenne ich EPROMs vom Typ
27C256 (32kB) und 27C64 (8kB) zum Selbstkostenpreis:

Senden sie mir eine Diskette mit ihrer gewnschten Datei (O51),
einem leeren EPROM des obigen Typs, und einem frankierten
Rckumschlag zu. Soll ich das EPROM vorher lschen, fgen
sie bitte 2 DM in Briefmarken zu. Sie knnen 32kB-EPROMS auch 
bei mir kaufen, legen Sie dazu Ihrer Disk einen 10 DM-Schein bei.
Sendungen ohne ausreichend frankierten Rckumschlag betrachte ich
als grosszgige Spenden! Diese Angebote gelten, bis auf weiteres,
nur bis zum 1. September 1992!


17.) Literatur zum Thema
========================

Um sich in die Funktionsweise der 51-er einzuarbeiten gibt es inzwischen
eine Vielzahl an Bchern. Hier nur eine kleine Auswahl. Besonders
empfehlenswert ist das Buch von Andreas Roth, da es auch viele Demo-
programme und Hardwarebasteleien enthlt.

Literatur zur Soft- und Hardware:

- Das Mikrocontroller-Kochbuch/Andreas Roth
  IWT-Verlag 1989, Vaterstetten
  ISBN 3-88322-225-9
  etwa 58 DM

Literatur zur Software:

- Mikrocontroller der 8051-Familie/Roland Dilsch
  Vogel Buchverlag 1991
  ISBN 3-8023-0491-8
  etwa 38 DM

- 8051-Prozessoren/Khn,Schultes
  Franzis-Verlag
  ISBN 3-7723-9771-9
