blob: 6eb43219925a16bfa7ea2421f4d4aa149877aec9 (
plain)
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
|
/*
Copyright (C) 2026 Harley Travis <yoshi128k@gmail.com>.
This work is free. You can redistribute it and/or modify it under the
terms of the Do What The Fuck You Want To Public License, Version 2,
as published by Sam Hocevar. See the Copying.TXT file for more details.
*/
// FDC uses IRQ6 = int 26h
#define I_FDC 0x26
#define IRQ_FDC 6
// FDC regs (primary ctrlr)
#define FDC_STAT_A 0x0
#define FDC_STAT_B 0x1
#define FDC_DOR 0x2
#define FDC_TAPE 0x3
#define FDC_MSR_DSR 0x4
#define FDC_DATA 0x5
#define FDC_CCR_DIR 0x7
// FDC cmds
#define FDC_READ_TRACK 0x02
#define FDC_SPECIFY 0x03
#define FDC_SENSE_STAT 0x04
#define FDC_WRITE_DATA 0x05
#define FDC_READ_DATA 0x06
#define FDC_RECALIBRATE 0x07
#define FDC_SENSE_INTR 0x08
#define FDC_WRITE_DEL 0x09
#define FDC_READ_ID 0x0A
#define FDC_READ_DEL 0x0C
#define FDC_FMT_TRACK 0x0D
#define FDC_DUMP_REG 0x0E
#define FDC_SEEK 0x0F
#define FDC_VERSION 0x10
#define FDC_SCAN_EQL 0x11
#define FDC_PERP_MODE 0x12
#define FDC_CONFIGURE 0x13
#define FDC_LOCK 0x14
#define FDC_VERIFY 0x16
#define FDC_SCAN_LO_EQL 0x19
#define FDC_SCAN_HI_EQL 0x1D
// Motor stuff
#define FDC_MOTOR_OFF 0
#define FDC_MOTOR_ON 1
#define FDC_MOTOR_WAIT 2
// Read/write directions
#define FDC_DIR_READ 0
#define FDC_DIR_WRITE 1
// Digital Output Register (DOR) flags
// DOR motor control flags: 1 = on, 0 = off
#define FDC_DOR_MOTD 0x80 // Drive D
#define FDC_DOR_MOTC 0x40 // Drive C
#define FDC_DOR_MOTB 0x20 // Drive B
#define FDC_DOR_MOTA 0x10 // Drive A
// other DOR flags
#define FDC_DOR_DMA 0x08 // DMA2/IRQ6 On/Off
#define FDC_DOR_REST 0x04 // Controller Reset: this is active low;
// 1 = normal, 0 = reset
// DOR drive select (DOR & 0x03): selects drive 0-3
// Main Status Register (MSR) flags
#define FDC_MSR_RQM 0x80 // Main Request: 1 = ready, 0 = not ready
#define FDC_MSR_DIO 0x40 // Data In/Out: 1 = FDC -> PC, 0 = PC -> FDC
#define FDC_MSR_NDMA 0x20 // Non-DMA: 1 = DMA off, 0 = DMA on
#define FDC_MSR_BUSY 0x10 // Device busy: self-explanatory
// MSR drive seek flags: 1 = seeking, 0 = idle
#define FDC_MSR_ACTD 0x08 // Drive D
#define FDC_MSR_ACTC 0x04 // Drive C
#define FDC_MSR_ACTB 0x02 // Drive B
#define FDC_MSR_ACTA 0x01 // Drive A
// Status Register 0 (ST0) flags
/* ST0 interrupt code (ST0 & 0xC0):
00 = normal termination
01 = abnormal termination
10 = invalid cmd
11 = abnormal termination by poilling (drive became not ready)
*/
#define FDC_ST0_SEEK_END 0x20 // Seek End: seek/calibration completed
#define FDC_ST0_UNIT_CHK 0x10 // Unit Check: drive encountered a fault
// or recalibration failed
#define FDC_ST0_NOT_RDY 0x08 // Not Ready: self-explanatory
#define FDC_ST0_HEAD 0x04 // Active Head
// ST0 unit select (ST0 & 0x03): same fmt as DOR drive select
// Status Register 1 (ST1) flags
#define FDC_ST1_END_CYL 0x80 // End of Cylinder:
// set when sector count > sectors on track
// 0x40 is unused
#define FDC_ST1_DATA_ERR 0x20 // Data Error: set when an error is
// detected in a sector's data or ID fields
#define FDC_ST1_TIMEOUT 0x10 // Timeout: set when a data overrun or
// underrun occurs (i.e. the system is not
// reading data fast enough)
// 0x08 is unused
#define FDC_ST1_NO_DATA 0x04 // No Data: set when either a sector cannot
// be read, or an ID cannot be successfully
// read, or if the sector sequence cannot
// be determined
#define FDC_ST1_NO_WRITE 0x02 // Not Writable: set when attempting to
// write to a write-protected disk
#define FDC_ST1_NO_ID 0x01 // No Addr. Mark: set when an ID/(deleted)
// data address mark cannot be found.
// Status Register 2 (ST2) flags
// 0x80 is unused
#define FDC_ST2_DEL_ADDR_MRK 0x40 // Deleted Addr. Mark: set when a deleted
// DAM or valid DAM is detected during RS
// or RDS, respectively
#define FDC_ST2_CRC_ERR 0x20 // CRC Error: self explanatory
#define FDC_ST2_WRONG_CYL 0x10 // Wrong cyl.: set when the ctrlr cyl does
// not match that in the ID addr mrk
// 0x08 and 0x04 are unused
#define FDC_ST2_BAD_CYL 0x02 // Bad Cylinder: set when track addr in
// sector does not match that on the ctrlr
// and equals 0xFF (meaning it is bad)
#define FDC_ST2_MISSING_DATA 0x01 // Missing Data: set when no DAM or DDAM
// can be found
// Status Register 3 (ST3) flags
// 0x80 is unused
#define FDC_ST3_W_PROT 0x40 // Write Protected: self explanatory
// 0x20 is unused
#define FDC_ST3_TRK_0 0x10 // Track 0: ditto
// 0x08 is unused
#define FDC_ST3_HEAD_ADDR 0x04 // Head Address: ditto
// 0x02 and 0x01 are drive select
|