Пакет подпрограмм для работы под управлением 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)