Speccy - наш выбор!

Speccy - наш выбор! (http://zx-pk.ru/index.php)
-   Программирование (http://zx-pk.ru/forumdisplay.php?f=14)
-   -   Каким образом осуществляется опрос (http://zx-pk.ru/showthread.php?t=1898)

GriV 28th November 2005 18:28

Каким образом осуществляется опрос
 
внешних "быстрых" устройств?

Например, жёсткого диска??

Если брать стандартные

lab1:in a,(c)
rra
jr nz,lab1

in a,(c)
ld (hl),a
inc hl
jp lab1

в этом тексте даже проверки отсутствуют как таковые, но примерно получается
12+4+7+12+7+6+10 = 58 тактов, что даёт теоретическую скорость :D до 60 кб в секунду :D (именно потому слово "быстрые" в кавычках), или это делается как то иначе?

Conan 28th November 2005 22:06

Если говорить о HDD (ATA), то в далеком 94-м проблему ускорения передачи данных в конроллере IDE для ZX-Next я решил, расположив порты (для старшей и младшей половинок слова данных) в адресном пространстве так, что бы при выполнении команды INI (OUTI) они перебирались последовательно.
В результате на запись слова (16 бит) тратилось 44, а на чтение 32 такта (более 200К в секунду). В турборежиме еще быстрее.
Разумеется, если порт один (или расположены "вразнобой"), то особо не разгонишься...

CHRV 28th November 2005 22:48

Quote:

Originally Posted by Conan
Если говорить о HDD (ATA), то в далеком 94-м проблему ускорения передачи данных в конроллере IDE для ZX-Next я решил, расположив порты (для старшей и младшей половинок слова данных) в адресном пространстве так, что бы при выполнении команды INI (OUTI) они перебирались последовательно.
В результате на запись слова (16 бит) тратилось 44, а на чтение 32 такта (более 200К в секунду). В турборежиме еще быстрее.
Разумеется, если порт один (или расположены "вразнобой"), то особо не разгонишься...

Ага в АТМ так же сделано.

GriV 28th November 2005 23:15

Quote:

Originally Posted by Conan
Если говорить о HDD (ATA), то в далеком 94-м проблему ускорения передачи данных в конроллере IDE для ZX-Next я решил, расположив порты (для старшей и младшей половинок слова данных) в адресном пространстве так, что бы при выполнении команды INI (OUTI) они перебирались последовательно.
В результате на запись слова (16 бит) тратилось 44, а на чтение 32 такта (более 200К в секунду). В турборежиме еще быстрее.
Разумеется, если порт один (или расположены "вразнобой"), то особо не разгонишься...

Не понял, в смысле из-за уменьшения регистра B так?
т.е. если B=1F
C=FD
то первый outi шёл в 1ffd
а второй в 20fd
?

А нельзя как то повесть полублоковую обработку - т.е. скажем проц выдаёт на порт ожидание чтения
и затем каждая команда чтения соответвтующего порта создаёт автоматическое распознавание как готовность принять и соответственно контроллер выдаёт все данные сам??

Т.е. просто делает INIR на 256 значений
а перед ним идёт команда выбора сектора например ld bc,#fefe ld a,1 (команда чтения) out (с),a
и далее
ld hl,mem_addr
ld bc,#00fd
inir

тогда (псевдоблоковый обмен) скокрость бы была очень приличная.

При чтении портов формируется IORQ - вместе с адресом чисто теоретически можно вроде сделать такой контроллер?

Просто логика в том, что от жёсткого диска в таком случае прирост не столь очевидный (кроме конечно же объяма и надёжности) - в лучшем случае в 10 раз быстрее по сравнению с бетой.

А вот если использовать представленную схему получается условно 21 такт на один байт - уже скорость получается приличная, а для турбы так вообще.

А можно и так

взять 256 команд

INI

а перед ними та же строчка инициализации - получается 16 тактов на байт (быстрее программно нельзя - ограничение аппаратуры), итого порядка 200 кб для обыкновенного режима, 400 кб для турбы!!!

Conan 29th November 2005 00:43

Quote:

Originally Posted by GriV
Не понял, в смысле из-за уменьшения регистра B так?

Да, именно так.
Quote:

Originally Posted by GriV
т.е. если B=1F
C=FD
то первый outi шёл в 1ffd
а второй в 20fd
?

Все верно, только адреса портов были другие.
Quote:

Originally Posted by GriV
и затем каждая команда чтения соответвтующего порта создаёт автоматическое распознавание как готовность принять и соответственно контроллер выдаёт все данные сам??

Ничего там не надо городить: последовательное расположение портов, это банальная дешифрация, в которой задействован A8 (он выбирает старший/младший разряды слова данных для IDE). Адреса старше A8 - не используем.

Quote:

Originally Posted by GriV
А можно и так
взять 256 команд
INI
а перед ними та же строчка инициализации - получается 16 тактов на байт (быстрее программно нельзя - ограничение аппаратуры), итого порядка 200 кб для обыкновенного режима, 400 кб для турбы!!!

Так и было сделано. 32 такта на слово это и есть 16 тактов на байт. Только не надо обольщаться насчет турборежима: скорость будет зависеть от конкретной реализации, ибо есть еще и торможение при работе с ОЗУ, а для некоторых клонов и при операциях ввода/вывода.

jtn 29th November 2005 01:43

Ага! ну начнем-с по порядку:
1) никаких ожиданий делать не нужно - сектор (512б) из хдд/цдд читается и пишется и так на мах без задержек и проверок.
2) реализация контроллеров бывает разная. в худшем случае это полсотни тыщ байт в секунду (хуже только флоповод уж будет=), а лучшая это 200кб в сек без турбо и 400кб с турбо (в пзу/теневом озу 200%). именно так было сделано в моем контроллере и контроллере спринтера, т.е. чтение - 512 команд ini (или 2 inir) и запись 512 штук outi (два otir). причем спринтеровский вариант несколько проще =)
3) в очередной раз напоминаю - в командах outi,otir,outd,otdr сначала декрементируется рег.B и только потом пишется в порт.
не стоит заново поднимать этот вопрос, на форуме он уже активно обсуждался =)

