branches/alto2/src/emu/cpu/alto2/a2drive.c
| r26069 | r26070 | |
| 51 | 51 | return; |
| 52 | 52 | } |
| 53 | 53 | if (d->cylinder < 0 || d->cylinder >= DIABLO_DRIVE_CYLINDERS) { |
| 54 | | LOG((log_DRV,9," DRIVE C/H/S:%d/%d/%d => invalid cylinder\n", d->cylinder, d->head, d->sector)); |
| 54 | LOG((0,9," DRIVE C/H/S:%d/%d/%d => invalid cylinder\n", d->cylinder, d->head, d->sector)); |
| 55 | 55 | d->page = -1; |
| 56 | 56 | return; |
| 57 | 57 | } |
| 58 | 58 | /* calculate the new disk relative sector offset */ |
| 59 | 59 | d->page = DRIVE_PAGE(d->cylinder, d->head, d->sector); |
| 60 | | LOG((log_DRV,9," DRIVE C/H/S:%d/%d/%d => page:%d\n", d->cylinder, d->head, d->sector, d->page)); |
| 60 | LOG((0,9," DRIVE C/H/S:%d/%d/%d => page:%d\n", d->cylinder, d->head, d->sector, d->page)); |
| 61 | 61 | } |
| 62 | 62 | |
| 63 | 63 | /** |
| r26069 | r26070 | |
| 205 | 205 | return; |
| 206 | 206 | |
| 207 | 207 | if (-1 == page || !d->image) { |
| 208 | | LOG((log_DRV,0," no sector for #%d: %d/%d/%d\n", d->unit, d->cylinder, d->head, d->sector)); |
| 208 | LOG((0,0," no sector for #%d: %d/%d/%d\n", d->unit, d->cylinder, d->head, d->sector)); |
| 209 | 209 | return; |
| 210 | 210 | } |
| 211 | 211 | |
| r26069 | r26070 | |
| 258 | 258 | #endif |
| 259 | 259 | d->bits[page] = bits; |
| 260 | 260 | |
| 261 | | LOG((log_DRV,0," BITS #%d: %03d/%d/%02d #%-5d bits (@%03d.%02d)\n", |
| 261 | LOG((0,0," BITS #%d: %03d/%d/%02d #%-5d bits (@%03d.%02d)\n", |
| 262 | 262 | d->unit, d->cylinder, d->head, d->sector, |
| 263 | 263 | dst, dst / 32, dst % 32)); |
| 264 | 264 | |
| 265 | 265 | } |
| 266 | 266 | |
| 267 | 267 | #if ALTO2_DEBUG |
| 268 | | static void drive_dump_ascii(UINT8 *src, size_t size) |
| 268 | void alto2_cpu_device::drive_dump_ascii(UINT8 *src, size_t size) |
| 269 | 269 | { |
| 270 | 270 | size_t offs; |
| 271 | | LOG((log_DRV,0," [")); |
| 271 | LOG((0,0," [")); |
| 272 | 272 | for (offs = 0; offs < size; offs++) { |
| 273 | 273 | char ch = (char)src[offs ^ 1]; |
| 274 | | LOG((log_DRV,0, "%c", ch < 32 || ch > 126 ? '.' : ch)); |
| 274 | LOG((0,0, "%c", ch < 32 || ch > 126 ? '.' : ch)); |
| 275 | 275 | } |
| 276 | | LOG((log_DRV,0,"]\n")); |
| 276 | LOG((0,0,"]\n")); |
| 277 | 277 | } |
| 278 | 278 | |
| 279 | 279 | |
| r26069 | r26070 | |
| 284 | 284 | * @param size size of the record in bytes |
| 285 | 285 | * @param name name to print before the dump |
| 286 | 286 | */ |
| 287 | | static size_t dump_record(UINT8 *src, size_t addr, size_t size, const char *name, int cr) |
| 287 | size_t alto2_cpu_device::dump_record(UINT8 *src, size_t addr, size_t size, const char *name, int cr) |
| 288 | 288 | { |
| 289 | 289 | size_t offs; |
| 290 | | LOG((log_DRV,0,"%s:", name)); |
| 290 | LOG((0,0,"%s:", name)); |
| 291 | 291 | for (offs = 0; offs < size; offs += 2) { |
| 292 | 292 | int word = src[offs] + 256 * src[offs + 1]; |
| 293 | 293 | if (offs % 16) { |
| 294 | | LOG((log_DRV,0," %06o", word)); |
| 294 | LOG((0,0," %06o", word)); |
| 295 | 295 | } else { |
| 296 | 296 | if (offs > 0) |
| 297 | 297 | drive_dump_ascii(&src[offs-16], 16); |
| 298 | | LOG((log_DRV,0,"\t%05o: %06o", (addr + offs) / 2, word)); |
| 298 | LOG((0,0,"\t%05o: %06o", (addr + offs) / 2, word)); |
| 299 | 299 | } |
| 300 | 300 | } |
| 301 | 301 | if (offs % 16) { |
| r26069 | r26070 | |
| 304 | 304 | drive_dump_ascii(&src[offs-16], 16); |
| 305 | 305 | } |
| 306 | 306 | if (cr) { |
| 307 | | LOG((log_DRV,0,"\n")); |
| 307 | LOG((0,0,"\n")); |
| 308 | 308 | } |
| 309 | 309 | return size; |
| 310 | 310 | } |
| r26069 | r26070 | |
| 318 | 318 | * @param size number of words to scan for a sync word |
| 319 | 319 | * @result next src pointer |
| 320 | 320 | */ |
| 321 | | static size_t squeeze_sync(UINT32 *bits, size_t src, size_t size) |
| 321 | size_t alto2_cpu_device::squeeze_sync(UINT32 *bits, size_t src, size_t size) |
| 322 | 322 | { |
| 323 | 323 | size_t offs, bitcount; |
| 324 | 324 | UINT32 accu = 0; |
| r26069 | r26070 | |
| 343 | 343 | } |
| 344 | 344 | } |
| 345 | 345 | /* return if no sync found within size*32 clock and data bits */ |
| 346 | | LOG((log_DRV,0," no sync within %d words\n", size)); |
| 346 | LOG((0,0," no sync within %d words\n", size)); |
| 347 | 347 | return src; |
| 348 | 348 | } |
| 349 | 349 | |
| r26069 | r26070 | |
| 355 | 355 | * @param size number of words to scan for a sync word |
| 356 | 356 | * @result next src pointer |
| 357 | 357 | */ |
| 358 | | static size_t squeeze_unsync(UINT32 *bits, size_t src, size_t size) |
| 358 | size_t alto2_cpu_device::squeeze_unsync(UINT32 *bits, size_t src, size_t size) |
| 359 | 359 | { |
| 360 | 360 | size_t offs, bitcount; |
| 361 | 361 | UINT32 accu = 0; |
| r26069 | r26070 | |
| 380 | 380 | } |
| 381 | 381 | } |
| 382 | 382 | /* return if no sync found within size*32 clock and data bits */ |
| 383 | | LOG((log_DRV,0," no unsync within %d words\n", size)); |
| 383 | LOG((0,0," no unsync within %d words\n", size)); |
| 384 | 384 | return src; |
| 385 | 385 | } |
| 386 | 386 | |
| r26069 | r26070 | |
| 393 | 393 | * @param size size of the record in bytes |
| 394 | 394 | * @result next src pointer |
| 395 | 395 | */ |
| 396 | | static size_t squeeze_record(UINT32 *bits, size_t src, UINT8 *field, size_t size) |
| 396 | size_t alto2_cpu_device::squeeze_record(UINT32 *bits, size_t src, UINT8 *field, size_t size) |
| 397 | 397 | { |
| 398 | 398 | size_t offs, bitcount; |
| 399 | 399 | UINT32 accu = 0; |
| r26069 | r26070 | |
| 425 | 425 | * @param cksum pointer to an int to receive the checksum word |
| 426 | 426 | * @result next src pointer |
| 427 | 427 | */ |
| 428 | | static size_t squeeze_cksum(UINT32 *bits, size_t src, int *cksum) |
| 428 | size_t alto2_cpu_device::squeeze_cksum(UINT32 *bits, size_t src, int *cksum) |
| 429 | 429 | { |
| 430 | 430 | size_t bitcount; |
| 431 | 431 | UINT32 accu = 0; |
| r26069 | r26070 | |
| 459 | 459 | fatal(1, "invalid unit %d in call to squeeze_sector()\n", unit); |
| 460 | 460 | |
| 461 | 461 | if (d->rdfirst >= 0) { |
| 462 | | LOG((log_DRV,0, |
| 462 | LOG((0,0, |
| 463 | 463 | " RD #%d %03d/%d/%02d bit#%-5d (@%03d.%02d) ... bit#%-5d (@%03d.%02d)\n", |
| 464 | 464 | d->unit, d->cylinder, d->head, d->sector, |
| 465 | 465 | d->rdfirst, d->rdfirst / 32, d->rdfirst % 32, |
| r26069 | r26070 | |
| 483 | 483 | } |
| 484 | 484 | |
| 485 | 485 | if (d->wrfirst >= 0) { |
| 486 | | LOG((log_DRV,0, |
| 486 | LOG((0,0, |
| 487 | 487 | " WR #%d %03d/%d/%02d bit#%-5d (@%03d.%02d) ... bit#%-5d (@%03d.%02d)\n", |
| 488 | 488 | d->unit, d->cylinder, d->head, d->sector, |
| 489 | 489 | d->wrfirst, d->wrfirst / 32, d->wrfirst % 32, |
| r26069 | r26070 | |
| 493 | 493 | d->wrlast = -1; |
| 494 | 494 | |
| 495 | 495 | if (d->page < 0 || d->page >= DIABLO_DRIVE_PAGES) { |
| 496 | | LOG((log_DRV,0," no sector for #%d: %d/%d/%d\n", d->unit, d->cylinder, d->head, d->sector)); |
| 496 | LOG((0,0," no sector for #%d: %d/%d/%d\n", d->unit, d->cylinder, d->head, d->sector)); |
| 497 | 497 | return; |
| 498 | 498 | } |
| 499 | 499 | |
| r26069 | r26070 | |
| 505 | 505 | |
| 506 | 506 | /* no bits to write? */ |
| 507 | 507 | if (!bits) { |
| 508 | | LOG((log_DRV,0," no sector for #%d: %d/%d/%d\n", d->unit, d->cylinder, d->head, d->sector)); |
| 508 | LOG((0,0," no sector for #%d: %d/%d/%d\n", d->unit, d->cylinder, d->head, d->sector)); |
| 509 | 509 | return; |
| 510 | 510 | } |
| 511 | 511 | |
| r26069 | r26070 | |
| 519 | 519 | src = squeeze_unsync(bits, src, 40); |
| 520 | 520 | /* sync on header preamble */ |
| 521 | 521 | src = squeeze_sync(bits, src, 40); |
| 522 | | LOG((log_DRV,0," header sync bit #%d (@%03d.%02d)\n", |
| 522 | LOG((0,0," header sync bit #%d (@%03d.%02d)\n", |
| 523 | 523 | src, src / 32, src % 32)); |
| 524 | 524 | src = squeeze_record(bits, src, s->header, sizeof(s->header)); |
| 525 | 525 | src = squeeze_cksum(bits, src, &cksum_header); |
| r26069 | r26070 | |
| 531 | 531 | src = squeeze_unsync(bits, src, 40); |
| 532 | 532 | /* sync on label preamble */ |
| 533 | 533 | src = squeeze_sync(bits, src, 40); |
| 534 | | LOG((log_DRV,0," label sync bit #%d (@%03d.%02d)\n", |
| 534 | LOG((0,0," label sync bit #%d (@%03d.%02d)\n", |
| 535 | 535 | src, src / 32, src % 32)); |
| 536 | 536 | src = squeeze_record(bits, src, s->label, sizeof(s->label)); |
| 537 | 537 | src = squeeze_cksum(bits, src, &cksum_label); |
| r26069 | r26070 | |
| 543 | 543 | src = squeeze_unsync(bits, src, 40); |
| 544 | 544 | /* sync on data preamble */ |
| 545 | 545 | src = squeeze_sync(bits, src, 40); |
| 546 | | LOG((log_DRV,0," data sync bit #%d (@%03d.%02d)\n", |
| 546 | LOG((0,0," data sync bit #%d (@%03d.%02d)\n", |
| 547 | 547 | src, src / 32, src % 32)); |
| 548 | 548 | src = squeeze_record(bits, src, s->data, sizeof(s->data)); |
| 549 | 549 | src = squeeze_cksum(bits, src, &cksum_data); |
| r26069 | r26070 | |
| 558 | 558 | |
| 559 | 559 | if (cksum_header || cksum_label || cksum_data) { |
| 560 | 560 | #if ALTO2_DEBUG |
| 561 | | LOG((log_DRV,0," cksum check - header:%06o label:%06o data:%06o\n", cksum_header, cksum_label, cksum_data)); |
| 561 | LOG((0,0," cksum check - header:%06o label:%06o data:%06o\n", cksum_header, cksum_label, cksum_data)); |
| 562 | 562 | #else |
| 563 | 563 | printf(" cksum check - header:%06o label:%06o data:%06o\n", cksum_header, cksum_label, cksum_data); |
| 564 | 564 | #endif |
| r26069 | r26070 | |
| 834 | 834 | d->addx_acknowledge_0 = 0; |
| 835 | 835 | /* clear log address interlock (?) */ |
| 836 | 836 | d->log_addx_interlock_0 = 1; |
| 837 | | LOG((log_DRV,1," UNIT select %d ready\n", unit)); |
| 837 | LOG((0,1," UNIT select %d ready\n", unit)); |
| 838 | 838 | } else { |
| 839 | 839 | /* it is not ready (?) */ |
| 840 | 840 | d->ready_0 = 1; |
| r26069 | r26070 | |
| 842 | 842 | d->s_r_w_0 = 1; |
| 843 | 843 | /* address acknowledge (?) */ |
| 844 | 844 | d->addx_acknowledge_0 = 0; |
| 845 | | LOG((log_DRV,1," UNIT select %d not ready (no image)\n", unit)); |
| 845 | LOG((0,1," UNIT select %d not ready (no image)\n", unit)); |
| 846 | 846 | } |
| 847 | 847 | |
| 848 | 848 | /* Note: head select input is active low (0: selects head 1, 1: selects head 0) */ |
| 849 | 849 | head = head & DIABLO_DRIVE_HEAD_MASK; |
| 850 | 850 | if (head != d->head) { |
| 851 | 851 | d->head = head; |
| 852 | | LOG((log_DRV,1," HEAD %d select on unit %d\n", head, unit)); |
| 852 | LOG((0,1," HEAD %d select on unit %d\n", head, unit)); |
| 853 | 853 | } |
| 854 | 854 | drive_get_sector(unit); |
| 855 | 855 | } |
| r26069 | r26070 | |
| 873 | 873 | fatal(1, "invalid unit %d in call to drive_strobe()\n", unit); |
| 874 | 874 | |
| 875 | 875 | if (strobe == 1) { |
| 876 | | LOG((log_DRV,1," STROBE end of interlock\n", seekto)); |
| 876 | LOG((0,1," STROBE end of interlock\n", seekto)); |
| 877 | 877 | /* deassert the log address interlock */ |
| 878 | 878 | d->log_addx_interlock_0 = 1; |
| 879 | 879 | return; |
| r26069 | r26070 | |
| 883 | 883 | d->log_addx_interlock_0 = 0; |
| 884 | 884 | |
| 885 | 885 | if (seekto == d->cylinder) { |
| 886 | | LOG((log_DRV,1," STROBE to cylinder %d acknowledge\n", seekto)); |
| 886 | LOG((0,1," STROBE to cylinder %d acknowledge\n", seekto)); |
| 887 | 887 | d->addx_acknowledge_0 = 0; /* address acknowledge, if cylinder is reached */ |
| 888 | 888 | d->seek_incomplete_0 = 1; /* reset seek incomplete */ |
| 889 | 889 | return; |
| r26069 | r26070 | |
| 899 | 899 | d->log_addx_interlock_0 = 1; /* deassert the log address interlock */ |
| 900 | 900 | d->seek_incomplete_0 = 1; /* deassert seek incomplete */ |
| 901 | 901 | d->addx_acknowledge_0 = 0; /* assert address acknowledge */ |
| 902 | | LOG((log_DRV,1," STROBE to cylinder %d incomplete\n", seekto)); |
| 902 | LOG((0,1," STROBE to cylinder %d incomplete\n", seekto)); |
| 903 | 903 | return; |
| 904 | 904 | } |
| 905 | 905 | } else { |
| r26069 | r26070 | |
| 910 | 910 | d->log_addx_interlock_0 = 1; /* deassert the log address interlock */ |
| 911 | 911 | d->seek_incomplete_0 = 1; /* deassert seek incomplete */ |
| 912 | 912 | d->addx_acknowledge_0 = 0; /* assert address acknowledge */ |
| 913 | | LOG((log_DRV,1," STROBE to cylinder %d incomplete\n", seekto)); |
| 913 | LOG((0,1," STROBE to cylinder %d incomplete\n", seekto)); |
| 914 | 914 | return; |
| 915 | 915 | } |
| 916 | 916 | } |
| 917 | | LOG((log_DRV,1," STROBE to cylinder %d (now %d) - interlock\n", seekto, d->cylinder)); |
| 917 | LOG((0,1," STROBE to cylinder %d (now %d) - interlock\n", seekto, d->cylinder)); |
| 918 | 918 | |
| 919 | 919 | d->addx_acknowledge_0 = 1; /* deassert address acknowledge */ |
| 920 | 920 | d->seek_incomplete_0 = 1; /* deassert seek incomplete */ |
| r26069 | r26070 | |
| 1017 | 1017 | if (-1 == d->wrfirst) |
| 1018 | 1018 | d->wrfirst = index; |
| 1019 | 1019 | |
| 1020 | | LOG((log_DRV,7," write #%d %d/%d/%d bit #%d bit:%d\n", unit, d->cylinder, d->head, d->sector, index, wrdata)); |
| 1020 | LOG((0,7," write #%d %d/%d/%d bit #%d bit:%d\n", unit, d->cylinder, d->head, d->sector, index, wrdata)); |
| 1021 | 1021 | |
| 1022 | 1022 | if (index < GUARD_ZONE_BITS) { |
| 1023 | 1023 | /* don't write in the guard zone (?) */ |
| r26069 | r26070 | |
| 1074 | 1074 | d->rdfirst = index; |
| 1075 | 1075 | |
| 1076 | 1076 | bit = RDBIT(bits,index); |
| 1077 | | LOG((log_DRV,7," read #%d %d/%d/%d bit #%d:%d\n", unit, d->cylinder, d->head, d->sector, index, bit)); |
| 1077 | LOG((0,7," read #%d %d/%d/%d bit #%d:%d\n", unit, d->cylinder, d->head, d->sector, index, bit)); |
| 1078 | 1078 | d->rdlast = index; |
| 1079 | 1079 | return bit; |
| 1080 | 1080 | } |
| r26069 | r26070 | |
| 1126 | 1126 | clk = RDBIT(bits,index); |
| 1127 | 1127 | } |
| 1128 | 1128 | |
| 1129 | | LOG((log_DRV,7, " read #%d %d/%d/%d clk #%d:%d\n", unit, d->cylinder, d->head, d->sector, index, clk)); |
| 1129 | LOG((0,7, " read #%d %d/%d/%d clk #%d:%d\n", unit, d->cylinder, d->head, d->sector, index, clk)); |
| 1130 | 1130 | |
| 1131 | 1131 | d->rdlast = index; |
| 1132 | 1132 | return clk ^ 1; |
| r26069 | r26070 | |
| 1233 | 1233 | int unit = m_unit_selected; |
| 1234 | 1234 | diablo_drive_t *d = m_drive[unit]; |
| 1235 | 1235 | |
| 1236 | | LOG((log_DRV,5, " next sector (unit #%d sector %d)\n", unit, d->sector)); |
| 1236 | LOG((0,5, " next sector (unit #%d sector %d)\n", unit, d->sector)); |
| 1237 | 1237 | (void)d; |
| 1238 | 1238 | |
| 1239 | 1239 | switch (arg) { |
| r26069 | r26070 | |
| 1265 | 1265 | { |
| 1266 | 1266 | diablo_drive_t *d = m_drive[unit]; |
| 1267 | 1267 | |
| 1268 | | LOG((log_DRV,5, " sector mark 1 (unit #%d sector %d)\n", unit, d->sector)); |
| 1268 | LOG((0,5, " sector mark 1 (unit #%d sector %d)\n", unit, d->sector)); |
| 1269 | 1269 | /* set sector mark to 1 */ |
| 1270 | 1270 | d->sector_mark_0 = 1; |
| 1271 | 1271 | } |
| r26069 | r26070 | |
| 1279 | 1279 | { |
| 1280 | 1280 | diablo_drive_t *d = m_drive[unit]; |
| 1281 | 1281 | |
| 1282 | | LOG((log_DRV,5," sector mark 0 (unit #%d sector %d)\n", unit, d->sector)); |
| 1282 | LOG((0,5," sector mark 0 (unit #%d sector %d)\n", unit, d->sector)); |
| 1283 | 1283 | |
| 1284 | 1284 | /* squeeze previous sector, if it was written to */ |
| 1285 | 1285 | squeeze_sector(unit); |
| r26069 | r26070 | |
| 1340 | 1340 | if (!strcmp(p, ".z") || !strcmp(p, ".Z") || |
| 1341 | 1341 | !strcmp(p, ".gz") || !strcmp(p, ".GZ")) { |
| 1342 | 1342 | /* compress (LZW) or gzip compressed image */ |
| 1343 | | LOG((log_DRV,0,"loading compressed disk image %s\n", arg)); |
| 1343 | LOG((0,0,"loading compressed disk image %s\n", arg)); |
| 1344 | 1344 | zcat = 1; |
| 1345 | 1345 | } else if (!strcmp(p, ".dsk") || !strcmp(p, ".DSK")) { |
| 1346 | 1346 | /* uncompressed .dsk extension */ |
| 1347 | | LOG((log_DRV,0,"loading uncompressed disk image %s\n", arg)); |
| 1347 | LOG((0,0,"loading uncompressed disk image %s\n", arg)); |
| 1348 | 1348 | zcat = 0; |
| 1349 | 1349 | } else { |
| 1350 | 1350 | return -1; |
| r26069 | r26070 | |
| 1388 | 1388 | } |
| 1389 | 1389 | fclose(fp); |
| 1390 | 1390 | |
| 1391 | | LOG((log_DRV,0, "got %d (%#x) bytes\n", done, done)); |
| 1391 | LOG((0,0, "got %d (%#x) bytes\n", done, done)); |
| 1392 | 1392 | |
| 1393 | 1393 | cooked = (diablo_sector_t *)malloc(csize); |
| 1394 | 1394 | if (!cooked) |
| r26069 | r26070 | |
| 1422 | 1422 | ip = NULL; |
| 1423 | 1423 | |
| 1424 | 1424 | if (csize != size * sizeof(diablo_sector_t)) { |
| 1425 | | LOG((log_DRV,0,"disk image %s size mismatch (%d bytes)\n", arg, csize)); |
| 1425 | LOG((0,0,"disk image %s size mismatch (%d bytes)\n", arg, csize)); |
| 1426 | 1426 | free(cooked); |
| 1427 | 1427 | return -1; |
| 1428 | 1428 | } |
| r26069 | r26070 | |
| 1438 | 1438 | hdr = cooked->header[2] + 256 * cooked->header[3]; |
| 1439 | 1439 | chs = (s << 12) | (c << 3) | (h << 2) | (unit << 1); |
| 1440 | 1440 | if (chs != hdr) { |
| 1441 | | LOG((log_DRV,0,"WARNING: header mismatch C/H/S: %3d/%d/%2d chs:%06o hdr:%06o\n", |
| 1441 | LOG((0,0,"WARNING: header mismatch C/H/S: %3d/%d/%2d chs:%06o hdr:%06o\n", |
| 1442 | 1442 | c, h, s, chs, hdr)); |
| 1443 | 1443 | } |
| 1444 | 1444 | if (++s == DRIVE_SPT) { |
| r26069 | r26070 | |
| 1454 | 1454 | /* set drive image */ |
| 1455 | 1455 | d->image = (diablo_sector_t *)cp; |
| 1456 | 1456 | |
| 1457 | | LOG((log_DRV,0,"drive #%d successfully created image for %s\n", unit, arg)); |
| 1457 | LOG((0,0,"drive #%d successfully created image for %s\n", unit, arg)); |
| 1458 | 1458 | |
| 1459 | 1459 | drive_select(unit, 0); |
| 1460 | 1460 | |
| r26069 | r26070 | |
| 1463 | 1463 | /* drive address acknowledge is active now */ |
| 1464 | 1464 | d->addx_acknowledge_0 = 0; |
| 1465 | 1465 | |
| 1466 | | LOG((log_DRV,0,"possible %s sector size is %#o (%d) words\n", d->description, SECTOR_WORDS, SECTOR_WORDS)); |
| 1466 | LOG((0,0,"possible %s sector size is %#o (%d) words\n", d->description, SECTOR_WORDS, SECTOR_WORDS)); |
| 1467 | 1467 | |
| 1468 | | LOG((log_DRV,0,"sector mark pulse length is %lldns\n", SECTOR_MARK_PULSE_PRE + SECTOR_MARK_PULSE_POST)); |
| 1468 | LOG((0,0,"sector mark pulse length is %lldns\n", SECTOR_MARK_PULSE_PRE + SECTOR_MARK_PULSE_POST)); |
| 1469 | 1469 | |
| 1470 | 1470 | return 0; |
| 1471 | 1471 | } |
branches/alto2/src/emu/cpu/alto2/a2mem.c
| r26069 | r26070 | |
| 451 | 451 | LOG((0,5," memory error at dword addr:%07o data:%011o check:%03o\n", dw_addr * 2, dw_data, hpb)); |
| 452 | 452 | LOG((0,6," MEAR: %06o\n", m_mem.mear)); |
| 453 | 453 | LOG((0,6," MESR: %06o\n", m_mem.mesr ^ 0177777)); |
| 454 | | LOG((0,6," Hamming code read : %#o\n", GET_MESR_HAMMING(mem.mesr))); |
| 455 | | LOG((0,6," Parity error : %o\n", GET_MESR_PERR(mem.mesr))); |
| 456 | | LOG((0,6," Memory parity bit : %o\n", GET_MESR_PARITY(mem.mesr))); |
| 457 | | LOG((0,6," Hamming syndrome : %#o (bit #%d)\n", GET_MESR_SYNDROME(mem.mesr), |
| 458 | | hamming_lut[GET_MESR_SYNDROME(mem.mesr)])); |
| 459 | | LOG((0,6," Memory bank : %#o\n", GET_MESR_BANK(mem.mesr))); |
| 460 | | LOG((0,6," MECR: %06o\n", mem.mecr ^ 0177777)); |
| 461 | | LOG((0,6," Test Hamming code : %#o\n", GET_MECR_TEST_CODE(mem.mecr))); |
| 462 | | LOG((0,6," Test mode : %s\n", GET_MECR_TEST_MODE(mem.mecr) ? "on" : "off")); |
| 463 | | LOG((0,6," INT on single-bit err: %s\n", GET_MECR_INT_SBERR(mem.mecr) ? "on" : "off")); |
| 464 | | LOG((0,6," INT on double-bit err: %s\n", GET_MECR_INT_DBERR(mem.mecr) ? "on" : "off")); |
| 465 | | LOG((0,6," Error correction : %s\n", GET_MECR_ERRCORR(mem.mecr) ? "off" : "on")); |
| 454 | LOG((0,6," Hamming code read : %#o\n", GET_MESR_HAMMING(m_mem.mesr))); |
| 455 | LOG((0,6," Parity error : %o\n", GET_MESR_PERR(m_mem.mesr))); |
| 456 | LOG((0,6," Memory parity bit : %o\n", GET_MESR_PARITY(m_mem.mesr))); |
| 457 | LOG((0,6," Hamming syndrome : %#o (bit #%d)\n", GET_MESR_SYNDROME(m_mem.mesr), hamming_lut[GET_MESR_SYNDROME(m_mem.mesr)])); |
| 458 | LOG((0,6," Memory bank : %#o\n", GET_MESR_BANK(m_mem.mesr))); |
| 459 | LOG((0,6," MECR: %06o\n", m_mem.mecr ^ 0177777)); |
| 460 | LOG((0,6," Test Hamming code : %#o\n", GET_MECR_TEST_CODE(m_mem.mecr))); |
| 461 | LOG((0,6," Test mode : %s\n", GET_MECR_TEST_MODE(m_mem.mecr) ? "on" : "off")); |
| 462 | LOG((0,6," INT on single-bit err: %s\n", GET_MECR_INT_SBERR(m_mem.mecr) ? "on" : "off")); |
| 463 | LOG((0,6," INT on double-bit err: %s\n", GET_MECR_INT_DBERR(m_mem.mecr) ? "on" : "off")); |
| 464 | LOG((0,6," Error correction : %s\n", GET_MECR_ERRCORR(m_mem.mecr) ? "off" : "on")); |
| 466 | 465 | } |
| 467 | 466 | if (-1 == hamming_lut[syndrome]) { |
| 468 | 467 | /* double-bit error: wake task_part, if we're told so */ |
| r26069 | r26070 | |
| 560 | 559 | |
| 561 | 560 | void alto2_cpu_device::mesr_w(UINT32 address, UINT16 data) |
| 562 | 561 | { |
| 563 | | LOG((0,2," MESR write %07o (clear MESR; was %07o)\n", data, mem.mesr)); |
| 562 | LOG((0,2," MESR write %07o (clear MESR; was %07o)\n", data, m_mem.mesr)); |
| 564 | 563 | m_mem.mesr = 0; // set all bits to 0 |
| 565 | 564 | m_mem.error = 0; // reset the error flag |
| 566 | 565 | m_task_wakeup &= ~(1 << task_part); // clear the task wakeup for the parity error task |
| r26069 | r26070 | |
| 594 | 593 | A2_PUT16(m_mem.mecr,16, 0, 3,0); |
| 595 | 594 | A2_PUT16(m_mem.mecr,16,15,15,0); |
| 596 | 595 | LOG((0,2," MECR write %07o\n", data)); |
| 597 | | LOG((0,6," Test Hamming code : %#o\n", GET_MECR_TEST_CODE(mem.mecr))); |
| 598 | | LOG((0,6," Test mode : %s\n", GET_MECR_TEST_MODE(mem.mecr) ? "on" : "off")); |
| 599 | | LOG((0,6," INT on single-bit err: %s\n", GET_MECR_INT_SBERR(mem.mecr) ? "on" : "off")); |
| 600 | | LOG((0,6," INT on double-bit err: %s\n", GET_MECR_INT_DBERR(mem.mecr) ? "on" : "off")); |
| 601 | | LOG((0,6," Error correction : %s\n", GET_MECR_ERRCORR(mem.mecr) ? "off" : "on")); |
| 596 | LOG((0,6," Test Hamming code : %#o\n", GET_MECR_TEST_CODE(m_mem.mecr))); |
| 597 | LOG((0,6," Test mode : %s\n", GET_MECR_TEST_MODE(m_mem.mecr) ? "on" : "off")); |
| 598 | LOG((0,6," INT on single-bit err: %s\n", GET_MECR_INT_SBERR(m_mem.mecr) ? "on" : "off")); |
| 599 | LOG((0,6," INT on double-bit err: %s\n", GET_MECR_INT_DBERR(m_mem.mecr) ? "on" : "off")); |
| 600 | LOG((0,6," Error correction : %s\n", GET_MECR_ERRCORR(m_mem.mecr) ? "off" : "on")); |
| 602 | 601 | } |
| 603 | 602 | |
| 604 | 603 | /** |
| r26069 | r26070 | |
| 671 | 670 | LOG((0,6," MD = MMIO[%#o] (%#o)\n", base_addr, m_mem.md)); |
| 672 | 671 | m_mem.access = ALTO2_MEM_NONE; |
| 673 | 672 | #if ALTO2_DEBUG |
| 674 | | if (m_mem.watch_read) |
| 675 | | (*m_mem.watch_read)(m_mem.mar, m_mem.md); |
| 673 | watch_read(m_mem.mar, m_mem.md); |
| 676 | 674 | #endif |
| 677 | 675 | return m_mem.md; |
| 678 | 676 | } |
| r26069 | r26070 | |
| 683 | 681 | m_mem.rmdd = hamming_code(0, m_mem.mar/2, m_mem.rmdd); |
| 684 | 682 | #endif |
| 685 | 683 | m_mem.md = (m_mem.mar & ALTO2_MEM_ODD) ? GET_ODD(m_mem.rmdd) : GET_EVEN(m_mem.rmdd); |
| 686 | | LOG((0,6," MD = RAM[%#o] (%#o)\n", mem.mar, mem.md)); |
| 684 | LOG((0,6," MD = RAM[%#o] (%#o)\n", m_mem.mar, m_mem.md)); |
| 687 | 685 | |
| 688 | 686 | #if ALTO2_DEBUG |
| 689 | | if (m_mem.watch_read) |
| 690 | | (*m_mem.watch_read)(m_mem.mar, m_mem.md); |
| 687 | watch_read(m_mem.mar, m_mem.md); |
| 691 | 688 | #endif |
| 692 | 689 | |
| 693 | 690 | if (m_mem.access & ALTO2_MEM_ODD) { |
| r26069 | r26070 | |
| 716 | 713 | } |
| 717 | 714 | |
| 718 | 715 | if (cycle() > m_mem.cycle + 4) { |
| 719 | | LOG((0,0," fatal: mem write (MAR %#o, data %#o) too late (+%lld cyc)\n", m_mem.mar, data, cycle() - mem.cycle)); |
| 716 | LOG((0,0," fatal: mem write (MAR %#o, data %#o) too late (+%lld cyc)\n", m_mem.mar, data, cycle() - m_mem.cycle)); |
| 720 | 717 | m_mem.access = ALTO2_MEM_NONE; |
| 721 | 718 | return; |
| 722 | 719 | } |
| r26069 | r26070 | |
| 727 | 724 | ((*this).*mmio_write_fn[base_addr - ALTO2_IO_PAGE_BASE])(base_addr, m_mem.md); |
| 728 | 725 | m_mem.access = ALTO2_MEM_NONE; |
| 729 | 726 | #if ALTO2_DEBUG |
| 730 | | if (m_mem.watch_write) |
| 731 | | ((*this).*m_mem.watch_write)(m_mem.mar, m_mem.md); |
| 727 | watch_write(m_mem.mar, m_mem.md); |
| 732 | 728 | #endif |
| 733 | 729 | return; |
| 734 | 730 | } |
| r26069 | r26070 | |
| 748 | 744 | #endif |
| 749 | 745 | |
| 750 | 746 | #if ALTO2_DEBUG |
| 751 | | if (m_mem.watch_write) |
| 752 | | ((*this).*m_mem.watch_write)(m_mem.mar, m_mem.md); |
| 747 | watch_write(m_mem.mar, m_mem.md); |
| 753 | 748 | #endif |
| 754 | 749 | /* don't reset mem.access to permit double word exchange */ |
| 755 | 750 | m_mem.mar ^= ALTO2_MEM_ODD; |
branches/alto2/src/emu/cpu/alto2/a2emu.c
| r26069 | r26070 | |
| 395 | 395 | XC = m_t & 1; |
| 396 | 396 | m_shifter = m_l >> 1; |
| 397 | 397 | m_shifter |= XC << 15; |
| 398 | | LOG((0,2," <-L MRSH 1 (shifter:%06o XC:%o)", m_shifer, XC)); |
| 398 | LOG((0,2," <-L MRSH 1 (shifter:%06o XC:%o)", m_shifter, XC)); |
| 399 | 399 | break; |
| 400 | 400 | case f1_l_lcy_8: // <-L LCY 8 |
| 401 | 401 | default: // other |
| r26069 | r26070 | |
| 415 | 415 | #else |
| 416 | 416 | A2_PUT8(m_rsel, 5, 3, 4, IR_DstAC(m_emu.ir) ^ 3); |
| 417 | 417 | #endif |
| 418 | | LOG((0,2," DNS<-; rsel := DstAC (%#o %s)\n", m_rsel, r_name[m_rsel])); |
| 418 | LOG((0,2," DNS<-; rsel := DstAC (%#o %s)\n", m_rsel, r_name(m_rsel))); |
| 419 | 419 | } |
| 420 | 420 | |
| 421 | 421 | /** |
| r26069 | r26070 | |
| 506 | 506 | #else |
| 507 | 507 | A2_PUT8(m_rsel, 5, 3, 4, IR_DstAC(m_emu.ir) ^ 3); |
| 508 | 508 | #endif |
| 509 | | LOG((0,2," ACDEST<-; mux (rsel:%#o %s)\n", m_rsel, r_name[m_rsel])); |
| 509 | LOG((0,2," ACDEST<-; mux (rsel:%#o %s)\n", m_rsel, r_name(m_rsel))); |
| 510 | 510 | } |
| 511 | 511 | |
| 512 | 512 | #if ALTO2_DEBUG |
| r26069 | r26070 | |
| 519 | 519 | |
| 520 | 520 | LOG((0,3," BITBLT AC1:%06o AC2:%06o\n", m_r[rsel_ac1], m_r[rsel_ac2])); |
| 521 | 521 | LOG((0,3," function : %06o\n", val)); |
| 522 | | LOG((0,3," src extRAM: %o\n", ALTO2_BIT(val,16,10))); |
| 523 | | LOG((0,3," dst extRAM: %o\n", ALTO2_BIT(val,16,11))); |
| 524 | | LOG((0,3," src type : %o (%s)\n", ALTO2_GET(val,16,12,13), type_name[ALTO2_GET(val,16,12,13)])); |
| 525 | | LOG((0,3," operation : %o (%s)\n", ALTO2_GET(val,16,14,15), oper_name[ALTO2_GET(val,16,14,15)])); |
| 522 | LOG((0,3," src extRAM: %o\n", A2_BIT16(val,16,10))); |
| 523 | LOG((0,3," dst extRAM: %o\n", A2_BIT16(val,16,11))); |
| 524 | LOG((0,3," src type : %o (%s)\n", A2_GET16(val,16,12,13), type_name[A2_GET16(val,16,12,13)])); |
| 525 | LOG((0,3," operation : %o (%s)\n", A2_GET16(val,16,14,15), oper_name[A2_GET16(val,16,14,15)])); |
| 526 | 526 | val = debug_read_mem(bbt+1); |
| 527 | 527 | LOG((0,3," unused AC2: %06o (%d)\n", val, val)); |
| 528 | 528 | val = debug_read_mem(bbt+2); |
| r26069 | r26070 | |
| 560 | 560 | { |
| 561 | 561 | UINT16 r = (A2_BIT32(m_bus,16,0) << 3) | A2_GET32(m_bus,16,5,7); |
| 562 | 562 | |
| 563 | | #if ALTO2_DEBUG |
| 564 | | if (ll[task_emu].level > 1) { |
| 565 | | char dasm[64]; |
| 566 | | dbg_dasm(dasm, sizeof(dasm), 0, m_r[6], m_bus); |
| 567 | | LOG((0,2," IR<-; IR = %06o, branch on IR[0,5-7] (%#o|%#o)\n", m_bus, m_next2, r)); |
| 568 | | /* disassembled instruction */ |
| 569 | | LOG((0,2," %06o: %06o %s\n", m_mem_mar, m_bus, dasm)); |
| 570 | | } |
| 571 | | #endif /* ALTO2_DEBUG */ |
| 572 | | |
| 573 | 563 | /* special logging of some opcodes */ |
| 574 | 564 | switch (m_bus) { |
| 575 | 565 | case op_CYCLE: |
| r26069 | r26070 | |
| 659 | 649 | #else |
| 660 | 650 | A2_PUT8(m_rsel, 5, 3, 4, IR_SrcAC(m_emu.ir) ^ 3); |
| 661 | 651 | #endif |
| 662 | | LOG((0,2," <-ACSOURCE; rsel := SrcAC (%#o %s)\n", m_rsel, r_name[m_rsel])); |
| 652 | LOG((0,2," <-ACSOURCE; rsel := SrcAC (%#o %s)\n", m_rsel, r_name(m_rsel))); |
| 663 | 653 | } |
| 664 | 654 | |
| 665 | 655 | /** |