EXTERNALROUTINE  PICS(STRING (255)S)
EXTERNALINTEGERFNSPEC  DDELAY(INTEGER  N)
SYSTEMROUTINESPEC  PHEX(INTEGER  I)
EXTERNALINTEGERFNSPEC  UINFI(INTEGER  I)
EXTERNALROUTINESPEC  DPOFF(RECORDNAME  P)
EXTERNALROUTINESPEC   DPON(RECORDNAME  P)
SYSTEMROUTINESPEC  MOVE(INTEGER  S,FROM,TO)
EXTERNALINTEGERFNSPEC  NWFILEAD(STRING (15)FILE,INTEGER  SIZE)
EXTERNALINTEGERFNSPEC  DGETDA(STRING (6)USER,STRING (11)FILE, C 
   INTEGER  FSYS,ADDR)
!
INTEGERARRAY  PICA, PICDA, LEN(1:4); ! PICTURE THINGS
OWNINTEGERARRAY  LINE(0:1)
OWNINTEGERARRAY   STRM(0:1)
OWNINTEGERARRAY  PIC(0:1)
OWNINTEGERARRAY  SIZE(0:4)
OWNINTEGERARRAY  STATE(0:1); ! SCREEN THINGS
RECORDFORMAT  PF(INTEGER  DEST,SRCE,P1,P2,P3,P4,P5,P6)
RECORD  P, Q(PF)
STRING (31)TXT
INTEGER  F,J,V,I,X,N
OWNINTEGERARRAY  VERS(0:6)
SWITCH  FRAME(0:6)
INTEGER  SCREEN, OPSCREEN, LINE1
CONSTBYTEINTEGERARRAY  BL(0:41) = 41,64(40),21
CONSTINTEGER  STAR = X'5C'
CONSTSTRING (24)STARS = E"************************"
INTEGER  STREAM NO, DACT, L
SWITCH  ACT(0:5)
SWITCH  GENERATE(0:4)
INTEGERARRAY  MSG(0:7)
RECORDNAME  R(PF)
!
!
!
CONSTSTRING (40)ARRAY  RAIN(0:3) = C 
E"!    !  !   !   !   !     !      !!  !  ",
E"  !   !    ! !    !    !!      !       !",
E" !      !      !     !        !    !    ",
E"   !     !       !         !   !     !  "
!
!
!
CONSTSTRING (40)ARRAY  SLEET(0:3) = C 
E"   .   *    .    *    ..    .  *  .   . ",
E" *    .       .     *     .      .     *",
E"  .      *        .          *     .    ",
E"   *   .     *        .        .    *   "
!
!
!
CONSTBYTEINTEGERARRAY  SNOW(0:163) = C 
40,0, 64(5),0,64(7),0,64(6),0,64(5),0,64(9),0,64(2),
40,   64(3),0,64(10),0,64(6),0,64(7),0,64(5),0,64(4),
40,64(9),0,64(7),0,64(5),0,64(8),0,64(6),0,
40,64(7),0,64(11),0,64(3),0,64(9),0,64(6)
!
!
!
CONSTBYTEINTEGERARRAY  WL(0:41) = 41, 0(40), 21
!
!
!
CONSTBYTEINTEGERARRAY  MAN(0:191) = C 
11,64(4),0(3),64(4),
11,64(3),0,64,0,64,0,64(3),
11,64(4),0(3),64(4),
11,64(2),0(7),64(2),
11,64(2),0(7),64(2),
11,64(2),0(7),64(2),
11,64,0(4),64,0(4),64,
11,64,0(9),64,
11,64,0(9),64,
11,64,0(9),64,
11,64,0(4),64,0(4),64,
11,0(11),
11,0(11),
11,0(11),
11,0(5),64,0(5),
11,0(11)
!
!
!
CONSTBYTEINTEGERARRAY  SUN(0:43) = C 
10,96,64,96,64,0(6),
10,64(6),0(4),
10,64(5),97,64(2),0(2),
10,64,97,64(8)
!
!
!
ROUTINE  WRS(INTEGER  N,STRING (40)TXT)
      MOVE(LENGTH(TXT),ADDR(TXT)+1, C 
         PICA(PIC(SCREEN))+41*(LINE(SCREEN)+N))
END ; ! OF WRS
!
!
!
ROUTINE  CLEAR(INTEGER  PIC)
      MOVE(41, ADDR(BL(1)), PICA(PIC))
      MOVE(LEN(PIC)-41,PICA(PIC),PICA(PIC)+41)
      IF  PIC = 2 C 
      THEN  VERS(3)=0 AND  VERS(4)=0 AND  VERS(5)=0
END ; ! OF CLEAR
!
!
!
ROUTINE  FILE INFO(STRING (15)N,INTEGER  SIZE,P)
INTEGER  RES
INTEGERARRAY  INF(0:15)
      PICA(P) = NW FILE AD(N, SIZE)
      RES = D GET DA("ERCC04", N, -1, ADDR(INF(0)))
      PICDA(P) = INF(4)
      CLEAR(P)
END ; ! OF FILE INFO
!
!
!
      R == RECORD(ADDR(MSG(0)))
      LEN(1)=24*41
      LEN(2)=7*21*41
      LEN(3)=24*41
      LEN(4)=24*41
!
      FILE INFO("PIC1",1,1)
      FILE INFO("PIC2",2,2)
      FILE INFO("PIC3",1,3)
      FILE INFO("PIC4",1,4)
!
!
!
!
GENERATE(0):    ! NO SUCH PIC
ACT(0):     ! UNSUCCESSFUL RESPONSE FROM FIRE
WAIT:
      DPOFF(P)
      R = P
      DACT = P_DEST & 7
      -> ACT(DACT)
!
!
!
ACT(1):
                                        ! CONNECT REPLY
      SCREEN = P_P5
      STRM(SCREEN) = P_P1
      Q = 0
      Q_P1 = P_P1
      Q_P2 = PICDA(PIC(SCREEN))
      Q_P3 = 1 IF  PIC(SCREEN) = 2
      Q_P4 = X'11'
      Q_P6 = LEN(PIC(SCREEN))
      Q_SRCE = 2
      Q_DEST = X'370002'; ! ENABLE
      DPON(Q)
      -> WAIT
!
!
!
ACT(2):
                                        ! ENABLE REPLY
      STREAM NO = P_P1
      IF  STRM(0) = P_P1 C 
      THEN  SCREEN = 0 C 
      ELSE  SCREEN = 1
!
      -> GENERATE(PIC(SCREEN))
!
!
!
ACT(3):
                                        ! MESSAGE TO OWNER
      -> WAIT IF  P_P6 < 0; ! PICTURE NO LONGER ON DISPLAY
!
      STREAM NO = P_P1
!
      IF  STRM(0) = P_P1 C 
      THEN  SCREEN = 0 C 
      ELSE  SCREEN = 1
!
      IF  P_P6 >> 24 = 0 C 
      THEN  LINE(SCREEN) = P_P6 C 
      ELSE  STATE(SCREEN) = 0
!
      IF  STATE(SCREEN) = 0 C 
      THEN  -> GENERATE(PIC(SCREEN)) C 
      ELSE  -> WAIT
!
!
!
ACT(5):                                 ! COMMAND
      TXT = STRING(ADDR(P_P1))
      PRINTSTRING("TXT: ".TXT); NEWLINE
      SCREEN = CHARNO(TXT,2)&1
      OPSCREEN = SCREEN<<4 ! ((P_SRCE>>8)&1)
      PIC(SCREEN) = CHARNO(TXT,1) & 7
      LINE(SCREEN) = 0
!
      Q = 0
      Q_P1 = 1
      Q_P2 = UINFI(7) ! 3
      Q_P3 = 8 << 24 ! OPSCREEN << 16
      Q_P5 = SCREEN
      Q_SRCE = 1
      Q_DEST = X'370001'; ! CONNECT
      DPON(Q)
!
      -> WAIT
!
!
!
ACT(4):
      PRINTSTRING("PICS:")
      CYCLE  I = 0, 1, 7
         PRINTSTRING(" ")
         PHEX(MSG(I))
      REPEAT 
      NEWLINE
      -> WAIT
!
!
!
GENERATE(1):
         CLEAR(1)
!
         LINE1 = PICA(1)+41*(10-SIZE(1))
         MOVE(2*SIZE(1)+2, ADDR(STARS)+1, LINE1+20-SIZE(1))
         LINE1 = PICA(1)+41*(11+SIZE(1))
         MOVE(2*SIZE(1)+2, ADDR(STARS)+1, LINE1+20-SIZE(1))
         IF  SIZE(1) > 0 START 
            CYCLE  L = 11-SIZE(1), 1, 10+SIZE(1)
               LINE1 = PICA(1)+41*L
               BYTEINTEGER(LINE1+20-SIZE(1)) = STAR
               BYTEINTEGER(LINE1+21+SIZE(1)) = STAR
            REPEAT 
         FINISH 
!
         IF  SIZE(1) = 9 C 
         THEN  SIZE(1) = 0 C 
         ELSE  SIZE(1) = SIZE(1) + 1
!
      -> FIRE
!
!
!
GENERATE(2):
!
!
!
      F = LINE(SCREEN) // 21
      V = VERS(F)
!
      VERS(F) = V+1
      -> FRAME(F)
!
!
!
FRAME(0):
      WRS(10, E"Once upon a time......")
      -> FIRE
!
!
!
FRAME(1):
      WRS(20, E"It began to rain")
!
      X = 4 - (V&3)
      CYCLE  I = 0, 1, 18
         WRS(I,RAIN((I+X)&3))
      REPEAT 
      -> FIRE
!
!
!
FRAME(2):
      CLEAR(2)
      WRS(20, E"....and, as it got colder, to sleet")
      X = 4 - (V&3)
      CYCLE  I = 0, 1, 18
         WRS(I,SLEET((I+X)&3))
      REPEAT 
      -> FIRE
!
!
!
FRAME(3):
      IF  V=0 THEN  CLEAR(2) AND  VERS(3)=1
         WRS(20, E"and then to snow")
         X=4-(V&3)
         IF  V < 33 THEN  N=18 ELSE  N = 29-(V//3)
         N = 2 IF  N < 2
         CYCLE  I = 0, 1, N
            WRS(I, STRING(ADDR(SNOW(41*((I+X)&3)))))
         REPEAT 
         IF  32 < V < 80 C 
         THEN  WRS(29-(V//3),STRING(ADDR(WL(0))))
      -> FIRE
!
!
!
FRAME(4):
      IF  V < 16 C 
      THEN  WRS(19-V,E"           ".STRING(ADDR(MAN(0))+(15-V)*12))
!
      IF  V = 0 START 
         CLEAR(2)
         VERS(4)=1
         WRS(20, E"The children built a snowman")
      FINISH 
      -> FIRE
!
!
!
FRAME(5):
      -> FIRE IF  V > 95
      IF  V = 0 START 
         CLEAR(2)
         VERS(5)=1
         WRS(20, E"And then the sun came out")
         CYCLE  I = 0, 1, 3
            WRS(I, E"               ". C 
                   E"               ". C 
                   STRING(ADDR(SUN(0))+11*I))
         REPEAT 
         CYCLE  I = 0, 1, 15
            WRS(I+4,E"           ".STRING(ADDR(MAN(0))+12*I))
         REPEAT 
      FINISH 
!
      IF  V > 19 C 
      THEN  WRS(V//5, STRING(ADDR(BL(0))))
!
      -> FIRE
!
!
!
FRAME(6):
      -> FIRE IF  V > 0
      CLEAR(2)
      VERS(6)=1
      WRS(10, E"                The End")
      -> FIRE
!
!
!
GENERATE(3):
         CLEAR(3)
!
         LINE1 = PICA(3)+41*(10-SIZE(3))
         MOVE(2*SIZE(3)+2, ADDR(STARS)+1, LINE1+20-SIZE(3))
         LINE1 = PICA(3)+41*(11+SIZE(3))
         MOVE(2*SIZE(3)+2, ADDR(STARS)+1, LINE1+20-SIZE(3))
         IF  SIZE(3) > 0 START 
            CYCLE  L = 11-SIZE(3), 1, 10+SIZE(3)
               LINE1 = PICA(3)+41*L
               BYTEINTEGER(LINE1+20-SIZE(3)) = STAR
               BYTEINTEGER(LINE1+21+SIZE(3)) = STAR
            REPEAT 
         FINISH 
!
         IF  SIZE(3) = 0 C 
         THEN  SIZE(3) = 9 C 
         ELSE  SIZE(3) = SIZE(3) - 1
!
      -> FIRE
!
!
!
GENERATE(4):
         CLEAR(4)
!
         LINE1 = PICA(4)+41*(10-SIZE(4))
         MOVE(2*SIZE(4)+2, ADDR(STARS)+1, LINE1+20-SIZE(4))
         LINE1 = PICA(4)+41*(12+SIZE(4))
         MOVE(2*SIZE(4)+2, ADDR(STARS)+1, LINE1+20-SIZE(4))
      WRS(11,E"THIS IS A VERY VERY IMPORTANT MESSAGE !!")
!
         IF  SIZE(4) = 9 C 
         THEN  SIZE(4) = 0 C 
         ELSE  SIZE(4) = SIZE(4) + 1
!
      -> FIRE
!
!
!
FIRE:
      Q = 0
      Q_P1 = STREAM NO
      Q_P6 = LINE(SCREEN)
      Q_DEST = X'370006'; ! SEND CONTROL, IE DISPLAY
      DPON(Q)
      STATE(SCREEN) = 1
      -> WAIT
!
!
!
END ; ! OF PICS
ENDOFFILE