C 64
Floppy-Kurs

In die Geheimnisse der Floppy eingetaucht – Teil 1

Das Diskettenlaufwerk VC 1541 ist der Renner unter den Massenspeichern. Doch mit der passenden Literatur hapert es. Deshalb beschränken sich die meisten Anwender auf das Speichern und Laden von Programmen. Mit diesem Kurs lernen Sie, Ihre Floppy effektiv auszunützen und schließlich zu manipulieren.

Daß die 1541 ein sehr wandelbares Gerät ist, werden die meisten Benutzer wohl wissen oder zumindest erahnen. Man denke ja nur an den »Kleinkrieg« zwischen Softwareherstellern und Softwarepiraten, die sich gegenseitig das Leben schwer machen. Die meisten »Schlachten« liefert man sich hier im Inneren der Floppy, die viel raffiniertere Methoden des Programmschutzes anbietet als der Commodore 64.

Aber auch solche Programme, wie das HYPRA-LOAD, das Sie ebenfalls in dieser Ausgabe als Listing des Monats finden, beweisen die Flexibilität der 1541. Doch wie bei so vielen Dingen in der Commodore-Welt sind auch hier die Informationen rar, beziehungsweise in den Handbüchern gar nicht vorhanden. So wollen wir uns mit Ihnen an die Floppy heran- und in sie hineintasten. Angefangen bei grundlegenden Informationen über den Diskettenaufbau und den Befehlssatz der Floppy werden wir Schritt für Schritt in deren Möglichkeiten zur Programmierung und Manipulation hinabtauchen. Was wird benötigt?

Nun, außer einem C 64 und einer VC 1541, »nur« Basic-Erfahrungen, grundlegende Kenntnisse in Maschinensprache (für spätere Folgen) und ein wenig Geduld.

Bevor wir jedoch mit unserer ersten Tauchfahrt beginnen, tippen Sie bitte das beigefügte Programm EDDI (Listing 1) ein, sofern Sie nicht über einen eigenen Disk-Monitor verfügen. Auf die Bedienung von EDDI wird im Einzelnen eingegangen.

Sehen wir uns jetzt erst einmal so eine Diskette an; die folgenden Erläuterungen beziehen sich auf eine formatierte Diskette.

Aufbau einer Diskette

Die Diskette ist in 35 konzentrische Spuren (englisch: Tracks) aufgeteilt. Diese Spuren enthalten wiederum jede eine bestimmte Anzahl von Sektoren, die von außen nach innen abnimmt. Die genauen Zahlenverhältnisse stehen in Tabelle 1.

Spuren Sektoren Anzahl Total
01-17 00-20 21
18-24 00-18 19
25-30 00-17 18
31-35 00-16 17
Tabelle 1. Spuren und Sektoren des VC 1541-Diskettenformates

Die Spuren sind, beginnend mit der äußeren Spur, von 1 bis 35 durchnumeriert. Die Sektoren sind auf den Spuren in numerischer Reihenfolge gegen den Uhrzeigersinn angeordnet. Jeder Sektor enthält einen Block, das sind 256 Bytes, an Information. Es kann jeder der 683 Blöcke auf der Diskette durch Angabe der jeweiligen Spur- und Sektornummer aufgerufen werden. Allerdings stehen davon dem Benutzer normalerweise nur 664 Blocks zur Verfügung, da das Betriebssystem der Floppy die Spur 18 für sich beschlagnahmt.

Für die nun folgenden Versuche wäre es sinnvoll, eine Diskette neu zu formatieren, mit der wir ein bißchen »spielen« können. Sehen wir uns nun erst einmal das Directory an (LOAD "$",8).

In der ersten Zeile stehen die Drivenummer (hier immer 0) und der Name der Diskette, sowie die ID und das Formatkennzeichen (genaueres später).

Die zweite Zeile enthält, da sich kein File auf der Diskette befindet, die Meldung »664 BLOCKS FREE«.

Erste Versuche mit EDDI, dem Disk-Monitor/Editor

Da sich diese Informationen auf der schon erwähnten Spur 18 befinden, wollen wir uns diese Spur mit EDDI gleich einmal etwas genauer ansehen. Laden Sie den Editor und legen Sie unsere »Spieldiskette« ein; danach starten Sie mit RUN.

