← ST-Computer 11 / 1986

ISAM & PRIMA Teil 2 - Die Diskettenmacros

Software

Nachdem wir in der vorletzten Ausgabe der ST Computer die allgemeinen Assembler-Macros abgedruckt haben, wollen wir uns diesmal mit den Diskettenmacros beschÀftigen. Dazu wollen wir zunÀchst einmal ein paar ErlÀuterungen zu den Assembler-Macros geben.

Wenn man mit ISAM & PRIMA arbeitet, kann man bis zu sechs Diskettendateien gleichzeitig eröffnen. Wem dies aber nicht genĂŒgt, dem steht die Möglichkeit offen, die Diskettendefinitionen zu erweitern. FĂŒr eine siebte Datei mĂŒĂŸte man dazu nur die Definitionen HANDL7, RECL7, FILE7 und EOF7 editieren.

Von diesen sechs gleichzeitig offenen Dateien dĂŒrfen aber nur maximal drei Dateien als ISAM-Dateien organisiert sein. Die ErlĂ€uterungen und Erweiterungsmöglichkeiten von ISAM-Dateien werden dann noch genauer in der Dezemberausgabe der ST Computer besprochen werden.

Zugriff auf die Peripherie

Mit den sequentiellen Zugriffsmacros WRITE und GET können nicht nur Diskettendateien, sondern auch Bildschirm, Tastatur, die serielle RS 232-und die parallele Schnittstelle, also auch ein Drucker, angesprochen werden.

Man muß hierfĂŒr anstelle von OPEN die Handle-Nummer fĂŒr das gewĂŒnschte PeripheriegerĂ€t nach HANDLx (x = Dateinummer; siehe auch bei den Diskettendefinitionen) bringen. Das Gleiche gilt auch fĂŒr die RecordlĂ€nge, die in RECLx definiert wird. Die Handle-Nummern sind folgendermaßen festgelegt:

0 = Tastatur
1 = Bildschirm
2 = Serielle Schnittstelle (RS 232)
3 = Parallele Schnittstelle (z. B. Drucker)

Nach dem Ende der Verarbeitung muß man anstelle von CLOSE die Dateinummer wieder freigeben. Dies geschieht, indem man den Wert -1 als Wort (.W) nach HANDLx und eine Null als Langwort (.L) nach EOFx schreibt.

MOVE.L #3, HANDL1 ; vorausgesetzt, die Handle-Nr. 1 ist noch frei MOVE.L # 1,RECL1 ; 1-stellige Records WRITE 1,# BUFFER ; Ausgabezeichen steht im Buffer MOVE.L # — l.HANDL1 ; Fertig, also freigeben CLR.L EOF1 ; EOF mit Null beschicken

Schicken eines 1-stelligen Records an einen Drucker

Um diese besser verstÀndlich zu machen, beschicken wir als Beispiel einen Drucker mit 1-stelligen Records:

Lesen von Diskettendateien unbekannter LĂ€nge

Wenn man Diskettendateien, deren LĂ€nge unbekannt ist, also zum Beispiel irgendwelche Textdateien, lesen will, sei hier noch ein kleiner Tip gegeben.

Man kann in diesem Fall natĂŒrlich mit dem READ-Macro und der RecordlĂ€nge 1 arbeiten und warten, bis die EOF-Bedingung auftaucht. Das hat aber den Nachteil, daß es relativ langsam vonstatten geht, da viele Einzelzugriffe notwendig sind. Schneller geht es mit einer groß gewĂ€hlten RecordlĂ€nge. Wie aber eine RecordlĂ€nge einer Datei festlegen, deren GrĂ¶ĂŸe man nicht kennt? Das folgende Beispiel zeigt hierfĂŒr eine Möglichkeit:

OPEN ”1”, 1 ."LESEDATEI”,# 1000 ; RecordlĂ€nge - 1000 Bytes TST.L DO ;Fehler aufgetreten BMI FEHLER ;Leider ja A000: READ 1,# BUFFER ;Record lesen (1000 Bytes) CMP.L # -99.D0 ;EOF erreicht? BEQ REST ; Ja, Rest lesen BRA A000 REST: ADD.L #1000,EOF1 ;EOF-ZĂ€hler berichtigen RE01: MOVE.L # l.RECL1 ;Neue RecordlĂ€nge festlegen READ 1,# BUFFER ; Jetzt nur ein Byte lesen CMP.L # -99JD0 ;EOF erreicht? BEQ FINI ; Ja, fertig BRA RE01 FINI: CLOSE 1

