Про окружение для STD программ не забыл? Там надо загружать монитор и инициализировать кучу его переменных.
Про окружение для STD программ не забыл? Там надо загружать монитор и инициализировать кучу его переменных.
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
Вау! Как всё сложно-то.
Да ничего подобного. Т.к. монитор у нас грузится в ОЗУ (с адреса C000h), то мы грузим стандартный монитор, правим переход на программу, грузим программу и только после этого прыгаем не на программу а на монитор, точнее на ПСПЗУ по адресу С000h. Сначала отработает загрузчик, затем он прыгнет в монитор, а после инициализации монитора прыгнет на нашу программку автоматически. Даже все проще, технически, нужно инициализировать только ПСПЗУ, а монитор должен только присутствовать. Объясняю почему: ПСПЗУ является неким БИОС, поэтому его надо инициализировать полностью, чтобы он проинитил оборудование, расставил стек, вектора ввода и вывод символа и всякие свои константы. Затем можно просто прыгнуть в целевую программу. А вот они то уже 100% зависят от ПСПЗУ, и большинство из них - от монитора. В общем, чуть попозже, я подготовлю ПСПЗУ и монитор специально для запуска STD окружения.
Я думал такие очевидные вещи вы учли. Ведь даже в чистом МХ нужно грузить монитор Волкова, чтобы запускать старые программки. А сам переход между режимами, конечно, не сложный...
Нет, в STD режиме он так же копируется в ОЗУ, но после перехода в МХ его сам RAMFOS уничтожает. В общем вот тебе бинарник (во вложении). Порядок запуска таков:
1. Ты грузишь программу "по месту". Естественно, она должна быть рассчитана под STD и учитывать распределение памяти STD.
2. Ты грузишь этот монитор.
3. Ты заносишь адрес старта в ячейку C846h (через SHLD, младший байт в C846h, старший в C847h).
4. Ты делаешь действия по переключению, которые ты тут уже описывал (настройка палитры и смена режима).
5. Ты прыгаешь на С000h.
Отличия данного монитора от стандартного такие:
В оригинальном ПСПЗУ, в первых ячейках стоит JMP C003, что в принципе нам не мешает, но если ты будешь копировать ПСПЗУ и монитор из внутреннего ПЗУ, то там стоит команда STA 7FFA, которая используется для отключения ПЗУ. Технически, ты можешь ее использовать, перед прыгом задав в [A] нужный режим. А в XXXXH заносишь адрес старта программы. Если будешь использовать копию монитора из ПЗУ, тогда твои действия будут такими:Код:C000 00 NOP C001 00 NOP C002 00 NOP *** C450 C3 00 C8 JMP C800H // Этот джамп перенаправляет на монитор *** C845 C3 XX XX JMP XXXXH // Этот джамп перенаправляет на целевую программу
1. Загружаем программу по месту расположения.
2. Втыкаем режим 3 (не забываем о шлюзе, т.к. карта поменяется).
3. Включаем ПЗУ в режиме 3.
4. Копируем ПСПЗУ и монитор с C000H.
5. Патчим его согласно таблицы выше.
6. прыгаем на C000H.
Не забываем стереть экран перед этими действиями.
Попробуешь, отпишись.
Что-то не выходит. Кстати ячейки для адреса в Мониторе-4 другие (#c849/a). Глянь не замыленным взглядом что не так?
ld a, #00 ; ПЗУ включено
ld (#f7f8), a
ld a, #03
ld (#ffff), a
ld hl, #0100
ld de, #c000
LoopStd ld a, (hl)
ld (de), a
inc hl
inc de
ld a, h
cp #14
jp nz, LoopStd
ld hl, (Start)
ld a, l
ld (#c849), a
ld a, h
ld (#c84a), a
call ClearScr ; очистка экрана
ld a, #03 ; ПЗУ включено, 8 цветов
jp #c000
---------- Post added at 23:31 ---------- Previous post was at 23:06 ----------
В Мониторе-4 вместо:
C845 C3 XX XX JMP XXXXH // Этот джамп перенаправляет на целевую программу
стоит:
C845 CD 4B C8 CALL C84BH
Последний раз редактировалось fifan; 02.08.2013 в 21:08.
Ячейки правильные. CD (т.е. CALL), который ты там видишь, это вызов ввода буфера команды монитора. Нам он не нужен, поэтому я его заменил на JMP. Поэтому, делай правильно, + замени CD на C3. Я забыл это упомянуть, сорри. Кстати, в C450 тоже стоит CD на подпрограмму загрузки, надо заменить на C3 00 C8.
Уже делал - не работает. Правильно ли я включаю/выключаю ПЗУ, а то такое ощущение, что адрес вообще не записывается.
---------- Post added 03.08.2013 at 00:15 ---------- Previous post was 02.08.2013 at 23:46 ----------
Смотрю отладчик. А с #0100 в #c000 ничего-то не копируется, почему-то разные области памяти в них - в чём дело? А вот коды c3 00 c8 и c3 XX XX пишутся, даже адрес XX XX верно записывается.
Согласно схеме, лог.0 на разряде D0 включает ПЗУ, а лог.1 выключает. а ты туда 3 пишешь (8 цветов, выключенное ПЗУ). Это перед копированием. Выключать ПЗУ надо после копирования. Т.е., сначала 2 пишем, а потом 3. Ах да! Ты пишешь в F7F8h ДО переключения в режим 3, а в режиме 0, 1 и 2 данный порт по адресу FFF8.
Попробую, спасибо.
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)