-
Notifications
You must be signed in to change notification settings - Fork 4
/
filediskio.cpp
142 lines (106 loc) · 2.95 KB
/
filediskio.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
/*
Flopgen: a tool for automatic creation of FAT-formatted floppy disk images
Copyright (C) 2020 Maksymilian Graczyk.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#include "filediskio.h"
#include "classes.hpp"
#include <iostream>
#define SECTOR_SIZE 512
using namespace std;
static File *file_disk = NULL;
static string *path = NULL;
static int bytes_count = 0;
void file_disk_setup(const char *filename, int bytes) {
path = new string(filename);
bytes_count = bytes;
}
void file_disk_free() {
if (file_disk != NULL) {
delete file_disk;
file_disk = NULL;
}
if (path != NULL) {
delete path;
path = NULL;
}
}
DSTATUS file_disk_status() {
if (file_disk == NULL) {
return STA_NOINIT;
}
return 0;
}
DSTATUS file_disk_initialize() {
if (path == NULL) {
return STA_NOINIT;
}
if (file_disk == NULL) {
file_disk = new File(*path, true);
fstream *stream = file_disk->get_stream();
for (int i = 0; i < bytes_count; i++) {
*stream << (char) 0;
if (stream->rdstate()) {
cout << stream->rdstate() << endl;
return STA_NOINIT;
}
}
stream->flush();
stream->sync();
}
return file_disk_status();
}
DRESULT file_disk_read(BYTE *buff, LBA_t sector, UINT count) {
fstream *stream = file_disk->get_stream();
streamsize byte_size = count * SECTOR_SIZE;
streampos byte_start = sector * SECTOR_SIZE;
stream->seekg(byte_start, ios::beg);
if (stream->rdstate()) {
return RES_ERROR;
}
stream->read((char *) buff, byte_size);
if (stream->rdstate() && !stream->eof()) {
return RES_ERROR;
}
return RES_OK;
}
DRESULT file_disk_write(const BYTE *buff, LBA_t sector, UINT count) {
fstream *stream = file_disk->get_stream();
streamsize byte_size = count * SECTOR_SIZE;
streampos byte_start = sector * SECTOR_SIZE;
stream->seekp(byte_start, ios::beg);
if (stream->rdstate()) {
return RES_ERROR;
}
stream->write((const char *) buff, byte_size);
if (stream->rdstate()) {
return RES_ERROR;
}
stream->flush();
stream->sync();
return RES_OK;
}
DRESULT file_disk_ioctl(BYTE cmd, void *buff) {
int *int_buff = (int *) buff;
switch (cmd) {
case GET_SECTOR_COUNT:
*int_buff = bytes_count / SECTOR_SIZE;
break;
case GET_SECTOR_SIZE:
*int_buff = SECTOR_SIZE;
break;
case GET_BLOCK_SIZE:
*int_buff = 1;
break;
}
return RES_OK;
}