1 VERSION 2.0 2 COMPUTER OSCILLOSCOPE - HEATH/ZENITH COMPUTER BASED INSTRUMENTS GROUP 3 MAY 19, 1987 4 WRITTEN BY KIM MC CAVIT 5 REVISED BY BARB ERWIN 10 'CLEAR MEMORY ABOVE 45000 FOR ASSEMBLY LANGUAGE ROUTINES 20 'TURN KEY DISPLAY OFF AND DISABLE THE FUNCTION KEYS 30 'SWITCH TO HIGH RESOLUTION GRAPHICS 40 ' 50 CLEAR,45000!:KEY OFF:FOR I=1 TO 10:KEY I,"":NEXT I:SCREEN 2 60 CLS:LOCATE 15,10:PRINT"LOADING........" 70 OUT &H3D9,&HA 'TURN SCREEN LIGHT GREEN 80 ' 90 'DEFINE CONSTANTS ***************************************************** 100 ' 110 DEFINT A-Z:DIM Y1(511),Y2(511),Y1SUM(511),Y2SUM(511),M1(511),M2(511) 120 FOR I=0 TO 511:Y1(I)=128:Y2(I)=128:Y1SUM(I)=0:Y2SUM(I)=0:NEXT I 130 OFFSETY1=0:OFFSETY2=0:HOFFSET=0:FALSE=0:TRUE=NOT FALSE:FRTCHG=255 140 LYNE=TRUE:INVERTY1=FALSE:INVERTY2=FALSE:EROR=FALSE:MEM1=FALSE:MEM2=FALSE 150 COMAND=0:GRATON=TRUE:SCOPE=TRUE:MENU=1:SAVMEM=FALSE 160 Y1SEN=0:Y2SEN=0:Y1COUP=0:Y2COUP=0:SLOPE=0:MODE=0:SOURCE=0:LEVEL=0:RATE=15 170 TRIG=0:CURSOR=1:C1Y=3:C2Y=3:MENU=1:PNT=0:COMAND=0 180 X1=-1:X2=-1:X3=-1:X4=-1:AVGNUM=1:AVGCNT=-1:AVGY1=FALSE:AVGY2=FALSE 190 ' 200 'DEFINE COMMANDS******************************************************* 210 ' 220 Y1SENUP =65:Y1SENDN =66:Y2SENUP =67:Y2SENDN =68:Y1COUPLG =69:Y2COUPLG =70 230 TBASEUP =71:TBASEDN =72:TRIGSLP =73:TRIGMDE =74:TRIGRST =75:MANTRG =75 240 TRIGSCR =76:TRGLVL=97:TRGZERO =86:REQMEM =87:REQSAV =88 250 RSTREQ =93:REQFRT =89:RST=94:REZERO=95: SCOPEON =92:TSAVE=77 260 SCOPEOFF=91:Y1POS=98:Y2POS=99:Y1ZERO =84:Y2ZERO=85 270 ' 280 'DEFINE STRING ARRAYS AND FUNCTION POINTER LOCATIONS**************** 290 ' 300 DIM SEN$(9):FOR I=0 TO 9:READ SEN$(I):NEXT I 310 DATA "5.0 mV","10. mV","20. mV","50. mV","100 mV","200 mV" 320 DATA "500 mV","1.0 V","2.0 V","5.0 V" 330 ' 340 DIM RATE$(28):FOR I=0 TO 28:READ RATE$(I):NEXT I 350 DATA "10. nS","20. nS","50. nS","100 nS","200 nS","500 nS","1.0 uS","2.0 uS" 360 DATA "5.0 uS","10. uS","20. uS","50. uS","100 uS","200 uS","500 uS","1.0 mS" 370 DATA "2.0 mS","5.0 mS","10. mS","20. mS","50. mS","100 mS","200 mS","500 mS" 380 DATA "1.0 S","2.0 S","5.0 S","10. S","20. S" 390 ' 400 DIM COUPLNG$(4):FOR I=0 TO 4:READ COUPLNG$(I):NEXT I 410 DATA "OFF","AC ","GND"," ","DC " 420 ' 430 DIM MODE$(4):FOR I=0 TO 4:READ MODE$(I):NEXT I 440 DATA " "," auto","normal"," ","single" 450 ' 460 DIM POINTER(13,2) ' X,Y,# OF CHARACTERS 470 FOR I=0 TO 13:FOR J=0 TO 2:READ POINTER(I,J):NEXT J:NEXT I 480 DATA 550,0,3, 582,0,6, 550,8,6, 574,16,8, 550,32,3, 582,32,6, 550,40,6 490 DATA 574,48,8, 597,64,3,550,72,6, 614,88,2, 622,104,1, 550,128,8, 590,144,6 500 ' 510 'BRING IN ASSEMBLY LANGUAGE ROUTINES***************************** 520 ' 530 BLOAD"MAP.BIN",47050!:BLOAD"UARTINI.BIN",47570!:UARTINI!=47570! 540 BLOAD"PLOT.BIN",47600!:PLOT!=47600!:BLOAD"GRAT.BIN",48275!:GRAT!=48275! 550 BLOAD"REQ.BIN",48860!:REQ!=48860!:BLOAD"REQFRT.BIN",49120!:REQFRT!=49120! 560 BLOAD"SEND.BIN",49500!:SEND!=49500!:BLOAD"CKUART.BIN",49540!:CKUART!=49540! 570 BLOAD"AVG.BIN",49605!:AVG!=49605! 580 ' 590 'MAKE REVERSE VIDEO BLOCKS AND MESSAGES************************* 600 ' 610 LOCATE 20,2:PRINT"SAMPLING":DIM S(34):GET(7,152)-(72,158),S 620 LOCATE 20,2:PRINT"TRANSFER":DIM T(34):GET(7,152)-(72,158),T 630 LOCATE 20,1:PRINT" ":DIM BLANK8(34),BLANK6(27),BLANK5(23) 640 DIM BLANK4(20),BLANK3(16),BLANK2(13),BLANK1(9):GET (0,152)-(65,158),BLANK8 650 PUT (0,152),BLANK8,PRESET:GET (0,152)-(65,158),BLANK8 660 GET (0,152)-(49,158),BLANK6:GET (0,152)-(41,158),BLANK5 670 GET(0,152)-(33,158),BLANK4:GET (0,152)-(25,158),BLANK3 680 GET (0,152)-(17,158),BLANK2:GET (0,152)-(9,158),BLANK1 690 PUT (0,152),BLANK8,XOR:LOCATE 2,1 700 PRINT SPC(9):FOR I=10 TO 22 STEP 2:FOR J=10 TO 12:PSET(I,J):NEXT J:NEXT I 710 PSET(8,11):PSET(12,9):PSET(14,8):PSET(14,14):PSET(12,13) 720 DIM ARROWL(13):GET (8,8)-(28,14),ARROWL:LOCATE 2,1 730 PRINT SPC(9):FOR I=10 TO 22 STEP 2:FOR J=10 TO 12:PSET(I,J):NEXT J:NEXT I 740 PSET(24,11):PSET(20,9):PSET(20,13):PSET(18,8):PSET(18,14) 750 DIM ARROWR(13):GET (4,8)-(24,14),ARROWR:FOR I=10 TO 20:PSET(I,10):NEXT I 760 DIM TMARK(3):GET(10,10)-(19,10),TMARK 770 ' 780 'SHOW INTRO SCREEN, HELP MESSAGE,SET BAUD RATE AND COM: CHANNEL********* 790 ' 800 CLS:DEF SEG=&HB800:BLOAD "BANNER.SAV",0:DEF SEG:ON ERROR GOTO 1090 810 OPEN "I",1,"BAUD.SAV":INPUT#1,BAUD,COMM,SCOPE:CLOSE#1:ON ERROR GOTO 0 820 IF SCOPE=TRUE THEN COMAND=SCOPEON :ELSE COMAND=SCOPEOFF 830 LOCATE 21,19:PRINT"COMMUNICATION STATUS: "; 840 IF COMM=0 THEN PRINT" COM1:";:ELSE PRINT" COM2:"; 850 PRINT SPC(2):IF BAUD=0 THEN PRINT" 110";:ELSE IF BAUD=1 THEN PRINT" 150"; 860 IF BAUD=2 THEN PRINT" 300";:ELSE IF BAUD=3 THEN PRINT" 600"; 870 IF BAUD=4 THEN PRINT"1200";:ELSE IF BAUD=5 THEN PRINT"2400"; 880 IF BAUD=6 THEN PRINT"4800";:ELSE IF BAUD=7 THEN PRINT"9600"; 890 PRINT" BAUD" 900 X$=INKEY$:IF X$="" THEN GOTO 900 910 IF X$="C" OR X$="c" THEN GOTO 960 920 IF X$="?" OR X$="/" THEN GOTO 930 :ELSE GOTO 1130 930 CLS:DEF SEG=&HB800:BLOAD"HELP.SAV",0:DEF SEG 940 X$=INKEY$:IF X$="" THEN GOTO 940 950 GOTO 800 960 CLS 'SELECT THE BAUD RATE 970 LOCATE 10,1:PRINT"SELECT BAUD RATE FOR COMMUNICATIONS CHANNEL:" 980 PRINT" 1) 110":PRINT" 2) 150":PRINT" 3) 300" 990 PRINT" 4) 600":PRINT" 5) 1200":PRINT" 6) 2400" 1000 PRINT" 7) 4800":PRINT" 8) 9600":PRINT:PRINT"SELECTION"; 1010 X$=INKEY$:IF X$="" THEN GOTO 1010 1020 X=VAL(X$):IF X<1 OR X>8 THEN GOTO 960 1030 BAUD=X-1:CLS:PRINT "SELECT COMMUNICATIONS CHANNEL:" 1040 PRINT " 1) COM1:":PRINT " 2) COM2:":PRINT:PRINT "SELECTION"; 1050 X$=INKEY$:IF X$="" THEN GOTO 1050 1060 X=VAL(X$):IF X=1 THEN COMM=0:GOTO 1080 1070 IF X=2 THEN COMM=1:GOTO 1080::ELSE LOCATE 2,1:GOTO 1040 1080 CLOSE:OPEN "O",1,"BAUD.SAV":PRINT#1,BAUD,COMM,SCOPE:CLOSE#1:GOTO 800 1090 RESUME 960 1100 ' 1110 'INITIALIZE UART **************************************************** 1120 ' 1130 CALL UARTINI!(COMM,BAUD):ON ERROR GOTO 0 1140 FOR I=1 TO 25:LOCATE I,1:PRINT SPC(79):NEXT I 1150 'INITIALIZE SCREEN*************************************************** 1160 GOSUB 2230:GOSUB 5060:GOSUB 5430 1170 ' 1180 '*****ERROR ENTRY POINT**************************** 1190 ' 1200 CALL GRAT!(GRATON):COMAND=1:CALL SEND!(COMAND,COMM):GOSUB 4740:GOSUB 4830 1210 LOCATE 22,10:PRINT SPC(44):LOCATE 23,10:PRINT SPC(44):LOCATE 24,10:PRINT SPC(44) 1220 ON POINTER(PNT,2) GOSUB 2210,2220,2230,2230,2240,2250,2250,2260,2260,2260 1230 GOSUB 3750 1240 ON POINTER(PNT,2) GOSUB 2210,2220,2230,2230,2240,2250,2250,2260,2260,2260 1250 I=FRE(""):LOCATE 20,66:IF MODE <4 THEN PRINT" no trigger ":GOTO 1300 1260 PRINT" armed ":CALL SEND!(RSTREQ,COMM):WATE=TRUE:GOTO 1400 1270 ' 1280 '*****DON'T BLANK ENTRY POINT********************** 1290 ' 1300 WATE=FALSE 1310 IF AVGCNT>=AVGNUM THEN WATE=TRUE 1320 GOSUB 4740:COMAND=1:CALL SEND!(COMAND,COMM):COMAND=0 1330 FOR I=0 TO 10/(BAUD+1):GOSUB 3270:NEXT I 1340 CALL CKUART!(COMAND,COMM,EROR):IF COMAND=FRTCHG THEN COMAND=0:EROR=0:GOTO 1200 1350 IF COMAND<>0 OR EROR<>0 THEN COMAND=0:EROR=0:GOTO 1330 1360 IF X$<>"" THEN GOTO 1530 1370 ' 1380 '*****START OF MAIN LOOP*************************** 1390 ' 1400 COUNT=0:COMAND=0:EROR=0:FAST=FALSE:I=FRE(""):IF WATE=TRUE THEN GOTO 1420 1410 IF Y1Y2>0 AND MODE<4 THEN CALL SEND!(REQMEM,COMM):WATE=TRUE 1420 CALL CKUART!(COMAND,COMM,EROR) 1430 IF COMAND=114 AND WATE=TRUE THEN GOTO 1460 1440 IF COMAND=115 AND WATE=TRUE THEN COMAND=0:PUT(0,161),S,PRESET 1450 IF COMAND<>0 OR EROR<>0 THEN COMAND=0:GOTO 1200 :ELSE X$="":GOTO 1530 1460 WATE=FALSE:PUT(0,161),T,PRESET 1470 CALL REQ!(Y1(0),Y2(0),Y1Y2,TRIG,COMM,BAUD,EROR):PUT(0,161),BLANK8,PRESET 1480 IF EROR=FALSE THEN GOTO 1490 :ELSE GOTO 1530 1490 IF TRIG=1 THEN MODE=MODE AND 7 1500 PUT(0,161),BLANK8,PRESET:IF AVGY1=TRUE OR AVGY2=TRUE THEN GOTO 1690 1510 X$="":GOSUB 3270:GOSUB 1790 1520 ' CHECK FOR COMMANDS AND CLEAR KEYBOARD BUFFER 1530 GOSUB 3270:IF X$="" THEN GOTO 1630 1540 IF LEN(X$)<>2 THEN GOTO 1610 1550 X=ASC(RIGHT$(X$,1))-58 1560 ON X GOSUB 4400,7040,5210,5250,4980,4465,4535,4900,2170,2170,7040,7040,7040,2350,7040,7040,3330,7040,3320,7040,7040,2360 1570 IF X=13 AND PNT=3 THEN OFFSETY1=0:GOSUB 1790:COMAND=Y1ZERO:GOTO 1620 1580 IF X=13 AND PNT=7 THEN OFFSETY2=0:GOSUB 1790:COMAND=Y2ZERO:GOTO 1620 1590 IF X=13 AND PNT=8 THEN HOFFSET=0:GOSUB 1790:X$="":GOTO 1220 1600 IF X=13 AND PNT=12 THEN COMAND=TRGZERO:GOTO 1620::ELSE X$="":GOTO 1530 1610 IF X$="?" OR X$="/" THEN GOTO 800 :ELSE X$="":GOTO 1530 1620 CALL SEND!(COMAND,COMM):EROR=FALSE:COMAND=0:X$="":GOTO 1220 1630 IF Y1Y2=0 THEN GOSUB 1790:Y1Y2=-1 1640 IF Y1Y2=-1 THEN GOSUB 1860 1650 IF EROR=TRUE THEN EROR=FALSE:GOTO 1200::ELSE GOTO 1400 1660 ' 1670 '*****END OF MAIN LOOP***************************** 1680 ' 1690 AVGCNT=AVGCNT+1:IF AVGCNT<=AVGNUM THEN GOTO 1710 1700 WATE=TRUE:GOTO 1530 1710 LOCATE 21,20:PRINT"average #";AVGCNT,"press F3 to restart averaging" 1720 IF AVGY1=TRUE THEN CALL AVG!(Y1(0),Y1SUM(0),AVGCNT) 1730 IF AVGY2=TRUE THEN CALL AVG!(Y2(0),Y2SUM(0),AVGCNT) 1740 IF AVGCNT=AVGNUM THEN WATE=TRUE 1750 GOTO 1510 1760 ' 1770 '*****PLOT SCREEN SUBROUTINE*********************** 1780 ' 1790 LOCATE 20,66:IF TRIG=1 THEN PRINT" triggered ":GOTO 1820 1800 IF MODE=12 THEN GOTO 1820 1810 IF MODE>1 THEN PRINT" manual trigger" :ELSE PRINT" no trigger " 1820 IF MEM1=TRUE THEN LOCATE 22,55:PRINT MEM1$;SPC(11-LEN(MEM1$));"=":LOCATE 22,67:PRINT SEN$(M1SEN);";";RATE$(M1RATE) 1830 IF MEM2=TRUE THEN LOCATE 23,55:PRINT MEM2$;SPC(11-LEN(MEM2$));"=":LOCATE 23,67:PRINT SEN$(M2SEN);";";RATE$(M2RATE) 1840 CALL GRAT!(GRATON) 1850 GOSUB 3270 1860 IF Y1COUP<>0 THEN CALL PLOT!(Y1(0),LYNE,INVERTY1,OFFSETY1,HOFFSET,X1,X2) 1870 IF Y2COUP<>0 THEN CALL PLOT!(Y2(0),LYNE,INVERTY2,OFFSETY2,HOFFSET,X3,X4) 1880 IF MEM1=TRUE THEN CALL PLOT!(M1(0),LYNE,INVERTM1,OFFSETM1,HOFFSETM1,TRUE,TRUE) 1890 IF MEM2=TRUE THEN CALL PLOT!(M2(0),LYNE,INVERTM2,OFFSETM2,HOFFSETM2,TRUE,TRUE) 1900 IF TRIG=0 AND RATE<14 THEN LOCATE 2,20:PRINT"ERROR.....No Trigger" 1910 IF FAST=TRUE THEN RETURN 1920 IF C1Y=3 AND C2Y=3 THEN RETURN :ELSE LOCATE 22,10 1930 IF C1=X1 THEN YC1!=(Y1(C1)-128)*Y1SCALE!:GOTO 1950 1940 IF C1=X3 THEN YC1!=(Y2(C1)-128)*Y2SCALE! :ELSE GOTO 1960 1950 YC!=YC1!:C=C1:GOSUB 2100:GOTO 1970 1960 PRINT SPC(25):LOCATE 24,10:PRINT SPC(25) 1970 LOCATE 23,10:IF C2=X2 THEN YC2!=(Y1(C2)-128)*Y1SCALE!:GOTO 1990 1980 IF C2=X4 THEN YC2!=(Y2(C2)-128)*Y2SCALE! :ELSE GOTO 2000 1990 YC!=YC2!:C=C2:GOSUB 2100:GOTO 2010 2000 PRINT SPC(25):LOCATE 24,10:PRINT SPC(25):RETURN 2010 IF X1=-1 AND X3=-1 THEN RETURN 2020 LOCATE 24,10:YC!=YC1!-YC2!:C=C1-C2:GOSUB 2100 2030 LOCATE 24,35:IF C=0 THEN PRINT" ";:RETURN 2040 PRINT"(";:LOCATE 24,36 2050 F!=1/(ABS(C)*FSCALE!*RSCALE!) 'CONVERT TO MHz 2060 IF F!>999.999 THEN PRINT USING"#.####";F!/1000;:PRINT" GHz )";:RETURN 2070 IF F!<.001 THEN PRINT USING"###.###";F!*1000000!;:PRINT" Hz )";:RETURN 2080 IF F!<1 THEN PRINT USING"###.###";F!*1000;:PRINT" KHz )";:RETURN 2090 PRINT USING"###.###";F!;:PRINT" MHz )";:RETURN 2100 IF ABS(YC!)<1000 THEN PRINT USING"+###.#";YC!;:PRINT" mV";:GOTO 2120 2110 PRINT USING"+##.##";YC!/1000;:PRINT" V "; 2120 PRINT SPC(3):PRINT USING"+####.##";C*RSCALE!; 2130 PRINT R$;:GOSUB 3270:RETURN 2140 ' 2150 '***** F9/F10 SELECT SUBROUTINES******************* 2160 ' 2170 EROR=FALSE:COUNT=0 2180 X$=INKEY$:IF X$<>"" THEN GOTO 2180 2190 ON POINTER(PNT,2) GOSUB 2210,2220,2230,2230,2240,2250,2250,2260,2260,2260 2200 GOTO 2270 2210 PUT (POINTER(PNT,0),POINTER(PNT,1)),BLANK1,XOR:RETURN 2220 PUT (POINTER(PNT,0),POINTER(PNT,1)),BLANK2,XOR:RETURN 2230 PUT (POINTER(PNT,0),POINTER(PNT,1)),BLANK3,XOR:RETURN 2240 PUT (POINTER(PNT,0),POINTER(PNT,1)),BLANK5,XOR:RETURN 2250 PUT (POINTER(PNT,0),POINTER(PNT,1)),BLANK6,XOR:RETURN 2260 PUT (POINTER(PNT,0),POINTER(PNT,1)),BLANK8,XOR:RETURN 2270 IF X=10 THEN PNT=PNT+1:IF PNT>13 THEN PNT=0 2280 IF X=9 THEN PNT=PNT-1:IF PNT<0 THEN PNT=13 2290 ON POINTER(PNT,2) GOSUB 2210,2220,2230,2230,2240,2250,2250,2260,2260,2260 2300 X$="":GOSUB 3270:IF X$="" THEN RETURN 1280 2310 IF ASC(RIGHT$(X$,1))-58=X THEN GOTO 2170 :ELSE RETURN 1280 2320 ' 2330 '*****UP/DOWN ARROW SUBROUTINES******************* 2340 ' 2350 ARROW=1:GOTO 2370 2360 ARROW=-1 2370 PUT(0,161),BLANK8,PRESET:X$="":IF MODE<5 THEN GOSUB 1840 2380 CMDCNT=0:COUNT=1:EROR=FALSE:T!=.3:RETURN 2390 2390 ON POINTER(PNT,2) GOSUB 2210,2220,2230,2230,2240,2250,2250,2260,2260,2260 2400 GOSUB 3270 2410 ON PNT+1 GOTO 2420,2440,2460,2510,2570,2590,2610,2660,2940,2720,2770,2790,2810,2900 2420 COMAND=Y1COUPLG:Y1COUP=Y1COUP+1:Y1COUP=Y1COUP MOD 5:IF Y1COUP=3 THEN Y1COUP=4 2430 CMDCNT=CMDCNT+1:GOTO 3030 2440 INVERTY1=NOT INVERTY1:IF MODE<5 THEN GOSUB 1840 2450 CMDCNT=0:GOTO 3030 2460 IF ARROW=-1 THEN COMAND=Y1SENDN :ELSE COMAND=Y1SENUP 2470 Y1SEN=Y1SEN-ARROW:IF Y1SEN>9 THEN Y1SEN=9 2480 IF Y1SEN<0 THEN Y1SEN=0 2490 CMDCNT=CMDCNT+1:IF CMDCNT>9 THEN CMDCNT=9 2500 GOTO 3030 2510 COMAND=Y1POS:IF COUNT>15 THEN COUNT=15 2520 OFFSETY1=OFFSETY1+ARROW*COUNT 2530 IF OFFSETY1>=127 THEN OFFSETY1=127:GOTO 2550 2540 IF OFFSETY1=<-128 THEN OFFSETY1=-128 2550 Y=OFFSETY1:IF MODE<5 THEN GOSUB 1840 2560 GOTO 3030 2570 COMAND=Y2COUPLG:Y2COUP=Y2COUP+1:Y2COUP=Y2COUP MOD 5:IF Y2COUP=3 THEN Y2COUP=4 2580 CMDCNT=CMDCNT+1:GOTO 3030 2590 INVERTY2=NOT INVERTY2:IF MODE<5 THEN GOSUB 1840 2600 CMDCNT=0:GOTO 3030 2610 IF ARROW=-1 THEN COMAND=Y2SENDN :ELSE COMAND=Y2SENUP 2620 Y2SEN=Y2SEN-ARROW:IF Y2SEN>9 THEN Y2SEN=9 2630 IF Y2SEN<0 THEN Y2SEN=0 2640 CMDCNT=CMDCNT+1:IF CMDCNT>9 THEN CMDCNT=9 2650 GOTO 3030 2660 COMAND=Y2POS:IF COUNT>15 THEN COUNT=15 2670 OFFSETY2=OFFSETY2+ARROW*COUNT 2680 IF OFFSETY2>=127 THEN OFFSETY2=127:GOTO 2700 2690 IF OFFSETY2=<-128 THEN OFFSETY2=-128 2700 Y=OFFSETY2:IF MODE<5 THEN GOSUB 1840 2710 GOTO 3030 2720 IF ARROW=-1 THEN COMAND=TBASEDN :ELSE COMAND=TBASEUP 2730 RATE=RATE-ARROW:IF RATE>28 THEN RATE=28 2740 IF RATE<0 THEN RATE=0 2750 CMDCNT=CMDCNT+1:IF CMDCNT>28 THEN CMDCNT=28 2760 GOTO 3030 2770 COMAND=TRIGSCR:SOURCE=SOURCE+1:SOURCE=SOURCE MOD 2 2780 CMDCNT=CMDCNT+1:GOTO 3030 2790 COMAND=TRIGSLP:SLOPE=SLOPE+1:SLOPE=SLOPE MOD 2 2800 CMDCNT=CMDCNT+1:GOTO 3030 2810 COMAND=TRGLVL:IF COUNT>10 THEN COUNT=10 2820 IF SOURCE=1 THEN LOFF=OFFSETY1 :ELSE LOFF=OFFSETY2 2830 Y=182.4-(LEVEL+LOFF)*4/5:IF Y>0 AND Y<160 AND CMDCNT<>0 THEN PUT(1,Y),TMARK,XOR 2840 LEVEL=LEVEL+ARROW*COUNT 2850 IF LEVEL<1 THEN LEVEL=1 2860 IF LEVEL>255 THEN LEVEL=255 2870 CMDCNT=1:T!=.6 2880 Y=182.4-(LEVEL+LOFF)*4/5:IF Y>0 AND Y<160 THEN PUT(1,Y),TMARK,XOR 2890 Y=LEVEL:GOTO 3030 2900 COMAND=TRIGMDE:IF MODE>4 THEN Y=8 :ELSE Y=0 2910 MODE=MODE+1:MODE=MODE MOD 5:IF MODE=0 THEN MODE=1 2920 IF MODE=3 THEN MODE=4 2930 MODE=MODE+Y:CMDCNT=CMDCNT+1:GOTO 3030 2940 IF COUNT>25 THEN COUNT=25 2950 HOFFSET=HOFFSET+ARROW*COUNT 2960 IF HOFFSET<-500 THEN HOFFSET=-500 2970 IF HOFFSET>500 THEN HOFFSET=500 2980 IF MODE<5 THEN GOSUB 1840 2990 IF HOFFSET<0 THEN PUT(600,64),ARROWL,PSET :ELSE PUT(600,64),ARROWR,PSET 3000 IF HOFFSET=0 THEN PUT(600,64),ARROWL,OR 3010 CMDCNT=0 3020 GOTO 3040 3030 ON PNT+1 GOSUB 3830,3830,3830,3830,3920,3920,3920,3920,3830,4000,4030,4030,4060,4030 3040 T0!=TIMER 3050 GOSUB 3270:IF X$<>"" THEN GOTO 3070 3060 IF T0!+T!>TIMER THEN GOTO 3050 :ELSE FAST=FALSE:GOTO 3130 3070 IF ASC(RIGHT$(X$,1))-58<>X THEN GOTO 3130 3080 GOSUB 3270:X$="":T0!=TIMER:KBD=0 3090 GOSUB 3280:IF KBD>1 THEN GOTO 3110 :ELSE IF T0!+.18>TIMER THEN GOTO 3090 3100 COUNT=1:FAST=FALSE:GOTO 2410 3110 COUNT=COUNT*3:IF COUNT>50 THEN COUNT=50 3120 FAST=TRUE:GOTO 2410 3130 ON POINTER(PNT,2) GOSUB 2210,2220,2230,2230,2240,2250,2250,2260,2260,2260 3140 IF PNT=3 OR PNT=7 OR PNT=12 THEN GOTO 3170 3150 FOR I=1 TO CMDCNT:X!=TIMER:CALL SEND!(COMAND,COMM) 3160 IF X!+.1>TIMER THEN GOTO 3160 :ELSE NEXT I:GOTO 3200 3170 X!=TIMER:CALL SEND!(COMAND,COMM) 3180 IF X!+.1>TIMER THEN GOTO 3180 :ELSE CALL SEND!(Y,COMM) 3190 IF X!+.2>TIMER THEN GOTO 3190 3200 COMAND=0:COUNT=0:CMDCNT=0 3210 IF PNT=1 OR PNT=3 OR PNT=5 OR PNT=7 OR PNT=8 THEN GOTO 3230 3220 WATE=FALSE:AVGCNT=0 3230 IF PNT=8 OR PNT=1 OR PNT=5 THEN GOTO 1280 3240 IF PNT<>3 AND PNT<>7 THEN GOTO 1200 :ELSE X=OFFSETY1:Y=OFFSETY2 3250 CALL REQFRT!(Y1SEN,Y2SEN,Y1COUP,Y2COUP,SLOPE,MODE,SOURCE,LEVEL,RATE,SAVMEM,SCOPE,OFFSETY1,OFFSETY2,COMM,EROR) 3260 IF X<>OFFSETY1 OR Y<>OFFSETY2 THEN GOTO 1200 :ELSE GOTO 1280 3270 Y$=INKEY$:IF Y$="" THEN RETURN :ELSE X$=Y$:GOTO 3270 3280 Y$=INKEY$:IF Y$="" THEN RETURN :ELSE X$=Y$:KBD=KBD+1:GOTO 3280 3290 ' 3300 '*****LEFT/RIGHT ARROW SUBROUTINES**************** 3310 ' 3320 ARROW=1:GOTO 3340 3330 ARROW=-1 3340 PUT(0,161),BLANK8,PRESET 3350 COUNT=1:EROR=FALSE:IF PNT=8 THEN GOSUB 2230:RETURN 3360 :ELSE RETURN 3360 3360 IF PNT<>8 THEN GOTO 3440 3370 IF COUNT>25 THEN COUNT=25 3380 HOFFSET=HOFFSET+ARROW*COUNT 3390 IF HOFFSET<-500 THEN HOFFSET=-500 3400 IF HOFFSET>500 THEN HOFFSET=500 3410 IF HOFFSET<0 THEN PUT(600,64),ARROWL,PSET :ELSE PUT(600,64),ARROWR,PSET 3420 IF HOFFSET=0 THEN PUT(600,64),ARROWL,OR 3430 GOTO 3580 3440 IF COUNT>25 THEN COUNT=25 3450 IF CURSOR<>2 AND C1Y=3 THEN LOCATE 24,10:PRINT"CURSOR #1 IS OFF";:GOTO 3710 3460 IF CURSOR<>1 AND C2Y=3 THEN LOCATE 24,10:PRINT"CURSOR #2 IS OFF";:GOTO 3710 3470 IF CURSOR<>2 THEN C1=C1+COUNT*ARROW :ELSE GOTO 3500 3480 IF C1<0 THEN C1=500 3490 IF C1>500 THEN C1=0 3500 IF CURSOR<>1 THEN C2=C2+COUNT*ARROW :ELSE GOTO 3530 3510 IF C2<0 THEN C2=500 3520 IF C2>500 THEN C2=0 3530 X1=-1:X2=-1:X3=-1:X4=-1 3540 IF C1Y=1 AND Y1COUP<>0 THEN X1=C1 3550 IF C2Y=1 AND Y1COUP<>0 THEN X2=C2 3560 IF C1Y=2 AND Y2COUP<>0 THEN X3=C1 3570 IF C2Y=2 AND Y2COUP<>0 THEN X4=C2 3580 X$="":IF MODE<5 THEN GOSUB 1840 3590 T0!=TIMER 3600 GOSUB 3270:IF X$<>"" THEN GOTO 3620 3610 IF T0!+.3>TIMER THEN GOTO 3600 :ELSE FAST=FALSE:GOTO 3690 3620 IF ASC(RIGHT$(X$,1))-58<>X THEN GOTO 3690 3630 GOSUB 3270:X$="":T0!=TIMER:KBD=0 3640 GOSUB 3280:IF KBD>1 THEN GOTO 3660 :ELSE IF T0!+.18>TIMER THEN GOTO 3640 3650 COUNT=1:FAST=FALSE:GOTO 3670 3660 COUNT=COUNT*3 3670 IF PNT=8 THEN FAST=TRUE 3680 GOTO 3360 3690 IF PNT=8 THEN GOSUB 2230 3700 COUNT=0:FAST=FALSE:GOTO 1280 3710 LOCATE 24,10:MT!=TIMER+1:GOSUB 7830:PRINT SPC(17):X$="":GOSUB 3270:GOTO 3690 3720 ' 3730 '*****REQUEST FRONT PANEL SUBROUTINE************** 3740 ' 3750 PUT(0,161),BLANK8,PRESET:COUNT=0:GOSUB 3270 3760 CALL REQFRT!(Y1SEN,Y2SEN,Y1COUP,Y2COUP,SLOPE,MODE,SOURCE,LEVEL,RATE,SAVMEM,SCOPE,OFFSETY1,OFFSETY2,COMM,EROR) 3770 COMAND=1:CALL SEND!(COMAND,COMM):COMAND=0:IF EROR=FALSE THEN GOTO 3790 3780 IF EROR=TRUE THEN GOTO 3760 :ELSE RETURN 3790 CALL CKUART!(COMAND,COMM,EROR) 3800 IF EROR<>0 OR COMAND<>0 THEN COMAND=0:EROR=FALSE:GOTO 3760 3810 ON ERROR GOTO 4290 3820 GOSUB 3270 3830 LOCATE 1,70:PRINT COUPLNG$(Y1COUP) 3840 LOCATE 1,74:IF INVERTY1=TRUE THEN PRINT"invert" :ELSE PRINT"normal" 3850 LOCATE 2,70:PRINT SEN$(Y1SEN) 3860 LOCATE 3,73:X!=VAL(SEN$(Y1SEN))/25*OFFSETY1 3870 IF Y1SEN=5 OR Y1SEN=6 THEN X!=X!/1000 3880 IF Y1SEN<5 THEN PRINT USING"+###.#";X!;:PRINT"mV" 3890 IF Y1SEN>5 THEN PRINT USING"+##.##";X!;:PRINT" V" 3900 IF Y1SEN=5 THEN PRINT USING"+#.###";X!;:PRINT" V" 3910 IF COUNT>0 THEN RETURN 3920 LOCATE 5,70:PRINT COUPLNG$(Y2COUP) 3930 LOCATE 5,74:IF INVERTY2=TRUE THEN PRINT"invert" :ELSE PRINT"normal" 3940 LOCATE 6,70:PRINT SEN$(Y2SEN) 3950 LOCATE 7,73:X!=VAL(SEN$(Y2SEN))/25*OFFSETY2 3960 IF Y2SEN=5 OR Y2SEN=6 THEN X!=X!/1000 3970 IF Y2SEN<5 THEN PRINT USING"+###.#";X!;:PRINT"mV" 3980 IF Y2SEN>5 THEN PRINT USING"+##.##";X!;:PRINT" V" 3990 IF Y2SEN=5 THEN PRINT USING"+#.###";X!;:PRINT" V" 4000 LOCATE 10,70:PRINT RATE$(RATE):IF COUNT>0 THEN RETURN 4010 IF HOFFSET<0 THEN PUT(600,64),ARROWL,PSET :ELSE PUT(600,64),ARROWR,PSET 4020 IF HOFFSET=0 THEN PUT(600,64),ARROWL,OR 4030 LOCATE 12,78:IF SOURCE=1 THEN PRINT"Y1" :ELSE PRINT "Y2" 4040 LOCATE 14,79:IF SLOPE=1 THEN PRINT "+" :ELSE PRINT "-" 4050 LOCATE 19,75:PRINT MODE$(MODE MOD 8):IF COUNT>0 THEN RETURN 4060 LOCATE 17,70:GOSUB 3270 4070 IF SOURCE=1 THEN TLVL!=VAL(SEN$(Y1SEN))/25*(LEVEL-128) :ELSE GOTO 4120 4080 IF Y1SEN=5 OR Y1SEN=6 THEN TLVL!=TLVL!/1000 4090 IF Y1SEN<5 THEN PRINT USING"+###.#";TLVL!;:PRINT"mV" 4100 IF Y1SEN>5 THEN PRINT USING"+##.##";TLVL!;:PRINT" V" 4110 IF Y1SEN=5 THEN PRINT USING"+#.###";TLVL!;:PRINT" V" 4120 IF SOURCE=0 THEN TLVL!=VAL(SEN$(Y2SEN))/25*(LEVEL-128) :ELSE GOTO 4180 4130 IF Y2SEN=5 OR Y2SEN=6 THEN TLVL!=TLVL!/1000 4140 IF Y2SEN<5 THEN PRINT USING"+###.#";TLVL!;:PRINT"mV" 4150 IF Y2SEN>5 THEN PRINT USING"+##.##";TLVL!;:PRINT" V" 4160 IF Y2SEN=5 THEN PRINT USING"+#.###";TLVL!;:PRINT" V" 4170 IF COUNT>0 THEN RETURN 4180 IF Y1COUP=0 AND Y2COUP=0 THEN Y1Y2=0 4190 IF Y1COUP<>0 AND Y2COUP=0 THEN Y1Y2=1 4200 IF Y1COUP=0 AND Y2COUP<>0 THEN Y1Y2=2 4210 IF Y1COUP<>0 AND Y2COUP<>0 THEN Y1Y2=3 4220 Y1SCALE!=VAL(SEN$(Y1SEN))/25:IF Y1SEN>6 THEN Y1SCALE!=1000*Y1SCALE! 4230 Y2SCALE!=VAL(SEN$(Y2SEN))/25:IF Y2SEN>6 THEN Y2SCALE!=1000*Y2SCALE! 4240 RSCALE!=VAL(RATE$(RATE))/50:R$=RIGHT$(RATE$(RATE),3) 4250 FSCALE!=1:IF RATE<6 THEN FSCALE!=.001 4260 IF RATE>14 THEN FSCALE!=1000 4270 IF RATE>23 THEN FSCALE!=1000000! 4280 ON ERROR GOTO 0:RETURN 4290 RESUME 3760 4300 ' 4310 '*****LINE/DOT GRAT ON/OFF SUBROUTINES********** 4320 ' 4340 PUT(0,161),BLANK8,PRESET 4350 GRATON=NOT GRATON:GOTO 4420 4360 IF MENU<>3 THEN GOTO 4410 :ELSE RETURN 4400 4400 OPEN"O",1,"BAUD.SAV":PRINT#1,BAUD,COMM,SCOPE:CLOSE#1:SYSTEM 4410 LYNE=NOT LYNE 4420 GOSUB 5070:EROR=FALSE:IF MODE<5 THEN GOSUB 1790 4430 X$=INKEY$:IF LEN(X$)<>0 THEN GOTO 4430 :ELSE RETURN 1280 4440 ' 4450 '*****CURSOR CONTROL SUBROUTINE******************* 4460 ' 4465 ON MENU GOTO 4470,4340,5620 4470 IF PNT=8 THEN GOSUB 2230:PNT=9:GOSUB 2250 4480 PUT(0,161),BLANK8,PRESET 4490 CURSOR=CURSOR+1:CURSOR=CURSOR MOD 3:GOSUB 5060:EROR=FALSE 4500 X$=INKEY$:IF LEN(X$)<>0 THEN GOTO 4500 :ELSE RETURN 1280 4510 ' 4520 '*****CURSOR SETUP SUBROUTINE********************* 4530 ' 4535 ON MENU GOTO 4540,4410,6740 4540 IF PNT=8 THEN GOSUB 2230:PNT=9:GOSUB 2250 4550 PUT(0,161),BLANK8,PRESET 4560 LOCATE 22,1:PRINT SPC(54):LOCATE 23,1:PRINT SPC(54):LOCATE 24,1:PRINT SPC(54) 4570 LOCATE 22,1:PRINT"CHOOSE CHANNEL FOR CURSOR C1: 1) Y1 2) Y2 3) OFF " 4580 ON C1Y GOSUB 4800,4810,4820 4590 X$=INKEY$:IF X$="" THEN GOTO 4590 4600 X=ASC(X$):IF X=13 THEN GOTO 4630 4610 X=VAL(X$):IF X<1 OR X>3 THEN BEEP:GOSUB 3270:GOTO 4570 4620 ON C1Y GOSUB 4800,4810,4820:C1Y=X:ON C1Y GOSUB 4800,4810,4820 4630 MT!=TIMER+1:GOSUB 7830 4640 LOCATE 22,1:PRINT"CHOOSE CHANNEL FOR CURSOR C2: 1) Y1 2) Y2 3) OFF " 4650 ON C2Y GOSUB 4800,4810,4820 4660 X$=INKEY$:IF X$="" THEN GOTO 4660 4670 X=ASC(X$):IF X=13 THEN GOTO 4700 4680 X=VAL(X$):IF X<1 OR X>3 THEN BEEP:GOSUB 3270:GOTO 4640 4690 ON C2Y GOSUB 4800,4810,4820:C2Y=X:ON C2Y GOSUB 4800,4810,4820 4700 MT!=TIMER+1:GOSUB 7830:LOCATE 22,1:PRINT SPC(54) 4710 GOSUB 4830 4720 GOSUB 4740:EROR=FALSE:X=4:IF MODE<5 THEN GOSUB 1790 4730 X$=INKEY$:IF LEN(X$)<>0 THEN GOTO 4730 :ELSE RETURN 1280 4740 X1=-1:X2=-1:X3=-1:X4=-1 4750 IF C1Y=1 AND Y1COUP<>0 THEN X1=C1 4760 IF C2Y=1 AND Y1COUP<>0 THEN X2=C2 4770 IF C1Y=2 AND Y2COUP<>0 THEN X3=C1 4780 IF C2Y=2 AND Y2COUP<>0 THEN X4=C2 4790 RETURN 4800 PUT(271,168),BLANK2,XOR:RETURN 4810 PUT(335,168),BLANK2,XOR:RETURN 4820 PUT(399,168),BLANK3,XOR:RETURN 4830 IF C1Y<>3 THEN LOCATE 22,6:PRINT"C1:" 4840 IF C2Y<>3 THEN LOCATE 23,6:PRINT"C2:" 4850 IF C1Y<>3 AND C2Y<>3 THEN LOCATE 24,1:PRINT"[C1-C2]:"; 4860 RETURN 4870 ' 4880 '*****CHANGE MENU SUBROUTINE********************** 4890 ' 4900 PUT(0,161),BLANK8,PRESET 4910 MENU=MENU+1:IF MENU=4 THEN MENU=1 4920 LOCATE 25,1:GOSUB 5060 4930 X$=INKEY$:IF X$<>"" THEN GOTO 4930 :ELSE RETURN 1280 4940 ' 4950 '*****SCOPE ON/OFF SUBROUTINE 4960 ' 4980 PUT(0,161),BLANK8,PRESET 4990 SCOPE=NOT SCOPE:IF SCOPE=TRUE THEN COMAND=SCOPEON 5000 IF SCOPE=FALSE THEN COMAND=SCOPEOFF 5010 CALL SEND!(COMAND,COMM):COMAND=0:GOSUB 5070 5020 X$=INKEY$:IF LEN(X$)<>0 THEN GOTO 5020 :ELSE RETURN 1280 5030 ' 5040 '*****PRINT MENU SUBROUTINE*********************** 5050 ' 5060 LOCATE 25,1:PRINT SPC(79) 5070 LOCATE 25,1:PRINT "F1:EXIT F3:ZCAL F4:RST/MAN F5:SCOPE ";SPC(24);"F8:NEXT"; 5080 LOCATE 25,49: IF MENU=1 THEN PRINT "F6:C1/C2 F7:DEF CURSOR "; 5090 IF MENU=2 THEN PRINT "F6:GRAT F7:LINE/DOT "; 5100 IF SCOPE=TRUE THEN PUT(328,192),BLANK5,XOR 5105 IF MENU=3 THEN PRINT "F6:MEMORY F7:AVERAGE ";:RETURN 5110 IF MENU=1 AND CURSOR=1 THEN PUT(408,192),BLANK2,XOR:RETURN 5120 IF MENU=1 AND CURSOR=2 THEN PUT(432,192),BLANK2,XOR:RETURN 5130 IF MENU=1 THEN PUT(408,192),BLANK5,XOR:RETURN 5150 IF GRATON=TRUE THEN PUT(408,192),BLANK4,XOR 5160 IF LYNE=TRUE THEN PUT(496,192),BLANK4,XOR :ELSE PUT(536,192),BLANK3,XOR 5170 RETURN 5180 ' 5190 '*****RE-ZERO MANUAL TRIGGER/RESET SUBROUTINES************ 5200 ' 5210 AVGCNT=0:WATE=FALSE 5220 PUT(0,161),BLANK8,PRESET 5230 CALL SEND!(REZERO,COMM):GOSUB 5430 5240 X$=INKEY$:IF LEN(X$)<>0 THEN GOTO 5240 :ELSE RETURN 1200 5250 PUT(0,161),BLANK8,PRESET 5260 IF MODE<4 THEN CALL SEND!(MANTRG,COMM):RETURN 5270 ON POINTER(PNT,2) GOSUB 2210,2220,2230,2230,2240,2250,2250,2260,2260,2260 5280 GOSUB 3750 5290 ON POINTER(PNT,2) GOSUB 2210,2220,2230,2230,2240,2250,2250,2260,2260,2260 5300 IF MODE=12 THEN GOTO 5370 5310 IF AVGCNT>=AVGNUM THEN RETURN 5320 X!=TIMER:CALL SEND!(REZERO,COMM):MODE=12 5330 IF X!+.1>TIMER THEN GOTO 5330 5340 CALL SEND!(RSTREQ,COMM):WATE=TRUE:LOCATE 20,66:PRINT" armed " 5350 CALL GRAT!(GRATON) 5360 X$=INKEY$:IF LEN(X$)<>0 THEN GOTO 5360 :ELSE RETURN 1400 5370 X!=TIMER:CALL SEND!(RSTREQ,COMM) 5380 IF X!+.1>TIMER THEN GOTO 5380 5390 CALL SEND!(MANTRG,COMM):MODE=4:GOTO 5350 5400 ' 5410 '*****RIGHT SIDE SUBROUTINE*********************** 5420 ' 5430 ON POINTER(PNT,2) GOSUB 2210,2220,2230,2230,2240,2250,2250,2260,2260,2260 5440 LOCATE 1,65:PRINT"Y1:":LOCATE 1,73:PRINT"(":LOCATE 1,80:PRINT")" 5450 LOCATE 2,77:PRINT"/div":LOCATE 3,66:PRINT"Offset:" 5460 LOCATE 5,65:PRINT"Y2:":LOCATE 5,73:PRINT"(":LOCATE 5,80:PRINT")" 5470 LOCATE 6,77:PRINT"/div":LOCATE 7,66:PRINT"Offset:":LOCATE 9,65:PRINT"TIMEBASE:" 5480 PUT(600,64),ARROWL,OR:PUT(600,64),ARROWR,OR:LOCATE 10,77:PRINT"/div" 5490 LOCATE 12,65:PRINT"TRIG SOURCE:" 5500 LOCATE 14,65:PRINT"TRIG SLOPE: (":LOCATE 14,80:PRINT")" 5510 LOCATE 16,65:PRINT"TRIG LEVEL:":LOCATE 19,65:PRINT"TRIG MODE:" 5520 LOCATE 20,65:PRINT SPC(16) 5530 ON POINTER(PNT,2) GOSUB 2210,2220,2230,2230,2240,2250,2250,2260,2260,2260 5540 IF AVGY1<>TRUE AND AVGY2<>TRUE THEN RETURN 5550 LOCATE 21,20:PRINT"average #";AVGCNT,"press F3 to restart averaging" 5560 IF AVGY1=TRUE THEN LOCATE 2,64:PRINT "avg" :ELSE PRINT" " 5570 IF AVGY2=TRUE THEN LOCATE 6,64:PRINT "avg" :ELSE PRINT" " 5580 RETURN 5590 ' 5600 '*****MEMORY SUBROUTINE*************************** 5610 ' 5620 LOCATE 25,1:PRINT SPC(79):X1=-1:X2=-1:X3=-1:X4=-1 5630 PUT(0,161),BLANK8,PRESET 5640 RETURN 5650 5650 LOCATE 22,1:PRINT"SELECTION: 1) SAVE WAVEFORM ON DISK";:PRINT SPC(16) 5660 LOCATE 23,1:PRINT SPC(13);"2) RECALL WAVEFORM FROM DISK";:PRINT SPC(12) 5670 LOCATE 24,1:PRINT SPC(13);"3) MEMORY ON/OFF";:PRINT SPC(24) 5680 GOSUB 6680 5690 X$=INKEY$:IF X$="" THEN GOTO 5690 5700 IF ASC(RIGHT$(X$,1))=64 THEN GOSUB 6650 5710 X=VAL(X$):LOCATE 22,1:PRINT SPC(54):PRINT:PRINT SPC(54):PRINT:PRINT SPC(54) 5720 ON X GOTO 6000,6000,5740 5730 BEEP:GOSUB 3270:GOTO 5650 5740 LOCATE 22,1:PRINT"MEM1: 1) ON ":LOCATE 23,8:PRINT"2) OFF ":GOSUB 5830 5750 X$=INKEY$:IF X$="" THEN GOTO 5750 5760 IF ASC(RIGHT$(X$,1))=64 THEN GOSUB 6650 5770 X=ASC(X$):IF X=13 THEN GOTO 5850 5780 X=VAL(X$):IF X<1 OR X>2 THEN BEEP:GOSUB 3270:GOTO 5740 5790 GOSUB 5830:IF X=1 AND MEM1$="" THEN MEM1=FALSE:LOCATE 24,1:PRINT"ERROR....Data has not been loaded into MEM1";:MT!=TIMER+3:GOSUB 7830:LOCATE 24,1:PRINT SPC(54) 5800 GOSUB 6680 5810 IF X=1 AND MEM1$<>"" THEN MEM1=TRUE :ELSE MEM1=FALSE 5820 GOSUB 5830:MT!=TIMER+1:GOSUB 7830:GOTO 5850 5830 IF MEM1=TRUE THEN PUT(79,168),BLANK2,XOR :ELSE PUT(79,176),BLANK3,XOR 5840 RETURN 5850 LOCATE 22,1:PRINT"MEM2: 1) ON ":LOCATE 23,8:PRINT"2) OFF ":GOSUB 5980 5860 X$=INKEY$:IF X$="" THEN GOTO 5860 5870 IF ASC(RIGHT$(X$,1))=64 THEN GOSUB 6650 5880 X=ASC(X$):IF X=13 THEN GOTO 5930 5890 X=VAL(X$):IF X<1 OR X>2 THEN BEEP:GOSUB 3270:GOTO 5850 5900 GOSUB 5980:IF X=1 AND MEM2$="" THEN MEM2=FALSE:LOCATE 24,1:PRINT"ERROR....Data has not been loaded into MEM2";:MT!=TIMER+3:GOSUB 7830:LOCATE 24,1:PRINT SPC(54) 5910 IF X=1 AND MEM2$<>"" THEN MEM2=TRUE :ELSE MEM2=FALSE 5920 GOSUB 5980:MT!=TIMER+1:GOSUB 7830 5930 GOSUB 5060 5940 LOCATE 22,1:PRINT SPC(54):PRINT:PRINT SPC(54) 5950 IF MEM1=FALSE THEN LOCATE 22,55:PRINT SPC(25) 5960 IF MEM2=FALSE THEN LOCATE 23,55:PRINT SPC(25) 5970 GOSUB 4710 5980 IF MEM2=TRUE THEN PUT(79,168),BLANK2,XOR :ELSE PUT(79,176),BLANK3,XOR 5990 RETURN 6000 LOCATE 22,1:PRINT"Do you wish to see the directory ? "; 6010 ON ERROR GOTO 6620 6020 X$=INKEY$:IF X$="" THEN GOTO 6020 6030 IF ASC(RIGHT$(X$,1))=64 THEN GOSUB 6650 6040 IF X$="N" OR X$="n" THEN GOTO 6190 6050 IF X$="Y" OR X$="y" THEN GOTO 6070 6060 BEEP:GOSUB 3270:GOTO 6000 6070 LOCATE 25,1:PRINT SPC(54) 6080 LOCATE 22,1:PRINT"Drive name ? ":LINE INPUT X$ 6090 PRINT" ";:LOCATE 23,1:IF X$="" THEN FILES :ELSE FILES X$ 6100 PRINT:PRINT"Press any key to continue."; 6110 X$=INKEY$:IF X$="" THEN GOTO 6110 6120 GOSUB 6680 6130 FOR I=1 TO 24:LOCATE I,1:PRINT SPC(40);SPC(40):NEXT I 6140 GOSUB 5440:GOSUB 1790 6150 ON POINTER(PNT,2) GOSUB 2210,2220,2230,2230,2240,2250,2250,2260,2260,2260 6160 GOSUB 3830 6170 ON POINTER(PNT,2) GOSUB 2210,2220,2230,2230,2240,2250,2250,2260,2260,2260 6180 ON ERROR GOTO 6620 6190 ON X GOTO 6200,6400 6200 LOCATE 22,1:PRINT"Which channel do you want to save? 1) Y1 " 6210 LOCATE 23,40:PRINT"2) Y2 " 6220 X$=INKEY$:IF X$="" THEN GOTO 6220 6230 IF ASC(RIGHT$(X$,1))=64 THEN GOSUB 6650 6240 X=VAL(X$):IF X<1 OR X>2 THEN BEEP:GOSUB 3270:GOTO 6200 6250 LOCATE 25,1:PRINT SPC(54) 6260 LOCATE 22,1:PRINT SPC(54):PRINT:PRINT SPC(54):LOCATE 22,1:PRINT"FILENAME? "; 6270 LINE INPUT X$:LOCATE 23,1:PRINT" ":OPEN "O",1,X$:GOSUB 6680:ON X GOTO 6280,6300 6280 PRINT#1,Y1SEN;RATE;INVERTY1;OFFSETY1;HOFFSET; 6290 FOR I=0 TO 511:PRINT#1,Y1(I);:NEXT I:GOTO 6320 6300 PRINT#1,Y2SEN;RATE;INVERTY2;OFFSETY2;HOFFSET; 6310 FOR I=0 TO 511:PRINT#1,Y2(I);:NEXT I 6320 CLOSE#1:ON ERROR GOTO 0 6330 LOCATE 22,1:PRINT"Would you like to save another waveform ?" 6340 X=1 6350 X$=INKEY$:IF X$="" THEN GOTO 6350 6360 IF ASC(RIGHT$(X$,1))=64 THEN GOSUB 6650 6370 IF X$="Y" OR X$="y" THEN GOTO 6000 6380 LOCATE 22,1:PRINT SPC(54):PRINT:PRINT SPC(54):PRINT:PRINT SPC(54) 6390 GOSUB 5060:GOSUB 4710 6400 LOCATE 22,1:PRINT"Which memory do you want to use? 1) MEM1 " 6410 LOCATE 23,36:PRINT"2) MEM2 " 6420 X$=INKEY$:IF X$="" THEN GOTO 6420 6430 IF ASC(RIGHT$(X$,1))=64 THEN GOSUB 6650 6440 X=VAL(X$):IF X<1 OR X>2 THEN BEEP:GOSUB 3270:GOTO 6400 6450 LOCATE 25,1:PRINT SPC(54) 6460 LOCATE 22,1:PRINT SPC(54):PRINT:PRINT SPC(54):LOCATE 22,1:PRINT"FILENAME? "; 6470 LINE INPUT X$:LOCATE 23,1:PRINT" ":OPEN "I",1,X$:GOSUB 6680:ON X GOTO 6480,6510 6480 INPUT#1,M1SEN,M1RATE,INVERTM1,OFFSETM1,HOFFSETM1 6490 FOR I=0 TO 511:INPUT#1,M1(I):NEXT I 6500 MEM1=TRUE:MEM1$=LEFT$(X$,11):GOTO 6540 6510 INPUT#1,M2SEN,M2RATE,INVERTM2,OFFSETM2,HOFFSETM2 6520 FOR I=0 TO 511:INPUT#1,M2(I):NEXT I 6530 MEM2=TRUE:MEM2$=LEFT$(X$,11) 6540 CLOSE#1:ON ERROR GOTO 0:GOSUB 1790 6550 LOCATE 22,1:PRINT"Would you like to recall another waveform ?" 6560 X=2 6570 X$=INKEY$:IF X$="" THEN GOTO 6570 6580 IF ASC(RIGHT$(X$,1))=64 THEN GOSUB 6650 6590 IF X$="Y" OR X$="y" THEN GOTO 6000 6600 LOCATE 22,1:PRINT SPC(54):PRINT:PRINT SPC(54):PRINT:PRINT SPC(54) 6610 GOSUB 5060:GOSUB 4710 6620 LOCATE 22,1:PRINT SPC(54):PRINT:PRINT SPC(54):PRINT:PRINT SPC(54) 6630 LOCATE 22,1:PRINT"DISK ERROR......Error Code: ";ERR 6640 FOR I=0 TO 3000:NEXT I:CLOSE#1:RESUME 5650 6650 LOCATE 22,1:PRINT SPC(54):PRINT:PRINT SPC(54):PRINT:PRINT SPC(54) 6660 GOSUB 5060:RETURN 6670 6670 CLOSE#1:ON ERROR GOTO 0:GOSUB 4710 6680 LOCATE 25,15:PRINT"Press F6 again to exit this function"; 6690 PUT(110,192),BLANK8,XOR:PUT(176,192),BLANK8,XOR:PUT(242,192),BLANK8,XOR 6700 PUT(308,192),BLANK8,XOR:PUT(374,192),BLANK6,XOR:RETURN 6710 ' 6720 '************AVERAGING SUBROUTINE***************** 6730 ' 6740 PUT(0,161),BLANK8,PRESET 6750 LOCATE 21,10:PRINT SPC(65):GOSUB 1790:AVGCNT=0:WATE=FALSE 6760 LOCATE 22,1:PRINT SPC(54):PRINT:PRINT SPC(54):PRINT:PRINT SPC(54) 6770 LOCATE 22,1:PRINT"Select channel to be averaged:" 6780 PRINT" 1) Y1 3) Y1 and Y2" 6790 PRINT" 2) Y2 4) AVERAGING OFF"; 6800 GOSUB 6970 6810 X$=INKEY$:IF X$="" THEN GOTO 6810 6820 IF ASC(X$)=13 THEN GOTO 6880 6830 X=VAL(X$):IF X<1 OR X>4 THEN BEEP:GOSUB 3270:GOTO 6770 6840 GOSUB 6970:IF X=1 THEN AVGY1=TRUE:AVGY2=FALSE:GOTO 6880 6850 IF X=2 THEN AVGY1=FALSE:AVGY2=TRUE:GOTO 6880 6860 IF X=3 THEN AVGY1=TRUE:AVGY2=TRUE:GOTO 6880 6870 IF X=4 THEN AVGY1=FALSE:AVGY2=FALSE:AVGCNT=-1 6880 GOSUB 6970:LOCATE 22,1:PRINT SPC(54):PRINT:PRINT SPC(54):PRINT 6890 LOCATE 24,1:PRINT SPC(54):IF AVGY1=FALSE AND AVGY2=FALSE THEN WATE=FALSE:GOTO 4710 6900 LOCATE 22,1:PRINT"Select number of averages <";:ON ERROR GOTO 7030 6910 PRINT USING"###";AVGNUM;:PRINT">";:PUT(215,168),BLANK3,XOR 6920 INPUT" ",X$:IF X$="" THEN GOTO 6960 6930 X=VAL(X$):IF X>0 AND X<251 THEN AVGNUM=X:GOTO 6960 6940 BEEP:GOSUB 3270:LOCATE 24,1:PRINT"Number of averages must be between 1 and 250"; 6950 FOR I=0 TO 3000:NEXT I:LOCATE 24,1:PRINT SPC(54):GOTO 6880 6960 ON ERROR GOTO 0:LOCATE 22,1:PRINT SPC(54):WATE=FALSE:GOSUB 5430:GOTO 4710 6970 LOCATE 2,64:IF AVGY1=TRUE THEN PRINT"avg" :ELSE PRINT" " 6980 LOCATE 6,64:IF AVGY2=TRUE THEN PRINT"avg" :ELSE PRINT" " 6990 IF AVGY1=TRUE AND AVGY2=TRUE THEN PUT(215,176),BLANK6,XOR:PUT(265,176),BLANK3,XOR:RETURN 7000 IF AVGY1=FALSE AND AVGY2=FALSE THEN PUT(215,184),BLANK8,XOR:PUT(281,184),BLANK5,XOR:RETURN 7010 IF AVGY1=TRUE THEN PUT(103,176),BLANK2,XOR:RETURN 7020 PUT(103,184),BLANK2,XOR:RETURN 7030 RESUME 6940 7040 RETURN 7800 ' 7810 '*** TIMER ROUTINE 7820 LOCATE 25,1:PRINT ""; 7830 XTX$=INKEY$:T!=TIMER:IF (T!