home *** CD-ROM | disk | FTP | other *** search
/ Nibble Magazine / nib29b.dsk / DISK.RESCUE.bas < prev    next >
BASIC Source File  |  2023-02-26  |  20KB  |  223 lines

  1. 10  REM  **********************
  2. 20  REM  *    DISK.RESCUE     *
  3. 30  REM  * BY PRESTON BLACK,MD*
  4. 40  REM  * COPYRIGHT (C) 1986 *
  5. 50  REM  * BY MICROSPARC, INC *
  6. 60  REM  * CONCORD, MA  01742 *
  7. 70  REM  **********************
  8. 80  TEXT : HOME : HIMEM: 36096
  9. 90 D$ =  CHR$(4):MARKER = 0:BEGIN = 36096:FINDTSL7 = 36217:SAVFILE = 36366:UPDTE = 36604:TINIT = 36760:HEXOUT = 36898:TRACK = 37262:SECTR = 37264:FCOUNT = 37260:VOLUME = 11:ICMD = 918:ITRK = 910:ISEC = 911:RWTS = 896:P1 =  -1:SLOT = 43626:DRIVE = 43624
  10. 100  DIM TS(15),TYPE$(4):TYPE$(0) = "TEXT":TYPE$(1) = "INTEGER BASIC":TYPE$(2) = "APPLESOFT":TYPE$(4) = "BINARY":FSVE = 37263:YSVE1 = 37259:NAME = 37267:F9 = 36259:TW$ = "XX":SW$ = "XX":TK$ = "XX":SR$ = "XX":P2 = 0:BS =  PEEK(SLOT):BD =  PEEK(DRIVE)
  11. 110  TEXT : HOME : INVERSE : PRINT "** DISK RESCUE BY PRESTON R. BLACK,MD **" SPC( 120)"** COPYRIGHT 1986 BY MICROSPARC, INC. **": NORMAL 
  12. 120  POKE 34,5
  13. 130  VTAB 3: INVERSE : PRINT "SLOT=" PEEK(SLOT)" ";: HTAB 33: PRINT " DRIVE=" PEEK(DRIVE): NORMAL 
  14. 140 P1 = P1 +1: IF P1 < >0  THEN 180
  15. 150  FOR I = 0 TO 46: READ K: POKE 880 +I,K: NEXT : DATA  176,7,169,0,133,11,76,125,3,169,1,133,11,96,0,0,169,3,160,138,32,217,3,76,112,3,1,96,1,0,17,15,155,3,0,149,0,0,1,0,254,96,2,0,1,239,216
  16. 160 EF = 1: HOME : ONERR  GOTO 2130
  17. 170  PRINT D$"BLOAD PHOENIX,S"BS",D"BD
  18. 180  VTAB 7: PRINT "YOUR OPTIONS ARE: "
  19. 190  PRINT : PRINT 
  20. 200  HTAB 5: PRINT "<1> READ A SECTOR INTO MEMORY"
  21. 210  HTAB 5: PRINT "<2> VIEW THE SECTOR IN MEMORY"
  22. 220  HTAB 5: PRINT "<3> SCAN A DISK"
  23. 230  HTAB 5: PRINT "<4> RESURRECT CLOBBERED DISKETTE"
  24. 240  HTAB 5: PRINT "<5> RESURRECT A CLOBBERED TRACK"
  25. 250  HTAB 5: PRINT "<6> INITIALIZE ONE TRACK"
  26. 260  HTAB 5: PRINT "<7> CHANGE SLOT/DRIVE"
  27. 270  HTAB 5: PRINT "<8> EXIT PROGRAM"
  28. 280  VTAB 22: HTAB 1: PRINT "YOUR CHOICE IS: ";: GET A$: IF A$ =  CHR$(13)  THEN 300
  29. 290  PRINT A$
  30. 300  IF A$ <"1"  OR A$ >"8"  THEN  PRINT  CHR$(7): VTAB 22: HTAB 16: CALL  -868: GOTO 280
  31. 310 A =  VAL(A$): IF A = 8  THEN  HOME : VTAB 12: INPUT "ARE YOU SURE YOU WANT TO QUIT? ";AN$: ON AN$ < >"Y"  AND AN$ < > CHR$(121) GOTO 110: TEXT : POKE SLOT,BS: POKE DRIVE,BD: HOME : END 
  32. 320  ON A GOTO 380,480,1680,530,1120,1910,1030
  33. 330 H$ = "":N$ = "0123456789ABCDEF":H% = D/16:H$ =  MID$ (N$,H% +1,1) + MID$ (N$,D -H% *16 +1,1): IF  LEN(H$) = 1  THEN H$ = "0" +H$: RETURN 
  34. 340 D = 0: FOR J = 1 TO  LEN(H$):Z =  ASC( MID$ (H$,J,1)) -48: IF Z >9  THEN Z = Z -7
  35. 350  IF Z <0  OR Z >15  THEN D =  -1: RETURN 
  36. 360 D = 16 *D +Z: NEXT : RETURN 
  37. 370  POKE ICMD,CMD: POKE ITRK,TK: POKE ISEC,SR: POKE 907,(SX *16): POKE 908,DX: CALL RWTS: RETURN 
  38. 380 EF = 2: ONERR  GOTO 2130
  39. 390  TEXT : HOME : INVERSE : PRINT  SPC( 40)" DISK RESCUE -------------- READ SECTOR " SPC( 40): NORMAL : POKE 34,4: HOME : REM  14 -'S
  40. 400  VTAB 7: HTAB 1: INPUT "TRACK TO BE READ (IN HEX): ";H$: IF H$ = ""  THEN  PRINT  CHR$(7): GOTO 400
  41. 410 TK$ = H$: GOSUB 340:TK = D: IF TK <0  OR TK > = 35  THEN  PRINT  CHR$(7): VTAB 7: HTAB 27: CALL  -868: GOTO 400
  42. 420  VTAB 9: HTAB 1: INPUT "SECTOR TO BE READ (IN HEX): ";H$: IF H$ = ""  THEN  PRINT  CHR$(7): GOTO 420
  43. 430 SR$ = H$: GOSUB 340:SR = D: IF SR <0  OR SR >15  THEN  PRINT  CHR$(7): VTAB 9: HTAB 28: CALL  -868: GOTO 420
  44. 440  IF  LEN(SR$) = 1  THEN SR$ = "0" +SR$
  45. 450  IF  LEN(TK$) = 1  THEN TK$ = "0" +TK$
  46. 460 CMD = 1:SX =  PEEK(SLOT):DX =  PEEK(DRIVE): GOSUB 370
  47. 470  HOME : VTAB 15: HTAB 2: PRINT "TRACK $"TK$" - SECTOR $"SR$" READ INTO MEMORY": VTAB 22: HTAB 1: PRINT "PRESS <RETURN> TO CONTINUE";: GET Z$: PRINT :P2 = 1::TW$ = TK$:SW$ = SR$:RF = 1: GOTO 110
  48. 480 EF = 3: ONERR  GOTO 2130
  49. 490  IF RF < >1  THEN  HOME : VTAB 12: PRINT "NO SECTOR IN MEMORY": VTAB 22: PRINT "PRESS <RETURN> TO CONTINUE";: GET Z$: PRINT : HOME : GOTO 180
  50. 500  IF  LEN(TK$) = 1  THEN TK$ = "0" +TK$
  51. 510  IF  LEN(SR$) = 1  THEN SR$ = "0" +SR$
  52. 520  TEXT : HOME : INVERSE : PRINT  SPC( 40)" DISK RESCUE ----- TRACK "TK$" - SECTOR "SR$; SPC( 41): NORMAL : POKE 34,4: VTAB 5: CALL HEXOUT: PRINT : PRINT "PRESS <RETURN> TO RETURN TO MENU. ";: GET A$: PRINT : GOTO 110
  53. 530 EF = 4: ONERR  GOTO 2130
  54. 540  TEXT : HOME : VTAB 12: INVERSE : PRINT "WARNING!";: NORMAL : PRINT " THIS OPTION DESTROYS THE VTOC": PRINT "BEFORE IT RECREATES IT."
  55. 550  PRINT : PRINT "BE SURE PROPER DISK IS IN THE DRIVE.": VTAB 21: PRINT "<RETURN> TO CONTINUE, <ESC> FOR MENU";: GET Z$: PRINT : IF Z$ =  CHR$(27) GOTO 110
  56. 560  TEXT : HOME : INVERSE : PRINT  SPC( 40)" DISK RESCUE -------------- RESURRECTOR " SPC( 40): NORMAL : POKE 34,4: REM  14 -'S
  57. 570  POKE 34,7: HOME : PRINT " SLOT NUMBER (DEFAULT=" PEEK(SLOT);: INPUT "): ";A$
  58. 580  IF A$ = ""  THEN S1 =  PEEK(SLOT): VTAB 8: HTAB 13: CALL  -868: VTAB 8: HTAB 14: PRINT S1: GOTO 620
  59. 590  IF A$ >"0"  AND A$ < = "7" GOTO 610
  60. 600  PRINT  CHR$(7): HOME : GOTO 570
  61. 610 S1 =  VAL(A$): VTAB 8: HTAB 13: CALL  -868: VTAB 8: HTAB 14: PRINT A$
  62. 620  POKE 34,9: VTAB 10: PRINT "DRIVE NUMBER (DEFAULT=" PEEK(DRIVE);: INPUT "): ";A$
  63. 630  IF A$ = ""  THEN D1 =  PEEK(DRIVE): VTAB 10: HTAB 13: CALL  -868: VTAB 10: HTAB 14: PRINT D1: GOTO 660
  64. 640  IF A$ <"1"  OR A$ >"2"  THEN  PRINT  CHR$(7): HOME : GOTO 620
  65. 650 D1 =  VAL(A$): VTAB 10: HTAB 13: CALL  -868: VTAB 10: HTAB 14: PRINT A$
  66. 660  POKE 34,12: HOME : PRINT : PRINT "INPUT THE VOLUME NUMBER OF THE"
  67. 670  HTAB 1: INPUT "FOR THE RESURRECTED DISK (1-254): ";A$:A =  VAL(A$): IF A > = 1  AND A < = 254  THEN  POKE VOLUME,A: GOTO 690
  68. 680  PRINT  CHR$(7): VTAB 7: HTAB 33: CALL  -868: GOTO 660
  69. 690  PRINT : PRINT "PRESS <RETURN> TO BEGIN THE": PRINT "RESURRECTION OF THE DISKETTE!": PRINT : PRINT "PRESS <ESC> TO RETURN TO MENU ";: GET A$: IF A$ =  CHR$(27)  THEN 110
  70. 700  POKE SLOT,S1: POKE DRIVE,D1:S2 = S1 *16: POKE 907,S2: POKE 908,D1: POKE 47081,S2: POKE 47082,D1
  71. 710  TEXT : POKE 34,4: HOME : VTAB 12: HTAB 1
  72. 720  PRINT "<RETURN> TO FIND NEXT TRACK/SECTOR LIST": PRINT "<ESC> TO QUIT";: GET Z$: PRINT : IF Z$ =  CHR$(27)  THEN  CALL F9: GOTO 1020
  73. 730  VTAB 12: HTAB 4: CALL  -958: HTAB 1: INVERSE : PRINT "SEARCHING FOR TRACK/SECTOR LIST": NORMAL 
  74. 740  IF MARKER = 1  THEN 760
  75. 750  POKE TINIT +10,17: POKE TINIT +35,17: CALL BEGIN:MARKER = 1: GOTO 770
  76. 760  CALL FINDTSL7: IF  PEEK(TRACK) > = 35  THEN 1020
  77. 770 D =  PEEK(TRACK): GOSUB 330:PT$ = H$:D =  PEEK(SECTR): GOSUB 330:PS$ = H$
  78. 780  HOME : HTAB 8: PRINT "TRACK/SECTOR LIST FOUND"
  79. 790  HTAB 8: PRINT "AT TRACK ";PT$;" - SECTOR ";PS$
  80. 800  POKE 34,6
  81. 810  HOME : PRINT : HTAB 5: PRINT "DO YOU WISH TO VIEW THE FIRST"
  82. 820  HTAB 5: INPUT "SECTOR OF THE FOUND FILE (Y/N)? ";AN$: IF AN$ < >"Y"  AND AN$ < >"N"  AND AN$ < > CHR$(110)  AND AN$ < > CHR$(121)  THEN  PRINT  CHR$(7);: GOTO 810
  83. 830  IF AN$ = "N"  OR AN$ =  CHR$(110)  THEN  GOTO 910
  84. 840 S2 = 37900: POKE ICMD,1
  85. 850  IF  PEEK(S2) = 0  THEN  VTAB 22: CALL  -958: PRINT "THAT IS ALL OF THE FILE!": VTAB 23: PRINT "PRESS <RETURN> TO CONTINUE";: GET Z$: PRINT : GOTO 900
  86. 860  POKE ITRK, PEEK(S2): POKE ISEC, PEEK(S2 +1): CALL RWTS
  87. 870  CALL HEXOUT
  88. 880  VTAB 22: HTAB 1: CALL  -958: PRINT "DO YOU WISH TO VIEW THIS": INPUT "SECTOR ONCE AGAIN (Y/N)? ";AN$: ON AN$ < >"Y"  AND AN$ < >"N"  AND AN$ < > CHR$(110)  AND AN$ < > CHR$(121) GOTO 880: IF AN$ = "Y"  OR AN$ =  CHR$(121) GOTO 870
  89. 890  VTAB 22: HTAB 1: CALL  -958: PRINT "DO YOU WISH TO VIEW THE": INPUT "NEXT SECTOR OF THE FILE (Y/N)? ";AN$: ON AN$ < >"Y"  AND AN$ < >"N"  AND AN$ < > CHR$(110)  AND AN$ < > CHR$(121) GOTO 890: IF AN$ = "Y"  OR AN$ =  CHR$(121)  THEN S2 = S2 +2: GOTO 850
  90. 900  VTAB 22: CALL  -958: PRINT "DO YOU WISH TO SEE": INPUT "THE ENTIRE FILE AGAIN (Y/N) ";AN$: ON AN$ < >"Y"  AND AN$ < >"N"  AND AN$ < > CHR$(110)  AND AN$ < > CHR$(121) GOTO 900: IF AN$ = "Y"  OR AN$ =  CHR$(121)  THEN  GOTO 840
  91. 910  HOME : CALL SAVFILE: IF  PEEK(14) = 206  THEN 710
  92. 920  PRINT : PRINT : PRINT :Q$ = "": FOR Q = NAME TO NAME +35:Q$ = Q$ + CHR$( PEEK(Q)): NEXT 
  93. 930  IF  ASC( MID$ (Q$,1,1)) -128 < ASC("A")  OR  ASC( MID$ (Q$,1,1)) -128 > ASC("Z")  THEN 960
  94. 940 A$ = "": FOR Q = 2 TO  LEN(Q$): IF  ASC( MID$ (Q$,Q,1)) -128 =  ASC(",")  THEN A$ = ","
  95. 950  NEXT : IF A$ = ""  THEN 970
  96. 960  PRINT : PRINT : PRINT  CHR$(7);"THIS IS AN ILLEGAL FILE NAME!!!": PRINT : PRINT "FILE NAMES MUST BEGIN WITH A LETTER": PRINT "AND CANNOT HAVE A COMMA IN THEM": PRINT : PRINT "PRESS <RETURN> TO RE-ENTER NAME ";: GET A$: PRINT : GOTO 910
  97. 970 T =  PEEK(FSVE) -128: HOME : PRINT : PRINT "FILE TYPE: "TYPE$(T)
  98. 980  PRINT : PRINT "FILE NAME: ";: FOR Q = NAME TO NAME +35: PRINT  CHR$( PEEK(Q));: NEXT 
  99. 990  PRINT : INPUT "IS THIS DATA CORRECT (Y/N)? ";AN$: ON AN$ < >"Y"  AND AN$ < >"N"  AND AN$ < > CHR$(110)  AND AN$ < > CHR$(121) GOTO 990: IF AN$ = "N"  OR AN$ =  CHR$(110)  THEN  POKE 512,0: GOTO 910
  100. 1000  IF AN$ < >"Y"  THEN 970
  101. 1010  CALL UPDTE: PRINT : PRINT "THE FILE HAS BEEN REENTERED IN THE VTOC": PRINT : PRINT "PRESS <RETURN> TO CONTINUE. ";: GET A$: PRINT : GOTO 710
  102. 1020  HOME : PRINT "THE DISKETTE HAS BEEN RESURRECTED!!": PRINT "PRESS <RETURN> TO RETURN TO THE MENU. ";: GET A$: GOTO 110
  103. 1030 EF = 5: ONERR  GOTO 2130
  104. 1040  TEXT : HOME : INVERSE : PRINT  SPC( 40)" DISK RESCUE -------- CHANGE SLOT/DRIVE " SPC( 40): NORMAL : POKE 34,4: HOME : REM  8 -'S
  105. 1050  VTAB 5: HTAB 1: INPUT "SLOT NUMBER: ";S$: IF S$ = ""  THEN 1070
  106. 1060 S1 =  VAL(S$): IF S1 > = 1  AND S1 < = 7  THEN 1080
  107. 1070  PRINT  CHR$(7): VTAB 5: HTAB 13: CALL  -868: GOTO 1050
  108. 1080  VTAB 7: HTAB 1: INPUT "DRIVE NUMBER: ";S$: IF S$ = ""  THEN 1100
  109. 1090 D1 =  VAL(S$): IF D1 > = 1  AND D1 < = 2  THEN 1110
  110. 1100  PRINT  CHR$(7): VTAB 7: HTAB 14: CALL  -868: GOTO 1080
  111. 1110  POKE SLOT,S1: POKE DRIVE,D1:S2 = S1 *16: POKE 907,S2: POKE 47081,S2: POKE 908,D1: POKE 47082,D1: GOTO 110
  112. 1120 EF = 6: ONERR  GOTO 2130
  113. 1130  TEXT : HOME : VTAB 12: PRINT "BE SURE TO HAVE SEPARATE DISK": PRINT "TO MAKE TEMPORARY COPY OF BAD TRACK": VTAB 21: PRINT "<RETURN> TO CONTINUE, <ESC> FOR MENU";: GET Z$: PRINT : IF Z$ =  CHR$(27) GOTO 110
  114. 1140  TEXT : HOME : INVERSE : PRINT  SPC( 40)" DISK RESCUE -------------- TRACK SAVER " SPC( 40): NORMAL : POKE 34,4: HOME : REM  14 -'S
  115. 1150  POKE 34,5: HOME : INVERSE : PRINT "ORIGINAL";: NORMAL : PRINT " SLOT  (DEFAULT=" PEEK(SLOT);: INPUT "): ";A$
  116. 1160  IF A$ = ""  THEN S1 =  PEEK(SLOT): VTAB 6: HTAB 16: CALL  -868: PRINT S1: GOTO 1200
  117. 1170  IF A$ >"0"  AND A$ < = "7"  THEN 1190
  118. 1180  PRINT  CHR$(7): HOME : GOTO 1150
  119. 1190  VTAB 6: HTAB 16: CALL  -868: PRINT A$:S1 =  VAL(A$)
  120. 1200  POKE 34,6: VTAB 7: HTAB 10: PRINT "DRIVE (DEFAULT=" PEEK(DRIVE);: INPUT "): ";A$
  121. 1210  IF A$ = ""  THEN D1 =  PEEK(DRIVE): VTAB 7: HTAB 16: CALL  -868: PRINT D1: GOTO 1240
  122. 1220  IF A$ <"1"  OR A$ >"2"  THEN  PRINT  CHR$(7): HOME : GOTO 1200
  123. 1230 D1 =  VAL(A$): VTAB 7: HTAB 16: CALL  -868: PRINT A$
  124. 1240  POKE 34,9: VTAB 10: INVERSE : PRINT "DUPLICATE";: NORMAL : PRINT " SLOT  (DEFAULT="S1;: INPUT "): ";A$
  125. 1250  IF A$ = ""  THEN S2 = S1: VTAB 10: HTAB 17: CALL  -868: PRINT S2: GOTO 1280
  126. 1260  IF A$ <"1"  OR A$ > = "7"  THEN  PRINT  CHR$(7): HOME : GOTO 1240
  127. 1270  VTAB 10: HTAB 17: CALL  -868: PRINT A$:S2 =  VAL(A$)
  128. 1280  POKE 34,10: VTAB 11: HTAB 11: PRINT "DRIVE (DEFAULT="((D1 = 1) +1);: INPUT "): ";A$: IF A$ = ""  THEN D2 = ((D1 = 1) +1): VTAB 11: HTAB 17: CALL  -868: PRINT D2: GOTO 1310
  129. 1290  IF A$ <"1"  OR A$ >"2"  THEN  PRINT  CHR$(7): HOME : GOTO 1280
  130. 1300  VTAB 11: HTAB 17: CALL  -868: PRINT A$:D2 =  VAL(A$)
  131. 1310  POKE 34,13: VTAB 15: PRINT "ENTER TRACK ";: INPUT "TO BE SAVED (IN HEX): ";H$: IF H$ = ""  THEN  PRINT  CHR$(7): HOME : GOTO 1310
  132. 1320 TK$ = H$: GOSUB 340:TK = D: IF TK <0  OR TK > = 35  THEN  PRINT  CHR$(7): HOME : GOTO 1310
  133. 1330  VTAB 19: PRINT "PRESS RETURN TO CONTINUE": PRINT "PRESS <ESC> TO RETURN TO MENU": PRINT "ANY OTHER KEY TO RESET PARAMETERS ";: GET A$
  134. 1340  IF A$ =  CHR$(13)  THEN  PRINT : GOTO 1370
  135. 1350  IF A$ =  CHR$(27)  THEN 110
  136. 1360  PRINT : POKE 34,12: HOME : GOTO 1150
  137. 1370  POKE 34,11: HOME :SR = 0
  138. 1380  VTAB 6: HTAB 29: CALL  -868: VTAB 10: HTAB 29: CALL  -868: PRINT 
  139. 1390  IF D1 = D2  AND S1 = S2  THEN  VTAB 17: PRINT "INSERT DAMAGED DISK AND PRESS <RETURN> ";: GET A$: HOME 
  140. 1400  VTAB 10: HTAB 29: CALL  -868: VTAB 6: HTAB 30: INVERSE : PRINT "READING": NORMAL 
  141. 1410 CMD = 1:SX = S1:DX = D1: GOSUB 370:V =  PEEK(920): IF  PEEK(919) = 16  OR  PEEK(919) = 32  OR  PEEK(919) = 64  OR  PEEK(919) = 128  THEN TS(SR) = 0: GOTO 1470
  142. 1420 TS(SR) = 1: VTAB 6: HTAB 29: CALL  -868: VTAB 10: HTAB 29: CALL  -868: PRINT 
  143. 1430  IF D1 = D2  AND S1 = S2  THEN  VTAB 17: PRINT "INSERT STORAGE DISK AND PRESS <RETURN> ";: GET A$: HOME 
  144. 1440  VTAB 6: HTAB 29:: CALL  -868: VTAB 10: HTAB 30: INVERSE : PRINT "WRITING": NORMAL 
  145. 1450 CMD = 2:SX = S2:DX = D2: GOSUB 370: IF  PEEK(919) = 16  OR  PEEK(919) = 32  OR  PEEK(919) = 64  OR  PEEK(919) = 128  THEN 1660
  146. 1460 SR = SR +1: IF SR < = 15  THEN 1380
  147. 1470 D = SR: GOSUB 330: IF  LEN(TK$) = 1  THEN TK$ = "0" +TK$
  148. 1480  VTAB 17: PRINT "ERROR READING TRACK $"TK$" - SECTOR $"H$: FOR I = 1 TO 1000: NEXT I:SR = SR +1: IF SR < = 15  THEN 1380
  149. 1490  VTAB 10: HTAB 29: CALL  -868
  150. 1500  IF S1 = S2  AND D1 = D2  THEN  HOME : VTAB 17: PRINT "INSERT DAMAGED DISK AND PRESS <RETURN>";: GET A$: HOME 
  151. 1510  HOME : VTAB 17: HTAB 7: PRINT "INITIALIZING DAMAGED TRACK": NORMAL 
  152. 1520  POKE SLOT,S1: POKE DRIVE,D1:WW = S1 *16: POKE 907,WW: POKE 908,D1: POKE 47081,WW: POKE 47082,D1
  153. 1530  POKE 11,V: POKE TINIT +10,TK: POKE TINIT +35,TK: CALL TINIT: HOME :SR = 0
  154. 1540  IF TS(SR) < >1  THEN SR = SR +1: GOTO 1540
  155. 1550  VTAB 6: HTAB 29: CALL  -868: VTAB 10: HTAB 29: CALL  -868: PRINT 
  156. 1560  IF D1 = D2  AND S1 = S2  THEN  VTAB 17: PRINT "INSERT STORAGE DISK AND PRESS <RETURN> ";: GET A$: HOME 
  157. 1570  VTAB 6: HTAB 29: CALL  -868: VTAB 10: HTAB 30: INVERSE : PRINT "READING": NORMAL 
  158. 1580 CMD = 1:SX = S2:DX = D2: GOSUB 370
  159. 1590  VTAB 6: HTAB 29: CALL  -868: VTAB 10: HTAB 29: CALL  -868: PRINT 
  160. 1600  IF D1 = D2  AND S1 = S2  THEN  VTAB 17: PRINT "INSERT RESTORED DISK AND PRESS <RETURN> ";: GET A$: HOME 
  161. 1610  VTAB 10: HTAB 29: CALL  -868: VTAB 6: HTAB 30: INVERSE : PRINT "RESTORING": NORMAL 
  162. 1620 CMD = 2:SX = S1:DX = D1: GOSUB 370
  163. 1630 SR = SR +1: IF SR < = 15  THEN 1540
  164. 1640  VTAB 6: HTAB 29: CALL  -868: VTAB 10: HTAB 29: CALL  -868: PRINT : VTAB 17: PRINT "DAMAGED TRACK RESTORED.": PRINT : PRINT "PRESS <RETURN> TO RETURN TO MENU. ";: GET A$
  165. 1650  POKE SLOT,S1: POKE DRIVE,D1:WW = S1 *16: POKE 907,WW: POKE 908,D1: POKE 47081,WW: POKE 47082,D1: GOTO 110
  166. 1660  HOME : VTAB 17: PRINT "A WRITING ERROR HAS OCCURRED ON THE": PRINT "STORAGE DISK. AN INITIALIZED DISK MUST": PRINT "BE USED FOR THIS PURPOSE.": PRINT : PRINT "PRESS <RETURN> TO RETURN TO MENU ";: GET A$
  167. 1670  POKE SLOT,S1: POKE DRIVE,D1:WW = S1 *16: POKE 907,WW: POKE 908,D1: POKE 47081,WW: POKE 47082,D1: GOTO 110
  168. 1680 EF = 7: ONERR  GOTO 2130
  169. 1690  TEXT : HOME : INVERSE : PRINT  SPC( 40)" DISK RESCUE ------------- DISK SCANNER " SPC( 40): NORMAL : POKE 34,4: HOME : REM  13 -'S
  170. 1700 PS =  PEEK(SLOT) *16:PD =  PEEK(DRIVE): POKE 907,PS: POKE 908,PD
  171. 1710  VTAB 7: HTAB 1: PRINT "TRACK TO START SCAN (IN HEX):": VTAB 11: HTAB 1: PRINT "ENTER 'ALL' TO SCAN ENTIRE DISK": VTAB 7: HTAB 30: INPUT " ";H$: ON H$ = "" GOTO 110: IF H$ = "ALL"  THEN TK = 0:SR = 34: GOTO 1780
  172. 1720  VTAB 11: CALL  -868:TK$ = H$: GOSUB 340:TK = D: IF TK > = 0  AND TK <35  THEN 1740
  173. 1730  PRINT  CHR$(7): VTAB 7: HTAB 30: CALL  -868: GOTO 1710
  174. 1740  VTAB 9: HTAB 1: INPUT "TRACK TO END SCAN (IN HEX): ";H$: IF H$ = ""  THEN  PRINT  CHR$(7): GOTO 1740
  175. 1750 SR$ = H$: GOSUB 340:SR = D: IF SR > = 0  AND SR <35  THEN 1770
  176. 1760  PRINT  CHR$(7): VTAB 9: HTAB 28: CALL  -868: GOTO 1740
  177. 1770  IF SR <TK  THEN  HOME : VTAB 12: HTAB 1: PRINT "ENDING TRACK IS LESS THAN STARTING TRACK";: VTAB 22: PRINT "<RETURN> TO REENTER, <ESC> FOR MENU";: GET Z$: PRINT : ON Z$ =  CHR$(27) GOTO 110: GOTO 1680
  178. 1780  HOME : PRINT "TRACK $          SCANNING     SECTOR $": POKE 34,7: HOME : VTAB 21: PRINT "PRESS <ESC> TO STOP SCAN": POKE ICMD,1:M = 0:ERR = 0: REM  10/5 SPACES
  179. 1790  FOR I = TK TO SR: POKE ITRK,I
  180. 1800  FOR K = 0 TO 15: POKE ISEC,K
  181. 1810 D = I: GOSUB 330:TR$ = H$:D = K: GOSUB 330:SR$ = H$: VTAB 5: HTAB 8: PRINT TR$: VTAB 5: HTAB 38: PRINT SR$
  182. 1820  CALL RWTS: IF  PEEK(11)  THEN M = M +1: VTAB 13: PRINT "ERROR READING TRACK $"TR$" - SECTOR $"SR$
  183. 1830  POKE ICMD,2: CALL RWTS: IF   NOT  PEEK(11)  THEN 1860
  184. 1840  IF  PEEK(919) = 16  THEN  HOME : PRINT : PRINT "THIS DISKETTE IS WRITE PROTECTED!": GOTO 1900
  185. 1850 M = M +1: VTAB 15: PRINT "ERROR WRITING TO TRACK $"TR$" - SECTOR $"SR$
  186. 1860  POKE ICMD,1
  187. 1870  IF  PEEK( -16384) = 155  THEN  POKE  -16368,0: HOME : VTAB 21: PRINT "<ESC> PRESSED TO STOP SCAN": PRINT : PRINT "<ESC> TO QUIT,<RETURN> TO RESUME SCAN";: GET Z$: PRINT : VTAB 21: HTAB 1: CALL  -958: IF Z$ =  CHR$(27)  THEN K = 15:I = SR
  188. 1880  NEXT K: NEXT I
  189. 1890  IF M = 0  THEN  POKE 34,4: HOME : PRINT "NO ERRORS DETECTED!"
  190. 1900  VTAB 22: PRINT "PRESS <RETURN> FOR MENU ";: GET A$: PRINT : GOTO 110
  191. 1910 EF = 8: ONERR  GOTO 2130
  192. 1920  TEXT : HOME : VTAB 12: INVERSE : PRINT "WARNING!": NORMAL : PRINT " THIS OPTION ERASES ALL": PRINT "DATA ON SELECTED TRACK.": VTAB 21: PRINT "<RETURN> TO CONTINUE, <ESC> FOR MENU";: GET Z$: PRINT : IF Z$ =  CHR$(27) GOTO 110
  193. 1930  TEXT : HOME : INVERSE : PRINT  SPC( 40)" DISK RESCUE ------------- TRACK INITER " SPC( 40): NORMAL : POKE 34,4: HOME : REM  13 -'S
  194. 1940  VTAB 5: HTAB 13: INVERSE : PRINT "!!! WARNING !!!": NORMAL 
  195. 1950  VTAB 7: HTAB 8: PRINT "ALL DATA WILL BE ERASED": VTAB 8: HTAB 7: PRINT "FROM THE INITIALIZED TRACK"
  196. 1960  POKE 34,10: HOME : PRINT " SLOT NUMBER (DEFAULT=" PEEK(SLOT);: INPUT "): ";A$
  197. 1970  IF A$ = ""  THEN S1 =  PEEK(SLOT): VTAB 11: HTAB 13: CALL  -868: VTAB 11: HTAB 14: PRINT S1: GOTO 2010
  198. 1980  IF  ASC(A$) >48  AND  ASC(A$) <55  THEN 2000
  199. 1990  PRINT  CHR$(7): HOME : GOTO 1960
  200. 2000 S1 =  VAL(A$): VTAB 11: HTAB 13: CALL  -868: VTAB 11: HTAB 14: PRINT A$
  201. 2010  POKE 34,12: VTAB 13: PRINT "DRIVE NUMBER (DEFAULT=" PEEK(DRIVE);: INPUT "): ";A$
  202. 2020  IF A$ = ""  THEN D1 =  PEEK(DRIVE): VTAB 13: HTAB 13: CALL  -868: VTAB 13: HTAB 14: PRINT D1: GOTO 2050
  203. 2030  IF  ASC(A$) <49  OR  ASC(A$) >50  THEN  PRINT  CHR$(7): HOME : GOTO 1960
  204. 2040 D1 =  VAL(A$): VTAB 13: HTAB 13: CALL  -868: VTAB 13: HTAB 14: PRINT A$
  205. 2050  POKE 34,13: VTAB 15: PRINT "ENTER TRACK": INPUT "TO INITIALIZE (IN HEX): ";H$: IF H$ = ""  THEN  PRINT  CHR$(7): HOME : GOTO 2050
  206. 2060 TK$ = H$: GOSUB 340:TK = D: IF TK <0  OR TK > = 35  THEN  PRINT  CHR$(7): HOME : GOTO 2050
  207. 2070  POKE SLOT,S1: POKE DRIVE,D1:S2 = S1 *16: POKE 907,S2: POKE 908,D1: POKE 47081,S2: POKE 47082,D1:D = TK: GOSUB 330:TK$ = H$
  208. 2080  VTAB 19: PRINT "PRESS RETURN TO CONTINUE": PRINT : PRINT "PRESS ANY OTHER KEY": PRINT "TO RETURN TO MENU! ";: GET A$: IF A$ < > CHR$(13)  THEN  GOTO 110
  209. 2090 NT = TK -1: IF NT <0  THEN NT = TK +1
  210. 2100  POKE ITRK,NT: POKE ISEC,0: POKE ICMD,1: CALL RWTS
  211. 2110  IF  PEEK(919) = 16  OR  PEEK(919) = 32  OR  PEEK(919) = 64  OR  PEEK(919) = 128  THEN  HOME : PRINT : PRINT "A DISK ERROR HAS OCCURED.": PRINT "CHECK DRIVE DOOR AND WRITE-PROTECT TAB": PRINT : PRINT "PRESS <RETURN> TO CONTINUE ";: GET A$: PRINT : HOME : GOTO 2080
  212. 2120  POKE 34,4: HOME : VTAB 15: PRINT "INITIALIZING TRACK $";TK$: POKE TINIT +10,TK: POKE TINIT +35,TK: CALL TINIT: HOME : VTAB 15: PRINT "TRACK $"TK$" INITIALIZED!": VTAB 22: PRINT "PRESS <RETURN> TO RETURN TO MENU. ";: GET A$: PRINT : GOTO 110
  213. 2130  CALL  -3288:E =  PEEK(222):EL =  PEEK(218) +256 * PEEK(219): POKE 216,0
  214. 2140  IF E = 255  THEN A$ = "8": GOTO 310
  215. 2150  HOME : VTAB 12
  216. 2160  IF E = 6  AND EF = 1  THEN  PRINT "PHOENIX NOT FOUND": GOTO 2220
  217. 2170  IF E = 6  THEN  PRINT "FILE NOT FOUND": GOTO 2220
  218. 2180  IF E = 8  THEN  PRINT "I/O ERROR--CHECK DRIVE DOOR": GOTO 2220
  219. 2190  IF E = 9  THEN  PRINT "DISK FULL": GOTO 2220
  220. 2200  IF E = 10  THEN  PRINT "FILE LOCKED": GOTO 2220
  221. 2210  PRINT "ERROR "E" IN LINE "EL
  222. 2220  VTAB 23: HTAB 8: PRINT "PRESS <RETURN> TO CONTINUE";: GET Z$: PRINT 
  223. 2230  ON EF GOTO 160,380,480,530,1030,1120,1680,1910