Автор Тема: Ребенок изучает asm [SMD]  (Прочитано 9062 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Bjankins1

  • Пользователь
  • Сообщений: 37
    • Просмотр профиля
Ребенок изучает asm [SMD]
« Ответ #120 : 22 Февраль 2025, 12:26:44 »
Im learning how to change H32 and H40 modes, im honestly a little stumped where im at

The example im using is saturday night slam masters, uses H40 and switches to H32, i cannot find the offset where it switches, the vdp debugger on regen will not show offset but the value (0x00) the only other context i have is at offset 555A (33 FC 8C 00 00 C0 00 04) grok is telling me this is the switch to H40 but the breakpoint happens after the licensed by capcom credits, and that is set already to H32

I would love to learn more about this, ive been at this for hours, im not giving up

Оффлайн SeregaZ

  • Пользователь
  • Сообщений: 2665
  • Пол: Мужской
  • ливнул с форума
    • Youtube
    • Просмотр профиля
Ребенок изучает asm [SMD]
« Ответ #121 : 22 Февраль 2025, 17:35:27 »
Ti knows :) he knows everything! :)

dont know sure, but probably this is it, but i have no idea where to put it into code to make it work:
move.w  #$8C00,$C00004   ;  256 pix mode
move.w  #$8C81,$C00004   ;  320 pix mode

Оффлайн Bjankins1

  • Пользователь
  • Сообщений: 37
    • Просмотр профиля
Ребенок изучает asm [SMD]
« Ответ #122 : 22 Февраль 2025, 20:56:06 »
Thank you!

Добавлено позже:
Usually what im finding on some roms are dynamic writes before it writes to C00004

« Последнее редактирование: 22 Февраль 2025, 23:44:07 от Bjankins1 »

Оффлайн SeregaZ

  • Пользователь
  • Сообщений: 2665
  • Пол: Мужской
  • ливнул с форума
    • Youtube
    • Просмотр профиля
Ребенок изучает asm [SMD]
« Ответ #123 : 23 Февраль 2025, 00:43:20 »
unfortunatelly - i am not romhacker :( that is why you need Ti. as i say - he knows everything!

Оффлайн Томахомэ

  • Пользователь
  • Сообщений: 877
  • Пол: Мужской
    • Просмотр профиля
Ребенок изучает asm [SMD]
« Ответ #124 : 23 Февраль 2025, 09:51:26 »
Ещё одна проблема - почему-то ASMX неверно определяет размер каждого загружаемого бинарника. Например, прикреплённую 512-байтовую палитру он определил как файл весом всего в 174 Б. Может, в самом коде команды incbin какой-то косячок кроется?

       case o_Incbin:
            DefSym(labl,locPtr,FALSE,FALSE);

            GetFName(word);

            val = 0;

            // open binary file
            incbin = fopen(word, "r");

            if (incbin)
            {
                // while not EOF
                do {
                    //   n = count of read up to MAX_BYTSTR bytes into bytStr
                    n = fread(bytStr, 1, MAX_BYTSTR, incbin);
                    if (n>0)
                    {
                        // write data out to the object file
                        for (i=0; i<n; i++)
                            CodeOut(bytStr[i]);
                        val = val + n;
                    }
                } while (n>0);
                if (n<0)
                    sprintf(s,"Error reading INCBIN file '%s'",word);

                if (pass == 2)
                {
                    // "XXXX  (XXXX)"
                    p = ListLoc(locPtr-val);
                    *p++ = ' ';
                    *p++ = '(';
                    p = ListAddr(p,val);
                    *p++ = ')';
                }

            }
            else
            {
                sprintf(s,"Unable to open INCBIN file '%s'",word);
                Error(s);
            }

            // close binary file
            if (incbin) fclose(incbin);
            incbin = NULL;

            break;

Ну таки в чём тут на самом деле дело?

Оффлайн Yoti

  • Пользователь
  • Сообщений: 4551
  • Пол: Мужской
  • Не тро-гай ме-ня
    • Steam
    • Просмотр профиля
Ребенок изучает asm [SMD]
« Ответ #125 : 23 Февраль 2025, 11:05:43 »
Ну таки в чём тут на самом деле дело?
А ты уверен, что для fopen по умолчанию r это rb, а не rt? А то открыл файл как текст и прочитал до первого не читаемого символа, собственно.

Оффлайн Томахомэ

  • Пользователь
  • Сообщений: 877
  • Пол: Мужской
    • Просмотр профиля
Ребенок изучает asm [SMD]
« Ответ #126 : 23 Февраль 2025, 17:49:56 »
А ты уверен, что для fopen по умолчанию r это rb, а не rt? А то открыл файл как текст и прочитал до первого не читаемого символа, собственно.

Ааааа, так это походу Рене Ришар что-то в доставшемся ему исходном коде нахимичил. А может, и сам Томлин такой вот нелепый косячелло оставил... Кстати, какой бы клован и рукожоп ни был Джозеф "DevSter" Норман, надо отдать ему должное - если уж он и лез в исходники ASMX (а он почти наверняка лез, судя по тому, как в сборке, собственно, и генерирующей ромы в BEX'е, поддержка всех архитектур, кроме M68k, каким-то непостижимым образом отключена), то и баг этот, скорее всего, именно он в своей полузакрытой сборке и исправил.

Оффлайн Bjankins1

  • Пользователь
  • Сообщений: 37
    • Просмотр профиля
Re: Ребенок изучает asm [SMD]
« Ответ #127 : 24 Февраль 2025, 06:11:37 »
I accidentally posted this in the wrong topic but i have been searching 3 days straight on what opcode controls the VDP write for H32, im currently looking into street fighter 2 and cannot find a vdp write with 8C00, theres only a small handful of VDP writes to 00C00004, so i should be able to narrow it down but nothing is exactly static and uses long addresses like its using DMA for Vram

Оффлайн Томахомэ

  • Пользователь
  • Сообщений: 877
  • Пол: Мужской
    • Просмотр профиля
Ребенок изучает asm [SMD]
« Ответ #128 : 27 Февраль 2025, 13:06:56 »
Хе-хе-хе-хе, всё-таки молодец я, что гонконгский клон Excelsior'а сберёг, никуда от большого отчаяния выкидывать не стал, и даже на самой дальней полке продержал не особо долго! Как видите, тут у меня плюсминус то же самое, что и для GBA, только несравнимо ёмче и элегантнее.

Оффлайн Томахомэ

  • Пользователь
  • Сообщений: 877
  • Пол: Мужской
    • Просмотр профиля
Ребенок изучает asm [SMD]
« Ответ #129 : 27 Февраль 2025, 18:12:08 »
Добавил рамочку, на месте которой потом расположу игровой интерфейс - в частности, анимированный таймер в виде вьющегося по всему периметру экрана до самой динамитной шашки (вид сверху) в правом верхнем углу экрана горящего фитиля. Если для каких-то элементов интерфейса места будет не хватать, рамочку можно и сузить.
Правда, от аппаратного скроллинга, боюсь, придётся отказаться, иначе рамочка, как часть слоя битмэпа, будет двигаться вместе с остальной картинкой.

Оффлайн Томахомэ

  • Пользователь
  • Сообщений: 877
  • Пол: Мужской
    • Просмотр профиля
Re: Ребенок изучает asm [SMD]
« Ответ #130 : 07 Март 2025, 14:41:42 »
Пришло время сказать, что, по-хорошему, следовало бы ещё в конце февраля - поскольку железо Excelsior, в отличие от Game Boy Advance, лишено своего DMA, программный скроллинг (который нужен, чтобы пока битмэпный задний фон скроллился, интерфейсная битмэповая же рамочка оставалась на месте - с аппаратным скроллингом такой номер не выгорит) сделать достаточно плавным, на "честные" 60FPS (точнее, 58, учитывая реальную герцовку железа) не получится даже в заметно визуально ужатом виде.
В связи с этим, прежний проект будет интегрирован в Sails of Charon на правах бонусной мини-игры, а от Excelsior'а же будет взят код RLE-подобного алгоритма сжатия, которому найдётся применение в проектах под Neo-Geo (главным образом, в CD-инкарнации).

Оффлайн SeregaZ

  • Пользователь
  • Сообщений: 2665
  • Пол: Мужской
  • ливнул с форума
    • Youtube
    • Просмотр профиля
Ребенок изучает asm [SMD]
« Ответ #131 : 19 Июнь 2025, 00:49:24 »
господа, мы тут с одним буржуйским товарищем несколько в затруднениях :) в попытках хоть как-то побороть мерцание при проигрывании видео - хотелось бы сделать своеобразное двухбуферное заполнение данных. то есть при старте заливается память двух тайловых сетов друг за другом. потом отображается 1 кадр, пауза, второй кадр, в момент паузы заливается тайловый сет третьего кадра в VDP в 0 адрес, пауза заканчивается, показывается третий кадр, в этот момент тайловый сет четвертого кадра лезет в 0 + 4 832 адрес VDP...

я предполагаю что вот это место:
; LOAD TILES
move.l #$40200000,(a2)
lea tiles_table,a0
move.w d7,d1
lsl.w #2,d1
move.l (a0,d1.w),a0
lea tile_sizes,a3
move.w d7,d1
lsl.w #1,d1
move.w (a3,d1.w),d1
bsr copy_to_vram

как бы его изменить, чтобы оно стало работать по алгоритму выше описанному?

я примерно сделал тайловые карты для четных кадров, но проверить не могу :) переименовать tilemaps2x в tilemaps и пересобрать ром.
« Последнее редактирование: 19 Июнь 2025, 12:22:43 от SeregaZ »

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 5402
    • Просмотр профиля
