Вход

Просмотр полной версии : Перемещение головки дисковода



newart
03.02.2012, 09:22
Сабж.

Научите? :)

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

Всё что хочется, это подвигать головкой вперед-назад.

John North
03.02.2012, 09:40
Можно через позиционирование сделать. Функция #02 у 3д13.
Напр:

Ld a,5 ; номер лог. дороги
Ld c,2
Call 3d13

Можешь дрыгать в конец диска, потом в начало и т.д.

Пс: люди умудрялись музыку делать дрыгая головой. Не знаю правда, как они делали. Может через 3д2ф. Но суть не меняется.

newart
03.02.2012, 09:48
Штука в том что на ошибки оно не должно обращать внимание.

И команды нужны шаг вперед и назад, поскольку планируется вынуть мотор из дисковода... и использовать его для вращения кое-чего средствами спектрума.

alone
03.02.2012, 10:10
люди умудрялись музыку делать дрыгая головой. Не знаю правда, как они делали. Может через 3д2ф.
Я в своё время взял из ZX-Ревю процедуру плавного зажигания лампочки и ставил туда разные частоты, так и получалась музыка. Думаю, остальные так же делали. Исходник ещё где-то лежит у меня. Головка там сама не двигается, только поднимается и опускается. Это опасно для механики, я один дисковод так разъюстировал. И работает не на всех дисководах, а на некоторых только при вставленной дискете.

Vadim
03.02.2012, 10:18
И команды нужны шаг вперед и назад, поскольку планируется вынуть мотор из дисковода... и использовать его для вращения кое-чего средствами спектрума.

Если есть прямой доступ к ВГ93, то не вопрос. Используй команды и всё. Если доступа нет, тогда не знаю. На профике это написать - пара путсяков.

psb
03.02.2012, 12:09
кидать команды в порт вг - вообще не вопрос, в пзу трдос есть out (c),a:ret. тут важно разобраться, что и куда кидать;) для этого надо почитать даташит на вг.

BYTEMAN
03.02.2012, 12:18
Годная статья по программированию ВГ93 есть в журнале Радио 6/89, статья "Пользователям о корвете". Только надо адреса регистров перенести на ZX.

Titus
03.02.2012, 14:55
Головка там сама не двигается, только поднимается и опускается. Это опасно для механики, я один дисковод так разъюстировал. И работает не на всех дисководах, а на некоторых только при вставленной дискете.
Поднимается и опускается - это что-то новенькое) Расскажи, не знал, что кроме шагового двигателя там есть еще что-то управляющее головкой) Подскажи модель дисковода)

psb
03.02.2012, 15:24
я видел такой, с поднимающейся-опускающейся. они правда существуют.

Vadim
03.02.2012, 15:47
Расскажи, не знал, что кроме шагового двигателя там есть еще что-то управляющее головкой) Подскажи модель дисковода)
МС5305 называется. В даташитах на ВГ фигурирует бит "загрузка головки", задержка 15ms на задержку. Именно для этого оно и надо. В FD-55 вроде такого нет (там магнитиком отодвигался планка и головка прижималась, убираем ток, обратно подъём).

newart
03.02.2012, 19:12
Ладно. Понял. Никто сабж никогда не делал и делать не умеет. Готовый пример ждать бесполезно.

BYTEMAN
03.02.2012, 19:23
МС5305 называется. В даташитах на ВГ фигурирует бит "загрузка головки", задержка 15ms на задержку. Именно для этого оно и надо. В FD-55 вроде такого нет (там магнитиком отодвигался планка и головка прижималась, убираем ток, обратно подъём).
Ещё 5311. Там тоже электромагнит.

---------- Post added at 18:23 ---------- Previous post was at 18:23 ----------


Ладно. Понял. Никто сабж никогда не делал и делать не умеет. Готовый пример ждать бесполезно.
Ага, тебе сразу готовенькое подавай :)

John North
03.02.2012, 20:16
newart, да многие делали и умеют..
Я вот например с тела. Отсюда мало че написать можно толкового.
У кого то ещё какие то сложности.
Ты поиск то делал хоть?
Есть тема типа список команд вг93.
Поищи. Там в конце есть ссылка на статью на zx.press про работу с вг93.
Там даже мне понятно всё стало.

newart
03.02.2012, 20:17
Ты поиск то делал хоть?
Я его брал из Ревю - не работает.

John North
03.02.2012, 21:09
Дай ссыль. Гляну

---------- Post added at 21:09 ---------- Previous post was at 20:32 ----------

короче от балды.. на скорую руку так сказать.. если че, поправьте..

