Этим Вы окажете большую помощь науке и медицине. См. подробнее: http://solidstate.karelia.ru/~yura/pyldin/yura/computing.htm |
В руководстве к Пълдину ничего не сказано о программировании видеоконтроллера, сказано лишь: Сигнал DS0 используется видеоконтролером СМ607. Используются адреса: $E600 (W) - адресный регистр СМ607, $E601 (RW) - данные регистра СМ607. ----------------------------------------------------------------- Далее будет приведена более полная информация. Итак, $E600 - адресный регистр. В нём задействованы лишь 4 младшие бита, т.е. 16 значений (от 0 до 15) => всего видеорегистров 16 штук. Смысл программирования видеоконтроллера заключается в следующем. Сначала в $E600 нужно занести номер видеорегистра, а потом в $E601 - его значение. Таким образом видеорегистру присваивается значение. Рассмотрим теперь назначение видеорегистров. Регистр 0x01 ------------ Число символов в строке (для графических режимов - число точек по горизонтали, делённое на 8). Регистр 0x06 ------------ Число строк (для графических режимов - число точек по вертикали, делённое на 8). Регистр 0x0a ------------ Начальная линия курсора (может принимать значение от 0 до 0x1f (на практике - используется только до 7), если же равен 0x20, то курсор становится не виден). Если (vregs[0x0a] & 0x60) равно нулю, то курсор НЕ мигает. На реальном Пълдине курсор мигает с такой частотой, что 100 миганий происходит за 64 секунды. Курсор мигает независимо от того, нажимаются или не нажимаются клавиши (в отличие от более современных компьютеров, где курсор прерывает мигание в момент нажатия клавиш). Регистр 0x0b ------------ Конечная линия курсора (может принимать значение от 0 до 0x1f (на практике - используется только до 7)). Регистры 0x0c/0x0d ------------------ Определяют адрес памяти с информацией о экране. Если текстовый режим, рассчитывать по формуле: для 601 - src += (word)((vregs[0x0c] << 8) + vregs[0x0d]); для 601А - src += (word)((vregs[0x0c] << 8) + vregs[0x0d]); Если графический, то: для 601 - src += (word)(((vregs[0x0c] << 8) + vregs[0x0d]) << 3); для 601А - src += (word)(((vregs[0x0c] << 8) + vregs[0x0d]) << 3); Если адрес графического экрана превышает $ffff, то далее он автоматически становится равным нулю. Это следует учитывать при написании эмуляторов. Регистры 0x0e/0x0f ------------------ Определяют адрес (как бы смещение от начала экрана) символа, на котором стоит курсор. Формулы для вычисления - похожие. Если текстовый режим, рассчитывать по формуле: для 601 - crsr += (word)((vregs[0x0e] << 8) + vregs[0x0f] - 1); для 601А - crsr += (word)((vregs[0x0e] << 8) + vregs[0x0f] + 1); Если графический, то: для 601 - crsr += (word)(((vregs[0x0e] << 8) + vregs[0x0f] - 1) << 3); для 601А - crsr += (word)(((vregs[0x0e] << 8) + vregs[0x0f]) << 3); Если адрес графического экрана превышает $ffff, то далее он автоматически становится равным нулю. Это следует учитывать при написании эмуляторов. Небольшое замечание! Данные по расчёту "src"/"crsr" для модели 601 приведены в случае, если Пълдин имеет хардверную ошибку, связанную с видеоконтроллером. С такой ошибкой выпускались все компьютеры модели 601 и BIOS написан с её учётом. Эмулятор тоже написан для этого случая. Необходимо заметить (это важно при считывании экрана), что строки в текстовом режиме на 601 из-за этой ошибки расположены не через 40, а через 42 символа. (Потом, эту ошибку разработчики устранили, даже написали для "новых" моделей 601 BIOS версии 2.60, но таких Пълдинов всё же не было, так как сразу после этого завод, где делали Пълдины, перестал их выпускать). На этом закончен обзор видеорегистров, которые эмулируются в эмуляторе. На остальные видеорегистры эмулятор просто никак не реагирует. Однако, например в программе show.cmd некоторые из них используются, чтобы установить нестандартный режим 384x200 (в эмуляторе же остаётся 320x200, и show.cmd не правильно выводит картинку). Далее - будет проведён обзор тестов, которые были проведены на реальном Пълдине-601 с целью выяснить, для чего же предназначены остальные видеорегистры, а также дополнительная информация о регистрах 1 и 6. Регистр 2 --------- Начало горизонтального хода луча. Чем меньше значение, тем правее экран. Если равен 3, то экран начинается у самого правого края (продолжения не поместившихся концов строк выводятся слева экрана). Значение по умолчанию этого регистра равно $30. Если задать больше $30, то экран смещается влево. При $3b уже наступает сбой синхронизации, и экран начинает прыгать, как в неисправном телевизоре. Регистр 3 --------- Задействованы только 4 младших бита. Если значение ближе к 1 или к $0f, то экран сместится чуть-чуть на очень небольшое значение вправо; если значение ближе к 7, то небольшое смещение влево. Ещё замечено, что при значении 1 экран чуть-чуть ярче, чем при $0f, хотя смещение при этих значениях почти одинаковое. При значении 0 экран начинает прыгать. Значение по умолчанию этого регистра равно 5. Регистр 4 --------- Начало вертикального хода луча. При $31 - это уже слишком низко, а при $20 - это уже слишком высоко - при этих значениях экран начинает прыгать. Замечено, чем значение ближе к $31, тем, видно, меньше частота обновления экрана - уже на глаз хорошо заметно мерцание. Значение по умолчанию этого регистра равно $26. Регистр 5 --------- Этот регистр ведёт себя почти также, как и регистр 3, только в вертикальном направлении. Здесь задействованы младшие 5 бит. Чем значение ближе к 0 или к $1f, тем экран чуть-чуть выше, а чем ближе к $10, тем чуть-чуть ниже. Например, значения 7 и $17 полностью идентичны. Значение по умолчанию этого регистра равно 0. Регистр 0 --------- Значение по умолчанию этого регистра равно $3f. При $3e экран смещается левее. При $3d уже начинает прыгать. Если задавать значения больше $3f, то экран будет смещаться вправо, причём чем больше значение, тем будет сильнее мерцание экрана, монитор начинает гудеть, еле-заметно, но всё же уменьшается яркость экрана. При $45 экран уже начинает прыгать. Регистр 7 --------- Значение по умолчанию этого регистра равно $1f. Скорее всего, здесь задействованы только 7 бит, т.к. замечено, что например, значения $1f и $9f равнозначны. В чём-то этот регистр напоминает регистр 4, только здесь всё, что не поместилось внизу, продолжает выводиться сверху. Итак, регистр 7 - начало вывода экрана по вертикали. Чем значение меньше, тем экран ниже. При $18 уже не видно 25 строки, а при $17 эта 25 строка появляется вверху экрана. 27 строка (клавиши в бейсике/время в unidos) становится видна в самом верху экрана при значении $18 (при $19 её ещё нет). При значении 0 уже становится не видно внизу той строки, которая при обычной работе первая, самая верхняя. При $26 первая строка так высоко вверху, что на монитор надо смотреть немного снизу, чтобы её увидеть. А при $27 экран уже начинает прыгать. Регистр 8 --------- Значение по умолчанию этого регистра равно 0. Здесь задействованы только 2 младших бита. Значения 0 и 2 - неразличимы. При значении 1 - экран выглядит так же, как и в режимах 0 или 2, но частота обновления экрана значительно меньше - экран очень заметно мерцает. А вот значение 3 - можно сказать - это текстовый режим 40x50 - короче разрешение по вертикали удваивается. Дополнительные 25 строк заполняются "прошлым экраном", правильнее сказать, туда постепенно уходит верх "обычного" экрана в результате скроллинга. Ещё экран сильно мерцает (здесь это очевидно - повысили разрешение, приходится понижать частоту обновления экрана). Также при значении 3 курсор всегда в полную высоту и не меняет своего вида при нажатии F15. Регистр 9 --------- Значение по умолчанию этого регистра равно 7. Видимо, здесь задействованы только младшие 5 бит, т.к. например, значения 7 и $27 равнозначны. Значение этого регистра - число точек по вертикали на 1 символ (считая от 0, т.к. нормальное значение 7). Здесь могут наблюдаться различные побочные эффекты. При значении 6 и меньше, например, курсор ведёт себя также, как описано при описании значения 3 регистра 8. При значении 5, например, экран разрезан на 3 части, сильно мерцает (лучше сказать, что здесь нечто среднее между мерцанием и прыганьем), при 4 -экран разрезан на 2 части, мерцает слабее. При 3, 2, 1, 0 - тоже нечто подобное. Очевидно, что в таких режимах, пусть даже экран не всегда прыгает, ни одной буквы уже не разобрать. Также замечено, что при значении 2 и меньше слегка увеличивается чувствительность клавиатуры, уменьшается время автоповтора. При значениях >= $0a экран начинает прыгать. Дополнение о регистрах 1 и 6 ---------------------------- Если задавать значение рег. 6 меньше номинального, то на экране ниже заданного просто ничего нет. Если задать больше номинального, то до самого низа экрана от последней нормальной строки будет выведен мусор, который может продолжиться и в верхней части экрана, если задать приличное значение. Теперь о регистре 1. Если задать меньше 40, то будет перенос строк, но накладки изображения не будет. Если больше 40, то тоже не будет накладки (в отличие от ситуации, которая сейчас в эмуляторе с show.cmd) - просто строки по-новому перераспределятся. В зависимости от значения рег. 1 изображение может распространиться до самого правого края экрана, при больших значениях - даже часть изображения появится слева, а при ещё больших - вообще на экране ничего не будет, только полоса (узкая, вертикальная) у самого правого края экрана (так, по крайней мере, было при значении $72). ВНИМАНИЕ! Совсем недавно выяснено, что если задать значение регистра 1 или 6 меньше, чем было, то часть экрана вне новой области автоматически очищается (в эмуляторе этого нет). ----------------------------------------------------------------- И последнее. Адреса $e604/$e605 равнозначны $e600/$e601 (в show.cmd как раз и используются $e604/$e605). $e602/$e603 также можно использовать. В отличие от эмулятора, на реальном Пълдине можно например, номер регистра занести в $e604, а потом его значение - в $e601 - и всё нормально сработает! Также совсем недавно было выяснено, что не только вышеприведённые адреса можно использовать, а АБСОЛЮТНО ВСЕ из области $e600-$e61f, например, пары $e61e-$e607, $e610-$e613 и прочие. Видеорегистры - работают только на запись! Значения видеорегистров нельзя считать обратно. Например, если в $e600 занести номер регистра, а потом с помощью ldaa $e601 захотеть считать - то всегда будет получаться ноль. ----------------------------------------------------------------- В заключение привожу сводную информацию, какие значения по умолчанию имеют видеорегистры сразу после перезагрузки Пълдина (при инициализации BIOS) (режим 320х200), а также для нестандартного режима 384х200 в программе show.cmd. (При режиме 384х200 хорошо заметно, что экран располагается немного левее обычного, и, если хорошо присмотреться, то можно заметить лёгкое увеличение мерцания, чем при обычном режиме). ----------------------------------------------------------------- Номер регистра | 1 (601) | 2 (601А) | 3 (show.cmd) | ----------------------------------------------------------------- 0 | 63 | 127 | 63 | 1 | 40 | 80 | 48 * | 2 | 48 | 99 | 55 * | 3 | 5 | 10 | 5 | 4 | 38 | 38 | 38 | 5 | 0 | 0 | 0 | 6 | 25 | 25 | 25 | 7 | 31 | 31 | 31 | 8 | 0 | 0 | 0 | 9 | 7 | 7 | 7 | 10 | 32 | 32 | 39 * | 11 | 7 | 7 | 7 | 12/13 | $F000 | $F000 | $1000 | 14/15 | $F000 | $F000 | $1000 | ----------------------------------------------------------------- Столбец 1 = при инициализации BIOS на модели 601. Столбец 2 = при инициализации BIOS на модели 601А. Столбец 3 = Программа show.cmd (нестандартный режим 384х200). (Цифры в таблице указаны в 10-системе счисления, где 16- - там указан $ ). -------------------------------------------------------------------- Описание видеоконтроллера MC 6845 (Пълдиновский СМ 607 - его аналог), можно найти в Интернете, по адресу: http://intel386.narod.ru/doc/asm/8-6-3.html