--- title: "Supertools" id: 72102 type: "computer_media" slug: "supertools" url: "http://localhost/computer_media/supertools/" markdown_url: "http://localhost/computer_media/supertools.md" published_at: "2026-10-21T05:34:33+00:00" modified_at: "2026-10-21T05:34:33+00:00" author: "David Anderson" featured_image: url: "http://localhost/wp-content/uploads/2026/10/supertools-1.png" excerpt: "Six relocatable machine-code programming aids: tape header reader, string finder, REM remover, variable lister, line renumberer and an interrupt-driven program tracer." category: - name: "Archived Media" slug: "archived-media" taxonomy: "category" url: "http://localhost/category/archived-media/" post_tag: - name: "Downloadable" slug: "downloadable" taxonomy: "post_tag" url: "http://localhost/tag/downloadable/" - name: "McBrine Computer Products" slug: "mcbrine-computer-products" taxonomy: "post_tag" url: "http://localhost/tag/mcbrine-computer-products/" - name: "TS 2068" slug: "ts2068" taxonomy: "post_tag" url: "http://localhost/tag/ts2068/" model: - name: "Timex/Sinclair 2068" slug: "ts-2068" taxonomy: "model" url: "http://localhost/model/ts-2068/" indiv: - name: "William McBrine" slug: "william-mcbrine" taxonomy: "indiv" url: "http://localhost/indiv/william-mcbrine/" genre: - name: "Utility" slug: "utility" taxonomy: "genre" url: "http://localhost/type/utility/" media_type: "Program" programmers: - name: "William McBrine" slug: "william-mcbrine" taxonomy: "indiv" url: "http://localhost/indiv/william-mcbrine/" download_url: "https://archive.org/download/timex-sinclair-software-archive/Supertools%20%281988%29%28McBrine%2C%20William%29%28TS2068%29%28US%29%28Program%29.zip" tsrun_member: "Supertools (1988)(McBrine, William)(TS2068)(US)(Program)/Supertools (1988)(McBrine, William)(TS2068)(US)(Program).tap" mediadate: "1988" producer_company: - id: 11084 title: "McBrine Computer Products" type: "company" url: "http://localhost/company/mcbrine-computer-products/" images: - url: "http://localhost/wp-content/uploads/2026/10/supertools-1.png" - url: "http://localhost/wp-content/uploads/2026/10/supertools-2.png" related_products: - id: 14151 title: "Supertools" type: "product" url: "http://localhost/product/supertools/" media_type_tags: "Utility" license: false --- # Supertools Six machine-code utilities for BASIC programmers, run without any POKEs. Read Tape Header lists the type, name, length, start address or autorun line, and program length of each file it finds on a tape, to the screen or the printer. Find String lists every program line that contains the contents of `a$`. Remkill deletes all lines that begin with `REM`, and Variable Dump lists every variable in memory, including arrays and FOR-loop control variables with their limit, step and loop line. Renumber renumbers all or part of a program and updates `GO TO`, `GO SUB`, `RESTORE`, `RUN`, `LIST`, `LLIST` and `LINE` references. Program Tracer uses interrupt mode 2 to show each statement in the bottom lines of the screen as it runs, with switchable display modes and an adjustable delay. The Renumber and Tracer configuration programs show the credit William J. McBrine III and “© 1988 McBrine Computer Products”. The tape opens with a menu loader added for this release. Options 1 and 2 load the Renumber and Tracer configuration programs, and options 3 to 6 do `CLEAR 32767` and load Header, Finder, Remkill or Variable Dump at 32768. McBrine’s two-part manual is included as text. ## Program Analysis ### The Utilities - `header` (299 bytes): start with `RANDOMIZE USR` and play a tape; press BREAK to stop. It reads Spectrum files too. `OPEN #2,"p"` sends the listing to the printer. - `finder` (170 bytes): searches for `a$`, ignoring the hidden number slugs. If `a$` doesn’t exist it stops with “2 Variable not found”. - `remkil` (81 bytes): removes lines that start with `REM`. A `REM` at the end of a multi-statement line is left in place. - `vars` (330 bytes): lists simple and array variables in a LIST-like format, such as `x (to -30 step -1.5, 320:6) = -31.5` for a control variable. - Renumber (`ren`, 566 bytes): uses the variables `a` (first new number), `b` (step) and `c` (the line to start at). Updated references are written as four-digit numbers with leading zeros. - Tracer (`tr`, 718 bytes): ENTER plus L, K, J, H, G or F selects no display, line and statement number, a one-line or two-line statement display, free memory or `FRAMES`. ENTER+D and ENTER+S change the delay, and ENTER+A turns the tracer off. ### Configuration Programs Header, Finder, Remkill and Variable Dump are fully relocatable and can be loaded at any address. Renumber and Tracer aren’t relocatable, so each has a BASIC configuration program with a three-item menu: back up the configuration program, produce an output file, or exit. The configuration program asks for a start address, in decimal or as hex with a `#` prefix. It POKEs the address into a setup word and calls a relocating routine (`RANDOMIZE USR magic`) to adjust the code, then saves `ren.C1` or `tr.C1`. Addresses that clash with system memory are rejected. The Tracer setup first prints a table of all usable jump-table pages, blocks 128–254 with their hex and decimal addresses, and rejects a code address that overlaps the 257-byte table. ### Notable Techniques - `POKE 23658,8` turns on CAPS LOCK, so the configuration programs need to check only upper-case `Y` and `N`. Exiting resets it to 0. - The hex input routine sets `a`–`f` to 10–15, so `VAL` of each digit character gives its value. - Range checks are written as `IF VAL "num<25088 OR …"`, putting the whole Boolean expression inside a `VAL` string. - The Tracer page table is printed under `ON ERR GO TO`, so answering the scroll? prompt with N or BREAK goes on to the address prompt instead of stopping. - The tools keep their temporary storage in the unused system-variable area at 24064–24448. The manual warns not to load any code there. ### Potential Issues - The manual warns that the Tracer must be turned off with ENTER+A before any tape SAVE, LOAD, MERGE or VERIFY. The tracer can’t be used with other interrupt-driven code. - Renumber ignores computed or quoted targets such as `GO TO VAL "30"` or `GO SUB start`, and it ignores `DELETE`. If a new line number would pass 9999 it stops with error Q, and the manual warns that the program is then corrupted. - The menu loader puts options 3–6 at 32768, so only one of those four tools can be loaded from the menu at a time. They can be loaded by hand at other addresses. This copy comes from a Larken disk in the TS User Group collection (disk l-36). It was converted for tape by removing the LKDOS `RANDOMIZE USR 100`, `OPEN #4` and `PRINT #4:` prefixes from the Renumber and Tracer loaders and save lines, and the menu loader was added. It was tested in ZEsarUX. ## Source Code ``` 10 PRINT "Program Renumber v. 1.0"''"by William J. McBrine III"''"* 1988 McBrine Computer Products"'"--------------------------------" 20 PRINT "This configuration program will ask you for the start address ofthe code, then will configure and save the executable code." 30 PRINT '"Remember that very high memory locations may be overwritten by UDG's, and low memory locations may be overwritten by the BASIC program and variables. Of course, machine code could over-write any area of memory." 40 LET setup=32768: LET magic=32770: LET start=32859: LET len=566: LET len2=655: LET mode=23658: POKE mode,8 50 PRINT #0;AT 1,3;"Press any key to continue.": PAUSE 0 60 CLS : PRINT TAB 10;" Main Menu "''"1. Backup Configuration Program"''"2. Produce Output File"''"3. Exit the Program" 70 LET a$=INKEY$: IF a$>"3" OR a$<"1" THEN GO TO 0070 80 IF a$="3" THEN POKE mode,0: STOP 90 IF a$="1" THEN GO SUB 0120 100 IF a$="2" THEN GO SUB 0170 110 GO TO 0060 120 CLS : PRINT " Backup Configuration Program "''"OK to Backup (y/n)?" 130 LET a$=INKEY$: IF a$="" THEN GO TO 0130 140 IF a$="N" THEN RETURN 150 IF a$<>"Y" THEN GO TO 0130 160 PRINT #4: SAVE "RENUM.B1" LINE 0360: PRINT #4: SAVE "renum.C1"CODE magic,len2: RETURN 170 GO SUB 0220: PRINT '"OK to SAVE (y/n)?" 180 LET a$=INKEY$: IF a$="" THEN GO TO 0180 190 IF a$="N" THEN RETURN 200 IF a$<>"Y" THEN GO TO 0180 210 PRINT #4: SAVE "ren.C1"CODE start,len: RETURN 220 CLS : PRINT TAB 4;" Code Starting Address " 230 PRINT '"The code can reside at any address, as long as it does not conflict with anything else. Thecode is 566 (0236h) bytes long."''"Starting address: ";: GO SUB 0260 240 IF VAL "num<25088 OR (num>26122 AND num<(PEEK 23653+256*PEEK 23654))" THEN PRINT '"System memory confict; try again": PAUSE 180: GO TO 0220 250 POKE setup+1,INT (num/256): POKE setup,num-256*INT (num/256): RANDOMIZE USR magic: RETURN 260 GO SUB 0270: PRINT num: RETURN 270 INPUT LINE a$: IF a$="" THEN GO TO 0270 280 IF a$(1)="#" THEN LET a$=a$(2 TO ): GO TO 0310 290 LET num=VAL a$ 300 RETURN 310 REM hex to dec 320 LET a=10: LET b=11: LET c=12: LET d=13: LET e=14: LET f=15 330 IF LEN a$<4 THEN FOR x=1 TO 4-LEN a$: LET a$="0"+a$: NEXT x 340 LET num=4096*VAL a$(1)+256*VAL a$(2)+16*VAL a$(3)+VAL a$(4) 350 RETURN 360 RANDOMIZE USR 100: OPEN #4,"dd": CLEAR 32767: PRINT #4: LOAD "renum.C1"CODE : RUN ```