C 64
Hardware des Monats

Bauanleitung: Centronics-Interface

Sie haben Probleme, Ihren Drucker mit Centronics-Schnittstelle an den seriellen Port des C 64 anzuschließen? Dann bauen Sie sich doch ein Interface, das das gleiche leistet wie die käuflichen Geräte.

Flachbandkabel mit Centronics-Stecker, kleine Platine mit EPROM (Aufkleber »Test-64 14-07-86«) und aufgerolltes Kabel mit Rundstecker auf dunklem Untergrund

Selbstbau ist preiswerter als der Kauf eines fertigen Produktes. Darum stellen wir Ihnen in dieser Ausgabe als Hardware des Monats die Bauanleitung eines Centronics-Interfaces vor, das von der Leistung her käuflichen Interfaces nicht nachsteht. Wenn Sie sich zum Nachbau entschließen, haben Sie anschließend nicht nur ein gut funktionierendes Interface, Sie lernen auch einen neuen, sogenannten Ein-Chip-Mikrocomputer kennen, der zur Zeit für die unterschiedlichsten Steuerungsaufgaben eingesetzt wird. Da dieser Ein-Chip-Mikrocomputer alle zu einem Computer gehörenden Baueinheiten, wie Mikroprozessor, RAM, ROM, EPROM und Ein-/Ausgabe-Ports enthält, und in der letzten Zeit zu erschwinglichen Preisen vertrieben wird, wurde das Interface mit ihm ausgestattet. Er eignet sich aber nicht nur für den Einsatz in Interfaces, vielmehr lassen sich mit ihm relativ preisgünstig »intelligente« Peripheriegeräte wie EPROM-Brenner, MIDI-Interfaces und so weiter an den seriellen Port des C 64 oder C 128 problemlos anschließen. Der Befehlssatz des Ein-Chip-Mikrocomputers ist identisch mit dem des 6800. All jene, die sich näher mit ihm beschäftigen wollen, finden einen entsprechenden Assembler auf der Programmservice-Diskette zu dieser Ausgabe. Zum Programmieren des internen EPROMs ist ein spezielles Programmiergerät erforderlich, dessen Schaltbild und Layout Sie in dieser Ausgabe auf Seite 58 finden.

Was leistet das Interface?

Anschließen läßt sich das Interface an jeden handelsüblichen, grafikfähigen Matrixdrucker mit genormter Centronics-Schnittstelle. Mit Hilfe verschiedener Sekundäradressen können Betriebsarten oder -Modi aktiviert werden, mit denen sich die beiden C 64-Zeichensätze (Groß-/Grafikzeichen und Groß-/Kleinschrift) inklusive aller C 64-Steuer- und Grafikzeichen zu Papier bringen lassen. Auch ermöglicht das Interface den Anschluß eines Typenraddruckers. Um HiRes-Grafiken einzusetzen, existiert eine Betriebsart, bei der alle vom C 64 gesendeten Daten unmittelbar zum Drucker weitergeleitet werden. Die Möglichkeit, eine der Betriebsarten für alle Sekundäradressen zu fixieren, erhöht die Kompatibilität zu vorhandener Software. Wollen Sie zum Beispiel mit einem Programm arbeiten, das die Sekundäradresse 4 zum Interface sendet, um den Modus Groß-/Kleinschrift zu aktivieren, ist es nicht erforderlich, das Programm an das Interface anzupassen. Vielmehr reicht in einem solchen Fall die Befehlssequenz: OPEN 4,4:OPEN 5,4,3:CLOSE 4: CLOSE 5

Von nun an ist es egal, welche Sekundäradresse das Programm sendet. Der Drucker gibt so lange Groß-/ Grafikzeichen aus, bis er aus und wieder eingeschaltet wird.

Mit vier DIP-Schaltern läßt sich sowohl die Geräteadresse wie aber auch Auto-Linefeed ein/aus und der Druckertyp festlegen. Das Interface unterstützt nämlich Drucker, bei denen Grafik mit der Sequenz »ESC "*" ...« oder »ESC "K" ..« eingeschaltet wird.

In den beiden Commodore-Modi, die sich mit den Sekundäradressen 0 und 7 ansprechen lassen, kann das Interface teilweise den Commodore-Drucker MPS 801/803 simulieren.

Mit dieser und den zuvor beschriebenen Eigenschaften ist das Selbstbau-Interface den meisten käuflichen Geräten gleichzustellen. Allerdings ist es erheblich preiswerter als die käuflichen Typen, was nicht zuletzt auch durch den Einsatz neuester Technik erreicht wurde.

(A.Bos / ah)

Centronics-Interface für den Selbstbau

Matrixdrucker mit einer Centronics-Schnittstelle lassen sich jetzt für wenig Geld an den seriellen Port des C 64 anschließen. Do it yourself heißt die Devise! Wir geben eine Bauanleitung für ein Centronics-Interface, das es mit käuflichen Interfaces in jeder Beziehung aufnehmen kann.

Wenn Sie Ihren Matrixdrucker mit Centronics-Schnittstelle an den C 64 anschließen wollen, brauchen Sie ein Interface. Die preiswerteste Lösung ist der Selbstbau. Bei der hier vorgestellten Bauanleitung sparen Sie nicht nur Geld, sondern werden einen neuen Computertyp kennenlernen, der in Zukunft an Bedeutung gewinnen wird.

Centronics-Interfaces sind in der Regel sehr aufwendig und entsprechend kostspielig (zwischen 200 und 400 Mark). Denn ähnlich wie die 1541-Disketten-Station kommen sie ohne »intelligente« Baueinheiten nicht aus, da sie mehr leisten müssen als eine seriell-parallel-Wandlung. So muß das Interface zum Beispiel erkennen, ob es vom Computer über eine Geräteadresse angesprochen wurde. Dann muß der Commodore-Zeichensatz in den Standard-ASCII-Zeichensatz, mit dem die meisten Drucker arbeiten, gewandelt werden. Die C 64-Grafik- und Steuerzeichen, die außer den Commodore- und kompatiblen Druckern kein anderer Drucker ausgeben kann, müssen im Grafik-Modus übertragen werden. Außerdem müssen über Sekundäradressen bestimmte Betriebsarten wählbar sein, die bestimmen, ob nun Großschrift und Grafikzeichen oder Groß-/Kleinschrift ausgegeben oder das, was der Computer sendet, ohne Wandlung direkt zum Drucker weitergeleitet werden soll. Um all diese Aufgaben, von denen nur die wichtigsten genannt wurden, zu erledigen, ist ein kompletter Computer erforderlich, und genau aus diesem bestehen die Druckerinterfaces. Es muß also alles, was zu einem Computer gehört, vorhanden sein, angefangen beim Mikroprozessor über RAM und ROM bis hin zu den I/O-Bausteinen. Werden Interfaces diskret, also mit den genannten Bausteinen aufgebaut, sind sie teuer und vom Aufbau her sehr aufwendig. Es geht aber auch anders. Seit einigen Jahren werden sogenannte Ein-Chip-Mikrocomputer hergestellt, in denen alle erforderlichen, zum Computer gehörende, Bausteine untergebracht sind. Weil Bausteine dieser Art in der letzten Zeit zu erschwinglichen Preisen (etwa 30 Mark) vertrieben werden, haben wir uns dazu entschlossen unser Interface mit einem solchen Ein-Chip-Computer, dem MC68705 von Motorola, zu bestücken. Er enthält neben 112 Byte RAM und 1804 Byte EPROM 20 TTL/CMOS-kompatible, bidirektionale I/O-Leitungen. Weitere externe Bausteine reduzieren sich daher auf ein Minimum. Einige Nachteile hat der Einsatz eines solchen Ein-Chip-Computers jedoch für den C 64-Anwender:

Was ist zu beachten?

  1. Die Maschinensprache, mit der sich der MC68705 programmieren läßt, hat nichts mit der Maschinensprache des 6510 zu tun. Man muß also, möchte man den MC68705 für eigene Zwecke einsetzen, eine neue Sprache erlernen. Außerdem ist ein sogenannter Cross-Assembler erforderlich, mit dem sich Programme für den MC68705 auf dem C 64 entwickeln lassen. Ein solcher Cross-Assembler erzeugt also MC68705-Maschinen-Code. Diejenigen, die sich näher mit dem MC68705 beschäftigen wollen, finden einen entsprechenden Cross-Assembler auf der Programmservice-Diskette zu dieser Ausgabe.
  2. Der MC68705-Maschinencode muß nun mit Hilfe eines EPROM-Brenners in ein 2716-EPROM übertragen werden.
  3. Zur Programmierung des Mikrocomputer-Chips ist eine spezielle Schaltung (Bild 1) erforderlich. Das im 2716-EPROM gespeicherte MC68705-Maschinenprogramm wird damit in das EPROM des MC68705 übertragen. Wie das funktioniert, können Sie im entsprechenden Absatz nachlesen.
Schaltplan mit dem Mikrocontroller MC68705P3, dem EPROM MCM 2716, dem Zähler MC14040B, Transistoren 2N2222, Dioden, Leuchtdioden und den Schaltern S1 und S2
Bild 1. Programmiergerät für den Ein-Chip-Computer MC68705 (Schaltbild)

Möchten Sie jedoch nur das im folgenden beschriebene Interface nachbauen und sonst nichts mit dem MC68705 zu tun haben, können Sie den programmierten Ein-Chip-Mikrocomputer beim Autor gegen entsprechendes Entgeld anfordern. Die Adresse finden Sie am Schluß des Artikels.

