<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>https://oldwiki.cpcwiki.eu/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=145.254.112.66</id>
		<title>CPCWiki - THE Amstrad CPC encyclopedia! - User contributions [en]</title>
		<link rel="self" type="application/atom+xml" href="https://oldwiki.cpcwiki.eu/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=145.254.112.66"/>
		<link rel="alternate" type="text/html" href="https://oldwiki.cpcwiki.eu/index.php/Special:Contributions/145.254.112.66"/>
		<updated>2026-08-30T00:57:03Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.25.1</generator>

	<entry>
		<id>https://oldwiki.cpcwiki.eu/index.php?title=SYMBiFACE_II:IDE_routines&amp;diff=10314</id>
		<title>SYMBiFACE II:IDE routines</title>
		<link rel="alternate" type="text/html" href="https://oldwiki.cpcwiki.eu/index.php?title=SYMBiFACE_II:IDE_routines&amp;diff=10314"/>
				<updated>2006-11-10T17:12:21Z</updated>
		
		<summary type="html">&lt;p&gt;145.254.112.66: added 48bit LBA routine (just for demonstration)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;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.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
;==============================================================================&lt;br /&gt;
;### IDE-HARDDISC-ROUTINES ####################################################&lt;br /&gt;
;==============================================================================&lt;br /&gt;
&lt;br /&gt;
ideprtsta   equ #fd0f           ;Portaddress + #f (Status/Command)&lt;br /&gt;
ideprtsdh   equ #fd0e           ;Portaddress + #e (SDH)&lt;br /&gt;
ideprtdat   equ #fd08           ;Portaddress + #8 (Data)&lt;br /&gt;
ideprterr   equ #fd09           ;Portaddress + #9 (Error)&lt;br /&gt;
ideprtdig   equ #fd06           ;Portaddress + #6 (Digital-Output)&lt;br /&gt;
&lt;br /&gt;
;### IDEADR -&amp;gt; set address&lt;br /&gt;
;### Input     HL=Track, E=Sector, D=SDH (head, drive, mode), B=number of sectors&lt;br /&gt;
;### Output    CF=0 -&amp;gt; ok&lt;br /&gt;
;###           CF=1 -&amp;gt; A=error code (...)&lt;br /&gt;
;### Destroyed AF,BC&lt;br /&gt;
ideadr  call ideadr0&lt;br /&gt;
        ret c&lt;br /&gt;
        dec c&lt;br /&gt;
        out (c),h           ;Track High&lt;br /&gt;
        dec c&lt;br /&gt;
        out (c),l           ;Track Low&lt;br /&gt;
        dec c&lt;br /&gt;
        out (c),e           ;Sector&lt;br /&gt;
        dec c&lt;br /&gt;
        out (c),a           ;number of Sectors&lt;br /&gt;
        ret&lt;br /&gt;
ideadr0 call iderdy&lt;br /&gt;
        ret c&lt;br /&gt;
        push bc&lt;br /&gt;
        ld bc,ideprtsdh&lt;br /&gt;
        out (c),d           ;write SDH-Register&lt;br /&gt;
        call iderdy&lt;br /&gt;
        jr c,ideadr1&lt;br /&gt;
        pop af              ;A=number of sectors&lt;br /&gt;
        or a&lt;br /&gt;
        ret&lt;br /&gt;
ideadr1 pop bc&lt;br /&gt;
        ret&lt;br /&gt;
&lt;br /&gt;
;### IDECMD -&amp;gt; Send command&lt;br /&gt;
;### Input     A=Command&lt;br /&gt;
;### Destroyed BC&lt;br /&gt;
idecmd  ld bc,ideprtsta&lt;br /&gt;
        out (c),a&lt;br /&gt;
        ret&lt;br /&gt;
&lt;br /&gt;
;### IDERDY -&amp;gt; Wait, until IDE-drive is ready for command&lt;br /&gt;
;### Output    CF=0 -&amp;gt; ok, CF=1 -&amp;gt; error (A=code)&lt;br /&gt;
;### Destroyed AF&lt;br /&gt;
iderdy  push bc&lt;br /&gt;
        push hl&lt;br /&gt;
        ld bc,ideprtsta&lt;br /&gt;
        ld hl,256*60&lt;br /&gt;
