Changes

SYMBiFACE II:IDE routines

1,503 bytes added, 23:31, 12 November 2006
These are the core [[SYMBiFACE II]] IDE low level routines of [[SymbOS]], written by [[Prodatron]]. They show how to read and write sectors from/to an IDE device.
<pre>
;### IDEADR -> set address
;### Eingabe Input HL=Track, E=Sector, D=SDH (head, drive, mode), B=number of sectors;### Ausgabe Output CF=0 -> ok;### CF=1 -> A=error code (...);### Verändert Destroyed AF,BC
ideadr call ideadr0
ret c
;### IDECMD -> Send command
;### Eingabe Input A=Command;### Verändert Destroyed BC
idecmd ld bc,ideprtsta
out (c),a
;### IDERDY -> Wait, until IDE-drive is ready for command
;### Output CF=0 -> ok, CF=1 -> error (A=code);### Verändert Destroyed AF
iderdy push bc
push hl
;### IDEDRQ -> wait for "Data Request"
;### Output BC=Portnumber of the Status Register;### Verändert Destroyed AF
idedrq ld bc,ideprtsta
idedrq1 in a,(c)
;### IDERED -> read 512Bytes
;### Input HL=destination address;### Output HL=address behind destination;### Verändert Destroyed AF,BC
idered call idedrq
ld bc,ideprtdat
;### IDEWRT -> write 512Bytes
;### Input HL=source address;### Output HL=addresse behind source;### Verändert Destroyed AF,BC
idewrt call idedrq ;wait for ready
ld bc,ideprtdat ;bc=IDE data port
;### IDEERR -> check error status
;### Output CF=0 -> ok (A=0 everthing is fine, A=1 data needed to be corrected),;### CF=1 -> error (A=code, 6=error while read/write, 7=error while positioning, 8=abort, 9=unknown);### Verändert Destroyed BC
ideerr ld bc,ideprtsta
in a,(c)
scf
ret
 
 
 
;### IDE48B -> set 48bit address
;### Input IX[32-47],HL[16-31],DE[0-15]=Sectornumber, A=SDH, B=Number of Sectors
;### (you should reset the upper 8bits of the sector count register first)
;### Output CF=0 -> ok
;### CF=1 -> A=error code (...)
;### Destroyed AF,BC,DE
ide48b push af ;4
call iderdy ; wait for ready before first SDH write
jr c,ide48b1 ;2
pop af ;3
or #0f ;2
ld c,a ;1
push bc ;4
ld bc,ideprtsdh ;3
and #f0 ;2
out (c),a ;4 write SDH Register (low bytes)
dec c ;1
out (c),l ;4 LBA 16-23
dec c ;1
out (c),d ;4 LBA 08-15
dec c ;1
out (c),e ;4 LBA 00-07
dec c ;1
pop de ;3
out (c),d ;4 Sector count
ld bc,ideprtsdh ;3
out (c),e ;4 write SDH Register (high bytes)
dec c ;1
db #dd:ld a,h ;2
out (c),a ;4 LBA 40-47
dec c ;1
db #dd:ld a,l ;2
out (c),a ;4 LBA 32-39
dec c ;1
out (c),h ;4 LBA 24-31
ret ;3 -> 77 microseconds
ide48b1 pop bc ;Return on Error
ret
 
</pre>
 
== See also ==
 
* [[Programming:SYMBiFACE_II|SYMBiFACE II documentations]]
 
[[Category:Programming]]