Wie programmiert man den MC68705

Tippen Sie zunächst das Programm für das Interface (Listing 1) mit dem MSE ab und speichern es anschließend auf Diskette oder Kassette.

Mit einem EPROM-Brenner Ihrer Wahl muß das soeben gespeicherte Programm in ein 2716-EPROM übertragen werden. Wie das funktioniert, und was dabei zu beachten ist, entnehmen Sie bitte der Anleitung zu Ihrem EPROM-Brenner.

So, jetzt wird's interessant, denn nun geht es an die Hardware, und zwar an das Programmiergerät zum MC68705. Wie eingangs schon erwähnt, ist dazu eine spezielle Schaltung erforderlich, die Sie in Bild 1 finden.

Das entsprechende Layout im Verhältnis 1:1 zeigt Bild 2 (Vorsicht spiegelverkehrt). Wollen Sie keine Platine für das Programmiergerät ätzen, können Sie die Schaltung auch auf einer Lochrasterplatine aufbauen. Welche Bauteile dazu benötigt und wie sie positioniert werden, zeigt Bild 3. Um das im EPROM gespeicherte Programm in den MC68705 zu übertragen, sind folgende Schritte erforderlich:

  1. Bevor der MC68705 und das mit dem Listing 1 gebrannte EPROM in die dafür vorgesehene Fassung gesteckt wird, überzeugen Sie sich davon, daß die im Schaltbild mit S1 und S2 gekennzeichneten Schalter geschlossen sind und weder VCC = 5V noch die erforderlichen 26V anliegen.
  2. Befinden sich die Bausteine in den entsprechenden Fassungen, und sind die beiden erforderlichen Spannungen angelegt, muß zuerst der Schalter S2 und anschließend der Schalter S1 geöffnet werden. Nun wird automatisch ein im MC68705 resistent enthaltenes Boot-Programm gestartet, das die Daten aus dem 2716-EPROM ausliest und im EPROM des Ein-Chip-Computers speichert.
  3. Bevor Sie nun den MC68705 aus der Fassung ziehen, überzeugen Sie sich davon, daß die beiden Schalter S1 und S2 geschlossen und die angelegten Spannungen abgeklemmt sind.
Zwei Platinenlayouts übereinander: oben Lötaugen mit wenigen Leiterbahnen, unten Lötaugen mit vielen Leiterbahnen
Bild 2. Layout zum Programmiergerät; Verhältnis 1:1 (oben Bestückungsseite, unten Lötseite)
Bauteilliste mit Widerständen, Kondensatoren, Dioden, ICs, Transistoren und Quarz neben einem Bestückungsplan mit den Positionen von IC1 bis IC3, R1 bis R8, C1 bis C9, D1 bis D7, T1, T2, QZ, S1, S2 und ST1
Bild 3. Bestückungsplan und Bauteilliste zum Programmiergerät

Aufbau des Interfaces

Bild 4 zeigt das Schaltbild, Bild 5 das dazugehörige Layout im Verhältnis 1:1 und Bild 6 den entsprechenden Bestückungsplan mit allen erforderlichen Bauteilen. Um das Interface mit dem Drucker zu verbinden, nehmen Sie am besten ein 36poliges Flachbandkabel. Das eine Ende ist mit dem Centronics-Stecker und das andere mit dem Interface zu verbinden. Achten Sie beim Löten unbedingt darauf, daß Leitungen nicht vertauscht werden. Das gleiche gilt auch für die Verbindung zwischen Computer und Interface. Die Pinbelegungen für den Centronics- und für den seriellen Stecker zeigt Bild 7. Ist das Interface zusammengebaut, muß noch der Pin 18 der Centronics-Buchse im Drucker auf 5 V gelegt werden, um das Interface mit der erforderlichen Spannung zu versorgen.

Schaltplan mit dem Mikrocontroller MC 68705 P3, dem Transistor BC517, der Diode 1N 4148, Widerständen, einem Reset-Taster, DIP-Schaltern und Steckeranschlüssen, links eine Bauteilliste
Bild 4. Schaltbild des Interface
Platinenlayout mit Leiterbahnen und Lötaugen, schwarz auf weiß
Bild 5. Layout des Interface (Verhältnis 1:1) spiegelverkehrt
Bestückungsplan mit dem Sockel des MC 68705 P3, einem vierfachen Schalter, Widerständen von 10 K bis 39 K, dem Transistor BC 517, Kondensatoren, Reset-Taster und beschrifteten Anschlüssen für strobe, D0 bis D7, Busy, Gnd., +5 Volt, Atn., clock, data und Reset
Bild 6. Bestückungsplan und Bauteilliste zum Interface
Pin Signal
1 SERIAL SRQIN
2 GND
3 SERIAL ATN/IN/OUT
4 SERIAL CLK IN/OUT
5 SERIAL DATA IN/OUT
6 RESET
Sechspolige runde DIN-Buchse in Draufsicht mit den Kontakten 1 bis 6
Pin Signal
1 Strobe
2-9 D0 - D7
11 /
16 Busy
18 +5 V
36-poliger Centronics-Stecker in Draufsicht, Kontakte in zwei Reihen, Pinnummern am Rand
Bild 7. Pinbelegung des Centronics-Steckers und des seriellen Ports am C 64 oder C 128

Achten Sie bei der Herstellung der Platine unbedingt darauf, daß sie richtig herum geätzt wird, denn das abgedruckte Layout ist spiegelverkehrt. Spiegelverkehrt deshalb, weil bei der von Ihnen erstellten Folie die Farbschicht der Leiterbahnen auf der Unterseite liegen müssen, um Unterlichtungen beim Belichten der Platine zu vermeiden.

Was leistet das Interface?

Doch nun zum eigentlich interessanten Thema, zu dem, was das Interface leistet. Es soll an dieser Stelle noch angemerkt sein, daß mit dem Interface keine reversen Zeichen ausgegeben werden können (zum Beispiel die Kopfzeile beim Drucken des Directory).

Die vom Computer gesendeten Sekundäradressen dienen dazu, unterschiedliche Interface-Funktionen beziehungsweise Betriebsarten zu selektieren:

Sekundäradresse = 0: Wird mit dem Befehl OPEN 4,4,0 oder OPEN 4,4 ein Druckerkanal geöffnet, werden alle Daten im Groß-/Grafikmodus gedruckt. Dabei werden alle C 64-Sonderzeichen berücksichtigt (Listing 2 und Ausdruck 1).

Zeichentabelle mit Spalten 0 bis F und Zeilen 0 bis F: Ziffern, Großbuchstaben, Satzzeichen und Blockgrafikzeichen
Ausdruck 1. Im Modus Groß-/Grafikzeichen (Sekundäradresse 0) werden alle C 64-Sonderzeichen berücksichtigt

Sekundäradresse = 1, 5 oder 6: In diesem Modus schaltet das Interface auf »Durchgang«, das heißt alle vom Computer gesendeten Daten werden direkt zum Drucker weitergeleitet. Somit lassen sich alle druckerspezifischen Befehle wie Fettschrift ein/aus, Unterstreichen ein/aus oder auch die unterschiedlichen Bit-Image-Modi der verschiedenen Druckertypen ansprechen. Dieser Modus wird auch als Linearkanal oder Direktmodus bezeichnet (Listing 3 und Ausdruck 2).

Zeichentabelle mit Spalten 0 bis F und Zeilen 0 bis F: Ziffern, Groß- und Kleinbuchstaben und Satzzeichen, rechts dieselben Zeichen kursiv
Ausdruck 2. Wird der Linearkanal geöffnet, stehen neben den Grafik-Modi und ESC-Sequenzen diese Zeichen zur Verfügung

Sekundäradresse = 2: Die Sekundäradresse 2 ermöglicht den Anschluß eines Typenraddruckers mit Centronics-Schnittstelle. Dabei gilt der Standard-ASCII-Zeichensatz, der auch bei allen Matrixdruckern Gültigkeit hat. Jedoch wird das höchstwertige Bit (Bit 8) abgeschnitten, so daß maximal 128 unterschiedliche Zeichen ausgegeben werden können. Wird vom Computer ein Zeichen gesendet, das größer ist als 128, zum Beispiel 193, so gibt der Typenraddrucker den Buchstaben »A« aus, denn 193 - 128 = 65. Und die Zahl 65 entspricht im normalen 8-Bit-ASCII-Zeichensatz einem »A« (Listing 4 und Ausdruck 3).

Zeichentabelle mit Spalten 0 bis f und Zeilen 0 bis f: Ziffern, Klein- und Großbuchstaben und Satzzeichen, rechte Hälfte wiederholt die linke
Ausdruck 3. Zum Ansteuern eines Typenraddruckers wird das höchstwertige Bit abgeschnitten. Übrig bleiben diese Zeichen

Sekundäradresse = 3: Wird ein Kanal mit der Sekundäradresse 3 geöffnet, wird die zuletzt angewählte Betriebsart fixiert. Beispiel: OPEN 4,4,7:OPEN 5,4,3:PRINT #4:PRINT #5:CLOSE4:CLOSE5

