5 REM NEURAL NETWORK 6 DEFFNH(X)=INT(X/256):DEFFNL(X)=X-FNH(X)*256 7 V$=STR$(PEEK(71)+256*PEEK(72)):V=VAL(V$) 8 DIMD$(23) 9 POKE53272,20 10 REM SCREEN CONFIGURATION 15 PRINT"[147]":POKE214,23:PRINT"" 20 POKE 53280,13 30 POKE 53281,6 40 PRINT ""; 60 REM VARIABLE DECLARATIONS 70 DIM F1%(42),F2%(42),M%(42,42) 80 DIM V%,J,I 90 REM INITIALISE SCREEN 100 PRINT ""; 110 PRINT " NEURON NETWORK ASSOCIATIVE MEMORY" 120 PRINT 130 PRINT ""; 140 PRINT "F1 - TEACH PATTERN "; 150 PRINT "F2 - DUMP MATRIX" 160 PRINT "F3 - RANDOMIZE PATTERN "; 170 PRINT "F4 - FORGET ALL" 180 PRINT "F5 - RECALL PATTERN "; 190 PRINT "F6 - QUIT" 200 PRINT "F7 - DISC SAVE "; 210 PRINT "F8 - DISC LOAD" 220 PRINT 230 PRINT "A-Z, 0-9: LOAD PATTERN" 240 R1 = 4 : C1 = 5 : GOSUB 600 250 R1 = 4 : C1 = 25 : GOSUB 600 260 GOSUB 750 270 GOSUB 860 280 GOSUB 970:POKE53280,7:POKE214,21:PRINT:PRINT " READY " 290 GET A$ : IF A$="" GOTO 290 300 GOSUB 970:PRINT " " 310 K=ASC(A$) 320 IFA$>="0"ANDA$<="9"THENK=K+64:GOTO340 330 IF A$ < "A" OR A$ > "Z" THEN 500 340 GOSUB 970:POKE214,21:PRINT:PRINT "FETCH ";A$ 350 L%=0 360 K=(K-64)*8+53248 370 POKE56333,127:POKE 1,PEEK(1)AND251 380 FORI=0TO6:POKE49408+I,PEEK(K+I):NEXT 390 POKE 1,PEEK(1) OR 4:POKE 56333,129 400 FOR I = 0 TO 6 410 J% = PEEK(49408+I)/2 420 FOR K=1 TO 6 430 L%=L%+1 440 F1%(L%) = -1 + (2 * (J% AND 1)) 450 J%=J%/2 460 NEXT K 470 NEXT I 480 GOSUB 750 : GOSUB 860 : GOTO 280 490 REM DISPATCH FUNCTION KEY COMMANDS 500 J%=ASC(A$)-132 510 IF J%=1 THEN GOSUB 1000:GOTO 280 520 IF J%=5 THEN GOSUB 1080:GOTO 90 530 IF J%=2 THEN GOSUB 1210:GOTO 280 540 IF J%=6 THEN GOSUB 1680:GOTO 280 550 IF J%=3 THEN GOSUB 1290:GOTO 280 560 IF J%=7 THEN PRINT "";:CLOSE15:GOTO40000 570 IF J%=4 THEN GOSUB 1800:GOTO 90 580 IF J%=8 THEN GOSUB 1990:GOTO 90 590 (null) TO 280 600 REM DRAW BORDERS FOR FIELDS 610 FOR I=0 TO 1 620 V=1024+40*(R1+(I*8))+C1 630 POKE V,112+(-3*I) 640 FOR J=1 TO 8 650 POKE V+J,67 660 NEXT J 670 POKE V+9,110+(15*I) 680 NEXT I 690 FOR I=1 TO 7 700 V=1024+40*(R1+I)+C1 710 POKE V,93 720 POKE V+9,93 730 NEXT I 740 RETURN 750 REM UPDATE FIELD F2% ON SCREEN 760 L%=0 770 FOR I=0 TO 6 780 V% = 1024+40*(I+5)+6 790 FOR J=2 TO 7 800 L%=L%+1 810 IFF1%(L%)=1THENPOKEV%+(8-J),81:GOTO830 820 POKE V%+(8-J),32 830 NEXT J 840 NEXT I 850 RETURN 860 REM UPDATE FIELD F1% ON SCREEN 870 L%=0 880 FOR I = 0 TO 6 890 V%=1024+40*(I+5)+26 900 FOR J=2 TO 7 910 L%=L%+1 920 IF F2%(L%)=1 THEN POKE V%+(8-J),81:GOTO 940 930 POKE V%+(8-J),32 940 NEXT J 950 NEXT I 960 RETURN 970 REM POSITION TO STATUS AREA 980 PRINT ""; 990 RETURN 1000 REM TRAIN ON PATTERN IN F1% 1010 GOSUB 970:POKE214,21:PRINT:PRINT "TRAINING" 1020 FOR I = 1 TO 42 1030 FOR J = 1 TO 42 1040 M%(I,J)=M%(I,J)+F1%(I)*F1%(J) 1050 NEXT J:POKE53280,(PEEK(53280)+1)AND7 1060 NEXT I 1070 RETURN 1080 REM PRINT PART OF MATRIX 1085 POKE198,0 1090 PRINT ""; 1100 FOR I=1 TO 24 1110 FOR J=1 TO 39 1120 IFM%(I,J)<0THENPRINT "";:GOTO1140 1130 PRINT ""; 1140 PRINT CHR$(ASC("0")+ABS(M%(I,J))); 1150 NEXT J 1160 PRINT 1170 NEXT I 1180 PRINT "PRESS ANY KEY TO CONTINUE:"; 1190 GET A$ : IF A$="" GOTO 1190 1195 PRINT"[147]":POKE214,23:PRINT 1200 RETURN 1210 REM RANDOMISE 10 PERCENT OF F1% 1220 GOSUB 970:POKE214,21:PRINT: PRINT "RANDOM" 1230 FOR I=1 TO 42 1240 IF RND(0) > 0.1 THEN 1260 1250 F1%(I)=-F1%(I) 1260 NEXT I 1270 GOSUB 750 1280 RETURN 1290 REM RECALL FROM PATTERN 1300 GOSUB 970:POKE214,21:PRINT:PRINT "RECALL" 1310 P%=1024+40*9+19 1320 REM INITIALLY COPY F1 TO F2 1330 POKE P%+1,ASC("=") 1340 FOR I=1 TO 42 1350 F2%(I)=F1%(I) 1360 NEXT I 1370 GOSUB 860 1380 REM F1 TO F2 PASS 1390 POKE P%,ASC("=") 1400 POKE P%+2,ASC(">") 1410 FOR J=1 TO 42 1420 V%=0 1430 FOR I=1 TO 42 1440 V%=V%+F1%(I)*M%(I,J) 1450 NEXT I 1460 V%=SGN(V%) 1470 IF V%<>0 THEN F2%(J)=V% 1480 NEXT J 1490 GOSUB 860 1500 REM F2 TO F1 PASS 1510 C%=0 1520 POKE P%,ASC("<") 1530 POKE P%+2,ASC("=") 1540 FOR I=1 TO 42 1550 V%=0 1560 FOR J=1 TO 42 1570 V%=V%+F2%(J)*M%(I,J) 1580 NEXT J 1590 V%=SGN(V%) 1600 IFV%<>0ANDV%<>F1%(I)THENF1%(I)=V%:C%=1 1610 NEXT I 1620 GOSUB 750 1630 IF C%<>0 GOTO 1380 1640 POKE P%,ASC(" ") 1650 POKE P%+1,ASC(" ") 1660 POKE P%+2,ASC(" ") 1670 RETURN 1680 REM FORGET ALL - CLEAR MEMORY 1690 GOSUB 970:POKE214,21:PRINT: PRINT "FORGET" 1700 FOR I=1 TO 42 1710 F1%(I)=0 1720 F2%(I)=0 1730 FOR J=1 TO 42 1740 M%(I,J)=0 1750 NEXT J:POKE53280,PEEK(53280)-1AND15 1760 NEXT I 1770 GOSUB 750 1780 GOSUB 860 1790 RETURN 1800 REM SAVE STATE TO DISC FILE 1810 GOSUB 970:POKE214,21:PRINT:PRINT "SAVE " 1820 PRINT "";:D=PEEK(186):IFDV<8THENDV=8 1830 INPUT "FILE NAME: ";A$ 1835 OPEN1,DV,15,"S0:NN."+A$:CLOSE1 1840 A$="NN."+A$+",S,W" 1850 OPEN 5,DV,5,A$ 1860 FOR I=1 TO 42:PRINT#5,F1%(I):NEXT:POKE53281,0 1870 REM GOSUB 2240 1880 FOR I=1 TO 42:PRINT#5,F2%(I):NEXT:POKE53281,7 1890 REM GOSUB 2240 1900 FOR I=1 TO 42 1910 FOR J=1 TO 42 1920 PRINT#5,M%(I,J) 1930 NEXT J:POKE53280,PEEK(53280)+3AND7 1940 REM GOSUB 2240 1950 NEXT I:POKE53281,6 1960 CLOSE 5 1970 PRINT"[147]":POKE214,23:PRINT 1980 RETURN 1990 REM RESTORE STATE FROM DISC FILE 1995 GOSUB3000 2020 A$=D$(CC) 2040 P%=ASC("M") 2050 REM GOSUB 2240 2060 OPEN 5,DV,5,A$ 2070 FOR I=1 TO 42 2080 INPUT#5,F1%(I) 2090 NEXT I:POKE53281,2 2100 REM GOSUB 2240 2110 FOR I=1 TO 42 2120 INPUT#5,F2%(I) 2130 NEXT I:POKE53281,3 2140 REM GOSUB 2240 2150 FOR I=1 TO 42 2160 FOR J=1 TO 42 2170 INPUT#5,M%(I,J) 2180 NEXT J:POKE53280,PEEK(53280)+1AND13 2190 REM GOSUB 2240 2200 NEXT I 2210 CLOSE 5 2212 POKE53280,7:POKE53281,6:PRINT"[147]":POKE214,23:PRINT 2220 RETURN 2230 REM DISC ERROR CHECK 2240 INPUT#15,EN,EM$,ET,ES 2250 IF EN>0THEN PRINT EN,EM$,ET,ES:STOP 2260 RETURN 3000 DV=PEEK(186):IFDV<8THENDV=8 3001 V$=STR$(PEEK(71)+256*PEEK(72)):V=VAL(V$) 3002 SYS57812"$:NN.*",DV,0:POKE780,0:POKE781,0:POKE782,192:SYS65493 3004 PRINT"[147]";:POKE53280,0:POKE53281,0 3005 PRINTTAB(15)"[158]LOAD FILE" 3010 P0=49152+34:K=0 3011 P1=16:P2=0 3012 POKEV,5:POKEV+1,FNL(P0):POKEV+2,FNH(P0):IFV$="BLOCK"THEN3029 3020 IFPEEK(P0+P2)<>34THENP2=P2+1:GOTO3020 3022 P2=P2+1 3024 IFPEEK(P0+P2+P1)<>34THENP1=P1-1:GOTO3024 3026 POKEV,P1:POKEV+1,FNL(P0+P2):POKEV+2,FNH(P0+P2):D$(K)=V$ 3028 P0=P0+32:K=K+1:IFK<24THEN3011 3029 K=K-1:FORX=0TOK:POKE214,X:PRINT:PRINTTAB(12)D$(X):NEXT:CC=0:OC=0 3030 GOSUB3900 3035 POKE198,0:WAIT198,1:GETZ$ 3040 IFZ$=""THENCC=CC+1:IFCC>KTHENCC=0 3041 IFZ$="[145]"THENCC=CC-1:IFCC<0THENCC=K 3042 IFZ$=CHR$(13)THENRETURN 3043 GOSUB3900 3044 GOTO3035 3900 POKE214,OC:PRINT:PRINTTAB(12)D$(OC) 3910 POKE214,CC:PRINT:PRINTTAB(12)""D$(CC):OC=CC:RETURN 9999 END 10000 D=PEEK(186):OPEN1,D,15,"I0":CLOSE1:N$="B.NEURAL" 10010 OPEN1,D,15,"S0:"+N$:CLOSE1:SAVEN$,D:END 40000 FORI=0TO21:POKE828+I,8+I:NEXT 40010 IFDV<8ORDV>29ORDV=8THEN40030 40020 A=PEEK(828):B=PEEK(828+DV-8):POKE828,B:POKE828+DV-8,A 40030 A$="HELLO CONNECT":FORJ=8TO29:I=PEEK(828+J-8):IFI=14THENNEXT 40040 CLOSE2:OPEN2,I,2:CLOSE2:IFSTTHEN40060 40050 CLOSE15:OPEN15,I,15,"R0:"+A$+"="+A$:INPUT#15,ER:CLOSE15:IFER=63THEN40070 40060 NEXT:PRINT"[147]":POKE53272,23:POKE186,8:END 40070 Q$=CHR$(34):POKE646,PEEK(53281):PRINT"[147]":POKE53272,23 40080 PRINT"[147]P[207]2048,0:P[207]44,8:P[207]43,1:P[207]56,160:P[207]55,0:CLR:L[207]"Q$A$Q$","I 40090 PRINT"RUN:":POKE631,13:POKE632,13:POKE198,2:END