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
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
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)