-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathRAW:CONN
executable file
·106 lines (98 loc) · 2.67 KB
/
RAW:CONN
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
% === RAW:TEST === % 12.10.88 VERSION 29
%
% ПРОЗРАЧНЫЙ РЕЖИМ (С ОБМАНОМ СИСТЕМЫ (БЕЗ DPC))
%
GLOBAL (LOCATION=&400) (START=MAIN)
DATA GDIFF,AZC
EQUALS BRCKSY=&04,SPECSY=&07
LOCALS LMAIN
DATA XOFMRK %флаг 'вывод остановлен'
EQUALS X:OFF="S"-&40 ,X:ON="Q"-&40
BYTES INPSY[1]
BYTES ISOUT[1] %флаг 'очередь ввода непуста'
%% Матрица межзадачных сигналов
BYTES 0 ,IOF[1],IGF[1],IPF[1]
BYTES OIF[1],0 ,OGF[1],OPF[1]
BYTES GIF[1],0 ,0 ,GPF[1]
BYTES PIF[1],POF[1],PGF[1],0
%%
%% ГЛАВНЫЙ ПЛАНИРОВЩИК
%%
PROGRAM MAIN()
. BPT
CALL GPINIT %инициируем интерфейс линии
CALL INIBUF %инициируем буфера
CALL DPINIT %цепляем терминал в обход системы
(WHILE
GOSUB CCKGET
GOSUB CCKPUT
GOSUB CCKINP
GOSUB CCKOUT
)WHILE
%%
%% ЗАДАЧА ВВОДА С ЛИНИИ
%%
LABEL CCKGET
(IF R0(CALL GTEST)<>0 %пришел символ ?
CALL PUTBUF R0(CALL GET) %кладем в буфер вывода
(IF R0(CALL TSTFUL)<>0 %возникла опасность переполнения ?
(IF XOFMRK=0 %идет передача ?
XOFMRK=1
GPF:=1 %заказываем выдачу X-OFF'а
)IF
)IF
)IF
RETURN ,
%%
%% ЗАДАЧА ВЫВОДА В ЛИНИЮ
%%
% Приоритеты запросов убывают по тексту
LABEL CCKPUT
(IF GPF:<>0 %запрос X-OFF ?
GPF:=0
INPSY:='X:OFF' ; ISOUT:=1
ELSE IF OPF:<>0 %запрос X-ON ?
OPF:=0
INPSY:='X:ON' ; ISOUT:=1
ELSE IF IPF:<>0 %нажат символ ?
IPF:=0
ISOUT:=1
)IF
(IF ISOUT:<>0 %надо выдавать ?
(IF R0(CALL PTEST)<>0 %устройство готово ?
CALL PUT R0:(INPSY)
ISOUT:=0 %выдали!
)IF
)IF
RETURN ,
%%
%% ЗАДАЧА ВВОДА С ДИСПЛЕЯ
%%
LABEL CCKINP
(IF R0(CALL DPMTST)<>0 %введен символ ?
R0:=R0(CALL DPM) %читаем его
(IF R0:='SPECSY' % BRCKSY нужен в системе
CALL DPEND %передаем терминал в систему
SYSCALL EXIT &FFFF
)IF
IF R0:='"K"-&40' THEN R0='X:ON' %аварийная выдача X-OFF
INPSY:=R0 %заносим символ в буфер
IPF:=1 %посылаем сигнал выводу в линию
)IF
RETURN ,
%%
%% ЗАДАЧА ВЫВОДА НА ДИСПЛЕЙ
%%
LABEL CCKOUT
(IF R0(CALL TSTEMP)=0 %есть работа для вывода?
(IF R0(CALL DPOTST)<>0 %дисплей готов ?
CALL DPO R0:(CALL GETBUF) %черпаем из буфера и выдаем
)IF
ELSE
* ELSE IF R0(CALL TSTFUL)=0 %можно записывать ?
(IF XOFMRK<>0 %вывод был остановлен ?
XOFMRK=0
OPF:=1 %запускаем чтение с линии (X-ON)
)IF
)IF
RETURN ,