|
|
| version 1.46, 2005/03/05 06:02:28 | version 1.47, 2005/03/22 04:03:15 |
|---|---|
| Line 61 enum { | Line 61 enum { |
| STATFLAG_CGW, | STATFLAG_CGW, |
| #endif | #endif |
| STATFLAG_COM, | STATFLAG_COM, |
| STATFLAG_DISK, | |
| STATFLAG_DMA, | STATFLAG_DMA, |
| STATFLAG_EGC, | STATFLAG_EGC, |
| STATFLAG_EPSON, | STATFLAG_EPSON, |
| STATFLAG_EVT, | STATFLAG_EVT, |
| STATFLAG_EXT, | STATFLAG_EXT, |
| STATFLAG_FDD, | |
| STATFLAG_FM, | STATFLAG_FM, |
| STATFLAG_GIJ, | STATFLAG_GIJ, |
| #if defined(SUPPORT_HOSTDRV) | #if defined(SUPPORT_HOSTDRV) |
| STATFLAG_HDRV, | STATFLAG_HDRV, |
| #endif | #endif |
| STATFLAG_MEM | STATFLAG_MEM, |
| STATFLAG_SXSI | |
| }; | }; |
| typedef struct { | typedef struct { |
| Line 103 typedef struct { | Line 104 typedef struct { |
| // ---- | // ---- |
| // 関数ポインタを intに変更。 | |
| static BRESULT proc2num(void *func, const PROCTBL *tbl, int size) { | |
| int i; | |
| for (i=0; i<size; i++) { | |
| if (*(long *)func == (long)tbl->proc) { | |
| *(long *)func = (long)tbl->id; | |
| return(SUCCESS); | |
| } | |
| tbl++; | |
| } | |
| return(FAILURE); | |
| } | |
| static BRESULT num2proc(void *func, const PROCTBL *tbl, int size) { | |
| int i; | |
| for (i=0; i<size; i++) { | |
| if (*(long *)func == (long)tbl->id) { | |
| *(long *)func = (long)tbl->proc; | |
| return(SUCCESS); | |
| } | |
| tbl++; | |
| } | |
| return(FAILURE); | |
| } | |
| // ---- | |
| enum { | enum { |
| SFFILEH_WRITE = 0x0001, | SFFILEH_WRITE = 0x0001, |
| SFFILEH_BLOCK = 0x0002, | SFFILEH_BLOCK = 0x0002, |
| Line 364 void statflag_seterr(STFLAGH sfh, const | Line 333 void statflag_seterr(STFLAGH sfh, const |
| } | } |
| // ---- function | |
| // 関数ポインタを intに変更。 | |
| static BRESULT proc2num(void *func, const PROCTBL *tbl, int size) { | |
| int i; | |
| for (i=0; i<size; i++) { | |
| if (*(long *)func == (long)tbl->proc) { | |
| *(long *)func = (long)tbl->id; | |
| return(SUCCESS); | |
| } | |
| tbl++; | |
| } | |
| return(FAILURE); | |
| } | |
| static BRESULT num2proc(void *func, const PROCTBL *tbl, int size) { | |
| int i; | |
| for (i=0; i<size; i++) { | |
| if (*(long *)func == (long)tbl->id) { | |
| *(long *)func = (long)tbl->proc; | |
| return(SUCCESS); | |
| } | |
| tbl++; | |
| } | |
| return(FAILURE); | |
| } | |
| // ---- file | |
| typedef struct { | |
| OEMCHAR path[MAX_PATH]; | |
| UINT ftype; | |
| int readonly; | |
| DOSDATE date; | |
| DOSTIME time; | |
| } STATPATH; | |
| static const OEMCHAR str_updated[] = OEMTEXT("%s: updated"); | |
| static const OEMCHAR str_notfound[] = OEMTEXT("%s: not found"); | |
| static int statflag_writepath(STFLAGH sfh, const OEMCHAR *path, | |
| UINT ftype, int readonly) { | |
| STATPATH sp; | |
| FILEH fh; | |
| ZeroMemory(&sp, sizeof(sp)); | |
| if ((path) && (path[0])) { | |
| file_cpyname(sp.path, path, NELEMENTS(sp.path)); | |
| sp.ftype = ftype; | |
| sp.readonly = readonly; | |
| fh = file_open_rb(path); | |
| if (fh != FILEH_INVALID) { | |
| file_getdatetime(fh, &sp.date, &sp.time); | |
| file_close(fh); | |
| } | |
| } | |
| return(statflag_write(sfh, &sp, sizeof(sp))); | |
| } | |
| static int statflag_checkpath(STFLAGH sfh, const OEMCHAR *devname) { | |
| int ret; | |
| STATPATH sp; | |
| FILEH fh; | |
| OEMCHAR buf[256]; | |
| DOSDATE date; | |
| DOSTIME time; | |
| ret = statflag_read(sfh, &sp, sizeof(sp)); | |
| if (sp.path[0]) { | |
| fh = file_open_rb(sp.path); | |
| if (fh != FILEH_INVALID) { | |
| file_getdatetime(fh, &date, &time); | |
| file_close(fh); | |
| if ((memcmp(&sp.date, &date, sizeof(date))) || | |
| (memcmp(&sp.time, &time, sizeof(time)))) { | |
| ret |= STATFLAG_DISKCHG; | |
| OEMSPRINTF(buf, str_updated, devname); | |
| statflag_seterr(sfh, buf); | |
| } | |
| } | |
| else { | |
| ret |= STATFLAG_DISKCHG; | |
| OEMSPRINTF(buf, str_notfound, devname); | |
| statflag_seterr(sfh, buf); | |
| } | |
| } | |
| return(ret); | |
| } | |
| // ---- common | // ---- common |
| static int flagsave_common(STFLAGH sfh, const SFENTRY *tbl) { | static int flagsave_common(STFLAGH sfh, const SFENTRY *tbl) { |
| Line 925 static int flagload_fm(STFLAGH sfh, cons | Line 991 static int flagload_fm(STFLAGH sfh, cons |
| #endif | #endif |
| // ---- disk | // ---- fdd |
| typedef struct { | |
| OEMCHAR path[MAX_PATH]; | |
| int readonly; | |
| DOSDATE date; | |
| DOSTIME time; | |
| } STATDISK; | |
| static const OEMCHAR str_fddx[] = OEMTEXT("FDD%u"); | static const OEMCHAR str_fddx[] = OEMTEXT("FDD%u"); |
| static const OEMCHAR str_sasix[] = OEMTEXT("SASI%u"); | |
| static const OEMCHAR str_scsix[] = OEMTEXT("SCSI%u"); | |
| static const OEMCHAR str_updated[] = OEMTEXT("%s: updated"); | |
| static const OEMCHAR str_notfound[] = OEMTEXT("%s: not found"); | |
| static int disksave(STFLAGH sfh, const OEMCHAR *path, int readonly) { | static int flagsave_fdd(STFLAGH sfh, const SFENTRY *tbl) { |
| STATDISK st; | int ret; |
| FILEH fh; | UINT8 i; |
| const OEMCHAR *path; | |
| UINT ftype; | |
| int ro; | |
| ZeroMemory(&st, sizeof(st)); | ret = STATFLAG_SUCCESS; |
| if ((path) && (path[0])) { | for (i=0; i<4; i++) { |
| file_cpyname(st.path, path, sizeof(st.path)); | path = fdd_getfileex(i, &ftype, &ro); |
| st.readonly = readonly; | ret |= statflag_writepath(sfh, path, ftype, ro); |
| fh = file_open_rb(path); | |
| if (fh != FILEH_INVALID) { | |
| file_getdatetime(fh, &st.date, &st.time); | |
| file_close(fh); | |
| } | |
| } | } |
| return(statflag_write(sfh, &st, sizeof(st))); | (void)tbl; |
| return(ret); | |
| } | } |
| static int flagsave_disk(STFLAGH sfh, const SFENTRY *tbl) { | static int flagcheck_fdd(STFLAGH sfh, const SFENTRY *tbl) { |
| int ret; | int ret; |
| UINT8 i; | int i; |
| OEMCHAR buf[8]; | |
| sxsi_allflash(); | |
| ret = STATFLAG_SUCCESS; | ret = STATFLAG_SUCCESS; |
| for (i=0; i<4; i++) { | for (i=0; i<4; i++) { |
| ret |= disksave(sfh, fdd_diskname(i), fdd_diskprotect(i)); | OEMSPRINTF(buf, str_fddx, i+1); |
| } | ret |= statflag_checkpath(sfh, buf); |
| for (i=0x00; i<0x02; i++) { | |
| ret |= disksave(sfh, sxsi_getfilename(i), 0); | |
| } | |
| for (i=0x20; i<0x24; i++) { | |
| ret |= disksave(sfh, sxsi_getfilename(i), 0); | |
| } | } |
| (void)tbl; | (void)tbl; |
| return(ret); | return(ret); |
| } | } |
| static int diskcheck(STFLAGH sfh, const OEMCHAR *name) { | static int flagload_fdd(STFLAGH sfh, const SFENTRY *tbl) { |
| int ret; | int ret; |
| FILEH fh; | UINT8 i; |
| STATDISK st; | STATPATH sp; |
| OEMCHAR buf[256]; | |
| DOSDATE date; | |
| DOSTIME time; | |
| ret = statflag_read(sfh, &st, sizeof(st)); | ret = STATFLAG_SUCCESS; |
| if (st.path[0]) { | for (i=0; i<4; i++) { |
| fh = file_open_rb(st.path); | ret |= statflag_read(sfh, &sp, sizeof(sp)); |
| if (fh != FILEH_INVALID) { | if (sp.path[0]) { |
| file_getdatetime(fh, &date, &time); | fdd_set(i, sp.path, FTYPE_NONE, sp.readonly); |
| file_close(fh); | |
| if ((memcmp(&st.date, &date, sizeof(date))) || | |
| (memcmp(&st.time, &time, sizeof(time)))) { | |
| ret |= STATFLAG_DISKCHG; | |
| OEMSPRINTF(buf, str_updated, name); | |
| statflag_seterr(sfh, buf); | |
| } | |
| } | |
| else { | |
| ret |= STATFLAG_DISKCHG; | |
| OEMSPRINTF(buf, str_notfound, name); | |
| statflag_seterr(sfh, buf); | |
| } | } |
| } | } |
| (void)tbl; | |
| return(ret); | return(ret); |
| } | } |
| static int flagcheck_disk(STFLAGH sfh, const SFENTRY *tbl) { | |
| int ret; | // ---- sxsi |
| int i; | |
| OEMCHAR buf[8]; | typedef struct { |
| UINT8 ide[4]; | |
| UINT8 scsi[8]; | |
| } SXSIDEVS; | |
| static const OEMCHAR str_sasix[] = OEMTEXT("SASI%u"); | |
| static const OEMCHAR str_scsix[] = OEMTEXT("SCSI%u"); | |
| static int flagsave_sxsi(STFLAGH sfh, const SFENTRY *tbl) { | |
| int ret; | |
| UINT i; | |
| SXSIDEVS sds; | |
| const OEMCHAR *path; | |
| ret = 0; | |
| for (i=0; i<4; i++) { | |
| OEMSPRINTF(buf, str_fddx, i+1); | |
| ret |= diskcheck(sfh, buf); | |
| } | |
| sxsi_allflash(); | sxsi_allflash(); |
| for (i=0; i<2; i++) { | ret = STATFLAG_SUCCESS; |
| OEMSPRINTF(buf, str_sasix, i+1); | for (i=0; i<NELEMENTS(sds.ide); i++) { |
| ret |= diskcheck(sfh, buf); | sds.ide[i] = sxsi_getdevtype((REG8)i); |
| } | } |
| for (i=0; i<4; i++) { | for (i=0; i<NELEMENTS(sds.scsi); i++) { |
| OEMSPRINTF(buf, str_scsix, i); | sds.scsi[i] = sxsi_getdevtype((REG8)(i + 0x20)); |
| ret |= diskcheck(sfh, buf); | } |
| ret = statflag_write(sfh, &sds, sizeof(sds)); | |
| for (i=0; i<NELEMENTS(sds.ide); i++) { | |
| if (sds.ide[i] != SXSIDEV_NC) { | |
| path = sxsi_getfilename((REG8)i); | |
| ret |= statflag_writepath(sfh, path, FTYPE_NONE, 0); | |
| } | |
| } | |
| for (i=0; i<NELEMENTS(sds.scsi); i++) { | |
| if (sds.scsi[i] != SXSIDEV_NC) { | |
| path = sxsi_getfilename((REG8)(i + 0x20)); | |
| ret |= statflag_writepath(sfh, path, FTYPE_NONE, 0); | |
| } | |
| } | } |
| (void)tbl; | (void)tbl; |
| return(ret); | return(ret); |
| } | } |
| static int flagload_disk(STFLAGH sfh, const SFENTRY *tbl) { | static int flagcheck_sxsi(STFLAGH sfh, const SFENTRY *tbl) { |
| int ret; | int ret; |
| UINT8 i; | SXSIDEVS sds; |
| STATDISK st; | UINT i; |
| OEMCHAR buf[8]; | |
| ret = 0; | sxsi_allflash(); |
| for (i=0; i<4; i++) { | ret = statflag_read(sfh, &sds, sizeof(sds)); |
| ret |= statflag_read(sfh, &st, sizeof(st)); | for (i=0; i<NELEMENTS(sds.ide); i++) { |
| if (st.path[0]) { | if (sds.ide[i] != SXSIDEV_NC) { |
| fdd_set(i, st.path, FTYPE_NONE, st.readonly); | OEMSPRINTF(buf, str_sasix, i+1); |
| ret |= statflag_checkpath(sfh, buf); | |
| } | } |
| } | } |
| for (i=0x00; i<0x02; i++) { | for (i=0; i<NELEMENTS(sds.scsi); i++) { |
| ret |= statflag_read(sfh, &st, sizeof(st)); | if (sds.scsi[i] != SXSIDEV_NC) { |
| if (st.path[0]) { | OEMSPRINTF(buf, str_scsix, i); |
| sxsi_devopen(i, st.path); | ret |= statflag_checkpath(sfh, buf); |
| } | } |
| } | } |
| for (i=0x20; i<0x24; i++) { | (void)tbl; |
| ret |= statflag_read(sfh, &st, sizeof(st)); | return(ret); |
| if (st.path[0]) { | } |
| sxsi_devopen(i, st.path); | |
| static int flagload_sxsi(STFLAGH sfh, const SFENTRY *tbl) { | |
| int ret; | |
| SXSIDEVS sds; | |
| UINT i; | |
| REG8 drv; | |
| STATPATH sp; | |
| ret = statflag_read(sfh, &sds, sizeof(sds)); | |
| if (ret != STATFLAG_SUCCESS) { | |
| return(ret); | |
| } | |
| for (i=0; i<NELEMENTS(sds.ide); i++) { | |
| drv = (REG8)i; | |
| sxsi_setdevtype(drv, sds.ide[i]); | |
| if (sds.ide[i] != SXSIDEV_NC) { | |
| ret |= statflag_read(sfh, &sp, sizeof(sp)); | |
| sxsi_devopen(drv, sp.path); | |
| } | |
| } | |
| for (i=0; i<NELEMENTS(sds.scsi); i++) { | |
| drv = (REG8)(i + 0x20); | |
| sxsi_setdevtype(drv, sds.scsi[i]); | |
| if (sds.scsi[i] != SXSIDEV_NC) { | |
| ret |= statflag_read(sfh, &sp, sizeof(sp)); | |
| sxsi_devopen(drv, sp.path); | |
| } | } |
| } | } |
| (void)tbl; | (void)tbl; |
| Line 1206 const SFENTRY *tblterm; | Line 1288 const SFENTRY *tblterm; |
| ret |= flagsave_com(&sffh->sfh, tbl); | ret |= flagsave_com(&sffh->sfh, tbl); |
| break; | break; |
| case STATFLAG_DISK: | |
| ret |= flagsave_disk(&sffh->sfh, tbl); | |
| break; | |
| case STATFLAG_DMA: | case STATFLAG_DMA: |
| ret |= flagsave_dma(&sffh->sfh, tbl); | ret |= flagsave_dma(&sffh->sfh, tbl); |
| break; | break; |
| Line 1230 const SFENTRY *tblterm; | Line 1308 const SFENTRY *tblterm; |
| ret |= flagsave_ext(&sffh->sfh, tbl); | ret |= flagsave_ext(&sffh->sfh, tbl); |
| break; | break; |
| case STATFLAG_FDD: | |
| ret |= flagsave_fdd(&sffh->sfh, tbl); | |
| break; | |
| #if !defined(DISABLE_SOUND) | #if !defined(DISABLE_SOUND) |
| case STATFLAG_FM: | case STATFLAG_FM: |
| ret |= flagsave_fm(&sffh->sfh, tbl); | ret |= flagsave_fm(&sffh->sfh, tbl); |
| Line 1249 const SFENTRY *tblterm; | Line 1331 const SFENTRY *tblterm; |
| case STATFLAG_MEM: | case STATFLAG_MEM: |
| ret |= flagsave_mem(&sffh->sfh, tbl); | ret |= flagsave_mem(&sffh->sfh, tbl); |
| break; | break; |
| case STATFLAG_SXSI: | |
| ret |= flagsave_sxsi(&sffh->sfh, tbl); | |
| break; | |
| } | } |
| tbl++; | tbl++; |
| } | } |
| Line 1311 const SFENTRY *tblterm; | Line 1397 const SFENTRY *tblterm; |
| ret |= flagcheck_veronly(&sffh->sfh, tbl); | ret |= flagcheck_veronly(&sffh->sfh, tbl); |
| break; | break; |
| case STATFLAG_DISK: | case STATFLAG_FDD: |
| ret |= flagcheck_disk(&sffh->sfh, tbl); | ret |= flagcheck_fdd(&sffh->sfh, tbl); |
| break; | |
| case STATFLAG_SXSI: | |
| ret |= flagcheck_sxsi(&sffh->sfh, tbl); | |
| break; | break; |
| default: | default: |
| Line 1401 const SFENTRY *tblterm; | Line 1491 const SFENTRY *tblterm; |
| ret |= flagload_com(&sffh->sfh, tbl); | ret |= flagload_com(&sffh->sfh, tbl); |
| break; | break; |
| case STATFLAG_DISK: | |
| ret |= flagload_disk(&sffh->sfh, tbl); | |
| break; | |
| case STATFLAG_DMA: | case STATFLAG_DMA: |
| ret |= flagload_dma(&sffh->sfh, tbl); | ret |= flagload_dma(&sffh->sfh, tbl); |
| break; | break; |
| Line 1425 const SFENTRY *tblterm; | Line 1511 const SFENTRY *tblterm; |
| ret |= flagload_ext(&sffh->sfh, tbl); | ret |= flagload_ext(&sffh->sfh, tbl); |
| break; | break; |
| case STATFLAG_FDD: | |
| ret |= flagload_fdd(&sffh->sfh, tbl); | |
| break; | |
| #if !defined(DISABLE_SOUND) | #if !defined(DISABLE_SOUND) |
| case STATFLAG_FM: | case STATFLAG_FM: |
| ret |= flagload_fm(&sffh->sfh, tbl); | ret |= flagload_fm(&sffh->sfh, tbl); |
| Line 1445 const SFENTRY *tblterm; | Line 1535 const SFENTRY *tblterm; |
| ret |= flagload_mem(&sffh->sfh, tbl); | ret |= flagload_mem(&sffh->sfh, tbl); |
| break; | break; |
| case STATFLAG_SXSI: | |
| ret |= flagload_sxsi(&sffh->sfh, tbl); | |
| break; | |
| default: | default: |
| ret |= STATFLAG_WARNING; | ret |= STATFLAG_WARNING; |
| break; | break; |