Paguo-86PK wrote:пинцетиком работаю на Hex-уровне!
Paguo-86PK wrote:я правлю МОНИТОР пинцетиком и жонглирую кодом как фигурками Тетриса: втискиваю свой функционал в рамки стандартного
Paguo-86PK wrote:5 ячеек можно отыграть, но весь код придётся двигать. Об этом я давно думаю, но лень пока копаться
Да не 5 ячеек выигрывается, а 205. И весь код можно и нужно двигать, но соблюдая неизменность нескольких внутренних точек на которые делают вызовы игры идиотов и несколько фатальных внутренних точек, что наложили эмуляторы EMU, EMU80 (сохранять которые важно только для эмуляторов, для реала это не надо).
Но это легко делается, лишь когда программируют нормальными инструментами, а не занимаются мазохизмом, программируя отладчиком. Вы считаете, что это спортивно, но это не советский спорт. Это спорт мазохистов, потому что так программировать это мазохизм. Никто не писал так даже в 1975 году. Тогда не было ни отладчиков, ни ассемблеров. Но писали на бумаге на ассемблере (лишь функцию компилятора выполняли вручную).
По поводу нехватки объёма ПЗУ. Если, как в ОРИОНЕ, объявить обязательным наличие ROM-диска, то легко снимаются все проблемы нехватки объёма ПЗУ F800. ROM-диск позволяет иметь в ПЗУ F800 оверлейные директивы. Резидентными достаточно иметь лишь директивы I и G (как в М3 ОРИОНА). А остальные директивы легко можно сделать оверлейными. Например, после ввода директивы D исполнительный код выполняющий вывод дампа считывается в ОЗУ (основное или дополнительное) из ROM-диска и прогоняется. Для пользователя это без разницы.
Код всех директив умещается в 100 байт, ноничто не мешает изобрести новую директиву с кодом бОльшим (т.к монитор это не отладчик, основное ОЗУ вниз от RAMTOP можно затирать). Т.о за счёт ROM-диска можно одновременно расширить количество и улучшить качество директив, да ещё и освободить в ПЗУ F800 до килобайта свободного места.
Так можно встроить в монитор директивы обслуживания DOS (так было сделано в RK-DOS V1.0). Когда у меня случится очередной припадок для ковыряния в ПЗУ РК86, то возможно на этом принципе встрою в ПЗУ РК86 RAMDOS от Специалиста (там CCP команды RAMDOS являются расширением директив монитора).
Paguo-86PK wrote:при скроллинге экрана код не завершается по «RET», а сразу стыкуется с кодом опроса клавиатуры
Ещё один метод с'экономить один байт. Можно применить, если прижмёт.
Paguo-86PK wrote:Сброс я тоже хотел бы доработать и сохранять регистры для анализа, если какая-то программа зависла… Да, адрес инструкции не узнать, но SP тоже немало скажет…
Анализа регистров после сброса у Вас не получится, т.к по сбросу во всех процессорах все регистры гибнут и SP в том числе. Регистры можно анализировать, если использовать NMI в Z80. Но программы виснут не в конкретной точке, знание которой даёт информацию, а обычно происходит улёт с гибелью всего или части кода и зацикливанием в совершенно случайной точке.
На эту тему упомяну автостартовый хук введённый в M3 (во все версии кроме стартовой M3.1). Там после изменения 4-х ячеек после сброса происходит принудительный переход. Это было средство для получения слепков памяти, рестарта системы и для защиты от кракеров.
Code: Select all
COLDST: LD HL,(0F3C1H)
LD SP,0F3BFH
POP BC
PUSH HL ; теперь в стеке адрес ухода
SCF
ADC HL,BC
RET Z ; уход
.
Например, чтобы по нажатию на кнопку СБРОС был переход, допустим, на точку BC00, кладём число BC00 в ячейки F3C1/F3C2, а в ячейки F3BF/F3C0 кладём число BC00 в дополнительном коде минус 1. Тогда по нажатию на кнопку сброс всегда будет переход на BC00. В М3 реализовано на порядок больше идей, чем в М1/М2.
- - - Добавлено - - -
Как я и упоминал ранее, даже от таких отвлечённых от реальных потребностей обсуждений бывает польза. И не только в плане моральной поддержки. Во-первых, я вспомнил о забытой на 25 лет идее оверлейного монитора, а во-вторых, вспомнил о резидентных DOS, которые (ради экономии объёма ПЗУ) не имея собственного CCP, в качестве него используют CCP монитора. Так работала RAMDOS для Специалиста и так же работала RK-DOS первой версии.
Всё это навело на мысль, что пора бы уже исковырять ПЗУ РК86 более существенно (до того, я лишь оптимизировал, не меняя имеющийся код, с целью выиграть байты ПЗУ). Потому вчера я решил посмотреть можно-ли в РК некоторые директивы заменить более удобными в пользовании директивами из монитора Специалиста.
В частности, не очень удачны директивы D, M, T, L и S. Директива М не показывает и не позволяет вводить ASCII и перемещаться по коду вверх-вниз, T не допускает перехлёст областей, а S ищет только один байт. При грамотной директиве D директива L вообще не нужна. А процедура конверсии строки с параметрами неудачна, т.к в качестве разделителя параметров использует запятую и вводит всего 3 параметра. Вместе с тем, стоит заметить, что весь код ПЗУ РК написан на весьма высоком уровне, меньшего объёма кода директив добиться почти невозможно (выигрывается лишь по паре байтов то тут, то там).
Собственно сам монитор неинтересен, его улучшение в виде замены родных директив другими, взятых от других машин не представляет даже спортивного интереса, не требует особого труда и не требует ума. Тем не менее, чтобы использовать CCP монитора для RAMDOS пришлось заменить GETLIN и процедуру конверсии строки с параметрами в HEX-значения, т.к CCP РК не позволяет ввод имён. Родная процедура GETLIN не универсальная (не допускает ввода точки, что необходима для имён файлов). Потому пришлось менять не только код самих директив, но и п/п-мму ввода строки и процедуру её анализа. В итоге на скорую руку скомпилировал новую версию РК-монитора. На этом я потерял более сотни байт, зато теперь можно ввести загрузку из ROM-диска расширения монитора. Это должно делаться автоматически по сбросу, если ROM-диск обнаружен.
Загружать можно любое расширение монитора, т.е можно не только добавить новые директивы, но любую резидентную директиву монитора можно заменить на другую. Например, резидентная директива S ищет один байт (в таком виде она вообще не нужна, отладчики ищут цепочку байт). Но после инсталяции расширения CCP для работы с DOS, директива S в виде:
--> S Имя_файла, Начальный_адрес, Конечный_адрес
записывает файл на дисковый привод (что в зависимости от конкретной DOS м.быть дискетой, винтом или RAM-диском). Если же загрузка DOS из ROM-диска не нужна (когда DOS прошита в ПЗУ, например с E000 или с 9000), то и загрузка директив извне не нужна и экономится ~20 байтов.
Вот пока ради эксперимента странслировал монитор с изменёнными директивами D, M и C. В директиве D теперь можно вводить только нач.адрес. Конечный адрес установится по умолчанию. Т.к достаёт вводить конечный адрес всякий раз когда надо посмотреть дамп. В дампе теперь выдаётся и ASCII представление, как принято в дампах. Директива М позволяет переходить к предыдущей и последующей ячейкам клавишами "курсор-вверх" и "курсор вниз". Для ввода символа ASCII - нажимаем на <АР2>, затем на клавишу символа. Нажимать <ВК> теперь не требуется, ввод автоматически происходит после набора второй цифры (что резко ускоряет ручной ввод дампа и текстов).
Все нестандартные входные точки, кроме одной сохранены. Убрана вх.точка F92C (т.к в применённом теперь CCP логика работы аналогичной п/п-ммы иная). F92C это п/п-мма для преобразования строки с тремя HEX-параметрами в загрузку ячеек PAR_HL, PAR_DE и PAR_BC шестнадцатеричными значениями.
В эту нестандартную вх.точку игры РК никогда не лезут. Из всех программ РК я встретил только одну РК-программу из 1987 года (мини-дизассемблер, 5000...5B18, KS:8DEE), которая нагло лезла в эту точку. Потому эта программа у меня не заработала в эмуляторе РК на ОРИОНЕ (т.к там в ПЗУ F800 только п/п-ммы ввода/вывода, директив монитора за ненадобностью и отсутствия места там нет). А вот в подпрограмму GETLIN (F8EE), также используемую CCP, некоторые РК-игры лезут.
You do not have the required permissions to view the files attached to this post.