ISAM & PRIMA Teil 2 - Die Diskettenmacros

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

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,Dl,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, DO	
	MOVE.L	RECL?1,D2	JRECL
	MOVE.L	D0,Dl	
	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

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

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)



Aus: ST-Computer 11 / 1986, Seite 51

Links

Copyright-Bestimmungen: siehe Über diese Seite