|
|
| version 1.3, 2004/08/02 13:38:46 | version 1.4, 2004/08/04 15:18:26 |
|---|---|
| Line 8 | Line 8 |
| static D88_HEADER d88head[4]; | static D88_HEADER d88head[4]; |
| static D88_SECTOR cursec; | static _D88SEC cursec; |
| static short curdrv = -1; | static REG8 curdrv = (REG8)-1; |
| static WORD curtrk = -1; | static UINT curtrk = (UINT)-1; |
| static BYTE curtype = 0; | static BYTE curtype = 0; |
| static WORD cursct = -1; | static UINT cursct = (UINT)-1; |
| static long curfp = 0; | static long curfp = 0; |
| static DWORD cursize = 0; | static UINT cursize = 0; |
| static BYTE curwrite = 0; | static BYTE curwrite = 0; |
| static BYTE curtrkerr = 0; | static BYTE curtrkerr = 0; |
| static BYTE hole = 0; | static BYTE hole = 0; |
| static BYTE *curdata; | static BYTE *curdata; |
| static WORD crcnum = 0; | static UINT crcnum = 0; |
| static BYTE crcerror = FALSE; | static BYTE crcerror = FALSE; |
| extern WORD readdiag; | extern WORD readdiag; |
| Line 115 int curdataflush(void) { | Line 115 int curdataflush(void) { |
| } | } |
| DWORD read_d88track(short drv, WORD track, BYTE type) { | static DWORD read_d88track(REG8 drv, UINT track, BYTE type) { |
| FDDFILE fdd; | FDDFILE fdd; |
| FILEH hdr; | FILEH hdr; |
| Line 124 DWORD read_d88track(short drv, WORD trac | Line 124 DWORD read_d88track(short drv, WORD trac |
| curdrv = drv; | curdrv = drv; |
| curtrk = track; | curtrk = track; |
| curtype = type; | curtype = type; |
| cursct = -1; | cursct = (UINT)-1; |
| curwrite = 0; | curwrite = 0; |
| curtrkerr = 0; | curtrkerr = 0; |
| crcnum = 0; | crcnum = 0; |
| Line 147 DWORD read_d88track(short drv, WORD trac | Line 147 DWORD read_d88track(short drv, WORD trac |
| file_close(hdr); | file_close(hdr); |
| goto readd88_err; | goto readd88_err; |
| } | } |
| if (file_read(hdr, D88_BUF, (WORD)cursize) != (WORD)cursize) { | if (file_read(hdr, D88_BUF, cursize) != cursize) { |
| file_close(hdr); | file_close(hdr); |
| goto readd88_err; | goto readd88_err; |
| } | } |
| Line 166 readd88_err: | Line 166 readd88_err: |
| static int seeksector(short drv, WORD track, WORD sector) { | static int seeksector(REG8 drv, UINT track, UINT r) { |
| static int lastflag = FALSE; | static int lastflag = FALSE; |
| BYTE *p; | const _D88SEC *p; |
| WORD sec; | UINT sec; |
| UINT sectors; | |
| UINT secsize; | |
| if ((curdrv != drv) || (curtrk != track) || (curtype != fdc.media)) { | if ((curdrv != drv) || (curtrk != track) || (curtype != fdc.media)) { |
| read_d88track(drv, track, fdc.media); | read_d88track(drv, track, fdc.media); |
| } | } |
| if (curtrkerr) { | if (curtrkerr) { |
| cursct = sector; | cursct = r; |
| goto seekerror; | goto seekerror; |
| } | } |
| if (cursct != sector) { | if (cursct != r) { |
| cursct = sector; | cursct = r; |
| p = D88_BUF; | p = (D88SEC)D88_BUF; |
| for (sec=0; sec<40;) { | for (sec=0; sec<40; ) { |
| if ((WORD)((D88_SECTOR *)p)->r == sector) { | sectors = LOADINTELWORD(p->sectors); |
| memcpy(&cursec, p, sizeof(D88_SECTOR)); | secsize = LOADINTELWORD(p->size); |
| curdata = p + sizeof(D88_SECTOR); | if (p->r == r) { |
| CopyMemory(&cursec, p, sizeof(_D88SEC)); | |
| curdata = (UINT8 *)(p + 1); | |
| lastflag = TRUE; | lastflag = TRUE; |
| break; | break; |
| } | } |
| if (++sec >= ((D88_SECTOR *)p)->sectors) { | sec++; |
| if (sec >= sectors) { | |
| goto seekerror; | goto seekerror; |
| } | } |
| p += ((D88_SECTOR *)p)->size; | p = (D88SEC)(((UINT8 *)(p + 1)) + secsize); |
| p += sizeof(D88_SECTOR); | |
| } | } |
| if (sec >= 40) { | if (sec >= 40) { |
| goto seekerror; | goto seekerror; |
| Line 203 static int lastflag = FALSE; | Line 207 static int lastflag = FALSE; |
| return(lastflag); | return(lastflag); |
| seekerror:; | seekerror:; |
| ZeroMemory(&cursec, sizeof(D88_SECTOR)); | ZeroMemory(&cursec, sizeof(_D88SEC)); |
| curdata = &D88_BUF[16]; | curdata = &D88_BUF[16]; |
| lastflag = FALSE; | lastflag = FALSE; |
| return(FALSE); | return(FALSE); |
| } | } |
| static void drvflush(REG8 drv) { | |
| void drvflush(short drv) { | |
| if (curdrv == drv) { | if (curdrv == drv) { |
| curdataflush(); | curdataflush(); |
| curdrv = -1; | curdrv = (REG8)-1; |
| curtrk = -1; | curtrk = (UINT)-1; |
| cursct = -1; | cursct = (UINT)-1; |
| } | } |
| } | } |
| Line 227 void drvflush(short drv) { | Line 230 void drvflush(short drv) { |
| short fdd_crc_d88(void) { | short fdd_crc_d88(void) { |
| WORD track; | UINT track; |
| BYTE *p; | const _D88SEC *p; |
| WORD sec; | UINT sec; |
| UINT sectors; | |
| UINT secsize; | |
| ZeroMemory(fdc.crc_dat, 6); | ZeroMemory(fdc.crc_dat, 6); |
| if ((track = (WORD)(fdc.c << 1) + (WORD)fdc.h) > 163) { | track = (fdc.c << 1) + fdc.h; |
| if (track >= 164) { | |
| goto crcerror_d88; | goto crcerror_d88; |
| } | } |
| seeksector(fdc.drv, track, fdc.r); | seeksector(fdc.drv, track, fdc.r); |
| if (curtrkerr) { | if (curtrkerr) { |
| goto crcerror_d88; | goto crcerror_d88; |
| } | } |
| p = D88_BUF; | p = (D88SEC)D88_BUF; |
| for (sec=0; sec<crcnum;) { | for (sec=0; sec<crcnum;) { |
| if (++sec >= ((D88_SECTOR *)p)->sectors) { | sectors = LOADINTELWORD(p->sectors); |
| secsize = LOADINTELWORD(p->size); | |
| sec++; | |
| if (sec >= sectors) { | |
| goto crcerror_d88; | goto crcerror_d88; |
| } | } |
| p += ((D88_SECTOR *)p)->size; | p = (D88SEC)(((UINT8 *)(p + 1)) + secsize); |
| p += sizeof(D88_SECTOR); | |
| } | } |
| *(long *)fdc.crc_dat = *(long *)p; | fdc.rreg = p->c; // メルヘンヴェール |
| fdc.rreg = ((D88_SECTOR *)p)->c; // ??? メルヘンヴェール | fdc.crc_dat[0] = p->c; |
| fdc.crc_dat[1] = p->h; | |
| fdc.crc_dat[2] = p->r; | |
| fdc.crc_dat[3] = p->n; | |
| crcnum++; | crcnum++; |
| if (((D88_SECTOR *)p)->stat) { | if (p->stat) { |
| crcerror = TRUE; | crcerror = TRUE; |
| } | } |
| else { | else { |
| Line 269 BYTE fdd_stat_d88(void) { | Line 280 BYTE fdd_stat_d88(void) { |
| FDDFILE fdd; | FDDFILE fdd; |
| BYTE type; | BYTE type; |
| REG8 cmd; | REG8 cmd; |
| UINT trk; | |
| BYTE ans = 0; | BYTE ans = 0; |
| int seekable; | int seekable; |
| WORD trk; | |
| fdd = fddfile + fdc.drv; | fdd = fddfile + fdc.drv; |
| if (fdd->type != DISKTYPE_D88) { | if (fdd->type != DISKTYPE_D88) { |
| Line 279 BYTE fdd_stat_d88(void) { | Line 290 BYTE fdd_stat_d88(void) { |
| } | } |
| type = fdc.type; | type = fdc.type; |
| cmd = (REG8)(fdc.cmd >> 4); | cmd = (REG8)(fdc.cmd >> 4); |
| trk = (fdc.c << 1) + (WORD)fdc.h; | trk = (fdc.c << 1) + fdc.h; |
| seekable = seeksector(fdc.drv, trk, fdc.r); | seekable = seeksector(fdc.drv, trk, fdc.r); |
| if (!fdc.r) { | if (!fdc.r) { |
| seekable = TRUE; | seekable = TRUE; |
| Line 327 BYTE fdd_stat_d88(void) { | Line 338 BYTE fdd_stat_d88(void) { |
| if ((type != 4) && (FDDMTR_BUSY)) { | if ((type != 4) && (FDDMTR_BUSY)) { |
| ans |= 0x01; | ans |= 0x01; |
| } | } |
| if ((type == 2) && ((WORD)fdc.off < cursec.size)) { | if (type == 2) { |
| ans |= 0x03; // DATA REQUEST / BUSY | UINT secsize = LOADINTELWORD(cursec.size); |
| if ((UINT)fdc.off < secsize) { | |
| ans |= 0x03; // DATA REQUEST / BUSY | |
| } | |
| } | } |
| else if ((cmd == 0x0e) && (readdiag < 0x1a00)) { | else if ((cmd == 0x0e) && (readdiag < 0x1a00)) { |
| ans |= 0x03; | ans |= 0x03; |
| Line 349 BYTE fdd_stat_d88(void) { | Line 363 BYTE fdd_stat_d88(void) { |
| } | } |
| //********************************************************************** | //********************************************************************** |
| void fdd_read_d88(void) { | void fdd_read_d88(void) { |
| Line 359 void fdd_read_d88(void) { | Line 372 void fdd_read_d88(void) { |
| } | } |
| } | } |
| void fdd_write_d88(void) { | void fdd_write_d88(void) { |
| if ((fdd_stat_d88() & 0xf3) == 3) { | if ((fdd_stat_d88() & 0xf3) == 3) { |
| Line 368 void fdd_write_d88(void) { | Line 380 void fdd_write_d88(void) { |
| } | } |
| } | } |
| BYTE fdd_incoff_d88(void) { | BYTE fdd_incoff_d88(void) { |
| REG8 cmd; | REG8 cmd; |
| WORD trk; | UINT trk; |
| UINT secsize; | |
| cmd = (REG8)(fdc.cmd >> 4); | cmd = (REG8)(fdc.cmd >> 4); |
| trk = (fdc.c << 1) + (WORD)fdc.h; | trk = (fdc.c << 1) + fdc.h; |
| seeksector(fdc.drv, trk, fdc.r); | seeksector(fdc.drv, trk, fdc.r); |
| if ((WORD)(++fdc.off) < cursec.size) { | fdc.off++; |
| secsize = LOADINTELWORD(cursec.size); | |
| if ((UINT)fdc.off < secsize) { | |
| return(0); | return(0); |
| } | } |
| fdc.off = cursec.size; | fdc.off = secsize; |
| if ((cmd == 0x09) || (cmd == 0x0b)) { | if ((cmd == 0x09) || (cmd == 0x0b)) { |
| fdc.rreg = fdc.r + 1; // ver0.25 | fdc.rreg = fdc.r + 1; // ver0.25 |
| if (seeksector(fdc.drv, trk, fdc.rreg)) { | if (seeksector(fdc.drv, trk, fdc.rreg)) { |
| Line 392 BYTE fdd_incoff_d88(void) { | Line 406 BYTE fdd_incoff_d88(void) { |
| return(1); | return(1); |
| } | } |
| // --------------------------------------------------------------------------- | // --------------------------------------------------------------------------- |
| void init_tao_d88(void) { | void init_tao_d88(void) { |
| Line 455 void endoftrack(void) { | Line 470 void endoftrack(void) { |
| long endpointer; | long endpointer; |
| long lastpointer; | long lastpointer; |
| long trksize; | long trksize; |
| int ptr; | |
| long apsize; | long apsize; |
| D88SEC p; | |
| UINT secsize; | |
| if (!tao.sector) { | if (!tao.sector) { |
| tao.flag = 4; | tao.flag = 4; |
| Line 465 void endoftrack(void) { | Line 481 void endoftrack(void) { |
| tao.flag = 0; | tao.flag = 0; |
| curdataflush(); // write cache flush & | curdataflush(); // write cache flush & |
| curdrv = -1; // use D88_BUF[] for temp | curdrv = (REG8)-1; // use D88_BUF[] for temp |
| head = &d88head[fdc.drv]; | head = &d88head[fdc.drv]; |
| trk = (fdc.c << 1) + (WORD)fdc.h; | trk = (fdc.c << 1) + fdc.h; |
| ptr = 0; | p = (D88SEC)TAO_BUF; |
| for (i=0; i<(int)tao.sector; i++) { | for (i=0; i<(int)tao.sector; i++) { |
| ((D88_SECTOR *)&TAO_BUF[ptr])->sectors = tao.sector; | STOREINTELWORD(p->sectors, tao.sector); |
| ptr += ((D88_SECTOR *)&TAO_BUF[ptr])->size + 16; | secsize = LOADINTELWORD(p->size); |
| p = (D88SEC)(((UINT8 *)(p + 1)) + secsize); | |
| } | } |
| fdd = fddfile + fdc.drv; | fdd = fddfile + fdc.drv; |
| Line 517 void endoftrack(void) { | Line 534 void endoftrack(void) { |
| void fdd_wtao_d88(BYTE data) { | void fdd_wtao_d88(BYTE data) { |
| D88SEC p; | |
| if (tao.flag != 3) { | if (tao.flag != 3) { |
| return; | return; |
| } | } |
| Line 533 void fdd_wtao_d88(BYTE data) { | Line 552 void fdd_wtao_d88(BYTE data) { |
| tao.gap = 0; | tao.gap = 0; |
| } | } |
| break; | break; |
| case TAO_MODE_GAP: | case TAO_MODE_GAP: |
| if (data == TAO_MODE_GAP) { | if (data == TAO_MODE_GAP) { |
| if (tao.gap++ > 256) { | if (tao.gap++ > 256) { |
| Line 551 void fdd_wtao_d88(BYTE data) { | Line 571 void fdd_wtao_d88(BYTE data) { |
| tao.flag = 4; | tao.flag = 4; |
| } | } |
| break; | break; |
| case TAO_MODE_SYNC: | case TAO_MODE_SYNC: |
| // tao.cnt--; // ver0.26 Zeliard | // tao.cnt--; // ver0.26 Zeliard |
| if (data == TAO_CMD_AM_IN) { | if (data == TAO_CMD_AM_IN) { |
| Line 563 void fdd_wtao_d88(BYTE data) { | Line 584 void fdd_wtao_d88(BYTE data) { |
| tao.flag = 4; | tao.flag = 4; |
| } | } |
| break; | break; |
| case TAO_MODE_IM: | case TAO_MODE_IM: |
| if (data == TAO_CMD_IM) { | if (data == TAO_CMD_IM) { |
| tao.mode = TAO_ENDOFDATA; | tao.mode = TAO_ENDOFDATA; |
| Line 571 void fdd_wtao_d88(BYTE data) { | Line 593 void fdd_wtao_d88(BYTE data) { |
| tao.flag = 4; | tao.flag = 4; |
| } | } |
| break; | break; |
| case TAO_MODE_AM: | case TAO_MODE_AM: |
| if (data == TAO_CMD_IAM) { | if (data == TAO_CMD_IAM) { |
| tao.mode = TAO_MODE_ID; | tao.mode = TAO_MODE_ID; |
| Line 584 void fdd_wtao_d88(BYTE data) { | Line 607 void fdd_wtao_d88(BYTE data) { |
| else if (data == TAO_CMD_DDAM) { | else if (data == TAO_CMD_DDAM) { |
| tao.mode = TAO_MODE_DATA; | tao.mode = TAO_MODE_DATA; |
| tao.ptr = 0; | tao.ptr = 0; |
| ((D88_SECTOR *)&TAO_BUF[tao.top])->del_flg = 1; | p = (D88SEC)(TAO_BUF + tao.top); |
| p->del_flg = 1; | |
| } | } |
| break; | break; |
| case TAO_MODE_ID: | case TAO_MODE_ID: |
| if ((data == TAO_CMD_IAM) && (!tao.ptr)) { | if ((data == TAO_CMD_IAM) && (!tao.ptr)) { |
| break; | break; |
| Line 597 void fdd_wtao_d88(BYTE data) { | Line 622 void fdd_wtao_d88(BYTE data) { |
| } | } |
| else if (data == TAO_CMD_CRC) { | else if (data == TAO_CMD_CRC) { |
| tao.mode = TAO_ENDOFDATA; | tao.mode = TAO_ENDOFDATA; |
| ZeroMemory(&TAO_BUF[tao.size], 12); | ZeroMemory(TAO_BUF + tao.size, 12); |
| tao.size += 12; | tao.size += 12; |
| } | } |
| break; | break; |
| case TAO_MODE_DATA: // DATA WRITE | case TAO_MODE_DATA: // DATA WRITE |
| if ((!tao.ptr) && | if ((!tao.ptr) && |
| ((data == TAO_CMD_DAM) || (data == TAO_CMD_DDAM))) { | ((data == TAO_CMD_DAM) || (data == TAO_CMD_DDAM))) { |
| Line 608 void fdd_wtao_d88(BYTE data) { | Line 634 void fdd_wtao_d88(BYTE data) { |
| } | } |
| else if (data == TAO_CMD_CRC) { // nで判定した方が無難か? | else if (data == TAO_CMD_CRC) { // nで判定した方が無難か? |
| tao.mode = TAO_ENDOFDATA; | tao.mode = TAO_ENDOFDATA; |
| ((D88_SECTOR *)&TAO_BUF[tao.top])->size = tao.ptr; | p = (D88SEC)(TAO_BUF + tao.top); |
| STOREINTELWORD(p->size, tao.ptr); | |
| if (tao.sector++ > tao.maxsector) { | if (tao.sector++ > tao.maxsector) { |
| tao.flag = 4; | tao.flag = 4; |
| } | } |