ld a,#0f
ld c,#1f
ld hl,2a53
call dos ; команда "восстонавление" (на всякий случай)

ld b,#10 ; количество шагов
m1:
ld a,#5f ; команда "вперед" ; #7f - команда назад
ld c,#1f
ld hl,#2a53
call dos
djnz m1
ret

dos:
push hl
jp #3d2f

Vadim
03.02.2012, 21:13
Я его брал из Ревю - не работает.
Если мы работаем именно с дисководом, на спектруме, то тут есть один момент. Дисковод будет двигать головками только в том случае, если включен мотор. Мотор включается в бетадиске несколько нестандартно. А именно, выставляется бит в команде seek - проверять положение МГ. Либо выполняется команда "восстановление", она всегда включает мотор. Когда мотор включен - будет работать команда "шаг". Перед командой шаг, надо во первых, загрузить правильно регистр дорожки правильным значением, и регистр данных нужным для перемещения значением.

John North
03.02.2012, 21:20
Перед командой шаг, надо во первых, загрузить правильно регистр дорожки правильным значением, и регистр данных нужным для перемещения значением.
в описании команды "шаг" ничего не говорится о регистре данных..
http://zxpress.ru/article.php?id=10374%20

кому верить?

goodboy
03.02.2012, 21:51
советую запустить игрушку Sextris http://vtrdos.ru/full_ver/SEXTRIS.ZIP в 48ом режиме на реале.

вот ещё что обнаружил
http://zx.pk.ru/showthread.php?t=5716

John North
03.02.2012, 23:04
советую запустить игрушку Sextris

в 48ом режиме на реале.
плохой пример.. убивает дисковод..

лучше уж тогда это запускайте.. на реале естественно..
http://vtrdos.ru/gamez/m/MMIX2POS.ZIP

Vadim
03.02.2012, 23:04
в описании команды "шаг" ничего не говорится о регистре данных..
Аааа, ну да, перепутал с seek. Шаг работает без этого регистра. Seek делает перемещение на разницу.

newart
04.02.2012, 02:32
короче от балды.. на скорую руку так сказать.. если че, поправьте..
Не работает. Ничего не происходит.

John North
04.02.2012, 09:49
newart, ты какой то странный..
Я у тебя ссыль попросил на ревю с твоим не рабочим примером.
Дай!

---------- Post added at 09:49 ---------- Previous post was at 08:22 ----------

--------------------------------------
вобщем вот.. проверял на реале, вроде работает

-----------------------------------------------
ld a,#0c
ld c,#ff
ld hl,#2a53
call dos
call beep ; настройка на дисковод А

ld a,#0c
ld c,#1f
ld hl,#2a53
call dos
call beep ; команда "восстановление"

ld b,#20 ; количество "шагов"
M1:
push bc
ld a,#5c ; код команды "шаг вперед" (#7c -"назад")
ld c,#1f
ld hl,#2a53
call dos
call beep
pop bc
djnz M1
ret

dos:
push hl
jp #3d2f

beep:
ld hl,1646
ld de,26
call 949
ret
-----------------------------------------------

call beep -это пауза. сделал через beep, первое, что в голову пришло)
-----------------------------------------------

Barmaley_m
04.02.2012, 09:50
Вот предлагаю фрагмент моего кода, который считывает с диска сектор. Это кусок прошивки ПЗУ, порты вг93 в ней открыты, поэтому программа обращается к ним напрямую, а если действовать через тр-дос - то надо пользоваться соответствующими точками входа.


RDBOOT: DI
LD A,00011000B
OUT (0FFH),A
LD A,00111100B
OUT (0FFH),A
LD HL,300
CALL PAUSE
LD A,0D0H
OUT (1FH),A
LD HL,1000
CALL PAUSE
LD A,8
OUT (1FH),A
CALL WT_IRQ
LD A,9
OUT (5FH),A
LD HL,5D25H
LD A,80H
OUT (1FH),A
LD C,7FH
CALL DMA_RD
LD A,B
OR A
JP Z,B_ERR
IN A,(1FH)
AND 1FH
JP NZ,B_ERR
RET

PAUSE: PUSH AF
PAU_0: DEC HL
LD A,H
OR L
JR NZ,PAU_0
POP AF
RET

DMA_RD: LD B,3
DRD1: IN A,(0FFH)
AND 0C0H
JR NZ,DRD2
INC DE
LD A,E
OR D
JR NZ,DRD1
DJNZ DRD1
RET
WT_IRQ: IN A,(0FFH)
AND 0C0H
JP Z,WT_IRQ
RET M
DRD2: INI
JP WT_IRQ

Обращаю внимание, что шаманская последовательность команд на вг93 (сначала вывод в порт FF, потом пауза, потом D0, потом опять пауза, потом 8) является критичной, если ее нарушить - то мотор дисковода не включается и вообще ничего не происходит. Нигде в датащитах я не видел описания того, как надо "пинать" вг93 после сброса, а данная последовательность была найдена в ходе экспериментов и анализа других загрузчиков.

newart
06.02.2012, 03:00
вобщем вот.. проверял на реале, вроде работает
Вроде... на деле же если ввести 100 шагов, то он делает 10 шагов, а если 255 то 28.
Если меньше 15 то вообще не двигается.

И всегда по окончанию программы делает 1 шаг назад.

---------- Post added at 02:50 ---------- Previous post was at 02:10 ----------

Подобрал подходящую паузу. Но двигаться можно только в одну сторону.
Поскольку если головка стоит на нуле то двигатель не делает шагов, если головку отодвинуть от нуля, то двигатель принудительно пытается отогнать ее на ноль (вращая мотор) и уже потом делает нужное кол-во шагов (от которых проку мало ибо двигатель уже хз сколько раз прокрутился вокруг оси).

---------- Post added at 03:00 ---------- Previous post was at 02:50 ----------

Ну и затея в целом провалилась, движок от дисковода очень слаб. Даже пол килограма усилия не делает.

Vitamin
06.02.2012, 07:47
ОБЧР не получился:)

Vadim
06.02.2012, 11:57
Нигде в датащитах я не видел описания того, как надо "пинать" вг93 после сброса, а данная последовательность была найдена в ходе экспериментов и анализа других загрузчиков.
Процедура инициализации проста. Сначала делаем ресет ВГ93, и потом сразу выполняем команду "немедленное прерывание". После этого ВГ93 выходит в нормальный режим приёма команд. Мотор включается (в бетадиске), когда в команде seek мы ставим бит "проверять положение МГ". Или в команде "восстановление" с аналогичным битом. Это бит означает, что ВГ93 после выполнения команды будет искать идентификатор (область заголовка) первого попавшегося сектора на текущем цилиндре (т.е. там, куда передвинутся головки). Из него она возьмет номер текущего цилиндра. Если номер не совпадает с тем, что было в регистре данных (т.е. куда хотели сдвинуть), то выставляется 4-й бит. После него надо сделать команду восстановление, что бы точно выйти на 0-й цилиндр.

newart
08.02.2012, 04:32
А кто что думает про эти супер-пупер tubro процедуры?

http://www.zxpress.ru/article.php?id=3398

Killer
08.02.2012, 16:25
А кто что думает про эти супер-пупер tubro процедуры?

http://www.zxpress.ru/article.php?id=3398
Кое что из этого использовал. Так называемый КвикЛоадер.

Vadim
08.02.2012, 18:40
Я немного неточно написал, как включать мотор, сорри. В общем так, Включает мотор бит h (HLD). V - тоже может включать, если он не был включен до начала выполнения команды битом h, но включится мотор лишь в конце выполнения команды, что нам не на руку. В общем включать мотор надо битом h. В реальности приходится использовать их оба, одновременно, что бы удостовериться, что головки находятся там где надо.
Теперь про сброс ВГ93. После аппаратного reset, ВГ93 начинает выполнять команду "восстановление", пытаясь выдать до 256 импульсов на перемещение головок дисковода к цилиндру 0. Но биты h & v не выставляются. На бетадиске мотор не включается. И команда висит в (похоже) бесконечном цикле. Ещё году в 1997-м я исследовал этот вопрос, и анализируя описание и делая опыты, пришёл к выводу, что надо делать прерывание команды используя "немедленное прерывание" (биты в описании посмотрите).

Barmaley_m
26.02.2012, 11:55
А кто что думает про эти супер-пупер tubro процедуры?
Про те конкретные процедуры не смотрел, но скажу общий принцип. Код TR-DOS работает с контроллером относительно медленно, поэтому почти любая замена ему, написанная не криво, работает быстрее. Отсюда и "турбо". У меня есть свой драйвер диска "radisk" с процедурами чтения, записи и форматирования, который я изначально разработал для программы восстановления дисков "RAWR Restore", а потом использовал в других своих прогах. Могу выложить исходник, если кому-нибудь интересно.

