Inhaltsverzeichnis

3.3 Nützliche Pascal-Routinen

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.

Inhaltsverzeichnis