Als Kommando tippen Sie F3 für »BLOCK LESEN«. Danach geben Sie, durch Komma getrennt, die Spur und Sektornummer des gewünschten Blocks ein; in unserem Fall »18,0«.

Nach dem Ladevorgang meldet sich EDDI mit Byte 0 der ersten von 16 Seiten, zu je 16 Bytes. Drücken Sie jetzt RETURN, um die erste Seite anzuzeigen, welche wir nun betrachten wollen.

Es sollte vielleicht erwähnt werden, daß die Zählung von Blöcken und Bytes grundsätzlich bei Null beginnt. Den eingeladenen Block bezeichnet man als BAM (Block Availability Map), auf deutsch etwa »Blockbelegungsplan«. Dieser Plan gibt an, welche Blöcke auf der Diskette frei und welche schon beschrieben sind. Ferner enthält er den Namen der Diskette, die ID, das Formatkennzeichen und den Beginn des Directory.

Die ersten beiden Bytes (0,1) dieses Blocks enthalten Spur und Sektor des ersten Directoryblocks; normalerweise »18,1« (siehe auch Tabelle 2).

Aufbau des Blocks 18,0:
BYTE(s) Bedeutung:
000-001 Spur und Sektor des ersten Directory-Blocks
002 Formatkennzeichen »A«
003 unbenutzt
004-007 BAM der Spur 1
008-011 BAM der Spur 2
012-143 BAM der Spuren 3-35
144-161 Name der Diskette, aufgefüllt mit 160
162-163 ID der Diskette
164 unbenutzt
165-166 DOS und Formatkennzeichen
167-255 nicht benutzt
Tabelle 2. Aufbau und Inhalt der BAM (Block-Belegungs-Plan) in Spur 18, Sektor 0

Byte 2 enthält das Formatkennzeichen (hier 65, beziehungsweise »A«), Zur Erklärung: Commodore stellt ja verschiedene Laufwerke her, zum Beispiel 1541, 3040, 8050, 8250… Diese Laufwerke unterscheiden sich fast alle im Aufzeichnungsformat, das heißt Anzahl und Verteilung der Spuren und Sektoren; so hat die CBM 8050 77 Spuren mit bis zu 29 Sektoren, was deren höhere Speicherkapazität zur Folge hat. Solche Disketten können verständlicherweise von der 1541 weder gelesen noch beschrieben werden. Am Formatkennzeichen »A« erkennt die 1541 nun Disketten ihres eigenen Formats; ist dieses nicht identisch, so beschwert sich die Floppy mit einer Fehlermeldung. Eine Ausnahme dieser Regel bildet die Lesekompatibilität, die besagt, daß eine »fremde« Diskette zwar gelesen, aber nicht beschrieben werden kann (zum Beispiel 3040 auf 1541).

Byte 3 steht generell auf Null, da es bei der 1541 keine Funktion erfüllt.

Die Bytes 4 bis 143 enthalten nun die eigentliche BAM, deren Format ein wenig kompliziert ist: Für jede Spur sind 4 Bytes reserviert, wobei das jeweils erste Byte die Anzahl der noch freien Blöcke auf dieser Spur angibt. Die folgenden drei Bytes müssen wir als eine Gesamtheit von 24 Bits betrachten, wobei jedes gesetzte Bit einen freien Block signalisiert; siehe auch Tabelle 3.

Aufbau eines 4 Byte-Eintrages in der BAM (eine Spur)
BYTE(s) Bedeutung:
000 Anzahl der freien Blöcke dieser Spur
001-003 Belegplan der Spur
Jedes Byte ist zuständig für 8 Sektoren:
Byte 1 für 0-7
    Bit 7 für Sektor 0
    Bit 6 für Sektor 1
    und so weiter
Byte 2 für 8-15
Byte 3 für 16-23
Tabelle 3. Für jede Spur reserviert die BAM 4 Bytes

Um auch die folgenden Seiten des Blocks zu betrachten, drücken Sie zum Vorwärtsblättern Fl; die weitere Bedienung ist analog zur oben beschriebenen. Rückwärtsblättern ist durch Drücken von F2 möglich.

