JazzoFire

Products: Jazzofire
Date: 1988
Type: Program
Platform(s): TS 2068

This collection contains three related TS2068 BASIC programs: “UDG+ version 2.0,” a user-defined graphics designer; “cfe/mc,” a Classy Front End machine code demo; and “w&p,” a window and porthole graphics demo.

The Ultra-Easy Designer Graphics+ (UDG+) program lets users draw 8×8 pixel characters interactively using a pixel cursor, store them into UDG slots or ASCII character positions, save and load UDG sets to tape, and display the full character table. It manipulates the system variables at addresses 23606–23607 to switch between two character sets (POKEing 251/86 and 60/0), and copies ROM data from 15616–16384 to address 64598 for a custom font base.

The Classy Front End (cfe/mc) program loads 1,502 bytes of Z80 machine code at address 45000, then uses RANDOMIZE USR to invoke a print routine that renders a proportionally-spaced “Classy” font with kerning, driven by a large font-metrics table in DATA lines.

The w&p (Windows & Portholes) demo loads further machine code at 55000 that draws circular porthole graphics at random screen positions, then demonstrates a series of nested rectangular window frames using block-graphic characters.


Program Analysis

Program Structure Overview

The listing contains three independent BASIC programs saved consecutively. Each ends with a SAVE statement at line 9999:

  1. UDG+ (lines 1–9999, first block) — an interactive user-defined graphics designer
  2. cfe/mc (lines 1–9999, second block) — a “Classy Front End” machine code font demo
  3. w&p (lines 1–9999, third block) — a window and porthole graphics demo

UDG+ — Program Structure

UDG+ initializes with CLEAR 64597 to protect high memory, copies 768 bytes of ROM character data from addresses 15616–16384 up to 64598, and installs 8 bytes of machine code at 65528–65535 via READ/POKE. Two operating modes are tracked by the variable ci: ci=9600 for the pixel-drawing canvas and ci=9000 for the character-table overview screen.

The main control loop at lines 100–210 polls INKEY$ using CODE INKEY$ to detect keystrokes: code 51 (“3”) moves the menu cursor down, 52 (“4”) moves it up, 49 (“1”) triggers an action via computed GO SUB cs+750, and 97 (“a”) invokes the current mode via GO SUB ci. The menu cursor position cs skips rows 9–10 and 15 (lines 125, 130), giving three distinct menu groups.

UDG+ — Key Techniques

  • Computed GO SUB: Lines 190 and 200 use GO SUB cs+750 and GO SUB ci to dispatch to action routines and mode-switch routines without a lookup table.
  • Character-set switching: Lines 600 and 610 POKE system variables 23606/23607 to toggle between the custom font at address 64342 (86+251×256) and the standard ROM font at address 15360 (0+60×256), allowing the program to display custom characters mid-screen.
  • Pixel editor: Lines 8000–8110 implement a freehand pixel cursor. Keys 5/6/7/8 move the cursor; key 0 sets a pixel white (CHR$ 128), key 9 sets it black (CHR$ 143). The cursor blink is achieved by printing CHR$ 134 then CHR$ 137 then the background character in quick succession.
  • Bit-scanning for UDG data: Lines 300–340 read the ATTR of each cell in an 8×8 grid, extract the paper color, compare against white (7), and accumulate a bitmask into array d() for storage.
  • UDG storage addressing: Lines 420–430 compute the target memory address: for printable ASCII (vn 32–127) it uses base 64590+8*(vn-31); for UDG characters (144–164) it uses 65360+8*(vn-143).
  • Save/Load: Line 28 saves 941 bytes from address 64598 as a CODE block named “UDG”; line 29 loads it back and refreshes the display.
  • Four-quadrant grid: Lines 21–24 and 30–33 operate on four 8×8 quadrants of the drawing area. Lines 36–39 and 40 similarly handle storing all four quadrants in sequence. Line 34 loops over subroutines 30–33 with FOR m=30 TO 33: GO SUB m: NEXT m, a compact multi-dispatch idiom.
  • Input validation: Line 42 validates the four character-code inputs, rejecting codes outside the printable ASCII range or UDG range, and specifically excluding codes 124 (|/STICK) and 126 (~/FREE).

UDG+ — Character Table Display (lines 9600–9730)

The character-overview mode draws a full table of all printable characters grouped by ASCII range. Lines 9610–9670 call subroutine 9720 with different xp/yp/wp/xt parameters to print each range in its column. Crucially, subroutine 9720 itself temporarily switches to the custom font (POKE 23606/23607) to print each CHR$ z so that modified characters display correctly alongside their numeric codes.

cfe/mc — Machine Code Font Renderer

Lines 4–7 load 1,502 bytes of Z80 machine code into address 45000. A helper address print=code+13 (45013) points to the print entry point within this block. All rendering is done by placing string data in REM statements on the immediately following line, then calling RANDOMIZE USR print; the machine code reads the REM contents directly from program memory to render each character using the proportional font metrics stored in the DATA tables at lines 1000–1190.

The font table (lines 1000–1190) stores each character as 8 bytes of bitmap data preceded by a width byte. Characters are stored in order from ASCII 32 (space) through the UDG range. Each DATA line ends with a period-separated entry for the next character, which is a zmakebas artifact for the trailing data separator.

cfe/mc — Menu Demo

Lines 2000–8240 implement a mock GUI menu. A variable a tracks the highlighted menu row (11–19). Keys “6” and “7” scroll the highlight down and up respectively; ENTER stops the program. Each menu item has two subroutines: one at 7890+row*10 for the normal (unhighlighted) appearance and one at 7980+row*10 for the highlighted appearance, both invoking RANDOMIZE USR print to render the menu text with the custom proportional font. This gives the illusion of a desktop GUI pull-down menu.

w&p — Machine Code and Graphics

Lines 5–10 and 1360–2000 load 1,164 bytes of machine code at address 55000. The porthole demo (lines 3000–3050) picks random screen coordinates, POKEs them into the machine code at offsets 14 and 15 of the block, then calls USR l to draw a circular porthole graphic using the extensive sprite data in lines 1420–1495. The AT y,x-2 print after each porthole labels its coordinates.

The window demo (lines 4000–4140) draws five nested rectangular window frames using a sequence of block-graphic characters. For each frame g stepping from 108 down to 60 in steps of 8, it prints corner, edge, and fill characters at CHR$ g through CHR$ (g+7). Lines 4150/4160 toggle system variable 23606/23607 between the custom sprite font and the standard font, allowing the window border characters to render from the loaded sprite data.

Notable Anomalies and Observations

  • Line 2 of UDG+ is a REM noting that it is derived from “Son of UDG” published in TDM (Nov/Dec 1986), with three alterations at lines 42, 350, and 9680.
  • Line 800 in UDG+ prints FLASH 1: PRINT AT 17,8;"jesemenet!" — this appears to be a Hungarian word (“connection” or a personal name placeholder) and is used as a splash/title flash effect on startup and mode-switch, suggesting the author or a contributor had Hungarian connections.
  • Line 42 uses a compound condition c(t)<32 OR c(t)>127 AND c(t)<144 OR c(t)>163 OR c(t)=124 OR c(t)=126 which, due to BASIC operator precedence, evaluates the AND before the ORs, giving the intended range-exclusion logic.
  • In cfe/mc, the REM statements on lines following each RANDOMIZE USR print contain the actual text to be rendered — the machine code walks forward in program memory past the BASIC header to find the REM data. This is a well-known but advanced Z80 trick for passing string arguments to machine code routines.
  • The GO TO targets in lines like GO TO VAL "number" do not appear in this listing (the VAL idiom is absent), but several computed GO SUB expressions serve a similar role.

Variable Summary (UDG+)

VariablePurpose
ciCurrent mode: 9000=char table, 9600=pixel editor
csMenu cursor row (1–21, skipping 9–10, 15)
px, pyPixel cursor column and row in editor
d(32)Bitmask data for the 32 bytes (4 UDGs × 8 rows)
k(257)Canvas pixel state (0=white, 1=black) for 256 cells
c(4)CHR$ codes for the four display characters
e, vnTarget character code for storage
sIndex into d() array during bit-scanning

Content

Appears On

Related Products

Includes Ultra-Easy Designer Graphics+, Classy Front End, and Windows & Portholes.

Related Articles

