trunk/src/mame/drivers/artmagic.c
| r31751 | r31752 | |
| 1112 | 1112 | * |
| 1113 | 1113 | *************************************/ |
| 1114 | 1114 | |
| 1115 | | static void decrypt_ultennis(running_machine &machine) |
| 1115 | void artmagic_state::decrypt_ultennis() |
| 1116 | 1116 | { |
| 1117 | | artmagic_state *state = machine.driver_data<artmagic_state>(); |
| 1118 | | int i; |
| 1119 | | |
| 1120 | 1117 | /* 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++) |
| 1122 | 1119 | { |
| 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; |
| 1128 | 1125 | } |
| 1129 | 1126 | } |
| 1130 | 1127 | |
| 1131 | 1128 | |
| 1132 | | static void decrypt_cheesech(running_machine &machine) |
| 1129 | void artmagic_state::decrypt_cheesech() |
| 1133 | 1130 | { |
| 1134 | | artmagic_state *state = machine.driver_data<artmagic_state>(); |
| 1135 | | int i; |
| 1136 | | |
| 1137 | 1131 | /* 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++) |
| 1139 | 1133 | { |
| 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; |
| 1145 | 1139 | } |
| 1146 | 1140 | } |
| 1147 | 1141 | |
| 1148 | 1142 | |
| 1149 | 1143 | DRIVER_INIT_MEMBER(artmagic_state,ultennis) |
| 1150 | 1144 | { |
| 1151 | | decrypt_ultennis(machine()); |
| 1145 | decrypt_ultennis(); |
| 1152 | 1146 | m_is_stoneball = 0; |
| 1153 | 1147 | m_protection_handler = ultennis_protection; |
| 1154 | 1148 | |
| r31751 | r31752 | |
| 1159 | 1153 | |
| 1160 | 1154 | DRIVER_INIT_MEMBER(artmagic_state,cheesech) |
| 1161 | 1155 | { |
| 1162 | | decrypt_cheesech(machine()); |
| 1156 | decrypt_cheesech(); |
| 1163 | 1157 | m_is_stoneball = 0; |
| 1164 | 1158 | m_protection_handler = cheesech_protection; |
| 1165 | 1159 | } |
| r31751 | r31752 | |
| 1167 | 1161 | |
| 1168 | 1162 | DRIVER_INIT_MEMBER(artmagic_state,stonebal) |
| 1169 | 1163 | { |
| 1170 | | decrypt_ultennis(machine()); |
| 1164 | decrypt_ultennis(); |
| 1171 | 1165 | m_is_stoneball = 1; /* blits 1 line high are NOT encrypted, also different first pixel decrypt */ |
| 1172 | 1166 | m_protection_handler = stonebal_protection; |
| 1173 | 1167 | } |
| r31751 | r31752 | |
| 1175 | 1169 | DRIVER_INIT_MEMBER(artmagic_state,shtstar) |
| 1176 | 1170 | { |
| 1177 | 1171 | /* wrong */ |
| 1178 | | decrypt_ultennis(machine()); |
| 1172 | decrypt_ultennis(); |
| 1179 | 1173 | m_is_stoneball =0; |
| 1180 | 1174 | m_protection_handler = stonebal_protection; |
| 1181 | 1175 | } |
trunk/src/mame/video/artmagic.c
| r31751 | r31752 | |
| 21 | 21 | * |
| 22 | 22 | *************************************/ |
| 23 | 23 | |
| 24 | | INLINE UINT16 *address_to_vram(artmagic_state *state, offs_t *address) |
| 24 | inline UINT16 *artmagic_state::address_to_vram(offs_t *address) |
| 25 | 25 | { |
| 26 | 26 | offs_t original = *address; |
| 27 | 27 | *address = TOWORD(original & 0x001fffff); |
| 28 | 28 | if (original < 0x001fffff) |
| 29 | | return state->m_vram0; |
| 29 | return m_vram0; |
| 30 | 30 | else if (original >= 0x00400000 && original < 0x005fffff) |
| 31 | | return state->m_vram1; |
| 31 | return m_vram1; |
| 32 | 32 | return NULL; |
| 33 | 33 | } |
| 34 | 34 | |
| r31751 | r31752 | |
| 62 | 62 | void artmagic_to_shiftreg(address_space &space, offs_t address, UINT16 *data) |
| 63 | 63 | { |
| 64 | 64 | 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); |
| 66 | 66 | if (vram) |
| 67 | 67 | memcpy(data, &vram[address], TOBYTE(0x2000)); |
| 68 | 68 | } |
| r31751 | r31752 | |
| 71 | 71 | void artmagic_from_shiftreg(address_space &space, offs_t address, UINT16 *data) |
| 72 | 72 | { |
| 73 | 73 | 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); |
| 75 | 75 | if (vram) |
| 76 | 76 | memcpy(&vram[address], data, TOBYTE(0x2000)); |
| 77 | 77 | } |
| r31751 | r31752 | |
| 84 | 84 | * |
| 85 | 85 | *************************************/ |
| 86 | 86 | |
| 87 | | static void execute_blit(running_machine &machine) |
| 87 | void artmagic_state::execute_blit() |
| 88 | 88 | { |
| 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; |
| 99 | 98 | int i, j, sx, sy, last; |
| 100 | 99 | |
| 101 | 100 | #if 0 |
| r31751 | r31752 | |
| 106 | 105 | |
| 107 | 106 | logerror("%s:Blit from %06X to (%d,%d) %dx%d -- %04X %04X %04X %04X %04X %04X %04X %04X\n", |
| 108 | 107 | 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]); |
| 113 | 112 | |
| 114 | 113 | if (!f) f = fopen("artmagic.log", "w"); |
| 115 | 114 | |
| r31751 | r31752 | |
| 124 | 123 | fprintf(f, "----------------------\n" |
| 125 | 124 | "%s:Blit from %06X to (%d,%d) %dx%d -- %04X %04X %04X %04X %04X %04X %04X %04X\n", |
| 126 | 125 | 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]); |
| 131 | 130 | |
| 132 | 131 | fprintf(f, "\t"); |
| 133 | 132 | for (i = 0; i < h; i++) |
| 134 | 133 | { |
| 135 | 134 | for (j = 0; j < w; j += 4) |
| 136 | | fprintf(f, "%04X ", state->m_blitter_base[tempoffs++]); |
| 135 | fprintf(f, "%04X ", m_blitter_base[tempoffs++]); |
| 137 | 136 | fprintf(f, "\n\t"); |
| 138 | 137 | } |
| 139 | 138 | fprintf(f, "\n\t"); |
| r31751 | r31752 | |
| 144 | 143 | if (i == 0) /* first line */ |
| 145 | 144 | { |
| 146 | 145 | /* 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); |
| 150 | 149 | else /* ultennis */ |
| 151 | | last ^= ((state->m_blitter_data[0] & 0x0040) >> 4); |
| 150 | last ^= ((m_blitter_data[0] & 0x0040) >> 4); |
| 152 | 151 | |
| 153 | 152 | /* 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); |
| 156 | 155 | } |
| 157 | 156 | else /* following lines */ |
| 158 | 157 | { |
| 159 | | int val = state->m_blitter_base[tempoffs]; |
| 158 | int val = m_blitter_base[tempoffs]; |
| 160 | 159 | |
| 161 | 160 | /* ultennis, stonebal */ |
| 162 | 161 | last ^= 4; |
| r31751 | r31752 | |
| 172 | 171 | for (j = 0; j < w; j += 4) |
| 173 | 172 | { |
| 174 | 173 | static const char hex[] = ".123456789ABCDEF"; |
| 175 | | int val = state->m_blitter_base[tempoffs++]; |
| 174 | int val = m_blitter_base[tempoffs++]; |
| 176 | 175 | 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; |
| 181 | 180 | fprintf(f, "%c%c%c%c ", hex[p1], hex[p2], hex[p3], hex[p4]); |
| 182 | 181 | } |
| 183 | 182 | fprintf(f, "\n\t"); |
| r31751 | r31752 | |
| 213 | 212 | if (i == 0) /* first line */ |
| 214 | 213 | { |
| 215 | 214 | /* 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); |
| 219 | 218 | else /* ultennis */ |
| 220 | | last ^= (((state->m_blitter_data[0] + 1) & 0x0040) >> 4); |
| 219 | last ^= (((m_blitter_data[0] + 1) & 0x0040) >> 4); |
| 221 | 220 | |
| 222 | 221 | /* 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); |
| 225 | 224 | } |
| 226 | 225 | else /* following lines */ |
| 227 | 226 | { |
| 228 | | int val = state->m_blitter_base[offset & state->m_blitter_mask]; |
| 227 | int val = m_blitter_base[offset & m_blitter_mask]; |
| 229 | 228 | |
| 230 | 229 | /* ultennis, stonebal */ |
| 231 | 230 | last ^= 4; |
| r31751 | r31752 | |
| 240 | 239 | |
| 241 | 240 | for (j = 0; j < w; j += 4) |
| 242 | 241 | { |
| 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]; |
| 244 | 243 | if (sx < 508) |
| 245 | 244 | { |
| 246 | | if (h == 1 && state->m_is_stoneball) |
| 245 | if (h == 1 && m_is_stoneball) |
| 247 | 246 | last = ((val) >> 0) & 0xf; |
| 248 | 247 | else |
| 249 | | last = ((val ^ state->m_xor[last]) >> 0) & 0xf; |
| 248 | last = ((val ^ m_xor[last]) >> 0) & 0xf; |
| 250 | 249 | if (!((maskx << ((j/2) & 7)) & 0x80)) |
| 251 | 250 | { |
| 252 | 251 | if (last && sx >= 0 && sx < 512) |
| r31751 | r31752 | |
| 254 | 253 | sx++; |
| 255 | 254 | } |
| 256 | 255 | |
| 257 | | if (h == 1 && state->m_is_stoneball) |
| 256 | if (h == 1 && m_is_stoneball) |
| 258 | 257 | last = ((val) >> 4) & 0xf; |
| 259 | 258 | else |
| 260 | | last = ((val ^ state->m_xor[last]) >> 4) & 0xf; |
| 259 | last = ((val ^ m_xor[last]) >> 4) & 0xf; |
| 261 | 260 | { |
| 262 | 261 | if (last && sx >= 0 && sx < 512) |
| 263 | 262 | dest[tsy + sx] = color | (last); |
| 264 | 263 | sx++; |
| 265 | 264 | } |
| 266 | 265 | |
| 267 | | if (h == 1 && state->m_is_stoneball) |
| 266 | if (h == 1 && m_is_stoneball) |
| 268 | 267 | last = ((val) >> 8) & 0xf; |
| 269 | 268 | else |
| 270 | | last = ((val ^ state->m_xor[last]) >> 8) & 0xf; |
| 269 | last = ((val ^ m_xor[last]) >> 8) & 0xf; |
| 271 | 270 | if (!((maskx << ((j/2) & 7)) & 0x40)) |
| 272 | 271 | { |
| 273 | 272 | if (last && sx >= 0 && sx < 512) |
| r31751 | r31752 | |
| 275 | 274 | sx++; |
| 276 | 275 | } |
| 277 | 276 | |
| 278 | | if (h == 1 && state->m_is_stoneball) |
| 277 | if (h == 1 && m_is_stoneball) |
| 279 | 278 | last = ((val) >> 12) & 0xf; |
| 280 | 279 | else |
| 281 | | last = ((val ^ state->m_xor[last]) >> 12) & 0xf; |
| 280 | last = ((val ^ m_xor[last]) >> 12) & 0xf; |
| 282 | 281 | { |
| 283 | 282 | if (last && sx >= 0 && sx < 512) |
| 284 | 283 | dest[tsy + sx] = color | (last); |
| r31751 | r31752 | |
| 295 | 294 | g_profiler.stop(); |
| 296 | 295 | |
| 297 | 296 | #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); |
| 299 | 298 | #endif |
| 300 | 299 | } |
| 301 | 300 | |
| r31751 | r31752 | |
| 322 | 321 | |
| 323 | 322 | /* offset 3 triggers the blit */ |
| 324 | 323 | if (offset == 3) |
| 325 | | execute_blit(machine()); |
| 324 | execute_blit(); |
| 326 | 325 | |
| 327 | 326 | /* offset 4 contains the target page */ |
| 328 | 327 | else if (offset == 4) |
| r31751 | r31752 | |
| 341 | 340 | { |
| 342 | 341 | artmagic_state *state = screen.machine().driver_data<artmagic_state>(); |
| 343 | 342 | offs_t offset = (params->rowaddr << 12) & 0x7ff000; |
| 344 | | UINT16 *vram = address_to_vram(state, &offset); |
| 343 | UINT16 *vram = state->address_to_vram(&offset); |
| 345 | 344 | UINT32 *dest = &bitmap.pix32(scanline); |
| 346 | 345 | const rgb_t *pens = state->m_tlc34076->get_pens(); |
| 347 | 346 | int coladdr = params->coladdr << 1; |