Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Архітектура методичка.doc
Скачиваний:
5
Добавлен:
01.03.2025
Размер:
20.71 Mб
Скачать

98. Узгодження режимів

Периферійні пристрої в стандарті ШЕЕ 1284 зазвичай не вимагають від контролера реалізації всіх режимів, передбачених стандартом. Для визначення режимів і методів управління конкретним пристроєм стандарт передбачає послідовність узгодження для установки необхідного режиму інтерфейсу. При цьому старі пристрої на неї не відповідять, і контролер залишиться в стандартному режимі, а нові повідомлять про свої можливості, і контролер встановить необхідний режим.

Під час фази узгодження контролер виставляє на лінії даних байт розширюваності (Extensibility byte), просячи підтвердження на переклад інтерфейсу в необхідний режим або прийом ідентифікатора периферійного пристрою (табл. 3.8).

Ідентифікатор передається контролеру в запрошенном режимі (будь-який режим зворотного каналу, крім ЕРР). ПУ використовує сигнал Xflag (SELECT в термінах SPP) для підтвердження запитаного режиму зворотного каналу, крім полубайтного. Полубайтного режим підтримується усіма пристроями ШЕЕ 1284 безумовно. Біт Extensibility Link request закладений для механізму визначення додаткових режимів у майбутніх розширеннях стандарту.

Послідовність узгодження складається з наступних кроків:

1. Хост виводить байт розширюваності на лінії даних.

2. Хост встановлює високий рівень сигналу SELECTIN # і низький - AUTOFEED #, що означає початок послідовності узгодження.

3. ПУ 1284 відповість установкою низького рівня сигналу ACK # і високого - ERROR #, РЕ і SELECT. Пристрій, «не розуміє» стандарта1284, відповіді не дасть, і подальші кроки даної послідовності для нього не виконуються.

4. При позитивній відповіді ПУ в п.З формується байт розширюваності складнішого запитуваної режиму і процедура узгодження повторюється з п.1 до тих пір, поки не буде отримана інформація про всіх підтримуваних ПУ режимах (запитувані режими повинні підтримуватися адаптером).

5. Записом байта в регістр ECR задається необхідний режим ПУ Описаний механізм розроблявся фірмою Microsoft з урахуванням

необхідності забезпечення сумісності з не РпР пристроями, маючи на увазі неможливість їх виведення з ладу і стійкість системи до повідомлень, які не є РпР ідентифікаторами.

99. Приклад програмування

Програма призначена для друку графічного екрана на принтер в EGA режимах: ODh, OEh, OFh, 10h, llh, 12h і викликається при натисканні клавіші PrintScreen

program prn_scr; uses dos, crt; const

load_x -32;

buf_y = 100;

buf_x «200;

fon = 0;

INT = 20;

STROBEON = $ 01; type

s_type-Abyte; uns = byte; unt = word;

var

putjnode: unt; printmode: unt; bytes per Hne runt; max_x, max_y: unt; graphmode: unt; zap: uns;

error: uns;

a: array (0 .. 7,0 .. 639J of uns; {Буфер принтера}

b: byte;

contents runs;

c, cl: unt;

i, J: unt;

const

flag: boolean-FALSE; pr_len: unt = 640;

pr_col: unt = 350;

{Функція modeXXO ставить у відповідність зовнішнім змінним}

{Параметри для поточного відеорежнма}

procedure modeOD; begin

putmode: = 0; bytes_per_line: = 320 div 8; max_x: -320; maxy: = 200;

end;

procedure modeOE; begin

put_mode: = 0; bytes_per_lme: = 640 div 8; max_x: = 640; max_y: = 200; end;

procedure modeOF; begin

putmode-.H); bytes_per_line: = 640 div 8; max_x: -640; max__y: = 350; end;

procedure modelO; begin

put_mode: = 0; bytes_per_Iine: = 640 div 8; max_x: = 640; raaxj; = 350; end;

procedure model 1; begin

put_mode: = 0; bytesjperJine: = 320 div 8; max_x: = 320; max__y: = 480; end;

procedure model2; begin

put_mode: = 0; bytesjper_line: = 640 div 8; max_x: = 640; max_y: = 480; end;

function point (x, y; unt): uns; {функція читання кольору точки екрана}

var

offset: s_type; mask, i: byte;

_dx: word; const

color: by te = 0; ret: byte = 0;

{Змінна offset отримує необхідне зміщення для байта з}

{Заданими координатами}

begin

