1 ' Character definer
2 ' by James Cadwallader
3 ' Amstrad Action   April 87
10 ON ERROR GOTO 1700
20 SYMBOL AFTER 256
30 oldmem=HIMEM
40 SYMBOL AFTER 32
50 newmem=HIMEM
60 clr$=CHR$(22)+CHR$(1):opq$=CHR$(22)+CHR$(0)
70 a%=65:i$="*"
80 DIM c%(7,7),d%(7),e%(7,7)
90 INK 0,13:INK 1,1:INK 2,18:INK 3,23
100 MODE 1:fin%=0:gf%=0
110 GOSUB 800
120 LOCATE 15,2:PEN 2:PRINT "[";
130 PEN 3:PRINT "TAB";
140 PEN 2:PRINT "]";
150 PEN 1:PRINT " to go on."
160 LOCATE 15,4:PEN 2:PRINT "[";
170 PEN 3:PRINT "CLR";
180 PEN 2:PRINT "]";
190 PEN 1:PRINT " to clear grid."
200 LOCATE 15,6:PEN 2:PRINT "[";
210 PEN 3:PRINT "COPY";
220 PEN 2:PRINT "]";
230 PEN 1:PRINT " to toggle guide."
240 LOCATE 1,14
250 PEN 2
260 PRINT " Select character : ";
270 MOVE 318,192:DRAWR 114,0,1:DRAWR 0,-18
280 DRAWR -114,0:DRAWR 0,18
290 MOVER 128,0:DRAWR 50,0:DRAWR 0,-18
300 DRAWR -50,0:DRAWR 0,18
310 LOCATE 21,14
320 WHILE i$<>CHR$(13)
330 GOSUB 1760
340 i$=INKEY$
350 IF i$=CHR$(243) THEN a%=a%+1
360 IF i$=CHR$(242) THEN a%=a%-1
370 IF a%<32 THEN a%=255 ELSE IF a%>255 THEN a%=32
380 WEND
390 x%=0:y%=0
400 PEN 1
410 LOCATE 5,17:PRINT " PRESS (";
420 PEN 3:PRINT "r";
430 PEN 1:PRINT ") TO RE-SELECT, (";
440 PEN 3:PRINT "c";
450 PEN 1:PRINT ") TO"
460 LOCATE 7,19:PRINT "CONTINUE , (";
470 PEN 3:PRINT "s";
480 PEN 1:PRINT ")";
490 PRINT " TO SAVE OR"
500 LOCATE 9,21:PRINT "(";
510 PEN 3:PRINT "l";
520 PEN 1:PRINT ") TO LOAD."
530 WHILE i$<>"c"
540 i$=INKEY$
550 k$=LOWER$(i$)
560 IF k$="r" THEN 100
570 IF k$="s" THEN f%=0:GOSUB 1220:GOTO 100
580 IF k$="l" THEN f%=1:GOSUB 1220:GOTO 100
590 WEND
600 GOSUB 1500
610 WHILE fin%=0
620 GOSUB 960
630 k$=INKEY$:IF k$="" THEN 630
640 IF k$=CHR$(9) THEN GOSUB 1160:fin%=1
650 GOSUB 920
660 IF k$=CHR$(242) THEN x%=x%-1
670 IF k$=CHR$(243) THEN x%=x%+1
680 IF k$=CHR$(241) THEN y%=y%+1
690 IF k$=CHR$(240) THEN y%=y%-1
700 IF x%>7 THEN x%=0 ELSE IF x%<0 THEN x%=7
710 IF y%>7 THEN y%=0 ELSE IF y%<0 THEN y%=7
720 IF INKEY(47)=0 THEN GOSUB 1050
730 IF INKEY(79)=0 THEN GOSUB 1110
740 IF INKEY(16)=0 THEN GOSUB 1620
750 IF INKEY(9)=0 THEN GOSUB 1500
760 GOSUB 1000
770 WEND
780 ERASE c%,e%:ERASE d%:GOTO 100
790 END
800 REM SET UP SCREEN
810 BORDER 13
820 MOVE 14,384:DRAWR 130,0,1
830 DRAWR 0,-130:DRAWR -130,0
840 DRAWR 0,130
850 MOVE 94,240:DRAWR 18,0,1
860 DRAWR 0,-18:DRAWR -18,0
870 DRAWR 0,18
880 MOVE 46,240:DRAWR 34,0
890 DRAWR 0,-18:DRAWR -34,0
900 DRAWR 0,18
910 RETURN
920 LOCATE x%+2,y%+2:PEN 1
930 IF c%(x%,y%)=1 THEN PAPER 3:PRINT " "; ELSE IF e%(x%,y%)=1 THEN PAPER 1:PRINT " "; ELSE PAPER 0:PRINT " "
940 PAPER 0
950 RETURN
960 IF c%(x%,y%)=1 THEN PRINT clr$;:PEN 1 ELSE IF e%(x%,y%)=1 THEN PEN 2:PRINT clr$;
970 LOCATE x%+2,y%+2:PRINT "+"
980 PRINT opq$;
990 RETURN
1000 REM CHARACTERS
1010 IF c%(x%,y%)=1 THEN PLOT -10,-10,3 ELSE PLOT -10,-10,0
1020 PLOT 48+x%*4,238-y%*2:PLOTR 2,0
1030 PLOT 96+x%*2,238-y%*2
1040 RETURN
1050 REM SPACE PRESSED
1060 PAPER 3
1070 c%(x%,y%)=1
1080 LOCATE x%+2,y%+2:PRINT " "
1090 PAPER 0
1100 RETURN
1110 REM DELETE PRESSED
1120 IF c%(x%,y%)=1 AND e%(x%,y%)=0 THEN PAPER 0:LOCATE x%+2,y%+2:PRINT " " ELSE IF e%(x%,y%)=1 THEN PAPER 1:LOCATE x%+2,y%+2:PRINT " "
1130 c%(x%,y%)=0
1140 PAPER 0
1150 RETURN
1160 REM PROGRAM CHARACTER
1170 DEF FNbin=c%(0,i%)*128+c%(1,i%)*64+c%(2,i%)*32+c%(3,i%)*16+c%(4,i%)*8+c%(5,i%)*4+c%(6,i%)*2+c%(7,i%)
1180 FOR i%=0 TO 7:d%(i%)=FNbin
1190 NEXT
1200 SYMBOL a%,d%(0),d%(1),d%(2),d%(3),d%(4),d%(5),d%(6),d%(7)
1210 RETURN
1220 REM SAVE / LOAD
1230 CLS:LOCATE 17,2
1240 IF f%=0 THEN PRINT "SAVE." ELSE PRINT "LOAD."
1250 PEN 3
1260 PRINT STRING$(40,"_");
1270 LOCATE 1,23
1280 PRINT STRING$(40,"_");
1290 LOCATE 3,7:PRINT SPC(38);STRING$(38,8);
1300 PEN 2
1310 INPUT " Filename :",flnm$
1320 IF LEN(flnm$)>8 THEN PEN 3:PRINT:PRINT " Too long!":GOTO 1290
1330 IF LOWER$(RIGHT$(flnm$,4))<>".chr" THEN flnm$=flnm$+".chr"
1340 IF f%=0 THEN SAVE flnm$,b,newmem,oldmem-newmem ELSE IF f%=1 THEN LOAD flnm$
1350 SOUND 1,15,5,15
1360 PEN 1
1370 IF ef%=0 AND f%=0 THEN PRINT:PRINT "  Saved :"; ELSE IF ef%=0 AND f%=1 THEN PRINT:PRINT "  Loaded :";
1380 IF ef%=0 THEN PEN 3:PRINT UPPER$(flnm$):PRINT
1390 PEN 2
1400 IF ef%=0 AND f%=0 THEN PRINT " Remember to use ";:PEN 1:PRINT "SYMBOL AFTER 32 ";:PEN 2:PRINT USING "&";"before  ";:PEN 1:PRINT "LOAD";:PEN 2:PRINT "ing ";UPPER$(flnm$);" from your program."
1410 PEN 1
1420 LOCATE 7,20
1430 PEN 2:PRINT "    [";
1440 PEN 3:PRINT "ANY KEY";
1450 PEN 2:PRINT "]";
1460 PEN 1:PRINT " to continue."
1470 IF INKEY$="" THEN 1470
1480 f%=0:ef%=0
1490 RETURN
1500 REM PRINT CHARACTER MATRIX
1510 xc%=2:yc%=2:gf%=gf% XOR 1
1520 FOR yp%=190 TO 176 STEP -2
1530 FOR xp%=368 TO 382 STEP 2
1540 IF TEST(xp%,yp%)=2 AND c%(xc%-2,yc%-2)<>1 THEN LOCATE xc%,yc%:PAPER gf%:PRINT " ";
1550 IF TEST(xp%,yp%)=2 THEN e%(xc%-2,yc%-2)=gf%
1560 xc%=xc%+1
1570 IF xc%>9 THEN xc%=2:yc%=yc%+1
1580 NEXT
1590 NEXT
1600 PAPER 0
1610 RETURN
1620 REM CLEAR GRID
1630 ERASE c%,e%:ERASE d%
1640 FOR r%=2 TO 9
1650 LOCATE 2,r%:PRINT STRING$(8,32);
1660 NEXT
1670 LOCATE 4,11:PRINT "  ";
1680 LOCATE 7,11:PRINT " ";
1690 RETURN
1700 REM ERROR
1710 ' Clearing the grid twice in succession will cause
1720 ' the computer to try and ERASE arrays twice!
1730 IF ERR=32 THEN ef%=1 ' if filing error don't print SAVED/LOADED etc.
1740 RESUME NEXT
1750 RETURN
1760 LOCATE 21,14
1770 FOR i%=a%-3 TO a%+3
1780 j%=i%
1790 IF j%<32 THEN j%=j%+224 ELSE IF j%>255 THEN j%=j%-224
1800 IF j%=a% THEN PAPER 1:PEN 2 ELSE PEN 3:PAPER 0
1810 PRINT CHR$(j%);
1820 NEXT
1830 a$=MID$(STR$(a%),2)
1840 LOCATE 29,14:IF a%<100 THEN PRINT "0";
1850 PRINT a$;
1860 RETURN