Home | History | Annotate | Line # | Download | only in common
      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