Fahren Sie nun bis zum Byte 144 vor und sehen Sie sich die Seite an.

Die Bytes 144 bis 161 enthalten den Namen der Diskette, der beim Formatieren festgelegt wird. Direkt im Anschluß daran folgen die Bytes 162,163, die die ID im ASCII-Code beinhalten, gefolgt von einem »Shift Space«. An der ID erkennt die Floppy, ob die Diskette gewechselt wurde; deshalb sollte jede Diskette eine andere ID haben.

Byte 165 und 166 enthalten DOS-Version und Formatkennzeichen, hier normalerweise »2A«, wiederum gefolgt von einem »Shift Space«.

Die Bytes 171 bis 255 haben normalerweise keine Bedeutung und können unterschiedlich gefüllt sein.

Wie sieht das Inhaltsverzeichnis aus?

Auf unserer Entdeckungsreise durch Spur 18 folgen wir jetzt der Angabe in den ersten beiden Bytes und laden den ersten Directoryblock (F3; 18,1). Das Format des Blocks ist der Tabelle 4 zu entnehmen. Jeder Direktoryblock enthält acht File-Einträge und den Zeiger auf den nächsten Direktoryblock (Byte 0 und 1); ist die Tracknummer des nächsten Blocks 0, so war der gelesene Directoryblock der letzte, und das zweite Byte zeigt die Anzahl der hier benutzten Bytes an. In unserem Fall stehen hier 0 und 255.

Aufbau eines Directory-Blocks:
BYTE(s) Bedeutung
000-001 Spur und Sektor des nächsten Dir.-Blocks
002-031 Eintrag Nr. 1
032-033 unbenutzt
034-063 Eintrag Nr. 2
064-066 unbenutzt
067-225 Einträge Nr. 3-7 bzw. unbenutzt
226-255 Eintrag Nr. 8
Tabelle 4. Aufbau der Directory der VC 1541

Nun zu Tabelle 5, die das Format eines Directoryeintrags darlegt: Jeder dieser Einträge besteht aus 30 Bytes, wobei das erste den Filetyp (siehe Tabelle 6), die beiden nächsten Spuren und Sektoren des ersten Fileblocks und die 16 folgenden Bytes den Filenamen enthalten. Die folgenden 3 Byte werden nur bei relativen Dateien verwendet; sie werden später im einzelnen noch besprochen.

Aufbau eines Directory-Eintrags:
BYTE(s) Bedeutung
000 Filetyp, siehe ges. Tab
001-002 Spur und Sektor des ersten Datenblocks
003-018 Filename, aufgefüllt mit 160
019-020 REL-Files: Spur und Sektor des ersten Side- Sektor-Blocks
021 REL-Files: Datensatzlänge
022-025 unbenutzt
026-027 Spur und Sektor beim Überschreiben mit @ (nur Zwischenspeicher)
028-029 Anzahl der von diesem File belegten Blocks
Tabelle 5. Bedeutung der einzelnen Byte des Directory
Aufbau des Filetyp-Bytes
BIT Bedeutung, in Klammern jeweiliger Inhalt
0 (0) (1) (0) (1) (0)
1 (0)=DEL (O)=SEQ (l)=PRG (l)=USR (O)=REL
2 (0) (0) (0) (0) (1)
3 unbenutzt
4 unbenutzt
5 unbenutzt
6 (0)=normal; (1) = File kann durch SCRATCH nicht mehr gelöscht werden
7 (0)= File noch offen
(1)= File ordnungsgemäß geschlossen
Tabelle 6. Die Bedeutung des ersten Bytes eines Directory-Eintrages

Byte 26 und 27 enthalten Track und Sektor des neuen Files, falls das alte mit »@« überschrieben wurde. Die Bytes 28,29 schließlich geben die Anzahl der belegten Blöcke dieses Files an.

Die einzelnen Datei-Typen der Floppy

Diese bis jetzt beschriebenen Angaben werden vom Betriebssystem der Floppy, also vom DOS (englisch: Disk Operating System) verwaltet.

