User Tag List

Страница 3 из 4 ПерваяПервая 1234 ПоследняяПоследняя
Показано с 21 по 30 из 38

Тема: ПЗУ безопасные места

Комбинированный просмотр

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1

    Регистрация
    08.05.2007
    Адрес
    Dnepropetrovsk
    Сообщений
    1,089
    Спасибо Благодарностей отдано 
    281
    Спасибо Благодарностей получено 
    70
    Поблагодарили
    49 сообщений
    Mentioned
    3 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от tae1980 Посмотреть сообщение
    Возникает пара вопросов:
    2. В какие места ПЗУ наиболее безопасно вносить изменения для сохранение совместимости? А может есть места которые лучше не трогать? Или таких мест не существует?
    Вообще говоря, лучше не менять ничего. Совсем. Вот неполный перечень граблей, на которые я и другие в своё время наступали:
    1) Клавиатура, таблицы соответствия скан-кодов буквам ("BHY65TG..."). Эту таблицу перемещать или изменять нельзя. Некоторые программы её используют, при этом не используя код опроса клавиатуры из ПЗУ;
    2) "Свободное место" между кодом Бейсика и знакогенератором. Многие программы ставят на эти адреса регистр I, предполагая, что там записаны FFы, и ставя на адрес FFFF обработчик прерываний IM 2. Если по этим адресам в ПЗУ находятся не FFы - то первое же прерывание отправляет программу в отключку;
    3) Код программ рисования линий, точкек и окружностей. Мне встречалась защита, которая помещает зашифрованный код программы в экранную область, затем вызывает подпрограмму "LINE" рисования линии в режиме OVER 1, тем самым модифицируя строго определённые части зашифрованного кода обратимым образом. В моём случае алгоритм LINE не менялся, так что линия рисовалась правильно... Только вот регистр R после отработки программы имел другое значение, в результате чего дальнейшая расшифровка программы шла неверно, и происходил полный сбой;
    4) Коды подпрограмм калькулятора. Я в них исправлял ошибки, найденные Логаном и О-Харой, а также исправил "самозатирание" ПЗУ одной из таких подпрограмм. Всё бы ничего, но предательский регистр R, на который полагаются защиты, снова имел не то значение, что нужно;
    5) Код обработчика NMI. Некоторые защиты его проверяют и, если он нестандартный - отказываются работать (это защита от разнообразных мониторов-отладчиков на основе NMI).

    Были и другие сюрпризы, сейчас уже всех не вспомнишь. Но общий вывод такой, что какими бы малыми и безобидными ни были изменения ПЗУ, они могут привести к неработоспособности некоторых программ. И тут не важно, кто виноват - автор такой программы или автор изменений ПЗУ. Факт налицо - с изменениями ПЗУ программа не работает, без изменений - работает. Хочешь запускать программу - откати изменения ПЗУ назад.
    Цитата Сообщение от tae1980 Посмотреть сообщение
    3. Есть ли декомпилирование ПЗУ в виде код в txt, asm или аналогичных файлах?
    Зачем? Для понимания работы ПЗУ это не нужно. Есть книга Логана и Хары. Чтобы компилировать ПЗУ назад? А зачем? При малых изменениях в этом нет смысла, достаточно просто изменить содержимое двоичного файла-образа в нужных местах. Смотри мою тему про BOGOBASIC. При больших изменениях, когда сдвигаются адреса некоторых важных подпрограмм, почти весь софт перестанет работать с таким образом ПЗУ.

  2. #1
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  3. #2

    Регистрация
    09.09.2018
    Адрес
    г. Саратов
    Сообщений
    438
    Спасибо Благодарностей отдано 
    144
    Спасибо Благодарностей получено 
    115
    Поблагодарили
    50 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Barmaley_m Посмотреть сообщение
    Вообще говоря, лучше не менять ничего. Совсем.
    Это понятно.
    Хочу реализовать работу с программами для режиме Спектрума 48кб из режима CP/M на Профи. А значит нужно куда-то вставить код для возврата и взаимодействия с CP/M, нужно перехватить ввод/вывод на магнитофон и подменить его чтением/записью в файл на винчестер и т.п. Придется действовать путём установки прыжков со входа в подпрограммы ПЗУ. Но всё равно нужно где-то разместить относительно небольшой код переключение на страницу с кодом реализующие взаимодействие с CP/M.

  4. #3

    Регистрация
    22.05.2011
    Адрес
    г. Дзержинск, Украина
    Сообщений
    6,829
    Спасибо Благодарностей отдано 
    483
    Спасибо Благодарностей получено 
    663
    Поблагодарили
    513 сообщений
    Mentioned
    10 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от tae1980 Посмотреть сообщение
    Придется действовать путём установки прыжков со входа в подпрограммы ПЗУ. Но всё равно нужно где-то разместить относительно небольшой код переключение на страницу с кодом реализующие взаимодействие с CP/M.
    нет ну
    когда шина стабильная
    то вектор прерывания всегда считывается с одного адреса (2 байта)
    так же начало вектора прерываний только по адресам кратным $100

    ТОЕСТЬ
    оставляем 2 байта с $FF в нужном месте
    и можем использовать 255 остальных байта из этой "256 байтной страницы"

    ну а таких целых 4 39xx 3Axx 3Bxx 3Cxx

    если пзу позволяет

    то сделать несколько вариантов с размещением в разных местах
    чтоб если не работает один
    пробовать другой

    и по крайней мере
    софт который юзает пзу для вектора прерываний
    падать уже не будет
    Последний раз редактировалось NEO SPECTRUMAN; 20.02.2020 в 04:24.

  5. #4

    Регистрация
    09.09.2018
    Адрес
    г. Саратов
    Сообщений
    438
    Спасибо Благодарностей отдано 
    144
    Спасибо Благодарностей получено 
    115
    Поблагодарили
    50 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    NEO SPECTRUMAN, на первом этапе я вообще не хотел трогать прерывание.
    Для работы CP/M нужны первые 255 байт и часть адресов в конце. Планирую реализовать переключение на страницу с кодом CP/M с адресов #C000, в ней производить подмену первых 256 байт и последующие необходимые действия (нужны ещё будут буфера для операций чтения/записи), по окончанию восстанавливаем целостность ПЗУ.
    Вот сам подобные переход планировался во время операций чтения/записи, для чего нужно перехватывать обращения к профильным подпрограммам ПЗУ. По сути вставить "JP NNNN" на входе в подпрограммы на кусок кода который переключит страницу и сделает переход на подпрограмму обработчик.
    Вмешательство в ПЗУ минимальное. Из минусов возврат в CP/M можно будет реализовать только в момент работы с магнитофоном. В этом случае должно открываться окно позволяющее выбрать файл для загрузки/записи из которого уже можно вернуть в CP/M.

  6. #5

    Регистрация
    22.05.2011
    Адрес
    г. Дзержинск, Украина
    Сообщений
    6,829
    Спасибо Благодарностей отдано 
    483
    Спасибо Благодарностей получено 
    663
    Поблагодарили
    513 сообщений
    Mentioned
    10 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от tae1980 Посмотреть сообщение
    на первом этапе я вообще не хотел трогать прерывание.
    а к чему здесь прерывания?
    я говорю про свободное место которое можно занять
    и про не свободное, которое лежит среди свободного, которое занемать низя

  7. #6

    Регистрация
    08.05.2007
    Адрес
    Dnepropetrovsk
    Сообщений
    1,089
    Спасибо Благодарностей отдано 
    281
    Спасибо Благодарностей получено 
    70
    Поблагодарили
    49 сообщений
    Mentioned
    3 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от tae1980 Посмотреть сообщение
    Хочу реализовать работу с программами для режиме Спектрума 48кб из режима CP/M на Профи. А значит нужно куда-то вставить код для возврата и взаимодействия с CP/M, нужно перехватить ввод/вывод на магнитофон и подменить его чтением/записью в файл на винчестер и т.п.
    Для этого не обязательно менять ПЗУ. Тем более, что изменённое ПЗУ не каждый потенциальный пользователь твоей системы сможет и захочет прошить.

    Почему бы не воспользоваться приёмами, типичными для "расширений Бейсика" типа Beta-Basic, Laser-Basic или ПЗУ Interface 1?

    Общий принцип там такой, что подменяется содержимое адреса возврата при ошибке (два байта, находящиеся по адресу, который хранится в системной переменной ERR_SP). Твоя подпрограмма обработки ошибок смотрит, что за ошибка была. Если это ошибка синтаксиса (C Nonsense in BASIC, 10:1) - то анализируется содержимое бейсик-программы, вызвавшей ошибку (для этого используется системная переменная, содержащая адрес следующего интерпретируемого символа - забыл название). Если содержимое бейсик-программы соответствует реализованным тобой расширениям - то это содержимое обрабатывается твоим кодом (происходит переход в CP/M и т.д.), в противном случае управление передаётся обратно бейсику, чтобы тот выругался по поводу NONSENSE.

    Когда отработали твои программы обращения к винчестеру и т.д. - то указатель на интерпретируемый символ передвигается туда, где, с точки зрения бейсика, ошибок больше быть не должно. И происходит прыжок в соответствующую точку ПЗУ, как будто никакой ошибки синтаксиса не было. Исполнение программы продолжается бейсиком.

    В такой системе менять содержимое ПЗУ вообще не нужно.

  8. #7

    Регистрация
    09.09.2018
    Адрес
    г. Саратов
    Сообщений
    438
    Спасибо Благодарностей отдано 
    144
    Спасибо Благодарностей получено 
    115
    Поблагодарили
    50 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Barmaley_m Посмотреть сообщение
    Для этого не обязательно менять ПЗУ. Тем более, что изменённое ПЗУ не каждый потенциальный пользователь твоей системы сможет и захочет прошить.
    ПЗУ в железе вообще трогаться не будет. У Профи ПЗУ отключаемое (это требование CP/M), на его место встаёт страница 0. Так что можно просто грузить нужный код. Из ограничений, CP/M использует для своих целей адреса 0-255, тут нужно не сложно химичить.

    Хочу сделать эмуляцию режима 48кб (в перспективе 128кб), а не просто работы в бейсике. Что бы можно было грузить (и не только) программы напрямую из CP/M. Для чего реализуем основной код "эмулятора" в одном из верхнем сегментах памяти, а в ПЗУ нужно буквально несколько байт которые включат нужную страницу и совершат переход на подпрограмму. Благодаря наводке NEO SPECTRUMAN "безопасные" места вроде найдены. Остальное дело техники. Правда геммора ещё будет много в других местах. Сейчас ломаю голову как реорганизовать использование памяти внутри самой CP/M, так что бы весь код системы и драйвера вынести выше 7 страницы. Задача так же весьма не тривиальная, так как весь код писался так что бы мог работать на 128кб и подобный перенос не планировался, а страница 5 вообще имеет особое значение.

  9. #8

    Регистрация
    27.02.2005
    Адрес
    москва
    Сообщений
    14,318
    Записей в дневнике
    1
    Спасибо Благодарностей отдано 
    203
    Спасибо Благодарностей получено 
    1,483
    Поблагодарили
    968 сообщений
    Mentioned
    18 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    достаточно давно существует вообще альтернативная прошивка OpenSEbasic
    https://www.worldofspectrum.org/info...cgi?id=0027510
    вариант для использования в коммерческих/аппаратных клонах.
    совместимость довольно высокая + новые команды/улучшения

  10. #9

    Регистрация
    31.03.2016
    Адрес
    г. Санкт-Петербург
    Сообщений
    33
    Записей в дневнике
    3
    Спасибо Благодарностей отдано 
    7
    Спасибо Благодарностей получено 
    81
    Поблагодарили
    12 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    А кстати. Такой вопрос к профессионалам, который давно интересует. Почему нижеследующая программа в адресе 30000 и 40000 звучит по разному? В 30000 как из бочки, а в 40000 звучит как в ПЗУ по первым четырёхзначным адресам? Ошибка отсчёта T-State или что-то совсем специфическое?
    Так будет на всех версиях Spectaculator и последних версиях EmuZWin. На ранней версии эмулятора звук во всех областях одинаковый.

    Скрытый текст


    ORG XXXXX

    LD HL, 1642 ; Длина звука
    LD DE, 261 ; Тональность
    beeper: DI
    LD A, L
    SRL L
    SRL L
    CPL
    AND 3
    LD C, A
    LD B, 0
    LD IX, BEIX3
    ADD IX, BC
    LD A, (23624) ; Цвет рамки во время звучания
    AND 56
    RRCA
    RRCA
    RRCA
    OR 8
    BEIX3: NOP
    BEIX2: NOP
    BEIX1: NOP
    BEIX0: INC B
    INC C
    BEHLLP: DEC C
    JR NZ, BEHLLP
    LD C, 63
    DEC B
    JP NZ, BEHLLP
    XOR 16 ; Цвет чередующейся полоски (16...24)
    OUT (254), A
    LD B, H
    LD C, A
    BIT 4, A
    JR NZ, BEAGAIN
    LD A, D
    OR E
    JR Z, BEEND
    LD A, C
    LD C, L
    DEC DE
    JP (IX)
    BEAGAIN:LD C, L
    INC C
    JP (IX)
    BEEND: EI
    RET
    [свернуть]

  11. #10

    Регистрация
    08.09.2005
    Адрес
    Воронеж
    Сообщений
    5,024
    Записей в дневнике
    3
    Спасибо Благодарностей отдано 
    326
    Спасибо Благодарностей получено 
    336
    Поблагодарили
    258 сообщений
    Mentioned
    11 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Yuri80 Посмотреть сообщение
    А кстати. Такой вопрос к профессионалам, который давно интересует. Почему нижеследующая программа в адресе 30000 и 40000 звучит по разному? В 30000 как из бочки, а в 40000 звучит как в ПЗУ по первым четырёхзначным адресам? Ошибка отсчёта T-State или что-то совсем специфическое?
    модель спектрума? наиболее вероятная причина - в медленной памяти (на пентагоне разницы не должно быть)

    Цитата Сообщение от Yuri80 Посмотреть сообщение
    Так будет на всех версиях Spectaculator и последних версиях EmuZWin. На ранней версии эмулятора звук во всех областях одинаковый.
    оба очень давно не обновлялись, и не стоит принимать их за образец
    Прихожу без разрешения, сею смерть и разрушение...

Страница 3 из 4 ПерваяПервая 1234 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Ответов: 76
    Последнее: 22.08.2019, 21:33
  2. Спектрумовские места в СПб
    от _Andrey в разделе Разный софт
    Ответов: 4
    Последнее: 03.11.2009, 20:34

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •