Сообщение от
Titus
Вопрос к знатокам УКНЦ на счет регистра октета точки.
В некоторых программах с заливкой, она заливается у меня на эмуляторе мимо. Стал выяснять почему, вырисовывается такая картина. Программа пишет байты в регистр октета точки в цикле записи. Тогда как в инструкции написано, что для того, чтобы было рисование по маске, в этот регистр надо производить чтение-модификацию-запись. Т.е. при чтении загружается регистр цвета фона, а при записи уже на этот фон накладывается новое изображение. Почему же тогда программы, просто записывающие байт в регистр октета точки преспокойно рисуют по старому фону?
Заметили таки! Да, я тоже помучился, когда писал редактор шрифтов FNT. А все довольно просто. В инструкции все правильно сказано насчет чтения-модификации-записи. А вот в описании на процессор 1801ВМ2 очень существенный момент упустили (его нет и в техописании, которое выкладывали Вы). А этот тонкий момент состоит в том, что по записи в источник словные и байтовые команды отличаются. Команд этих всего три - MOV(B), CLR(B) и MFPS. В байтовом варианте при записи приемника DST, он сначала прочитывается из памяти (фиктивное чтение), а затем записывается. В словном варианте производится безусловная запись приемника без его предварительного чтения. Такие тонкости относятся к MOV и CLR. Команда MFPS имеет только байтовый вариант, поэтому здесь всегда производится чтение-модификация-запись для приемника.
Поэтому, если надо наложить по старому фону, то можно сделать так:
Код:
TST @#177024
MOV R0,@#177024
или более быстро и просто:
Особенности работы этих команд проверены и на других регистрах, в частности на регистре данных приемника канала 0 177562. Если в регистре 177560 устанавливался бит готовности 7, то после этого производилась запись в регистр 177562. Сама по себе запись в этот регистр бесполезна. При словной записи бит готовности в 177560 не сбрасывался, а при байтовой записи сбрасывался, что подтверждает то, что к регистру 177562 применялась операция чтения. Сразу оговорюсь, что 1801ВП1-120, где находятся эти регистры, сигнал записи байта WTBT не обрабатывает.
Команды MOVB по отношению к регистру 177024 применяется и в системном ПЗУ УКНЦ при обработке графических функций (это где-то в адресах 140000-152000).
В эмуляторе UKNCBTL это уже учтено, исходники свободны, смотрите.
P.S. Сразу отмечу, что EmuStudio некорректно работает с регистрами контроллера дисковода. При чтении зараз большого объема данных он не читается, выдает ошибку. Из-за этого при исполнении команды DIR/BAD/FIL выдается ошибка "Too many bad blocks", нельзя загрузить большие исполнимые файлы (не смог GOBLIN, не грузилась дискета с JEK-ом, не загрузить TurboBasic, не работает Writer).