1894ff1ec53e51e052b2f8a5ee16d609a2b865e2
[megadrive.git] / idc / mida.idc
1 //\r
2 //      IDC File to disassemble Sega Genesis/Megadrive rom\r
3 //      by Kaneda\r
4 //\r
5 //      Useage:\r
6 //        launch IDA with "idag -a -p68000 -Smida.idc"\r
7 //        Select your .bin file\r
8 //        Press OK to the 2 dialog boxes following\r
9 //\r
10 //      0.1 (12 Nov 2004 ): Initial release\r
11 //  0.2 (01 Jun 2005 ): Support for start adress <0x200 (skip header)\r
12 //\r
13 //      Update on http://www.consoledev.fr.st\r
14 //\r
15 \r
16 #include <idc.idc>\r
17 \r
18 //-------------------------------------------------------------------------\r
19 static CW(off,name,cmt) {\r
20   auto x;\r
21   x = off;\r
22   MakeWord(x);\r
23   MakeName(x,name);\r
24   MakeRptCmt(x,cmt);\r
25 }\r
26 \r
27 //-------------------------------------------------------------------------\r
28 static CD(off,name,cmt) {\r
29   auto x;\r
30   x = off;\r
31   MakeDword(x);\r
32   MakeName(x,name);\r
33   MakeRptCmt(x,cmt);\r
34 }\r
35 \r
36 //-------------------------------------------------------------------------\r
37 static CB(off,name,cmt) {\r
38   auto x;\r
39   x = off;\r
40   MakeByte(x);\r
41   MakeName(x,name);\r
42   MakeRptCmt(x,cmt);\r
43 }\r
44 \r
45 static CS(off,end,name,cmt) {\r
46   auto x;\r
47   x = off;\r
48   MakeStr(x, end);\r
49   MakeName(x,name);\r
50   MakeRptCmt(x,cmt);\r
51 }\r
52 \r
53 static mdVector(  ) {\r
54 auto i, addr;\r
55 \r
56 CD(0x00, "initStack", "Initial Stack");\r
57 CD(0x04, "startAddress", "Start Address");\r
58 CD(0x08, "", "Bus Error");\r
59 CD(0x0C, "", "Address Error");\r
60 CD(0x10, "", "Illegal instruction");\r
61 CD(0x14, "", "Zero Divide");\r
62 CD(0x18, "", "CHK instruction");\r
63 CD(0x1C, "", "TRAPV instruction");\r
64 CD(0x20, "", "Privilege Violation");\r
65 CD(0x24, "", "Trace");\r
66 CD(0x28, "", "Line 1010 Emulator");\r
67 CD(0x2C, "", "Line 1111 Emulator");\r
68 CD(0x30, "", "Reserved");\r
69 CD(0x34, "", "Reserved");\r
70 CD(0x38, "", "Reserved");\r
71 CD(0x3C, "", "Unitialized Interrrupt");\r
72 CD(0x40, "", "Reserved");\r
73 CD(0x44, "", "Reserved");\r
74 CD(0x48, "", "Reserved");\r
75 CD(0x4C, "", "Reserved");\r
76 CD(0x50, "", "Reserved");\r
77 CD(0x54, "", "Reserved");\r
78 CD(0x58, "", "Reserved");\r
79 CD(0x5C, "", "Reserved");\r
80 CD(0x60, "", "Spurious Interrupt");\r
81 CD(0x64, "", "Level 1 interrupt");\r
82 CD(0x68, "", "Level 2/External  interrupt");\r
83 CD(0x6C, "", "Level 3 interrupt");\r
84 CD(0x70, "", "Level 4/Horizontal interrupt");\r
85 CD(0x74, "", "Level 5 interrupt");\r
86 CD(0x78, "", "Level 6/Vertical interrupt");\r
87 CD(0x7C,"", "Level 7 interrupt");\r
88 \r
89 i=0x80;\r
90 while (i <= 0xBC){\r
91   CD(i,"", "Trap");\r
92   i = i+1;\r
93 }\r
94 \r
95 i=0xC0;\r
96 while (i <= 0xFF){\r
97   CD(i,"", "Reserved");\r
98   i = i+1;\r
99   }\r
100 \r
101 for ( i=0x08; i< 0x200; i=i+4 ) {\r
102   addr = Dword( i );\r
103   MakeCode(addr);\r
104   }\r
105 }\r
106 \r
107 static mdHeader( ) {\r
108 auto addr;\r
109 \r
110 addr =  Dword( 0x04 );\r
111 if (addr < 0x200)\r
112 {\r
113         Warning("Start address unusual");\r
114     return;\r
115 }\r
116 CS(0x100,0x110,"","");\r
117  CS(0x110,0x120,"","");\r
118  CS(0x120,0x130,"","");\r
119  CS(0x130,0x140,"","");\r
120  CS(0x140,0x150,"","");\r
121  CS(0x150,0x160,"","");\r
122  CS(0x160,0x170,"","");\r
123  CS(0x170,0x180,"","");\r
124  CS(0x180,0x18D,"","Serial Number");\r
125  CW(0x18E, "CheckSum","");\r
126  CS(0x190,0x1A0,"","");\r
127  CD(0x1A0, "RomStartAdr", "Rom Start Adress");\r
128  CD(0x1A4, "RomEndAdr", "Rom End Adress");\r
129  CD(0x1A8, "RamStartAdr", "Ram Start Adress");\r
130  CD(0x1AC, "RamEndAdr", "Ram End Adress");\r
131  CS(0x1B0, 0x1BC, "", "SRam data");\r
132  CS(0x1BC, 0x1C8, "", "Modem data");\r
133  CS(0x1C8, 0x1DC, "", "Memo");\r
134  CS(0x1DC, 0x1F0, "", "");\r
135  CS(0x1F0, 0x200, "Country", "Countries codes");\r
136  }\r
137  \r
138 static mdAddress( ){\r
139  CD(0xC00000, "VDP_Data","");\r
140  CD(0xC00004, "VDP_Control",""); \r
141  CD(0xC00008, "HV_Counter",""); \r
142  CB(0xC00011, "PSG",""); \r
143 \r
144  CW(0xA10001, "HW_Info","7-MODE  (R)  0: Domestic Model\n"\r
145                         "             1: Overseas Model\n"\r
146                         "6-VMOD  (R)  0: NTSC CPU clock 7.67 MHz\n"\r
147                         "             1: PAL CPU clock 7.60 MHz\n"\r
148                         "5-DISK  (R)  0: FDD unit connected\n"\r
149                         "             1: FDD unit not connected\n"\r
150                         "4-RSV   (R)  Currently not used\n"\r
151                         "3-0 VER (R)  MEGA DRIVE version ($0 to $F)");\r
152 \r
153  CW(0xA10003,"DATA1",   "PD7 (RW)\n"\r
154                         "PD6 (RW) TH\n"\r
155                         "PD5 (RW) TR\n"\r
156                         "PD4 (RW) TL\n"\r
157                         "PD3 (RW) RIGHT\n"\r
158                         "PD2 (RW) LEFT\n"\r
159                         "PD1 (RW) DOWN\n"\r
160                         "PDO (RW) UP\n" );\r
161  CW(0xA10005,"DATA2","");\r
162  CW(0xA10007,"DATA3","");\r
163  CW(0xA10009,"CTRL1",   "INT (RW) 0: TH-INT PROHIBITED\n"\r
164                         "         1: TH-INT ALLOWED\n"\r
165                         "PC6 (RW) 0: PD6 INPUT MODE\n"\r
166                         "         1: OUTPUT MODE\n"\r
167                         "PC5 (RW) 0: PD5 INPUT MODE\n"\r
168                         "         1: OUTPUT MODE\n"\r
169                         "PC4 (RW) 0: PD4 INPUT MODE\n"\r
170                         "         1: OUTPUT MODE\n"\r
171                         "PC3 (RW) 0: PD3 INPUT MODE\n"\r
172                         "         1: OUTPUT MODE\n"\r
173                         "PC2 (RW) 0: PD2 INPUT MODE\n"\r
174                         "         1: OUTPUT MODE\n"\r
175                         "PC1 (RW) 0: PD1 INPUT MODE\n"\r
176                         "         1: OUTPUT MODE\n"\r
177                         "PCO (RW) 0: PDO INPUT MODE\n"\r
178                         "         1: OUTPUT MODE");\r
179  CW(0xA1000B,"CTRL2","");\r
180  CW(0xA1000D,"CTRL3","");\r
181  CW(0xA1000F,"TxDATA1","");\r
182  CW(0xA10011,"RxDATA1","");\r
183  CW(0xA10013,"SCTRL1","");\r
184  CW(0xA10015,"TxDATA2","");\r
185  CW(0xA10017,"RxDATA2","");\r
186  CW(0xA10019,"SCTRL2","");\r
187  CW(0xA1001B,"TxDATA3","");\r
188  CW(0xA1001D,"RxDATA3","");\r
189  CW(0xA1001F,"SCTRL3","");\r
190 \r
191  CW(0xA11000,"MemMode", "D8 ( W)   0: ROM MODE\n"\r
192                         "          1: D-RAM MODE");\r
193  \r
194  CW(0xA11100,"Z80BusReq","D8 ( W)   0: BUSREQ CANCEL\n"\r
195                          "          1: BUSREQ REQUEST\n"\r
196                          "   ( R)   0: CPU FUNCTION STOP ACCESSIBLE\n"\r
197                          "          1: FUNCTIONING");\r
198  CW(0xA11200,"Z80BusReset","D8 ( W)   0: RESET REQUEST\n"\r
199                            "          1: RESET CANCEL"); \r
200 }\r
201  \r
202 //-------------------------------------------------------------------------\r
203 static main() {\r
204   auto addr;\r
205   \r
206   SetPrcsr( "68000");\r
207 \r
208   SegCreate(0x000000,0x3FFFFF,0,1,0,2);\r
209   SegRename(0x000000,"ROM");\r
210 \r
211   SegCreate(0xA00000,0xA0FFFF,0,1,0,2);\r
212   SegRename(0xA00000,"Z80");\r
213 \r
214   SegCreate(0xA10000,0xA10FFF,0,1,0,2);\r
215   SegRename(0xA10000,"IO");\r
216 \r
217   SegCreate(0xA11000,0xA11FFF,0,1,0,2);\r
218   SegRename(0xA11000,"Control");\r
219 \r
220   SegCreate(0xC00000,0xDFFFFF,0,1,0,2);\r
221   SegRename(0xC00000,"VDP");\r
222 \r
223   SegCreate(0xFF0000,0xFFFFFF,0,1,0,2);\r
224   SegRename(0xFF0000,"RAM");\r
225   \r
226   mdVector( );\r
227   mdHeader( );\r
228   mdAddress( );\r
229  \r
230   addr =  Dword( 0x04 );\r
231   MakeName(addr,"main");\r
232   //MakeCode(addr);\r
233   MakeFunction(addr,BADADDR);\r
234    Wait( );\r
235    \r
236   addr =  Dword( 0x68 );\r
237   MakeName(addr,"EInt");\r
238   //MakeCode(addr);\r
239   MakeFunction(addr,BADADDR);\r
240   Wait( ); \r
241   \r
242   addr =  Dword( 0x70 );\r
243   MakeName(addr,"HInt");\r
244   //MakeCode(addr);\r
245   MakeFunction(addr,BADADDR);\r
246   Wait( ); \r
247 \r
248   addr =  Dword( 0x78 );\r
249   MakeName(addr,"VInt");\r
250   //MakeCode(addr);\r
251   MakeFunction(addr,BADADDR);\r
252   Wait( );  \r
253 }\r