offset:-s_type ($ A000: 0 + y * bytes_per_line + (x shr 3 »;

{Змінна mask отримує значення, необхідне для виділення}

{Біта, що відповідає точці на екрані з координатами уд}

mask: = $ 80 shr (х and $ 07);

_dx: s = $ 3CE;

{Встановлюється режим читання 0}

port | _dxj: = 5; incCdx); port | _dxj: = 0; dec (_dx); for »: = 0 to 3 do

{Вибирається необхідна бітова площину, починаючи з 0-ї}

begin

{Встановлюється регістр маски читання}

portLDX]; = 4; inc (_DX); portf DX]: = i; dec (J> X);

{Отримання байта з регістра засувки}

ret: = offsetA;

{Якщо необхідний біт встановлений, то встановлюється}

{Відповідний біт у змінній color}

if ret and maskoO then

color: = coIor or ($ 01 shl i);

end;

point: ~ color {Функція повертає колір пікселя}

end;

{Процедура читання поточного вндеорежіма}

procedure load mode; var г: registers; begin

r.AH: == $ 0F;

intr ($ 10, r);

graph_mode: = r.AL; {Per-p AL отримує поточний вндеорежім}

case graph_mode of

{Встановлюються необхідні параметри для поточного режиму}

$ 0d: mode0D;

$ 0E: mode0E;

$ 0f: mode0F;

$ 10: model0;

SU-.model 1;

$ 12: model2

end

end;

{Функція виведення символу на принтер}

procedure OutputChar (c: byte);

i: unt;

address: unt absolute $ 0040: $ 0008;

{Змінна »address отримує адресу пристрою LPT1}

begin

for i: = 0 to 1999 do; {Цикл затримки}

port | address]: ^ c; {У порт address надсилається байт з}

zap: ~ port [address + 2]; {читання регістра управлення принтера}

port [address + 2 J: = гар or STROBE_ON;

{На короткий час встановлюється біт 1 регістра керування}

portf address + 2]: = zap end;

{Функція для виведення графічного екрану на пристрій 1РТ1}

procedure prtxt;

const

x: unt = 0;

y: unt = K>;

var

k * xl, yl: unt; i, sizerunt;

c, p: byte;

esc: array [0 .. 4] of byte; begin

if flag then begin

flag: = FALSE;

exit

end;

{Ініціалізація принтера}

OutputChar (27);

OutputChar (64);

OutputChar (27);

OutputChar (51);

OutputChar (24);

OutputChar (13);

OutputChar (10); prcoli-maxy;

y: = 0;

while y <pr_col do begin for k: = 0 to 7 do begin

{Заповнення буфера принтера розміром 8x640}

for хіІ) to pr_len-l do a [k, x]: = point (xTy + k)

end;

size: = pr_len;

{Створення ESC-носледовательностн для установки принтера}

{В графічний режим}

esc [0]: = 27;

esc [1]: == 42; esc [2]: = print_mode; esc [3]: ^ ize mod 256; esc [4J: = size div 256;

{Висновок ESC-последовательностн на принтер}

for i: = 0 to 4 do OutputChar (esc [i]>; for xl: = 0 to size-1 do begin

c: = 0;

p: = 0;

for yl: = 0 to 7 do begin

if a [yl, xl] ofon then p: = l else p: = 0;

{Якщо байт в масиві з координатами yl, х1 не дорівнює кольором фону,}

{То неременная р отримує значення, рівне 1}

if (РОО) then з: == з or ($ 80 shr yl);

{Якщо РОО, то встановлюється відповідний біт у змінній с,}

{Яка після виходу з циклу зберігають біти, рівні 1,}

{Якщо колір не відповідає кольору фону і 0, якщо відповідає. }

end;

OutputChar (с);

{Отримана ланцюжок бітів виводиться на принтер в графічному режимі} end;

OutputChar (13);

OutputChar (10);

{На принтер надсилаються байти, відповідні кодам перекладу і}

{Повернення друкувальної головки}

inc (y, 8); end; end;

{Резидентні функція, що викликається по натисненню PrintScreen}

procedure s_point; interrupt;

begin

loadmode;

if graph_mode <07 then exit; putjnodeiM); print_mode: -4; prtxt; end;

{Основна програма

type

bytep = Abyte;

addres = record

p: bytep

end;

addresps = Aaddres;

const

addr: addresp = (addresp (INT));

BEGIN

{Перевизначення вектора INTS на власне переривання}

addrA.p: = bytep (@ s_pomt);

keep (0); {Програма в пам'яті залишається резидентної}

END.