C 64
Dateiorganisation

Dateiorganisation

Dieses Programm ist eine echte Hilfe für den C64-Benutzer, der sich einmal etwas näher mit der internen Dateiorganisation des 1541-Laufwerks beschäftigen möchte.

Die Idee zu diesem Programm kam mir, als ich nach einem »SCRATCH«-Befehl mit Bedauern feststellen mußte, ein in mühevoller Arbeit erstelltes Programm versehentlich mitgelöscht zu haben. Doch glücklicherweise hatte ich kurz zuvor erfahren, wie man ein gelöschtes File auf der 1541-Floppy regeneriert:

Filetyp im Directoryeintrag im Direktzugriff wieder setzen und anschließend ein »VALIDATE« ausführen.

Es begann also die Suche nach besagtem Byte, sowie die intensive Erkundung der Dateiorganisation und des Direktzugriffs.

Nun, nach mehreren Monaten Arbeit liegt endlich das fertige Programm vor. Es druckt eine Vielzahl von Floppy-Informationen auf einem Epson-Drucker aus. Auf eine Bildschirmausgabe wurde aus Gründen der Übersichtlichkeit verzichtet.

Was bietet das Programm

Ganze Dateien aufzeigen:

Hierbei fragt das Programm nach dem gewünschten Filenamen. Bei korrekter Eingabe werden folgende Informationen ausgedruckt: Filename, Filetyp, Filelänge in Blocks, Spur, Sektor, laufende Blocknummer und natürlich der Inhalt sämtlicher von dieser Datei belegten Blöcke in ASCII-Codes und -Zeichen (je 8 Byte). Eine Seite wird mit genau 2 Blocks beschrieben, dann erfolgt automatisch ein Seitenvorschub. Bei ungerader Blockanzahl kann ein Seitenvorschub auch vom Benutzer ausgelöst werden. Bei Dateiende springt das Programm wieder ins Menü zurück.

Einzelne Blöcke ausgeben:

Dieser Modus unterscheidet sich vom vorigen dadurch, daß hier bestimmte Sektoren ausgewählt werden können. Und dies auf zwei verschiedene Arten:

  1. Eingabe von Spur und Sektor:
    Geben Sie, durch Komma getrennt, Spur- und Sektornummer des auszudruckenden Blocks ein;
  2. Eingabe von Filename und Blocknummer: Das Programm liest aus der Directory, wieviele Blocks das angegebene File belegt und zeigt dies am Bildschirm an. Nun können Sie wählen, welchen dieser Blöcke Sie sehen möchten.
Bild 3. Menüpunkt 2 (Einzelne Blöcke) mit Eingabe Filename/Blocknummer

Bytereihen ausdrucken:

Mit diesem Menüpunkt können Sie gezielt bestimmte Bytes einer Datei oder eines Sektors herauspicken. Die Form der Eingabe von Parametern ist identisch mit der des Teilprogrammes »Einzelne Blöcke ausgeben«. Zusätzlich müssen Sie das erste und letzte auszudruckende Byte eines Sektors festlegen (0-255). Das erste Byte kann auch zugleich das letzte sein, was die Ausgabe nur eines Wertes bewirkt.

Bild 4. Bytereihen mit Eingabe Filename/Blocknummer
Absatz 1: erstes Byte: 149; letztes Byte: 182;
Absatz 2: erstes Byte: 192; letztes Byte: 205.

Blockbelegung von Files:

Von einer Datei belegte Sektoren werden ihrer Reihenfolge entsprechend, im Format: laufende Blocknummer, Spur/Sektor, ausgegeben. Auch eine Routine zur Berechnung der tatsächlichen Filelänge in Bytes ist in dieses Teilprogramm integriert. Das zweite Byte des letzten Blockes gibt die Anzahl der von der Datei in diesem Block benötigten Bytes an. Daraus ergibt sich folgende Formel für die Filelänge: (Gesamtzahl belegter Blocks — 1) * 254 + 2. Byte letzter Block.

Einschränkung für relative Dateien: Spur und Sektor von Side-Sektor-Blöcken werden nicht angezeigt. An ihrer Stelle erscheint das Kürzel »SSB«, so daß man wenigstens weiß, wieviel SSB das DOS zur Verwaltung der Datei benötigt.

Bild 5: Blockbelegung von Files. Die obere Spalte enthält die laufende Blocknummer, darunter sind Spur/Sektor angegeben.

Directory:

Dieser Befehl bringt Ihnen eine erweiterte und vor allem übersichtlichere Directory Ihrer Disketten zu Papier. Selbstverständlich ohne das Programm zu zerstören. Sie enthält Informationen über:

Bei relativen Dateien finden Sie im Anschluß an den Filetyp zwei zusätzliche Angaben:

Bild 1. Directoryausdruck

BAM (Block Available Map)

Das Format des Blockbelegungsplanes ist wie folgt festgelegt: Horizontal werden die einzelen Sektoren aufgetragen, vertikal die Spuren 1—35. Ein Stern kennzeichnet einen belegten Sektor, das Minuszeichen einen freien. Mit »/« markierte Sektoren sind nicht vorhanden, da die Anzahl der Sektoren je Spur zum Diskettenmittelpunkt hin abnimmt. Dem Wert rechts neben jeder Spur können Sie entnehmen, wieviele Blöcke auf dieser noch nicht belegt sind. Die Summe der freien Sektoren finden Sie ganz unten. Sollte einmal die Gesamtzahl der freien Blöcke nicht mit der Angabe in der Directory übereinstimmen, so ist mit der Diskette ein »VALIDATE« durchzuführen, um den korrekten Zustand wieder herzustellen.

Bild 2. Blockbelegungsplan einer Diskette

Benötigte Hardware

Erstellt und getestet wurde das Programm auf einem C 64 mit Floppy VC 1541 und Epson RX-80 (mit Data-Becker-Interface).