Ребенок изучает asm [SMD]
« Ответ #132 : 19 Июнь 2025, 03:08:32 »
хотелось бы сделать своеобразное двухбуферное заполнение данных
В данном проекте это необязательно, можно принудительно отключать экран на сканлайне после картинки на экране, тогда можно успеть загрузить данные и включить экран до отображения картинки на следующем кадре. Прикладываю такой вариант (изменил только test_pic.asm). В BlastEm видны точки в нижней части экрана из-за изменения палитры, нужно разделить код load_map_64x28 на части, чтобы загрузить палитру в VBlank, или ускорить код load_map_64x28 за счёт обновления только небольшой части фона и избавиться от add.w   d3,d0, и заменить move.w на move.l. Для тайминга я использовал dbf d0,@wait, но вроде можно прерывания. Не знаю как на консоли будет.
Для двойной буферизации можно сделать фон 64x64, отображать верхнюю часть (прокрутка по вертикали) и загружать в VBlank частями следующий кадр, потом переключиться на отображение нижней части и т. д. Я когда-то делал простое видео с большими квадратами на SGDK, у других людей видео демки получались лучше, но мне не интересно. Прикладываю мою демку.
UPD: Я заметил, что у вас один кадр "видео" отображался на экране 11 кадров консоли + 2 чёрных кадра, у меня 11 кадров без чёрных, но наверно вы хотели 10 кадров, тогда move.w   #frame_delay-1,d0 заменить на move.w   #frame_delay-2,d0.
« Последнее редактирование: 19 Июнь 2025, 03:37:18 от Sharpnull »

Оффлайн SeregaZ

  • Пользователь
  • Сообщений: 2665
  • Пол: Мужской
  • ливнул с форума
    • Youtube
    • Просмотр профиля
Re: Ребенок изучает asm [SMD]
« Ответ #133 : 19 Июнь 2025, 12:06:35 »
вот это то и оно... что количество кадров может плавать и не быть четным. в связи с чем интересный момент - предположим дошло видео до конца. количество кадров не четное. в момент зацикливания получается тайловый сет первого кадра будет записан нетуда :) то есть во второй сегмент VDP, но тайловая карта первого кадра будет ожидать что его данные в начале VDP.

