---------------------------------------------------

Anhang VI

Freier Zugriff

----------------------------------------------------

 

 

DEFINITION DES FREIEN ZUGRIFFS

 

Der freie Zugriff ist als Methode definiert, die Datensätze von oder auf jeden beliebigen Teil einer Datei liest bzw. schreibt, wobei es nicht erforderlich ist, die voranliegenen Datensätze der Datei zu lesen/schreiben.

 

Bevor ein I/O-Kommando verarbeitet werden kann, muF das Speichermedium des Gerätes physikalisch an der richtigen (Byte-)Stelle positioniert werden. Ein sequentielles Gerät, wie z.B. der ATARI-Programmrecorder, muF per Hand an die richtige Position gebracht werden. In diesem Fall geschieht das über das Zählwerk des Recorders. Soll also auf den 100. Datensatz zugegriffen werden, so müssen die Sätze 1 bis 99 übersprungen werden. Es ist offensichtlich, daF dieses aufgrund der physikalischen Eigenschaften des Gerätes sehr viel Zeit benötigt.

 

Ein Gerät, wie die ATARI-Diskettenstation, kann durch ein BASIC-Programm an jede Byte-Position gebracht werden. Wenn z.B. der 100. Datensatz gelesen werden soll, so kann dies sofort geschehen, indem der Lesekopf an die entsprechende Stelle positioniert wird. Der freie Zugriff wird z.B. durch das POINT-Kommando in BASIC möglich.

 

          OPEN #1,12,0,"D1:--------.---*

          SECTOR=63

          BYTE=26

          POINT #1,SECTOR,BYTE

 

 

Diese Befehle verursachen, daF die auf Kanal 1 geöffnete Datei auf den Sektor 63 und das 26. Byte positioniert wird. Die Datei muF hierfür bereits in Modus 12 geöffnet und Sektor 63 durch das File-Manager-System (FMS) anerkannt worden sein.

 

ZIELE

 

1. Definition der Struktur der Datei, die den freien Zugriff vereinfacht.

 

2. Maximum der Disketten-Nutzung durch Ausnutzung alles freien Benutzerraumes einer Datei.

 

3. Vereinfachen von Programmen durch Aufstellen von Unterroutinen, welche die allgemeinen Berechnungen für den freien Zugriff übernehmen.

 

 

VORSTELLUNGEN

 

1. Der freie Zugriff kann auf 2 Arten vereinfacht werden:

 

Als erstes wird die von POINT-Kommando benötigte Sektor- und Byte-Information in der Datei gespeichert, so daF diese einer Variablen eines Programms zugeordnet werden kann, sobald die Datei geöffnet wurde. Zweitens muF die Programm-Variable so wenig RAM wie möglich verbrauchen.

 

Ein zweidimensionales numerisches Feld könnte z.B. als Programm-Variable benutzt werden. So würde jeder Datensatz 12 Bytes des Speicher verbrauchen. Eine String-Variable würde weniger RAM benötigen, da die Nummern des Sektors (0-720) in 2 Bytes und die des Bytes (0-127) in einem Byte gespeichert werden können.

 

2. Die maximale Nutzung der Diskette wird durch Verwendung von Modus 12 (I/O) anstelle von Modus 9 (Anfügen) erreicht.

 

Ein gibt 2 Probleme, wenn mit Hilfe von Modus 9 auf eine Datei zugegriffen wird. Bei der Verarbeitung eines OPEN-Kommandos legt das FMS als erstes einen neuen Sektor für die Datei fest, gleichgültig ob der vorige bereits vollständig mit Daten gefüllt ist oder nicht. Als zweites arbeitet der POINT-Befehl nicht bei Dateien, die in Modus 9 geöffnet wurden.

 

In Modus 12 ist es möglich beim Aufbauen der Datei leere Datensätze zu erzeugen.

 

3. Datensatzerzeuger wird durch jeweils ein Status Byte pro Satz vereinfacht. Ein Wert von 0 zeigt an, daF der Satz frei ist; ein Wert von 1 zeigt an, daF der Satz benutzt wird.

 

 

DATEI-STRUKTUR

 

Eine Datei besteht aus 3 Abschnitten:

 

          DATEIKOPF

          DATEIZEIBER (F‹R DEN FREIEN ZUGRIFF)

          DATEN-SƒTZE

 

 

