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:
- Eingabe von Spur und Sektor:
Geben Sie, durch Komma getrennt, Spur- und Sektornummer des auszudruckenden Blocks ein; - 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.

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.

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.

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:
- Diskettenname und ID
- Nummer des Eintrages
- Filename
- Filelänge in Blocks
- Filelänge in Bytes = (Filelänge in Blocks — 1) * 254 + 127)
Es wird davon ausgegangen, daß der letzte Block zur Hälfte belegt ist. Die Angabe weicht also um maximal 126 Bytes von der tatsächlichen Länge ab. - 1. Datenblock des Files
- Filetyp
- Freie Einträge
- Freie Blöcke
Bei relativen Dateien finden Sie im Anschluß an den Filetyp zwei zusätzliche Angaben:
- Erster Side - Sektor - Block (Spur/Sektor)
- Recordlänge

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.

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