10 DEFine PROCedure aa
20 DELETE 'win1_progs_zippy_bas'
30 SAVE 'win1_progs_zippy_bas'
40 END DEFine aa
100 INPUT#0;'File:'!f$TO
110 CLCHP
120 :
130 chns%=4:REMark number of channels sampled
140 :
150 REMark set up inks for graphs
160 DIM ink%(3):j%=0:FOR i%=192+4*8+6,192+2*8+6,4,6:ink%(j%)=i%:j%=j%+1
170 :
180 REMark Define window areas
190 bgw%=448:bgh%=200:bgx%=32:bgy%=16
200 upw%=bgw%:uph%=bgh%DIV 5:upx%=bgx%:upy%=bgy%
210 dnw%=bgw%:dnh%=bgh%-uph%:dnx%=bgx%:dny%=bgy%+uph%
220 :
230 REMark fetch file data
240 blen=FLEN(\f$):buff=ALCHP(blen):IF buff<=0OR blen<chns%:STOP
250 LBYTES f$,buff
260 IF chns%=4AND 0
270  DIM xv%(255*2)
280  FOR i%=0TO 255:j%=LN(i%+1)*22:xv%(255-i%)=128-j%:xv%(255+i%)=128+j%
290  FOR p=buff TO buff+blen-2STEP 2:POKE p,xv%(PEEK(p)+255-PEEK(p+1))
300  END IF
310 samps%=INT(blen/chns%):REMark Actual samples per channel
320 upc%=0:upm%=-(-samps%DIV upw%):REMark round up for samples per pixel
330 dnm%=1:dnc%=(samps%-dnw%)DIV 2
340 :
350 bps=96520/9:REMark I2C measured byte transfer rate - just under max!
360 REMark The above needs tuning for memory/processor/software speed
370 sps=bps/chns%:REMark individual channel sampling rate
380 :
390 zero%=0:mark%=samps%DIV 2:text
400 REPeat rezero
410  defwin upw%,uph%,upx%,upy%,upm%,upc%:upt%=-1:uplt%=-1:uprt%=-1
420  defset winh%,0
430  FOR chn%=0TO 3:defchn chn%
440  REPeat redraw
450   dnc%=mark%-dnw%DIV 2:IF dnc%<0:dnc%=0:ELSE IF dnw%*dnm%+dnc%>samps%:dnc%=samps%-dnw%*dnm%
460   dne%=dnw%*dnm%+dnc%-1:defwin dnw%,dnh%,dnx%,dny%,dnm%,dnc%:dnt%=-1:y1%=0
470   FOR chn%=0TO 3:y0%=y1%:y1%=winh%*(chn%+1)/4:defset y1%-y0%,y0%:defchn chn%
480   WINDOW bgw%,bgh%,bgx%,bgy%:newmark
490   REPeat curslp
500    k%=CODE(INKEY$(-1)):SELect k%
510    =192TO 207:d%=2^(k%&&3):IF k%&&4:d%=d%*dnw%DIV 2
520     IF k%<200
530      IF NOT mark%:NEXT curslp
540      mark%=mark%-d%:IF mark%<0:mark%=0
550      ELSE
560      IF mark%=samps%-1:NEXT curslp
570      mark%=mark%+d%:IF mark%>=samps%:mark%=samps%-1
580      END IF
590     IF mark%<dnc%OR dne%<mark%:NEXT redraw
600     newmark
610    =32:NEXT redraw
620    =10:IF zero%<>mark%:t%=zero%:zero%=mark%:mark%=t%:NEXT rezero
630    =27:EXIT rezero
640    =44,60:IF dnm%>1:dnm%=dnm%-1:NEXT redraw
650    =46,62:IF dnm%<upm%:dnm%=dnm%+1:NEXT redraw
660    =50,114:RUN
670    =52,116:text
680    =REMAINDER :help:END SELect
690    END REPeat curslp
700   END REPeat redraw
710  END REPeat rezero
720 CLCHP
730 :
740 DEFine PROCedure help:CLS#0
750  PRINT#0;,' to move, ALT/CTRL/SHIFT go progressively faster.'
760  PRINT#0;,'Space bar centre cursor. ENTER swaps cursor & zero.'
770  PRINT#0;,'t = show text (_txt).    r = restart with new file.'
780  PRINT#0;,'<> to zoom in/out lower display.  ESC to terminate.'
790  END DEFine
800 :
810 DEFine PROCedure newmark:LOCal upu%,uplu%,upru%,dnu%,j%
820  upu%=(mark%-upc%)DIV upm%:IF upu%<0OR upu%>=samps%:upu%=-1
830  uplu%=(dnc%-upc%)DIV upm%:IF uplu%<0:uplu%=-1
840  upru%=(dnc%-upc%+dnm%*(dnw%-1)-1)DIV upm%+1:IF upru%>=samps%:upru%=-1
850  IF mark%<dnc%OR dne%<mark%:dnu%=-1:ELSE dnu%=(mark%-dnc%)DIV dnm%
860  IF upu%=upt%AND uplu%=uplt%AND upru%=uprt%AND dnu%=dnt%:RETurn
870  OVER-1
880  IF upu%<>upt%:FOR j%=upu%,upt%:IF j%>=0:BLOCK 1,uph%-10,j%,upy%-bgy%,0,7
890  IF uplu%<>uplt%:FOR j%=uplu%,uplt%:IF j%>=0:BLOCK 1,uph%-10,j%,upy%-bgy%,0,7
900  IF upru%<>uprt%:FOR j%=upru%,uprt%:IF j%>=0:BLOCK 1,uph%-10,j%,upy%-bgy%,0,7
910  IF dnu%<>dnt%:FOR j%=dnu%,dnt%:IF j%>=0:BLOCK 1,dnh%-10,j%,dny%-bgy%,0,7
920  OVER 0:upt%=upu%:uplt%=uplu%:uprt%=upru%:dnt%=dnu%
930  PRINT#0;\unit$((mark%-zero%)/sps)&'s';
940  IF dnt%<0:RETurn
950  FOR j%=1TO chns%:PRINT#0;TO 14*j%;unit$(PEEK(buff+mark%*chns%+j%-1)*5/255)&'v';
960  END DEFine
970 :
980 DEFine FuNction unit$(v):LOCal a:a=ABS(v):IF a>=1OR NOT a:RETurn v
990  IF a>=1E-3:RETurn (v*1000)&'m'
1000  IF a>=1E-6:RETurn (v*1E6)&'u'
1010  RETurn (v*1E9)&'n':END DEFine
1020 :
1030 DEFine PROCedure defwin(w%,h%,x%,y%,m%,c%)
1040  LOCal j%,k%,l%,s%,s,t,t0,t1,u0,u1,v0,v1,sm%,sn%,smn%,lp
1050  winw%=w%:winh%=h%-10:winx%=x%:winy%=y%
1060  WINDOW w%,h%,x%,y%:PAPER 0:INK 7:CLS
1070  s=m%*w%/sps:t0=(c%-zero%)/sps:t1=t0+s
1080  j%=LOG10(s)*3
1090  REPeat lp
1100   s%='125'(j%MOD 3+1):s=10^(j%DIV 3)*s%
1110   u0=t0/s:v0=-INT(-u0):u1=t1/s:v1=INT(u1)
1120   sn%=v1-v0:IF sn%>0:EXIT lp
1130   j%=j%-1:END REPeat lp
1140  sm%=(s%=2)*5+5:smn%=sm%*sn%
1150  FOR j%=-sm%TO smn%+sm%
1160   t=(v1*j%+v0*(smn%-j%))/smn%
1170   k%=(t-u0)/(u1-u0)*(w%-1)
1180   IF 0<=k%AND k%<w%
1190    BLOCK 1,(j%MOD sm%=5)*5+winh%,k%,0,2,0
1200    IF j%MOD sm%=0
1210     t=t*s:t$=t:IF 'e'INSTR t$:IF t<0:t$='-'&(t-1)(3TO):ELSE t$=(t+1)(2TO)
1220     l%=LEN(t$)*6:k%=k%-l%DIV 2:IF k%<0:k%=0:ELSE IF k%>w%-l%:k%=w%-l%
1230     CURSOR k%,winh%:PRINT t$;:END IF :END IF
1240   END FOR j%:winm%=m%:winc%=c%:END DEFine
1250 :
1260 DEFine PROCedure defset(h%,y%):LOCal j%
1270  WINDOW winw%,h%,winx%,winy%+y%
1280  FOR j%=0TO 5STEP (h%<=20)*4+1:BLOCK winw%,1,0,(h%-1)*j%/5,2,0
1290  grh%=h%:END DEFine
1300 :
1310 DEFine PROCedure defchn(chn%)
1320  INK ink%(chn%):PIXDRAW winm%,chns%,buff,blen,winc%*chns%+chn%
1330  END DEFine
1340 :
1350 DEFine PROCedure text:LOCal lp,a$,b$,i%,j%:RETurn :CLS#0:OPEN_IN#3;f$&'_txt':a$=' '&f$&' '
1360  REPeat lp
1370   i%='  'INSTR a$:IF i%:a$=a$(1TO i%-1)&a$(i%+1TO):NEXT lp
1380   IF LEN(a$)>302OR EOF(#3):EXIT lp
1390   INPUT#3;b$:a$=a$&b$&' ':END REPeat lp
1400  FOR j%=0TO 3
1410   IF LEN(a$)<76:PRINT#0;!a$(2TO LEN(a$)-1);:RETurn
1420   IF NOT' 'INSTR a$(2TO 75)
1430    PRINT#0;a$(2TO 75):a$=a$(75TO)
1440    ELSE
1450    FOR i%=75TO 2STEP -1:IF a$(i%)=' ':PRINT#0;!a$(2TO i%-1);:a$=a$(i%TO):EXIT i%
1460    END IF :END FOR j%:CLOSE#3:END DEFine
1470 :
