IDE vezérlő kártya

A kártya két szabvány 16 bites IDE csatornát valósít meg szabvány EP buszhoz illeszkedve (gép vagy buszbővítő), mivel az IDE szabvány 2 eszközt enged meg egy kábelen, így összesen 4 eszközt lehet csatlakoztatni egy kártyára (amikor készült, azt hittük, hogy majd pc-ből levetett 40 megás vinyókat fogunk használni halomszámra, sőt akár két kártya is lehet a géphez kötve...). A szoftver detektálja a kártyákat, aztán a kártyákra kötött valamennyi vinyót. Jelenleg max. 128GB-osok támogatva, kis programváltoztatással a következő verzióban 2 TB lesz a maximum. Ezután összegyűjti az összes vinyóról a FAT partíciókat egy saját táblázatba. (Elsődleges, kiterjesztett partíciók egyaránt támogatva). Ezekből a jelenlegi EXDOS korlátjai miatt (hiszen a FAT16 csak 1984 augusztusában jelent meg az IBM PC AT-hez - és az akkor hatalmas kapacitásúnak számító új 20 Megabyte-os HDD-hez - elkészült MS DOS 3.0-ban), csak a FAT12-esek használhatóak, ezeket egy megfelelő EXDOS bővítés segítségével be is láncolja a rendszerbe. Innentől F:, G:, stb meghajtókon szabadon lehet garázdálkodni. A kártya 4 portot hoz létre, alapállapotban ECH-EFH címeken, jumperrel máshova is állítható, a program a teljes E0H-EFH tartományban keresi, így elméletileg akár 4 kártya is lehetne egy géphez csatolva! (Amikor készült akkor még a PC-kből kidobott 20-40 megás merevlemezekre gondoltam, mint EP-sek számára elérhető vinyó, ezekből jó sok kéne...)
A kártya 0. portja az alsó 8 bit adatportja, az 1. a felső 8 bit portja, mivel az IDE busz számunkra sajnálatos módon 16 bites. A maradék két port 1-1 parancsport a kártya 2 csatlakozója számára. A parancsport alsó három bitje az IDE címbitek, a következő a CS0/CS1 címbit, következő kettő pedig az írás/olvasási jelek az IDE buszra. A maradék kettő kifelé nincs bekötve, befelé az IDE busz INT és PDIAG jele olvasható.
Az alsó 6 bit ki és bemenet össze van kötve, vagyis a parancsportokon visszaolvasható a legutóbb kiírt érték alsó 6 bitje. A szoftver ennek segítségével keresi meg a kártyát, az alsó 4 bitet (a maradék kettőt azért nem, hogy ne piszkálja az IDE buszt) végig teszteli 0-15 értékekkel, hogy visszaolvasható-e.

Írás az IDE buszra úgy történik, hogy a két 8 bites adatportra bekészítjük a 16 bites érték két darabját, a cím pedig a parancsportra megy, ahol az írás bit segítségével az egész egyszerre kikerül az IDE buszra.
Olvasás fordítva, a cím bitek és olvasás bit segítségével a parancsporton keresztül megtörténik az olvasási művelet az IDE buszon, a 16 bites érték eltárolódik a kártyán, és a két 8 bites adatporton kiolvasható.

Maga a merevlemezek programozása megtalálható az ATA szabványban. Jelenleg ebből számunkra az IDENTIFY DEVICE, INITIALIZE DEVICE PARAMETERS, READ SECTORS, READ MULTIPLE, WRITE SECTORS, WRITE MULTIPLE, SET MULTIPLE parancsok érdekesek.
A címzés elsősorban LBA módban történik, mivel maga a program is 32 bites LBA címzést használ belsőleg. Végszükség esetén, ha a vinyó nem támogatja (vagyis legalább vagy 10-12 éves...), akkor kerül átszámolásra CHS-re a cím.

Az IDE ROM parancsai
Paraméterek, minden esetben hexadecimális alakban, és megfelelő hosszban írandóak:

IDEINFO ss,aaaa
Megadott pufferbe másolja az IDE ROM-mal kapcsolatos információkat.
00: IDE bővítő ROM verziószáma (BCD),
01: IDE ROM szegmensszáma,
02: IDE RAM területének szegmensszáma,
03-04: RAM terület címe,
05: kontrollerek száma,
06: merevlemezek száma,
07: detektált partíciók száma.

IDEIDENTIFY ss,aaaa,d
A megadott pufferbe lekéri a megadott merevlemez 512 bájtos ATA azonosító blokkját, ebből megtudható a név, típus, méret, stb, részletes leírás az ATA szabványokban található.

IDEREAD ss,aaaa,d,nnnnnnnn,cc
Szektorok olvasása értelemszerű paraméterekkel.

IDEWRITE ss,aaaa,d,nnnnnnnn,cc
Szektorok írása, szintén értelemszerű paraméterekkel.

Az FDISK.BAS-ban megtekinthető a parancsok használata.

A kártya közvetlen programozása
Így néz ki a kártyák detektálása:



PDET








NEMZ

