SCREEN 12 DIM yamplifier AS SINGLE, amplitude AS SINGLE, frequency AS SINGLE, timebase AS SINGLE DIM voltage AS SINGLE, time AS SINGLE, gridx AS SINGLE, gridy AS SINGLE REM DIM screenx AS INTEGER, screeny AS INTEGER DIM scrny(1000) AS INTEGER DIM s(5) AS INTEGER, c(5) AS INTEGER DIM fcnname(10) AS STRING pi = 3.1415927# xoffset = 0 yoffset = 0 invert = -1 rectify = -1 truncate = -1 yamplifier = 1 amplitude = 1 frequency = 1000 timebase = .001 divwidth = 10 halfdivwidth = divwidth / 2 divheight = 8 halfdivheight = divheight / 2 pixelsperdiv = 40 yperx = 1 doff = pixelsperdiv / 5 / yamplifier REM pixelsperdiv = 10 FOR i = 1 TO 5 s(i) = 0 c(i) = 0 NEXT i s(1) = 1 s(2) = 1 s(4) = 1 fcn = 1 fcnname(1) = "Direct Current" fcnname(2) = "Sine Wave " fcnname(3) = "Square Wave " fcnname(4) = "Triangle Wave " fcnname(5) = "Complex Wave " gridcolor = 1 plotcolor = 2 sweep = 1 TRUE = 1 FALSE = 0 redraw = TRUE DO screenwidth = divwidth * pixelsperdiv screenheight = divheight * pixelsperdiv IF redraw = TRUE THEN CLS REM LINE (0, 0)-(screenwidth, screenheight), 0, BF xtextloc = 52 ytextloc = 1 LOCATE ytextloc, xtextloc PRINT "Simulation of an Oscilloscope" LOCATE ytextloc + 1, xtextloc PRINT "vari- multiplier key" LOCATE ytextloc + 2, xtextloc PRINT "able /10 /2 *2 *10 value" LOCATE ytextloc + 3, xtextloc PRINT "v/div 1 2 3 4 "; yamplifier LOCATE ytextloc + 4, xtextloc PRINT "ms/div q w e r "; timebase * 1000 LOCATE ytextloc + 5, xtextloc PRINT "amp a s d f "; amplitude LOCATE ytextloc + 6, xtextloc PRINT "freq z x c v "; frequency LOCATE ytextloc + 7, xtextloc PRINT "function: "; fcnname(fcn) LOCATE ytextloc + 8, xtextloc PRINT "Press Enter to display wave" LOCATE ytextloc + 9, xtextloc PRINT "Press p to play frequency" LOCATE ytextloc + 10, xtextloc PRINT "Press t to invert" LOCATE ytextloc + 11, xtextloc PRINT "Press y to rectify" LOCATE ytextloc + 12, xtextloc PRINT "Press n to truncate" LOCATE ytextloc + 13, xtextloc PRINT "Press = to magnify screen" LOCATE ytextloc + 14, xtextloc PRINT "Press - to shrink screen" LOCATE ytextloc + 15, xtextloc PRINT "Press i,j,k,l for offsets" LOCATE ytextloc + 16, xtextloc PRINT "Press \ to turn off sweep" LOCATE ytextloc + 17, xtextloc PRINT "Press / to change functions" 'PRINT "Press 6/7 to cycle fcn 1" LOCATE ytextloc + 18, xtextloc PRINT "Press Esc to quit" ' ' draw lines around chart ytop = ytextloc * 16 ybottom = ytop + 96 FOR i = 0 TO 6 IF i <> 1 THEN LINE (405, yperx * (ytop + i * 16))-(630, yperx * (ytop + i * 16)), gridcolor NEXT i LINE (405, yperx * ytop)-(405, yperx * ybottom), gridcolor LINE (455, yperx * ytop)-(455, yperx * ybottom), gridcolor LINE (575, yperx * ytop)-(575, yperx * ybottom), gridcolor LINE (630, yperx * ytop)-(630, yperx * ybottom), gridcolor ' twopifrequency = 2! * pi * frequency IF redraw = TRUE THEN ' draw grid FOR i = 0 TO divwidth LINE (i * pixelsperdiv, 0)-(i * pixelsperdiv, yperx * screenheight), gridcolor ' draw horizontal ticks IF i < divwidth THEN FOR j = 1 TO 4 PSET ((i + j / 5) * pixelsperdiv, yperx * (screenheight / 2 - 2.4 * pixelsperdiv)), gridcolor PSET ((i + j / 5) * pixelsperdiv, yperx * (screenheight / 2 + 2.4 * pixelsperdiv)), gridcolor LINE ((i + j / 5) * pixelsperdiv, yperx * (screenheight / 2 - 5))-((i + j / 5) * pixelsperdiv, yperx * (screenheight / 2 + 5)), gridcolor NEXT j END IF NEXT i FOR i = 0 TO divheight LINE (0, yperx * i * pixelsperdiv)-(screenwidth, yperx * i * pixelsperdiv), gridcolor ' draw vertical ticks IF i < divheight THEN FOR j = 1 TO 4 LINE (screenwidth / 2 - 5, yperx * (i + j / 5) * pixelsperdiv)-(screenwidth / 2 + 5, yperx * (i + j / 5) * pixelsperdiv), gridcolor NEXT j END IF NEXT i ' set draw position to left end of screen PSET (0, screenheight / 2) ' plot curve xmid = screenwidth / 2 + xoffset * doff FOR screenx = 0 TO screenwidth ' convert screen coordinates to time grid coordinates gridx = (screenx - xoffset * doff) / pixelsperdiv - halfdivwidth time = gridx * timebase IF (fcn = 1) THEN ' DC voltage = amplitude ELSEIF (fcn = 2) THEN ' Sine voltage = amplitude * SIN(twopifrequency * time) ELSEIF (fcn = 3) THEN ' Square voltage = amplitude * SGN(ABS(2 * time * frequency MOD 2) - .5) ELSEIF (fcn = 4) THEN ' Triangle voltage = amplitude * (ABS((time * frequency * 1000) MOD 1000) / 500 - 1) * SGN(time) ELSEIF (fcn = 5) THEN ' Complex voltage = 0 x = twopifrequency * time FOR i = 1 TO 5 voltage = voltage + (s(i) * SIN(i * x) + c(i) * COS(i * x)) / i NEXT i voltage = voltage * amplitude END IF IF rectify = 1 THEN voltage = ABS(voltage) IF truncate = 1 AND voltage < 0 THEN voltage = 0 IF invert = 1 THEN voltage = -voltage gridy = voltage / yamplifier screeny = (halfdivheight - gridy) * pixelsperdiv + yoffset * doff IF sweep = 1 THEN IF screeny >= 0 AND screeny <= screenheight THEN LINE -(screenx, yperx * screeny), plotcolor ELSE PRESET (xmid, yperx * oldy) PSET (xmid, yperx * screeny), plotcolor oldy = screeny END IF REM PSET (screenx, yperx*screeny) REM scrny(screenx) = screeny NEXT screenx END IF 'redraw = TRUE DO a$ = INKEY$ IF a$ = "p" THEN IF frequency >= 37 AND frequency <= 32767 THEN SOUND frequency, 1 ELSE BEEP END IF LOOP WHILE a$ = "" OR a$ = "p" redraw = FALSE IF a$ = CHR$(13) OR (a$ >= "a" AND a$ <= "z") OR (a$ >= "0" AND a$ <= "9") OR a$ = "/" OR a$ = "\" OR a$ = "-" OR a$ = "=" THEN redraw = TRUE IF a$ = "1" THEN yamplifier = yamplifier / 10 IF a$ = "2" THEN yamplifier = yamplifier / 2 IF a$ = "3" THEN yamplifier = yamplifier * 2 IF a$ = "4" THEN yamplifier = yamplifier * 10 IF a$ = "q" THEN timebase = timebase / 10 IF a$ = "w" THEN timebase = timebase / 2 IF a$ = "e" THEN timebase = timebase * 2 IF a$ = "r" THEN timebase = timebase * 10 IF a$ = "a" THEN amplitude = amplitude / 10 IF a$ = "s" THEN amplitude = amplitude / 2 IF a$ = "d" THEN amplitude = amplitude * 2 IF a$ = "f" THEN amplitude = amplitude * 10 IF a$ = "z" THEN frequency = frequency / 10 IF a$ = "x" THEN frequency = frequency / 2 IF a$ = "c" THEN frequency = frequency * 2 IF a$ = "v" THEN frequency = frequency * 10 IF a$ = "6" THEN s(1) = s(1) - 1 IF s(1) < -1 THEN s(1) = 1 END IF IF a$ = "7" THEN c(1) = c(1) - 1 IF c(1) < -1 THEN c(1) = 1 END IF IF a$ = "/" THEN fcn = fcn + 1 IF fcn > 5 THEN fcn = 1 END IF IF a$ = "-" THEN pixelsperdiv = pixelsperdiv / 2 IF a$ = "=" THEN pixelsperdiv = pixelsperdiv * 2 doff = pixelsperdiv / 5 / yamplifier IF a$ = "t" THEN invert = -invert IF a$ = "y" THEN rectify = -rectify IF a$ = "n" THEN truncate = -truncate IF a$ = "j" THEN xoffset = xoffset - 1 IF a$ = "l" THEN xoffset = xoffset + 1 IF a$ = "i" THEN yoffset = yoffset - 1 IF a$ = "k" THEN yoffset = yoffset + 1 IF a$ = "\" THEN sweep = -sweep LOOP WHILE a$ <> CHR$(27) ' Esc SYSTEM