Compucolor.org – Virtual Media

Listing of file='DSKZAP.BAS;01' on disk='vmedia/selective_utilities-sector.ccvf'

1000 PLOT 6,2,27,24,12
1003 PRINT
1005 PRINT "                 C A U T I O N "
1010 PRINT "THIS PROGRAM LETS YOU CHANGE ANY DISK DATA"
1020 PRINT "IN PLACE."
1030 PRINT "YOU PICK A SECTOR ADDRESS AND IT IS DISPLAYED"
1040 PRINT "ON THE SCREEN IN BOTH HEX AND ASCII"
1050 PRINT "YOU MOVE THE CURSOR OVER EITHER THE HEX OR ASCII"
1060 PRINT "DATA AND CHANGE IT AS DESIRED."
1070 PRINT "WHEN YOU HIT RETURN THE SECTOR IS WRITTEN BACK"
1080 PRINT "THIS CAN BE USEFUL FOR PATCHING A DIRECTORY WHEN"
1090 PRINT "A DISK GETS AN ERROR IN THE MIDDLE OF A DELETE, ETC."
1100 PRINT :PRINT "NOTE - IF YOU DO NOT ENTER + FIRST, THE NUMBER IS"
1110 PRINT "TAKEN AS HEXADECIMAL.":PRINT
1117 GOSUB 58000:REM  LOAD KEYBOARD PATCH
1118 CLEAR 100
1120 PRINT "TO READ DRIVE 1 & WRITE DRIVE 0 - ENTER 1,"
1125 INPUT "PRESS ENTER ONLY FOR SINGLE DISK - ";X
1140 REM  THIS SELECTION ENABLES WRITE PROTECTION.
1210 PRINT
1230 U= PEEK (33010):REM  DRIVE SELECTION
1240 IF U= 48THEN Q$= "0:":W$= "0:"
1250 IF U= 49THEN Q$= "1:":W$= "1:"
1260 IF X= 1THEN Q$= "1:":W$= "0:"
1400 INPUT "ENTER SECTOR ADDRESS AS HEX OR +DEC - ";S$
1410 PLOT  12
1420 SB= 28672:REM 	BASE FOR SCREEN REFRESH RAM
1600 CI$= S$:GOSUB 50000:AD= CO
1700 DI= AD:GOSUB 52000:S$= DO$
2000 PRINT "SECTOR ADDRESS ";AD;"[";S$;"]"
2200 BF= PEEK (32986)+ 256* PEEK (32987)
2400 BF= INT ((BF+ 200+ 256)/ 256)* 256
2600 DI= BF:GOSUB 52000:BF$= DO$
2800 DI= BF+ 127:GOSUB 52000
3000 BF$= BF$+ "-"+ DO$
3600 FS$= "READ"+ Q$+ S$+ " "+ BF$
3800 PRINT FS$
4000 PLOT 27,4:PRINT FS$:PLOT 27,27
4300 SY= 6:SX= 0:REM 	INITIAL SCREEN WRITE POS
4400 PLOT  3,64,0
5000 FOR IP= BFTO BF+ 127STEP 16
5200 DI= IP- BF:GOSUB 52000
5400 SA= SB+ 2* (64* SY+ SX)
5405 AA= SA+ 92:POKE  AA,42:POKE  AA+ 34,42:AA= AA+ 2
5410 FOR N= 1TO 4
5430 POKE  SA,ASC (MID$ (DO$,N,1))
5440 SA= SA+ 2
5450 NEXT N
5460 SA= SA+ 4:REM 	" "
6000 FOR J1= 0TO 3
6200 FOR J2= 0TO 3
6400 BA= IP+ 4* J1+ J2:REM 	BYTE ADDRESS
7000 HI= PEEK (BA)
7200 GOSUB 51000
7400 POKE  SA,ASC (LEFT$ (HO$,1)):SA= SA+ 2
7410 POKE  SA,ASC (RIGHT$ (HO$,1)):SA= SA+ 2
7420 POKE  AA,HI:AA= AA+ 2
7430 IF  HI< 32 THEN POKE  AA- 1,1:GOTO 7600
7440 IF  HI> 96 THEN POKE  AA- 1,1
7600 NEXT J2
7800 SA= SA+ 4
8000 NEXT J1
8200 SY= SY+ 1:SX= 0
8600 NEXT IP
10000 REM SETUP KEYBD READ
10050 PLOT  27,27
10100 SY= 6:SX= 6:PLOT  3,6,6:SA= SB+ 780:AA= SA+ 82:IP= BF:DX= 0:DY= 0
10200 GOTO 31500
15000 REM  READ KEYBOARD
15100 KY= CALL (5):IF KY= - 1 THEN 15100
15200 IF  KY= 10 THEN DY =  1:GOTO 30000
15300 IF  KY= 28 THEN DY =  -  1:GOTO 30000
15400 IF  KY= 26 THEN DX =  -  1:GOTO 30000
15500 IF  KY= 25 THEN DX =  1:GOTO 30000
15505 IF  KY= 9 THEN  17000
15507 IF  KY= 13 THEN  18000
15510 IF  SX> 46 THEN  16000
15520 IF  KY< 48 OR  KY> 70 OR  (KY< 65AND KY> 57) THEN  15000
15600 POKE  SA,KY
15610 N= SX AND  - 2:N= SB+ 2* (64* SY+ N)
15615 CI$= CHR$ (PEEK (N))+ CHR$ (PEEK (N+ 2)):GOSUB 50000
15620 POKE  N+ 1,34:POKE  N+ 3,34:POKE  IP,CO:POKE  AA,CO:POKE  AA+ 1,34
15630 IF  (CO< 32) OR  (CO> 96) THEN POKE  AA+ 1,33
15700 REM TESTHI=KY:GOSUB51000:PLOT 27,12,3,40,30:PRINTKY;" ";HO$
15800 GOTO 31300
16000 REM 	ALPHA UPD
16010 POKE  AA,KY:POKE  AA+ 1,34:POKE  IP,KY:HI= KY:GOSUB  51000
16015 IF  HI< 32 OR  HI> 96 THEN POKE  AA+ 1,33
16020 POKE  SA,ASC (LEFT$ (HO$,1)):POKE  SA+ 1,34:POKE  SA+ 2,ASC (RIGHT$ (HO$,1)):POKE  SA+ 3,34
16030 GOTO  15700
17000 REM :	TAB KEY
17010 IF  SX> 46 THEN  17100
17020 GOSUB  31900:N= INT ((SX- 6)/ 10):SA= 4* INT (SA/ 4)
17030 SX= 47+ 4* N+ INT (((SX- 6)- 10* N)/ 2):GOTO  31500
17100 GOSUB  31900:N= INT ((SX- 47)/ 4)
17110 SX= 6+ 10* N+ (SX- 47- 4* N)* 2:GOTO  31500
18000 REM :	RETURN/ENTER
18010 FS$= "WRITE"+ W$+ S$+ " "+ BF$
18020 PLOT  3,0,1,11:PRINT FS$
18030 PLOT 27,4:PRINT FS$:PLOT 27,27
18040 PLOT  3,0,30:GOTO  1400
30000 REM :CURSOR DIRECTION KEYS
30100 IF  DY =  0 THEN 30700
30200 IF  DY> 0 THEN 30500
30300 IF  SY< 7 THEN 15000:REM 	-Y
30400 GOSUB 31900:SY= SY- 1:SA= SA- 128:AA= AA- 128:IP= IP- 16:GOTO 31500
30500 IF  SY> 12 THEN 31500:REM +Y
30600 GOSUB 31900:SY= SY+ 1:SA= SA+ 128:AA= AA+ 128:IP= IP+ 16:GOTO 31500
30700 IF  DX= 0 THEN 15000:REM 	CUR X
30800 IF  DX> 0 THEN 31300
30900 IF  SX< 7 THEN 15000:REM 	-X
30950 GOSUB  31900
31000 IF  SX= 47 THEN  SX= 42:SA= SA+ 72:AA= AA- 30:IP= IP+ 15:GOTO 31500
31005 IF  SX< 44 THEN  31100
31010 N= SX- 46:IF  (N AND  3) =  0 THEN  SA =  SA - 4
31020 SX= SX- 1:SA= SA- 4:AA= AA- 2:IP= IP- 1:GOTO  31500
31100 N= SX- 16:IF  INT (N/ 10)= N/ 10 THEN SX= SX- 2:SA= SA- 4
31200 SX= SX- 1:SA= SA- 2:IF  (SX AND  1)= 1 THEN  AA= AA- 2:IP= IP- 1
31205 GOTO  31500
31300 GOSUB  31900:IF  SX= 62 THEN  SX= 6:SA= SA- 72:AA= AA- 30:IP= IP- 15:GOTO 30500:REM 	+X
31303 IF  SX= 43 THEN  SX= 47:SA= SA- 74:AA= AA- 30:IP= IP- 15:GOTO 31500
31305 IF  SX< 44 THEN  31400
31310 N= SX- 46:IF  (N AND  3) =  0 THEN  SA =  SA + 4
31320 SX= SX+ 1:SA= SA+ 4:AA= AA+ 2:IP= IP+ 1:GOTO  31500
31400 N= SX- 13:IF  INT (N/ 10)= N/ 10 THEN SX= SX+ 2:SA= SA+ 4
31450 SX= SX+ 1:SA= SA+ 2:IF  (SX AND  1)= 0 THEN  AA= AA+ 2:IP= IP+ 1
31455 GOTO  31500
31500 REM 	COMMON MOVE CURSOR
31540 HI= PEEK (IP):GOSUB  51000
31549 GOTO  31600:REM 	BYPASS DIAG AID
31550 PLOT  27,12,3,0,30:PRINT "SX/SY/SA/AA/IP ";SX;" ";SY;" ";SA;" ";AA;" ";IP;" ";HO$;"   "
31600 IF  SX> 46 THEN POKE  SA+ 1,PEEK (SA+ 1) OR  64:POKE  SA+ 3,PEEK (SA+ 3)OR  64:GOTO 31800
31700 POKE  AA+ 1,PEEK (AA+ 1) OR  64
31800 DX= 0:DY= 0:PLOT  3,SX,SY:GOTO 15000
31900 POKE  SA+ 1,PEEK (SA+ 1)AND  191:POKE  AA+ 1,PEEK (AA+ 1)AND  191
32000 POKE  SA+ 3,PEEK (SA+ 3)AND  191
32100 RETURN
50000 REM  CONVERT HEX STRING IN CI$ TO ARITH  IN CO
50010 CO= 0
50020 IF MID$ (CI$,1,1)= "+"THEN CO= VAL (CI$):RETURN
50030 FOR I= 1TO LEN (CI$)
50040 C1= ASC (MID$ (CI$,I,1))
50050 C2= 16
50060 IF C1> 47AND C1< 58THEN C2= C1- 48
50070 IF C1> 64AND C1< 71THEN C2= C1- 55:REM  HEX A-F
50080 IF C2> 15THEN PRINT "HEX INPUT ERROR ";CI$:OUT  8,255:END
50090 CO= CO* 16+ C2
50100 NEXT I
50110 RETURN
51000 REM  CONVERT ARITH VALUE IN HI(0-255) TO TWO HEX CHAR
51010 REM  IN HO$
51020 IF HI< 0THEN HI= HI+ 256
51030 H0= INT (HI/ 16)+ 48:IF  H0> 57 THEN H0= H0+ 7
51040 H1= (HIAND 15)+ 48:IF  H1> 57 THEN H1= H1+ 7
51060 HO$= CHR$ (H0)+ CHR$ (H1)
51070 RETURN
52000 REM  CONVERT TWO-BYTE VALUE TO 4-BYTE HEX STRING
52010 IF DI< 0THEN DI= DI+ 65536
52020 HI= INT (DI/ 256):GOSUB 51000:DO$= HO$
52030 HI= (DI- HI* 256):GOSUB 51000
52040 DO$= DO$+ HO$
52050 RETURN
58000 REM  ROUTINE TO LOAD MACHINE LANGUAGE PATCH TO READ
58010 REM  KEYBOARD AS EACH KEY IS PRESSED.
58110 DATA 245,229,197,62,255,211,8
58111 DATA 1,206,40,205,36,0,202,-1,-1,11
58120 DATA 121,176,194,-1,-1,29,194,-1,-1,17,255,255,195
58130 DATA -1,-1,95,175,87,62,247,211,8,62,0
58131 DATA 50,255,129,193,225,241,201
58140 REM  FIND END OF BASIC RAM
58150 TM= 256* PEEK (32941)+ PEEK (32940)
58170 REM  CHECK TO SEE IF ALREADY LOADED
58180 IF TM> 65503THEN 58250:REM 	NOT LOADED
58190 RESTORE 58110
58200 FOR I= 1TO 48:READ A
58210 IF A> 0AND A< > PEEK (TM+ I)THEN I= 48:A= 999
58220 NEXT I
58230 IF A< 256THEN 58390:REM 		LOADED, TO SET JUMP
58240 REM  LOAD PROGRAM
58250 TM= TM- 48:RESTORE 58110
58270 FOR I= 1TO 48:READ A:POKE TM+ I,A- (A< 0):NEXT I
58280 REM  LOAD ADDRESSES
58290 Z= TM+ 33:AD= TM+ 15:GOSUB 58350
58300 Z= TM+ 11:AD= TM+ 21:GOSUB 58350
58310 Z= TM+ 8:AD= TM+ 25:GOSUB 58350
58320 Z= TM+ 36:AD= TM+ 31:GOSUB 58350
58330 GOTO 58370
58340 REM  LOAD ADDRESS Z AT AD,AD+1
58350 ZZ= INT (Z/ 256):POKE AD,Z- 256* ZZ:POKE AD+ 1,ZZ:RETURN
58360 REM  CHANGE END OF BASIC RAM
58370 Z= TM:AD= 32940:GOSUB 58350
58380 REM  LOAD BASIC JUMP LOCATION
58390 Z= TM+ 1:AD= 33283:GOSUB 58350
58400 POKE 33282,195
58420 RETURN