+*-------------------------------------------------------\r
+*\r
+* Sega startup code for the GNU Assembler\r
+* Translated from:\r
+* Sega startup code for the Sozobon C compiler\r
+* Written by Paul W. Lee\r
+* Modified from Charles Coty's code\r
+*\r
+*-------------------------------------------------------\r
+\r
+ dc.l 0x0,0x200\r
+ dc.l INT,INT,INT,INT,INT,INT,INT\r
+ dc.l INT,INT,INT,INT,INT,INT,INT,INT\r
+ dc.l INT,INT,INT,INT,INT,INT,INT,INT\r
+ dc.l INT,INT,INT,HBL,INT,VBL,INT,INT\r
+ dc.l INT,INT,INT,INT,INT,INT,INT,INT\r
+ dc.l INT,INT,INT,INT,INT,INT,INT,INT\r
+ dc.l INT,INT,INT,INT,INT,INT,INT,INT\r
+ dc.l INT,INT,INT,INT,INT,INT,INT\r
+ .ascii "SEGA GENESIS "\r
+ .ascii "notaz's Shadow / Hilight test "\r
+ .ascii "NOTAZ'S SHADOW HILIGHT TEST "\r
+ .ascii "GM 00000000-00"\r
+ .byte 0xa5,0xfb\r
+ .ascii "JD "\r
+ .byte 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00\r
+ .byte 0x00,0xff,0x00,0x00,0xff,0xff,0xff,0xff\r
+ .ascii " "\r
+ .ascii " "\r
+ .ascii " "\r
+ .ascii "JUE "\r
+*debugee:\r
+* bra debugee\r
+ tst.l 0xa10008\r
+ bne SkipJoyDetect \r
+ tst.w 0xa1000c\r
+SkipJoyDetect:\r
+ bne SkipSetup\r
+ lea Table,%a5 \r
+ movem.w (%a5)+,%d5-%d7\r
+ movem.l (%a5)+,%a0-%a4 \r
+* Check Version Number \r
+ move.b -0x10ff(%a1),%d0\r
+ andi.b #0x0f,%d0 \r
+ beq WrongVersion \r
+* Sega Security Code (SEGA) \r
+ move.l #0x53454741,0x2f00(%a1)\r
+WrongVersion:\r
+ move.w (%a4),%d0\r
+ moveq #0x00,%d0 \r
+ movea.l %d0,%a6 \r
+ move %a6,%usp\r
+* Set VDP registers\r
+ moveq #0x17,%d1\r
+FillLoop: \r
+ move.b (%a5)+,%d5\r
+ move.w %d5,(%a4) \r
+ add.w %d7,%d5 \r
+ dbra %d1,FillLoop \r
+ move.l (%a5)+,(%a4) \r
+ move.w %d0,(%a3) \r
+ move.w %d7,(%a1) \r
+ move.w %d7,(%a2) \r
+L0250:\r
+ btst %d0,(%a1)\r
+ bne L0250 \r
+* Put initial values into a00000 \r
+ moveq #0x25,%d2\r
+Filla: \r
+ move.b (%a5)+,(%a0)+\r
+ dbra %d2,Filla\r
+ move.w %d0,(%a2) \r
+ move.w %d0,(%a1) \r
+ move.w %d7,(%a2) \r
+L0262:\r
+ move.l %d0,-(%a6)\r
+ dbra %d6,L0262 \r
+ move.l (%a5)+,(%a4) \r
+ move.l (%a5)+,(%a4) \r
+* Put initial values into c00000 \r
+ moveq #0x1f,%d3\r
+Filc0: \r
+ move.l %d0,(%a3)\r
+ dbra %d3,Filc0\r
+ move.l (%a5)+,(%a4) \r
+* Put initial values into c00000 \r
+ moveq #0x13,%d4\r
+Fillc1: \r
+ move.l %d0,(%a3)\r
+ dbra %d4,Fillc1\r
+* Put initial values into c00011 \r
+ moveq #0x03,%d5\r
+Fillc2: \r
+ move.b (%a5)+,0x0011(%a3) \r
+ dbra %d5,Fillc2 \r
+ move.w %d0,(%a2) \r
+ movem.l (%a6),%d0-%d7/%a0-%a6 \r
+ move #0x2700,%sr \r
+SkipSetup:\r
+ bra Continue\r
+Table:\r
+ dc.w 0x8000, 0x3fff, 0x0100, 0x00a0, 0x0000, 0x00a1, 0x1100, 0x00a1\r
+ dc.w 0x1200, 0x00c0, 0x0000, 0x00c0, 0x0004, 0x0414, 0x302c, 0x0754\r
+ dc.w 0x0000, 0x0000, 0x0000, 0x812b, 0x0001, 0x0100, 0x00ff, 0xff00 \r
+ dc.w 0x0080, 0x4000, 0x0080, 0xaf01, 0xd91f, 0x1127, 0x0021, 0x2600\r
+ dc.w 0xf977, 0xedb0, 0xdde1, 0xfde1, 0xed47, 0xed4f, 0xd1e1, 0xf108 \r
+ dc.w 0xd9c1, 0xd1e1, 0xf1f9, 0xf3ed, 0x5636, 0xe9e9, 0x8104, 0x8f01 \r
+ dc.w 0xc000, 0x0000, 0x4000, 0x0010, 0x9fbf, 0xdfff \r
+\r
+Continue:\r
+ tst.w 0x00C00004\r
+\r
+* set stack pointer\r
+* clr.l %a7\r
+ move.w #0,%a7\r
+\r
+* user mode\r
+ move.w #0x2300,%sr\r
+\r
+* clear Genesis RAM\r
+ lea 0xff0000,%a0\r
+ moveq #0,%d0\r
+clrram: move.w #0,(%a0)+\r
+ subq.w #2,%d0\r
+ bne clrram\r
+\r
+*---------------------------------------------------------- \r
+*\r
+* Load driver into the Z80 memory\r
+*\r
+*---------------------------------------------------------- \r
+\r
+* halt the Z80\r
+ move.w #0x100,0xa11100\r
+* reset it\r
+ move.w #0x100,0xa11200\r
+\r
+ lea Z80Driver,%a0\r
+ lea 0xa00000,%a1\r
+ move.l #Z80DriverEnd,%d0\r
+ move.l #Z80Driver,%d1\r
+ sub.l %d1,%d0\r
+Z80loop:\r
+ move.b (%a0)+,(%a1)+\r
+ subq.w #1,%d0\r
+ bne Z80loop\r
+\r
+* enable the Z80\r
+ move.w #0x0,0xa11100\r
+\r
+*---------------------------------------------------------- \r
+ jmp main\r
+\r
+INT: \r
+ rte\r
+\r
+HBL:\r
+ /* addq.l #1,htimer */\r
+ rte\r
+\r
+VBL:\r
+ /* addq.l #1,vtimer */\r
+ move.l #vtimer,a0\r
+ addq.l #1,(a0)\r
+ rte\r
+\r
+*------------------------------------------------\r
+*\r
+* Get a random number. This routine\r
+* was found in TOS.\r
+*\r
+* Output\r
+* ------\r
+* d0 = random number\r
+*\r
+*------------------------------------------------\r
+\r
+ .globl random\r
+\r
+random:\r
+ move.l rand_num,%d0\r
+ tst.l %d0\r
+ bne .L1\r
+ moveq #16,%d1\r
+ lsl.l %d1,%d0\r
+ or.l htimer,%d0\r
+ move.l %d0,rand_num\r
+.L1:\r
+ move.l #-1153374675,-(%sp)\r
+ move.l rand_num,-(%sp)\r
+ bsr lmul\r
+ addq.w #8,%sp\r
+ addq.l #1,%d0\r
+ move.l %d0,rand_num\r
+\r
+ lsr.l #8,%d0\r
+ and.l #16777215,%d0\r
+ rts\r
+\r
+\r
+*------------------------------------------------\r
+*\r
+* Copyright (c) 1988 by Sozobon, Limited. Author: Johann Ruegg\r
+*\r
+* Permission is granted to anyone to use this software for any purpose\r
+* on any computer system, and to redistribute it freely, with the\r
+* following restrictions:\r
+* 1) No charge may be made other than reasonable charges for reproduction.\r
+* 2) Modified versions must be clearly marked as such.\r
+* 3) The authors are not responsible for any harmful consequences\r
+* of using this software, even if they result from defects in it.\r
+*\r
+*------------------------------------------------\r
+\r
+ldiv:\r
+ move.l 4(%a7),%d0\r
+ bpl ld1\r
+ neg.l %d0\r
+ld1:\r
+ move.l 8(%a7),%d1\r
+ bpl ld2\r
+ neg.l %d1\r
+ eor.b #0x80,4(%a7)\r
+ld2:\r
+ bsr i_ldiv /* d0 = d0/d1 */\r
+ tst.b 4(%a7)\r
+ bpl ld3\r
+ neg.l %d0\r
+ld3:\r
+ rts\r
+\r
+lmul:\r
+ move.l 4(%a7),%d0\r
+ bpl lm1\r
+ neg.l %d0\r
+lm1:\r
+ move.l 8(%a7),%d1\r
+ bpl lm2\r
+ neg.l %d1\r
+ eor.b #0x80,4(%a7)\r
+lm2:\r
+ bsr i_lmul /* d0 = d0*d1 */\r
+ tst.b 4(%a7)\r
+ bpl lm3\r
+ neg.l %d0\r
+lm3:\r
+ rts\r
+\r
+lrem:\r
+ move.l 4(%a7),%d0\r
+ bpl lr1\r
+ neg.l %d0\r
+lr1:\r
+ move.l 8(%a7),%d1\r
+ bpl lr2\r
+ neg.l %d1\r
+lr2:\r
+ bsr i_ldiv /* d1 = d0%d1 */\r
+ move.l %d1,%d0\r
+ tst.b 4(%a7)\r
+ bpl lr3\r
+ neg.l %d0\r
+lr3:\r
+ rts\r
+\r
+ldivu:\r
+ move.l 4(%a7),%d0\r
+ move.l 8(%a7),%d1\r
+ bsr i_ldiv\r
+ rts\r
+\r
+lmulu:\r
+ move.l 4(%a7),%d0\r
+ move.l 8(%a7),%d1\r
+ bsr i_lmul\r
+ rts\r
+\r
+lremu:\r
+ move.l 4(%a7),%d0\r
+ move.l 8(%a7),%d1\r
+ bsr i_ldiv\r
+ move.l %d1,%d0\r
+ rts\r
+*\r
+* A in d0, B in d1, return A*B in d0\r
+*\r
+i_lmul:\r
+ move.l %d3,%a2 /* save d3 */\r
+ move.w %d1,%d2\r
+ mulu %d0,%d2 /* d2 = Al * Bl */\r
+\r
+ move.l %d1,%d3\r
+ swap %d3\r
+ mulu %d0,%d3 /* d3 = Al * Bh */\r
+\r
+ swap %d0\r
+ mulu %d1,%d0 /* d0 = Ah * Bl */\r
+\r
+ add.l %d3,%d0 /* d0 = (Ah*Bl + Al*Bh) */\r
+ swap %d0\r
+ clr.w %d0 /* d0 = (Ah*Bl + Al*Bh) << 16 */\r
+\r
+ add.l %d2,%d0 /* d0 = A*B */\r
+ move.l %a2,%d3 /* restore d3 */\r
+ rts\r
+*\r
+*A in d0, B in d1, return A/B in d0, A%B in d1\r
+*\r
+i_ldiv:\r
+ tst.l %d1\r
+ bne nz1\r
+\r
+* divide by zero\r
+* divu #0,%d0 /* cause trap */\r
+ move.l #0x80000000,%d0\r
+ move.l %d0,%d1\r
+ rts\r
+nz1:\r
+ move.l %d3,%a2 /* save d3 */\r
+ cmp.l %d1,%d0\r
+ bhi norm\r
+ beq is1\r
+* A<B, so ret 0, rem A\r
+ move.l %d0,%d1\r
+ clr.l %d0\r
+ move.l %a2,%d3 /* restore d3 */\r
+ rts\r
+* A==B, so ret 1, rem 0\r
+is1:\r
+ moveq.l #1,%d0\r
+ clr.l %d1\r
+ move.l %a2,%d3 /* restore d3 */\r
+ rts\r
+* A>B and B is not 0\r
+norm:\r
+ cmp.l #1,%d1\r
+ bne not1\r
+* B==1, so ret A, rem 0\r
+ clr.l %d1\r
+ move.l %a2,%d3 /* restore d3 */\r
+ rts\r
+* check for A short (implies B short also)\r
+not1:\r
+ cmp.l #0xffff,%d0\r
+ bhi slow\r
+* A short and B short -- use 'divu'\r
+ divu %d1,%d0 /* d0 = REM:ANS */\r
+ swap %d0 /* d0 = ANS:REM */\r
+ clr.l %d1\r
+ move.w %d0,%d1 /* d1 = REM */\r
+ clr.w %d0\r
+ swap %d0\r
+ move.l %a2,%d3 /* restore d3 */\r
+ rts\r
+* check for B short\r
+slow:\r
+ cmp.l #0xffff,%d1\r
+ bhi slower\r
+* A long and B short -- use special stuff from gnu\r
+ move.l %d0,%d2\r
+ clr.w %d2\r
+ swap %d2\r
+ divu %d1,%d2 /* d2 = REM:ANS of Ahi/B */\r
+ clr.l %d3\r
+ move.w %d2,%d3 /* d3 = Ahi/B */\r
+ swap %d3\r
+\r
+ move.w %d0,%d2 /* d2 = REM << 16 + Alo */\r
+ divu %d1,%d2 /* d2 = REM:ANS of stuff/B */\r
+\r
+ move.l %d2,%d1\r
+ clr.w %d1\r
+ swap %d1 /* d1 = REM */\r
+\r
+ clr.l %d0\r
+ move.w %d2,%d0\r
+ add.l %d3,%d0 /* d0 = ANS */\r
+ move.l %a2,%d3 /* restore d3 */\r
+ rts\r
+* A>B, B > 1\r
+slower:\r
+ move.l #1,%d2\r
+ clr.l %d3\r
+moreadj:\r
+ cmp.l %d0,%d1\r
+ bhs adj\r
+ add.l %d2,%d2\r
+ add.l %d1,%d1\r
+ bpl moreadj\r
+* we shifted B until its >A or sign bit set\r
+* we shifted #1 (d2) along with it\r
+adj:\r
+ cmp.l %d0,%d1\r
+ bhi ltuns\r
+ or.l %d2,%d3\r
+ sub.l %d1,%d0\r
+ltuns:\r
+ lsr.l #1,%d1\r
+ lsr.l #1,%d2\r
+ bne adj\r
+* d3=answer, d0=rem\r
+ move.l %d0,%d1\r
+ move.l %d3,%d0\r
+ move.l %a2,%d3 /* restore d3 */\r
+ rts\r
+*---------------------------------------------------------- \r
+*\r
+* Z80 Sound Driver\r
+*\r
+*---------------------------------------------------------- \r
+Z80Driver:\r
+ dc.b 0xc3,0x46,0x00,0x00,0x00,0x00,0x00,0x00\r
+ dc.b 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00\r
+ dc.b 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00\r
+ dc.b 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00\r
+ dc.b 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00\r
+ dc.b 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00\r
+ dc.b 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00\r
+ dc.b 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00\r
+ dc.b 0x00,0x00,0x00,0x00,0x00,0x00,0xf3,0xed\r
+ dc.b 0x56,0x31,0x00,0x20,0x3a,0x39,0x00,0xb7\r
+ dc.b 0xca,0x4c,0x00,0x21,0x3a,0x00,0x11,0x40\r
+ dc.b 0x00,0x01,0x06,0x00,0xed,0xb0,0x3e,0x00\r
+ dc.b 0x32,0x39,0x00,0x3e,0xb4,0x32,0x02,0x40\r
+ dc.b 0x3e,0xc0,0x32,0x03,0x40,0x3e,0x2b,0x32\r
+ dc.b 0x00,0x40,0x3e,0x80,0x32,0x01,0x40,0x3a\r
+ dc.b 0x43,0x00,0x4f,0x3a,0x44,0x00,0x47,0x3e\r
+ dc.b 0x06,0x3d,0xc2,0x81,0x00,0x21,0x00,0x60\r
+ dc.b 0x3a,0x41,0x00,0x07,0x77,0x3a,0x42,0x00\r
+ dc.b 0x77,0x0f,0x77,0x0f,0x77,0x0f,0x77,0x0f\r
+ dc.b 0x77,0x0f,0x77,0x0f,0x77,0x0f,0x77,0x3a\r
+ dc.b 0x40,0x00,0x6f,0x3a,0x41,0x00,0xf6,0x80\r
+ dc.b 0x67,0x3e,0x2a,0x32,0x00,0x40,0x7e,0x32\r
+ dc.b 0x01,0x40,0x21,0x40,0x00,0x7e,0xc6,0x01\r
+ dc.b 0x77,0x23,0x7e,0xce,0x00,0x77,0x23,0x7e\r
+ dc.b 0xce,0x00,0x77,0x3a,0x39,0x00,0xb7,0xc2\r
+ dc.b 0x4c,0x00,0x0b,0x78,0xb1,0xc2,0x7f,0x00\r
+ dc.b 0x3a,0x45,0x00,0xb7,0xca,0x4c,0x00,0x3d\r
+ dc.b 0x3a,0x45,0x00,0x06,0xff,0x0e,0xff,0xc3\r
+ dc.b 0x7f,0x00\r
+Z80DriverEnd:\r
+\r
+\r