0
0
Последний раз редактировалось JeRrS; 06.01.2013 в 18:35.
Группа в ВК, посвященная кассетным версиям игр для спектрума
В коллекции:GRM-128 (YM+TR-DOS), Кворум 128+, Дельта 128, Эксперт-006, Рифей-01, Квант V3.а, Квант (Didaktik), Спектр БК-001, Sintez-M (Intercompex), Компаньон-2 (V2.2)
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
В каком режиме пробовали запускатьпрограмму? Насколько я знаю, команда LPRINT выводит данные через третий поток (аналогично PRINT #3). Однако, некоторые интерфейсы перехватывают это обращение (например LPRINT III) и обрабатывет его по-своему. Из-за чего, некоторые "фичи" для 48 спектрума с его ZX PRINTER'ом ведут к разного рода "глюкам". Также, вероятно, акутальна "занятость" буфера принтера в 128К модели.
Когда есть, но не знаешь где - это все равно, что нету.
Решил я очень-когда-то эту задачу, действительно, путём подмены точки входа в процедуру печати и перенаправлением на фиктивный драйвер принтера. Так что идею вы поняли правильно.
Такие вещи (типа LPRINT) работают не всегда.
Точнее не на всех тачках.
Зависит от типа контроллера принтера (если он вообще есть).
Была фича при помощи LPRINT выводить буквы двойной высоты, но если на Composite48 всё работало на ура, то на Скорпе - наглухо зависало. На Пентагоне писало ошибку.
В общем это надо глубоко ковырять как работает команда и смотреть где её клинит (а клинит, повторю, в зависимости от железа)
Для начала, функция USR nn - выполнение машинно-кодовой процедуры с адреса nn, по выходе из которой результатом будет являться состояние регистровой пары BC. Т.о. связка операторов LPRINT USR nn, должна приводить к выполнению кодовой последовательности (вероятнее всего перенастраивающей стандартный режим работы с принтером), а значение регистров BC использоваться при выполнении перехода на модифицированную процедуру обслуживания принтера.
Также работала на Делта С 48. Там использовалась сист. переменная для печати на принтере и оператор LPRINT, точнее LPRINT TAB n. Буквы получались высотой на одну из третей экрана.
Последний раз редактировалось null_device; 31.10.2010 в 19:11.
Когда есть, но не знаешь где - это все равно, что нету.
сист. переменная - адрес буфера принтера. если ее поставить на экран, 256 байт заполнятся графич. видом печатаемой строки. после этого оно захочет напечататься на принтере, и если сигнал "бизи" не активен, оно благополучно скипается и прога шуршит дальше. а вот если бизи установлен - был зависон...
А что если заменить LPRINT USR nnn на RANDOMIZE USR nnn или LET l=USR nnn?
Даю 1 против 10 что команда LPRINT используется в данном случае просто для того, чтобы "поглотить" результат функции USR, но основной эффект от USR как правило заключается не в результате (целом числе из диапазона 0-65535), а в процессе (который зависит от машинной программы, находящейся по адресу nnnn).
Но если требуется лишь "поглотить" результат USR, то с тем же успехом для этих целей вместо LPRINT могут использоваться команды RANDOMIZE, RESTORE, LET и так далее - любые команды, воспринимающие целые числа в качестве аргумента и не приводящие к побочным эффектам. Наиболее безопасно использовать LET чтобы поместить результат в какую-нибудь ненужную переменную, потому что побочные эффекты все-таки есть как от RANDOMIZE, так и от RESTORE, и они иногда неприемлемы. Например, в одной из моих программ не работала генерация случайных чисел из-за того, что я в ней использовал RANDOMIZE USR.
Врятли, скомпилированная программа сначала делает rst 20h, потом несколько callов, операции с регистрами после вышеописанное повторяется еще несколько раз.
При вызове любым другим оператором фукции USR, один фиг выдает nonsens in basic..
Когда есть, но не знаешь где - это все равно, что нету.
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)