Der Dateikopf ist der erste Sektor der Datei und ist 125 Bytes lang (124 Datenbytes + 1 Begrenzer).

 

FILE-HEADER RECORD

 

BYTE INHALT

1-2  Sektor-Adresse des Dateikopfes.

3    Byte-Offset des Dateikopfes

4    Nicht benutzt

5-6     Anzahl der Datensätze in der Datei

7-8  Anzahl der Bytes je Datensatz

9-124 Nicht benutzt

 

Die Dateizeiger folgen dem Dateikopf und beginnen daher im zweiten Sektor der Datei. Die Daten werden als String-Variable in Gruppen von je 4 Bytes gespeichert. Die ersten 4 Bytes werden zur Positions-Festlegung des Zeiger-Strings innerhalb der Datei benutzt. Danach folgen jeweils 4 Bytes für jeden Datensatz in der Datei.

 

 

DATEIZEIGER

 

BYTE INHALT

1-2  Sektor-Adresse der Zeiger für den freien Zugriff

3    Byte-Offset der Zeiger für den freien Zugriff

4    Nicht benutzt

5-N  4 Bytes für jeden Datensatz

     1-2 Sektor Adresse des Datensatzes

     3 Byte-Offset des Datensatzes

     4 Status des Datensatzes

 

Die Datensätze folgen den Zeigern und werden als String-Variable gespeichert.

 

 

UNTERROUTINEN F‹R DEN FREIEN ZUGRIFF

 

1. FILEOPEN.SUB

 

Diese Routine öffnet eine Datei im Modus 12 und initialisiert die Variablen für den freien Zugriff, die in anderen Routinen benutzt werden.

 

     Eingabe-Variablen:

 

          FILE$     - wird vom Benutzer dimensioniert und

                      angegeben (15 Bytes)

          Channel   - IOCB-nummer (1-5)

 

     Aufruf:

          GOSUB 9300

 

     Ausgabe-Variablen:

          FILEMAX   - Anzahl der Datensätze

          FILELEN        - Anzahl der Bytes je Datensatz

          FILEPTR$  - enthält die Dateizeiger

          FILEREC$  - wird für Datensatz I/O dimensioniert

 

     Lokale Variablen:

          FILESEC

          FILEBYT     Diese werden im Augenblick nicht

          FILESTS     benutzt

 

 

2. FILEADD.SUB

 

Diese Routine bestimmt den nächsten verfügbaren Datensatz, indem in FILEPTR$ nach einem Status-Byte mit dem Wert 0 gesucht wird. Wird dieser Wert gefunden, so wird er auf 1 gesetzt und die Nummer des Datensatzes in RECORD gespeichert. Wird RECORD zu 0, dann sind alle Datensätze belegt.

 

     Eingabe-Variablen:

          FILEMAX

 

     Aufruf:

          GOSUB 9400

 

     Ausgabe-Variable:

          RECORD    - Nummer des nächsten verfügbaren

                       Datensatzes

          FILEPTR$  - wird mit Status-Byte von 1

                       aktualisiert.

 

     Lokale-Variablen:

          RECORD1

          B

 

 

3. FILEDEL.SUB

 

Diese Routine markiert einen belegten Datensatz durch Setzen des entsprechenden Status-Bytes in FILEPTR$ auf 0 in einen freien Datensatz.

 

     Eingabe-Variablen:

          RECORD

 

     Aufruf:

          GOSUB 9450

 

     Ausgabe-Variablen:

          FILEPTR$  - ein Status-Byte wird mit 0

                       aktualisiert.

 

     Lokale Variablen:

          B

 

 

4. FILPTR.SUB

 

Diese Routine aktualisiert die Dateizeiger auf der Diskette.

 

     Eingabe-Variablen:

          Keine

 

     Aufruf:

          GOSUB 9500

 

     Ausgabe-Variablen:

          keine

 

Lokale Variablen:

          S

          B

 

 

5. FILEPOS.SUB

 

Diese Routine setzt den Dateizeiger an den Anfang eines Datensatzes.

 

     Eingabe-Variablen:

          RECORD    - Nummer des Datensatzes, auf den

                      gezeigt werden soll.

 

     Aufruf:

          GOSUB 9600

 

     Lokale-Variablen:

          S

          B

 

 

