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