//"*** Драйверы модуля ОЗУ *****
// Глобальная переменная — базовый адрес порта int Cent_Base;
// Прототипы функций нижнего уровня (см. п.3.2.1) // Запись в регистр управления Centronics extern void Cent_Control_drv (unsigned char control); // Чтение из регистра управления Centronics extern unsigned char Cent_Status_drv (void);
// Прототипы функций
// функция инициализации.
int lnit_RAM (void);
// Функция записи данных
void Write_RAM (unsigned addr, unsigned char data);
// Функция чтения данных
unsigned char Read_RAM (unsigned addr);
// Маски битов регистров данных, управления и состояния
// Регистр данных
#define Т1_Т2 0x80
#define RE 0x40
// Регистр управления
#define AL_W 0x00
#define AH_W 0x01
#define RAM_W 0x02
#define SLCTIN 0x08
// Регистр состояния
#define BUSY 0x10
#define STATUS_DATA OxOF
// Функция инициализации.
// Определяет адрес порта, к которому подключен модуль // (по сигналу BUSY).
// Возвращает: 1 — модуль подключен, 0 — не подключен
int lnit_RAM (void)
{
int *b;
b = (int *) MK_FP (0, 0x408); // Указатель на ячейку 0:408 while ( *b != 0 ) // Если порт установлен
{
Cent_Base = *b; // Считываем
// его базовый адрес
if (Cent_Status_drv() & BUSY != 0)
continue; // Модуль не подключен
// к этому порту
Cent_Control_drv (0); // Строб записи = 0 return 1; // Модуль подключен
}
return 0; // Модуль не подключен
}
// Функция записи данных в ОЗУ.
// Вход: data — байт данных, addr — адрес
void Write_RAM (unsigned addr, unsigned char data)
{
// Младший байт адреса ОЗУ
outportb (Cent_Base, addr); // Установка младшего
// байта адреса Cent_Control_drv (AL_W); // Адрес регистра младшего
// байта адреса Cent_Control_drv (AL_W | SLCTIN); // Строб записи = 1 Cent_Control_drv (0); // Строб записи = 0
// Старший байт адреса ОЗУ
outportb (Cent_Base, (addr»8) | RE );// Установка старшего
// байта адреса // и режима записи
Cent_Control_drv (AH_W); //Адрес регистра
//старшего // байта адреса
Cent_Control_drv (AH_W | SLCTIN); // Строб записи = 1
Cent_Control_drv (0); // Строб записи = 0
// Байт данных
outportb (Cent_Base, data); // Установка байта данных
Cent_Control_drv (RAM_W); // Адрес данных
Cent_Control_drv (RAM_W | SLCTIN); // Строб записи = 1 Cent_Control drv (0); // Строб записи = 0
}
// Функция чтения данных из ОЗУ
// Вход: addr — адрес.
// Возвращает: байт данных
unsigned char Read RAM (unsigned addr) {
unsigned char data;
// Младший байт адреса ОЗУ
outportb (Cent_Base, addr); // Установка младшего
// байта адреса
Cent_Control_drv (AL_W); // Адрес регистра младше
// байта адреса
Cent_Control_drv (AL_W | SLCTIN); // Строб записи = 1
Cent_Control_drv (0); // Строб записи = 0
// Старший байт адреса ОЗУ и чтение младшей тетрады данных
outportb (Cent_Base, (addr»8)); // Установка старшего
// байта адреса и // режима чтения // младшей тетрады данных
Cent_Control_drv (AH_W); // Адрес регистра старшего
// байта адреса
Cent_Control_drv (AH_W | SLCTIN); // Строб записи = 1
Cent_Control_drv (0); // Строб записи = 0