Home | History | Annotate | Line # | Download | only in common
chkfmt.s revision 1.1.152.1
      1        1.1  minoura |
      2        1.1  minoura |	check FD format
      3        1.1  minoura |
      4  1.1.152.1    rmind |	Written by ITOH Yasufumi
      5        1.1  minoura |	This code is in the public domain
      6        1.1  minoura |
      7        1.1  minoura | $NetBSD: chkfmt.s,v 1.1.152.1 2011/03/05 20:52:24 rmind 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