Listing of file='@DSTAPER' on disk='vmedia/CS_D_cassette_diags.wvd.zip'
# Sector 231, program filename = '@DSTAPER' 0010 REM ! @DSTAPER - 08/16/88 - Restore Disk Platters from Cassette Utility 0020 REM ! (C) Copyright, Wang Laboratories, Inc., 1988. All rights reserved. 0030 REM % VARIABLE DEFINITIONS 0040 DIM S$64 0050 DIM S0$(255)64 : REM - INDEX ENTRIES 0060 DIM K,I : REM - FOR...NEXT LOOP INDEX VARIABLES 0070 DIM D$3 : REM - TAPE DRIVE ADDRESS 0080 DIM K$1 : REM - KEYIN BYTE 0090 DIM G$15 : REM - $GIO STATUS REGISTERS 0100 DIM B$(8)64 : REM - 512-BYTE BLOCK BUFFER 0110 DIM D1$3,D2$3 : REM - destination DISK ADDRESS : D1$=" " 0120 REM TENSION FLAG : DIM T$1 : T$=" " 0130 REM MESSAGES : DIM M$50,M2$50,M1$50 0140 REM TEMPORARY : DIM T1$80 0150 REM % MAINLINE 0160 SELECT PRINT 005(80) : PRINT HEX(020D0C030F06020402000F); : REM - RESET THE DISPLAY & SHUT OFF CURSOR 0170 T1$="R e s t o r e D i s k P l a t t e r F r o m C a s s e t t e" : PRINT AT(0,40-LEN(T1$)/2);HEX(0F);T1$; 0180 GOSUB '50("(c) Copyright, Wang Laboratories, Inc., 1988"," All rights reserved.") 0190 PRINT AT(23,61);"FN/TAB - Exit";AT(22,61);"RETURN - Proceed"; 0195 D$="D5F" 0200 REM %get tape address : PRINT AT(2,12);"Address of tape cassette drive (D5F, D6F, or D7F): "; : LINPUT HEX(0E),-D$ : IF D$="RUN"THEN 195 : PRINT HEX(06); : GOSUB '50(" "," ") : $TRAN(D$,"BbDdFf")R : IF POS("DB"=STR(D$,1,1))<>0 AND POS("567"=STR(D$,2,1))<>0 AND STR(D$,3,1) ="F" THEN 210 : GOSUB '201("Illegal address") : GOTO 200 0210 SELECT #1 <D$> : ERRORGOSUB '201("Invalid address") : GOTO 200 0220 REM %get tape address status : GOSUB '201("Getting tape status") : S$=" " : $GIO STATUS REQUEST #1(0E14 0F00 12E2 0600 0700 70A0 68D0 7040 682E 6816 4000 8705 1A00 C340, G$) G$; STR(S$,,VAL(STR(G$,5,1))) : ERRORGOTO 260 0230 REM check for timeout : T1$=STR(G$,8,1) AND HEX(10) : IF STR(T1$,1,1)=HEX(00) THEN 240 : GOSUB '50(HEX(0E),"Tape cassette drive unavailable") : GOTO 200 0240 REM check for tape drive : IF STR(S$,2,1)<>"E" THEN 260 0250 REM check for errors : IF STR(G$,6,3)=HEX(000000)THEN 270 0260 GOSUB '50(HEX(0E),"Not a DS tape cassette drive") : GOTO 200 0270 GOSUB '50(" "," ") 0280 REM %get platter address : PRINT AT(3,24);"Address of disk platter to restore to: "; : LINPUT HEX(0E),-D1$ : PRINT HEX(06); : GOSUB '50(" "," ") 0290 $TRAN(D1$,"AaBbCcDdEeFf")R : IF D1$="340" THEN 300 : IF POS("DB3"=STR(D1$,1,1))<>0 AND POS("123567"=STR(D1$,2,1))<>0 AND VER(S TR(D1$,3,1),"H")<>0 AND D1$<>"D5F" AND D1$<>"D6F" AND D1$<>"D7F" THEN 300 : GOSUB '50(HEX(0E),"Illegal disk platter address") : GOTO 280 0300 IF POS("3B"=STR(D1$,1,1))=0 OR POS("123"=STR(D1$,2,1))=0 OR STR(D1$,3,1)< >"0" THEN 310 : IF STR(D1$,1,1)="3" THEN STR(D1$,3,1)="1" : STR(D1$,1,1)="D" 0310 SELECT #2 <D1$> : ERRORGOSUB '50(HEX(0E),"Invalid address") : GOTO 280 0320 REM %---------- TAPE OPERATIONS ----------------------------------------- --- : PRINT AT(22,61,19);AT(23,61,19); 0330 REM %HOG TAPE DS : GOSUB '201("Waiting for DS") : $OPEN 330,#1 0340 REM %REWIND TAPE : GOSUB '201("Rewinding tape") : $GIO REWIND TAPE #1 (0600 0700 70A0 68D0 7040 682E 6830 8B67 4000 8706, G $) : IF STR(G$,6,3)<>HEX(000000) THEN 760 0350 REM %already retensioned? : IF T$="T" THEN 370 0360 REM %RETENSION TAPE : GOSUB '50(HEX(0E),"Retensioning tape") : $GIO RETENSION TAPE #1 (0600 0700 70A0 68D0 7040 682E 6832 8B67 4000 8706 , G$) : IF STR(G$,6,3)<>HEX(000000) THEN 760 : T$="T" 0370 REM %POSITION TO BEGINNING OF TAPE DIRECTORY : GOSUB '201 ("Positioning to tape directory") : STR(G$,3,3)=HEX(000000) : $GIO SEEK DIRECTORY BLOCK #1 (0600 0700 70A0 68D0 7040 682E 683F 8B67 680 1 6A30 6A40 6A50 4000 8706, G$) : IF STR(G$,6,3)<>HEX(000000) THEN 760 0380 REM %READ TAPE DIRECTORY : GOSUB '201 ("Reading tape directory") : S0$()=ALL(00) : C=0 0390 REM read tape directory label (1st block) : GOSUB '202 : IF STR(G$,6,3)<>HEX(000000) THEN 760 : IF STR(B$(),1,32)="TAPE DIRECTORY LABEL" AND STR(B$(),33,32)="TYPE 1.1: PLATTER BACKUP" THEN 400 : M$="Data on tape is not from backup" : GOTO 1030 0400 REM read directory block : GOSUB '202 : IF STR(G$,6,3)<>HEX(000000) THEN 410 : IF C=255 THEN 430 : C=C+1 : S0$(C)=STR(B$(),,64) : GOTO 400 0410 REM ignore any file marks : IF STR(G$,6,3)=HEX(1A0000) THEN 400 0420 REM check for end of data : IF STR(G$,6,3)<>HEX(170000) THEN 760 0430 REM %DISPLAY TAPE DIRECTORY : PRINT AT(21,51);"SPACE/BACKSPACE - Select Item";AT(23,60);"FN/TAB - Exit" ;AT(22,60);"RETURN - Proceed";AT(6,2);"\A0\A0\A0\A0\A0\A0\A0\A0\A0\A0\A0\ A0\A0\A0\A0\A0\D4\E1\F0\E5\A0\C4\E9\F2\E5\E3\F4\EF\F2\F9\A0\A0\A0\A0\A0\A 0\A0\A0\A0\A0\A0\A0\A0\A0\A0\A0\A0\A0\A0 \D0\EC\E1\F4\F4\E5\F2 \D3\F4\E1\ F2\F4 \A0\C5\EE\E4\A0 \A0\A0\CD\E2\A0\A0" : K=1 : X=1 : GOSUB '201("Select item to restore") 0440 REM R=row, X=current item selected, K=item at top of list 0450 REM display section of directory : PRINT AT(7,0,1040); : FOR R=7 TO 19 : Y=K+R-7 : IF Y>C THEN 480 : S$=S0$(Y) : S=VAL(STR(S$,53,2),2) : E=VAL(STR(S$,55,2),2) : PRINT AT(R,0);HEX(85);AT(R,53);"/";STR(S$,50,3);AT(R,2);STR(S$,,49);AT(R, 60); : PRINTUSING "#####",S; : PRINT AT(R,66); : PRINTUSING "#####",E; 0455 PRINT AT(R,72); : PRINTUSING "###.#",ROUND(((E-S+1)/4096,1); 0460 NEXT R 0470 REM flush keyboard buffer : KEYIN K$,470,470 0480 REM %SELECT AN ITEM (X) : PRINT AT(X-K+7,0);HEX(0E8B20);STR(S0$(X),,49);HEX(0F); 0490 KEYIN K$,,500 : ON POS(HEX(08200D)=K$) GOTO 510,520,530 : GOTO 490 0500 ON POS(HEX(465645557E7F)=K$) GOTO 510,510,520,520,1100,1100 : GOTO 490 0510 REM previous item : IF X=1 THEN 490 : PRINT AT(X-K+7,0);HEX(8520);STR(S0$(X),,49); : X=X-1 : IF X>=K THEN 480 : K=K-13 : GOTO 450 0520 REM next item : IF X=C THEN 490 : PRINT AT(X-K+7,0);HEX(8520);STR(S0$(X),,49); : X=X+1 : IF X-K+7<20 THEN 480 : K=K+13 : GOTO 450 0530 REM X selected : PRINT AT(21,51,29);AT(22,60,20);AT(23,60,20); 0540 REM %POSITION TO DATA TO BE RESTORED : GOSUB '201("Positioning to data to restore") : STR(G$,3,3)=STR(S0$(X),58,3) : $GIO SEEK BLOCK #1 (0600 0700 70A0 68D0 7040 682E 683F 8B67 6800 6A30 6A4 0 6A50 4000 8706, G$) : IF STR(G$,6,3)<>HEX(000000) THEN 760 0542 REM % STARTING SECTOR : S=VAL(STR(S0$(X),53,2),2) 0544 REM % ENDING SECTOR : E=VAL(STR(S0$(X),55,2),2) 0550 REM % # SECTORS TO RESTORE : N=E-S+1 0560 REM %DS DISK OR EXTERNAL DISK? : GOSUB '201 ("Copying data from tape to disk platter") : D2$=D1$ OR HEX(000400) : IF STR(D1$,1,1)<>"D" OR STR(D2$,2,1)<>STR(D$,2,1) THEN 630 0570 REM %RESTORE TO DS DISK : REM disk address : HEXPACK STR(G$,4,1) FROM STR(D1$,2,2) : STR(G$,4,1)=AND HEX(0F) : IF STR(D1$,2,1)>"4"THEN STR(G$,4,1)=STR(G$,4,1)OR HEX(10) 0580 FOR J=S TO E STEP 256 0590 REM starting sector : STR(G$,2,2)=BIN(J,2) 0600 REM # sectors : STR(G$,11,2)=BIN(MIN(E-J+1,256),2) 0610 $GIO RESTORE SECTORS #1 (0600 0700 70A0 68D0 7040 682E 6835 6A40 6800 6A2 0 6230 8B67 6AB0 6AC0 8B67 4000 870B 870C 8706, G$) : IF STR(G$,6,3)<>HEX(000000) THEN 760 0620 NEXT J : GOTO 680 0630 REM %RESTORE TO EXTERNAL DISK : FOR J=S TO E STEP 2 0640 REM read next block : GOSUB '202 : IF STR(G$,6,3)<>HEX(000000) THEN 760 0650 REM write 1st sector to disk : DATA SAVE BA T #2, (J) STR(B$(),,256) : ERRORGOTO 1020 0660 REM write 2nd sector to disk : IF J+1<E+1THEN DATA SAVE BA T #2, (J+1) STR(B$(),257,256) : ERRORGOTO 1020 0670 NEXT J 0680 REM %REWIND TAPE : GOSUB '201("Rewinding tape") : $GIO REWIND TAPE #1 (0600 0700 70A0 68D0 7040 682E 6830 8B67 4000 8706, G $) : IF STR(G$,6,3)<>HEX(000000) THEN 760 0690 REM %RESTORE DONE : GOSUB '201 ("Restore completed") : PRINT HEX(07); : GOTO 1040 0700 REM %READ BLOCK SUBROUTINE : REM Return- B$()=data block : REM STR(G$,6,1)=error code : REM STR(G$,7,2)=command error 0710 DEFFN'202 : $GIO READ BLOCK #1(0600 0700 70A0 68D0 7040 682E 684A 8B67 4000 8B76 D00F C341 8B52 E00F 0626 0800, G$) B$() : IF STR(G$,6,3)<>HEX(260000) THEN RETURN 0720 REM retry if LRC error : FOR I=1 TO 16 : $GIO REREAD BLOCK #1(0600 0700 70A0 68D0 7040 682E 684C 8B67 4000 8B76 D0 0F C341 8B52 E00F 0626 0800, G$) B$() : IF STR(G$,6,3)<>HEX(260000) THEN I=16 : NEXT I : RETURN 0730 REM % TAPE CASSETTE ERROR HANDLING : REM STR(G$,6,1) = ERROR CODE : REM STR(G$,7,2) = COMMAND ERROR 0740 REM if nonrecoverable error, : GOTO 1030 0750 REM if recoverable error, : GOTO 1110 0760 RETURN CLEAR ALL : IF STR(G$,7,2)=HEX(0000) THEN 770 : M$="Tape Command Error" : GOTO 1030 0770 K$=STR(G$,6,1) : ON POS(HEX(919395969899)=K$) GOTO 780,800,790,810,830,820 : GOTO 840 0780 M$="ERROR I91: Disk Drive Not Ready" : GOTO 1030 0790 M$="ERROR I95: Device Error" : GOTO 1030 0800 M$="ERROR I93: Format Error" : GOTO 1030 0810 M$="ERROR I96: Data Error" : GOTO 1030 0820 M$="ERROR I99: Read After Write Error" : GOTO 1030 0830 M$="ERROR I98: Illegal Sector Address or No Platter" : GOTO 1030 0840 ON VAL(K$)-15 GOTO 860,870,880,890,900,910,920,930,,,940,950,960,,,,970,, ,980,990,,1000,1010 0850 M$="ERROR: Device Error" : GOTO 1030 0860 GOSUB '50("ERROR T10: No Tape Cassette","Mount tape cassette and press RETURN") : GOTO 1110 0870 M$="ERROR T11: No Tape Cassette Drive" : GOTO 1030 0880 GOSUB '50("ERROR T12: Write Protect","Unprotect tape cassette and press RETURN") : GOTO 1110 0890 M$="ERROR T13: End Of Tape" : GOTO 1030 0900 M$="ERROR T14: Unrecoverable Data Error" : GOTO 1030 0910 M$="ERROR T15: Bad Data Block" : GOTO 1030 0920 M$="ERROR T16: Bad Block" : GOTO 1030 0930 M$="ERROR T17: No Data" : GOTO 1030 0940 M$="ERROR T1A: Unexpected File Mark Read" : GOTO 1030 0950 M$="ERROR T1B: Illegal Command" : GOTO 1030 0960 M$="ERROR T1C: Power On/Reset" : GOTO 1030 0970 M$="ERROR T20: Invalid Number of File Marks" : GOTO 1030 0980 M$="ERROR T23: Insufficient Buffer Space" : GOTO 1030 0990 M$="ERROR T24: Tape Drive Error" : GOTO 1030 1000 M$="ERROR T26: LRC Error" : GOTO 1030 1010 M$="ERROR T27: Device Error" : GOTO 1030 1020 REM %Disk error : M$="ERROR I##: Disk Error" : CONVERT ERR TO STR(M$,8,2),(##) : GOTO 1030 1030 REM %Nonrecoverable error : GOSUB '50("Tape recover aborted",M$) : PRINT HEX(07); 1040 REM %RESTART OR EXIT? : PRINT AT(23,61);"FN/TAB - Exit";AT(22,61);"RETURN - Proceed"; 1050 REM unhog tape ds : $CLOSE#1 1060 KEYIN K$,,1070 : IF K$=HEX(0D) THEN 160 : GOTO 1060 1065 REM % TAB KEY EXIT POINTS 1070 IF K$<>HEX(7E) AND K$<>HEX(7F) THEN 1060 1090 DEFFN'127 1100 DEFFN'126 : LOAD RUN "@MENU" 1110 REM %recoverable tape error : PRINT AT(23,61);"FN/TAB - Exit";AT(22,61);"RETURN - Proceed"; : T$=" " 1120 KEYIN K$,,1130 : IF K$=HEX(0D) THEN 320 : GOTO 1120 1130 IF K$<>HEX(7E) AND K$<>HEX(7F) THEN 1120 : GOTO 1100 1140 DEFFN'50(M1$,M2$) : REM %'50 - display message at lower left corner (lines 22,23) : PRINT AT(22,0);STR(M1$);AT(23,0);STR(M2$);HEX(0F); : RETURN 1150 REM %'201 - display message at lower left corner (line 23) 1160 DEFFN'201(M$) : PRINT AT(23,0);HEX(0E);STR(M$);HEX(0F); : REM KEYIN K$ : RETURN