Пакет подпрограмм для работы под управлением VPV на языке C
(библиотека vpvlib.lib модель LARGE)
Функции соответствуют системным вызовам, подробно рассмотренным в описании VPV для программирующих на ассемблере.
1.Дай область памяти
char *getmem( num )
на входе:
num=требуемое число областей по 16 байт
на выходе значение функции:
0 - нет памяти заданного pазмеpа
не 0 – указатель на выделенную память
2.Освободить память
freemem( buf,num )
на входе:
buf - адрес, полученный из getmem
num - величина, использованная для getmem
3.Вывести содержимое буфера на устройство
writdv(ibuf,i,j,k)
на входе:
ibuf=буфер вывода
i=число байт для пакета 0/число слов для других типов пакетов (от 1 до 255)
j=номер линии (0-3)
k=тип пакета (см.INT5 BL=0 описания VPV)
4.Ждать события
(программа приостанавливается до наступления указанного события)
waitev(i)
на входе что ждать:
i=
· 1 GO или активизации от другой задачи
· 2 ждать прерывание с приемника таймерных сообщений
· 3 любого из прерываний 5/6 на slave 8259 (сейчас отключено)
· 4 ввода команды MS в ответ на readms() (INT 5 BL=3)
· 5 интервала времени для задач типа 3 или прерывания для задачи,подключенной к IT4 (см.intcon()); если есть драйвер ветви имени Инчагова,то любое прерывание от него запустит эту задачу
· 6 прерывание 6 на slave 8259 (сейчас отключено)
· 7 прерывание 5 на slave 8259 (сейчас отключено)
· 8,9,10,11 прерываний от СУММА через драйвер ветви имени Инчагова номера 3,2,1,0
5.Обращения к аппаратуре СУММА
int cymmab(c,n,a,f,buf,num)
на входе:
c,n,a,f= СУММА CNAF
buf=буфер данных
num=число обмениваемых слов
на выходе значение функции:
0 - O.K.
Для драйвера имени Инчагова имеем:
0ffh - корзина отключена
72h - после включения не инициализирован адаптер, VPV по этому коду автоматически перепрограммирует адаптер. Рекомендуется повторить обращение к аппаратуре
6.Читать сообщение от оператора ( MS )
(после этой фунции buf[1]=0 и выполнение программы продолжается,если когда-нибудь человек введет сообщение,то это изменит значение buf[1] на ненулевое)
readms(buf,i)
на входе:
buf=буфер ввода
i=число байт <128 ( смотри INT 5 BL=3 )
Ждать ввод сообщения можно так: waitev(4);
7.Подключить процедуру FUNC к прерыванию
int intcon(func,&i)
на входе:
func-подключаемая функция
i-переменная, которую использует и процедура и задача
на выходе значение 0 - O.K.
func() вызывается из VPV с запрещенными прерываниями как функция системы. Поэтому она не должна иметь обращений к системе,а отрабатывать быстро!!! Если используется драйвер ветви имени Инчагова, то входы IT подключены к этому уровню. Тогда при входе в func() в регистре DI в 1 установлены биты, соответствующие номеру входа.
ПРОГРАММА, использовавшая функцию intcon НЕ МОЖЕТ ИСПОЛЬЗОВАТЬ ФУНКЦИЮ waitim() !!!
8.Создай общую (разделяемую) память (подробнее о ней читай в описании VPV для пишущих на ассемблере)
int getzc(i)
на входе:
i=требуемая длина зоны в параграфах по 16 байт
на выходе значение 0 - O.K.
9.Освободи общую память
freezc()
10.Читать свою общую память
int rdmyzc(buf,byte,num)
на входе:
buf=буфер
byte=номер байта в зоне,начиная с 0
num=число байт
11.Писать свою общую память
int wrmyzc(buf,byte,num)
на входе:
см. rdmyzc()
12.Читать общую память другой задачи
int readzc(buf,byte,num,name)
на входе:
name=имя задачи из 4-х символов ( если меньше, то дополняются пробелами )
остальное см. rdmyzc
13.Писать общую память другой задачи
int writzc(buf,byte,num,name)
на входе:
см.readzc
14.Активизировать задачу
int iactiv(name)
на входе:
name=имя активизируемой задачи из 4-х символов ( если меньше, то дополняются пробелами )
на выходе:
0 - задача активизирована
15.Дай номер терминала,с которого активизирована задача
int ttnum( )
на выходе:
0,1,2 - номер терминала/линии
16.Завершение работы программы
endprg()
17.Ждать интервал времени
waitim(num)
на входе:
num=число тактов таймера в интервале ожидания (такт = 100 мс)
18.Читать блок данных из ЭВМ (программа останавливается до приема пакета с линии)
rdbloc(buf,num)
на входе:
buf=буфер ввода
i=число байт от 1 до 16383 ( смотри INT 5 BL=7 )
19.Дай имя,под которым загружена задача
get_name(name)
на выходе:
name=содержит 4 символа имени
Чтобы подготовить программу на TURBO C необходимо:
· головной модуль назвать большими буквами MAIN;
· сделать include файла vpvlibtc.h, где описаны все доступные из С процедуры, включая и типы передаваемых параметров;
· в качестве головного модуля использовать файл vpvmain.obj, т.е. для LINK его указывать первым vpvmain+....
· для LINK указывать библиотеку vpvlib.lib и стандартную \cl.lib,т.е. vpvmain+....\cl;
· все имена процедур пишутся маленькими буквами;
· для форматного вывода использовать стандартную функцию sprintf(buf,"...) и нижеследующую процедуру, но большими буквами
Выводить строку текста, заканчивающуюся НУЛЕМ
FPUTS(buf,line)
на входе:
buf= адрес строки текста
line=номер устройства/линии (0-3)