ZXNet эхоконференция «code.zx»


тема: Nemo HDD



от: Kirill Frolov
кому: Sergey Selev
дата: 02 Apr 2001
Hемедленно нажми на RESET, Sergey!

27 Mar 01 11:23, Sergey Selev wrote to All:

SS> Hужно описание портов сабжа.

Базовый адрес: %xxxxxxxx aaacc11h
21010 <- части адреса

x = любой бит
a = адресная часть регистра накопителя: a0, a1, a2
c = CSx выбор банка регистров 0/1.

h = если (1) то происходит запись/чтение из регистра хранящего
старшую половину шины адреса. При записис 16-битных чисел в
накопитель необходимо сначала записать старшую половину числа
в этот регистр (при этом значения _a_ и _c_ битов не важно),
а потом записать в нужный регистр младшую половину. При чтении
из накопителя 16-битных чисел после считывания из основного
регистра младшей половины можно из этого регистра считать
старшую часть числа.

Таким образом получается:

#xx10 младшая половина регистра данных
#xx30 регистр свойств и ошибок....
.....
#xxF0 регистр команд и статуса

#xxC8 альтернативный регистр статуса и управления устройством

Описание регистров смотри в доке на IDE интерфейс.

Вот пример (не тестированный, не работающий, не дописанный и вообще не
смотри на него):


=== Cut === file: nemo_hdd.inc


; nemo-hdd controller

ctlr equ 0xff08
ctlr equ 0xff10

has equ ctlr+0xc0
hdc equ ctlr+0xc0

hdr equ cmdr+0x00
her equ cmdr+0x20 ; r
hfr equ cmdr+0x20 ; w
hsc equ cmdr+0x40
hsn equ cmdr+0x60
hcl equ cmdr+0x80
hch equ cmdr+0xa0
hdh equ cmdr+0xc0
hsr equ cmdr+0xe0 ; r
hcr equ cmdr+0xe0 ; w

hdrh equ hdr+0x01

=== Cut ===


=== Cut === file: nemo_ctl.as


include nemo_hdd.inc

public idewrr, iderdr
public idewrb, iderdb
public idedev


; write DE to IDE register BC (get reg. addr. from nemo_hdd.inc etc...)

idewrr: inc c
out (c), d
dec c
out (c), e
ret


; read IDE register BC to DE

iderdr: in e, (c)
inc c
in d, (c)
dec c
ret


; read data block (512 bytes) in PIO mode from IDE device to (HL++)

iderdb: ld bc, hdr
ld a, 64

rdb1: ini
inc c
ini
dec c
ini
inc c
ini
dec c
ini
inc c
ini
dec c
ini
inc c
ini
dec c

dec a
jr nz, rdb1

ret


; write data block (512 bytes) in PIO mode to IDE device from (HL++)

idewrb: ld bc, hdr
ld a, 64

wrb1: inc hl
inc c
outd
dec c
outi
inc hl
inc hl
inc c
outd
dec c
outi
inc hl
inc hl
inc c
outd
dec c
outi
inc hl
inc hl
inc c
outd
dec c
outi
inc hl

dec a
jr nz, wrb1

ret

=== Cut ===



=== Cut === file: ide_comm.inc

; hdd commands

sbsy equ 0x80 ; status register masks
sdrdy equ 0x40
sdf equ 0x20
ssdc equ 0x10
sdrq equ 0x08
scorr equ 0x04
sidx equ 0x02
serr equ 0x01

mdev equ 0x10 ; head/dev register bits
mlba equ 0x40

hdiag equ 0x90 ; commands
hident equ 0xec
hinit equ 0x91
hnop equ 0x00
hrdbuf equ 0xe4
hread equ 0x20
hverify equ 0x40
hrecal equ 0x10
hseek equ 0x70
hfeaut equ 0xef
hwrbuf equ 0xe8
hwrsam equ 0xe9
hwrite equ 0x30

hstdby0 equ 0x94
hstdby1 equ 0xe0

hrdmult equ 0xc4
hwrmult equ 0xc5
hrdlong equ 0x22
hwrlong equ 0x32
hsetmul equ 0xc6

=== Cut ===


=== Cut === file: ide_comm.as


include ide_comm.inc

extrn idewrr, iderdr, idewrb, idewrb

public idebsy, iderdy, ide_dh, chslba, lbachs


; convert LBA to CHS
; dehl=lba address, de=CylinderSize, c=Sectors
; -> hl=cylinder, d=head, e=sector

; CylinderSize = Heads * Sectors
; CYL=LBA/CylinderSize temp1=LBA%CylinderSize
; HEAD=temp1/Sectors temp2=temp1%Sectors
; SEC=temp2+1
;

lbachs:

; hl=dehl(28bit)/de' hl'=dehl%de'

ld hl, 0
exx

add hl, hl
rl e
rl d
add hl, hl
rl e
rl d
add hl, hl
rl e
rl d
add hl, hl
rl e
rl d ; skip 4 bits (32-28)

ld b, 28
lbadiv1:
add hl, hl
rl e
rl d
exx
adc hl, hl
sbc hl, de
exx
jr nc, lbadiv2
exx
add hl, de
exx
dec l
ldadic2:
inc l
djnz lbadiv1

push hl ; store cylinder
exx ; hl=temp1

; hl=hl/c a=hl%c

ld b, 16
xor a
lbadiv3:
add hl, hl
rla
sbc a, c
jr nc, lbadiv4
add a, c
dec l
lbadiv4:
inc l
djnz lbadiv3

ld d, l ; head
inc a
ld e, a ; sector
pop hl ; cylinder
ret



; convert CHS to LBA
; hl=cylinder, d=head, e=sector, b=Heads, c=Sectors
; -> dehl=lba address

; LBA=(CYL*Heads+HEAD)*Sectors+SEC-1
;

chslba:
push de ; store head and sector
push bc ; store Sectors

ex de, hl ; de=cylinder
ld c, b ; c=Heads

; ahl=de*c

ld hl, 0
xor a
ld b, 8
chsmul1:
add hl, hl
adc a, a
rl c
jr nc, chsmul2
add hl, de
adc a, 0
chsmul2:
djnz chsmul1

pop bc ; c=Sectors
pop de ; d=head, e=sector
ld b, c
ld c, d
ld d, b
ld b, 0 ; bc=head, d=Sectors, e=sector
add hl, bc
adc a, 0

ex de, hl ; de=hl
exx
ld e, a
ld hl, 0
ld d, l ; de'=a
exx
ld c, l ; c=sector
ld a, h ; a=Sectors
ld hl, 0

; hl'hl=de'de*a

ld b, 8
chsmul3:
add hl, hl
exx
adc hl, hl
exx
rla
jr nc, chsmul4
add hl, de
exx
adc hl, de
exx
chsmul4:
djnz chsmul3

dec c ; bc=sector-1
add hl, bc
push hl
exx
ex de, hl
pop hl
rl e
rl d ; dehl=hl'hl+bc
ret



; set dev/head register (lba/chs mode, device and head)
; a=mode lba=1/chs=0, d=head , e=device

ide_dh: or a
jr z, idedh1
ld a, mlba
idedh1: bit 0, e
jr z, idedh2
or mdev
idedh2: or d
ld e, a
ld bc, hdh
jp idewrr



; wait while selected ide device is busy
; return a=status reg, cy=1 if timeout

idebsy: call itimer
ld (bsytm1), hl

bsyw: ld bc, has
call iderdr
ld a, e
and sbsy
ld a, e
ret z ; not busy now

push de
call itimer
ld de, 0
bsytm1 equ $-2
or a
sbc hl, de
ld de, idetio ; max. timeout
or a
sbc hl, de
pop de
jr c, bsyw

ld a, e
scf ; timeout
ret


; wait while selected ide device is not ready
; return a=status reg, cy=1 if timeout

iderdy: call itimer
ld (rdytm1), hl

rdyw: ld bc, hsr
call iderdr
ld a, e
and sdrdy
ld a, e
ret nz ; ready now

push de
call itimer
ld de, 0
rdytm1 equ $-2
or a
sbc hl, de
ld de, idetio ; max. timeout
or a
sbc hl, de
pop de
jr c, rdyw

ld a, e
scf ; timeout
ret

=== Cut ===

от: Sergey Zotov
кому: Denis Kitel
дата: 20 Apr 2001
On Sun 8 Apr 2001, Denis Kitel wrote:

