trunk/src/mess/video/upd7220.c
| r19788 | r19789 | |
| 45 | 45 | // MACROS / CONSTANTS |
| 46 | 46 | //************************************************************************** |
| 47 | 47 | |
| 48 | | #define LOG 1 |
| 48 | #define VERBOSE 0 |
| 49 | #define LOG(x) do { if (VERBOSE) logerror x; } while (0) |
| 49 | 50 | |
| 50 | 51 | |
| 51 | 52 | // todo typedef |
| r19788 | r19789 | |
| 412 | 413 | visarea.max_x = m_aw * horiz_mult - 1;//horiz_pix_total - (m_hfp * 8) - 1; |
| 413 | 414 | visarea.max_y = m_al - 1;//vert_pix_total - m_vfp - 1; |
| 414 | 415 | |
| 415 | | if (LOG) |
| 416 | | { |
| 417 | | logerror("uPD7220 '%s' Screen: %u x %u @ %f Hz\n", tag(), horiz_pix_total, vert_pix_total, 1 / ATTOSECONDS_TO_DOUBLE(refresh)); |
| 418 | | logerror("Visible Area: (%u, %u) - (%u, %u)\n", visarea.min_x, visarea.min_y, visarea.max_x, visarea.max_y); |
| 419 | | logerror("%d %d %d %d %d\n",m_hs,m_hbp,m_aw,m_hfp,m_pitch); |
| 420 | | logerror("%d %d %d %d\n",m_vs,m_vbp,m_al,m_vfp); |
| 421 | | } |
| 416 | LOG(("uPD7220 '%s' Screen: %u x %u @ %f Hz\n", tag(), horiz_pix_total, vert_pix_total, 1 / ATTOSECONDS_TO_DOUBLE(refresh))); |
| 417 | LOG(("Visible Area: (%u, %u) - (%u, %u)\n", visarea.min_x, visarea.min_y, visarea.max_x, visarea.max_y)); |
| 418 | LOG(("%d %d %d %d %d\n",m_hs,m_hbp,m_aw,m_hfp,m_pitch)); |
| 419 | LOG(("%d %d %d %d\n",m_vs,m_vbp,m_al,m_vfp)); |
| 422 | 420 | |
| 423 | 421 | if (m_m) |
| 424 | 422 | { |
| r19788 | r19789 | |
| 522 | 520 | { |
| 523 | 521 | if (type == 1) |
| 524 | 522 | { |
| 525 | | logerror("uPD7220 invalid type 1 RDAT parameter\n"); |
| 523 | LOG (("uPD7220 invalid type 1 RDAT parameter\n")); |
| 526 | 524 | return; |
| 527 | 525 | } |
| 528 | 526 | |
| 529 | 527 | if (mod) |
| 530 | | logerror("uPD7220 RDAT used with mod = %02x?\n",mod); |
| 528 | LOG (("uPD7220 RDAT used with mod = %02x?\n",mod)); |
| 531 | 529 | |
| 532 | 530 | for (int i = 0; i < m_figs.m_dc; i++) |
| 533 | 531 | { |
| r19788 | r19789 | |
| 939 | 937 | UINT16 line_pattern; |
| 940 | 938 | UINT8 dot; |
| 941 | 939 | |
| 942 | | logerror("uPD7220 rectangle check: %d %d %02x %08x\n",x,y,m_figs.m_dir,m_ead); |
| 940 | LOG(("uPD7220 rectangle check: %d %d %02x %08x\n",x,y,m_figs.m_dir,m_ead)); |
| 943 | 941 | |
| 944 | 942 | line_pattern = check_pattern((m_ra[8]) | (m_ra[9]<<8)); |
| 945 | 943 | rect_type = (m_figs.m_dir & 1) << 2; |
| r19788 | r19789 | |
| 1128 | 1126 | switch (m_param_ptr) |
| 1129 | 1127 | { |
| 1130 | 1128 | case 0: |
| 1131 | | if (LOG) logerror("uPD7220 '%s' RESET\n", tag()); |
| 1129 | LOG(("uPD7220 '%s' RESET\n", tag())); |
| 1132 | 1130 | |
| 1133 | 1131 | m_de = 0; |
| 1134 | 1132 | m_ra[0] = m_ra[1] = m_ra[2] = 0; |
| r19788 | r19789 | |
| 1151 | 1149 | |
| 1152 | 1150 | m_pitch = m_aw; |
| 1153 | 1151 | |
| 1154 | | if (LOG) |
| 1155 | | { |
| 1156 | | logerror("uPD7220 '%s' Mode: %02x\n", tag(), m_mode); |
| 1157 | | logerror("uPD7220 '%s' AW: %u\n", tag(), m_aw); |
| 1158 | | logerror("uPD7220 '%s' HS: %u\n", tag(), m_hs); |
| 1159 | | logerror("uPD7220 '%s' VS: %u\n", tag(), m_vs); |
| 1160 | | logerror("uPD7220 '%s' HFP: %u\n", tag(), m_hfp); |
| 1161 | | logerror("uPD7220 '%s' HBP: %u\n", tag(), m_hbp); |
| 1162 | | logerror("uPD7220 '%s' VFP: %u\n", tag(), m_vfp); |
| 1163 | | logerror("uPD7220 '%s' AL: %u\n", tag(), m_al); |
| 1164 | | logerror("uPD7220 '%s' VBP: %u\n", tag(), m_vbp); |
| 1165 | | logerror("uPD7220 '%s' PITCH: %u\n", tag(), m_pitch); |
| 1166 | | } |
| 1152 | LOG(("uPD7220 '%s' Mode: %02x\n", tag(), m_mode)); |
| 1153 | LOG(("uPD7220 '%s' AW: %u\n", tag(), m_aw)); |
| 1154 | LOG(("uPD7220 '%s' HS: %u\n", tag(), m_hs)); |
| 1155 | LOG(("uPD7220 '%s' VS: %u\n", tag(), m_vs)); |
| 1156 | LOG(("uPD7220 '%s' HFP: %u\n", tag(), m_hfp)); |
| 1157 | LOG(("uPD7220 '%s' HBP: %u\n", tag(), m_hbp)); |
| 1158 | LOG(("uPD7220 '%s' VFP: %u\n", tag(), m_vfp)); |
| 1159 | LOG(("uPD7220 '%s' AL: %u\n", tag(), m_al)); |
| 1160 | LOG(("uPD7220 '%s' VBP: %u\n", tag(), m_vbp)); |
| 1161 | LOG(("uPD7220 '%s' PITCH: %u\n", tag(), m_pitch)); |
| 1167 | 1162 | |
| 1168 | 1163 | recompute_parameters(); |
| 1169 | 1164 | break; |
| r19788 | r19789 | |
| 1185 | 1180 | |
| 1186 | 1181 | m_pitch = m_aw; |
| 1187 | 1182 | |
| 1188 | | if (LOG) |
| 1189 | | { |
| 1190 | | logerror("uPD7220 '%s' Mode: %02x\n", tag(), m_mode); |
| 1191 | | logerror("uPD7220 '%s' AW: %u\n", tag(), m_aw); |
| 1192 | | logerror("uPD7220 '%s' HS: %u\n", tag(), m_hs); |
| 1193 | | logerror("uPD7220 '%s' VS: %u\n", tag(), m_vs); |
| 1194 | | logerror("uPD7220 '%s' HFP: %u\n", tag(), m_hfp); |
| 1195 | | logerror("uPD7220 '%s' HBP: %u\n", tag(), m_hbp); |
| 1196 | | logerror("uPD7220 '%s' VFP: %u\n", tag(), m_vfp); |
| 1197 | | logerror("uPD7220 '%s' AL: %u\n", tag(), m_al); |
| 1198 | | logerror("uPD7220 '%s' VBP: %u\n", tag(), m_vbp); |
| 1199 | | logerror("uPD7220 '%s' PITCH: %u\n", tag(), m_pitch); |
| 1200 | | } |
| 1183 | LOG(("uPD7220 '%s' Mode: %02x\n", tag(), m_mode)); |
| 1184 | LOG(("uPD7220 '%s' AW: %u\n", tag(), m_aw)); |
| 1185 | LOG(("uPD7220 '%s' HS: %u\n", tag(), m_hs)); |
| 1186 | LOG(("uPD7220 '%s' VS: %u\n", tag(), m_vs)); |
| 1187 | LOG(("uPD7220 '%s' HFP: %u\n", tag(), m_hfp)); |
| 1188 | LOG(("uPD7220 '%s' HBP: %u\n", tag(), m_hbp)); |
| 1189 | LOG(("uPD7220 '%s' VFP: %u\n", tag(), m_vfp)); |
| 1190 | LOG(("uPD7220 '%s' AL: %u\n", tag(), m_al)); |
| 1191 | LOG(("uPD7220 '%s' VBP: %u\n", tag(), m_vbp)); |
| 1192 | LOG(("uPD7220 '%s' PITCH: %u\n", tag(), m_pitch)); |
| 1201 | 1193 | |
| 1202 | 1194 | recompute_parameters(); |
| 1203 | 1195 | } |
| r19788 | r19789 | |
| 1206 | 1198 | case COMMAND_VSYNC: /* vertical sync mode */ |
| 1207 | 1199 | m_m = m_cr & 0x01; |
| 1208 | 1200 | |
| 1209 | | if (LOG) logerror("uPD7220 '%s' M: %u\n", tag(), m_m); |
| 1201 | LOG(("uPD7220 '%s' M: %u\n", tag(), m_m)); |
| 1210 | 1202 | |
| 1211 | 1203 | recompute_parameters(); |
| 1212 | 1204 | break; |
| r19788 | r19789 | |
| 1217 | 1209 | m_lr = (m_pr[1] & 0x1f) + 1; |
| 1218 | 1210 | m_dc = BIT(m_pr[1], 7); |
| 1219 | 1211 | |
| 1220 | | if (LOG) |
| 1221 | | { |
| 1222 | | logerror("uPD7220 '%s' LR: %u\n", tag(), m_lr); |
| 1223 | | logerror("uPD7220 '%s' DC: %u\n", tag(), m_dc); |
| 1224 | | } |
| 1212 | LOG(("uPD7220 '%s' LR: %u\n", tag(), m_lr)); |
| 1213 | LOG(("uPD7220 '%s' DC: %u\n", tag(), m_dc)); |
| 1225 | 1214 | } |
| 1226 | 1215 | |
| 1227 | 1216 | if(m_param_ptr == 3) |
| r19788 | r19789 | |
| 1229 | 1218 | m_ctop = m_pr[2] & 0x1f; |
| 1230 | 1219 | m_sc = BIT(m_pr[2], 5); |
| 1231 | 1220 | |
| 1232 | | if (LOG) |
| 1233 | | { |
| 1234 | | logerror("uPD7220 '%s' CTOP: %u\n", tag(), m_ctop); |
| 1235 | | logerror("uPD7220 '%s' SC: %u\n", tag(), m_sc); |
| 1236 | | } |
| 1221 | LOG(("uPD7220 '%s' CTOP: %u\n", tag(), m_ctop)); |
| 1222 | LOG(("uPD7220 '%s' SC: %u\n", tag(), m_sc)); |
| 1237 | 1223 | } |
| 1238 | 1224 | |
| 1239 | 1225 | if(m_param_ptr == 4) |
| r19788 | r19789 | |
| 1241 | 1227 | m_br = ((m_pr[3] & 0x07) << 2) | (m_pr[2] >> 6); |
| 1242 | 1228 | m_cbot = m_pr[3] >> 3; |
| 1243 | 1229 | |
| 1244 | | if (LOG) |
| 1245 | | { |
| 1246 | | logerror("uPD7220 '%s' BR: %u\n", tag(), m_br); |
| 1247 | | logerror("uPD7220 '%s' CBOT: %u\n", tag(), m_cbot); |
| 1248 | | } |
| 1230 | LOG(("uPD7220 '%s' BR: %u\n", tag(), m_br)); |
| 1231 | LOG(("uPD7220 '%s' CBOT: %u\n", tag(), m_cbot)); |
| 1249 | 1232 | } |
| 1250 | 1233 | break; |
| 1251 | 1234 | |
| 1252 | 1235 | case COMMAND_START: /* start display & end idle mode */ |
| 1253 | 1236 | m_de = 1; |
| 1254 | 1237 | |
| 1255 | | //if (LOG) logerror("uPD7220 '%s' DE: 1\n", tag()); |
| 1238 | //LOG(("uPD7220 '%s' DE: 1\n", tag())); |
| 1256 | 1239 | break; |
| 1257 | 1240 | |
| 1258 | 1241 | case COMMAND_BCTRL: /* display blanking control */ |
| 1259 | 1242 | m_de = m_cr & 0x01; |
| 1260 | 1243 | |
| 1261 | | //if (LOG) logerror("uPD7220 '%s' DE: %u\n", tag(), m_de); |
| 1244 | //LOG(("uPD7220 '%s' DE: %u\n", tag(), m_de)); |
| 1262 | 1245 | break; |
| 1263 | 1246 | |
| 1264 | 1247 | case COMMAND_ZOOM: /* zoom factors specify */ |
| r19788 | r19789 | |
| 1267 | 1250 | m_gchr = m_pr[1] & 0x0f; |
| 1268 | 1251 | m_disp = m_pr[1] >> 4; |
| 1269 | 1252 | |
| 1270 | | if (LOG) logerror("uPD7220 '%s' GCHR: %01x\n", tag(), m_gchr); |
| 1271 | | if (LOG) logerror("uPD7220 '%s' DISP: %01x\n", tag(), m_disp); |
| 1253 | LOG(("uPD7220 '%s' GCHR: %01x\n", tag(), m_gchr)); |
| 1254 | LOG(("uPD7220 '%s' DISP: %01x\n", tag(), m_disp)); |
| 1272 | 1255 | } |
| 1273 | 1256 | break; |
| 1274 | 1257 | |
| r19788 | r19789 | |
| 1279 | 1262 | |
| 1280 | 1263 | m_ead = (upper_addr << 16) | (m_pr[2] << 8) | m_pr[1]; |
| 1281 | 1264 | |
| 1282 | | //if (LOG) logerror("uPD7220 '%s' EAD: %06x\n", tag(), m_ead); |
| 1265 | //LOG(("uPD7220 '%s' EAD: %06x\n", tag(), m_ead)); |
| 1283 | 1266 | |
| 1284 | 1267 | if(m_param_ptr == 4) |
| 1285 | 1268 | { |
| 1286 | 1269 | m_dad = m_pr[3] >> 4; |
| 1287 | | //if (LOG) logerror("uPD7220 '%s' DAD: %01x\n", tag(), m_dad); |
| 1270 | //LOG(("uPD7220 '%s' DAD: %01x\n", tag(), m_dad)); |
| 1288 | 1271 | } |
| 1289 | 1272 | } |
| 1290 | 1273 | break; |
| r19788 | r19789 | |
| 1298 | 1281 | { |
| 1299 | 1282 | if (m_ra_addr < 16) |
| 1300 | 1283 | { |
| 1301 | | if (LOG) logerror("uPD7220 '%s' RA%u: %02x\n", tag(), m_ra_addr, data); |
| 1284 | LOG(("uPD7220 '%s' RA%u: %02x\n", tag(), m_ra_addr, data)); |
| 1302 | 1285 | |
| 1303 | 1286 | m_ra[m_ra_addr] = data; |
| 1304 | 1287 | m_ra_addr++; |
| r19788 | r19789 | |
| 1313 | 1296 | { |
| 1314 | 1297 | m_pitch = data; |
| 1315 | 1298 | |
| 1316 | | if (LOG) logerror("uPD7220 '%s' PITCH: %u\n", tag(), m_pitch); |
| 1299 | LOG(("uPD7220 '%s' PITCH: %u\n", tag(), m_pitch)); |
| 1317 | 1300 | } |
| 1318 | 1301 | break; |
| 1319 | 1302 | |
| r19788 | r19789 | |
| 1336 | 1319 | { |
| 1337 | 1320 | m_mask = (m_pr[2] << 8) | m_pr[1]; |
| 1338 | 1321 | |
| 1339 | | if (LOG) logerror("uPD7220 '%s' MASK: %04x\n", tag(), m_mask); |
| 1322 | LOG(("uPD7220 '%s' MASK: %04x\n", tag(), m_mask)); |
| 1340 | 1323 | } |
| 1341 | 1324 | break; |
| 1342 | 1325 | |
| r19788 | r19789 | |
| 1521 | 1504 | |
| 1522 | 1505 | WRITE_LINE_MEMBER( upd7220_device::ext_sync_w ) |
| 1523 | 1506 | { |
| 1524 | | //if (LOG) logerror("uPD7220 '%s' External Synchronization: %u\n", tag(), state); |
| 1507 | //LOG(("uPD7220 '%s' External Synchronization: %u\n", tag(), state)); |
| 1525 | 1508 | |
| 1526 | 1509 | if (state) |
| 1527 | 1510 | { |
| r19788 | r19789 | |
| 1676 | 1659 | break; |
| 1677 | 1660 | |
| 1678 | 1661 | case UPD7220_MODE_DISPLAY_INVALID: |
| 1679 | | logerror("uPD7220 '%s' Invalid Display Mode!\n", tag()); |
| 1662 | LOG(("uPD7220 '%s' Invalid Display Mode!\n", tag())); |
| 1680 | 1663 | } |
| 1681 | 1664 | } |
| 1682 | 1665 | return 0; |