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