Beschäftigen wir uns nun mit den restlichen Blöcken auf der Diskette, die dem Anwender zur freien Verfügung stehen, denn dort werden die einzelnen Files abgespeichert, deren Aufbau uns jetzt interessiert.

DEL-Files:

Diese Fileanzeige existiert normalerweise nicht im Directory; wird ein File gelöscht, so wird dieses nicht mehr angezeigt; das Byte des Filetyps steht dann auf 0. Durch setzen des Filetyps auf 128 (hex. $80) kann eine DEL-Anzeige jedoch erzwungen werden.

SEQ-Files:

Dieser Filetyp dient zur Speicherung von Daten auf Diskette (im Gegensatz zur Programmspeicherung). Der Aufbau dieses Filetyps ist relativ einfach: Die ersten beiden Bytes eines Datenblocks zeigen jeweils auf den nächsten Block im File; so erfolgt eine beliebig lange Blockverkettung auf der Diskette. Da aber auch das schönste File einmal zu Ende geht, muß der letzte Block gekennzeichnet sein. Dies erfolgt, wie schon beim Directory, durch eine 0 als Spurnummer. Die Sektornummer bezeichnet jetzt die Anzahl der belegten Datenbytes dieses Blocks. Diese Art der Verkettung von Blöcken wird bei allen Filetypen vorgenommen! Die restlichen 254 Bytes jedes Blocks enthalten die Daten.

USR-Files

USR-Files stimmen im Aufbau exakt mit den SEQ-Files überein, sie haben jedoch noch Zusatzfunktionen im DOS, auf die ein anderes Mal eingegangen werden soll.

PRG-Files

PRG-Files stellen den häufigsten Filetyp dar. Sie dienen der Speicherung von Programmen auf der Diskette und haben nahezu den selben Aufbau wie SEQ-Files. Der einzige Unterschied besteht in den Bytes 2 und 3 des ersten Blocks, welche die Startadresse des Programms im Computer enthalten. Ist diese Adresse gleich der Adresse des Basic-Anfangs, also 2049 ($0801), so können die Programme mit »LOAD”Name",8« geladen werden; dieser Modus ignoriert die Anfangsadresse auf Diskette und lädt die Programme generell an den Basic-Anfang (sogenanntes relatives Laden). Sollen Programme jedoch an anderen Stellen im Speicher stehen, zum Beispiel Maschinenprogramme, so muß diese angegebene Adresse als Startadresse benutzt werden; man lädt hier absolut mit »LOAD”Name”,8,1«.

REL-Files:

Dieser Filetyp ist im Aufbau ungleich komplizierter als die eben besprochenen; es soll daher zuerst kurz auf die Arbeitsweise von REL-Files eingegangen werden. Sequentielle Files haben den Nachteil, daß sie praktisch nur aus einem Datensatz bestehen. Sucht man nun, zum Beispiel in einer Kartei, eine bestimmte Hausnummer oder einen bestimmten Namen, so muß der gesamte Datensatz durchgelesen werden, um die entsprechende Stelle zu finden. In einer relativen Datei geht man deshalb einen anderen Weg, um jede Stelle schnell auffinden zu können.

Es existiert eine beliebige Anzahl (zum Beispiel 100) von Datensätzen, wobei alle Datensätze die gleiche Länge haben müssen (maximal 254 Zeichen).

Das DOS legt jetzt einen sogenannten Side-Sektor an, der aus bis zu sechs Blöcken bestehen kann. Diese Blöcke enthalten nun die Zeiger auf sämtliche Datenblöcke, in denen die Datensätze gespeichert sind (1 Datensatz hat maximal 1 Block Länge). Auch hier sind die Datenblöcke wieder durch Zeiger in den Bytes 0 und 1 verkettet. Den Aufbau eines Side-Sektor-Blocks zeigt Tabelle 7. Zum besseren Verständnis hier ein kleines Beispiel:

