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