Середовище програмування MADL

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Середовище програмування MADL » ПК-01 "Львів" » ПЕРСОНАЛЬНА ЕОМ ПК-01 "ЛЬВІВ" ІНСТРУКЦІЯ ПРОГРАМІСТУ


ПЕРСОНАЛЬНА ЕОМ ПК-01 "ЛЬВІВ" ІНСТРУКЦІЯ ПРОГРАМІСТУ

Сообщений 1 страница 64 из 64

1

589.0196339 00001-01 35 01
Додаток 3

ПЕРСОНАЛЬНА ЕОМ ПК-01 "ЛЬВІВ"
ІНСТРУКЦІЯ ПРОГРАМІСТУ

Переклад з допомогою https://translate.google.com.ua документацій
"ПЕРСОНАЛЬНАЯ ЭВМ ПК-01 ЛЬВОВ РУКОВОДСТВО ПРОГРАММИСТУ.txt" та
"РУКОВОДСТВО ПРОГРАММИСТУ ПЕРСОНАЛЬНАЯ ЭВМ ПК-01 ЛЬВОВ(1).txt"

Оригінальні файли "ПЕРСОНАЛЬНАЯ ЭВМ ПК-01 ЛЬВОВ РУКОВОДСТВО ПРОГРАММИСТУ.txt" та  "РУКОВОДСТВО ПРОГРАММИСТУ ПЕРСОНАЛЬНАЯ ЭВМ ПК-01 ЛЬВОВ(1).txt"
Скачати можна тут: http://forumstatic.ru/files/001b/d4/a7/16995.7z

1. Архітектура ПК-01

          1.1 Загальні особливості

          1.2 Розподіл адресного простору
          Розподіл адресного простору в системної галузі ОЗУ

          1.3 Перезапуск системи

          1.4 Порти введення-виведення, клавіатура

          1.5 Підключення принтера

          1.6 Відеоконтролер

2. Системні підпрограми ПЗП

          2.1 Таблиця переходів

          2.2 Введення-виведення символів
                    2.2.1 Введення символу з клавіатури з відпрацюванням спеціальних функцій (KEY)
                    2.2.2 Введення символу без відпрацювання спеціальних функцій (KY*)
                    2.2.3 Статус клавіатури (STK)
                    2.2.4 Виведення символу на екран (TTY)
                    2.2.5 Виведення символу на принтер (PRN)
                    2.2.6 Виведення символу на екран та/або принтер ( LST )
                    2.2.7 Виведення на екран текстового повідомлення (TEXT)
                    2.2.8 Виведення на екран вмісту регістру A у шістнадцятковому вигляді (HEX(A))
                    2.2.9 Виведення на екран вмісту реєстрової пари HL у шістнадцятковому вигляді (HEX(HL))
                    2.2.10 Виведення на екран контрольної суми блоку (CHECKSUM)
                    2.2.11 Позиціонування курсору (LOCATE)

          2.3 Графіка
                    2.3.1 Очищення екрана (CLS)
                    2.3.2 Виведення на екран точки (PSET)
                    2.3.3 Стирання точки (PRESET)
                    2.3.4 Виведення на екран лінії (LINE)
                    2.3.5 Виведення на екран прямокутника (LINE.. B)
                    2.3.6 Виведення зафарбованого прямокутника (LINE.. BF)
                    2.3.7 Зафарбування замкнутої фігури (PAINT)
                    2.3.8 Встановлення палітри кольорів ( COLOR )
                    2.3.9 Копіювання екрана на принтері (COPY)

          2.4 Підпрограми виведення МЛ
                    2.4.1 Передача біта "0" (WR_0)
                    2.4.2 Передача біта "1" (WR_1)
                    2.4.3 Передача періоду меандру
                    2.4.4 Передача пілот-сигналу (WR_PILOT)
                    2.4.5 Передача байта (WR_BYTE)
                    2.4.6 Передача слова (WR_WORD)
                    2.4.7 Передача заголовка файлу (WR_HEAD)
                    2.4.8 Передача кодового файлу (BSAVE)

          2.5 Підпрограми введення з МЛ
                    2.5.1 Прийом пілот-сигналу (RD_PILOT)
                    2.5.2 Прийом байта (RD_BYTE)
                    2.5.3 Прийом слова (RD_WORD)
                    2.5.4 Прийом заголовка файлу (RD_HEAD)
                    2.5.5 Прийом блоку (RD_BLOCK)
                    2.5.6 Прийом кодового файлу (BLOAD)

          2.6 Інші
                    2.6.1 Короткий звуковий сигнал (BEEP)
                    2.6.2 Керований звуковий сигнал (SOUND)
                    2.6.3 Обчислення екранної адреси за координатами (VADDR)
                    2.6.4 Заповнення екранного ОЗП кодом
                    2.6.5 Очищення основної області екрана
                    2.6.6 Курсор на початок екрана
                    2.6.7 Переміщення масивів (MOVE)
                    2.6.8 Заповнення області ОЗУ кодом (FILL)
                    2.6.9 Переведення напівбайта з HEX до DEC
                    2.6.10 Виведення на екран напівбайта у HEX
                    2.6.11 Множення DE на A (складення A разів)
                    2.6.12 Перевірка умови DE = HL
                    2.6.13 Заповнення пробілами

3. Зведена таблиця системних підпрограм

4. Зведена таблиця системних змінних

          4.1 Системні змінні BIOS

          4.2 Системні змінні інтерпретатора BASIC

2

1. Архітектура ПК-01
1.1 Загальні особливості.

    Домашня мікро-ЕОМ ПК-01 "Львів" побудована на мікропроцесорі (МП) КР580ВМ80А (Intel 8080), який працює з тактовою частотою 2.5 МГц, що забезпечує швидкодію 500 тисяч коротких операцій регістр-регістр за секунду. Особливостями цього мікрокомп'ютера є сторінкова організація ОЗУ та повна відсутність системи переривань (у стандартній конфігурації). Архітектурні особливості ПК-01 зумовлюють його несумісність (без відповідних емуляторів) з мікро-ЕОМ лінії РАДІО-86РК/ОРІОН-128, побудованих на тому ж МП. Об`єм ПЗУ (ROM) ПК-01, виконаного на 8 УФ-РПЗУ К573РФ2 складає 16К. Загальний обсяг ОЗП (RAM), виконаного на МС К565РУ5 складає 64К, причому 16К з них призначені для зберігання зображення (Video - RAM) і не входять у звичайному режимі в основне адресний простір. Формування зображення та регенерація динамічного ОЗУ здійснюються спеціальними контролерами, побудованими на ІМС середнього ступеня інтеграції серій 155 та 555. Інтерфейс з пристроями введення-виведення, керування палітрою зображення та розподілом адресного простору ОЗП (підключення Video-RAM до шин МП) здійснюються за допомогою двох
БІС паралельних програмованих адаптерів (ППА) КР580ВВ55.

3

1.2 Розподіл адресного простору.


FFFFH ----------------------------------------------- 65535
         ROM Драйвери пристроїв, системні підпрограми,
               знакогенератор, BASIC, 16K
C000H ----------------------------------------------- 49152
BFFFH ----------------------------------------------- 49151
             SYSTEM RAM Системна область, 4K
B000H ----------------------------------------------- 45056
AFFFH ----------------------------------------------- 45055
            RAM Буфер символьних змінних BASIC
AFC1H ----------------------------------------------- 44993
AFC0H ----------------------------------------------- 44992
                          Стек, вільна область
8000H ----------------------------------------------- 32768
7FFFH ----------------------------------------------- 32767
            RAM/Video Вільна область/Екран,16K
4000H ----------------------------------------------- 16384
3FFFH ----------------------------------------------- 16383
                 RAM Вільна область, 10K
1723H ----------------------------------------------- 05923
1722H ----------------------------------------------- 05922
                 RAM Інтерпретатор BASIC, 6K
  0249H (585) | ZZZZ - початок вільної області
  0247H (583) | YYYY - початок області масивів
  0245H (581) | XXXX - початок області змінних
  0243H (579) | 1723 - початок BASIC-програми
0006H ----------------------------------------------- 00006
0005H ----------------------------------------------- 00005
                   RAM Вільна область
0000H ----------------------------------------------- 00000

4

Розподіл адресного простору в системної галузі ОЗУ

BFFFH ----------------------------------------------- 49151
           Таблиця переходів на драйвери пристроїв
BFEBH ----------------------------------------------- 49131
BFEAH ----------------------------------------------- 49130
                   Системні змінні
BE00H ----------------------------------------------- 48640
BDFFH ----------------------------------------------- 48639
                    Вільна область
B800H ----------------------------------------------- 47104
B7FFH ----------------------------------------------- 47103
               Знакогенератор: CHR 128-255
B400H ----------------------------------------------- 46080
B3FFH ----------------------------------------------- 46079
               Знакогенератор: CHR 000-127
B000H ----------------------------------------------- 45056

5

1.3 Перезапуск системи.

   При натисканні [СБР] відбувається формування сигналу RESET для МП та його перезапуск. Подальші дії системи визначаються клавішею, натиснутою одночасно з [СБР]. Можливі наступні варіанти:

[СУ ]+[СБР] : Виконується тестова підпрограма, розміщена в ПЗП. При несправності видається звуковий сигнал, при нормальному завершенні відбувається "холодний" рестарт системи (аналогічно [СБР]).

[T/Т]+[СБР] : Здійснює підрахунок КС ПЗУ по окремих корпусах К573РФ2 і в цілому, після чого запуск системи не відбувається. При натисканні [РУС],[Ф] видається інформація про розробника вмісту ПЗП. Ймовірні значення КС ПЗУ (у ПК різного часу випуску вони відрізняються ) наступні : 03348A; 0380DD; 037E80;03F6A3; 042870; 039C0B; 046594; 038D67; 1DE200.

[C/Ц]+[СБР] : Виконується "теплий" рестарт системи: обнуляється область системної ОЗУ B000H-0000H, перезавантажуються з ПЗУ знакогенератор (CHR 000-127), системні змінні, таблиця переходів на драйвери пристроїв введення-виведення, після чого відбувається перехід за адресою, розміщеною в осередках пам'яті                (ЯП) BFEC/BFED. Після "холодного" старту там находить адреса старту BASIC-системи D7D9, але користувач може змінити це значення, забезпечивши запуск по [C/Ц]+[СБР] будь-якої іншої програми. При "гарячому" перезапуску вміст всіх інших областей ОЗП не змінюється.

При натисканні [СБР] з будь-якою іншою клавішею або поодинці відбувається "холодний" перезапуск системи. Крім дій "гарячого" перезапуску виконуються також відновлення стандартного значення BFEC/BFED, обнулення області 0000H-0000H, перезавантаження BASIC з ПЗУ в ОЗУ, формування заставки (при цьому використовується область 8000H-0000H) та запуск BASIC-системи.

6

1.4 Порти введення-виведення, клавіатура.
https://forumupload.ru/uploads/001b/d4/a7/2/583027.png
Інші фото:
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) - для введення.

Код:
Призначення біт порту C (C2H):
           ╔═══╤═══╤═══╤═══╤═══╤═══╤═══╤═══╗
           ║ 7 ¦ 6 ¦ 5 ¦ 4 ¦ 3 ¦ 2 ¦ 1 ¦ 0 ║
           ╚═══╧═╤═╧═══╧═╤═╧═══╧═╤═╧═╤═╧═╤═╝
                 AC     ЧМЛ     SC   ¦  ЗМЛ
                BUSY          STROBE ¦ 
                ГОТОВИЙ        ДРУК  └─ VIDEO

Біт 4, - читання з МЛ
Біт 1, - керування Екранним ОЗП,
   "1"- відключено (за замовченням), "0" - підключено до шин МП.

    Для підключення клавіатури до ПК також застосована БІС КР580ВВ55 (D1). Її адреси:
         Порт A (тільки виведення) - D0H (208)
         Порт B (тільки для введення) - D1H (209)
         Порт C ( введення та виведення ) - D2H ( 210 )
         Регістр керувального слова - D3H ( 211 )

    Підключення портів до клавіатури ПК-01 показано малюнку. Принцип опитування клавіатури полягає в наступному: послідовною подачею логічного "0" на кожен із розрядів портів A та C(0-3) дозволяється опитування відповідного напіврядку клавіатури. Результат опитування містять порти B і C(4-7) для основної та функціональної клавіатури відповідно.

Основна клавіатура
Латиниця.

Код:
Латиниця.
   Порт A, D0H (208) ═ вибір напіврядку ( виведення OUT) Порт B, D1H (209)
╔═════╤═════╤═════╤═════╤═════╤═════╤═════╤═════╗         
║  7  │  6  │  5  │  4  │  3  │  2  │  1  │  0  ║ BIT   опитування
║═════╪═════╪═════╪═════╪═════╪═════╪═════╪═════║        напіврядку
║ 7FH │ BFH │ DFH │ EFH │ F7H │ FBH │ FDH │ FEH ║ HEX  ( введення IN)
║═════╪═════╪═════╪═════╪═════╪═════╪═════╪═════║
║ 127 │ 191 │ 223 │ 239 │ 247 │ 251 │ 253 │ 254 ║  
                                                   DEC   HEX  BIT
╔═════╤═════╤═════╤═════╤═════╤═════╤═════╤═════╗ ═════╤═════╤═══╗
║ НР  │  ;  │     │ СТР │ ПРБ │  R  │  G  │  6  ║  254 │ FEH │ 0 ║
║─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────╢ ═════╪═════╪═══║
║  Q  │ РУС │     │ (G) │  B  │  O  │  [  │  7  ║  253 │ FDH │ 1 ║
║─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────╢ ═════╪═════╪═══║
║  ^  │ СУ  │  J  │ (B) │  @  │  L  │  ]  │  8  ║  251 │ FBH │ 2 ║
║─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────╢ ═════╪═════╪═══║
║  X  │  P  │  N  │  5  │ ВР  │ ЗБ  │ ВК  │ ГТ  ║  247 │ F7H │ 3 ║
║─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────╢ ═════╪═════╪═══║
║  T  │  A  │  E  │  4  │ ___ │  .  │ ПС  │ ТАБ ║  239 │ EFH │ 4 ║
║─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────╢ ═════╪═════╪═══║
║  I  │  W  │  K  │  3  │ ЛАТ │  \  │  :  │  -  ║  223 │ DFH │ 5 ║
║─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────╢ ═════╪═════╪═══║
║  M  │  Y  │  U  │  2  │  /  │  V  │  H  │  0  ║  191 │ BFH │ 6 ║
║─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────╢ ═════╪═════╪═══║
║  S  │  F  │  C  │  1  │  ,  │  D  │  Z  │  9  ║  127 │ 7FH │ 7 ║
╚═════╧═════╧═════╧═════╧═════╧═════╧═════╧═════╝ ═════╧═════╧═══╝

Кирилиця.

Код:
Кирилиця.
   Порт A, D0H (208) ═ вибір напіврядку ( виведення OUT) Порт B, D1H (209)
╔═════╤═════╤═════╤═════╤═════╤═════╤═════╤═════╗         
║  7  │  6  │  5  │  4  │  3  │  2  │  1  │  0  ║ BIT   опитування
║═════╪═════╪═════╪═════╪═════╪═════╪═════╪═════║        напіврядку
║ 7FH │ BFH │ DFH │ EFH │ F7H │ FBH │ FDH │ FEH ║ HEX  ( введення IN)
║═════╪═════╪═════╪═════╪═════╪═════╪═════╪═════║
║ 127 │ 191 │ 223 │ 239 │ 247 │ 251 │ 253 │ 254 ║  
                                                   DEC   HEX  BIT
╔═════╤═════╤═════╤═════╤═════╤═════╤═════╤═════╗ ═════╤═════╤═══╗
║  ВР │  ;  │     │ СТР │ ПРБ │  Р  │  Г  │  6  ║  254 │ FEH │ 0 ║
║─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────╢ ═════╪═════╪═══║
║  Я  │ РУС │     │ (G) │  Б  │  О  │  Ш  │  7  ║  253 │ FDH │ 1 ║
║─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────╢ ═════╪═════╪═══║
║  Ч  │ СУ  │  Й  │ (B) │  Ю  │  Л  │  Щ  │  8  ║  251 │ FBH │ 2 ║
║─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────╢ ═════╪═════╪═══║
║  Ь  │  П  │  Н  │  5  │  НР │ ЗБ  │ ВК  │ ГТ  ║  247 │ F7H │ 3 ║
║─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────╢ ═════╪═════╪═══║
║  Т  │  А  │  Е  │  4  │ ___ │  .  │ ПС  │ ТАБ ║  239 │ EFH │ 4 ║
║─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────╢ ═════╪═════╪═══║
║  И  │  В  │  К  │  3  │ ЛАТ │  Э  │  *  │  -  ║  223 │ DFH │ 5 ║
║─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────╢ ═════╪═════╪═══║
║  М  │  Ы  │  У  │  2  │  /  │  Ж  │  Х  │  0  ║  191 │ BFH │ 6 ║
║─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────╢ ═════╪═════╪═══║
║  С  │  Ф  │  Ц  │  1  │  ,  │  Д  │  З  │  9  ║  127 │ 7FH │ 7 ║
╚═════╧═════╧═════╧═════╧═════╧═════╧═════╧═════╝ ═════╧═════╧═══╝

