1.4 Порти введення-виведення, клавіатура.
Інші фото:
https://forumupload.ru/uploads/001b/d4/a7/2/125466.jpg
https://forumupload.ru/uploads/001b/d4/a7/2/200594.jpg
Для забезпечення обміну інформацією із зовнішніми пристроями в комп'ютері передбачена БІС ППА КР580ВВ55 ( D30 ), яка містить три 8-розрядні порти вводу-виводу A, B, C. Вони виведені на роз'єм "ЗОВНІШ - 2" (розпаювання див. у "Посібнику з експлуатації" ). Програмно до кожного з портів можна звернутися за адресами:
Порт A (тільки виведення) - C0H (192)
Порт B (введення або виведення) - C1H (193)
Порт C (введення та виведення) - C2H (194)
Регістр керувального слова - C3H (195)
Порт A призначений тільки для виведення інформації (стандартно-на принтер) і буферований. Порт B призначений для формування палітри зображення, але може бути використаний і для обміну із зовнішніми пристроями (при цьому відбуватиметься "миготіння" палітри зображення). Порт C в комп'ютері створений для управління принтером, обміну з магнітофоном та управлінням карткою пам'яті (підключення / відключення екранного ОЗУ). Стандартно порти A, B і C(0-3) запрограмовані на виведення, C(4-7) - для введення.
Для підключення клавіатури до ПК також застосована БІС КР580ВВ55 (D1). Її адреси:
Порт A (тільки виведення) - D0H (208)
Порт B (тільки для введення) - D1H (209)
Порт C ( введення та виведення ) - D2H ( 210 )
Регістр керувального слова - D3H ( 211 )
Підключення портів до клавіатури ПК-01 показано малюнку. Принцип опитування клавіатури полягає в наступному: послідовною подачею логічного "0" на кожен із розрядів портів A та C(0-3) дозволяється опитування відповідного напіврядку клавіатури. Результат опитування містять порти B і C(4-7) для основної та функціональної клавіатури відповідно.
Основна клавіатура
Латиниця.
Кирилиця.
Скрини оригіналу:
https://forumupload.ru/uploads/001b/d4/a7/2/221127.png
https://forumupload.ru/uploads/001b/d4/a7/2/379380.png
Функціональна клавіатура
Скрини оригіналу:
https://forumupload.ru/uploads/001b/d4/a7/2/748524.png
https://forumupload.ru/uploads/001b/d4/a7/2/571567.png
Значення, що виводяться та вводяться з портів представлені для випадку натискання лише однієї клавіші. Подачею "0" одночасно на кілька розрядів портів A або C(0-3) можна дозволити опитування декількох напіврядків, але розрізнити напіврядки в такому випадку неможливо.
При необхідності взаємодії з великою кількістю нестандартних зовнішніх пристроїв у ПК-01 є можливість під*єднання двох додаткових ППА КР580ВВ55 за адресами E0/E1/E2/E3 та F0/F1/F2/F3 відповідно. Необхідні для цього сигнали виведені на роз'єм "ЗОВНІШ - 1".
P.S.
Кодування символів в ПК-01 наче б то відповідає кодуванню КОІ-7 (H2)
https://ru.wikipedia.org/wiki/КОИ-7
але я це не перевіряв ще
Ще в скринах є помилка, двічі рос. буква "П" замість "Р".
Вирізка реалізації клавіатури ПК-01 “Львів” в емуляторі LVOVulator
{Вирізка реалізації клавіатури ПК-01 “Львів” в емуляторі LVOVulator.
Тема, яка присвячена LVOVulator:
"Хочу написать свой эмулятор ПК-01 Львов на Delphi"
http://pc01.lviv.ua/forum/viewtopic.php … ;start=195 }
var
kbd_base : array [0..8] of byte;{основна клавіатура}
kbd_ext : array [0..4] of byte;{додаткова клавіатура}
procedure TMainFormEmu.init_memory();{ініціалізація масивів клавіатури}
var
j , i : integer;
begin
i:=0; while (i<8) do begin kbd_base[i]:=0; inc(i); end;
i:=0; while (i<4) do begin kbd_ext[i]:=0; inc(i); end;
end;
function TMainFormEmu.readmask (keynum: word): word;{маска, використовується при натисканнях або при відпусканнях клавіш. див. далі}
begin
result:= $72FF;
case keynum of
8: begin result:= $23FF end; // BCK
13: begin result:= $13FF end; // ENTER
16: begin result:= $70FF end; // SHIFT
32: begin result:= $30FF end; // SPC
37: begin result:= $FF32 end; // <-
38: begin result:= $FF31 end; // UP
39: begin result:= $FF30 end; // ->
40: begin result:= $FF33 end; // DOWN
48: begin result:= $06FF end; // 0
49: begin result:= $47FF end; // 1
50: begin result:= $46FF end; // 2
51: begin result:= $45FF end; // 3
52: begin result:= $44FF end; // 4
53: begin result:= $43FF end; // 5
54: begin result:= $00FF end; // 6
55: begin result:= $01FF end; // 7
56: begin result:= $02FF end; // 8
57: begin result:= $07FF end; // 9
65: begin result:= $64FF end; // A
66: begin result:= $31FF end; // B
67: begin result:= $57FF end; // C
68: begin result:= $27FF end; // D
69: begin result:= $54FF end; // E
70: begin result:= $67FF end; // F
71: begin result:= $10FF end; // G
72: begin result:= $16FF end; // H
73: begin result:= $75FF end; // I
74: begin result:= $52FF end; // J
75: begin result:= $55FF end; // K
76: begin result:= $22FF end; // L
77: begin result:= $76FF end; // M
78: begin result:= $53FF end; // N
79: begin result:= $21FF end; // O
80: begin result:= $63FF end; // P
81: begin result:= $71FF end; // Q
82: begin result:= $20FF end; // R
83: begin result:= $77FF end; // S
84: begin result:= $74FF end; // T
85: begin result:= $56FF end; // U
86: begin result:= $26FF end; // V
87: begin result:= $65FF end; // W
88: begin result:= $73FF end; // X
89: begin result:= $66FF end; // Y
90: begin result:= $17FF end; // Z
107: begin result:= $05FF end; // =/+ -> =/-
109: begin result:= $05FF end; // -/_ -> =/-
114: begin result:= $FF23 end; // F3
115: begin result:= $FF22 end; // F4
116: begin result:= $FF21 end; // F5
36: begin result:= $FF20 end; // Home
219: begin result:= $11FF end; // [
221: begin result:= $12FF end; // ]
190: begin result:= $24FF end; // .
188: begin result:= $37FF end; // ,
192: begin result:= $72FF end; //
end;
end;
procedure TMainFormEmu.kbd(mask : word; press : boolean);{по масці, натискання або відпускання клавіші}
var
brow : byte; erow : byte; bcol : byte; ecol : byte;
begin
bcol:=(mask SHR 12) and $0F;
brow:=(mask SHR 8) and $0F;
ecol:=(mask SHR 4) and $0F;
erow:=(mask SHR 0) and $0F;
if ((brow<8) and (bcol<8)) then
begin
if (press) then
begin
kbd_base[bcol]:=(kbd_base[bcol] or (1 SHL brow));
end else begin
kbd_base[bcol]:= (kbd_base[bcol] and (not(1 SHL brow)));
end;
end;
if ((erow<8) and (ecol<4)) then
begin
if (press) then
begin
kbd_ext[ecol]:= (kbd_ext[ecol]or (1 SHL erow));
end else begin
kbd_ext[ecol]:= (kbd_ext[ecol] and (not(1 SHL erow)));
end;
end;
end;
procedure TMainForm.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);{при натисканні на клавішу}
begin
kbd(readmask(key),true); // нажали
i8080_do_opcodes(opcodes_to_run);
end;
procedure TMainForm.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); {при відпусканні клавіші}
begin
kbd(readmask(key),false);
end;
function TMainFormEmu.do_input(port : byte): byte;{процедура обробки портів (команда IN)}
var
i,r : integer;
nD2 ,nD0 : byte;
begin
nD2:=0;
nD0:=0;
port:=$C0+(port and $13);
case port of
$C2: begin result := ports[$C2]; end;
$D1: begin
nD0:=not ports[$D0];
r:=0;
i:=0;
while (i<8) do
begin
if ((nD0 and (1 SHL i))<>0) then
begin
r:=(r or kbd_base[i]);
end;
inc(i);
end;
result := ((not r) and $FF);
end;
$D2: begin
nD2:= not ports[$D2];
r:=0;
i:=0;
while (i<4) do
begin
if ((nD2 and (1 SHL i))<>0) then
begin
r:=(r or kbd_ext[i]);
end;
inc(i);
end;
result := not ((r SHL 4) or (nD2 and $0F)) and $FF;
end
else
begin
result := $FF;
end;
end;
end;
function TMainFormEmu.do_read(addr : integer): word; // считаем значение из пямяти
begin
addr:=(addr and $FFFF);
if ((ports[$C2] and 2)<>0) then
begin
result := memory[addr];
end
else
if (addr>$7FFF) then
begin
result := memory[addr];
end
else if (addr<$4000) then
begin
result := 0;
end
else begin
result := video[addr-$4000];
end;
end;
procedure TMainFormEmu.i8080_do_opcodes(nb_cycles : integer);
Begin
{.......}
opcode:=do_read(r_PC);
case opcode of
{.......}
$DB: {команда процесора IN}
begin
r_A:=do_input(do_read(r_PC+1));
clock:=clock+10;
r_PC:=r_PC+2;
{.......}
end;
Вирізка реалізації клавіатури ПК-01 “Львів” в емуляторі SASEmulator
{Вирізка реалізації клавіатури ПК-01 “Львів” в емуляторі SASEmulator.
Тема, яка присвячена SASEmulator:
"SASEmulator"
http://pc01.lviv.ua/forum/viewtopic.php?f=12&t=232 }
Var Key_engl: array[0..255]of word;// Англійська розкладка клавіатури
Key_Rus: array[0..255]of word;// Рус розкладка клавіатури
kbd_base : array [0..8] of byte; // Англійська розкладка клавіатури
kbd_ext : array [0..4] of byte; // Рус розкладка клавіатури
procedure InitKeyboard;//{SAS}
Var w:word;
Begin
BEGIN{загрузка за замовченням}
{ініціалізація}for w:=0 to 255 do begin Key_engl[w]:=$FFFF;Key_Rus[w]:=$FFFF;end;
{налаштування англійської роскладки}
{Доп.клавіатура відповідність при англійській роскладці}
Key_engl[123]:=$FF00;{(F12) = (ПЧ)} Key_engl[122]:=$FF01;{(F11) = (CD)}
Key_engl[121]:=$FF02;{(F10) = (Звук)}Key_engl[119]:=$FF03;{(F8) = ("R")}
Key_engl[34]:=$FF10;{(PageDown) = (П/Д)}Key_engl[120]:=$FF11;{(F9) = (F0)}
Key_engl[112]:=$FF12;{(F1) = (F1 чмл)}Key_engl[113]:=$FF13;{(F2) = (F2 змл)}
Key_engl[36]:=$FF20;{Home = Home}Key_engl[116]:=$FF21;{F5} Key_engl[115]:=$FF22;{F4}
Key_engl[114]:=$FF23;{F3}Key_engl[39]:=$FF30;{->}Key_engl[38]:=$FF31;{UP}
Key_engl[37]:=$FF32;{<- (влево)}Key_engl[40]:=$FF33;{DOWN}
{Основна клавіатура відповідність при англійській роскладці}
Key_engl[54]:=$00FF;{6}Key_engl[55]:=$01FF;{7}Key_engl[56]:=$02FF;{8}
Key_engl[45]:=$03FF;{Insert = ГТ}Key_engl[9]:=$04FF;{ТАБ (працює як Ctrl+Tab) }
Key_engl[189]:=$05FF;{(-_) = (-=)}Key_engl[48]:=$06FF;{0}Key_engl[57]:=$07FF;{9}
{1} Key_engl[71]:=$10FF;{G}Key_engl[219]:=$11FF;{[}Key_engl[221]:=$12FF;{]}
Key_engl[13]:=$13FF;{ENTER}Key_engl[33]:=$14FF;{PageUp = ПС}
Key_engl[186]:=$15FF;{(:;ж) = (:*)Key_engl[72]:=$16FF;{H}Key_engl[90]:=$17FF;{Z}
{2}Key_engl[82]:=$20FF;{R}Key_engl[79]:=$21FF;{O}Key_engl[76]:=$22FF;{L}
Key_engl[8]:=$23FF;{ЗБ}Key_engl[190]:=$24FF;{(.>ю) = (.>)}Key_engl[220]:=$25FF;{(\/|) = (\)}
Key_engl[86]:=$26FF;{V}Key_engl[68]:=$27FF;{D}
{3}Key_engl[32]:=$30FF;{Пробел}Key_engl[66]:=$31FF;{B}Key_engl[222]:=$32FF;{(@Ю)=("'ЄєЭэ)}
Key_engl[16]:=$33FF;{ВР}Key_engl[35]:=$34FF;{(END) = (_)}{ $35FF;{ЛАТ}
Key_engl[191]:=$36FF;{/}Key_engl[188]:=$37FF;{,}
{4}Key_engl[27]:=$40FF;{СТР}Key_engl[117]:=$41FF;{(F6) - (G)}Key_engl[118]:=$42FF;{(F7) - (B)}
Key_engl[53]:=$43FF;{5}Key_engl[52]:=$44FF;{4}Key_engl[51]:=$45FF;{3}
Key_engl[50]:=$46FF;{2}Key_engl[49]:=$47FF;{1}
{5}{50 и 51 -пусто по таблице}Key_engl[74]:=$52FF;{J}Key_engl[78]:=$53FF;{N}
Key_engl[69]:=$54FF;{E}Key_engl[75]:=$55FF;{K}Key_engl[85]:=$56FF;{U}
Key_engl[67]:=$57FF;{C}
{6}Key_engl[192]:=$60FF;{(`~)=(;+)}Key_engl[17]:= $61FF;{РУС}Key_engl[18]:= $62FF;{СУ}
Key_engl[80]:=$63FF;{P}Key_engl[65]:=$64FF;{A}Key_engl[87]:=$65FF;{W}
Key_engl[89]:=$66FF;{Y}Key_engl[70]:=$67FF;{F}
{7}Key_engl[16]:=$70FF;{Shift}Key_engl[81]:=$71FF;{Q}Key_engl[187]:=$72FF;{(+=) = (^)}
Key_engl[88]:=$73FF;{X}Key_engl[84]:=$74FF;{T}Key_engl[73]:=$75FF;{I}
Key_engl[77]:=$76FF;{M}Key_engl[83]:=$77FF;{S}
{налаштування РУС розкладки}{Доп. клавіатура відповідність при РУС розкладці}
Key_Rus[123]:=$FF00;{(F12) = (ПЧ)}Key_Rus[122]:=$FF01;{(F11) = (CD)}
Key_Rus[121]:=$FF02;{(F10) = (Звук)}Key_Rus[119]:=$FF03;{(F8) = ("R")}
Key_Rus[34]:=$FF10;{(PageDown) = (П/Д)}Key_Rus[120]:=$FF11;{(F9) = (F0)}
Key_Rus[112]:=$FF12;{(F1) = (F1 чмл)}Key_Rus[113]:=$FF13;{(F2) = (F2 змл)
Key_Rus[36]:=$FF20;{Home = Home}Key_Rus[116]:=$FF21;{F5}
Key_Rus[115]:=$FF22;{F4}Key_Rus[114]:=$FF23;{F3}Key_Rus[39]:=$FF30;{->}
Key_Rus[38]:=$FF31;{UP}Key_Rus[37]:=$FF32;{<- (влево)}
Key_Rus[40]:=$FF33;{DOWN}
{Основна клавіатура відповідність при РУС розкладці}
Key_Rus[54]:=$00FF;{6}Key_Rus[55]:=$01FF;{7}Key_Rus[56]:=$02FF;{8}
Key_Rus[45]:=$03FF;{Insert = ГТ}Key_Rus[9]:=$04FF;{ТАБ}Key_Rus[189]:=$05FF;{(-_) = (-=)}
Key_Rus[48]:=$06FF;{0}Key_Rus[57]:=$07FF;{9}
{1}Key_Rus[85]:=$10FF;{Г}Key_Rus[73]:=$11FF;{Ш}Key_Rus[79]:=$12FF;{Щ}
Key_Rus[13]:=$13FF;{ENTER}Key_Rus[33]:=$14FF;{PageUp = ПС}
Key_Rus[221]:=$15FF;{(:;ж) = (Ж)}Key_Rus[219]:=$16FF;{Х}
Key_Rus[80]:=$17FF;{З}
{2}Key_Rus[72]:=$20FF;{Р}Key_Rus[74]:=$21FF;{О}Key_Rus[75]:=$22FF;{Л}
Key_Rus[8]:=$23FF;{ЗБ}Key_Rus[220]:=$24FF;{}Key_Rus[222]:=$25FF;{Э}
Key_Rus[186]:=$26FF;{Ж}Key_Rus[76]:=$27FF;{Д}
{3}Key_Rus[32]:=$30FF;{Пробел}Key_Rus[188]:=$31FF;{Б}Key_Rus[190]:=$32FF;{Ю} {16]:=$33FF;{НР}
Key_Rus[35]:=$34FF;{(END) = _}Key_Rus[17]:= $35FF;{ЛАТ (вверху)}Key_Rus[191]:=$36FF;{/}
Key_Rus[187]:=$37FF;{(,<) = (+=)}
{4}Key_Rus[27]:=$40FF;{СТР}Key_Rus[117]:=$41FF;{(F6) - (G)}Key_Rus[118]:=$42FF;{(F7) - (B)}
Key_Rus[53]:=$43FF;{5}Key_Rus[52]:=$44FF;{4}Key_Rus[51]:=$45FF;{3}Key_Rus[50]:=$46FF;{2}
Key_Rus[49]:=$47FF;{1}
{5}{50 и 51 -пусто по таблице}Key_Rus[81]:=$52FF;{Й}Key_Rus[89]:=$53FF;{Н}
Key_Rus[84]:=$54FF;{Е}Key_Rus[82]:=$55FF;{К}Key_Rus[69]:=$56FF;{У}
Key_Rus[87]:=$57FF;{Ц}
{6}Key_Rus[192]:=$60FF;{(`~)=(;+)}{61 -рус (выше)}Key_Rus[18]:= $62FF;{СУ}
Key_Rus[71]:=$63FF;{П}Key_Rus[70]:=$64FF;{А}Key_Rus[68]:=$65FF;{В}Key_Rus[83]:=$66FF;{Ы}
Key_Rus[65]:=$67FF;{Ф}
{7}Key_Rus[16]:=$70FF;{ВР}Key_Rus[90]:=$71FF;{Я}Key_Rus[88]:=$72FF;{Ч}
Key_Rus[77]:=$73FF;{Ь}Key_Rus[78]:=$74FF;{Т}Key_Rus[66]:=$75FF;{И}Key_Rus[86]:=$76FF;{M}
Key_Rus[67]:=$77FF;{С}
END;
if FileExists(ExtractFilePath_+'\SASEmulator.key') then begin
{$R-} for w:=0 to 255 do begin Key_engl[w]:=$FFFF;Key_Rus[w]:=$FFFF;end;
AssignFile(f,ExtractFilePath_+'\SASEmulator.key'); Reset(F);
For w:=0 to 255 do begin Read(F,Key_engl[w]); end;// Читання з файлу англійської розкладки
For w:=0 to 255 do begin Read(F,Key_Rus[w]); end;// Читання з файлу рус розкладки
closeFile(F); {$R+} end;
end;//end procedure InitKeyboard;
procedure init_RAM;
var i : integer;
begin
{$R-}
{.....}
i:=0; while (i<8) do begin kbd_base[i]:=0; inc(i); end;
i:=0; while (i<4) do begin kbd_ext[i]:=0; inc(i); end;
{.....}
{$R+}
end;
function do_read(addr : integer): integer; // читаємо значення з пам'яті
begin
addr:=(addr and $FFFF);
if ((ports[$C2] and 2)<>0) then result := RAM[addr]
else if (addr>$7FFF) then result := RAM[addr]
else if (addr<$4000) then result := 0
else result := VRAM[addr-$4000];
end;
function readmask (keynum: word): word;{по масці, натискання або відпускання клавіші}
{маска, використовується при натисканнях або при відпусканнях клавіш. див. далі}
Var b:byte;
begin
b:=do_read(48669);//KYB_MODE ( BE1DH (48669)) 7 бит =0, значит АНГЛ Раскадка
!!!! Або мабуть краще напряму b:=RAM[48669] ніж попередня строка !!!!
If (b and 128)=0 then result:=Key_engl[keynum] else
result:=Key_Rus[keynum];
end;
procedure kbd(mask : word; press : boolean);
var brow, erow, bcol, ecol : byte;
begin
bcol:=(mask SHR 12) and $0F; brow:=(mask SHR 8) and $0F; ecol:=(mask SHR 4) and $0F;
erow:=(mask SHR 0) and $0F;
if ((brow<8) and (bcol<8)) then
begin
if (press) then
begin
kbd_base[bcol]:=(kbd_base[bcol] or (1 SHL brow));
end else begin
kbd_base[bcol]:= (kbd_base[bcol] and (not(1 SHL brow)));
end;
end;
if ((erow<8) and (ecol<4)) then
begin
if (press) then
begin
kbd_ext[ecol]:= (kbd_ext[ecol]or (1 SHL erow));
end else begin
kbd_ext[ecol]:= (kbd_ext[ecol] and (not(1 SHL erow)));
end;
end;
end;
procedure TMainFormEmu.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin {...} kbd(readmask(key),true); {...}end;
procedure TMainFormEmu.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin {...}kbd(readmask(key),false); {...}end;
function do_input(port : byte): byte;
var
i,r : integer;
nD2 ,nD0 : byte;
begin
port:=$C0+(port and $13);
case port of
$C2: begin result := ports[$C2]; end;
$D1: begin
nD0:=not ports[$D0];
r:=0; i:=0;
while (i<8) do
begin
if ((nD0 and (1 SHL i))<>0) then
begin
r:=(r or kbd_base[i]);
end;
inc(i);
end;
result := ((not r) and $FF);
end;
$D2: begin
nD2:= not ports[$D2];
r:=0; i:=0;
while (i<4) do
begin
if ((nD2 and (1 SHL i))<>0) then
begin
r:=(r or kbd_ext[i]);
end;
inc(i);
end;
result := not ((r SHL 4) or (nD2 and $0F)) and $FF;
end
else
begin
result := $FF;
end;
end;
end;
procedure i8080_do_step;
{....}
$DB: {команда процесора IN}
begin r_A:=do_input(opcode2); Inc(clockStep,10); Inc(r_PC,2); end;
{....}
end;
program Keyboard; // программа для настройки клавиатуры в эмуляторе
program Keyboard; // программа для настройки клавиатуры в эмуляторе
// Программа создает файл "SASEmulator.key" который должен быть
// в том же каталоге что и эмулятор
//Key_engl:[код клавиши в винде]:=маска в ПК-01;
//Key_Rus:[код клавиши в винде]:=маска в ПК-01;
// в английской и русской расскладке возможно сделать разные клавиши
//
Var Key_engl: array[0..255]of word;// Английская расскладка клавиатуры
Key_Rus: array[0..255]of word;// Руская расскладка клавиатуры
w:word;
f:file of word;
begin
// инициализация
for w:=0 to 255 do begin Key_engl[w]:=$FFFF;Key_Rus[w]:=$FFFF;end;
// настройка английской раскладки
// Дополнительная клавиатура соответствие при английской раскладке
Key_engl[123]:=$FF00 ; // (F12) = (ПЧ)
Key_engl[122]:=$FF01 ; // (F11) = (CD)
Key_engl[121]:=$FF02 ; // (F10) = (Звук)
Key_engl[119]:=$FF03 ; // (F8) = ("R")
Key_engl[34]:=$FF10 ; // (PageDown) = (П/Д)
Key_engl[120]:=$FF11 ; // (F9) = (F0)
Key_engl[112]:=$FF12 ; // (F1) = (F1 чмл)
Key_engl[113]:=$FF13 ; // (F2) = (F2 змл)
Key_engl[36]:=$FF20 ; // Home = Home
Key_engl[116]:=$FF21 ; // F5
Key_engl[115]:=$FF22 ; // F4
Key_engl[114]:=$FF23 ; // F3
Key_engl[39]:=$FF30 ; // ->
Key_engl[38]:=$FF31 ; // UP
Key_engl[37]:=$FF32 ; // <- (влево)
Key_engl[40]:=$FF33 ; // DOWN
// Основная клавиатура соответствие при английской раскладке
Key_engl[54]:=$00FF ; // 6
Key_engl[55]:=$01FF ; // 7
Key_engl[56]:=$02FF ; // 8
Key_engl[45]:=$03FF ; // Insert = ГТ
Key_engl[9]:=$04FF ; // ТАБ (непойму почему-то работает как Ctrl+Tab)
Key_engl[189]:=$05FF ; // (-_) = (-=)
Key_engl[48]:=$06FF ; // 0
Key_engl[57]:=$07FF ; // 9
{1}
Key_engl[71]:=$10FF ; // G
Key_engl[219]:=$11FF ; // [
Key_engl[221]:=$12FF ; // ]
Key_engl[13]:=$13FF ; // ENTER
Key_engl[33]:=$14FF ; // PageUp = ПС
Key_engl[186]:=$15FF ; // (:;ж) = (:*)
Key_engl[72]:=$16FF ; // H
Key_engl[90]:=$17FF ; // Z
{2}
Key_engl[82]:=$20FF ; // R
Key_engl[79]:=$21FF ; // O
Key_engl[76]:=$22FF ; // L
Key_engl[8]:=$23FF ; // ЗБ
Key_engl[190]:=$24FF ; // (.>ю) = (.>)
Key_engl[220]:=$25FF ; // (\/|) = (\)
Key_engl[86]:=$26FF ; // V
Key_engl[68]:=$27FF ; // D
{3}
Key_engl[32]:=$30FF ; // Пробел
Key_engl[66]:=$31FF ; // B
Key_engl[222]:=$32FF ; // (@Ю)=("'ЄєЭэ)
Key_engl[16]:=$33FF ; // ВР
Key_engl[35]:=$34FF ; // (END) = (_)
// $35FF ; // ЛАТ
Key_engl[191]:=$36FF ; // /
Key_engl[188]:=$37FF ; // ,
{4}
Key_engl[27]:=$40FF ; // СТР
Key_engl[117]:=$41FF ; // (F6) - (G)
Key_engl[118]:=$42FF ; // (F7) - (B)
Key_engl[53]:=$43FF ; // 5
Key_engl[52]:=$44FF ; // 4
Key_engl[51]:=$45FF ; // 3
Key_engl[50]:=$46FF ; // 2
Key_engl[49]:=$47FF ; // 1
{5}
// 50 и 51 -пусто по таблице
Key_engl[74]:=$52FF ; // J
Key_engl[78]:=$53FF ; // N
Key_engl[69]:=$54FF ; // E
Key_engl[75]:=$55FF ; // K
Key_engl[85]:=$56FF ; // U
Key_engl[67]:=$57FF ; // C
{6}
Key_engl[192]:=$60FF ; // (`~)=(;+)
Key_engl[17]:= $61FF ; // РУС
Key_engl[18]:= $62FF ; // СУ
Key_engl[80]:=$63FF ; // P
Key_engl[65]:=$64FF ; // A
Key_engl[87]:=$65FF ; // W
Key_engl[89]:=$66FF ; // Y
Key_engl[70]:=$67FF ; // F
{7}
Key_engl[16]:=$70FF ; // Shift
Key_engl[81]:=$71FF ; // Q
Key_engl[187]:=$72FF ; // (+=) = (^)
Key_engl[88]:=$73FF ; // X
Key_engl[84]:=$74FF ; // T
Key_engl[73]:=$75FF ; // I
Key_engl[77]:=$76FF ; // M
Key_engl[83]:=$77FF ; // S
// настройка РУССКАЯ РАСКЛАДКИ
// Дополнительная клавиатура соответствие при РУССКАЯ РАСКЛАДКИ
Key_Rus[123]:=$FF00 ; // (F12) = (ПЧ)
Key_Rus[122]:=$FF01 ; // (F11) = (CD)
Key_Rus[121]:=$FF02 ; // (F10) = (Звук)
Key_Rus[119]:=$FF03 ; // (F8) = ("R")
Key_Rus[34]:=$FF10 ; // (PageDown) = (П/Д)
Key_Rus[120]:=$FF11 ; // (F9) = (F0)
Key_Rus[112]:=$FF12 ; // (F1) = (F1 чмл)
Key_Rus[113]:=$FF13 ; // (F2) = (F2 змл)
Key_Rus[36]:=$FF20 ; // Home = Home
Key_Rus[116]:=$FF21 ; // F5
Key_Rus[115]:=$FF22 ; // F4
Key_Rus[114]:=$FF23 ; // F3
Key_Rus[39]:=$FF30 ; // ->
Key_Rus[38]:=$FF31 ; // UP
Key_Rus[37]:=$FF32 ; // <- (влево)
Key_Rus[40]:=$FF33 ; // DOWN
// Основная клавиатура соответствие при РУССКАЯ РАСКЛАДКИ
Key_Rus[54]:=$00FF ; // 6
Key_Rus[55]:=$01FF ; // 7
Key_Rus[56]:=$02FF ; // 8
Key_Rus[45]:=$03FF ; // Insert = ГТ
Key_Rus[9]:=$04FF ; // ТАБ
Key_Rus[189]:=$05FF ; // (-_) = (-=)
Key_Rus[48]:=$06FF ; // 0
Key_Rus[57]:=$07FF ; // 9
{1}
Key_Rus[85]:=$10FF ; // Г
Key_Rus[73]:=$11FF ; // Ш
Key_Rus[79]:=$12FF ; // Щ
Key_Rus[13]:=$13FF ; // ENTER
Key_Rus[33]:=$14FF ; // PageUp = ПС
Key_Rus[221]:=$15FF ; // (:;ж) = (Ж)
Key_Rus[219]:=$16FF ; // Х
Key_Rus[80]:=$17FF ; // З
{2}
Key_Rus[72]:=$20FF ; // Р
Key_Rus[74]:=$21FF ; // О
Key_Rus[75]:=$22FF ; // Л
Key_Rus[8]:=$23FF ; // ЗБ
Key_Rus[220]:=$24FF ; //
Key_Rus[222]:=$25FF ; // Э
Key_Rus[186]:=$26FF ; // Ж
Key_Rus[76]:=$27FF ; // Д
{3}
Key_Rus[32]:=$30FF ; // Пробел
Key_Rus[188]:=$31FF ; // Б
Key_Rus[190]:=$32FF ; // Ю
//16]:=$33FF ; // НР
Key_Rus[35]:=$34FF ; // (END) = _
Key_Rus[17]:= $35FF ; // ЛАТ (вверху)
Key_Rus[191]:=$36FF ; // /
Key_Rus[187]:=$37FF ; // (,<) = (+=)
{4}
Key_Rus[27]:=$40FF ; // СТР
Key_Rus[117]:=$41FF ; // (F6) - (G)
Key_Rus[118]:=$42FF ; // (F7) - (B)
Key_Rus[53]:=$43FF ; // 5
Key_Rus[52]:=$44FF ; // 4
Key_Rus[51]:=$45FF ; // 3
Key_Rus[50]:=$46FF ; // 2
Key_Rus[49]:=$47FF ; // 1
{5}
// 50 и 51 -пусто по таблице
Key_Rus[81]:=$52FF ; // Й
Key_Rus[89]:=$53FF ; // Н
Key_Rus[84]:=$54FF ; // Е
Key_Rus[82]:=$55FF ; // К
Key_Rus[69]:=$56FF ; // У
Key_Rus[87]:=$57FF ; // Ц
{6}
Key_Rus[192]:=$60FF ; // (`~)=(;+)
// 61 -рус (выше)
Key_Rus[18]:= $62FF ; // СУ
Key_Rus[71]:=$63FF ; // П
Key_Rus[70]:=$64FF ; // А
Key_Rus[68]:=$65FF ; // В
Key_Rus[83]:=$66FF ; // Ы
Key_Rus[65]:=$67FF ; // Ф
{7}
Key_Rus[16]:=$70FF ;// ВР
Key_Rus[90]:=$71FF ; // Я
Key_Rus[88]:=$72FF ; // Ч
Key_Rus[77]:=$73FF ; // Ь
Key_Rus[78]:=$74FF ; // Т
Key_Rus[66]:=$75FF ; // И
Key_Rus[86]:=$76FF ; // M
Key_Rus[67]:=$77FF ; // С
//Создание файла SASEmulator.key
Rewrite(F,'SASEmulator.key');
For w:=0 to 255 do begin Write(F,Key_engl[w]); end;// Записывание в файл Английской расскладки
For w:=0 to 255 do begin Write(F,Key_Rus[w]); end;// Записывание в файл Русской расскладки
closeFile(F);
end.
Вирізка реалізації клавіатури ПК-01 “Львів” в емуляторі SAFA