Difference between revisions of "SYMBiFACE II:IDE routines"
From CPCWiki - THE Amstrad CPC encyclopedia!
m |
|||
| Line 13: | Line 13: | ||
;### IDEADR -> set address | ;### IDEADR -> set address | ||
| − | ;### | + | ;### Input HL=Track, E=Sector, D=SDH (head, drive, mode), B=number of sectors |
| − | ;### | + | ;### Output CF=0 -> ok |
| − | ;### | + | ;### CF=1 -> A=error code (...) |
| − | ;### | + | ;### Destroyed AF,BC |
ideadr call ideadr0 | ideadr call ideadr0 | ||
ret c | ret c | ||
| Line 42: | Line 42: | ||
;### IDECMD -> Send command | ;### IDECMD -> Send command | ||
| − | ;### | + | ;### Input A=Command |
| − | ;### | + | ;### Destroyed BC |
idecmd ld bc,ideprtsta | idecmd ld bc,ideprtsta | ||
out (c),a | out (c),a | ||
| Line 49: | Line 49: | ||
;### IDERDY -> Wait, until IDE-drive is ready for command | ;### IDERDY -> Wait, until IDE-drive is ready for command | ||
| − | ;### Output | + | ;### Output CF=0 -> ok, CF=1 -> error (A=code) |
| − | ;### | + | ;### Destroyed AF |
iderdy push bc | iderdy push bc | ||
push hl | push hl | ||
| Line 70: | Line 70: | ||
;### IDEDRQ -> wait for "Data Request" | ;### IDEDRQ -> wait for "Data Request" | ||
| − | ;### Output | + | ;### Output BC=Portnumber of the Status Register |
| − | ;### | + | ;### Destroyed AF |
idedrq ld bc,ideprtsta | idedrq ld bc,ideprtsta | ||
idedrq1 in a,(c) | idedrq1 in a,(c) | ||
| Line 79: | Line 79: | ||
;### IDERED -> read 512Bytes | ;### IDERED -> read 512Bytes | ||
| − | ;### Input | + | ;### Input HL=destination address |
| − | ;### Output | + | ;### Output HL=address behind destination |
| − | ;### | + | ;### Destroyed AF,BC |
idered call idedrq | idered call idedrq | ||
ld bc,ideprtdat | ld bc,ideprtdat | ||
| Line 94: | Line 94: | ||
;### IDEWRT -> write 512Bytes | ;### IDEWRT -> write 512Bytes | ||
| − | ;### Input | + | ;### Input HL=source address |
| − | ;### Output | + | ;### Output HL=addresse behind source |
| − | ;### | + | ;### Destroyed AF,BC |
idewrt call idedrq ;wait for ready | idewrt call idedrq ;wait for ready | ||
ld bc,ideprtdat ;bc=IDE data port | ld bc,ideprtdat ;bc=IDE data port | ||
| Line 109: | Line 109: | ||
;### IDEERR -> check error status | ;### IDEERR -> check error status | ||
| − | ;### Output | + | ;### 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) |
| − | ;### | + | ;### Destroyed BC |
ideerr ld bc,ideprtsta | ideerr ld bc,ideprtsta | ||
in a,(c) | in a,(c) | ||
Revision as of 19:07, 25 August 2006
These are the core SYMBiFACE II IDE low level routines of SymbOS. They show how to read and write sectors from/to an IDE device.
;==============================================================================
;### IDE-HARDDISC-ROUTINES ####################################################
;==============================================================================
ideprtsta equ #fd0f ;Portaddress + #f (Status/Command)
ideprtsdh equ #fd0e ;Portaddress + #e (SDH)
ideprtdat equ #fd08 ;Portaddress + #8 (Data)
ideprterr equ #fd09 ;Portaddress + #9 (Error)
ideprtdig equ #fd06 ;Portaddress + #6 (Digital-Output)
;### IDEADR -> set address
;### Input HL=Track, E=Sector, D=SDH (head, drive, mode), B=number of sectors
;### Output CF=0 -> ok
;### CF=1 -> A=error code (...)
;### Destroyed AF,BC
ideadr call ideadr0
ret c
dec c
out (c),h ;Track High
dec c
out (c),l ;Track Low
dec c
out (c),e ;Sector
dec c
out (c),a ;number of Sectors
ret
ideadr0 call iderdy
ret c
push bc
ld bc,ideprtsdh
out (c),d ;write SDH-Register
call iderdy
jr c,ideadr1
pop af ;A=number of sectors
or a
ret
ideadr1 pop bc
ret
;### IDECMD -> Send command
;### Input A=Command
;### Destroyed BC
idecmd ld bc,ideprtsta
out (c),a
ret
;### IDERDY -> Wait, until IDE-drive is ready for command
;### Output CF=0 -> ok, CF=1 -> error (A=code)
;### Destroyed AF
iderdy push bc
push hl
ld bc,ideprtsta
ld hl,256*60
iderdy1 in a,(c)
and #80
jr z,iderdy2
dec l
jr nz,iderdy1
call subslp
dec h
jr nz,iderdy1
iderdy3 ld a,stoerrabo
scf
iderdy2 pop hl
pop bc
ret
;### IDEDRQ -> wait for "Data Request"
;### Output BC=Portnumber of the Status Register
;### Destroyed AF
idedrq ld bc,ideprtsta
idedrq1 in a,(c)
and #08
jr z,idedrq1
ret
;### IDERED -> read 512Bytes
;### Input HL=destination address
;### Output HL=address behind destination
;### Destroyed AF,BC
idered call idedrq
ld bc,ideprtdat
ld a,512/32
idered1 ini:inc b:ini:inc b:ini:inc b:ini:inc b:ini:inc b:ini:inc b:ini:inc b:ini:inc b
ini:inc b:ini:inc b:ini:inc b:ini:inc b:ini:inc b:ini:inc b:ini:inc b:ini:inc b
ini:inc b:ini:inc b:ini:inc b:ini:inc b:ini:inc b:ini:inc b:ini:inc b:ini:inc b
ini:inc b:ini:inc b:ini:inc b:ini:inc b:ini:inc b:ini:inc b:ini:inc b:ini:inc b
dec a
jr nz,idered1
ret
;### IDEWRT -> write 512Bytes
;### Input HL=source address
;### Output HL=addresse behind source
;### Destroyed AF,BC
idewrt call idedrq ;wait for ready
ld bc,ideprtdat ;bc=IDE data port
ld a,512/32
idewrt1 inc b:outi:inc b:outi:inc b:outi:inc b:outi:inc b:outi:inc b:outi:inc b:outi:inc b:outi
inc b:outi:inc b:outi:inc b:outi:inc b:outi:inc b:outi:inc b:outi:inc b:outi:inc b:outi
inc b:outi:inc b:outi:inc b:outi:inc b:outi:inc b:outi:inc b:outi:inc b:outi:inc b:outi
inc b:outi:inc b:outi:inc b:outi:inc b:outi:inc b:outi:inc b:outi:inc b:outi:inc b:outi
dec a
jr nz,idewrt1
ret
;### 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)
;### Destroyed BC
ideerr ld bc,ideprtsta
in a,(c)
and 1+4
ret z ;CF=0, A=0 -> ok
cp 4
ld a,1 ;CF=0, A=1 -> ok, but with data correction
ret z
ld bc,ideprterr
in a,(c)
ld c,a
ld b,6
and 128+64 ;Sector unreadable/BadMarkedSector -> error while read/write
jr nz,ideerr1
ld a,c
inc b
and 2+16 ;Track0 not found/wrong SectorNum -> error while positioning
jr nz,ideerr1
inc b
bit 2,c ;Command Aborted -> abort
jr nz,ideerr1
inc b ;everything else -> unknown
ideerr1 ld a,b
scf
ret