Die folgende Liste zeigt eine Umsetzung einiger Befehle des BASIC 7.0 in Pascalprozeduren und -funktionen. Dabei wurden die Spriteprozeduren nicht aufgenommen, da die dazu erforderliche interruptgesteuerte Unterbrechung von Pascalprogrammen bei Spritekollisionen nicht realisiert werden kann.
Um bei Dateioperationen den Floppystatus zu lesen, muß zuvor der Kommandokanal eröffnet worden sein:
VAR DSK: TEXT; OPEN(DSK, 8, 15);
Anschließend kann der Fehlerkanal mit der Prozedur DSTATUS gelesen werden. Durch die Abfrage NUMMER>=20 wird die Meldung »00, OK, 00, 00« nicht als Fehler angezeigt:
PROCEDURE DSTATUS; VAR NUMMER: INTEGER; TEXT : STRING[40]; BEGIN READ(DSK, NUMMER); IF NUMMER>=20 THEN BEGIN READLN(DSK, TEXT); WRITELN(NUMMER:3,' ',TEXT); END END; (* DSTATUS *)
APPEND
Diese Prozedur wird durch den Prozeduraufruf OPEN mit dem Schreibmodus APPEND realisiert (s. Kapitel 3.1).
OPEN(F, 8, 3, 'TEST,SEQ,APPEND');
BACKUP
PROCEDURE BACKUP(SRC,DEST: CHAR; DEVICE: BYTE); (* Kopiere Disketten auf einem Doppellaufwerk *) VAR DSK: TEXT; BEGIN OPEN(DSK, DEVICE, 15, 'D' + DEST + '=D' + SRC); CLOSE(DSK) END; (* BACKUP *)
Beispiel: BACKUP('0','1',8)
COLLECT
PROCEDURE COLLECT(DRV: CHAR; DEVICE: BYTE); (* Löscht unvollständige Dateien. Gibt Speicher frei *) VAR DSK: TEXT; BEGIN OPEN(DSK, DEVICE, 15, 'V' + DRV); CLOSE(DSK) END; (* COLLECT *)
Beispiel: COLLECT('0',8)
CONCAT
PROCEDURE CONCAT(A,B,C:STRING; DEVICE:BYTE); (* Verknüpfe die Dateien A und B in dieser Reihenfolge *) (* zu einer neuen Datei C*) VAR DSK: TEXT; BEGIN OPEN(DSK, DEVICE, 15, 'C' + C ' =' + A + ',' + B); CLOSE(DSK) END; (* CONCAT *)
Beispiel: CONCAT('0:TEXT1', '0:TEXT2', '0:TEXTNEU',8)
COPY
PROCEDURE COPY(A,B:STRING; DEVICE:BYTE); (* Speichere eine Kopie der Datei A in einer neuen Datei B *) VAR DSK: TEXT; BEGIN OPEN(DSK, DEVICE, 15, 'C' + B + ' =' + A); CLOSE(DSK) END; (* COPY *)
Beispiele:
COPY('0:TEXTALT', '1:TEXTNEU', 8)
COPY('0:TEXT*', '1:*',8);
Die Laufwerksnummer 1 darf nur bei Doppellaufwerken gewählt werden.
DEC
FUNCTION DEC(S:STRING): INTEGER; (* Umwandlung des hexadezimalen Strings S in eine Zahl *) (* S darf nicht größer als $7FFF werden. *) VAR SUM: INTEGER; BEGIN SUM:= 0; WHILE LENGTH(S)>0 DO BEGIN SUM:= SUM * 16 + ORD(S[1]) - ORD('0'); DELETE(S,1,1) END; DEC:= SUM END; (* DEC *)
DIRECTORY
Die Anzeige des Diskinhaltes existiert bereits als Routine in Maschinensprache. Zum Aufruf wird der SYS-Befehl verwendet, wobei im X-Register die logische Filenummer der eröffneten Datei DIR übergeben wird.
PROCEDURE DIRECTORY(S:STRING; DEVICE: BYTE); (* Disketteninhaltsverzeichnis mit Suchmuster S anzeigen *) VAR REGS: RECORD SR,A,X,Y:BYTE END; DIR : TEXT; BEGIN OPEN(DIR,DEVICE,0,S); BANK:=15; REGS.X:= HBYTE(STATUS(DIR)); (* logische Filenummer *) SYS(-24385,REGS); END; (* DIRECTORY *)
Beispiele: DIRECTORY('$',8);
DIRECTORY('$0:TEST*',8);
DIRECTORY('$*=REL',9);
Möchten Sie den Inhalt des Inhaltsverzeichnisses jedoch in Variablen speichern, so können Sie sich an dem Programm in Bild 104 orientieren.
HEADER
PROCEDURE HEADER(S:STRING; DEVICE: BYTE); (* Lösche oder formatiere Diskette in Gerät mit der Nummer *) (* DEVICE. S definiert den neuen Diskettennamen. Enthält *) (* dieser nach einem Komma zwei Zeichen, so wird eine *) (* Diskettte mit dieser ID formatiert. Ansonsten wird nur *) (* das Inhaltsverzeichnis der Diskette gelöscht *) VAR DSK: TEXT; BEGIN OPEN(DSK, DEVICE, 15, 'N' + S); CLOSE(DSK) END; (* HEADER *)
Beispiele: HEADER('NEU',8);
HEADER('DATEN,XX',9);
HEX$
FUNCTION HEX(X:INTEGER): STRING; (* wandelt X in eine vierstellige Hexadezimalzahl um *) FUNCTION HEXBYTE(B:BYTE): STRING; FUNCTION HEXDIGIT(D: BYTE): CHAR; BEGIN IF D>9 THEN HEXDIGIT:= CHR(D - 10 + ORD('A')) ELSE HEXDIGIT:= CHR(D + ORD('0')) END; (* HEXDIGIT *) BEGIN HEXBYTE:= HEXDIGIT(B DIV 16) + HEXDIGIT(B AND 15); END; (* HEXBYTE *) BEGIN HEX:= HEXBYTE(HBYTE(X)) + HEXBYTE(X AND 255); END; (* HEX *)
Beispiele: WRITELN(HEX(1234));
WRITELN(HEX(-30));
KEY
Zur Definition von Tastaturbelegungen existiert im Betriebssystem bereits eine Routine, die in der folgenden Prozedur verwendet wird:
PROCEDURE KEY(NUMMER: BYTE; S:STRING); (* Belege die Funktionstaste NUMMER mit dem String S *) (* Nummer 1 bis 8 sind die Funktionstasten F1-F8 *) (* Nummer 9 ist die SHIFT/RUN-STOP Taste, während *) (* Nummer 10 die HELP-Taste bezeichnet *) VAR REGS: RECORD SR,A,X,Y: BYTE END; POINTER: RECORD P: INTEGER; BNK: BYTE END [252]; BEGIN POINTER.P:= ADDU(ADR(S),1); (* Zeiger auf 1. Zeichen des Strings in Bank 1 *) POINTER.BNK:= 1; REGS.A:= 252; (* Zeiger auf Pointer in Z-Page *) REGS.X:= NUMMER; REGS.Y:= LENGTH(S); BANK:=15; SYS(-155,REGS); END; (* KEY *)
Beispiele: KEY(1,'Dies ist F1');
KEY(2,'*' #13);
KEY(10,'Hilflos');
RECORD
Dieser Befehl entspricht der Prozedur SEEK, die im Programm in Bild 105 verwendet wurde. Die Anwendung relativer Dateien in Pascal 2.0 wird in Kapitel 3.1 ausführlich im Zusammenhang erläutert.
RENAME
PROCEDURE RENAME(A,B:STRING; DEVICE:BYTE); (* Benenne die Datei A in B um *) VAR DSK: TEXT; BEGIN OPEN(DSK, DEVICE, 15, 'R' + B + ' =' + A); CLOSE(DSK) END; (* RENAME *)
Datei A und B müssen die gleiche Laufwerkskennzeichnung besitzen.
Beispiel: RENAME('0:DATEN', '0:DATENNEU',8)
XOR
FUNCTION XOR(A,B:INTEGER): INTEGER; (* Diese Funktion verknüpft die Zahlen A und B logisch *) (* EXKLUSIV ODER *) BEGIN XOR:= (A AND NOT B) OR (NOT A AND B) END; (* XOR *)
Die logische EXCLUSIV-ODER-Verknüpfung boolescher Werte A und B erfolgt mit dem Vergleich A<>B.