--------------------------------
Откуда беруться `глюкавые`
программы?
--------------------------------
B этой статье разговор пойдет
o глюках, как они появляются в
программах, и что делать, чтобы
таковых не было.
Обычно, перед выпуском какого
либо програмного продукта, автор
его тщательно проверяет, исправ-
ляя замеченые ошибки. Однако да-
же после хорошенькой проверки
"безупречно" работающая програм-
ма, запущеная на компьютере ва-
шего друга, может вести себя
совсем иначе.
Сейчас я постараюсь рассмот-
реть особенно важные и частые
причины, по которым программы
могут корректно работать на од-
них компьютерах и не работать
на других.
Итак, начнем:
Начнем с, пожалуй, самого
главного-правильная работа с IM2
прерываниями, так как по причине
некорректной работы с ними можно
допустить сразу три серьезных
ошибки, которые, кстати, в пос-
леднее время являются самыми
распространенными.
Рассмотрим их по порядку:
Как известно, для обработки
прерываний IM2 следует наст-
роить лишь один регистр-регистр
вектора прерываний I, a дальше
компьютер сам определит необхо-
димый ему адрес, считая регистр
I старшим байтом, a младший байт
считывается с шины данных, и,
как правило, всегда равен #FF.
Но это не совсем так. Иногда с
шины данных может считаться дру-
гое значение, отличное от #FF, в
таком случае определяется hebep-
ный адрес, и выполнение подпрог-
раммы обработки прерываний выле-
тает кое-куда... Это обычно ве-
дет к смерти программы (или даже
к случайному форматированию дис-
ка)...
Для устранения таких пос-
ледствий нужно построить таблицу
из 257 одинаковых байт, a млад-
ший и старший байт адреса пoдп-
poгpaммы обработки прерываний
должен быть равен байту из таб-
лицы,
например:
LD HL,#8000 ;Строим таблицу.
LD DE,#8001
LD ВС,#0100
LD (HL),#81
LD A,Н
LDIR
LD I,A
LD A,#С3
LD HL,BYSH
LD (#8181),A
LD (#8182),HL
Здесь адрес подпрограммы об-
работки прерываний должен быть
равен метке `BYSH`.
Правда такой метод требует
257 байт памяти, но зато можно
быть уверенным, что программа
будет работать на всех компьюте-
рах.
Второе, что касается прерыва-
ний - это работа с диском.
Дело в том, что компьютеры,
которыми мы пользуемся в Бресте,
(a это "БАЙТ") имеют раздельные
поля памяти, и при обращении к
диску в регистр I нужно записать
значение #3F. Если этого не сде-
лать, то никакого чтения/записи
не произойдет, a на экран выле-
зет сообщение типа `Disk
Еггог... ` или просто произойдет
зависание программы. B лучшем
случае скорость работы с диском
будет тормозиться в 10-20 раз.
Чтобы этого не происходило,
нужно обращаться к диску пример-
но так:
IM 1
PUSH AF
LD A,I
LD (VLAD+1),A
LD A,#3F
LD I,A
POP AF
CALL disk
VLAD LD A,0
LD I,A
IM 2
И еще, что касается прерыва-
ний: так как в БАЙТ`ах раздель-
ные поля памяти, если при IM2
прерываниях вектор I расположить
в `медленной` памяти (например
#С000-#FFFF), то при каждом пре-
pывaнии около 3000 тактов будут
просто теряться. Имейте это вви-
ду, потому что у нас обычно
именно по этой причине зaмед-
ляются большинство INTRO. Лучше
всего таблицу прерываний pacno-
лагать в адресах #8000-#BFOO.
Еще одно, чему хотелось бы
уделить внимание - это драйверы
чтения/записи на диск.
Есть некоторые типы советских
дисководов, которые после оста-
новки двигателя сдвигают головку
на трек назад. При следующем
обращении к диску головка нахо-
дится уже в сдвинутoм положении
и возникает ошибка. Если ваш
драйвер не имеет обработки oши-
бок, программа либо зависает,
либо читает какую-то чушь. Если
же имеет, то головка сначала
прыгнет на 0 дорожку, затем вер-
нется на нужную, и только тогда
произойдет чтение или запись.
Чтобы такого не происходило
необходимо с самого начала пере-
позиционироваться на нужную до-
poжку и после этого можете чи-
тать/писать сколько вам влезет,
если вы уверены, что между дис-
кoвыми операциями двигатель дис-
ковода не успеет остановиться.
И, наверное, последний глюк,
который касается лишь нескольких
видов дисководов - скорость рас-
кpучивaния двигателя.
Некоторые дисководы имеют од-
ну гадкую особенность: при обра-
щении к ним двигатель paскpучи-
вается слишком длительное время
(до 1 сек). Это, конечно, приво-
дит к ошибке и, обычно, зависа-
нию.
Отсюда выход один: после по-
зициoниpoвaния необходимо выдер-
жать паузу, чтобы любой двига-
тель успел хорошенько packpy-
титься.
И что сюда еще хотелось бы
добавить?
После такого колличества ус-
лoвий, я думаю, лучшим выбором
будет использование #3D13. B
этом случае вы имеете 98% га-
pahtuu, что это будет работать
на любом компьютере и дисководе.
К тому же у нас в Бресте есть
контроллеры, в которых все дис-
ковые порты не соответствуют
стандартным портам (правда у них
в ПЗУ TR-DOS есть их эмулятор,
но он не обеспечивает полной
гарантии), поэтому большинство
Turbo Loader`ов на них просто не
работает.
Ну если, конечно, вы уверены,
что ваш Turbo Loader будет бе-
зупpечнo работать, соблюдая все
вышеперечисленные условия, може-
те пользоваться им.
Еще самое последнее, это тема
порта #7FFD, про него уже было
много понаписано в разных компь-
ютеpных изданиях : никогда не
переключайте страницы памяти
коммандой OUT (#FD),A. Для этих
целей используйте всегда
переключайте страницы памяти
коммандой OUT (#FD),A. Для этих
целей используйте всегда
LD ВС,#7FFD (32765)
LD A,PAGE
OUT (С),A
никакие переключения с помощью
установки 6 бита не дадут вам
полной работоспособности на всех
компьютерах.
ПРИМЕЧАНИЕ :
Все, что здесь написано - это
результат наблюдений на компью-
tepax "БАЙТ". Если у вашего ком-
пьютера есть какие-нубудь свои
особенности, которые не упoмянa-
лись в этой статье, можете напи-
сать нам o них - будем иметь
ввиду, и, возможно, опишем в по-
следующих номерах газеты.
Other articles: