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