Previous 199869 Revisions Next

r31752 Sunday 24th August, 2014 at 07:31:50 UTC by Osso
artmagic.c: moved some functions into driver class (nw)
[src/mame/drivers]artmagic.c
[src/mame/includes]artmagic.h
[src/mame/video]artmagic.c

trunk/src/mame/drivers/artmagic.c
r31751r31752
11121112 *
11131113 *************************************/
11141114
1115static void decrypt_ultennis(running_machine &machine)
1115void artmagic_state::decrypt_ultennis()
11161116{
1117   artmagic_state *state = machine.driver_data<artmagic_state>();
1118   int i;
1119
11201117   /* set up the parameters for the blitter data decryption which will happen at runtime */
1121   for (i = 0;i < 16;i++)
1118   for (int i = 0; i < 16; i++)
11221119   {
1123      state->m_xor[i] = 0x0462;
1124      if (i & 1) state->m_xor[i] ^= 0x0011;
1125      if (i & 2) state->m_xor[i] ^= 0x2200;
1126      if (i & 4) state->m_xor[i] ^= 0x4004;
1127      if (i & 8) state->m_xor[i] ^= 0x0880;
1120      m_xor[i] = 0x0462;
1121      if (i & 1) m_xor[i] ^= 0x0011;
1122      if (i & 2) m_xor[i] ^= 0x2200;
1123      if (i & 4) m_xor[i] ^= 0x4004;
1124      if (i & 8) m_xor[i] ^= 0x0880;
11281125   }
11291126}
11301127
11311128
1132static void decrypt_cheesech(running_machine &machine)
1129void artmagic_state::decrypt_cheesech()
11331130{
1134   artmagic_state *state = machine.driver_data<artmagic_state>();
1135   int i;
1136
11371131   /* set up the parameters for the blitter data decryption which will happen at runtime */
1138   for (i = 0;i < 16;i++)
1132   for (int i = 0; i < 16; i++)
11391133   {
1140      state->m_xor[i] = 0x0891;
1141      if (i & 1) state->m_xor[i] ^= 0x1100;
1142      if (i & 2) state->m_xor[i] ^= 0x0022;
1143      if (i & 4) state->m_xor[i] ^= 0x0440;
1144      if (i & 8) state->m_xor[i] ^= 0x8008;
1134      m_xor[i] = 0x0891;
1135      if (i & 1) m_xor[i] ^= 0x1100;
1136      if (i & 2) m_xor[i] ^= 0x0022;
1137      if (i & 4) m_xor[i] ^= 0x0440;
1138      if (i & 8) m_xor[i] ^= 0x8008;
11451139   }
11461140}
11471141
11481142
11491143DRIVER_INIT_MEMBER(artmagic_state,ultennis)
11501144{
1151   decrypt_ultennis(machine());
1145   decrypt_ultennis();
11521146   m_is_stoneball = 0;
11531147   m_protection_handler = ultennis_protection;
11541148
r31751r31752
11591153
11601154DRIVER_INIT_MEMBER(artmagic_state,cheesech)
11611155{
1162   decrypt_cheesech(machine());
1156   decrypt_cheesech();
11631157   m_is_stoneball = 0;
11641158   m_protection_handler = cheesech_protection;
11651159}
r31751r31752
11671161
11681162DRIVER_INIT_MEMBER(artmagic_state,stonebal)
11691163{
1170   decrypt_ultennis(machine());
1164   decrypt_ultennis();
11711165   m_is_stoneball = 1; /* blits 1 line high are NOT encrypted, also different first pixel decrypt */
11721166   m_protection_handler = stonebal_protection;
11731167}
r31751r31752
11751169DRIVER_INIT_MEMBER(artmagic_state,shtstar)
11761170{
11771171   /* wrong */
1178   decrypt_ultennis(machine());
1172   decrypt_ultennis();
11791173   m_is_stoneball =0;
11801174   m_protection_handler = stonebal_protection;
11811175}
trunk/src/mame/includes/artmagic.h
r31751r31752
1818
1919   artmagic_state(const machine_config &mconfig, device_type type, const char *tag)
2020      : driver_device(mconfig, type, tag),
21      m_maincpu(*this, "maincpu"),
22      m_oki(*this, "oki"),
23      m_tms(*this, "tms"),
2124      m_tlc34076(*this, "tlc34076"),
2225      m_control(*this, "control"),
2326      m_vram0(*this, "vram0"),
24      m_vram1(*this, "vram1"),
25      m_maincpu(*this, "maincpu"),
26      m_oki(*this, "oki"),
27      m_tms(*this, "tms") { }
27      m_vram1(*this, "vram1") { }
2828
29   required_device<cpu_device> m_maincpu;
30   required_device<okim6295_device> m_oki;
31   required_device<tms34010_device> m_tms;
2932   required_device<tlc34076_device> m_tlc34076;
33   
3034   required_shared_ptr<UINT16> m_control;
35   
3136   UINT8 m_tms_irq;
3237   UINT8 m_hack_irq;
3338   UINT8 m_prot_input[16];
r31751r31752
6166   virtual void machine_start();
6267   virtual void machine_reset();
6368   virtual void video_start();
64   required_device<cpu_device> m_maincpu;
65   required_device<okim6295_device> m_oki;
66   required_device<tms34010_device> m_tms;
69   void decrypt_cheesech();
70   void decrypt_ultennis();
71   void execute_blit();
72   inline UINT16 *address_to_vram(offs_t *address);
73   
6774protected:
6875   virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
6976};
trunk/src/mame/video/artmagic.c
r31751r31752
2121 *
2222 *************************************/
2323
24INLINE UINT16 *address_to_vram(artmagic_state *state, offs_t *address)
24inline UINT16 *artmagic_state::address_to_vram(offs_t *address)
2525{
2626   offs_t original = *address;
2727   *address = TOWORD(original & 0x001fffff);
2828   if (original < 0x001fffff)
29      return state->m_vram0;
29      return m_vram0;
3030   else if (original >= 0x00400000 && original < 0x005fffff)
31      return state->m_vram1;
31      return m_vram1;
3232   return NULL;
3333}
3434
r31751r31752
6262void artmagic_to_shiftreg(address_space &space, offs_t address, UINT16 *data)
6363{
6464   artmagic_state *state = space.machine().driver_data<artmagic_state>();
65   UINT16 *vram = address_to_vram(state, &address);
65   UINT16 *vram = state->address_to_vram(&address);
6666   if (vram)
6767      memcpy(data, &vram[address], TOBYTE(0x2000));
6868}
r31751r31752
7171void artmagic_from_shiftreg(address_space &space, offs_t address, UINT16 *data)
7272{
7373   artmagic_state *state = space.machine().driver_data<artmagic_state>();
74   UINT16 *vram = address_to_vram(state, &address);
74   UINT16 *vram = state->address_to_vram(&address);
7575   if (vram)
7676      memcpy(&vram[address], data, TOBYTE(0x2000));
7777}
r31751r31752
8484 *
8585 *************************************/
8686
87static void execute_blit(running_machine &machine)
87void artmagic_state::execute_blit()
8888{
89   artmagic_state *state = machine.driver_data<artmagic_state>();
90   UINT16 *dest = state->m_blitter_page ? state->m_vram0 : state->m_vram1;
91   int offset = ((state->m_blitter_data[1] & 0xff) << 16) | state->m_blitter_data[0];
92   int color = (state->m_blitter_data[1] >> 4) & 0xf0;
93   int x = (INT16)state->m_blitter_data[2];
94   int y = (INT16)state->m_blitter_data[3];
95   int maskx = state->m_blitter_data[6] & 0xff;
96   int masky = state->m_blitter_data[6] >> 8;
97   int w = ((state->m_blitter_data[7] & 0xff) + 1) * 4;
98   int h = (state->m_blitter_data[7] >> 8) + 1;
89   UINT16 *dest = m_blitter_page ? m_vram0 : m_vram1;
90   int offset = ((m_blitter_data[1] & 0xff) << 16) | m_blitter_data[0];
91   int color = (m_blitter_data[1] >> 4) & 0xf0;
92   int x = (INT16)m_blitter_data[2];
93   int y = (INT16)m_blitter_data[3];
94   int maskx = m_blitter_data[6] & 0xff;
95   int masky = m_blitter_data[6] >> 8;
96   int w = ((m_blitter_data[7] & 0xff) + 1) * 4;
97   int h = (m_blitter_data[7] >> 8) + 1;
9998   int i, j, sx, sy, last;
10099
101100#if 0
r31751r31752
106105
107106   logerror("%s:Blit from %06X to (%d,%d) %dx%d -- %04X %04X %04X %04X %04X %04X %04X %04X\n",
108107            machine.describe_context(), offset, x, y, w, h,
109            state->m_blitter_data[0], state->m_blitter_data[1],
110            state->m_blitter_data[2], state->m_blitter_data[3],
111            state->m_blitter_data[4], state->m_blitter_data[5],
112            state->m_blitter_data[6], state->m_blitter_data[7]);
108            m_blitter_data[0], m_blitter_data[1],
109            m_blitter_data[2], m_blitter_data[3],
110            m_blitter_data[4], m_blitter_data[5],
111            m_blitter_data[6], m_blitter_data[7]);
113112
114113   if (!f) f = fopen("artmagic.log", "w");
115114
r31751r31752
124123      fprintf(f, "----------------------\n"
125124               "%s:Blit from %06X to (%d,%d) %dx%d -- %04X %04X %04X %04X %04X %04X %04X %04X\n",
126125               machine.describe_context(), offset, x, y, w, h,
127               state->m_blitter_data[0], state->m_blitter_data[1],
128               state->m_blitter_data[2], state->m_blitter_data[3],
129               state->m_blitter_data[4], state->m_blitter_data[5],
130               state->m_blitter_data[6], state->m_blitter_data[7]);
126               m_blitter_data[0], m_blitter_data[1],
127               m_blitter_data[2], m_blitter_data[3],
128               m_blitter_data[4], m_blitter_data[5],
129               m_blitter_data[6], m_blitter_data[7]);
131130
132131      fprintf(f, "\t");
133132      for (i = 0; i < h; i++)
134133      {
135134         for (j = 0; j < w; j += 4)
136            fprintf(f, "%04X ", state->m_blitter_base[tempoffs++]);
135            fprintf(f, "%04X ", m_blitter_base[tempoffs++]);
137136         fprintf(f, "\n\t");
138137      }
139138      fprintf(f, "\n\t");
r31751r31752
144143         if (i == 0) /* first line */
145144         {
146145            /* ultennis, stonebal */
147            last ^= (state->m_blitter_data[7] & 0x0001);
148            if (state->m_is_stoneball)
149               last ^= ((state->m_blitter_data[0] & 0x0020) >> 3);
146            last ^= (m_blitter_data[7] & 0x0001);
147            if (m_is_stoneball)
148               last ^= ((m_blitter_data[0] & 0x0020) >> 3);
150149            else    /* ultennis */
151               last ^= ((state->m_blitter_data[0] & 0x0040) >> 4);
150               last ^= ((m_blitter_data[0] & 0x0040) >> 4);
152151
153152            /* cheesech */
154            last ^= ((state->m_blitter_data[7] & 0x0400) >> 9);
155            last ^= ((state->m_blitter_data[0] & 0x2000) >> 10);
153            last ^= ((m_blitter_data[7] & 0x0400) >> 9);
154            last ^= ((m_blitter_data[0] & 0x2000) >> 10);
156155         }
157156         else    /* following lines */
158157         {
159            int val = state->m_blitter_base[tempoffs];
158            int val = m_blitter_base[tempoffs];
160159
161160            /* ultennis, stonebal */
162161            last ^= 4;
r31751r31752
172171         for (j = 0; j < w; j += 4)
173172         {
174173            static const char hex[] = ".123456789ABCDEF";
175            int val = state->m_blitter_base[tempoffs++];
174            int val = m_blitter_base[tempoffs++];
176175            int p1, p2, p3, p4;
177            p1 = last = ((val ^ state->m_xor[last]) >>  0) & 0xf;
178            p2 = last = ((val ^ state->m_xor[last]) >>  4) & 0xf;
179            p3 = last = ((val ^ state->m_xor[last]) >>  8) & 0xf;
180            p4 = last = ((val ^ state->m_xor[last]) >> 12) & 0xf;
176            p1 = last = ((val ^ m_xor[last]) >>  0) & 0xf;
177            p2 = last = ((val ^ m_xor[last]) >>  4) & 0xf;
178            p3 = last = ((val ^ m_xor[last]) >>  8) & 0xf;
179            p4 = last = ((val ^ m_xor[last]) >> 12) & 0xf;
181180            fprintf(f, "%c%c%c%c ", hex[p1], hex[p2], hex[p3], hex[p4]);
182181         }
183182         fprintf(f, "\n\t");
r31751r31752
213212            if (i == 0) /* first line */
214213            {
215214               /* ultennis, stonebal */
216               last ^= (state->m_blitter_data[7] & 0x0001);
217               if (state->m_is_stoneball)
218                  last ^= ((state->m_blitter_data[0] & 0x0020) >> 3);
215               last ^= (m_blitter_data[7] & 0x0001);
216               if (m_is_stoneball)
217                  last ^= ((m_blitter_data[0] & 0x0020) >> 3);
219218               else    /* ultennis */
220                  last ^= (((state->m_blitter_data[0] + 1) & 0x0040) >> 4);
219                  last ^= (((m_blitter_data[0] + 1) & 0x0040) >> 4);
221220
222221               /* cheesech */
223               last ^= ((state->m_blitter_data[7] & 0x0400) >> 9);
224               last ^= ((state->m_blitter_data[0] & 0x2000) >> 10);
222               last ^= ((m_blitter_data[7] & 0x0400) >> 9);
223               last ^= ((m_blitter_data[0] & 0x2000) >> 10);
225224            }
226225            else    /* following lines */
227226            {
228               int val = state->m_blitter_base[offset & state->m_blitter_mask];
227               int val = m_blitter_base[offset & m_blitter_mask];
229228
230229               /* ultennis, stonebal */
231230               last ^= 4;
r31751r31752
240239
241240            for (j = 0; j < w; j += 4)
242241            {
243               UINT16 val = state->m_blitter_base[(offset + j/4) & state->m_blitter_mask];
242               UINT16 val = m_blitter_base[(offset + j/4) & m_blitter_mask];
244243               if (sx < 508)
245244               {
246                  if (h == 1 && state->m_is_stoneball)
245                  if (h == 1 && m_is_stoneball)
247246                     last = ((val) >>  0) & 0xf;
248247                  else
249                     last = ((val ^ state->m_xor[last]) >>  0) & 0xf;
248                     last = ((val ^ m_xor[last]) >>  0) & 0xf;
250249                  if (!((maskx << ((j/2) & 7)) & 0x80))
251250                  {
252251                     if (last && sx >= 0 && sx < 512)
r31751r31752
254253                     sx++;
255254                  }
256255
257                  if (h == 1 && state->m_is_stoneball)
256                  if (h == 1 && m_is_stoneball)
258257                     last = ((val) >>  4) & 0xf;
259258                  else
260                     last = ((val ^ state->m_xor[last]) >>  4) & 0xf;
259                     last = ((val ^ m_xor[last]) >>  4) & 0xf;
261260                  {
262261                     if (last && sx >= 0 && sx < 512)
263262                        dest[tsy + sx] = color | (last);
264263                     sx++;
265264                  }
266265
267                  if (h == 1 && state->m_is_stoneball)
266                  if (h == 1 && m_is_stoneball)
268267                     last = ((val) >>  8) & 0xf;
269268                  else
270                     last = ((val ^ state->m_xor[last]) >>  8) & 0xf;
269                     last = ((val ^ m_xor[last]) >>  8) & 0xf;
271270                  if (!((maskx << ((j/2) & 7)) & 0x40))
272271                  {
273272                     if (last && sx >= 0 && sx < 512)
r31751r31752
275274                     sx++;
276275                  }
277276
278                  if (h == 1 && state->m_is_stoneball)
277                  if (h == 1 && m_is_stoneball)
279278                     last = ((val) >> 12) & 0xf;
280279                  else
281                     last = ((val ^ state->m_xor[last]) >> 12) & 0xf;
280                     last = ((val ^ m_xor[last]) >> 12) & 0xf;
282281                  {
283282                     if (last && sx >= 0 && sx < 512)
284283                        dest[tsy + sx] = color | (last);
r31751r31752
295294   g_profiler.stop();
296295
297296#if (!INSTANT_BLIT)
298   state->m_blitter_busy_until = machine.time() + attotime::from_nsec(w*h*20);
297   m_blitter_busy_until = machine.time() + attotime::from_nsec(w*h*20);
299298#endif
300299}
301300
r31751r31752
322321
323322   /* offset 3 triggers the blit */
324323   if (offset == 3)
325      execute_blit(machine());
324      execute_blit();
326325
327326   /* offset 4 contains the target page */
328327   else if (offset == 4)
r31751r31752
341340{
342341   artmagic_state *state = screen.machine().driver_data<artmagic_state>();
343342   offs_t offset = (params->rowaddr << 12) & 0x7ff000;
344   UINT16 *vram = address_to_vram(state, &offset);
343   UINT16 *vram = state->address_to_vram(&offset);
345344   UINT32 *dest = &bitmap.pix32(scanline);
346345   const rgb_t *pens = state->m_tlc34076->get_pens();
347346   int coladdr = params->coladdr << 1;

Previous 199869 Revisions Next


© 1997-2024 The MAME Team