Добавлено позже:
ааааа... тут нет двойного буфера :) понял понял.

Добавлено позже:
и что касается черных кадров - тут уж сколько и какие система родит - те и использую. выбирать не приходится. но это мысль. можно подумать над ручной пометкой негодных кадров, а так-же изменение таблицы, типа если нужен черный кадр и он есть в начале - то использовать тот начальный.

Добавлено позже:
в общем это будет, как я люблю, что-то почти однокликовое для создания видео. в архиве полный проект, с уже импортированным интро Секретных Материалов :) правда звук там на глаз синхронизировал. в видосе с Never Get что-то там круче :) у меня же видео зациклено отдельно, GEMS зациклен отдельно. на втором круге и далее будет рассинхрон. ну и слайдшоу. попробую из видео с более мелкой паузой картинок подергать. так-же думаю наверное надо сделать экспорт из видео в большую картинку, чтобы использовать бомбезный ресурс https://rilden.github.io/tiledpalettequant/ - тот что у меня встроенный так-себе цвет рожает. хотя еще большой вопрос какого размера картинку он мне даст загрузить. по логике то картинка со всеми кадрами видео будет гигаааантская.
« Последнее редактирование: 19 Июнь 2025, 12:26:50 от SeregaZ »

Оффлайн SeregaZ

  • Пользователь
  • Сообщений: 2665
  • Пол: Мужской
  • ливнул с форума
    • Youtube
    • Просмотр профиля
Ребенок изучает asm [SMD]
« Ответ #134 : 19 Июнь 2025, 16:29:23 »
нужно еще изменение. конвертанул интро Грейндайзер, поорал с результата  :debile: доволен по самые помидоры... НО! нужна галка, чтобы можно было переключать звук:
1. рестартовать проигрывание мелодии при появлении 1 кадра (тогда в GEMS можно не зацикливать) - так хоть как-то будет синхронироваться в начале.
2. оставить как есть, то есть звук стартует при старте и играет сам по себе.
« Последнее редактирование: 30 Июнь 2025, 20:56:39 от SeregaZ »

Оффлайн Томахомэ

  • Пользователь
  • Сообщений: 877
  • Пол: Мужской
    • Просмотр профиля
Ребенок изучает asm [SMD]
« Ответ #135 : 19 Июнь 2025, 17:08:46 »
нужно еще изменение. конвертанул интро Грейндайзер, поорал с результата  :debile: доволен по самые помидоры... НО! нужна галка, чтобы можно было переключать звук:
1. рестартовать проигрывание мелодии при появлении 1 кадра (тогда в GEMS можно не зацикливать) - так хоть как-то будет синхронироваться в начале.
2. оставить как есть, то есть звук стартует при старте и играет сам по себе.

А я-то всё недоумевал, почему у Cobra Command и Road Blaster с Sega CD картинка так непохожа на оригинальные LD-версии? Думал, уж не перерисовали ли Wolf Team'овцы всё заново, вместо того, чтобы тупо одолжить у Data East хранящуюся в их загашниках source-плёнку, отсканировать её и просто преобразовать кадры в понятный Sega CD формат? А оказалось, если преобразовать видео из современного качества, результат будет ровно такой же.

Оффлайн SeregaZ

  • Пользователь
  • Сообщений: 2665
  • Пол: Мужской
  • ливнул с форума
    • Youtube
    • Просмотр профиля
Ребенок изучает asm [SMD]
« Ответ #136 : 19 Июнь 2025, 22:55:07 »
в общем колитесь как внутри loop сделать проверку на самый первый кадр. и чтобы если кадр 1, то jsr   gemsstartsong.
и причем в зависимости от параметра, то есть условие должно быть такое:


restartsound equ $1

если это кадр номер 1 то такие условия:

  если это первый запуск
    jsr gemsstartsong
  если это не первый запуск
    если restartsound = 1
      jsr gemsstopsong
      jsr gemsstartsong
    конец условия (restartsound)

  конец условия (первый запуск)

конец условия (кадр номер 1)

вот что буржуйский товарищ ответил :)
Цитата
i fixed it by adding "jsr gemsstopsong" and moving "jsr    gemsstartsong" to this part, now it works thank you :)
    ; NEXT IMAGE
    addq.w    #1,d7
    cmpi.w    #fullcontframes,d7
    blt    cycle_loop
    moveq    #0,d7
    jsr gemsstopsong
    jsr    gemsstartsong
    bra    cycle_loop

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

и тут у меня ошибка :) в GEMS.asm в gemsinit есть лишний jsr   gemsstartsong - по моему это я пятсот лет назад кривыми руками пытался сделать автозапуск звука при старте рома. это надо снести.

; NEXT IMAGE
addq.w #1,d7
cmpi.w #fullcontframes,d7
blt cycle_loop
moveq #0,d7
cmpi.b #$1,restartsound    ; Is restart flag set to 1?
bne.s no_restart         ; If not, skip sound restart
jsr gemsstopsong        ; Stop current sound
jsr gemsstartsong       ; Start fresh sound
no_restart:
bra cycle_loop