Aufbau eines Side-Sektor-Blocks:
BYTE(s) Bedeutung
000-001 Spur und Sektor des nächsten Side-Sektor-Blocks
002 Nummer des Side-Sektor-Blocks
003 Datensatzlänge
004-005 Spur und Sektor des Side-Sektor-Blocks 1
006-007 Spur und Sektor des Side-Sektor-Blocks 2
008-015 Spur und Sektor der Side-Sektor-Blöcke 3-6
016-017 Spur und Sektor des ersten Datenblocks für den der Side-Sektor-Block zuständig ist. (Datenblock 0)
Spur und Sektor des zweiten Datenblocks (Nr. 1)
018-255 Spur und Sektor der Datenblocks Nr. 2 bis Nr. 119
Tabelle 7 Relative Dateien benutzen Side-Sektor-Blöcke um Datensätze gezielt anzuspringen

Wir haben eine relative Datei mit 250 Datensätzen à 127 Zeichen. Diese Datei benötigt also 125 Datenblöcke und zwei Side-Sektor-Blöcke. Im Directory-Eintrag finden wir jetzt die schon erwähnten zusätzlichen Bytebelegungen: Byte 19 und 20 jedes Eintrags enthalten jetzt Spur und Sektor des ersten Side-Sektor-Blocks; Byte 21 gibt die Datensatzlänge (Recordlänge) an.

Wir wollen jetzt auf den 248. Datensatz zugreifen; das DOS arbeitet nun folgendermaßen: Ein Datensatz enthält 127 Byte, das heißt, es passen zwei Datensätze in einen Block; dadurch errechnet sich der Block, auf den jetzt zugegriffen wird, aus (248-1)/2 = 123.5. (Minus 1, da immer von 0 an gezählt wird). Da ein Side-Sektor-Block nur 120 Einträge aufnehmen kann, ist der Zeiger auf den Datenblock im Side-Sektor-Block Nummer 2 zu finden. Dieser wird jetzt anhand des Verzeichnisses in Block 1 gelesen und dann auf Zeiger Nummer 3 (Bytes 22,23) zugegriffen. Wir kennen also jetzt Spur und Sektor des Blockes, in dem unser Datensatz steht; die Position des ersten Datenbyte berechnet sich jetzt aus dem Nachkommaanteil der obigen Division (0.5*254 = 127). Der Datensatz beginnt also beim 127+2 = 129ten Byte.

Der Aufbau von relativen Dateien ist also, wie schon erwähnt, ziemlich kompliziert; diese Art der Datenspeicherung hat aber einige Vorteile gegenüber der ’normalen’ mit SEQ-Files.

Bedienungshinweise für EDDI, dem Disk-Monitor/Editor

Da unserem U-Boot auf dieser schwierigen Fahrt der Sauerstoff ausgegangen ist, wollen wir uns nun erst einmal erholen. Hier noch ein paar Anregungen zur Arbeit mit EDDI: EDDI kann nicht nur Blöcke lesen und anzeigen; Sie können auch Bytes verändern und diesen Block danach wieder abspeichern.

Dazu laden Sie den zu verändernden Block und fahren auf die Seite, die Sie interessiert; hier tippen Sie als Kommando F5, und der Editor-Modus startet. Sie können jetzt Bytes dezimal abändern, indem Sie den jeweils neuen Wert eingeben und »RETURN« drücken. Wollen Sie aus dem Eingabemodus aussteigen, so tippen Sie entweder »RETURN« und können weiterblättern ohne den Editor zu verlassen, oder Sie tippen »↑ RETURN«, um in den Kommando-Modus zu kommen. Nach einigem Probieren wird Ihnen EDDI sehr schnell vertraut werden; wir gehen auch in den folgenden Ausgaben noch darauf ein.

Wichtig:

