| Разработка и ромхакинг > Ромхакинг и программирование |
| SGDK |
| << < (38/40) > >> |
| SeregaZ:
--- Цитата: rep-stosw от 22 Декабрь 2021, 04:49:21 ---В VGM семплы DAC хранятся в единственном количестве. --- Конец цитаты --- это в случае оптимизированной vgm'ки. а ежели она была писана - скажем фрагмент какой-то в том-же Fusion из какой-то другой игры - там сэмплы будут "растянуты" во времени, путем спама этого самого регистра $2A и будут повторятся каждый раз. поэтому оптимизированные вгмки лучше. из Дефлемаска экспортированная вгмка с сэмплами возможно не подойдет. потому что там сэмплы 32 битные. не знаю каким там образом происходит экспорт сэмплов в вгм из дефлемаска - не смотрел, но не думаю что там происходит конвертация на лету из 32 в 8 бит. что касается музыкантов - это зря поклеп на дефлемаск :) есть целый дискордовский канал дефлемасковский. там этих музыкантов... тьма. мы когда в RRR музыку конвертировали - эту самую музыку пилил буржуйский товарищ Alianger с этого дефлемасковского канала. правда он делал не авторскую, а каверы на свое усмотрение - типа Europe - Final Countdown, Billy Idol - More More More (хз как она называется). но поскольку XGM на тот момент мы предали анафеме - пришлось лепить велосипед по конвертации из Deflemask в RRR драйвер (не помню названия), но там свои проблемы вылезли... одна - размер песни в оригинальном драйвере не более 3кб. у меня же под 30кб получалось конвертирование (без оптимизации). Ti потом сделал изменение чтения этой самой мелодии и этот лимит 3кб мы обошли... нооооо у всего есть цена :) если оригинальный размер был не более 3кб - но можно было сделать так, чтобы фразы диктора не прерывали мелодию. то когда размер был увеличен - все вернулось в зад и диктор прерывал проигрывание мелодии, как было в оригинале RRR. посему драйвер RRR был предан анафеме тоже. был заменен RRR'шный драйвер на любимый GEMS и там пошла жара... но опять вылезло две проблемы :) первая - XGM не нужно ничего конвертировать и трек звучит классно. при переносе в GEMS нужно попытаться воспроизвести алогоритм изменения частоты в случае слайдов нот - у меня особо не получилось... и пьяные кошки звучат в треках во всех местах. это все Alianger виноват :) сделал такие музыкальные треки с миллионом слайдов и эффектов, что у меня мозг вспух в попытке все это перенести во вселенную GEMS. делал бы простые прямые ноты, без извращений - то там бы уже давно все закончили. но с этими слайдами я прям в расстройстве. их будем править только когда доделаю GEMS треккер. если доделаю. а вторая проблема - звук визга покрышек. при длительных заносах там появляются щелчки. что тоже портит впечатление. дело скорей всего в слишком частом вызове этого звука. инструмент потому что я ковырял и так и сяк - не помогает. думаю просто слишком часто вызывается. туда-бы паузу чуть побольше между вызовами визга... сейчас, насколько я знаю, Alianger делает каверы на какой-то там проект по Кастлвании на сегу. так-же можно в соседней теме про 8 битную музыку написать - там есть, правда не дефлемасковский - а VGM MM'ский фанат Sprill - тоже класные треки делает. может ему будет интересно. |
| rep-stosw:
Удалось портировать и запустить движок Echo на SGDK. Вначале ничего не шло, так как грузил инструменты не в том порядке. Потом глянул моторольные сорцы (*.68k которые), оказалось, что часть инструментов заданы в виде набора байтов, так что те что в папках fm и pcm - это ещё не всё! :lol: Цепочки байтов перенёс с асма в Си, а инструменты из папок подцепил в ресурсы BIN. Поиграл треки. Есть интересные, но треков esf очень мало. Пробовал осилить xm2esf, и понял что оно того не стОит. У треков XM (которые писались неизвестно кем и для какой платформы) слишком много каналов (до 32) и уместить их в 10 каналов сеги - не выйдет. Всё-же более перспективнее переносить MOD'ы. А мне вот интересно стало. Есть очень много тем c Adlib OPL2/3. Некоторые форматы данных я знаю (типа DRO, DAT, и прочие). Можно ли перекодировать YMF262/YM3812 (OPL2/OPL3) в YM2612 (OPN2) ? Есть ли готовые решения? Проще говоря - регистры OPL3 отмапить на OPN2. Без привязки к MIDI там всяким. Пара "регистр-значение" OPL3 переводим в пару "регистр-значение" OPN2. Ну с корректировкой битовых полей, и может записью в другие регистры, если биты параметров раскиданы в разных регистрах. Понимаю, что у OPL3 9 каналов, а у сеги всего 6 FM каналов. Но всё-же... :) Хочестя самостоятельно заняться конверсией и найти техническое решение, а то кормить "случайных Бетховенов" уже порядком надоело. ^_^ --- Цитата: SeregaZ от 22 Декабрь 2021, 12:25:24 ---что касается музыкантов - это зря поклеп на дефлемаск :) есть целый дискордовский канал дефлемасковский. там этих музыкантов... тьма --- Конец цитаты --- Я не знаю ничего про этот канал. А вот на форуме дефлемаска удалось зарегаться. Там выкладывают треки, но они в основном под NES или GB. Под сегу там мало, а хороших(по моему вкусу) треков там "раз, два и обчёлся"... Часть треков не идёт в последней версии дефлемаска. Дефлемаск - сама штука хорошая, но от него шарахаются те, кто привык работать с секвенсорами и VST. Писать музыку я не умею, поэтому ищу решение задачи в техническом ключе. |
| Ti_:
--- Цитата: rep-stosw от 20 Декабрь 2021, 11:17:02 ---Из памяти M68k в VRAM VDP Из памяти M68k в VRAM VDP перекидывал так: while(n--)VDP_DATA_32=*src++; } } --- Конец цитаты --- Без понятия что там сгенерится, но скорее всего --- Код: ---@loop: move.l (a0)+(a1) dbf d0,@loop --- Конец кода --- или --- Код: ---@loop: move.l (a0)+(a1) move.l (a0)+(a1) dbf d0,@loop --- Конец кода --- что недостаточно для большой скорости. Должно быть примерно такое : --- Код: --- lea vdpSpriteCache,a0 lea $C00000,a1 ; vdp_data move.l #$74000003,4(a1) ; vram: $F400 move.w highestVDPSpriteIndex,d1 ; количество спрайтов 1-80? bne.s @have_spr moveq #1,d1 ; (минимум 1 спрайт для обновления если нет спрайтов). @have_spr add.w d1,d1 ; *2 add.w d1,d1 ; *4 = 320 move.w #320,d0 sub.w d1,d0 jmp copy_to_vram(pc,d0.w) copy_to_vram dcb.w 160,$2298 ; то есть move.l (a0)+,(a1) повторить 160 раз. (160*4 = 640) rts --- Конец кода --- Это медленнее чем с DMA, но вполне неплохо. Тем более для 640 байтов. Звук семплов это улучшит. С тайлами сложнее, там много уже не передать без DMA, но могут быть варианты: а) Тайлы обновляются не всё время. б) Пал режим, тут гораздо больше времени вбланка. (Проверять если VDP в ПАЛ - не использовать DMA). Также можно с CPU только в момент когда семпл играет, а в остальных случаях с DMA. Примерный код для тайлов - передаём в цикле по 64 байта (2 тайла), максимум 2560 байт. --- Код: --- lea tiles,a0 ; тайлы move.w tiles_cnt,d1 ; количество тайлов от 1 до примерно 80, при превышении - DMA. cmpi.w #80,d1 BCC.S too_many_tiles subq.w #1,d1 lsr.w #1,d1 bcc.s @odd @copy move.l (a0)+,(a1) ; 1тайл = 32байта. move.l (a0)+,(a1) move.l (a0)+,(a1) move.l (a0)+,(a1) move.l (a0)+,(a1) move.l (a0)+,(a1) move.l (a0)+,(a1) move.l (a0)+,(a1) @odd move.l (a0)+,(a1) ; 2-ой тайл move.l (a0)+,(a1) move.l (a0)+,(a1) move.l (a0)+,(a1) move.l (a0)+,(a1) move.l (a0)+,(a1) move.l (a0)+,(a1) move.l (a0)+,(a1) dbf d1,@copy rts too_many_tiles: тут код с dma. --- Конец кода --- Также кроме тайлов и спрайтов, можно переделать обновление палитры и hscroll если они есть. Добавлено позже: --- Цитата: rep-stosw от 20 Декабрь 2021, 11:17:02 ---Вот этот вариант: Вот этот вариант более интересен. Можно ли заставить XGM движок играть семпл из памяти Z80, предварительно скопировав его из ROM ? --- Конец цитаты --- Ну это сложная система. Поэтому врядли. Из движков GEMS это умеет. Добавлено позже: --- Цитата: rep-stosw от 21 Декабрь 2021, 14:32:43 ---И тут я более понял, что нужно посмотреть dma.c что там делается. И не зря. Там творится полный ужас - останавливается Z80 когда идёт транзакция DMA: --- Конец цитаты --- Ну как бы это также есть и в почти всех играх на SEGA. Z80 в любом случае останавливается, при попытке доступа к РОМУ, если в этот момент используется DMA. Но в играх это делается принудительно, что при любом обращении к памяти z80, так как по рекомендациям в мануале, сказано что так надо. Иначе могут быть проблемы, то ли в зависимости от ревизий Сеги, или от скорости памяти точно не скажу. А вот в некоторых эмуляторах z80 не останавливается сам. Добавлено позже: --- Цитата: rep-stosw от 21 Декабрь 2021, 14:32:43 ---Всё отлично работает! DMA успевает пролететь раньше - сразу же после освобождения шины Z80, до того как Z80 снова её займёт. Я рад! Сопли в звуке прошли - все семплы чётко и ровно звучат, и спрайты не артефачат. :) --- Конец цитаты --- Такое врядли может быть: При 14 кгц звуке если он читается напрямую из ROM, полностью дисторшен никак не может пропасть. Это по 233 байта за кадр. То есть в среднем почти каждую строку по байту. За vblank-dma это байтов 20 или больше. Если только у тебя dma не разбито на много маленьких кусков, и то сомнительною То есть тут либо xgm всё же умеет 'кешировать' семпл. Либо эмулятор такой, если на нём проверял. |
| rep-stosw:
--- Цитата: Ti_ от 22 Декабрь 2021, 19:55:00 ---Но в играх это делается принудительно, что при любом обращении к памяти z80, так как по рекомендациям в мануале, сказано что так надо. Иначе могут быть проблемы, то ли в зависимости от ревизий Сеги, или от скорости памяти точно не скажу. А вот в некоторых эмуляторах z80 не останавливается сам. --- Конец цитаты --- --- Цитата: Ti_ от 22 Декабрь 2021, 19:55:00 ---То есть тут либо xgm всё же умеет 'кешировать' семпл. Либо эмулятор такой, если на нём проверял. --- Конец цитаты --- На GENS и Fusion полёт нормальный. Также проверял на реальной приставкe (MegaDrive 1) - тоже всё ОК. Играет VGM с партией ударных на DAC(CH1) и звуки (CH2), делается скролл плоскостей A, B и рисуются анимированные спрайты. Но странно вот что: при попытке отловить захват шины Z80 перед SPR_update() - всегда возвращается, что шина свободна! Тем не менее, при DMA транзакциях по дефолту Стеф всегда тормозит Z80, даже не проверяя перед этим - а захвачена ли шина действительно? Я это убрал. --- Цитата: Ti_ от 22 Декабрь 2021, 19:55:00 ---б) Пал режим, тут гораздо больше времени вбланка. (Проверять если VDP в ПАЛ - не использовать DMA). Также можно с CPU только в момент когда семпл играет, а в остальных случаях с DMA. --- Конец цитаты --- Игра затачивается под NTSC, и приставка у меня тоже NTSC. Смысла делать тормозной PAL не вижу, я люблю NTSC. --- Цитата: Ti_ от 22 Декабрь 2021, 19:55:00 ---Это медленнее чем с DMA, но вполне неплохо. Тем более для 640 байтов. Звук семплов это улучшит. --- Конец цитаты --- Можно было самостоятельно не переделывать на CPU. У Стефа в config.h есть дефайн: --- Код: ---#define DMA_DISABLED 0 --- Конец кода --- Поставить его в 1, если DMA не нужен. Проверял: всё также работает, и звук без рывков. |
| rep-stosw:
/// Для подгрузки карты уровня использую: MAP_scrollTo( ). В первый раз - первый фрейм - мусор в виде некорректной мапы. Начиная со второго фрейма и дальше - всё нормально. Как побороть мусор и заставить первый вызов MAP_scrollTo( ) отображать то, что надо? P.S. Обнаружил артефакт на замедленной съёмке. |
| Ti_:
--- Цитата: rep-stosw от 23 Декабрь 2021, 02:44:39 ---Но странно вот что: при попытке отловить захват шины Z80 перед SPR_update() - всегда возвращается, что шина свободна! Тем не менее, при DMA транзакциях по дефолту Стеф всегда тормозит Z80, даже не проверяя перед этим - а захвачена ли шина действительно? Я это убрал. --- Конец цитаты --- Никто и не проверяет, захвачена ли шина, в этой проверке отдельно смысла нет, если ты сам не делаешь захвата шины. Как я уже же сказал так, во всех играх где драйвер читает из рома. Везде последовательность примерно такая: --- Код: --- move.w #$100,$A11100 ; делаем захват @wait btst #0,$A11100 ; ждём что шина стала свободна (вот это как раз во многих эмуляторах всегда свободна). bne.s @wait move.w (sp)+,$C00004 ; DMA (или другие операции с доступом к ОЗУ z80). move.w #0,$A11100 ; возвращаем --- Конец кода --- Добавлено позже: --- Цитата: rep-stosw от 23 Декабрь 2021, 02:44:39 ---Также проверял на реальной приставкe (MegaDrive 1) - тоже всё ОК. --- Конец цитаты --- Ну может он сумел это сделать (подгрузку семпла в ОЗУ), но где-то это не доделано или неидеально. И поэтому по дефолту был оставлен захват z80 при dma. На этот драйвер вроде часто жаловались что на железе 'виснет'. |
| rep-stosw:
--- Цитата: Ti_ от 23 Декабрь 2021, 19:19:33 ---На этот драйвер вроде часто жаловались что на железе 'виснет'. --- Конец цитаты --- На каком железе? Есть ли разница в том как будет работать софт, если вместо оригинального Мегадрайв-1, я возьму китайский нонейм на одной микросхеме-капле? "Сюрпризы" будут? Предполагаю, что в последних "сегах" на "каплях" упрощена схемотехника и что-то может работать через одно место. --- Цитата: rep-stosw от 23 Декабрь 2021, 10:42:55 ---Как побороть мусор и заставить первый вызов MAP_scrollTo( ) отображать то, что надо? --- Конец цитаты --- Как оказалось - важен порядок вызова: --- Код: ---VDP_setScreenWidth320(); VDP_setHilightShadow(0); SPR_init(); // SPR_reset(); // SPR_clear(); VDP_clearPlane(BG_B,TRUE); VDP_clearPlane(BG_A,TRUE); VDP_clearPlane(WINDOW,TRUE); VDP_loadTileSet(...); VDP_setTileMapEx(BG_B,...); VDP_setPalette(...); VDP_loadTileSet(...); BG1=MAP_create(&BG1_Map,BG_A,...); VDP_setPalette(...); VDP_setScrollingMode(HSCROLL_TILE,VSCROLL_PLANE); ScrollY=...; ScrollX=...; MAP_scrollTo(BG1,ScrollX,ScrollY); SYS_doVBlankProcess(); while(1) { ControlInput(); ... VDP_setHorizontalScrollTile(BG_B,...); MAP_scrollTo(BG1,ScrollX,ScrollY); ... //управляем логикой игры, спрайтами... SPR_update(); SYS_doVBlankProcess(); } --- Конец кода --- При таком порядке: 1. Появляется задняя плоскость - 2 фрейма 2. затем появляется плоскость платформ (фрагмент уровня) - 1 фрейм 3. Затем появляются спрайты - 1 фрейм 4. начинает всё двигаться и идти Если же перед циклом выбросить это: --- Код: ---ScrollY=...; ScrollX=...; MAP_scrollTo(BG1,ScrollX,ScrollY); SYS_doVBlankProcess(); --- Конец кода --- То первый фрейм - будет мусор. |
| Ti_:
--- Цитата: rep-stosw от 24 Декабрь 2021, 03:00:53 ---На каком железе? Есть ли разница в том как будет работать софт, если вместо оригинального Мегадрайв-1, я возьму китайский нонейм на одной микросхеме-капле? "Сюрпризы" будут? Предполагаю, что в последних "сегах" на "каплях" упрощена схемотехника и что-то может работать через одно место. --- Конец цитаты --- Некоторые модели md2, также мб md1 va0, и некоторые клоны. В этой же теме обсуждалось: http://www.emu-land.net/forum/index.php/topic,70308.msg1448141.html#msg1448141 Добавлено позже: Вот ещё: http://gendev.spritesmind.net/forum/viewtopic.php?f=8&t=2478&p=30259&hilit=xgm+freeze#p30259 |
| rep-stosw:
--- Цитата: Ti_ от 24 Декабрь 2021, 18:01:27 ---Некоторые модели md2, также мб md1 va0, и некоторые клоны. В этой же теме обсуждалось: http://www.emu-land.net/forum/index.php/topic,70308.msg1448141.html#msg1448141 --- Конец цитаты --- Почитал я мытарства Сегамена; уже представляю как у меня будет бомбить, когда игра пойдёт не так или вообще не пойдёт на разных версиях Сеги. А вот на этой модели сеги(которая у меня есть) можно отключать Z80 во время DMA: К сожалению (а может и к счастью) у меня нет других сег, чтобы на них проверить. Изначально, я предполагал, что конфигурация железа Сеги везде одинакова (в отличие от ПК) и не будет гемороя с совместимостью. Китайцы со своими клонами разбили мою хрустальную мечту! :? --- Цитата: Ti_ от 24 Декабрь 2021, 18:01:27 ---Вот ещё: http://gendev.spritesmind.net/forum/viewtopic.php?f=8&t=2478&p=30259&hilit=xgm+freeze#p30259 --- Конец цитаты --- Та же самая проблема - Стеф не имеет возможности самостоятельно протестировать на всех клонах свой SGDK. Он там пишет, что отключение Z80 во время DMA - это "clever solution", но я с ним не соглашусь: получать рваный звук (речь идёт только о проигрывании PCM) во время работы DMA - не лучшее решение. К сожалению, других вариантов нет, так как у самого Z80 памяти как кот наплакал (8 кБ) и грузить туда целый семпл PCM длительностью хотя бы 0,3 с - не выйдет. Так как с этих 8 кБ на буфер отведён всего 1 кБ. Из того же форума (сохранил, не помню уже тему, где взял): --- Цитата ---XGM music playing state: 0xA00102 bit 6 PCM channel playing state: 0xA00102 bit 0 to bit 3 (channel 0 to channel 3) D1L / RR registers state: 0xA00144-0xA0015B (6 channels * 4 operators) PSG envelop: 0xA0015C-0xA0015F (4 channels) DAC enabled: 0xA00160 (bit 7) Circular PCM buffer: 0xA01800-0xA01BFF You can find the current read PCM segment at 0xA00140. Note that the address is stored as byte so you only have bit 8 and bit 9 as the lower bits are always 0. For instance if you read 0 from 0xA00140 then current PCM read buffer is 0xA01800, if you read 3 then current read PCM buffer is 0xA01B00... --- Конец цитаты --- Всего 1 кБ на кольцевой буфер : --- Цитата ---Circular PCM buffer: 0xA01800-0xA01BFF --- Конец цитаты --- А теперь считаем: 1 кБ/ 2 = 512 байт (семплов) Семплирование: 14 000 Гц Время проигрывания одной половинки буфера: 512/14000 ~ 36.57 мс. С такими интервалами Z80 лезет к 68k ROM для полученния новых данных. В случае семпла 0,3 с, число обращений Z80 к памяти 68k: 300/35.57 ~ 9 обращений. Тоесть, обращения неизбежны! А теперь вопрос: можно ли приостанавливать уже начатую передачу DMA, когда Z80 нужны новые данные (обращения к M68k RAM) ? А потом продолжить ДМА. Совсем от DMA отказываться нежелательно, так как с ним выше скорость копирования тайлов-спрайтов, чем в случае 68k. |
| Ti_:
--- Цитата: rep-stosw от 25 Декабрь 2021, 03:07:30 ---можно ли приостанавливать уже начатую передачу DMA, когда Z80 нужны новые данные (обращения к M68k RAM) ? А потом продолжить ДМА. --- Конец цитаты --- Нет, нельзя. Касаемо размера буффера, так и в GEMS всего 256 байт. Да, и раз ты не слышишь ухудшения звука, то вероятно в этом движке работает буффер так, чтобы пополняться только вне vblanka (флаг 'dma' тут не используется, в gems - есть). По сути буффер для этого и нужен. Без него будет дисторшен звуков независимо от того, захватываешь ли ты шину или нет. Тут может быть проблема что это сделано только для семплов, а для остальных данных трека (fm,psg) это не делается и/или не учитывается когда можно обращаться к рому. |
| rep-stosw:
--- Цитата: Ti_ от 25 Декабрь 2021, 09:56:41 ---Тут может быть проблема что это сделано только для семплов, а для остальных данных трека (fm,psg) это не делается и/или не учитывается когда можно обращаться к рому. --- Конец цитаты --- Одновременно ещё играет VGM, в котором FM(1..5), PSG(3 sq + 1 noise) и DAC(FM6 CH1) |
| rep-stosw:
Знающие, подскажите плиз название эмулятора ниже на рисунке. Интересует отладка: P.S. Это же не Gens KMod, верно? |
| Segaman:
--- Цитата: rep-stosw от 30 Декабрь 2021, 02:23:03 ---Знающие, подскажите плиз название эмулятора ниже на рисунке. Интересует отладка: (Ссылка на вложение) P.S. Это же не Gens KMod, верно? --- Конец цитаты --- похоже на Exodus |
| rep-stosw:
--- Цитата: Segaman от 04 Январь 2022, 13:43:53 ---похоже на Exodus --- Конец цитаты --- Да, это он. Правда, воспользоваться им не удалось. Еле идёт на 1 FPS. Потом намертво зависает. Остаюсь на Gens/Fusion. Gens тоже подёргивается. |
| rep-stosw:
Ранее я писал здесь, что удалось сделать зацикливание треков VGM на начало для бесконечного воспроизведения их по кругу на SGDK. Теперь появилась новая проблема: делаю в VGMMaker'е трек, который скругляется с конца в середину. На самом VGMMaker'е трек играет как положено, а на SGDK закругление в середину работает неправильно - на слух трек сбивается. Смотрел значение двойного слова(4 байта) в VGM по адресу 0xC: там записано какое-то ненулевое значение. Тоесть по идее, скругление на середину трека есть. В чём может быть проблема? Как поправить? Хочу сделать, чтобы скругление VGM трека было с конца в середину. |
| rep-stosw:
--- Цитата: rep-stosw от 14 Январь 2022, 04:28:37 ---В чём может быть проблема? Как поправить? --- Конец цитаты --- Проблема оказалась в кривизне реализации воспроизведения VGM в XGM-движке SGDK. Во-1: нельзя делать скругление на паттерн, активно использующий семплы DAC. При закруглении на такой паттерн, на слух явно слышно протормаживание, рвущее зацикливание трека. Решение: немного переделать трек - в хвост дописать все паттерны, не включая того, где семплов DAC уже нету, а зацикливание поставить на этот самый паттерн без DAC. Во-2: SGDK корректно работает с VGM, у которых указано либо 50 либо 60 Гц. Если поставить 48 Гц, то из-за кривизны расчёта таймингов со временем накопится ошибка, и с 3-го , 4-го и последующих разов зацикливание будет не на то что нужно, трек будет "спотыкаться". В общем, котЭ недоволен! Попутно решил задачу, связанную с уменьшением общей громкости в треках дефлемаска, чтобы музыка не забивала звуки в игре. Так как основная масса треков используют дефолтные значения громкости инструментов, то пришлось распарсить весь трек и подправить все инструменты в нём. TL выходным операторам FM, затухание огибающим PSG и уровень громкости всех DAC семплов. Но в целом получил, что я хотел! Правда мне непонятно, в чём товарищ Делек измеряет громкость семплов на ползунках(-100 тишина, 0 -единичное усиление, +100 субъективно в 1,5-2 раза громче). Наверное, в попугаях! :lol: И ещё в алгоритме 4 операторы 2 и 3 поменяны местами, для написания музыки - это пофигу, но когда пишешь парсер или конвертер - это архи-важно. Написал об этом Делеку в дискорд, пока тишина. :? |
| rep-stosw:
Словил пару интересных моментов, связанных с оптимизацией кода по M68000. 1. Этот процессор не любит операций деления и остатков от деления. Этот код призван колыхать плоскость тайлов - на эмуляторе идёт без промедлений, на реальной приставке в 3 раза меньше FPS: --- Код: ---for(int i=0;i<224;i++)val[i]=Sinus[((128*(t+i))/224)&127]/3; --- Конец кода --- Просчитал всё заранее, заменил на: --- Код: ---for(u32 i=0;i<224;i++)val[i]=LUT2[MOD(t+i,224)]; static inline u32 MOD(u32 x,u32 y) { Check: if(x>=y) { x-=y; goto Check; } return x; } --- Конец кода --- Результат - программа отлично работает с целевым FPS =60. 2. Локальные массивы лучше выносить за цикл. Было так (из-за этого FPS просаживался в 2 раза при определённых условиях): --- Код: ---while(...) { ... s16 val[28]; for(int i=0;i<28;i++)val[i]=-((72-Sinus[(i*65)/28])*t)/12; //>>4; VDP_setHorizontalScrollTile(BG_B,0,val,28,DMA_QUEUE); ... } --- Конец кода --- Стало: --- Код: ---s16 val[28]; while(...) { ... for(int i=0;i<28;i++)val[i]=(LUT4[i]*t)>>4; ... } --- Конец кода --- Результат: программа стала идти с целевым FPS=60. Так что Genesis does! . А если у вас НЕ does, то кто-то говнокодер! :lol: Сегуля вывезет любые ваши амбиции, если код и алгоритм будут правильными! :P |
| MetalliC:
--- Цитата: rep-stosw от 26 Январь 2022, 10:53:46 ---1. Этот процессор не любит операций деления и остатков от деления. --- Конец цитаты --- o_0 никогда такого не было, и вот опять оказалось что деление это крайне дорогая операция! (и не только на м68к) :lol: |
| rep-stosw:
--- Цитата: MetalliC от 26 Январь 2022, 11:02:28 --- o_0 никогда такого не было, и вот опять оказалось что деление это крайне дорогая операция! (и не только на м68к) :lol: --- Конец цитаты --- А чего-й не так? :blush: Смотрю на число тактов и вижу, что деление и умножение самые затратные : http://oldwww.nvg.ntnu.no/amiga/MC680x0_Sections/timstandard.HTML --- Цитата ---DIVS - - 158(1/0) +* - DIVU - - 140(1/0) +* - MULS - - 70(1/0) +* - MULU - - 70(1/0) +* - --- Конец цитаты --- |
| MetalliC:
--- Цитата: rep-stosw от 26 Январь 2022, 15:26:16 ---А чего-й не так? --- Конец цитаты --- они везде затратные, тем более в процессорах тех лет |
| Навигация |
| Главная страница сообщений |
| Следующая страница |
| Предыдущая страница |