9200 REM ANHANG UND UNTERROUTINE VON WILLIAM BARLETT

9300 REM *FILEOPEN.SUB* WBB 30.3.81

9305 REM ÷FFNEN EINER DATEI IM MODUS 12 UND DEFINITION

9307 REM ALLER VARIABLEN

9310 OPEN #CHANNEL,12,0,FILE$

9315 DIM FILHED$(124)

9320 FOR I=1 TO 124:GET #CHANNEL,B:FILEHED$(I)=CHRS(B):

 NEXT I:GET #CHANNEL,B

9325 FILESEC=ASC(FILEHED$(1) 256+ASC(FILEHED$(2))

9330 FILEBYT=ASC(FILEHED$(3))

9335 FILESTS=ASC(FILEHED$(4))

9340 FILEMAX=ASC(FILEHED$(5)) 256+ASC(FILEHED$(6))

9345 FILELEN=ASC(FILEHED$(7)) 256+ASC(FILEHED$(8))

9350 DIM FILEPTR$(4+4 FILEMAX),FILEREC$(FILELEN)

9355 FOR l=1 TO 4+4 FILEMAX:GET #CHANNEL,B:FILEPTR$(I)=

 CHR$(B):NEXT I:GET #CHANNEL,B

9360 RETURN

 

9400 REM *FILEADD.SUB* WBB 30.3.91

9405 REM BESTIMMEN DES NƒCHSTEN FREIEN DATENSATZES

9410 RECORD=0

9415 IF FILEMAX=0 THEN RETURN

9420 FOR RECORD1=l TO FILEMAX

9425 B=RECORD1 4+4

9430 IF FILEPTR$(B,B)=CHR$(0) THEN RECORD=RECORD1:RECORD1=

 FILEMAX:FILEPTR$(B,B)=CHR$(1)

9435 NEXT RECORD1

9440 RETURN

 

9450 REM *FILEDEL.SUB* WBB 30.3.Bl

9455 REM FREIMACHEN EINES BELEGTEN DATENSATZES

9460 B=RECORD 4+4

9465 FILEPTR$(B,B)=CHR$(0)

9470 RETURN

 

9500 REM *FILEPTR.SUB* WBB 19.3.81

9510 REM FILEPTR$ SCHREIBEN

9515 S=ASC(FILEPTR$(100 256+ASC(FILEPTR$(2))

9520 B=ASC(FILEPTR$ (3))

9525 POINT #CHANNEL,S,B

9530 FOR I=l TO 4+4 FILEMAX:B=ASC(FILEPTR$)1)):PUT #CHANNEL,B: NEXT I

9535 RETURN

 

9600 REM *FILEPOS.SUB* WBB 31.3.81

9605 REM ZEIGE FILE ZU RECORD

9610 S=ASC(FILEPTR$(RCORD 4+1)) 256+ASC(FILEPTR$(RECORD 4+2))

9615 B=ASC(FILEPTR$(RECORD 4+3))

9620 STS=ACS(FILEPTR$(RECORD 4+4))

9625 POINT #CHANNEL,S,B

9630 RETURN

 

I. EINF‹HRUNG ZU FILE001

 

Dieses Programm wird zur Erstellung einer neuen Datei auf Diskette und Initialisierung deren Struktur benutzt. Die Struktur des freien Zugriffe wird für das Arbeiten mit den folgenden BASIC-Unterroutinen angelegt

 

               FILEOPEN.SUB

               FILEADD.SUB

               FILEDEL.SUB

               FILEPTR.SUB

               FILEPOS.SUB

 

 

II. PROGRAMM-STRUKTUR

 

               0001-0999 Hauptprogramm

               1000-9999 Unterrautinen

 

 

III. PROGRAMM-LOGIK

 

Die fünf wesentlichen Programmteile sind Programm- Initializierung, Datei-Definition, Bildschirm-Aufbau, File-Festlegung und SchlieFen.

 

A. Initialisierung 1000-1495

 

1015      Variablen dimensionieren

1020      Programmnamen anzeigen

1025-1035 Benutzer Programmabbruch gestatten

1040      BLANK$ als String-Füller vorbereiten

 

 

B. Datei-Definition 1500-1999

 

1510-1535 Benutzer definiert die Datei-Parameter

1540-1550 Benutzer berichtigt die Parameter

1600-1645 Disketten-Verzeichnis überprüfen, ob die

          angegebene Datei bereits vorhanden ist

1700-1730 ‹berprüfung, ob genügend Sektoren zum

                        Erstellen einer Datei vorhanden sind

1800-1825 Dateinamen aufbauen

 

 

C. Bildschirm-Aufbau 9600-9650

 

 

D. Datei-Festlegung 2000-2499

 

2005      Datei aufbauen

2010      Zeiger sichern

2015      Variablen dimensionieren

                        FILEHED$ - Dateikopf

          FILEPTR$ - Dateizeiger

          FILEREC$ - Datensatz-I/O-Variable

2100-2180 FILEHED$ erstellen und sichern

2200-2245 FILEPTR$ erstellen und sichern

2305      FILEREC$ auffüllen

2310-2345 Dateizeiger in FILEPTR$ speichern

2350      Bildschirm erneuern

2355      FILEREC$ auf Diskette speichern

2370-2375 AbschlieFenden FILEPTR$ auf Diskette speichern

 

 

E. AbschlieFen 0900-0999

 

10 REM *FILE0001* WBB 12.3.81

100 REM HAUPTPROGRAMM

110 GOSUB 1000

120 IF YN$="N" THEN 900

130 GOSUB 1500

140 GOSUB 9600

150 GOSUB 2000

900 REM ENDE

910 CLOSE

920 GRAPHICS 0

930 END

1000 REM INITIALISIERUNG

1005 TRAP 9800

1010 GRAPHICS 2

1015 DIM YN$(1),DVC$(3),FILE$(8),EST$(3),FILENAME$(15),

 FMS$(16),BLANK$(128)

1020 PLOT 5,4:PRINT #6;"FILE0001"

1025 PRINT "DIESES PROGRAMM INITIALISIERT EINE NEU DATEI."

1030 PRINT "WOLLEN SIE FORTFAHREN(J/N)";

1035 INPUT YN$

1040 BLANK$=* *:BLANK$(128)= BLANK$(2)

1095 RETURN

1500 REM FILE DEFINIEREN

1505 GRAPHICS 2

1510 PRINT #6,*DATEI-DEFINITION*

1515 PRINT *        GERƒT  ";:INPUT DVC$:DVC$(LEN(DVC$)+1)=*:"

1520 PRINT *         DATEINAME  *;:INPUT FILE$

1525 PRINT *  ERWEITERUNG  *;:INPUT EXT$

1530 PRINT *   SATZANZAHL  *;:INPUT FILEMAX

1535 PRINT *    SATZLƒNGE  *;:INPUT FILELEN

1540 PRINT *WOLLEN SIE FORTFAHREN (J/N) *;

1545 INPUT YN$

1550 IF YN$<>*J*" THEN 1500

1600 REM ‹BERPR‹FUNG OB DATEI VORHANDEN

1605 FMS$=DVC$FMS$(LEN(FMS$)+1)* . *

1610 OPEN #1,6,0,FMS$

1615 INPUT #1,FMS$

1620 IF FMS$(2,2)<>" " THEN 1700

1625 IF FMS$(3,2+LEN(FILE$))<>FILE$ OR FMS$(11,10+LEN(EXT$))

 <>EXT$ THEN 1615

1630 CLOSE #1

1635 PRINT *DIE DATEI IST BEREITS VORHANDEN!*;CHR$(253)

1640 GOSUB 9850

1645 BOTO 1500

1700 REM ÜBERPRüFUNG OB GENUGEND FREIRAUM VORHANDEN

1705 CLOSE #1

1710 FREE=VAL(FMS$(1,3)):NEED=FILEMAX (FILELEN+5)/125+1

1715 IF NEED<FREE THEN 1800

1720 PRINT *KEIN AUSREICHENDER PLATZ VORHANDEN!*:PRINT

 FREE;* FREI  ";NEED;"BENÖTIGT!";CHR$(253)

1725 GOSUB 9850

1730 OOTO 1500

1900 REM FILENAME VERKETTEN

1805 FILENAME$=DVC$

1810 FILENAME$(LEN(FILENAME$)+1)=FILES

1915 FILENAME$(LEN(FILENAME$)+1)="."

1820 FILENAME$(LEN(FILENAME$)+1)=EXT$

1825 RETURN

2000 REM KOPF-, ZEIGER- UND DATENSATZ-STRINGS INITIALISIEREN

2005 OPEN #1,8,0,FILENAME$

2010 NOTE #1,FILESEC,FILEBYT

2015 DIM FILEHED$(124),FILEPTR$(4+4 FILEMAX),

 FILEREC$(FILELEN)

2100 REM DATEIKOPF

2105 FILEHED$=BALNK$

2110 HI=INT(FILESEC/256)

2115 LO=FILESEC-HI 256

2120 FILEHED$(1,1)=CHR$(HI)

2125 FILEHED$(2,2)=CHR$(LO)

2130 FILEHED$(3,3)=CHR$(FILEBYT)

2135 FILEHED$(4,4)=CHR$(0)

2140 HI=INT(FILEMAX/256)

2145 LO=FILEMAX-HI 256

2150 FILEHED$(5,5)=CHR$(HI)

2155 FILEHED$(6,6)=CHR$(LO)

2160 HI=INT(FILELEN/256)

2165 LO=FILELEN-HI 256

2170 FILEHED$(7,7)=CHR$(HI)

2175 F1LEHED$(8,8)=CHR$(LO)

2180 PRINT #1;FILEHED$

2200 REM DATEI-ZEIGER

2205 FOR I=l 4+4 FILEMAX STEP 128$:FILEPTR$(I)=BLANK$:

 NEXT I

2210 NOTE #1,S,B

2215 HI=INT(S/256)

2220 LO=S-HI 256

2225 FILEPTR$(1,1)=CHR$(HI)

2230 FILEPTR$(2,2)=CHR$(LO)

2235 FILEPTR$(3,3)-CHR$(B)

2240 FILEPTR$(4,4)=CHR$(0)

2245 PRINT #1;FILEPTR$

2300 REM DATENSƒTZE

2305 FOR I=1 TO FILELEN STEP 128:FILEREC$(I)=BLANK$:NEXT I

2310 FOR I=1 TO FILEMAX

2315 NOTE #I,S,B

2320 HI=INT(S/256)

2325 LO=S-HI 256

2330 FILEPTR$(I 4+1,I 4+1)=CHR$(HI)

2335 FILEPTR$(I 4+2,I 4+2)=CHR$(L0)

2340 FILEPTR$(I 4+3,I 4+3)=CHR$(B)

2345 FILEPTR$(I 4+4,I 4+4)=CHRS(0)

2350 GOSUB 9700

2355 PRINT #1;FILEREC

2360 NEXT I

2365 CLOSE #l

2370 OPEN #1,12,0,FILENAME$

2375 GOSUB 9510

2380 RETURN

 

9500 REM *FILEPTR.SUB* WBB 19.3.81

9510 REM FILEPTR SCHREIBEN

9515 S=ASC(FILEPTR$(1,1)) 256+ASC(FILEPTR2,2))

