4 9990f831 2024-10-05 benni %include "macros.inc"
6 9990f831 2024-10-05 benni ; Floppy Registers
7 9990f831 2024-10-05 benni SRA equ 0x3f0 ; Status Register A RO
8 9990f831 2024-10-05 benni SRB equ 0x3f1 ; Status Register B RO
9 9990f831 2024-10-05 benni DOR equ 0x3f2 ; Digital Output Register RW
10 9990f831 2024-10-05 benni TDR equ 0x3f3 ; Tape Drive Register RW
11 9990f831 2024-10-05 benni MSR equ 0x3f4 ; Main Status Register RO
12 9990f831 2024-10-05 benni DSR equ 0x3f4 ; Datarate Select Register WO
13 9990f831 2024-10-05 benni DFF equ 0x3f5 ; Data FIFO RW
14 9990f831 2024-10-05 benni DIR equ 0x3f7 ; Digital Input Register RO
15 9990f831 2024-10-05 benni CCR equ 0x3f7 ; Configuration Control Register WO
17 9990f831 2024-10-05 benni DOR_MOTD equ 0x80 ; Drive Motor 3 ON
18 9990f831 2024-10-05 benni DOR_MOTC equ 0x40 ; Drive Motor 2 ON
19 9990f831 2024-10-05 benni DOR_MOTB equ 0x20 ; Drive Motor 1 ON
20 9990f831 2024-10-05 benni DOR_MOTA equ 0x10 ; Drive Motor 0 ON
21 9990f831 2024-10-05 benni DOR_IRQ equ 0x08 ; Enable IRQs and DMA
22 9990f831 2024-10-05 benni DOR_NRESET equ 0x04 ; 0=enter reset mode, 1=normal operation
23 9990f831 2024-10-05 benni DOR_DSEL equ 0x03 ; Select drive number mask
25 9990f831 2024-10-05 benni MSR_RQM equ 0x80 ; It's OK (or mandatory) to exchange bytes with the FIFO IO port
26 9990f831 2024-10-05 benni MSR_DIO equ 0x40 ; FIFO expects an IN opcode
27 9990f831 2024-10-05 benni MSR_NDMA equ 0x20 ; Set while executing PIO mode read/write commands
28 9990f831 2024-10-05 benni MSR_BSY equ 0x10 ; Command Busy
29 9990f831 2024-10-05 benni MSR_ACTD equ 0x08 ; Drive 3 is seeking
30 9990f831 2024-10-05 benni MSR_ACTC equ 0x04 ; Drive 2 is seeking
31 9990f831 2024-10-05 benni MSR_ACTB equ 0x02 ; Drive 1 is seeking
32 9990f831 2024-10-05 benni MSR_ACTA equ 0x01 ; Drive 0 is seeking
34 9990f831 2024-10-05 benni DSR_288M equ 0x03 ; 2.88M floppy (1Mbps)
35 9990f831 2024-10-05 benni DSR_144M equ 0x00 ; 1.44M floppy (500Kbps)
37 9990f831 2024-10-05 benni ; Floppy drive commands
38 9990f831 2024-10-05 benni CMD_READ_TRACK equ 2 ; IRQ6
39 9990f831 2024-10-05 benni CMD_SPECIFY equ 3 ; set drive parameters
40 9990f831 2024-10-05 benni CMD_SENSE_DRIVE_STATUS equ 4
41 9990f831 2024-10-05 benni CMD_WRITE_DATA equ 5 ; write to disk
42 9990f831 2024-10-05 benni CMD_READ_DATA equ 6 ; read from disk
43 9990f831 2024-10-05 benni CMD_RECALIBRATE equ 7 ; seek to cylinder 0
44 9990f831 2024-10-05 benni CMD_SENSE_INTERRUPT equ 8 ; ack IRQ6, get status of last command
45 9990f831 2024-10-05 benni CMD_WRITE_DELETED_DATA equ 9
46 9990f831 2024-10-05 benni CMD_READ_ID equ 10 ; IRQ6
47 9990f831 2024-10-05 benni CMD_READ_DELETED_DATA equ 12
48 9990f831 2024-10-05 benni CMD_FORMAT_TRACK equ 13
49 9990f831 2024-10-05 benni CMD_DUMPREG equ 14
50 9990f831 2024-10-05 benni CMD_SEEK equ 15 ; seek both heads to cylinder X
51 9990f831 2024-10-05 benni CMD_VERSION equ 16 ; used during initialization, once
52 9990f831 2024-10-05 benni CMD_SCAN_EQUAL equ 17
53 9990f831 2024-10-05 benni CMD_PERPENDICULAR_MODE equ 18 ; used during initialization, once, maybe
54 9990f831 2024-10-05 benni CMD_CONFIGURE equ 19 ; set controller parameters
55 9990f831 2024-10-05 benni CMD_LOCK equ 20 ; protect controller parameters from reset
56 9990f831 2024-10-05 benni CMD_VERIFY equ 22
57 9990f831 2024-10-05 benni CMD_SCAN_LOW_OR_EQUAL equ 25
58 9990f831 2024-10-05 benni CMD_SCAN_HIGH_OR_EQUAL equ 29
60 9990f831 2024-10-05 benni CMD_MT equ 0x80 ; multitrack mode
61 9990f831 2024-10-05 benni CMD_MF equ 0x40 ; "MFM" magnetic encoding mode. Always set for read/write/format/verify
62 9990f831 2024-10-05 benni CMD_SK equ 0x20 ; Skip mode. Skips "deleted sectors"
65 9990f831 2024-10-05 benni section .text
66 9990f831 2024-10-05 benni extern puthexb
67 9990f831 2024-10-05 benni extern putchar
68 9990f831 2024-10-05 benni extern puts
69 9990f831 2024-10-05 benni extern panic
70 9990f831 2024-10-05 benni global floppy_init
71 9990f831 2024-10-05 benni floppy_init:
72 9990f831 2024-10-05 benni lea bp, [fimsg]
75 9990f831 2024-10-05 benni ; read what types of floppy drives we have
76 9990f831 2024-10-05 benni outb_slow 0x70, 0x90
77 9990f831 2024-10-05 benni in al, 0x71
78 9990f831 2024-10-05 benni mov byte [floppy_type], al
79 9990f831 2024-10-05 benni call puthexb
82 9990f831 2024-10-05 benni call putchar
84 9990f831 2024-10-05 benni lea bp, [vermsg]
87 9990f831 2024-10-05 benni call version
88 9990f831 2024-10-05 benni call puthexb
91 9990f831 2024-10-05 benni call putchar
97 9990f831 2024-10-05 benni mov cx, 128
103 9990f831 2024-10-05 benni mov dx, MSR
105 9990f831 2024-10-05 benni test al, MSR_RQM
118 9990f831 2024-10-05 benni ; wait for the controller
119 9990f831 2024-10-05 benni mov dx, MSR
121 9990f831 2024-10-05 benni and al, (MSR_RQM | MSR_DIO)
122 9990f831 2024-10-05 benni cmp al, MSR_RQM
123 9990f831 2024-10-05 benni jne .reset
125 9990f831 2024-10-05 benni ; send version command
126 9990f831 2024-10-05 benni mov al, CMD_VERSION
127 9990f831 2024-10-05 benni mov dx, DFF
128 9990f831 2024-10-05 benni out dx, al
130 9990f831 2024-10-05 benni ; wait for version byte
131 9990f831 2024-10-05 benni call wait_rqm
132 9990f831 2024-10-05 benni test al, MSR_DIO
135 9990f831 2024-10-05 benni ; read version byte
136 9990f831 2024-10-05 benni mov dx, DFF
138 9990f831 2024-10-05 benni mov bl, al
140 9990f831 2024-10-05 benni ; wait for completion
141 9990f831 2024-10-05 benni call wait_rqm
143 9990f831 2024-10-05 benni ; verify result
144 9990f831 2024-10-05 benni mov dx, MSR
146 9990f831 2024-10-05 benni and al, (MSR_RQM | MSR_BSY | MSR_DIO)
147 9990f831 2024-10-05 benni cmp al, MSR_RQM
148 9990f831 2024-10-05 benni jne .retry
149 9990f831 2024-10-05 benni mov al, bl
154 9990f831 2024-10-05 benni lea bp, [rtmsg]
157 9990f831 2024-10-05 benni jmp .begin
161 9990f831 2024-10-05 benni call reset
163 9990f831 2024-10-05 benni jmp .begin
166 9990f831 2024-10-05 benni lea bp, [rsmsg]
170 9990f831 2024-10-05 benni lea bp, [errstr]
175 9990f831 2024-10-05 benni ; - bx cyl
176 9990f831 2024-10-05 benni ; - cx head
177 9990f831 2024-10-05 benni ; - dx sector
178 9990f831 2024-10-05 benni lba_to_cha:
179 9990f831 2024-10-05 benni xor dx, dx
180 9990f831 2024-10-05 benni mov cx, 36
182 9990f831 2024-10-05 benni mov bx, ax ; cyl
183 9990f831 2024-10-05 benni mov ax, dx
184 9990f831 2024-10-05 benni xor dx, dx
185 9990f831 2024-10-05 benni mov cx, 18
187 9990f831 2024-10-05 benni mov cx, ax ; head
188 9990f831 2024-10-05 benni inc dx ; sector
191 9990f831 2024-10-05 benni section .rodata
193 9990f831 2024-10-05 benni db "An error occured in the floppy driver", 10, 0
195 9990f831 2024-10-05 benni db "Floppy drive type: 0x", 0
197 9990f831 2024-10-05 benni db "Floppy drive version: 0x", 0
199 9990f831 2024-10-05 benni db "Resetting floppy drive...", 10, 0
201 9990f831 2024-10-05 benni db "Retrying last operating", 10, 0
203 9990f831 2024-10-05 benni section .bss
204 9990f831 2024-10-05 benni floppy_type: