| Разработка и ромхакинг > Ромхакинг и программирование |
| Sega Genesis Intro. |
| << < (3/4) > >> |
| Zephyr:
Ясно. Я драйвер целиком хотел с командами. Please. |
| evgeny:
Отсюда я брал: --- Код: ---;--------------------------------------- ; ; Wav Player v1.0 ; ; by drx [www.hacking-cult.org] ; [www.bluehedgehog.org] ; ; Plays the sound.wav wav sound. ; ;--------------------------------------- Vectors: dc.l $FFFE00, Entrypoint, Error, Error dc.l Error, Error, Error, Error dc.l Error, Error, Error, Error dc.l Error, Error, Error, Error dc.l Error, Error, Error, Error dc.l Error, Error, Error, Error dc.l Error, Error, Error, Error dc.l HBlank, Error, VBlank, Error dc.l Error, Error, Error, Error dc.l Error, Error, Error, Error dc.l Error, Error, Error, Error dc.l Error, Error, Error, Error dc.l Error, Error, Error, Error dc.l Error, Error, Error, Error dc.l Error, Error, Error, Error dc.l Error, Error, Error, Error Header: dc.b 'SEGA MEGA DRIVE ' ; Console name dc.b '(C) DRX 2004.NOV' ; Copyright/Date DomesticName: dc.b 'Code template by drx - www.hacking-cult.org ' ; Domestic Name dc.b 'Code template by drx - www.hacking-cult.org ' ; International Name dc.b 'GM 00000000-00' ; Version Checksum: dc.w $1337 ; Checksum dc.b 'J ' ; I/O Support RomStartLoc: dc.l 0 ; ROM Start RomEndLoc: dc.l RomEnd ; ROM End RamStartLoc: dc.l $FF0000 ; RAM Start RamEndLoc: dc.l $FFFFFF ; RAM End dc.b $20,$20,$20,$20 ; 'RA',$F8,$20 if SRAM = on SramStart: dc.l $20202020 ; $200000 if SRAM = on SramEnd: dc.l $20202020 ; $20xxxx if SRAM = on dc.b ' ' ; Notes dc.b ' ' dc.b 'JUE ' ; Country ;--------------------- ; Code start ;--------------------- Entrypoint: tst.l ($A10008).l ;Test Port A control bne PortA_Ok tst.w ($A1000C).l ;Test Port C control PortA_Ok: bne SkipSetup move.b ($A10001).l,d0 ;version andi.b #$F,d0 beq SkipSecurity ;if the smd/gen model is 1, skip the security move.l #'SEGA',($A14000).l SkipSecurity: move.w ($C00004).l,d0 ;test if VDP works moveq #0,d0 movea.l d0,a6 move a6,usp ;set usp to $0 ;--------------------- ; Setup VDP registers ;--------------------- lea (VDPSetupArray),a0 move.w #(VDPSetupArrayEnd-VDPSetupArray)/2,d1 ;$18 VDP registers VDPSetupLoop: move.w (a0)+,($C00004).l dbf d1,VDPSetupLoop move.l #$40000080,($C00004).l move.w #0,($C00000).l ;clean the screen ;--------------------- ; Init the Z80 ;--------------------- move.w #$100,($A11100).l ;Stop the Z80 move.w #$100,($A11200).l ;Reset the Z80 Waitforz80: btst #0,($A11100).l bne Waitforz80 ;Wait for z80 to halt lea (Z80Init),a0 lea ($A00000).l,a1 move.w #Z80InitEnd-Z80Init,d1 InitZ80: move.b (a0)+,(a1)+ dbf d1,InitZ80 move.w #0,($A11200).l move.w #0,($A11100).l ;Start the Z80 move.w #$100,($A11200).l ;--------------------- ; Reset the RAM ;--------------------- lea ($FFFF0000).l,a0 move.w #$3fff,d1 ClearRAM: move.l #0,(a0)+ dbf d1,ClearRAM ;--------------------- ; VDP again ;--------------------- move.w #$8174,($C00004).l move.w #$8F02,($C00004).l ;--------------------- ; Clear the CRAM ;--------------------- move.l #$C0000000,($C00004).l ;Set VDP ctrl to CRAM write move.w #$3f,d1 ClearCRAM: move.w #0,($C00000).l dbf d1,ClearCRAM ;--------------------- ; Clear the VDP stuff ;--------------------- move.l #$40000010,($C00004).l move.w #$13,d1 ClearStuff: move.l #0,($C00000).l dbf d1,ClearStuff ;--------------------- ; Init the PSG ;--------------------- move.b #$9F,($C00011).l move.b #$BF,($C00011).l move.b #$DF,($C00011).l move.b #$FF,($C00011).l move.w #0,($A11200).l ;--------------------- ; Load the z80 driver ;--------------------- move.w #$100,($A11100).l ;Stop the Z80 move.w #$100,($A11200).l ;Reset the Z80 Waitforz80a: btst #0,($A11100).l bne Waitforz80a ;Wait for z80 to halt lea (Z80Driver),a0 lea ($A00000).l,a1 move.W #Z80DriverEnd-Z80Driver,d1 LoadZ80Driver: move.b (a0)+,(a1)+ dbf d1,LoadZ80Driver move.w #0,($A11100).l ;Start the Z80 ;--------------------- ; Clear the registers ; and set the SR ;--------------------- movem.l ($FF0000).l,d0-a6 lea ($FFFE00).l,a7 move #$2700,sr SkipSetup: ;----------------------- ; Here starts your code ;----------------------- Main: ; ;ok, so we have to stop the z80 in order to set up the variables ; move.w #$100,($A11100).l ;Stop the Z80 ; ; loops until z80 is halted ; Waitforz80b: btst #0,($A11100).l bne Waitforz80b ;Wait for z80 to halt ; ;in our sound driver, $39 is the on/off variable ; move.b #1,($a00039).l ;turn the wav playing script on ; ;we have to bitshift the wav address a bit, because Z80 is little endian, compared to 68k (big endian) ; ;data: $12345678 ;big endian: $12345678 ;little endian: $78563412 ; move.b #((SoundStart&0xFF0000)>>16),($a0003c).l ;addr - $__xxxx move.b #((SoundStart&0xFF00)>>8),($a0003b).l ;addr - $xx__xx move.b #(SoundStart&0xFF),($a0003a).l ;addr - $xxxx__ ; ; set up the wav length (number of bytes played) ; move.l #SoundEnd-SoundStart,($a00043).l ;wav length ; ; now we can start te z80 after changing the variables ; move.w #$0,($A11100).l ;Start the Z80 ; ; the infinite loop will occur now, and the z80 will work in the background (z80 and 68k work simultaneously [spelling... :P]) ; dc.w $60fe ;infinite loop (bra $-2) rts ;--------------------- ; Error exceptions ;--------------------- Error: rte ;--------------------- ; Horizontal Blank ;--------------------- HBlank: rte ;--------------------- ; Vertical Blank ;--------------------- VBlank: rte ;--------------------- ; VDP registers array ;--------------------- VDPSetupArray: dc.w $8004 ;9-bit palette = 1 (otherwise would be 3-bit), HBlank = 0 dc.w $8134 ;Genesis display = 1, DMA = 1, VBlank = 1, display = 0 dc.w $8230 ;Scroll A - $C000 dc.w $8338 ;Window - $E000 dc.w $8407 ;Scroll B - $E000 dc.w $857c ;Sprites - $F800 dc.w $8600 ;Unused dc.w $8700 ;Backdrop color - $00 dc.w $8800 ;Unused dc.w $8900 ;Unused dc.w $8A00 ;H Interrupt register dc.w $8B00 ;Full screen scroll, no external interrupts dc.w $8C81 ;40 cells display dc.w $8D3F ;H Scroll - $FC00 dc.w $8E00 ;Unused dc.w $8F02 ;VDP auto increment dc.w $9001 ;64 cells scroll dc.w $9100 ;Window H position dc.w $9200 ;Window V position dc.w $93FF ;DMA stuff (off) dc.w $94FF ;DMA stuff (off) dc.w $9500 ;DMA stuff (off) dc.w $9600 ;DMA stuff (off) dc.w $9780 ;DMA stuff (off) VDPSetupArrayEnd: ;--------------------- ; Z80 init code ;--------------------- Z80Init: dc.w $af01, $d91f, $1127, $0021, $2600, $f977 dc.w $edb0, $dde1, $fde1, $ed47, $ed4f, $d1e1 dc.w $f108, $d9c1, $d1e1, $f1f9, $f3ed, $5636 dc.w $e9e9 Z80InitEnd: ;--------------------- ; Music driver (z80) ;--------------------- Z80Driver: dc.b $c3,$46,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00 dc.b $00,$00,$00,$00,$00,$f3,$ed,$56,$31,$00,$20,$3a,$39,$00,$b7,$ca,$4c,$00,$21,$3a,$00,$11,$40,$00,$01,$06,$00,$ed,$b0,$3e,$00,$32,$39,$00,$3e,$b4,$32,$02,$40,$3e,$c0,$32,$03,$40,$3e,$2b,$32,$00,$40,$3e,$80,$32,$01,$40,$3a,$43,$00,$4f,$3a,$44,$00,$47,$3e,$06,$3d dc.b $c2,$81,$00,$21,$00,$60,$3a,$41,$00,$07,$77,$3a,$42,$00,$77,$0f,$77,$0f,$77,$0f,$77,$0f,$77,$0f,$77,$0f,$77,$0f,$77,$3a,$40,$00,$6f,$3a,$41,$00,$f6,$80,$67,$3e,$2a,$32,$00,$40,$7e,$32,$01,$40,$21,$40,$00,$7e,$c6,$01,$77,$23,$7e,$ce,$00,$77,$23,$7e,$ce,$00,$77 dc.b $3a,$39,$00,$b7,$c2,$4c,$00,$0b,$78,$b1,$c2,$7f,$00,$3a,$45,$00,$b7,$ca,$4c,$00,$3d,$3a,$45,$00,$06,$ff,$0e,$ff,$c3,$7f,$00 Z80DriverEnd: SoundStart: incbin sound.wav SoundEnd: RomEnd: --- Конец кода --- |
| Zephyr:
Благодарю!!! |
| Zephyr:
2evgeny Исправил твой драйвер!!! Теперь не "хрюкает" вначале, тока заголовок вырезай - 45 байт. Написал демку!!! Теперь только 8000Hz 8Bit Mono. Ну а что еще нужно для Genesis DAC!? Кстати, я низнаю как ты отлаживал и исправлял бинарный драйвер, использовал отладчик или что!? Или так ковырял??? Я посмотрел там где ты внес изменения и по теории вероятности, заменил байты немного далее, вроде все работает... Способ пальцем в небо короче... Исправил команды, оставил тока требуемые нам по управлению драйвером. Вообще неплохо получилось, компактно... Демо (~450Kb): http://webfile.ru/1610110 Сырцы (~450Kb): http://webfile.ru/1610114 PS: 2Neon - спасибо за исправления. |
| HardWareMan:
У Сеги DAC быть стерео не предусмотрен. Также, не вижу ничего необычного или сверхестественного в этомй "драйвере". --- Код: ---; ; +-------------------------------------------------------------------------+ ; | This file is generated by The Interactive Disassembler (IDA) | ; | Copyright (c) 2007 by DataRescue sa/nv, <ida@datarescue.com> | ; | Licensed to: GVU, Gerhard Uphoff, 1 user, adv, 10/2007 | ; +-------------------------------------------------------------------------+ ; ; Input MD5 : 7BAE0EF2D8FB15D9CB2668E91A0014A9 ; --------------------------------------------------------------------------- ; File Name : H:\z80driver ; Format : Binary file ; Base Address: 0000h Range: 0000h - 00E2h Loaded length: 00E2h ; Processor : z80 [] ; Target assembler: Zilog Macro Assembler ; =========================================================================== ; Segment type: Regular segment RAM jp loc_46 ; --------------------------------------------------------------------------- db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 byte_39: db 0 ; DATA XREF: RAM:loc_4Cr RAM:0060w ... db 0, 0, 0, 0, 0, 0 byte_40: db 0 ; DATA XREF: RAM:009Fr byte_41: db 0 ; DATA XREF: RAM:0088r RAM:00A3r byte_42: db 0 ; DATA XREF: RAM:008Dr byte_43: db 0 ; DATA XREF: RAM:0077r byte_44: db 0 ; DATA XREF: RAM:007Br byte_45: db 0 ; DATA XREF: RAM:00D0r RAM:00D8r ; --------------------------------------------------------------------------- loc_46: di ; CODE XREF: RAM:0000j im 1 ld sp, 2000h loc_4C: ld a, (byte_39) ; CODE XREF: RAM:0050j RAM:00C7j ... or a jp z, loc_4C ld hl, 3Ah ; ':' ld de, 40h ; '@' ld bc, 5 ldir ld a, 0 ld (byte_39), a ld a, 0B4h ; 'ґ' ld (4002h), a ld a, 0C0h ; 'А' ld (4003h), a ld a, 2Bh ; '+' ld (4000h), a ld a, 80h ; 'Ђ' ld (4001h), a ld a, (byte_43) ld c, a ld a, (byte_44) ld b, a loc_7F: ld a, 6 ; CODE XREF: RAM:00CDj RAM:00DFj loc_81: dec a ; CODE XREF: RAM:0082j jp nz, loc_81 ld hl, 6000h ld a, (byte_41) rlca ld (hl), a ld a, (byte_42) ld (hl), a rrca ld (hl), a rrca ld (hl), a rrca ld (hl), a rrca ld (hl), a rrca ld (hl), a rrca ld (hl), a rrca ld (hl), a ld a, (byte_40) ld l, a ld a, (byte_41) or 80h ; 'Ђ' ld h, a ld a, 2Ah ; '*' ld (4000h), a ld a, (hl) ld (4001h), a ld hl, 40h ; '@' ld a, (hl) add a, 1 ld (hl), a inc hl ld a, (hl) adc a, 0 ld (hl), a inc hl ld a, (hl) adc a, 0 ld (hl), a ld a, (byte_39) or a jp nz, loc_4C dec bc ld a, b or c jp nz, loc_7F ld a, (byte_45) or a jp z, loc_4C dec a ld a, (byte_45) ld b, 0FFh ld c, 0FFh jp loc_7F ; --------------------------------------------------------------------------- --- Конец кода --- Я таким баловался еще 3 года назад: http://tv-games.narod.ru/hwm.htm --- Цитата ---А напоследок интересненькое: как это сделали пока не известно, но эта программа, этот РОМ после загрузки начинает проигрывать какую-то японскую мелодию. Всё это напоминает "русский ответ" на Nick o'DIMM'овским мультики Матрица и Ледниковый период, так что в скором будущем, я надеюсь, на Сеге можно будет просматривать небольшие, но озвученные видеоролики и мультфильмы! Для удобства РОМ разбит на 3 части по 900 Кб. --- Конец цитаты --- http://tv-games.narod.ru/hard/True_sound_player.part1.rar http://tv-games.narod.ru/hard/True_sound_player.part2.rar http://tv-games.narod.ru/hard/True_sound_player.part3.rar Заметь, звук покачественней звучит, хотя все те же 8кГц и 8 бит. Я сначала сделал сжатие динамического диапазона компрессором, т.к. у 8 бит он уже чем у 16 бит. Длительность - 5:40. И заметь, мой драйвер при тех же функциях заметно компактнее: --- Код: ---; ; +-------------------------------------------------------------------------+ ; | This file is generated by The Interactive Disassembler (IDA) | ; | Copyright (c) 2007 by DataRescue sa/nv, <ida@datarescue.com> | ; | Licensed to: GVU, Gerhard Uphoff, 1 user, adv, 10/2007 | ; +-------------------------------------------------------------------------+ ; ; Input MD5 : B3F530BFE8270A4C08A4F4DB8E434D14 ; --------------------------------------------------------------------------- ; File Name : D:\WORK\SEGA\SEGA_MOD\DRIVER.DAT ; Format : Binary file ; Base Address: 0000h Range: 0000h - 0100h Loaded length: 0100h ; Processor : z80 [] ; Target assembler: Zilog Macro Assembler ; =========================================================================== ; Segment type: Regular segment RAM di ld sp, 1FFFh ld a, 0B4h ; '┤' ld (4002h), a ld a, 0C0h ; '└' ld (4003h), a ld a, 2Bh ; '+' ld (4000h), a ld a, 80h ; 'А' ld (4001h), a ld de, 1 loc_1B: ld b, 8 ; CODE XREF: RAM:0046j ld a, e loc_1E: ld (6000h), a ; CODE XREF: RAM:0023j rrca dec b jp nz, loc_1E ld a, d ld (6000h), a ld hl, 8000h loc_2D: ld a, 2Ah ; '*' ; CODE XREF: RAM:0042j ld (4000h), a ld a, (hl) ld (4001h), a ld bc, 0Ah loc_39: dec bc ; CODE XREF: RAM:003Cj ld a, b or c jp nz, loc_39 inc hl ld a, h or l jp nz, loc_2D inc de jp loc_1B --- Конец кода --- |
| Zephyr:
2HardWareMan УГУ, намного компактнее. ИДА значит, да??? Это отладчик и дизасемблер??? Просто слышал но никогда не пользовался, недорос короче... И сколько типов процессоров она знает??? У меня попроще отладчик и дизасемблер AFDPro - 75Кб!!! Писан в 87 году!!! Знает команды до 286 машины!!! Гы...!!! Ну пока учусь - хватает... |
| evgeny:
Zephyr, не хочешь попытаться звуковой движок Соника на basiegaxorz портировать? Он сейчас компилируется как асм. http://evgeny1.land.ru/smus.zip |
| ALEX_230_VOLT:
evgeny, ты гений! Засунуть мультик в сегу - это что то! |
| HardWareMan:
Новый PD-ROM от меня: http://tv-games.ru/modules.php?name=Files&go=show&lid=500 |
| evgeny:
Супер! Я так понимаю ты вытащил движок GEMS. Интересно совпадет ли формат с другими играми имеющий этот движок? Например, Earthworm Jim, Vectorman,WWF Wrestlemania Arcade,Cool Spot,Aladdin... |
| HardWareMan:
--- Цитата: evgeny от 04 Декабрь 2007, 07:19:33 ---Супер! Я так понимаю ты вытащил движок GEMS. Интересно совпадет ли формат с другими играми имеющий этот движок? Например, Earthworm Jim, Vectorman,WWF Wrestlemania Arcade,Cool Spot,Aladdin... --- Конец цитаты --- А че его вытаскивать? Найти место загрузки и выдрать - это самое простое. Надо - берите. Сложнее его ресурсы выдрать. Но тут есть один секрет, который я не расскажу. Говорю вам, это сложный самомодифицирующийся код. Я нашел 4 места, где он меняет себе команды и операнды в командах. А сколько их там еще - неизвестно. Разберетесь с управлением - будет здорово. |
| org:
Исходный код GEMS: http://www.hidden-palace.org/?releases/44 |
| HardWareMan:
--- Код: ---* * stdsetup - setup these regs: * d1 - the old value of wptr * a0 - Z80RAM+$36(wptr) * a1 - Z80RAM+$1A40(fifo) * also save the sr, turns off ints, and holds the z80 * stdsetup move.l (sp)+,a0 ; get the return addr link a6,#0 ; set up the link movem.l d1/a1,-(sp) ; save some regs move.w sr,-(SP) move.l a0,-(sp) ; push the return addr lea Z80RAM+$36,a0 ; a0 points to wptr lea Z80RAM+$1A40,a1 ; a1 points to fifo or.w #$0700,sr ; disable ints move.w #$100,BUSREQ ; Z80 bus request on sslp btst.b #0,BUSREQ ; spin on bus grant bne.s sslp move.b (a0),d1 ; d1 is write index into fifo ext.w d1 ; extend to 16 bits rts --- Конец кода --- Ооо..... Вон оно как... Знакомые структуры! ;) Блин, а я то думал, что за тупой метод работы с драйвером... Про пакетность и все такое я понял, но блин вон откуда ноги растут. Чтож, теперь, я думаю, на этом движке мона много нарипать мелодий и объеденить в РОМ. в 4 мега войдет куча игр... PS От себя добавлю - из всех мною видимых драйверов это САМЫЙ продвинутый и комплексный. Так что его и тока его юзать. Правда, как альтернатива - двигун Shiru тоже ничего, но он SFXы не держит вроде. |
| sergi:
Раз такие все продвинутые быть может кто выдаст информацию общего плана: 1. Какие вообще движки используются в играх 2. Какие компании какие движки юзали 3. Какие движки нужно использовать для своих игр 4. Чем разные движки отличаются друг от друга 5. Какие движки использовались в хитовых играх :? |
| org:
Эту и предыдущую ссылку не так давно давал Санчез: http://gdri.smspower.org/wiki/index.php/Mega_Drive/Genesis_Sound_Engine_List |
| sergi:
Ок - качнул - спасибо Вижу что GEMS во многих хароших играх использовался Ну теперь бы конвертер сделать под каждый движок - даешь wav а на выходе ром на движке Запускаешь и играешь :cool: |
| HardWareMan:
--- Цитата: sergi от 04 Декабрь 2007, 17:18:52 ---Ну теперь бы конвертер сделать под каждый движок - даешь wav а на выходе ром на движке Запускаешь и играешь :cool: --- Конец цитаты --- WAV не сделаешь. А вот MOD/MIDI реально. |
| sergi:
Ну на безрыбье и рак щука Хотя интересно - у сеги же синтезатор - т.е. любой звук может сделать? - wav - особенно человеческую речь жмут же както? - в MK3 тоже GEMS использовали :? |
| HardWareMan:
--- Цитата: sergi от 04 Декабрь 2007, 17:40:33 ---Ну на безрыбье и рак щука Хотя интересно - у сеги же синтезатор - т.е. любой звук может сделать? - wav - особенно человеческую речь жмут же както? - в MK3 тоже GEMS использовали :? --- Конец цитаты --- Это всего ОДИН канал. Что ты еще хочешь? FM у Сеги и баста. |
| sergi:
Ну главное чтобы короче была прога которая конвертит wav в сеговский ром - это круто На Денди я уже говорил что сделали заставочную песню черепашек и ужали в 1 метр под MMC5 маппер Кстати есть ли привязка движка музыки к движку самой игры - ну наверно графики - там же тоже свои методы сжатия информации и размещения ресурсов? Тоже хотелось бы иметь хоть какую инфу Особенно игра DUNE интересует - вроде тоже звук GEMS |
| Навигация |
| Главная страница сообщений |
| Следующая страница |
| Предыдущая страница |