LD IX,VEGE    
LD C,0EFH    

CALL PDETECT
EI
CALL Z,PORT  
DEC C
BIT 1,C
JR NZ,NEMZ  
DEC C        
DEC C        
BIT 4,C
JR Z,PDET    

LD (IX),0    

LD (IX+1),55H
; felhasznált memória címe
; kártyák keresése az EF portról



; ha talált, akkor letároljuk


; két parancs port utám
; a két adat portot
; kihagyjuk

; DF-nél vége

; port lista lezárása
     
PDETECT:

PDETC

LD B,11110000B
DI
OUT (C),B
IN A,(C)
OR 11110000B

XOR B
RET NZ
INC B
JR NZ,PDETC

RET
 

Sajnos a NYÁK tervezése során történt egy kis baki, és az A1,A0 címvezeték fel lett cserélve. Mondjuk nagy gondot nem okoz, csak ennek megfelelően kellett definiálnom a konstansokat a programban.
Eredetileg az IDE-n 3 címbit van, és két Chip Select jel (ezek ha jól sejtem valami ősi MFM vezérlős időkből erednek...). Mivel a két CS jel közül úgyis csak az egyik van használva egyszerre, ezért ezt én egy újabb címbittel helyettesítettem. Ezek figyelembe vételével ezek a regisztercímek EP-n:

0000: Data
0010: Error / Features
0001: Sector Count
0011: Sector Number / LBA(7:0)
0100: Cylinder Low / LBA(15:8 )
0110: Cylinder High / LBA(23:16)
0101: Device/Head / LBA(27:24)
0111: Status / Command
1101: Alternate Status / Device Control
1111: Drive Address
(ez csak az ATA-1 szabványban szerepel, többiben mint elavult említik)

Nézzük meg, hogyan néz ki egy IDE regiszter írás/olvasás EP-n. Az egyszerűség kedvéért van definiálva egy rakás konstans:               

RD
WR
DATA
ERROR
PREC
FEAT
SC
SN
CLO
CHI
DRH
STAT
COM
ASTAT
DCON
DADR

equ 32
equ 16
equ 0
equ 2
equ 2
equ 2
equ 1
equ 3
equ 4
equ 6
equ 5
equ 7
equ 7
equ 13
equ 13
equ 15

;OLVASÁS
;ÍRÁS
;DATA
;ERROR
;PRECOMPENSATION
;FEATURES
;SECTOR COUNT
;SECTOR NUMBER
;CYLINDER LOW
;CYLINDER HIGH
;DRIVE/HEAD SELECT
;STATUS
;COMMAND
;ALTERNATE STATUS
;DEVICE CONTROL
;DRIVE ADDRESS

Ezek nagyrésze a korábban említett IDE regiszterek címei. Az RD konstans pedig a parancsport 4. bitjét nullázza, a WR pedig az 5. bitet. Ezzel tudjuk kiváltani az IDE buszon a megfelelő I/O műveletet. Használat után mindkettőt vissza kell állítani 1-re.

Ezekután egy konkrét példa: legyen a kártya az ECH-EFH címeken, és az EFH parancsporthoz tartozó vinyó adatportjára írjuk ki HL értékét.

LD C,0ECH
OUT (C),L
INC C
OUT (C),H
LD A,WR+DATA
LD C,0EFH
OUT (C),A
OR  WR+RD
OUT (C),A

; adatport alsó 8 bit

; adatport felső 8 bit

; írás művelet+a regiszter címe
; parancsport

; írás+olvasás bitek visszaállítása 1-re

Csak a DATA regiszter 16 bites, a többi esetén az adatport felső 8 bitjét nem kell kiküldeni.
Olvasás hasonlóképpen:

LD A,RD+DATA
LD C,0EFH
OUT (C),A
OR  WR+RD
OUT (C),A
LD C,0ECH
IN L,(C)
INC C
IN H,(C)

; olvasás művelet+a regiszter címe
; parancsport

; írás+olvasás bitek visszaállítása 1-re

; adatport alsó 8 bit

; adatport felső 8 bit

Szintén csak a DATA regiszternél kell a felső 8 bitet is kiolvasni.


Kapcsolási rajz, beültetési terv

A hardware-hez program is tartozik. Az 1.0-ás verziószámú IDE vezérlő program, 15 partíciót (F:-T:) tud kezelni.

IDE.ROM

A ROM 128K-nál több memória esetén saját szegmenst foglal, így nem fogy az értékes hely a rendszerszegmensben. Ehhez a módhoz EXOS 2.1-nél újabb kell, mert a 2.0 és a 2.1 bugos abban az esetben, ha nem a rendszerszegmensben kér a bővítő RAM-ot. Természetesen ellenőrzi az EXOS verziót.
Az UTIL rovatban letölthető olyan EXDOS-verzió, amely az E:, F:, B:, A: meghajtókon keres EXDOS.INI file-t.

Pár további IDE fotó, hogy ne csak a prototípusról legyen kép, illetve arról, hogy két kártya is lehet egyszerre a rendszerben:



Zozosoft