Advertisement
Guest User

Untitled

a guest
Aug 16th, 2017
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.43 KB | None | 0 0
  1. Так-с, разобрался с многоигровочкой и довольно подробно ее изучил. Составил небольшую карту памяти для ключевых адресов:
  2. [code]
  3. $FFFFE0 - Game Id
  4. $FFEF00 - VBlank Routine
  5. $FFF03C - VBlank Counter
  6.  
  7. $FFFFE8 - Code buffer[/code]
  8.  
  9. Самый интересный здесь адрес, который я назвал code buffer'ом. Он начинается с $FFFFE8 и идет до самого конца памяти, в него загружаются jmp-команды, которые ссылаются на: точку входа в РОМ, горизонтальное прерывание, вертикальное прерывание.
  10.  
  11. Вот дизасемблированный мной кусок кода, который поясняет эту процедуру:
  12.  
  13. [code]ROM:00280156 ; =============== S U B R O U T I N E =======================================
  14. ROM:00280156
  15. ROM:00280156 ; Buffer branches to games' code (???)
  16. ROM:00280156
  17. ROM:00280156 BufferInitCode: ; CODE XREF: ROM:00280140p
  18. ROM:00280156 ; ROM:002802C0p
  19. ROM:00280156 ori #$700,sr
  20. ROM:0028015A move.w ($FFFFE0).l,d0 ; Load game number
  21. ROM:00280160 add.w d0,d0
  22. ROM:00280162 add.w d0,d0
  23. ROM:00280164 lea RoutinesArray,a0
  24. ROM:00280168 movea.l (a0,d0.w),a0
  25. ROM:0028016C lea ($FFFFE8).l,a1
  26. ROM:00280172 move.l (a0)+,(a1)+
  27. ROM:00280174 move.l (a0)+,(a1)+
  28. ROM:00280176 move.l (a0)+,(a1)+
  29. ROM:00280178 move.l (a0)+,(a1)+
  30. ROM:0028017A move.l (a0)+,(a1)+
  31. ROM:0028017C move.l (a0),(a1)
  32. ROM:0028017E rts
  33. ROM:0028017E ; End of function BufferInitCode
  34. ROM:0028017E
  35. ROM:0028017E ; ---------------------------------------------------------------------------
  36. ROM:00280180 RoutinesArray: dc.l Routines_ROMLoader ; DATA XREF: BufferInitCode+Eo
  37. ROM:00280184 dc.l Routines_Sonic1
  38. ROM:00280188 dc.l Rotuines_Sonic2
  39. ROM:0028018C dc.l Routines_RobotniksBeanMachine
  40. ROM:00280190 dc.l Routines_Sonic1
  41. ROM:00280194 dc.l Rotuines_Sonic2
  42. ROM:00280198 dc.l Routines_RobotniksBeanMachine
  43. ROM:0028019C ; ---------------------------------------------------------------------------
  44. ROM:0028019C
  45. ROM:0028019C Routines_ROMLoader: ; DATA XREF: ROM:RoutinesArrayo
  46. ROM:0028019C lea ($FFFFE0).l,sp
  47. ROM:002801A2 jmp ROMLoader_Entry
  48. ROM:002801A8 ; ---------------------------------------------------------------------------
  49. ROM:002801A8 jmp loc_0_2813C4
  50. ROM:002801AE ; ---------------------------------------------------------------------------
  51. ROM:002801AE jmp ROMLoader_VBlank
  52. ROM:002801B4 ; ---------------------------------------------------------------------------
  53. ROM:002801B4
  54. ROM:002801B4 Routines_RobotniksBeanMachine: ; DATA XREF: ROM:0028018Co
  55. ROM:002801B4 ; ROM:00280198o
  56. ROM:002801B4 lea ($FFFC00).l,sp
  57. ROM:002801BA jmp loc_0_100200
  58. ROM:002801C0 ; ---------------------------------------------------------------------------
  59. ROM:002801C0 jmp loc_0_1007B4
  60. ROM:002801C6 ; ---------------------------------------------------------------------------
  61. ROM:002801C6 jmp loc_0_10054E
  62. ROM:002801CC ; ---------------------------------------------------------------------------
  63. ROM:002801CC
  64. ROM:002801CC Routines_Sonic1: ; DATA XREF: ROM:00280184o
  65. ROM:002801CC ; ROM:00280190o
  66. ROM:002801CC lea ($FFFE00).l,sp
  67. ROM:002801D2 jmp loc_0_200216 ; Entry Point
  68. ROM:002801D8 ; ---------------------------------------------------------------------------
  69. ROM:002801D8 jmp loc_0_20104E ; HBlank
  70. ROM:002801DE ; ---------------------------------------------------------------------------
  71. ROM:002801DE jmp loc_0_200AE0 ; VBlank
  72. ROM:002801E4 ; ---------------------------------------------------------------------------
  73. ROM:002801E4
  74. ROM:002801E4 Rotuines_Sonic2: ; DATA XREF: ROM:00280188o
  75. ROM:002801E4 ; ROM:00280194o
  76. ROM:002801E4 lea ($FFFE00).l,sp
  77. ROM:002801EA jmp (Sonic2_Entry).l
  78. ROM:002801F0 ; ---------------------------------------------------------------------------
  79. ROM:002801F0 jmp (loc_0_F1C).l
  80. ROM:002801F6 ; ---------------------------------------------------------------------------
  81. ROM:002801F6 jmp (loc_0_3CE).l
  82. ROM:002801FC ; ---------------------------------------------------------------------------
  83. [/code]
  84. После помещения в память команда прыжка на HBlank оказывается в адресе $FFFFF4, а на VBlank - $FFFFFA. И это решение оказалось крутым, потому что векторы процессора ссылаются на эти самые адреса и исполняют код из них.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement