|
|
| version 1.5, 2004/01/26 14:49:14 | version 1.10, 2005/02/07 14:46:09 |
|---|---|
| Line 29 void newdisk_fdd(const char *fname, REG8 | Line 29 void newdisk_fdd(const char *fname, REG8 |
| static BOOL writezero(FILEH fh, UINT size) { | static BOOL writezero(FILEH fh, UINT size) { |
| BYTE work[256]; | UINT8 work[256]; |
| UINT wsize; | UINT wsize; |
| ZeroMemory(work, sizeof(work)); | ZeroMemory(work, sizeof(work)); |
| Line 43 static BOOL writezero(FILEH fh, UINT siz | Line 43 static BOOL writezero(FILEH fh, UINT siz |
| return(SUCCESS); | return(SUCCESS); |
| } | } |
| static void writehddipl(FILEH fh, UINT ssize) { | static BOOL writehddipl(FILEH fh, UINT ssize, UINT32 tsize) { |
| BYTE work[1024]; | UINT8 work[1024]; |
| UINT size; | |
| ZeroMemory(work, sizeof(work)); | ZeroMemory(work, sizeof(work)); |
| CopyMemory(work, hdddiskboot, sizeof(hdddiskboot)); | CopyMemory(work, hdddiskboot, sizeof(hdddiskboot)); |
| Line 53 static void writehddipl(FILEH fh, UINT s | Line 54 static void writehddipl(FILEH fh, UINT s |
| work[ssize - 2] = 0x55; | work[ssize - 2] = 0x55; |
| work[ssize - 1] = 0xaa; | work[ssize - 1] = 0xaa; |
| } | } |
| file_write(fh, work, sizeof(work)); | if (file_write(fh, work, sizeof(work)) != sizeof(work)) { |
| return(FAILURE); | |
| } | |
| if (tsize > sizeof(work)) { | |
| tsize -= sizeof(work); | |
| ZeroMemory(work, sizeof(work)); | |
| while(tsize) { | |
| size = min(tsize, sizeof(work)); | |
| tsize -= size; | |
| if (file_write(fh, work, size) != size) { | |
| return(FAILURE); | |
| } | |
| } | |
| } | |
| return(SUCCESS); | |
| } | } |
| void newdisk_thd(const char *fname, UINT hddsize) { | void newdisk_thd(const char *fname, UINT hddsize) { |
| FILEH fh; | FILEH fh; |
| BYTE work[256]; | UINT8 work[256]; |
| UINT size; | UINT size; |
| BOOL r; | |
| if ((fname == NULL) || (hddsize < 5) || (hddsize > 256)) { | if ((fname == NULL) || (hddsize < 5) || (hddsize > 256)) { |
| return; | goto ndthd_err; |
| } | |
| fh = file_create(fname); | |
| if (fh == FILEH_INVALID) { | |
| goto ndthd_err; | |
| } | |
| ZeroMemory(work, 256); | |
| size = hddsize * 15; | |
| STOREINTELWORD(work, size); | |
| r = (file_write(fh, work, 256) != 256); | |
| r |= writehddipl(fh, 256, 0); | |
| file_close(fh); | |
| if (r) { | |
| file_delete(fname); | |
| } | |
| ndthd_err: | |
| return; | |
| } | |
| void newdisk_nhd(const char *fname, UINT hddsize) { | |
| FILEH fh; | |
| NHDHDR nhd; | |
| UINT size; | |
| BOOL r; | |
| if ((fname == NULL) || (hddsize < 5) || (hddsize > 512)) { | |
| goto ndnhd_err; | |
| } | } |
| fh = file_create(fname); | fh = file_create(fname); |
| if (fh != FILEH_INVALID) { | if (fh == FILEH_INVALID) { |
| ZeroMemory(work, 256); | goto ndnhd_err; |
| size = hddsize * 15; | } |
| STOREINTELWORD(work, size); | ZeroMemory(&nhd, sizeof(nhd)); |
| file_write(fh, work, 256); | CopyMemory(&nhd.sig, sig_nhd, 15); |
| writehddipl(fh, 256); | STOREINTELDWORD(nhd.headersize, sizeof(nhd)); |
| file_close(fh); | size = hddsize * 15; |
| STOREINTELDWORD(nhd.cylinders, size); | |
| STOREINTELWORD(nhd.surfaces, 8); | |
| STOREINTELWORD(nhd.sectors, 17); | |
| STOREINTELWORD(nhd.sectorsize, 512); | |
| r = (file_write(fh, &nhd, sizeof(nhd)) != sizeof(nhd)); | |
| r |= writehddipl(fh, 512, size * 8 * 17 * 512); | |
| file_close(fh); | |
| if (r) { | |
| file_delete(fname); | |
| } | } |
| ndnhd_err: | |
| return; | |
| } | } |
| // hddtype = 0:5MB / 1:10MB / 2:15MB / 3:20MB / 5:30MB / 6:40MB | // hddtype = 0:5MB / 1:10MB / 2:15MB / 3:20MB / 5:30MB / 6:40MB |
| Line 82 void newdisk_hdi(const char *fname, UINT | Line 138 void newdisk_hdi(const char *fname, UINT |
| const SASIHDD *sasi; | const SASIHDD *sasi; |
| FILEH fh; | FILEH fh; |
| HDIHDR hdi; | HDIHDR hdi; |
| UINT32 tmp; | UINT32 size; |
| BOOL r; | |
| hddtype &= 7; | hddtype &= 7; |
| if ((fname == NULL) || (hddtype == 7)) { | if ((fname == NULL) || (hddtype == 7)) { |
| return; | goto ndhdi_err; |
| } | } |
| sasi = sasihdd + hddtype; | sasi = sasihdd + hddtype; |
| fh = file_create(fname); | fh = file_create(fname); |
| if (fh != FILEH_INVALID) { | if (fh == FILEH_INVALID) { |
| ZeroMemory(&hdi, sizeof(hdi)); | goto ndhdi_err; |
| tmp = 256 * sasi->sectors * sasi->surfaces * sasi->cylinders; | } |
| // STOREINTELDWORD(hdi.hddtype, 0); // ??? | ZeroMemory(&hdi, sizeof(hdi)); |
| STOREINTELDWORD(hdi.headersize, 4096); | size = 256 * sasi->sectors * sasi->surfaces * sasi->cylinders; |
| STOREINTELDWORD(hdi.hddsize, tmp); | // STOREINTELDWORD(hdi.hddtype, 0); |
| STOREINTELDWORD(hdi.sectorsize, 256); | STOREINTELDWORD(hdi.headersize, 4096); |
| STOREINTELDWORD(hdi.sectors, sasi->sectors); | STOREINTELDWORD(hdi.hddsize, size); |
| STOREINTELDWORD(hdi.surfaces, sasi->surfaces); | STOREINTELDWORD(hdi.sectorsize, 256); |
| STOREINTELDWORD(hdi.cylinders, sasi->cylinders); | STOREINTELDWORD(hdi.sectors, sasi->sectors); |
| file_write(fh, &hdi, sizeof(hdi)); | STOREINTELDWORD(hdi.surfaces, sasi->surfaces); |
| writezero(fh, 4096 - sizeof(hdi)); | STOREINTELDWORD(hdi.cylinders, sasi->cylinders); |
| writehddipl(fh, 256); | r = (file_write(fh, &hdi, sizeof(hdi)) != sizeof(hdi)); |
| file_close(fh); | r |= writezero(fh, 4096 - sizeof(hdi)); |
| r |= writehddipl(fh, 256, size); | |
| file_close(fh); | |
| if (r) { | |
| file_delete(fname); | |
| } | } |
| ndhdi_err: | |
| return; | |
| } | } |
| void newdisk_vhd(const char *fname, UINT hddsize) { | void newdisk_vhd(const char *fname, UINT hddsize) { |
| Line 112 void newdisk_vhd(const char *fname, UINT | Line 176 void newdisk_vhd(const char *fname, UINT |
| FILEH fh; | FILEH fh; |
| VHDHDR vhd; | VHDHDR vhd; |
| UINT tmp; | UINT tmp; |
| BOOL r; | |
| if ((fname == NULL) || (hddsize < 2) || (hddsize > 512)) { | if ((fname == NULL) || (hddsize < 2) || (hddsize > 512)) { |
| return; | goto ndvhd_err; |
| } | } |
| fh = file_create(fname); | fh = file_create(fname); |
| if (fh != FILEH_INVALID) { | if (fh == FILEH_INVALID) { |
| ZeroMemory(&vhd, sizeof(vhd)); | goto ndvhd_err; |
| CopyMemory(&vhd.sig, sig_vhd, 7); | |
| STOREINTELWORD(vhd.mbsize, (UINT16)hddsize); | |
| STOREINTELWORD(vhd.sectorsize, 256); | |
| vhd.sectors = 32; | |
| vhd.surfaces = 8; | |
| tmp = hddsize * 16; // = * 1024 * 1024 / (8 * 32 * 256); | |
| STOREINTELWORD(vhd.cylinders, (UINT16)tmp); | |
| tmp *= 8 * 32; | |
| STOREINTELDWORD(vhd.totals, tmp); | |
| file_write(fh, &vhd, sizeof(vhd)); | |
| writehddipl(fh, 256); | |
| file_close(fh); | |
| } | } |
| ZeroMemory(&vhd, sizeof(vhd)); | |
| CopyMemory(&vhd.sig, sig_vhd, 7); | |
| STOREINTELWORD(vhd.mbsize, (UINT16)hddsize); | |
| STOREINTELWORD(vhd.sectorsize, 256); | |
| vhd.sectors = 32; | |
| vhd.surfaces = 8; | |
| tmp = hddsize * 16; // = * 1024 * 1024 / (8 * 32 * 256); | |
| STOREINTELWORD(vhd.cylinders, (UINT16)tmp); | |
| tmp *= 8 * 32; | |
| STOREINTELDWORD(vhd.totals, tmp); | |
| r = (file_write(fh, &vhd, sizeof(vhd)) != sizeof(vhd)); | |
| r |= writehddipl(fh, 256, 0); | |
| file_close(fh); | |
| if (r) { | |
| file_delete(fname); | |
| } | |
| ndvhd_err: | |
| return; | |
| } | } |