Важная информация

User Tag List

Страница 14 из 31 ПерваяПервая ... 101112131415161718 ... ПоследняяПоследняя
Показано с 131 по 140 из 305

Тема: Программирование

  1. #131

    Регистрация
    06.02.2018
    Адрес
    г. Волгоград
    Сообщений
    1,065
    Спасибо Благодарностей отдано 
    582
    Спасибо Благодарностей получено 
    471
    Поблагодарили
    253 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от parallelno Посмотреть сообщение
    пытатся читать из порта 10
    Чтения конфигурации нет ни у одного из вариантов квазидисков, в том числе на комбодевайсах и ERAM.

    Цитата Сообщение от parallelno Посмотреть сообщение
    можеть есть способ лучше/проще
    Наиболее простым будет запрет прерываний до обращения к КД и разрешение после, тем более при подключении квазидиска в режиме "стек" и срабатывании прерывания данные на нём будут гарантировано испорчены, т.к. при вызове прерывания в стек пишется адрес возврата.

  2. #132

    Регистрация
    05.04.2013
    Адрес
    Починки, Нижегородская обл.
    Сообщений
    1,371
    Спасибо Благодарностей отдано 
    402
    Спасибо Благодарностей получено 
    647
    Поблагодарили
    255 сообщений
    Mentioned
    26 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от parallelno Посмотреть сообщение
    ramDiskMode не гарантирует что квазидиск уже в этом режиме когда прерывание произошло между sta ramDiskMode и out $10
    В общем случае перед sta ramDiskMode нужно прерывания запретить, а после out $10 - опять разрешить.

  3. #133

    Регистрация
    29.06.2022
    Адрес
    г. Ирвайн, США
    Сообщений
    408
    Спасибо Благодарностей отдано 
    590
    Спасибо Благодарностей получено 
    340
    Поблагодарили
    109 сообщений
    Mentioned
    3 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Improver Посмотреть сообщение
    Чтения конфигурации нет ни у одного из вариантов квазидисков, в том числе на комбодевайсах и ERAM.

    Наиболее простым будет запрет прерываний до обращения к КД и разрешение после, тем более при подключении квазидиска в режиме "стек" и срабатывании прерывания данные на нём будут гарантировано испорчены, т.к. при вызове прерывания в стек пишется адрес возврата.
    С восстановлением стека при чтении с квазидиска я справился, спасибо ребятам с этого форума.

    - - - Добавлено - - -

    Цитата Сообщение от Pyk Посмотреть сообщение
    В общем случае перед sta ramDiskMode нужно прерывания запретить, а после out $10 - опять разрешить.
    О, спасибо ! Попробую.
    Но было бы здорово понять в какой момент идёт порча данных. Чуть попозже выложу больше информации что у меня происходит.

    - - - Добавлено - - -

    А если в момент прерывания они запрещены, то вызов откладывается до следующего ei, или вообще пропускаются?
    Если второе, то музыка в прерывании будет чудить и другие штуки завязанные на прерывание.

  4. #134

    Регистрация
    20.06.2007
    Адрес
    С.-Петербург
    Сообщений
    4,299
    Спасибо Благодарностей отдано 
    1,028
    Спасибо Благодарностей получено 
    813
    Поблагодарили
    484 сообщений
    Mentioned
    26 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от parallelno Посмотреть сообщение
    А если в момент прерывания они запрещены, то вызов откладывается до следующего ei, или вообще пропускаются?
    Если второе, то музыка в прерывании будет чудить и другие штуки завязанные на прерывание.
    Запрос прерывания держится недолго. Никакой специальной памяти прерваний нет. Если запрещать их как попало, то прерывания будут пропускаться.
    Больше игр нет

  5. #135

    Регистрация
    29.06.2022
    Адрес
    г. Ирвайн, США
    Сообщений
    408
    Спасибо Благодарностей отдано 
    590
    Спасибо Благодарностей получено 
    340
    Поблагодарили
    109 сообщений
    Mentioned
    3 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Спасибо за инфу. А недолго это сколько ?

    - - - Добавлено - - -

    Цитата Сообщение от Pyk Посмотреть сообщение
    В общем случае перед sta ramDiskMode нужно прерывания запретить, а после out $10 - опять разрешить.
    Это помогло. Спасибо. Но вот очень хочется понять почему такое происходит.
    Если кто-то поможет найти ошибку, заранее большое спасибо!
    Ниже эээто код прерывания
    Код:
    Interruption2:
    			; get the return addr which this interruption call stored into the stack
    			xthl
    			shld @return + 1
    			pop h
    			shld @restoreHL + 1
    			; store psw as the first element in the interruption stack
    			; because the following dad psw corrupts it
    			push psw
    			pop h
    			shld STACK_INTERRUPTION_ADDR-2
    			
    			lxi h, 0
    			dad sp
    			shld @restoreSP + 1
    
    			; restore two bytes that were corrupted by this interruption call
    			push b
    			; dismount ram disks to not damage the ram-disk data with the interruption stack
    			xra a
    			out $10
    			lxi sp, STACK_INTERRUPTION_ADDR-2
    			push b
    			push d
    
    			call GCPlayerUpdate
    
    			INTERRUPTION_MAIN_LOGIC()
    
    			pop d
    			pop b
    			pop psw
    			mov l, a
    			; restore the ram-disk mode
    			; ramDiskMode doesn't guarantee that a ram-disk is in this mode already. that mode could be applied only after the next command in the main program
    			lda ramDiskMode
    			out $10
    			; restore A
    			mov a, l
    
    @restoreHL:	lxi		h, TEMP_ADDR
    @restoreSP:	lxi		sp, TEMP_ADDR
    			ei
    @return:	jmp TEMP_ADDR
    			.closelabels
    все места в основной программе где используется квазидиск обернуты вот такими вставками:
    Код:
    			mvi a, _command
    			sta ramDiskMode
    			out $10
    ...
    Код:
    			xra a
    			sta ramDiskMode			
    			out $10
    Последний билд можно взять тут.
    https://github.com/parallelno/Vector...GameNoname.rom

    call GCPlayerUpdate это плеер gigachad16 который начинает глючно играть вконце трека.
    INTERRUPTION_MAIN_LOGIC() это код для опроса клавиатуры и прочего
    Код:
    			; interruption logic
    
    			mvi a, PORT0_OUT_IN
    			out 0
    			xra a
    			out 3
    			IN 2
    			inr a
    			sta anyKeyPressed
    			mvi a, $fe
    			out 3
    			IN 2
    			sta keyCode
    			
    			mvi a, PORT0_OUT_OUT
    			out 0
    			lda borderColorIdx
    			out 2
    			lda scrOffsetY
    			out 3
    
    			lxi h, interruptionCounter
    			inr m
    Глюк влияет на музыку. Ее данные в основной памяти. После нескольких повторов трека, она становится все более поломанной. И только один раз я заметил что спрайты скелетов стали покарапчены. Их данные в квазидиске.
    Эти глюки происходят только если игра не синхрониизированна с прерываниями, т.е не имеет hlt в основной цикле. то есть прерывание может прервать основную программу в любом месте.
    Если добавить di/ei как посоветовал Pyk, то чинится.
    Пытаясь починить баг, я попробовал записывать 0 в регистры AY, очищать буфер музыки по окончанию трека, перенес инициализацию и эти очистки в основную программу чтобы не делать прерывание слишком долгим, но это не помогло.

    Буду очень благодарен если кто-то поможет найти багу! Заранее спасибо!
    Последний раз редактировалось parallelno; 26.08.2022 в 08:52.

  6. #136

    Регистрация
    20.06.2007
    Адрес
    С.-Петербург
    Сообщений
    4,299
    Спасибо Благодарностей отдано 
    1,028
    Спасибо Благодарностей получено 
    813
    Поблагодарили
    484 сообщений
    Mentioned
    26 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

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

    Код в Interruption2 выглядит странно, но я может быть не разобрался. То есть я понимаю: мы аккуратно складываем состояние в переменные, чтобы не запортить еще больше стека. Но что такое push b и как он помогает restore two bytes that were corrupted by this interruption call ? Это видимо знаменитый "метод Медноногова", или что-то типа того? Я с ним незнаком, но выходит, что в паре bc тут каким-то образом находятся заветные восстановительные данные. А они там правда есть? Всегда-всегда? Как можно это гарантировать, если прерывания случаются вообще в любой момент?
    Больше игр нет

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

    parallelno(26.08.2022)

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

  8. #137

    Регистрация
    29.06.2022
    Адрес
    г. Ирвайн, США
    Сообщений
    408
    Спасибо Благодарностей отдано 
    590
    Спасибо Благодарностей получено 
    340
    Поблагодарили
    109 сообщений
    Mentioned
    3 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    svofski,
    Если главная программа читает данные из стека для например рисования на экране или любых других случаев когда sp указывает не на стек главной программы, а на некие данные мы всегда читаем так pop B. Это гарантирует что bc можно использовать в прерывании для восстановления стека. Если же прерывание случилось когда главная программа использовала обычный стек, то push b в прерывании ничего не делает полезного, но и ничего не портит.
    Не помню чей именно это метод изначально, но впервые я прочитал о нем от Jerry на этом форуме.

    Кажется я нашел в чем была проблема. После того как в основной программе я делал xra a, out $10, я восстанавливал стек lxi sp, xxxx. Если прерывание происходило после out $10, то стек указывал на адрес в квазидиске где-то в районе 4k, это как раз попадало на музыку в основной памяти.
    Поменял местами восстановление стека и выключение квазидиска и все стало работать как нужно. Можно двигаться дальше

    - - - Добавлено - - -

    Лечение не идеальное, так как прерывание будет корраптить данные квазидиска в этот момент и восстановить не получится, но в моем текущем случае это не страшно так как стек основной программы находиться в диапазоне $7ff80-$8000 и по эти адресам ничего полезного в квазидиске нет.

    - - - Добавлено - - -

    Лучше всего наверное использовать квазидиск для стека в основной программе. Это наверное упростит инициализацию данных после старта если программа будет больше 32к. Можно будет не боятся что стек запортит основную программу.

    - - - Добавлено - - -

    Если программа запускается из под операционной системы, может ли она менять данные ниже $100? Или они зарезервированы под систему?

    - - - Добавлено - - -

    Цитата Сообщение от svofski Посмотреть сообщение
    Про время удержания запроса прерывания боюсь соврать. Надо в схему заглянуть, но там не всегда очевидно.
    Было бы интересно узнать, но не супер важно сейчас, так как основная программа не делает di
    Последний раз редактировалось parallelno; 26.08.2022 в 12:20.

  9. #138

    Регистрация
    20.06.2007
    Адрес
    С.-Петербург
    Сообщений
    4,299
    Спасибо Благодарностей отдано 
    1,028
    Спасибо Благодарностей получено 
    813
    Поблагодарили
    484 сообщений
    Mentioned
    26 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от parallelno Посмотреть сообщение
    push b в прерывании ничего не делает полезного, но и ничего не портит
    То есть на то место где обычно лежит адрес возврата, кладет содержимое bc. Ну что ж, наверное действительно в большинстве случаев это приемлемо. Все равно стремно как-то Особенно при том, что еще и банки памяти щелкаются постоянно. Отлаживать такое можно рассудок потерять.
    Больше игр нет

  10. #139

    Регистрация
    29.06.2022
    Адрес
    г. Ирвайн, США
    Сообщений
    408
    Спасибо Благодарностей отдано 
    590
    Спасибо Благодарностей получено 
    340
    Поблагодарили
    109 сообщений
    Mentioned
    3 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от svofski Посмотреть сообщение
    То есть на то место где обычно лежит адрес возврата, кладет содержимое bc. Ну что ж, наверное действительно в большинстве случаев это приемлемо. Все равно стремно как-то Особенно при том, что еще и банки памяти щелкаются постоянно. Отлаживать такое можно рассудок потерять.
    Да, именно так. Ну вы ребята опытные, я надеюсь что выручите советом если опять что-то забарахлит. Было бы классно получить больше функций отладки, это поможет тоже.

    - - - Добавлено - - -

    svofski, я до сих пор под впечатлением от gigachad16. Наверное ничего сложнее в игре уже не будет

  11. #140

    Регистрация
    20.06.2007
    Адрес
    С.-Петербург
    Сообщений
    4,299
    Спасибо Благодарностей отдано 
    1,028
    Спасибо Благодарностей получено 
    813
    Поблагодарили
    484 сообщений
    Mentioned
    26 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от parallelno Посмотреть сообщение
    Наверное ничего сложнее в игре уже не будет
    Парадокс в том, что он на порядок проще любого другого плеера и писать его было легко и чуть-чуть прищурившись можно даже прочитать. Просто переключает задачки, а задачки -- тот же dezx0, который и так уже все видели и в который я вникал лишь минимально (и спасибо ivagor-у за такой классный dezx0!). Все крайне регулярное, никаких семиэтажных ветвлений, все управляется только данными.

    Ну и кстати, имея ядро можно не ограничиваться использованием его только для проигрывания музыки. Как раз ему приходится пропускать два фрейма вхолостую. Можно туда добавить две другие задачи (им можно указать другой размер стека, побольше). В общем хоть всю игру можно так забацать.

    - - - Добавлено - - -

    Цитата Сообщение от parallelno Посмотреть сообщение
    А недолго это сколько ?
    Заглянул в схему. Все упирается в форму F50Гц, это шина 6.28, прямой выход D8.2. Понять длительность импульса без осциллографа я тут не в состоянии, а мой Вектор сейчас в собранном виде.
    Больше игр нет

Страница 14 из 31 ПерваяПервая ... 101112131415161718 ... ПоследняяПоследняя

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

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

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

Похожие темы

  1. Программирование на ассемблере
    от shuran33 в разделе Вектор
    Ответов: 341
    Последнее: 05.11.2025, 20:00
  2. Программирование на ассемблере
    от tnt23 в разделе Океан-240
    Ответов: 6
    Последнее: 30.10.2025, 12:56
  3. Программирование графики MSX
    от CityAceE в разделе MSX
    Ответов: 57
    Последнее: 23.10.2025, 08:53
  4. Программирование NES
    от Tronix в разделе Nintendo
    Ответов: 6
    Последнее: 08.07.2015, 21:21
  5. Программирование на пентеве.
    от Kakos_nonos в разделе Программирование
    Ответов: 2
    Последнее: 23.03.2013, 14:08

Ваши права

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