iderdy1 in a,(c)&lt;br /&gt;
        and #80&lt;br /&gt;
        jr z,iderdy2&lt;br /&gt;
        dec l&lt;br /&gt;
        jr nz,iderdy1&lt;br /&gt;
        call subslp&lt;br /&gt;
        dec h&lt;br /&gt;
        jr nz,iderdy1&lt;br /&gt;
iderdy3 ld a,stoerrabo&lt;br /&gt;
        scf&lt;br /&gt;
iderdy2 pop hl&lt;br /&gt;
        pop bc&lt;br /&gt;
        ret&lt;br /&gt;
&lt;br /&gt;
;### IDEDRQ -&amp;gt; wait for &amp;quot;Data Request&amp;quot;&lt;br /&gt;
;### Output    BC=Portnumber of the Status Register&lt;br /&gt;
;### Destroyed AF&lt;br /&gt;
idedrq  ld bc,ideprtsta&lt;br /&gt;
idedrq1 in a,(c)&lt;br /&gt;
        and #08&lt;br /&gt;
        jr z,idedrq1&lt;br /&gt;
        ret&lt;br /&gt;
&lt;br /&gt;
;### IDERED -&amp;gt; read 512Bytes&lt;br /&gt;
;### Input     HL=destination address&lt;br /&gt;
;### Output    HL=address behind destination&lt;br /&gt;
;### Destroyed AF,BC&lt;br /&gt;
idered  call idedrq&lt;br /&gt;
        ld bc,ideprtdat&lt;br /&gt;
        ld a,512/32&lt;br /&gt;
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&lt;br /&gt;
        ini:inc b:ini:inc b:ini:inc b:ini:inc b:ini:inc b:ini:inc b:ini:inc b:ini:inc b&lt;br /&gt;
        ini:inc b:ini:inc b:ini:inc b:ini:inc b:ini:inc b:ini:inc b:ini:inc b:ini:inc b&lt;br /&gt;
        ini:inc b:ini:inc b:ini:inc b:ini:inc b:ini:inc b:ini:inc b:ini:inc b:ini:inc b&lt;br /&gt;
        dec a&lt;br /&gt;
        jr nz,idered1&lt;br /&gt;
        ret&lt;br /&gt;
&lt;br /&gt;
;### IDEWRT -&amp;gt; write 512Bytes&lt;br /&gt;
;### Input     HL=source address&lt;br /&gt;
;### Output    HL=addresse behind source&lt;br /&gt;
;### Destroyed AF,BC&lt;br /&gt;
idewrt  call idedrq         ;wait for ready&lt;br /&gt;
        ld bc,ideprtdat     ;bc=IDE data port&lt;br /&gt;
        ld a,512/32&lt;br /&gt;
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&lt;br /&gt;
        inc b:outi:inc b:outi:inc b:outi:inc b:outi:inc b:outi:inc b:outi:inc b:outi:inc b:outi&lt;br /&gt;
        inc b:outi:inc b:outi:inc b:outi:inc b:outi:inc b:outi:inc b:outi:inc b:outi:inc b:outi&lt;br /&gt;
        inc b:outi:inc b:outi:inc b:outi:inc b:outi:inc b:outi:inc b:outi:inc b:outi:inc b:outi&lt;br /&gt;
        dec a&lt;br /&gt;
        jr nz,idewrt1&lt;br /&gt;
        ret&lt;br /&gt;
