^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0-or-later */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * low-level functions for the SWIM floppy controller
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * needs assembly language because is very timing dependent
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) * this controller exists only on macintosh 680x0 based
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) * Copyright (C) 2004,2008 Laurent Vivier <Laurent@lvivier.info>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) * based on Alastair Bridgewater SWIM analysis, 2001
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) * based on netBSD IWM driver (c) 1997, 1998 Hauke Fath.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) * 2004-08-21 (lv) - Initial implementation
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) * 2008-11-05 (lv) - add get_swim_mode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) .equ write_data, 0x0000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) .equ write_mark, 0x0200
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) .equ write_CRC, 0x0400
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) .equ write_parameter,0x0600
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) .equ write_phase, 0x0800
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) .equ write_setup, 0x0a00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) .equ write_mode0, 0x0c00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) .equ write_mode1, 0x0e00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) .equ read_data, 0x1000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) .equ read_mark, 0x1200
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) .equ read_error, 0x1400
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) .equ read_parameter, 0x1600
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) .equ read_phase, 0x1800
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) .equ read_setup, 0x1a00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) .equ read_status, 0x1c00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) .equ read_handshake, 0x1e00
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) .equ o_side, 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) .equ o_track, 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) .equ o_sector, 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) .equ o_size, 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) .equ o_crc0, 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) .equ o_crc1, 5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) .equ seek_time, 30000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) .equ max_retry, 40
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) .equ sector_size, 512
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) .global swim_read_sector_header
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) swim_read_sector_header:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) link %a6, #0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) moveml %d1-%d5/%a0-%a4,%sp@-
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) movel %a6@(0x0c), %a4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) bsr mfm_read_addrmark
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) moveml %sp@+, %d1-%d5/%a0-%a4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) unlk %a6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) rts
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) sector_address_mark:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) .byte 0xa1, 0xa1, 0xa1, 0xfe
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) sector_data_mark:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) .byte 0xa1, 0xa1, 0xa1, 0xfb
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) mfm_read_addrmark:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) movel %a6@(0x08), %a3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) lea %a3@(read_handshake), %a2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) lea %a3@(read_mark), %a3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) moveq #-1, %d0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) movew #seek_time, %d2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) wait_header_init:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) tstb %a3@(read_error - read_mark)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) moveb #0x18, %a3@(write_mode0 - read_mark)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) moveb #0x01, %a3@(write_mode1 - read_mark)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) moveb #0x01, %a3@(write_mode0 - read_mark)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) tstb %a3@(read_error - read_mark)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) moveb #0x08, %a3@(write_mode1 - read_mark)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) lea sector_address_mark, %a0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) moveq #3, %d1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) wait_addr_mark_byte:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) tstb %a2@
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) dbmi %d2, wait_addr_mark_byte
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) bpl header_exit
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) moveb %a3@, %d3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) cmpb %a0@+, %d3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) dbne %d1, wait_addr_mark_byte
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) bne wait_header_init
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) moveq #max_retry, %d2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) amark0: tstb %a2@
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) dbmi %d2, amark0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) bpl signal_nonyb
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) moveb %a3@, %a4@(o_track)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) moveq #max_retry, %d2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) amark1: tstb %a2@
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) dbmi %d2, amark1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) bpl signal_nonyb
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) moveb %a3@, %a4@(o_side)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) moveq #max_retry, %d2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) amark2: tstb %a2@
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) dbmi %d2, amark2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) bpl signal_nonyb
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) moveb %a3@, %a4@(o_sector)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) moveq #max_retry, %d2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) amark3: tstb %a2@
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) dbmi %d2, amark3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) bpl signal_nonyb
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) moveb %a3@, %a4@(o_size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) moveq #max_retry, %d2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) crc0: tstb %a2@
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) dbmi %d2, crc0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) bpl signal_nonyb
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) moveb %a3@, %a4@(o_crc0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) moveq #max_retry, %d2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) crc1: tstb %a2@
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) dbmi %d2, crc1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) bpl signal_nonyb
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) moveb %a3@, %a4@(o_crc1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) tstb %a3@(read_error - read_mark)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) header_exit:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) moveq #0, %d0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) moveb #0x18, %a3@(write_mode0 - read_mark)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) rts
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) signal_nonyb:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) moveq #-1, %d0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) moveb #0x18, %a3@(write_mode0 - read_mark)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) rts
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) .global swim_read_sector_data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) swim_read_sector_data:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) link %a6, #0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) moveml %d1-%d5/%a0-%a5,%sp@-
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) movel %a6@(0x0c), %a4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) bsr mfm_read_data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) moveml %sp@+, %d1-%d5/%a0-%a5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) unlk %a6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) rts
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) mfm_read_data:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) movel %a6@(0x08), %a3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) lea %a3@(read_handshake), %a2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) lea %a3@(read_data), %a5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) lea %a3@(read_mark), %a3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) movew #seek_time, %d2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) wait_data_init:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) tstb %a3@(read_error - read_mark)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) moveb #0x18, %a3@(write_mode0 - read_mark)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) moveb #0x01, %a3@(write_mode1 - read_mark)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) moveb #0x01, %a3@(write_mode0 - read_mark)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) tstb %a3@(read_error - read_mark)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) moveb #0x08, %a3@(write_mode1 - read_mark)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) lea sector_data_mark, %a0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) moveq #3, %d1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) /* wait data address mark */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) wait_data_mark_byte:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) tstb %a2@
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) dbmi %d2, wait_data_mark_byte
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) bpl data_exit
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) moveb %a3@, %d3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) cmpb %a0@+, %d3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) dbne %d1, wait_data_mark_byte
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) bne wait_data_init
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) /* read data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) tstb %a3@(read_error - read_mark)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) movel #sector_size-1, %d4 /* sector size */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) read_new_data:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) movew #max_retry, %d2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) read_data_loop:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) moveb %a2@, %d5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) andb #0xc0, %d5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) dbne %d2, read_data_loop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) beq data_exit
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) moveb %a5@, %a4@+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) andb #0x40, %d5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) dbne %d4, read_new_data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) beq exit_loop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) moveb %a5@, %a4@+
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) dbra %d4, read_new_data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) exit_loop:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) /* read CRC */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) movew #max_retry, %d2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) data_crc0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) tstb %a2@
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) dbmi %d2, data_crc0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) bpl data_exit
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) moveb %a3@, %d5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) moveq #max_retry, %d2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) data_crc1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) tstb %a2@
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) dbmi %d2, data_crc1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) bpl data_exit
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) moveb %a3@, %d5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) tstb %a3@(read_error - read_mark)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) moveb #0x18, %a3@(write_mode0 - read_mark)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) /* return number of bytes read */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) movel #sector_size, %d0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) addw #1, %d4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) subl %d4, %d0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) rts
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) data_exit:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) moveb #0x18, %a3@(write_mode0 - read_mark)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) moveq #-1, %d0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) rts