int32 dsk12(const int32 port, const int32 io, const int32 data) { int32 i, rtn; UNIT *uptr; if (current_disk >= NUM_OF_DSK) { if ((dsk_dev.dctrl & VERBOSE_MSG) && (warnDSK12 < warnLevelDSK)) { warnDSK12++; sim_debug(VERBOSE_MSG, &dsk_dev, "DSK%i: " ADDRESS_FORMAT " Attempt of %s 0x0a on unattached disk - ignored.\n", current_disk, PCX, selectInOut(io)); } return 0; } /* now current_disk < NUM_OF_DSK */ in9_count = 0; uptr = dsk_dev.units + current_disk; if (io == 0) { if (current_byte[current_disk] >= DSK_SECTSIZE) { /* physically read the sector */ sim_debug(READ_MSG, &dsk_dev, "DSK%i: " ADDRESS_FORMAT " IN 0x0a (READ) D%d T%d S%d\n", current_disk, PCX, current_disk, current_track[current_disk], current_sector[current_disk]); for (i = 0; i < DSK_SECTSIZE; i++) dskbuf[i] = 0; if (dskseek(uptr)) { if ((dsk_dev.dctrl & VERBOSE_MSG) && (warnDSK12 < warnLevelDSK)) { warnDSK12++; sim_debug(VERBOSE_MSG, &dsk_dev, "DSK%i: " ADDRESS_FORMAT " fseek error D%d T%d S%d\n", current_disk, PCX, current_disk, current_track[current_disk], current_sector[current_disk]); } } rtn = sim_fread(dskbuf, 1, DSK_SECTSIZE, uptr -> fileref); if (rtn != DSK_SECTSIZE) { if ((dsk_dev.dctrl & VERBOSE_MSG) && (warnDSK12 < warnLevelDSK)) { warnDSK12++; sim_debug(VERBOSE_MSG, &dsk_dev, "DSK%i: " ADDRESS_FORMAT " sim_fread error D%d T%d S%d\n", current_disk, PCX, current_disk, current_track[current_disk], current_sector[current_disk]); } } current_byte[current_disk] = 0; } return dskbuf[current_byte[current_disk]++] & 0xff; } else { if (current_byte[current_disk] >= DSK_SECTSIZE) writebuf(); /* from above we have that current_disk < NUM_OF_DSK */ else { dirty = TRUE; /* this guarantees for the next call to writebuf that current_disk < NUM_OF_DSK */ dskbuf[current_byte[current_disk]++] = data & 0xff; } return 0; /* ignored since OUT */ } }
int32 dsk11(const int32 port, const int32 io, const int32 data) { if (current_disk >= NUM_OF_DSK) { if ((dsk_dev.dctrl & VERBOSE_MSG) && (warnDSK11 < warnLevelDSK)) { warnDSK11++; /*03*/ printf("DSK%i: " ADDRESS_FORMAT " Attempt of %s 0x09 on unattached disk - ignored." NLP, current_disk, PCX, selectInOut(io)); } return 0; /* no drive selected - can do nothing */ } /* now current_disk < NUM_OF_DSK */ if (io == 0) { /* read sector position */ in9_count++; if ((dsk_dev.dctrl & SECTOR_STUCK_MSG) && (in9_count > 2 * DSK_SECT) && (!in9_message)) { in9_message = TRUE; printf("DSK%i: " ADDRESS_FORMAT " Looping on sector find." NLP, current_disk, PCX); } TRACE_PRINT(IN_MSG, ("DSK%i: " ADDRESS_FORMAT " IN 0x09" NLP, current_disk, PCX)); if (dirty) /* implies that current_disk < NUM_OF_DSK */ writebuf(); if (current_flag[current_disk] & 0x04) { /* head loaded? */ current_sector[current_disk]++; if (current_sector[current_disk] >= DSK_SECT) current_sector[current_disk] = 0; current_byte[current_disk] = 0xff; return (((current_sector[current_disk] << 1) & 0x3e) /* return 'sector true' bit = 0 (true) */ | 0xc0); /* set on 'unused' bits */ } else return 0; /* head not loaded - return 0 */ } in9_count = 0; /* drive functions */ TRACE_PRINT(OUT_MSG, ("DSK%i: " ADDRESS_FORMAT " OUT 0x09: %x" NLP, current_disk, PCX, data)); if (data & 0x01) { /* step head in */ if ((dsk_dev.dctrl & TRACK_STUCK_MSG) && (current_track[current_disk] == (tracks[current_disk] - 1))) { printf("DSK%i: " ADDRESS_FORMAT " Unnecessary step in." NLP, current_disk, PCX); } current_track[current_disk]++; if (current_track[current_disk] > (tracks[current_disk] - 1)) current_track[current_disk] = (tracks[current_disk] - 1); if (dirty) /* implies that current_disk < NUM_OF_DSK */ writebuf(); current_sector[current_disk] = 0xff; current_byte[current_disk] = 0xff; } if (data & 0x02) { /* step head out */ if ((dsk_dev.dctrl & TRACK_STUCK_MSG) && (current_track[current_disk] == 0)) { printf("DSK%i: " ADDRESS_FORMAT " Unnecessary step out." NLP, current_disk, PCX); } current_track[current_disk]--; if (current_track[current_disk] < 0) { current_track[current_disk] = 0; current_flag[current_disk] |= 0x40; /* track 0 if there */ } if (dirty) /* implies that current_disk < NUM_OF_DSK */ writebuf(); current_sector[current_disk] = 0xff; current_byte[current_disk] = 0xff; } if (dirty) /* implies that current_disk < NUM_OF_DSK */ writebuf(); if (data & 0x04) { /* head load */ current_flag[current_disk] |= 0x04; /* turn on head loaded bit */ current_flag[current_disk] |= 0x80; /* turn on 'read data available' */ } if (data & 0x08) { /* head unload */ current_flag[current_disk] &= 0xfb; /* turn off 'head loaded' bit */ current_flag[current_disk] &= 0x7f; /* turn off 'read data available' */ current_sector[current_disk] = 0xff; current_byte[current_disk] = 0xff; } /* interrupts & head current are ignored */ if (data & 0x80) { /* write sequence start */ current_byte[current_disk] = 0; current_flag[current_disk] |= 0x01; /* enter new write data on */ } return 0; /* ignored since OUT */ }