DK>>> Попробуй у Hемо спроси. :)))
SS>> У него сети нет, насколько я знаю.
DK> И не будет никогда, этот г.Nemo почему-то против сетей, и
DK> порты винта не желает раскрывать, аргументируя это тем, что
DK> люди сразу-же начнут писать свои "левые" проги и драйвера,
DK> и начнётся всемирный хаос! :(
А ему от этого плохо станет?
Кста! Можно поковырять is-dos драйдера и выудить адреса, если кому очень надо.
Лично от KAY'ев не жарко не холодно. Бесит только одно: неужели в конце 20 века
нельзя было fdd контроллер на плате развести. Да еще и на 2 девайся only!

E-mail: zs80@nm.ru ~/ <~ http://www.zx.ru/zs/
ZXNet: 500:8462/1 /_ _> ftp://zx-museum.org.ru/zs/

от: Evgeny Poddubny
кому: Sergey Zotov
дата: 21 Apr 2001
Приветствую тебя, Sergey

Как-то Пятница 20 Апрель 2001 в 17:45:10 мылил
Sergey Zotov к Denis Kitel на тему Nemo HDD


DK>>>> Попробуй у Hемо спроси. :)))
SS>>> У него сети нет, насколько я знаю.
DK>> И не будет никогда, этот г.Nemo почему-то против сетей, и
DK>> порты винта не желает раскрывать, аргументируя это тем,
DK>> что
DK>> люди сразу-же начнут писать свои "левые" проги и драйвера,
DK>> и начнётся всемирный хаос! :(
SZ> А ему от этого плохо станет?
SZ> Кста! Можно поковырять is-dos драйдера и выудить адреса,
Hезачем фигней страдать - есть адреса:

═══════════════════ порты.tx.C ══════════════════

================== begin of file "NemoHDD .C" ==================
DATL EQU #10 ;10:Младший байт регистра данных
DATH EQU DATL+1 ;11:Старший байт регистра данных
ERRF EQU DATL+#20 ;31:Рг ошибок
SCNT EQU ERRF+#20 ;51:Рг счетчика сектора
SNMB EQU SCNT+#20 ;71:Рг н-ра сектора
CYLL EQU SNMB+#20 ;91:Рг н-ра цилиндра (младший)
CYLH EQU CYLL+#20 ;B1:Рг н-ра цилиндра (старший)
SDH EQU CYLH+#20 ;D1:Рг н-ра привода и головки
RSTA EQU SDH+#20 ;F1:Рг состояния
RCOM EQU RSTA ;F1:Рг команд
ASR EQU #C8 ;Alter Stat Rg
FDR EQU #C8 ;Fixed disk Rg
DIR EQU #E8 ;Dig In Rg
SYSR EQU #F8 ;сис рг

================== end of file "NemoHDD.C" ==================
.
════════════════════════════════════════════════



SZ> если кому очень надо. Лично от KAY'ев не жарко не холодно.
SZ> Бесит только одно: неужели в конце 20 века нельзя было fdd
SZ> контроллер на плате развести. Да еще и на 2 девайся only!



САЁ:НАРА, ДО:ДЗЕ О-ГЭНКИ-ДЭ, Evgeny Poddubny.

от: Stanislav Udin
кому: Sergey Zotov
дата: 01 May 2001
Привет Sergey!

30 Апр 01 01:31, Sergey Zotov -> Stanislav Udin:

SU>> Можно было, конечно, но Hемо pасчитывал потом сделать
SU>> отдельный контpоллеp HDD+FDD и вставлять в один слот.
SU>> Видимо что-то не сpослось y него.

SZ> И imho никогда теперь уже не срастется. А страдают юзеры данной
SZ> машины. :/

В любом случае два свободных слота в КАЕ - это больше, чем один свободный слот
в Скорпионе.

SZ>>> Да еще и на 2 девайся only!

SU>> А зачем больше?

SZ> У меня 2 пятерки и 1 тройка? Большинство имеют только пятерки, вот и
SZ> мне надо копировать в 5 на 5, т.к. даже имея винт на него все не
SZ> положишь. А тройко я пользуюсь для всязи с pc.

У меня Скорп и мне пришлось отказаться от одной пятерки в пользу тройки.
Вначале мучался, но затем привык пользоваться только двумя дисководами.

SZ> Hа мой желтый Скорп при поможи 2х микросхем было подвешало еще 2
SZ> дисковода к имевшимся 2м. А на KAY так можно сделать?

Понятия не имею :)



Stanislav




Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Конкурс - Конкурс N1: на лучшую графическую работу на тему Doom. Конкурс N2: на лучшую музыкальную работу REP, Hause, Tehcno.
Компьютерные пираты - Митник: преступление или жертва (продолжение).
Блиц-опрос - интервью с автором газеты ZX Time.
Реклама - Предлагаю дисковод МС 5305 - находу.
Реклама мессаги - Реклама с юмором.

В этот день...   26 апреля