10 REM > ZXDisp 1.15
   20 REM Display screen from snapshot or raw file
   30 :
   40 DIM ctrl% 31,mem0% 2047,mem1% 255:in%=0
   50 ON ERROR REPORT:PROCClose_All:PRINT:PROCexit(ERR):END
   60 A$=FNOS_GetEnv:X%=ctrl%:Y%=X%DIV256
   70 A%=INSTR(A$+" "," "):IFA%:in$=LEFT$(A$,A%-1):A$=MID$(A$,A%+1)
   80 A%=INSTR(A$+" "," "):IFA%:addr$=LEFT$(A$,A%-1):A$=MID$(A$,A%+1)
   90 IFin$="-?":PRINT"Syntax: ZXDisp <filename>":PROCexit(0):END
  100 IFin$="":INPUT"Snapshot file: "in$:INPUT"Source screen address &"addr$
  110 IFaddr$="":addr%=&4000 ELSE addr%=EVAL("&"+addr$)
  120 in%=FNf_openin(in$):IF in%=0:PRINT"'"in$"' not found":PROCexit(214):END
  130 MODE9:base%=addr%+&100:IF((EXT#in%)AND&FF)=&1B:base%=&1B+addr%-&4000
  140 IF EXT#in%<8192:base%=0
  150 PTR#in%=base%+6144:attr%=BGET#in%:border%=128+(((attr%AND8)*4)+((attr%AND48)DIV2))DIV8
  160 COLOURborder%:CLS
  170 PRINT'''
  180 FOR third%=0 TO 2
  190   PROCf_gbpb(3,in%,mem0%,2048,base%+third%*2048)
  200   PROCf_gbpb(3,in%,mem1%,256,base%+third%*256+6144)
  210   FOR line%=0 TO 7:PRINT SPC4;
  220     FOR col%=0 TO 31:VDU 23,255
  230       FOR pixel%=0 TO 7
  240         VDU mem0%?(pixel%*256+col%+line%*32)
  250       NEXT pixel%
  260       attr%=mem1%?(col%+line%*32)
  270       attr%=((attr%AND1)*4)+((attr%AND6)DIV2) + ((attr%AND8)*4)+((attr%AND48)DIV2) + (attr%AND&C0)
  280       COLOURattr%AND7:COLOUR128+(attr%AND&38)DIV8
  290     VDU 255:NEXT col%
  300     COLOURborder%:COLOUR7:PRINT
  310 NEXT line%:NEXT third%
  320 CLOSE#in%:in%=0:IFos%>31:IFGET
  330 PROCexit(0):END
  340 :
  350 DEFPROCClose_All:*EXEC
  360 in%=in%:IFin%:A%=in%:in%=0:CLOSE#A%
  370 ENDPROC
  380 :
  390 DEFFNf_openin(A$)=OPENIN(FNf_name(A$))
  400 DEFFNf_name(A$):IFos%>31:LOCALA%,B%:REPEATB%=A%:A%=INSTR(A$,"\",A%+1):UNTILA%=0:IFINSTR(A$,".",B%)=0:A$=A$+"."
  410 =A$
  420 :
  430 DEFPROCf_gbpb(A%,chn%,addr%,num%,ptr%)
  440 ?X%=chn%:X%!1=addr%:X%!5=num%:X%!9=ptr%:IFPAGE<&FFFFF:CALL &FFD1:ENDPROC
  450 IFA%=1ORA%=3:PTR#?X%=X%!9
  460 REPEAT:IFA%=1ORA%=2:BPUT#?X%,?X%!1 ELSE IFA%=3ORA%=4:?X%!1=BGET#?X%
  470 X%!1=X%!1+1:X%!5=X%!5-1:UNTIL(EOF#?X% AND A%>2)OR X%!5<1:ENDPROC
  480 :
  490 DEFFNOS_GetEnv:LOCALA%,X%,Y%,P%,A$:X%=1:os%=((USR&FFF4)AND&FF00)DIV256:DIMX%TRUE
  500 IF!PAGE=&D7C1C7C5:run$=ARGV$(0):IFARGC:FORA%=1TOARGC:A$=A$+ARGV$(A%)+" ":NEXT:=LEFT$(A$,LENA$-1)ELSEIF!PAGE=&D7C1C7C5:=""
  510 IFPAGE>&FFFFF:DIMX%LOCAL256:A$=@cmd$:SYS"GetModuleFileName",0,X%,255:run$=$$X%:Y%=INSTR(@lib$,@tmp$)=0:P%=TRUE
  520 IFP%=0:IFHIMEM>&FFFF:run$=$&8100:SYS"OS_GetEnv"TOA$,,A%:SYS"OS_WriteEnv","",A%:A$=MID$(A$,1+INSTR(A$+" "," ",1+INSTR(A$," "))):P%=TRUE:Y%=TRUE:IFINSTR(A$," ")=0:A$=run$+" "
  530 IFP%=0:P%=X%:[OPT 0:NOP:]:P%=?X%:Y%=TRUE:IFP%=&EAORP%=18:A$=$&600 ELSEIFP%=0:A$=$(PAGE-&300)ELSEIFP%=&A0:A$=$(^@%-256):Y%=?(PAGE-2)AND64ELSEIFP%=&90:A$=$&100:Y%=!&200
  540 A$=" "+A$:REPEATREPEATA$=MID$(A$,2):UNTILASCA$<>32:IFASCA$=34:A%=INSTR(A$,"""",2)+1ELSEA%=INSTR(A$+" "," ")
  550   IFY%:run$=LEFT$(A$,A%-1):A$=MID$(A$,A%+1):Y%=0
  560 UNTILASCA$<>32:=A$
  570 :
  580 DEFPROCos(A$):IFASCA$=42:OSCLIA$ ELSE IFA$<>"":CHAINA$
  590 ENDPROC
  600 :
  610 DEFPROCexit(A%):OSCLI"FX1,"+STR$(A%AND255):quit$=quit$:A$=quit$:quit$="":PROCos(A$)
  620 IFPAGE>&FFFFF:QUIT A% ELSE END
  630 ENDPROC
  640 :
  650 DEFPROCWin_TextIO
  660 SYS "GetStdHandle",-10 TO @hfile%(1):*INPUT 13
  670 SYS "GetStdHandle",-11 TO @hfile%(2):*OUTPUT 14
  680 SYS "SetConsoleMode",@hfile%(1),0:ENDPROC
  690 :