In der heutigen Ausgabe wollen wir uns weiter mit der Verbindung von ATARI ST und TA-Gabriele 9009 bzw. kompatiblen Schreibmaschinen beschäftigen. Doch bevor wir uns in das Reich der Bits und Bytes begeben, möchte ich die Aufgabenstellung definieren:
Gesucht wird ein Programm, das im Auto-Ordner mitgebootet wird und sich resistent im Speicher hält. Dieses Programm “verbiegt” die Druckerausgabe auf eine Routine, die die spezielle Aussteuerung der Schreibmaschine entsprechend der in der letzten Ausgabe aufgeführten Befehlssequenzen realisiert.
Außerdem installiert es eine Interruptroutine, die dafür sorgt, daß die Schreibmaschine über die entsprechenden Tasten von der Schreibmaschinentastatur aus zwischen den Betriebszuständen ONLINE und OFFLINE umgeschalten werden kann.
Das Programm sorgt auch für die Verwaltung der Druckschlittenposition und für die Realisierung einiger spezieller Funktionen.
Alle diese nachfolgend aufgelisteten Funktionen werden durch Codes bzw. Sequenzen gesteuert, die vollkompatibel zur Original-Interfacebox von TA sind. Dadurch ist es möglich, einen entsprechenden Druckertreiber mitzuverwenden. Es ist durch Änderungen im Programm aber auch möglich, eine Anpassung an beispielweise EPSON-Sequenzen zu erreichen.
Folgende Steuerzeichen innerhalb des ASCII-Codes werden von der Druckroutine erkannt und realisiert:
Andere Kontrollbytes. die im Bereich der ASCII-Codes bis 20H (z.B. DCI/3 oder HT) liegen, werden üblicherweise nicht benutzt und deshalb von unserem Programm einfach unterdrückt.
Unter ESC-Sequenz versteht man eine Reihenfolge von Steuerbefehlen, die mit einem ESC-Zeichen (=1BH) beginnen und druckerspezifische Funktionen (z.B. Veränderung der Schreibteilung) steuern. Leider sind diese Sequenzen für die verschiedenen Drucker nicht standardisiert. Unser Programm richtet sich nach den von der Original-Interfacebox vorgegebenen ESC-Sequenzen. Allerdings wurde nur eine Untermenge der von der IFD1 vorgegebenen Sequenzen realisiert, jedoch genügen diese, um eine leistungsfähige Funktionalität zu erreichen.
Erläuterung: Der linke Rand wird auf die Position gesetzt, auf der gerade der Druckschlitten steht.
Erläuterung: Die Schreibwalze wird um eine halbe Grundzeile zurückgedreht, wodurch ein Hochstellen der Zeichen auf dem Papier erfolgt.
Erläuterung: Die Schreibwalze wird um eine halbe Grundzeile vorgedreht, wodurch ein Tiefstellen der Zeichen auf dem Papier erfolgt.
Erläuterung: Die Schreibwalze wird entsprechend dem eingestellten Zeilenabstand eine Zeile zurückbewegt.
Erläuterung: Alle anschließenden Zeichen werden in Fettdruck dargestellt. Dies erfolgt dadurch, daß jedes Zeichen zweimal abgeschlagen und zwischen den Anschlägen eine minimale Horizontalbewegung (1/120”) ausgeführt.
Erläuterung: Alle nachfolgenden Zeichen werden wieder ohne Fettdruck abgedruckt.
Erläuterung: Bei allen nachfolgenden Zeichen wird zusätzlich zum Zeichenabdruck auch ein Unterstreichstrich abgedruckt.
Erläuterung: Alle nachfolgenden Zeichen werden wiederohne Unterstreichen abgedruckt.
Erläuterung: Die Schreibteilung wird auf 12(12 Zeichen pro Zoll) vorbesetzt. Mit dieser Sequenz ist es möglich, die Schreibteilung im Bereich von 1/120" bis 255/120”-Schritten einzustellen.
Die Sequenzdefinition der Interface-Box sagt aus unerklärlichen Gründen, daß als Schrittzahl (x + 1) übergeben werden muß.
Nachfolgend ist die Zuordnung der Schrittzahlen zu den gebräuchlichsten Schreibteilungen aufgeführt:
Schreibteilung Schrittzahl X
10 13
12 11
15 9
6 23
Absichtlich nicht realisiert wurden die ESC-Sequenzen für bidirektionalen Druck (Druck links - rechts - links usw.), da die Schreibmaschine Gabriele 9009 zwar prinzipiell von rechts nach links drucken kann, jedoch aus internen Gründen nach jedem Schritt nach links eine seltsame Rüttelbewegung ausführt Damit wird der durch den bidirektionellen Druck gewonnene Zeitvorteil mehr als aufgebraucht.
Nicht verwirklicht wurde auch die Funktion Proportionaldruck. Proportionaldruck bedeutet, daß jedem Zeichen ein spezifischer Horizontalabstand zugeordnet ist; der Abstand zwischen “i” ist somit viel schmaler als zwischen “M”. Wir haben auf die Realisierung der Funktion verzichtet, da diese nur in Zusammenarbeit mit speziellen Typenrädern ansprechende Ergebnisse bringt und andererseits großen Aufwand im Programm sowie in entsprechenden Treibern bedeutet hätte.
Das nachfolgende aufgelistete Programm wurde inAssembler erstellt, um möglichst “maschinennah" arbeiten zu können. Die enthaltenen Kommentare sollten genügen, die verschiedenen Programmabschnitte nachvollziehbar zu machen. Es wird somit auch möglich sein, bei Bedarf kleinere Modifikationen einzubringen.
Da der ATARI ST über die serielle Schnittstelle während des Hochlaufs oft Undefiniertes aussendet, ist es sinnvoll, die angeschlossene Schreibmaschine erst nach abgeschlossenem Boot-Vorgang einzuschalten. Denn empfängt die Schreibmaschine Zeichen, mit denen sie nichts anfangen kann, ignoriert sie diese nicht immer, sondern stürzt manchmal auch ab, was nur durch erneutes Aus-/ Einschalten der Schreibmaschine behoben werden kann.
Bevor man mit dem Drucken beginnen kann, muß man die Schreibmaschine durch Betätigen der ONL-Taste (oder entsprechende Tastenkombination) auf ONLINE schalten.
Obwohl die serielle Verbindung physika-Hsch über die V.24-Schnittstelle erfolgt,ist als logische Schnittstelle die voreingestellte Parallelschnittstelle zu verwenden. Für WORDPLUS-Benutzer habe ich noch einen kleinen Treiber erstellt. der die vorgenannten ESC-Sequenzen beim Ausdrucken automatisch ansteuert.
Eine Code-Umsetzung der Schreibzeichen ist nicht erforderlich, da unser "IFD-EMULATOR" schon alle druckfähigen Zeichen ansteuert.
*****************************************************************
* *
* Nachbildung der INTERFACEBOX IFD1 durch Software im ST *
* (Einsatz des deutschen Typenrades Grp. 01) *
* *
* Diese Datei enthält Tabellen bezüglich der CODE SEQUENZEN und *
* des Zeichensatzes. Dadurch ist es möglich, die verschiedenen *
* Funktionen und den Zeichensatz anzupassen. *
* *
*****************************************************************
*
* Name of printer
* ===============
*
IFD 1 - Emulator
*
* Miscellaneous configurable variables
* ====================================
*
* 1: printer type, 0=dot matrix, 1=daisy wheel
* Note if printer type is 0 the following 4 variables are never used.
* 2: unit width of one character
* 3: unit height of one line
* 4: Approximate middle of carriage after formfeed
* 5: Carriage shift for bold overstrike
*
0,0,0,0, 0,0
*
* Printer characteristics
* =======================
*
* This table specifies the printer command sequences.
* If the top bit of a code is set, then this indicates the position
* of a parameter passed to the printer. The code whose top bit is set
* in this table is added to the parameter passed before being sent to the
* printer. It is not used in all command sequences, only in those where
* the printer requires a variable value such as the length of a vertical
* tab.
*
* 0 * Character width
1, D, A * Linefeed WITH return
* 2 * Forward print
* 3 * Reverse print
* 4 * Vertical tab to line
* 5 * Absolute horizontal tab
6 * Draft bold on
7 * Draft bold off
8, 1B, 57 * Near Letter Quality (NLQ) bold on
9, 1B, 26 * NLQ bold off
A * Draft italic on
B * Draft italic off
C * NLQ italic on
D * NLQ italic off
E * Draft light on
F * Draft light off
* 10, 1B, 78, 0 * NLQ light on
* 11, 1B, 78, 1 * NLQ light off
12, 1B, 44 * Draft superscript on
13, 1B, 55 * Draft superscript off
14, 1B, 44 * NLQ superscript on
15, 1B, 55 * NLQ superscript off
16, 1B, 55 * Draft subscript on
17, 1B, 44 * Draft subscript off
18, 1B, 55 * NLQ subscript on
19, 1B, 44 * NLQ subscript off
1A
1B * Draft underline off
1C, 1B, 45 * NLQ underline on
1D, 1B, 52 * NLQ underline off
1E, 0C,0D * Formfeed
1F, 12 * Horizontal Initialisation
20,0D * Termination: printer reset
21,0D * Termination: printer reset
22,08 * Backspace
23,13 * Carriage Return
* 24 * Form length in lines
* 25 * Set line feed to N units
* 26 * Start graphics (mode 0)
* 27 * Reserved
28,1B,1F,0D * Draft Pica (10 cpi)
29,1B,IF,0D * NLQ Pica (10 cpi)
2A,1B,IF,0B * Draft Elite (12 cpi)
2B,1B,1F,0B * NQL Elite (12 cpi)
2C,1B,1F,9 * Draft Condensed (15 cpi)
2D,1B,1F,9 * NQL Condensed (15 cpi)
2E,1B,1F,15 * Draft Expanded (6 cpi)
2F,1B,1F,15 * NQL Expanded (6 cpi)
* 30 * Black ink
* 31 * Magenta ink
* 32 * Cyan ink
* 33 * Yellow ink
0 * NULL termination byte
*
* Translation Table
* =================
*
* Diese Tabelle übersetzt einfache ATARI Eingangscodes in vielfache
* Druckercodes, dies ermöglicht den Entwurf eines erweiterten Zeichen-
* satzes usw. .
*
* Da der Zeichensatz schon vom Steuerprogramm verwirklicht wird, ist es
* hier nicht nötig, nochmals eine Übersetzung durchzuführen.
Abb. 1: Tabelle der CODE-SEQUENZEN
*******************************************************
* IFD 1 - EMULATOR für ATARI ST *
* *
* Diese Routine verbiegt d.Druckerausgabe a.ein Kon- *
* vertierprogramm, das d.ASCII-Code i.f. die Schreib- *
* maschine Gabriele 9009 verständ1.Steuerbefehle um- *
* setzt. Die Kommunikation m.d.Schreibmaschine erfolgt*
* o.Spooler-Pufferung ü.d.serielle V.24-Verbindung. *
*******************************************************
move.b #16,zeile
move.b #10,teilung
move.l 4(sp),a0 ; Groesse des Programms
move.l #$100,d6 ; berechnen
add.l 12(a0),d6
add.l 20(a0),d6
add.l 28(a0),d6
move.l d6,-(sp) ; Ergebnis auf Stack Zwischenlagern
clr.l -(sp) ; In SUPER-Modus schalten
move.w #$20,-(sp)
trap #1
add.l #6,sp
move.l d0,-(sp) ; Alten Stack merken
move.l #trap13,-(sp) ; TRAP13 "verbiegen"
move #45,-(sp)
move #5,-(sp)
trap #13
addq.l #8,sp
move.l d0,tr_save ; alte Sprungadresse merken
move.l #em_int,-(sp) ; Interruptroutine installieren,
move.w #12,-(sp) ; die ausgelöst wird, wenn von der SM ein
move #13,-(sp) ; Zeichen empfangen wurde
trap #14 ; -> Offline - Online
addq.l #8,sp
bsr init ; Intialisierungsroutine
move.l (sp)+,d1 ; In USER-Modus zurueckschalten
move.l d0,-(sp)
move.w #$20,-(sp)
trap #1
addq.l #6,sp
move.l (sp)+,d6 ; Programmgroesse zurückholen
clr -(sp) ; Programm im Speicher halten
move.l d6,-(sp)
move #$31,-(sp)
trap #1
trap13: move.l sp,a2 ; neue Trap 13-Routine
btst #5,(sp) ; jetzt abprüfen, ob
bne super ; Druckerangesprochen ist
move.l usp,a2
subq #6,a2
super: cmp #3,6(a2)
bne normal ; wenn nicht —> alte Routine
cmp #0, 8(a2)
bne normal
movem.l d1-d7/a0-a6,-(sp)
move.l $4a2,a1
move (sp)+,-(a1)
move.l (sp)+,-(a1)
move.l a1,$4a2 ; Drucker ist gemeint auszu-
move 10(a2),d1 ; gebendes Zeichen nach d1
move #$2700,sr
cmp.w #0,esc_flag ; Folgebyte in ESC-Sequenz?
bne esc_folg ; Ja —> verzweigen
cmp.b #$20,d1 ; Druckbares Zeichen?
bls so_zei ; Nein —> verzweigen
cmp.w #0,step_li ; Sind noch Leerschritte nachzuholen?
bne spa_nach ; Ja —> verzweigen
drck: lea zei_satz,a2 ; Adresse f.Tabelle nach a1
and.1 #$FFFF,d1
sub.w #$21,d1 ; Offset von ASCII-Code subtrahieren
lsl.w #1,d1 ; Rest mit 2 multiplizieren
add.l d1,a2 ; Als Offset zu Tabellenzeiger addieren
cmp.w #0,son_flag ; Ist eine Sonderfunktion eingeschaltet ?
bne so_druck ; Ja —> verzweigen
narma: move.b (a2)+,d1 ; Typenrad-Code aus Tabelle
bsr print ; holen und an SM senden
move.b (a2),d1 ; Abschlag-Code aus Tabelle
bsr print ; holen und an SM senden
gedr: move.b teilung,d0
and.w #$FF,d0
add.w d1,spalte ; Spaltenzaehler inkrem,
moveq #-1,d0 ; kein Fehler aufgetreten
bra exit ; Aussprung
spa_nach: ; Umwandeln von vorher nicht ausgedruckten
move.l d1,-(sp) ; Leerschritten in Direktbewegung
move.w step_li,d1 ; Anzahl der auszuführenden Leerschritte
lsr #8,d1
bset #7,d1 ; Befehl für SM bilden
bset #6,d1
bclr #5,d1
bclr #4,d1
bsr print
move.w step_li,d1 ; High_byte für direkte Bewegung
bsr print
move.w #0,step_li ; Low_byte für direkte Bewegung
move.l (sp)+,d1
bra drck ; zurück —> normal drucken
so_druck:
move.l a2,a4
btst #1,son_flag ; unterstreichen eingeschaltet?
beq fett ; Nein —> Weiter mit Fettdruck-Abfrage
move.b #$33,d1 ; Typenradcode für bsr print
move.b #$10,d1 ; Abschlagscode und Totzeichenkennung
bsr print
fett: btst #2,son_flag ; fett eingeschaltet?
beq narma ; Nein —> Normal weiter
move.b (a2)+,d1 ; Typenradcode aus Tabelle holen
bsr print
move.b (a2),d1 ; Abschlagscode aus Tabelle holen
bclr #7,d1 ; Horizontalbewegung unterdrücken
bsr print
move.b #$83,d1 ; Mikrostep (1/120") ausführen
bsr print
move.b #1,d1
bsr print
move.b (a2),d1 ; War es wirklich ein druckbares Zeichen
cmp.b #0,d1
beq gedr ; Nein —> Aussprung
sub.l #1,a2 ; Ja —> Zeichen nochmal drucken
bra narma
esc_folg:
cmp.w #1,esc_flag
bne esc_3byt ; 3. oder 4. Byte einer ESC-Folge
move.w #0,esc_flag
cmp.b #$39,d1 ; Linken Rand setzen?
beq li_rand ; Ja —> verzweigen
cmp.b #$44,d1 ; Hochstellen?
beq hochst ; Ja —> verzweigen
cmp.b #$55,d1 ; Tiefstellen?
beq tiefst ; Ja —> verzweigen
cmp.b #$0A,d1 ; Zeilenrückschritt?
beq lf_back ; Ja —> verzweigen
cmp.b #$45,d1 ; Unterstreichen ein?
beq unt_ein ; Ja —> verzweigen
cmp.b #$52,d1 ; Unterstreichen aus?
beq unt_aus ; Ja —> verzweigen
cmp.b #$57,d1 ; Fettdruck ein?
beq fett_ein ; Ja —> verzweigen
cmp.b #$26,d1 ; Fettdruck aus?
beq fett_aus ; Ja —> verzweigen
cmp.b #$1F,d1 ; HMI setzen?
beq hmi1 ; Ja —> verzweigen
cmp.b #$05,d1 ; VMI setzen?
beq vmi1 ; Ja —> verzweigen
bra exit ; andere ESC-Sequenzen kenn ich nicht!!!
esc_3byt:
cmp.w #2,esc_flag ; HMI-Sequenz?
bne vmi2 ; Nein —> verzweigen
subq.b #1,d1 ; HMI = N-1
move.b d1,teilung ; Neue Teilung merken
move.b #$80,d4 ; Neue Teilung an SM schicken
bsr senden
move.b teilung,d4
bsr senden
move.w #0,esc_flag ; Flag löschen
bra exit
vmi2: cmp.w #3,esc_flag ; VMI-Sequenz?
move.w #0,esc_flag ; Flag löschen
bne exit ; Nein —> dann unbekannt
subq.l #1,d1 ; VMI = N-l
move.b d1,zeile ; Neue Schrittzahl für LF merken
bra exit
li_rand: move.w #0,spalte ; Spaltenzähler auf Null setzen
bra exit
hochst: move.w #$f0,d1 ; Vertikale Bewegung um 8/96"
bsr print ; = 0,5 Grundzeilen zurück
move.w #8 ,d1
bsr print
bra exit
tiefst: move.w #$D0,d1 ; Vertikale Bewegung um 8/96"
bsr print ; = 0,5 Grundzeilen vorwärts
move.w #8,d1
bsr print
bra exit
lf_back: move.w #$f0,d1 ; Vert.Bewegung u.normalerweis«
bsr print ; 16/96" = 1 Grundzeile zurück
move.b zeile,d1
bsr print
bra exit
unt_ein: bset #1,son_flag ; Bit 1 für Unterstreichen setzen
bra exit
unt_aus: bclr #1,son_flag ; Bit 1 für Unterstreichen löschen
bra exit
fett_ein: bset #2,son_flag ; Bit 2 für Fettschrift setzen
move.b #$80,d1 ; Horizontalschritt auf Teilung-1
bsr print ; Teilung-1 anpassen
move.b teilung,d1
subq.b #1,d1
bsr print
bra exit
fett_aus: bclr #2,son_flag ; Bit 2 für Fettschrift löschen
move.b #$80,d1 ; Horizontalschritt auf
bsr print ; eingestellte Teilung
move.b teilung,d1 ; anpassen
bsr print
bra exit
hmi1: move.w #2,esc_flag ; Flag für HMI-Sequenz setzen
bra exit
vmi1: move.w #3,esc_flag ; Flag für VMI-Sequenz setzen
bra exit
; Abfrage nach Sonderzeichen
so_zei: cmp.b #$20,d1 ; ASCII-Code = 32
beq space ; Ja —> Leerschritt
cmp.b #13,d1 ; ASCII-Code = 13
beq cr ; Ja —> Carriage Return
cmp.b #10,d1 ; ASCII-Code = 10
beq lf ; Ja —> Linefeed
cmp.b #$1B,d1 ; ASCII-Code = 27
beq esc ; Ja —> ESC-Zeichen —> Flag setzen
cmp.b #8,d1 ; ASCII-Code = 8
beq backsp ; Ja —> Backspace
cmp.b #12,d1 ; ASCII-Code = 12
beq formfeed ; JA —> Formfeed
bra exit ; Andere Sonderzeichen kenn ich nicht
esc: move.w #1,esc_flag / Flag für erstes Byte aus Sequenz setzen
bra exit
space:
move.b teilung,d1 ; Leerschritt nicht direkt ausführen,
and.l #$FF,d1 ; sondern für später zusammenfassen
add.w d1,step_li ; und in "step_li" merken
add.w d1,spalte
bra exit
backsp: move.w #$84,d1 ; Leerschritt nach links —> direkt ausführen
bsr print ; direkt ausführen
move.b teilung,d1
and.w #$ff,d1
sub.w d1,spalte
move.w #0,d1
bsr print
bra exit
cr: move.w spalte, d0 ; Carriage-Return ausführen, dabei auch
; noch nicht ausgeführte Leerschritte
sub.w step_li,d0 ; berücksichtigen
move.w # 0,step_li
or.w #$e000,d0
move.w d1,d1
lsr #8,d1
move.w d1,-(sp)
bsr print
move.w (sp)+,d1
and.w #$FF,d1
bsr print
move.w #0,spalte ; Spaltenzähler zurücksetzen
bra exit
lf: move.w #$D0,d1 ; Linefeed ausführen, Anzah]
bsr print ; der Schritte steht in #zei1
move.b zeile,d1
bsr print
bra exit
formfeed:
move.b #$a3,d1
bsr print
move.b #0,d1
bsr print
wait: bsr lesen
cmp.b #1,d5
bne wait
move.b #$a2,d1
bsr print
move.b #0,d1
bsr print
bra exit
exit :
move.w onl_flag,d0
cmp.w #1,d0
bne probl
moveq #-1,d0
bra exit1
probl: moveq #0,d0
exitl: move.l $4a2,a1
move.l (a1)+,-(sp)
move (a1)+,-(sp)
move.l a1,$4a2
movem.l (sp)+,d1-d7/a0-a6
move #$2300,sr
rte
normal:
cmp #8,6(a2)
bne norml
cmp #0,8(a2)
bne norm1
moveq #-1,d0
move.w onl_flag,d2
cmp.w #1,d2
bne probl1
movea.l #$fffa01,a3
move.b (a3),d2
btst #2,d2
beq platz
probll: moveq #0,d0
platz: rte
norm1: move.l tr_save,a0
jmp (a0)
print: move.b d1,d4
bsr senden
rts
; ****************************************************
em_int: ; Interrupt-routine, die von
move #$2700,sr ; der SM ausgelöst wird
MOVEM.L D0-D6/A0-A3,-(SP)
bsr lesen ; Empfangenes Zeichen lesen
cmp.b #1,d5 ; Wurde die Online-Tastegedrückt?
bne nionline ; Nein —> weitere Abfrage
move.w onl_flag,d5 ; Ist die SM schon ONLINE?
cmp.w #1,d5
beq ni_line ; Ja —> nichts machen
bsr online ; Nein —> Online schalten
move.w #1,onl_flag ; Flag setzen
bra fertig
nionline:
cmp.b #2,d5 ; Wurde die OFFLINE-Taste gedrückt'
bne ni_line ; Nein —> nichts machen
move.w onl_flag,d5 ; Ist SM noch OFFLINE?
cmp.w #0,d5
beq ni_line ; Ja —> nichts machen
bsr offline ; Nein —> Offline schalten
bsr offline
move.w #0,onl_flag ; Flag zurücksetzen
bra fertig
ni_line:
move.b #0,d4 ; zwei "dummy-Zeichen" senden
bsr senden
move.b #0,d4
bsr delay2
bsr senden
bsr delay2
fertig:
move.l #$FFFA0F,a0 ; Interrupt-Service-Bit löschen
bclr #4,(a0)
movem.l (sp)+,d0-d6/a0-a3
move #$2300,sr
rte
online:
MOVEM.L D0-D7/A0-A4,-(SP)
bsr raus
bsr delay2
lea onl_tab,a1
move.l #tab_end-onl_tab-1,d0
loop9:
move.b (a1)+,d4
bsr senden
bsr delay1
move.b #0,d4
bsr senden
bsr delay2
bsr raus
dbra d1,loop9
movem.l (sp)+,d1-d7/aO-a4
bsr delay2
move.b #$82,d4
bsr senden
bsr delay1
move.b #$lF,d4
bsr senden
bsr delay2
move.b #$80,d4
bsr senden
bsr delay1
move.b teilung,d4
bsr senden
bsr delay2
move.w #0,spalte
move.w #0,esc_flag
move.w #0,son_flag
rts
**************************************************
offline:
lea offl_tab, a1
move.w #tab_end2-offl_tab-1,d0
move.w #0,d6
loop1: move.b (a1)+,d4
bsr senden
bsr delay2
dbra d1,loop1
rts
**************************************************
senden:
movea.l #$fffa01,a3
move.b (a3),d7
btst #2,d7
bne senden
send1:
movea.l #$fffa2f,a3
move.b d4,(a3)
send2:
movea.l #$fffa01,a3
move.b (a3),d7
btst #2,d7
beq send2
rts
lesen:
move.w #100,d6
les1: sub #1,d6
cmp.w #0,d6
beq raus
movea.l #$fffa2b,a3
move.b (a3),d5
and.w #$80,d5
cmp.b #0,d5
beq les1
raus:
movea.l #$FFFa2F,a3
move.b (a3),d5
and.l #$FF,d5
rts
delay1:
move.l d0,-(sp)
move.l #$3fff,d0
loop2:
dbra d1,loop2
move.l (sp)+,d0 rts
delay2:
move.l d0,-(sp)
move.l #$ffff,d0
loop3:
move.l d1,d1
move.l d1,d1
dbra d1,loop3
move.l (sp)+,d0
rts
init:
move.w #-1,-(sp)
move.w #-1,-(sp)
move.w #-1,-(sp)
move.w #-1,-(sp)
move.w #2,-(sp)
move.w #2,-(sp)
move.w #15,-(sp)
trap #14
add.l #14,sp
move.w #1,-(sp)
move.w #26,-(sp)
trap #14
addq.l #4,sp
move.w #10,-(sp)
move.w #26,-(sp)
trap #14
addq.l #4,sp
move.w #9,-(sp)
move.w #26,-(sp)
trap #14
addq.l #4,sp
move.w #11,-(sp)
move.w #26,-(sp)
trap #14
addq.l #4,sp
rts
move.w #2,-(sp)
move.w #26,-(sp)
trap #14
addq.l #4,sp
.data
onl_tab:
dc.b $A1, $A4, $A2, 0
tab_end:
move.w d1,d1
offl_tab:
dc.b $A3,0,$A0,0
tab_end2:
move.w d0,d0
onl_flag: dc.w 0
zei_satz:
dc.b $3E,$92 ; !
dc.b $2B,$90
dc.b $4C,$99 ; #
dc.b $27,$97 ; $
dc.b $43,$97 ; %
dc.b $22,$99 ; &
dc.b $0E,$8C
dc.b $3A, $92 ; (
dc.b $31,$92 ; )
dc.b $29,$92 ; *
dc.b $0F,$90 ; +
dc.b $02,$8E
dc.b $03,$8E
dc.b $01,$8C
dc.b $3C,$92 ; /
dc.b $19,$94 ; 0
dc.b $10,$94 ; 1
dc.b $11,$94 ; 2
dc.b $12, $94 ; 3
dc.b $13,$94 ; 4
dc.b $14,$94 ; 5
dc.b $15,$94 ; 6
dc.b $16,$92 ; 7
dc.b $17,$97 ; 8
dc.b $18,$94 ; 9
dc.b $36,$90
dc.b $35, $90
dc.b $4A,$92 ; <
dc.b $34,$92
dc.b $0D,$92 ; >
dc.b $2D,$94 ; ?
dc.b $40,$99 ; §
dc.b $24,$99 ; A
dc.b $1C,$99 ; B
dc.b $2A,$97 ; C
dc.b $2C,$99 ; D
dc.b $1A,$97 ; E
dc.b $1D,$94 ; F
dc.b $45,$99 ; G
dc.b $39,$97 ; H
dc.b $2F,$92 ; I
dc.b $42, $94 ; J
dc.b $3B,$97 ; K
dc.b $26,$94 ; L
dc.b $37,$99 ; M
dc.b $2E,$99 ; N
dc.b $3D,$99 ; O
dc.b $1E,$99 ; P
dc.b $41,$99 ; Q
dc.b $28,$99 ; R
dc.b $1F,$97 ; S
dc.b $25,$94 ; T
dc.b $30,$99 ; U
dc.b $21,$94 ; V
dc.b $32,$99 ; W
dc.b $3F,$94 ; X
dc.b $23,$94 ; Y
dc.b $20,$97 ; Z
dc.b $3A,$92 ; ( für [
dc.b $29,$92 ; ; für \
dc.b $31,$92 ; ) für ]
dc.b $0C,$8C
dc.b $33,$90
dc.b $48,$8C
dc.b $5E,$94 ; a
dc.b $62,$97 ; b
dc.b $58,$92 ; c
dc.b $60,$97 ; d
dc.b $5D,$94 ; e
dc.b $0B,$92 ; f
dc.b $59,$97 ; g
dc.b $57,$94 ; h
dc.b $5F,$92 ; i
dc.b $07,$92 ; j
dc.b $55,$94 ; k
dc.b $05,$92 ; 1
dc.b $06,$97 ; m
dc.b $5A,$94 ; n
dc.b $63,$94 ; o
dc.b $56,$97 ; p
dc.b $4F,$97 ; q
dc.b $5B,$92 ; r
dc.b $5C,$94 ; s
dc.b $4D,$92 ; t
dc.b $61,$94 ; u
dc.b $04,$92 ; v
dc.b $08,$94 ; w
dc.b $4E,$92 ; x
dc.b $54,$94 ; y
dc.b $64,$92 ; z
dc.b $3A,$92 ; (
dc.b $2F,$92 ; I
dc.b $31,$92 ; )
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $51, $97 ; ü
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $53,$97 ; ä
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $4b,$99 ; Ä
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $52,$97 ; ö
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $49,$99 ; Ö
dc.b $47,$99 ; O
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $1B,$99 ; pfund
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $50,$97
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $50,$97 ; P
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
dc.b $83,0 ; nicht auf TR vorhanden
buffer= 0
len= 4
head= 6
tail= 8
.bss
step_li: ds.w 1
step_re: ds.w 1
spalte: ds.w 1
esc_flag: ds.w 1
son_flag: ds.w 1
tr_save: ds.1 1
zeile: ds.b 1
teilung: ds.b 1
end
Listing : Der IFD-Emulators für TA Gabriele 9009 in Assembler