Listing of file='DSKZP2.BAS;01' on disk='vmedia/chip_27-sector.ccvf'
10 REM * DSKZP2 20 REM * THIS PROGRAM WAS ORIGINALLY CALLED 'DSKZAP'. 30 REM * IT HAS BEEN SLIGHTLY MODIFIED TO ALLOW THE 40 REM * OPTION OF NOT WRITING THE SECTOR BACK TO DISK 50 REM * OR WRITING IT TO ANY SECTOR ON EITHER DRIVE 60 REM * TO FACILITATE RECOVERY OF A CORRUPTED DISK. 70 REM * MODIFIED BY BRUCE MARSHALL ON 18NOV84. 80 REM * CUVIC, MELBOURNE, AUSTRALIA. 90 REM * THE PROGRAM HAS ALSO BEEN COMPILED AS DSKZP2.PRG 1000 GOTO 4000 1500 POKE SA+ 1,PEEK (SA+ 1)AND 191:POKE AA+ 1,PEEK (AA+ 1)AND 191 1510 POKE SA+ 3,PEEK (SA+ 3)AND 191 1520 RETURN 2000 REM CONVERT HEX STRING IN CI$ TO ARITH IN CO 2010 CO= 0 2020 IF MID$ (CI$,1,1)= "+"THEN CO= VAL (CI$):RETURN 2030 FOR I= 1TO LEN (CI$) 2040 C1= ASC (MID$ (CI$,I,1)) 2050 C2= 16 2060 IF C1> 47AND C1< 58THEN C2= C1- 48 2070 IF C1> 64AND C1< 71THEN C2= C1- 55:REM HEX A-F 2080 IF C2> 15THEN PRINT "HEX INPUT ERROR ";CI$:OUT 8,255:END 2090 CO= CO* 16+ C2 2100 NEXT I 2110 RETURN 2500 REM CONVERT ARITH VALUE IN HI(0-255) TO TWO HEX CHAR 2510 REM IN HO$ 2520 IF HI< 0THEN HI= HI+ 256 2530 H0= INT (HI/ 16)+ 48:IF H0> 57 THEN H0= H0+ 7 2540 H1= (HIAND 15)+ 48:IF H1> 57 THEN H1= H1+ 7 2550 HO$= CHR$ (H0)+ CHR$ (H1) 2560 RETURN 3000 REM CONVERT TWO-BYTE VALUE TO 4-BYTE HEX STRING 3010 IF DI< 0THEN DI= DI+ 65536 3020 HI= INT (DI/ 256):GOSUB 2500:DO$= HO$ 3030 HI= (DI- HI* 256):GOSUB 2500 3040 DO$= DO$+ HO$ 3050 RETURN 3500 REM ROUTINE TO LOAD MACHINE LANGUAGE PATCH TO READ 3510 REM KEYBOARD AS EACH KEY IS PRESSED. 3520 DATA 245,229,197,62,255,211,8 3530 DATA 1,206,40,205,36,0,202,-1,-1,11 3540 DATA 121,176,194,-1,-1,29,194,-1,-1,17,255,255,195 3550 DATA -1,-1,95,175,87,62,247,211,8,62,0 3560 DATA 50,255,129,193,225,241,201 3570 REM FIND END OF BASIC RAM 3580 TM= 256* PEEK (32941)+ PEEK (32940) 3590 REM CHECK TO SEE IF ALREADY LOADED 3600 IF TM> 65503THEN 3670:REM NOT LOADED 3610 RESTORE 3520 3620 FOR I= 1TO 48:READ A 3630 IF A> 0AND A< > PEEK (TM+ I)THEN I= 48:A= 999 3640 NEXT I 3650 IF A< 256THEN 3800:REM LOADED, TO SET JUMP 3660 REM LOAD PROGRAM 3670 TM= TM- 48:RESTORE 3520 3680 FOR I= 1TO 48:READ A:POKE TM+ I,A- (A< 0):NEXT I 3690 REM LOAD ADDRESSES 3700 Z= TM+ 33:AD= TM+ 15:GOSUB 3760 3710 Z= TM+ 11:AD= TM+ 21:GOSUB 3760 3720 Z= TM+ 8:AD= TM+ 25:GOSUB 3760 3730 Z= TM+ 36:AD= TM+ 31:GOSUB 3760 3740 GOTO 3780 3750 REM LOAD ADDRESS Z AT AD,AD+1 3760 ZZ= INT (Z/ 256):POKE AD,Z- 256* ZZ:POKE AD+ 1,ZZ:RETURN 3770 REM CHANGE END OF BASIC RAM 3780 Z= TM:AD= 32940:GOSUB 3760 3790 REM LOAD BASIC JUMP LOCATION 3800 Z= TM+ 1:AD= 33283:GOSUB 3760 3810 POKE 33282,195 3820 RETURN 4000 PLOT 6,3,27,24,12,14 4010 PRINT TAB( 26)"DISK ZAP 2" 4020 GOSUB 3500:REM LOAD KEYBOARD PATCH 4030 CLEAR 100 4040 PRINT :PLOT 15,6,2 4050 PRINT :PRINT :PRINT TAB( 15);:INPUT "DO YOU WANT INSTRUCTIONS (Y/N)? ";YN$ 4060 IF YN$= "Y"OR YN$= "y"THEN GOSUB 6000 4070 PLOT 12:PRINT 4075 PRINT TAB( 5)"IF YOU ONLY HAVE A SINGLE DRIVE, CHOOSE OPTION 0" 4080 PRINT :PRINT 4085 PRINT TAB( 10)"CHOOSE ONE OF THE FOLLOWING OPTIONS:" 4090 PRINT :PRINT TAB( 11)"0. READ AND WRITE USING DRIVE 0" 4095 PRINT :PRINT TAB( 11)"1. READ AND WRITE USING DRIVE 1" 4100 PRINT :PRINT TAB( 11)"2. READ FROM 0 AND WRITE TO 1" 4105 PRINT :PRINT TAB( 11)"3. READ FROM 1 AND WRITE TO 0" 4110 PRINT :PRINT 4115 PRINT TAB( 20);:INPUT "YOUR CHOICE ? ";DD$:PRINT "" 4117 IF DD$= ""THEN PLOT 28,28,11:GOTO 4115 4120 IF DD$< "0"OR DD$> "3"THEN PLOT 28,28,11:GOTO 4115 4125 PRINT :PRINT TAB( 5)"TO EXIT FROM PROGRAM ENTER EXIT AS THE SECTOR ADDRESS." 4130 PRINT :PRINT :PRINT TAB( 5)"AFTER READING A SECTOR, YOU WILL BE ASKED IF YOU WISH TO" 4135 PRINT "WRITE THE SECTOR BACK TO THE DISK IN THE CHOSEN DRIVE. YOU MAY" 4140 PRINT "CHOOSE THE SECTOR TO WRITE TO. RATHER THAN DO THIS EVERY TIME," 4145 PRINT "IF YOU WANT THE SAME SECTOR, SELECT ONE OF THE FOLLOWING: 4150 PRINT :PRINT TAB( 12)"1. WRITE TO SAME SECTOR AS READ." 4155 PRINT :PRINT TAB( 12)"2. WRITE TO ANY SPECIFIED SECTOR." 4160 PRINT :PRINT 4165 PRINT TAB( 20);:INPUT "YOUR CHOICE ? ";WS$:PRINT "" 4170 IF WS$= ""THEN PLOT 28,28,11:GOTO 4165 4175 IF WS$< > "1"AND WS$< > "2"THEN PLOT 28,28,11:GOTO 4165 4200 CD= PEEK (33010) 4210 IF DD$= "0"OR DD$= "2"THEN POKE 33010,48 4220 IF DD$= "1"OR DD$= "3"THEN POKE 33010,49 4230 PLOT 12 4240 PRINT " C A U T I O N " 4250 PRINT "THIS PROGRAM LETS YOU CHANGE ANY DISK DATA" 4260 PRINT "IN PLACE." 4270 PRINT "YOU PICK A SECTOR ADDRESS AND IT IS DISPLAYED" 4280 PRINT "ON THE SCREEN IN BOTH HEX AND ASCII" 4290 PRINT "YOU MOVE THE CURSOR OVER EITHER THE HEX OR ASCII" 4300 PRINT "DATA AND CHANGE IT AS DESIRED." 4310 PRINT "WHEN YOU HIT RETURN A PROMPT ASKS IF YOU WANT" 4320 PRINT "TO WRITE THE SECTOR BACK TO THE DISK, IF YOU" 4330 PRINT "ANSWER Y THEN THE SECTOR IS WRITTEN BACK." 4340 PRINT "THIS CAN BE USEFUL FOR PATCHING A DIRECTORY WHEN" 4350 PRINT "A DISK GETS AN ERROR IN THE MIDDLE OF A DELETE, ETC." 4360 PRINT 4370 INPUT "ENTER SECTOR ADDRESS AS HEX OR +DEC ";S$ 4380 IF S$= ""OR S$= "0"THEN S1= S1+ 1:S$= "+"+ STR$ (S1):GOTO 4480 4390 IF S$= "EXIT"THEN POKE 33010,CD:PLOT 15,12:END 4400 IF LEN (S$)> 3THEN 4460 4405 CI$= S$:GOSUB 2000:S1= CO 4410 FOR I= 1TO LEN (S$) 4420 SS(I)= ASC (MID$ (S$,I,1)) 4430 IF SS(I)> 47AND SS(I)< 58THEN 4470 4440 IF SS(I)> 64AND SS(I)< 71THEN 4470 4450 IF SS(I)= 43THEN 4470 4460 PLOT 28,11:GOTO 4370 4470 NEXT I 4480 PLOT 12 4490 SB= 28672:REM BASE FOR SCREEN REFRESH RAM 4500 CI$= S$:GOSUB 2000:AD= CO 4510 DI= AD:GOSUB 3000:S$= DO$ 4520 PRINT "SECTOR ADDRESS ";AD;"[";S$;"]" 4530 BF= PEEK (32986)+ 256* PEEK (32987) 4540 BF= INT ((BF+ 200+ 256)/ 256)* 256 4550 DI= BF:GOSUB 3000:BF$= DO$ 4560 DI= BF+ 127:GOSUB 3000 4570 BF$= BF$+ "-"+ DO$ 4580 FS$= "READ "+ S$+ " "+ BF$ 4590 PRINT :PRINT FS$ 4600 PLOT 27,4:PRINT FS$:PLOT 27,27 4610 SY= 6:SX= 0:REM INITIAL SCREEN WRITE POS 4620 PLOT 3,64,0 4630 FOR IP= BFTO BF+ 127STEP 16 4640 DI= IP- BF:GOSUB 3000 4650 SA= SB+ 2* (64* SY+ SX) 4660 AA= SA+ 92:POKE AA,42:POKE AA+ 34,42:AA= AA+ 2 4670 FOR N= 1TO 4 4680 POKE SA,ASC (MID$ (DO$,N,1)) 4690 SA= SA+ 2 4700 NEXT N 4710 SA= SA+ 4:REM " " 4720 FOR J1= 0TO 3 4730 FOR J2= 0TO 3 4740 BA= IP+ 4* J1+ J2:REM BYTE ADDRESS 4750 HI= PEEK (BA) 4760 GOSUB 2500 4770 POKE SA,ASC (LEFT$ (HO$,1)):SA= SA+ 2 4780 POKE SA,ASC (RIGHT$ (HO$,1)):SA= SA+ 2 4790 POKE AA,HI:AA= AA+ 2 4800 IF HI< 32 THEN POKE AA- 1,1:GOTO 4820 4810 IF HI> 96 THEN POKE AA- 1,1 4820 NEXT J2 4830 SA= SA+ 4 4840 NEXT J1 4850 SY= SY+ 1:SX= 0 4860 NEXT IP 4870 REM SETUP KEYBD READ 4880 PLOT 27,27 4890 SY= 6:SX= 6:PLOT 3,6,6:SA= SB+ 780:AA= SA+ 82:IP= BF:DX= 0:DY= 0 4900 GOTO 5730 4910 REM READ KEYBOARD 4920 KY= CALL (5):IF KY= - 1 THEN 4920 4930 IF KY= 10 THEN DY = 1:GOTO 5470 4940 IF KY= 28 THEN DY = - 1:GOTO 5470 4950 IF KY= 26 THEN DX = - 1:GOTO 5470 4960 IF KY= 25 THEN DX = 1:GOTO 5470 4970 IF KY= 9 THEN 5130 4980 IF KY= 13 THEN 5190 4990 IF SX> 46 THEN 5080 5000 IF KY< 48 OR KY> 70 OR (KY< 65AND KY> 57) THEN 4910 5010 POKE SA,KY 5020 N= SX AND - 2:N= SB+ 2* (64* SY+ N) 5030 CI$= CHR$ (PEEK (N))+ CHR$ (PEEK (N+ 2)):GOSUB 2000 5040 POKE N+ 1,34:POKE N+ 3,34:POKE IP,CO:POKE AA,CO:POKE AA+ 1,34 5050 IF (CO< 32) OR (CO> 96) THEN POKE AA+ 1,33 5060 REM TESTHI=KY:GOSUB51000:PLOT 27,12,3,40,30:PRINTKY;" ";HO$ 5070 GOTO 5650 5080 REM ALPHA UPD 5090 POKE AA,KY:POKE AA+ 1,34:POKE IP,KY:HI= KY:GOSUB 2500 5100 IF HI< 32 OR HI> 96 THEN POKE AA+ 1,33 5110 POKE SA,ASC (LEFT$ (HO$,1)):POKE SA+ 1,34:POKE SA+ 2,ASC (RIGHT$ (HO$,1)):POKE SA+ 3,34 5120 GOTO 5060 5130 REM : TAB KEY 5140 IF SX> 46 THEN 5170 5150 GOSUB 1500:N= INT ((SX- 6)/ 10):SA= 4* INT (SA/ 4) 5160 SX= 47+ 4* N+ INT (((SX- 6)- 10* N)/ 2):GOTO 5730 5170 GOSUB 1500:N= INT ((SX- 47)/ 4) 5180 SX= 6+ 10* N+ (SX- 47- 4* N)* 2:GOTO 5730 5190 REM : RETURN/ENTER 5200 PLOT 3,0,20 5210 PRINT "WRITE SECTOR BACK TO DISK (Y/N)? "; 5220 KY= CALL (5):PLOT 27,4,27,27 5230 IF KY= 89OR KY= 121THEN PRINT CHR$ (KY):GOTO 5255 5240 IF KY= 78OR KY= 110THEN PRINT CHR$ (KY):GOTO 5460 5250 GOTO 5220 5255 IF WS$= "1"THEN 5410 5260 PRINT :PRINT 5265 W$= "" 5270 INPUT "ENTER WRITE SECTOR AS HEX OR +DEC ";W$ 5280 IF W$= ""OR W$= "0"THEN 5410 5290 IF W$= "EXIT"THEN POKE 33010,CD:PLOT 15,12:END 5300 IF LEN (W$)> 3THEN 5360 5310 FOR I= 1TO LEN (W$) 5320 SS(I)= ASC (MID$ (W$,I,1)) 5330 IF SS(I)> 47AND SS(I)< 58THEN 5370 5340 IF SS(I)> 64AND SS(I)< 71THEN 5370 5350 IF SS(I)= 43THEN 5370 5360 PLOT 28,11:GOTO 5270 5370 NEXT I 5380 S$= W$ 5390 CI$= S$:GOSUB 2000:AD= CO 5400 DI= AD:GOSUB 3000:S$= DO$ 5410 IF DD$= "0"OR DD$= "1"THEN FS$= "WRITE "+ S$+ " "+ BF$ 5420 IF DD$= "3"THEN FS$= "WRITE0:"+ S$+ " "+ BF$ 5430 IF DD$= "2"THEN FS$= "WRITE1:"+ S$+ " "+ BF$ 5440 PLOT 3,0,2,11:PRINT FS$ 5450 PLOT 27,4:PRINT FS$:PLOT 27,27 5460 PLOT 3,0,30:GOTO 4370 5470 REM :CURSOR DIRECTION KEYS 5480 IF DY = 0 THEN 5540 5490 IF DY> 0 THEN 5520 5500 IF SY< 7 THEN 4910:REM -Y 5510 GOSUB 1500:SY= SY- 1:SA= SA- 128:AA= AA- 128:IP= IP- 16:GOTO 5730 5520 IF SY> 12 THEN 5730:REM +Y 5530 GOSUB 1500:SY= SY+ 1:SA= SA+ 128:AA= AA+ 128:IP= IP+ 16:GOTO 5730 5540 IF DX= 0 THEN 4910:REM CUR X 5550 IF DX> 0 THEN 5650 5560 IF SX< 7 THEN 4910:REM -X 5570 GOSUB 1500 5580 IF SX= 47 THEN SX= 42:SA= SA+ 72:AA= AA- 30:IP= IP+ 15:GOTO 5730 5590 IF SX< 44 THEN 5620 5600 N= SX- 46:IF (N AND 3) = 0 THEN SA = SA - 4 5610 SX= SX- 1:SA= SA- 4:AA= AA- 2:IP= IP- 1:GOTO 5730 5620 N= SX- 16:IF INT (N/ 10)= N/ 10 THEN SX= SX- 2:SA= SA- 4 5630 SX= SX- 1:SA= SA- 2:IF (SX AND 1)= 1 THEN AA= AA- 2:IP= IP- 1 5640 GOTO 5730 5650 GOSUB 1500:IF SX= 62 THEN SX= 6:SA= SA- 72:AA= AA- 30:IP= IP- 15:GOTO 5520:REM +X 5660 IF SX= 43 THEN SX= 47:SA= SA- 74:AA= AA- 30:IP= IP- 15:GOTO 5730 5670 IF SX< 44 THEN 5700 5680 N= SX- 46:IF (N AND 3) = 0 THEN SA = SA + 4 5690 SX= SX+ 1:SA= SA+ 4:AA= AA+ 2:IP= IP+ 1:GOTO 5730 5700 N= SX- 13:IF INT (N/ 10)= N/ 10 THEN SX= SX+ 2:SA= SA+ 4 5710 SX= SX+ 1:SA= SA+ 2:IF (SX AND 1)= 0 THEN AA= AA+ 2:IP= IP+ 1 5720 GOTO 5730 5730 REM COMMON MOVE CURSOR 5740 HI= PEEK (IP):GOSUB 2500 5750 GOTO 5770:REM BYPASS DIAG AID 5760 PLOT 27,12,3,0,30:PRINT "SX/SY/SA/AA/IP ";SX;" ";SY;" ";SA;" ";AA;" ";IP;" ";HO$;" " 5770 IF SX> 46 THEN POKE SA+ 1,PEEK (SA+ 1) OR 64:POKE SA+ 3,PEEK (SA+ 3)OR 64:GOTO 5790 5780 POKE AA+ 1,PEEK (AA+ 1) OR 64 5790 DX= 0:DY= 0:PLOT 3,SX,SY:GOTO 4910 6000 PLOT 6,3,12,14 6010 PRINT TAB( 27)"DISK ZAP 2" 6020 PRINT :PLOT 15,6,2 6030 PRINT TAB( 5)"THIS PROGRAM WILL READ A DISK, ONE SECTOR AT A TIME, FROM" 6040 PRINT :PRINT "EITHER DRIVE AND WRITE IT, IF DESIRED, BACK TO THAT DISK OR TO" 6050 PRINT :PRINT "A DISK IN THE OTHER DRIVE. THE USER ALSO HAS THE OPTION OF" 6060 PRINT :PRINT "WRITING TO A DIFFERENT SECTOR THAN THAT WHICH WAS READ. FOR" 6070 PRINT :PRINT "EXAMPLE: YOU MAY READ SAY SECTOR 2A ON DRIVE 0 AND WRITE IT" 6080 PRINT :PRINT "BACK TO DRIVE 1 AS SAY SECTOR 56. ANY COMBINATION IS POSSIBLE." 6090 PRINT :PRINT "THE ONLY RESTRICTION IS THAT IF YOU WISH TO WRITE TO SECTOR 0," 6100 PRINT :PRINT TAB( 14)"YOU MUST SPECIFY IT AS SECTOR 00." 6110 PRINT :PRINT TAB( 5)"THIS IS BECAUSE OF A PECULIARITY WITH THE COMPILER." 6120 PRINT :PRINT :PRINT TAB( 5)"IF, WHEN ASKED WHICH SECTOR YOU WISH TO WRITE TO, YOU" 6130 PRINT :PRINT "SIMPLY PRESS <RETURN> THE PROGRAM WILL WRITE BACK TO THE SECTOR" 6140 PRINT :PRINT TAB( 25)"WHICH WAS READ." 6150 PRINT :PRINT :PRINT TAB( 19);:INPUT "PRESS RETURN TO CONTINUE";ZZ$:PLOT 12 6160 PRINT :PRINT :PRINT TAB( 5)"WHEN STEPPING THROUGH THE READOUT WITH THE CURSOR CONTROL" 6170 PRINT :PRINT "KEYS, YOU MAY EDIT EITHER THE HEX PAIRS OR THE ASCII CHARACTERS" 6180 PRINT :PRINT "ON THE RIGHT. THE VISIBLE CURSOR WILL ORIGINALLY BE POSITIONED" 6190 PRINT :PRINT "ON THE HEX PAIRS AND YOU MAY MOVE ABOUT THEM IN ANY DIRECTION" 6200 PRINT :PRINT "USING THE CURSOR CONTROL KEYS, EDITING THE ALPHANUMERICS ON AN" 6210 PRINT :PRINT "INDIVIDUAL BASIS." 6220 PRINT :PRINT :PRINT TAB( 5)"WHEN THE CURSOR IS MOVED TO THE RIGHT, OFF THE HEX DISPLAY" 6230 PRINT :PRINT "IT WILL MOVE ONTO THE ASCII DISPLAY AND THIS CAN THEN BE EDITED" 6240 PRINT :PRINT "DIRECTLY FROM THE KEYBOARD. NOTE, HOWEVER, THAT YOU CANNOT" 6250 PRINT :PRINT "RETURN TO THE HEX DISPLAY AFTER MOVING TO THE ASCII DISPLAY. IF" 6260 PRINT :PRINT "THIS IS REQUIRED THEN WRITE WHAT YOU HAVE DONE TO THE DISK AND" 6270 PRINT :PRINT "LOAD THAT SECTOR AGAIN." 6280 PRINT :PRINT :PRINT TAB( 19);:INPUT "PRESS RETURN TO CONTINUE";ZZ$:PLOT 12 6290 PRINT :PRINT TAB( 5)"WHEN YOU ARE ASKED WHICH SECTOR YOU WISH TO READ, IF YOU" 6300 PRINT :PRINT "SIMPLY PRESS <RETURN> THE PROGRAM WILL READ THE NEXT SECTOR." 6310 PRINT :PRINT :PRINT " THIS ALLOWS YOU TO STEP THROUGH THE DISK QUICKLY AND EASILY." 6320 PRINT :PRINT :PRINT 6330 PRINT :PRINT :PRINT TAB( 19);:INPUT "PRESS RETURN TO CONTINUE";ZZ$ 6340 RETURN