10 REM Explore ZX Channels and Streams on Next 20 REM Copyright 2020 Simon N Goodwin, CC-NC-AS 30 PROC STREAMS() 40 PROC CHANS() 50 PROC TEST() 70 STOP 80 85 REM Capture output of dot commands in a string 86 REM also tests POKESTRING and PEEKSTRING on LAYER 0 90 DEFPROC TEST() 100 DIM v$(264) 101 PROC POKESTRING(19990,"TEST") 102 PROC FREESTREAM() TO s 103 IF s>15 THEN STOP 110 OPEN # s,"V>v$" 112 PROC PEEKSTRING(19990,4) TO t$ 113 PRINT #s,t$ 115 PROC DIVERT(s) 120 .i2cscan 122 .date 124 .time 130 PROC REVERT() 140 PRINT 'v$ 150 ENDPROC 160 540 REM Return lowest open stream number 4..15 550 REM or 999 if all streams are already open 560 DEFPROC FREESTREAM() 565 LOCAL c,p,t 567 LET t=%c: LET c=999 570 FOR %c=4 TO 15 580 LET p=% DPEEK ((c+3)*2+23568) 590 IF p=0 THEN LET c=%c: LET %c=999 600 NEXT %c 605 IF p<>0 THEN PRINT "No free streams" 607 LET %c=t 610 ENDPROC =c 620 : 750 REM List currently active channels 760 DEFPROC CHANS() 765 LOCAL chans,prog,c,q 770 LET chans=% DPEEK 23631 780 LET prog=% DPEEK 23635 785 LET q=%c: REM Preserve static global 790 REM PRINT "Chans=";chans,"Prog=";prog 795 PRINT '"Channel","In, Out" 800 FOR %c=chans TO prog-5 STEP 5 805 LET c=% PEEK (4+c): REM c <> %c! 807 IF c<32 OR c>127 THEN LET c=127 810 PRINT ""; CHR$ c;"",% DPEEK c;", ";% DPEEK (c+2) 820 NEXT %c 825 LET %c=q 830 ENDPROC 840 845 REM List open streams and the channels they connect to 850 DEFPROC STREAMS() 851 LOCAL c,chans,p,q,t 852 LET chans=% DPEEK 23631 855 LET q=%c: REM Preserve static global 857 FOR c=-3 TO 15 860 LET %c=c 865 PRINT "Stream #";(" " AND c<10 AND c>=0)+ STR$ c; 870 LET p=% DPEEK ((c+3)*2+23568) 875 PRINT " at "; p, 880 IF p=0 THEN PRINT "CLOSED" 885 IF p THEN LET t= PEEK (p+chans+3): IF t>31 THEN PRINT CHR$ t 890 NEXT c 895 LET %c=q 900 ENDPROC 910 915 REM Divert default output (stream 2) to stream st 917 REM N.B. This stores state for REVERT in %c and %q 920 DEFPROC DIVERT(st) 925 LOCAL p 930 IF st<0 OR st>15 THEN PRINT "No such stream ";st: STOP 945 LET %c=st 950 LET p=% DPEEK ((c+3)*2+23568): REM Get offset from STRMS 960 IF p=0 THEN PRINT "#";st;" is not open": STOP 965 LET %q=% DPEEK 23578 970 REM PRINT "Target was ";p,%q 980 DPOKE 23578,p 990 ENDPROC 999 1000 DEFPROC REVERT() 1005 IF %q=0 THEN PRINT "DIVERT before REVERT": STOP 1007 IF %c>15 THEN PRINT "No such stream ";%c: STOP 1010 DPOKE 23578,%q 1012 LET %q=0 1015 CLOSE # %c 1020 ENDPROC 1030 8000 REM PEEKSTRING for RAM only, uses end+1 temporarily 8010 REM Written before PEEK$ to test the M channel 8020 DEFPROC PEEKSTRING(p,n) 8040 LOCAL c,t,end,t$,z$,c$ 8060 LET end=p+n 8080 IF end>65535 THEN PRINT "PAST 64K": STOP 8100 LET t= PEEK end 8120 POKE end,13 8140 IF PEEK (end)<>13 THEN PRINT "Something's ROM": STOP 8160 LET t$="" 8180 LET c$="m>"+ STR$ p+","+ STR$ (n+1) 8200 PROC FREESTREAM() TO c 8210 IF c>15 THEN PRINT "No free stream": STOP 8220 OPEN # c,c$ 8240 REPEAT 8260 INPUT #c; LINE z$ 8280 LET t$=t$+z$ 8300 IF LEN t$13 THEN PRINT "CRASH": STOP 8380 POKE end,t 8400 ENDPROC =t$ 8420 8440 DEFPROC POKESTRING(p,t$) 8450 LOCAL c 8460 IF 0= LEN t$ THEN ENDPROC 8480 IF 6553615 THEN PRINT "No free stream": STOP 8520 OPEN # c,"m>"+ STR$ p+","+ STR$ LEN t$ 8540 PRINT #c;t$; 8560 CLOSE # c 8580 ENDPROC 8600 9800 DEFPROC FLIST() 9810 PROC FREESTREAM() TO c 9815 IF c>15 THEN PRINT "No free stream": STOP 9820 OPEN # c,"O>Streams.txt" 9830 LIST #c 9840 CLOSE # c 9850 ENDPROC 9980 9990 PROC FLIST() 9999 SAVE "Streams.bas"