REM PARALLEL PORT CRO PROGRAM CROW Ver 1.2 (Text, Single Sample) REM ------------------------- REM BY BRENDAN GREGG 1999 REM REM This program turns your parallel port into a 4 channel REM digital CRO. (Digital as in high or low! Anything else REM would require an external analog to digital converter!). REM REM Just connect wires to your parallel port data out pins 0-3 REM (thats pins 2-5 on the 25-pin d-type female (back of a PC)) REM NOTE!!! DON'T PUT THESE WIRES AS THE SAMPLE PROBES, PUT REM A LARGE RESISTOR IN SERIES FIRST (MUCH GREATER THAN 330 OHM) REM SO THAT YOUR PC DOSEN'T END UP SINKING SEVERAL AMPS (WHICH REM IS A BAD THING), INSTEAD - JUST A FEW MILLIAMPS. REM REM PC Parallel Port pin 2 ----- 1K Ohm resistor ---- Probe 0 REM PC Parallel Port pin 3 ----- 1K Ohm resistor ---- Probe 1 REM PC Parallel Port pin 4 ----- 1K Ohm resistor ---- Probe 2 REM PC Parallel Port pin 5 ----- 1K Ohm resistor ---- Probe 3 REM REM If you want the PC ground, pins 18-25 are ground. REM If you haven't played around with pc's in this way before, REM you might want to do this on an old 386! REM REM TROUBLE SHOOTING - REM REM If it dosen't work: REM 1. change the PORTBASE value on line 14, it's set to 888 (378H), REM which is LPT1. You probably have LPT2, so change this value REM to 632 instead (278H). REM 2. if it still dosen't work, you might have an old controller REM card that can't do inputs (my XT can't!). Get a newer controller REM or try it on a newer computer. (New controller as in about 1995+). REM REM If it samples too slow: REM 1. tried pressing the '+' key to change the sweep delay? REM 2. you can change the initial SWEEPDELAY on line 10, it's set to REM 256, change it to 1. You might need to do that if you use REM an old XT with a newer controller card. REM REM COMMENTS/BUGS REM REM Email Brendan Gregg at c9607692@engmail.newcastle.edu.au (During 1999! Else look me up on the net somewhere). REM REM --- SET UP SOME INITIAL VARIABLES --- 10 SCREEN 0: CLS : SWEEPDELAY = 256: LINES = 0 12 CH0 = 1: CH1 = 0: CH2 = 0: CH3 = 0: X = 5: TRIG = 0: LL = 12: LH = 11 14 PORTBASE = 888: REM 888 = LPT1, 632 = LPT2 REM --- DRAW THE MAIN SCREEN --- 20 COLOR 15, 0: LOCATE 1, 10: PRINT "PARALLEL PORT DIGITAL CRO - SINGLE SAMPLE": SOUND 800, .3: SOUND 1000, .4: SOUND 0, .4 COLOR 14, 0: LOCATE 1, 10: PRINT "PARALLEL PORT DIGITAL CRO - SINGLE SAMPLE" COLOR 15, 0: LOCATE 2, 5: PRINT "USE DATA PINS 0-3 OF PARALLEL PORT FOR CHANNELS 0-3": SOUND 800, .3: SOUND 1000, .4: SOUND 0, .4 COLOR 14, 0: LOCATE 2, 5: PRINT "USE DATA PINS 0-3 OF PARALLEL PORT FOR CHANNELS 0-3" COLOR 15, 0: LOCATE 4, 5: PRINT "PRESS '+' OR '-' TO CHANGE ZOOM (SWEEP DELAY)": SOUND 1500, .3: SOUND 1200, .1 COLOR 12, 0: LOCATE 4, 5: PRINT "PRESS '+' OR '-' TO CHANGE ZOOM (SWEEP DELAY)" COLOR 15, 0: LOCATE 5, 5: PRINT "PRESS 'T' TO TOGGLE TRIGGER (CH0)": SOUND 1500, .3: SOUND 1200, .4: SOUND 0, .1 COLOR 12, 0: LOCATE 5, 5: PRINT "PRESS 'T' TO TOGGLE TRIGGER (CH0)" COLOR 15, 0: LOCATE 6, 5: PRINT "PRESS 'L' TO TOGGLE CHANNEL 0 ON ALL LINES": SOUND 1500, .3: SOUND 1200, .1 COLOR 12, 0: LOCATE 6, 5: PRINT "PRESS 'L' TO TOGGLE CHANNEL 0 ON ALL LINES" COLOR 15, 0: LOCATE 7, 5: PRINT "PRESS 'P' TO PAUSE": SOUND 1500, .3: SOUND 1200, .4: SOUND 0, .1 COLOR 12, 0: LOCATE 7, 5: PRINT "PRESS 'P' TO PAUSE" COLOR 15, 0: LOCATE 8, 5: PRINT "PRESS '1-3' TO TOGGLE CHANNELS": SOUND 1500, .3: SOUND 1200, .4: SOUND 0, .1 COLOR 12, 0: LOCATE 8, 5: PRINT "PRESS '1-3' TO TOGGLE CHANNELS" COLOR 15, 0: LOCATE 9, 5: PRINT "PRESS TO QUIT": SOUND 1500, .3: SOUND 1200, .4: SOUND 0, .1 COLOR 12, 0: LOCATE 9, 5: PRINT "PRESS TO QUIT" COLOR 15, 0: LOCATE 4, 55: PRINT "SW DELAY : 256": SOUND 1500, .2: SOUND 1200, .3 COLOR 11, 0: LOCATE 4, 55: PRINT "SW DELAY : 256" COLOR 15, 0: LOCATE 5, 55: PRINT "TRIGGER : OFF": SOUND 1500, .2: SOUND 1200, .3 COLOR 11, 0: LOCATE 5, 55: PRINT "TRIGGER : OFF" COLOR 15, 0: LOCATE 6, 55: PRINT "CHANNEL 0 : ON": SOUND 1500, .2: SOUND 1200, .3 COLOR 11, 0: LOCATE 6, 55: PRINT "CHANNEL 0 : ON" COLOR 15, 0: LOCATE 7, 55: PRINT "CHANNEL 1 : OFF": SOUND 1500, .2: SOUND 1200, .3 COLOR 11, 0: LOCATE 7, 55: PRINT "CHANNEL 1 : OFF" COLOR 15, 0: LOCATE 8, 55: PRINT "CHANNEL 2 : OFF": SOUND 1500, .2: SOUND 1200, .3 COLOR 11, 0: LOCATE 8, 55: PRINT "CHANNEL 2 : OFF" COLOR 15, 0: LOCATE 9, 55: PRINT "CHANNEL 3 : OFF": SOUND 1500, .2: SOUND 1200, .3 COLOR 11, 0: LOCATE 9, 55: PRINT "CHANNEL 3 : OFF" COLOR 15, 0: LOCATE 12, 1: PRINT "CH0": SOUND 500, .2: SOUND 400, .3 COLOR 7, 0: LOCATE 12, 1: PRINT "CH0" COLOR 15, 0: LOCATE 16, 1: PRINT "CH1": SOUND 500, .2: SOUND 400, .3 COLOR 7, 0: LOCATE 16, 1: PRINT "CH1" COLOR 15, 0: LOCATE 20, 1: PRINT "CH2": SOUND 500, .2: SOUND 400, .3 COLOR 7, 0: LOCATE 20, 1: PRINT "CH2" COLOR 15, 0: LOCATE 24, 1: PRINT "CH3"; : SOUND 500, .2: SOUND 400, .3 COLOR 7, 0: LOCATE 24, 1: PRINT "CH3"; COLOR 15, 0 REM --- FIRST WE NEED TO ENABLE BIDIR FROM THE CONTROL PORT --- 30 OUT PORTBASE + 2, 32: OUT PORTBASE, 0 REM --- BEGIN OF MAIN LOOP - READ IN PARALLEL PORT INTO Y --- 50 Y = INP(PORTBASE) IF Y > 127 THEN Y = Y - 128 IF Y > 63 THEN Y = Y - 64 IF Y > 31 THEN Y = Y - 32 IF Y > 15 THEN Y = Y - 16 IF Y > 7 THEN Y3 = 1: Y = Y - 8 ELSE Y3 = 0 IF Y > 3 THEN Y2 = 1: Y = Y - 4 ELSE Y2 = 0 IF Y > 1 THEN Y1 = 1: Y = Y - 2 ELSE Y1 = 0 REM --- DRAW THE DASH HIGH OR LOW DEPENDING --- 60 IF Y > 0 THEN LOCATE LH, X ELSE LOCATE LL, X 70 PRINT "-"; 80 IF CH1 = 1 THEN GOSUB 400 90 IF CH2 = 1 THEN GOSUB 500 100 IF CH3 = 1 THEN GOSUB 600 110 X = X + 1 120 IF X = 77 THEN X = 5: IF LINES = 1 THEN LL = LL + 4: LH = LH + 4 IF LL = 28 THEN LL = 12: LH = 11 130 KEY$ = INKEY$ 135 IF X = 5 AND TRIG = 1 THEN GOSUB 700 REM --- NOW CLEAR SOME CHARACTERS AHEAD OF THE LINE --- 140 COLOR 8, 0: LOCATE LH, X: PRINT "ú "; : LOCATE LL, X: PRINT "ú "; IF CH1 = 1 THEN LOCATE 15, X: PRINT "ú "; : LOCATE 16, X: PRINT "ú "; : IF CH2 = 1 THEN LOCATE 19, X: PRINT "ú "; : LOCATE 20, X: PRINT "ú "; : IF CH3 = 1 THEN LOCATE 23, X: PRINT "ú "; : LOCATE 24, X: PRINT "ú "; : COLOR 15, 0 REM --- NOW DELAY BEFORE READING THE NEXT SAMPLE --- 145 IF KEY$ <> "" THEN GOTO 170 150 FOR DELAY = 1 TO SWEEPDELAY 155 NEXT DELAY REM --- DEAL WITH KEYSTROKES --- 160 IF KEY$ = "" THEN GOTO 50 170 IF KEY$ = CHR$(27) THEN GOTO 900 180 IF KEY$ = "=" THEN SWEEPDELAY = INT(SWEEPDELAY / 2) 190 IF KEY$ = "+" THEN SWEEPDELAY = INT(SWEEPDELAY / 2) 200 IF KEY$ = "-" THEN SWEEPDELAY = SWEEPDELAY * 2 210 IF KEY$ = "_" THEN SWEEPDELAY = SWEEPDELAY * 2 220 IF KEY$ = "1" AND LINES = 0 THEN GOSUB 460 230 IF KEY$ = "2" AND LINES = 0 THEN GOSUB 560 240 IF KEY$ = "3" AND LINES = 0 THEN GOSUB 660 250 IF KEY$ = "T" OR KEY$ = "t" THEN IF TRIG = 0 THEN TRIG = 1 ELSE TRIG = 0 260 IF KEY$ = "P" OR KEY$ = "p" THEN GOSUB 800 270 IF KEY$ = "L" OR KEY$ = "l" THEN GOSUB 850 REM --- FIX UP SCREEN MESSAGES --- 280 IF SWEEPDELAY = 0 THEN SWEEPDELAY = 1: IF SWEEPDELAY > 16384 THEN SWEEPDELAY = 16384: REM REMOVE THIS IF YOU WANT SOME REALLY SLOW SCOPES 290 LOCATE 4, 66: COLOR 11, 0: PRINT SWEEPDELAY; IF CH1 = 1 THEN LOCATE 7, 67: PRINT "ON " IF CH2 = 1 THEN LOCATE 8, 67: PRINT "ON " IF CH3 = 1 THEN LOCATE 9, 67: PRINT "ON " IF TRIG = 0 THEN LOCATE 5, 67: PRINT "OFF" IF TRIG = 1 THEN LOCATE 5, 67: PRINT "ON " 300 COLOR 15, 0: GOTO 50 REM --- FUNCTIONS FOR CHANNEL 1 --- 400 IF Y1 > 0 THEN LOCATE 15, X ELSE LOCATE 16, X 410 PRINT "-"; 450 RETURN 460 IF CH1 = 1 THEN CH1 = 0 LOCATE 15, 5: PRINT " "; LOCATE 16, 5: PRINT " "; ELSE CH1 = 1 END IF 465 COLOR 11, 0: LOCATE 7, 67: PRINT "OFF" 470 RETURN REM --- FUNCTIONS FOR CHANNEL 2 --- 500 IF Y2 > 0 THEN LOCATE 19, X ELSE LOCATE 20, X 510 PRINT "-"; 550 RETURN 560 IF CH2 = 1 THEN CH2 = 0 LOCATE 19, 5: PRINT " "; LOCATE 20, 5: PRINT " "; ELSE CH2 = 1 END IF 565 COLOR 11, 0: LOCATE 8, 67: PRINT "OFF" 570 RETURN REM --- FUNCTIONS FOR CHANNEL 3 --- 600 IF Y3 > 0 THEN LOCATE 23, X ELSE LOCATE 24, X 610 PRINT "-"; 650 RETURN 660 IF CH3 = 1 THEN CH3 = 0 LOCATE 23, 5: PRINT " "; LOCATE 24, 5: PRINT " "; ELSE CH3 = 1 END IF 665 COLOR 11, 0: LOCATE 9, 67: PRINT "OFF" 670 RETURN REM --- TRIGGER FUNCTION - WAIT FOR 0->1 TRIGGER --- 700 LIMIT = 256 + SWEEPDELAY: FROMZERO = 0: REM CHANGE LIMIT TO DESIRED DELAY 710 YT = INP(PORTBASE) IF YT > 7 THEN YT = YT - 8 IF YT > 3 THEN YT = YT - 4 IF YT > 1 THEN YT = YT - 2 720 LIMIT = LIMIT - 1 730 IF YT = 0 THEN FROMZERO = 1: TOONE = 0 740 IF YT = 1 THEN TOONE = 1 750 IF FROMZERO = 1 AND TOONE = 1 THEN RETURN 760 KEY$ = INKEY$: IF KEY$ <> "" THEN RETURN 770 IF LIMIT < 1 THEN RETURN 780 GOTO 710 REM --- IMPLEMENT PAUSE --- 800 COLOR 15, 0: LOCATE 7, 5: PRINT "PRESS 'P' TO UNPAUSE"; : COLOR 4, 0: PRINT " "; : SOUND 1500, .3: SOUND 1200, .4: SOUND 0, .1 COLOR 12, 0: LOCATE 7, 5: PRINT "PRESS 'P' TO UNPAUSE "; 810 PAUSEKEY$ = INKEY$ 820 IF PAUSEKEY$ = "P" OR PAUSEKEY$ = "p" THEN GOTO 840 830 GOTO 810 840 COLOR 15, 0: LOCATE 7, 5: PRINT "PRESS 'P' TO PAUSE "; : SOUND 1500, .3: SOUND 1200, .4: SOUND 0, .1 COLOR 12, 0: LOCATE 7, 5: PRINT "PRESS 'P' TO PAUSE "; 845 RETURN REM --- IMPLEMENT LINES --- 850 IF LINES = 1 THEN GOTO 880 860 COLOR 15, 0: LOCATE 16, 1: PRINT "CH0": SOUND 500, .2: SOUND 400, .3 COLOR 7, 0: LOCATE 16, 1: PRINT "CH0" COLOR 15, 0: LOCATE 20, 1: PRINT "CH0": SOUND 500, .2: SOUND 400, .3 COLOR 7, 0: LOCATE 20, 1: PRINT "CH0" COLOR 15, 0: LOCATE 24, 1: PRINT "CH0"; : SOUND 500, .2: SOUND 400, .3 COLOR 7, 0: LOCATE 24, 1: PRINT "CH0"; COLOR 15, 0 870 LINES = 1: CH1 = 0: CH2 = 0: CH3 = 0: RETURN 880 CH1 = 1: CH2 = 1: CH3 = 1: LINES = 0: LL = 12: LH = 11 881 GOSUB 460 882 GOSUB 560 883 GOSUB 660 885 COLOR 15, 0: LOCATE 16, 1: PRINT "CH1": SOUND 500, .2: SOUND 400, .3 COLOR 7, 0: LOCATE 16, 1: PRINT "CH1" COLOR 15, 0: LOCATE 20, 1: PRINT "CH2": SOUND 500, .2: SOUND 400, .3 COLOR 7, 0: LOCATE 20, 1: PRINT "CH2" COLOR 15, 0: LOCATE 24, 1: PRINT "CH3"; : SOUND 500, .2: SOUND 400, .3 COLOR 7, 0: LOCATE 24, 1: PRINT "CH3"; COLOR 15, 0 890 RETURN REM --- EXIT STATEMENT --- 900 LOCATE 17, 20: PRINT "CRO FINISHED - PRESS ANY KEY TO EXIT" 910 OUT PORTBASE, 0 REM ----------------------------------------------------------- REM If you are reading this code you might be interested in the REM following... This program is pretty small, less than 200 REM lines of actual code here. If you are wondering how small REM it can go, then take a look at this: REM REM 10 SCREEN 0: CLS : X = 2: SD = 256: P = 888: OUT P + 2, 32 REM 20 Y = INP(P): IF Y > 0 THEN LOCATE 10, X ELSE LOCATE 12, X REM 30 COLOR 15, 0: PRINT "-"; : X = X + 1: IF X = 77 THEN X = 2 REM 40 COLOR 8, 0: LOCATE 10, X: PRINT "ú "; : LOCATE 12, X: PRINT "ú "; REM 50 FOR DELAY = 1 TO SD: NEXT DELAY REM 60 IF INKEY$ <> CHR$(27) THEN GOTO 20 REM REM That's it folks, six lines for a single channel digital CRO. REM Copy it to a new file, remove the REMs, and run it. REM You might need to change the port address (P) to get it to work, REM and change the sweep delay (SD) to get it to run nice... REM REM Brendan Gregg