9520 B=ASC(FILEPTR$(3,3))

9525 POINT #1,S,B

9530 PRINT #1;FILEPTR$

9535 RETURN

9600 REM BILDSCHIRM

9605 GRAPHICS 2

9610 PRINT #6,* INITIALISIERUNG *

9615 PRINT #6

9620 PRINT #6;"IM AUSENBLIK"

9625 PRINT #6,"                TOTAL"

 

 

9630 PRINT #6;"    % BELEGT*

9635 PRINT #6

9640 PRINT #6;"       SEKTOR*

9645 PRINT #6;"                   BYTE"

9650 RETURN

9700 REM BILDSCHIRM ERNEUERN

9705 PLOT 14,2:PRINT #6;1

9710 PLOT 14,3:PRINT #6;FILEMAX

9715 PLOT 14,4:PRINT #6;INT(I/FILEMAX 100)

9720 PLOT 14,6:PRINT #6;S;*   *

9725 PLOT 14,7:PRINT #6;B;*   *

9795 RETURN

9900 REM TRAP,SUB

9805 TRAP 9825

9810 PRINT *FEHLER  *;PEEK(195);" BEI ";PEEK(l87) 256+

PEEK(186)

9815 PRINT *BESTƒTIGUNG *;

9820 INPUT YN$

