Порт на MegaDrive одного из модов "Бесконечного лета"
|
|
Томахомэ | Дата: Пятница, 10.05.2024, 13:14 | Сообщение # 61 |
Генерал-лейтенант
Группа: Проверенные
Сообщений: 522
Статус: Оффлайн
| Цитата SegaMark ( ) Можно попробовать добавить свою реализацию asm процедуры loadtiles, основанной на ее оригинальном asm коде. Но у меня почему то не получается назначить адрес записи в VDP. В закрепе реализации стандартных процедур и функций на asm в bex, может кто-нибудь разберется как это работает.
Похожим образом пытался поступить и я. Компилируется успешно, но на работе итогового рома не отражается примерно никак.
Код Declare Asm Sub DrawBG(a1 as long) move.l $c0000000,$c00004.l move.b #$f, d0 move.w #$0, $c00000.l dc.l $51c8fff6 'dbra D0, (-$a,PC) move.l $60200000,$c00004.l move.w #$1bff, d0 move.l (a1)+, $c00000.l dc.l $51c8fff8 'dbra D0, (-8,PC) End Sub
Сообщение отредактировал Томахомэ - Пятница, 10.05.2024, 13:16 |
|
| |
SegaMark | Дата: Понедельник, 13.05.2024, 17:23 | Сообщение # 62 |
Сержант
Группа: Проверенные
Сообщений: 31
Статус: Оффлайн
| У меня все таки получилось написать данную процедуру, только я пока не до конца понимаю как это работает. Проверил только на SamMenu, неизвестно как будет с остальными работать
Код DIM bkgIndex as Long bkgIndex&=LblPtr&(SamMenu) DrawBG bkgIndex&
Declare Sub DrawBG(bkgIndex as Long) palettes Black_pal,0,0,16 my_load_tiles bkgIndex&, 896, 257' 896 Tiles (256x224, 32x28) Ink 0 DRAWTILESINC &h200+Priority(1),0,0,32,28 'na4alo tileset,x,y,shir,visot palettes SamMenu_pal,0,0,16 End Sub
'load a set of tiles 8x8 large, and 32 bytes/tile 'a0=adress of tiles,d0=number of tiles,d1=vram adress 'move.l #$C00000,a4 ; a4 = VDP Base address declare asm sub my_load_tiles(d5.l, d0.w, d1.w):
movea.l d5,a0 ; ????? ??????? ???? ;move.w #896, d0 ; ?????????? ?????? ;move.w #$101, d1 ; ????? ? VRAM move #$2700,sr move.w #$8F02,4(a4) ;lsl.l #2,d1 ;lsr.w #2,d1 ;swap d1 add.l #$40000000,d1 move.l d1,4(a4) subq.l #1,d0 @1: movem.l (a0)+,d2/d3/d4/d5/d6/d7/a1/a2 move.l d2,(a4) move.l d3,(a4) move.l d4,(a4) move.l d5,(a4) move.l d6,(a4) move.l d7,(a4) move.l a1,(a4) move.l a2,(a4) dbra d0,@1 move #$2000,sr end sub
|
|
| |
Томахомэ | Дата: Вторник, 14.05.2024, 12:15 | Сообщение # 63 |
Генерал-лейтенант
Группа: Проверенные
Сообщений: 522
Статус: Оффлайн
| Ахахахахах, оказывается, всё могло бы превосходно работать, если бы я не забыл поставить # перед числами $c0000000 и $60200000! Старушка Моторола, видно, всё думала, что ей дают указание загрузить данные по какому-то адресу (до которого ей к тому же, бедненькой, "не дотянуться"). Ну да ладно - теперь главное, всё работает, а заодно внесено также такое "техническое новшество", как графика и палитра в одном бинарнике (последняя там идёт в самом конце) - уж чем хорош ассемблер, так это возможностью работать с очень-очень смешанными типами данных. Так, например, когда я несколько месяцев назад ковырял Iraq War 2003, узнал, что при загрузке каждого сэмпла первыми несколькими байтами в куске данных идёт сначала, если не изменяет память, номер адресуемого Z80 "банка" общего с M68k ROM-пространства, где этот сэмпл хранится, затем отступ от начала банка, далее уже совершенно точно - информация о длине сэмпла, и лишь потом - непосредственно звуковые данные.
|
|
| |
Томахомэ | Дата: Среда, 15.05.2024, 19:36 | Сообщение # 64 |
Генерал-лейтенант
Группа: Проверенные
Сообщений: 522
Статус: Оффлайн
| По какой-то причине вызовы подпрограммы DrawBG оказалось категорически противопоказано размещать перед Sleep и, соответственно, Pause - потому что иначе тогда бьётся вся VDP, кроме, ха-ха, непосредственно тайлов фона. В чём же тут причина, и как выкручиваться, чтобы можно было между сменой фона и последующими действиями выдерживать небольшие паузы?
|
|
| |