С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
Не доходит до меня никак.
Перенести стек ниже 4000h (и выше 1fff, там в это время страница озу DivMMC), засунуть на вершину стека адрес возврата 0001, потом выполнить переход на 1ff8, где у нас ret ? Так сразу после выборки из памяти этого ret должна переключиться страница ОЗУ divmmc на штатное ПЗУ. И если все отработает правильно, то sp будет смотреть куда-то в ПЗУ rom48, а что вынется из стека, как адрес перехода - неизвестно (какие-то 2 байта штатного ПЗУ). Ну только если оно зависнет или сбросится с другими спецэффектами.. допустим, а какой из этого вывод?
DI никакого отношения к стеку не имеет.
ROM48 заведет стек в нужном ему положении ПОСЛЕ того, как начнет исполняться с адреса 0001. А чтобы он вообще начал это делать, надо ДО этого осуществить переход по этому адресу, если это делать через стек в адресах 2000-4000, то в том месте, куда мы записали адрес перехода 0001 сразу после выборки из памяти опкода ret (но еще до собственно перехода) окажется совсем другая память, это будет само ПЗУ48. И вместо адреса 0001 у нас ддя перехода из стека вынется какой-то мусор и по нему произойдет переход вместо 0001. Короче, сломается все.
Я про это не говорил
Есть DI , есть HL,1, есть переход на 0001
(DI находится по 0000 в ROM48, 2 раза DI не надо конечно же)
Если Вы сделали ранее (а в ROM IDE есть) DI то смело можно переходить на 0001, вот о чём речь
и попробовать изменить пару байт в ROM IDE тоже никто не мешает, а заодно и проверить результат
1. SP (где-то вместо LDIR)
2. NOP (дополнительный холостой цикл) и JP (HL)
3. SP на RAM и PUSH HL (без зануления памяти LDIR) и RET
4. censored Я бы ещё и LD A,1 и OUT (254), A (Шину адреса "пошевелить" для теста, перед JP (HL) ...)
Последний раз редактировалось USERHOME; 16.11.2020 в 02:08.
Что-то не сумел я понять, что при этом должно получиться ((
Сам тест не использует ОЗУ и не использует стек для своей работы. Для его работы менять указатель стека бессмысленно, а при переходе в ROM48 он все равно будет установлен туда, куда его инитит ROM48. Для перехода к адресу 0001 использовать стек тоже нет смысла, т к для адресов ниже 4000h надо исхитряться с подстановкой в адреса импровизированного стека в ROM48 нужной константы, а адрес перехода можно передать в регистре HL и переход выполнить однобайтной операцией jp (HL).
Я пока добился следующего: раз прерывания запрещены, то я HALTом попробовал сделать импровизированные брейкпойнты - ставил HALT по адресу 0001 в ROM48 при неизменном тесте testrom3 (ничего не изменилось - страница ROM48 не включалась и проц на эту инструкцию не попадал), а также в exit area в ПЗУ divmmc по адресу 1FFA, куда мы попадаем по нажатию клавиши 1 - по идее после чтения этого опкода должно измениться значение automap на 0 и должен переключиться romcs из 1 в 0 для включения штатного ПЗУ. Эта точка останова работала, но romcs остается единичным.
Либо все-таки /M1 не работает как надо, либо криво отрабатывает условие формирования romcs. Пока копаюсь дальше.
Последний раз редактировалось valerium; 19.11.2020 в 23:14.
Эту тему просматривают: 2 (пользователей: 1 , гостей: 1)