! SIM340 - 340 DISPLAY CODE INTERPRETER
! CORRECTED BY JVO  18.2.70.
%BEGIN
%INTEGERFNSPEC PARAMSET(%INTEGER N)
%INTEGERFNSPEC POINTSET(%INTEGER N)
%INTEGERFNSPEC DJSSET(%INTEGER N)
%INTEGERFNSPEC DDSSET(%INTEGER N)
%INTEGERFNSPEC DJPSET(%INTEGER N)
%INTEGERFNSPEC VECTORSET(%INTEGER N)
%INTEGER ISCALE,X,Y,DAC,ASR,I,FRAME,SC
%INTEGERARRAY IFILE(3072:5572)
%SWITCH FN(0:7),SUBTYPE(1:3)
%FAULT 9 -> 100
! MODES ARE : PARAM=0, POINT=1, VECTOR=4, SUBROUTINE=7
! DDS=1, DJP=2, DJS=3
      SELECT INPUT(0) ; ! USER'S DT FILE
      SELECT OUTPUT(0); ! TT
      FRAME=1024 ; DAC=3072 ; ISCALE=1;SC=0 ; ! INITIALISE PARAMETERS
    %CYCLE I=3072,1,5572
      READ(IFILE(I))
    %REPEAT
  100 : CLOSE INPUT
  FN(0) : -> FN(PARAMSET(IFILE(DAC)))
  FN(1) : -> FN(POINTSET(IFILE(DAC)))
  FN(2) : %STOP
  FN(3) : %STOP
  FN(4) : -> FN(VECTORSET(IFILE(DAC)))
  FN(5) : %STOP
  FN(6) : %STOP
  FN(7) : I=(IFILE(DAC)>>16)&3
      -> SUBTYPE(I)
  SUBTYPE(1) : -> FN(DDSSET(IFILE(DAC)))
  SUBTYPE(2) : -> FN(DJPSET(IFILE(DAC)))
  SUBTYPE(3) : -> FN(DJSSET(IFILE(DAC)))
  %INTEGERFN PARAMSET(%INTEGER N)
    %INTEGER I
    I=(N>>3)&1 ; %IF I=0 %THEN -> 1
    I=N&3 ; %LAC I ; %IOT 452 ; ! DLB
 1 : I=(N>>6)&1 ; %IF I=0 %THEN -> 2
     SC=(N>>4)&3
    ISCALE=2**SC ; ! GLOBAL SCALE FACTOR
 2 : %ISZ DAC ;  %RESULT = (N>>13)&7 ; ! MODE TO FOLLOW
  %END
  %INTEGERFN POINTSET(%INTEGER N)
    %INTEGER I,K,M
    K=1 ; I=(N>>10)&1
    %IF I=0 %THEN K=0 ; ! DON'T INTENSIFY
    Y=N&1023 ; %ISZ DAC ; ! DISPLAY ADDRESS COUNTER
    M=IFILE(DAC) ; K=1 ; I=(M>>10)&1
    %IF I=0 %THEN K=0
    X=M&1023
    %IF K=0 %THEN -> 1
    %LAC Y ; %IOT 390 ; ! DYL
    %LAC X ; %IOT 358 ; ! DXS
 1 : %ISZ DAC ; K=(M>>13)&7 ;   %RESULT = K
  %END
  %INTEGERFN DJSSET(%INTEGER N)
    ASR=DAC+1 ; ! SET ADDRESS SAVE REGISTER
    DAC=N&8191
    %RESULT = (N>>13)&7
  %END
  %INTEGERFN DDSSET(%INTEGER N)
    %INTEGER I
    I=N&8191
    IFILE(I)=((2**16)<<1)!ASR
    %ISZ DAC ; ! INCREMENT DISPLAY ADDRESS COUNTER
    %RESULT = (N>>13)&7
  %END
  %INTEGERFN DJPSET(%INTEGER N)
    DAC=N&8191
    %RESULT = (N>>13)&7
  %END ; !
  %INTEGERFN VECTORSET(%INTEGER N)
    %INTEGER DX,DY,SDX,SDY,INT,ES,TUP,DUP,TALONG,DALONG
    %INTEGER SPILL,PREVAL,UP,ALONG,J,ALSTEP
    %INTEGER DPLOT,PPLOT,EDGE,XALONG,UPSTEP
    %SWITCH S(1:8)
    DX=(N&127)*ISCALE ; N=N>>7 ; SDX=N&1
    N=N>>1 ; DY=(N&127)*ISCALE ; N=N>>7 ; SDY=N&1
    N=N>>1 ; INT=N&1 ; N=N>>1 ; ES=N&1
    %IF (DX=0 %AND DY=0)  %THEN -> 1 ; ! EXIT
    EDGE=0 ; ! FALSE
    %IF DX<DY %THEN -> 70
      DALONG=DX ; ALONG=X
      DUP=DY ; UP=Y
      XALONG=1 ; ! TRUE
    %IF SDX#0 %THEN -> 60
      ALSTEP=1 ; PPLOT=3 ; ! MPE
    %IF SDY#0 %THEN -> 61
      UPSTEP=1 ; DPLOT=5 ; ! MPNE
      -> 99
  61 : UPSTEP=-1 ; DPLOT=7 ; ! MPSE
      -> 99
  60 : ALSTEP=-1 ; PPLOT=4 ; ! MPW
    %IF SDY#0 %THEN -> 62
      UPSTEP=1 ; DPLOT=6 ; ! MPNW
      -> 99
  62 : UPSTEP=-1 ; DPLOT=8 ; ! MPSW
      -> 99
  70 : DALONG=DY ; ALONG=Y
      DUP=DX ; UP=X
      XALONG=0 ; ! FALSE
    %IF SDY#0 %THEN -> 75
      ALSTEP=1 ; PPLOT=1 ; ! MPN
    %IF SDX=0 %THEN -> NE
      UPSTEP=-1 ; DPLOT=6 ; -> 99
  NE : UPSTEP=1 ; DPLOT=5 ; -> 99
  75 : ALSTEP=-1 ; PPLOT=2 ; !MPS
    %IF SDX=0 %THEN -> SE
      UPSTEP=-1 ; DPLOT=8 ; -> 99
  SE : UPSTEP=1 ; DPLOT=7
  99 : PLOT10 : TUP=DUP+DUP
      TALONG=DALONG+DALONG
      SPILL=-DALONG ; ALSTEP=ALSTEP*ISCALE
      PREVAL=1 ; ! TRUE
      J=0
  PLOT11 : SPILL=SPILL+TUP
      -> PLOT12 %IF SPILL>0
      -> 100 %IF SPILL<0
    %IF PREVAL=1 %THEN -> 101 ; -> 102
  PLOT12 : PREVAL=0 ; ! FALSE
  102 : SPILL=SPILL-TALONG
      ALONG=ALONG+ALSTEP
      UP=UP+UPSTEP
      -> S(DPLOT)
  S(5) : X=X+ISCALE ; Y=Y+ISCALE
 21 : -> 23 %IF INT=0 ; %LAC Y ; %IOT 390 ; ! DYL
      %LAC X ; %IOT 358 ; ! DXS
      -> 23
  S(6) : Y=Y+ISCALE ; X=X-ISCALE ; -> 21
  S(7) : X=X+ISCALE ; Y=Y-ISCALE ; -> 21
  S(8) : X=X-ISCALE ; Y=Y-ISCALE ; -> 21
  23 : -> LEDGE %IF ALONG=FRAME %OR ALONG=-1 %OR UP=FRAME %OR UP=-1
      -> PLOT15 ; ! SEE IF FINISHED PLOTTING
  100 : PREVAL=1 ; ! TRUE
  101 : ALONG=ALONG+ALSTEP
      -> S(PPLOT)
  S(1) : Y=Y+ISCALE
 11 :  -> 13 %IF INT=0 ; %LAC X; %IOT 326 ; %LAC Y ; %IOT 422
      -> 13
  S(2) : Y=Y-ISCALE ; -> 11
  S(3) : X=X+ISCALE
 12 : -> 13 %IF INT=0 ; %LAC Y ; %IOT 390 ; %LAC X ; %IOT 358
      -> 13
  S(4) : X=X-ISCALE ; -> 12
  13 : -> LEDGE %IF ALONG=FRAME %OR ALONG=-1 %OR UP=FRAME %OR UP=-1
  PLOT15 : J=J+ISCALE
    %IF J#DALONG %THEN -> PLOT11
  1 :  %ISZ DAC
    %IF ES=0 %THENRESULT = 4 ; ! VE
    %RESULT = 0 ; ! PARAMETER MODE TO FOLLOW
  LEDGE : EDGE=1 ; ! TRUE
  89 : %CAPTION \\EDGE_VIOLATION\_X=_ ; WRITE(X,6)
    %CAPTION \_Y=_ ; WRITE(Y,6)
    %CAPTION \_SCALE=_ ; WRITE(ISCALE,6)
    %CAPTION \_DAC=_ ; WRITE(DAC,6)
      NEWLINES(2) ; -> 1
  %END ; ! OF VECTORSET
%ENDOFPROGRAM

