Merge pull request #2168 from Cacodemon345/patch-63
qt: Port Win32 86F creation code to Qt
This commit is contained in:
@@ -25,12 +25,16 @@
|
|||||||
#include "qt_util.hpp"
|
#include "qt_util.hpp"
|
||||||
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
#include <86box/plat.h>
|
||||||
#include <86box/random.h>
|
#include <86box/random.h>
|
||||||
#include <86box/scsi_device.h>
|
#include <86box/scsi_device.h>
|
||||||
#include <86box/zip.h>
|
#include <86box/zip.h>
|
||||||
#include <86box/mo.h>
|
#include <86box/mo.h>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#include <cstdio>
|
||||||
|
#include <cstdlib>
|
||||||
|
|
||||||
#include <QFile>
|
#include <QFile>
|
||||||
#include <QFileInfo>
|
#include <QFileInfo>
|
||||||
#include <QMessageBox>
|
#include <QMessageBox>
|
||||||
@@ -236,6 +240,8 @@ void NewFloppyDialog::onCreate() {
|
|||||||
|
|
||||||
bool NewFloppyDialog::create86f(const QString& filename, const disk_size_t& disk_size, uint8_t rpm_mode)
|
bool NewFloppyDialog::create86f(const QString& filename, const disk_size_t& disk_size, uint8_t rpm_mode)
|
||||||
{
|
{
|
||||||
|
FILE *f;
|
||||||
|
|
||||||
uint32_t magic = 0x46423638;
|
uint32_t magic = 0x46423638;
|
||||||
uint16_t version = 0x020C;
|
uint16_t version = 0x020C;
|
||||||
uint16_t dflags = 0;
|
uint16_t dflags = 0;
|
||||||
@@ -259,74 +265,77 @@ bool NewFloppyDialog::create86f(const QString& filename, const disk_size_t& disk
|
|||||||
tflags |= (disk_size.rpm << 5); /* RPM. */
|
tflags |= (disk_size.rpm << 5); /* RPM. */
|
||||||
|
|
||||||
switch (disk_size.hole) {
|
switch (disk_size.hole) {
|
||||||
case 0:
|
case 0:
|
||||||
case 1:
|
case 1:
|
||||||
default:
|
default:
|
||||||
switch(rpm_mode) {
|
switch(rpm_mode) {
|
||||||
case 1:
|
case 1:
|
||||||
array_size = 25250;
|
array_size = 25250;
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
array_size = 25374;
|
array_size = 25374;
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
array_size = 25750;
|
array_size = 25750;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
array_size = 25000;
|
array_size = 25000;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
switch(rpm_mode) {
|
switch(rpm_mode) {
|
||||||
case 1:
|
case 1:
|
||||||
array_size = 50500;
|
array_size = 50500;
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
array_size = 50750;
|
array_size = 50750;
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
array_size = 51000;
|
array_size = 51000;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
array_size = 50000;
|
array_size = 50000;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
QByteArray bytes(array_size, 0);
|
auto empty = (unsigned char *) malloc(array_size);
|
||||||
|
|
||||||
memset(tarray, 0, 2048);
|
memset(tarray, 0, 2048);
|
||||||
|
memset(empty, 0, array_size);
|
||||||
|
|
||||||
QFile file(filename);
|
f = plat_fopen(filename.toUtf8().data(), "wb");
|
||||||
if (! file.open(QIODevice::WriteOnly)) {
|
if (!f)
|
||||||
return false;
|
return false;
|
||||||
}
|
|
||||||
QDataStream stream(&file);
|
|
||||||
stream.setByteOrder(QDataStream::LittleEndian);
|
|
||||||
|
|
||||||
stream << magic;
|
fwrite(&magic, 4, 1, f);
|
||||||
stream << version;
|
fwrite(&version, 2, 1, f);
|
||||||
stream << dflags;
|
fwrite(&dflags, 2, 1, f);
|
||||||
|
|
||||||
track_size = array_size + 6;
|
track_size = array_size + 6;
|
||||||
|
|
||||||
track_base = 8 + ((disk_size.sides == 2) ? 2048 : 1024);
|
track_base = 8 + ((disk_size.sides == 2) ? 2048 : 1024);
|
||||||
|
|
||||||
if (disk_size.tracks <= 43)
|
if (disk_size.tracks <= 43)
|
||||||
shift = 1;
|
shift = 1;
|
||||||
|
|
||||||
for (i = 0; i < (disk_size.tracks * disk_size.sides) << shift; i++)
|
for (i = 0; i < (disk_size.tracks * disk_size.sides) << shift; i++)
|
||||||
tarray[i] = track_base + (i * track_size);
|
tarray[i] = track_base + (i * track_size);
|
||||||
|
|
||||||
stream.writeRawData(reinterpret_cast<const char *>(tarray), (disk_size.sides == 2) ? 2048 : 1024);
|
fwrite(tarray, 1, (disk_size.sides == 2) ? 2048 : 1024, f);
|
||||||
|
|
||||||
int max = i < (disk_size.tracks * disk_size.sides) << shift;
|
for (i = 0; i < (disk_size.tracks * disk_size.sides) << shift; i++) {
|
||||||
for (i = 0; i < max; i++) {
|
fwrite(&tflags, 2, 1, f);
|
||||||
stream << tflags;
|
fwrite(&index_hole_pos, 4, 1, f);
|
||||||
stream << index_hole_pos;
|
fwrite(empty, 1, array_size, f);
|
||||||
stream.writeRawData(bytes, bytes.size());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
free(empty);
|
||||||
|
|
||||||
|
fclose(f);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user