Скрини оригіналу:
https://forumupload.ru/uploads/001b/d4/a7/2/221127.png
https://forumupload.ru/uploads/001b/d4/a7/2/379380.png

Код:
Приклад:
Ar($EF);OUT_($D0);      { На 4 стовп (розряд), порту A, ($D0) (208) подаємо "0", тобто $EF } {стовп 4 = кл. СТР,(G),(B),5,4,3,2,1 } { $EF=11101111 } 
IN_($D1);     { Опитуємо порт B, (D1) (209) }

If_(A,is_,$7F, натиснута "1");{Якщо на 7-му рядку (розряду), порт B, ($D1) (209) = "0", тобто $7F, - натиснута "1"}  {$7F=01111111}
If_(A,is_,$BF, натиснута "2");  {$BF=10111111} 

Функціональна клавіатура

Код:
                        Порт С, D2 (210 )
            (розряди 0-3, виб?р напівряду, виведення OUT)
                ╔═════╤═════╤═════╤═════╗
                ║  3  ¦  2  ¦  1  ¦  0  ║ BIT, 
                ║═════╪═════╪═════╪═════║         
                ║ 07H ¦ 0BH ¦ 0DH ¦ 0EH ║ HEX
                ║═════╪═════╪═════╪═════║       
                ║  7  ¦  11 ¦  13 ¦  14 ║ DEC        
                                           BIT
                ╔═════╤═════╤═════╤═════╗ ╤═══╗ (розряди 4-7,  
                ║ ПРА ¦ ДИА ¦ П/Д ¦ ПЧ  ║ ¦ 4 ║    
                ║─────┼─────┼─────┼─────║ ╪═══║ введення IN)     
                ║ ВРХ ¦ F5  ¦ F0  ¦ CD  ║ ¦ 5 ║      
                ║─────┼─────┼─────┼─────║ ╪═══║ 
                ║ ЛЕВ ¦ F4  ¦ F1  ¦ ДИН ║ ¦ 6 ║    
                ║─────┼─────┼─────┼─────║ ╪═══║
                ║ НИЗ ¦ F3  ¦ F2  ¦ (R) ║ ¦ 7 ║    
                ╚═════╧═════╧═════╧═════╝ ╧═══╝