9825 END

9850 REM *DELAY.SUB* WBB 19.3.81

9851 VERZ÷SERT AUSF‹HRUNG UM 2,5 SEKUNDEN

9852 REM (SCRATCH-P20)

9860 P20=PEEK(20)+150:IF P20>255 THEN P20=P20-256

9865 IF PEEK(20)<>P20 THEN 9865

9870 RETURN

 

BEISPIEL-PROGRAMM

 

10 REM *FILEEX* WBB 31.3.8l

100 REM BEISPIEL DER ROUTINEN F‹R DEN FREIEN ZUGRIFF

101 REM DIESES PROGRAMM VERARBEITET DIE DATEI

102 REM D2:AREACODE.DAT.

103 REM SIE SOLLTE DURCH BENUTZUNG VON *FILE0001*

104 REM BEREITS INITIALISIERT WORDEN SEIN.

105 SIE BESTEHT AUS 24 BYTE-SƒTZEN: 1-3 BEREICH-CODE.

106 REM 4-24 POSITIONS-BESCHREIBUNG

107 REM

110 GRAPHIC 0

120 PRINT *¥FILEEX¥*:PRINT :PRINT *INITIALISIERUNG*

200 REM INITALISIERN DER VARIABLEN

210 DIM FILE$(15),ACODE$(3),LOC$(21),YN$(1)

