chkfmt.s revision 1.2 1 1.1 minoura |
2 1.1 minoura | check FD format
3 1.1 minoura |
4 1.2 itohy | Written by ITOH Yasufumi
5 1.1 minoura | This code is in the public domain
6 1.1 minoura |
7 1.2 itohy | $NetBSD: chkfmt.s,v 1.2 2011/02/21 02:31:58 itohy Exp $
8 1.1 minoura
9 1.1 minoura /* FDC address */
10 1.1 minoura #define FDC_STATUS 0xE94001 /* status register */
11 1.1 minoura #define FDC_DATA 0xE94003 /* data register */
12 1.1 minoura
13 1.1 minoura #define INT_STAT 0xE9C001 /* interrupt control */
14 1.1 minoura #define INT_FDC_BIT 2
15 1.1 minoura
16 1.1 minoura /* Status Register */
17 1.1 minoura #define NE7ST_CB_BIT 4 /* FDC busy */
18 1.1 minoura #define NE7ST_DIO_BIT 6 /* data input/output */
19 1.1 minoura #define NE7ST_RQM_BIT 7 /* request for master */
20 1.1 minoura
21 1.1 minoura /* FDC command */
22 1.1 minoura #define NE7CMD_READID 0x4A /* READ ID */
23 1.1 minoura
24 1.1 minoura |
25 1.1 minoura | Read ID of all sectors in current track.
26 1.1 minoura | This routine expects that motor on, drive selection
27 1.1 minoura | and seek is already done.
28 1.1 minoura |
29 1.1 minoura | input: d0.b: 0 0 0 0 0 HD US1 US0 (binary)
30 1.1 minoura | output: d0.l: min # sector (N C H R (2hex))
31 1.1 minoura | d1.l: max # sector (N C H R (2hex))
32 1.1 minoura | destroy:
33 1.1 minoura | d0, d1
34 1.1 minoura |
35 1.1 minoura .text
36 1.1 minoura .even
37 1.1 minoura .globl check_fd_format
38 1.1 minoura check_fd_format:
39 1.1 minoura moveml %d2-%d7/%a1-%a3,%sp@-
40 1.1 minoura
41 1.1 minoura moveb %d0,%d6 | head, drive
42 1.1 minoura
43 1.1 minoura lea FDC_STATUS:l,%a1
44 1.1 minoura lea %a1@(FDC_DATA-FDC_STATUS),%a2 | FDC_DATA
45 1.1 minoura lea %a2@(INT_STAT-FDC_DATA),%a3 | INT_STAT
46 1.1 minoura
47 1.1 minoura movew %sr,%sp@-
48 1.1 minoura oriw #0x0700,%sr | keep out interrupts
49 1.1 minoura moveq #INT_FDC_BIT,%d5
50 1.1 minoura bclr %d5,%a3@ | disable FDC interrupt
51 1.1 minoura
52 1.1 minoura jbsr read_id_sub
53 1.1 minoura jne exit_check_format
54 1.1 minoura movel %d3,%d2 | first sector
55 1.1 minoura movel %d3,%d0 | sector min
56 1.1 minoura sector_is_max:
57 1.1 minoura movel %d3,%d1 | sector max
58 1.1 minoura
59 1.1 minoura loop_read_id:
60 1.1 minoura jbsr read_id_sub
61 1.1 minoura jne exit_check_format
62 1.1 minoura cmpl %d0,%d3
63 1.1 minoura jcc sector_not_min
64 1.1 minoura movel %d3,%d0
65 1.1 minoura sector_not_min:
66 1.1 minoura cmpl %d3,%d1
67 1.1 minoura jcs sector_is_max
68 1.1 minoura cmpl %d2,%d3
69 1.1 minoura jne loop_read_id
70 1.1 minoura
71 1.1 minoura exit_check_format:
72 1.1 minoura bset %d5,%a3@ | enable FDC interrupt
73 1.1 minoura movew %a7@+,%sr
74 1.1 minoura
75 1.1 minoura tstl %d7
76 1.1 minoura moveml %a7@+,%d2-%d7/%a1-%a3
77 1.1 minoura jne _err_read_id
78 1.1 minoura
79 1.1 minoura rts
80 1.1 minoura
81 1.1 minoura |
82 1.1 minoura | input: d6.b: 0 0 0 0 0 HD US1 US0 (binary)
83 1.1 minoura | a1: FDC status addr
84 1.1 minoura | a2: FDC data addr
85 1.1 minoura | interrupt must be disabled
86 1.1 minoura | output: d3.l: sector information: N C H R (2hex)
87 1.1 minoura | d7.l: status (nonzero if error)
88 1.1 minoura | Z flag: true if no error, false if error
89 1.1 minoura | destroy:
90 1.1 minoura | d3-d4, d7
91 1.1 minoura |
92 1.1 minoura read_id_sub:
93 1.1 minoura | wait for FDC ready
94 1.1 minoura fdc_wait_ready:
95 1.1 minoura btst #NE7ST_CB_BIT,%a1@
96 1.1 minoura jne fdc_wait_ready
97 1.1 minoura
98 1.1 minoura | send READ ID command
99 1.1 minoura fdc_send_command1:
100 1.1 minoura jbsr fdc_wait_rqm
101 1.1 minoura jmi fdc_send_command1
102 1.1 minoura moveb #NE7CMD_READID,%a2@
103 1.1 minoura
104 1.1 minoura fdc_send_command2:
105 1.1 minoura jbsr fdc_wait_rqm
106 1.1 minoura jmi fdc_send_command2
107 1.1 minoura moveb %d6,%a2@ | X X X X X HD US1 US0 (binary)
108 1.1 minoura
109 1.1 minoura | receive data
110 1.1 minoura moveq #2,%d4
111 1.1 minoura jbsr fdc_read_bytes
112 1.1 minoura movel %d3,%d7 | d7: FDC status: X ST0 ST1 ST2 (2hex)
113 1.1 minoura moveq #3,%d4
114 1.1 minoura jbsr fdc_read_bytes | d3: sector info: C H R N (2hex)
115 1.1 minoura rorl #8,%d3 | d3: sector info: N C H R (2hex)
116 1.1 minoura
117 1.1 minoura andil #0x00f8ffff,%d7 | check status (must be zero)
118 1.1 minoura rts
119 1.1 minoura
120 1.1 minoura |
121 1.1 minoura | receive d4:w + 1 bytes from FDC
122 1.1 minoura |
123 1.1 minoura fdc_read_bytes:
124 1.1 minoura asll #8,%d3
125 1.1 minoura fdc_read_loop:
126 1.1 minoura jbsr fdc_wait_rqm
127 1.1 minoura jpl fdc_read_loop
128 1.1 minoura moveb %a2@,%d3
129 1.1 minoura dbra %d4,fdc_read_bytes
130 1.1 minoura rts
131 1.1 minoura
132 1.1 minoura fdc_wait_rqm:
133 1.1 minoura moveb %a1@,%d3
134 1.1 minoura jpl fdc_wait_rqm | NE7ST_RQM_BIT = 7: sign bit
135 1.1 minoura lslb #1,%d3 | NE7ST_DIO_BIT = 6 ... move to bit #7
136 1.1 minoura rts
137 1.1 minoura
138 1.1 minoura |
139 1.1 minoura | error
140 1.1 minoura |
141 1.1 minoura _err_read_id:
142 1.1 minoura BOOT_ERROR("READ ID failed")
143