18852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier/*
28852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier * low-level functions for the SWIM floppy controller
38852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier *
48852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier * needs assembly language because is very timing dependent
58852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier * this controller exists only on macintosh 680x0 based
68852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier *
78852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier * Copyright (C) 2004,2008 Laurent Vivier <Laurent@lvivier.info>
88852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier *
98852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier * based on Alastair Bridgewater SWIM analysis, 2001
108852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier * based on netBSD IWM driver (c) 1997, 1998 Hauke Fath.
118852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier *
128852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier * This program is free software; you can redistribute it and/or
138852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier * modify it under the terms of the GNU General Public License
148852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier * as published by the Free Software Foundation; either version
158852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier * 2 of the License, or (at your option) any later version.
168852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier *
178852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier * 2004-08-21 (lv) - Initial implementation
188852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier * 2008-11-05 (lv) - add get_swim_mode
198852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier */
208852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier
218852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	.equ	write_data,	0x0000
228852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	.equ	write_mark,	0x0200
238852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	.equ	write_CRC,	0x0400
248852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	.equ	write_parameter,0x0600
258852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	.equ	write_phase,	0x0800
268852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	.equ	write_setup,	0x0a00
278852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	.equ	write_mode0,	0x0c00
288852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	.equ	write_mode1,	0x0e00
298852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	.equ	read_data,	0x1000
308852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	.equ	read_mark,	0x1200
318852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	.equ	read_error,	0x1400
328852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	.equ	read_parameter,	0x1600
338852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	.equ	read_phase,	0x1800
348852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	.equ	read_setup,	0x1a00
358852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	.equ	read_status,	0x1c00
368852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	.equ	read_handshake,	0x1e00
378852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier
388852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	.equ	o_side, 0
398852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	.equ	o_track, 1
408852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	.equ	o_sector, 2
418852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	.equ	o_size, 3
428852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	.equ	o_crc0, 4
438852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	.equ	o_crc1, 5
448852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier
458852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	.equ	seek_time, 30000
468852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	.equ	max_retry, 40
478852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	.equ	sector_size, 512
488852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier
498852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	.global swim_read_sector_header
508852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivierswim_read_sector_header:
518852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	link	%a6, #0
528852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	moveml	%d1-%d5/%a0-%a4,%sp@-
538852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	movel	%a6@(0x0c), %a4
548852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	bsr	mfm_read_addrmark
558852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	moveml	%sp@+, %d1-%d5/%a0-%a4
568852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	unlk	%a6
578852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	rts
588852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier
598852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Viviersector_address_mark:
608852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	.byte	0xa1, 0xa1, 0xa1, 0xfe
618852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Viviersector_data_mark:
628852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	.byte	0xa1, 0xa1, 0xa1, 0xfb
638852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier
648852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Viviermfm_read_addrmark:
658852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	movel	%a6@(0x08), %a3
668852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	lea	%a3@(read_handshake), %a2
678852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	lea	%a3@(read_mark), %a3
688852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	moveq	#-1, %d0
698852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	movew	#seek_time, %d2
708852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier
718852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivierwait_header_init:
728852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	tstb	%a3@(read_error - read_mark)
738852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	moveb	#0x18, %a3@(write_mode0 - read_mark)
748852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	moveb	#0x01, %a3@(write_mode1 - read_mark)
758852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	moveb	#0x01, %a3@(write_mode0 - read_mark)
768852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	tstb	%a3@(read_error - read_mark)
778852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	moveb	#0x08, %a3@(write_mode1 - read_mark)
788852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier
798852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	lea	sector_address_mark, %a0
808852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	moveq	#3, %d1
818852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier
828852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivierwait_addr_mark_byte:
838852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier
848852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	tstb	%a2@
858852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	dbmi	%d2, wait_addr_mark_byte
868852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	bpl	header_exit
878852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier
888852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	moveb	%a3@, %d3
898852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	cmpb	%a0@+, %d3
908852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	dbne	%d1, wait_addr_mark_byte
918852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	bne	wait_header_init
928852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier
938852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	moveq	#max_retry, %d2
948852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier
958852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivieramark0:	tstb	%a2@
968852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	dbmi	%d2, amark0
978852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	bpl	signal_nonyb
988852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier
998852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	moveb	%a3@, %a4@(o_track)
1008852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier
1018852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	moveq	#max_retry, %d2
1028852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier
1038852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivieramark1:	tstb	%a2@
1048852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	dbmi	%d2, amark1
1058852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	bpl	signal_nonyb
1068852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier
1078852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	moveb	%a3@, %a4@(o_side)
1088852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier
1098852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	moveq	#max_retry, %d2
1108852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier
1118852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivieramark2:	tstb	%a2@
1128852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	dbmi	%d2, amark2
1138852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	bpl	signal_nonyb
1148852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier
1158852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	moveb	%a3@, %a4@(o_sector)
1168852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier
1178852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	moveq	#max_retry, %d2
1188852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier
1198852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivieramark3:	tstb	%a2@
1208852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	dbmi	%d2, amark3
1218852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	bpl	signal_nonyb
1228852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier
1238852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	moveb	%a3@, %a4@(o_size)
1248852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier
1258852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	moveq	#max_retry, %d2
1268852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier
1278852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Viviercrc0:	tstb	%a2@
1288852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	dbmi	%d2, crc0
1298852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	bpl	signal_nonyb
1308852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier
1318852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	moveb	%a3@, %a4@(o_crc0)
1328852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier
1338852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	moveq	#max_retry, %d2
1348852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier
1358852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Viviercrc1:	tstb	%a2@
1368852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	dbmi	%d2, crc1
1378852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	bpl	signal_nonyb
1388852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier
1398852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	moveb	%a3@, %a4@(o_crc1)
1408852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier
1418852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	tstb	%a3@(read_error - read_mark)
1428852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier
1438852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivierheader_exit:
1448852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	moveq	#0, %d0
1458852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	moveb	#0x18, %a3@(write_mode0 - read_mark)
1468852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	rts
1478852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Viviersignal_nonyb:
1488852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	moveq	#-1, %d0
1498852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	moveb	#0x18, %a3@(write_mode0 - read_mark)
1508852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	rts
1518852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier
1528852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	.global swim_read_sector_data
1538852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivierswim_read_sector_data:
1548852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	link	%a6, #0
1558852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	moveml	%d1-%d5/%a0-%a5,%sp@-
1568852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	movel	%a6@(0x0c), %a4
1578852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	bsr	mfm_read_data
1588852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	moveml	%sp@+, %d1-%d5/%a0-%a5
1598852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	unlk	%a6
1608852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	rts
1618852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier
1628852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Viviermfm_read_data:
1638852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	movel	%a6@(0x08), %a3
1648852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	lea	%a3@(read_handshake), %a2
1658852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	lea	%a3@(read_data), %a5
1668852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	lea	%a3@(read_mark), %a3
1678852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	movew	#seek_time, %d2
1688852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier
1698852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivierwait_data_init:
1708852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	tstb	%a3@(read_error - read_mark)
1718852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	moveb	#0x18, %a3@(write_mode0 - read_mark)
1728852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	moveb	#0x01, %a3@(write_mode1 - read_mark)
1738852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	moveb	#0x01, %a3@(write_mode0 - read_mark)
1748852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	tstb	%a3@(read_error - read_mark)
1758852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	moveb	#0x08, %a3@(write_mode1 - read_mark)
1768852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier
1778852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	lea	sector_data_mark, %a0
1788852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	moveq	#3, %d1
1798852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier
1808852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	/* wait data address mark */
1818852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier
1828852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivierwait_data_mark_byte:
1838852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier
1848852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	tstb	%a2@
1858852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	dbmi	%d2, wait_data_mark_byte
1868852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	bpl	data_exit
1878852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier
1888852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	moveb	%a3@, %d3
1898852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	cmpb	%a0@+, %d3
1908852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	dbne	%d1, wait_data_mark_byte
1918852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	bne	wait_data_init
1928852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier
1938852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	/* read data */
1948852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier
1958852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	tstb	%a3@(read_error - read_mark)
1968852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier
1978852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	movel	#sector_size-1, %d4		/* sector size */
1988852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivierread_new_data:
1998852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	movew	#max_retry, %d2
2008852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivierread_data_loop:
2018852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	moveb	%a2@, %d5
2028852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	andb	#0xc0, %d5
2038852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	dbne	%d2, read_data_loop
2048852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	beq	data_exit
2058852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	moveb	%a5@, %a4@+
2068852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	andb	#0x40, %d5
2078852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	dbne	%d4, read_new_data
2088852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	beq	exit_loop
2098852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	moveb	%a5@, %a4@+
2108852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	dbra	%d4, read_new_data
2118852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivierexit_loop:
2128852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier
2138852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	/* read CRC */
2148852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier
2158852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	movew	#max_retry, %d2
2168852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivierdata_crc0:
2178852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier
2188852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	tstb	%a2@
2198852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	dbmi	%d2, data_crc0
2208852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	bpl	data_exit
2218852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier
2228852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	moveb	%a3@, %d5
2238852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier
2248852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	moveq	#max_retry, %d2
2258852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier
2268852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivierdata_crc1:
2278852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier
2288852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	tstb	%a2@
2298852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	dbmi	%d2, data_crc1
2308852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	bpl	data_exit
2318852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier
2328852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	moveb	%a3@, %d5
2338852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier
2348852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	tstb	%a3@(read_error - read_mark)
2358852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier
2368852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	moveb	#0x18, %a3@(write_mode0 - read_mark)
2378852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier
2388852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	/* return number of bytes read */
2398852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier
2408852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	movel	#sector_size, %d0
2418852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	addw	#1, %d4
2428852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	subl	%d4, %d0
2438852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	rts
2448852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivierdata_exit:
2458852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	moveb	#0x18, %a3@(write_mode0 - read_mark)
2468852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	moveq	#-1, %d0
2478852ecd97488249ca7fe2c0d3eb44cae95886881Laurent Vivier	rts
248