| SEGA 32X support code for the 68000 | by Chilly Willy | Third part of rom header .text | Standard Mars startup code at 0x3F0 - this is included as binary as SEGA | uses this as a security key. US law allows us to include this as-is because | it's used for security. The interoperability clauses in the law state this | trumps copyright... and the Supreme Court agrees. :P .word 0x287C,0xFFFF,0xFFC0,0x23FC,0x0000,0x0000,0x00A1,0x5128 .word 0x46FC,0x2700,0x4BF9,0x00A1,0x0000,0x7001,0x0CAD,0x4D41 .word 0x5253,0x30EC,0x6600,0x03E6,0x082D,0x0007,0x5101,0x67F8 .word 0x4AAD,0x0008,0x6710,0x4A6D,0x000C,0x670A,0x082D,0x0000 .word 0x5101,0x6600,0x03B8,0x102D,0x0001,0x0200,0x000F,0x6706 .word 0x2B78,0x055A,0x4000,0x7200,0x2C41,0x4E66,0x41F9,0x0000 .word 0x04D4,0x6100,0x0152,0x6100,0x0176,0x47F9,0x0000,0x04E8 .word 0x43F9,0x00A0,0x0000,0x45F9,0x00C0,0x0011,0x3E3C,0x0100 .word 0x7000,0x3B47,0x1100,0x3B47,0x1200,0x012D,0x1100,0x66FA .word 0x7425,0x12DB,0x51CA,0xFFFC,0x3B40,0x1200,0x3B40,0x1100 .word 0x3B47,0x1200,0x149B,0x149B,0x149B,0x149B,0x41F9,0x0000 .word 0x04C0,0x43F9,0x00FF,0x0000,0x22D8,0x22D8,0x22D8,0x22D8 .word 0x22D8,0x22D8,0x22D8,0x22D8,0x41F9,0x00FF,0x0000,0x4ED0 .word 0x1B7C,0x0001,0x5101,0x41F9,0x0000,0x06BC,0xD1FC,0x0088 .word 0x0000,0x4ED0,0x0404,0x303C,0x076C,0x0000,0x0000,0xFF00 .word 0x8137,0x0002,0x0100,0x0000,0xAF01,0xD91F,0x1127,0x0021 .word 0x2600,0xF977,0xEDB0,0xDDE1,0xFDE1,0xED47,0xED4F,0xD1E1 .word 0xF108,0xD9C1,0xD1E1,0xF1F9,0xF3ED,0x5636,0xE9E9,0x9FBF .word 0xDFFF,0x4D41,0x5253,0x2049,0x6E69,0x7469,0x616C,0x2026 .word 0x2053,0x6563,0x7572,0x6974,0x7920,0x5072,0x6F67,0x7261 .word 0x6D20,0x2020,0x2020,0x2020,0x2020,0x2043,0x6172,0x7472 .word 0x6964,0x6765,0x2056,0x6572,0x7369,0x6F6E,0x2020,0x2020 .word 0x436F,0x7079,0x7269,0x6768,0x7420,0x5345,0x4741,0x2045 .word 0x4E54,0x4552,0x5052,0x4953,0x4553,0x2C4C,0x5444,0x2E20 .word 0x3139,0x3934,0x2020,0x2020,0x2020,0x2020,0x2020,0x2020 .word 0x2020,0x2020,0x2020,0x2020,0x2020,0x2020,0x2020,0x2020 .word 0x2020,0x2020,0x2020,0x524F,0x4D20,0x5665,0x7273,0x696F .word 0x6E20,0x312E,0x3000,0x48E7,0xC040,0x43F9,0x00C0,0x0004 .word 0x3011,0x303C,0x8000,0x323C,0x0100,0x3E3C,0x0012,0x1018 .word 0x3280,0xD041,0x51CF,0xFFF8,0x4CDF,0x0203,0x4E75,0x48E7 .word 0x81C0,0x41F9,0x0000,0x063E,0x43F9,0x00C0,0x0004,0x3298 .word 0x3298,0x3298,0x3298,0x3298,0x3298,0x3298,0x2298,0x3341 .word 0xFFFC,0x3011,0x0800,0x0001,0x66F8,0x3298,0x3298,0x7000 .word 0x22BC,0xC000,0x0000,0x7E0F,0x3340,0xFFFC,0x3340,0xFFFC .word 0x3340,0xFFFC,0x3340,0xFFFC,0x51CF,0xFFEE,0x22BC,0x4000 .word 0x0010,0x7E09,0x3340,0xFFFC,0x3340,0xFFFC,0x3340,0xFFFC .word 0x3340,0xFFFC,0x51CF,0xFFEE,0x4CDF,0x0381,0x4E75,0x8114 .word 0x8F01,0x93FF,0x94FF,0x9500,0x9600,0x9780,0x4000,0x0080 .word 0x8104,0x8F02,0x48E7,0xC140,0x43F9,0x00A1,0x5180,0x08A9 .word 0x0007,0xFF80,0x66F8,0x3E3C,0x00FF,0x7000,0x7200,0x337C .word 0x00FF,0x0004,0x3341,0x0006,0x3340,0x0008,0x4E71,0x0829 .word 0x0001,0x000B,0x66F8,0x0641,0x0100,0x51CF,0xFFE8,0x4CDF .word 0x0283,0x4E75,0x48E7,0x8180,0x41F9,0x00A1,0x5200,0x08A8 .word 0x0007,0xFF00,0x66F8,0x3E3C,0x001F,0x20C0,0x20C0,0x20C0 .word 0x20C0,0x51CF,0xFFF6,0x4CDF,0x0181,0x4E75,0x41F9,0x00FF .word 0x0000,0x3E3C,0x07FF,0x7000,0x20C0,0x20C0,0x20C0,0x20C0 .word 0x20C0,0x20C0,0x20C0,0x20C0,0x51CF,0xFFEE,0x3B7C,0x0000 .word 0x1200,0x7E0A,0x51CF,0xFFFE,0x43F9,0x00A1,0x5100,0x7000 .word 0x2340,0x0020,0x2340,0x0024,0x1B7C,0x0003,0x5101,0x2E79 .word 0x0088,0x0000,0x0891,0x0007,0x66FA,0x7000,0x3340,0x0002 .word 0x3340,0x0004,0x3340,0x0006,0x2340,0x0008,0x2340,0x000C .word 0x3340,0x0010,0x3340,0x0030,0x3340,0x0032,0x3340,0x0038 .word 0x3340,0x0080,0x3340,0x0082,0x08A9,0x0000,0x008B,0x66F8 .word 0x6100,0xFF12,0x08E9,0x0000,0x008B,0x67F8,0x6100,0xFF06 .word 0x08A9,0x0000,0x008B,0x6100,0xFF3C,0x303C,0x0040,0x2229 .word 0x0020,0x0C81,0x5351,0x4552,0x6700,0x0092,0x303C,0x0080 .word 0x2229,0x0020,0x0C81,0x5344,0x4552,0x6700,0x0080,0x21FC .word 0x0088,0x02A2,0x0070,0x303C,0x0002,0x7200,0x122D,0x0001 .word 0x1429,0x0080,0xE14A,0x8242,0x0801,0x000F,0x660A,0x0801 .word 0x0006,0x6700,0x0058,0x6008,0x0801,0x0006,0x6600,0x004E .word 0x7020,0x41F9,0x0088,0x0000,0x3C28,0x018E,0x4A46,0x6700 .word 0x0010,0x3429,0x0028,0x0C42,0x0000,0x67F6,0xB446,0x662C .word 0x7000,0x2340,0x0028,0x2340,0x002C,0x3E14,0x2C7C,0xFFFF .word 0xFFC0,0x4CD6,0x7FF9,0x44FC,0x0000,0x6014,0x43F9,0x00A1 .word 0x5100,0x3340,0x0006,0x303C,0x8000,0x6004,0x44FC,0x0001 | At this point (0x800), the Work RAM is clear, the VDP initialized, the | VRAM/VSRAM/CRAM cleared, the Z80 initialized, the 32X initialized, | both 32X framebuffers cleared, the 32X palette cleared, the SH2s | checked for a startup error, the adapter TV mode matches the MD TV | mode, and the ROM checksum checked. If any error is detected, the | carry is set, otherwise it is cleared. The 68000 main code is now | entered. jmp __start+0x00880000+0x3F0 | 68000 General exception handler at 0x806 jmp __except+0x00880000+0x3F0 | 68000 Level 4 interrupt handler at 0x80C - HBlank IRQ jmp __hblank+0x00880000+0x3F0 | 68000 Level 6 interrupt handler at 0x812 - VBlank IRQ jmp __vblank+0x00880000+0x3F0 __except: move.l d0,-(sp) move.l 4(sp),d0 /* jump table return address */ sub.w #0x206,d0 /* 0 = BusError, 6 = AddrError, etc */ | handle exception move.l (sp)+,d0 addq.l #4,sp /* pop jump table return address */ rte __hblank: rte __vblank: move.l d0,-(sp) move.l 0xFF0FFC,d0 beq.b 1f move.l a0,-(sp) movea.l d0,a0 jmp (a0) 1: move.l (sp)+,d0 rte __start: move.b #0,0xA15107 /* clear RV - allow SH2 to access ROM */ 0: cmp.l #0x4D5F4F4B,0xA15120 /* M_OK */ bne.b 0b /* wait for master ok */ 1: cmp.l #0x535F4F4B,0xA15124 /* S_OK */ bne.b 1b /* wait for slave ok */ bsr init_hardware /* initialize the console hardware */ | Copy 68000 main loop to Work RAM to keep contention for the ROM with | SH2s to a minimum. lea __m68k_start(pc),a0 lea 0x00FF1000,a1 move.w #__m68k_end-__m68k_start-1,d0 cpyloop: move.b (a0)+,(a1)+ dbra d0,cpyloop move.w #0,0xA15128 /* controller 1 */ move.w #0,0xA1512A /* controller 2 */ | look for mouse lea 0xA10003,a0 0: bsr get_mky cmpi.l #-2,d0 beq.b 0b /* timeout */ cmpi.l #-1,d0 beq.b 1f /* no mouse */ move.w #0xF001,0xA15128 /* mouse in port 1 */ 1: lea 2(a0),a0 2: bsr get_mky cmpi.l #-2,d0 beq.b 2b /* timeout */ cmpi.l #-1,d0 beq.b 3f /* no mouse */ move.w #0xF001,0xA1512A /* mouse in port 2 */ 3: move.l #0,0xA1512C /* clear the vblank count */ | jump to main loop in Work RAM jmp 0xFF1000.l | this block of code must be pc relative as it's copied into Work RAM __m68k_start: move.b #1,0xA15107 /* set RV */ move.b #2,0xA130F1 /* SRAM disabled, write protected */ move.b #0,0xA15107 /* clear RV */ move.w 0xA15100,d0 or.w #0x8000,d0 move.w d0,0xA15100 /* set FM - allow SH2 access to MARS hw */ move.l #0,0xA15120 /* let Master SH2 run */ lea vert_blank(pc),a0 move.l a0,0xFF0FFC /* set vertical blank interrupt handler */ move.w #0x2000,sr /* enable interrupts */ main_loop: move.w 0xA15120,d0 /* get COMM0 */ bne.b handle_req | any other 68000 tasks here bra.b main_loop | process request from Master SH2 handle_req: cmpi.w #0x01FF,d0 bls read_sram cmpi.w #0x02FF,d0 bls write_sram cmpi.w #0x03FF,d0 bls read_mouse cmpi.w #0x04FF,d0 bls clear_screen cmpi.w #0x05FF,d0 bls set_offset cmpi.w #0x06FF,d0 bls set_ntable cmpi.w #0x07FF,d0 bls set_vram | unknown command move.w #0,0xA15120 /* done */ bra.b main_loop read_sram: move.w #0x2700,sr /* disable ints */ moveq #0,d1 moveq #0,d0 move.w 0xA15122,d0 /* COMM2 holds offset */ add.l d0,d0 /* sram is every other byte */ lea 0x200000,a0 move.b #1,0xA15107 /* set RV */ move.b #3,0xA130F1 /* SRAM enabled, write protected */ move.b 1(a0,d0.l),d1 /* read SRAM */ move.b #2,0xA130F1 /* SRAM disabled, write protected */ move.b #0,0xA15107 /* clear RV */ move.w d1,0xA15122 /* COMM2 holds return byte */ move.w #0,0xA15120 /* done */ move.w #0x2000,sr /* enable ints */ bra main_loop write_sram: move.w #0x2700,sr /* disable ints */ moveq #0,d1 move.w 0xA15122,d1 /* COMM2 holds offset */ add.l d1,d1 /* sram is every other byte */ lea 0x200000,a0 move.b #1,0xA15107 /* set RV */ move.b #1,0xA130F1 /* SRAM enabled, write enabled */ move.b d0,1(a0,d1.l) /* write SRAM */ move.b #2,0xA130F1 /* SRAM disabled, write protected */ move.b #0,0xA15107 /* clear RV */ move.w #0,0xA15120 /* done */ move.w #0x2000,sr /* enable ints */ bra main_loop read_mouse: tst.b d0 bne.b 1f /* skip port 1 */ move.w 0xA15128,d0 andi.w #0xF001,d0 cmpi.w #0xF001,d0 bne.b 1f /* no mouse in port 1 */ lea 0xA10003,a0 bsr get_mky bset #31,d0 move.w d0,0xA15122 swap d0 move.w d0,0xA15120 0: move.w 0xA15120,d0 bne.b 0b /* wait for SH2 to read mouse value */ bra main_loop 1: move.w 0xA1512A,d0 andi.w #0xF001,d0 cmpi.w #0xF001,d0 bne.b 3f /* no mouse in port 2 */ lea 0xA10005,a0 bsr get_mky bset #31,d0 move.w d0,0xA15122 swap d0 move.w d0,0xA15120 2: move.w 0xA15120,d0 bne.b 2b /* wait for SH2 to read mouse value */ bra main_loop 3: move.l #-1,d0 /* no mouse */ move.w d0,0xA15122 swap d0 move.w d0,0xA15120 4: move.w 0xA15120,d0 bne.b 4b /* wait for SH2 to read mouse value */ bra main_loop clear_screen: moveq #0,d0 lea 0xC00000,a0 move.w #0x8F02,4(a0) /* set INC to 2 */ move.l #0x60000003,d1 /* VDP write VRAM at 0xE000 (scroll plane B) */ move.l d1,4(a0) /* write VRAM at plane B start */ move.w #64*32-1,d1 1: move.w d0,(a0) /* clear name pattern */ dbra d1,1b move.w #0,0xA15120 /* done */ bra main_loop set_offset: moveq #0,d7 move.w 0xA15122,d7 /* offset */ move.w #0,0xA15120 /* done */ bra main_loop set_ntable: lea 0xC00000,a1 move.w #0x8F02,4(a1) /* set INC to 2 */ move.l d7,d2 /* name table offset */ swap d2 ori.l #0x60000003,d2 /* OR cursor with VDP write VRAM at 0xE000 (scroll plane B) */ move.l d2,4(a1) /* write VRAM at location of cursor in plane B */ move.w 0xA15122,d0 /* pattern name */ move.w d0,(a1) /* set pattern name for character */ addq.l #2,d7 /* increment offset */ move.w #0,0xA15120 /* done */ bra main_loop set_vram: lea 0xC00000,a1 move.w #0x8F02,4(a1) /* set INC to 2 */ move.l d7,d2 /* vram offset */ swap d2 rol.l #2,d2 lsl.w #2,d2 lsr.l #2,d2 ori.l #0x40000000,d2 /* VDP write VRAM */ move.l d2,4(a1) /* write VRAM at location of cursor in plane B */ move.w 0xA15122,d0 /* data word */ move.w d0,(a1) /* set vram word */ addq.l #2,d7 /* increment offset */ move.w #0,0xA15120 /* done */ bra main_loop vert_blank: move.l d1,-(sp) move.l d2,-(sp) /* read controllers */ move.w 0xA15128,d0 andi.w #0xF000,d0 cmpi.w #0xF000,d0 beq.b 0f /* no pad in port 1 (or mouse) */ lea 0xA10003,a0 bsr.b get_pad move.w d2,0xA15128 /* controller 1 current value */ 0: move.w 0xA1512A,d0 andi.w #0xF000,d0 cmpi.w #0xF000,d0 beq.b 1f /* no pad in port 2 (or mouse) */ lea 0xA10005,a0 bsr.b get_pad move.w d2,0xA1512A /* controller 2 current value */ 1: move.l 0xA1512C,d0 addq.l #1,d0 move.l d0,0xA1512C /* increment the vblank count */ move.l (sp)+,d2 move.l (sp)+,d1 movea.l (sp)+,a0 move.l (sp)+,d0 rte | get current pad value | entry: a0 = pad control port | exit: d2 = pad value (0 0 0 1 M X Y Z S A C B R L D U) or (0 0 0 0 0 0 0 0 S A C B R L D U) get_pad: bsr.b get_input /* - 0 s a 0 0 d u - 1 c b r l d u */ move.w d0,d1 andi.w #0x0C00,d0 bne.b no_pad bsr.b get_input /* - 0 s a 0 0 d u - 1 c b r l d u */ bsr.b get_input /* - 0 s a 0 0 0 0 - 1 c b m x y z */ move.w d0,d2 bsr.b get_input /* - 0 s a 1 1 1 1 - 1 c b r l d u */ andi.w #0x0F00,d0 /* 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 */ cmpi.w #0x0F00,d0 beq.b common /* six button pad */ move.w #0x010F,d2 /* three button pad */ common: lsl.b #4,d2 /* - 0 s a 0 0 0 0 m x y z 0 0 0 0 */ lsl.w #4,d2 /* 0 0 0 0 m x y z 0 0 0 0 0 0 0 0 */ andi.w #0x303F,d1 /* 0 0 s a 0 0 0 0 0 0 c b r l d u */ move.b d1,d2 /* 0 0 0 0 m x y z 0 0 c b r l d u */ lsr.w #6,d1 /* 0 0 0 0 0 0 0 0 s a 0 0 0 0 0 0 */ or.w d1,d2 /* 0 0 0 0 m x y z s a c b r l d u */ eori.w #0x1FFF,d2 /* 0 0 0 1 M X Y Z S A C B R L D U */ rts no_pad: .ifdef HAS_SMS_PAD move.b (a0),d0 /* - 1 c b r l d u */ andi.w #0x003F,d0 /* 0 0 0 0 0 0 0 0 0 0 c b r l d u */ eori.w #0x003F,d0 /* 0 0 0 0 0 0 0 0 0 0 C B R L D U */ .else move.w #0xF000,d0 /* SEGA_CTRL_NONE */ .endif rts | read single phase from controller get_input: move.b #0x00,(a0) nop nop move.b (a0),d0 move.b #0x40,(a0) lsl.w #8,d0 move.b (a0),d0 rts | get current mouse value | entry: a0 = mouse control port | exit: d0 = mouse value (0 0 0 0 0 0 0 0 YO XO YS XS S M R L X7 X6 X5 X4 X3 X2 X1 X0 Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0) or -2 (timeout) or -1 (no mouse) get_mky: move.w sr,d2 move.w #0x2700,sr /* disable ints */ move.b #0x60,6(a0) /* set direction bits */ nop nop move.b #0x60,(a0) /* first phase of mouse packet */ nop nop 0: btst #4,(a0) beq.b 0b /* wait on handshake */ move.b (a0),d0 andi.b #15,d0 bne mky_err /* not 0 means not mouse */ move.b #0x20,(a0) /* next phase */ move.w #254,d1 /* number retries before timeout */ 1: btst #4,(a0) bne.b 2f /* handshake */ dbra d1,1b bra timeout_err 2: move.b (a0),d0 andi.b #15,d0 move.b #0,(a0) /* next phase */ cmpi.b #11,d0 bne mky_err /* not 11 means not mouse */ 3: btst #4,(a0) beq.b 4f /* handshake */ dbra d1,3b bra timeout_err 4: move.b (a0),d0 /* specs say should be 15 */ nop nop move.b #0x20,(a0) /* next phase */ nop nop 5: btst #4,(a0) bne.b 6f dbra d1,5b bra timeout_err 6: move.b (a0),d0 /* specs say should be 15 */ nop nop move.b #0,(a0) /* next phase */ moveq #0,d0 /* clear reg to hold packet */ nop 7: btst #4,(a0) beq.b 8f /* handshake */ dbra d1,7b bra timeout_err 8: move.b (a0),d0 /* YO XO YS XS */ move.b #0x20,(a0) /* next phase */ lsl.w #8,d0 /* save nibble */ 9: btst #4,(a0) bne.b 10f /* handshake */ dbra d1,9b bra timeout_err 10: move.b (a0),d0 /* S M R L */ move.b #0,(a0) /* next phase */ lsl.b #4,d0 /* YO XO YS XS S M R L 0 0 0 0 */ lsl.l #4,d0 /* YO XO YS XS S M R L 0 0 0 0 0 0 0 0 */ 11: btst #4,(a0) beq.b 12f /* handshake */ dbra d1,11b bra timeout_err 12: move.b (a0),d0 /* X7 X6 X5 X4 */ move.b #0x20,(a0) /* next phase */ lsl.b #4,d0 /* YO XO YS XS S M R L X7 X6 X5 X4 0 0 0 0 */ lsl.l #4,d0 /* YO XO YS XS S M R L X7 X6 X5 X4 0 0 0 0 0 0 0 0 */ 13: btst #4,(a0) bne.b 14f /* handshake */ dbra d1,13b bra timeout_err 14: move.b (a0),d0 /* X3 X2 X1 X0 */ move.b #0,(a0) /* next phase */ lsl.b #4,d0 /* YO XO YS XS S M R L X7 X6 X5 X4 X3 X2 X1 X0 0 0 0 0 */ lsl.l #4,d0 /* YO XO YS XS S M R L X7 X6 X5 X4 X3 X2 X1 X0 0 0 0 0 0 0 0 0 */ 15: btst #4,(a0) beq.b 16f /* handshake */ dbra d1,15b bra timeout_err 16: move.b (a0),d0 /* Y7 Y6 Y5 Y4 */ move.b #0x20,(a0) /* next phase */ lsl.b #4,d0 /* YO XO YS XS S M R L X7 X6 X5 X4 X3 X2 X1 X0 Y7 Y6 Y5 Y4 0 0 0 0 */ lsl.l #4,d0 /* YO XO YS XS S M R L X7 X6 X5 X4 X3 X2 X1 X0 Y7 Y6 Y5 Y4 0 0 0 0 0 0 0 0*/ 17: btst #4,(a0) beq.b 18f /* handshake */ dbra d1,17b bra timeout_err 18: move.b (a0),d0 /* Y3 Y2 Y1 Y0 */ move.b #0x60,(a0) /* first phase */ lsl.b #4,d0 /* YO XO YS XS S M R L X7 X6 X5 X4 X3 X2 X1 X0 Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0 0 0 0 0 */ lsr.l #4,d0 /* YO XO YS XS S M R L X7 X6 X5 X4 X3 X2 X1 X0 Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0 */ 19: btst #4,(a0) beq.b 19b /* wait on handshake */ move.w d2,sr /* restore int status */ rts timeout_err: move.b #0x60,(a0) /* first phase */ nop nop 0: btst #4,(a0) beq.b 0b /* wait on handshake */ move.w d2,sr /* restore int status */ moveq #-2,d0 rts mky_err: move.b #0x40,6(a0) /* set direction bits */ nop nop move.b #0x40,(a0) move.w d2,sr /* restore int status */ moveq #-1,d0 rts __m68k_end: .align 4 | Initialize the hardware & load font tiles init_hardware: movem.l d2-d7/a2-a6,-(sp) | init joyports lea 0xA10000,a5 move.b #0x40,0x09(a5) move.b #0x40,0x0B(a5) move.b #0x40,0x03(a5) move.b #0x40,0x05(a5) lea 0xC00000,a3 /* VDP data reg */ lea 0xC00004,a4 /* VDP cmd/sts reg */ | wait on VDP DMA (in case we reset in the middle of DMA) move.w #0x8114,(a4) /* display off, dma enabled */ 0: move.w (a4),d0 /* read VDP status */ btst #1,d0 /* DMA busy? */ bne.b 0b /* yes */ moveq #0,d0 move.w #0x8000,d5 /* set VDP register 0 */ move.w #0x0100,d7 | Set VDP registers lea InitVDPRegs(pc),a5 moveq #18,d1 1: move.b (a5)+,d5 /* lower byte = register data */ move.w d5,(a4) /* set VDP register */ add.w d7,d5 /* + 0x0100 = next register */ dbra d1,1b | clear VRAM move.w #0x8F02,(a4) /* set INC to 2 */ move.l #0x40000000,(a4) /* write VRAM address 0 */ move.w #0x7FFF,d1 /* 32K - 1 words */ 2: move.w d0,(a3) /* clear VRAM */ dbra d1,2b | The VDP state at this point is: Display disabled, ints disabled, Name Tbl A at 0xC000, | Name Tbl B at 0xE000, Name Tbl W at 0xB000, Sprite Attr Tbl at 0xA800, HScroll Tbl at 0xAC00, | H40 V28 mode, and Scroll size is 64x32. | Clear CRAM lea InitVDPRAM(pc),a5 move.l (a5)+,(a4) /* set reg 1 and reg 15 */ move.l (a5)+,(a4) /* write CRAM address 0 */ moveq #31,d3 3: move.l d0,(a3) dbra d3,3b | Clear VSRAM move.l (a5)+,(a4) /* write VSRAM address 0 */ moveq #19,d4 4: move.l d0,(a3) dbra d4,4b | halt Z80 and init FM chip /* Allow the 68k to access the FM chip */ move.w #0x100,0xA11100 move.w #0x100,0xA11200 | reset YM2612 lea FMReset(pc),a5 lea 0xA00000,a0 move.w #0x4000,d1 moveq #26,d2 5: move.b (a5)+,d1 /* FM reg */ move.b (a5)+,0(a0,d1.w) /* FM data */ nop nop dbra d2,5b moveq #0x30,d0 moveq #0x5F,d2 6: move.b d0,0x4000(a0) /* FM reg */ nop nop move.b #0xFF,0x4001(a0) /* FM data */ nop nop move.b d0,0x4002(a0) /* FM reg */ nop nop move.b #0xFF,0x4003(a0) /* FM data */ nop nop addq.b #1,d0 dbra d2,6b | reset PSG lea PSGReset(pc),a5 lea 0xC00000,a0 move.b (a5)+,0x0011(a0) move.b (a5)+,0x0011(a0) move.b (a5)+,0x0011(a0) move.b (a5),0x0011(a0) | load font tile data move.w #0x8F02,(a4) /* INC = 2 */ move.l #0x40000000,(a4) /* write VRAM address 0 */ lea font_data(pc),a0 move.w #0x6B*8-1,d2 7: move.l (a0)+,d0 /* font fg mask */ move.l d0,d1 not.l d1 /* font bg mask */ andi.l #0x11111111,d0 /* set font fg color */ andi.l #0x00000000,d1 /* set font bg color */ or.l d1,d0 move.l d0,(a3) /* set tile line */ dbra d2,7b | set the default palette for text move.l #0xC0000000,(a4) /* write CRAM address 0 */ move.l #0x00000CCC,(a3) /* entry 0 (black) and 1 (lt gray) BGR */ move.l #0xC0200000,(a4) /* write CRAM address 32 */ move.l #0x000000A0,(a3) /* entry 16 (black) BGR and 17 (green) */ move.l #0xC0400000,(a4) /* write CRAM address 64 */ move.l #0x0000000A,(a3) /* entry 32 (black) BGR and 33 (red) */ move.w #0x8174,(a4) /* display on, vblank enabled */ movem.l (sp)+,d2-d7/a2-a6 rts | VDP register initialization values InitVDPRegs: .byte 0x04 /* 8004 => write reg 0 = /IE1 (no HBL INT), /M3 (enable read H/V cnt) */ .byte 0x14 /* 8114 => write reg 1 = /DISP (display off), /IE0 (no VBL INT), M1 (DMA enabled), /M2 (V28 mode) */ .byte 0x30 /* 8230 => write reg 2 = Name Tbl A = 0xC000 */ .byte 0x2C /* 832C => write reg 3 = Name Tbl W = 0xB000 */ .byte 0x07 /* 8407 => write reg 4 = Name Tbl B = 0xE000 */ .byte 0x54 /* 8554 => write reg 5 = Sprite Attr Tbl = 0xA800 */ .byte 0x00 /* 8600 => write reg 6 = always 0 */ .byte 0x00 /* 8700 => write reg 7 = BG color */ .byte 0x00 /* 8800 => write reg 8 = always 0 */ .byte 0x00 /* 8900 => write reg 9 = always 0 */ .byte 0x00 /* 8A00 => write reg 10 = HINT = 0 */ .byte 0x00 /* 8B00 => write reg 11 = /IE2 (no EXT INT), full scroll */ .byte 0x81 /* 8C81 => write reg 12 = H40 mode, no lace, no shadow/hilite */ .byte 0x2B /* 8D2B => write reg 13 = HScroll Tbl = 0xAC00 */ .byte 0x00 /* 8E00 => write reg 14 = always 0 */ .byte 0x01 /* 8F01 => write reg 15 = data INC = 1 */ .byte 0x01 /* 9001 => write reg 16 = Scroll Size = 64x32 */ .byte 0x00 /* 9100 => write reg 17 = W Pos H = left */ .byte 0x00 /* 9200 => write reg 18 = W Pos V = top */ .align 2 | VDP Commands InitVDPRAM: .word 0x8104, 0x8F01 /* set registers 1 (display off) and 15 (INC = 1) */ .word 0xC000, 0x0000 /* write CRAM address 0 */ .word 0x4000, 0x0010 /* write VSRAM address 0 */ FMReset: /* disable LFO */ .byte 0,0x22 .byte 1,0x00 /* disable timer & set channel 6 to normal mode */ .byte 0,0x27 .byte 1,0x00 /* all KEY_OFF */ .byte 0,0x28 .byte 1,0x00 .byte 1,0x04 .byte 1,0x01 .byte 1,0x05 .byte 1,0x02 .byte 1,0x06 /* disable DAC */ .byte 0,0x2A .byte 1,0x80 .byte 0,0x2B .byte 1,0x00 /* turn off channels */ .byte 0,0xB4 .byte 1,0x00 .byte 0,0xB5 .byte 1,0x00 .byte 0,0xB6 .byte 1,0x00 .byte 2,0xB4 .byte 3,0x00 .byte 2,0xB5 .byte 3,0x00 .byte 2,0xB6 .byte 3,0x00 | PSG register initialization values PSGReset: .byte 0x9f /* set ch0 attenuation to max */ .byte 0xbf /* set ch1 attenuation to max */ .byte 0xdf /* set ch2 attenuation to max */ .byte 0xff /* set ch3 attenuation to max */ .align 4 | ASCII font from Steph's Mini DevKit font_data: | 20 .long 0x00000000 .long 0x00000000 .long 0x00000000 .long 0x00000000 .long 0x00000000 .long 0x00000000 .long 0x00000000 .long 0x00000000 .long 0x00000000 .long 0x000FF000 .long 0x000FF000 .long 0x000FF000 .long 0x000FF000 .long 0x00000000 .long 0x000FF000 .long 0x00000000 .long 0x00000000 .long 0x0FF00FF0 .long 0x0FF00FF0 .long 0x0FF00FF0 .long 0x00000000 .long 0x00000000 .long 0x00000000 .long 0x00000000 .long 0x00000000 .long 0x0FF00FF0 .long 0xFFFFFFFF .long 0x0FF00FF0 .long 0x0FF00FF0 .long 0xFFFFFFFF .long 0x0FF00FF0 .long 0x00000000 .long 0x000FF000 .long 0x00FFFFF0 .long 0x0FF00000 .long 0x00FFFF00 .long 0x00000FF0 .long 0x0FFFFF00 .long 0x000FF000 .long 0x00000000 .long 0x00000000 .long 0x0FF00FF0 .long 0x0FF0FF00 .long 0x000FF000 .long 0x00FF0000 .long 0x0FF00FF0 .long 0x0F000FF0 .long 0x00000000 .long 0x000FFF00 .long 0x00FF0FF0 .long 0x000FFF00 .long 0x00FFF000 .long 0x0FF0FFFF .long 0x0FF00FF0 .long 0x00FFF0FF .long 0x00000000 .long 0x00000000 .long 0x000FF000 .long 0x000FF000 .long 0x000FF000 .long 0x00000000 .long 0x00000000 .long 0x00000000 .long 0x00000000 .long 0x00000000 .long 0x0000FFF0 .long 0x000FFF00 .long 0x000FF000 .long 0x000FF000 .long 0x000FFF00 .long 0x0000FFF0 .long 0x00000000 .long 0x00000000 .long 0x0FFF0000 .long 0x00FFF000 .long 0x000FF000 .long 0x000FF000 .long 0x00FFF000 .long 0x0FFF0000 .long 0x00000000 .long 0x00000000 .long 0x0FF00FF0 .long 0x00FFFF00 .long 0xFFFFFFFF .long 0x00FFFF00 .long 0x0FF00FF0 .long 0x00000000 .long 0x00000000 .long 0x00000000 .long 0x000FF000 .long 0x000FF000 .long 0x0FFFFFF0 .long 0x000FF000 .long 0x000FF000 .long 0x00000000 .long 0x00000000 .long 0x00000000 .long 0x00000000 .long 0x00000000 .long 0x00000000 .long 0x00000000 .long 0x000FF000 .long 0x000FF000 .long 0x00FF0000 .long 0x00000000 .long 0x00000000 .long 0x00000000 .long 0x0FFFFFF0 .long 0x00000000 .long 0x00000000 .long 0x00000000 .long 0x00000000 .long 0x00000000 .long 0x00000000 .long 0x00000000 .long 0x00000000 .long 0x00000000 .long 0x000FF000 .long 0x000FF000 .long 0x00000000 .long 0x00000000 .long 0x00000FF0 .long 0x0000FF00 .long 0x000FF000 .long 0x00FF0000 .long 0x0FF00000 .long 0x0F000000 .long 0x00000000 .long 0x00000000 .long 0x00FFFF00 .long 0x0FF00FF0 .long 0x0FF0FFF0 .long 0x0FFF0FF0 .long 0x0FF00FF0 .long 0x00FFFF00 .long 0x00000000 .long 0x00000000 .long 0x000FF000 .long 0x00FFF000 .long 0x000FF000 .long 0x000FF000 .long 0x000FF000 .long 0x0FFFFFF0 .long 0x00000000 .long 0x00000000 .long 0x00FFFF00 .long 0x0FF00FF0 .long 0x0000FF00 .long 0x000FF000 .long 0x00FF0000 .long 0x0FFFFFF0 .long 0x00000000 .long 0x00000000 .long 0x0FFFFFF0 .long 0x0000FF00 .long 0x000FF000 .long 0x0000FF00 .long 0x0FF00FF0 .long 0x00FFFF00 .long 0x00000000 .long 0x00000000 .long 0x0000FF00 .long 0x000FFF00 .long 0x00FFFF00 .long 0x0FF0FF00 .long 0x0FFFFFF0 .long 0x0000FF00 .long 0x00000000 .long 0x00000000 .long 0x0FFFFFF0 .long 0x0FF00000 .long 0x0FFFFF00 .long 0x00000FF0 .long 0x0FF00FF0 .long 0x00FFFF00 .long 0x00000000 .long 0x00000000 .long 0x00FFFF00 .long 0x0FF00000 .long 0x0FFFFF00 .long 0x0FF00FF0 .long 0x0FF00FF0 .long 0x00FFFF00 .long 0x00000000 .long 0x00000000 .long 0x0FFFFFF0 .long 0x00000FF0 .long 0x0000FF00 .long 0x000FF000 .long 0x00FF0000 .long 0x00FF0000 .long 0x00000000 .long 0x00000000 .long 0x00FFFF00 .long 0x0FF00FF0 .long 0x00FFFF00 .long 0x0FF00FF0 .long 0x0FF00FF0 .long 0x00FFFF00 .long 0x00000000 .long 0x00000000 .long 0x00FFFF00 .long 0x0FF00FF0 .long 0x00FFFFF0 .long 0x00000FF0 .long 0x0000FF00 .long 0x00FFF000 .long 0x00000000 .long 0x00000000 .long 0x00000000 .long 0x000FF000 .long 0x000FF000 .long 0x00000000 .long 0x000FF000 .long 0x000FF000 .long 0x00000000 .long 0x00000000 .long 0x00000000 .long 0x000FF000 .long 0x000FF000 .long 0x00000000 .long 0x000FF000 .long 0x000FF000 .long 0x00FF0000 .long 0x00000FF0 .long 0x0000FF00 .long 0x000FF000 .long 0x00FF0000 .long 0x000FF000 .long 0x0000FF00 .long 0x00000FF0 .long 0x00000000 .long 0x00000000 .long 0x00000000 .long 0x0FFFFFF0 .long 0x00000000 .long 0x00000000 .long 0x0FFFFFF0 .long 0x00000000 .long 0x00000000 .long 0x0FF00000 .long 0x00FF0000 .long 0x000FF000 .long 0x0000FF00 .long 0x000FF000 .long 0x00FF0000 .long 0x0FF00000 .long 0x00000000 .long 0x00000000 .long 0x00FFFF00 .long 0x0FF00FF0 .long 0x0000FF00 .long 0x000FF000 .long 0x00000000 .long 0x000FF000 .long 0x00000000 .long 0x00000000 .long 0x00FFFF00 .long 0x0FF00FF0 .long 0x0FF0FFF0 .long 0x0FF0FFF0 .long 0x0FF00000 .long 0x00FFFFF0 .long 0x00000000 .long 0x00000000 .long 0x000FF000 .long 0x00FFFF00 .long 0x0FF00FF0 .long 0x0FF00FF0 .long 0x0FFFFFF0 .long 0x0FF00FF0 .long 0x00000000 .long 0x00000000 .long 0x0FFFFF00 .long 0x0FF00FF0 .long 0x0FFFFF00 .long 0x0FF00FF0 .long 0x0FF00FF0 .long 0x0FFFFF00 .long 0x00000000 .long 0x00000000 .long 0x00FFFF00 .long 0x0FF00FF0 .long 0x0FF00000 .long 0x0FF00000 .long 0x0FF00FF0 .long 0x00FFFF00 .long 0x00000000 .long 0x00000000 .long 0x0FFFF000 .long 0x0FF0FF00 .long 0x0FF00FF0 .long 0x0FF00FF0 .long 0x0FF0FF00 .long 0x0FFFF000 .long 0x00000000 .long 0x00000000 .long 0x0FFFFFF0 .long 0x0FF00000 .long 0x0FFFFF00 .long 0x0FF00000 .long 0x0FF00000 .long 0x0FFFFFF0 .long 0x00000000 .long 0x00000000 .long 0x0FFFFFF0 .long 0x0FF00000 .long 0x0FFFFF00 .long 0x0FF00000 .long 0x0FF00000 .long 0x0FF00000 .long 0x00000000 .long 0x00000000 .long 0x00FFFFF0 .long 0x0FF00000 .long 0x0FF00000 .long 0x0FF0FFF0 .long 0x0FF00FF0 .long 0x00FFFFF0 .long 0x00000000 .long 0x00000000 .long 0x0FF00FF0 .long 0x0FF00FF0 .long 0x0FFFFFF0 .long 0x0FF00FF0 .long 0x0FF00FF0 .long 0x0FF00FF0 .long 0x00000000 .long 0x00000000 .long 0x0FFFFFF0 .long 0x000FF000 .long 0x000FF000 .long 0x000FF000 .long 0x000FF000 .long 0x0FFFFFF0 .long 0x00000000 .long 0x00000000 .long 0x00000FF0 .long 0x00000FF0 .long 0x00000FF0 .long 0x00000FF0 .long 0x0FF00FF0 .long 0x00FFFF00 .long 0x00000000 .long 0x00000000 .long 0x0FF00FF0 .long 0x0FF0FF00 .long 0x0FFFF000 .long 0x0FFFF000 .long 0x0FF0FF00 .long 0x0FF00FF0 .long 0x00000000 .long 0x00000000 .long 0x0FF00000 .long 0x0FF00000 .long 0x0FF00000 .long 0x0FF00000 .long 0x0FF00000 .long 0x0FFFFFF0 .long 0x00000000 .long 0x00000000 .long 0x0FF000FF .long 0x0FFF0FFF .long 0x0FFFFFFF .long 0x0FF0F0FF .long 0x0FF000FF .long 0x0FF000FF .long 0x00000000 .long 0x00000000 .long 0x0FF00FF0 .long 0x0FFF0FF0 .long 0x0FFFFFF0 .long 0x0FFFFFF0 .long 0x0FF0FFF0 .long 0x0FF00FF0 .long 0x00000000 .long 0x00000000 .long 0x00FFFF00 .long 0x0FF00FF0 .long 0x0FF00FF0 .long 0x0FF00FF0 .long 0x0FF00FF0 .long 0x00FFFF00 .long 0x00000000 .long 0x00000000 .long 0x0FFFFF00 .long 0x0FF00FF0 .long 0x0FF00FF0 .long 0x0FFFFF00 .long 0x0FF00000 .long 0x0FF00000 .long 0x00000000 .long 0x00000000 .long 0x00FFFF00 .long 0x0FF00FF0 .long 0x0FF00FF0 .long 0x0FF00FF0 .long 0x0FF0FF00 .long 0x00FF0FF0 .long 0x00000000 .long 0x00000000 .long 0x0FFFFF00 .long 0x0FF00FF0 .long 0x0FF00FF0 .long 0x0FFFFF00 .long 0x0FF0FF00 .long 0x0FF00FF0 .long 0x00000000 .long 0x00000000 .long 0x00FFFF00 .long 0x0FF00000 .long 0x00FFFF00 .long 0x00000FF0 .long 0x00000FF0 .long 0x00FFFF00 .long 0x00000000 .long 0x00000000 .long 0x0FFFFFF0 .long 0x000FF000 .long 0x000FF000 .long 0x000FF000 .long 0x000FF000 .long 0x000FF000 .long 0x00000000 .long 0x00000000 .long 0x0FF00FF0 .long 0x0FF00FF0 .long 0x0FF00FF0 .long 0x0FF00FF0 .long 0x0FF00FF0 .long 0x0FFFFFF0 .long 0x00000000 .long 0x00000000 .long 0x0FF00FF0 .long 0x0FF00FF0 .long 0x0FF00FF0 .long 0x0FF00FF0 .long 0x00FFFF00 .long 0x000FF000 .long 0x00000000 .long 0x00000000 .long 0x0FF000FF .long 0x0FF000FF .long 0x0FF0F0FF .long 0x0FFFFFFF .long 0x0FFF0FFF .long 0x0FF000FF .long 0x00000000 .long 0x00000000 .long 0x0FF00FF0 .long 0x0FF00FF0 .long 0x00FFFF00 .long 0x00FFFF00 .long 0x0FF00FF0 .long 0x0FF00FF0 .long 0x00000000 .long 0x00000000 .long 0x0FF00FF0 .long 0x0FF00FF0 .long 0x00FFFF00 .long 0x000FF000 .long 0x000FF000 .long 0x000FF000 .long 0x00000000 .long 0x00000000 .long 0x0FFFFFF0 .long 0x0000FF00 .long 0x000FF000 .long 0x00FF0000 .long 0x0FF00000 .long 0x0FFFFFF0 .long 0x00000000 .long 0x00000000 .long 0x000FFFF0 .long 0x000FF000 .long 0x000FF000 .long 0x000FF000 .long 0x000FF000 .long 0x000FFFF0 .long 0x00000000 .long 0x00000000 .long 0x0F000000 .long 0x0FF00000 .long 0x00FF0000 .long 0x000FF000 .long 0x0000FF00 .long 0x00000FF0 .long 0x00000000 .long 0x00000000 .long 0x0FFFF000 .long 0x000FF000 .long 0x000FF000 .long 0x000FF000 .long 0x000FF000 .long 0x0FFFF000 .long 0x00000000 .long 0x00000000 .long 0x0000F000 .long 0x000FFF00 .long 0x00FF0FF0 .long 0x0FF000FF .long 0x00000000 .long 0x00000000 .long 0x00000000 .long 0x00000000 .long 0x00000000 .long 0x00000000 .long 0x00000000 .long 0x00000000 .long 0x00000000 .long 0xFFFFFFFF .long 0x00000000 .long 0x00000000 .long 0x000FF000 .long 0x00FFFF00 .long 0x0FFFFFF0 .long 0x0FFFFFF0 .long 0x00FFFF00 .long 0x000FF000 .long 0x00000000 .long 0x00000000 .long 0x00000000 .long 0x00FFFF00 .long 0x00000FF0 .long 0x00FFFFF0 .long 0x0FF00FF0 .long 0x00FFFFF0 .long 0x00000000 .long 0x00000000 .long 0x0FF00000 .long 0x0FF00000 .long 0x0FFFFF00 .long 0x0FF00FF0 .long 0x0FF00FF0 .long 0x0FFFFF00 .long 0x00000000 .long 0x00000000 .long 0x00000000 .long 0x00FFFF00 .long 0x0FF00000 .long 0x0FF00000 .long 0x0FF00000 .long 0x00FFFF00 .long 0x00000000 .long 0x00000000 .long 0x00000FF0 .long 0x00000FF0 .long 0x00FFFFF0 .long 0x0FF00FF0 .long 0x0FF00FF0 .long 0x00FFFFF0 .long 0x00000000 .long 0x00000000 .long 0x00000000 .long 0x00FFFF00 .long 0x0FF00FF0 .long 0x0FFFFFF0 .long 0x0FF00000 .long 0x00FFFF00 .long 0x00000000 .long 0x00000000 .long 0x0000FFF0 .long 0x000FF000 .long 0x00FFFFF0 .long 0x000FF000 .long 0x000FF000 .long 0x000FF000 .long 0x00000000 .long 0x00000000 .long 0x00000000 .long 0x00FFFFF0 .long 0x0FF00FF0 .long 0x0FF00FF0 .long 0x00FFFFF0 .long 0x00000FF0 .long 0x0FFFFF00 .long 0x00000000 .long 0x0FF00000 .long 0x0FF00000 .long 0x0FFFFF00 .long 0x0FF00FF0 .long 0x0FF00FF0 .long 0x0FF00FF0 .long 0x00000000 .long 0x00000000 .long 0x000FF000 .long 0x00000000 .long 0x00FFF000 .long 0x000FF000 .long 0x000FF000 .long 0x00FFFF00 .long 0x00000000 .long 0x00000000 .long 0x00000FF0 .long 0x00000000 .long 0x00000FF0 .long 0x00000FF0 .long 0x00000FF0 .long 0x00000FF0 .long 0x00FFFF00 .long 0x00000000 .long 0x0FF00000 .long 0x0FF00000 .long 0x0FF0FF00 .long 0x0FFFF000 .long 0x0FF0FF00 .long 0x0FF00FF0 .long 0x00000000 .long 0x00000000 .long 0x00FFF000 .long 0x000FF000 .long 0x000FF000 .long 0x000FF000 .long 0x000FF000 .long 0x00FFFF00 .long 0x00000000 .long 0x00000000 .long 0x00000000 .long 0x0FF00FF0 .long 0x0FFFFFFF .long 0x0FFFFFFF .long 0x0FF0F0FF .long 0x0FF000FF .long 0x00000000 .long 0x00000000 .long 0x00000000 .long 0x0FFFFF00 .long 0x0FF00FF0 .long 0x0FF00FF0 .long 0x0FF00FF0 .long 0x0FF00FF0 .long 0x00000000 .long 0x00000000 .long 0x00000000 .long 0x00FFFF00 .long 0x0FF00FF0 .long 0x0FF00FF0 .long 0x0FF00FF0 .long 0x00FFFF00 .long 0x00000000 .long 0x00000000 .long 0x00000000 .long 0x0FFFFF00 .long 0x0FF00FF0 .long 0x0FF00FF0 .long 0x0FFFFF00 .long 0x0FF00000 .long 0x0FF00000 .long 0x00000000 .long 0x00000000 .long 0x00FFFFF0 .long 0x0FF00FF0 .long 0x0FF00FF0 .long 0x00FFFFF0 .long 0x00000FF0 .long 0x00000FF0 .long 0x00000000 .long 0x00000000 .long 0x0FFFFF00 .long 0x0FF00FF0 .long 0x0FF00000 .long 0x0FF00000 .long 0x0FF00000 .long 0x00000000 .long 0x00000000 .long 0x00000000 .long 0x00FFFFF0 .long 0x0FF00000 .long 0x00FFFF00 .long 0x00000FF0 .long 0x0FFFFF00 .long 0x00000000 .long 0x00000000 .long 0x000FF000 .long 0x0FFFFFF0 .long 0x000FF000 .long 0x000FF000 .long 0x000FF000 .long 0x0000FFF0 .long 0x00000000 .long 0x00000000 .long 0x00000000 .long 0x0FF00FF0 .long 0x0FF00FF0 .long 0x0FF00FF0 .long 0x0FF00FF0 .long 0x00FFFFF0 .long 0x00000000 .long 0x00000000 .long 0x00000000 .long 0x0FF00FF0 .long 0x0FF00FF0 .long 0x0FF00FF0 .long 0x00FFFF00 .long 0x000FF000 .long 0x00000000 .long 0x00000000 .long 0x00000000 .long 0x0FF000FF .long 0x0FF0F0FF .long 0x0FFFFFFF .long 0x00FFFFF0 .long 0x00FF0FF0 .long 0x00000000 .long 0x00000000 .long 0x00000000 .long 0x0FF00FF0 .long 0x00FFFF00 .long 0x000FF000 .long 0x00FFFF00 .long 0x0FF00FF0 .long 0x00000000 .long 0x00000000 .long 0x00000000 .long 0x0FF00FF0 .long 0x0FF00FF0 .long 0x0FF00FF0 .long 0x00FFFFF0 .long 0x0000FF00 .long 0x0FFFF000 .long 0x00000000 .long 0x00000000 .long 0x0FFFFFF0 .long 0x0000FF00 .long 0x000FF000 .long 0x00FF0000 .long 0x0FFFFFF0 .long 0x00000000 | 7B .long 0x00000000 .long 0x0000FFF0 .long 0x000FF000 .long 0x000FF000 .long 0x00FFF000 .long 0x000FF000 .long 0x0000FFF0 .long 0x00000000 | 7C .long 0x000FF000 .long 0x000FF000 .long 0x000FF000 .long 0x000FF000 .long 0x000FF000 .long 0x000FF000 .long 0x000FF000 .long 0x000FF000 | 7D .long 0x00000000 .long 0x0FFF0000 .long 0x000FF000 .long 0x000FF000 .long 0x000FFF00 .long 0x000FF000 .long 0x0FFF0000 .long 0x00000000 | 7E .long 0x00000000 .long 0x00FFF0FF .long 0x0FF0FFF0 .long 0x00000000 .long 0x00000000 .long 0x00000000 .long 0x00000000 .long 0x00000000 | 7F .long 0x0000F000 .long 0x000FF000 .long 0x00FFF000 .long 0x0FFFF000 .long 0x00FFF000 .long 0x000FF000 .long 0x0000F000 .long 0x00000000 | 80 .long 0x00000000 .long 0x00000000 .long 0x00000000 .long 0x000FFFFF .long 0x000FFFFF .long 0x000FF000 .long 0x000FF000 .long 0x000FF000 | 81 .long 0x000FF000 .long 0x000FF000 .long 0x000FF000 .long 0x000FFFFF .long 0x000FFFFF .long 0x000FF000 .long 0x000FF000 .long 0x000FF000 | 82 .long 0x00000000 .long 0x00000000 .long 0x00000000 .long 0xFFFFFFFF .long 0xFFFFFFFF .long 0x00000000 .long 0x00000000 .long 0x00000000 | 83 .long 0x000FF000 .long 0x000FF000 .long 0x000FF000 .long 0xFFFFF000 .long 0xFFFFF000 .long 0x00000000 .long 0x00000000 .long 0x00000000 | 84 .long 0x000FF000 .long 0x000FF000 .long 0x000FF000 .long 0xFFFFF000 .long 0xFFFFF000 .long 0x000FF000 .long 0x000FF000 .long 0x000FF000 | 85 .long 0x00000000 .long 0x00000000 .long 0x00000000 .long 0xFFFFF000 .long 0xFFFFF000 .long 0x000FF000 .long 0x000FF000 .long 0x000FF000 | 86 .long 0x000FF000 .long 0x000FF000 .long 0x000FF000 .long 0x000FFFFF .long 0x000FFFFF .long 0x00000000 .long 0x00000000 .long 0x00000000 | 87 .long 0x000FF000 .long 0x000FF000 .long 0x000FF000 .long 0xFFFFFFFF .long 0xFFFFFFFF .long 0x000FF000 .long 0x000FF000 .long 0x000FF000 | 88 .long 0x00000000 .long 0x00000000 .long 0x00000000 .long 0xFFFFFFFF .long 0xFFFFFFFF .long 0x000FF000 .long 0x000FF000 .long 0x000FF000 | 89 .long 0x000FF000 .long 0x000FF000 .long 0x000FF000 .long 0xFFFFFFFF .long 0xFFFFFFFF .long 0x00000000 .long 0x00000000 .long 0x00000000 | 8A .long 0x00000000 .long 0x00000000 .long 0x00000000 .long 0x00000000 .long 0xFFFFFFFF .long 0xFFFFFFFF .long 0xFFFFFFFF .long 0xFFFFFFFF