Eine Umsetzung auf andere Druckertypen dürfte keine großen Schwierigkeiten machen, da die meisten Steuerzeichen für Druckerfunktionen in den Zeilen 4220-4370 untergebracht sind. Weitere Steuerzeichen, welche vereinzelt im Programmtext vorkommen, sind durch die Form (c$="string":c3=Zahl:gosub4030) leicht zu erkennen. Durch diese Druckparameter werden vor allem Schriftart und Zeilenabstand gesteuert.

Ausnahme: Teilprogramm »Blockbelegung von Files«
Zeilen
1890—1900 : A(3) = 254
1930—1940
2020—2030 : A(3) = 255

In diesen Zeilen wird in den Grafikmodus des Druckers umgeschaltet und eine Punktmatrix (CHR$(254) oder CHR$(255) für die senkrechten Linien, CHR$(64) für die waagrechte Linie übermittelt.

Zu bemerken wäre noch, daß bei Verwendung des neuen Data-Becker-Interfaces die OPEN-Befehle in den Zeilen 710 und 7 6 0 geändert werden sollten:

710 OPEN 1,4,2: ...

760 OPEN 4,4,2: ...

Auch die Initialisierung des Druckers in den Zeilen 3960 bis 3990 muß entsprechend den Angaben im Handbuch abgeändert werden.

Mit diesen Hinweisen sollte die Anpassung an andere Drucker keine Schwierigkeit mehr darstellen.

Zum Schluß möchte ich noch auf ein Buch hinweisen, das mir erst die nötigen Grundlagen zu diesem Programm vermittelte: »Das große Floppy-Buch« von Data Becker. Eine wirklich ausgiebige und informative Quelle für alle jene, die sich intensiver mit der Floppy-Programmierung befassen wollen.

Ich denke, daß Sie das Programm nun sinnvoll einsetzen können, zumal es auch Routinen enthält, die man in andere Programme übernehmen kann.

(Johann Auer / ev)
Zeile(n) Bedeutung
10-100 Titelvorspann
170 Aufruf ’Initialisierung’
190 Aufruf ’Menü’
210 Sprungbefehl zu Teilprogrammen (Startadressen)
280-430 Initialisierung
460-770 Menü
710-750 Prüfen ob Drucker eingeschaltet
800-960 Ganzes File ausgeben (Teilprogramm)
990-1350 Einzelne Blöcke ausdr. (Teilprogramm)
1050-1080 Eingabewahl:
1) Spur/Sektor
2) Filename/Blocknr.
1380-1680 Bytereihen (Teilprogramm)
1440 Sprung zu Eingabewahl (Zeilen 1050-1080)
1710-2130 Blockbelegung von Files (Teilprogramm)
2050 Spur/Sektor des nächsten Datenblocks laden
2160-2870 Direktory aufzeigen (Teilprogramm)
2430-2650 8 mal 32 Zeichen eines Directoryeintrages lesen — Zerlegung dieses Strings
2 900-3430 BAM (Teilprogramm)
3150-3220 4 Bytes für je eine Spur lesen und in Binärstring umwandeln
3390-3430 Anzahl Sektoren pro Spur berechnen
3460-3490 Ende (Teilprogramm)
Tabelle 1. Programmbeschreibung
3520-3760 File vorhanden (Directory durchsuchen)
3780-3790 Floppy initialisieren
3810-3850 Sektor in Pufferspeicher laden — Pufferzeiger setzen
3870-3910 2 Bytes aus Pufferspeicher holen
3930-3940 Floppykanäle schließen
3960-3990 Drucker initialisieren
3980 Drucker auf halbe Geschwindigkeit stellen (kann weggelassen werden)
4010-4030 Parameterisierte Schriftenübermittlung zum Drucker
4050-4200 Kopfzeilen für Menüpunkte 1—4 drucken
4220-4370 Verschiedene Druckparameter für Schriftart
4390-4630 Bytenummer, Bytes und ASCII-Zeichen für Teilprogramme 1—3 drucken
4490-4560 8 Zeichen aus Pufferspeicher holen und umwandeln
4650-4750 Basic-Token der Operatoren in Zeichen umwandeln und String aufaddieren
4770-4830 Filename eingeben
4840-4890 Hinweis, wenn File nicht vorhanden
4910-4950 Für Teilprogramm 1 prüfen, ob bereits 2 Sektoren pro Seite gedruckt sind
4970-5040 Eingabe Blocknummer für Teilprogramm 2 und 3, Laden dieses Blocks
5060-5090 Abfrage Seitenvorschub
5110-5160 Tastaturabfrage auf J/N
5180-5210 F1 - Funktionstastenabfrage
5230-5260 Aufforderung gewünschte Diskette einzulegen
5280-5300 F1 - Fertig - Abfrage
5320-5410 Diskettenname und ID lesen
Tabelle 2. Unterprogramme
Name Bedeutung
NU$ String mit 8 Nullen und 8 Punkten
A Teilprogrammnummer
FT$(I) Filetypen
BN aktuelle Blocknummer
AN Anfangswert für Laufvariable in UP »Bytes ausdrucken
EN Endwert für Laufvariable in UP »Bytes ausdrucken«
BP Block Pointer (Zeiger im Pufferspeicher)
SP Spur
SE Sektor
S1/S2 ASC-Codes aus UP »2 Bytes holen«
MSE Maximale Anzahl Sektoren pro Spur
EB Erstes zu druckendes Byte in Teilprogramm »Bytereihen«
LB Letztes zu druckendes Byte in Teilprogramm »Bytereihen«
RE Anzahl Blöcke pro Zeile bei Teilprogramm 4
AR Anzahl der Reihen in Teilprogramm 4
FL Filelänge in Blocks
DN$ enthält den Diskettennamen
ID$ ID der Diskette
FB freie BLöcke
ET$ ein kompletter Directoryeintrag
EN$ Eintragsnummer
FT$ Filetyp (String)
FT Filetyp (Zahi) Tabelle 3.
F$ Filename Die wichtigsten
LA$ Filelänge in Blocks Variablen
BY$ Filelänge in Bytes
RL$ Recordlänge
GF Gesamtzahl freier Blöcke der Diskette
L$ Bitmuster der belegten Sektoren einer Spur (0 = Sektor belegt, 1 = frei)
P$ aus Directory gelesener Filename in UP »File vorhanden«
FL$ enthält Filelänge in Blocks für UP »Kopf drucken«
I1$ 8 Bytes für UP »Bytes ausdrucken«
B$ ASCII-Zeichen der 8 Bytes
AB Anzahl Blocks pro Seite
Tabelle 3. Die wichtigsten Variablen
10 rem   ****************************
20 rem   ****************************
30 rem   **                        **
40 rem   ** johann auer            **
50 rem   ** hermann-hiller-str. 54 **
60 rem   ** 8263 burghausen        **
70 rem   **                        **
80 rem   ****************************
90 rem   ****************************
100 :
110 :
120 :
130 rem *******************************
140 rem *******file-organisation*******
150 rem *******************************
160 :
170 gosub280:rem ***initialisierung****
180 :
190 gosub460:rem ********menue*********
200 :
210 onagoto800,990,1380,1710,2160,2900,3460
220 :
230 rem *******************************
240 rem *******file-organisation*******
250 rem *******************************
260 :
270 :
280 rem ********initialisierung********
290 :
300 dimft$(3):dima$(7):a$(6)="{rght}{rvon}{CBM-K}{down}{left}{CBM-K}{rvof} {yel}":a$(7)="{rvof} {blk}{CBM-K}{left}{up}{CBM-K}{down}"
310 rf=53280:hf=rf+1:a$="":nu$="00000000.......":eb=-1:n3=0:restore
320 di$="d"+chr$(105)+chr$(115)+chr$(107)+chr$(101)+chr$(116)+chr$(116)
330 di$=di$+chr$(101)+chr$(110)+chr$(110)+chr$(97)+chr$(109)++chr$(101)+":"
340 fori=1to40:readq:a$=a$+chr$(q):next
350 a$(0)=left$(a$,9):a$(1)=mid$(a$,10,4):a$(2)=mid$(a$,14,10)
360 a$(3)=mid$(a$,24,5):a$(4)=mid$(a$,29,7):a$(5)=right$(a$,5)
370 data70,105,108,101,110,97,109,101,58,84,121,112,58,70,105
380 data108,101,108,123,110,103,101,58,83,112,117,114,58,83,101
390 data107,116,111,114,58,66,121,116,101,58
400 ft$(0)="rel":ft$(1)="usr":ft$(2)="prg":ft$(3)="seq"
410 lz$="--- --- --- --- --- --- ---          "
420 printchr$(8);:poke788,52
430 return
440 :
450 :
460 rem *************menue*************
470 :
480 pokerf,0:pokehf,11:printchr$(14)"{clr}{down}"tab(11);
490 print"{cyn}FILE-ORGANISATION":printtab(11)"{blk}{CBM-U}{CBM-U}{CBM-U}{CBM-U}{CBM-U}{CBM-U}{CBM-U}{CBM-U}{CBM-U}{CBM-U}{CBM-U}{CBM-U}{CBM-U}{CBM-U}{CBM-U}{CBM-U}{CBM-U}"
500 print"{rght}{CBM-D}{CBM-I}{CBM-I}{CBM-I}{CBM-I}{CBM-I}{CBM-I}{CBM-I}{CBM-I}{CBM-I}{CBM-I}{CBM-I}{CBM-I}{CBM-I}{CBM-I}{CBM-I}{CBM-I}{CBM-I}{CBM-I}{CBM-I}{CBM-I}{CBM-I}{CBM-I}{CBM-I}{CBM-I}{CBM-I}{CBM-I}{CBM-I}{CBM-I}{CBM-I}{CBM-I}{CBM-I}{CBM-I}{CBM-I}{CBM-I}{CBM-I}{CBM-I}{CBM-F}"
510 printa$(6)"Ganzes File {blk}.................... {yel}{rvon}1"a$(7)
520 printa$(6)"Einzelne Bloecke {blk}............... {yel}{rvon}2"a$(7)
530 printa$(6)"Bytereihen {blk}..................... {yel}{rvon}3"a$(7)
540 printa$(6)"Blockbelegung von Files {blk}........ {yel}{rvon}4"a$(7)
550 printa$(6)"Direktory {blk}...................... {yel}{rvon}5"a$(7)
560 printa$(6)"BAM {blk}............................ {yel}{rvon}6"a$(7)
570 printa$(6)"ENDE {blk}........................... {yel}{rvon}7"a$(7)
580 print"{rght}{rvon}{CBM-K}{down}{left}{rvof}{CBM-C}{rvon}{CBM-I}{CBM-I}{CBM-I}{CBM-I}{CBM-I}{CBM-I}{CBM-I}{CBM-I}{CBM-I}{CBM-I}{CBM-I}{CBM-I}{CBM-I}{CBM-I}{CBM-I}{CBM-I}{CBM-I}{CBM-I}{CBM-I}{CBM-I}{CBM-I}{CBM-I}{CBM-I}{CBM-I}{CBM-I}{CBM-I}{CBM-I}{CBM-I}{CBM-I}{CBM-I}{CBM-I}{CBM-I}{CBM-I}{CBM-I}{CBM-I}{CBM-I}{rvof}{CBM-V}{up}{left}{CBM-K}{down}"
590 print"{down}   {cyn}Ihre Wahl?{yel} ";
600 getei$:ifei$<>""then620
610 print" {left}";:fort=1to150:next:print"{CBM-P}{left}";:fort=1to150:next:goto600
620 a=val(ei$)::ifa<1ora>7then600
630 printei$:fort=1to1000:next
640 ifa=7orsp>0thenreturn
650 print"{up}   {yel}Ausgabe auf {blk}EPSON{yel}-Drucker {blk}RX-80{yel}"
660 print"   mit {blk}DATA-BECKER{yel} Interface!":fort=1to2500:next
670 print"{up}{up}   {blk}Drucker einschalten und Papier    "
680 print"   positionieren!!!            "
690 print"   {yel}Fertig {blk}.................... {yel}{rvon}F1"
700 gosub5180
710 open1,4,1:poke768,61
720 print#1,chr$(7);:close1
730 poke768,139
740 ifst<>-128then760
750 goto700
760 open4,4,1:gosub3960
770 return
780 :
790 :
800 rem**********ganzes file***********
810 :
820 print"{clr}{down}           {blk}{CBM-O}{CBM-O}{CBM-O}{CBM-O}{CBM-O}{CBM-O}{CBM-O}{CBM-O}{CBM-O}{CBM-O}{CBM-O}{CBM-O}{CBM-O}{CBM-O}{CBM-O}{CBM-O}{CBM-O}"
830 print"           >>>{wht}Ganzes File{blk}<<<"
840 print"           {CBM-U}{CBM-U}{CBM-U}{CBM-U}{CBM-U}{CBM-U}{CBM-U}{CBM-U}{CBM-U}{CBM-U}{CBM-U}{CBM-U}{CBM-U}{CBM-U}{CBM-U}{CBM-U}{CBM-U}"
850 gosub5230
860 ab=0:n=0:bn=1:goto4770
870 gosub4050
880 an=0:en=255
890 bp=0:gosub3830:gosub3870
900 ifs1=0thenn=1:en=s2
910 gosub4390:print#4:print#4:gosub4910
920 ifn=1thenn=0:goto940
930 sp=s1:se=s2:bn=bn+1:gosub4100:goto890
940 gosub3930:print#4:print#4
950 ifab=1thengosub5060
960 bn=0:goto190
970 :
980 :
990 rem********einzelne bloecke********
1000 :
1010 print"{clr}         {blk}{CBM-O}{CBM-O}{CBM-O}{CBM-O}{CBM-O}{CBM-O}{CBM-O}{CBM-O}{CBM-O}{CBM-O}{CBM-O}{CBM-O}{CBM-O}{CBM-O}{CBM-O}{CBM-O}{CBM-O}{CBM-O}{CBM-O}{CBM-O}{CBM-O}{CBM-O}"
1020 print"         >>>{wht}Einzelne Bloecke{blk}<<<"        "
1030 print"         {CBM-U}{CBM-U}{CBM-U}{CBM-U}{CBM-U}{CBM-U}{CBM-U}{CBM-U}{CBM-U}{CBM-U}{CBM-U}{CBM-U}{CBM-U}{CBM-U}{CBM-U}{CBM-U}{CBM-U}{CBM-U}{CBM-U}{CBM-U}{CBM-U}{CBM-U}"
1040 gosub5230
1050 print"{down} {blk}EINGABE:":print"{down} {cyn}Spur/Sektor {blk}........... {cyn}1"
1060 print" Filename/Blocknr. {blk}..... {cyn}2"
1070 input"{down} {blk}>>> {yel}";e$
1080 e=int(val(e$)):ife<1ore>2then1100
1090 onegoto1110,1190
1100 print"{up}{rght}{rght}{rght}{rght}{rght}{rght}          {up}{up}":goto1070
1110 input"{down} {blk}Spur/Sektor: {yel}";sp$,se$
1120 sp=int(val(sp$)):se=int(val(se$)):i=sp:gosub3390
1130 if(sp=>1andsp<=35)and(se=>0andse<=mse)then1160
1140 print"{up}";:fort=1to38:print" ";:fort1=1to5:nextt1:nextt
1150 print"{up}{up}":goto1110
1160 gosub3780:bp=0:gosub3810:bn=0
1170 ifa=3then1460
1180 n2=1:goto1220
1190 n2=0:goto4770
1200 goto4970
1210 sp=s1:se=s2
1220 gosub3830:gosub3870:an=0:en=255:ifs1=0thenen=s2
1230 ifn2=1thengosub4100:goto1250
1240 gosub4050
1250 n2=0:gosub4390:print#4:print#4:print#4
1260 gosub5060
1270 print"{down} {blk}Weiterer Block   {yel}J/N?";:gosub5110
1280 ifa$="j"then1300
1290 gosub3930:bn=0:goto190
1300 ife=1then1330
1310 print"{down} {blk}Gleiches File    {yel}J/N?";:gosub5110
1320 ifa$="j"then1340
1330 n2=0:gosub3930:goto990
1340 n2=1:s1=e1:s2=e2
1350 print"{clr}{down}{down}";:goto1200
1360 :
1370 :
1380 rem***********bytereihen**********
1390 :
1400 print"{clr}            {blk}{CBM-O}{CBM-O}{CBM-O}{CBM-O}{CBM-O}{CBM-O}{CBM-O}{CBM-O}{CBM-O}{CBM-O}{CBM-O}{CBM-O}{CBM-O}{CBM-O}{CBM-O}{CBM-O}"
1410 print"            >>>{wht}Bytereihen{blk}<<<"
1420 print"            {CBM-U}{CBM-U}{CBM-U}{CBM-U}{CBM-U}{CBM-U}{CBM-U}{CBM-U}{CBM-U}{CBM-U}{CBM-U}{CBM-U}{CBM-U}{CBM-U}{CBM-U}{CBM-U}"
1430 gosub5230
1440 n3=0:goto1050
1450 sp=s1:se=s2:gosub3830
1460 input"{down}{rght}{blk}Erstes Byte:  {yel}";eb
1470 ifeb<0oreb>255thengosub1510:goto1460
1480 input"{down}{rght}{blk}Letztes Byte: {yel}";lb
1490 iflb<0orlb>255orlb<ebthengosub1510:goto1480
1500 goto1520
1510 print"{up}";tab(14);"          {up}{up}":return
1520 ifn3<>0thengoto1670
1530 ife=1thengosub4100:goto1550
1540 gosub4050
1550 an=eb:en=lb:gosub4390
1560 print"{clr}{down}";:gosub5060
1570 print"{down}{rght}{blk}Weitere Reihe    {yel}J/N?";:gosub5110
1580 ifa$="j"then1600
1590 gosub3930:print#4:print#4:print#4:eb=-1:n3=0:goto190
1600 print"{down}{rght}{blk}Gleicher Block   {yel}J/N?";:gosub5110
1610 ifa$="j"thenn3=1:print"{down}";:goto1460
1620 print#4:print#4
1630 ife=1then1660
1640 print"{down}{rght}{blk}Gleiches File    {yel}J/N?";:gosub5110
1650 ifa$="j"thenn3=2:s1=e1:s2=e2:print"{down}";:goto4970
1660 gosub3930:print#4:goto1380
1670 ifn3=1then1550
1680 gosub4100:goto1550
1690 :
1700 :
1710 rem*********blockbelegung*********
1720 :
1730 print"{clr}          {blk}{CBM-O}{CBM-O}{CBM-O}{CBM-O}{CBM-O}{CBM-O}{CBM-O}{CBM-O}{CBM-O}{CBM-O}{CBM-O}{CBM-O}{CBM-O}{CBM-O}{CBM-O}{CBM-O}{CBM-O}{CBM-O}{CBM-O}"
1740 print"          >>>{wht}Blockbelegung{blk}<<<"
1750 print"          {CBM-U}{CBM-U}{CBM-U}{CBM-U}{CBM-U}{CBM-U}{CBM-U}{CBM-U}{CBM-U}{CBM-U}{CBM-U}{CBM-U}{CBM-U}{CBM-U}{CBM-U}{CBM-U}{CBM-U}{CBM-U}{CBM-U}"
1760 gosub5230:goto4770
1770 print"{down}{down}{rght}FORMAT:  {wht}Blocknummer":print" {blk}{CBM-Y}{CBM-Y}{CBM-Y}{CBM-Y}{CBM-Y}{CBM-Y}   {SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}"
1780 print"          {wht}Spur/Sektor"
1790 gosub4050:print#4:re=10:rd=295:x1=39:x2=1
1800 ar=int(fl/10+0.95):gosub4300
1810 fori=1toar:print#4,"      ";
1820 iffl/10=int(fl/10)then1840
1830 ifi=arthengosub2120
1840 j=0
1850 j=j+1:su=(i-1)*10+j:bn$=str$(su)
1860 l3=len(bn$)-1:bn$=" "+left$(nu$,3-l3)+right$(bn$,l3)+" "
1870 print#4,bn$;
1880 ifj+0.5=>rethen1920
1890 print#4,chr$(27);"k";chr$(5);chr$(0);:a(3)=254
1900 forij=1to5:print#4,chr$(a(ij));:nextij
1910 goto1850
1920 c$="3":c3=20:gosub4030:print#4
1930 print#4,"      ";:print#4,chr$(27);"k";chr$(x1);chr$(x2);
1940 forij=1tord:print#4,chr$(64);:nextij:c3=8:gosub4030:print#4
1950 c3=40:gosub4030:print#4,"      ";
1960 j=0:ss=0
1970 j=j+1:sp$=str$(s1):se$=str$(s2):ifs1=0thenss$=" ssb ":ss=ss+1:goto2000
1980 l4=len(sp$)-1:l5=len(se$)-1
1990 ss$=left$(nu$,2-l4)+right$(sp$,l4)+"/"+left$(nu$,2-l5)+right$(se$,l5)
2000 print#4,ss$;
2010 ifj+0.5=>rethen2040
2020 print#4,chr$(27);"k";chr$(5);chr$(0);:a(3)=255
2030 forij=1to5:print#4,chr$(a(ij));:nextij:ifs1=0then1970
2040 ifs1=0then2060
2050 sp=s1:se=s2:bp=0:gosub3830:gosub3870:ifj<rethen1970
2060 print#4:nexti:print#4:gosub4320:gosub3930
2070 gosub4220:print#4,"gesamtl"chr$(91)"nge:";:gosub4270
2080 print#4,(fl-1-ss)*254+s2"bytes":print#4:print#4:print#4:print#4
2090 print"{down}";:gosub5060:print"{down}{rght}{blk}Weiteres File    {yel}J/N?";:gosub5110
2100 ifa$="j"then1710
2110 goto190
2120 re=10*(fl/10-int(fl/10)):rd=int(re*29.5+0.5)
2130 x1=rd-int(rd/256)*256:x2=int(rd/256):return
2140 :
2150 :
2160 rem***********direktory***********
2170 :
2180 print"{clr}            {blk}{CBM-O}{CBM-O}{CBM-O}{CBM-O}{CBM-O}{CBM-O}{CBM-O}{CBM-O}{CBM-O}{CBM-O}{CBM-O}{CBM-O}{CBM-O}{CBM-O}{CBM-O}"
2190 print"            >>>{wht}Direktory{blk}<<<"
2200 print"            {CBM-U}{CBM-U}{CBM-U}{CBM-U}{CBM-U}{CBM-U}{CBM-U}{CBM-U}{CBM-U}{CBM-U}{CBM-U}{CBM-U}{CBM-U}{CBM-U}{CBM-U}":gosub5230:gosub5280
2210 print"{down} {blk}ABKUERZUNGEN:":print" {yel}BL.   {blk}- {cyn}Filelaenge in Bloecken;"
2220 print" {yel}BYTES {blk}- {cyn}ungefaehre Filelaenge in                Bytes ";
2230 print"(BL*254);":print" {yel}1.DB. {blk}- {cyn}1. Datenblock des Files;"
2240 print" {yel}TYP   {blk}- {cyn}Filetyp.":print"{down} {blk}Nur bei relativen Dateien:"
2250 print" {yel}1.SSB {blk}- {cyn}1.Side-Sektor-Block;"
2260 print" {yel}Rl    {blk}- {cyn}Recordlaenge."
2270 gosub3780:print#4,"     ";
2280 gosub4240:c$="w":c3=1:gosub4030
2290 print#4,"direktory":print#4:c3=0:gosub4030:gosub4270
2300 gosub4300:print#4,"      gn  aufz.-dichte     dos   ";
2310 print#4,"anzahl bl"chr$(92)"cke   spur  sekt."
2320 print#4,"      08  256 bytes/sekt.  v2.6  683 (664 frei)  0018  01-18"
2330 print#4
2340 gosub5320:gosub3930:gosub4320
2350 print#4,"     ";:gosub4240:print#4,di$;:gosub4270:print#4,dn$;
2360 gosub4240:print#4,"id:";:gosub4270
2370 print#4,id$:print#4
2380 print#4,"     nr.  filename          bl.  bytes";
2390 print#4,"  1.db.   typ":gosub4340:print#4,"     ";
2400 fori=1to46:print#4,"-";:nexti:print#4
2410 et$="":i=0:fb=0:sp=18:se=1:bp=0:gosub3810
2420 gosub3870:bp=2:gosub3840
2430 forj=1to8:i=i+1
2440 forj1=1to32:get#3,a$:ifa$=""thena$=chr$(0)
2450 et$=et$+a$:nextj1:et$=left$(et$,30)
2460 ft=asc(left$(et$,1)):f1=ft:ifft=0theni=i-1:goto2650
2470 en$=left$(nu$,4-len(str$(i)))+right$(str$(i),len(str$(i))-1)
2480 ifft<128thenof$="*"
2490 of$=" "
2500 ft=(f1or128)and135:ft$=of$+ft$(132-ft)
2510 as=asc(mid$(et$,2,1)):sp$=left$(nu$,3-len(str$(as)))
2520 sp$=sp$+right$(str$(as),len(str$(as))-1)
2530 as=asc(mid$(et$,3,1)):se$=left$(nu$,3-len(str$(as)))
2540 se$=se$+right$(str$(as),len(str$(as))-1)
2550 db$=sp$+"/"+se$
2560 f$=mid$(et$,4,16)
2570 as=asc(right$(et$,1))*256+asc(mid$(et$,29,1)):fb=fb+as
2580 la$=left$(nu$,4-len(str$(as)))+right$(str$(as),len(str$(as))-1)
2590 as=(as*256)-(as*2)-127
2600 by$=left$(nu$,6-len(str$(as)))+right$(str$(as),len(str$(as))-1)
2610 print#4,"     "en$"  "f$"  "la$;
2620 print#4,"  "by$"  "db$"  "ft$;
2630 ifright$(ft$,3)="rel"thengosub2780
2640 print#4
2650 et$="":nextj
2660 ifs1=0then2680
2670 sp=s1:se=s2:bp=0:gosub3830:goto2420
2680 fb=664-fb:gosub4360
2690 print#4:gosub4300:print#4,"      ";
2700 print#4,"freie bl"chr$(92)"cke:"fb"  in bytes:"(fb*254);
2710 print#4,"  freie eintr"chr$(91)"ge:"144-i:print#4:print#4:print#4:print#4
2720 gosub4320:gosub3930
2730 gosub5060
2740 print"{down}{rght}{blk}Weitere Diskette {yel}J/N?";
2750 gosub5110
2760 ifa$="j"then2160
2770 goto190
2780 as=asc(mid$(et$,20,1)):sp$=left$(nu$,3-len(str$(as)))
2790 sp$=sp$+right$(str$(as),len(str$(as))-1)
2800 as=asc(mid$(et$,21,1)):se$=left$(nu$,3-len(str$(as)))
2810 se$=se$+right$(str$(as),len(str$(as))-1)
2820 db$=" "+sp$+"/"+se$
2830 as=asc(mid$(et$,22,1)):rl$=left$(nu$,4-len(str$(as)))
2840 rl$=" "+rl$+right$(str$(as),len(str$(as))-1)
2850 gosub4300:print#4,"   1.ssb:";:gosub4320:print#4,db$;
2860 gosub4300:print#4,"   r"chr$(108)":";:gosub4320:print#4,rl$;
2870 return
2880 :
2890 :
2900 rem**************bam**************
2910 :
2920 print"{clr}              {blk}{CBM-O}{CBM-O}{CBM-O}{CBM-O}{CBM-O}{CBM-O}{CBM-O}{CBM-O}{CBM-O}{CBM-O}{CBM-O}"
2930 print"              >>>{wht}B A M{blk}<<<":print"              {CBM-U}{CBM-U}{CBM-U}{CBM-U}{CBM-U}{CBM-U}{CBM-U}{CBM-U}{CBM-U}{CBM-U}{CBM-U}"
2940 print"         {yel}({blk}B{yel}lock {blk}A{yel}vailable {blk}M{yel}ap)"
2950 print"{down}{down} {blk}FORMAT: {cyn}horizontal {blk}- {cyn}Sektoren"
2960 print"         vertikal   {blk}- {cyn}Spuren"
2970 print"{down}{rght}{blk}ZEICHENBEDEUTUNG: {cyn}'*'{blk}={cyn}Block belegt;"
2980 printtab(19)"{cyn}'-'{blk}={cyn}Block frei;"
2990 printtab(19)"{cyn}'/'{blk}={cyn}Block nicht vor-":printtab(23)"handen."
3000 gosub5230:gosub5280
3010 t1$="":l$="":gosub3780:gosub5320:print#4,"     ";
3020 gosub4240:c$="w":c3=1:gosub4030
3030 print#4,"blockbelegungsplan":print#4:c3=0:gosub4030:gosub4270
3040 c$="3":c3=24:gosub4030:print#4,"     ";:gosub4240:print#4,di$;
3050 gosub4270:print#4,dn$;:gosub4240:print#4,"id:";:gosub4270
3060 print#4,id$
3070 print#4:print#4,"     s"chr$(101)chr$(107)chr$(116)chr$(111)chr$(114);
3080 print#4,"                 1 1 1 1 1 1 1 1 1 1 2   freie"
3090 print#4,"     "chr$(112)"  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0   ";
3100 print#4,"bl"chr$(92)"cke":print#4,"     "chr$(117)
3110 gf=0:bp=4:gosub3840
3120 fori=1to35:ifi=1then3380
3130 gosub3390:ifi<10thenprint#4,"     "i;:goto3150
3140 print#4,"    "i;
3150 forj=1to4:get#3,a$:ifa$=""thena$=chr$(0)
3160 ac=asc(a$):ifj=1thenfb=ac:gf=gf+fb:goto3210
3170 t1=2*(ac/2-int(ac/2)):t1$=right$(str$(t1),1)
3180 l$=l$+t1$:ac=int(ac/2):ifac=0then3200
3190 goto3170
3200 l$=l$+left$(nu$,8-(len(l$)-(j-2)*8)):goto3220
3210 ifi=18thengf=gf-fb
3220 nextj
3230 forj=1to21:ifj<=msethen3250
3240 print#4,"/ ";:goto3270
3250 ifmid$(l$,j,1)="0"thenprint#4,"* ";:goto3270
3260 print#4,"- ";
3270 nextj:iffb<10thenprint#4,"  0"right$(str$(fb),1):goto3290
3280 print#4," "fb
3290 l$="":nexti
3300 fori=1to51:print#4," ";:nexti:ifgf>99thenprint#4,"---":goto3320
3310 print#4," --"
3320 fori=1to54-len(str$(gf)):print#4," ";:nexti:print#4,gf:gf=0
3330 gosub4360:print#4:print#4:print#4
3340 gosub3930:gosub5060
3350 print"{down}{rght}{blk}Weitere Diskette {yel}J/N?";:gosub5110
3360 ifa$="j"then2900
3370 goto190
3380 mse=21:print#4,"     "chr$(114)"1 ";:goto3150
3390 ifi=>1andi<=17thenmse=21:goto3430
3400 ifi=>18andi<=24thenmse=19:goto3430
3410 ifi=>25andi<=30thenmse=18:goto3430
3420 ifi=>31andi<=35thenmse=17
3430 return
3440 :
3450 :
3460 rem*************ende**************
3470 :
3480 print"{clr}{grn}"chr$(9);:close4:pokehf,0
3490 poke788,49:clr:goto5430
3500 :
3510 :
3520 rem*******up file vorhanden*******
3530 sp=18:se=1:bp=0:p$=""
3540 gosub3780
3550 gosub3810:gosub3870
3560 bp=2:gosub3840
3570 get#3,a$:ifa$=""thena$=chr$(0)
3580 ifasc(a$)=0then3660
3590 get#3,a$,a$
3600 fori=1to16
3610 get#3,a$:ifa$=""thena$=chr$(0)
3620 ifa$=chr$(160)then3640
3630 p$=p$+a$:next
3640 print"{up}{rght}{rght}{rght}{rght}{rght}{rght}{rght}{rght}{rght}{rght}{rght}                  ":print"{up}{rght}{rght}{rght}{rght}{rght}{rght}{rght}{rght}{rght}{rght}{rght}"p$
3650 iff$=p$thenp$="":goto3700
3660 bp=bp+32:ifbp>226thenp$="":goto3680
3670 gosub3840:p$="":goto3570
3680 ifs1=0thengosub3930:goto4840
3690 gosub3930:sp=s1:se=s2:bp=0:goto3550
3700 bp=bp+1:gosub3840
3710 gosub3870:sp=s1:se=s2
3720 bp=bp-1:gosub3840:gosub3870:ft=(s1or128)and135
3730 ft$=ft$(132-ft)
3740 bp=bp+28:gosub3840:gosub3870:fl=s1+256*s2
3750 fl$="ca."+str$(fl)+" blocks":s1=sp:s2=se
3760 return
3770 :
3780 rem*****floppy initialisieren*****
3790 open1,8,15,"i":close1:return
3800 :
3810 rem************b-r/b-p************
3820 open2,8,15:open3,8,2,"#"
3830 print#2,"u1 2 0 ";sp;se
3840 print#2,"b-p 2 ";bp
3850 return
3860 :
3870 rem*********2 bytes holen*********
3880 get#3,a1$,a2$:ifa1$=""thena1$=chr$(0)
3890 ifa2$=""thena2$=chr$(0)
3900 s1=asc(a1$):s2=asc(a2$):nd=s1*s2
3910 return
3920 :
3930 rem******kanaele schliessen*******
3940 close3:close2:return
3950 :
3960 rem****drucker initialisieren*****
3970 print#4,chr$(27);chr$(64);
3980 print#4,chr$(27);chr$(115);chr$(1);
3990 return
4000 :
4010 rem*******schriftart senden*******
4020 print#4,chr$(c1);chr$(c2);chr$(c3);:return
4030 print#4,chr$(27);c$;chr$(c3);:return
4040 :
4050 rem*********kopf drucken**********
4060 gosub4220:print#4,a$(0);:gosub4270:print#4,"   ";f$
4070 gosub4220:print#4,a$(1);:gosub4270:print#4,"        ";ft$
4080 gosub4220:print#4,a$(2);:gosub4270:print#4,"  ";fl$
4090 ifa=4then4190
4100 gosub4220:print#4,a$(3);:gosub4270:print#4,sp;
4110 ifsp<10thenprint#4," ";
4120 print#4,"   ";:gosub4240:print#4,a$(4);:gosub4270:print#4,se;
4130 ifbn>0thenprint#4,"   ";:goto4150
4140 print#4," ":goto4180
4150 ifse<10thenprint#4," ";
4160 gosub4240:print#4,"b"chr$(108)chr$(111)chr$(99)chr$(107)":";
4170 gosub4270:print#4,bn
4180 gosub4250:print#4:print#4,"     ";a$(5)
4190 gosub4280
4200 return
4210 :
4220 rem*****schriftart auswaehlen*****
4230 print#4,"     ";
4240 c$="-":c3=1:gosub4030
4250 c$="e":c3=0:gosub4030
4260 return
4270 c$="-":gosub4030
4280 c$="f":gosub4030
4290 return
4300 c$="m":c3=0:gosub4030
4310 return
4320 c$="p":c3=0:gosub4030
4330 return
4340 c$="0":c3=0:gosub4030
4350 return
4360 c$="2":c3=0:gosub4030
4370 return
4380 :
4390 rem*******bytes ausdrucken********
4400 gosub4340
4410 lz=32*(an/8-int(an/8)):l1$=left$(lz$,lz):ifeb=>0thenan=int(eb/8)*8
4420 lz=32-32*((en+1)/8-int((en+1)/8)):iflz=32thenlz=0
4430 l2$=left$(lz$,lz)
4440 bp=an:gosub3840
4450 forj=antoenstep8:h$=str$(j):l1=len(h$)
4460 h$="      "+left$(nu$,4-l1)+right$(h$,l1-1)+chr$(62)+"   "
4470 gosub4300
4480 print#4,h$;l1$;:l1$="":i1$=""
4490 fori=0to7
4500 get#3,a$:ifa$=""thena$=chr$(0)
4510 ifeb=>0andj+i<ebthena$=".":gosub4730:goto4560
4520 as=asc(a$):i$=str$(as):l2=len(i$)
4530 i$=left$(nu$,4-l2)+right$(i$,l2-1)+" ":i1$=i1$+i$
4540 gosub4650
4550 ifj+i=enthen4570
4560 nexti:i=i-1
4570 ifj+i=entheni1$=i1$+l2$:j=en:l2$=""
4580 i1$=i1$+"  "
4590 print#4,i1$;:gosub4320
4600 b$=left$(b$,len(b$))+right$(nu$,8-len(b$))
4610 print#4,b$:b$=""
4620 nextj
4630 gosub4360:print#4:return
4640 :
4650 rem***operat.in zeichen umwand.***
4660 ifas<32oras>90thena$=".":goto4750
4670 ifas=170thena$="+":goto4750
4680 ifas=171thena$="-":goto4750
4690 ifas=173thena$="/":goto4750
4700 ifas=172thena$="*":goto4750
4710 ifas=173thena$="/":goto4750
4720 ifas=177thena$=">":goto4750
4730 ifas=178thena$="=":goto4750
4740 ifas=179thena$="<"
4750 b$=b$+a$:return
4760 :
4770 rem*******eingabe filename********
4780 input"{down} {blk}Filename: {yel}";f$
4790 iflen(f$)<=16then4820
4800 print"{up}             ";
4810 fort=1tolen(f$):print" ";:nextt:print"{up}{up}":goto4780
4820 gosub3520:e1=s1:e2=s2
4830 onagoto870,1200,1200,1770
4840 print"{down}{down} {wht}FILE{$a0}NICHT{$a0}VORHANDEN!"
4850 print"{down} F1{blk}=Neue Eingabe  {wht}F3{blk}=Menue"
4860 geta$
4870 ifa$=chr$(133)then210
4880 ifa$=chr$(134)then190
4890 goto4860
4900 :
4910 rem******2 blocks pro seite*******
4920 ab=ab+1:ifab=2then4940
4930 return
4940 ab=0:print#4,chr$(12):gosub3960
4950 return
4960 :
4970 rem******eingabe blocknummer******
4980 print"{down}{rght}{wht}File belegt";fl" Bloecke!"
4990 input"{down}{rght}{blk}Blocknummer:  {yel}";bn:ifbn<1orbn>flthengosub3930:goto210
5000 n1=1
5010 ifn1=bnthen5040
5020 sp=s1:se=s2:bp=0:gosub3830:gosub3870
5030 n1=n1+1:goto5010
5040 onagoto0,1210,1450
5050 :
5060 rem******seitenvorschub j/n*******
5070 print"{down}{rght}{blk}Seitenvorschub   {yel}J/N?";:gosub5110
5080 ifa$="j"thengosub4940
5090 return
5100 :
5110 rem********tastaturabfrage********
5120 geta$
5130 ifa$="j"thenprint"{left}{left}{left}{left}{cyn}J":goto5160
5140 ifa$="n"thenprint"{left}{left}{cyn}N":goto5160
5150 goto5120
5160 fort=1to1000:nextt:return
5170 :
5180 rem*********f1 - abfrage**********
5190 geta$
5200 ifa$=chr$(133)thenreturn
5210 goto5190
5220 :
5230 rem*******diskette einlegen*******
5240 print"{down} {yel}Zu bearbeitende Diskette einlegen!"
5250 ifa=5ora=6thenreturn
5260 fort=1to1000:nextt:return
5270 :
5280 rem*******fertig .......f1********
5290 print" {yel}Fertig {blk}........................ {yel}F1"
5300 gosub5180:return
5310 :
5320 rem****disk.-name und id lesen****
5330 sp=18:se=0:bp=144:gosub3810
5340 d$="":j=0
5350 fori=1to20:get#3,a$:ifa$=""thena$=chr$(0)
5360 ifj>0then5380
5370 ifa$=chr$(160)thenj=i-1:goto5390
5380 d$=d$+a$
5390 nexti
5400 dn$=" "+left$(d$,j)+"  ":id$=" "+right$(d$,2)
5410 return
5420 :
5430 end
PDF Diesen Artikel als PDF herunterladen
Mastodon Diesen Artikel auf Mastodon teilen
← Vorheriger ArtikelNächster Artikel →