Приклад:
Ar($F7);OUT_($D2); { На 3 стовп (розряд), порту C, ($D2) (210) подаємо "0", тобто $7 }{стовп 3 = кл. ПРА, ВРХ, ЛЕВ, НИЗ} {$7=0111}
IN_($D2); { Опитуємо порт С, (D2) (210)

Далі 2 варіанти...

 1 варіант:
Ai($F0);     {"відсіємо" (розряди 0-3) }{$F0=11110000}

{ "ПРА" = 11100000 = E0H = 224
  "ВРХ" = 11010000 = D0H = 208
  "ЛЕВ" = 10110000 = B0H = 176
  "НИЗ" = 01110000 = 70H = 112 }

 2 варіант:
NotA;  {"перевернемо" результат, щоб "1" значило натискання кл., а не "0"}
Ai($F0);     {"відсіємо" (розряди 0-3) }{$F0=11110000}

{ "ПРА" = 00010000 = 10H = 16
  "ВРХ" = 00100000 = 20H = 32
  "ЛЕВ" = 01000000 = 40H = 64
  "НИЗ" = 10000000 = 80H = 128 }

Скрини оригіналу:
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

https://forumupload.ru/uploads/001b/d4/a7/2/966356.jpg
{Вирізка реалізації клавіатури ПК-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

https://forumupload.ru/uploads/001b/d4/a7/2/966356.jpg
{Вирізка реалізації клавіатури ПК-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

https://forumstatic.ru/files/001b/d4/a7/99162.png

7

1.5 Підключення принтера.

    У комп'ютері передбачено стандартне підключення EPSON - сумісного принтера за інтерфейсом "ІРПР" або "CENTRONIX" (ІРПР-М). Розпаювання роз'єму "ЗОВНІШ - 2" для підключення принтеру "ROBOTRON CM 6329.01M" по "ІРПР" наведено на малюнку. При підключенні принтера слід пам'ятати про те, що довжина з'єднувального кабелю для "ІРПР" не повинна перевищувати 15 м. і кожна сигнальна жила кабелю (С) повинна бути переплетена з своєї "земляної" (З) (для плоского кабелю - ЗСЗС .... СЗСЗ ), причому "земляні" жили повинні бути підключені до 0V з обох кінців кабелю.

Код:
           ПРИНТЕР                      ЗОВНІШ - 2
        -----T-----¬                  -----T----¬
        ¦ 1  ¦ GND ¦------------------¦ 0V ¦    ¦
        ¦ 2  ¦ SC  ¦<----  ДРУК  -----¦ C2 ¦ 6  ¦
        ¦ 3  ¦ AC  ¦----- ГОТОВ ----->¦ C6 ¦ 21 ¦
        ¦ 4  ¦     ¦                  ¦    ¦    ¦
        ¦ 5  ¦ D0  ¦------------------¦ A0 ¦ 39 ¦
        ¦ 6  ¦ D1  ¦------------------¦ A1 ¦ 37 ¦
        ¦ 7  ¦ D2  ¦------------------¦ A2 ¦ 35 ¦
        ¦ 8  ¦ D3  ¦------------------¦ A3 ¦ 33 ¦
        ¦ 9  ¦ D4  ¦------------------¦ A4 ¦ 31 ¦
        ¦ 10 ¦ D5  ¦------------------¦ A5 ¦ 29 ¦
        ¦ 11 ¦ D6  ¦------------------¦ A6 ¦ 27 ¦
        ¦ 12 ¦ D7  ¦------------------¦ A7 ¦ 25 ¦
        ¦ 13 ¦     ¦                  ¦    ¦    ¦
        L----+------                  L----+-----

Скрин2: https://forumupload.ru/uploads/001b/d4/a7/2/852492.png

    Виведення інформації здійснюється так: комп'ютер опитує сигнал "ГОТОВ" від принтера; якщо цей сигнал не дорівнює "0", то комп'ютер очікує. Як тільки "ГОТОВ" стає рівним "0", комп'ютер видає на порт A символ у коді КОІ-7 ( КОІ-8 ) інверсному (прямому) вигляді, а потім переводить сигнал "ДРУК" в "0", що є для принтера командою до прийому та друку символу. Принтер переводить "ГОТОВ" в "1", а комп'ютер, прийнявши цей
сигнал переводить "ДРУК" в "1", після чого цикл повторюється.

8

1.6 Відеоконтролер.

    Для забезпечення відображення інформації на екрані відеомонітору ( телевізора ) в комп'ютері є відеоконтролер, який здійснює періодичне зчитування інформації з екранного ОЗП та формування відеосигналу.
    У звичайному режимі екранне ОЗП відключено від шин МП та програмний доступ до нього неможливий. Для роботи МП із цією областю ОЗП вона може бути підключена замість ділянки основної ОЗП по адресам 4000H-7FFFH ( 16384-32767 ) за допомогою біта 1 порту C2H (194) (0 - Open Video RAM, 1 - Close Video RAM). Однак слід пам'ятати, що при такому перемиканні від шин МП вимикається область основного ОЗП 0000H-7FFFH ( 00000-32767 ), тому процедури, що працюють при відкритій відеопам'яті не можна розміщати нижче 8000H (32768). Усі основні підпрограми ПЗП, які працюють з екраном "не забувають" закрити відеопам'ять перед повертанням і з ними такої проблеми не виникає.
    Формування відеосигналу в ПК-01 виконується так, що один байт екранного ОЗП кодує кольори чотирьох сусідніх пікселів по горизонталі. Принцип кодування кольорів показаний на малюнку:

Код:
    ----T---T---T---T---T---T---T---¬
    ¦ 7 ¦ 6 ¦ 5 ¦ 4 ¦ 3 ¦ 2 ¦ 1 ¦ 0 ¦  Байт екранного ОЗП
    L-T-+-T-+-T-+-T-+-T-+-T-+-T-+-T--
      ¦   ¦   ¦   L---+---+---+---*
      ¦   ¦   L-------+---+---*   ¦
      ¦   L-----------+---*   ¦   ¦
      L---------------*   ¦   ¦   ¦
                      ¦   ¦   ¦   ¦
                    --+-T-+-T-+-T-+-¬
                    ¦ 1 ¦ 2 ¦ 3 ¦ 4 ¦  Пікселі на екрані
                    L---+---+---+----

    Наявність "1" в бітах 7-4 задає логічний колір 1 для відповідних пікселів, у бітах 3-0 - колір 2, у парі бітів
(7-3, 6-2, 5-1, 4-0) - колір 3, інакше відповідні пікселі мають колір фону (0). Відповідність логічних кольорів 0,1,2,3 реальним ( палітра ) визначається станом порту C1H ( 193 ).

9

2. Системні підпрограми ПЗП.
2.1 Таблиця переходів.

    Основна таблиця переходів на підпрограми, що реалізують найважливіші системні функції та утворюють Базову Систему Введення-виведення (БСВВ або BIOS або МОНІТОР) розташована у ПЗП за адресами F800H-F838H ( 63488-63544 ) та в ОЗП за адресами BFEBH-BFFDH ( 49131-49149 ) та має такий вигляд:

Код:
   ------- ROM -------       ------- RAM -------      Name

   F800H    JMP  BFEBH       BFEBH    JMP  D7D9H      BASIC
   F803H    JMP  BFEEH       BFEEH    JMP  E800H      KEY
   F806H    JMP  BFF1H       BFF1H    JMP  E843H      KY*
   F809H    JMP  BFF4H       BFF4H    JMP  DF68H      TTY
   F80CH    JMP  BFF7H       BFF7H    JMP  E236H      PRN
   F80FH    JMP  BFFAH       BFFAH    JMP  E222H      LST
   F812H    JMP  BFFDH       BFFDH    JMP  E888H      STK
   F815H    JMP  FF90H                                CHECKSUM
   F818H    JMP  F067H                                VADDR
   F81BH    JMP  DEBFH                                BEEP
   F81EH    JMP  DE94H                                SOUND
   F821H    JMP  F048H                                PSET
   F824H    JMP  F112H                                LINE
   F827H    JMP  F1A5H                                BOX
   F82AH    JMP  F1DAH                                FIL_BOX
   F82DH    JMP  DF02H                                LOCATE
   F830H    JMP  E774H                                PAINT
   F833H    JMP  DE3CH                                COLOR
   F836H    JMP  EBD0H                                CLS

    Наведені тут умовні назви системних підпрограм не слід ототожнювати з однойменними операторами BASIC 2.0, хоча оператори BASIC і є зверненням до цих підпрограм.

    Таким чином, використовуючи розміщену в ОЗП частину таблиці, користувач може перевизначити основні системні процедури введення-виведення, з'єднавши драйвери нестандартних зовнішніх пристроїв, наприклад драйвер, що дозволяє використовувати як текстового принтера телетайп або електричну друкувальну машинку (Типу CONSUL).
    Стандартна BASIC – система завжди працює з пристроєм виведення LST.
    Більш докладний опис системних підпрограм ПЗП наводиться нижче. Слід також зазначити, що лише деякі з системних підпрограм ПК-01 збігаються за адресами викликів з аналогічними в мікрокомп'ютерах лінії "РАДІО-86РК/ОРІОН-128".

10

2.2 Введення-виведення символів.
2.2.1 Введення символу з клавіатури з відпрацюванням спеціальних функцій (KEY).

Точка входу F803H - BFEEH - E800H (63491 - 49134 - 59392).
Підпрограма очікує натискання символьної клавіші та повертає код символу в КОІ-7 у регістрі A МП. Введений символ на пристрій виведення не передається. Використовуються системні змінні KYB_MODE (BE1DH (48669)) та KYB_BEEP (BE1EH (48670)).
    Під системною змінною тут і далі розуміється зарезервована комірка ( комірки ) системної ОЗП, значення якої є вхідним, вихідним, або проміжним параметром при роботі однієї із системних підпрограм.
    Структура системної змінної KYB_MODE наведена на малюнку:

Код:
       ----T---T---T---T---T---T---T---¬
       ¦ 7 ¦ 6 ¦ 5 ¦ 4 ¦ 3 ¦ 2 ¦ 1 ¦ 0 ¦
       L-T-+---+---+---+---+-T-+-T-+-T--
         ¦                   ¦   ¦   L-------- 1 - ВР
         L 1 - РУС           ¦   L------------ 1 - НР
           0 - ЛАТ           L---------------- 1 - СУ

    Ознаки ВР, НР та СУ не фіксуються, а РУС/ЛАТ -фіксується. Системна змінна KYB_BEEP визначає наявність звукового сигналу. натискання клавіші ( 00 - вимк., FFH (255) - вкл., можливі проміжні значення). Тональність сигналу залежить від встановлених параметрів запису на МЛ.
    Коди функціональних клавіш, що вводяться підпрограмами KEY та KY*:

00H( 0)- (G)   01H( 1)- (B)   02H( 2)- (R)   03H( 3)- КЛ_ЗВУК
04H( 4)- CD    05H( 5)- ПЧ    06H( 6)- П/Д   07H( 7)- F0
08H( 8)- ДИАГ  09H( 9)- ГТ    0AH(10)- ПС    0BH(11)-
0CH(12)-       0DH(13)- ВК    0EH(14)-       0FH(15)-
10H(16)-       11H(17)-       12H(18)- F2    13H(19)- F5
14H(20)- F4    15H(21)- F1    16H(22)- F3    17H(23)-
18H(24)- ТАБ   19H(25)- ПРАВ  1AH(26)- ЛЕВ   1BH(27)-
1CH(28)- ВЕРХ  1DH(29)- НИЗ   1EH(30)-       1FH(31)-

Інші коди ( 20H - 7FH ( 32 -127 )) - стандартні для КОІ-7. Слід зазначити, що коди, що відповідають функціональним клавішам, при виведенні підпрограмами TTY, PRN, LST можуть відпрацювати інші функції, ніж під час введення. Підпрограма KEY відпрацьовує наступні спеціальні функції:
    СТР - очищення екрану (звернення до п/п CLS);
    (G) - те саме, але з обнуленням рамки (BORDER);та встановленням COLOR 0,0,0;
    (B) - те саме, але COLOR 1,0,6;
    (R) - те саме, але COLOR 0,7,3;
    КЛ_ЗВУК - вкл./вимк. звукового сигналу клавіатури (інверсія системної змінної KYB_BEEP);
    CD - увімк./вимк. посторінкового виведення тексту на екран (інверсія системної змінної SCRL_LOCK);
    ПЧ - увімк./вимк. виведення тексту на принтер підпрограмою LST (перемикання системної змінної PRN_OUT); Ознака активації виведення на принтер - символ "*" внизу екрана;
    П/Д - вкл./вимк. виведення тексту на екран підпрограмою LST (інверсія системної змінної DISP_OUT);
    СУ+ПЧ -функція COPY (копіювання екрану на EPSON-сумісному принтері в графічному режимі (режим графіки SINGLE DENSITY (ESC "K")).

11

2.2.2 Введення символу без відпрацювання спеціальних функцій (KY*).

Точка входу F806H - BFF1H - E843H (63494 - 49137 - 59459).
Працює аналогічно підпрограмі KEY, але без відпрацювання спеціальних функцій, описаних вище.

12

2.2.3 Статус клавіатури (STK).

Точка входу F812H - BFFDH - E888H (63506 - 49149 - 59528).

Підпрограма визначає, чи натиснута будь-яка клавіша та завершується незалежно від результату перевірки. Результат знаходиться у прапорах МП Z(нуль), S(знак), C(перенесення) та регістрі A.

Код:
               ---------------T------T---T---T---¬
               ¦   Стан       ¦ Рег. ¦   ¦   ¦   ¦
               ¦ клавіатури   ¦  A   ¦ Z ¦ S ¦ C ¦
               +--------------+------+---+---+---+
               ¦ Натиснута    ¦ FFH  ¦ 0 ¦ 1 ¦ 1 ¦
               ¦ Не натиснута ¦ 00H  ¦ 1 ¦ 0 ¦ 0 ¦
               L--------------+------+---+---+----

13

2.2.4 Виведення символу на екран (TTY).

Точка входу F809H - BFF4H - DF68H (63497 - 49140 - 57192).

Підпрограма виводить у поточну позицію екрана символ із кодом, рівним вмісту регістра C МП. Після заповнення 24 рядків відбувається зсув екрана вгору відповідно до значення системної змінної SCRL_LOCK ( 00H (00) (за замовчуванням) - мимовільно, FFH (255)- з призупиненням до натискання будь-якої клавіші ). При роботі використовуються також системні змінні TXT_COLOR та CURSOR.
    Системна змінна TXT_COLOR визначає колір виведеного на екран тексту:
                      FFH (255) – COLOR 0;
                      00H (000) - COLOR 1;
                      01H (001) - COLOR 2;
                      02H (002) – COLOR 3 і т.д. циклічно.
Виведення символів проводиться завжди тільки на нульовому фоні. Системна змінна CURSOR визначає видимість курсору ( 00H (00)(за замовчуванням) - бачимо, FFH (255) - невидимий ).
    Для користувача можуть представляти інтерес також системні змінні COL# і ROW#, у яких після відпрацювання п/п перебувають відповідно номер стовпця та номер рядка наступної поточної позиції екрану. Це вихідні параметри п/п TTY і вони не можуть використовуватись для позиціонування курсору.
    Істотний інтерес має також системна змінна TXT_ADDR, що є "вхідною" для п/п TTY. З неї п/п бере екранну адресу поточної позиції виведення та задаючи "примусово" її значення перед початком виведення, користувач може організувати виведення тексту в будь-якому "незвичайному" місці екрана (і навіть поза екраном! Таке "виведення" є невидимий, але при необережному використанні цілком може "зіпсувати" вміст ОЗП і призвести до непередбачуваних наслідків, тому як псевдо-екран для "невидимого" друку краще використовувати адреси області ПЗП.).
Слід також зазначити, що "неприродні" адреси виведення актуальні лише до найближчого звернення до підпрограми CLS або LOCATE.
    Для кодів 20H-7FH (32-127) виводяться стандартні символи КОІ-7. Символи 80H-FFH (128-255) за замовчуванням виводяться як пробіли, т.к. відповідна область системної ОЗП заповнена нулями, але їх зображення можуть бути закодовані користувачем.
    Принцип кодування зображень символів в області знакогенератору ілюструється наступним прикладом:

Код:
        Ж...Ж.    A    100010XX  128+8         =136
        .ЖЖЖ..    A+1  011100XX  64+32+16      =112
        ЖЖЖЖЖ.    A+2  111110XX  128+64+32+16+8=248
        Ж.Ж.Ж.    A+3  101010XX  128+32+8      =168
        ЖЖЖЖЖ.    A+4  111110XX  128+64+32+16+8=248
        Ж...Ж.    A+5  100010XX  128+8         =136
        .ЖЖЖ..    A+6  011100XX  64+32+16      =112
                  A+7  XXXXXXXX

    Біти і байт, позначені символом X, у стандартному знакогенераторі ПК-01 не задіяні та їх вміст не впливає на зображення символу. Таким чином, для зберігання зображення кожного із символів у ОЗП знакогенератора відводиться по 8 байт і, отже, адреса A може бути обчислена за формулою:

   A=45056+K*8 , де K-код ASCII, що відповідає символу.

Модифікований користувачем вміст ОЗП знакогенератору зберігається лише до найближчого перезапуску системи (див. вище).
    Зі спеціальних символів підпрограмою TTY обробляються тільки 0AH (10), 0DH (13) і 7FH (127) - ПС, ВК і ЗБ відповідно. Інші символи з кодами до 1EH (30) включно відпрацьовуються так само, як символи 80H-FFH (128-255). Символ з кодом 1FH (31) - зображення курсору.

14

2.2.5 Виведення символу на принтер (PRN).

Точка входу F80CH - BFF7H - E236H (63500 - 49143 - 57910).

Виводиться на стандартно (див. вище) підключений принтер символу з кодом, що дорівнює вмісту регістра C МП. Режим виведення задається системною змінною 7/8_BIT ( B8H (184)( за замовченням) - виведення в 7-розрядному коді з інверсією, 00H (00) - виведення у 8-розрядному коді без інверсії з перекодуванням символів кирилиці).

15

2.2.6 Виведення символу на екран та/або принтер ( LST ).

Точка входу F80FH - BFFAH - E222H (63503 - 49146 - 57890).

Виводиться символ з регістру C МП на екран та/або принтер залежно від значення системних змінних PRN_OUT та DISP_OUT за наступною схемою:

Код:
         ----------T----------T---------T---------¬
         ¦ PRN_OUT ¦ DISP_OUT ¦ Принтер ¦  Екран  ¦
         +---------+----------+---------+---------+
         ¦ 80H 128 ¦ 00H 0    ¦   ON    ¦   ON    ¦
         ¦ 80H 128 ¦ FFH 255  ¦   ON    ¦   OFF   ¦
         ¦ 00H 0   ¦ 00H 0    ¦   OFF   ¦   ON    ¦
         ¦ 00H 0   ¦ FFH 255  ¦   OFF   ¦   ON    ¦
         L---------+----------+---------+----------

16

2.2.7 Виведення на екран текстового повідомлення (TEXT).

Точка входу E4A4H (58532).

Перед зверненням до підпрограми адреса початку текстового повідомлення необхідно занести в реєстрову пару HL.
    Наприклад: BAS: LXI H,E067
                     CALL E4A4
                     RET
    Після звернення до підпрограми BAS на екрані з'явиться текст:
    BASIC 2.0 ПК-01 "ЛЬВІВ"
    Текст розміщується у пам'яті від молодших адрес до старших у коди ASCII. Ознакою кінця тексту служить код 00. Ця підпрограма використовує підпрограму TTY.

17

2.2.8 Виведення на екран вмісту регістру A у шістнадцятковому вигляді (HEX(A)).

Точка входу FFD6H (65494). Використовує підпрограму TTY.

18

2.2.9 Виведення на екран вмісту реєстрової пари HL у шістнадцятковому вигляді (HEX(HL)).

Точка входу FFD1H (65489). Використовує підпрограму HEX(A).

19

2.2.10 Виведення на екран контрольної суми блоку (CHECKSUM).

Точка входу F815H - FF90H (63509 - 65424).

Вхідні параметри: HL – початкова адреса блоку;
                           DE – кінцева адреса блоку.
    У ПК-01 контрольна сума обчислюється просто як сума значень всіх байт, що входять у блок (на відміну від ПК лінії РАДІО-86РК/ОРІОН-128). Обчислену контрольну суму підпрограма виводить на екран у шістнадцятковій формі. Використовуються підпрограми HEX(A), HEX(HL)

20

2.2.11 Позиціонування курсору (LOCATE).

Точка входу F82DH - DF02H (63533 - 57090).

Підпрограма встановлює поточну позицію виведення на екран та видимість курсору відповідно до значень системних змінних:
          LOC_COL : (00H-1FH) (0-31) - Номер позиції у рядку;
          LOC_ROW : (00H-17H) (0-23) - Номер рядка;
          CURSOR*: 00H (0) - ON, FFH (255) -OFF.
    Вміст системної змінної CURSOR* копіюється в CURSOR, встановлюються відповідні значення системних змінних
COL#, ROW# та TXT_ADDR.

21

2.3 Графіка

    Усі стандартні підпрограми підтримки графіки, описані в цьому розділі розраховані на роботу в межах основної області екрану розміром 200x225 пікселів, обмеженою рамкою (BORDER) і мають загальну систему координат з початком (0,0) у лівому верхньому куті основної області екрана. Значення координат повинні знаходитися в межах:
                         X (00H-C7H) (0-199);
                         Y (00H-E0H) (0-224).
    При виході за ліву або верхню межу основної області відбувається генерація повідомлення про помилку (звернення до підпрограми обробки помилок BASIC 065CH (1628)). При виході за праву ( нижню ) межу підпрограми працюють коректно аж до досягнення позиції (0,0) ( екран як би "закільцьований" у цих
напрямках ), після чого генерується повідомлення про помилку.
    Як вхідні параметри підпрограми графіки використовують системні змінні X1, Y1, X2, Y2, GRF_COLOR, BRD_COLOR, Border.

22

2.3.1 Очищення екрана (CLS).

Точка входу F836H - EBD0H (63542 - 60368).

Вхідний параметр BORDER.
Підпрограма заповнює екранне ОЗП кодом із системної змінної BORDER, потім заповнює основну область екрану кодом 00, а також встановлює поточні графічну та текстову позиції виведення (0,0).

23

2.3.2 Виведення на екран точки (PSET).

Точка входу F821H - F048H (63521 - 61512).

Вхідні параметри: X1: Координата X;
                           Y1: Координата Y;
                           GRF_COLOR : (0-3) - Колір точки.

24

2.3.3 Стирання точки (PRESET).

Точка входу F020H (61472).
Вхідні параметри: X1: Координата X;
                           Y1: Координата Y;
Дія аналогічна підпрограмі PSET при GRF_COLOR=0.

25

2.3.4 Виведення на екран лінії (LINE).

Точка входу F824H - F112H (63524 - 61714).

Вхідні параметри: X1: X початкової точки;
                           Y1: Y початкової точки;
                           X2: X кінцевої точки;
                           Y2: Y кінцевої точки;
                           GRF_COLOR : Колір лінії.

26

2.3.5 Виведення на екран прямокутника (LINE.. B).

Точка входу F827H - F1A5H (63527 - 61861).

Вхідні параметри: X1: X початкової точки;
                           Y1: Y початкової точки;
                           X2: X кінцевої точки;
                           Y2: Y кінцевої точки;
                           GRF_COLOR: Колір.
    Виводиться прямокутник зі сторонами, паралельними рамці, заданий діагоналлю (X1, Y1)-(X2, Y2).

27

2.3.6 Виведення зафарбованого прямокутника (LINE.. BF).

Точка входу F82AH - F1DAH (63530 - 61914).

Вхідні параметри: X1: X початкової точки;
                           Y1: Y початкової точки;
                           X2: X кінцевої точки;
                           Y2: Y кінцевої точки;
                           GRF_COLOR: Колір.
    Виводиться зафарбований прямокутник зі сторонами, паралельних рамці, заданий діагоналлю (X1,Y1)-(X2,Y2).

28

2.3.7 Зафарбування замкнутої фігури (PAINT).

Точка входу F830H - E774H (63536 - 59252).

Вхідні параметри: X1: X початкової точки;
                           Y1: Y початкової точки;
                           GRF_COLOR : Колір кольору;
                           BRD_COLOR : Колір кордону.
    Виконується зафарбування замкнутої фігури кольору BRD_COLOR кольором GRF_COLOR. Якщо фігура не замкнута, буде зафарбовано весь екран.

29

2.3.8 Встановлення палітри кольорів ( COLOR ).

Точка входу F833H - DE3CH ( 63539 - 56892 ).

Вхідні параметри: PALETTE: Палітра (0-6);
                          GROUND : Колір фону (0-7).
    Виконується встановлення заданої палітри та фону шляхом виведення в порт C1 (193) (Канал B ППА D30) відповідного коду.

30

2.3.9 Копіювання екрана на принтері (COPY).

Точка входу E627H (58919).

    Проводиться виведення вмісту екранного ОЗП на стандартно підключений EPSON-сумісний принтер у графічному режимі SINGLE DENSITY (ESC "K") з перекодуванням кольорового зображення.
ня в чорно-біле за принципом "все, що не фон, то колір" і "з'їданням" кожної восьмої горизонтальної лінії точок (для покращення пропорційності зображень на екрані та на друку внаслідок неквадратності пікселя у ПК-01).
    Перервати виконання цієї підпрограми можна натисканням клавіші "СТРІЛКА ВНИЗ".

31

2.4 Підпрограми виведення МЛ.

    У ПК-01 "Львів" (версія 2.0) для кодування біт аналоговим сигналом при обміні з МЛ застосований метод частотної модуляції, відомий як метод FSK (Frequency Shift Keying) або метод "Kansas City", аналогічний тому, що застосовувався в мікро-ЕОМ лінії YAMAHA-MSX. За цим методом "0" кодується одним періодом прямокутного сигналу (меандра), а "1" - двома періодами сигнала подвоєної частоти. Прийом такого сигналу зводиться до підрахунку числа періодів сигналу на інтервалі часу, що відповідає біту.
    Слід зазначити, що у ПК-01 версії 1.0 (мало хто про нього знає, але він існував і був навіть РАДІО-86РК-сумісним) застосовувався принципово інший метод кодування біт (Фазовий), аналогічний формату РАДІО-подібних ПК. Саме для завантаження файлів у такому форматі (якщо ви їх десь все ж таки знайдете ) і призначені оператор BASIC 2.0 SLOAD та підпрограма XXXXH ( XXXXX ). Підпрограми запису у форматі 1-ї версії у ПЗУ версії 2.0 немає.

32

2.4.1 Передача біта "0" (WR_0).

Точка входу E2BEH (58046).

    Відбувається видача на порт C2H ( 194 ) ( біт 0 ) довгого періоду меандра, що задається значенням системної змінної WR0PERIOD.

33

2.4.2 Передача біта "1" (WR_1).

Точка входу E2C5H (58053).

    Відбувається видача на порт C2H (194) (біт 0) двох коротких періодів меандра, що задається значенням системної змінної WR1PERIOD.

34

2.4.3 Передача періоду меандру.

Точка входу E2D5H (58069).

    Відбувається видача на порт C2H ( 194 ) ( біт 0 ) періоду меандра з тривалістю, що задається значенням регістрової пари HL.

35

2.4.4 Передача пілот-сигналу (WR_PILOT).

Точка входу E42BH (58411).

    Відбувається формування пілот-сигналу з тривалістю, задається значенням системної змінної PILOT_DUR. При A=0 формується пілот звичайної, а при A<>0 - чотирикратної тривалості. Пілот-сигнал являє собою меандр з коротким періодом, аналогічний серії бітів "1".

36

2.4.5 Передача байта (WR_BYTE).

Точка входу E437H (58423).

    Виконується передача на МЛ байта з регістру A. Формат уявлення байта має вигляд:

Код:
               00 X0 X1 X2 X3 X4 X5 X6 X7 01 01
              LT- L---------------------- L-T--
   СТАРТ.1біт---     Інформаційні біти      L---- СТОП.2біта

    Таким чином, кожен байт у ПК-01 передається у старт-стопному режимі (на відміну від інших ПК), що дещо погіршує ефективність обміну ( на кожен байт передається не 8, а 11 біт), але суттєво підвищує надійність. Якщо який-небудь байт буде спотворений при читанні (пропущений або хибний прийом біта), то наступні за ним байти збережуть правильне значення (при безперервному ж режимі передачі, спотворені будуть і наступні байти ). Старт-стопний режим запису допускає також деякі "вільності" при завантаженні, наприклад, динамічна зміна адреси завантаження, т.к. інтервал часу між прийомами байт не регламентовано. Підпрограма виконує збереження та відновлення вмісту використовуваних регістрів.

37

2.4.6 Передача слова (WR_WORD).

Точка входу DD86H (56710).

    Виконується передача на МЛ слова із регістрової пари HL. Підпрограма виконує збереження та відновлення вмісту використовуваних регістрів.

38

2.4.7 Передача заголовка файлу (WR_HEAD).

Точка входу E3E4H (58340).
    Виконується передача на МЛ заголовка файлу, що має наступну структуру:

Код:
   Пілот 4x  тривалості  T T T T T T T T T T F L N A M E
   L-------------------- L------------------L-----------
                               10 байт         6 байт

де T - ідентифікатор типу файлу: D0 - BSAVE/BLOAD
           ( зберігається у системній D3 - CSAVE/CLOAD
             змінної FILE_TYPE ) EA - SAVE/LOAD/MERGE
       FLNAME - ім'я файлу (6 символів ASCII із системної змінної SAVE_NAME).
    Вхідні параметри – SAVE_NAME, FILE_TYPE. Стан регістру A визначає тривалість пілота (див. вище).

39

2.4.8 Передача кодового файлу (BSAVE).

Точка входу DD31H (56625).

    Виконується передача на МЛ файлу у форматі BSAVE, що має наступну структуру:

Код:
   Заг. Пілот норм.трив. AO AE AS XX XX XX ..... XX XX
   L--- L--------------- L- L- L- L-------------------
                         2б 2б 2б      Тіло файлу

де Заг. - заголовок файлу (див. вище)
       AO - початкова адреса ( CODFL_ORG )
       AE - кінцева адреса ( CODFL_END )
       AS - адреса запуску (CODFL_RUN)
    Вхідними параметрами підпрограми є CODFL_ORG, CODFL_END, CODFL_RUN, SAVE_NAME. Після виконання передачі на екран з нового рядка видаються адреси файлу (підпрограма FFD1H ( 65489 )) та його КС ( підпрограма CHECKSUM ) у шістнадцятирічному вигляді. Переривання роботи підпрограми BSAVE не передбачено.

40

2.5 Підпрограми введення з МЛ.
                 
    Увага! У всі стандартні підпрограми введення з МЛ включена підпрограма E3DCH ( 58332 ), що виконує опитування клавіші "СТРІЛКА Вниз" і встановлює прапор переносу C в "1" при її натисканні. Ця підпрограма використовується для переривання процедур введення. При перериванні або аварійному завершенні процедур введення з МЛ видається повідомлення про помилку та проводиться перехід на E52BH ( 58667 ), звідки керування передається на BEF0H (48880). Після холодного перезапуску тут розміщено коди C3H FDH 02H (JMP 02FDH (00756)), тобто. управління буде передано до BASIC. Змінивши значення системної змінної LOAD_ERR, користувач може призначити нестандартну процедуру обробки помилок уведення.

41

2.5.1 Прийом пілот-сигналу (RD_PILOT).

Точка входу E4D0H (58576).

    Виконується багаторазова перевірка стабільності періоду пілот-сигналу. Якщо тривалість періоду виходить за допустимі межі (менше 4 або більше DEH (222)) або різниця між попереднім і поточним періодом більше 3, прийом пілота починається заново. Якщо перевірка пройшла успішно, то проводиться 256-кратне вимірювання періоду пілота (результат накопичується в HL). На основі вимірювань обчислюються значення параметрів зчитування BE85H (48773) та BE86H (48774).
    Підпрограма RD_PILOT використовує для вимірювання періоду меандру підпрограму E3C9H ( 58313 ), а вона, у свою чергу використовує п/п E3B4H ( 58292 ) для вимірювання довжини однієї напівхвилі (При E = 00H - негативною, при E = FFH - позитивною). Результат міститься в C. Підпрограма виконує збереження та відновлення вмісту використовуваних регістрів.

42

2.5.2 Прийом байта (RD_BYTE).

Точка входу E4BEH (58558).

    Виконується прийом з МЛ байта в регістр A у старт-стопному режимі (див. вище). В основу зчитування біт покладено визначення кількості напівперіодів сигналу на заданому інтервалі часу (у биті) воно виконується підпрограмою E390H (58256) (негативних або позитивних залежно від E (див. вище). Результат міститься в A і C. Якщо кількість напівперіодів більша 3 фіксується помилка і підпрограма завершується з прапором C=1.
Якщо результат дорівнює 2 або 3, вважається прийнятим біт "1", а якщо менше 2 – біт "0". Накопичення байта відбувається у D.
    Підпрограма виконує збереження та відновлення вмісту використовуваних регістрів.

43

2.5.3 Прийом слова (RD_WORD).

Точка входу DDCAH (56778).

    Виконується прийом із МЛ слова в реєстрову пару HL.
    Підпрограма виконує збереження та відновлення вмісту використовуваних регістрів.

44

2.5.4 Прийом заголовка файлу (RD_HEAD).

Точка входу E443H (58435).

    Виконується перевірка стабільності та обчислення швидкості по пілоту (див. вище) потім 10 разів зчитується і порівнюється з очікуваним ідентифікатор типу файлу (при розбіжності процес прийому заголовка починається заново), зчитується ім'я файлу ( 6 байт ) до системної змінної LOAD_NAME, виконується його порівняння із заданим ( SAVE_NAME ). При розбіжності на екран видається повідомлення "ІМ'Я:?", прийняте ім'я та прийом заголовка починається заново. Якщо ж прийняте ім'я збігається із заданим ( або замість заданого - тільки пробіли ), то подається повідомлення "ФАЙЛ:", вміст LOAD_NAME та підпрограма завершується.
    Вхідні параметри – SAVE_NAME, FILE_TYPE.

45

2.5.5 Прийом блоку (RD_BLOCK).

Точка входу DDBCH (56764).

Вхідні параметри: HL: Початкова адреса;
                           DE : Кінцева адреса.
    Виконується прийом блоку даних ( тіла файлу ) у вказані адреси ОЗП. Завершення завантаження - аналогічно підпрограмі BLOAD ( див. нижче ).

46

2.5.6 Прийом кодового файлу (BLOAD).

Точка входу DD94H (56724).

    Виконується прийом заголовка файлу (див. вище), потім прийом другого пілота, адрес початку, кінця, запуску файлу ( Вони містяться в системні змінні CODFL_ORG, CODFL_END і CODFL_RUN відповідно) і нарешті основного тіла файлу.
    Значення системної змінної OFFSET визначає зсув адреси початку завантаження щодо прийнятої з МЛ адреси початку файлу (CODFL_ORG).
    Після виконання завантаження на екран з нового рядка видаються адреси файлу та його КС ( підпрограма DD61H ( 56673 )) шістнадцятковому вигляді.
    Якщо було встановлено завантаження з автозапуском, ( у системній змінний AUTOSTART знаходиться ASCII-код літери "R" (без автозапуску - значення 00)), проводиться передача управління на адресу, що знаходиться у CODFL_RUN.
    Вхідними параметрами підпрограми є OFFSET, AUTOSTART, SAVE_NAME.

47

2.6 Інші

48

2.6.1 Короткий звуковий сигнал (BEEP).

Точка входу F81BH - DEBFH ( 63515 - 57023 ).

    Видається короткий звуковий сигнал, аналогічний сигналу натискання клавіші.

49

2.6.2 Керований звуковий сигнал (SOUND).

Точка входу F81EH - DE94H ( 63518 - 56980 ).

Вхідні параметри: L: Код частоти (період);
                           D: Код тривалості.
    Видається звуковий сигнал із заданим періодом та тривалістю. Кодування нот див. "Опис мови BASIC", табл. 2.

50

2.6.3 Обчислення екранної адреси за координатами (VADDR).

Точка входу F818H (63512).

Вхідні параметри: C: Координата X (<C8H(200));
                           A: Координата Y (<DEH (222));
    Обчислює абсолютну адресу байта в ОЗУ по екранним координатам. Результат – у регістровій парі HL.

51

2.6.4 Заповнення екранного ОЗП кодом.

Точка входу EBBCH (60348).

Вхідний параметр: BORDER: Код заповнення.
    Виконується заповнення екранної ОЗП вказаним кодом.

52

2.6.5 Очищення основної області екрана.

Точка входу EBA5H (60325).

    Виконується заповнення основної області екранного ОЗП кодом 00.

53

2.6.6 Курсор на початок екрана.

Точка входу EBE4H (60388).

    Виконується встановлення поточної текстової позиції виводу в (0,0). Видимість курсора визначається системною змінною CURSOR.

Увага!
    Перед зверненням до підпрограм 2.6.4, 2.6.5 та 2.6.6 необхідно підключити екранне ОЗУ до шин МП (див. вище), після звернення, - відключити.

54

2.6.7 Переміщення масивів (MOVE).

Точка входу E11FH (57631).

Вхідні параметри: HL: Адреса, куди копіювати;
                          DE : Початкова адреса масиву, який копіюється;
                          BC: Довжина масиву.
Виконується копіювання вмісту однієї області ОЗП в іншу.

55

2.6.8 Заповнення області ОЗУ кодом (FILL).

Точка входу E12AH (57642).

Вхідні параметри: HL: Початкова адреса заповнення;
                           BC: Довжина масиву;
                           E: Код заповнення.
    Виконується заповнення заданої області ОЗП вказаним кодом.

56

2.6.9 Переведення напівбайта з HEX до DEC.

Точка входу FFBDH (65469).

Вхідний параметр: A: Напівбайт у шістнадцятковій системі.
    Виконується переклад напівбайта із шістнадцяткової системи обчислення до десяткової. Результат - у регістрі C.

57

2.6.10 Виведення на екран напівбайта у HEX.

Точка входу FFDFH (65503).

Вхідний параметр: A: Напівбайт у шістнадцятковій системі.
    Виконується переклад напівбайта із шістнадцяткової системи обчислення до десяткової. Результат відображається на екрані.

58

2.6.11 Множення DE на A (складення A разів).

Точка входу FF24H (65316).

Вхідні параметри: DE : Доданок ( множинне );
                             A : Кількість додавань (множник).
    Виконується багаторазове (A разів) додавання вмісту регістрової пари DE. Результат – у регістровій парі HL.

59

2.6.12 Перевірка умови DE = HL.

Точка входу E425H (58405).
Вхідні параметри: DE;
                           HL.
    Виконується порівняння вмісту регістрових пар DE та HL. Результат - стан прапора Z (Z = 1 - рівні, Z = 0 - нерівні).

60

2.6.13 Заповнення пробілами.

Точка входу DB63H (56163).

Вхідні параметри:  B: Кількість пробілів;
                          DE: Адреса початку заповнення.
    Виконується заповнення області ОЗП з початковою адресою DE та довжиною B кодом 20H (32) - ASCII-кодом символу "пробіл".

61

3. Зведена таблиця системних підпрограм.

0107-0207H - Екранний буфер BASIC
0243/0244H - Адреса початку BASIC-програми ( 1723H )
0245/0246H - Адреса кінця BASIC-програми ( початок обл. змінних )
0247/0248H - Адреса кінця змінних BASIC-програми ( початок обл. масивів )
0249/024AH - Адреса початку вільної області ОЗУ

AFC1H - Вершина стеку BASIC
AF00H - Вершина стека GOSUB

62

4. Зведена таблиця системних змінних.

63

4.1 Системні змінні BIOS.

Код:
------------T-------------T-----------T------------------------¬
¦    Hex    ¦     Dec     ¦    Name   ¦        Comment         ¦
+-----------+-------------+-----------+------------------------+
¦ BE10      ¦ 48656       ¦ KEYCODE   ¦ код натиснутої клавіші    ¦
¦ BE14      ¦ 48660       ¦ KEYSTAT   ¦ стан клавіатури   ¦
¦ BE1B      ¦ 48667       ¦ DISP_OUT  ¦ увімк./вимк. принтеру    ¦
¦ BE1D      ¦ 48669       ¦ KYB_MODE  ¦ режим клавіатури       ¦
¦ BE1E      ¦ 48670       ¦ KYB_BEEP  ¦ вкл./вимк. звук клав.  ¦
¦ BE30/BE31 ¦ 48688/48689 ¦ TXT_ADDR  ¦ адреса виводу символу   ¦
¦ BE32      ¦ 48690       ¦ COL#      ¦ X слід.поз.вив. тексту ¦
¦ BE33      ¦ 48691       ¦ ROW#      ¦ Y слід.поз.вив. тексту | ¦
¦ BE36      ¦ 48694       ¦ TXT_COLOR ¦ колір тексту            ¦
¦ BE38      ¦ 48697       ¦ BORDER    ¦ байт заповнення рамки  ¦
¦ BE39      ¦ 48698       ¦ SCRL_LOCK ¦ скролінг авт./очік.   ¦
¦ BE3C      ¦ 48700       ¦ CURSOR    ¦ видимість курсора      ¦
¦ BE3D      ¦ 48701       ¦ CURSOR*   ¦ уст. видимість курсора ¦
¦ BE3E      ¦ 48702       ¦ LOC_COL   ¦ уст. X вив. тексту     ¦
¦ BE3F      ¦ 48703       ¦ LOC_ROW   ¦ уст. Y вив. тексту     ¦
¦ BE40      ¦ 48704       ¦ PRN_SHIFT ¦ Зміщення літер кирилл.  ¦
¦ BE41      ¦ 48705       ¦ PRN_XOR   ¦ вив.на PRN норм./інвер.¦
¦ BE50      ¦ 48720       ¦ X1        ¦ X початкової точки      ¦
¦ BE51      ¦ 48721       ¦ Y1        ¦ Y початкової точки      ¦
¦ BE52      ¦ 48722       ¦ GRF_COLOR ¦ колір графич. об'єкта   ¦
¦ BE57      ¦ 48727       ¦ X2        ¦ X кінцевої точки       ¦
¦ BE58      ¦ 48728       ¦ Y2        ¦ Y кінцевої точки       ¦
¦ BE80/BE81 ¦ 48768/48769 ¦ WR0PERIOD ¦ тривал.періоду сигн."0"  ¦
¦ BE82/BE83 ¦ 48770/48771 ¦ WR1PERIOD ¦ длит.периода сигн."1"   ¦
¦ BE84      ¦ 48772       ¦ PILOT_DUR ¦ тривалість пілота    ¦
¦ BE85      ¦ 48773       ¦           ¦ - параметри читання МЛ  ¦
¦ BE86      ¦ 48774       ¦           ¦ L (опред. автоматич.)  ¦
¦ BE87      ¦ 48775       ¦ FILE_TYPE ¦ ідентифікат.типу файлу ¦
¦ BE88/BE89 ¦ 48776/48777 ¦ BASFL_ORG ¦ початок BASIC-файлу     ¦
¦ BE8A/BE8B ¦ 48778/48779 ¦ BASFL_END ¦ кінець BASIC-файлу      ¦
¦ BE8C-BE91 ¦ 48780-48785 ¦ SAVE_NAME ¦ ім'я файлу запис/еталон¦
¦ BE92-BE97 ¦ 48786-48791 ¦ LOAD_NAME ¦ прочитане ім'я файлу    ¦
¦ BEA3      ¦ 48803       ¦ AUTOSTART ¦ ознака автостарту     ¦
¦ BEA4/BEA5 ¦ 48804/48805 ¦ CODFL_ORG ¦ початок CODE-файлу      ¦
¦ BEA6/BEA7 ¦ 48806/48807 ¦ CODFL_END ¦ кінець CODE-файлу       ¦
¦ BEA9/BEAA ¦ 48809/48810 ¦ CODFL_RUN ¦ старт CODE-файлу       ¦
¦ BEAB/BEAC ¦ 48811/48812 ¦ OFFSET    ¦ зміщення CODE-файлу    ¦
¦ BEC0      ¦ 48832       ¦ PALETTE   ¦ палітра                ¦
¦ BEC1      ¦ 48833       ¦ GROUND    ¦ колір фону              ¦
¦ BEF1/BEF2 ¦ 48881/48882 ¦ LOAD_ERR  ¦ адр.перех. по ПОМИЛКА.В/В ¦
¦ BEF3      ¦ 48883       ¦ PRN_OUT   ¦ вкл./вимк. дисплея     ¦
¦           ¦             ¦           ¦                        ¦
L-----------+-------------+-----------+-------------------------

64

4.2 Системні змінні інтерпретатора BASIC.

Код:
------------T-------------T-----------T------------------------¬
¦    Hex    ¦     Dec     ¦    Name   ¦        Comment         ¦
+-----------+-------------+-----------+------------------------+
¦ 0243/0244 ¦ 00579/00580 ¦ BAS_PROG  ¦ адр.поч. BAS-програми  ¦
¦ 0245/0246 ¦ 00581/00582 ¦ BAS_VARS  ¦ адр.поч. BAS-змін.     ¦
¦ 0247/0248 ¦ 00583/00584 ¦ BAS_ARRS  ¦ адр.поч. BAS-масивів   ¦
¦ 0249/024A ¦ 00585/00586 ¦ BAS_FREE  ¦ адр.поч. вільний. ОЗП  ¦
L-----------+-------------+-----------+-------------------------

---------------------------------------------
E6AA - Виведення на принтер ESC+chr$(C)
E6A3 - Виведення на принтер chr$(C)

Вы здесь » Середовище програмування MADL » ПК-01 "Львів" » ПЕРСОНАЛЬНА ЕОМ ПК-01 "ЛЬВІВ" ІНСТРУКЦІЯ ПРОГРАМІСТУ