10
20
30
40
50 DIM param 12, sectab 39, data 255
60 osword=&FFF1
70 MODE 7
80 PROCbegin :
90 REPEAT :
100 PROCmain :
110 MODE 7 :
120 UNTIL get%=&8F :
130 END
140
150
160 DEFPROCbegin
170 VDU 23;11,0;0;0;0;
180
190
200 *KEY0 |!|L
210 *KEY1 |!|M
220 *KEY2 |!|N
230 *KEY3 |!|O
240
250 PROChead
260
270 REPEAT
280 PRINTTAB(3,5);STRING$(38," ")
290 PRINTTAB(3,5);CHR$130;"Enter drive (0-3)";
300 INPUT " > "drive%
310 UNTIL drive%>-1 AND drive%<4
320
330 OSCLI "DRIVE "+STR$drive%
340
350 PRINTTAB(3,7);CHR$130;"insert disk in drive ";drive%
360 PRINTTAB(3,8);CHR$130;"press SPACE when ready to go"
370 REPEAT UNTIL INKEY(100)=32
380
390 A%=&7E
400 X%=param
410 Y%=X% DIV 256
420 CALL osword
430 maxtrack%=(!param DIV 2560)-1
440 ENDPROC
450
460 DEFPROCchoices
470
480 *FX4,1
490
500 PRINTTAB(0,21);CHR$133;"you may edit the";
510 PRINTCHR$131;"hex";CHR$133;"or the";CHR$129;"ASCII"
520 PRINTTAB(0,22);CHR$131;"(f0 = other half : f1 = main menu )"
530 PRINTTAB(0,23);CHR$131;"(f2 = update disk : f3 = quit program)"
540 ENDPROC
550
560
570
580 DEFPROCcoord
590
600 x%=POS
610 y%=VPOS
620 ENDPROC
630
640 DEFPROCdispdata
650
660 PROChead
670
680 FOR I%=1 TO 16
690 PROCdispline(I%)
700 NEXTI%
710
720 PROCchoices
730
740 VDU 31,5,4
750 ENDPROC
760
770 DEFPROCdispline(W%)
780
790
800 J%=part%*128 + 8*(W%-1)
810
820 start%=data+J%
830
840 PROCstring(J%)
850
860 PRINT TAB(0,W%+3);CHR$130;str$;CHR$131;" ";
870
880 A$=""
890
900 FOR Z%=0 TO 7
910
920 C%=start%?Z%
930
940 IF C%<32 OR C%>126:A$=A$+"." ELSE A$=A$+CHR$(C%)
950
960 PROCstring(C%)
970
980 PRINTstr$;" ";
990 NEXT
1000
1010 PRINT CHR$129;A$
1020 ENDPROC
1030
1040 DEFPROCdown
1050
1060 VDU 10
1070
1080 PROCcoord
1090
1100 IF y%>19 THEN VDU 31,x%,4
1110 ENDPROC
1120
1130 DEFPROCedit
1140
1150 PROCcoord
1160
1170 IF x%>29:PROCedit2:ENDPROC
1180
1190 get%=get%-&30
1200 IF get%>9:get%=get%-7
1210
1220 IF get%<0 :ENDPROC
1230 IF get%>15:ENDPROC
1240
1250 mem%=part%*128 + 8*(y%-4) + (x%-5) DIV 3
1260
1270 left%=data?mem% DIV 16
1280
1290 right%=data?mem% MOD 16
1300
1310
1320 IF (x%-5) MOD 3=0:left%=get% ELSE right%=get%
1330
1340 data?mem%=16*left%+right%
1350
1360 PROCdispline(y%-3)
1370
1380 VDU 31,x%,y%
1390
1400 PROCright
1410 ENDPROC
1420
1430 DEFPROCedit2
1440
1450 mem%=part%*128 + 8*(y%-4) + x%-30
1460
1470 data?mem%=get%
1480
1490 PROCdispline(y%-3)
1500
1510 VDU 31,x%,y%
1520
1530 PROCright
1540 ENDPROC
1550
1560 DEFPROCerr
1570
1580 PROChead
1590 PRINTTAB(0,5);CHR$129;bad$
1600 PRINTTAB(0,6);CHR$129;"result = &";STR$~res%
1610 PRINTTAB(0,8);CHR$133;"press SPACE for main menu"
1620 REPEAT UNTIL INKEY(100)=32
1630 ENDPROC
1640
1650 DEFPROCget
1660
1670 REPEAT
1680 get%=GET
1690
1700 IF get%=&8C:part%=part% EOR 1:PROCdispdata
1710
1720 IF get%=&8E:PROCwrite
1730
1740 IF get%=&88:PROCleft
1750 IF get%=&89:PROCright
1760 IF get%=&8A:PROCdown
1770 IF get%=&8B:PROCup
1780
1790 IF get%>&1F AND get%<&80:PROCedit
1800
1810
1820 UNTIL get%>&8C
1830 ENDPROC
1840
1850 DEFPROChead
1860
1870 CLS
1880 PRINTTAB(10,0);CHR$141;CHR$132;"DISK EDITOR"
1890 PRINTTAB(10,1);CHR$141;CHR$132;"DISK EDITOR"
1900 ENDPROC
1910
1920 DEFPROCleft
1930
1940 VDU 8
1950
1960 PROCcoord
1970
1980 IF x%<5 :VDU 31,37,y%:ENDPROC
1990
2000 IF x%>29:ENDPROC
2010 IF x%=28:VDU 8:ENDPROC
2020 IF x%=29:VDU 8,8:ENDPROC
2030
2040 IF (x%-4) MOD 3=0:VDU 8
2050 ENDPROC
2060
2070 DEFPROCmain
2080 VDU 23;11,0;0;0;0;
2090
2100
2110 PROCmenu
2120
2130 PROCseek(0)
2140
2150 PROCsectorids
2160
2170 IF res%<>0:ENDPROC
2180
2190 PROCwhichsec
2200
2210 PROCtrack(?sectab)
2220
2230 PROCread
2240
2250 IF res%<>0:ENDPROC
2260
2270 part%=0
2280
2290 VDU 23;10,0;0;0;0;
2300 VDU 23;11,255;0;0;0;
2310
2320 PROCdispdata
2330
2340 PROCget
2350 ENDPROC
2360
2370 DEFPROCmenu
2380
2390 @%=2
2400 PROChead
2410 REPEAT
2420 PRINTTAB(0,5);STRING$(38," ")
2430 PRINTTAB(0,5);CHR$130;"Enter track number (0 - ";maxtrack%;")";
2440 INPUT " > "track%
2450 UNTIL track%>-1 AND track%<maxtrack%+1
2460 ENDPROC
2470
2480 DEFPROCow(R%)
2490
2500
2510 A%=&7F
2520 X%=param
2530 Y%=X% DIV 256
2540 CALL osword
2550 res%=param?R%
2560 ENDPROC
2570
2580 DEFPROCread
2590
2600 param?0=drive% :
2610 param!1=data :
2620 param?5=3 :
2630 param?6=&57 :
2640 param?7=?sectab :
2650 param?8=sector% :
2660 param?9=&21 :
2670 PROCow(10)
2680
2690 del%=res% AND &20
2700
2710 res%=res% AND &1E
2720
2730 IF res%=0:ENDPROC
2740 bad$="sector "+STR$(sector%)+" bad read"
2750 PROCerr
2760 ENDPROC
2770 :
2780 DEFPROCright
2790
2800 VDU 9
2810
2820 PROCcoord
2830
2840 IF x%>37:VDU 31,5,y%:ENDPROC
2850 IF x%>29:ENDPROC
2860
2870 IF x%=28:VDU 9,9:ENDPROC
2880 IF x%=29:VDU 9:ENDPROC
2890 IF (x%-4) MOD 3=0:VDU 9
2900 ENDPROC
2910
2920 DEFPROCsectorids
2930
2940 param?0=drive% :
2950 param!1=sectab :
2960 param?5=3 :
2970 param?6=&5B :
2980 param?7=track% :
2990 param?8=0 :
3000 param?9=10 :
3010 PROCow(10)
3020
3030 IF res%=0:ENDPROC
3040 bad$="track "+STR$(track%)+" missing sector IDs"
3050 PROCerr
3060 ENDPROC
3070
3080 DEFPROCseek(T%)
3090
3100 param?0=drive% :
3110 param!1=&FFFF :
3120 param?5=1 :
3130 param?6=&69 :
3140 param?7=T% :
3150 PROCow(8)
3160
3170 IF res%=0:ENDPROC
3180 bad$="tack "+STR$(track%)+" missing"
3190 PROCerr
3200 ENDPROC
3210
3220 DEFPROCstring(num%)
3230
3240 str$=RIGHT$("0"+STR$~num%,2)
3250
3260
3270
3280
3290
3300 DEFPROCtrack(T%)
3310
3320 param?0=drive% :
3330 param!1=&FFFF :
3340 param?5=2 :
3350 param?6=&7A :
3360
3370 IF drive% MOD 2=1:reg%=&1A ELSE reg%=&12
3380 param?7=reg% :
3390 param?8=T% :
3400 PROCow(9)
3410 ENDPROC
3420
3430 DEFPROCup
3440
3450 VDU 11
3460
3470 PROCcoord
3480
3490 IF y%<4:VDU 31,x%,19
3500 ENDPROC
3510
3520 DEFPROCwhichsec
3530
3540 lowsec%=sectab?2
3550 FOR I%=1 TO 9
3560 IF sectab?((4*I%)+2)<lowsec%:lowsec%=sectab?((4*I%)+2)
3570 NEXT
3580
3590 PROChead
3600
3610 @%=2
3620 PRINT TAB(5,5);CHR$131;"you are positioned on"
3630 PRINT TAB(8,7);CHR$133;"physical track ";track%
3640 PRINT TAB(8,8);CHR$133;" logical track "?sectab
3650
3660 REPEAT
3670 PRINT TAB(0,10);STRING$(38," ")
3680 PRINT TAB(0,10);CHR$130;"enter sector number (";lowsec%;" - ";lowsec%+9;")";
3690 INPUT " > "sector%
3700 UNTIL sector%>lowsec%-1 AND sector%<lowsec%+10
3710 ENDPROC
3720
3730 DEFPROCwrite
3740
3750 param?0=drive% :
3760 param!1=data :
3770 param?5=3 :
3780
3790 IF del%<>0:code%=&4F ELSE code%=&4B
3800 param?6=code% :
3810 param?7=?sectab :
3820 param?8=sector% :
3830 param?9=&21 :
3840 PROCow(10)
3850 res%=res% AND &1E :
3860
3870 IF res%=0:ENDPROC
3880 bad$="sector "+STR$(sector%)+" bad write"
3890 PROCerr
3900 ENDPROC