Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Так-с, разобрался с многоигровочкой и довольно подробно ее изучил. Составил небольшую карту памяти для ключевых адресов:
- [code]
- $FFFFE0 - Game Id
- $FFEF00 - VBlank Routine
- $FFF03C - VBlank Counter
- $FFFFE8 - Code buffer[/code]
- Самый интересный здесь адрес, который я назвал code buffer'ом. Он начинается с $FFFFE8 и идет до самого конца памяти, в него загружаются jmp-команды, которые ссылаются на: точку входа в РОМ, горизонтальное прерывание, вертикальное прерывание.
- Вот дизасемблированный мной кусок кода, который поясняет эту процедуру:
- [code]ROM:00280156 ; =============== S U B R O U T I N E =======================================
- ROM:00280156
- ROM:00280156 ; Buffer branches to games' code (???)
- ROM:00280156
- ROM:00280156 BufferInitCode: ; CODE XREF: ROM:00280140p
- ROM:00280156 ; ROM:002802C0p
- ROM:00280156 ori #$700,sr
- ROM:0028015A move.w ($FFFFE0).l,d0 ; Load game number
- ROM:00280160 add.w d0,d0
- ROM:00280162 add.w d0,d0
- ROM:00280164 lea RoutinesArray,a0
- ROM:00280168 movea.l (a0,d0.w),a0
- ROM:0028016C lea ($FFFFE8).l,a1
- ROM:00280172 move.l (a0)+,(a1)+
- ROM:00280174 move.l (a0)+,(a1)+
- ROM:00280176 move.l (a0)+,(a1)+
- ROM:00280178 move.l (a0)+,(a1)+
- ROM:0028017A move.l (a0)+,(a1)+
- ROM:0028017C move.l (a0),(a1)
- ROM:0028017E rts
- ROM:0028017E ; End of function BufferInitCode
- ROM:0028017E
- ROM:0028017E ; ---------------------------------------------------------------------------
- ROM:00280180 RoutinesArray: dc.l Routines_ROMLoader ; DATA XREF: BufferInitCode+Eo
- ROM:00280184 dc.l Routines_Sonic1
- ROM:00280188 dc.l Rotuines_Sonic2
- ROM:0028018C dc.l Routines_RobotniksBeanMachine
- ROM:00280190 dc.l Routines_Sonic1
- ROM:00280194 dc.l Rotuines_Sonic2
- ROM:00280198 dc.l Routines_RobotniksBeanMachine
- ROM:0028019C ; ---------------------------------------------------------------------------
- ROM:0028019C
- ROM:0028019C Routines_ROMLoader: ; DATA XREF: ROM:RoutinesArrayo
- ROM:0028019C lea ($FFFFE0).l,sp
- ROM:002801A2 jmp ROMLoader_Entry
- ROM:002801A8 ; ---------------------------------------------------------------------------
- ROM:002801A8 jmp loc_0_2813C4
- ROM:002801AE ; ---------------------------------------------------------------------------
- ROM:002801AE jmp ROMLoader_VBlank
- ROM:002801B4 ; ---------------------------------------------------------------------------
- ROM:002801B4
- ROM:002801B4 Routines_RobotniksBeanMachine: ; DATA XREF: ROM:0028018Co
- ROM:002801B4 ; ROM:00280198o
- ROM:002801B4 lea ($FFFC00).l,sp
- ROM:002801BA jmp loc_0_100200
- ROM:002801C0 ; ---------------------------------------------------------------------------
- ROM:002801C0 jmp loc_0_1007B4
- ROM:002801C6 ; ---------------------------------------------------------------------------
- ROM:002801C6 jmp loc_0_10054E
- ROM:002801CC ; ---------------------------------------------------------------------------
- ROM:002801CC
- ROM:002801CC Routines_Sonic1: ; DATA XREF: ROM:00280184o
- ROM:002801CC ; ROM:00280190o
- ROM:002801CC lea ($FFFE00).l,sp
- ROM:002801D2 jmp loc_0_200216 ; Entry Point
- ROM:002801D8 ; ---------------------------------------------------------------------------
- ROM:002801D8 jmp loc_0_20104E ; HBlank
- ROM:002801DE ; ---------------------------------------------------------------------------
- ROM:002801DE jmp loc_0_200AE0 ; VBlank
- ROM:002801E4 ; ---------------------------------------------------------------------------
- ROM:002801E4
- ROM:002801E4 Rotuines_Sonic2: ; DATA XREF: ROM:00280188o
- ROM:002801E4 ; ROM:00280194o
- ROM:002801E4 lea ($FFFE00).l,sp
- ROM:002801EA jmp (Sonic2_Entry).l
- ROM:002801F0 ; ---------------------------------------------------------------------------
- ROM:002801F0 jmp (loc_0_F1C).l
- ROM:002801F6 ; ---------------------------------------------------------------------------
- ROM:002801F6 jmp (loc_0_3CE).l
- ROM:002801FC ; ---------------------------------------------------------------------------
- [/code]
- После помещения в память команда прыжка на HBlank оказывается в адресе $FFFFF4, а на VBlank - $FFFFFA. И это решение оказалось крутым, потому что векторы процессора ссылаются на эти самые адреса и исполняют код из них.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement