--- np2/fdd/newdisk.c 2003/10/21 11:22:05 1.2 +++ np2/fdd/newdisk.c 2004/01/22 01:10:04 1.4 @@ -2,32 +2,67 @@ #include "dosio.h" #include "newdisk.h" #include "fddfile.h" +#include "sxsi.h" +#include "hddboot.res" -static const BYTE hdddiskboot[] = { - 0xb8,0x00,0x10,0xbb,0x00,0x80,0x8e,0xd0,0x8b,0xe3,0x8c,0xc8, - 0x8e,0xd8,0xb8,0x00,0xa0,0x8e,0xc0,0xb9,0x00,0x10,0xb8,0x20, - 0x00,0x33,0xff,0xfc,0xf3,0xab,0xb0,0xe1,0xb9,0xe0,0x1f,0xaa, - 0x47,0xe2,0xfc,0xbe,0x44,0x00,0x33,0xff,0xe8,0x08,0x00,0xbf, - 0xa0,0x00,0xe8,0x02,0x00,0xeb,0xfe,0x2e,0xad,0x85,0xc0,0x74, - 0x06,0xab,0x83,0xc7,0x02,0xeb,0xf4,0xc3,0x04,0x33,0x04,0x4e, - 0x05,0x4f,0x01,0x3c,0x05,0x49,0x05,0x47,0x05,0x23,0x05,0x39, - 0x05,0x2f,0x05,0x24,0x05,0x61,0x01,0x3c,0x05,0x38,0x04,0x4f, - 0x05,0x55,0x05,0x29,0x01,0x3c,0x05,0x5e,0x05,0x43,0x05,0x48, - 0x04,0x35,0x04,0x6c,0x04,0x46,0x04,0x24,0x04,0x5e,0x04,0x3b, - 0x04,0x73,0x01,0x25,0x00,0x00,0x05,0x47,0x05,0x23,0x05,0x39, - 0x05,0x2f,0x05,0x24,0x05,0x61,0x01,0x3c,0x05,0x38,0x04,0x72, - 0x21,0x5e,0x26,0x7e,0x18,0x65,0x01,0x24,0x05,0x6a,0x05,0x3b, - 0x05,0x43,0x05,0x48,0x04,0x37,0x04,0x46,0x12,0x3c,0x04,0x35, - 0x04,0x24,0x01,0x25,0x00,0x00}; +// ---- fdd +void newdisk_fdd(const char *fname, BYTE type, const char *label) { + + _D88HEAD d88head; + FILEH fh; + + ZeroMemory(&d88head, sizeof(d88head)); + STOREINTELDWORD(d88head.fd_size, sizeof(d88head)); + milstr_ncpy((char *)d88head.fd_name, label, sizeof(d88head.fd_name)); + d88head.fd_type = type; + fh = file_create(fname); + if (fh != FILEH_INVALID) { + file_write(fh, &d88head, sizeof(d88head)); + file_close(fh); + } +} + + +// ---- hdd + +static const char vhd_ver[] = "VHD1.00"; + +static BOOL writezero(FILEH fh, UINT size) { + + BYTE work[256]; + UINT wsize; + + ZeroMemory(work, sizeof(work)); + while(size) { + wsize = min(size, sizeof(work)); + if (file_write(fh, work, wsize) != wsize) { + return(FAILURE); + } + size -= wsize; + } + return(SUCCESS); +} + +static void writehddipl(FILEH fh, UINT ssize) { -void newdisk_hdd(const char *fname, UINT hddsize) { + BYTE work[1024]; + + ZeroMemory(work, sizeof(work)); + CopyMemory(work, hdddiskboot, sizeof(hdddiskboot)); + if (ssize < 1024) { + work[ssize - 2] = 0x55; + work[ssize - 1] = 0xaa; + } + file_write(fh, work, sizeof(work)); +} + +void newdisk_thd(const char *fname, UINT hddsize) { FILEH fh; BYTE work[256]; UINT size; - UINT wsize; if ((fname == NULL) || (hddsize < 5) || (hddsize > 256)) { return; @@ -38,30 +73,65 @@ void newdisk_hdd(const char *fname, UINT size = hddsize * 15; STOREINTELWORD(work, size); file_write(fh, work, 256); - file_write(fh, hdddiskboot, sizeof(hdddiskboot)); - ZeroMemory(work, sizeof(work)); - size = 0x400 - sizeof(hdddiskboot); - while(size) { - wsize = min(size, sizeof(work)); - size -= wsize; - file_write(fh, work, wsize); - } + writehddipl(fh, 256); file_close(fh); } } -void newdisk_fdd(const char *fname, BYTE type, const char *label) { +// hddtype = 0:5MB / 1:10MB / 2:15MB / 3:20MB / 5:30MB / 6:40MB +void newdisk_hdi(const char *fname, UINT hddtype) { - _D88HEAD d88head; +const SASIHDD *sasi; FILEH fh; + HDIHDR hdi; + UINT32 tmp; - ZeroMemory(&d88head, sizeof(d88head)); - STOREINTELDWORD(d88head.fd_size, sizeof(d88head)); - milstr_ncpy((char *)d88head.fd_name, label, sizeof(d88head.fd_name)); - d88head.fd_type = type; + hddtype &= 7; + if ((fname == NULL) || (hddtype == 7)) { + return; + } + sasi = sasihdd + hddtype; fh = file_create(fname); if (fh != FILEH_INVALID) { - file_write(fh, &d88head, sizeof(d88head)); + ZeroMemory(&hdi, sizeof(hdi)); + tmp = 256 * sasi->sectors * sasi->surfaces * sasi->cylinders; +// STOREINTELDWORD(hdi.hddtype, 0); // ??? + STOREINTELDWORD(hdi.headersize, 4096); + STOREINTELDWORD(hdi.hddsize, tmp); + STOREINTELDWORD(hdi.sectorsize, 256); + STOREINTELDWORD(hdi.sectors, sasi->sectors); + STOREINTELDWORD(hdi.surfaces, sasi->surfaces); + STOREINTELDWORD(hdi.cylinders, sasi->cylinders); + file_write(fh, &hdi, sizeof(hdi)); + writezero(fh, 4096 - sizeof(hdi)); + writehddipl(fh, 256); + file_close(fh); + } +} + +void newdisk_vhd(const char *fname, UINT hddsize) { + + FILEH fh; + VHDHDR vhd; + UINT tmp; + + if ((fname == NULL) || (hddsize < 2) || (hddsize > 512)) { + return; + } + fh = file_create(fname); + if (fh != FILEH_INVALID) { + ZeroMemory(&vhd, sizeof(vhd)); + CopyMemory(&vhd.sig, vhd_ver, 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); } }