Post Reply 
Old HP-71 tapes from the 80's uploaded
05-02-2024, 12:36 AM
Post: #1
Old HP-71 tapes from the 80's uploaded
I have uploaded 4 digital micro-cassettes of programs for the 71 to LIF compatible .DAT files with my PIL-Box.

The tapes are labeled as follows:

71Backup
G11-200
G12-100
G13-100

The G12 tape failed partway through with a medium error and there was a 5th tape labeled G14-100 that the directory was unreadable.

These we all made in or around 1982 in conjunction with the CHiP club. I believe most of these were made for me by Mr. George A Duba (thank you Al).

I have attached the .DAT files. I hope there is something new here that hasn't been archived before.

Please see the upload of my 41 tapes in another message.


Attached File(s)
.zip  HP-71Tapes.zip (Size: 142.71 KB / Downloads: 17)
Find all posts by this user
Quote this message in a reply
05-02-2024, 01:59 AM
Post: #2
RE: Old HP-71 tapes from the 80's uploaded
1st - Thanks for sharing these with the community.

The tape that failed partway through and the one with 'bad' directory are probably actually intact, but the pressure pad (behind the tape in the center gap of the tape face, to hold the tape tightly against the read/write head) has come loose; that failure mode makes the tapes act as if they are unreadable. Repairing this is pretty straightforward and restores tapes to working condition nearly every time. The process is a bit fiddly and you need to be careful of the small parts, but it's not difficult.

It's been discussed numerous times, this thread has a lot of links and info:

https://www.hpmuseum.org/forum/thread-21419.html

--Bob Prosperi
Find all posts by this user
Quote this message in a reply
05-02-2024, 02:16 AM
Post: #3
RE: Old HP-71 tapes from the 80's uploaded
(05-02-2024 01:59 AM)rprosperi Wrote:  1st - Thanks for sharing these with the community.

The tape that failed partway through and the one with 'bad' directory are probably actually intact, but the pressure pad (behind the tape in the center gap of the tape face, to hold the tape tightly against the read/write head) has come loose; that failure mode makes the tapes act as if they are unreadable. Repairing this is pretty straightforward and restores tapes to working condition nearly every time. The process is a bit fiddly and you need to be careful of the small parts, but it's not difficult.

It's been discussed numerous times, this thread has a lot of links and info:

https://www.hpmuseum.org/forum/thread-21419.html

Rob,

That was the first thing I checked and the pad is fine on both of them.

Thank you,

Mike
Find all posts by this user
Quote this message in a reply
05-02-2024, 12:12 PM
Post: #4
RE: Old HP-71 tapes from the 80's uploaded
(05-02-2024 02:16 AM)BitWiz Wrote:  That was the first thing I checked and the pad is fine on both of them.

I'd still give it a try. I've have several which "looked" fine, but weren't. When I was fixing a batch of about 10 of these, I also replaced the pad on 3 others that looked OK but failed and had been set aside, just in case... and 3 out of 3 worked after.

May not be worth your time if they aren't of known contents that you really want/need, but thought I'd mention they can look ok but not actually be so.

--Bob Prosperi
Find all posts by this user
Quote this message in a reply
05-02-2024, 12:14 PM (This post was last modified: 05-02-2024 12:16 PM by Sylvain Cote.)
Post: #5
RE: Old HP-71 tapes from the 80's uploaded
(05-02-2024 12:36 AM)BitWiz Wrote:  The G12 tape failed partway through with a medium error and there was a 5th tape labeled G14-100 that the directory was unreadable.
Hello Mike,
The following is a small HP-71B BASIC program that I have written for Mark Power three years ago.
Mark needed to dump his mini-cassette content in a raw format, maybe this will help recover your failed tape content.
Sylvain