Protom
26.02.2012, 20:34
Про те конкретные процедуры не смотрел, но скажу общий принцип. Код TR-DOS работает с контроллером относительно медленно, поэтому почти любая замена ему, написанная не криво, работает быстрее. Отсюда и "турбо". У меня есть свой драйвер диска "radisk" с процедурами чтения, записи и форматирования, который я изначально разработал для программы восстановления дисков "RAWR Restore", а потом использовал в других своих прогах. Могу выложить исходник, если кому-нибудь интересно.

Да интересно!

Barmaley_m
29.02.2012, 14:09
Вот драйвер. Последняя версия.

Ассемблирование: ассемблер M80 под CP/M

Использование:

Константы:

FORTABL - адрес размещения таблицы форматирования. Таблица занимает около 6400 байт (уточняйте по исходнику). Необходима для форматирования дорожек, содержит образ дорожки со всеми служебными полями и пропусками.

CP_M - доступ к портам контроллера напрямую (когда CP_M=1) или через точки входа TR-DOS (CP_M=0). Для отладки я использовал значение 1, при выпуске программ - значение 0.

Точки входа:
INIALL - инициализация дисковода. Вызывать один раз при первом использовании данного дисковода. Выполняет сброс контроллера ВГ93, запускает мотор дисковода и переводит головку на дорожку 0. Только что посмотрел: данная функция выполняет сброс контроллера дважды (баг), так что рекомендуется исправить.

DRIVE - выбор дисковода. Вход: регистр A - номер дисковода (0-3).

READGR - чтение группы секторов. Вход: HL - адрес в памяти, куда читать; D - номер дорожки начала чтения (0-159), E - номер сектора начала чтения (00-FF); B - количество секторов (00-FF); при B=0 читается 256 секторов.

Выход: переменная ERR_CO содержит код ошибки. 0 - нет ошибки, 1 - no disk, 2 - Write protect, 3 - Break key pressed, 4 - Data error (SNF/CRC)

READGR корректно обрабатывает ситуацию нестандартной длины секторов. При заданном количестве секторов =1 может быть прочитан сектор любого размера с дорожки нестандартного формата, при этом в HL будет адрес, следующий за последним считанным байтом. Если количество секторов (B) больше одного, то программа считает, что на одной дорожке 16 секторов. Поэтому множественное считывание дорожек с нестандартным форматом в некоторой степени неполноценно.

WRITGR - запись группы секторов. Входы и выходы аналогичны READGR.

BUILD - подготовка таблицы форматирования. Вход: IX - адрес таблицы требуемого формата (номера и размеры секторов - забыл точно, надо смотреть исходники RRESTORE);

FORM_TRK - форматирование дорожки. A - номер дорожки (0-159).

Подход, который я реализовал в FORM_TRK и BUILD, позволяет форматировать диск с повышенной скоростью. Большинство программ (таких как ADS) при форматировании каждой дорожки строят в памяти образ дорожки, которая имеет размер более 6кБ. На это уходит процессорное время, за которое диск проходит индексную метку. Приходится ждать еще один оборот диска, прежде чем начнется форматирование. Мой же драйвер сначала, перед форматированием всего диска, подготавливает образ дорожки (BUILD), а потом, для каждой дорожки, лишь модифицирует его (FORM_TRK). Подготовка образа дорожки таким образом завершается до прохода индексного отверстия диска, что сберегает один оборот диска при форматировании и повышает скорость форматирования/восстановления.

RETRY и IGNORE - подпрограммы, которые вызываются в случае завершения READGR или WRITGR с ошибками. Изначально предполагалось, что вызов этих подпрограмм продолжит прерванную процедуру чтения/записи (RETRY) или пропустит сектор и потом продолжит (IGNORE). На практике я никогда не пользовался этими функциями; возможно, они содержат баги. Тем, кто будет творчески перерабатывать мой драйвер, рекомендую выкинуть оттуда процедуры RETRY, IGNORE и логику, связанную с их поддержкой. Это оказалось некрасивым архитектурным решением.

Вот такие дела.

Doctor Max
29.02.2012, 16:08
под CP/M Profi обходился без библиотек, напрямую. ничего сложного там нет!

John North
29.02.2012, 21:37
Doctor Max, ну покажи какой нить готовый продукт..

Doctor Max
29.02.2012, 21:41
John North, их много есть.. ищите и обрящете... спросите у Syaman к примеру

John North
29.02.2012, 21:43
Doctor Max, а у самого нет что ли под рукой?

Doctor Max
01.03.2012, 19:02
нет, нету... к сожалению. а ёрничание про готовый продукт не к месту совершенно!

John North
01.03.2012, 20:48
Doctor Max, это не «ёрничание» вообще то.. А просьба)