Diskette intern
Der genaue Inhalt einer Diskette ist den meisten Floppy-Besitzern wohl bisher unbekannt geblieben. Das Programm Disk-Dump schafft den Einblick.
Dieses Programm ermöglicht den Inhalt einzelner Disketten-Blocks auf dem Bildschirm anzusehen, sie auszudrucken und zu ändern!
Nach dem Start des Programms wird Track 18 — Sektor 0 in den Speicher geladen und — in zwei Stufen — auf den Bildschirm ausgegeben. Zwei Stufen sind notwendig, um den Inhalt gut auf dem Bildschirm darzustellen. In der ersten Stufe werden die ersten 128 Byte angezeigt, je 8 Byte in einer Zeile. Am Anfang der Zelle steht noch die Hexnummer des ersten Bytes der jeweiligen Zeile, hinter dem Inhalt werden die 8 Byte noch als Character-String ausgegeben. Hierbei werden Steuerzeichen als Blank ausgegeben. Dieser Bildschirminhalt bleibt nun bestehen, bis eine Taste gedrückt wird und somit die zweiten 128 Byte in gleicher Weise angezeigt werden.
Im Anschluß daran erscheint, zusammen mit den letzten 128 Byte, ein Menü, das sämtliche Funktionen umfaßt. Hier kann man den Drucker ein- und ausschalten, den nächsten oder vorigen Block laden, einen beliebigen anderen Block laden, denselben Block nochmal anzeigen und den Inhalt des Blocks im Speicher ändern.
Zum Ändern muß man zuerst die Bytenummer (in Hex) eingeben und dann den neuen Inhalt (ebenfalls in Hex). Gibt man als Adresse »X« ein, so wird das Ändern abgeschlossen, der geänderte Block wird ausgegeben und man kann entscheiden, ob der Block nun auf Diskette geschrieben werden soll.
Um einen beliebigen Block zu laden, muß man die Track- und Sektornummer (Dezimal) eingeben.
Der physikalische Aufbau der Blocks ist aus dem Manual des Laufwerks zu entnehmen. Man muß jedoch beachten, daß der Inhalt in Hex angezeigt und geändert wird und die Angabe der Block- und Sektorennummern dezimal erfolgt.
Die Bedienung des Programms erklärt sich durch die Menü-Steuerung von selbst.
(Horst Wibbing/rg)
100 print"{clr}{up}{up}{up}"
101 rem copyright (c) 1984 by
102 rem horst wibbing, 62 wiesbaden
110 print" ****************************"
120 print" * *"
130 print" * disk - dump v2 *"
140 print" * *"
150 print" ****************************"
151 print"{down}{down}"
153 print"ist die diskette drin ? ";
154 get y$:if(y$<>"y"andy$<>"j")then154
155 print"{clr}"
160 rem ***** init *****
161 d=0:d$(0)="{rvon}off{rvof}":d$(1)="{rvon}on {rvof}"
162 tr=18:se=0
163 print"{down}"
164 dimb$(255)
165 goto270
166 rem ***** track/sector *****
170 print" which track ( 1 - 35 )";
180 inputtr
190 iftr<1ortr>35thenprint"{up}{up}":goto170
200 iftr<18thensr=20:goto240
210 iftr<25thensr=18:goto240
220 :iftr<31thensr=17:goto240
230 :sr=16
235 rem *****
240 print"{down} which sector ( 0 -";sr;")";
250 inputse
260 ifse<0orse>srthenprint"{up}{up}{up}":goto240
265 rem *****
270 gosub1000:rem lesen
280 gosub2000:rem ausdrucken
310 rem *****
320 print" 1 => next block 2 => same block"
330 print" 3 => prev. block 4 => other block"
340 print" 5 => aendern 6 => printer ";d$(d)
350 print" 0 => end"
360 gett$:ift$=""then360
370 ift$="1"thengosub3000:goto270
380 ift$="2"thengoto280
385 ift$="3"thengosub3500:goto270
390 ift$="4"thengoto170
391 ift$="5"thengosub5000:print"{clr}":goto 320
392 ift$="6"thengosub2500:goto410
400 ift$="0"thengoto9999
410 print"{up}{up}{up}{up}{up}":goto320
430 rem ***************** ende ******
1000 rem *******************
1001 rem **** sub lesen ****
1002 rem *******************
1010 open15,8,15
1020 open8,8,8,"#"
1025 print#15,"u1 8 0"tr,se
1030 fori=0to255
1040 :get#8,b$(i)
1070 nexti
1080 close8:close15
1090 return
1100 rem *********** ende sub lesen *****
2000 rem **********************
2001 rem **** sub ausdruck ****
2002 rem **********************
2010 iftr<18thenbl=21*(tr-1)+se:goto2050
2020 iftr<25thenbl=19*(tr-1)+se+34:goto2050
2030 iftr<31thenbl=18*(tr-1)+se+34+24:goto2050
2040 bl=17*(tr-1)+se+34+24+30
2050 ifd=1thenopen4,4
2051 print"{clr}{rvon} track:";tr;" sector:";se;" block:";bl"{rvof}"
2055 ifd=1thenprint#4,"{rvon} track:";tr;" sector:";se;" block:";bl"{rvof}{down}"
2060 print"{down}"
2070 fori=0to15
2071 :c$=""
2072 :x=8*i:gosub 6000:rem dec-hex
2075 :print" ";x$;" : ";
2076 :ifd=1thenprint#4," ";x$;" : ";
2080 :forj=0to7
2088 :x=(asc(b$(i*8+j)+chr$(0)))
2089 :gosub 6000:rem dec-hex
2090 :print" ";x$;
2091 :ifd=1thenprint#4," ";x$;
2095 :gosub4000:rem check
2100 :nextj
2110 :printc$
2111 :ifd=1thenprint#4,c$
2120 nexti
2125 rem ***** 2.seite
2130 print"{down} taste"
2140 gett$:ift$=""then2140
2150 print"{down}{rvon} track:";tr;" sector:";se;" block:";bl"{rvof}"
2155 ifd=1thenprint#4,"{down}{rvon} track:";tr;" sector:";se;" block:";bl"{rvof}{down}"
2160 print"{down}"
2170 fori=16to31
2171 :c$=""
2172 :x=(8*i):gosub 6000:rem dec-hex
2175 :print" ";x$;" : ";
2176 :ifd=1thenprint#4," ";x$;" : ";
2180 :forj=0to7
2188 :x=(asc(b$(i*8+j)+chr$(0)))
2189 :gosub 6000:rem dec-hex
2190 :print" ";x$;
2191 :ifd=1thenprint#4," ";x$;
2195 :gosub4000:rem check
2200 :nextj
2210 :printc$
2211 :ifd=1thenprint#4,c$
2220 nexti
2225 ifd=1thenclose4
2230 return
2240 rem ***********ende sub ausdruck*****
2500 rem *********************
2510 rem **** sub printer ****
2520 rem *********************
2530 ifd=0thend=1:return
2540 ifd=1thend=0:return
2550 rem *********** ende sub printer *****
3000 rem ************************
3001 rem **** sub next block ****
3002 rem ************************
3010 se=se+1
3020 iftr<18andse>20thentr=tr+1:se=0:return
3030 iftr<25andse>18thentr=tr+1:se=0:return
3040 iftr<31andse>17thentr=tr+1:se=0:return
3050 iftr<36andse>16thentr=tr+1:se=0
3060 iftr=36thentr=0
3070 return
3080 rem *********** ende sub next block *****
3500 rem *************************
3510 rem **** sub prev. block ****
3520 rem *************************
3530 se=se-1
3540 ifse<0thengoto3600
3550 return
3600 tr=tr-1
3610 se=16
3620 iftr=0thentr=35:return
3630 iftr<18thense=20:return
3640 iftr<25thense=18:return
3650 iftr<31thense=17
3660 return
3670 rem *********** ende sub prev. block *****
4000 rem *******************
4001 rem **** sub check ****
4002 rem *******************
4010 b=asc(b$(i*8+j)+chr$(0))
4020 if((b<32)or((b>127)and(b<160)))thenc$=c$+" ":goto4030
4025 c$=c$+b$(i*8+j)
4030 return
4040 rem *********** ende sub check *****
5000 rem *********************
5001 rem **** sub aendern ****
5002 rem *********************
5010 print"addr (00-ff/x=exit)";:inputadr$
5015 ifadr$=""thengoto5010
5020 ifadr$="x"thengoto5150
5030 iflen(adr$)<2thenadr$="0"+adr$
5040 iflen(adr$)>2thenadr$=right$(adr$,2)
5045 x$=adr$
5046 gosub 6500:rem hex-dec
5050 i=x
5060 print"wert (00-ff)";:inputw$
5065 ifw$=""thengoto5060
5070 iflen(w$)<2thenw$="0"+w$
5080 iflen(w$)>2thenw$=right$(w$,2)
5085 x$=w$
5086 gosub 6500:rem hex-dec
5090 b$(i)=chr$(x)
5100 goto5000
5110 rem *****
5150 gosub2000:rem ausdrucken
5160 print"auf disk schreiben";:inputy$
5170 if((y$<>"j")and(y$<>"y"))thengoto5300
5175 b1=asc(b$(0)+chr$(0))+1
5180 open15,8,15
5190 open8,8,8,"#"
5200 fori=1to255
5205 :ifb$(i)=""thenprint#8,chr$(0);:goto5220
5210 :print#8,b$(i);
5220 nexti
5225 print#15,"b-p:8",b1
5230 print#15,"b-w:8,0"tr,se
5240 close8:close15
5300 print"weiter aendern";:inputy$
5310 if((y$="j")or(y$="y"))thengoto5000
5320 return
5330 rem *********** ende sub aendern *****
6000 rem *********************
6010 rem **** sub dec-hex ****
6020 rem *********************
6030 x1=0:x2=0
6040 x1=int(x/16)
6050 x2=((x/16)-int(x/16))*16
6100 ifx1<10thenx$=chr$(x1+48):goto6120
6110 x$=chr$(x1+55)
6120 ifx2<10thenx$=x$+chr$(x2+48):return
6130 x$=x$+chr$(x2+55)
6140 return
6150 rem *********** end sub dec-hex *****
6500 rem *********************
6510 rem **** sub hex-dec ****
6520 rem *********************
6530 x1$=left$(x$,1)
6540 x2$=right$(x$,1)
6550 if asc(x1$)>64 then x=((asc(x1$)-55)*16):goto 6570
6560 x=((asc(x1$)-48)*16)
6570 if asc(x2$)>64 then x=x+(asc(x2$)-55):return
6580 x=x+(asc(x2$)-48)
6590 return
6600 rem *********** end sub hex-dec *****
9999 end
Listing »Disk-Dump«