--- title: "Smart Text V4" id: 56713 type: "computer_media" slug: "smart-text-v4" url: "http://localhost/computer_media/smart-text-v4/" markdown_url: "http://localhost/computer_media/smart-text-v4.md" published_at: "2024-09-22T23:31:48+00:00" modified_at: "2026-04-03T07:58:57+00:00" author: "David Anderson" featured_image: url: "http://localhost/wp-content/uploads/2024/09/SCR-20241029-sywb.png" excerpt: "A BASIC word processor with three text buffers, justified output, multiple printer modes, and machine-code case conversion — all packed into one self-initialising program." 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: "Gulf Micro Electronics" slug: "gulf-micro-electronics" taxonomy: "post_tag" url: "http://localhost/tag/gulf-micro-electronics/" - name: "TS 1000" slug: "ts1000" taxonomy: "post_tag" url: "http://localhost/tag/ts1000/" model: - name: "Timex/Sinclair 1000" slug: "ts-1000" taxonomy: "model" url: "http://localhost/model/ts-1000/" indiv: - name: "Bill Jones" slug: "bill-jones" taxonomy: "indiv" url: "http://localhost/indiv/bill-jones/" genre: - name: "Word Processor" slug: "word-processor" taxonomy: "genre" url: "http://localhost/type/word-processor/" media_type: "Program" programmers: - name: "Bill Jones" slug: "bill-jones" taxonomy: "indiv" url: "http://localhost/indiv/bill-jones/" download_url: "https://archive.org/download/timex-sinclair-software-archive/Smart%20Text%20V4%20%281984%29%28Gulf%20Micro%20Electronics%29%28TS1000%29%28US%29%28Cassette%29.zip" mediadate: "1984" producer_company: - id: 10680 title: "Gulf Micro Electronics" type: "company" url: "http://localhost/company/gulf-micro-electronics/" images: - url: "http://localhost/wp-content/uploads/2024/09/SCR-20241029-sywb.png" - url: "http://localhost/wp-content/uploads/2024/09/SCR-20241029-symv.png" - url: "http://localhost/wp-content/uploads/2024/09/Smart-Text.jpg" related_products: - id: 22284 title: "Smart Text ZX/TS" type: "product" url: "http://localhost/product/smart-text-zx-ts/" media_type_tags: "Word Processor" --- # Smart Text V4 Smart Text ZX/TS is a word-processing program that supports three text “books” (Z$, R$, S$) each up to approximately 3,800 characters, plus a selected-paragraph buffer (X$). It drives an attached printer in either full-size or 32-column mode, with control codes sent via POKE to memory-mapped printer registers (addresses 65535, 16507, 16508) to select print sizes, spacing, case conversion, and line-feed behaviour. The program makes extensive use of numeric variables as GOSUBable line-number aliases (e.g. FM, TE, PE, IK, IL, LS, ZO) to keep the GOTO/GOSUB targets short and easily reassignable. Two RAND USR calls at lines 8374 and 8378 invoke machine-code routines at addresses 7804 and 7868, most likely for upper/lower-case conversion. Text justification is implemented in BASIC by a word-wrap loop (lines 7436–7492) that inserts spaces between words to fill each line to the configured line length (LL). *** ## Program Analysis ### Program Structure The program is a multi-function word processor. Execution begins at line 7024 (splash screen) and flows through an initialisation block at lines 8474–8520 that sets every working variable before jumping back to line 7024. The main dispatch hub is the “Function Menu” at line 7362, aliased to the variable `FM`. Nearly all major sections return to `FM` after completion. Key functional regions: - **7024–7078** — Splash/title screen and printer-type selection - **7096–7130** — Paragraph typing and accumulation into book buffers - **7132–7142** — Book/buffer selector (A–E → Z$, R$, S$, X$, U$) - **7200–7249** — Caption/heading printing - **7250–7271** — Line-spacing subroutine (`LS`) - **7274–7278** — ZO: conditional linefeed via PEEK of printer counter - **7308–7390** — Page-status and options menu - **7362–7390** — Function menu (FM) - **7392–7419** — Format menu (print size, case, indent, line length) - **7420–7584** — Text-output engine: word-wrap, justification, indent handling - **7586–7736** — Book A editor with search/replace and paragraph extraction - **7748–7765** — Data status report - **7766–7816** — Letterhead print routine - **7820–7856** — Sign-off / closing block - **7888–7960** — Date and salutation entry - **8038–8104** — Paragraph-boundary identification and selected-paragraph viewer - **8134–8152** — Input subroutines IL (any key) and IK (1 or 2 only) - **8220–8370** — Printer control: POKE sequences for various print modes - **8374–8380** — Machine-code calls for case conversion - **8384–8410** — Page-end handler (PE) - **8426–8443** — Line-feed block (SP: four blank lines) - **8474–8520** — Initialisation and SAVE block ### Variable Aliasing as Subroutine Addresses A pervasive technique here is storing line numbers in numeric variables and using them directly in `GOTO`/`GOSUB`. This avoids hardcoding targets throughout the program and allows the author to renumber sections by changing only the initialisation block. The aliases defined at lines 8474–8520 include: | Variable | Value | Purpose | | --- | --- | --- | | `FM` | 7362 | Function menu | | `TE` | 7420 | Text-output engine entry | | `PE` | 8384 | Page-end handler | | `LS` | 7250 | Line-spacing prompt | | `IK` | 8144 | Input: key 1 or 2 | | `IL` | 8134 | Input: any key | | `ZO` | 7274 | Conditional linefeed | | `LF` | 8236 | Single linefeed POKE | | `ZX` | 8248 | 32-column printer init | | `SP` | 8438 | Blank-line spacer | Using `VAL "number"` inside `GOTO`/`GOSUB` arguments is a known memory-saving idiom on this platform, storing the target as a string rather than a floating-point number. ### Text Buffer Architecture Three main string variables act as “books”: `Z$` (Book A), `R$` (Book B), and `S$` (Book C), each capped at approximately 3,800 characters by the checks at lines 7116–7119. A fourth buffer `X$` holds a selected paragraph, and `U$` holds the most recently typed paragraph. The accumulation variable `ACC` tracks which book is currently active (0=A, 1=B, 2=C). Free memory is reported at line 7748 using `PEEK 16386 + 256*PEEK 16387 - PEEK 16412 - 256*PEEK 16413`, a standard technique for reading the BASIC system variables that track RAMTOP and the program/variable area. ### Printer Control via POKE Two memory addresses are used for direct printer communication: `ME` (initialised to 65535) receives character codes for special printer commands, and `EN` / `CT` (16507/16508) control printer enable and a line counter. The subroutines from line 8220 onwards issue sequences of `POKE ME, CODE "x"` to send escape-like codes to the printer interface. Different print sizes and modes (normal, medium, small/wide, small/narrow, large, double-space) each have their own POKE sequence: - Lines 8260–8276: Full-size mode (PS=1) - Lines 8332–8348: Double-wide / 86-char line (PS=2) - Lines 8312–8328: Condensed wide / 106-char line (PS=3) - Lines 8352–8370: Large print (PS=4) - Lines 8246–8256: 32-column printer initialisation Line lengths (`LL`) and tab centres (`QQ`) are adjusted at the same time to match the selected print mode, and further modified when indent mode (`ID=1`) is active. ### Word-Wrap and Justification Engine The output engine at lines 7436–7492 implements full justification in pure BASIC. It slices the working string `W$` to line length `LL`, then scans backwards from position `LL` to find the last space (lines 7440–7444), producing a candidate line `Y$`. The subroutine at lines 7494–7514 then expands `Y$` to exactly `LL` characters by progressively inserting extra spaces between words, cycling through space positions with variable `R`. Leading spaces are stripped before printing (lines 7450–7452). The loop continues, consuming `W$` from the left, until the remainder fits within `LL`, at which point the final fragment is printed unjustified (lines 7534–7540). ### Machine Code Integration Lines 8374 and 8378 call `RAND USR 7804` and `RAND USR 7868` respectively. Based on their context in the Format Menu (triggered by options “3 UP CSE” and “4 LOW CSE” at line 7392), these routines almost certainly perform in-place upper-case and lower-case conversion of printer output or the active buffer. The machine-code routines are not included in this BASIC listing and would have been stored separately in memory or loaded alongside the program. ### Search and Replace The editor at lines 7626–7684 implements a windowed search-and-replace over Book A (`Z$`). It displays 480-character windows (using `CODE " TO "` = 480 as the window stride), asks for a search group `Y$`, then scans for it character by character. On finding a match at position `U`, it offers four options: replace, delete (replace with empty), identify paragraph start, or identify paragraph end. Replacement is performed with direct string concatenation: `Z$=Z$(TO U-1)+P$+Z$(U+LEN Y$ TO)`. ### Paragraph Extraction Options 3 and 4 in the search menu (lines 8038–8086) allow the user to mark a paragraph start (`BG=U`) and end (`NP=U-1+LEN Y$`), then copy that slice to the selected-paragraph buffer `X$`. The append function at lines 7709–7736 can then prepend or append further text to `X$`, allowing non-contiguous paragraph assembly. ### Input Subroutines Two subroutines handle keyboard input without using `INPUT`: `IL` (line 8134) accepts any single keypress, and `IK` (line 8144) accepts only “1” or “2”, looping until a valid key is pressed. Both use the `PAUSE VAL "4E4"` / `INKEY$` idiom, which suspends execution for up to 40,000 frames and then reads the key, avoiding busy-wait loops. ### Anomalies and Notable Details - Line 7582 reads `IF LL>=LN THEN GOSUB 7802` — this compares line length to page length, which seems semantically wrong; it is likely intended to be `NN>=LN` (current line count vs. page length), matching all other page-end checks. - Line 7646 jumps to `7640`, which does not exist; line 7638 begins the FOR loop and line 7640 is the inner IF. This effectively creates an infinite scan loop if the search string is not found within the window — a latent hang bug. - Lines 8066–8086 contain redundant and conflicting checks on `BG` and `NP`; the condition `CODE " "` (= 32) is used as a sentinel value, mixing character codes with logical zero/one flags. - Line 7850 prints `"B%I%L%L J%O%N%E%S%S"` — an apparent typo (double S) in the sign-off name for 32-column printer mode. - The initialisation block (lines 8474–8520) uses `CODE "\' "`, `CODE "\ '"` etc. to set numeric variables to small integers derived from block-graphic character codes, an obfuscated but compact way to initialise values of 1 and 2. ## Source Code ``` 1 REM ** VERSION 1 FOR WORK ADAPATATION **** 7024 PRINT AT CODE "##",CODE "##";"SMART TEXT ZX/TS" 7044 PRINT AT CODE "~~",CODE ":'";"COPYRIGHT 1984 BY:";AT VAL "11",CODE ": ";"GULF MICRO ELECTRONICS";AT CODE "£",CODE ".'";"PANAMA CITY, FL 32404";AT CODE ":",CODE ":'";"ALL RIGHTS RESERVED" 7068 PAUSE CODE "%Z" 7069 CLS 7072 PRINT AT CODE "~~",CODE "##";"PRINTER TYPE?";AT CODE "£",CODE " '";"<1> FULL SIZE: OR <2> 32 COL" 7074 GOSUB IK 7076 LET PR=VAL T$ 7078 GOTO FM 7096 PRINT AT CODE "~~",CODE "~~";"BEG TYPE";AT CODE "£",CODE ": ";" AS TYP SLOWS" 7097 PAUSE CODE "2" 7098 CLS 7099 LET U$="" 7102 INPUT V$ 7104 CLS 7106 LET U$=U$+" "+V$ 7108 PRINT AT CODE "~~",CODE ".'";"PARA END?";AT CODE "£",CODE ".'";"<1> YES <2> NO" 7110 GOSUB IK 7112 IF T$="2" THEN GOTO VAL "7102" 7114 LET V$="" 7115 IF AC=VAL "0" THEN GOTO FM 7116 IF LEN Z$VAL "3800" THEN LET ACC=VAL "1" 7118 IF LEN R$>VAL "3800" THEN LET ACC=VAL "2" 7119 IF LEN S$>VAL "3800" THEN GOTO VAL "7748" 7120 IF ACC=VAL "0" THEN LET Z$=Z$+U$ 7128 IF ACC=VAL "1" THEN LET R$=R$+U$ 7129 IF ACC=VAL "2" THEN LET S$=S$+U$ 7130 GOTO FM 7132 CLS 7133 IF T$="A" THEN LET W$=Z$ 7134 IF T$="B" THEN LET W$=R$ 7136 IF T$="C" THEN LET W$=S$ 7138 IF T$="D" THEN LET W$=X$ 7140 IF T$="E" THEN LET W$=U$ 7142 GOTO TE 7200 LET IDD=ID 7210 LET ID=VAL "0" 7212 IF PS=VAL "2" OR PS=VAL "3" THEN GOSUB VAL "8260" 7218 GOSUB LS 7220 PRINT AT CODE "~~",CODE "##";"TYPE CAP LESS THAN";AT CODE "£",CODE "##";LL;" CHRS IN LGTH" 7222 INPUT Q$ 7224 CLS 7226 LPRINT TAB QQ-INT (LEN Q$/VAL "2"+1.5);Q$ 7227 IF PR=VAL "1" THEN GOSUB ZO 7228 LET NN=NN+VAL "1" 7230 IF NN>=LN THEN GOSUB PE 7234 GOSUB LS 7236 PRINT AT CODE "~~",CODE "~~";"ANOTHER CAP?";AT CODE "£",CODE ":'";"<1> YES <2> NO" 7238 GOSUB IK 7240 IF T$="2" THEN LET ID=IDD 7242 IF T$="2" AND PR=VAL "1" THEN GOSUB VAL "7430" 7244 IF T$="2" AND PR=VAL "2" THEN GOSUB ZX 7246 IF T$="2" THEN GOTO FM 7249 GOTO VAL "7220" 7250 PRINT AT CODE "~~",CODE ".'";"LN SPCS?";AT CODE "£",CODE ".'";"0, 1, 2, OR 3" 7252 GOSUB IL 7254 IF T$<"0" OR T$>"3" THEN GOTO LS 7256 IF T$="0" THEN RETURN 7258 IF T$="1" AND PR=VAL "1" THEN GOSUB LF 7260 IF T$="1" AND PR=VAL "2" THEN GOSUB SP 7262 IF T$="2" AND PR=VAL "1" THEN GOSUB VAL "8232" 7263 IF T$="2" AND PR=VAL "2" THEN GOSUB VAL "8434" 7264 IF T$="3" AND PR=VAL "1" THEN GOSUB VAL "8228" 7268 IF T$="3" AND PR=VAL "2" THEN GOSUB VAL "8430" 7270 IF NN>=LN THEN GOSUB PE 7271 RETURN 7274 IF PEEK CT>VAL "0" THEN LPRINT 7276 IF PEEK CT>VAL "0" THEN GOTO ZO 7278 RETURN 7308 PRINT AT CODE "~~",CODE ",,";"ENT NEW NBR" 7310 INPUT LN 7311 CLS 7312 PRINT AT CODE "~~",CODE ".'";"NX PG IS: ";PG+VAL "1";AT VAL "11",CODE ".'";"LNS TO PG END ";LN-NN;AT CODE "$",CODE ".'";"OPTIONS:";AT CODE "?",CODE ".'";"1 CHG PG NBR";AT CODE "(",CODE ".'";"2 CHG LNS TO END";AT CODE ")",CODE ".'";"3 ROLL PG";AT CODE ">",CODE ".'";"4 RE-SET PG LGTH";AT CODE "=",CODE ".'";"5 FUN MENU" 7316 GOSUB IL 7318 IF T$<"1" OR T$>"5" THEN GOTO VAL "7312" 7320 IF T$="5" THEN GOTO FM 7322 IF T$="1" THEN GOTO VAL "7332" 7324 IF T$="2" THEN GOTO VAL "7342" 7326 IF T$="3" THEN GOSUB PE 7327 IF T$="4" THEN GOTO VAL "7308" 7328 GOTO FM 7332 PRINT AT CODE "~~",CODE "##";"TYP PG NBR";AT CODE "£",CODE "##";"THEN, ENT" 7334 INPUT PG 7336 CLS 7338 LET PG=PG-VAL "1" 7340 GOTO VAL "7312" 7342 PRINT AT CODE "~~",CODE "##";"TYP NU NBR";AT CODE "£",CODE "##";"THN ENT" 7344 INPUT NE 7346 CLS 7348 LET NN=LN-NE 7350 GOTO VAL "7312" 7362 PRINT AT CODE " ",CODE "##";"FUNC MEN";AT CODE "' ",CODE ".'";"* GO FIRST *";AT CODE "''",CODE ".'";"1 TYPING";AT CODE ". ",CODE ".'";"2 LN SP";AT CODE ": ",CODE ".'";"3 CAPTIONS";AT CODE ":'",CODE ". ";"* 4 FOR MENU";AT CODE "##",CODE ".'";"5 PG STAT";AT CODE ",,",CODE ".'";"6 DATA MGT";AT VAL "11",CODE ".'";"7 SAVE";AT CODE "£",CODE ".'";"8 LET HEAD";AT CODE "$",CODE ".'";"9 SIGN OFF";AT CODE "?",CODE ".'";"A PRT BK A";AT CODE "(",CODE ".'";"B PRT BK B";AT CODE ")",CODE ".'";"C PRT BK C";AT CODE "<",CODE ".'";"D PRT SEL PAR";AT CODE "=",CODE ".'";"E PRT TYP";AT CODE "+",CODE ".'";"F OFCE TLS" 7364 GOSUB IL 7366 IF T$<"1" OR T$>"F" THEN GOTO FM 7368 IF T$<"F" AND T$>"9" THEN GOTO VAL "7132" 7370 IF T$="1" THEN GOTO VAL "7096" 7371 IF T$="F" THEN GOTO VAL "8642" 7372 IF T$="2" AND PR=VAL "2" THEN GOSUB SP 7373 IF T$="2" AND PR=VAL "1" THEN GOSUB LF 7374 IF T$="3" THEN GOTO VAL "7200" 7376 IF T$="4" THEN GOTO VAL "7392" 7378 IF T$="5" THEN GOTO VAL "7312" 7380 IF T$="6" THEN GOTO VAL "7748" 7382 IF T$="7" THEN GOTO VAL "8474" 7384 IF T$="8" THEN GOTO VAL "7766" 7386 IF T$="9" THEN GOTO VAL "7820" 7388 CLS 7390 GOTO FM 7392 PRINT AT CODE " ",CODE ".'";"FMAT MENU";AT CODE ". ",CODE ". ";"* ONLY IF CPBLE";AT CODE "''",CODE ". ";"SLCT TIL FNSHD";AT CODE ".'",CODE ". ";"1 SNGL SP";AT CODE ":'",CODE ". ";"2 DBL SP";AT CODE ",,",CODE "''";"*3 UP CSE";AT CODE "~~",CODE "''";"*4 LOW CSE";AT CODE "£",CODE "''";"*5 MED PRT";AT CODE "$",CODE "''";"*6 SM PRT LG LN";AT CODE ":",CODE "''";"*7 SM PRT SH LN";AT CODE "?",CODE "''";"*8 LRG PRT";AT CODE ")",CODE ". ";"9 SET INDENT";AT CODE ">",CODE ". ";"A NORM LN LGTH";AT CODE "<",CODE ". ";"B TO FUN MENU" 7393 GOSUB IL 7394 IF T$<"1" OR T$>"B" THEN GOTO VAL "7392" 7395 IF T$="1" THEN LET SD=VAL "1" 7396 IF T$="2" THEN LET SD=VAL "2" 7397 IF T$="3" THEN LET UL=VAL "2" 7398 IF T$="4" THEN LET UL=VAL "1" 7399 IF T$="5" THEN LET PS=VAL "1" 7400 IF T$="6" THEN LET PS=VAL "3" 7401 IF T$="7" THEN LET PS=VAL "2" 7402 IF T$="8" THEN LET PS=VAL "4" 7403 IF T$="9" THEN LET ID=VAL "1" 7404 IF T$="A" THEN LET ID=VAL "0" 7406 IF T$="B" THEN GOTO FM 7410 IF UL=VAL "1" THEN GOSUB VAL "8374" 7411 IF UL=VAL "2" THEN GOSUB VAL "8378" 7412 IF T$>"4" AND T$<"9" THEN GOSUB VAL "7430" 7416 PRINT AT CODE "~~",CODE "##";"" 7417 PAUSE CODE "2" 7418 CLS 7419 GOTO VAL "7392" 7420 IF W$(VAL "1")=" " THEN LET W$=W$(VAL "2" TO ) 7422 IF W$(VAL "1")=" " THEN GOTO TE 7424 IF W$(LEN W$)=" " THEN LET W$=W$( TO LEN W$-VAL "1") 7426 IF W$(LEN W$)=" " THEN GOTO VAL "7424" 7427 GOSUB VAL "7430" 7428 GOTO VAL "7436" 7430 IF PR=VAL "1" AND PS=VAL "1" THEN GOSUB VAL "8260" 7431 IF PR=VAL "1" AND PS=VAL "2" THEN GOSUB VAL "8332" 7432 IF PR=VAL "1" AND PS=VAL "3" THEN GOSUB VAL "8312" 7433 IF PR=VAL "1" AND PS=VAL "4" THEN GOSUB VAL "8352" 7434 IF PR=VAL "2" THEN GOSUB ZX 7435 RETURN 7436 IF LEN W$<=LL THEN GOTO VAL "7534" 7438 LET Y$=W$( TO LL) 7440 FOR M=LL TO VAL "1" STEP -VAL "1" 7442 IF W$(M)=" " THEN GOTO VAL "7446" 7444 NEXT M 7446 LET Y$=W$( TO M-VAL "1") 7448 GOSUB VAL "7494" 7450 IF Y$(VAL "1")=" " THEN LET Y$=Y$(VAL "2" TO ) 7452 IF Y$(VAL "1")=" " THEN GOTO VAL "7450" 7454 IF ID=VAL "1" THEN GOTO VAL "7468" 7456 IF PS=VAL "2" THEN GOTO VAL "7478" 7458 IF PS=VAL "3" THEN GOTO VAL "7482" 7460 LPRINT Y$ 7462 IF PR=VAL "1" THEN GOSUB ZO 7464 LET NN=NN+VAL "1" 7465 IF NN>=LN THEN GOSUB PE 7466 GOTO VAL "7486" 7468 IF PR=VAL "1" AND PS=VAL "1" THEN LPRINT TAB VAL "5";Y$ 7469 IF PR=VAL "2" THEN LPRINT TAB VAL "3";Y$ 7470 IF PS=VAL "2" THEN LPRINT TAB CODE "?";Y$ 7472 IF PS=VAL "3" THEN LPRINT TAB CODE ">";Y$ 7474 IF PS=VAL "4" THEN LPRINT TAB VAL "3";Y$ 7476 GOTO VAL "7462" 7478 LPRINT TAB CODE "~~";Y$ 7480 GOTO VAL "7462" 7482 LPRINT TAB CODE "$";Y$ 7484 GOTO VAL "7462" 7486 IF PR=VAL "1" THEN GOSUB VAL "7574" 7488 IF PR=VAL "2" THEN GOSUB VAL "7580" 7490 LET W$=W$(M+VAL "1" TO ) 7492 GOTO VAL "7436" 7494 LET PP=LEN Y$ 7496 IF PP=LL THEN RETURN 7498 FOR R=VAL "1" TO PP 7500 IF Y$(R)=" " THEN GOTO VAL "7506" 7502 NEXT R 7504 GOTO VAL "7494" 7506 LET Y$=Y$( TO R)+" "+Y$(R+VAL "1" TO PP) 7508 LET PP=LEN Y$ 7510 IF PP<>LL THEN LET R=R+VAL "1" 7512 IF PP<>LL THEN GOTO VAL "7502" 7514 RETURN 7516 IF PR=VAL "1" AND PS=VAL "1" THEN LPRINT TAB VAL "5";W$ 7517 IF PR=VAL "2" THEN LPRINT TAB VAL "3";W$ 7518 IF PS=VAL "2" THEN LPRINT TAB CODE "?";W$ 7520 IF PS=VAL "3" THEN LPRINT TAB CODE ">";W$ 7522 IF PS=VAL "4" THEN LPRINT TAB VAL "3";W$ 7524 GOTO VAL "7542" 7526 IF PS=VAL "2" THEN LPRINT TAB CODE "~~";W$ 7528 GOTO VAL "7542" 7530 LPRINT TAB CODE "$";W$ 7532 GOTO VAL "7542" 7534 IF ID=VAL "1" THEN GOTO VAL "7516" 7536 IF PS=VAL "2" THEN GOTO VAL "7526" 7538 IF PS=VAL "3" THEN GOTO VAL "7530" 7540 LPRINT W$ 7542 IF PR=VAL "1" THEN GOSUB ZO 7544 LET NN=NN+VAL "1" 7546 LET W$="" 7548 IF SD=VAL "2" THEN GOSUB VAL "7556" 7550 IF NN>=LN THEN GOSUB PE 7552 IF G=VAL "1" THEN RETURN 7554 GOTO FM 7556 IF PR=VAL "1" THEN GOSUB LF 7558 IF PR=VAL "2" THEN GOSUB SP 7560 RETURN 7574 IF SD=VAL "2" THEN GOSUB LF 7576 IF NN>=LN THEN GOSUB PE 7578 RETURN 7580 IF SD=VAL "2" THEN GOSUB SP 7582 IF LL>=LN THEN GOSUB VAL "7802" 7584 RETURN 7586 LET BG=VAL "0" 7587 LET BC=VAL "1" 7588 LET NP=VAL "0" 7590 LET AY=VAL "1" 7594 FOR Y=VAL "1" TO LEN Z$ STEP CODE " TO " 7596 IF BC>=LEN Z$ THEN CLS 7598 IF BC>=LEN Z$ THEN GOTO VAL "7688" 7600 PRINT AT VAL "0",VAL "11";"WINDOW ";AY 7602 IF BC+CODE " TO ">=LEN Z$ THEN PRINT AT VAL "2",VAL "4";"LAST WINDOW" 7604 IF BC+CODE " TO ">=LEN Z$ THEN PRINT AT VAL "4",VAL "0";Z$(BC TO ) 7606 IF BC+CODE " TO " YES <2> NO" 7610 GOSUB IK 7612 IF T$="1" THEN GOTO VAL "7626" 7614 IF T$="2" AND BC+CODE " TO ">LEN Z$ THEN GOTO VAL "7686" 7616 LET BC=BC+CODE " TO " 7618 LET AY=AY+VAL "1" 7620 NEXT Y 7622 CLS 7624 GOTO VAL "7596" 7626 IF BC+CODE " TO ">=LEN Z$ THEN PRINT AT VAL "2",VAL "8";"LAST WINDOW" 7628 IF BC+CODE " TO "=LEN Z$ THEN PRINT AT VAL "4",VAL "0";Z$(BC TO ) 7632 PRINT AT CODE "£",VAL "6";"ENTER SRCH GRP";AT CODE "$",CODE ",,";"THN WAIT" 7634 INPUT Y$ 7636 LET U=BC 7638 FOR Q=U TO U+CODE " TO " 7640 IF Z$(Q TO Q+LEN Y$-VAL "1")=Y$ THEN GOTO VAL "7648" 7642 LET U=U+VAL "1" 7644 NEXT Q 7646 GOTO VAL "7640" 7648 PRINT AT CODE "?",CODE " '";"<";Y$;">";AT CODE "<",CODE " '";"";AT CODE "<",CODE "$";"1 REPL, 2 DEL";AT CODE "=",CODE "$";"3 ID PARA START";AT CODE "+",CODE "$";"4 ID PARA END" 7650 GOSUB IL 7652 IF T$<"1" OR T$>"4" THEN GOTO VAL "7648" 7654 IF T$="3" OR T$="4" THEN GOTO VAL "8038" 7655 IF BC+CODE " TO ">=LEN Z$ THEN PRINT Z$(BC TO ) 7656 IF BC+CODE " TO "";AT CODE "(",CODE " '";"TO DLT, ";AT CODE ">",CODE " '";"TO REPL, OR INSRT, TYP";AT CODE "<",CODE " '";"THE GP, + SPS + PUNCT " 7660 INPUT P$ 7662 LET Z$=Z$( TO U-VAL "1")+P$+Z$(U+LEN Y$ TO ) 7664 CLS 7666 IF BC+CODE " TO ">=LEN Z$ THEN PRINT Z$(BC TO ) 7668 IF BC+CODE " TO " YES <2> NO" 7672 GOSUB IK 7676 IF T$="1" THEN GOTO VAL "7620" 7678 IF T$="2" THEN GOTO VAL "7626" 7680 IF Y+CODE " TO ">=LEN Z$ THEN PRINT Z$(Y TO ) 7682 IF Y+CODE " TO "",CODE "''";"9 TO FUN MENU" 7687 GOSUB IL 7688 IF T$<"1" OR T$>"9" THEN GOTO VAL "7686" 7689 IF T$="1" THEN GOTO VAL "7748" 7690 IF T$="2" THEN LET AC=VAL "1" 7692 IF T$="3" THEN LET AC=VAL "0" 7694 IF T$="4" THEN GOTO VAL "7586" 7696 IF T$="5" THEN LET Z$=R$ 7697 IF T$="8" THEN GOTO VAL "8088" 7698 IF T$="6" THEN LET Z$=S$ 7699 IF T$="7" THEN GOTO VAL "7709" 7700 IF T$="9" THEN GOTO FM 7701 PRINT AT CODE "~~",CODE "##";"" 7703 PAUSE CODE "2" 7704 CLS 7706 GOTO VAL "7686" 7709 LET Q$="" 7714 PRINT AT CODE "~~",CODE "''";"APND:";AT CODE "£",CODE "''";"1 BEFORE? -OR- 2 AFTER?" 7715 GOSUB IK 7716 LET BF=VAL T$ 7717 PRINT AT CODE "~~",CODE "##";"TYP APND";AT CODE "£",CODE ". ";" AS TYP SLOWS" 7718 INPUT Y$ 7719 LET Q$="" 7720 CLS 7721 LET Q$=Q$+" "+Y$ 7725 IF Q$(CODE "' ")=" " THEN LET Q$=Q$(CODE " '" TO ) 7726 IF Q$(CODE "' ")=" " THEN GOTO VAL "7725" 7727 LET Y$="" 7728 IF Q$(LEN Q$)=" " THEN LET Q$=Q$( TO LEN Q$-CODE "' ") 7729 IF Q$(LEN Q$)=" " THEN GOTO VAL "7728" 7731 CLS 7732 IF BF=CODE "' " THEN LET X$=Q$+" "+X$ 7734 IF BF=CODE " '" THEN LET X$=X$+" "+Q$ 7736 GOTO VAL "7701" 7748 PRINT AT CODE ". ",CODE "~~";"DAT STAT";AT CODE ".'",CODE ":'";"BK A = ";(INT (LEN Z$/102.4+.5))/CODE "~~";"K";AT CODE ":'",CODE ":'";"BK B= ";(INT (LEN R$/102.4+.5))/CODE "~~";"K";AT CODE "##",CODE ":'";"BK C= ";(INT (LEN S$/102.4+.5))/CODE "~~";"K";AT CODE "~~",CODE ":'";"SEL PAR= ";LEN X$;" BYTES";AT VAL "11",CODE ":'";"TYP PARA= ";LEN U$;" BTS";AT CODE "$",CODE ":'";"F MEM= ";PEEK VAL "16386"+VAL "256"*PEEK VAL "16387"-PEEK VAL "16412"-VAL "256"*PEEK VAL "16413";AT CODE "?",CODE ":'";"ACT BNK ="; 7749 IF ACC=VAL "0" THEN PRINT " A" 7750 IF ACC=VAL "1" THEN PRINT " B" 7751 IF ACC=VAL "2" THEN PRINT " C" 7752 IF ACC=VAL "3" THEN PRINT " " 7754 PRINT AT CODE "=",VAL "7";" WHEN RDY" 7760 PAUSE VAL "4E4" 7763 CLS 7765 GOTO VAL "7686" 7766 LET IDD=ID 7768 LET ID=VAL "0" 7769 IF PR=VAL "1" THEN GOSUB VAL "8260" 7770 LET NN=VAL "1" 7771 IF PR=VAL "1" THEN GOSUB VAL "8232" 7772 LET PG=VAL "0" 7775 LPRINT TAB QQ-(LEN K$/VAL "2"+VAL "1");K$ 7776 IF PR=VAL "1" THEN GOSUB ZO 7777 LPRINT TAB QQ-(LEN L$/VAL "2"+VAL "1");L$ 7778 IF PR=VAL "1" THEN GOSUB ZO 7779 LPRINT TAB QQ-(LEN M$/VAL "2"+VAL "1");M$ 7782 IF PR=VAL "1" THEN GOSUB ZO 7786 LET NN=NN+VAL "3" 7787 IF G=VAL "1" THEN GOTO VAL "7894" 7789 GOTO VAL "7888" 7802 IF PR=VAL "1" THEN GOTO VAL "8386" 7804 LET A=VAL "1" 7805 LPRINT 7806 LET A=A+VAL "1" 7807 IF A=CODE "(" THEN GOTO VAL "7809" 7808 GOTO VAL "7805" 7809 LET PG=PG+VAL "1" 7810 LPRINT PG 7812 LET NN=VAL "1" 7813 LET ID=IDD 7814 GOSUB VAL "8426" 7816 RETURN 7820 LET NN=VAL "0" 7822 LET ID=VAL "0" 7823 IF PR=VAL "2" THEN GOTO VAL "7842" 7824 GOSUB VAL "8260" 7826 GOSUB VAL "8224" 7828 IF UL=VAL "1" THEN LPRINT TAB QQ-VAL "5";"S%I%N%C%E%R%E%L%Y," 7830 IF UL=VAL "2" OR UL=VAL "0" THEN LPRINT TAB QQ-VAL "5";"SINCERELY," 7831 GOSUB ZO 7832 GOSUB VAL "8224" 7834 IF UL=VAL "1" THEN LPRINT TAB QQ-VAL "5";"B%I%L%L J%O%N%E%S" 7836 IF UL=VAL "2" OR UL=VAL "0" THEN LPRINT TAB QQ-VAL "5";"BILL JONES" 7837 GOSUB ZO 7838 GOSUB VAL "8386" 7839 IF G=VAL "1" THEN RETURN 7840 GOTO FM 7842 GOSUB VAL "8426" 7844 IF UL=VAL "1" THEN LPRINT TAB QQ-VAL "5";"S%I%N%C%E%R%E%L%Y," 7846 IF UL=VAL "2" OR UL=VAL "0" THEN LPRINT TAB QQ-VAL "5";"SINCERELY," 7848 GOSUB VAL "8426" 7850 IF UL=VAL "1" THEN LPRINT TAB QQ-VAL "5";"B%I%L%L J%O%N%E%S%S" 7852 IF UL=VAL "2" OR UL=VAL "0" THEN LPRINT TAB QQ-VAL "5";"BILL JONES" 7854 GOSUB PE 7855 IF G=VAL "1" THEN RETURN 7856 GOTO FM 7888 PRINT AT CODE "~~",VAL "7";"TYP DATE" 7890 INPUT Y$ 7892 CLS 7894 IF G=VAL "1" THEN LET Y$=O$ 7895 LPRINT TAB QQ-LEN Y$/VAL "2";Y$ 7896 IF PR=VAL "1" THEN GOSUB VAL "8232" 7898 IF PR=VAL "2" THEN GOSUB VAL "8434" 7900 LET NN=NN+VAL "1" 7901 IF G=VAL "1" THEN RETURN 7902 PRINT AT CODE "~~",VAL "6";"BUS HEAD?";AT CODE "£",CODE ".'";"1 YES 2 NO" 7904 GOSUB IK 7906 CLS 7908 IF PR=VAL "1" THEN GOSUB VAL "8280" 7910 IF T$="1" THEN GOTO VAL "7916" 7912 IF T$="2" THEN GOTO VAL "7942" 7914 GOTO VAL "7902" 7916 PRINT AT CODE "~~",VAL "4";"TYP CO NAME" 7918 INPUT Y$ 7920 LPRINT Y$ 7922 PRINT AT CODE "£",CODE ". ";"TYP ST ADR" 7924 INPUT Y$ 7925 LPRINT Y$ 7926 PRINT AT CODE ":",CODE ". ";"CTY, ST, ZP" 7931 INPUT Y$ 7933 LPRINT Y$ 7934 CLS 7936 IF PR=VAL "1" THEN GOSUB VAL "8232" 7938 IF PR=VAL "2" THEN GOSUB VAL "8434" 7940 LET NN=NN+VAL "3" 7942 PRINT AT CODE "~~",CODE " '";"PERS NAME" 7944 INPUT Y$ 7946 CLS 7948 LPRINT "DEAR ";Y$ 7950 IF PR=VAL "1" THEN GOSUB LF 7952 IF PR=VAL "2" THEN GOSUB SP 7954 LET NN=NN+VAL "3" 7955 IF G=VAL "1" THEN RETURN 7956 LET ID=IDD 7957 GOSUB VAL "7430" 7960 GOTO FM 8038 CLS 8039 IF T$="4" THEN GOTO VAL "8048" 8044 LET BG=U 8046 GOTO VAL "8062" 8048 IF BG=VAL "0" THEN GOTO VAL "8067" 8049 LET NP=U-CODE "' "+LEN Y$ 8050 IF BG>VAL "0" AND NP>VAL "0" THEN LET X$=Z$(BG TO NP) 8054 PRINT AT CODE "~~",CODE " '";"DONE" 8056 PAUSE CODE "W" 8058 CLS 8060 GOTO VAL "7686" 8066 IF NP=VAL "0" THEN PRINT AT CODE "~~",CODE "~~";"DONE" 8067 IF BG=CODE " " THEN PRINT AT CODE "~~",CODE "''";"YOU GOOFED TRY AGN" 8069 PAUSE CODE "% " 8072 CLS 8076 IF BG=CODE " " THEN LET Y=CODE "' " 8078 IF BG=CODE " " THEN LET BC=CODE "' " 8080 IF BG=CODE " " THEN GOTO VAL "7596" 8082 IF NP=CODE " " THEN GOTO VAL "7596" 8084 IF BG=CODE " " THEN GOTO VAL "7590" 8086 IF NP=CODE " " THEN GOTO VAL "7616" 8088 FOR Y=CODE "' " TO LEN X$ STEP VAL "479" 8090 IF LEN X$=LEN X$ THEN PRINT X$(Y TO ) 8096 PRINT AT CODE "=",CODE "~~";" WHN RDY" 8098 PAUSE VAL "4E4" 8100 CLS 8102 NEXT Y 8104 GOTO VAL "8090" 8134 PAUSE VAL "4E4" 8136 LET T$=INKEY$ 8138 IF T$="" THEN GOTO VAL "8134" 8140 CLS 8142 RETURN 8144 PAUSE VAL "4E4" 8146 LET T$=INKEY$ 8148 IF T$="" THEN GOTO VAL "8144" 8149 IF T$<"1" OR T$>"2" THEN GOTO VAL "8144" 8150 CLS 8152 RETURN 8220 POKE ME,CODE "~~" 8222 LET NN=NN+VAL "1" 8224 POKE ME,CODE "~~" 8226 LET NN=NN+VAL "1" 8228 POKE ME,CODE "~~" 8230 LET NN=NN+VAL "1" 8232 POKE ME,CODE "~~" 8234 LET NN=NN+VAL "1" 8236 POKE ME,CODE "~~" 8238 LET NN=NN+VAL "1" 8240 IF NN>=LN THEN GOSUB PE 8242 RETURN 8246 POKE ME,CODE "/" 8248 POKE EN,VAL "0" 8249 LET LN=CODE "PI" 8250 POKE CT,VAL "0" 8251 LET LL=CODE "4" 8252 LET QQ=CODE "(" 8253 IF ID=VAL "1" THEN LET LL=CODE "," 8254 IF ID=VAL "1" THEN LET QQ=CODE "$" 8255 IF G=VAL "1" THEN LET LN=VAL "85" 8256 RETURN 8260 POKE EN,VAL "1" 8262 POKE CT,VAL "0" 8264 LET LL=CODE "RND" 8265 LET QQ=CODE "4" 8266 POKE ME,CODE "/" 8270 POKE ME,CODE "." 8272 POKE ME,CODE "PI" 8273 POKE ME,CODE "2" 8274 IF ID=VAL "1" THEN LET LL=CODE "Q" 8275 IF ID=VAL "1" THEN LET QQ=CODE "." 8276 RETURN 8280 POKE ME,CODE "/" 8284 POKE EN,VAL "0" 8285 POKE CT,VAL "0" 8286 POKE ME,CODE "." 8288 POKE ME,CODE "PI" 8290 POKE ME,CODE "2" 8292 RETURN 8296 POKE EN,VAL "0" 8298 POKE CT,VAL "0" 8300 POKE ME,CODE "/" 8302 POKE ME,CODE "." 8304 POKE ME,CODE "INKEY$" 8306 POKE ME,CODE "2" 8308 RETURN 8312 POKE EN,VAL "3" 8314 POKE CT,VAL "0" 8316 LET LL=VAL "106" 8318 LET QQ=CODE "P" 8320 POKE ME,CODE "/" 8322 POKE ME,CODE "." 8324 POKE ME,CODE "INKEY$" 8325 POKE ME,CODE "1" 8326 IF ID=VAL "1" THEN LET LL=VAL "96" 8327 IF ID=VAL "1" THEN LET QQ=CODE "K" 8328 RETURN 8332 POKE EN,VAL "2" 8333 POKE CT,VAL "0" 8336 LET LL=VAL "86" 8337 LET QQ=CODE "F" 8338 POKE ME,CODE "/" 8340 POKE ME,CODE "." 8342 POKE ME,CODE "PI" 8344 POKE ME,CODE "1" 8345 IF ID=VAL "1" THEN LET LL=VAL "76" 8346 IF ID=VAL "1" THEN LET QQ=CODE "A" 8348 RETURN 8352 POKE EN,VAL "1" 8354 POKE CT,VAL "0" 8356 POKE ME,CODE "/" 8358 LET LL=CODE "4" 8359 LET QQ=CODE "(" 8360 POKE ME,CODE "." 8362 POKE ME,CODE "PI" 8364 POKE ME,CODE "2" 8366 POKE ME,CODE "3" 8367 IF ID=VAL "1" THEN LET LL=CODE "," 8368 IF ID=VAL "1" THEN LET QQ=CODE "$" 8370 RETURN 8374 RAND USR VAL "7804" 8376 RETURN 8378 RAND USR VAL "7868" 8380 RETURN 8384 LET IDD=ID 8385 LET ID=CODE " " 8386 IF PR=VAL "2" THEN GOTO VAL "7802" 8387 GOSUB VAL "8296" 8388 LET PG=PG+VAL "1" 8390 LET NN=VAL "1" 8392 POKE ME,CODE "£" 8394 LPRINT PG 8395 GOSUB ZO 8396 LET ID=IDD 8397 GOSUB VAL "7430" 8408 GOSUB VAL "8224" 8410 RETURN 8426 LPRINT 8428 LET NN=NN+VAL "1" 8430 LPRINT 8432 LET NN=NN+VAL "1" 8434 LPRINT 8436 LET NN=NN+VAL "1" 8438 LPRINT 8440 LET NN=NN+VAL "1" 8442 IF NN>=LN THEN GOSUB VAL "7802" 8443 RETURN 8474 CLS 8476 PRINT AT CODE "~~",VAL "2";"STRT REC, THN " 8478 PAUSE VAL "4E4" 8482 SAVE "SMTX%T" 8483 CLS 8484 FAST 8485 LET LS=VAL "7250" 8486 LET G=CODE " " 8487 LET LN=CODE "O" 8488 LET AC=CODE " " 8489 LET CC=CODE " " 8490 LET PR=CODE " '" 8491 LET PG=CODE " " 8492 LET W$="" 8493 LET TE=VAL "7420" 8494 LET IDD=CODE " " 8495 LET PE=VAL "8384" 8496 LET ID=CODE " " 8497 LET ZO=7274 8498 LET ME=VAL "65535" 8499 LET EN=VAL "16507" 8500 LET UL=CODE " " 8501 LET CT=VAL "16508" 8502 LET K$="GULF MICRO ELECTRONICS" 8504 LET L$="1317 STRATFORD AVE" 8506 LET M$="PANAMA CITY, FLORIDA 32404" 8507 LET PS=CODE "' " 8508 LET NN=CODE " " 8509 LET SD=CODE "' " 8510 LET IL=VAL "8134" 8512 LET IK=VAL "8144" 8514 LET FM=VAL "7362" 8515 LET LF=VAL "8236" 8516 LET ZX=VAL "8248" 8517 LET SP=VAL "8438" 8520 GOTO VAL "7024" ```