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

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