REM Jesse Gordon 4/16/2003 REM Disposable logic simulator program. DECLARE FUNCTION angie! (inn!) 'txclockstart = 4 txdatastart = 188 'rxclockstart = 12 cursor = 0 'txdata = 0 see txdataset_remark SCREEN 12 CLS DIM avg(100) avglen = 20 avgindex = 0 DO a$ = INKEY$ txdataold = txdata txclockold = txclock rxclockold = rxclock noiseold = noise xoroutputold = xoroutput rxdataold = rxdata txcompositeold = txcomposite rxavgold = rxavg schmidtold = schmidt noise = RND txclockstep = txclockstep + 1 IF txclockstep > 15 THEN txclockstep = 0: IF txclock = 1 THEN txclock = 0 ELSE txclock = 1 txdatastep = txdatastep + 1 IF txdatastep > 15 * 17 THEN txdatastep = 0: IF txdata = 0 THEN txdata = 1 ELSE txdata = 0 rxclockstep = rxclockstep + 1 IF rxclockstep > 15 THEN rxclockstep = 0: IF rxclock = 1 THEN rxclock = 0 ELSE rxclock = 1 txcomposite = txdata XOR txclock XOR 1 xoroutput = txcomposite XOR rxclock XOR 1 'IF (1 = 1) THEN 'avg(avgindex) = xoroutput: avgindex = avgindex + 1: IF avgindex > avglen THEN avgindex = 0 'rxavg = 0 'FOR n = 0 TO avglen 'rxavg = rxavg + avg(n) 'NEXT 'rxavg = rxavg / (avglen + 1) 'ELSE IF xoroutput = 1 THEN rxavg = rxavg + ((1 - rxavg) / 20) IF xoroutput = 0 THEN rxavg = rxavg - (rxavg / 20) IF x = 443 THEN avgsave = rxavg 'END IF refh = 2 / 3 refl = 1 / 3 IF rxavg > refh THEN schmidt = 1 IF rxavg < refl THEN schmidt = 0 xold = x x = x + 1: IF ((x > 640) OR (a$ <> "")) THEN LOCATE 1, 1: PRINT "Arrow keys: Cursor at"; angie(cursor * 11.25); "Degrees. Use A/a,B/b,C/c to adjust. Space=refresh": PRINT "Version 0.000" LOCATE 3, 1: PRINT "A: TX Clock "; (txclockstart * 11.25) - (2 * (txclockstart * 11.25)); "Degrees " LOCATE 6, 1: COLOR 9: PRINT "B: TX Data "; angie((txdatastart * 11.25) - (2 * (txdatastart * 11.25))); " Degrees "; : COLOR 10: PRINT " Recovered data (output of Schmidt trigger)": COLOR 7 LOCATE 9, 1: PRINT "Composite out IR LED" LOCATE 12, 1: PRINT "Noise. Not used!" LOCATE 15, 1: PRINT "C: Receiver Clock "; (rxclockstart * 11.25) - (2 * (rxclockstart * 11.25)); " Degrees" LOCATE 18, 1: PRINT "Output of XOR gate" LOCATE 30, 1: PRINT "Output of integrator (Scale: Center, and low & high thresholds for schmidt.)"; IF a$ = "" THEN DO: a$ = INKEY$: LOOP WHILE a$ = "" IF LEN(a$) > 1 THEN a$ = RIGHT$(a$, 1) IF a$ = "M" THEN cursor = cursor + 1: IF a$ = "K" THEN cursor = cursor - 1: IF a$ = "A" THEN txclockstart = txclockstart - 1 IF a$ = "a" THEN txclockstart = txclockstart + 1 IF txclockstart > 15 THEN txclockstart = -16 IF txclockstart < -16 THEN txclockstart = 15 IF a$ = "C" THEN rxclockstart = rxclockstart - 1 IF a$ = "c" THEN rxclockstart = rxclockstart + 1 IF rxclockstart > 15 THEN rxclockstart = -16 IF rxclockstart < -16 THEN rxclockstart = 15 IF a$ = "B" THEN txdatastart = txdatastart - 1 IF a$ = "b" THEN txdatastart = txdatastart + 1 'IF txdatastart > 127 THEN txdatastart = -128 'IF txdatastart < -128 THEN txdatastart = 127 txclock = 0: txclockstep = txclockstart rxclock = 0: rxclockstep = rxclockstart txdata = 1: txdatastep = txdatastart 'txdataset_remark rxavg = 0'avgsave schmidt = 0 x = 0: CLS 'FOR n = 4 TO 640 STEP 4 'LINE (n, 0)-(n, 640), 8 'NEXT LOCATE 1, 1: PRINT "Arrow keys: Cursor at"; angie(cursor * 11.25); "Degrees. Use A/a,B/b,C/c to adjust. Space=refresh" LINE (cursor, 0)-(cursor, 480), 1 xold = 0 LINE (0, 7 * 50)-(640, 7 * 50 + 100), 8, BF LINE (0, 7 * 50 + 50)-(640, 7 * 50 + 50), 0 LINE (0, 7 * 50 + refl * 100)-(640, 7 * 50 + refl * 100), 0 LINE (0, 7 * 50 + refh * 100)-(640, 7 * 50 + refh * 100), 0 END IF y = 0: ystep = 50 y = y + ystep LINE (xold + 1, txclockold * 20 + y)-(x, txclock * 20 + y) y = y + ystep LINE (xold + 1, txdataold * 20 + y)-(x, txdata * 20 + y), 9 LINE (xold + 1, schmidtold * 20 + y + 1)-(x, schmidt * 20 + y + 1), 10 y = y + ystep LINE (xold + 1, txcompositeold * 20 + y)-(x, txcomposite * 20 + y) y = y + ystep LINE (xold, noiseold * 20 + y)-(x, noise * 20 + y) y = y + ystep LINE (xold + 1, rxclockold * 20 + y)-(x, rxclock * 20 + y) y = y + ystep LINE (xold + 1, xoroutputold * 20 + y)-(x, xoroutput * 20 + y) y = y + ystep LINE (xold, rxavgold * 100 + y)-(x, rxavg * 100 + y) LINE (cursor, 0)-(cursor, 480), 1 LOOP WHILE a$ <> CHR$(27) FUNCTION angie (inn) angie = inn - (INT(inn / 360) * 360) END FUNCTION