&lt;br /&gt;
;### IDEERR -&amp;gt; check error status&lt;br /&gt;
;### Output    CF=0 -&amp;gt; ok (A=0 everthing is fine, A=1 data needed to be corrected),&lt;br /&gt;
;###           CF=1 -&amp;gt; error (A=code, 6=error while read/write, 7=error while positioning, 8=abort, 9=unknown)&lt;br /&gt;
;### Destroyed BC&lt;br /&gt;
ideerr  ld bc,ideprtsta&lt;br /&gt;
        in a,(c)&lt;br /&gt;
        and 1+4&lt;br /&gt;
        ret z               ;CF=0, A=0 -&amp;gt; ok&lt;br /&gt;
        cp 4&lt;br /&gt;
        ld a,1              ;CF=0, A=1 -&amp;gt; ok, but with data correction&lt;br /&gt;
        ret z&lt;br /&gt;
        ld bc,ideprterr&lt;br /&gt;
        in a,(c)&lt;br /&gt;
        ld c,a&lt;br /&gt;
        ld b,6&lt;br /&gt;
        and 128+64          ;Sector unreadable/BadMarkedSector -&amp;gt; error while read/write&lt;br /&gt;
        jr nz,ideerr1&lt;br /&gt;
        ld a,c&lt;br /&gt;
        inc b&lt;br /&gt;
        and 2+16            ;Track0 not found/wrong SectorNum -&amp;gt; error while positioning&lt;br /&gt;
        jr nz,ideerr1&lt;br /&gt;
        inc b&lt;br /&gt;
        bit 2,c             ;Command Aborted -&amp;gt; abort&lt;br /&gt;
        jr nz,ideerr1&lt;br /&gt;
        inc b               ;everything else -&amp;gt; unknown&lt;br /&gt;
ideerr1 ld a,b&lt;br /&gt;
        scf&lt;br /&gt;
        ret&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;### IDE48B -&amp;gt; set 48bit address&lt;br /&gt;
;### Eingabe    IX[32-47],HL[16-31],DE[0-15]=Sectornumber, A=SDH, B=Number of Sectors&lt;br /&gt;
;### Output     CF=0 -&amp;gt; ok&lt;br /&gt;
;###            CF=1 -&amp;gt; A=error code (...)&lt;br /&gt;
;### Destroyed  AF,BC,DE&lt;br /&gt;
ide48b  push af         ;4&lt;br /&gt;
        call iderdy     ;    wait for ready before SDH write&lt;br /&gt;
        jr c,ide48b1    ;2&lt;br /&gt;
        pop af          ;3&lt;br /&gt;
        ld c,a          ;1&lt;br /&gt;
        push bc         ;4&lt;br /&gt;
        ld bc,ideprtsdh ;3&lt;br /&gt;
        or #0f          ;2&lt;br /&gt;
        dec a           ;1&lt;br /&gt;
        out (c),a       ;4   write SDH Register (low bytes)&lt;br /&gt;
        call iderdy     ;    wait for ready after SDH write (maybe this can be skipped)&lt;br /&gt;
        jr c,ide48b1    ;2&lt;br /&gt;
        dec c           ;1&lt;br /&gt;
        out (c),l       ;4      LBA 16-23&lt;br /&gt;
        dec c           ;1&lt;br /&gt;
        out (c),d       ;4      LBA 08-15&lt;br /&gt;
        dec c           ;1&lt;br /&gt;
        out (c),e       ;4      LBA 00-07&lt;br /&gt;
        ld bc,ideprtsdh ;3&lt;br /&gt;
        pop de          ;3&lt;br /&gt;
        inc e           ;1&lt;br /&gt;
        out (c),a       ;4   write SDH Register (high bytes)&lt;br /&gt;
        dec c           ;1&lt;br /&gt;
        db #dd:ld a,h   ;2&lt;br /&gt;
        out (c),a       ;4      LBA 40-47&lt;br /&gt;
        dec c           ;1&lt;br /&gt;
        db #dd:ld a,l   ;2&lt;br /&gt;
        out (c),a       ;4      LBA 32-39&lt;br /&gt;
        dec c           ;1&lt;br /&gt;
        out (c),h       ;4      LBA 24-31&lt;br /&gt;
        dec c           ;1&lt;br /&gt;
        out (c),d       ;4      Sector count&lt;br /&gt;
        ret             ;3 -&amp;gt; 79 microseconds&lt;br /&gt;
ide48b1 pop bc          ;Return on Error&lt;br /&gt;
        ret&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[Programming:SYMBiFACE_II|SYMBiFACE II documentations]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Programming]]&lt;/div&gt;</summary>
		<author><name>145.254.112.66</name></author>	</entry>

	</feed>