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