100 REM +++++++++++++++++++++++++++++++ 110 REM ! Program .... SIMULERI 120 REM ! Utg}va 1.2 84-02-09 130 REM ! av (c) Bertil Lindau Nr. 812 140 REM ! Minne 32 Kbytes f|r flexskiva 150 REM ! Ins{nt av Bertil Lindau 160 REM +++++++++++++++++++++++++++++++ 170 REM 180 REM Simuleringsprogram till 190 REM programpaketet LOGSIM 200 REM 210 REM R% Antal kretsar 220 REM R1% Antal anslutna noder 230 REM W% H|gsta tid 240 REM N% Antal signalrader 250 REM T% Tidsvariabeln 260 REM K%(,) Kretsmatris 270 REM S%(,) Signalmatris 280 REM N%() Nodnummer 290 REM T0% Utskrift av tidsaxel 300 REM K% Kolumnadress vid plott 310 REM E9% Felnummer 320 REM G1% Antal menyhopp 330 REM G0% Hoppvariabel f|r menyn 340 REM F$() Hoppnamn f|r menyn 350 REM I% Lopvariabel 360 REM J% Lopvariabel 370 REM U% Lopvariabel 380 REM A$ Slaskvariabel 390 REM X% Slaskvariabel 400 REM Y% Slaskvariabel 410 REM FNM%(X%,Y%)=Minsta v{rdet 420 REM 430 DIM N%(100%),K%(9%,100%),S%(19%,50%) 440 DEFFNM%(X%,Y%)=-((X%>=Y%)*Y%+(X%0% GOSUB 1570 : GOTO 620 1130 GOTO 450 1140 REM 1150 REM ================= 1160 REM ==== MENYVAL ==== 1170 REM ================= 1180 REM 1190 GOSUB 1470 : REM == Systemrad == 1200 READ G1% 1210 FOR I%=1% TO G1% 1220 READ F$(I%) 1230 PRINT CUR(3%+2%*I%,10%);I%;". ";F$(I%) 1240 NEXT I% 1250 GOSUB 1390 : REM Medelanderad 1260 PRINT TAB(8%);" V{lj rutin (1-"; 1270 PRINT RIGHT$(NUM$(G1%),2%);") "; 1280 GET A$ 1290 G0%=ASC(A$)-48% 1300 IF G0%<1% OR G0%>G1% 1280 1310 PRINT CUR(3%+2%*G0%,7%);"==>" 1320 GOSUB 1390 : REM Medelanderad 1330 RETURN 1340 REM 1350 REM ====================== 1360 REM ==== MEDELANDERAD ==== 1370 REM ====================== 1380 REM 1390 PRINT CUR(23%,0%);TAB(39%); 1400 PRINT CUR(23%,2%); 1410 RETURN 1420 REM 1430 REM =================== 1440 REM ==== SYSTEMRAD ==== 1450 REM =================== 1460 REM 1470 X%=18%-LEN(Q$)/2% 1480 PRINT CHR$(12%);TAB(X%);Q$ 1490 PRINT CHR$(151%);STRING$(38%,35%) 1500 PRINT CUR(22%,0%)STRING$(40%,61%); 1510 RETURN 1520 REM 1530 REM ================= 1540 REM ==== FELRUTIN === 1550 REM ================= 1560 REM 1570 IF E9%=0% RETURN 1580 PRINT CHR$(7%); 1590 GOSUB 1390 : REM Medelanderad 1600 IF E9%<100% 1670 1610 RESTORE 1730 1620 FOR I%=100% TO E9% 1630 READ A$ : NEXT I% 1640 X%=19%-LEN(A$)/2% 1650 PRINT TAB(X%);A$; 1660 RETURN 1670 PRINT TAB(7%);" Fel nr";E9%;" (Se fellistan)"; 1680 RETURN 1690 REM 1700 REM ======================= 1710 REM ==== FELMEDELANDEN ==== 1720 REM ======================= 1730 DATA "Filerna finns ej p} skivan" 1740 DATA "Skall jag forts{tta" 1750 DATA "Var god v{nta!" 1760 DATA "Tryck @ f|r avslut" 1770 DATA "Ingen kretsmatris inl{st" 1780 DATA "Kretsmatrisen finns ej" 1790 DATA "Signalmatrisen finns ej" 1800 REM 1810 REM ************************ 1820 REM **** LOGIKFUNKTIONER *** 1830 REM ************************ 1840 REM 1850 REM ================= 1860 REM ===== A N D ===== 1870 REM ================= 1880 REM 1890 N%(K%(1%,U%))=1% 1900 FOR I%=2% TO 9% 1910 IF K%(I%,U%)=0% RETURN 1920 IF N%(K%(I%,U%)) NEXT I% : RETURN 1930 N%(K%(1%,U%))=0% 1940 RETURN 1950 REM 1960 REM ================ 1970 REM ===== NAND ===== 1980 REM ================ 1990 REM 2000 N%(K%(1%,U%))=0% 2010 FOR I%=2% TO 9% 2020 IF K%(I%,U%)=0% RETURN 2030 IF N%(K%(I%,U%)) NEXT I% : RETURN 2040 N%(K%(1%,U%))=1% 2050 RETURN 2060 REM 2070 REM ================== 2080 REM ======= OR ======= 2090 REM ================== 2100 REM 2110 N%(K%(1%,U%))=0% 2120 FOR I%=2% TO 9% 2130 IF K%(I%,U%)=0% RETURN 2140 IF N%(K%(I%,U%)) 2160 ELSE NEXT I% 2150 RETURN 2160 N%(K%(1%,U%))=1% 2170 RETURN 2180 REM 2190 REM ==================== 2200 REM ======== NOR ======= 2210 REM ==================== 2220 REM 2230 N%(K%(1%,U%))=1% 2240 FOR I%=2% TO 9% 2250 IF K%(I%,U%)=0% RETURN 2260 IF N%(K%(I%,U%)) 2280 ELSE NEXT I% 2270 RETURN 2280 N%(K%(1%,U%))=0% 2290 RETURN 2300 REM 2310 REM =================== 2320 REM ======= XOR ======= 2330 REM =================== 2340 REM 2350 N%(K%(1%,U%))=N%(K%(2%,U%)) XOR N%(K%(3%,U%)) 2360 RETURN 2370 REM 2380 REM ==================== 2390 REM ======= XNOR ======= 2400 REM ==================== 2410 REM 2420 N%(K%(1%,U%))= NOT (N%(K%(2%,U%)) XOR N%(K%(3%,U%))-2%) 2430 RETURN 2440 REM 2450 REM ============================ 2460 REM ===== D-vippa utan RST ===== 2470 REM ============================ 2480 REM 2490 REM ----------------------------- 2500 REM K%(0%,N%)=7 (TYP) 2510 REM K%(1%,N%)=Q (Nodnr) 2520 REM K%(2%,N%)=Q Invers (Nodnr) 2530 REM K%(3%,N%)=Triggflank 1=pos 2540 REM K%(4%,N%)=Clocking}ng (Nodnr) 2550 REM K%(5%,N%)=Dataing}ng (Nodnr) 2560 REM K%(6%,N%)=Gammalt clockv{rde 2570 REM ----------------------------- 2580 IF K%(6%,U%)=N%(K%(4%,U%)) RETURN 2590 IF K%(6%,U%)>N%(K%(4%,U%)) 2610 2600 IF K%(3%,U%)=0% 2630 ELSE 2620 2610 IF K%(3%,U%)=1% 2630 2620 N%(K%(1%,U%))=N%(K%(5%,U%)) 2630 K%(6%,U%)=N%(K%(4%,U%)) 2640 N%(K%(2%,U%))= NOT (N%(K%(1%,U%))-2%) 2650 RETURN 2660 REM 2670 REM ================== 2680 REM ==== JK-Vippa ==== 2690 REM ================== 2700 REM 2710 REM ----------------------------- 2720 REM K%(0%,N%)=7 (TYP) 2730 REM K%(1%,N%)=Q (Nodnr) 2740 REM K%(2%,N%)=Q Invers (Nodnr) 2750 REM K%(3%,N%)=Triggflank 1=pos 2760 REM K%(4%,N%)=Clocking}ng (Nodnr) 2770 REM K%(5%,N%)=Reset (Nodnr) 2780 REM K%(6%,N%)=Gammalt clockv{rde 2790 REM ----------------------------- 2800 IF N%(K%(5%,U%))=0% N%(K%(1%,U%))=0% : K%(6%,U%)=K%(3%,U%) : GOTO 2870 2810 IF K%(6%,U%)=N%(K%(4%,U%)) RETURN 2820 IF K%(6%,U%)>N%(K%(4%,U%)) 2840 2830 IF K%(3%,U%)=0% 2860 ELSE 2850 2840 IF K%(3%,U%)=1% 2860 2850 N%(K%(1%,U%))= NOT (N%(K%(1%,U%))-2%) 2860 K%(6%,U%)=N%(K%(4%,U%)) 2870 N%(K%(2%,U%))= NOT (N%(K%(1%,U%))-2%) 2880 RETURN 2890 REM 2900 REM =========================== 2910 REM ===== D-vippa med RST ===== 2920 REM =========================== 2930 REM 2940 REM ------------------------------ 2950 REM K%(0%,N%)=8% TYP 2960 REM K%(1%,N%)=Q (Nodnr) 2970 REM K%(2%,N%)=inversen av Q (Nodnr) 2980 REM K%(3%,N%)=Trigflank 1=pos 2990 REM K%(4%,N%)=CL (Nodnr) 3000 REM K%(5%,N%)=Dataing}ng (Nodnr) 3010 REM K%(6%,N%)=SET (Nodnr) 3020 REM K%(7%,N%)=RES (Nodnr) 3030 REM K%(8%,N%)=Gammla clockv{rdet 3040 REM ------------------------------ 3050 IF N%(K%(6%,U%))=1% 3080 3060 N%(K%(1%,U%))=1% 3070 GOTO 3170 3080 IF N%(K%(7%,U%))=1% 3110 3090 N%(K%(1%,U%))=0% 3100 GOTO 3170 3110 IF K%(8%,U%)=N%(K%(4%,U%)) RETURN 3120 IF K%(8%,U%)>N%(K%(4%,U%)) 3140 3130 IF K%(3%,U%)=0% 3160 ELSE 3150 3140 IF K%(3%,U%)=1% 3160 3150 N%(K%(1%,U%))=N%(K%(5%,U%)) 3160 K%(8%,U%)=N%(K%(4%,U%)) 3170 N%(K%(2%,U%))= NOT (N%(K%(1%,U%))-2%) 3180 RETURN 3190 REM 3200 REM =================== 3210 REM === Vilka noder === 3220 REM =================== 3230 REM 3240 PRINT CUR(3%,0%);TAB(39%) 3250 PRINT CUR(3%,0%);"Vilka noder skall visas" 3260 PRINT "Avsluta med 0 (noll)" 3270 I1%=10% 3280 FOR I%=1% TO 10% 3290 ONERRORGOTO 3390 3300 PRINT CUR(I%+4%,0%);TAB(39%); 3310 PRINT CUR(I%+4%,0%); 3320 INPUT M%(I%) 3330 IF M%(I%)<0% 3300 3340 IF M%(I%)>100% 3300 3350 GOSUB 1390 3360 IF M%(I%)=0% I1%=I%-1% : RETURN 3370 NEXT I% 3380 RETURN 3390 E9%=ERRCODE 3400 GOSUB 1570 3410 GOTO 3290 3420 REM 3430 REM ======================== 3440 REM ===== Grafiskt mod ===== 3450 REM ======================== 3460 REM 3470 GOSUB 1470 : REM Systemrad 3480 PRINT CUR(2%,0%);"Nod" 3490 FOR I%=6% TO 31% STEP 5% 3500 T0%=T0%+10% 3510 PRINT CUR(2%,I%);T0% 3520 NEXT I% 3530 FOR I%=1% TO I1% 3540 PRINT CUR(I%*2%+1%,0%);M%(I%);CHR$(151%) 3550 NEXT I% 3560 RETURN 3570 REM 3580 REM ============================== 3590 REM === Uppdatera insignaler === 3600 REM ============================== 3610 REM 3620 FOR I%=1% TO N% 3630 FOR J%=2% TO 19% 3640 IF S%(J%,I%)=0% 3670 3650 IF T%<>S%(J%,I%) 3670 3660 N%(S%(0%,I%))= NOT (N%(S%(0%,I%))-2%) 3670 NEXT J% : NEXT I% 3680 N%(1%)= NOT (N%(1%)-2%) 3690 RETURN 3700 REM 3710 REM ============================= 3720 REM === Utf|r logikfunktioner === 3730 REM ============================= 3740 REM 3750 FOR U%=1% TO R% 3760 ON K%(0%,U%) GOSUB 1890,2000,2110,2230,2350,2420,2580,3050,2800 3770 NEXT U% 3780 RETURN 3790 REM 3800 REM ==================== 3810 REM ==== RITA NODER ==== 3820 REM ==================== 3830 REM 3840 FOR I%=1% TO I1% 3850 SETDOT I%*6%+5%-N%(M%(I%)),K%+10% 3860 NEXT I% 3870 K%=K%+1% 3880 RETURN 3890 REM 3900 REM ==================== 3910 REM === Sk{rmen full === 3920 REM ==================== 3930 REM 3940 E9%=101% 3950 GOSUB 1590 3960 GET A$ 3970 IF A$<>"J" AND A$<>"j" 4000 3980 GOSUB 3470 : REM Grafiskt mod 3990 K%=0% : RETURN 4000 IF A$<>"n" AND A$<>"N" 3940 4010 GOTO 450 4020 REM 4030 REM ====================== 4040 REM === K|r simulering === 4050 REM ====================== 4060 REM 4070 GOSUB 3240 : REM Vilka noder 4080 T%=0% 4090 GOSUB 3470 : REM Grafisk mod 4100 GOSUB 4310 : REM S{tt innoder 4110 T%=T%+1% 4120 GOSUB 3620 : REM Uppdatera 4130 GOSUB 3750 : REM Utf|r logikfunk. 4140 GOSUB 3840 : REM Rita noder 4150 IF K%=70% GOSUB 3940 4160 GOTO 4110 4170 REM 4180 REM ========================== 4190 REM === Byt till inmatning === 4200 REM ========================== 4210 REM 4220 E9%=102% 4230 GOSUB 1590 4240 PRINT CUR(15%,0%); 4250 CHAIN "DR1:LOGSIM" 4260 REM 4270 REM ====================== 4280 REM ==== S{tt innoder ==== 4290 REM ====================== 4300 REM 4310 FOR I%=1% TO N% 4320 IF S%(1%,I%)=2% 4340 4330 N%(S%(0%,I%))=S%(1%,I%) 4340 NEXT I% 4350 RETURN 4360 REM 4370 REM ============================ 4380 REM ==== Realtidssimulering ==== 4390 REM ============================ 4400 REM 4410 ; CUR(2%,0%);"Nod Tan- Logik Nod Tan- Logik" 4420 ; CUR(3%,0%);"nr: gent niv} nr: gent niv}" 4430 IF R1%<>0% 4480 4440 E9%=104% 4450 GOSUB 1570 : REM Felmedelande 4460 GET A$ 4470 IF ASC(A$)=13% 430 ELSE 4460 4480 E9%=103% 4490 GOSUB 1570 : REM Medelande 4500 FOR I%=2% TO FNM%(R1%,37%) 4510 GOSUB 4750 : REM Positionsjust 4520 IF I%<10% X0%=1% ELSE X0%=0% 4530 PRINT CUR(I%+2%+Y%,0%+X%+X0%); 4540 PRINT RIGHT$(NUM$(I%),2%); 4550 PRINT TAB(7%+X%)CHR$(I%+63%) 4560 NEXT I% 4570 GOSUB 4310 : REM S{tt inoder 4580 GOSUB 3750 : REM Utf|r logikfunk. 4590 FOR I%=2% TO FNM%(R1%,37%) 4600 GOSUB 4750 : REM Positionsjust 4610 PRINT CUR(I%+2%+Y%,12%+X%);N%(I%) 4620 NEXT I% 4630 IF PEEK(65013%)=0% 4580 4640 X%=INP(56%) : POKE 65013%,0% 4650 IF X%>128% X%=X%-128% 4660 X%=X%-63% 4670 IF X%=1% 450 4680 IF X%>R1% OR X%<1% 4630 4690 N%(X%)= NOT (N%(X%)-2%) 4700 GOTO 4580 4710 REM 4720 REM ============================ 4730 REM ==== Positionsjustering ==== 4740 REM ============================ 4750 IF I%>19% X%=22% : Y%=-18% : RETURN 4760 X%=0% : Y%=0% : RETURN