idc scripts
[megadrive.git] / idc / mida_s68k.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/gfx interrupt");\r
82 CD(0x68, "", "Level 2/md interrupt");\r
83 CD(0x6C, "", "Level 3/timer interrupt");\r
84 CD(0x70, "", "Level 4/cdd interrupt");\r
85 CD(0x74, "", "Level 5/cdc interrupt");\r
86 CD(0x78, "", "Level 6/subcode 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 }\r
141  \r
142 //-------------------------------------------------------------------------\r
143 static MakeIrq(addr,name) {\r
144   MakeName(addr,name);\r
145   //MakeCode(addr);\r
146   MakeFunction(addr,BADADDR);\r
147    Wait( );\r
148 }\r
149 \r
150 static main() {\r
151   auto addr;\r
152   \r
153   SetPrcsr( "68000");\r
154 \r
155   SegCreate(0x000000,0x07FFFF,0,1,0,2);\r
156   SegRename(0x000000,"prg_ram");\r
157 \r
158   SegCreate(0xFE0000,0xFE3FFF,0,1,0,2);\r
159   SegRename(0xFE0000,"bram");\r
160 \r
161   SegCreate(0xFF0000,0xFF3FFF,0,1,0,2);\r
162   SegRename(0xFF0000,"pcm");\r
163 \r
164   SegCreate(0xFF8000,0xFF81FF,0,1,0,2);\r
165   SegRename(0xFF8000,"regs");\r
166   \r
167   mdVector( );\r
168   mdHeader( );\r
169   mdAddress( );\r
170 \r
171   MakeIrq(Dword(0x04), "main");\r
172   MakeIrq(Dword(0x64), "gfx_irq");\r
173   MakeIrq(Dword(0x68), "md_irq");\r
174   MakeIrq(Dword(0x6c), "timer_irq");\r
175   MakeIrq(Dword(0x70), "cdd_irq");\r
176   MakeIrq(Dword(0x74), "cdc_irq");\r
177   MakeIrq(Dword(0x78), "subcode_irq");\r
178 }\r