
The large and warm response to the ULTRA-EASY DESIGNER GRAPHICS Program for the 2068 (which appeared in the July/August 1986 issue of Time Designs attests to the many 2068 users yearning for ways to use UDGs effectively. Many sent listings of enhancements they had added, some sent tapes, one wrote to say he had been looking for this program for a long, long time and wished I had written it sooner. ‘Truth is, so do I! I think all this renewed interest in our 2068’s graphic programming abilities is great.
In the first article I made mention, “that there were only 21 of them,”–UDGs that is. Well, as things turn out I was wrong again! So what appears here is some new program lines to soup up the old version 1.0 so it will do 115 UDGs at a whack instead of just 21. I call it “SON OF UDG”.
Now if you crack your 2068 manual open to page 262 you will find the name CHARS listed. By reading the content note you will discover that by altering the address in CHARS we can set up an alternate table of letters and symbols in RAM and the 2068 will use them instead. How exciting! New symbols, new fonts, new graphics–its all possible. CHARS covers the Character set starting with the space (code 32) and through to the copyright symbol (code 127). This is in diference to an article on fonts I just read in SWN. The entire set is not pointed to by CHARS, only CHR$ codes 32 through 127.
Check the listing of these characters in the manual’s Appendix B (page 240 and on). Now lets experiment. Type in the short Listing #1. This looks in the table in ROM and lists the values for each of the eight bytes which comprise each character. Character #124 and #126 list eight bytes the same as the rest, but the manual states they are STICK and FREE. What the table lists produces a vertical bar symbol and a reverse quote, just like the SPECTRUM. But elsewhere in the ROM, the 2068 ignors this and prints STICK or FREE…two commands the SPECTRUM does not have. Because of this fluke “SON OF UDG” ignors #124 and #126 as well, so as not to cause problems.
Figure 1
120=0,0,68,40,16,40,68,0, 121=0,0,68,68,68,60,4,56, 122=0,0,124,8,16,32,124,0, 123=0,14,8,48,8,8,14,0, 124=0,8,8,8,8,8,8,0, 125=0,112,16,12,16,16,112,0, 126=0,20,40,0,0,0,0,0, 127=60,66,153,161,161,153,66,60,

The program keeps track of what CHARS is set to at any given time, but in your own programs you must change the contents back to the original values before, say breaking or listing. If you don’t every symbol will become total gibberish. In that case try POKEs to put things as they were: 23606 should be 0 and 23607 should be 60. In the program GOSUB 610 will perform the same service.
The “SON OF UDG” program uses all the same keys as the original plus the “a” key which is a screen toggle. One is the old graphic work slate, the other is a current list of 115 Characters (see Fig.2). You will be asked upon switching screens if you will be returning or wish the work slate’s contents displayed. This is so if you toggled in mid-stream to check something that your current efforts won’t be obliterated. SAVE and LOAD have also been modified to proper size for all 115.
In order to get your old listing up to “SON OF UDG” status you will need to do the following:
1. DELETE lines 10 thru 20, 36 thru 39, 43 thru 110 350 thru 520, 9010 thru 9050, 9095 thru 9120, 9220 thru 9225, line 25, and line 200 2. Alter "65368, 159" in lines 28 & 29 to "64598, 941" 3. Alter "20" in line 190 to "750" 4. Alter line 9060 by removing "PAPER 5:" command 5. Alter line 1 to include "SON OF" so you know later 6. Add all the lines of Listing #2
And thats all there is to it! You are of course welcome to make any alterations or enhancements you wish to the program (Several found grids on the work slate to be helpful last time, for example)…and feel free to send ideas and comments to me also. If you would like a complete listing of the entire “SON OF UDG” program the way it is supposed to look, just mail a dollar and I’ll send you one. Write Paul Bingham, P.O. Box 2034, Mesa, AZ 85204. (If you’re not up to typing, I will send copies of the complete program on tape for $5.)
Listing 1
1 REM 2068 CHR$ Table Peeker
10 FOR f=32 TO 127: PRINT f;"=
";
20 FOR t=f*8+15360 TO f*8+1536
7
30 PRINT PEEK t;",";
40 NEXT t: PRINT "": NEXT f
Listing 2
10 CLEAR 64597: GO SUB 800: FO
R t=15616 TO 16384: POKE (t+4898
2),PEEK t: NEXT t: FOR t=65528 T
O 65535: READ o: POKE t,o: NEXT
t: FLASH 0: CLS : GO SUB 9015: G
O 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: DI
M d(32): DIM u(20): LET cs=7: LE
T at=7: LET px=5: LET py=1: INPU
T "Press ENTER to continue...";n
$: GO TO 105
25 GO TO 350
36 LET s=1: LET qx=0: GO TO 41
0
37 LET s=9: LET qx=1: GO TO 41
0
38 LET s=17: LET qx=0: GO TO 4
10
39 LET s=25: LET qx=1: GO TO 4
10
42 INPUT "1st:";c(1);" 2nd:";c
(2);" 3rd:";c(3);" 4th:";c(4)
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);C
HR$ 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 a
1=a1/2: IF INT a1<a1 THEN PAPER
0: PRINT AT y1,x1+g;CHR$ 143;: L
ET a1=INT a1: GO TO 66
65 PAPER 7: PRINT AT y1,x1+g;C
HR$ 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$ 1
64: 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
200 IF CODE INKEY$=97 THEN GO S
UB ci
210 GO TO 105
350 PAPER 7: IF ci=9000 THEN PR
INT 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: N
EXT m: RETURN
400 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 S
torage:";vn: IF vn>31 AND vn<128
AND vn<>124 AND vn<>126 OR vn>1
43 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: P
OKE 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 SU
B 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: LE
T gy=88: GO TO 560
550 IF e<128 THEN LET gx=19: LE
T 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+I
NT (s/17);CHR$ e;AT gy-e,gx;CHR$
e: GO SUB 610: RETURN
600 POKE 23606,86: POKE 23607,2
51: RETURN
610 POKE 23606,0: POKE 23607,60
: RETURN
785 IF ci=9600 THEN GO SUB cs+2
0: RETURN
790 IF ci=9000 AND cs=5 OR cs=8
OR cs>15 THEN GO SUB cs+20: RET
URN
795 RETURN
800 FLASH 1: PRINT AT 17,8;"jes
emenet!": 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: PRI
NT AT ty,tx;CHR$ 143: PAPER 7: G
O 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: PAPE
R 5: BRIGHT 1: FOR t=0 TO 21: PR
INT AT t,0;"
";: NEXT t
9225 PAPER 7: BRIGHT 0
9520 PAPER 1: BRIGHT 0: FOR t=0
TO 21: PRINT AT t,26;" ": NEXT t
9530 BRIGHT 1: FOR t=0 TO 21: PR
INT AT t,27;" ": NEXT t
9540 BRIGHT 0: PRINT AT 0,27;"ER
ASE";AT 7,27;"SWATH";AT 8,27;"SA
VE ";AT 9,27;"CODES";AT 15,27;"S
TORE";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 PAP
ER 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: BORDE
R 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 w
p=48: LET xt=4: GO SUB 9720
9630 LET xp=70: LET yp=89: LET w
p=68: LET xt=8: GO SUB 9720
9640 LET xp=90: LET yp=99: LET w
p=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 3";AT 1,0;"2 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 a
a,xt;z;
9730 POKE 23606,86: POKE 23607,2
51: PAPER 7: BRIGHT 0: PRINT CHR
$ z: POKE 23606,0: POKE 23607,60
: NEXT z: RETURN
Products
Note: Type-in program listings on this website use ZMAKEBAS notation for graphics characters.