GriV 29th November 2005 08:46

Quote:

Originally Posted by jtn
не стоит заново поднимать этот вопрос, на форуме он уже активно обсуждался =)

ух ты а где обсуждался?

jtn 29th November 2005 10:55

Quote:

Originally Posted by jtn
не стоит заново поднимать этот вопрос, на форуме он уже активно обсуждался =)

я про третий пункт
http://www.zx.pk.ru/showthread.php?t=1360&page=9&pp=10

GriV 10th December 2005 10:25

Т.е. получается
 
что жёсткий диск больше половины своего времени просто простаивает? Я бы даже более сказал - самый захудалый винт даёт скорость 10 метров в сек - а здесь скорость максимум (в лучше случае, при хорошо собранной схеме и отлаженной программе) - 400 кб в секунду (да и то в теории)??? Это ж... 4% эффективность от пиковой (для захудалого винта)!!!! А использовать в контроллерах режим DMA никто не пробовал? уж больно программный режим непроизводительный...

SMT 10th December 2005 12:37

Quote:

Originally Posted by GriV
Я бы даже более сказал - самый захудалый винт даёт скорость 10 метров в сек

какие РУ5 потянут 10 м/с, с одновременным обслуживанием видео и процессора :) даже с контроллером DMA (тогда что уж, можно и контроллер прерываний одновременно вешать, чтобы 1 раз комп курочить) 1.75 м/с для винта маловато, и это будет уже не спектрум


All times are GMT +4. The time now is 15:07.

Powered by vBulletin® Version 3.8.3
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.