Festlegen einer unbekannten RecordlÀnge

Doch nun zu den einzelnen Macrobefehlen:

OPEN

  • Eröffnen von Dateien

Das Format dieses Macros entspricht dem gleichen Befehl im BASIC. Dem Macro mĂŒssen vier Parameter folgen.

Der erste Parameter gibt an, ob eine Datei neu gebildet wird (I) oder eine schon bestehende eröffnet werden soll (0). Er sagt nichts ĂŒber die spĂ€tere Zugriffsmethode, Lesen oder Schreiben, aus. Der zweite Parameter ist die Dateinummer, der dritte der Dateiname und der vierte die RecordlĂ€nge. Als Angabe fĂŒr den dritten Parameter dĂŒrfen nur Register oder Literale benutzt werden.

Beispiele:

OPEN ”I”,1,”Dateiname”,95 OPEN ”O”,2,D 1,100

Falsch:

OPEN "T”,l,#Name,20 ; #Name als Parameter nicht erlaubt
; ; OPEN: MACRO OP0?0: TST.W HANDL72 BMI OP1?0 MOVE.L #-100,D0 ; ALREADY OPENED MOVE.L #0P7?0,DSKRET :RETURN-ADR.V.FEHLERROUT. MOVE.B #?2,DSKFIL ;FAN-NR. -> DSKFIL JMP DSKERROR OP1?0: EQU * IF ?1 = "O" CLR.W -(SP) ELSE MOVE.W #2,-(SP) ENDIF IF '?3’ > 'D7' BRA OP4?0 OP2?0: DC *?3’ OP3?0: EQU *-l EVEN OP4?O: MOVE.L #OP2?0+1,FILE?2 CLR.B OP370 ELSE MOVE.L ?3,FILE?2 ENDIF MOVE.L #?4,RECL?2 MOVE.L FILE? 2,-(SP) IF ?1 = "0" MOVE.W #$3C,-(SP> ELSE MOVE.W #$3D,-(SP) ENDIF TRAP #1 ADDQ.L #8, SP TST.L D0 BPL OP5?O MOVE.L #OP7?0,DSKRET ;RETURN-ADR.V.FEHLERROUT. MOVE.B #?2,DSKFIL SFAN-NR. -> DSKFIL JMP DSKERROR OP5?0: MOVE.W D0.HANDL72 IF ?1 = "I" MOVE.L #DTABUF,-(SP) MOVE.W #S1A,-(SP) ;SET DTA TRAP #1 ADDQ.L #6,SP CLR.W -(SP) ;ATTRIBUT O MOVE.L FILE?2,-(SP) ;ADR. FILENAME MOVE.W #$4E,-(SP) ; FUNKTION SFIRST TRAP #1 ADDQ.L #8,SP TST.L D0 BPL 0P6?0 MOVE.L #0P7?0,DSKRET JRETURN-ADR.V.FEHLERROUT. MOVE.B #?2,DSKFIL ;FAN-NR. -> DSKFIL JMP DSKERROR OP6?0: MOVE.L DTABUF+26,EOF?2 ;DATEIGRÖßE IN BYTES ENDIF OP7?0: EQU * ENDM

Open

CLOSE

  • Schließen von Dateien

Format: CLOSE Dateinummer

Die Ein- bzw. Ausgabe von oder an Ein/AusgabegerÀten wird beendet, somit ist die Dateinummer wieder frei.

Beispiel: CLOSE1

CLOSE: MACRO TST.W HANDL?1 BPL CL070 MOVE.L #-101,D0 SNOT OPEN MOVE.L #CL2?0,DSKRET ;RETURN-ADR.V.FEHLERROUT. MOVE.B #?1,DSKFIL ;FAN-NR. -> DSKFIL JMP DSKERROR CL0?0: MOVE.W HANDL?1,-(SP) MOVE.W #$ 3E,-(SP) TRAP #1 ADDQ.L #4,SP TST.L D0 BPL CL1?0 MOVE.L #CL2?0,DSKRET ;RETURN-ADR.V.FEHLERROUT. MOVE.B #?1,DSKFIL ;FAN-NR. -> DSKFIL JMP DSKERROR CL1?0: MOVE.W #-1,HANDL?1 ;KENNZEICHEN F. NOT OPEN CLR.L EOF?1 CL2?0: EQU * ENDM

EXTEND

— Daten an eine bestehende Datei an-hĂ€ngen

Format: EXTEND Dateinummer

Bevor dieses Macro aufgerufen wird, muß zuerst ein OPEN ”1” erfolgen. Anschließend können dann Daten mit dem WRITE-Macro in die gewĂŒnschte Datei geschrieben werden.

Beispiel: EXTEND 3

EXTEND: MACRO CLP. W -(SP) MOVE.W HANDL?1,-(SP> MOVE.L EOF?1,-(SP) MOVE.W #942,-(SP) ; LSEEK TRAP #1 ADD.L #10,SP TST.L D0 BPL EX 1?0 MOVE.L #EX1?0, DSKRET ; RETURN-ADR.V.FEHLERROUT. MOVE.B #?1,DSKFIL J FAN-NR. -> DSKFIL JMP DSKERROR EX 1?0: EQU * ENDM

Extend

LOF

— Ermitteln der relativen Satznummer des letzten Datei-Records

Format: LOF Dateinummer

Bei diesem Macro ist zu beachten, daß bei Dateien, die mit READ oder WRI-TE bearbeitet werden, der Aufruf nur unmittelbar nach dem OPEN-Macro erfolgen darf; bei anderen Dateien dagegen immer, sofern sie irgendwann zuvor geöffnet wurden. Die letzte Recordnummer steht anschließend im Datenregister DO.

Beispiel: LOF 3

**Lof** LOF: MACRO MOVEM.L D1-D3,-(SP> MOVE.L EOF?1,D1 MOVE.L RECL?1,D3 JSR DIVI MOVE.L D1,D0 MOVEM.L EN DM (SP)+,D1-D3 ENDM

GET

  • Bestimmten Datensatz lesen

Format: GET Dateinummer, # Record-nummer,# Puffer

Der angegebene Datensatz wird aus einer relativen Datei gelesen und in den Puffer geschrieben. Wird das Ende der Datei erreicht, steht anschließend eine -99 im Datenregister DO. Bei Verwendung von Registern als Parameter ist darauf zu achten, daß sie als Langwörter (.L) vorliegen mĂŒssen.

Beispiele: GET 2,# 12,# Puffer GET l,D1,D2

**Get** GET: MACRO TST.W HANDL?1 BPL GE 1?0 MOVE.L #-101,D0 ;ndt open MOVE.L #GE4?0,DSKRET ; RETURN-ADR.V.FEHLERROUT. MOVE.B #?1.DSKFIL ; FAN-NR. -> DSKFIL JMP DSKERROR GE1?0: MOVEM.L Dl-D2,-(SP) MOVE.L ?2, D0 MOVE.L RECL?1,D2 JRECL MOVE.L D0,D1 JSR MULTI :* RECORD-# MOVE.L D1 ,D0 MOVEM.L (SP)+,D1-D2 CMP.L EOF?1,D0 JINNERHALB DATEIGRENZEN ? BLS GE2?0 J JA MOVE.L #-99,D0 ;OUT OF FILE-BOUNDS BRA GE4?0 GE2?0: SUB.L RECL?1,D0 CLR.W -(SP> MOVE.W HANDL?1,-(SP) MDVE.L D0,-(SP) MDVE.W #942,-(SP) SLSEEK TRAP #1 ADD.L #10,SP TST.L D0 BPL GE3?0 MOVE.L #GE4?0,DSKRET ;RETURN-ADR.V.FEHLERROUT. MOVE.B #?1.DSKFIL ;FAN-NR. -> DSKFIL JMP DSKERRDR GE3?0: MOVE.L ?3,-(SP) MOVE.L RECL?1,-(SP) MOVE.W HANDL?1,-(SP) MDVE.W #9 3F,-(SP) i READ TRAP #1 ADD.L #12,SP TST.L D0 BPL GE4?0 MOVE.L #GE4?0,DSKRET ;RETURN-ADR.V.FEHLERROUT. MOVE.B #?1.DSKFIL JFAN-NR. -> DSKFIL JMP DSKERROR GE4?0: EQU ★ ENDM

PUT

  • Bestimmten Datensatz schreiben

Format: PUT Dateinummer, # Recordnummer,# Puffer

Der angegebene Datensatz wird aus dem Puffer in eine relative Datei geschrieben. Ebenfalls wie bei dem GET-Macro mĂŒssen die Parameter bei der Verwendung von Registern als Langwörter (.L) vorliegen.

Beispiele: PUT 2,# 12,# Puffer PUT 1,D1,D2

PUT: MACRO TST.W HANDL?1 BPL PU 170 MOVE.L #-101,D0 ; FILE NOT OPEN MOVE.L #PU4?0,DSKRET ;RETURN-ADR.V.FEHLERROUT. MOVE.B #71.DSKFIL ;FAN-NR. -> DSKFIL JMP DSKERROR PU 1?0: MOVEM.L D1-D2.-CSP) MOVE.L 72,D0 MOVE.L RECL71.D2 ;recl MOVE.L D0,D1 JSR MULTI J* RECORD-# MOVE.L D1 ,D0 MDVEM.L CSP)+,D1-D2 CMP.L EOF?1,D0 JALTER SATZ 7 BLS PU270 J JA MOVE.L D0,EOF?1 JEOF ERWEITERN PU2?0: SUB.L RECL?1,D0 CLR.W -CSP) MOVE.W HANDL?l,-(SP) MOVE.L D0,-CSP> MDVE.W #$ 42,—CSP) JLSEEK TRAP #1 ADO. L #10,SP TST.L D0 BPL PU 370 MDVE.L #PU4?0,DSKRET J RETURN-ADR.V.FEHLERROUT. MOVE.B #71,DSKFIL ,’FAN-NR. -> DSKFIL JMP DSKERROR PU370: MOVE.L 73,-CSP) SBUFFER-ADR. MOVE.L RECL?I,-CSP) MOVE.W HANDL?1,-CSP) MOVE.W #$ 40,-CSP) JWRITE TRAP #1 ADD.L #12,SP TST.L D0 BMI PU3A70 CMP.L RECL?1,D0 BEQ PU470 MDVE.L #-102,D0 PU3A70: MOVE.L #PU4?0,DSKRET ;RETURN-ADR.V.FEHLERROUT. MOVE.B #71,DSKFIL :FAN-NR. -> DSKFIL JMP DSKERROR PU470 EQU * ENDM

Put

READ

— NĂ€chsten sequentiellen Datensatz lesen

Format: READ Dateinummer,# Puffer

Wenn das Ende der Datei (EOF) erreicht wird, wird eine -99 in das Datenregister DO ĂŒbergeben.

Beispiel: READ 2,D2

**Read** READ: MACRO TST.W HANDL?1 BPL RE 170 MOVE.L #-101,D0 ;FILE NOT OPEN MOVE.L #RE3?0,DSKRET ; RETURN-ADR.V.FEHLERROUT. MOVE.B #71,DSKFIL ;FAN-NR. -> DSKFIL JMP DSKERROR RE1?0: MOVE.L RECL?1,D0 SUB.L D0,EOF?1 JEOF ? BPL RE270 JNEIN MOVE.L #-99,D0 JJA, EOF BRA RE370 RE2?0: MOVE.L 72,-CSP) MOVE.L RECL?1,D0 MOVE.L D0,-CSP) MOVE.W HANDL?1,-CSP) MOVE.W #S3F,-CSP) J READ TRAP #1 ADD.L #12,SP TST.L D0 BPL RE370 MOVE.L #RE3?0,DSKRET ; RETURN-ADR.V.FEHLERRDUT. MOVE.B #71,DSKFIL ;FAN-NR. -> DSKFIL JMP DSKERROR RE370: EQU * ENDM

WRITE

  • NĂ€chsten sequentiellen Datensatz schreiben

Format: WRITE Dateinummer, # Puffer

Beispiel: WRITE 2,D4

WRITE: MACRO TST.W HANDL71 BPL WR070 MOVE.L #-101,D0 JFILE NOT OPEN MOVE.L #WR9?0,DSKRET ;RETURN-ADR.V.FEHLERROUT. MOVE.B #71,DSKFIL 1FAN-NR. -> DSKFIL JMP DSKERROR WR070: MOVE.L 72,-CSP) MOVE.L RECL?1,D0 MOVE.L D0,-CSP) MOVE.W HANDL71,-CSP) MOVE.W #$ 40,-C SP) ;WRITE TRAP #1 ADD.L #12,SP TST.L D0 BMI WR170 CMP.L RECL?1,D0 BEQ WR970 MOVE.L #-102,D0 WR170: MOVE.L #WR9?0,DSKRET ;RETURN-ADR.V.FEHLERROUT. MOVE.B #71,DSKFIL JFAN-NR. -> DSKFIL JMP DSKERROR WR9?0: EQU * ENDM

Write

RENAME

— Umbenennen von Dateien

Format: RENAME ”Alt”,”Neu”

Tritt ein Fehler nach Aufruf dieser Routine auf, wird ein negativer Wert in das Datenregister DO geschrieben, ansonsten eine Null.

**Rename** RENAME: MACRO BRA RENA370 RENA1?0: DC 71 DC 0 RENA2?0: DC 72 DC 0 EVEN RENA3?0: MOVE.L #RENA2?0,-CSP) MOVE.L #RENA170,-CSP) MOVE.W #0,-CSP) MOVE.W #$56,-CSP) TRAP #1 ADD.L #12,SP ENDM ;

KILL

— Löschen von Dateien

Format: KILL "Dateiname”

Das Datenregister DO wird ebenso wie bei dem RENAME-Macro behandelt, also negativer Wert bei einem aufgetretenen Fehler und Null im Normalfall.

Kill

KILL: MACRO BRA KIL270 KIL170: DC 71 DC 0 EVEN KIL270: MOVE.L #KIL170,-CSP) MOVE.W #$41,-CSP) TRAP #1 ADDQ.L #6,SP ENDM

Diskettendefinitionen und Fehlerbehandlungs-Routinen

Das letzte Kapitel des zweiten Teils von ISAM & PRIMA beinhaltet die oben genannten Definitionen und Fehler-Routinen; außerdem noch einen kleinen Hinweis auf den Autor.

Bei jedem Diskettenmacro, mit Ausnahme von RENAME und KILL, wird automatisch auf Fehler geprĂŒft. Tritt ein solcher auf, erscheint dann ein Fehlerhinweis in Klartext auf dem Bildschirm und das Programm wartet solange, bis ein Tastendruck erfolgt. Wird eine Taste gedrĂŒckt, wird das Programm direkt hinter dem Macro fortgesetzt, in dem der Fehler auftrat und der Fehlercode in das Datenregister DO ĂŒbergeben. Es besteht also die Möglichkeit, hinter jedem Diskettenmacro DO abzufragen und bei aufgetretenem Fehler anschließend nach eigenen WĂŒnschen fortzufahren.

Eine Ausnahme bildet der Fehlercode — 99, der das Ende der Datei (EOF) anzeigt. Hier erfolgt kein automatischer Fehlerhinweis, da dies ja nicht sehr sinnvoll wĂ€re.

Falls nun aber der Wunsch besteht, aus irgendwelchen GrĂŒnden eine automatische Fehleranzeige zu unterdrĂŒcken, kann man dies auf folgende Weise leicht lösen.

Man muß dazu nur den Vektor DSK-VEC, der in der Fehlerbehandlungs-Routine definiert ist, auf die eigene Fehlerroutine einstellen. Zuvor sollte man aber sicherheitshalber den Originalvektor in einem Datenregister sichern. Der Vektor DSKRET (.L) gibt dann die Adresse an, in der die Instruktion steht, die unmittelbar hinter dem zum Fehler fĂŒhrenden Macro liegt. Dies wĂ€re dann die Adresse, die man anspringen muß, nachdem man den Fehler erfolgreich beheben konnte.

HANDL1 : DC.W -1 ;HANDLE-# RECL1: DC.L 0 ;SATZLÄNGE FILE1: DC.L 0 JADR.FILENAME E0F1 : DC.L 0 ;ANZAHL BYTES DER DATEI HANDL2: DC.W -1 5 HANDLE-# RECL2 : DC.L 0 ;SATZLÄNGE FILE2: DC.L 0 JADR.FILENAME EOF2 : DC.L 0 JANZAHL BYTES DER DATEI HANDL3: DC.W -1 JHANDLE-# RECL3: DC.L 0 JSATZLÄNGE FILE3: DC.L 0 JADR.FILENAME EOF3: DC.L 0 JANZAHL BYTES DER DATEI HANDL4: DC.W -1 JHANDLE-# RECL4: DC.L 0 JSATZLÄNGE FILE4: DC.L 0 JADR.FILENAME EOF4: DC.L 0 JANZAHL BYTES DER DATEI HANDL5: DC.W -1 JHANDLE-# RECL5: DC.L 0 JSATZLÄNGE FILE5: DC.L 0 JADR.FILENAME EOF5: DC.L 0 JANZAHL BYTES DER DATEI HANDL6: DC.W -1 JHANDLE-# RECL6: DC.L 0 JSATZLÄNGE FILE6: DC.L 0 JADR.FILENAME EOF6: DC.L 0 JANZAHL BYTES DER DATEI DTABUF: BLK 44 J DTABUFFER FÜR FUNKTION SFIRST DSKVEC: DC.L DSKOIO JVECTOR FEHLERBEHANDLUNGSROUT. DSKRET: DC.L DSKOIO J RĂŒCKSPRG.ADR.VON FEHLERBEHANDLG. DSKFIL: DC.B 0,13,10 JFAN-NR. DER FEHLERDATEI,CR,LF DC 0 JBEGRENZUNGSBYTE F. AUSGABE DSKTAB: DC -1,"ALLGEMEINER FEHLER: -1", 13,10,0 DC -2,"DRIVE NOT READY: -2",13,10,0 DC -3,"UNBEKANNTER BEFEHL: -3",13,10,0 DC -4,"CRC ERROR: -4",13,10,0 DC -5,"BAD REQUEST: -5", 13,10,0 DC -6,"SEEK ERROR: -6",13,10,0 DC -7,"UNKNOWN MEDIA: -7",13,10,0 DC -8,"SEKTOR NOT FOUND: -8",13,10,0 DC -9,"KEIN PAPIER: -9",13,10,0 DC -10,"SCHREIBFEHLER: -10",13,10,0 DC -11,"LESEFEHLER: -11",13,10,0 DC -12,"ALLGEMEINER FEHLER: -12",13,10,0 DC -13,"DISKETTE SCHREIBGESCHUETZT: -13",13,10,0 DC -14,"DISKETTE WURDE GEWECHSELT: -14",13,10,0 DC -15,"UNBEKANNTES GERAET: -15",13,10,0 DC -16,"BAD SECTORS WHILE VERIFY: -16",13,10,0 DC -17,"DISKETTE EINLEGEN: -17",13,10,0 DC -32,"UNGUELTIGE FUNKTIONSNR.: -32",13,10,0 DC -33,"DATEI NICHT GEFUNDEN: -33",13,10,0 DC -34,"PFADNAME NICHT GEFUNDEN: -34",13,10,0 DC -35,"ZUVIELE OFFENE DATEIEN: -35",13,10,0 DC -36,"ZUGRIFF NICHT MOEGLICH: -36",13,10,0 DC -37,"UNGUELTIGE HANDLE-# -37",13,10,0 DC -39,"NICHT GENUEGEND SPEICHER: -39",13,10,0 DC -40,"UNGUELTIGE SPEICHERBLOCKADR.: -40", 13,10,0 DC -46,"UNGUELTIGE LAUFWERKSBEZEICHNUNG -46",13,10,0 DC -49,"KEINE WEITEREN DATEIEN: -49",13,10,0 DC -100,"DATEI IST SCHON GEOEFFNET",13,10,0 DC -101,"DATEI WURDE NICHT GEOEFFNET",13,10,0 DC -102,"DISKETTE VOLL",13,10,0 DSKEND: EQU EVEN *-l DSKERROR: MOVE.L DSKVEC,A0 JMP CAO) DSK010: MOVEM.L D0-D2,-CSP) MOVE.L ZEILE D0, D2 PRINT "*** DISKETTENFEHLER ***" MOVE.L #DSKEND,D1 SUB.L #DSKTAB,D1 MOVE.L #DSKTAB,A0 DSK020: CMP.B (A0)+,D2 DBEQ Dl,DSK020 TST.W Dl BMI DSK040 PRINTS AO DSK030: PRINTX "DATEI " OR.B #$30,DSKFIL PRINTS #DSKFIL DSK035: INKEY TST.L D0 BEQ DSK035 MOVEM.L (SP)+,D0-D2 MOVE.L DSKRET,A0 JMP CAO) DSK040: PRINT "UNBEKANNTER FEHLER" BRA DSK030

Diskettendefinitionen & Fehlerbehandlungsroutine

Damit sei fĂŒr den zweiten Teil der Assemblermacros erst einmal genug. In der nĂ€chsten Ausgabe werden dann die Standardroutinen, wie zum Beispiel Eingabe-, Mathematik- und Zahlenumwandlungs-Routinen behandelt werden. (HE)