Mit dem ersten OPEN-Befehl wird der Kanal für den Groß/ Kleinschriftmodus geöffnet, um zum Beispiel einen Text mit einem Textverarbeitungsprogramm auszugeben. Der zweite OPEN-Befehl fixiert diesen Modus für alle Sekundäradressen. Das heißt unabhängig davon, welche Sekundäradresse von dem Textverarbeitungsprogramm gesendet wird, der zuvor im OPEN-Befehl festgelegte Modus bleibt so lange aktiv, bis der Drucker ausgeschaltet beziehungsweise das Interface zurückgesetzt wird. Bis auf den Linearkanal lassen sich alle Betriebsarten genauso fixieren. Wird ein Kanal mit der Sekundäradresse 1 geöffnet, fixiert das Interface den Linearkanal. Dieser bleibt wieder so lange aktiv, bis der Drucker ausgeschaltet oder das Interface zurückgesetzt wird.

Sekundäradresse = 7: Diese Betriebsart selektiert den Groß-/Kleinschriftmodus. Alle Zeichen werden so ausgegeben, wie sie im entsprechenden C 64-Zeichensatz auf dem Bildschirm erscheinen (Listing 5 Ausdruck 4).

Zeichentabelle mit Spalten 0 bis f und Zeilen 0 bis f: Ziffern, Klein- und Großbuchstaben, Satzzeichen und Blockgrafikzeichen
Ausdruck 4. Zur Demonstration des Business-Modus

Sekundäradresse = 14: Ist der DIP-Schalter für Auto-Linefeed im Drucker ausgeschaltet, läßt er sich softwaremäßig mit Hilfe der Sekundäradresse 14 im OPEN-Befehl einschalten.

Sekundäradresse = 15: Wurde mit der Sekundäradresse 14 Auto-Linefeed eingeschaltet, so läßt er sich mit Hilfe der Sekundäradresse 15 wieder ausschalten.

Wird ein Druckerkanal mit einer hier nicht aufgeführten Sekundäradresse geöffnet, schaltet das Interface in die Betriebsart für Groß-/Grafikzeichen (entspricht Sekundäradresse 0).

Neben dieser softwaremäßigen Selektion der Betriebsarten über Sekundäradressen lassen sich bestimmte Modi auch hardwaremäßig mit Hilfe von vier DIP-Schaltern einstellen.

DIP-Schalter 1: Auto-Linefeed ein/aus
on = Auto-Linefeed ein
off = Auto-Linefeed aus

DIP-Schalter 2 und 3: Einstellen der Geräteadresse, unter der sich der Drucker ansprechen läßt

2 3
off off = Geräteadresse 4
off on = ″ 5
on off = ″ 6
on on = ″ 7

DIP-Schalter 4: Da das Interface von der Ansteuerung her teilweise den Commodore-Drucker MPS 801/803 simulieren kann, läßt sich mit diesem DIP-Schalter die ESC-Sequenz vorgeben, die das Interface an den Drucker schickt, wenn eine Grafik im Commodore-Modus ausgegeben werden soll. Wie der Schalter einzustellen ist, hängt vom angeschlossenen Drucker ab. Verlangt der Drucker vor der Grafikausgabe die Sequenz »ESC "K" ...«, muß DIP-Schalter 4 auf »off« stehen. Verlangt der Drucker die Sequenz »ESC "*" ..«, muß DIP-Schalter 4 auf »on« stehen.

Der eben angesprochene Commodore-Modus ist automatisch eingeschaltet, wenn ein Druckerkanal mit der Sekundäradresse »0« oder »7« geöffnet wurde. In diesen Modi stehen folgende Steuercodes zur Verfügung.

MPS 801-kompatible Steuercodes

CHR$(8);CHR$(26);CHR$(n);CHR$(xxx): Diese Sequenz wiederholt ein Grafik-Byte. Dabei gibt »xxx« den Inhalt des Grafik-Bytes und »n« die zu wiederholende Anzahl an (Listing 6 und Ausdruck 5).

Sechs untereinander gedruckte waagerechte Balken, jeder länger als der vorige
Ausdruck 5. Wird Listing 6 mit RUN gestartet, sollten Sie zu diesem Ausdruck kommen.

CHR$(14): Schaltet doppelte Zeichenbreite ein (Listing 7 und Ausdruck 6)

Druckerausgabe: zweimal die Ziffernfolge 0123456789 viermal hintereinander, darunter COMMODORE PRINTER, einmal in normaler und einmal in doppelter Zeichenbreite
Ausdruck 6. Doppelte Zeichenbreite ist für das Interface kein Problem

CHR$(15): Schaltet doppelte Zeichenbreite aus

CHR$(16);"AB";"string": Definiert Druckposition. Dabei gibt »A« die Zehnerstelle und »B« die Einerstelle an, ab der »string« ausgegeben wird (Listing 7 und Ausdruck 6).

CHR$(17): Schaltet innerhalb einer Zeile den Zeichensatz in den Cursor-Down-Modus (entspricht der Betriebsart, die mit Sekundäradresse 7 angewählt wird). Haben Sie einen Druckerkanal mit der Sekundäradresse »0« geöffnet (Groß-/ Grafikzeichen), lassen sich nach dem Befehl »CHR$(17)« innerhalb einer Zeile auch Kleinbuchstaben ausgeben (Listing 8 und Ausdruck 7).

Zwei Druckzeilen: »Diese Zeile ist im LOCAL BUSINESS MODUS gedruckt« und »Diese Zeile ist im LOCAL GRAFIK modus gedruckt«
Ausdruck 7. Ein Beispiel zum CRSR-Up und -Down-Modus

CHR$(145): Schaltet innerhalb einer Zeile den Zeichensatz in den Cursor-Up-Modus (entspricht der Betriebsart, die mit Sekundäradresse 7 angewählt wird). Dieser Befehl ist das Gegenstück zu »CHR$(17)«

Damit sind alle Funktionen, Befehle und Steuersequenzen erklärt.

Eine Anmerkung noch zu den Layouts: Wenn Sie die Platinen herstellen, ist zu beachten, daß alle Layouts spiegelverkehrt veröffentlicht sind.

(A.Bos / ah)

Den programmierten Ein-Chip-Computer MC68705 können Sie bei folgender Adresse bestellen: A.Bos, Nijlanderhemstraat 21, 8608 BH SNEEK, Holland

