А.Дмитриев

"Корвет" 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).

Таблица 1
Клавиша Код КОИ-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
Таблица 2
PEEK (&HF880) Нажата клавиша
1 (00000001В) РГ (левая)
2 (00000010В) АЛФ (ALF)
4 (00000100В) ГРАФ (GRAPH)
16 (00010000В) СЕЛ (SEL)
32 (00100000В) УПP (CTRL)
128 (10000000В) РГ (правая)

На "Корветах" разных лет выпуска могут различаться коды некоторых клавиш, поэтому бывает очень трудно определить, какую клавишу имели в виду авторы программы в том или ином случае. Иногда для этого необходим тщательный анализ текста программы.

Вот, пожалуй, и все. Осталось только сохранить исправленную программу на диске.

Комментарий специалиста

Прерывания требуют особо осторожного обращения, поэтому для предотвращения отключения клавиатуры следует:

  • считать содержимое ячейки FB29;
  • запомнить его;
  • записать в FB29, заменив только нужный бит;
  • после окончания восстановить содержимое FB29.

Делается это следующим образом.

    MEMMASC=PEEK(&HFB29)
    POKE &HFB29,MEMMASC OR 8
    ...
    POKE &HFB29,MEMMASC

А. Скурихин