Beim Wechseln einer Diskette muß die Funktionstaste F6 getippt und nach dem Austausch eine Taste gedrückt werden, sonst reagiert die Floppy mit einer Fehlermeldung. Diese können übrigens mit »@« abgerufen werden. Das Zurückschreiben eines Blocks auf Diskette erfolgt mit F4, wobei Spur und Sektornummer angegeben werden müssen. Hier noch ein paar Vorschläge zum Ausprobieren: Ändern Sie doch einmal auf Ihrer Versuchsdiskette (!) das Formatkennzeichen (Spur 18, Sektor 0, Byte 2 auf 66 statt jetzt 65 und speichern den Block an die gleiche Stelle auf die Diskette zurück. Versuchen Sie nun einmal ein kleines Programm auf diese Diskette zu schreiben. (Die genauen Vorgänge in der Floppy werden beim nächstenmal erläutert.) Oder ändern Sie einmal die Bytes im Directory, die den Filetyp angeben, entsprechend Tabelle 6 und laden Sie es danach. Mit dem klugen Satz »Probieren geht über Studieren« verabschieden wir uns für diese Ausgabe. Nächstesmal beginnt dann ein praktischer Teil unserer Expedition, nämlich die Vorstellung des Befehlssatzes der 1541 mit vielen Beispielen und Anregungen.

(K. Schramm/B. Schneider/gk)
10 rem{rvon}eddi - diskmonitor/editor
20 rem{dish}         von
30 rem{dish}{rvon}karsten schramm (c) 1984
40 rem geschuetzte version
50 print"{clr}{blk}":poke53280,14:poke53281,14
60 gosub10000
70 open1,8,15,"i0":open2,8,2,"#"
80 print"{clr} e d d i  -  hauptmenue"
85 he$="byte      dec   hex   bin        asc":poke650,128
90 print" EEEEEEEEEEEEEEEEEEEEEE"
100 print:print:print
110 print"(f1) - scrolling vorwaerts":print
120 print"(f2) - scrolling rueckwaerts":print
130 print"(f3) - block lesen":print
140 print"(f4) - block schreiben":print
150 print"(f5) - editor einschalten":print
160 print"(f6) - diskette wechseln":print
170 print"(f7) - rueckkehr ins menue":print
180 print"(f8) - programmende"
190 po=1:goto 9000
1000 rem eddi an
1010 x=0:y=0
1020 fory=eto255step16
1030 po=2:print"{clr}editor-modus fuer track"t" sektor"s
1040 print:printhe$:print
1050 forx=ytoy+15:printx:nextx
1060 print"{home}{down}{down}{down}":forx=ytoy+15
1065 da=peek(50000+x):gosub7030:printx,ou$
1070 input"{up}{rght}{rght}{rght}{rght}{rght}{rght}{rght}{rght}";in$:ifin$=""then1090
1072 ifleft$(in$,1)="^"thenprint"{home}{down}{down}{down}{down}{down}{down}{down}{down}{down}{down}{down}{down}{down}{down}{down}{down}{down}{down}{down}":goto9000
1073 ifleft$(in$,1)="_"thenprint"{home}{down}{down}{down}{down}{down}{down}{down}{down}{down}{down}{down}{down}{down}{down}{down}{down}{down}{down}{down}{down}":goto1125
1075 da=val(left$(in$,3)):ifda>255orda<0thenprint"{up}{up}":goto1065
1080 poke50000+x,da
1120 nextx:print
1125 print"eingabe ?";
1130 geta$:ifa$=""then1130
1140 ifa$="{f1}"then1200
1150 ifa$="{f2}"then1300
1160 ifa$<>" "thennexty
1170 po=1:goto9000
1200 print"{home}{down}{down}{down}":printe".....???"
1210 geta$:ifa$=""then1210
1215 ifa$="{f2}"then1300
1220 ifa$<>"{f1}"then1020
1230 e=e+16:ife>255thene=0
1240 goto1200
1300 print"{home}{down}{down}{down}":printe".....???"
1310 geta$:ifa$=""then1310
1315 ifa$="{f1}"then1200
1320 ifa$<>"{f2}"then1020
1330 e=e-16:ife<0thene=240
1340 goto1300
2000 rem diskettenwechsel
2010 print"{clr}bitte neue diskette einlegen"
2020 geta$:ifa$=""then2020
2030 run
3000 rem block read
3010 po=2:print"{clr}   block lesen":print:print
3020 input"track, sektor ";t,s
3025 ift<1ort>35then3010
3030 print#1,"u1 2 0"t;s
3035 ifst<>0thenprint:goto9000
3040 print#1,"b-p 2 0"
3050 sys49152:e=0:x=0:y=0:goto5010
3060 fory=eto255step16
3070 print"{clr}track"t" sektor"s
3080 print:printhe$:print
3090 forx=ytoy+15:da=peek(50000+x):gosub7030:printx,ou$:nextx
3100 goto9000
4000 rem block write
4010 po=1:print:print:input"{clr}{red}track, sektor";t,s:print"{blk}"
4020 print#1,"b-p 2 0"
4030 sys49177
4040 print#1,"u2 2 0"t;s
4050 goto9000
5000 rem scroll forward
5010 e=x:ife>255thenx=0:e=0
5020 print"{clr}track"t" sektor"s
5030 print:printhe$:print
5040 da=peek(50000+e):gosub7030:printe,ou$
5050 x=x+16
5060 geta$:ifa$=""then5060
5070 ifa$="{f1}"then5010
5075 ifa$="{f2}"thenx=x-16:goto6010
5077 ifa$="{f5}"then1000
5080 goto3060
6000 rem scroll backward
6010 e=x:ife<0thene=240:x=240
6020 print"{clr}track"t" sektor"s
6030 print:printhe$:print
6040 da=peek(50000+e):gosub7030:printe,ou$
6050 x=x-16
6060 geta$:ifa$=""then6060
6070 ifa$="{f2}"then6010
6075 ifa$="{f1}"thenx=x+16:goto5010
6077 ifa$="{f5}"then1000
6080 goto3060
7000 rem bereitstellung des strings
7010 rem da/da$ sind ausgabewerte                h$,d$,b$,c$ sind zwischenwerte
7020 rem ou,ou$ sind endergebnisse
7030 ifda>31andda<128orda>159andda<256thenc$=chr$(da):goto7040
7035 c$="."
7040 xx$="000":d$=right$(str$(da),len(str$(da))-1)
7045 d$=left$(xx$,3-len(d$))+d$
7050 xx$="123456789abcdef":h$=""
7060 hh=int(da/16):hl=da-hh*16
7070 ifhhthenh$=h$+mid$(xx$,hh,1):goto7080
7075 h$=h$+"0"
7080 ifhlthenh$=h$+mid$(xx$,hl,1):goto7090
7085 h$=h$+"0"
7090 b$="":forq=7to0step-1
7100 if(daand(2^q))<>0thenb$=b$+"1":next:goto7110
7105 b$=b$+"0":next
7110 ou$=d$+"   "+h$+"    "+b$+"   "+c$
7120 return
8999 end
9000 rem get kommando
9010 print:print"kommando ?  ";
9020 print"{left}{CBM-B}";:forw=1to75:getko$:ifko$<>""then9090
9030 nextw
9040 print"{left}{rvon}{CBM-B}{rvof}";:forw=1to75:getko$:ifko$<>""then9090
9050 nextw
9060 goto9020
9090 ifko$="@"then9200
9100 if asc(ko$)>140orasc(ko$)<133then9020
9110 ko=asc(ko$)-132
9120 on po goto9130,9140,20000
9130 on ko goto9020,3000,1000,80,9020,4000,2000,20000
9140 on ko goto5000,3000,1000,80,6000,4000,2000,20000
9200 print
9210 get#1,a$:printa$;:ifst<>64then9210
9220 goto 9000
9999 end
10000 data160,0,169,8,32,9,237,169,98,32,199,237,32,19,238,153,80,195,200
10010 data208,247,32,239,237,96,160,0,169,8,32,12,237,169,98,32,185,237
10020 data185,80,195,32,221,237,200,208,247,32,254,237,96,0,0
10030 restore:forz=1to51:reada:poke49151+z,a:next
10040 rem get:49152; write:49177
10050 return
20000 print:print:print"{lblu}auf wiedersehen !!!":print:poke53280,14:poke53281,6
20001 print"und dankeschoen !"
65535 new:"{del}{del}{del}{del}{del}{del}{del}{del}{del}{del}{del}{del}{del}{del}{del}{del}{del}{del}{del}{del}{del}{del}":end
Listing 1. EDDI, ein Disk-Monitor/Editor
PDF Diesen Artikel als PDF herunterladen
Mastodon Diesen Artikel auf Mastodon teilen
← Vorheriger ArtikelNächster Artikel →