drivers/block/swim_asm.S

Source file repositories/reference/linux-study-clean/drivers/block/swim_asm.S

File Facts

System
Linux kernel
Corpus path
drivers/block/swim_asm.S
Extension
.S
Size
4485 bytes
Lines
244
Domain
Driver Families
Bucket
drivers/block
Inferred role
Driver Families: drivers/block
Status
atlas-only

Why This File Exists

Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.

Dependency Surface

Detected Declarations

Annotated Snippet

.equ	write_data,	0x0000
	.equ	write_mark,	0x0200
	.equ	write_CRC,	0x0400
	.equ	write_parameter,0x0600
	.equ	write_phase,	0x0800
	.equ	write_setup,	0x0a00
	.equ	write_mode0,	0x0c00
	.equ	write_mode1,	0x0e00
	.equ	read_data,	0x1000
	.equ	read_mark,	0x1200
	.equ	read_error,	0x1400
	.equ	read_parameter,	0x1600
	.equ	read_phase,	0x1800
	.equ	read_setup,	0x1a00
	.equ	read_status,	0x1c00
	.equ	read_handshake,	0x1e00

	.equ	o_side, 0
	.equ	o_track, 1
	.equ	o_sector, 2
	.equ	o_size, 3
	.equ	o_crc0, 4
	.equ	o_crc1, 5

	.equ	seek_time, 30000
	.equ	max_retry, 40
	.equ	sector_size, 512

	.global swim_read_sector_header
swim_read_sector_header:
	link	%a6, #0
	moveml	%d1-%d5/%a0-%a4,%sp@-
	movel	%a6@(0x0c), %a4
	bsr	mfm_read_addrmark
	moveml	%sp@+, %d1-%d5/%a0-%a4
	unlk	%a6
	rts

sector_address_mark:
	.byte	0xa1, 0xa1, 0xa1, 0xfe
sector_data_mark:
	.byte	0xa1, 0xa1, 0xa1, 0xfb

mfm_read_addrmark:
	movel	%a6@(0x08), %a3
	lea	%a3@(read_handshake), %a2
	lea	%a3@(read_mark), %a3
	moveq	#-1, %d0
	movew	#seek_time, %d2

wait_header_init:
	tstb	%a3@(read_error - read_mark)
	moveb	#0x18, %a3@(write_mode0 - read_mark)
	moveb	#0x01, %a3@(write_mode1 - read_mark)
	moveb	#0x01, %a3@(write_mode0 - read_mark)
	tstb	%a3@(read_error - read_mark)
	moveb	#0x08, %a3@(write_mode1 - read_mark)

	lea	sector_address_mark, %a0
	moveq	#3, %d1

wait_addr_mark_byte:

	tstb	%a2@
	dbmi	%d2, wait_addr_mark_byte
	bpl	header_exit

	moveb	%a3@, %d3
	cmpb	%a0@+, %d3
	dbne	%d1, wait_addr_mark_byte

Annotation

Implementation Notes