Program demonstrates printing with variable-width fonts using PLOT/DRAW.
In designing a machine code utility one faces the inevitable quandry of too many desires and not enough space. I...
Patching a bug from the fourth article in the series.
Continues article from prior issue with window and porthole code.
Two kinds of windows options are described. The first are rectangular with shadows down two sides and the second are...
The concluding installment of a series on a custom font-printing machine-code routine for the TS2068, providing code for lines 100-220...
A colorful little utility which leaves you all the fun of designing user defined graphics and little of the drudgery....

Related Content

Image Gallery

JazzoFire

Source Code

    1 REM   _____UDG+_____                                        "ULTRA-EASY DESIGNER GRAPHICS"    version 2.0 by p. bingham        
    2 REM (This program is nearly identical to "son of udg" from TDM N/D '86. It includes three  alterations from TDM listing in lines 42, 350, and 9680.)  
   10 CLEAR 64597: GO SUB 800: FOR t=15616 TO 16384: POKE (t+48982),PEEK t: NEXT t: FOR t=65528 TO 65535: READ o: POKE t,o: NEXT t: FLASH 0: CLS : GO SUB 9015: GO SUB 9520: DATA 0,0,63,252,252,248,0,0
   20 DIM k(257): DIM c(4): FOR t=1 TO 4: LET c(t)=32: NEXT t: DIM d(32): DIM u(20): LET cs=7: LET at=7: LET px=5: LET py=1: INPUT "Press ENTER to continue...";n$: GO TO 105
   21 LET x=1: LET y=5: GO TO 400
   22 LET x=1: LET y=13: GO TO 400
   23 LET x=9: LET y=5: GO TO 400
   24 LET x=9: LET y=13: GO TO 400
   25 GO TO 350
   26 PAPER 7: LET k=5+(8*INT (px/13)): FOR h=k TO k+7: PRINT AT py,h;CHR$ 128: NEXT h: RETURN 
   27 PAPER 0: LET k=5+(8*INT (px/13)): FOR h=k TO k+7: PRINT AT py,h;CHR$ 143: NEXT h: RETURN 
   28 INPUT "1)SAVE UDGs  2)LOAD UDGs  ";t: IF t=1 THEN SAVE "UDG"CODE 64598,941: RETURN 
   29 LOAD "UDG"CODE 64598,941: GO SUB 9000: RETURN 
   30 LET s=1: LET x=1: LET y=4: LET q=1: GO TO 35
   31 LET s=9: LET x=1: LET y=12: LET q=22: GO TO 35
   32 LET s=17: LET x=9: LET y=4: LET q=1: GO TO 35
   33 LET s=25: LET x=9: LET y=12: LET q=22: GO TO 35
   34 FOR m=30 TO 33: GO SUB m: NEXT m: RETURN 
   35 GO SUB 300: RETURN 
   36 LET s=1: LET qx=0: GO TO 410
   37 LET s=9: LET qx=1: GO TO 410
   38 LET s=17: LET qx=0: GO TO 410
   39 LET s=25: LET qx=1: GO TO 410
   40 FOR m=36 TO 39: GO SUB m: LET f=1: NEXT m: RETURN 
   41 INPUT "1)COPY  2)DISPLAY  ";t: IF t=1 THEN COPY : LPRINT : LPRINT : LPRINT : RETURN 
   42 INPUT "1st:";c(1);" 2nd:";c(2);" 3rd:";c(3);" 4th:";c(4): FOR t=1 TO 4: IF c(t)<32 OR c(t)>127 AND c(t)<144 OR c(t)>163 OR c(t)=124 OR c(t)=126 THEN GO TO 42: NEXT t
   43 IF ci=9000 THEN GO SUB 350: GO SUB 600: PRINT AT 0,1;CHR$ c(1);CHR$ c(2);AT 1,1;CHR$ c(3);CHR$ c(4): GO SUB 610: FOR t=6 TO 18 STEP 4: PRINT AT 0,t;c(1+(t-6)/4): NEXT t: PAPER 1: RETURN 
   44 FOR t=1 TO 4: IF t<=2 THEN LET y1=1: LET x1=(INT (t*6/12))*8+4: GO TO 46
   45 LET y1=9: LET x1=(INT (t*3/12))*8+4
   46 IF c(t)>143 THEN LET h=(c(t)-144)*8+65368: GO TO 63
   47 LET h=(c(t)-32)*8+64598
   63 FOR m=h TO h+7: LET a1=PEEK m
   64 FOR g=8 TO 1 STEP -1: LET a1=a1/2: IF INT a1<a1 THEN PAPER 0: PRINT AT y1,x1+g;CHR$ 143;: LET a1=INT a1: GO TO 66
   65 PAPER 7: PRINT AT y1,x1+g;CHR$ 128;
   66 NEXT g: LET y1=y1+1: NEXT m: NEXT t: RETURN 
  100 GO SUB 9000: GO SUB 9520
  105 PAPER 1: PRINT AT cs,26;" ": PAPER 7: PRINT AT cs,26;CHR$ 164: IF ci=9600 THEN GO SUB 8000: GO TO 110
  107 GO SUB 600: GO SUB 610
  110 PAPER 1: PRINT AT cs,26;" ": IF CODE INKEY$=51 THEN LET cs=cs+1: GO TO 120
  115 GO TO 140
  125 IF cs=9 THEN LET cs=10
  130 IF cs=15 THEN LET cs=16
  135 IF cs>21 THEN LET cs=1
  137 PAPER 7: PRINT AT cs,26;CHR$ 164
  140 IF CODE INKEY$=52 THEN LET cs=cs-1: GO TO 160
  150 GO TO 190
  165 IF cs=9 THEN LET cs=8
  170 IF cs=15 THEN LET cs=14
  175 IF cs<1 THEN LET cs=21
  180 PAPER 7: PRINT AT cs,26;CHR$ 164
  190 IF CODE INKEY$=49 THEN GO SUB cs+750
  200 IF CODE INKEY$=97 THEN GO SUB ci
  210 GO TO 105
  300 FOR h=x TO x+7: DIM a(8): LET b=1: LET c=0
  310 FOR t=8 TO 1 STEP -1: LET a(t)=INT ((ATTR (h,y+t))/8)
  320 IF a(t)<>7 THEN LET c=c+b
  330 LET b=b*2: NEXT t: LET d(s)=c: LET s=s+1
  340 PAPER 5: BRIGHT 1: PRINT AT h,q;"   ": PRINT AT h,q;c: NEXT h: BRIGHT 0: RETURN 
  350 PAPER 7: IF ci=9000 THEN PRINT AT 0,1;"  ";AT 0,6;"   ";AT 0,10;"   ";AT 0,14;"   ";AT 0,18;"   ";AT 1,1;"  ";AT 21,16;"     ": RETURN 
  360 FOR m=21 TO 24: GO SUB m: NEXT m: RETURN 
  400 PAPER 7: FOR h=x TO x+7: FOR t=y TO y+7: PRINT AT h,t;CHR$ 128: NEXT t: NEXT h: RETURN 
  410 INPUT "CHR$ Number(C#) as Storage:";vn: IF vn>31 AND vn<128 AND vn<>124 AND vn<>126 OR vn>143 AND vn<165 THEN LET e=vn: GO TO 420
  415 INPUT "Illegal entry!--hit ENTER";v$: GO TO 410
  420 IF e>127 THEN LET j=INT (s/8): LET w=e-143: LET i=65360+8*w: GO TO 430
  425 LET j=INT (s/8): LET w=e-31: LET i=64590+8*w
  430 LET ru=s: FOR t=i TO i+7: POKE t,d(ru): LET ru=ru+1: NEXT t
  435 PAPER 7: IF ci=9000 THEN GO TO 530
  500 LET ki=i: LET f=e: FOR h=18+j TO 21: GO SUB 600: PRINT AT h,11;CHR$ e;AT h,23;CHR$ f: GO SUB 610: PRINT AT h,13;ki;AT h,19;f;: PAPER 5: BRIGHT 1: PRINT " ";: PAPER 7: BRIGHT 0: LET ki=ki+8: LET f=f+1: NEXT h
  505 IF CODE CHR$ e=124 OR CODE CHR$ e=126 THEN RETURN 
  510 GO SUB 600: FOR h=19 TO 21: PRINT AT h,j+1;CHR$ e: NEXT h
  520 IF j<2 THEN PRINT AT 19,j+7;CHR$ e: GO SUB 610: RETURN 
  525 PRINT AT 20,j+5;CHR$ e: GO SUB 610: RETURN 
  530 IF e<50 THEN LET gx=2: LET gy=28: GO TO 560
  535 IF e<70 THEN LET gx=6: LET gy=48: GO TO 560
  540 IF e<90 THEN LET gx=10: LET gy=68: GO TO 560
  545 IF e<110 THEN LET gx=14: LET gy=88: GO TO 560
  550 IF e<128 THEN LET gx=19: LET gy=108: GO TO 560
  555 LET gx=24: LET gy=143
  560 PRINT AT 21,16;i;AT 0,6+INT (s/8)*4;"   ";AT 0,6+INT (s/8)*4;e: GO SUB 600: PRINT AT qx,1+INT (s/17);CHR$ e;AT gy-e,gx;CHR$ e: GO SUB 610: RETURN 
  600 POKE 23606,86: POKE 23607,251: RETURN 
  610 POKE 23606,0: POKE 23607,60: RETURN 
  785 IF ci=9600 THEN GO SUB cs+20: RETURN 
  790 IF ci=9000 AND cs=5 OR cs=8 OR cs>15 THEN GO SUB cs+20: RETURN 
  795 RETURN 
  800 FLASH 1: PRINT AT 17,8;"jesemenet!": RETURN 
 8000 GO SUB 8100
 8002 LET n=CODE INKEY$: IF n=53 THEN GO SUB 8100: LET px=px-1
 8005 IF px<5 THEN LET px=20
 8010 IF n=54 THEN GO SUB 8100: LET py=py+1
 8015 IF py>16 THEN LET py=1
 8020 IF n=55 THEN GO SUB 8100: LET py=py-1
 8025 IF py<1 THEN LET py=16
 8030 IF n=56 THEN GO SUB 8100: LET px=px+1
 8035 IF px>20 THEN LET px=5
 8040 IF n=48 THEN PAPER 7: PRINT AT py,px;CHR$ 128
 8042 IF n=57 THEN PAPER 0: PRINT AT py,px;CHR$ 143: PAPER 7
 8045 FOR t=103 TO 105: PLOT 104,t: PLOT t,104: NEXT t
 8050 RETURN 
 8100 LET at=INT ((ATTR (py,px))/8)
 8105 IF at=7 THEN PRINT AT py,px;CHR$ 134: PRINT AT py,px;CHR$ 137: PRINT AT py,px;CHR$ 128
 8110 IF at=0 THEN PAPER 7: PRINT AT py,px;CHR$ 134: PRINT AT py,px;CHR$ 137: PAPER 0: PRINT AT py,px;CHR$ 143: PAPER 7
 8980 RETURN 
 9000 GO SUB 9015: INPUT "Display previous work? ";n$: IF n$<>"n" THEN LET tx=5: LET ty=1: FOR t=1 TO 256: GO TO 9003
 9001 RETURN 
 9003 IF k(t)=1 THEN PAPER 0: PRINT AT ty,tx;CHR$ 143: PAPER 7: GO TO 9010
 9005 PRINT AT ty,tx;CHR$ 128
 9010 LET tx=tx+1: IF tx>20 THEN LET tx=5: LET ty=ty+1
 9011 NEXT t: GO SUB 34: RETURN 
 9015 LET ci=9600: BORDER 1: PAPER 5: BRIGHT 1: FOR t=0 TO 21: PRINT AT t,0;"                          ";: NEXT t
 9060 BRIGHT 0: FOR t=4 TO 21: PRINT AT 0,t;" ";AT 17,t;" ": NEXT t
 9070 FOR t=1 TO 16: PRINT AT t,4;" ";AT t,21;" ": NEXT t
 9080 PRINT AT 0,4;"_";AT 0,21;"_";AT 8,4;"_";AT 8,21;"_"
 9090 FOR t=32 TO 39: PLOT 39,t: PLOT 103,t: PLOT 168,t: PLOT 39,t+136: PLOT 103,t+136: PLOT 168,t+136: NEXT t
 9092 PRINT AT 0,8;"-1-";AT 17,8;"-3-";AT 0,15;"-2-";AT 17,15;"-4-"
 9093 PLOT 39,39: DRAW 0,129: DRAW 129,0: DRAW 0,-129: PLOT 32,39: DRAW 143,0
 9130 BRIGHT 0: PAPER 7: FOR t=1 TO 16: PRINT AT t,5;"                ": NEXT t
 9200 INK 0: PAPER 5: BRIGHT 1
 9215 PRINT AT 18,1;"ABCD"
 9225 PAPER 7: BRIGHT 0
 9250 RETURN 
 9500 PRINT AT j,a;"-1-";AT j+1,a;"-2-";AT j+2,a;"-3-";AT j+3,a;"-4-";AT j+4,a;"all": RETURN 
 9520 PAPER 1: BRIGHT 0: FOR t=0 TO 21: PRINT AT t,26;" ": NEXT t
 9530 BRIGHT 1: FOR t=0 TO 21: PRINT AT t,27;"     ": NEXT t
 9540 BRIGHT 0: PRINT AT 0,27;"ERASE";AT 7,27;"SWATH";AT 8,27;"SAVE ";AT 9,27;"CODES";AT 15,27;"STORE";AT 21,27;"PRINT"
 9550 BRIGHT 1: LET a=28: LET j=1: GO SUB 9500
 9560 LET j=10: GO SUB 9500: LET j=16: GO SUB 9500
 9570 PRINT AT 6,a;"row": PAPER 7: BRIGHT 0: RETURN 
 9600 INPUT "Returning to current work? ";n$: IF n$<>"n" THEN PAPER 7: GO SUB 800: LET tx=5: LET ty=1: FOR t=1 TO 256: GO TO 9602
 9601 GO TO 9608
 9602 IF INT (ATTR (ty,tx)/8)<>7 THEN LET k(t)=1: GO TO 9605
 9603 LET k(t)=0
 9605 LET tx=tx+1: IF tx>20 THEN LET tx=5: LET ty=ty+1
 9606 NEXT t
 9608 LET ci=9000: FLASH 0: BORDER 5: PAPER 5: BRIGHT 0: FOR t=0 TO 21: PRINT AT t,0;"                          ": NEXT t
 9610 LET bb=0: LET xp=32: LET yp=49: LET wp=28: LET xt=0: GO SUB 9720
 9620 LET xp=50: LET yp=69: LET wp=48: LET xt=4: GO SUB 9720
 9630 LET xp=70: LET yp=89: LET wp=68: LET xt=8: GO SUB 9720
 9640 LET xp=90: LET yp=99: LET wp=88: LET xt=12: GO SUB 9720
 9650 LET xp=100: LET yp=109: LET xt=11: GO SUB 9720
 9660 LET xp=110: LET yp=127: LET wp=108: LET xt=16: GO SUB 9720
 9670 LET xp=144: LET yp=164: LET wp=143: LET xt=21: LET bb=1: GO SUB 9720
 9680 PAPER 7: PRINT AT 0,6;"               ": PAPER 5: PRINT AT 16,25;" ";AT 16,19;"- ";AT 18,19;"- ";AT 0,0;"1  2";AT 1,0;"3  4"
 9690 PRINT AT 0,5;"1";AT 0,9;"2";AT 0,13;"3";AT 0,17;"4": BRIGHT 1: PRINT AT 3,0;"C#:";AT 0,21;"UDG:";AT 20,16;"addr:": PAPER 7: BRIGHT 0: PRINT AT 21,16;"63568";AT 0,1;"  ";AT 1,1;"  "
 9700 BRIGHT 0: RETURN 
 9720 FOR z=xp TO yp: LET aa=z-wp: PAPER 5: BRIGHT bb: PRINT AT aa,xt;z;
 9730 POKE 23606,86: POKE 23607,251: PAPER 7: BRIGHT 0: PRINT CHR$ z: POKE 23606,0: POKE 23607,60: NEXT z: RETURN 
 9999 SAVE "UDG+" LINE 10: SAVE "UDG+" LINE 10
    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;" }`}}}}}}}} CLASSY FRONT END DEMO }}}}}}}}}"
 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 { STICK } 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;"}}}}}} MENU }}}}}}}"
 8230 PAPER 7: FOR b=11 TO 19: GO SUB 7890+b*10: NEXT b
 8240 RETURN 
 9999 SAVE "cfe/mc" LINE 3: SAVE "cfe/mc" LINE 3
    1 REM  window & porthole demo          
    2 CLS : PRINT AT 10,8;"just a second...";AT 14,0;"(to go to next demo after port-      holes just press ""2"")";AT 0,0;
    5 FOR t=55000 TO 56163: READ o: POKE t,o: NEXT t: DATA 213,197,229,245,217,8,213,197,229,245,17,216,214,33,3,4
   10 DATA 125,1,3,15,185,40,5,12,16,250,24,10,124,1,4,25,185,40,6,12,16,250,33,10,16,34,118,92
 1360 DATA 1,8,168,62,0,189,40,8,60,245,120,145,71,241,24,245,120,217,71,217,65,62,0,203,68,40,1,129,203,33,203,44,16,245
 1370 DATA 217,79,197,217,235,209,229,1,112,0,9,126,254,128,40,16,131,79,35,126,130,71,35,229,213,205,62,38,209,225,24,235,35,233
 1380 DATA 237,24,238,24,239,25,20,24,21,24,19,25,18,26,17,27,16,27,230,16,231,16,231,17,231,18,27,16,26,17,26,18,25,19,24,20,24,21
 1390 DATA 231,235,230,236,231,236,229,237,230,237,231,237,229,238,230,238,231,238,228,239,229,239,230,239,231,239,24,236,24,237,25,238,26,239
 1400 DATA 239,228,237,229,238,229,239,229,236,230,237,230,238,230,239,230,234,231,235,231,236,231,237,231,238,231,239,231,16,229,16,230,17,230,17,231,18,231,18,231,128
 1410 DATA 37,1,36,0,9,229,62,2,205,48,18,42,118,92,62,35,148,103,62,27,149,111,69,76,205,20,9,1,157,3,225,34,54,92,9,233
 1420 DATA 0,0,0,0,0,0,0,0.,0,1,6,24,32,192,3,12.,63,192,0,0,31,224,0,0.,255,0,0,0,255,0,0,0.,128,112,12,3,0,224,28,3
 1430 DATA 12,24,48,97,194,132,136,8.,16,96,128,0,0,0,0,0.,130,65,32,16,8,4,4,2.,7,6,14,12,28,24,56,56.,16,32,32,64,64,128,128,128
 1440 DATA 1,1,0,0,0,0,0,0.,16,8,136,132,68,66,66,34.,49,113,113,97,226,226,226,226.,34,33,33,17,17,17,17,17.,226,226,226,226,226,225,241,241
 1450 DATA 17,17,17,17,33,33,34,34.,248,120,120,124,60,62,30,31.,128,128,64,64,32,16,8,4.,0,0,0,0,1,1,2,2.,68,68,132,136,8,16,16,32.,132,194,225,240,248,252,255,127
 1460 DATA 0,0,0,192,32,24,6,129.,0,0,0,0,0,1,6,24.,4,8,16,32,193,2,12,24.,224,248,252,255,127,31,7,0.,240,15,0,0,224,255,255,127
 1465 DATA 1,254,0,0,0,255,255,254.,224,1,7,31,252,240,192,0
 1470 DATA 1,6,24,32,96,224,224,224.,255,0,0,0,0,0,0,0.,224,224,224,224,224,224,224,224.,224,24,6,1,1,1,1,1.,1,1,1,1,1,1,1,1.,1,1,1,6,28,248,240,192.,224,224,224,248,254,127,31,7.,0,0,0,0,0,255,255,255
 1475 DATA 63,32,239,232,232,232,232,232.,255,0,255,0,0,0,0,0.,232,232,232,232,232,232,232,232.,255,1,253,5,5,5,5,5.,5,5,5,5,5,5,5,5.,5,5,5,253,1,255,252,252.,232,232,232,239,224,255,255,255.,0,0,0,255,0,255,255,255
 1480 DATA 1,6,8,16,49,98,228,228.,255,0,0,255,0,0,0,0.,228,228,228,228,228,228,228,228.,224,24,4,194,34,17,9,9.,9,9,9,9,9,9,9,9.,17,34,194,4,24,240,224,128.,226,241,240,120,126,63,31,7.,0,0,255,0,0,255,255,255
 1485 DATA 0,0,7,12,20,52,212,212.,14,19,253,1,7,15,9,6.,212,212,212,212,212,212,212,212.,0,0,255,1,1,1,1,1.,1,1,1,1,1,1,1,1.,1,1,255,2,254,4,252,248.,212,212,215,208,223,192,255,255.,0,0,255,0,255,0,255,255
 1490 DATA 0,63,42,250,230,254,225,255.,0,255,170,170,170,170,170,255.,225,255,225,255,225,255,225,255.,0,254,170,174,178,190,194,254.,130,254,130,254,130,254,130,254.,130,254,178,174,170,254,248,248.,225,255,230,250,234,255,255,255.,255,170,170,170,170,255,255,255
 1495 DATA 123,196,192,202,192,235,66,202.,219,36,0,170,0,255,0,0.,194,234,66,202,226,74,194,202.,239,17,1,169,2,233,33,41.,33,41,34,41,33,42,33,41.,33,233,2,169,1,17,255,222.,194,235,64,202,192,196,255,247.,0,255,0,170,0,36,255,183
 1500 DATA 7,62,82,209,209,255,126,12.,255,0,0,0,0,0,0,0.,14,28,15,30,4,14,28,28.,240,30,9,9,9,30,56,32.,16,48,64,32,16,16,32,32.,16,30,9,9,9,30,248,192.,14,62,82,209,209,254,127,15.,0,0,0,0,0,0,255,255
 1510 DATA 62,33,215,62,34,215,62,35,215,62,36,215,42,136,92,37,62,5,133,111,229,193,205,20,9,62,37,215,62,38,215,6,3,62,32,215,16,251
 1520 DATA 62,39,215,42,136,92,37,62,7,133,111,229,193,205,20,9,62,40,215,62,41,215,6,4,62,32,215,16,251,62,42,215,62,43,215,42,136,92,37
 1530 DATA 62,8,133,111,229,193,205,20,9,62,44,215,6,6,62,32,215,16,251,62,45,215,42,136,92,37,62,8,133,111,229,193,205,20,9,62,46,215
 1540 DATA 6,6,62,32,215,16,251,62,47,215,42,136,92,37,62,8,133,111,229,193,205,20,9,62,48,215,62,49,215,6,4,62,32,215,16,251,62,50,215
 1550 DATA 62,51,215,42,136,92,37,62,7,133,111,229,193,205,20,9,62,52,215,62,53,215,62,32,215,62,32,215,62,54,215,62,55,215,42,136,92,37
 1560 DATA 62,5,133,111,229,193,205,20,9,62,56,215,62,57,215,62,58,215,62,59,215,209,33,0,60,34,54,92
 2000 DATA 241,225,193,209,8,217,241,225,193,209,201
 3000 CLS : LET l=55000: FOR t=1 TO 44: PRINT "@@@@@@@@@@@@@@@@";: NEXT t
 3010 LET x=RND*28: IF x<4 THEN GO TO 3010
 3020 LET y=RND*17: IF y<3 THEN RANDOMIZE : GO TO 3010
 3030 POKE l+14,y: POKE l+15,x: LET k=USR l
 3040 PRINT AT y,x-2;INT (y+.5);",";INT (x+.5): IF INKEY$="2" THEN GO TO 4000
 3050 GO TO 3010
 4000 CLS 
 4005 LET x=0: LET y=0: LET chars=23606: GO SUB 4160
 4010 FOR g=108 TO 60 STEP -8
 4020 PRINT AT y,x;CHR$ g;
 4030 FOR h=x+1 TO x+18: PRINT CHR$ (g+1);: NEXT h: PRINT CHR$ (g+3)
 4040 FOR h=y+1 TO y+14: PRINT AT h,x;CHR$ (g+2);"                  ";CHR$ (g+4): NEXT h
 4050 PRINT AT y+15,x;CHR$ (g+6);: FOR h=x+1 TO x+18: PRINT CHR$ (g+7);: NEXT h
 4060 PRINT CHR$ (g+5)
 4090 LET d=((g-60)/8+65): GO SUB 4150: PRINT AT y+4,x+6;"WINDOW ";CHR$ d;AT y+9,x+3;"Press any key": IF d<>65 THEN PRINT AT y+10,x+2;"for next window.": GO SUB 4160: GO TO 4110
 4100 PRINT AT y+10,x+6;"to STOP.": GO SUB 4160
 4110 IF INKEY$="1" THEN GO SUB 4150: GO TO 3000
 4120 IF INKEY$="" THEN GO TO 4110
 4130 LET x=x+2: LET y=y+1: NEXT g
 4140 GO SUB 4150: STOP 
 4150 POKE chars,0: POKE chars+1,60: RETURN 
 4160 POKE chars,221: POKE chars+1,214: RETURN 
 9999 SAVE "w&p" LINE 2: SAVE "w&p" LINE 2

Note: Type-in program listings on this website use ZMAKEBAS notation for graphics characters.

People

No people associated with this content.

Scroll to Top