--- title: "Scrolls" id: 53847 type: "computer_media" slug: "scrolls" url: "http://localhost/computer_media/scrolls/" markdown_url: "http://localhost/computer_media/scrolls.md" published_at: "2024-05-13T19:02:05+00:00" modified_at: "2026-03-30T21:45:18+00:00" author: "David Anderson" featured_image: url: "http://localhost/wp-content/uploads/2019/02/20230809-041332.jpg" excerpt: "Eight BASIC scroll routines — up, down, left, right, each with and without wrap — all driven by clever single-string manipulation of a 704-character display buffer." 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: "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: "Tim Hartnell" slug: "tim-hartnell" taxonomy: "indiv" url: "http://localhost/indiv/tim-hartnell/" genre: - name: "Demo" slug: "demo" taxonomy: "genre" url: "http://localhost/type/demo/" media_contents: - id: 55361 title: "SINCUS Exchange Tape 102 – Utilities & Business" type: "computer_media" url: "http://localhost/computer_media/sincus-exchange-tape-102-utilities-business/" media_type: "Program" programmers: - name: "Tim Hartnell" slug: "tim-hartnell" taxonomy: "indiv" url: "http://localhost/indiv/tim-hartnell/" mediadate: "1983" images: - url: "http://localhost/wp-content/uploads/2024/05/scrolls.png" related_content: - id: 21008 title: "Mastering Your Timex Sinclair 1000/1500 Personal Computer" type: "book" url: "http://localhost/book/mastering-your-timex-sinclair-1000-1500-personal-computer/" media_type_tags: "Demo" --- # Scrolls This program demonstrates eight different software-driven text scroll routines in BASIC, sourced from the book “Mastering Your Timex” by Hartnell and Jones. The core technique stores the entire 22-row by 32-column display (704 characters) in a single string array variable, then shifts it by manipulating substrings before reprinting with PRINT AT 0,0. Vertical scrolls move the string by 32-character (one row) increments, while horizontal scrolls use a nested loop stepping through each row with STEP 32 to shift characters one position at a time. Wrap-around variants preserve the displaced characters by concatenating the “scrolled-off” portion back onto the opposite end of the string rather than replacing with spaces. *** ## Program Analysis ### Program Structure The program is organized into a menu front-end (lines 4–21) and eight self-contained scroll subroutines located at high line numbers (9500–9850). Each routine is reached by a direct `GO TO` from the menu dispatcher and returns to line 1 (which falls through to the menu at line 6) via `GO TO 1`. The high-numbered placement of the routines is a common BASIC practice to keep them out of the way of any future expansion of the main program body. ### Display Buffer Strategy Every routine allocates a 704-character string array `a$` with `DIM a$(704)`. This exactly models the 22-row × 32-column visible text area (22 × 32 = 704). The user fills this buffer via `INPUT "Enter text: ";a$`, and the entire buffer is blasted to the screen each iteration with `PRINT AT 0,0;a$`, relying on the interpreter to wrap the long string across rows automatically. ### Scroll Algorithms The eight routines fall into two families — non-wrapping (options 1–4) and wrapping (options 5–8) — each covering all four cardinal directions. | Option | Direction | Wrap | Key operation | | --- | --- | --- | --- | | 1 | Up | No | `a$=a$(33 TO )+" "` | | 2 | Down | No | `a$=" "+a$( TO 672)` | | 3 | Left | No | Per-row: `a$(f TO f+31)=a$(f+1 TO f+31)+" "` | | 4 | Right | No | Per-row: `a$(f TO f+31)=" "+a$(f TO f+30)` | | 5 | Up | Yes | `a$=a$(33 TO )+a$( TO 32)` | | 6 | Down | Yes | `a$=a$(673 TO )+a$( TO 672)` | | 7 | Left | Yes | Per-row: `a$(f TO f+31)=a$(f+1 TO f+31)+a$(f)` | | 8 | Right | Yes | Per-row: `a$(f TO f+31)=a$(f+31)+a$(f TO f+30)` | Vertical scrolls operate on the whole 704-character string in a single assignment, shifting by 32 characters per step. Horizontal scrolls use a `FOR f=1 TO 673 STEP 32` inner loop to process each of the 22 rows individually, shifting by one character per step within each 32-character row slice. ### Notable Techniques - **Single-string display buffer:** Packing the entire screen into one string and printing it with a single `PRINT AT 0,0` avoids the overhead of per-row print statements and keeps the scroll loop tight. - **Substring slice assignment:** The BASIC interpreter supports in-place slice assignment (`a$(f TO f+31)=...`), allowing each row to be updated without rebuilding the entire string for horizontal scrolls. - **Wrapping via concatenation:** Wrap routines reattach the displaced portion directly — for example, scroll-up-with-wrap at line 9695 appends the first row back at the tail: `a$=a$(33 TO )+a$( TO 32)`. - **Menu input validation:** Line 13 uses a compound `IF a<1 OR a>8 THEN GO TO 12` to re-prompt on out-of-range input before the chain of equality tests at lines 14–21. ### Bugs and Anomalies - **Off-by-one in horizontal scroll loop bound:** The `FOR f=1 TO 673 STEP 32` loop visits 22 values: 1, 33, 65, …, 673. With a 32-character slice `f TO f+31`, the last iteration addresses characters 673–704, which is correct. However, the loop runs `FOR n=0 TO 32` (33 iterations) for left/right scrolls, one more than the 32-column width needed for a full single-pixel shift cycle — the final iteration is redundant but harmless. - **Re-declaration of a$ each routine:** Every routine starts with `DIM a$(704)`, which resets the array to spaces before the user fills it. This is intentional for isolation between menu selections but means any previous display content is discarded. - **GO TO 1 target:** Line 1 does not exist; execution falls through to line 4 (the first `REM`), then continues to line 6 where `BORDER`, `PAPER`, and `CLS` reset the display before the menu redraws. This is an intentional fall-through, not a bug. ## Source Code ``` 4 REM ++ Scrolls in basic ++++ 5 REM From Mastering Your Timex & by Hartnell and Jones 6 BORDER 6: PAPER 6: CLS 8 INK 0 10 PRINT AT 2,6;"SCROLLS IN BASIC";TAB 6;"----------------" 11 PRINT AT 5,6;"1. Scroll upwards";AT 7,6;"2. Scroll downwards";AT 9,6;"3. Scroll to the left";AT 11,6;"4. Scroll to the right";AT 13,6;"5. Scroll up with wrap";AT 15,6;"6. Scroll down with wrap";AT 17,6;"7. Scroll left with wrap";AT 19,6;"8. Scroll right with wrap" 12 INPUT "Which scroll? ";a 13 IF a<1 OR a>8 THEN GO TO 12 14 IF a=1 THEN GO TO 9500 15 IF a=2 THEN GO TO 9530 16 IF a=3 THEN GO TO 9560 17 IF a=4 THEN GO TO 9620 18 IF a=5 THEN GO TO 9670 19 IF a=6 THEN GO TO 9710 20 IF a=7 THEN GO TO 9750 21 IF a=8 THEN GO TO 9800 9500 REM --------scroll up 9510 DIM a$(704) 9511 INPUT "Enter text: ";a$ 9512 FOR n=0 TO 22 9513 PRINT AT 0,0;a$ 9515 LET a$=a$(33 TO )+" " 9520 NEXT n 9525 GO TO 1 9528 REM ---------scroll down 9530 DIM a$(704) 9535 INPUT "Enter text: ";a$ 9537 FOR n=0 TO 22 9540 PRINT AT 0,0;a$ 9545 LET a$=" "+a$( TO 672) 9550 NEXT n 9555 GO TO 1 9560 REM -------scroll left 9565 DIM a$(704) 9570 INPUT "Enter text: ";a$ 9575 FOR n=0 TO 32 9580 PRINT AT 0,0;a$ 9585 FOR f=1 TO 673 STEP 32 9590 LET a$(f TO f+31)=a$(f+1 TO f+31)+" " 9595 NEXT f 9600 NEXT n 9605 GO TO 1 9620 REM --------scroll right 9625 DIM a$(704) 9630 INPUT "Enter text: ";a$ 9635 FOR n=0 TO 32 9640 PRINT AT 0,0;a$ 9645 FOR f=1 TO 673 STEP 32 9650 LET a$(f TO f+31)=" "+a$(f TO f+30) 9655 NEXT f 9660 NEXT n 9665 GO TO 1 9670 REM ----scroll up with wrap 9675 DIM a$(704) 9680 INPUT "Enter text: ";a$ 9685 FOR n=0 TO 22 9690 PRINT AT 0,0;a$ 9695 LET a$=a$(33 TO )+a$( TO 32) 9700 NEXT n 9705 GO TO 1 9710 REM ----scroll down with wrap 9715 DIM a$(704) 9718 INPUT "Enter text: ";a$ 9720 FOR n=0 TO 22 9725 PRINT AT 0,0;a$ 9730 LET a$=a$(673 TO )+a$( TO 672) 9735 NEXT n 9740 GO TO 1 9750 REM --scroll left with wrap 9755 DIM a$(704) 9760 INPUT "Enter text: ";a$ 9765 FOR n=0 TO 32 9770 PRINT AT 0,0;a$ 9775 FOR f=1 TO 673 STEP 32 9780 LET a$(f TO f+31)=a$(f+1 TO f+31)+a$(f) 9785 NEXT f 9790 NEXT n 9795 GO TO 1 9800 REM -scroll right with wrap 9805 DIM a$(704) 9810 INPUT "Enter text: ";a$ 9815 FOR n=0 TO 32 9820 PRINT AT 0,0;a$ 9825 FOR f=1 TO 673 STEP 32 9830 LET a$(f TO f+31)=a$(f+31)+a$(f TO f+30) 9835 NEXT f 9840 NEXT n 9850 GO TO 1 9998 SAVE "SCROLLS" LINE 1 9999 VERIFY "" ```