0a3e0c3e |
1 | *-------------------------------------------------------\r |
2 | *\r |
3 | * Sega startup code for the GNU Assembler\r |
4 | * Translated from:\r |
5 | * Sega startup code for the Sozobon C compiler\r |
6 | * Written by Paul W. Lee\r |
7 | * Modified from Charles Coty's code\r |
8 | *\r |
9 | *-------------------------------------------------------\r |
10 | \r |
11 | dc.l 0x0,0x200\r |
12 | dc.l INT,INT,INT,INT,INT,INT,INT\r |
13 | dc.l INT,INT,INT,INT,INT,INT,INT,INT\r |
14 | dc.l INT,INT,INT,INT,INT,INT,INT,INT\r |
15 | dc.l INT,INT,INT,HBL,INT,VBL,INT,INT\r |
16 | dc.l INT,INT,INT,INT,INT,INT,INT,INT\r |
17 | dc.l INT,INT,INT,INT,INT,INT,INT,INT\r |
18 | dc.l INT,INT,INT,INT,INT,INT,INT,INT\r |
19 | dc.l INT,INT,INT,INT,INT,INT,INT\r |
20 | .ascii "SEGA GENESIS "\r |
21 | .ascii "notaz's Shadow / Hilight test "\r |
22 | .ascii "NOTAZ'S SHADOW HILIGHT TEST "\r |
23 | .ascii "GM 00000000-00"\r |
24 | .byte 0xa5,0xfb\r |
25 | .ascii "JD "\r |
26 | .byte 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00\r |
27 | .byte 0x00,0xff,0x00,0x00,0xff,0xff,0xff,0xff\r |
28 | .ascii " "\r |
29 | .ascii " "\r |
30 | .ascii " "\r |
31 | .ascii "JUE "\r |
32 | *debugee:\r |
33 | * bra debugee\r |
34 | tst.l 0xa10008\r |
35 | bne SkipJoyDetect \r |
36 | tst.w 0xa1000c\r |
37 | SkipJoyDetect:\r |
38 | bne SkipSetup\r |
39 | lea Table,%a5 \r |
40 | movem.w (%a5)+,%d5-%d7\r |
41 | movem.l (%a5)+,%a0-%a4 \r |
42 | * Check Version Number \r |
43 | move.b -0x10ff(%a1),%d0\r |
44 | andi.b #0x0f,%d0 \r |
45 | beq WrongVersion \r |
46 | * Sega Security Code (SEGA) \r |
47 | move.l #0x53454741,0x2f00(%a1)\r |
48 | WrongVersion:\r |
49 | move.w (%a4),%d0\r |
50 | moveq #0x00,%d0 \r |
51 | movea.l %d0,%a6 \r |
52 | move %a6,%usp\r |
53 | * Set VDP registers\r |
54 | moveq #0x17,%d1\r |
55 | FillLoop: \r |
56 | move.b (%a5)+,%d5\r |
57 | move.w %d5,(%a4) \r |
58 | add.w %d7,%d5 \r |
59 | dbra %d1,FillLoop \r |
60 | move.l (%a5)+,(%a4) \r |
61 | move.w %d0,(%a3) \r |
62 | move.w %d7,(%a1) \r |
63 | move.w %d7,(%a2) \r |
64 | L0250:\r |
65 | btst %d0,(%a1)\r |
66 | bne L0250 \r |
67 | * Put initial values into a00000 \r |
68 | moveq #0x25,%d2\r |
69 | Filla: \r |
70 | move.b (%a5)+,(%a0)+\r |
71 | dbra %d2,Filla\r |
72 | move.w %d0,(%a2) \r |
73 | move.w %d0,(%a1) \r |
74 | move.w %d7,(%a2) \r |
75 | L0262:\r |
76 | move.l %d0,-(%a6)\r |
77 | dbra %d6,L0262 \r |
78 | move.l (%a5)+,(%a4) \r |
79 | move.l (%a5)+,(%a4) \r |
80 | * Put initial values into c00000 \r |
81 | moveq #0x1f,%d3\r |
82 | Filc0: \r |
83 | move.l %d0,(%a3)\r |
84 | dbra %d3,Filc0\r |
85 | move.l (%a5)+,(%a4) \r |
86 | * Put initial values into c00000 \r |
87 | moveq #0x13,%d4\r |
88 | Fillc1: \r |
89 | move.l %d0,(%a3)\r |
90 | dbra %d4,Fillc1\r |
91 | * Put initial values into c00011 \r |
92 | moveq #0x03,%d5\r |
93 | Fillc2: \r |
94 | move.b (%a5)+,0x0011(%a3) \r |
95 | dbra %d5,Fillc2 \r |
96 | move.w %d0,(%a2) \r |
97 | movem.l (%a6),%d0-%d7/%a0-%a6 \r |
98 | move #0x2700,%sr \r |
99 | SkipSetup:\r |
100 | bra Continue\r |
101 | Table:\r |
102 | dc.w 0x8000, 0x3fff, 0x0100, 0x00a0, 0x0000, 0x00a1, 0x1100, 0x00a1\r |
103 | dc.w 0x1200, 0x00c0, 0x0000, 0x00c0, 0x0004, 0x0414, 0x302c, 0x0754\r |
104 | dc.w 0x0000, 0x0000, 0x0000, 0x812b, 0x0001, 0x0100, 0x00ff, 0xff00 \r |
105 | dc.w 0x0080, 0x4000, 0x0080, 0xaf01, 0xd91f, 0x1127, 0x0021, 0x2600\r |
106 | dc.w 0xf977, 0xedb0, 0xdde1, 0xfde1, 0xed47, 0xed4f, 0xd1e1, 0xf108 \r |
107 | dc.w 0xd9c1, 0xd1e1, 0xf1f9, 0xf3ed, 0x5636, 0xe9e9, 0x8104, 0x8f01 \r |
108 | dc.w 0xc000, 0x0000, 0x4000, 0x0010, 0x9fbf, 0xdfff \r |
109 | \r |
110 | Continue:\r |
111 | tst.w 0x00C00004\r |
112 | \r |
113 | * set stack pointer\r |
114 | * clr.l %a7\r |
115 | move.w #0,%a7\r |
116 | \r |
117 | * user mode\r |
118 | move.w #0x2300,%sr\r |
119 | \r |
120 | * clear Genesis RAM\r |
121 | lea 0xff0000,%a0\r |
122 | moveq #0,%d0\r |
123 | clrram: move.w #0,(%a0)+\r |
124 | subq.w #2,%d0\r |
125 | bne clrram\r |
126 | \r |
127 | *---------------------------------------------------------- \r |
128 | *\r |
129 | * Load driver into the Z80 memory\r |
130 | *\r |
131 | *---------------------------------------------------------- \r |
132 | \r |
133 | * halt the Z80\r |
134 | move.w #0x100,0xa11100\r |
135 | * reset it\r |
136 | move.w #0x100,0xa11200\r |
137 | \r |
138 | lea Z80Driver,%a0\r |
139 | lea 0xa00000,%a1\r |
140 | move.l #Z80DriverEnd,%d0\r |
141 | move.l #Z80Driver,%d1\r |
142 | sub.l %d1,%d0\r |
143 | Z80loop:\r |
144 | move.b (%a0)+,(%a1)+\r |
145 | subq.w #1,%d0\r |
146 | bne Z80loop\r |
147 | \r |
148 | * enable the Z80\r |
149 | move.w #0x0,0xa11100\r |
150 | \r |
151 | *---------------------------------------------------------- \r |
152 | jmp main\r |
153 | \r |
154 | INT: \r |
155 | rte\r |
156 | \r |
157 | HBL:\r |
158 | /* addq.l #1,htimer */\r |
159 | rte\r |
160 | \r |
161 | VBL:\r |
162 | /* addq.l #1,vtimer */\r |
163 | move.l #vtimer,a0\r |
164 | addq.l #1,(a0)\r |
165 | rte\r |
166 | \r |
167 | *------------------------------------------------\r |
168 | *\r |
169 | * Get a random number. This routine\r |
170 | * was found in TOS.\r |
171 | *\r |
172 | * Output\r |
173 | * ------\r |
174 | * d0 = random number\r |
175 | *\r |
176 | *------------------------------------------------\r |
177 | \r |
178 | .globl random\r |
179 | \r |
180 | random:\r |
181 | move.l rand_num,%d0\r |
182 | tst.l %d0\r |
183 | bne .L1\r |
184 | moveq #16,%d1\r |
185 | lsl.l %d1,%d0\r |
186 | or.l htimer,%d0\r |
187 | move.l %d0,rand_num\r |
188 | .L1:\r |
189 | move.l #-1153374675,-(%sp)\r |
190 | move.l rand_num,-(%sp)\r |
191 | bsr lmul\r |
192 | addq.w #8,%sp\r |
193 | addq.l #1,%d0\r |
194 | move.l %d0,rand_num\r |
195 | \r |
196 | lsr.l #8,%d0\r |
197 | and.l #16777215,%d0\r |
198 | rts\r |
199 | \r |
200 | \r |
201 | *------------------------------------------------\r |
202 | *\r |
203 | * Copyright (c) 1988 by Sozobon, Limited. Author: Johann Ruegg\r |
204 | *\r |
205 | * Permission is granted to anyone to use this software for any purpose\r |
206 | * on any computer system, and to redistribute it freely, with the\r |
207 | * following restrictions:\r |
208 | * 1) No charge may be made other than reasonable charges for reproduction.\r |
209 | * 2) Modified versions must be clearly marked as such.\r |
210 | * 3) The authors are not responsible for any harmful consequences\r |
211 | * of using this software, even if they result from defects in it.\r |
212 | *\r |
213 | *------------------------------------------------\r |
214 | \r |
215 | ldiv:\r |
216 | move.l 4(%a7),%d0\r |
217 | bpl ld1\r |
218 | neg.l %d0\r |
219 | ld1:\r |
220 | move.l 8(%a7),%d1\r |
221 | bpl ld2\r |
222 | neg.l %d1\r |
223 | eor.b #0x80,4(%a7)\r |
224 | ld2:\r |
225 | bsr i_ldiv /* d0 = d0/d1 */\r |
226 | tst.b 4(%a7)\r |
227 | bpl ld3\r |
228 | neg.l %d0\r |
229 | ld3:\r |
230 | rts\r |
231 | \r |
232 | lmul:\r |
233 | move.l 4(%a7),%d0\r |
234 | bpl lm1\r |
235 | neg.l %d0\r |
236 | lm1:\r |
237 | move.l 8(%a7),%d1\r |
238 | bpl lm2\r |
239 | neg.l %d1\r |
240 | eor.b #0x80,4(%a7)\r |
241 | lm2:\r |
242 | bsr i_lmul /* d0 = d0*d1 */\r |
243 | tst.b 4(%a7)\r |
244 | bpl lm3\r |
245 | neg.l %d0\r |
246 | lm3:\r |
247 | rts\r |
248 | \r |
249 | lrem:\r |
250 | move.l 4(%a7),%d0\r |
251 | bpl lr1\r |
252 | neg.l %d0\r |
253 | lr1:\r |
254 | move.l 8(%a7),%d1\r |
255 | bpl lr2\r |
256 | neg.l %d1\r |
257 | lr2:\r |
258 | bsr i_ldiv /* d1 = d0%d1 */\r |
259 | move.l %d1,%d0\r |
260 | tst.b 4(%a7)\r |
261 | bpl lr3\r |
262 | neg.l %d0\r |
263 | lr3:\r |
264 | rts\r |
265 | \r |
266 | ldivu:\r |
267 | move.l 4(%a7),%d0\r |
268 | move.l 8(%a7),%d1\r |
269 | bsr i_ldiv\r |
270 | rts\r |
271 | \r |
272 | lmulu:\r |
273 | move.l 4(%a7),%d0\r |
274 | move.l 8(%a7),%d1\r |
275 | bsr i_lmul\r |
276 | rts\r |
277 | \r |
278 | lremu:\r |
279 | move.l 4(%a7),%d0\r |
280 | move.l 8(%a7),%d1\r |
281 | bsr i_ldiv\r |
282 | move.l %d1,%d0\r |
283 | rts\r |
284 | *\r |
285 | * A in d0, B in d1, return A*B in d0\r |
286 | *\r |
287 | i_lmul:\r |
288 | move.l %d3,%a2 /* save d3 */\r |
289 | move.w %d1,%d2\r |
290 | mulu %d0,%d2 /* d2 = Al * Bl */\r |
291 | \r |
292 | move.l %d1,%d3\r |
293 | swap %d3\r |
294 | mulu %d0,%d3 /* d3 = Al * Bh */\r |
295 | \r |
296 | swap %d0\r |
297 | mulu %d1,%d0 /* d0 = Ah * Bl */\r |
298 | \r |
299 | add.l %d3,%d0 /* d0 = (Ah*Bl + Al*Bh) */\r |
300 | swap %d0\r |
301 | clr.w %d0 /* d0 = (Ah*Bl + Al*Bh) << 16 */\r |
302 | \r |
303 | add.l %d2,%d0 /* d0 = A*B */\r |
304 | move.l %a2,%d3 /* restore d3 */\r |
305 | rts\r |
306 | *\r |
307 | *A in d0, B in d1, return A/B in d0, A%B in d1\r |
308 | *\r |
309 | i_ldiv:\r |
310 | tst.l %d1\r |
311 | bne nz1\r |
312 | \r |
313 | * divide by zero\r |
314 | * divu #0,%d0 /* cause trap */\r |
315 | move.l #0x80000000,%d0\r |
316 | move.l %d0,%d1\r |
317 | rts\r |
318 | nz1:\r |
319 | move.l %d3,%a2 /* save d3 */\r |
320 | cmp.l %d1,%d0\r |
321 | bhi norm\r |
322 | beq is1\r |
323 | * A<B, so ret 0, rem A\r |
324 | move.l %d0,%d1\r |
325 | clr.l %d0\r |
326 | move.l %a2,%d3 /* restore d3 */\r |
327 | rts\r |
328 | * A==B, so ret 1, rem 0\r |
329 | is1:\r |
330 | moveq.l #1,%d0\r |
331 | clr.l %d1\r |
332 | move.l %a2,%d3 /* restore d3 */\r |
333 | rts\r |
334 | * A>B and B is not 0\r |
335 | norm:\r |
336 | cmp.l #1,%d1\r |
337 | bne not1\r |
338 | * B==1, so ret A, rem 0\r |
339 | clr.l %d1\r |
340 | move.l %a2,%d3 /* restore d3 */\r |
341 | rts\r |
342 | * check for A short (implies B short also)\r |
343 | not1:\r |
344 | cmp.l #0xffff,%d0\r |
345 | bhi slow\r |
346 | * A short and B short -- use 'divu'\r |
347 | divu %d1,%d0 /* d0 = REM:ANS */\r |
348 | swap %d0 /* d0 = ANS:REM */\r |
349 | clr.l %d1\r |
350 | move.w %d0,%d1 /* d1 = REM */\r |
351 | clr.w %d0\r |
352 | swap %d0\r |
353 | move.l %a2,%d3 /* restore d3 */\r |
354 | rts\r |
355 | * check for B short\r |
356 | slow:\r |
357 | cmp.l #0xffff,%d1\r |
358 | bhi slower\r |
359 | * A long and B short -- use special stuff from gnu\r |
360 | move.l %d0,%d2\r |
361 | clr.w %d2\r |
362 | swap %d2\r |
363 | divu %d1,%d2 /* d2 = REM:ANS of Ahi/B */\r |
364 | clr.l %d3\r |
365 | move.w %d2,%d3 /* d3 = Ahi/B */\r |
366 | swap %d3\r |
367 | \r |
368 | move.w %d0,%d2 /* d2 = REM << 16 + Alo */\r |
369 | divu %d1,%d2 /* d2 = REM:ANS of stuff/B */\r |
370 | \r |
371 | move.l %d2,%d1\r |
372 | clr.w %d1\r |
373 | swap %d1 /* d1 = REM */\r |
374 | \r |
375 | clr.l %d0\r |
376 | move.w %d2,%d0\r |
377 | add.l %d3,%d0 /* d0 = ANS */\r |
378 | move.l %a2,%d3 /* restore d3 */\r |
379 | rts\r |
380 | * A>B, B > 1\r |
381 | slower:\r |
382 | move.l #1,%d2\r |
383 | clr.l %d3\r |
384 | moreadj:\r |
385 | cmp.l %d0,%d1\r |
386 | bhs adj\r |
387 | add.l %d2,%d2\r |
388 | add.l %d1,%d1\r |
389 | bpl moreadj\r |
390 | * we shifted B until its >A or sign bit set\r |
391 | * we shifted #1 (d2) along with it\r |
392 | adj:\r |
393 | cmp.l %d0,%d1\r |
394 | bhi ltuns\r |
395 | or.l %d2,%d3\r |
396 | sub.l %d1,%d0\r |
397 | ltuns:\r |
398 | lsr.l #1,%d1\r |
399 | lsr.l #1,%d2\r |
400 | bne adj\r |
401 | * d3=answer, d0=rem\r |
402 | move.l %d0,%d1\r |
403 | move.l %d3,%d0\r |
404 | move.l %a2,%d3 /* restore d3 */\r |
405 | rts\r |
406 | *---------------------------------------------------------- \r |
407 | *\r |
408 | * Z80 Sound Driver\r |
409 | *\r |
410 | *---------------------------------------------------------- \r |
411 | Z80Driver:\r |
412 | dc.b 0xc3,0x46,0x00,0x00,0x00,0x00,0x00,0x00\r |
413 | dc.b 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00\r |
414 | dc.b 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00\r |
415 | dc.b 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00\r |
416 | dc.b 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00\r |
417 | dc.b 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00\r |
418 | dc.b 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00\r |
419 | dc.b 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00\r |
420 | dc.b 0x00,0x00,0x00,0x00,0x00,0x00,0xf3,0xed\r |
421 | dc.b 0x56,0x31,0x00,0x20,0x3a,0x39,0x00,0xb7\r |
422 | dc.b 0xca,0x4c,0x00,0x21,0x3a,0x00,0x11,0x40\r |
423 | dc.b 0x00,0x01,0x06,0x00,0xed,0xb0,0x3e,0x00\r |
424 | dc.b 0x32,0x39,0x00,0x3e,0xb4,0x32,0x02,0x40\r |
425 | dc.b 0x3e,0xc0,0x32,0x03,0x40,0x3e,0x2b,0x32\r |
426 | dc.b 0x00,0x40,0x3e,0x80,0x32,0x01,0x40,0x3a\r |
427 | dc.b 0x43,0x00,0x4f,0x3a,0x44,0x00,0x47,0x3e\r |
428 | dc.b 0x06,0x3d,0xc2,0x81,0x00,0x21,0x00,0x60\r |
429 | dc.b 0x3a,0x41,0x00,0x07,0x77,0x3a,0x42,0x00\r |
430 | dc.b 0x77,0x0f,0x77,0x0f,0x77,0x0f,0x77,0x0f\r |
431 | dc.b 0x77,0x0f,0x77,0x0f,0x77,0x0f,0x77,0x3a\r |
432 | dc.b 0x40,0x00,0x6f,0x3a,0x41,0x00,0xf6,0x80\r |
433 | dc.b 0x67,0x3e,0x2a,0x32,0x00,0x40,0x7e,0x32\r |
434 | dc.b 0x01,0x40,0x21,0x40,0x00,0x7e,0xc6,0x01\r |
435 | dc.b 0x77,0x23,0x7e,0xce,0x00,0x77,0x23,0x7e\r |
436 | dc.b 0xce,0x00,0x77,0x3a,0x39,0x00,0xb7,0xc2\r |
437 | dc.b 0x4c,0x00,0x0b,0x78,0xb1,0xc2,0x7f,0x00\r |
438 | dc.b 0x3a,0x45,0x00,0xb7,0xca,0x4c,0x00,0x3d\r |
439 | dc.b 0x3a,0x45,0x00,0x06,0xff,0x0e,0xff,0xc3\r |
440 | dc.b 0x7f,0x00\r |
441 | Z80DriverEnd:\r |
442 | \r |
443 | \r |