не работает :(((


но он с помощью нейросети смог :)
; NEXT IMAGE
    addq.w    #1,d7                    ; Increment frame counter
    cmpi.w    #fullcontframes,d7       ; Have we reached the last frame?
    blt    cycle_loop               ; If not, continue video loop
    move.b    #restartsound,d0         ; Load restart flag value into register d0
    cmpi.b    #$1,d0                   ; Is restart flag set to 1?
    bne.s    no_restart               ; If not 1, skip sound restart
    jsr    gemsstopsong             ; Stop current audio
    jsr    gemsstartsong            ; Restart audio from beginning
no_restart:
    moveq    #0,d7                    ; Reset frame counter to 0
    bra    cycle_loop               ; Jump back to start of video loop

хотя я уже решил сделать с помощью IF ELSE которые ASM68K.exe умеет обрабатывать и просто не включить строчки запуска в зависимости от переменной. но оставлю его код.
« Последнее редактирование: 20 Июнь 2025, 01:26:07 от SeregaZ »

Оффлайн SeregaZ

  • Пользователь
  • Сообщений: 2665
  • Пол: Мужской
  • ливнул с форума
    • Youtube
    • Просмотр профиля
Ребенок изучает asm [SMD]
« Ответ #137 : 20 Июнь 2025, 16:01:21 »
так... видеоманагер потихоньку продвигается (внезапно после стольких лет я загорелся что-то попрограммить) и теперь хочу прикрутить одну весчщь :) многие наверное знают такой замечательный ресурс как:
https://rilden.github.io/tiledpalettequant/
алгоритм там куда побомбезнее моего и цвета там подбирает более ярко чтоль. но он напрямую в сеговские цвета не умеет. посему я думаю чтобы манагер рожал большой файл-картинку, где все кадры видео в куче, после надо будет загрузить в этот палетквант и заквантовать по самые помидоры, после готовую картинку импортировать в манагер, а он уже порежит на карты и тайловые сеты. сие конечно не совсем удобно... хотелось бы конечно свою длл, чтобы независеть от интернета и не таскаться с картинкой вручную туда сюда. там еще причем поиграться с настройками можно - дизеринг прям обширные настройки имеет. в моем же случае только вкл и выкл. а как он там работает... да черт его знает и работает ли вовсе :) код был не мой. я его скоммуни... эээ... взял на форуме у одного буржуйского товарища. а тут и горизонтальный дизернг и вертикальный (вообще без понятия что это за варианты, но раз они есть - что-то интересное да делают :))

добавил возможность включить и выключить возможность зацикливания музыки в GEMS. то есть если изначально в видео есть звук и мы загружаем видео со звуком, то как бы они изначально соответствуют друг другу по длительности. нужно будет поиграться с FPS при выгрузке из видео и поиграться с delay - пауза между кадрами уже в роме и добится плюс минус синхронности, и добавить галку "рестарт звука на 0 кадре". однако если видеоряд один, а звук, скажем короткий фрагмент, который по длительности изначально не совпадает с видеорядом - то надо наоборот убрать галку рестарта звука на 0 кадре, а вот в GEMS добавить зацикливание. то есть звук и видео будут зациклены отдельно друг от друга.

Оффлайн SeregaZ

  • Пользователь
  • Сообщений: 2665
  • Пол: Мужской
  • ливнул с форума
    • Youtube
    • Просмотр профиля
Ребенок изучает asm [SMD]
« Ответ #138 : 21 Июнь 2025, 22:03:24 »

Оффлайн Razor

  • Пользователь
  • Сообщений: 2418
  • Пол: Мужской
  • Gotta Go Fast!
    • ВКонтакте
    • Youtube
    • Просмотр профиля
Re: Ребенок изучает asm [SMD]
« Ответ #139 : 22 Июнь 2025, 00:35:33 »
Надо теперь в Сега Дюну интро мультик из Дос Дюны вставить. :lol:


Оффлайн SeregaZ

  • Пользователь
  • Сообщений: 2665
  • Пол: Мужской
  • ливнул с форума
    • Youtube
    • Просмотр профиля
Ребенок изучает asm [SMD]
« Ответ #140 : 22 Июнь 2025, 02:15:56 »
однако при переключении на PAL в эмуляторе как-то картинка примерно с середины и вниз - подергивается. звук то я поправлю - при переключении PAL/NTSC будут разные паузы между сэмплами, чтобы более менее ровно играло. но вот подергивание паловской картинки я не исправлю  :cry: какой-то там видимо нюанс есть. видимо тайловую карту мудрить надо отдельно для PAL. завтра буду думать...

Оффлайн SeregaZ

  • Пользователь
  • Сообщений: 2665
  • Пол: Мужской
  • ливнул с форума
    • Youtube
    • Просмотр профиля
Ребенок изучает asm [SMD]
« Ответ #141 : 22 Июнь 2025, 20:40:25 »
в общем картинка в PAL дергается. что-то ей кароче надо. может режим какой-то переключить или еще чего. но сами мы не местные :) ловите Sharpnull и не отпускайте, пока не сознается из-за чего такая проблема может быть :) в NTSC то вроде нормально.

при переключении на PAL - там есть пометка, что при том-же 5fps - надо будет изменить delay на 9, чтобы более менее близко синхронно было. соответственно NTSC - 11. но понятно что если пользователь там свои фпсы указывает - то надо будет на глаз примерно ловить delay, собирать, тестировать, повторить миллион раз... хм. или может какой-то множитель родить. типа 2.2 для NTSC. получится 5fps * 2.2 = 11. а для PAL типа 1.8 к примеру.

дальше. думаю надо делать эти операции по созданию тайловых карт и сетов в потоке, а не в главном окне. сейчас окно из-за этого подвисает.

другой момент, что видимо таблица должна быть более обширная. сейчас получается каждому кадру своя палитра, свой тайловый сет, своя тайловая карта. а надо еще чтоб был свой delay. думаю можно будет сделать проверку на одинаковые кадры, и в случае если два одинаковых идут друг за другом, то тогда не грузить туда сюда тайловый сет и карту, а просто пауза между кадрами будет не 11, а 22 (х2 то есть, или х-сколько там одинаковых кадров подряд). тем самым можно будет немного сэкономить место. это раз, а двас - возможно подумаю о докручивании функционала из Выкидывателя Тайлов, чтобы повторяющиеся тайлы из тайловых карт кадров выкидывало - сейчас тайловый сет целиком каждый раз. это выкидывание могло бы еще немного выиграть места в роме, хотя после дизеринга одинаковых тайлов фиг найдешь :)

напомню, что нужно положить ffmpeg.exe в папку с этим манагером. и скачивать лучше его с какогонить там официального сайта, чтоб не подцепить заразу.
« Последнее редактирование: 30 Июнь 2025, 18:29:04 от SeregaZ »

Оффлайн Sharpnull

  • Пользователь
  • Сообщений: 5402
    • Просмотр профиля
Ребенок изучает asm [SMD]
« Ответ #142 : 22 Июнь 2025, 21:16:20 »
в общем картинка в PAL дергается. что-то ей кароче надо. может режим какой-то переключить или еще чего
Если вы про мерцание (вставка чёрной области на "видео"), то это из-за тайминга. У NTSC и PAL разное время кадра, для PAL в move.w #$1800,d0 изменить значение на #$1E00 или больше, чтобы опустить точки из-за записи палитры.
UPD: Для универсального рома нужно определить систему PAL/NTSC через регистр и ждать соответственно или же использовать прерывания, которые, как предполагаю, должны выполняться на одном и том же сканлайне.

Оффлайн SeregaZ

  • Пользователь
  • Сообщений: 2665
  • Пол: Мужской
  • ливнул с форума
    • Youtube
    • Просмотр профиля
Ребенок изучает asm [SMD]
« Ответ #143 : 22 Июнь 2025, 22:45:04 »
универсальный ром неполучится, из-за GEMS, так как там delay свой. хотя видимо можно делать два трека, где типа 0 для NTSC, а 1 для PAL. и переключать в зависимости от системы какой трек стартовать. НО, когда ром уже запущен и пользователь сменил страну - то тут уже не отреагирует на изменение.

этот параметр, думаю, надо будет повешать через IF ELSE и он будет изменяться при сборке ASM68K.exe в зависимости от прившитого параметра. а уж этот параметр будет дописывать манагер в момент до старта сборки. пойду пробывать :)

IF (PAL=1)
move.w #$1F00,d0
ELSE
move.w #$1800,d0
ENDIF
вот так вроде не мерцает. #$1E00 все-таки самый низ кадра чуть чуть дергался. и я так полагаю если размер видео будет больше, то и это значение надо будет еще увеличивать.

спасибо.
« Последнее редактирование: 22 Июнь 2025, 22:53:41 от SeregaZ »

Оффлайн SeregaZ

  • Пользователь
  • Сообщений: 2665
  • Пол: Мужской
  • ливнул с форума
    • Youtube
    • Просмотр профиля
Ребенок изучает asm [SMD]
« Ответ #144 : 23 Июнь 2025, 20:11:28 »
правильно ли я попытался изменить статичный делей между кадрами на делей из таблицы? я посмотрел как ниже загрузка тайловых карт происходит... предположил что там видимо берется из таблицы и применяется. но что-то я не уверенный :)

; WAIT
;move.w #frame_delay-1,d0 ; original
lea delay_table,a0
move.w d7,d1
lsl.w #2,d1
move.l (a0,d1.w),d0

в самой таблице:
; DELAY TABLES
delay_table:
dc.l 1
dc.l 2
dc.l 3
dc.l 4
dc.l 5
dc.l 6
dc.l 7...
то есть предполагаю что должно сначала видео стартовать ускоренно, а потом медленно увеличивать паузу между кадрами. и вроде оно так и работает. но опять таки что-то я совсем не уверен.

Добавлено позже:
пока пойду думать как одинаковые кадры ловить...

Оффлайн SeregaZ

  • Пользователь
  • Сообщений: 2665
  • Пол: Мужской
  • ливнул с форума
    • Youtube
    • Просмотр профиля
Ребенок изучает asm [SMD]
« Ответ #145 : 25 Июнь 2025, 22:50:52 »
ожидаемо, что дизеринг делает кадры разными. удивился что даже физически одинаковые кадры - png'шки - первый раз дизерит по одному, второй раз уже по другому. второй момент, возвращаясь к Грендайзеру - это видимо сканировалось с пленок, и там плавает изображение пиксель туда пиксель сюда, то есть это как бы визуально один и тот-же кадр, но из-за этой тряски система будет думать что это разные кадры. так что с автоматической системой определения одинаковых кадров - швах :)

значит остается ручной метод. я конечно попытаюсь сделать организацию процесса чтобы хоть как-то удобно было, но боюсь будет хоть как-то, без слова "удобно". замысел в том, чтобы на первом этапе создавать отдельные сцены из кадров фильма. по одному кадру пока-что пихать туда сюда по сценам:



сейчас получается все 350 кадров фильма рожают одну и ту-же палитру для всех 350 кадров. и на попытке конвертануть интро Дюны получился полный швах :) ибо такая система по весу цветов пикселей (то есть по количеству пикселей какого-то цвета делается вывод какой цвет сохранить, а какой выкинуть) взяла и выкинула самые вкусные цвета - красный и синий. и запилило мне ролик в основном в желтых тонах, ибо песка в том видео было тьма. а вот если разбить ролик на сцены, то можно создавать палитры отдельно для каждой сцены. все равно у меня палитра в коде (вроде бы) загружается каждый кадр. так почему бы это не использовать? осталось только сделать менеджмет кадров, чтобы их было удобно пихать туда сюда. это один момент.

второй момент - я попытался сделать каждому кадру свою отдельную паузу, а не глобально delay 11 и мы в дамках. нафига? опять таки возвращаясь к теме одинаковых кадров - нахрена козе боян? ведь можно их выкинуть. оставить только первый из одинаковых, просто втулить ему паузу *количествовыкинутыхкадров и всё :) вот думаю мышкой крестики на кадрах ставить, чтобы система понимала что их надо  пропустить. тем самым мы выиграем немного места в роме.