View in a printable mode
Code:
 10 ! TAPEDUMP @Copyrights 2021, Sylvain Cote
 11 ! last updated on: 2021-03-20 21h10 EDT
 12 ! Program: do a sector by sector tape dump to a file in main memory (~130KB)
 13 ! Needs  : 71B, 82401A, ~140KB of main RAM

 30 ! A   : DriveAddress       (constant)
 31 ! B   : DriveBusyFlag
 32 ! C   : DriveErrorCode
 33 ! D   : DeviceAccessoryID
 34 ! E   : DriveErrorFlag
 35 ! L   : DriveErrorLevel
 36 ! L0  : InputBufferLength
 37 ! L2  : LogDriveError
 38 ! R0  : ActiveReadTimes
 39 ! R1  : MaxReadTimes       (constant)
 40 ! S   : DriveStatus
 41 ! S0  : TapeSectorActive
 42 ! S1  : TapeSectorNumbers  (constant)
 43 ! S2  : TapeSectorSize     (constant)
 44 ! S3  : TapeSeekFlag       : tell the drive to do a tape seek if set to 1
 45 ! T1  : TapeTrackNumbers   (constant)
 50 ! B0$ : InputBuffer
 51 ! M$  : DriveErrorLevel

100 OPTION BASE 0                                                                         ! array index start at 0
105 DIM B0$[256]                                                                          ! input buffer creation
110 IMAGE #,256A                                                                          ! input format
115 A=1 @ R1=3 @ T1=2 @ S1=256 @ S2=256                                                   ! app constants
120 S=0 @ B=0 @ E=0 @ C=0 @ L=0 @ M$=""                                                   ! init values
125 B0$="" @ L0=0 @ D=0 @ L2=0 @ R0=0                                                     ! init values
130 SFLAG -1 @ PURGE TD @ PURGE TE @ CFLAG -1                                             ! delete old files, disregard error if files are missing
135 CREATE TEXT TD @ CREATE TEXT TE                                                       ! create TapeDump and TapeError files
140 ASSIGN #1 TO TD @ ASSIGN #2 TO TE                                                     ! open TapeDump and TapeError files
145 SFLAG -23                                                                             ! use variable size as tape read length
150 DELAY 0,0                                                                             ! set display and scrolling delays
155 RESET HPIL @ RESTORE IO                                                               ! reset loop
160 GOSUB 'AIDCHECK'                                                                      ! verify that we have a tape drive at specified loop address
165 GOSUB 'REWIND'                                                                        ! rewind tape
170 S3=1                                                                                  ! seek tape to track 0 sector 0
175 FOR T0=0 TO T1-1                                                                      ! track outer loop
180   FOR S0=0 TO S1-1                                                                    !   sector inner loop
185     GOSUB 'READSEC'                                                                   !     read sector from tape
190   NEXT S0                                                                             !   sector inner loop end
195 NEXT T0                                                                               ! track outer loop end
200 GOSUB 'REWIND'                                                                        ! rewind tape
205 ASSIGN #1 TO * @ ASSIGN #2 TO *                                                       ! close files
210 CFLAG -23 @ DELAY 1,1/8                                                               ! restore environment
215 DISP "DUMP DONE"                                                                      ! warn
220 END                                                                                   ! end of program

500 ! device accessory id check                                                           !
505 'AIDCHECK': ! IN: A / UPD: D / OUT: -                                                 ! sub check device type at loop address
510 ! D=DEVAID(A) @ IF D DIV 16#1 THEN DISP "Err: Invalid Device" @ STOP                  !   get accessory id and if device type is a mass storage then stop the program
515   D=DEVAID(A) @ IF D#16       THEN DISP "Err: Invalid Device" @ STOP                  !   get accessory id and if device is not a 82161A then stop the program
520 RETURN                                                                                ! end sub

525 ! loop until drive is ready                                                           !
530 'BUSYWAIT': ! IN: A / UPD: S / OUT: -                                                 ! sub wait until drive is ready
535   'BW': S=SPOLL(A) @ IF BIT(S,5)=1 THEN GOTO 'BW'                                     !   loop until drive is no longer busy
540 RETURN                                                                                ! end sub

