--- title: "Classy Front End Demo" id: 56143 type: "computer_media" slug: "classy-front-end-demo" url: "http://localhost/computer_media/classy-front-end-demo/" markdown_url: "http://localhost/computer_media/classy-front-end-demo.md" published_at: "2024-07-20T21:18:09+00:00" modified_at: "2026-03-30T21:29:32+00:00" author: "David Anderson" featured_image: url: "http://localhost/wp-content/uploads/2024/07/SCR-20240720-peaz.png" excerpt: "A machine code custom font engine with proportional spacing and kerning powers a slick GUI-style scrollable menu demo — all driven from BASIC." 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: "Paul Bingham" slug: "paul-bingham" taxonomy: "indiv" url: "http://localhost/indiv/paul-bingham/" genre: - name: "Demo" slug: "demo" taxonomy: "genre" url: "http://localhost/type/demo/" - name: "Programming" slug: "programming" taxonomy: "genre" url: "http://localhost/type/programming/" media_type: "Program" programmers: - name: "Paul Bingham" slug: "paul-bingham" taxonomy: "indiv" url: "http://localhost/indiv/paul-bingham/" download_url: "https://archive.org/download/timex-sinclair-software-archive/CFE%20Demo%20%28198x%29%28Bingham%2C%20Paul%29%28TS2068%29%28US%29%28Program%29.zip" mediadate: "198x" images: - url: "http://localhost/wp-content/uploads/2024/07/SCR-20240720-peaz.png" article_media: - id: 37697 title: "Classy Front End, Part I" type: "article" url: "http://localhost/article/classy-front-end-part-i/" - id: 52668 title: "Classy Front End, Part II" type: "article" url: "http://localhost/article/classy-front-end-part-ii/" - id: 15411 title: "Classy Front End, Part III" type: "article" url: "http://localhost/article/classy-front-end-part-iii/" - id: 15390 title: "Classy Front End, Update" type: "article" url: "http://localhost/article/classy-front-end-update/" - id: 15454 title: "Classy Front End: Windows" type: "article" url: "http://localhost/article/classy-front-end-windows/" - id: 15472 title: "Classy Front End: Windows" type: "article" url: "http://localhost/article/classy-front-end-windows-2/" media_type_tags: "Demo, Programming" --- This program implements “CFE” (Classy Front End), a machine code-driven custom font printing engine paired with a graphical menu demonstration. Lines 4–7 load 1,502 bytes of Z80 machine code into memory at address 45000 using POKEs and a FOR/READ loop, then configure the system font pointer at addresses 23728–23729 to redirect character rendering through the new engine. The variable `print` is set to `code+13` (45013), pointing to the machine code’s main print entry point, which is then invoked throughout the program via `RANDOMIZE USR print`. The font table stored in lines 1000–1200 encodes each glyph as a variable-width bitmap: the first byte of each 8-byte record specifies the character’s pixel width (3–7 pixels), supporting proportional spacing and kerning. The demo section (lines 2000–9999) uses PLOT/DRAW to render a GUI-style bordered screen with a scrollable nine-item menu, navigated by pressing “6” (down) and “7” (up), with highlighted and unhighlighted menu item rendering handled by computed GOSUBs at lines 7890+a×10 and 7980+a×10. *** ## Program Analysis ### Program Structure The program divides into four logical sections: 1. **Loader (lines 1–220):** Reads 1,502 bytes of Z80 machine code from DATA statements and POKEs them into RAM at address 45000. Sets up the font pointer system variable. 2. **Font Table (lines 980–1200):** Proportional bitmap glyph data for the “Classy” character set, covering printable ASCII and extended characters. 3. **Demo Screen (lines 2000–2100):** Draws a bordered GUI-style main screen and renders the custom font character set as a showcase. 4. **Menu Navigation (lines 2500–8240):** An interactive scrollable menu with nine items, drawn using PLOT/DRAW boxes and managed via computed GOSUBs. ### Machine Code Loading Lines 4–7 perform the machine code installation. `LET code=45000` sets the load address, and `LET print=code+13` (= 45013) is the entry point offset into the code — the first 13 bytes appear to be a dispatch/jump table or parameter block. Lines 6 POKEs the address into system variable locations 23728–23729 (the TS2068 font address pointer), using the standard low-byte/high-byte split: - `POKE 23728,(code-256*INT(code/256))` — low byte - `POKE 23729,INT(code/256)` — high byte Line 7 loads 1,502 bytes with `FOR t=code TO code+1501: READ o: POKE t,o: NEXT t`. The comment on line 3 notes an 18-second load time, consistent with this quantity of DATA READs. ### Font Table Format Each glyph entry in lines 1000–1200 occupies 8 values. The first value is the character width in pixels (ranging from 3 to 7), followed by 7 bytes of column bitmap data. This proportional encoding enables the machine code renderer to perform kerning — packing characters closer together based on their individual widths rather than using a fixed 8-pixel cell. The font covers the full printable ASCII range from space (line 1000, 4-wide) through to at least code 95+ including lowercase and special symbols. | Byte offset | Meaning | | --- | --- | | 0 | Glyph width in pixels (3–7) | | 1–7 | Column bitmaps (vertical strips, LSB = top) | ### RANDOMIZE USR Invocation Pattern All rendering calls use `RANDOMIZE USR print`. The `RANDOMIZE USR` idiom calls the machine code routine at address `print` (45013) and discards the return value; using `RANDOMIZE` rather than `LET x=USR print` avoids the need for a dummy variable. The machine code routine reads its parameters (screen position, string content, color attributes) from the REM statement on the following line, which acts as an in-line data channel — the REM content is never displayed by BASIC but is parsed by the machine code. ### REM-as-Data Technique Every `RANDOMIZE USR print` call is immediately followed by a REM statement containing the print command parameters. This is a well-known technique: the machine code locates the next line in the BASIC program area and reads the bytes after the REM token as structured data (AT coordinates, string content, color codes). This allows complex print operations to be specified without using BASIC string variables or PRINT statements, and keeps the parameter data adjacent to the call site. ### Computed GOSUB for Menu Items The menu system uses arithmetic to select rendering subroutines. Two sets of subroutines exist: - Lines 8000–8089 (unselected items): entry points at `7890 + a*10` where `a` = 11..19, giving lines 8000, 8010, …, 8080. - Lines 8090–8179 (selected/highlighted items): entry points at `7980 + a*10`, giving lines 8090, 8100, …, 8170. The variable `a` tracks the currently highlighted menu row (11–19). Navigation subroutines at lines 6000 and 6030 erase the old highlighted item, increment or decrement `a` with wraparound (11↔19), then re-render both normal and highlighted variants. The formula `GO SUB 7890+a*10` is computed at runtime, an efficient dispatch table realized in pure BASIC. ### Screen Layout and Graphics Line 2005 draws a full-screen border rectangle using PLOT/DRAW sequences. Line 8200 draws the menu box as a separate inset rectangle using further PLOT/DRAW calls. The menu box drawing in line 8200 contains a subtle correction sequence — `DRAW 0,-98: DRAW 113,0: DRAW 0,1: DRAW -112,0` — that adjusts the bottom of the box by one pixel to compensate for coordinate alignment, a common pixel-graphics workaround. ### Navigation Input Handling The main loop at lines 3000–3030 polls `INKEY$` without a PAUSE, running as a tight busy-loop: - `"6"` — moves the menu selection down - `"7"` — moves the menu selection up - `CODE INKEY$=13` (Enter) — stops the program This maps to the TS2068 cursor keys, which generate characters “5”–”8″ when shifted. Using `CODE INKEY$=13` rather than `INKEY$=CHR$ 13` is a minor optimization avoiding a string comparison. ### Notable Anomalies - Line 9999 contains `SAVE "cfe+demo" LINE 3` duplicated twice on the same line, which causes the tape save to occur twice consecutively — likely intentional for reliability on cassette. - The entire listing is duplicated in the source file; this appears to be a template artifact rather than a program-level issue. - The DATA on lines 1000–1200 uses a trailing period (`.`) after some entries (e.g., `4,0,0,0,0,0,0,0.`). In BASIC, the period is parsed as a decimal point with no digits, equivalent to `.0` = 0, so the trailing dot on the last value of each DATA item is harmless but unconventional — it simply evaluates the last number as a float with no fractional effect. ## Source Code ``` 1 REM cfe/mc (+demo) 3 CLS : PRINT AT 9,4;"18 seconds to lift-off..."'''"The demo (lines 2000 thru 9999) is a dummy menu screen showing some of cfe's potential. To re-start GO TO 2000." 4 LET code=45000 5 LET print=code+13 6 POKE 23728,(code-256*INT (code/256)): POKE 23729,INT (code/256) 7 FOR t=code TO code+1501: READ o: POKE t,o: NEXT t 8 REM CFE CODE 10 DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,213,197,229,245,217,8,213,197,229,245,237,91,176,92,24,13,0,0,0,0 20 DATA 0,0,0,0,0,225,35,24,7,42,85,92,1,5,0,9,126,254,173,32,6,235,54,2,235,24,77,254,172,32,6,235,54,1,235,24,67 30 DATA 254,34,32,6,229,33,26,1,25,233 40 DATA 235,22,65,1,116,0,9,114,35,35,35,119,62,0,205,48,18,62,69,215,62,82,215,62,82,215,62,79,215,62,82,215,62,32,215,62,120,215,62,120,215 50 DATA 205,9,32,56,251,241,225,193,209,8,217,241,225,193,209,201 60 DATA 35,126,1,97,8,213,229,33,3,0,25,235,225,185,32,3,26,24,50,12,19,16,246,209,1,48,10,185,40,8,12,16,250,235,22,66,24,164 70 DATA 213,198,208,79,35,26,254,1,40,4,30,59,24,2,30,44,126,187,121,40,11,6,9,129,16,253,79,62,208,134,129,35,209,1,118,92,2 80 DATA 35,229,26,254,2,40,35,1,8,168,58,118,92,111,62,0,189,40,8,60,245,120,145,71,241,24,245,120,213,235,17,12,0,25,209,119,62,2,18,225,24,140 90 DATA 58,118,92,1,8,8,103,62,0,203,68,40,1,129,203,33,203,44,16,245,213,235,17,11,0,25,209,119,225 100 DATA 35,24,2,24,141,126,254,34,32,51,35,126,254,58,32,18,229,33,38,0,229,46,11,124,25,119,35,126,214,8,119,225,25,233,254,59,40,5 110 DATA 33,126,0,24,233,35,126,254,13,32,5,33,126,0,25,233,43,229,33,38,0,25,233,254,39,32,14,35,126,254,39,32,4,62,34,24,8,43,126,24,4 120 DATA 203,127,32,20,6,7,229,213,22,0,95,213,225,25,16,253,209,229,24,122,198,185,24,236,254,199,40,248,254,200,40,244,254,201,40,240 130 DATA 24,5,235,22,67,24,137,254,197,40,77,254,195,40,114,254,172,40,120,254,204,40,18,254,203,40,104,254,198,40,102,254,205,40,100,254,226,40,98 140 DATA 24,217,229,213,225,35,126,254,1,40,7,54,1,1,138,24,24,5,54,0,1,217,229,33,73,2,25,112,35,113,24,123,229,8,217,197,245,121,193,144 150 DATA 193,79,120,198,248,71,8,24,101,229,33,45,2,25,126,254,56,40,4,54,56,24,2,54,48,24,88 160 DATA 193,33,198,1,25,9,8,126,8,126,213,229,33,11,0,25,78,35,70,225,197,24,18 170 DATA 24,68,24,162,24,160,24,158,24,156,229,33,11,0,25,53,24,47 180 DATA 217,193,217,71,35,175,126,197,6,8,23,217,48,7,197,245,205,62,38,241,193,4,217,16,241,193,217,12,120,198,248,71,217,16,225 190 DATA 209,33,11,0,25,229,217,225,113,35,112,217,33,26,1,25,233 200 DATA 62,0,50,119,92,35,126,254,34,40,37,254,195,32,46,213,225,1,116,0,9,54,61,35,35,35,58,119,92,6,2,79,175,121,23,56,4,16,251,14,32,121,119,33,92,0,25,233 210 DATA 33,37,0,25,58,119,92,119,33,126,0,25,233,203,127,40,21,1,199,2,185,40,13,12,16,250,254,172,32,183,58,119,92,61,24,174,198,185 220 DATA 229,213,6,7,22,0,95,213,225,25,16,253,209,229,193,33,198,1,25,9,58,119,92,134,225,24,145 980 REM CLASSY FONT TABLE DATA 1000 DATA 4,0,0,0,0,0,0,0.,3,0,94,94,0,0,0,0.,5,0,7,0,0,7,0,0.,6,34,255,34,34,255,34,0.,6,0,44,110,255,74,48,0 1010 DATA 7,0,12,10,102,50,94,54.,5,0,40,124,214,84,0,0.,3,0,4,3,0,0,0,0.,4,0,60,126,129,0,0,0.,4,0,129,126,60,0,0,0 1020 DATA 6,0,10,4,31,4,10,0.,6,0,16,16,124,16,16,0.,3,0,144,112,0,0,0,0.,5,0,24,24,24,24,0,0.,3,0,96,96,0,0,0,0 1030 DATA 4,0,96,24,6,0,0,0.,6,0,60,126,82,74,60,0.,4,0,68,126,64,0,0,0.,5,0,100,98,82,76,0,0.,6,0,34,66,74,126,50,0 1040 DATA 5,0,24,20,126,16,0,0.,5,0,46,78,74,50,0,0.,6,0,56,124,74,74,48,0.,5,0,2,114,26,14,0,0.,6,0,52,126,74,74,52,0 1050 DATA 6,0,12,94,82,82,60,0.,3,0,40,40,0,0,0,0.,3,0,168,104,0,0,0,0.,5,0,24,60,102,129,0,0.,3,40,40,40,0,0,0,0 1060 DATA 5,0,129,102,60,24,0,0.,6,0,4,2,82,94,12,0.,7,0,4,50,42,122,66,60.,6,0,124,126,18,18,124,0.,6,0,126,126,74,74,52,0 1070 DATA 6,0,60,126,66,66,36,0.,6,0,126,126,66,66,60,0.,6,0,126,126,74,74,66,0.,6,0,126,126,10,10,2,0.,6,0,60,126,66,82,116,0 1080 DATA 6,0,126,126,8,8,126,0.,5,0,66,126,126,66,0,0.,6,0,48,64,64,126,62,0.,6,0,126,126,24,36,66,0.,6,0,126,126,64,64,64,0 1090 DATA 7,0,126,126,4,8,4,126.,7,0,126,126,12,48,126,126.,6,0,60,126,66,66,60,0.,6,0,126,126,18,18,12,0.,6,0,60,126,82,98,252,0 1100 DATA 6,0,126,126,18,50,108,0.,6,0,44,110,74,74,48,0.,6,2,2,126,126,2,2,0.,6,0,62,126,64,64,62,0.,7,0,6,30,120,96,24,6 1110 DATA 7,0,62,126,64,48,64,62.,7,0,66,102,60,24,36,66.,7,2,6,12,120,120,4,2.,6,0,98,114,90,78,70,0.,3,0,255,129,0,0,0,0 1120 DATA 4,0,6,24,96,0,0,0.,3,0,129,255,0,0,0,0.,7,0,62,30,30,62,114,32.,6,128,128,128,128,128,128,0.,7,0,252,254,194,194,194,126 1130 DATA 5,0,48,120,72,120,0,0.,5,0,126,72,120,48,0,0.,5,0,48,120,72,72,0,0.,5,0,48,120,72,126,0,0.,5,0,48,120,104,88,0,0 1140 DATA 4,0,8,126,10,0,0,0.,5,0,176,248,200,248,0,0.,5,0,126,8,8,112,0,0.,4,0,72,122,64,0,0,0.,3,128,128,122,0,0,0,0 1150 DATA 5,0,126,16,48,72,0,0.,4,0,66,126,64,0,0,0.,7,0,120,120,8,120,8,112.,5,0,120,120,8,112,0,0.,5,0,48,120,72,48,0,0 1160 DATA 5,0,248,72,120,48,0,0.,5,0,48,120,72,248,0,0.,5,0,120,112,8,8,0,0.,5,0,80,88,120,40,0,0.,4,0,8,126,72,0,0,0 1170 DATA 5,0,56,120,64,120,0,0.,5,0,24,48,96,24,0,0.,7,0,56,120,64,48,64,56.,5,0,72,48,48,72,0,0.,5,0,152,184,96,56,0,0 1180 DATA 5,0,72,104,88,72,0,0.,6,1,1,1,1,1,1,0.,4,0,255,255,0,0,0,0.,6,170,170,170,170,170,170,0.,7,68,108,56,31,56,108,68 1190 DATA 5,0,24,60,231,36,0,0 1200 DATA 6,255,119,219,119,219,255,0.,3,0,24,24,0,0,0,0.,7,24,48,96,48,8,4,2 2000 REM DRAW MAIN SCREEN 2005 PAPER 5: BORDER 1: CLS : PAPER 7: FOR t=0 TO 7: PRINT " ";: NEXT t: PLOT 2,2: DRAW 250,0: DRAW 0,166: DRAW -250,0: DRAW 0,-166: PLOT 2,159: DRAW 250,0: RANDOMIZE USR print 2010 REM AT 0,1;">= File Edit OR Demo^ OR Windows Options";AT 1,0;" BEEP `BEEP BEEP BEEP BEEP BEEP BEEP BEEP BEEP CLASSY FRONT END DEMO BEEP BEEP BEEP BEEP BEEP BEEP BEEP BEEP BEEP " 2020 PAPER 5: RANDOMIZE USR print 2030 REM AT 2,2;">= New 2068 Medium character set:" 2040 FOR t=1 TO 6: RANDOMIZE USR print 2050 REM " !''#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNO" 2060 RANDOMIZE USR print 2070 REM "AT PQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyzAT AT ON ERRSTICKBEEP FREE " 2080 RANDOMIZE USR print 2090 REM " AT ©<=>=<>%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNO" 2100 NEXT t 2500 REM ARROW KEY LOOP 2510 PAPER 7: GO SUB 8200 2520 LET a=11: GO SUB 6020 3000 IF INKEY$="6" THEN GO SUB 6000 3010 IF CODE INKEY$=13 THEN STOP 3020 IF INKEY$="7" THEN GO SUB 6030 3030 GO TO 3000 5990 REM MENU ICON 6000 PRINT AT a,6;" ": GO SUB 7890+a*10 6010 LET a=a+1: IF a=20 THEN LET a=11 6020 PRINT AT a,6;" ": GO SUB 7980+a*10: RETURN 6030 PRINT AT a,6;" ": GO SUB 7890+a*10 6040 LET a=a-1: IF a=10 THEN LET a=19 6050 PRINT AT a,6;" ": GO SUB 7980+a*10: RETURN 7990 REM menu subroutines 8000 RANDOMIZE USR print 8005 REM AT 11,6;">= AT AT ''Kerning'' function " 8009 RETURN 8010 RANDOMIZE USR print 8015 REM AT 12,6;">= AT OR Inverse AT AT printing " 8019 RETURN 8020 RANDOMIZE USR print 8025 REM AT 13,6;">= AT TO Vertical AT AT printing " 8029 RETURN 8030 RANDOMIZE USR print 8035 REM AT 14,6;">= AT NOT AT AT Line AT AT length AT tester " 8039 RETURN 8040 RANDOMIZE USR print 8045 REM AT 15,6;">= AT AT STEP, AT AT AND,AT AT THEN, AT AT STAT OP" 8049 RETURN 8050 RANDOMIZE USR print 8055 REM AT 16,6;">= AT ERROR AT AT codes A, B, C " 8059 RETURN 8060 RANDOMIZE USR print 8065 REM AT 17,6;">= AT Using color commands " 8069 RETURN 8070 RANDOMIZE USR print 8075 REM AT 18,6;">= AT Using OVER & ERASE " 8079 RETURN 8080 RANDOMIZE USR print 8085 REM AT 19,6;">= AT QUIT AT program AT demos " 8089 RETURN 8090 RANDOMIZE USR print 8095 REM AT 11,6;" OR >= AT AT ''Kerning'' function OR " 8099 RETURN 8100 RANDOMIZE USR print 8105 REM AT 12,6;" OR >= AT OR Inverse AT AT printing OR " 8109 RETURN 8110 RANDOMIZE USR print 8115 REM AT 13,6;" OR >= AT TO Vertical AT AT printing OR " 8119 RETURN 8120 RANDOMIZE USR print 8125 REM AT 14,6;" OR >= AT NOT AT Line AT AT length AT AT tester OR " 8129 RETURN 8130 RANDOMIZE USR print 8135 REM AT 15,6;" OR >= AT STEP, AT AT AND,AT AT THEN, AT AT STAT OP OR " 8139 RETURN 8140 RANDOMIZE USR print 8145 REM AT 16,6;" OR >= AT ERROR AT codes A, B, C OR " 8149 RETURN 8150 RANDOMIZE USR print 8155 REM AT 17,6;" OR >= AT Using color commands AT AT AT OR " 8159 RETURN 8160 RANDOMIZE USR print 8165 REM AT 18,6;" OR >= AT Using OVER & ERASE AT AT AT OR " 8169 RETURN 8170 RANDOMIZE USR print 8175 REM AT 19,6;" OR >= AT QUIT AT program AT demos AT AT AT OR " 8179 RETURN 8190 REM DRAW MENU BOX 8200 PAPER 7: FOR t=9 TO 20: PRINT AT t,6;" ": NEXT t: PLOT 46,104: DRAW 0,-98: DRAW 113,0: DRAW 0,1: DRAW -112,0: DRAW 0,88: DRAW 112,0: PLOT 46,104: DRAW 114,0: DRAW 0,-97: PAPER 3: RANDOMIZE USR print 8210 REM AT 9,6;"BEEP BEEP BEEP BEEP BEEP BEEP MENU BEEP BEEP BEEP BEEP BEEP BEEP BEEP " 8230 PAPER 7: FOR b=11 TO 19: GO SUB 7890+b*10: NEXT b 8240 RETURN 9999 SAVE "cfe+demo" LINE 3: SAVE "cfe+demo" LINE 3 1 REM cfe/mc (+demo) 3 CLS : PRINT AT 9,4;"18 seconds to lift-off..."'''"The demo (lines 2000 thru 9999) is a dummy menu screen showing some of cfe's potential. To re-start GO TO 2000." 4 LET code=45000 5 LET print=code+13 6 POKE 23728,(code-256*INT (code/256)): POKE 23729,INT (code/256) 7 FOR t=code TO code+1501: READ o: POKE t,o: NEXT t 8 REM CFE CODE 10 DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,213,197,229,245,217,8,213,197,229,245,237,91,176,92,24,13,0,0,0,0 20 DATA 0,0,0,0,0,225,35,24,7,42,85,92,1,5,0,9,126,254,173,32,6,235,54,2,235,24,77,254,172,32,6,235,54,1,235,24,67 30 DATA 254,34,32,6,229,33,26,1,25,233 40 DATA 235,22,65,1,116,0,9,114,35,35,35,119,62,0,205,48,18,62,69,215,62,82,215,62,82,215,62,79,215,62,82,215,62,32,215,62,120,215,62,120,215 50 DATA 205,9,32,56,251,241,225,193,209,8,217,241,225,193,209,201 60 DATA 35,126,1,97,8,213,229,33,3,0,25,235,225,185,32,3,26,24,50,12,19,16,246,209,1,48,10,185,40,8,12,16,250,235,22,66,24,164 70 DATA 213,198,208,79,35,26,254,1,40,4,30,59,24,2,30,44,126,187,121,40,11,6,9,129,16,253,79,62,208,134,129,35,209,1,118,92,2 80 DATA 35,229,26,254,2,40,35,1,8,168,58,118,92,111,62,0,189,40,8,60,245,120,145,71,241,24,245,120,213,235,17,12,0,25,209,119,62,2,18,225,24,140 90 DATA 58,118,92,1,8,8,103,62,0,203,68,40,1,129,203,33,203,44,16,245,213,235,17,11,0,25,209,119,225 100 DATA 35,24,2,24,141,126,254,34,32,51,35,126,254,58,32,18,229,33,38,0,229,46,11,124,25,119,35,126,214,8,119,225,25,233,254,59,40,5 110 DATA 33,126,0,24,233,35,126,254,13,32,5,33,126,0,25,233,43,229,33,38,0,25,233,254,39,32,14,35,126,254,39,32,4,62,34,24,8,43,126,24,4 120 DATA 203,127,32,20,6,7,229,213,22,0,95,213,225,25,16,253,209,229,24,122,198,185,24,236,254,199,40,248,254,200,40,244,254,201,40,240 130 DATA 24,5,235,22,67,24,137,254,197,40,77,254,195,40,114,254,172,40,120,254,204,40,18,254,203,40,104,254,198,40,102,254,205,40,100,254,226,40,98 140 DATA 24,217,229,213,225,35,126,254,1,40,7,54,1,1,138,24,24,5,54,0,1,217,229,33,73,2,25,112,35,113,24,123,229,8,217,197,245,121,193,144 150 DATA 193,79,120,198,248,71,8,24,101,229,33,45,2,25,126,254,56,40,4,54,56,24,2,54,48,24,88 160 DATA 193,33,198,1,25,9,8,126,8,126,213,229,33,11,0,25,78,35,70,225,197,24,18 170 DATA 24,68,24,162,24,160,24,158,24,156,229,33,11,0,25,53,24,47 180 DATA 217,193,217,71,35,175,126,197,6,8,23,217,48,7,197,245,205,62,38,241,193,4,217,16,241,193,217,12,120,198,248,71,217,16,225 190 DATA 209,33,11,0,25,229,217,225,113,35,112,217,33,26,1,25,233 200 DATA 62,0,50,119,92,35,126,254,34,40,37,254,195,32,46,213,225,1,116,0,9,54,61,35,35,35,58,119,92,6,2,79,175,121,23,56,4,16,251,14,32,121,119,33,92,0,25,233 210 DATA 33,37,0,25,58,119,92,119,33,126,0,25,233,203,127,40,21,1,199,2,185,40,13,12,16,250,254,172,32,183,58,119,92,61,24,174,198,185 220 DATA 229,213,6,7,22,0,95,213,225,25,16,253,209,229,193,33,198,1,25,9,58,119,92,134,225,24,145 980 REM CLASSY FONT TABLE DATA 1000 DATA 4,0,0,0,0,0,0,0.,3,0,94,94,0,0,0,0.,5,0,7,0,0,7,0,0.,6,34,255,34,34,255,34,0.,6,0,44,110,255,74,48,0 1010 DATA 7,0,12,10,102,50,94,54.,5,0,40,124,214,84,0,0.,3,0,4,3,0,0,0,0.,4,0,60,126,129,0,0,0.,4,0,129,126,60,0,0,0 1020 DATA 6,0,10,4,31,4,10,0.,6,0,16,16,124,16,16,0.,3,0,144,112,0,0,0,0.,5,0,24,24,24,24,0,0.,3,0,96,96,0,0,0,0 1030 DATA 4,0,96,24,6,0,0,0.,6,0,60,126,82,74,60,0.,4,0,68,126,64,0,0,0.,5,0,100,98,82,76,0,0.,6,0,34,66,74,126,50,0 1040 DATA 5,0,24,20,126,16,0,0.,5,0,46,78,74,50,0,0.,6,0,56,124,74,74,48,0.,5,0,2,114,26,14,0,0.,6,0,52,126,74,74,52,0 1050 DATA 6,0,12,94,82,82,60,0.,3,0,40,40,0,0,0,0.,3,0,168,104,0,0,0,0.,5,0,24,60,102,129,0,0.,3,40,40,40,0,0,0,0 1060 DATA 5,0,129,102,60,24,0,0.,6,0,4,2,82,94,12,0.,7,0,4,50,42,122,66,60.,6,0,124,126,18,18,124,0.,6,0,126,126,74,74,52,0 1070 DATA 6,0,60,126,66,66,36,0.,6,0,126,126,66,66,60,0.,6,0,126,126,74,74,66,0.,6,0,126,126,10,10,2,0.,6,0,60,126,66,82,116,0 1080 DATA 6,0,126,126,8,8,126,0.,5,0,66,126,126,66,0,0.,6,0,48,64,64,126,62,0.,6,0,126,126,24,36,66,0.,6,0,126,126,64,64,64,0 1090 DATA 7,0,126,126,4,8,4,126.,7,0,126,126,12,48,126,126.,6,0,60,126,66,66,60,0.,6,0,126,126,18,18,12,0.,6,0,60,126,82,98,252,0 1100 DATA 6,0,126,126,18,50,108,0.,6,0,44,110,74,74,48,0.,6,2,2,126,126,2,2,0.,6,0,62,126,64,64,62,0.,7,0,6,30,120,96,24,6 1110 DATA 7,0,62,126,64,48,64,62.,7,0,66,102,60,24,36,66.,7,2,6,12,120,120,4,2.,6,0,98,114,90,78,70,0.,3,0,255,129,0,0,0,0 1120 DATA 4,0,6,24,96,0,0,0.,3,0,129,255,0,0,0,0.,7,0,62,30,30,62,114,32.,6,128,128,128,128,128,128,0.,7,0,252,254,194,194,194,126 1130 DATA 5,0,48,120,72,120,0,0.,5,0,126,72,120,48,0,0.,5,0,48,120,72,72,0,0.,5,0,48,120,72,126,0,0.,5,0,48,120,104,88,0,0 1140 DATA 4,0,8,126,10,0,0,0.,5,0,176,248,200,248,0,0.,5,0,126,8,8,112,0,0.,4,0,72,122,64,0,0,0.,3,128,128,122,0,0,0,0 1150 DATA 5,0,126,16,48,72,0,0.,4,0,66,126,64,0,0,0.,7,0,120,120,8,120,8,112.,5,0,120,120,8,112,0,0.,5,0,48,120,72,48,0,0 1160 DATA 5,0,248,72,120,48,0,0.,5,0,48,120,72,248,0,0.,5,0,120,112,8,8,0,0.,5,0,80,88,120,40,0,0.,4,0,8,126,72,0,0,0 1170 DATA 5,0,56,120,64,120,0,0.,5,0,24,48,96,24,0,0.,7,0,56,120,64,48,64,56.,5,0,72,48,48,72,0,0.,5,0,152,184,96,56,0,0 1180 DATA 5,0,72,104,88,72,0,0.,6,1,1,1,1,1,1,0.,4,0,255,255,0,0,0,0.,6,170,170,170,170,170,170,0.,7,68,108,56,31,56,108,68 1190 DATA 5,0,24,60,231,36,0,0 1200 DATA 6,255,119,219,119,219,255,0.,3,0,24,24,0,0,0,0.,7,24,48,96,48,8,4,2 2000 REM DRAW MAIN SCREEN 2005 PAPER 5: BORDER 1: CLS : PAPER 7: FOR t=0 TO 7: PRINT " ";: NEXT t: PLOT 2,2: DRAW 250,0: DRAW 0,166: DRAW -250,0: DRAW 0,-166: PLOT 2,159: DRAW 250,0: RANDOMIZE USR print 2010 REM AT 0,1;">= File Edit OR Demo^ OR Windows Options";AT 1,0;" BEEP `BEEP BEEP BEEP BEEP BEEP BEEP BEEP BEEP CLASSY FRONT END DEMO BEEP BEEP BEEP BEEP BEEP BEEP BEEP BEEP BEEP " 2020 PAPER 5: RANDOMIZE USR print 2030 REM AT 2,2;">= New 2068 Medium character set:" 2040 FOR t=1 TO 6: RANDOMIZE USR print 2050 REM " !''#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNO" 2060 RANDOMIZE USR print 2070 REM "AT PQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyzAT AT ON ERRSTICKBEEP FREE " 2080 RANDOMIZE USR print 2090 REM " AT ©<=>=<>%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNO" 2100 NEXT t 2500 REM ARROW KEY LOOP 2510 PAPER 7: GO SUB 8200 2520 LET a=11: GO SUB 6020 3000 IF INKEY$="6" THEN GO SUB 6000 3010 IF CODE INKEY$=13 THEN STOP 3020 IF INKEY$="7" THEN GO SUB 6030 3030 GO TO 3000 5990 REM MENU ICON 6000 PRINT AT a,6;" ": GO SUB 7890+a*10 6010 LET a=a+1: IF a=20 THEN LET a=11 6020 PRINT AT a,6;" ": GO SUB 7980+a*10: RETURN 6030 PRINT AT a,6;" ": GO SUB 7890+a*10 6040 LET a=a-1: IF a=10 THEN LET a=19 6050 PRINT AT a,6;" ": GO SUB 7980+a*10: RETURN 7990 REM menu subroutines 8000 RANDOMIZE USR print 8005 REM AT 11,6;">= AT AT ''Kerning'' function " 8009 RETURN 8010 RANDOMIZE USR print 8015 REM AT 12,6;">= AT OR Inverse AT AT printing " 8019 RETURN 8020 RANDOMIZE USR print 8025 REM AT 13,6;">= AT TO Vertical AT AT printing " 8029 RETURN 8030 RANDOMIZE USR print 8035 REM AT 14,6;">= AT NOT AT AT Line AT AT length AT tester " 8039 RETURN 8040 RANDOMIZE USR print 8045 REM AT 15,6;">= AT AT STEP, AT AT AND,AT AT THEN, AT AT STAT OP" 8049 RETURN 8050 RANDOMIZE USR print 8055 REM AT 16,6;">= AT ERROR AT AT codes A, B, C " 8059 RETURN 8060 RANDOMIZE USR print 8065 REM AT 17,6;">= AT Using color commands " 8069 RETURN 8070 RANDOMIZE USR print 8075 REM AT 18,6;">= AT Using OVER & ERASE " 8079 RETURN 8080 RANDOMIZE USR print 8085 REM AT 19,6;">= AT QUIT AT program AT demos " 8089 RETURN 8090 RANDOMIZE USR print 8095 REM AT 11,6;" OR >= AT AT ''Kerning'' function OR " 8099 RETURN 8100 RANDOMIZE USR print 8105 REM AT 12,6;" OR >= AT OR Inverse AT AT printing OR " 8109 RETURN 8110 RANDOMIZE USR print 8115 REM AT 13,6;" OR >= AT TO Vertical AT AT printing OR " 8119 RETURN 8120 RANDOMIZE USR print 8125 REM AT 14,6;" OR >= AT NOT AT Line AT AT length AT AT tester OR " 8129 RETURN 8130 RANDOMIZE USR print 8135 REM AT 15,6;" OR >= AT STEP, AT AT AND,AT AT THEN, AT AT STAT OP OR " 8139 RETURN 8140 RANDOMIZE USR print 8145 REM AT 16,6;" OR >= AT ERROR AT codes A, B, C OR " 8149 RETURN 8150 RANDOMIZE USR print 8155 REM AT 17,6;" OR >= AT Using color commands AT AT AT OR " 8159 RETURN 8160 RANDOMIZE USR print 8165 REM AT 18,6;" OR >= AT Using OVER & ERASE AT AT AT OR " 8169 RETURN 8170 RANDOMIZE USR print 8175 REM AT 19,6;" OR >= AT QUIT AT program AT demos AT AT AT OR " 8179 RETURN 8190 REM DRAW MENU BOX 8200 PAPER 7: FOR t=9 TO 20: PRINT AT t,6;" ": NEXT t: PLOT 46,104: DRAW 0,-98: DRAW 113,0: DRAW 0,1: DRAW -112,0: DRAW 0,88: DRAW 112,0: PLOT 46,104: DRAW 114,0: DRAW 0,-97: PAPER 3: RANDOMIZE USR print 8210 REM AT 9,6;"BEEP BEEP BEEP BEEP BEEP BEEP MENU BEEP BEEP BEEP BEEP BEEP BEEP BEEP " 8230 PAPER 7: FOR b=11 TO 19: GO SUB 7890+b*10: NEXT b 8240 RETURN 9999 SAVE "cfe+demo" LINE 3: SAVE "cfe+demo" LINE 3 ```