PROGRAMM : EPROM INTERF.64 8000 8800
-----------------------------------
8000 : 00 00 00 00 00 00 00 00   01
8008 : 00 00 00 00 00 00 00 00   09
8010 : 00 00 00 00 00 00 00 00   11
8018 : 00 00 00 00 00 00 00 00   19
8020 : 00 00 00 00 00 00 00 00   21
8028 : 00 00 00 00 00 00 00 00   29
8030 : 00 00 00 00 00 00 00 00   31
8038 : 00 00 00 00 00 00 00 00   39
8040 : 00 00 00 00 00 00 00 00   41
8048 : 00 00 00 00 00 00 00 00   49
8050 : 00 00 00 00 00 00 00 00   51
8058 : 00 00 00 00 00 00 00 00   59
8060 : 00 00 00 00 00 00 00 00   61
8068 : 00 00 00 00 00 00 00 00   69
8070 : 00 00 00 00 00 00 00 00   71
8078 : 00 00 00 00 00 00 00 00   79
8080 : A6 18 2E FE 2E FE 11 02   C1
8088 : 2E 0E 4A 26 FB A6 10 10   6A
8090 : 02 4A 26 FD 1E 11 11 02   B3
8098 : 2F FE 2E FE 03 02 00 56   9F
80A0 : 2F FE 2E FE 03 02 00 56   A7
80A8 : 2F FE 2E FE 03 02 00 56   AF
80B0 : 2F FE 2E FE 03 02 00 56   B7
80B8 : 2F FE 2E FE 03 02 00 56   BF
80C0 : 2F FE 2E FE 03 02 00 56   C7
80C8 : 2F FE 2E FE 03 02 00 56   CF
80D0 : 2F FE 2E FE 03 02 00 56   D7
80D8 : 2F FE 10 02 81 CD 04 CA   F7
80E0 : 00 00 FD B7 01 17 02 16   54
80E8 : 02 BD 80 04 02 EF CC 04   44
80F0 : 58 00 00 00 00 00 00 00   49
80F8 : 00 00 00 00 00 00 00 00   F9
8100 : 00 00 00 00 00 00 FE FE   FA
8108 : FE 00 00 00 1E 1E 1E 1E   8E
8110 : 1E 1E 80 80 80 80 80 80   7D
8118 : 02 02 02 02 02 02 FE 00   08
8120 : 00 00 00 00 AA 54 AA 54   C1
8128 : AA 54 00 00 00 00 00 FE   FA
8130 : 0A 14 0A 14 0A 14 FC F8   71
8138 : F0 E0 C0 80 00 00 00 00   D9
8140 : 00 FE 00 00 00 FE 10 10   18
8148 : 00 00 00 1E 1E 1E 00 00   DF
8150 : 00 F0 10 10 10 10 10 1E   CC
8158 : 00 00 06 06 06 06 06 06   4F
8160 : 00 00 00 1E 10 10 10 10   06
8168 : 10 F0 10 10 10 10 10 1E   F4
8170 : 10 10 10 10 10 FE 00 00   87
8178 : FE 00 00 00 00 00 FE FE   70
8180 : 00 00 00 00 00 00 00 00   81
8188 : FE FE 80 80 80 80 80 80   45
8190 : C0 C0 C0 C0 C0 C0 0E 0E   5F
8198 : 0E 0E 0E 0E 02 02 02 02   2F
81A0 : 02 FE 1E 1E 1E 00 00 00   4F
81A8 : 00 00 00 E0 E0 E0 10 10   3A
81B0 : 10 F0 00 00 E0 E0 E0 00   D1
81B8 : 00 00 E0 E0 E0 1E 1E 1E   C0
81C0 : 10 10 10 10 10 10 38 72   26
81C8 : FE 72 38 00 00 00 FE 00   09
81D0 : 00 00 20 20 20 20 20 20   A0
81D8 : 40 40 40 40 40 40 80 80   5A
81E0 : 80 80 80 80 08 08 08 08   C1
81E8 : 08 08 00 FE 00 00 00 00   D4
81F0 : 00 00 00 00 FE 00 10 10   41
81F8 : 08 06 00 00 00 00 00 C0   85
8200 : 20 10 10 10 20 C0 00 00   37
8208 : FE 02 02 02 02 02 40 20   3A
8210 : 10 08 04 02 02 04 08 10   E6
8218 : 20 40 FE 80 80 80 80 80   37
8220 : 80 80 80 80 80 FE 3C 7E   FE
8228 : 7E 7E 3C 00 04 04 04 04   6D
8230 : 04 04 38 7C 3E 7C 38 00   7D
8238 : 00 FE 00 00 00 00 00 00   B8
8240 : 00 06 08 10 42 24 18 18   1D
8248 : 24 42 3C 42 42 42 3C 00   0C
8250 : 38 50 FE 50 38 00 00 00   FE
8258 : 00 00 FE 00 18 3C 7E 3C   EE
8260 : 18 00 10 10 10 FE 10 10   D8
8268 : AA 54 AA 00 00 00 00 00   E7
8270 : 00 FE 00 00 10 3E 20 3E   DF
8278 : 20 00 80 C0 E0 F0 F8 FC   44
8280 : 00 00 00 00 00 00 FE FE   7A
8288 : FE 00 00 00 1E 1E 1E 1E   0E
8290 : 1E 1E 80 80 80 80 80 80   FD
8298 : 02 02 02 02 02 02 FE 00   88
82A0 : 00 00 00 00 AA 54 AA 54   41
82A8 : AA 54 00 00 00 00 00 FE   7A
82B0 : 0A 14 0A 14 0A 14 FC F8   F1
82B8 : F0 E0 C0 80 00 00 00 00   59
82C0 : 00 FE 00 00 00 FE 10 10   98
82C8 : 00 00 00 1E 1E 1E 00 00   5F
82D0 : 00 F0 10 10 10 10 10 1E   4C
82D8 : 00 00 06 06 06 06 06 06   CF
82E0 : 00 00 00 1E 10 10 10 10   86
82E8 : 10 F0 10 10 10 10 10 1E   74
82F0 : 10 10 10 10 10 FE 00 00   07
82F8 : FE 00 00 00 00 00 FE FE   F0
8300 : 00 00 00 00 00 00 00 00   01
8308 : FE FE 80 80 80 80 80 80   C5
8310 : C0 C0 C0 C0 C0 C0 0E 0E   DF
8318 : 0E 0E 0E 0E 02 02 02 02   AF
8320 : 02 FE 1E 1E 1E 00 00 00   CF
8328 : 00 00 00 E0 E0 E0 10 10   BA
8330 : 10 F0 00 00 E0 E0 E0 00   51
8338 : 00 00 10 3E 20 3E 20 00   79
8340 : 00 FE 82 82 00 00 12 7E   F6
8348 : 92 92 42 00 00 82 82 FE   D0
8350 : 00 00 00 20 40 FE 40 20   92
8358 : 10 38 54 10 10 10 10 10   7D
8360 : 10 10 10 10 10 10 10 FE   3E
8368 : 10 10 AA 54 AA 00 00 00   60
8370 : 00 00 00 FE 00 00 CE CE   29
8378 : 30 30 CE CE 24 92 48 24   8E
8380 : 92 48 48 92 24 48 92 24   B2
8388 : 1E 04 08 10 20 00 82 7C   B2
8390 : 74 7A 84 FE 00 6E 66 6A   24
8398 : 9C FE 9A 6C 6C 6C B2 FE   DA
83A0 : 00 6C 6C 6C 7C FE 00 00   3F
83A8 : A6 1B CD 05 61 A6 44 CD   E8
83B0 : 05 61 BD 80 9F A4 0F 48   D1
83B8 : B7 14 48 48 BB 14 B7 14   F8
83C0 : BD 80 9F A4 0F BB 14 CD   F4
83C8 : 05 61 A6 00 CD 05 61 A6   FF
83D0 : 09 CD 05 61 CC 05 5E 00   9C
83D8 : A1 9F 23 02 A4 7F A1 0D   39
83E0 : 27 11 A1 60 24 05 A1 40   76
83E8 : 24 05 81 A4 5F 20 FB AA   C0
83F0 : 20 20 F7 0F 16 F4 CD 05   4A
83F8 : 61 A6 0A 81 00 00 00 00   5F
8400 : A6 00 B7 04 A6 FF B7 05   68
8408 : 4C B7 01 A6 09 B7 06 4A   40
8410 : B7 02 3F 11 3F 15 3F 1A   88
8418 : 3F 16 3F 1B 3F 1C B6 00   45
8420 : A8 FF 97 47 A4 03 AB 24   F0
8428 : B7 12 A6 D6 B7 20 A6 01   86
8430 : B7 21 3F 22 A6 81 B7 23   28
8438 : 98 9F 48 24 02 1E 1A 98   E1
8440 : 48 24 02 1E 16 04 02 FD   64
8448 : 2F FE 3F 13 3F 17 3F 18   02
8450 : 3F 19 3F 1B 10 02 BD 80   58
8458 : B3 12 27 19 A3 3F 26 02   D2
8460 : 20 03 0F 11 09 A6 0E 10   06
8468 : 02 4A 26 FD 1F 11 11 02   9B
8470 : 05 02 FD 20 D0 BD 80 05   01
8478 : 02 02 BC DD A3 3F 27 E5   03
8480 : 0E 1C 21 9F A4 0F A1 0E   3E
8488 : 24 1C A1 01 27 28 A1 02   81
8490 : 27 30 A1 03 27 18 A1 05   5C
8498 : 27 1C A1 06 27 18 A1 07   BE
84A0 : 27 1A 1F 13 BC E9 A1 0F   BE
84A8 : 26 08 1E 16 20 F6 1E 1C   87
84B0 : 20 F2 1F 16 20 EE 1E 15   F0
84B8 : 1F 13 20 E8 1E 13 1E 19   AB
84C0 : 20 E2 1F 13 1F 19 1E 1B   E5
84C8 : 20 DA 9F 0F 15 0D A1 0D   79
84D0 : 26 08 0F 16 05 CD 05 61   17
84D8 : A6 0A 81 0E 1B 15 A1 22   CB
84E0 : 26 02 3C 17 A4 7F A1 1F   04
84E8 : 23 3D 9F 0E 13 3C A1 5B   A4
84F0 : 24 04 81 CC 03 D8 A1 60   4E
84F8 : 24 1A A6 03 B7 21 A6 40   D3
8500 : B7 22 9F A0 5B B7 14 48   19
8508 : 48 BB 14 BB 14 BB 22 B7   C1
8510 : 22 CC 05 50 A1 9F 22 03   89
8518 : AB 60 97 3F 22 A6 01 B7   8C
8520 : 21 CD 05 2D CC 05 50 CC   DF
8528 : 06 06 CC 05 6B 9F A0 A0   7D
8530 : B7 14 98 48 24 03 3C 21   AE
8538 : 98 48 24 03 3C 21 98 B9   00
8540 : 14 24 03 3C 21 98 B9 14   95
8548 : 24 03 3C 21 98 B7 22 81   F4
8550 : CD 06 FC BD 20 CD 05 61   5E
8558 : 5C A3 06 26 F6 4F 9C BC   A2
8560 : E9 00 00 FD B7 01 17 02   ED
8568 : 16 02 81 A1 5B 24 08 A1   4E
8570 : 41 24 01 81 AA 20 81 A1   29
8578 : 61 24 14 A0 5B B7 14 A6   16
8580 : 03 B7 21 B6 14 CD 05 32   A6
8588 : AB 40 B7 22 CC 05 50 A1   FF
8590 : 7B 24 03 A4 5F 81 A1 80   FC
8598 : 24 14 A0 7B B7 14 A6 03   1B
85A0 : B7 21 B6 14 CD 05 32 AB   3D
85A8 : 64 B7 22 CC 05 50 A1 A9   B7
85B0 : 26 0B A6 03 B7 21 A6 82   8A
85B8 : B7 22 CC 05 50 A1 BA 26   9D
85C0 : 0B A6 03 B7 21 A6 88 B7   AF
85C8 : 22 CC 05 50 A1 FF 26 0B   64
85D0 : A6 03 B7 21 A6 76 B7 22   4B
85D8 : CC 05 50 A1 C0 26 0B A6   26
85E0 : 03 B7 21 A6 5E B7 22 CC   A2
85E8 : 05 50 A1 E0 24 07 A1 C1   1E
85F0 : 24 08 CC 05 1B A4 BF CC   5C
85F8 : 05 AE A1 DB 24 03 A4 7F   24
8600 : 81 A0 DB CC 05 9C 9F A1   59
8608 : 0D 26 17 0F 18 06 B6 19   8F
8610 : B7 13 3F 18 0E 16 03 3F   40
8618 : 17 81 CD 05 61 3F 17 A6   BE
8620 : 0A 81 A1 11 27 16 A1 91   42
8628 : 27 1C A1 12 27 22 A1 13   38
8630 : 27 24 A1 0E 27 3D A1 0F   94
8638 : 27 4E 26 61 00 17 1D 1E   A6
8640 : 13 1E 18 CC 05 5E 00 17   73
8648 : 54 1F 13 1E 18 CC 05 5E   6D
8650 : 00 17 14 CC 05 5E 00 17   EC
8658 : 14 CC 05 5E A6 8E B7 22   E1
8660 : A6 03 B7 21 CC 05 50 A6   1D
8668 : 94 B7 22 20 F3 A6 9A B7   B3
8670 : 22 20 ED 00 17 27 A6 1B   99
8678 : CD 05 61 A6 57 CD 05 61   B0
8680 : A6 01 CD 05 61 CC 05 5E   08
8688 : 00 17 12 A6 1B CD 05 61   64
8690 : A6 57 CD 05 61 A6 00 CD   DD
8698 : 05 61 CC 05 5E 00 17 17   92
86A0 : A1 10 27 10 A1 08 27 01   0E
86A8 : 81 BD 80 9F A1 1A 27 01   A5
86B0 : 81 CC 07 38 CC 03 A8 AB   3F
86B8 : 40 97 A1 45 26 0B A6 A0   6B
86C0 : B7 22 A6 03 B7 21 CC 05   54
86C8 : 50 A1 80 24 13 A6 03 B7   6F
86D0 : 21 9F A0 5B B7 14 CD 05   B2
86D8 : 32 AB 40 B7 22 CC 06 E9   5B
86E0 : 3F 22 A6 01 B7 21 CD 05   C0
86E8 : 2D CD 06 FC BD 20 A8 FE   9A
86F0 : CD 05 61 5C A3 06 26 F4   11
86F8 : 4F 9C BC E9 0E 1A 15 A6   55
8700 : 1B CD 05 61 A6 4B CD 05   75
8708 : 61 A6 06 CD 05 61 5F 4F   6F
8710 : CD 05 61 81 A6 1B CD 05   6D
8718 : 61 A6 2A CD 05 61 A6 00   07
8720 : CD 05 61 A6 06 CD 05 61   43
8728 : 5F 4F CD 05 61 81 00 00   65
8730 : 00 00 00 00 00 00 00 00   31
8738 : A6 1B CD 05 61 0E 1A 07   7D
8740 : A6 4B CD 05 61 20 0A A6   2C
8748 : 2A CD 05 61 A6 00 CD 05   72
8750 : 61 BD 80 9F B7 14 CD 05   01
8758 : 61 A6 00 CD 05 61 BD 80   19
8760 : 9F BE 14 CD 05 61 5A 26   2E
8768 : FA CC 05 5E 00 00 00 00   D6
8770 : 00 00 00 00 00 00 00 00   71
8778 : 00 00 00 00 00 00 00 00   79
8780 : 00 00 00 00 80 00 00 00   89
8788 : 00 00 00 00 00 00 00 00   89
8790 : 00 00 00 00 00 00 00 00   91
8798 : 00 00 00 00 00 00 00 00   99
87A0 : 00 00 00 00 00 00 00 00   A1
87A8 : 00 00 00 00 00 00 00 00   A9
87B0 : 00 00 00 00 00 00 00 00   B1
87B8 : 00 00 00 00 00 00 00 00   B9
87C0 : 00 00 00 00 00 00 00 00   C1
87C8 : 00 00 00 00 00 00 00 00   C9
87D0 : 00 00 00 00 00 00 00 00   D1
87D8 : 00 00 00 00 00 00 00 00   D9
87E0 : 00 00 00 00 00 00 00 00   E1
87E8 : 00 00 00 00 00 00 00 00   E9
87F0 : 00 00 00 00 00 00 00 00   F1
87F8 : 00 00 00 00 00 00 04 00   09
Listing 1. MC68705-Maschinencode. Das Programm ist mit dem MSE einzugeben und zu speichern.
100 rem sa=0.. gross-/grafikmodus
110 open4,4:rem identisch mit open4,4,0
130 a$="0123456789abcdef"
140 print#4,"  ";
150 fori=0to15
160 print#4,mid$(a$,i+1,1)" ";
170 nexti
180 print#4
190 :
200 forj=0to15
210 print#4,mid$(a$,j+1,1)" ";
220 print#4,sp$;"    ";
230 print#4,chr$(j+32)" "chr$(j+48)" ";
240 print#4,chr$(j+64)" "chr$(j+80)" ";
250 print#4,chr$(j+96)" "chr$(j+112)" ";
260 print#4,"    ";
270 print#4,chr$(j+160)" "chr$(j+176)" ";
280 print#4,chr$(j+192)" "chr$(j+208)" ";
290 print#4,chr$(j+224)" "chr$(j+240)" "
300 nextj
310 fork=1to8:print#4:nextk
320 close4
Listing 2. Demoprogramm zum Groß-/Grafikmodus
100 rem sa=1..
110 open4,4,1:rem linearkanal
130 a$="0123456789abcdef"
140 print#4,"  ";
150 fori=0to15
160 print#4,mid$(a$,i+1,1)" ";
170 nexti
180 print#4
190 :
200 forj=0to15
210 print#4,mid$(a$,j+1,1)" ";
220 print#4,sp$;"    ";
230 print#4,chr$(j+32)" "chr$(j+48)" ";
240 print#4,chr$(j+64)" "chr$(j+80)" ";
250 print#4,chr$(j+96)" "chr$(j+112)" ";
260 print#4,"    ";
270 print#4,chr$(j+160)" "chr$(j+176)" ";
280 print#4,chr$(j+192)" "chr$(j+208)" ";
290 print#4,chr$(j+224)" "chr$(j+240)" "
300 nextj
310 fork=1to8:print#4:nextk
320 close4
Listing 3. Demoprogramm zum Linearkanal
100 rem sa=2.. ascii-mode fuer typenrad
110 open4,4,2
130 a$="0123456789abcdef"
140 print#4,"  ";
150 fori=0to15
160 print#4,mid$(a$,i+1,1)" ";
170 nexti
180 print#4
190 :
200 forj=0to15
210 print#4,mid$(a$,j+1,1)" ";
220 print#4,sp$;"    ";
230 print#4,chr$(j+32)" "chr$(j+48)" ";
240 print#4,chr$(j+64)" "chr$(j+80)" ";
250 print#4,chr$(j+96)" "chr$(j+112)" ";
260 print#4,"    ";
270 print#4,chr$(j+160)" "chr$(j+176)" ";
280 print#4,chr$(j+192)" "chr$(j+208)" ";
290 print#4,chr$(j+224)" "chr$(j+240)" "
300 nextj
310 fork=1to8:print#4:nextk
320 close4
Listing 4. Demoprogramm zum ASCII-Modus
100 rem sa=7.. gross-/kleinschriftmodus
110 open4,4,7:rem business mode
130 a$="0123456789abcdef"
140 print#4,"  ";
150 fori=0to15
160 print#4,mid$(a$,i+1,1)" ";
170 nexti
180 print#4
190 :
200 forj=0to15
210 print#4,mid$(a$,j+1,1)" ";
220 print#4,sp$;"    ";
230 print#4,chr$(j+32)" "chr$(j+48)" ";
240 print#4,chr$(j+64)" "chr$(j+80)" ";
250 print#4,chr$(j+96)" "chr$(j+112)" ";
260 print#4,"    ";
270 print#4,chr$(j+160)" "chr$(j+176)" ";
280 print#4,chr$(j+192)" "chr$(j+208)" ";
290 print#4,chr$(j+224)" "chr$(j+240)" "
300 nextj
310 fork=1to8:print#4:nextk
320 close4
Listing 5. Demoprogramm zum Groß-/Kleinschriftmodus
10 rem grafik-byte wiederholen
20 rem chr$(8)chr$(26)chr$(n)chr$(grafik-byte)
30 rem chr$(n) ist eine zahl zwischen 0 und 255 und bestimmt die anzahl der zu
40 rem druckenden grafik-bytes
50 open4,4
60 fori=1to6
70 readn
80 print#4,chr$(8)chr$(26)chr$(n)chr$(243)
90 nexti
100 close4
110 data30,60,90,120,150,255
Listing 6. Dieses Demoprogramm wiederholt Grafik-Bytes
100 rem chr$(16) .. druckposition setzen
110 open4,4
120 forq=1to4
130 print#4,"0123456789";
140 nextq
150 print#4
160 print#4,chr$(16)"08";"commodore";
170 print#4,chr$(16)"30";"printer"
175 forq=1to4:print#4:next
180 forq=1to4
190 print#4,"0123456789";
200 nextq
210 print#4
220 print#4,chr$(16)"04"chr$(14)"commodore"chr$(15);
230 print#4,chr$(16)"26"chr$(14)"printer"chr$(15)
240 print#4
250 close4
Listing 7. Zum Testen der doppelten Zeichenbreite
100 rem local-modus
110 rem chr$(17)/chr$(145) = crsr down/up
120 rem chr$(17) funktioniert so lange, bis man chr$(145) oder <return> eingibt
130 rem chr$(145) funktioniert so lange, bis man chr$(17) oder <return> eingibt
140 open4,4:rem gross-/grafikmodus
150 print#4,"{down}Diese Zeile ist im ";
160 print#4,"{down}LOCAL{$a0}BUSINESS MODUS gedruckt"
170 print#4
180 close4
190 open4,4,7:rem gross-/kleinschrift
200 print#4,"Diese Zeile ist im ";
210 print#4,"{up}local grafik{down} modus gedruckt"
220 close4
Listing 8. Mit dem Befehl CHR$(17) kann innerhalb einer Druckzeile der zweite Commodore-Zeichensatz aktiviert werden.
100 rem commodore-steuerzeichen
110 rem die steuerzeichen sind in beiden modi sek.adr = 0 und 7 identisch
130 print"{home} home"
135 print"{clr} clr"
140 print"{down} crsr down"
150 print"{up} crsr up"
160 print"{rght} crsr rechts"
170 print"{left} crsr links"
180 print"{rvon} rvs on"
190 print"{rvof} rvs off"
200 print"{f1} f1"
210 print"{f3} f3"
220 print"{f5} f5"
230 print"{f7} f7"
240 print"{f2} f2"
250 print"{f4} f4"
260 print"{f6} f6"
270 print"{f8} f8"
280 print"{blk} blk"
290 print"{wht} wht"
300 print"{red} red"
310 print"{cyn} cyn"
320 print"{pur} pur"
330 print"{grn} grn"
340 print"{blu} blu"
350 print"{yel} yel"
360 print"{orng} orng"
370 print"{brn} brn"
380 print"{lred} lred"
390 print"{gry1} dgry"
400 print"{gry2} mgry"
410 print"{lgrn} lgrn"
420 print"{lblu} lblu"
430 print"{gry3} lgry"
440 open4,4:cmd4:list
10 data *port-a equ 0000
20 data *port-b equ 0001
30 data *port-c equ 0002
40 data *ddr-a equ 0004
50 data *ddr-b equ 0005
60 data *ddr-c equ 0006
70 data *eoi-flag equ 0011
80 data *dev-# equ 0012
90 data *sec.flag equ 0013
100 data *label14 equ 0014
110 data *cbm-flag equ 0015
120 data *lf-flag equ 0016
130 data *$22-flag equ 0017
140 data *crsr-flag equ 0018
150 data *restore equ 0019
160 data *dot-flag equ 001a
170 data *asc.flag equ 001b
175 data *frz-flag equ 001c
180 data *opcode equ 0020
190 data *hi-byte equ 0021
200 data *lo-byte equ 0022
210 data *label23 equ 0023
220 data org 07fe
230 data dat 04
240 data dat 00
250 data org 0784
260 data dat 80
270 data org 0080
280 data *get-byte lda@ 18
290 data *clockl bil clockl
300 data *lclock bil lclock
310 data bcl0 port-c
320 data *bil bil clock1h
330 data *deca deca
340 data bne bil
350 data lda@ 10
360 data bst0 port-c
370 data *dec deca
380 data bne dec
390 data bst7 eoi-flag
400 data bcl0 port-c
410 data *clock1h bih clock1h
420 data *clock1l bil clock1l
430 data bbc1 port-c bit-1
440 data *bit-1 rorx
450 data *clock2h bih clock2h
460 data *clock2l bil clock2l
470 data bbc1 port-c bit-2
480 data *bit-2 rorx
490 data *clock3h bih clock3h
500 data *clock3l bil clock3l
510 data bbc1 port-c bit-3
520 data *bit-3 rorx
530 data *clock4h bih clock4h
540 data *clock4l bil clock4l
550 data bbc1 port-c bit-4
560 data *bit-4 rorx
570 data *clock5h bih clock5h
580 data *clock5l bil clock5l
590 data bbc1 port-c bit-5
600 data *bit-5 rorx
610 data *clock6h bih clock6h
620 data *clock6l bil clock6l
630 data bbc1 port-c bit-6
640 data *bit-6 rorx
650 data *clock7h bih clock7h
660 data *clock7l bil clock7l
670 data bbc1 port-c bit-7
680 data *bit-7 rorx
690 data *clock8h bih clock8h
700 data *clock8l bil clock8l
710 data bbc1 port-c bit-8
720 data *bit-8 rorx
730 data *byte bih byte
740 data bst0 port-c
750 data rts
760 data *data jsr check
770 data *busy bbs0 port-a busy
780 data sta port-b
790 data bcl3 port-c
800 data bst3 port-c
810 data *jsr80 jsr get-byte
820 data bbs2 port-c data
830 data jmp test-dev
840 data org 0400
850 data lda@ 00
860 data sta ddr-a
870 data lda@ ff
880 data sta ddr-b
890 data inca
900 data sta port-b
910 data lda@ 09
920 data sta ddr-c
930 data deca
940 data sta port-c
950 data clr eoi-flag
960 data clr cbm-flag
970 data clr dot-flag
980 data clr lf-flag
990 data clr asc.flag
995 data clr frz-flag
1000 data lda port-a
1010 data eor@ ff
1020 data tax
1030 data asra
1040 data and@ 03
1050 data add@ 24
1060 data sta dev-#
1070 data lda@ d6
1080 data sta opcode
1090 data lda@ 01
1100 data sta hi-byte
1110 data clr lo-byte
1120 data lda@ 81
1130 data sta label23
1140 data clc
1150 data txa
1160 data asla
1170 data bcc test-lf
1180 data bst7 dot-flag
1190 data *test-lf clc
1200 data asla
1210 data bcc atn
1220 data bst7 lf-flag
1230 data *atn bbs2 port-c atn
1240 data *clock bih clock
1250 data clr sec.flag
1260 data clr $22-flag
1270 data clr crsr-flag
1280 data clr restore
1290 data clr asc.flag
1300 data bst0 port-c
1310 data jsr get-byte
1320 data *test-dev cpx dev-#
1330 data beq plus13
1340 data *unlist cpx@ 3f
1350 data bne atn2
1360 data *datal bra release
1370 data *atn2 bbc7 eoi-flag slr
1380 data *release lda@ 0e
1390 data bst0 port-c
1400 data *tfr deca
1410 data bne tfr
1420 data bcl7 eoi-flag
1430 data *slr bcl0 port-c
1440 data *wait bbc2 port-c wait
1450 data bra atn
1460 data *plus13 jsr get-byte
1470 data bbc2 port-c sec.adr.
1480 data jmp data
1490 data *sec.adr. cpx@ 3f
1500 data beq release
1502 data bbs7 frz-flag store
1510 data txa
1520 data and@ 0f
1530 data cmp@ 0e
1540 data bhs autofeed
1550 data cmp@ 01
1560 data beq truth
1570 data cmp@ 02
1580 data beq ascii
1582 data cmp@ 03
1584 data beq freeze
1590 data cmp@ 05
1600 data beq truth
1610 data cmp@ 06
1620 data beq truth
1630 data cmp@ 07
1640 data beq busin
1650 data *clr.sec. bcl7 sec.flag
1660 data *store jmp jsr80
1670 data *autofeed cmp@ 0f
1680 data bne off
1690 data bst7 lf-flag
1700 data bra store
1703 data *freeze bst7 frz-flag
1706 data bra store
1710 data *off bcl7 lf-flag
1720 data bra store
1730 data *truth bst7 cbm-flag
1740 data bcl7 sec.flag
1750 data bra store
1760 data *busin bst7 sec.flag
1770 data bst7 restore
1780 data bra store
1790 data *ascii bcl7 sec.flag
1800 data bcl7 restore
1810 data bst7 asc.flag
1820 data bra store
1830 data *check txa
1840 data bbc7 cbm-flag check-2
1850 data cmp@ 0d
1860 data bne print
1870 data bbc7 lf-flag print
1880 data jsr out
1890 data lda@ 0a
1900 data *print rts
1910 data *check-2 bbs7 asc.flag ascii-1
1920 data cmp@ 22
1930 data bne verder
1940 data inc $22-flag
1950 data *verder and@ 7f
1960 data cmp@ 1f
1970 data bls codes
1980 data txa
1990 data bbs7 sec.flag transl.
2000 data cmp@ 5b
2010 data bhs graphic
2020 data rts
2030 data *ascii-1 jmp ascii-2
2040 data *graphic cmp@ 60
2050 data bhs bit-8h
2060 data lda@ 03
2070 data sta hi-byte
2080 data lda@ 40
2090 data sta lo-byte
2100 data txa
2110 data sub@ 5b
2120 data sta label14
2130 data asla
2140 data asla
2150 data add label14
2160 data add label14
2170 data add lo-byte
2180 data sta lo-byte
2190 data jmp bit-imm.
2200 data *bit-8h cmp@ 9f
2210 data bhi m.adr.
2220 data add@ 60
2230 data tax
2240 data *m.adr. clr lo-byte
2250 data lda@ 01
2260 data sta hi-byte
2270 data jsr multiply
2280 data jmp bit-imm.
2290 data *codes jmp codes-1
2300 data *transl. jmp business
2310 data *multiply txa
2320 data sub@ a0
2330 data sta label14
2340 data *multi clc
2350 data asla
2360 data bcc multi-4
2370 data inc hi-byte
2380 data clc
2390 data *multi-4 asla
2400 data bcc multi-5
2410 data inc hi-byte
2420 data clc
2430 data *multi-5 adc label14
2440 data bcc sum
2450 data inc hi-byte
2460 data clc
2470 data *sum adc label14
2480 data bcc result
2490 data inc hi-byte
2500 data clc
2510 data *result sta lo-byte
2520 data rts
2530 data *bit-imm. jsr dottest
2540 data *nxt jsr opcode
2550 data jsr out
2560 data incx
2570 data cpx@ 06
2580 data bne nxt
2590 data clra
2600 data *return rsp
2610 data jmp jsr80
2620 data *out bbs0 port-a out
2630 data sta port-b
2640 data bcl3 port-c
2650 data bst3 port-c
2660 data rts
2670 data *business cmp@ 5b
2680 data bhs upper-1
2690 data cmp@ 41
2700 data bhs lower
2710 data rts
2720 data *lower ora@ 20
2730 data rts
2740 data *upper-1 cmp@ 61
2750 data bhs upper-2
2760 data sub@ 5b
2770 data sta label14
2780 data lda@ 03
2790 data sta hi-byte
2800 data lda label14
2810 data jsr multi
2820 data add@ 40
2830 data sta lo-byte
2840 data jmp bit-imm.
2850 data *upper-2 cmp@ 7b
2860 data bhs graph-2
2870 data and@ 5f
2880 data rts
2890 data *graph-2 cmp@ 80
2900 data bhs kar-a9
2910 data sub@ 7b
2920 data *graph-3 sta label14
2930 data lda@ 03
2940 data sta hi-byte
2950 data lda label14
2960 data jsr multi
2970 data add@ 64
2980 data sta lo-byte
2990 data jmp bit-imm.
3000 data *kar-a9 cmp@ a9
3010 data bne kar-ba
3020 data lda@ 03
3030 data sta hi-byte
3040 data lda@ 82
3050 data sta lo-byte
3060 data jmp bit-imm.
3070 data *kar-ba cmp@ ba
3080 data bne kar-ff
3090 data lda@ 03
3100 data sta hi-byte
3110 data lda@ 88
3120 data sta lo-byte
3130 data jmp bit-imm.
3140 data *kar-ff cmp@ ff
3150 data bne kar-c0
3160 data lda@ 03
3170 data sta hi-byte
3180 data lda@ 76
3190 data sta lo-byte
3200 data jmp bit-imm.
3210 data *kar-c0 cmp@ c0
3220 data bne graph-4
3230 data lda@ 03
3240 data sta hi-byte
3250 data lda@ 5e
3260 data sta lo-byte
3270 data jmp bit-imm.
3280 data *graph-4 cmp@ e0
3290 data bhs graph-5
3300 data cmp@ c1
3310 data bhs upper-3
3320 data jmp m.adr.
3330 data *graph-5 and@ bf
3340 data jmp kar-a9
3350 data *upper-3 cmp@ db
3360 data bhs graph-6
3370 data and@ 7f
3380 data rts
3390 data *graph-6 sub@ db
3400 data jmp graph-3
3410 data *codes-1 txa
3420 data cmp@ 0d
3430 data bne codes-2
3440 data bbc7 crsr-flag cr-1
3450 data lda restore
3460 data sta sec.flag
3470 data clr crsr-flag
3480 data *cr-1 bbs7 lf-flag lf
3490 data clr $22-flag
3500 data rts
3510 data *lf jsr out
3520 data clr $22-flag
3530 data lda@ 0a
3540 data rts
3550 data *codes-2 cmp@ 11
3560 data beq codes-3
3570 data cmp@ 91
3580 data beq codes-4
3590 data cmp@ 12
3600 data beq codes-5
3610 data cmp@ 13
3620 data beq codes-6
3630 data cmp@ 0e
3640 data beq codes-7
3650 data cmp@ 0f
3660 data beq codes-8
3670 data bne codes-9
3680 data *codes-3 bbs0 $22-flag print-d
3690 data bst7 sec.flag
3700 data bst7 crsr-flag
3710 data jmp return
3720 data *codes-4 bbs0 $22-flag codes-9
3730 data bcl7 sec.flag
3740 data bst7 crsr-flag
3750 data jmp return
3760 data *codes-5 bbs0 $22-flag print-r
3770 data jmp return
3780 data *codes-6 bbs0 $22-flag print-s
3790 data jmp return
3800 data *print-d lda@ 8e
3810 data sta lo-byte
3820 data *pr-code lda@ 03
3830 data sta hi-byte
3840 data jmp bit-imm.
3850 data *print-r lda@ 94
3860 data sta lo-byte
3870 data bra pr-code
3880 data *print-s lda@ 9a
3890 data sta lo-byte
3900 data bra pr-code
3910 data *codes-7 bbs0 $22-flag codes-9
3920 data lda@ 1b
3930 data jsr out
3940 data lda@ 57
3950 data jsr out
3960 data lda@ 01
3970 data jsr out
3980 data jmp return
3990 data *codes-8 bbs0 $22-flag codes-9
4000 data lda@ 1b
4010 data jsr out
4020 data lda@ 57
4030 data jsr out
4040 data lda@ 00
4050 data jsr out
4060 data jmp return
4070 data *codes-9 bbs0 $22-flag end
4080 data cmp@ 10
4090 data beq chr$16
4100 data cmp@ 08
4110 data beq chr$26
4120 data rts
4130 data *chr$26 jsr get-byte
4140 data txa
4150 data cmp@ 1a
4160 data beq repead
4170 data rts
4180 data *repead jmp rep-char.
4190 data *chr$16 jmp set-tap
4200 data *end add@ 40
4210 data tax
4220 data cmp@ 45
4230 data bne hoger-1
4240 data lda@ a0
4250 data sta lo-byte
4260 data lda@ 03
4270 data sta hi-byte
4280 data jmp bit-imm.
4290 data *hoger-1 cmp@ 80
4300 data bhs hoger-2
4310 data lda@ 03
4320 data sta hi-byte
4330 data txa
4340 data sub@ 5b
4350 data sta label14
4360 data jsr multi
4370 data add@ 40
4380 data sta lo-byte
4390 data jmp bit-rev.
4400 data *hoger-2 clr lo-byte
4410 data lda@ 01
4420 data sta hi-byte
4430 data jsr multiply
4440 data *bit-rev. jsr dottest
4450 data *go-on jsr opcode
4460 data eor@ fe
4470 data jsr out
4480 data incx
4490 data cpx@ 06
4500 data bne go-on
4510 data clra
4520 data rsp
4530 data jmp jsr80
4540 data *dottest bbs7 dot-flag ibm
4550 data lda@ 1b
4560 data jsr out
4570 data lda@ 4b
4580 data jsr out
4590 data lda@ 06
4600 data jsr out
4610 data clrx
4620 data clra
4630 data jsr out
4640 data rts
4650 data *ibm lda@ 1b
4660 data jsr out
4670 data lda@ 2a
4680 data jsr out
4690 data lda@ 00
4700 data jsr out
4710 data lda@ 06
4720 data jsr out
4730 data clrx
4740 data clra
4750 data jsr out
4760 data rts
4770 data org 03a8
4780 data *set-tap lda@ 1b
4790 data jsr out
4800 data lda@ 44
4810 data jsr out
4820 data jsr get-byte
4830 data txa
4840 data and@ 0f
4850 data asla
4860 data sta label14
4870 data asla
4880 data asla
4890 data add label14
4900 data sta label14
4910 data jsr get-byte
4920 data txa
4930 data and@ 0f
4940 data add label14
4950 data jsr out
4960 data lda@ 00
4970 data jsr out
4980 data lda@ 09
4990 data jsr out
5000 data jmp return
5010 data org 03d8
5020 data *ascii-2 cmp@ 9f
5023 data bls cmp-0d
5026 data and@ 7f
5030 data *cmp-0d cmp@ 0d
5040 data beq asc-lf
5050 data cmp@ 60
5060 data bhs asc.low
5070 data cmp@ 40
5080 data bhs asc.up
5090 data *printen rts
5100 data *asc.low and@ 5f
5110 data bra printen
5120 data *asc.up ora@ 20
5130 data bra printen
5140 data *asc-lf bbc7 lf-flag printen
5150 data jsr out
5160 data lda@ 0a
5170 data rts
5180 data org 0738
5190 data *rep-char. lda@ 1b
5200 data jsr out
5210 data bbs7 dot-flag ibm-2
5220 data lda@ 4b
5230 data jsr out
5240 data bra rep-2
5250 data *ibm-2 lda@ 2a
5260 data jsr out
5270 data lda@ 00
5280 data jsr out
5290 data *rep-2 jsr get-byte
5300 data txa
5310 data sta label14
5320 data jsr out
5330 data lda@ 00
5340 data jsr out
5350 data jsr get-byte
5360 data txa
5370 data ldx label14
5380 data *rep-3 jsr out
5390 data decx
5400 data bne rep-3
5410 data jmp return
5420 rem 550 statements - 148 labels
10000 print"{clr}":print"assembler for motorola mc68705":print
10010 open4,4:poke56,144:clr
10020 print"even geduld a.u.b.":print
10030 for cl=36864 to 38912:pokecl,0:next
10040 poke38910,4:poke38788,128
10050 print"base adress of ass. code buffer $9000":p=36864:print
10060 input"how many lines to be assembled";d:print
10070 input"how many labels are used";c:print:print
10080 diml$(c),a(c):z=1
10090 print"first pass running":print:print
10100 k=0:q=0
10110 for x=1 to d:printx;
10120 if z=3 then print#4,x;
10130 gosub 12250
10140 goto 10240
10150 gosub 12450
10160 next x
10170 z=z+1
10180 if z=4 then 10210
10190 if z=3 then print"print-out":print:print:restore:goto10100
10200 print"secund pass running":print:print:restore:goto 10100
10210 print:print:print"assembly complete":print#4:print#4:print#4,"assembly complete"
10220 print#4:print#4
10230 close 4:end
10240 read s$:p$=s$
10250 if left$(s$,1)="*" then gosub 10930
10260 m$=left$(s$,3):s$=right$(s$,(len(s$)-3))
10270 if m$="adc" then b=169:goto 11050
10280 if m$="add" then b=171:goto 11050
10290 if m$="and" then b=164:goto 11050
10300 if m$="asl" then b=56:goto 10990
10310 if m$="asr" then b=55:goto 10990
10320 if m$="bcc" then o=36:goto 11450
10330 if m$="bcl" then b=17:goto 11610
10340 if m$="bcs" then o=37:goto 11450
10350 if m$="beq" then o=39:goto 11450
10360 if m$="bhc" then o=40:goto 11450
10370 if m$="bhf" then o=41:goto 11450
10380 if m$="bhi" then o=34:goto 11450
10390 if m$="bhs" then o=36:goto 11450
10400 if m$="bih" then o=47:goto 11450
10410 if m$="bil" then o=46:goto 11450
10420 if m$="bit" then b=165:goto 11050
10430 if m$="blo" then o=37:goto 11450
10440 if m$="bls" then o=35:goto 11450
10450 if m$="bmc" then o=44:goto 11450
10460 if m$="bmi" then o=43:goto 11450
10470 if m$="bms" then o=45:goto 11450
10480 if m$="bne" then o=38:goto 11450
10490 if m$="bpl" then o=42:goto 11450
10500 if m$="bra" then o=32:goto 11450
10510 if m$="brn" then o=33:goto 11450
10520 if m$="bbc" then b=1:goto 11720
10530 if m$="bbs" then b=0:goto 11720
10540 if m$="bst" then b=16:goto 11610
10550 if m$="bsr" then o=173:goto 11450
10560 if m$="clc" then o=152:goto 11780
10570 if m$="cli" then o=154:goto 11780
10580 if m$="clr" then b=63:goto 10990
10590 if m$="cmp" then b=161:goto 11050
10600 if m$="com" then b=51:goto 10990
10610 if m$="cpx" then b=163:goto 11050
10620 if m$="dat" then 12060
10630 if m$="dec" then b=58:goto10990
10640 if m$="eor" then b=168:goto11050
10650 if m$="equ" then 12160
10660 if m$="inc" then b=60:goto10990
10670 if m$="jmp" then b=172:goto11050
10680 if m$="jsr" then b=173:goto11050
10690 if m$="lda" then b=166:goto11050
10700 if m$="ldx" then b=174:goto11050
10710 if m$="lsl" then b=56:goto10990
10720 if m$="lsr" then b=52:goto10990
10730 if m$="neg" then b=48:goto10990
10740 if m$="nop" then o=157:goto11780
10750 if m$="ora" then b=170:goto11050
10760 if m$="org" then 12090
10770 if m$="rol" then b=57:goto10990
10780 if m$="ror" then b=54:goto10990
10790 if m$="rsp" then o=156:goto11780
10800 if m$="rti" then o=128:goto11780
10810 if m$="rts" then o=129:goto11780
10820 if m$="sbc" then b=162:goto11050
10830 if m$="sec" then o=153:goto11780
10840 if m$="sei" then o=155:goto11780
10850 if m$="sta" then b=167:goto11050
10860 if m$="stx" then b=175:goto11050
10870 if m$="sub" then b=160:goto11050
10880 if m$="swi" then o=130:goto11780
10890 if m$="tax" then o=151:goto11780
10900 if m$="tst" then b=61:goto10990
10910 if m$="txa" then o=159:goto11780
10920 print"mnemonic error in line ";x:close4:end
10930 l$=mid$(s$,2,1):s$=right$(s$,(len(s$)-2))
10940 if left$(s$,1)=" " then 10970
10950 l$=l$+left$(s$,1):gosub 12230
10960 goto 10940
10970 gosub 12230:k=k+1:l$(k)=l$
10980 a(k)=q:return
10990 t=1:m$=left$(s$,1):gosub 12230
11000 if m$=" " then m=0:goto11140
11010 if m$="a" then m=1:goto 11100
11020 if m$="x" then m=2:goto 11100
11030 if m$="(" then m=3:goto 11120
11040 print"adress mode error in line ";x:close4:end
11050 t=2:m$=left$(s$,1):gosub 12230
11060 if m$="@" then m=0:goto 11350
11070 if m$=" " then m=2:goto 11140
11080 if m$="(" then m=3:goto 11120
11090 goto 11040
11100 gosub 11800
11110 goto 10150
11120 m$=left$(s$,1)
11130 if m$=")" then 11210
11140 gosub 11910
11150 if f=0 then 11250
11160 if t=2 then 11300
11170 ifh>0thenprint"read/modefy/write to page zero only - error in line ";x:close4:end
11180 gosub 11800
11190 gosub 11880
11200 goto 10150
11210 if t=2 then m=5:goto 11230
11220 m=4
11230 gosub 11800
11240 goto 10150
11250 if z=2 then print"undefined label in line ";x:close4:end
11260 if t=1 then 11180
11270 gosub 11800
11280 gosub 11840
11290 goto 10150
11300 if a(y)>q then 11270
11310 if h>0 then 11270
11320 if m=2 then m=1:goto 11340
11330 m=4
11340 goto 11180
11350 gosub 12230
11360 gosub 11380
11370 goto 11180
11380 m$=left$(s$,1)
11390 if asc(m$)<71 and asc(m$)> 64 then l=(asc(m$)-55)*16:goto 11410
11400 l=(asc(m$)-48)*16
11410 m$=mid$(s$,2,1)
11420 if asc(m$)<71 and asc(m$)>64 then l=l+asc(m$)-55:goto 11440
11430 l=l+asc(m$)-48
11440 return
11450 gosub 11810
11460 gosub 12230
11470 gosub 11910
11480 if f=0 then 11560
11490 if a(y)>q+1 then 11530
11500 if (q+1)-a(y)>128 then print"branch out of range in line ";x:close4:end
11510 l=256-((q+1)-a(y))
11520 goto 11580
11530 if a(y)-(q+1)>127 then print"branch out of range in line ";x:close4:end
11540 l=a(y)-(q+1)
11550 goto 11580
11560 if z=2 then print"undefined label in line ";x-1:close4:end
11570 l=0
11580 if o<16 then return
11590 gosub 11880
11600 goto 10150
11610 m$=left$(s$,1):gosub 12230
11620 if val(m$)<0 or val(m$)>7 then print"bit number error in line ";x:close4:end
11630 m=val(m$)
11640 gosub 12230:gosub 11910
11650 if f=0 then print"undefined label in line ";x:close4:end
11660 if a(y)>127thenprint"target byte not in ram - error in line ";x:close4:end
11670 o=b+(2*m)
11680 gosub 11810
11690 if b<16 then return
11700 gosub 11880
11710 goto 10150
11720 gosub 11610
11730 j=l
11740 gosub 11470
11750 h=j
11760 gosub 11840
11770 goto 10150
11780 gosub 11810
11790 goto 10150
11800 o=b+(16*m)
11810 poke(p+q),o:q=q+1
11820 gosub 12300
11830 return
11840 poke(p+q),h:q=q+1
11850 gosub 12350
11860 if b=0 or b=1 then l=l-1
11870 if l<0 then l=0
11880 poke(p+q),l:q=q+1
11890 gosub 12400
11900 return
11910 l$=""
11920 if len(s$)=0 then 11960
11930 l$=l$+left$(s$,1):gosub 12230
11940 ifright$(l$,1)=")"orright$(l$,1)=" "thenl$=left$(l$,(len(l$)-1)):goto11960
11950 goto 11920
11960 y=0
11970 y=y+1
11980 if y>k then 12030
11990 if l$=l$(y) then 12020
12000 goto 11970
12010 f=0:h=255:l=255:return
12020 f=1:h=int(a(y)/256):l=a(y)-(h*256):return
12030 if z=1 then 12010
12040 if y>c then 12010
12050 goto 11990
12060 gosub 12230
12070 gosub 11380
12080 gosub 11880:goto 10150
12090 gosub 12230
12100 gosub 11380
12110 h=l
12120 s$=right$(s$,(len(s$)-2))
12130 gosub 11380
12140 q=l+(256*h)
12150 goto 10150
12160 gosub 12230
12170 gosub 11380
12180 a(k)=256*l
12190 s$=right$(s$,(len(s$)-2))
12200 gosub 11380
12210 a(k)=a(k)+l
12220 goto 10150
12230 s$=right$(s$,(len(s$)-1))
12240 return
12250 if z<3 then return
12260 r=q:e=3
12270 gosub 12560
12280 print#4,tab(6) r$;
12290 return
12300 if z<3 then return
12310 r=o:e=2
12320 gosub 12560
12330 print#4,tab(11)r$;
12340 return
12350 if z<3 then return
12360 r=h:e=2
12370 gosub 12560
12380 print#4,tab(14)r$;
12390 return
12400 if z<3 then return
12410 r=l:e=2
12420 gosub 12560
12430 print#4,tab(17)r$;
12440 return
12450 if z<3 then return
12460 hp$=""
12470 if left$(p$,1)="*" then 12490
12480 goto 12530
12490 hp$=hp$+(left$(p$,1))
12500 p$=right$(p$,(len(p$)-1))
12510 if left$(p$,1)<>" " then 12490
12520 print#4,tab(21)hp$;tab(32)p$:goto 12540
12530 print#4,tab(33)p$
12540 :
12550 return
12560 r$=""
12570 for y=e to 1 step-1
12580 i=int(r/16^(y-1))):r=r-(i*(16^(y-1)))
12590 if i>9 then i$=chr$(i+55):goto 12610
12600 i$=chr$(i+48)
12610 r$=r$+i$
12620 next y
12630 return
PDF Diesen Artikel als PDF herunterladen
Mastodon Diesen Artikel auf Mastodon teilen
← Vorheriger ArtikelNächster Artikel →