--- title: "Tape Transfer Utility" id: 72822 type: "computer_media" slug: "tape-transfer-utility" url: "http://localhost/computer_media/tape-transfer-utility/" markdown_url: "http://localhost/computer_media/tape-transfer-utility.md" published_at: "2026-10-27T14:27:22+00:00" modified_at: "2026-10-27T14:27:22+00:00" author: "David Anderson" featured_image: url: "http://localhost/wp-content/uploads/2026/10/p-2.png" excerpt: "A Spectrum utility for copying software to Rotronics Wafadrive: reads a tape header and shows its details, frees the Wafadrive's RAM, or loads a program without letting it run." post_tag: - name: "Downloadable" slug: "downloadable" taxonomy: "post_tag" url: "http://localhost/tag/downloadable/" - name: "ZX Spectrum" slug: "zx-spectrum" taxonomy: "post_tag" url: "http://localhost/tag/zx-spectrum/" model: - name: "Sinclair ZX Spectrum" slug: "zxspectrum" taxonomy: "model" url: "http://localhost/model/zxspectrum/" indiv: - name: "Dave Maccarone" slug: "dave-maccarone" taxonomy: "indiv" url: "http://localhost/indiv/dave-maccarone/" genre: - name: "Tape" slug: "tape" taxonomy: "genre" url: "http://localhost/type/tape/" media_type: "Program" programmers: - name: "Dave Maccarone" slug: "dave-maccarone" taxonomy: "indiv" url: "http://localhost/indiv/dave-maccarone/" download_url: "https://archive.org/download/timex-sinclair-software-archive/Tape%20Transfer%20Utility%20%281988%29%28Maccarone%2C%20Dave%29%28ZX%20Spectrum%29%28US%29%28Program%29.zip" mediadate: "1988" images: - url: "http://localhost/wp-content/uploads/2026/10/p-2.png" - url: "http://localhost/wp-content/uploads/2026/10/w-2-1.png" article_media: - id: 15424 title: "Tape Transfer Utility" type: "article" url: "http://localhost/article/tape-transfer-utility/" media_type_tags: "Tape" license: false --- # Tape Transfer Utility Tape Transfer Utility helps move software from cassette to the Rotronics Wafadrive, a stringy-floppy drive for the ZX Spectrum. It has three options. READ HEADER loads the next header from tape and shows the file’s type, name, length, and either its auto-run line or its start address. RECLAIM RAM de-initialises the Wafadrive operating system and gives its memory back to BASIC. STOP loads a BASIC program from tape without letting it auto-run, even if it is protected against MERGE, and shows the line it would have started from. The program was printed in *Time Designs*, July/August 1988, page 27, “supplied to TIME DESIGNS by Dave Maccarone, a former authorized distributor of the Rotronics Wafadrive”. The magazine notes that it is for the Spectrum or the Spectrum-emulated Timex Sinclair 2068: its machine code calls Spectrum ROM routines. ## Program Analysis Line 1000 pokes 86 bytes of machine code from DATA into the printer buffer at 23320. The header reader (called at 23320) loads a 17-byte header into 23296 with the ROM’s LD-BYTES at 1366; the BASIC then decodes it (lines 120–180). The RAM routine (23340) appears to switch off the Wafadrive system, restore the system variables and reclaim its workspace through the ROM, and the STOP routine (23369) loads a program with its auto-run line suppressed. As the article says, the routines are relocatable, and the BASIC saves memory with `VAL "..."`, `SGN PI` and `NOT PI` in place of numbers. ### Potential Issues - It runs only on a Spectrum, or a TS2068 in Spectrum emulation; on a TS2068 in its own mode the ROM calls go to the wrong places. The copy on the Larken disk had lost lines 130–180, the part of READ HEADER that displays what it has read, so option 1 fell straight through into RECLAIM RAM. They were typed back in from the listing in the magazine. Tested in ZEsarUX as a 48K Spectrum: headers of a program and a CODE file were read and shown. ## Source Code ``` 10 PAPER VAL "5": INK NOT PI: BORDER VAL "5": GO SUB VAL "1E3" 20 CLS : PRINT "Enter number:"'''' 30 PRINT " 1 READ HEADER"'" - loads header from cassette & displays file attributes." 40 PRINT ''" 2 RECLAIM RAM"'" - de-initializes WOS & reclaims RAM." 50 PRINT ''" 3 STOP "'" - loads BASIC program from cassette, preventing auto- run." 60 LET a$=INKEY$: IF a$<"1" OR a$>"3" THEN GO TO VAL "60" 70 CLS : GO TO VAL "100"*VAL a$ 100 REM HEADER READ 110 PRINT " HEADER READ "''"Play tape...": RANDOMIZE USR VAL "23320": CLS : LET a=VAL "23296" 120 LET t=PEEK a: LET a=a+SGN PI 130 PRINT "TYPE:","Program" AND (NOT t);"Number array" AND (t=SGN PI);"String array" AND (t=VAL "2");"Bytes" AND (t=INT PI) 140 PRINT '"NAME:",: FOR n=SGN PI TO VAL "10": PRINT CHR$ (PEEK a);: LET a=a+SGN PI: NEXT n 150 PRINT ''"LENGTH:",PEEK a+256*PEEK (a+1): LET a=a+VAL "2" 160 LET b=PEEK a+256*PEEK (a+1): IF NOT t THEN PRINT '"AUTO-RUN:",: IF bCODE "Y" AND a<>CODE "y" THEN RUN 2030 CLS : RETURN 9989 STOP 9999 SAVE "TPTRNS" LINE 10 ```