User Tag List

Страница 6 из 6 ПерваяПервая ... 23456
Показано с 51 по 58 из 58

Тема: Нужна виртуальная машина на ZX

  1. #51

    Регистрация
    24.08.2007
    Адрес
    Днепропетровская обл.
    Сообщений
    1,681
    Спасибо Благодарностей отдано 
    2,717
    Спасибо Благодарностей получено 
    170
    Поблагодарили
    130 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Ну как же. На стеке лежат адреса подпрограмм, переход на них осуществляется командой RET. А любое пришедшее прерывание сразу затрёт адрес, как минимум, своим адресом возврата.

  2. #52

    Регистрация
    24.01.2008
    Адрес
    Уфа
    Сообщений
    3,927
    Спасибо Благодарностей отдано 
    106
    Спасибо Благодарностей получено 
    291
    Поблагодарили
    217 сообщений
    Mentioned
    10 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Andrew771 Посмотреть сообщение
    А почему прерывания должны быть запрещены?
    Потому, что SP указывет тут не на стек, а на программу. Если возникнет прерывание, программа испортится (будет записан адрес возврата).
    И кстати, "Адреса слов потока исполнения" должны быть как раз в прямом порядке. RET увеличивает указатель SP.

  3. #53

    Регистрация
    29.12.2010
    Адрес
    Москва
    Сообщений
    1,869
    Спасибо Благодарностей отдано 
    142
    Спасибо Благодарностей получено 
    110
    Поблагодарили
    66 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Вроде дошло, спасибо!
    Может тогда при разрешенных прерываниях в процедуре прерывания вначале сохранять кусок стека, а затем в конце перед выходом восстанавливать?

  4. #54

    Регистрация
    24.08.2007
    Адрес
    Днепропетровская обл.
    Сообщений
    1,681
    Спасибо Благодарностей отдано 
    2,717
    Спасибо Благодарностей получено 
    170
    Поблагодарили
    130 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Так было бы можно в случае более глубокого использования стека. Но на одно (то самое, для адреса возврата) слово стек будет испорчен всегда. До сохранения ещё дело не дошло. В этом-то и проблема.

    Этот пользователь поблагодарил Oleg N. Cher за это полезное сообщение:

    Andrew771(23.06.2020)

  5. #55

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

    По умолчанию

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

  6. #56

    Регистрация
    29.12.2010
    Адрес
    Москва
    Сообщений
    1,869
    Спасибо Благодарностей отдано 
    142
    Спасибо Благодарностей получено 
    110
    Поблагодарили
    66 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Lethargeek Посмотреть сообщение
    не такая уж и проблема, всегда можно по контрольной сумме/ксорке восстанавливать испорченный адрес в обработчике прерывания
    Можешь подробнее описать, каким образом?

  7. #57

    Регистрация
    24.01.2008
    Адрес
    Уфа
    Сообщений
    3,927
    Спасибо Благодарностей отдано 
    106
    Спасибо Благодарностей получено 
    291
    Поблагодарили
    217 сообщений
    Mentioned
    10 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Самый простой способ - держать копию программы, и в прерывании восстанавливать повреждённые байты.

  8. #58

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

    По умолчанию

    Цитата Сообщение от Andrew771 Посмотреть сообщение
    Можешь подробнее описать, каким образом?
    да что там описывать, условно разбиваешь подверженную порче память на блоки размером, допустим, по 256 байт
    для каждого блока вычисляешь эталонную двухбайтную контрольную сумму или две ксорки (для чётных и нечётных байт)
    в обработчике прерывания находишь по адресу в sp блок, вычисляешь для него новую контрольную сумму/ксорки
    восстанавливаешь испорченные два байта по разнице с эталоном (предварительно забрав оттуда адрес возврата)

    и неважно, какой смысл имеют данные в блоке: например, в commando ксорки применяются аналогично для восстановления спрайтов

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

    Этот пользователь поблагодарил Lethargeek за это полезное сообщение:

    Andrew771(25.06.2020)

Страница 6 из 6 ПерваяПервая ... 23456

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

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

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

Похожие темы

  1. ZXMAK2 - Виртуальная машина ZX Spectrum
    от ZXMAK в разделе Эмуляторы
    Ответов: 2230
    Последнее: 25.10.2025, 20:43
  2. Машина Тьюринга для Z80
    от ZXMAK в разделе Эмуляторы
    Ответов: 4
    Последнее: 15.08.2011, 03:26
  3. Продвинутая Мелко Машина 1
    от Black_Cat в разделе Зарубежные компьютеры
    Ответов: 74
    Последнее: 03.03.2009, 09:05
  4. Что за машина такая??? Commodore 128...
    от ILoveSpeccy в разделе Commodore 16/64/128
    Ответов: 5
    Последнее: 31.10.2007, 10:25
  5. Java-машина
    от Error404 в разделе Программирование
    Ответов: 2
    Последнее: 15.01.2007, 15:11

Ваши права

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