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