Compucolor.org – Virtual Media

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