третье - некоторые кадры имеют затемнение. так почему бы это не обыграть изменением палитры, не загружая тайловый сет? уж палитра то займет куда меньше места, чем тайловый сет. то есть то-же интро Дюны - там вначале вествуд и вирджин загораются и затухают. вот чтобы не грузить кадры этого затухания - можно палитрой вводить и выводить изображение. то есть физически тайловая карта и тайловый сет загружен и не дергается, а только палитра каждый кадр в 11 delay меняется от темной к светлой, а потом назад. то есть надо подумать над созданием некоторых фейковых кадров. здесь сложнее, ибо надо будет лезть в сам асм, то есть чтобы система понимала, что несмотря как бы что новый кадр уже наступил, но не производить загрузку, а загружать только палитру, ждать delay, проверять следующий кадр нормальный он или фейковый, если фейковый, загружать следующую палитру, ждать... и так далее.

четвертое - тайловая карта. сейчас она вся рисуется от 0:0 до нижнего правого края изображения на кадре. то есть куча нулей зазря гоняется туда сюда. неплохо было бы это оптимизировать, и загружать не всю тайловую карту 64х28 или сколько-то там, а прям как есть 120х80, то есть 15х10 тайлов. но это опять таки изменение в асм коде нужны, там где загрузки тайловой карты.

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

шестое - самое маловероятное - оптимизация кадров и загрузка частично. как с тем-же императором. когда он трындит на видео, то весь кадр по сути статичный, и шевелится только рот и глаза. вот зачем для этих кадров грузить весь кадр, когда можно только кусочек в центре. вот такой подход сэкономил бы прилично места, но автоматику для такого будет сделать сложновато, не говоря уже опять-таки что нужно будет в код асма лезть и там мудрить процедуры по вписке нужных конкретных точечных данных в тайловую карту. в принципе я даже видел готовое решение - в старом GIF аниматоре. он делает оптимизацию джифки, основываясь на предыдущем кадре. вот нечто подобное нужно придумать и мне.

Оффлайн SeregaZ

  • Пользователь
  • Сообщений: 2665
  • Пол: Мужской
  • ливнул с форума
    • Youtube
    • Просмотр профиля
Ребенок изучает asm [SMD]
« Ответ #146 : 27 Июнь 2025, 12:47:08 »
сраные нейросети... вчера пока пыхтел над функционалом разрезания кадров на сцены - подумал, что хорошо бы сделать проверку адреса в таблице тайловых сетов: а не равен ли адрес текущего кадра предыдущему. то есть по задумке будет первый - опорный - кадр, а дальше, скажем идут одинаковые несколько кадров. вот "удаляем" 2-3-4 кадры и только 5 отличается. значит при загрузке самого первого кадра - тайловый сет загрузился, запомнился адрес, отобразился. настало время загружать 2 кадр - проверяем не соответствует ли адрес 2 кадра - первому кадру. оказывается да, значит не загружаем тайловый сет. тут вспомнил что тот буржуйский товарищ говорил что сам он в асм не бум бум, но ему нейросеть подсказала. думаю - чем я хуже? пойду спрошу у гугеля... выдал какую-то галимую платную, но 5 запросов бесплатно после регистрации. хер с тобой, думаю хватит. сначала объяснил что это асм 68000 и дал первоначальный код:
; LOAD TILES
move.l #$40200000,(a2)
lea tiles_table,a0
move.w d7,d1
lsl.w #2,d1
move.l (a0,d1.w),a0
lea tile_sizes,a3
move.w d7,d1
lsl.w #1,d1
move.w (a3,d1.w),d1
bsr copy_to_vram

на что она мне, сучка такая, ответила:
Цитата
Анализ кода


Этот код, судя по всему, является частью подпрограммы для загрузки тайлов (графических элементов) в видеопамять.  Давайте разберем его построчно:



; LOAD TILES - Комментарий, указывающий назначение этого блока кода.


move.l  #$40200000,(a2) - Загружает 32-битное значение $40200000 в адрес, содержащийся в регистре a2.  Предположительно, это базовый адрес видеопамяти (VRAM).  То есть, эта строка скорее всего устанавливает a2 как указатель на начало VRAM.  В Amiga, например, адресация чип-памяти начинается с $00000000 до $001FFFFF, поэтому $40200000 может быть адресом VRAM на другой платформе или использовать для доступа к расширенной памяти.


lea   tiles_table,a0 - Загружает адрес метки tiles_table в регистр a0.  tiles_table - это, вероятно, таблица указателей на данные тайлов.  Другими словами, каждый элемент этой таблицы содержит адрес, где хранятся данные конкретного тайла.


move.w  d7,d1 - Копирует содержимое регистра d7 (предположительно, индекс тайла, который нужно загрузить) в регистр d1.  Важно отметить, что копируется только слово (16 бит) из d7.


lsl.w   #2,d1 - Сдвигает содержимое d1 влево на 2 бита (эквивалентно умножению на 4).  Это делается для вычисления смещения в tiles_table.  Предполагается, что каждый элемент в tiles_table (то есть, каждый указатель на тайл) занимает 4 байта (32 бита, размер long).


move.l  (a0,d1.w),a0 -  Ключевая строка.  Загружает значение (32-битное) из адреса, вычисленного как a0 + d1.w, в регистр a0.  a0 содержит базовый адрес tiles_table, а d1.w - смещение, вычисленное на предыдущем шаге.  Таким образом, эта строка читает указатель на данные тайла из tiles_table и помещает этот указатель в регистр a0.  Теперь a0 указывает на фактические данные тайла в памяти.


lea   tile_sizes,a3 - Загружает адрес метки tile_sizes в регистр a3.  tile_sizes - это, вероятно, таблица, содержащая размеры тайлов.


move.w  d7,d1 - Снова копирует содержимое регистра d7 (индекс тайла) в регистр d1.


lsl.w   #1,d1 - Сдвигает содержимое d1 влево на 1 бит (эквивалентно умножению на 2).  Это делается для вычисления смещения в tile_sizes.  Предполагается, что каждый элемент в tile_sizes (то есть, размер тайла) занимает 2 байта (16 бит, размер word).


move.w  (a3,d1.w),d1 - Загружает значение (16-битное) из адреса, вычисленного как a3 + d1.w, в регистр d1.  a3 содержит базовый адрес tile_sizes, а d1.w - смещение.  Таким образом, эта строка читает размер тайла из tile_sizes и помещает этот размер в регистр d1.  Теперь d1 содержит размер тайла (в байтах или словах, в зависимости от формата tile_sizes).


bsr   copy_to_vram - Вызывает подпрограмму copy_to_vram.  Предположительно, эта подпрограмма копирует данные тайла из памяти (адрес которой находится в a0) в видеопамять (адрес которой находится в a2), используя размер тайла, хранящийся в d1.



Предположения



a2 содержит базовый адрес VRAM.

d7 содержит индекс тайла, который нужно загрузить.

tiles_table - это таблица указателей на данные тайлов. Каждый указатель занимает 4 байта (32 бита).

tile_sizes - это таблица размеров тайлов. Каждый размер занимает 2 байта (16 бит).

Подпрограмма copy_to_vram ожидает, что a0 будет содержать адрес данных тайла, a2 будет содержать адрес начала VRAM, а d1 будет содержать размер тайла.

Этот код предназначен для платформы, где видеопамять адресуется по адресу $40200000 или аналогичным. Это не стандартная адресация Amiga Chip RAM.

да твоюж мать! это теперь можно быть самым криворуким в мире программистом, и за тебя тут всё порешают :)

ладно, пишу задачу:
Цитата
можно ли добавить в эту функцию проверку: при получении нового адреса из таблицы tiles_table, проверить - не соответствует ли этот адрес предыдущему адресу. если адреса одинаковые, то ничего не делать. если адреса разные, произвести загрузку.

Цитата
Да, безусловно!  Вот как можно добавить проверку на дублирование адресов в вашу функцию загрузки тайлов. Я добавлю в предыдущий пример кода проверку адреса и сохранение предыдущего адреса для сравнения.
; LOAD TILES
; d7 = Индекс тайла, который нужно загрузить
; a2 = Базовый адрес VRAM
; a0 = Указатель на данные тайла (после выполнения, если адрес новый)

    move.l  #$40200000,(a2)     ; Устанавливаем a2 как указатель на начало VRAM (предположение)

    lea tiles_table,a0        ; Загружаем адрес таблицы указателей тайлов в a0
    lea   tile_sizes,a3         ; Загружаем адрес таблицы размеров тайлов в a3

    ; Проверка границ индекса тайла (d7)
    cmp.w   #NUM_TILES, d7       ; Сравниваем индекс с количеством тайлов
    bge     load_tiles_end      ; Если индекс >= NUM_TILES, выходим

    move.w  d7,d1                ; Копируем индекс тайла в d1
    lsl.w   #2,d1                ; Умножаем на 4 (размер указателя в tiles_table)
    move.l  (a0,d1.w),d0         ; Загружаем указатель на данные тайла из tiles_table в d0 (ВРЕМЕННО!)

    ; Проверка на дублирование адреса
    cmp.l   previous_tile_address, d0  ; Сравниваем новый адрес с предыдущим
    beq     load_tiles_end      ; Если адреса одинаковые, ничего не делаем и выходим

    ; Адрес новый - обновляем previous_tile_address и продолжаем загрузку
    move.l   d0, previous_tile_address  ; Сохраняем новый адрес как предыдущий
    move.l   d0, a0                   ; Перемещаем адрес в a0 для дальнейшей обработки (a0 - указатель на тайл)


    move.w  d7,d1                ; Копируем индекс тайла в d1 (снова, для tile_sizes)
    lsl.w   #1,d1                ; Умножаем на 2 (размер слова в tile_sizes)
    move.w  (a3,d1.w),d1         ; Загружаем размер тайла (в байтах) из tile_sizes в d1

    bsr copy_to_vram           ; Копируем тайл в VRAM (a0 -> источник, a2 -> назначение, d1 -> размер)

load_tiles_end:
    rts                      ; Возвращаемся из подпрограммы

; Определение количества тайлов (заменить на реальное значение)
NUM_TILES equ 16

; Переменная для хранения предыдущего адреса тайла
previous_tile_address   ds.l    1       ; Выделяем 4 байта для хранения long (адреса)

Цитата
Объяснение изменений



previous_tile_address ds.l 1: В секции данных (обычно после кода) выделяется 4 байта памяти для переменной previous_tile_address.  ds.l 1 означает "Allocate space for one longword". Эта переменная будет хранить адрес тайла, загруженного в предыдущий раз.  Изначально она не инициализирована, поэтому при первом запуске функции сравнение будет с неопределенным значением.  Если вам нужно, чтобы первый тайл всегда загружался, инициализируйте previous_tile_address нулем: previous_tile_address   dc.l    0.  dc.l 0 означает "Define constant longword with value 0".


move.l (a0,d1.w),d0:  Вместо того, чтобы сразу загружать адрес тайла в a0, мы временно загружаем его в регистр d0.  Это необходимо, чтобы можно было выполнить сравнение.


cmp.l previous_tile_address, d0: Сравниваем адрес, только что прочитанный из tiles_table (находящийся в d0), с адресом, сохраненным в previous_tile_address.


beq load_tiles_end: Если адреса одинаковы, переходим к метке load_tiles_end, то есть, ничего не делаем и выходим из функции.


move.l d0, previous_tile_address: Если адреса разные, обновляем previous_tile_address новым адресом.


move.l d0, a0: Загружаем новый адрес тайла в a0, чтобы copy_to_vram могла его использовать.



Важные замечания



Инициализация previous_tile_address:  Очень важно решить, как инициализировать previous_tile_address.  Если вы хотите, чтобы первый тайл всегда загружался, даже если он соответствует "предыдущему" адресу (которого еще не было), инициализируйте её нулем:


assembly
Копировать
previous_tile_address   dc.l    0  ; Инициализируем нулем

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


Сброс previous_tile_address:  В зависимости от логики вашей игры, вам может понадобиться сбрасывать previous_tile_address в определенных ситуациях (например, при смене уровня, перезагрузке графики и т.п.).  Это гарантирует, что тайлы будут загружены повторно, когда это необходимо. Просто используйте move.l #0, previous_tile_address (или другой подходящий адрес) для сброса.


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



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

по итогу я рад и опечален одновременно. пойду конечно пытаться вникать что она мне там нарожала... но чувства у меня смешанные. вроде и рад, что есть такое нечто, у которого можно спросить (пусть только 5 вопросов) и оно решит или по крайней мере попытается решить проблему. с другой стороны - илита перестает быть илитой :) если любой дрыщь может вот так взять и забабахать себе асм код для своих каких-то грязных делишек.

Оффлайн Mr2

  • Пользователь
  • Сообщений: 1662
  • Пол: Мужской
  • Free roaming sorcerer
    • Facebook
    • Просмотр профиля
Ребенок изучает asm [SMD]
« Ответ #147 : 27 Июнь 2025, 13:39:07 »
илита перестает быть илитой
Элита, фанфары, и ликующая толпа - были лишь у тебя в голове.  :P

если любой дрыщь может вот так взять и забабахать себе асм код
В чём проблема? Ты же себе забабахал, и ничего не случилось. :rofl:
« Последнее редактирование: 27 Июнь 2025, 14:06:30 от Mr2 »

Оффлайн SeregaZ

  • Пользователь
  • Сообщений: 2665
  • Пол: Мужской
  • ливнул с форума
    • Youtube
    • Просмотр профиля
Ребенок изучает asm [SMD]
« Ответ #148 : 27 Июнь 2025, 13:55:31 »
как ничего? а мое чсв? вот раньше асм не знал. и все надежды были только на форум, что тут подскажут :) а тут на тебе! оказывается я сам (почти) могу!

пока примерно так и вроде собирается. и вроде запускается. но я еще сам механизм формирования таблицы с повторяющимися кадрами пока не сделал в манагере. думаю селект кадра и кнопка дель, чтобы на кадре крестик появлялся.
; LOAD TILES
move.l #$40200000,(a2) ; Устанавливаем a2 как указатель на начало VRAM (предположение)
lea tiles_table,a0      ; Загружаем адрес таблицы указателей тайлов в a0
move.w d7,d1           ; Копируем индекс тайла в d1
lsl.w #2,d1           ; Умножаем на 4 (размер указателя в tiles_table)

;move.l (a0,d1.w),a0    ; Загружаем указатель на данные тайла из tiles_table в a0
move.l  (a0,d1.w),d0    ; Загружаем указатель на данные тайла из tiles_table в d0 (ВРЕМЕННО!)

; Проверка на дублирование адреса
    cmp.l previous_tile_address, d0  ; Сравниваем новый адрес с предыдущим
    beq load_tiles_end      ; Если адреса одинаковые, ничего не делаем и выходим

; Адрес новый - обновляем previous_tile_address и продолжаем загрузку
    move.l d0, previous_tile_address  ; Сохраняем новый адрес как предыдущий
    move.l d0, a0                   ; Перемещаем адрес в a0 для дальнейшей обработки (a0 - указатель на тайл)

lea tile_sizes,a3       ; Загружаем адрес таблицы размеров тайлов в a3
move.w d7,d1           ; Снова копируем индекс тайла в d1
lsl.w #1,d1           ; Умножаем на 2 (размер слова в tile_sizes)
move.w (a3,d1.w),d1    ; Загружаем размер тайла (в байтах) из tile_sizes в d1
bsr copy_to_vram        ; Копируем тайл в VRAM (a0 -> источник, a2 -> назначение, d1 -> размер)

load_tiles_end:

правда с previous_tile_address пока не ясно. иишный
; Переменная для хранения предыдущего адреса тайла
previous_tile_address   ds.l    1       ; Выделяем 4 байта для хранения long (адреса)

взбрыкнул. или может я не туда куда-то эту строчку втулил. или ему ds.l не понравился.

пока так куда-то там наверху втулил:
previous_tile_address:
dc.l    0
но видимо правильней было бы через equ сделать. хотя как он поймет что там .l

ну доделаю крестики и выгрузку. потом увижу работает или нет :)

Оффлайн SeregaZ

  • Пользователь
  • Сообщений: 2665
  • Пол: Мужской
  • ливнул с форума
    • Youtube
    • Просмотр профиля
Ребенок изучает asm [SMD]
« Ответ #149 : 28 Июнь 2025, 22:11:26 »
итак... факир был пьян, фокус не удался :) я надеялся, что раз у каждой сцены будет свой просчет палитры - итоговое какчество станет лучше. но увы. порой важные цвета, как будь-то красный - жрет нещадно, если его было мало в сцене.

крестики (удаления кадров) - вроде работают. дикого рассинхрона вроде не заметил. но это надо работать со сценами и вручную удалять одинаковые кадры. например поудалял кадры-дублеры в двух сценах и результат (размер рома):

3 730 024 ; как есть
3 485 544 ; частичное удаление дублей

по идее такое разделение на сцены при использовании tiledpalettequant даст еще круче эффект, но вручную пихать туда сюда кучу картинок... такое себе занятие. этот буржуин не хочет как dll сделать. пишет типа у меня лапки. чтоб ему икалось. есть конечно мысль нейросетке скормить этот джава скрипт... но там в одном фрагменте есть ссыль на другой файл, который запускается по сути в потоке. то есть браузер начинает работать в том моменте в двух потоках. как это место переписать так, чтобы вся жава была в одном файле, чтоб нейросеть раздуплила - не понятно. надо думать кароче...