aboutsummaryrefslogtreecommitdiff
path: root/chudisk.h
diff options
context:
space:
mode:
Diffstat (limited to 'chudisk.h')
-rw-r--r--chudisk.h90
1 files changed, 90 insertions, 0 deletions
diff --git a/chudisk.h b/chudisk.h
new file mode 100644
index 0000000..f3761fb
--- /dev/null
+++ b/chudisk.h
@@ -0,0 +1,90 @@
+/*
+ * CHU - driver for CH375 in disk mode
+ * Copyright (C) 2024 Javier S. Pedro
+ *
+ * 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/>.
+ */
+
+#ifndef CHUDISK_H
+#define CHUDISK_H
+
+#include <stdbool.h>
+
+#include "inc/dosdrv.h"
+
+#define MAX_UNITS 4
+
+#define SECTOR_SIZE 512
+
+// Configuration values shared between driver init code and resident code
+/* Used by ch375.h, too. */
+extern unsigned short ch375_port;
+
+extern unsigned char num_units;
+
+extern bool read_only;
+
+extern bool show_fat32;
+
+extern struct chudisk_data
+{
+ /** Pointers to all BPBs, to return to DOS during init. */
+ DOS_BPB * bpb_ptrs[MAX_UNITS];
+
+ /** Whether we are ready to handle IO, i.e. disk init, partitions scanned. */
+ bool ready;
+
+ uint32_t sectors;
+ uint32_t bytesPerSector;
+
+ struct chudisk_unit {
+ /** Whether the partition exists (start_sector points to it) */
+ bool exists;
+ /** Note in theory may be zero (superfloppy) */
+ uint32_t start_sector;
+ /** Number of sectors for this partition. */
+ uint32_t sectors;
+ /** Whether the partition's BPB was loaded. */
+ bool ready;
+ /** DOS device params (contains BPB), only valid if 'ready'. */
+ DOS_BPB bpb;
+ } unit[MAX_UNITS];
+} data;
+
+// Functions called by both init part and resident part
+extern void driver_init(DOS_DRS __far *drs);
+
+extern char resident_end;
+
+extern uint8_t wait_for_ch375_result(unsigned int max_ticks);
+
+
+// CHUDISK IOCTLs
+// These are used with the DISK major
+// TODO Not sure we can really happily add custom minors here,
+// but then again DOS outright refuses to accept any other major
+enum CHUDISK_IOCTL_DISK_MINOR {
+ CHUDISK_IOCTL_DISK_READ_ABS_SECTOR = 0xC1
+};
+
+typedef _Packed union CHUDISK_IOCTL_DISK_DATA
+{
+ struct CHUDISK_RWABSSECTOR {
+ uint32_t sector;
+ uint8_t sectors;
+ void far * buffer;
+ } rwabs;
+} CHUDISK_IOCTL_DISK_DATA;
+
+#endif // CHUDISK_H