"Корвет" 2 → 1
Отличия второй версии ПЗУ "Корвета" от первой привели к программной несовместимости компьютеров разных выпусков. Видимо, каждому обладателю "Корвета" 2.0 знакомо чувство разочарования, когда с трудом добытые программы отказываются нормально работать только потому, что они были написаны для более ранней модификации машины.
Между тем адаптация Бейсик-программ ко второй версии ПЗУ достаточно проста. Достаточно знать, что в ПЗУ-2 изменен принцип обработки сигналов драйвером клавиатуры, имеются существенные отличия по организации вывода на экран расширенных символов и, наконец, иначе кодируются прерывания.
Прежде всего надо переписать программу на диск с новой, "родной" для ПЗУ-2 версией МикроДОС. Для копирования следует использовать COPY (COPYT, COPD и им подобные вместе с программами скопируют и старую МикроДОС).
Прерываниями при работе с Бейсиком заведует ячейка FB29. В большинстве программ она используется, во-первых, для отключения компьютера от локальной сети. Для этого где-то в начале программы может стоять оператор
POKE &HFB29,147
В новой версии он отключает и клавиатуру. Исправьте его, написав
POKE &HFB29,8
или просто удалите - и программа начнет работать. Во-вторых, в ряде контролирующих программ оператор
POKE &HFB29,255
стоящий после вывода результата, блокирует клавиатуру, чтобы ученик не мог скрыть свою оценку от учителя. Найдите и удалите его по крайней мере на время отладки программы. Иначе компьютер может зависнуть и вам не удастся сохранить исправленную программу на диске.
При использовании ПЗУ-1 режим вывода на экран расширенных символов включается оператором
PRINT CHR¤(27)+"3"
При этом по-прежнему считается, что экран имеет 64 позиции по ширине, но выводятся на экран только символы, попадающие в четные позиции. Выключаются расширенные символы командой
PRINT CHR¤(27)+"2"
На "Корвете" с ПЗУ-2 при включении режима расширенных символов ширина экрана устанавливается равной 32 позициям и расширенный текст, написанный для старых машин, искажается до неузнаваемости. Для исправления положения достаточно включать режим расширенных символов после вывода текста на экран, а не до. Если, например, в исходной программе есть фрагмент типа
то его нужно исправить следующим образом:
110 PRINT "РРААССШШИИРРЕЕННННЫЫЕЕ ССИИММВВООЛЛЫЫ"
120 PRINT "ККооррввеетт-ввееррссиияя 11..00"
121 PRINT CHR¤(27)+"3"
К сожалению, этот прием срабатывает не всегда, поэтому бывает проще переписать такие фрагменты программы заново, используя для вывода расширенных символов операторы SCREEN,,1 и SCREEN,,0.
В старой версии для определения кода нажатой клавиши использовалось прямое сканирование клавиатуры; код нажатой клавиши записывался в ячейку F701. Большинство программ для управления ходом программы использовало конструкцию вида
150 S=PEEK(&HF701): IF S=0 THEN 150
160 IF S=67 THEN GOTO 1000
170 IF S=73 THEN GOTO 2000
Для ПЗУ-2 придется заменить строку 150:
150 S¤=INKEY¤:IF S¤="" THEN 150 ELSE S=ASC(S¤)
Это еще не все. Дело в том, что ASCII-коды (коды КОИ-8) и Скан-коды клавиш не совпадают, поэтому необходимо изменить и строки 160-170:
160 IF S=25 THEN GOTO 1000
170 IF S=26 THEN GOTO 2000
Скан-коды и коды КОИ-8 наиболее часто используемых клавиш приведены в таблице 1. Остальные скан-коды клавиш можно найти в книге № 4 технического описания ("Системное программное обеспечение", приложение 13), а коды КОИ-8 - в книге № 6 ("Интерпретатор языка Бейсик", приложение 1). Группа клавиш режима клавиатуры (УПР, РГ, АЛФ, ГРАФ, СЕЛ) не имеет собственных ASCII-кодов. Определить, какая из них нажата в текущий момент, можно с помощью ячейки F880 из поля клавиатуры (таблица 2).
Клавиша | Код КОИ-8 | Скан-код |
---|---|---|
ВК (CR) | 13 | 49 |
CTРH (CLS) | 31 | 50 |
СТОП | 3 | 51 |
ИЗ (DEL) | 29 | 52 |
ВЗ (INS) | 28 | 53 |
<= (BS) | 8 | 54 |
ТАБ | 9 | 55 |
Пробел | 32 | 56 |
ПРФ (ЕSС) | 27 | 60 |
Клавиши дополнительного поля | ||
2 | 67 | 67 |
4 | 8 | 69 |
5 (МЕНЮ) | 16 | 70 |
6 | 24 | 71 |
8 | 25 | 73 |
Клавиши режима клавиатуры | ||
РГ (левый) | 57 | |
АЛФ (ALF) | 58 | |
ГРАФ (GRAPH) | 59 | |
СЕЛ (SEL) | 61 | |
УПР (CTRL) | 62 | |
РГ(правый) | 64 |
PEEK (&HF880) | Нажата клавиша |
---|---|
1 (00000001В) | РГ (левая) |
2 (00000010В) | АЛФ (ALF) |
4 (00000100В) | ГРАФ (GRAPH) |
16 (00010000В) | СЕЛ (SEL) |
32 (00100000В) | УПP (CTRL) |
128 (10000000В) | РГ (правая) |
На "Корветах" разных лет выпуска могут различаться коды некоторых клавиш, поэтому бывает очень трудно определить, какую клавишу имели в виду авторы программы в том или ином случае. Иногда для этого необходим тщательный анализ текста программы.
Вот, пожалуй, и все. Осталось только сохранить исправленную программу на диске.
Комментарий специалиста |
Прерывания требуют особо осторожного обращения, поэтому для предотвращения отключения клавиатуры следует:
Делается это следующим образом.
А. Скурихин |