X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=Pico%2Fcd%2Fgfx_cd.c;h=0e4bdf2f8ba384e05b01bfccf651e068f88c1dae;hb=5c69a605aeaa09798db62a4cfcce7bba4f9dc2b6;hp=4f393bd553e2bcec9542677062c22917bde0ccaa;hpb=d1df87866b45a5ab9f1b6c6c8a40da6a3a777f83;p=picodrive.git diff --git a/Pico/cd/gfx_cd.c b/Pico/cd/gfx_cd.c index 4f393bd..0e4bdf2 100644 --- a/Pico/cd/gfx_cd.c +++ b/Pico/cd/gfx_cd.c @@ -1,10 +1,11 @@ // TODO... +// #include #include "../PicoInt.h" #define rot_comp Pico_mcd->rot_comp -static int Table_Rot_Time[] = +static const int Table_Rot_Time[] = { 0x00054000, 0x00048000, 0x00040000, 0x00036000, //; 008-032 ; briefing - sprite 0x0002E000, 0x00028000, 0x00024000, 0x00022000, //; 036-064 ; arbre souvent @@ -145,7 +146,7 @@ unsigned int gfx_cd_read(unsigned int a) case 0x62: d = rot_comp.Reg_62; break; case 0x64: d = rot_comp.Reg_64; break; case 0x66: break; - default: dprintf("gfx_cd_read: unexpected address: %02x", a); break; + default: dprintf("gfx_cd_read FIXME: unexpected address: %02x", a); break; } dprintf("gfx_cd_read(%02x) = %04x", a, d); @@ -153,9 +154,9 @@ unsigned int gfx_cd_read(unsigned int a) return 0; } -void gfx_cd_write(unsigned int a, unsigned int d) +void gfx_cd_write16(unsigned int a, unsigned int d) { - dprintf("gfx_cd_write(%x, %04x)", a, d); + dprintf("gfx_cd_write16(%x, %04x)", a, d); switch (a) { case 0x58: // .Reg_Stamp_Size @@ -192,8 +193,83 @@ void gfx_cd_write(unsigned int a, unsigned int d) gfx_cd_start(); return; - default: dprintf("gfx_cd_write: unexpected address: %02x", a); return; + default: dprintf("gfx_cd_write16 FIXME: unexpected address: %02x", a); return; } } +void gfx_cd_reset(void) +{ + memset(&rot_comp.Reg_58, 0, sizeof(rot_comp)); +} + + +// -------------------------------- + +#include "cell_map.c" + +typedef unsigned short u16; + +// check: Heart of the alien, jaguar xj 220 +void DmaSlowCell(unsigned int source, unsigned int a, int len, unsigned char inc) +{ + unsigned char *base; + unsigned int asrc, a2; + u16 *r; + + base = Pico_mcd->word_ram1M[Pico_mcd->s68k_regs[3]&1]; + + switch (Pico.video.type) + { + case 1: // vram + r = Pico.vram; + for(; len; len--) + { + asrc = cell_map(source >> 2) << 2; + asrc |= source & 2; + // if(a&1) d=(d<<8)|(d>>8); // ?? + r[a>>1] = *(u16 *)(base + asrc); + source += 2; + // AutoIncrement + a=(u16)(a+inc); + } + rendstatus|=0x10; + break; + + case 3: // cram + Pico.m.dirtyPal = 1; + r = Pico.cram; + for(a2=a&0x7f; len; len--) + { + asrc = cell_map(source >> 2) << 2; + asrc |= source & 2; + r[a2>>1] = *(u16 *)(base + asrc); + source += 2; + // AutoIncrement + a2+=inc; + // good dest? + if(a2 >= 0x80) break; + } + a=(a&0xff00)|a2; + break; + + case 5: // vsram[a&0x003f]=d; + r = Pico.vsram; + for(a2=a&0x7f; len; len--) + { + asrc = cell_map(source >> 2) << 2; + asrc |= source & 2; + r[a2>>1] = *(u16 *)(base + asrc); + source += 2; + // AutoIncrement + a2+=inc; + // good dest? + if(a2 >= 0x80) break; + } + a=(a&0xff00)|a2; + break; + } + // remember addr + Pico.video.addr=(u16)a; +} +