545 ! reset drive status variables                                                        !
550 'RSETSTAT': ! IN: A / UPD: S,B,E,C,L / OUT: -                                         ! sub reset status variables
555   S=0 @ B=0 @ E=0 @ C=0 @ L=0                                                         !   set drive status related variables to 0
560 RETURN                                                                                ! end sub

565 ! read & decode drive status byte                                                     !
570 'READSTAT': ! IN: A / UPD: - / OUT: S,B,E,C,L                                         ! sub read and decode drive status
575   S=SPOLL(A) @ B=BIT(S,5) @ E=BIT(S,4) @ C=BINAND(S,15)                               !   read drive status and get busy flag, error flag and error code
580   IF E=0 AND B=0 THEN L=0 @ RETURN                                                    !   if drive not in error and not busy -> set error level to normal  and return
585   IF E=0 AND B=1 THEN L=1 @ RETURN                                                    !   if drive not in error but is busy  -> set error level to warning and return
590   IF C=9 OR C=10 THEN L=1 ELSE L=2                                                    !   if drive error is recoverable      -> set error level to warning otherwise set error level to
595 RETURN                                                                                ! end sub

600 ! build status message                                                                !
605 'BUILDMSG': ! IN: B,E,C,L / UPD: - / OUT: M$                                          ! sub build drive status message
610   IF E=0 AND B=0 THEN M$=""             @ RETURN                                      !   drive is normal, return
615   IF E=0 AND B=1 THEN M$="Drive Busy"   @ GOTO 'BM'                                   !   drive is busy
620   IF C=9         THEN M$="Rec Number"   @ GOTO 'BM'                                   !   unexpected record number, tape read failed, try to re-read the sector
625   IF C=10        THEN M$="Rec Checksum" @ GOTO 'BM'                                   !   invalid record checksum, tape read failed, try to re-read the sector
630   IF C=7         THEN M$="New Tape"     @ GOTO 'BM'                                   !   new tape has been inserted in the drive and need to be seeked
635   IF C=4         THEN M$="No Tape"      @ GOTO 'BM'                                   !   there is no tape in drive
640   IF C=8         THEN M$="Time Out"     @ GOTO 'BM'                                   !   no data record has been found on the tape
645   IF C=3         THEN M$="Tape:EOT+TS"  @ GOTO 'BM'                                   !   unexpected end of tape has been reached AND tape has stalled
650   IF C=1         THEN M$="End of Tape"  @ GOTO 'BM'                                   !   unexpected end of tape has been reached
655   IF C=2         THEN M$="Tape Stalled" @ GOTO 'BM'                                   !   tape has stalled
660   IF C=5 OR C=6  THEN M$="Device"       @ GOTO 'BM'                                   !   generic device error
665   IF C=12        THEN M$="Tape Size"    @ GOTO 'BM'                                   !   track number greather than 1 has been requested
670                       M$="Unknown"                                                    !   unknown error (covers code=0, 11, 13, 14 & 15)
675   'BM': ! build message                                                               !   build message
680   IF L=1 THEN M$="Wrn:"&STR$(C)&":"&M$                                                !   warning message
685   IF L=2 THEN M$="Err:"&STR$(C)&":"&M$                                                !   error message
690 RETURN                                                                                ! end sub

695 ! verify that drive is ready and not in error                                         !
700 'PRECHECK': ! IN: A / UPD: S,B,E,C,L,M$ / OUT: -                                      ! sub pre-check before doing a drive operation
705   GOSUB 'BUSYWAIT' @ GOSUB 'READSTAT' @ M$=""                                         !   wait for drive to be ready, then read current status and decode it
710   IF L=2 THEN GOSUB 'BUILDMSG' @ DISP M$ @ STOP                                       !   if error level is error then display error message then stop the program
715 RETURN                                                                                ! end sub

720 ! rewind drive tape                                                                   !
725 'REWIND': ! IN: A / UPD: S,B,E,C,L,M$ / OUT: -                                        ! sub rewind tape
730   GOSUB 'PRECHECK'                                                                    !   pre-check drive for readyness
735   DISP "Rewinding Tape ..."                                                           !   tell user the action to be taken
740   SEND UNT UNL LISTEN A DDL 7                                                         !   rewind tape
745   GOSUB 'BUSYWAIT'                                                                    !   wait for drive to be ready
750 RETURN                                                                                ! end sub

755 ! position drive head to the specified track & sector                                 !
760 'SEEK': ! IN: A,T0,S0 / UPD: S,B,E,C,L,M$ / OUT: -                                    ! sub seek track:record
765   GOSUB 'PRECHECK'                                                                    !   pre-check drive for readyness
770   DISP "Seek: T="&STR$(T0)&" S="&STR$(S0)                                             !   tell user the action to be taken
775   SEND UNT UNL MTA LISTEN A DDL 4 DATA T0 DATA S0                                     !   seek tape and wait for drive to be ready
780   GOSUB 'BUSYWAIT'                                                                    !   wait for drive to be ready
785 RETURN                                                                                ! end sub

790 ! Set Drive in Read Mode - Drive Fill Buffer 0 with Current Sector                    !
795 'READMODE': ! IN: A / UPD: - / OUT: -                                                 ! sub activate data transfert mode
800   DISP "Read mode activated"                                                          !   tell user the action to be taken
805   SEND UNT UNL TALK A DDT 2                                                           !   drive set in read mode, trigger the drive to fill buffer 0 with current sector
810 RETURN                                                                                ! end sub

815 ! Read Sector                                                                         !
820 'READSEC': ! IN: A,R1,T0,S0,S2,S3,#1,#2 / UPD: R0,S,B,E,C,L,M$,B0$,L0,S3 / OUT: -     ! sub read sector
825   FOR R0=1 TO R1                                                                      !   read times loop
830     IF S3=1 THEN GOSUB 'SEEK' @ GOSUB 'READMODE' @ S3=0                               !     activate data transfer from tape drive
835     DISP "Read T:"&STR$(T0)&" S:"&STR$(S0)&" #"&STR$(R0)                              !     tell user the action to be taken
840     ENTER :A USING 110;B0$ @ L0=LEN(B0$)                                              !     get drive buffer 0, trigger the drive to fill buffer 0 with next sector
845     GOSUB 'BUSYWAIT' @ GOSUB 'READSTAT'                                               !     wait for drive to be ready & get drive status
850     IF L=0 AND L0=S2 THEN PRINT #1;B0$ @ RETURN                                       !     if no error and record length is valid then save record and return
855     IF L=0 THEN DISP "Wrn: Inv.Rec.Length" @ PRINT #2;B0$ @ BEEP 440,1 @ RETURN       !     if no error and record length is invalid then log data and return
860     IF L=1 THEN GOSUB 'BUILDMSG' @ DISP M$ @ BEEP 523,1 @ S3=1                        !     there was an problem reading the tape, warn user
865     IF L=2 THEN GOSUB 'BUILDMSG' @ DISP M$ @ STOP                                     !     if error level is error then display error message then stop the program
870   NEXT R0                                                                             !   end loop
875   PRINT #2;":T="&DTH$(T0)[5]&":S="&DTH$(S0)[4,5]&":E="&DTH$(S)[5]&":"                 !   too many retry, log error (ex.: ":T=1:S=A8:E=A:")
880   DISP "Wrn: Skipped Bad Rec." @ BEEP 440,1 @ S3=1                                    !   warn user, next record will be seeked
885 RETURN                                                                                ! end sub

Sylvain Côté
Find all posts by this user
Quote this message in a reply
05-02-2024, 03:08 PM
Post: #6
RE: Old HP-71 tapes from the 80's uploaded
Sylvain,

Thank you. I will give that a try.

One dumb question. How do I get that file into the 71B.

How do I convert it to a file I can write with lifput?

I'm sorry for the dumb question.

Thank you,

Mike
Find all posts by this user
Quote this message in a reply
05-02-2024, 03:49 PM
Post: #7
RE: Old HP-71 tapes from the 80's uploaded
(05-02-2024 03:08 PM)BitWiz Wrote:  One dumb question. How do I get that file into the 71B.
How do I convert it to a file I can write with lifput?
I will give you a LIF file tonight.

Sylvain Côté
Find all posts by this user
Quote this message in a reply
05-03-2024, 01:38 AM
Post: #8
RE: Old HP-71 tapes from the 80's uploaded
(05-02-2024 03:08 PM)BitWiz Wrote:  One dumb question. How do I get that file into the 71B.

Sylvain's method is faster and better of course, but the old adage about teaching a man to fish is still true.

1. Use alifhdr.exe to prepend a lif header on your source file (copied from his post, saved to a text file):
> alifhdr SOURCE.TXT SOURCE.lif /T

2. On IL-Per, point the DOSLINK IN box to the new SOURCE.lif

3. Copy the file via PIL-Box/IL-Per
COPY :DOSLINK to FILENAME:MAIN

4. TRANSFORM FILENAME TO BASIC

--Bob Prosperi
Find all posts by this user
Quote this message in a reply
05-03-2024, 02:06 AM
Post: #9
RE: Old HP-71 tapes from the 80's uploaded
(05-03-2024 01:38 AM)rprosperi Wrote:  
(05-02-2024 03:08 PM)BitWiz Wrote:  One dumb question. How do I get that file into the 71B.

Sylvain's method is faster and better of course, but the old adage about teaching a man to fish is still true.

1. Use alifhdr.exe to prepend a lif header on your source file (copied from his post, saved to a text file):
> alifhdr SOURCE.TXT SOURCE.lif /T

2. On IL-Per, point the DOSLINK IN box to the new SOURCE.lif

3. Copy the file via PIL-Box/IL-Per
COPY :DOSLINK to FILENAME:MAIN

4. TRANSFORM FILENAME TO BASIC

Rob,

Thank you.

Two questions
1. Why use DOSLINK rather than the 9114B or HDRIVE. I guess I don't understand the difference between DOSLINK and 9114B.

2. Is TRANSFORM FILENAME TO BASIC an HP-71 command?

Thank you all for your patience with me,

Mike
Find all posts by this user
Quote this message in a reply
05-03-2024, 11:24 AM (This post was last modified: 05-03-2024 11:33 AM by Sylvain Cote.)
Post: #10
RE: Old HP-71 tapes from the 80's uploaded
Sorry, something happened last night and I could not make the file.

(05-03-2024 01:38 AM)rprosperi Wrote:  
(05-03-2024 02:06 AM)BitWiz Wrote:  One dumb question. How do I get that file into the 71B.
Sylvain's method is faster and better of course, but the old adage about teaching a man to fish is still true.

Robert's method is way better.

(05-03-2024 02:06 AM)BitWiz Wrote:  1. Why use DOSLINK rather than the 9114B or HDRIVE. I guess I don't understand the difference between DOSLINK and 9114B.

Taken from Jean-François Garnier HP-IL Resource and Emu71/DOS web pages.
(05-03-2024 02:06 AM)BitWiz Wrote:  
(05-03-2024 01:38 AM)rprosperi Wrote:  4. TRANSFORM FILENAME TO BASIC
2. Is TRANSFORM FILENAME TO BASIC an HP-71 command?

Yes!

Sylvain Côté
Find all posts by this user
Quote this message in a reply
05-03-2024, 07:27 PM (This post was last modified: 05-03-2024 07:39 PM by Dave Frederickson.)
Post: #11
RE: Old HP-71 tapes from the 80's uploaded
(05-03-2024 02:06 AM)BitWiz Wrote:  1. Why use DOSLINK rather than the 9114B or HDRIVE. I guess I don't understand the difference between DOSLINK and 9114B.

DOSLINK works with the DOS file system. HP9114B: and HDRIVE: work with LIF disc and tape images.


(05-03-2024 02:06 AM)BitWiz Wrote:  2. Is TRANSFORM FILENAME TO BASIC an HP-71 command?

The format of the command is TRANSFORM filename INTO BASIC.
Find all posts by this user
Quote this message in a reply
05-03-2024, 09:01 PM
Post: #12
RE: Old HP-71 tapes from the 80's uploaded
TRANSFORM is an HP71 command that turns a text file into a BASIC file. Or vice-versa.
Find all posts by this user
Quote this message in a reply
05-04-2024, 03:19 AM
Post: #13
RE: Old HP-71 tapes from the 80's uploaded
One way of doing this ...

Using lifutils
  1. On the computer
    1. Create a 128KB virtual cassette (LIF volume)
      Code:
      lifinit -z -m cass tape_01.dat 32
    2. Name the virtual cassette
      Code:
      liflabel tape_01.dat TAPE01
    3. Copy the following HP-71 BASIC program into a text file named "tapedump.txt"
      Code:
       10 ! TAPEDUMP @Copyrights 2021, Sylvain Cote
       11 ! last updated on: 2021-03-20 21h10 EDT
       12 ! Program: do a sector by sector tape dump to a file in main memory (~130KB)
       13 ! Needs  : 71B, 82401A, ~140KB of main RAM
       29 ! ----:
       30 ! A   : DriveAddress       (constant)
       31 ! B   : DriveBusyFlag
       32 ! C   : DriveErrorCode
       33 ! D   : DeviceAccessoryID
       34 ! E   : DriveErrorFlag
       35 ! L   : DriveErrorLevel
       36 ! L0  : InputBufferLength
       37 ! L2  : LogDriveError
       38 ! R0  : ActiveReadTimes
       39 ! R1  : MaxReadTimes       (constant)
       40 ! S   : DriveStatus
       41 ! S0  : TapeSectorActive
       42 ! S1  : TapeSectorNumbers  (constant)
       43 ! S2  : TapeSectorSize     (constant)
       44 ! S3  : TapeSeekFlag       : tell the drive to do a tape seek if set to 1
       45 ! T1  : TapeTrackNumbers   (constant)
       50 ! B0$ : InputBuffer
       51 ! M$  : DriveErrorLevel
       52 ! ----:
      100 OPTION BASE 0
      105 DIM B0$[256]
      110 IMAGE #,256A
      115 A=1 @ R1=3 @ T1=2 @ S1=256 @ S2=256
      120 S=0 @ B=0 @ E=0 @ C=0 @ L=0 @ M$=""
      125 B0$="" @ L0=0 @ D=0 @ L2=0 @ R0=0
      130 SFLAG -1 @ PURGE TD @ PURGE TE @ CFLAG -1
      135 CREATE TEXT TD @ CREATE TEXT TE
      140 ASSIGN #1 TO TD @ ASSIGN #2 TO TE
      145 SFLAG -23
      150 DELAY 0,0
      155 RESET HPIL @ RESTORE IO
      160 GOSUB 'AIDCHECK'
      165 GOSUB 'REWIND'
      170 S3=1
      175 FOR T0=0 TO T1-1
      180 FOR S0=0 TO S1-1
      185 GOSUB 'READSEC'
      190 NEXT S0
      195 NEXT T0
      200 GOSUB 'REWIND'
      205 ASSIGN #1 TO * @ ASSIGN #2 TO *
      210 CFLAG -23 @ DELAY 1,1/8
      215 DISP "DUMP DONE"
      220 END
      500 ! device accessory id check
      505 'AIDCHECK': ! IN: A / UPD: D / OUT: -
      510 ! D=DEVAID(A) @ IF D DIV 16#1 THEN DISP "Err: Invalid Device" @ STOP
      515 D=DEVAID(A) @ IF D#16 THEN DISP "Err: Invalid Device" @ STOP
      520 RETURN
      525 ! loop until drive is ready
      530 'BUSYWAIT': ! IN: A / UPD: S / OUT: -
      535 'BW': S=SPOLL(A) @ IF BIT(S,5)=1 THEN GOTO 'BW'
      540 RETURN
      545 ! reset drive status variables
      550 'RSETSTAT': ! IN: A / UPD: S,B,E,C,L / OUT: -
      555 S=0 @ B=0 @ E=0 @ C=0 @ L=0
      560 RETURN
      565 ! read & decode drive status byte
      570 'READSTAT': ! IN: A / UPD: - / OUT: S,B,E,C,L
      575 S=SPOLL(A) @ B=BIT(S,5) @ E=BIT(S,4) @ C=BINAND(S,15)
      580 IF E=0 AND B=0 THEN L=0 @ RETURN
      585 IF E=0 AND B=1 THEN L=1 @ RETURN
      590 IF C=9 OR C=10 THEN L=1 ELSE L=2
      595 RETURN
      600 ! build status message
      605 'BUILDMSG': ! IN: B,E,C,L / UPD: - / OUT: M$
      610 IF E=0 AND B=0 THEN M$="" @ RETURN
      615 IF E=0 AND B=1 THEN M$="Drive Busy" @ GOTO 'BM'
      620 IF C=9 THEN M$="Rec Number" @ GOTO 'BM'
      625 IF C=10 THEN M$="Rec Checksum" @ GOTO 'BM'
      630 IF C=7 THEN M$="New Tape" @ GOTO 'BM'
      635 IF C=4 THEN M$="No Tape" @ GOTO 'BM'
      640 IF C=8 THEN M$="Time Out" @ GOTO 'BM'
      645 IF C=3 THEN M$="Tape:EOT+TS" @ GOTO 'BM'
      650 IF C=1 THEN M$="End of Tape" @ GOTO 'BM'
      655 IF C=2 THEN M$="Tape Stalled" @ GOTO 'BM'
      660 IF C=5 OR C=6 THEN M$="Device" @ GOTO 'BM'
      665 IF C=12 THEN M$="Tape Size" @ GOTO 'BM'
      670 M$="Unknown"
      675 'BM': ! build message
      680 IF L=1 THEN M$="Wrn:"&STR$(C)&":"&M$
      685 IF L=2 THEN M$="Err:"&STR$(C)&":"&M$
      690 RETURN
      695 ! verify that drive is ready and not in error
      700 'PRECHECK': ! IN: A / UPD: S,B,E,C,L,M$ / OUT: -
      705 GOSUB 'BUSYWAIT' @ GOSUB 'READSTAT' @ M$=""
      710 IF L=2 THEN GOSUB 'BUILDMSG' @ DISP M$ @ STOP
      715 RETURN
      720 ! rewind drive tape
      725 'REWIND': ! IN: A / UPD: S,B,E,C,L,M$ / OUT: -
      730 GOSUB 'PRECHECK'
      735 DISP "Rewinding Tape ..."
      740 SEND UNT UNL LISTEN A DDL 7
      745 GOSUB 'BUSYWAIT'
      750 RETURN
      755 ! position drive head to the specified track & sector
      760 'SEEK': ! IN: A,T0,S0 / UPD: S,B,E,C,L,M$ / OUT: -
      765 GOSUB 'PRECHECK'
      770 DISP "Seek: T="&STR$(T0)&" S="&STR$(S0)
      775 SEND UNT UNL MTA LISTEN A DDL 4 DATA T0 DATA S0
      780 GOSUB 'BUSYWAIT'
      785 RETURN
      790 ! Set Drive in Read Mode - Drive Fill Buffer 0 with Current Sector
      795 'READMODE': ! IN: A / UPD: - / OUT: -
      800 DISP "Read mode activated"
      805 SEND UNT UNL TALK A DDT 2
      810 RETURN
      815 ! Read Sector
      820 'READSEC': ! IN: A,R1,T0,S0,S2,S3,#1,#2 / UPD: R0,S,B,E,C,L,M$,B0$,L0,S3 / OUT: -
      825 FOR R0=1 TO R1
      830 IF S3=1 THEN GOSUB 'SEEK' @ GOSUB 'READMODE' @ S3=0
      835 DISP "Read T:"&STR$(T0)&" S:"&STR$(S0)&" #"&STR$(R0)
      840 ENTER :A USING 110;B0$ @ L0=LEN(B0$)
      845 GOSUB 'BUSYWAIT' @ GOSUB 'READSTAT'
      850 IF L=0 AND L0=S2 THEN PRINT #1;B0$ @ RETURN
      855 IF L=0 THEN DISP "Wrn: Inv.Rec.Length" @ PRINT #2;B0$ @ BEEP 440,1 @ RETURN
      860 IF L=1 THEN GOSUB 'BUILDMSG' @ DISP M$ @ BEEP 523,1 @ S3=1
      865 IF L=2 THEN GOSUB 'BUILDMSG' @ DISP M$ @ STOP
      870 NEXT R0
      875 PRINT #2;":T="&DTH$(T0)[5]&":S="&DTH$(S0)[4,5]&":E="&DTH$(S)[5]&":"
      880 DISP "Wrn: Skipped Bad Rec." @ BEEP 440,1 @ S3=1
      885 RETURN
    4. Add the program file as a LIF text file to the LIF volume
      • Unix
        Code:
        cat tapedump.txt | textlif TAPEDUMP | lifput tape_01.dat
      • Windows
        Code:
        type tapedump.txt | textlif TAPEDUMP | lifput tape_01.dat
    5. Show virtual cassette content
      Code:
      lifdir tape_01.dat
      Code:
      Volume : TAPE01 , formatted : 03/05/24 22:00:00
      Tracks: 2 Surfaces: 1 Blocks/Track: 256 Total size: 512 Blocks, 131072 Bytes
      TAPEDUMP    TEXT         4864/4864     03/05/24 22:31:46
      1 files (32 max), last block used: 24 of 512
  2. Load the virtual cassette into a mass storage emulator (pyILPER, ILPER, etc)
  3. Connect a 71B to the mass storage emulator (71B+PilBox, Emu71, etc.)
  4. On the HP-71B
    1. Reset HP-IL loop
      Code:
      RESTORE IO
    2. Show tape content
      Code:
      CAT :TAPE
      Code:
         NAME    S TYPE   LEN    DATE    TIME 
      TAPEDUMP     TEXT   4864 05/03/24 22:31
    3. Copy text file into the 71B
      Code:
      COPY TAPEDUMP:TAPE
    4. Show 71B file system content
      Code:
      CAT ALL
      Code:
        NAME   S TYPE   LEN    DATE    TIME PORT
      workfile   BASIC     0 03/05/24 00:11 
      TAPEDUMP   TEXT   4864 05/03/24 23:08
    5. Transform text file into a BASIC program
      Code:
      TRANSFORM TAPEDUMP INTO BASIC
    6. Show 71B file system content
      Code:
      CAT ALL
      Code:
        NAME   S TYPE   LEN    DATE    TIME PORT
      workfile   BASIC     0 03/05/24 00:11 
      TAPEDUMP   BASIC  3708 05/03/24 23:08
    7. List program to printer
      Code:
      PLIST TAPEDUMP
    8. Compare listing with the original source file


Sylvain Côté
Find all posts by this user
Quote this message in a reply
05-04-2024, 01:04 PM
Post: #14
RE: Old HP-71 tapes from the 80's uploaded
(05-03-2024 07:27 PM)Dave Frederickson Wrote:  
(05-03-2024 02:06 AM)BitWiz Wrote:  2. Is TRANSFORM FILENAME TO BASIC an HP-71 command?

The format of the command is TRANSFORM filename INTO BASIC.

Thanks Dave, good catch!!

Sorry for the bad tip...

--Bob Prosperi
Find all posts by this user
Quote this message in a reply
Post Reply 




User(s) browsing this thread: 1 Guest(s)