Разработка и ромхакинг > Ромхакинг и программирование
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 ---А чего-й не так?
--- Конец цитаты ---
они везде затратные, тем более в процессорах тех лет
Навигация
Главная страница сообщений
Следующая страница
Предыдущая страница

Перейти к полной версии