Previous 199869 Revisions Next

r26070 Saturday 9th November, 2013 at 15:32:14 UTC by Jürgen Buchmüller
Fix ALTO2_DEBUG=1 enabled code.
[/branches/alto2/src/emu/cpu/alto2]a2curt.c a2disk.c a2disp.c a2drive.c a2emu.c a2mem.c a2mrt.c alto2.c alto2.h alto2dsm.c

branches/alto2/src/emu/cpu/alto2/a2drive.c
r26069r26070
5151      return;
5252   }
5353   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));
5555      d->page = -1;
5656      return;
5757   }
5858   /* calculate the new disk relative sector offset */
5959   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));
6161}
6262
6363/**
r26069r26070
205205      return;
206206
207207   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));
209209      return;
210210   }
211211
r26069r26070
258258#endif
259259   d->bits[page] = bits;
260260
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",
262262      d->unit, d->cylinder, d->head, d->sector,
263263      dst, dst / 32, dst % 32));
264264
265265}
266266
267267#if   ALTO2_DEBUG
268static void drive_dump_ascii(UINT8 *src, size_t size)
268void alto2_cpu_device::drive_dump_ascii(UINT8 *src, size_t size)
269269{
270270   size_t offs;
271   LOG((log_DRV,0," ["));
271   LOG((0,0," ["));
272272   for (offs = 0; offs < size; offs++) {
273273      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));
275275   }
276   LOG((log_DRV,0,"]\n"));
276   LOG((0,0,"]\n"));
277277}
278278
279279
r26069r26070
284284 * @param size size of the record in bytes
285285 * @param name name to print before the dump
286286 */
287static size_t dump_record(UINT8 *src, size_t addr, size_t size, const char *name, int cr)
287size_t alto2_cpu_device::dump_record(UINT8 *src, size_t addr, size_t size, const char *name, int cr)
288288{
289289   size_t offs;
290   LOG((log_DRV,0,"%s:", name));
290   LOG((0,0,"%s:", name));
291291   for (offs = 0; offs < size; offs += 2) {
292292      int word = src[offs] + 256 * src[offs + 1];
293293      if (offs % 16) {
294         LOG((log_DRV,0," %06o", word));
294         LOG((0,0," %06o", word));
295295      } else {
296296         if (offs > 0)
297297            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));
299299      }
300300   }
301301   if (offs % 16) {
r26069r26070
304304      drive_dump_ascii(&src[offs-16], 16);
305305   }
306306   if (cr) {
307      LOG((log_DRV,0,"\n"));
307      LOG((0,0,"\n"));
308308   }
309309   return size;
310310}
r26069r26070
318318 * @param size number of words to scan for a sync word
319319 * @result next src pointer
320320 */
321static size_t squeeze_sync(UINT32 *bits, size_t src, size_t size)
321size_t alto2_cpu_device::squeeze_sync(UINT32 *bits, size_t src, size_t size)
322322{
323323   size_t offs, bitcount;
324324   UINT32 accu = 0;
r26069r26070
343343      }
344344   }
345345   /* 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));
347347   return src;
348348}
349349
r26069r26070
355355 * @param size number of words to scan for a sync word
356356 * @result next src pointer
357357 */
358static size_t squeeze_unsync(UINT32 *bits, size_t src, size_t size)
358size_t alto2_cpu_device::squeeze_unsync(UINT32 *bits, size_t src, size_t size)
359359{
360360   size_t offs, bitcount;
361361   UINT32 accu = 0;
r26069r26070
380380      }
381381   }
382382   /* 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));
384384   return src;
385385}
386386
r26069r26070
393393 * @param size size of the record in bytes
394394 * @result next src pointer
395395 */
396static size_t squeeze_record(UINT32 *bits, size_t src, UINT8 *field, size_t size)
396size_t alto2_cpu_device::squeeze_record(UINT32 *bits, size_t src, UINT8 *field, size_t size)
397397{
398398   size_t offs, bitcount;
399399   UINT32 accu = 0;
r26069r26070
425425 * @param cksum pointer to an int to receive the checksum word
426426 * @result next src pointer
427427 */
428static size_t squeeze_cksum(UINT32 *bits, size_t src, int *cksum)
428size_t alto2_cpu_device::squeeze_cksum(UINT32 *bits, size_t src, int *cksum)
429429{
430430   size_t bitcount;
431431   UINT32 accu = 0;
r26069r26070
459459      fatal(1, "invalid unit %d in call to squeeze_sector()\n", unit);
460460
461461   if (d->rdfirst >= 0) {
462      LOG((log_DRV,0,
462      LOG((0,0,
463463         "   RD #%d %03d/%d/%02d bit#%-5d (@%03d.%02d) ... bit#%-5d (@%03d.%02d)\n",
464464         d->unit, d->cylinder, d->head, d->sector,
465465         d->rdfirst, d->rdfirst / 32, d->rdfirst % 32,
r26069r26070
483483   }
484484
485485   if (d->wrfirst >= 0) {
486      LOG((log_DRV,0,
486      LOG((0,0,
487487         "   WR #%d %03d/%d/%02d bit#%-5d (@%03d.%02d) ... bit#%-5d (@%03d.%02d)\n",
488488         d->unit, d->cylinder, d->head, d->sector,
489489         d->wrfirst, d->wrfirst / 32, d->wrfirst % 32,
r26069r26070
493493   d->wrlast = -1;
494494
495495   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));
497497      return;
498498   }
499499
r26069r26070
505505
506506   /* no bits to write? */
507507   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));
509509      return;
510510   }
511511
r26069r26070
519519   src = squeeze_unsync(bits, src, 40);
520520   /* sync on header preamble */
521521   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",
523523      src, src / 32, src % 32));
524524   src = squeeze_record(bits, src, s->header, sizeof(s->header));
525525   src = squeeze_cksum(bits, src, &cksum_header);
r26069r26070
531531   src = squeeze_unsync(bits, src, 40);
532532   /* sync on label preamble */
533533   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",
535535      src, src / 32, src % 32));
536536   src = squeeze_record(bits, src, s->label, sizeof(s->label));
537537   src = squeeze_cksum(bits, src, &cksum_label);
r26069r26070
543543   src = squeeze_unsync(bits, src, 40);
544544   /* sync on data preamble */
545545   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",
547547      src, src / 32, src % 32));
548548   src = squeeze_record(bits, src, s->data, sizeof(s->data));
549549   src = squeeze_cksum(bits, src, &cksum_data);
r26069r26070
558558
559559   if (cksum_header || cksum_label || cksum_data) {
560560#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));
562562#else
563563      printf("   cksum check - header:%06o label:%06o data:%06o\n", cksum_header, cksum_label, cksum_data);
564564#endif
r26069r26070
834834      d->addx_acknowledge_0 = 0;
835835      /* clear log address interlock (?) */
836836      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));
838838   } else {
839839      /* it is not ready (?) */
840840      d->ready_0 = 1;
r26069r26070
842842      d->s_r_w_0 = 1;
843843      /* address acknowledge (?) */
844844      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));
846846   }
847847
848848   /* Note: head select input is active low (0: selects head 1, 1: selects head 0) */
849849   head = head & DIABLO_DRIVE_HEAD_MASK;
850850   if (head != d->head) {
851851      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));
853853   }
854854   drive_get_sector(unit);
855855}
r26069r26070
873873      fatal(1, "invalid unit %d in call to drive_strobe()\n", unit);
874874
875875   if (strobe == 1) {
876      LOG((log_DRV,1,"   STROBE end of interlock\n", seekto));
876      LOG((0,1,"   STROBE end of interlock\n", seekto));
877877      /* deassert the log address interlock */
878878      d->log_addx_interlock_0 = 1;
879879      return;
r26069r26070
883883   d->log_addx_interlock_0 = 0;
884884
885885   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));
887887      d->addx_acknowledge_0 = 0;   /* address acknowledge, if cylinder is reached */
888888      d->seek_incomplete_0 = 1;   /* reset seek incomplete */
889889      return;
r26069r26070
899899         d->log_addx_interlock_0 = 1;   /* deassert the log address interlock */
900900         d->seek_incomplete_0 = 1;   /* deassert seek incomplete */
901901         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));
903903         return;
904904      }
905905   } else {
r26069r26070
910910         d->log_addx_interlock_0 = 1;   /* deassert the log address interlock */
911911         d->seek_incomplete_0 = 1;   /* deassert seek incomplete */
912912         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));
914914         return;
915915      }
916916   }
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));
918918
919919   d->addx_acknowledge_0 = 1;   /* deassert address acknowledge  */
920920   d->seek_incomplete_0 = 1;   /* deassert seek incomplete */
r26069r26070
10171017   if (-1 == d->wrfirst)
10181018      d->wrfirst = index;
10191019
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));
10211021
10221022   if (index < GUARD_ZONE_BITS) {
10231023      /* don't write in the guard zone (?) */
r26069r26070
10741074      d->rdfirst = index;
10751075
10761076   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));
10781078   d->rdlast = index;
10791079   return bit;
10801080}
r26069r26070
11261126      clk = RDBIT(bits,index);
11271127   }
11281128
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));
11301130
11311131   d->rdlast = index;
11321132   return clk ^ 1;
r26069r26070
12331233   int unit = m_unit_selected;
12341234   diablo_drive_t *d = m_drive[unit];
12351235
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));
12371237   (void)d;
12381238
12391239   switch (arg) {
r26069r26070
12651265{
12661266   diablo_drive_t *d = m_drive[unit];
12671267
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));
12691269   /* set sector mark to 1 */
12701270   d->sector_mark_0 = 1;
12711271}
r26069r26070
12791279{
12801280   diablo_drive_t *d = m_drive[unit];
12811281
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));
12831283
12841284   /* squeeze previous sector, if it was written to */
12851285   squeeze_sector(unit);
r26069r26070
13401340   if (!strcmp(p, ".z") || !strcmp(p, ".Z") ||
13411341      !strcmp(p, ".gz") || !strcmp(p, ".GZ")) {
13421342      /* 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));
13441344      zcat = 1;
13451345   } else if (!strcmp(p, ".dsk") || !strcmp(p, ".DSK")) {
13461346      /* 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));
13481348      zcat = 0;
13491349   } else {
13501350      return -1;
r26069r26070
13881388   }
13891389   fclose(fp);
13901390
1391   LOG((log_DRV,0, "got %d (%#x) bytes\n", done, done));
1391   LOG((0,0, "got %d (%#x) bytes\n", done, done));
13921392
13931393   cooked = (diablo_sector_t *)malloc(csize);
13941394   if (!cooked)
r26069r26070
14221422   ip = NULL;
14231423
14241424   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));
14261426      free(cooked);
14271427      return -1;
14281428   }
r26069r26070
14381438      hdr = cooked->header[2] + 256 * cooked->header[3];
14391439      chs = (s << 12) | (c << 3) | (h << 2) | (unit << 1);
14401440      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",
14421442            c, h, s, chs, hdr));
14431443      }
14441444      if (++s == DRIVE_SPT) {
r26069r26070
14541454   /* set drive image */
14551455   d->image = (diablo_sector_t *)cp;
14561456
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));
14581458
14591459   drive_select(unit, 0);
14601460
r26069r26070
14631463   /* drive address acknowledge is active now */
14641464   d->addx_acknowledge_0 = 0;
14651465
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));
14671467
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));
14691469
14701470   return 0;
14711471}
branches/alto2/src/emu/cpu/alto2/a2curt.c
r26069r26070
2525void alto2_cpu_device::f2_load_xpreg_1()
2626{
2727   m_dsp.xpreg = A2_GET32(m_bus,16,6,15);
28   LOG((0,2,"   XPREG<- BUS[6-15] (%#o)\n", dsp.xpreg));
28   LOG((0,2,"   XPREG<- BUS[6-15] (%#o)\n", m_dsp.xpreg));
2929}
3030
3131/**
r26069r26070
4848void alto2_cpu_device::f2_load_csr_1()
4949{
5050   m_dsp.csr = m_bus;
51   LOG((0,2,"   CSR<- BUS (%#o)\n", dsp.csr));
51   LOG((0,2,"   CSR<- BUS (%#o)\n", m_dsp.csr));
5252   int x = 1023 - m_dsp.xpreg; \
5353   m_dsp.curdata = m_dsp.csr << (16 - (x & 15)); \
5454   m_dsp.curword = x / 16; \
branches/alto2/src/emu/cpu/alto2/a2mem.c
r26069r26070
451451         LOG((0,5,"   memory error at dword addr:%07o data:%011o check:%03o\n", dw_addr * 2, dw_data, hpb));
452452         LOG((0,6,"   MEAR: %06o\n", m_mem.mear));
453453         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"));
466465      }
467466      if (-1 == hamming_lut[syndrome]) {
468467         /* double-bit error: wake task_part, if we're told so */
r26069r26070
560559
561560void alto2_cpu_device::mesr_w(UINT32 address, UINT16 data)
562561{
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));
564563   m_mem.mesr = 0;      // set all bits to 0
565564   m_mem.error = 0;   // reset the error flag
566565   m_task_wakeup &= ~(1 << task_part);   // clear the task wakeup for the parity error task
r26069r26070
594593   A2_PUT16(m_mem.mecr,16, 0, 3,0);
595594   A2_PUT16(m_mem.mecr,16,15,15,0);
596595   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"));
602601}
603602
604603/**
r26069r26070
671670      LOG((0,6,"   MD = MMIO[%#o] (%#o)\n", base_addr, m_mem.md));
672671      m_mem.access = ALTO2_MEM_NONE;
673672#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);
676674#endif
677675      return m_mem.md;
678676   }
r26069r26070
683681      m_mem.rmdd = hamming_code(0, m_mem.mar/2, m_mem.rmdd);
684682#endif
685683   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));
687685
688686#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);
691688#endif
692689
693690   if (m_mem.access & ALTO2_MEM_ODD) {
r26069r26070
716713   }
717714
718715   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));
720717      m_mem.access = ALTO2_MEM_NONE;
721718      return;
722719   }
r26069r26070
727724      ((*this).*mmio_write_fn[base_addr - ALTO2_IO_PAGE_BASE])(base_addr, m_mem.md);
728725      m_mem.access = ALTO2_MEM_NONE;
729726#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);
732728#endif
733729      return;
734730   }
r26069r26070
748744#endif
749745
750746#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);
753748#endif
754749   /* don't reset mem.access to permit double word exchange */
755750   m_mem.mar ^= ALTO2_MEM_ODD;
branches/alto2/src/emu/cpu/alto2/a2emu.c
r26069r26070
395395      XC = m_t & 1;
396396      m_shifter = m_l >> 1;
397397      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));
399399      break;
400400   case f1_l_lcy_8:   // <-L LCY 8
401401   default:         // other
r26069r26070
415415#else
416416   A2_PUT8(m_rsel, 5, 3, 4, IR_DstAC(m_emu.ir) ^ 3);
417417#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)));
419419}
420420
421421/**
r26069r26070
506506#else
507507   A2_PUT8(m_rsel, 5, 3, 4, IR_DstAC(m_emu.ir) ^ 3);
508508#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)));
510510}
511511
512512#if   ALTO2_DEBUG
r26069r26070
519519
520520   LOG((0,3,"   BITBLT AC1:%06o AC2:%06o\n", m_r[rsel_ac1], m_r[rsel_ac2]));
521521   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)]));
526526   val = debug_read_mem(bbt+1);
527527   LOG((0,3,"      unused AC2: %06o (%d)\n", val, val));
528528   val = debug_read_mem(bbt+2);
r26069r26070
560560{
561561   UINT16 r = (A2_BIT32(m_bus,16,0) << 3) | A2_GET32(m_bus,16,5,7);
562562
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
573563   /* special logging of some opcodes */
574564   switch (m_bus) {
575565   case op_CYCLE:
r26069r26070
659649#else
660650   A2_PUT8(m_rsel, 5, 3, 4, IR_SrcAC(m_emu.ir) ^ 3);
661651#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)));
663653}
664654
665655/**
branches/alto2/src/emu/cpu/alto2/a2disk.c
r26069r26070
16031603      }
16041604   }
16051605
1606   LOG((0,2,"   current cylinder:%d\n", drive_cylinder(unit) ^ DRIVE_CYLINDER_MASK));
1606   LOG((0,2,"   current cylinder:%d\n", drive_cylinder(unit) ^ DIABLO_DRIVE_CYLINDER_MASK));
16071607
16081608   /* if the strobe is still set, restart the timer */
16091609   if (m_dsk.strobe) {
branches/alto2/src/emu/cpu/alto2/alto2.c
r26069r26070
678678
679679   m_icountptr = &m_icount;
680680
681   // reverse dwords and invert hardware specific bits
682   const UINT32 addrxor = 4 * (ALTO2_UCODE_PAGE_SIZE - 1);
683   UINT32* temp = auto_alloc_array(machine(), UINT32, 2 * ALTO2_UCODE_PAGE_SIZE);
684   UINT32 ucode;
685   for (UINT32 addr = 0; addr < ALTO2_UCODE_PAGE_SIZE; addr++) {
686      ucode = m_ucode->read_dword(4*addr ^ addrxor);
687      temp[addr] = ucode ^ ALTO2_UCODE_INVERTED;
688      ucode = m_ucode->read_dword(4*(ALTO2_UCODE_PAGE_SIZE+addr) ^ addrxor);
689      temp[ALTO2_UCODE_PAGE_SIZE+addr] = ucode ^ ALTO2_UCODE_INVERTED;
690   }
691   for (UINT32 addr = 0; addr < 2*ALTO2_UCODE_PAGE_SIZE; addr++) {
692      m_ucode->write_dword(4*addr, temp[addr]);
693   }
694
695681   hard_reset();
696682}
697683
r26069r26070
893879   return "???";
894880}
895881
896UINT8 cram3k_a37[256];
882void alto2_cpu_device::watch_read(UINT32 addr, UINT32 data)
883{
884   LOG((0,0,"mem: rd[%06o] = %06o\n", addr, data));
885}
897886
898UINT8 madr_a64[256];
887void alto2_cpu_device::watch_write(UINT32 addr, UINT32 data)
888{
889   LOG((0,0,"mem: wr[%06o] = %06o\n", addr, data));
890}
899891
900UINT8 madr_a65[256];
901
902892/** @brief fatal exit on unitialized dynamic phase BUS source */
903893void alto2_cpu_device::fn_bs_bad_0()
904894{
r26069r26070
19511941      m_ntime[m_task] += ALTO2_UCYCLE;
19521942
19531943      /* next instruction's mpc */
1944      debugger_instruction_hook(this, m_mpc);
19541945      m_mpc = m_next;
1955      debugger_instruction_hook(this, m_next);
19561946      m_mir = m_ucode->read_dword(m_mpc);
19571947      m_rsel = MIR_RSEL(m_mir);
19581948      m_next = MIR_NEXT(m_mir) | m_next2;
branches/alto2/src/emu/cpu/alto2/a2disp.c
r26069r26070
424424void alto2_cpu_device::f2_evenfield_1()
425425{
426426   UINT16 r = HLC1024() ^ 1;
427   LOG((0,2,"   evenfield branch on HLC1024 (%#o | %#o)\n", cpu.next2, r));
427   LOG((0,2,"   evenfield branch on HLC1024 (%#o | %#o)\n", m_next2, r));
428428   m_next2 |= r;
429429}
430430
branches/alto2/src/emu/cpu/alto2/a2mrt.c
r26069r26070
1414{
1515   /* clear the wakeup for the memory refresh task */
1616   m_task_wakeup &= ~(1 << m_task);
17   LOG((0,2,"   BLOCK %s\n", task_name[cpu.task]));
17   LOG((0,2,"   BLOCK %s\n", task_name(m_task)));
1818}
1919
2020//! called by the CPU when MRT becomes active
branches/alto2/src/emu/cpu/alto2/alto2dsm.c
r26069r26070
210210         (static_cast<UINT32>(src[3]));
211211   UINT16 prefetch = next2 & 1023;
212212   char *dst = buffer;
213   offs_t result = 1 | DASMFLAG_SUPPORTED;
213214   int pa;
214215
216   if (next != pc + 1)
217      result |= DASMFLAG_STEP_OUT;
218
215219   switch (aluf) {
216220   case  0: // T?: BUS
217221      if (t)
r26069r26070
454458      dst += snprintf(dst, len - (size_t)(dst - buffer), "BUS<-F2_%02o ", f2);
455459      break;
456460   }
457   return 1;
461   return result;
458462}
branches/alto2/src/emu/cpu/alto2/alto2.h
r26069r26070
1818#define   ALTO2_TAG "alto2"
1919
2020#ifndef   ALTO2_DEBUG
21#define   ALTO2_DEBUG         0
21#define   ALTO2_DEBUG         1
2222#endif
2323
2424#define   USE_PRIO_F9318   0         //!< define to 1 to use the F9318 priority encoder code
r26069r26070
975975   UINT64 m_cycle;                           //!< number of cycles executed in the current slice
976976
977977   UINT64 cycle() { return m_cycle; }            //!< return the current CPU cycle
978   UINT64 ntime() { return m_cycle*ALTO2_UCYCLE; }   //!< return the current nano seconds
978979
979980   void hard_reset();                        //!< reset the various registers
980981   int soft_reset();                        //!< soft reset
r26069r26070
14481449   int m_head_selected;                        //!< selected drive head
14491450   a2cb m_sector_callback;                        //!< callback to call at the start of each sector
14501451   emu_timer* m_sector_timer;                     //!< sector timer
1452#if   ALTO2_DEBUG
1453   void drive_dump_ascii(UINT8 *src, size_t size);
1454   size_t dump_record(UINT8 *src, size_t addr, size_t size, const char *name, int cr);
1455#endif
14511456   void drive_get_sector(int unit);               //!< calculate the sector from the logical block address
14521457   void expand_sector(int unit, int page);            //!< Expand a sector into an array of clock and data bits
1458   size_t squeeze_sync(UINT32 *bits, size_t src, size_t size);
1459   size_t squeeze_unsync(UINT32 *bits, size_t src, size_t size);
1460   size_t squeeze_record(UINT32 *bits, size_t src, UINT8 *field, size_t size);
1461   size_t squeeze_cksum(UINT32 *bits, size_t src, int *cksum);
14531462   void squeeze_sector(int unit);                  //!< Squeeze a array of clock and data bits into a sector's data
14541463   int drive_bits_per_sector() const;               //!< return number of bitclk edges for a sector
14551464   const char* drive_description(int unit);         //!< return a pointer to a drive's description
r26069r26070
18851894      int mear;                     //!< memory error address register
18861895      UINT16 mesr;                  //!< memory error status register
18871896      UINT16 mecr;                  //!< memory error control register
1888
1889#if   ALTO2_DEBUG
1890      void (*watch_read)(int mar, int md);   //!< watch read function (debugging)
1891      void (*watch_write)(int mar, int md);   //!< watch write function (debugging)
1892#endif
18931897   }   m_mem;
18941898
18951899   /**
r26069r26070
19881992   //! debugger interface to write memory
19891993   void debug_write_mem(UINT32 addr, UINT16 data);
19901994
1995#if   ALTO2_DEBUG
1996   void watch_write(UINT32 addr, UINT32 data);
1997   void watch_read(UINT32 addr, UINT32 data);
1998#endif
1999
19912000   //! initialize the memory system
19922001   void init_memory();
19932002

Previous 199869 Revisions Next


© 1997-2024 The MAME Team