220 CHANNEL=l

230 FILE$=*Dl:AREACODE.DAT*

300 REM DATEI ÷FFNEN

310 PRINT "÷FFNEN DER DATEI"

320 GOSUB 9300

400 REM BEGINN DER BENUTZER-EINGABE

410 PRINT

420 PRINT *(0=ENDE) BEREICHS-CODE ";:INPUT ACODE$:IF

 ACODE$=*0* THEN 900

500 REM AKTIVE SƒTZE F‹R PASSENDEN BEREICHS-CODE SUCHEN

510 MATCH=0

520 FOR RECORD=1 TO FILEMAX

530 GOSUB 9600

540 IF STS=1 THEN GOSUB 5000

550 NEXT RECORD

560 IF MATCH=l THEN 400

600 REM NICHTS GEFUNDEN, GESTATTE ANF‹GUNG

510 PRINT *KEINE ‹BEREINSTIMMUNG IN DER DATEI GEFUNDEN!*

620 PRINT *WOLLEN SIE ANF‹GEN (J/N) ";:INPUT YN$

630 IF YN$<>*J* THEN 400

700 REM ANF‹GUNG ERW‹NSCHT

710 GOSUB 9400

720 IF RECORD=0 THEN PRINT "DATEI IST VOLLSTƒNDIG BELEGT,

 SATZ WIRD NICHT ANGEF‹GT!*:GOTO 400

730 PRINT *STELLE: *;:INPUT LOC

740 FILEREC$=ACODE$

750 FILEREC$(4)=LOC$

800 REM DATEI-ERNEUERUNG AUSF‹HREN

810 GOSUB 9600

820 PRINT #CHANNEL;FILEREC$

830 GOSUB 9500

840 GOTO 400

900 REM L÷SCHUNGEN GESTATTET

910 PRINT

920 PRINT *WOLLEN SIE L÷SCHEN (J/N) ";:INPUT YN$

930 IF YN$<>*J* THEN 1200

1000 REM FESTLEGEN, WELCHES ZU LöSCHEN IST

1010 PRINT

1020 PRINT *(0=ENDE) BEREICHS-CODE ";:INPUT ACODE$:IF ACODE$*0* THEN 1200

1100 REM SUCHE AKTIVE SƒTZE FUR PASSENDEN BEREICHS-CODE

1110 FOR RECORD=1 TO FILEMAX

1120 GOSUB 9600

1120 IF STS=l THEN GOSUB 5100

1125 NEXT RECORD

1130 GOSUB 9500

1140 GOTO 1000

1200 REM GIB DATEI AUF BILDSCHIRM AUS

1210 PRINT :PRINT *CODE*,*STELLE":PRINT

1220 FOR RECORD=l TO FILEMAX

1230 GOSUB 9600

1240 IF STS=l THEN GOSUB 5200

1250 NEXT RECORD

1300 REM GESTATTE HARDCOPY

1310 PRINT :PRINT *WOLLEN SIE EINE GEDRUCKTE LISTE (J/N)*;:INPUT YN$

1320 IF YN$<>*J* THEN 4900

1330 LPRINT *CODE*,*STELLE*:PRINT

1340 FOR RECORD=1 TO FILEMAX

1350 GOSUB 9600

1360 IF STS=l THEN GOSUB 5300

1370 NEXT RECORD

1380 GOTO 4900

4900 REM ENDE

4910 CLOSE #CHANNEL

4920 PRINT *ENDE DER AUSF‹HRUNG*

4930 REM

5000 REM VERARBEITE AKTIVEN SATZ/ANZEIGE

5010 INPUT #CHANNEL,FILEREC$

5020 IF FILEREC$(1,3)<>ACODE$ THEN RETURN

5030 MATCH=l

5040 PRINT *STELLE: *;FILEREC$(4)

5050 RETURN

5100 REM VERARBEITE AKTIVEN SATZ/L÷SCHEN

5110 INPUT #CHANNEL,FILEREC$

5120 IF FILEREC$(1,3)<>ACODE$ THEN RETURN

5130 GOSUB 9450

5150 PRINT *GEL÷SCHT ";FILEREC$(4)

5160 RETURN

5200 REM VERARBEITE AKTIVEN SATZ/L÷SCHEN

5210 INPUT #CHANNEL,FILEREC$

5220 PRINT FILEREC$(1,3),FILEREC$(4)

5230 RETURN

5300 REM VERARBEITE AKTIVEN SATZ/LPRINT

5310 INPUT #CHANNEL,FILEREC$

5320 LPRINT FILEREC$(1,3),FILEREC$(4)

5330 RETURN

 

9300 REM *FILEOPEN.SUB* WBB 30.3.81

9305 REM ÷FFNE EINE DATEI IM MODUS 12 UND DEFINIERE ALLE

9307 REM VARIABLEN

9310 OPEN #CHANNEL,12,0,FILE$

9315 DIM FILEHED$(124)

9320 INPUT #CHANNEL,FILEHED$

9325 FILESEC=ASC(FILEHED$(1) 256+ASC(FILEHED$(2))

9330 FILEBYT=ASC(FILEHED$(3))

9335 FILESTS=ASC(FILEHED$(4))

9340 FILEMAX=ASC(FILEHED$(5)) 256+ASC(FILEHED$(6))

9345 FILELEN=ASC(FILEHED$(7)) 256+ASC(FILEHED$(8))

9350 DIM FILEPTR$(4+4 FILEMAX),FILEREC$(FILELEN)

9355 INPUT #CHANNEL,FILEPTR$

9360 RETURN

9400 REM *FILEADD.SUB* WBB 30.3.8l

9405 REM BESTIMME NƒCHSTEN VERF‹GBAREN SATZ

9410 RECORD=0

9415 IF FILEMAX=0 THEN RETURN

9420 FOR RECORD1=1 TO FILEMAX

9425 B=RECORD1 4+4

9430 IF FILEPTR$(B,B)=CHR$(0) THEN RECORD=RECORD1:RECORD1=

 FILEMAX:FILEPTR$(B,B)=CHR$(1)

9435 NEXT RECORD1

9440 RETURN

9450 REM *FILEDEL.SUB* WBB 30.3.81

9455 REM LöSCHE EINEN AKTIVEN SATZ

9460 B=RECORD 4+4

9465 FILEPTR$(B,B)=CHR$(0)

9470 RETURN

9500 REM *FILELPTR.SUB* WBB 19.3.91

9510 REM SCHREIBE FILEPTR

9515 S=ASC(FILEPTR$(1) 256+ASC(FILEPTR$(2))

9520 B=ASC(FILEPTR$(3))

9525 POINT #1,S,B,

9530 PRINT #l;FILEPTR$

9535 RETURN

9600 REM *FILEPOS.SUB* WBB 31.3.81

9605 REM DATEIZEIGER AUF SATZANFANG SETZEN

9610 S=ASC(FILEPTR$(RECORD 4+1)) 256+ASC(FILEPTRS

(RECORD 4+2))

9615 B=ASC(FILEPTR$(RECORD 4+3))

9620 STS=ASC(FILEPTR$(RECQRD 4+4))

9625 POINT #CHANNEL,S,B

9630 RETURN