Index: hw/fdc.c =================================================================== --- hw/fdc.c (revision 4215) +++ hw/fdc.c (working copy) @@ -46,6 +46,9 @@ /********************************************************/ /* Floppy drive emulation */ +#define GET_CUR_DRV(fdctrl) ((fdctrl)->cur_drv) +#define SET_CUR_DRV(fdctrl, drive) ((fdctrl)->cur_drv = (drive)) + /* Will always be a fixed parameter for us */ #define FD_SECTOR_LEN 512 #define FD_SECTOR_SC 2 /* Sector size code */ @@ -706,7 +709,7 @@ if (level) { // XXX - FLOPPY_DPRINTF("TC pulsed\n"); + FLOPPY_DPRINTF("Terminal Count Line pulsed\n"); } } @@ -798,7 +801,7 @@ static fdrive_t *get_cur_drv (fdctrl_t *fdctrl) { - switch (fdctrl->dor & FD_DOR_SELMASK) { + switch (GET_CUR_DRV(fdctrl)) { case 0: return drv0(fdctrl); case 1: return drv1(fdctrl); #if MAX_FD == 4 @@ -1036,7 +1039,7 @@ cur_drv = get_cur_drv(fdctrl); /* Add head and drive to status0 */ - status0 |= (cur_drv->head << 2) | (fdctrl->cur_drv); + status0 |= (cur_drv->head << 2) | GET_CUR_DRV(fdctrl); FLOPPY_DPRINTF("transfer status: %02x %02x %02x (%02x)\n", fdctrl->status0, fdctrl->status1, fdctrl->status2, @@ -1063,13 +1066,13 @@ fdrive_t *cur_drv; uint8_t kh, kt, ks; - fdctrl->cur_drv = fdctrl->fifo[1] & FD_DOR_SELMASK; + SET_CUR_DRV(fdctrl, fdctrl->fifo[1] & FD_DOR_SELMASK); cur_drv = get_cur_drv(fdctrl); kt = fdctrl->fifo[2]; kh = fdctrl->fifo[3]; ks = fdctrl->fifo[4]; FLOPPY_DPRINTF("Start transfer at %d %d %02x %02x (%d)\n", - fdctrl->cur_drv, kh, kt, ks, + GET_CUR_DRV(fdctrl), kh, kt, ks, _fd_sector(kh, kt, ks, cur_drv->last_sect)); switch (fd_seek(cur_drv, kh, kt, ks, fdctrl->config & FD_CONFIG_EIS)) { case 2: @@ -1200,7 +1203,7 @@ len = FD_SECTOR_LEN - rel_pos; FLOPPY_DPRINTF("copy %d bytes (%d %d %d) %d pos %d %02x " "(%d-0x%08x 0x%08x)\n", len, dma_len, fdctrl->data_pos, - fdctrl->data_len, fdctrl->cur_drv, cur_drv->head, + fdctrl->data_len, GET_CUR_DRV(fdctrl), cur_drv->head, cur_drv->track, cur_drv->sect, fd_sector(cur_drv), fd_sector(cur_drv) * FD_SECTOR_LEN); if (fdctrl->data_dir != FD_DIR_WRITE || @@ -1326,13 +1329,13 @@ fdrive_t *cur_drv; uint8_t kh, kt, ks; - fdctrl->cur_drv = fdctrl->fifo[1] & FD_DOR_SELMASK; + SET_CUR_DRV(fdctrl, fdctrl->fifo[1] & FD_DOR_SELMASK); cur_drv = get_cur_drv(fdctrl); kt = fdctrl->fifo[6]; kh = fdctrl->fifo[7]; ks = fdctrl->fifo[8]; FLOPPY_DPRINTF("format sector at %d %d %02x %02x (%d)\n", - fdctrl->cur_drv, kh, kt, ks, + GET_CUR_DRV(fdctrl->dor), kh, kt, ks, _fd_sector(kh, kt, ks, cur_drv->last_sect)); switch (fd_seek(cur_drv, kh, kt, ks, fdctrl->config & FD_CONFIG_EIS)) { case 2: @@ -1499,7 +1502,7 @@ { fdrive_t *cur_drv; - fdctrl->cur_drv = fdctrl->fifo[1] & FD_DOR_SELMASK; + SET_CUR_DRV(fdctrl, fdctrl->fifo[1] & FD_DOR_SELMASK); cur_drv = get_cur_drv(fdctrl); fdctrl->data_state |= FD_STATE_FORMAT; if (fdctrl->fifo[0] & 0x80) @@ -1539,14 +1542,14 @@ { fdrive_t *cur_drv; - fdctrl->cur_drv = fdctrl->fifo[1] & FD_DOR_SELMASK; + SET_CUR_DRV(fdctrl, fdctrl->fifo[1] & FD_DOR_SELMASK); cur_drv = get_cur_drv(fdctrl); cur_drv->head = (fdctrl->fifo[1] >> 2) & 1; /* 1 Byte status back */ fdctrl->fifo[0] = (cur_drv->ro << 6) | (cur_drv->track == 0 ? 0x10 : 0x00) | (cur_drv->head << 2) | - fdctrl->cur_drv | + GET_CUR_DRV(fdctrl) | 0x28; fdctrl_set_fifo(fdctrl, 1, 0); } @@ -1555,7 +1558,7 @@ { fdrive_t *cur_drv; - fdctrl->cur_drv = fdctrl->fifo[1] & FD_DOR_SELMASK; + SET_CUR_DRV(fdctrl, fdctrl->fifo[1] & FD_DOR_SELMASK); cur_drv = get_cur_drv(fdctrl); fd_recalibrate(cur_drv); fdctrl_reset_fifo(fdctrl); @@ -1569,7 +1572,7 @@ fdrive_t *cur_drv = get_cur_drv(fdctrl); fdctrl->fifo[0] = - fdctrl->status0 | (cur_drv->head << 2) | fdctrl->cur_drv; + fdctrl->status0 | (cur_drv->head << 2) | GET_CUR_DRV(fdctrl); fdctrl->fifo[1] = cur_drv->track; fdctrl_set_fifo(fdctrl, 2, 0); fdctrl_reset_irq(fdctrl); @@ -1580,7 +1583,7 @@ { fdrive_t *cur_drv; - fdctrl->cur_drv = fdctrl->fifo[1] & FD_DOR_SELMASK; + SET_CUR_DRV(fdctrl, fdctrl->fifo[1] & FD_DOR_SELMASK); cur_drv = get_cur_drv(fdctrl); fdctrl_reset_fifo(fdctrl); fdctrl->status0 |= FD_SR0_SEEK; @@ -1640,16 +1643,16 @@ } else if (fdctrl->data_len > 7) { /* ERROR */ fdctrl->fifo[0] = 0x80 | - (cur_drv->head << 2) | fdctrl->cur_drv; + (cur_drv->head << 2) | GET_CUR_DRV(fdctrl->dor); fdctrl_set_fifo(fdctrl, 1, 1); } } static void fdctrl_handle_relative_seek_out (fdctrl_t *fdctrl, int direction) { - fdrive_t *cur_drv = get_cur_drv(fdctrl); + fdrive_t *cur_drv; - fdctrl->cur_drv = fdctrl->fifo[1] & FD_DOR_SELMASK; + SET_CUR_DRV(fdctrl, fdctrl->fifo[1] & FD_DOR_SELMASK); cur_drv = get_cur_drv(fdctrl); if (fdctrl->fifo[2] + cur_drv->track >= cur_drv->max_track) { cur_drv->track = cur_drv->max_track - 1; @@ -1663,9 +1666,9 @@ static void fdctrl_handle_relative_seek_in (fdctrl_t *fdctrl, int direction) { - fdrive_t *cur_drv = get_cur_drv(fdctrl); + fdrive_t *cur_drv; - fdctrl->cur_drv = fdctrl->fifo[1] & FD_DOR_SELMASK; + SET_CUR_DRV(fdctrl, fdctrl->fifo[1] & FD_DOR_SELMASK); cur_drv = get_cur_drv(fdctrl); if (fdctrl->fifo[2] > cur_drv->track) { cur_drv->track = 0;