font data implemented
authornotaz <notasas@gmail.com>
Thu, 22 Feb 2007 22:56:00 +0000 (22:56 +0000)
committernotaz <notasas@gmail.com>
Thu, 22 Feb 2007 22:56:00 +0000 (22:56 +0000)
git-svn-id: file:///home/notaz/opt/svn/PicoDrive@55 be3aeb3a-fb24-0410-a615-afba39da0efa

Pico/cd/Memory.c
Pico/cd/gfx_cd.c
platform/gp2x/emu.c

index 890af0a..df015dd 100644 (file)
@@ -29,6 +29,7 @@ typedef unsigned int   u32;
 //#define __debug_io2\r
 //#define rdprintf dprintf\r
 #define rdprintf(...)\r
+#define wrdprintf(...)\r
 \r
 // -----------------------------------------------------------------\r
 \r
@@ -51,7 +52,7 @@ static u32 m68k_reg_read16(u32 a)
       d = Pico_mcd->s68k_regs[4]<<8;\r
       goto end;\r
     case 6:\r
-      d = Pico_mcd->m.hint_vector;\r
+      d = *(u16 *)(Pico_mcd->bios + 0x72);\r
       goto end;\r
     case 8:\r
       d = Read_CDC_Host(0);\r
@@ -117,13 +118,11 @@ static void m68k_reg_write8(u32 a, u32 d)
       Pico_mcd->s68k_regs[3] = d; // really use s68k side register\r
       return;\r
     case 6:\r
-      dprintf("FIXME hint[2]: %02x @%06x", (u8)d, SekPc);\r
       Pico_mcd->bios[0x72 + 1] = d; // simple hint vector changer\r
       return;\r
     case 7:\r
-      dprintf("FIXME hint[3]: %02x @%06x", (u8)d, SekPc);\r
       Pico_mcd->bios[0x72] = d;\r
-      dprintf("vector is now %08x", PicoRead32(0x70));\r
+      dprintf("hint vector set to %08x", PicoRead32(0x70));\r
       return;\r
     case 0xe:\r
       //dprintf("m68k: comm flag: %02x", d);\r
@@ -140,6 +139,16 @@ static void m68k_reg_write8(u32 a, u32 d)
 }\r
 \r
 \r
+#define READ_FONT_DATA(basemask) \\r
+{ \\r
+      unsigned int fnt = *(unsigned int *)(Pico_mcd->s68k_regs + 0x4c); \\r
+      unsigned int col0 = (fnt >> 8) & 0x0f, col1 = (fnt >> 12) & 0x0f;   \\r
+      if (fnt & (basemask << 0)) d  = col1      ; else d  = col0;       \\r
+      if (fnt & (basemask << 1)) d |= col1 <<  4; else d |= col0 <<  4; \\r
+      if (fnt & (basemask << 2)) d |= col1 <<  8; else d |= col0 <<  8; \\r
+      if (fnt & (basemask << 3)) d |= col1 << 12; else d |= col0 << 12; \\r
+}\r
+\r
 \r
 static u32 s68k_reg_read16(u32 a)\r
 {\r
@@ -171,6 +180,18 @@ static u32 s68k_reg_read16(u32 a)
     case 0x34: // fader\r
       d = 0; // no busy bit\r
       goto end;\r
+    case 0x50: // font data (check: Lunar 2, Silpheed)\r
+      READ_FONT_DATA(0x00100000);\r
+      goto end;\r
+    case 0x52:\r
+      READ_FONT_DATA(0x00010000);\r
+      goto end;\r
+    case 0x54:\r
+      READ_FONT_DATA(0x10000000);\r
+      goto end;\r
+    case 0x56:\r
+      READ_FONT_DATA(0x01000000);\r
+      goto end;\r
   }\r
 \r
   d = (Pico_mcd->s68k_regs[a]<<8) | Pico_mcd->s68k_regs[a+1];\r
@@ -339,7 +360,7 @@ u8 PicoReadM68k8(u32 a)
 \r
   // word RAM\r
   if ((a&0xfc0000)==0x200000) {\r
-    dprintf("m68k_wram r8: [%06x] @%06x", a, SekPc);\r
+    wrdprintf("m68k_wram r8: [%06x] @%06x", a, SekPc);\r
     if (Pico_mcd->s68k_regs[3]&4) { // 1M mode?\r
       int bank = Pico_mcd->s68k_regs[3]&1;\r
       if (a >= 0x220000)\r
@@ -350,7 +371,7 @@ u8 PicoReadM68k8(u32 a)
       // allow access in any mode, like Gens does\r
       d = Pico_mcd->word_ram2M[(a^1)&0x3ffff];\r
     }\r
-    dprintf("ret = %02x", (u8)d);\r
+    wrdprintf("ret = %02x", (u8)d);\r
     goto end;\r
   }\r
 \r
@@ -392,7 +413,7 @@ u16 PicoReadM68k16(u32 a)
 \r
   // word RAM\r
   if ((a&0xfc0000)==0x200000) {\r
-    dprintf("m68k_wram r16: [%06x] @%06x", a, SekPc);\r
+    wrdprintf("m68k_wram r16: [%06x] @%06x", a, SekPc);\r
     if (Pico_mcd->s68k_regs[3]&4) { // 1M mode?\r
       int bank = Pico_mcd->s68k_regs[3]&1;\r
       if (a >= 0x220000)\r
@@ -403,7 +424,7 @@ u16 PicoReadM68k16(u32 a)
       // allow access in any mode, like Gens does\r
       d = *(u16 *)(Pico_mcd->word_ram2M+(a&0x3fffe));\r
     }\r
-    dprintf("ret = %04x", d);\r
+    wrdprintf("ret = %04x", d);\r
     goto end;\r
   }\r
 \r
@@ -444,7 +465,7 @@ u32 PicoReadM68k32(u32 a)
 \r
   // word RAM\r
   if ((a&0xfc0000)==0x200000) {\r
-    dprintf("m68k_wram r32: [%06x] @%06x", a, SekPc);\r
+    wrdprintf("m68k_wram r32: [%06x] @%06x", a, SekPc);\r
     if (Pico_mcd->s68k_regs[3]&4) { // 1M mode?\r
       int bank = Pico_mcd->s68k_regs[3]&1;\r
       if (a >= 0x220000) { // cell arranged\r
@@ -461,7 +482,7 @@ u32 PicoReadM68k32(u32 a)
       // allow access in any mode, like Gens does\r
       u16 *pm=(u16 *)(Pico_mcd->word_ram2M+(a&0x3fffe)); d = (pm[0]<<16)|pm[1];\r
     }\r
-    dprintf("ret = %08x", d);\r
+    wrdprintf("ret = %08x", d);\r
     goto end;\r
   }\r
 \r
@@ -509,7 +530,7 @@ void PicoWriteM68k8(u32 a,u8 d)
 \r
   // word RAM\r
   if ((a&0xfc0000)==0x200000) {\r
-    dprintf("m68k_wram w8: [%06x] %02x @%06x", a, d, SekPc);\r
+    wrdprintf("m68k_wram w8: [%06x] %02x @%06x", a, d, SekPc);\r
     if (Pico_mcd->s68k_regs[3]&4) { // 1M mode?\r
       int bank = Pico_mcd->s68k_regs[3]&1;\r
       if (a >= 0x220000)\r
@@ -553,7 +574,7 @@ void PicoWriteM68k16(u32 a,u16 d)
 \r
   // word RAM\r
   if ((a&0xfc0000)==0x200000) {\r
-    dprintf("m68k_wram w16: [%06x] %04x @%06x", a, d, SekPc);\r
+    wrdprintf("m68k_wram w16: [%06x] %04x @%06x", a, d, SekPc);\r
     if (Pico_mcd->s68k_regs[3]&4) { // 1M mode?\r
       int bank = Pico_mcd->s68k_regs[3]&1;\r
       if (a >= 0x220000)\r
@@ -601,7 +622,7 @@ void PicoWriteM68k32(u32 a,u32 d)
   // word RAM\r
   if ((a&0xfc0000)==0x200000) {\r
     if (d != 0) // don't log clears\r
-      dprintf("m68k_wram w32: [%06x] %08x @%06x", a, d, SekPc);\r
+      wrdprintf("m68k_wram w32: [%06x] %08x @%06x", a, d, SekPc);\r
     if (Pico_mcd->s68k_regs[3]&4) { // 1M mode?\r
       int bank = Pico_mcd->s68k_regs[3]&1;\r
       if (a >= 0x220000) { // cell arranged\r
@@ -650,7 +671,7 @@ u8 PicoReadS68k8(u32 a)
   if ((a&0xfffe00) == 0xff8000) {\r
     a &= 0x1ff;\r
     rdprintf("s68k_regs r8: [%02x] @ %06x", a, SekPcS68k);\r
-    if (a >= 0x50 && a < 0x68)\r
+    if (a >= 0x58 && a < 0x68)\r
          d = gfx_cd_read(a&~1);\r
     else d = s68k_reg_read16(a&~1);\r
     if ((a&1)==0) d>>=8;\r
@@ -661,7 +682,7 @@ u8 PicoReadS68k8(u32 a)
   // word RAM (2M area)\r
   if ((a&0xfc0000)==0x080000) { // 080000-0bffff\r
     // test: batman returns\r
-    dprintf("s68k_wram2M r8: [%06x] @%06x", a, SekPcS68k);\r
+    wrdprintf("s68k_wram2M r8: [%06x] @%06x", a, SekPcS68k);\r
     if (Pico_mcd->s68k_regs[3]&4) { // 1M decode mode?\r
       int bank = !(Pico_mcd->s68k_regs[3]&1);\r
       d = Pico_mcd->word_ram1M[bank][((a>>1)^1)&0x1ffff];\r
@@ -672,19 +693,19 @@ u8 PicoReadS68k8(u32 a)
       // allow access in any mode, like Gens does\r
       d = Pico_mcd->word_ram2M[(a^1)&0x3ffff];\r
     }\r
-    dprintf("ret = %02x", (u8)d);\r
+    wrdprintf("ret = %02x", (u8)d);\r
     goto end;\r
   }\r
 \r
   // word RAM (1M area)\r
   if ((a&0xfe0000)==0x0c0000) { // 0c0000-0dffff\r
     int bank;\r
-    dprintf("s68k_wram1M r8: [%06x] @%06x", a, SekPcS68k);\r
+    wrdprintf("s68k_wram1M r8: [%06x] @%06x", a, SekPcS68k);\r
     if (!(Pico_mcd->s68k_regs[3]&4))\r
       dprintf("s68k_wram1M FIXME: wrong mode");\r
     bank = !(Pico_mcd->s68k_regs[3]&1);\r
     d = Pico_mcd->word_ram1M[bank][(a^1)&0x1ffff];\r
-    dprintf("ret = %02x", (u8)d);\r
+    wrdprintf("ret = %02x", (u8)d);\r
     goto end;\r
   }\r
 \r
@@ -736,7 +757,7 @@ u16 PicoReadS68k16(u32 a)
   if ((a&0xfffe00) == 0xff8000) {\r
     a &= 0x1fe;\r
     rdprintf("s68k_regs r16: [%02x] @ %06x", a, SekPcS68k);\r
-    if (a >= 0x50 && a < 0x68)\r
+    if (a >= 0x58 && a < 0x68)\r
          d = gfx_cd_read(a);\r
     else d = s68k_reg_read16(a);\r
     rdprintf("ret = %04x", d);\r
@@ -745,7 +766,7 @@ u16 PicoReadS68k16(u32 a)
 \r
   // word RAM (2M area)\r
   if ((a&0xfc0000)==0x080000) { // 080000-0bffff\r
-    dprintf("s68k_wram2M r16: [%06x] @%06x", a, SekPcS68k);\r
+    wrdprintf("s68k_wram2M r16: [%06x] @%06x", a, SekPcS68k);\r
     if (Pico_mcd->s68k_regs[3]&4) { // 1M decode mode?\r
       int bank = !(Pico_mcd->s68k_regs[3]&1);\r
       d = Pico_mcd->word_ram1M[bank][((a>>1)^1)&0x1ffff];\r
@@ -755,19 +776,19 @@ u16 PicoReadS68k16(u32 a)
       // allow access in any mode, like Gens does\r
       d = *(u16 *)(Pico_mcd->word_ram2M+(a&0x3fffe));\r
     }\r
-    dprintf("ret = %04x", d);\r
+    wrdprintf("ret = %04x", d);\r
     goto end;\r
   }\r
 \r
   // word RAM (1M area)\r
   if ((a&0xfe0000)==0x0c0000) { // 0c0000-0dffff\r
     int bank;\r
-    dprintf("s68k_wram1M r16: [%06x] @%06x", a, SekPcS68k);\r
+    wrdprintf("s68k_wram1M r16: [%06x] @%06x", a, SekPcS68k);\r
     if (!(Pico_mcd->s68k_regs[3]&4))\r
       dprintf("s68k_wram1M FIXME: wrong mode");\r
     bank = !(Pico_mcd->s68k_regs[3]&1);\r
     d = *(u16 *)(Pico_mcd->word_ram1M[bank]+(a&0x1fffe));\r
-    dprintf("ret = %04x", d);\r
+    wrdprintf("ret = %04x", d);\r
     goto end;\r
   }\r
 \r
@@ -824,7 +845,7 @@ u32 PicoReadS68k32(u32 a)
   if ((a&0xfffe00) == 0xff8000) {\r
     a &= 0x1fe;\r
     rdprintf("s68k_regs r32: [%02x] @ %06x", a, SekPcS68k);\r
-    if (a >= 0x50 && a < 0x68)\r
+    if (a >= 0x58 && a < 0x68)\r
          d = (gfx_cd_read(a)<<16)|gfx_cd_read(a+2);\r
     else d = (s68k_reg_read16(a)<<16)|s68k_reg_read16(a+2);\r
     rdprintf("ret = %08x", d);\r
@@ -833,7 +854,7 @@ u32 PicoReadS68k32(u32 a)
 \r
   // word RAM (2M area)\r
   if ((a&0xfc0000)==0x080000) { // 080000-0bffff\r
-    dprintf("s68k_wram2M r32: [%06x] @%06x", a, SekPcS68k);\r
+    wrdprintf("s68k_wram2M r32: [%06x] @%06x", a, SekPcS68k);\r
     if (Pico_mcd->s68k_regs[3]&4) { // 1M decode mode?\r
       int bank = !(Pico_mcd->s68k_regs[3]&1);\r
       a >>= 1;\r
@@ -845,19 +866,19 @@ u32 PicoReadS68k32(u32 a)
       // allow access in any mode, like Gens does\r
       u16 *pm=(u16 *)(Pico_mcd->word_ram2M+(a&0x3fffe)); d = (pm[0]<<16)|pm[1];\r
     }\r
-    dprintf("ret = %08x", d);\r
+    wrdprintf("ret = %08x", d);\r
     goto end;\r
   }\r
 \r
   // word RAM (1M area)\r
   if ((a&0xfe0000)==0x0c0000) { // 0c0000-0dffff\r
     int bank;\r
-    dprintf("s68k_wram1M r32: [%06x] @%06x", a, SekPcS68k);\r
+    wrdprintf("s68k_wram1M r32: [%06x] @%06x", a, SekPcS68k);\r
     if (!(Pico_mcd->s68k_regs[3]&4))\r
       dprintf("s68k_wram1M FIXME: wrong mode");\r
     bank = !(Pico_mcd->s68k_regs[3]&1);\r
     u16 *pm=(u16 *)(Pico_mcd->word_ram1M[bank]+(a&0x1fffe)); d = (pm[0]<<16)|pm[1];\r
-    dprintf("ret = %08x", d);\r
+    wrdprintf("ret = %08x", d);\r
     goto end;\r
   }\r
 \r
@@ -928,7 +949,7 @@ void PicoWriteS68k8(u32 a,u8 d)
   if ((a&0xfffe00) == 0xff8000) {\r
     a &= 0x1ff;\r
     rdprintf("s68k_regs w8: [%02x] %02x @ %06x", a, d, SekPcS68k);\r
-    if (a >= 0x50 && a < 0x68)\r
+    if (a >= 0x58 && a < 0x68)\r
          gfx_cd_write(a&~1, (d<<8)|d);\r
     else s68k_reg_write8(a,d);\r
     return;\r
@@ -936,7 +957,7 @@ void PicoWriteS68k8(u32 a,u8 d)
 \r
   // word RAM (2M area)\r
   if ((a&0xfc0000)==0x080000) { // 080000-0bffff\r
-    dprintf("s68k_wram2M w8: [%06x] %02x @%06x", a, d, SekPcS68k);\r
+    wrdprintf("s68k_wram2M w8: [%06x] %02x @%06x", a, d, SekPcS68k);\r
     if (Pico_mcd->s68k_regs[3]&4) { // 1M decode mode?\r
       int bank = !(Pico_mcd->s68k_regs[3]&1);\r
       if (a&1) d &= 0x0f;\r
@@ -954,7 +975,7 @@ void PicoWriteS68k8(u32 a,u8 d)
   if ((a&0xfe0000)==0x0c0000) { // 0c0000-0dffff\r
     int bank;\r
     if (d)\r
-      dprintf("s68k_wram1M w8: [%06x] %02x @%06x", a, d, SekPcS68k);\r
+      wrdprintf("s68k_wram1M w8: [%06x] %02x @%06x", a, d, SekPcS68k);\r
     if (!(Pico_mcd->s68k_regs[3]&4))\r
       dprintf("s68k_wram1M FIXME: wrong mode");\r
     bank = !(Pico_mcd->s68k_regs[3]&1);\r
@@ -1001,7 +1022,7 @@ void PicoWriteS68k16(u32 a,u16 d)
   if ((a&0xfffe00) == 0xff8000) {\r
     a &= 0x1fe;\r
     rdprintf("s68k_regs w16: [%02x] %04x @ %06x", a, d, SekPcS68k);\r
-    if (a >= 0x50 && a < 0x68)\r
+    if (a >= 0x58 && a < 0x68)\r
       gfx_cd_write(a, d);\r
     else {\r
       if (a == 0xe) { // special case, 2 byte writes would be handled differently\r
@@ -1016,7 +1037,7 @@ void PicoWriteS68k16(u32 a,u16 d)
 \r
   // word RAM (2M area)\r
   if ((a&0xfc0000)==0x080000) { // 080000-0bffff\r
-    dprintf("s68k_wram2M w16: [%06x] %04x @%06x", a, d, SekPcS68k);\r
+    wrdprintf("s68k_wram2M w16: [%06x] %04x @%06x", a, d, SekPcS68k);\r
     if (Pico_mcd->s68k_regs[3]&4) { // 1M decode mode?\r
       int bank = !(Pico_mcd->s68k_regs[3]&1);\r
       d &= ~0xf0; d |= d >> 8;\r
@@ -1033,7 +1054,7 @@ void PicoWriteS68k16(u32 a,u16 d)
   if ((a&0xfe0000)==0x0c0000) { // 0c0000-0dffff\r
     int bank;\r
     if (d)\r
-      dprintf("s68k_wram1M w16: [%06x] %04x @%06x", a, d, SekPcS68k);\r
+      wrdprintf("s68k_wram1M w16: [%06x] %04x @%06x", a, d, SekPcS68k);\r
     if (!(Pico_mcd->s68k_regs[3]&4))\r
       dprintf("s68k_wram1M FIXME: wrong mode");\r
     bank = !(Pico_mcd->s68k_regs[3]&1);\r
@@ -1084,7 +1105,7 @@ void PicoWriteS68k32(u32 a,u32 d)
   if ((a&0xfffe00) == 0xff8000) {\r
     a &= 0x1fe;\r
     rdprintf("s68k_regs w32: [%02x] %08x @ %06x", a, d, SekPcS68k);\r
-    if (a >= 0x50 && a < 0x68) {\r
+    if (a >= 0x58 && a < 0x68) {\r
       gfx_cd_write(a,   d>>16);\r
       gfx_cd_write(a+2, d&0xffff);\r
     } else {\r
@@ -1098,7 +1119,7 @@ void PicoWriteS68k32(u32 a,u32 d)
 \r
   // word RAM (2M area)\r
   if ((a&0xfc0000)==0x080000) { // 080000-0bffff\r
-    dprintf("s68k_wram2M w32: [%06x] %08x @%06x", a, d, SekPcS68k);\r
+    wrdprintf("s68k_wram2M w32: [%06x] %08x @%06x", a, d, SekPcS68k);\r
     if (Pico_mcd->s68k_regs[3]&4) { // 1M decode mode?\r
       int bank = !(Pico_mcd->s68k_regs[3]&1);\r
       a >>= 1;\r
@@ -1119,7 +1140,7 @@ void PicoWriteS68k32(u32 a,u32 d)
     int bank;\r
     u16 *pm;\r
     if (d)\r
-      dprintf("s68k_wram1M w32: [%06x] %08x @%06x", a, d, SekPcS68k);\r
+      wrdprintf("s68k_wram1M w32: [%06x] %08x @%06x", a, d, SekPcS68k);\r
     if (!(Pico_mcd->s68k_regs[3]&4))\r
       dprintf("s68k_wram1M FIXME: wrong mode");\r
     bank = !(Pico_mcd->s68k_regs[3]&1);\r
index ba1c5a7..e013aaa 100644 (file)
@@ -210,6 +210,7 @@ void gfx_cd_reset(void)
 
 typedef unsigned short u16;
 
+// check: Heart of the alien
 void DmaSlowCell(unsigned int source, unsigned int a, int len, unsigned char inc)
 {
   unsigned char *base;
index 24496fd..1c81c87 100644 (file)
@@ -1241,6 +1241,7 @@ if (Pico.m.frame_count == 31563) {
        // if in 16bit mode, generate 8it image for menu background\r
        if (!(PicoOpt&0x10) && (currentConfig.EmuOpt&0x80)) {\r
                PicoOpt |= 0x10;\r
+               if (!(Pico.video.reg[12]&1)) clearArea(1);\r
                PicoFrameFull();\r
                vidCpyM2((unsigned char *)gp2x_screen+320*8, framebuff+328*8);\r
                vidConvCpyRGB32(localPal, Pico.cram, 0x40);\r