Не работает. Ничего не происходит.
Вид для печати
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, первое, что в голову пришло)
-----------------------------------------------
Вот предлагаю фрагмент моего кода, который считывает с диска сектор. Это кусок прошивки ПЗУ, порты вг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 после сброса, а данная последовательность была найдена в ходе экспериментов и анализа других загрузчиков.
Вроде... на деле же если ввести 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 ----------
Ну и затея в целом провалилась, движок от дисковода очень слаб. Даже пол килограма усилия не делает.
ОБЧР не получился:)
Процедура инициализации проста. Сначала делаем ресет ВГ93, и потом сразу выполняем команду "немедленное прерывание". После этого ВГ93 выходит в нормальный режим приёма команд. Мотор включается (в бетадиске), когда в команде seek мы ставим бит "проверять положение МГ". Или в команде "восстановление" с аналогичным битом. Это бит означает, что ВГ93 после выполнения команды будет искать идентификатор (область заголовка) первого попавшегося сектора на текущем цилиндре (т.е. там, куда передвинутся головки). Из него она возьмет номер текущего цилиндра. Если номер не совпадает с тем, что было в регистре данных (т.е. куда хотели сдвинуть), то выставляется 4-й бит. После него надо сделать команду восстановление, что бы точно выйти на 0-й цилиндр.
А кто что думает про эти супер-пупер tubro процедуры?
http://www.zxpress.ru/article.php?id=3398
Я немного неточно написал, как включать мотор, сорри. В общем так, Включает мотор бит h (HLD). V - тоже может включать, если он не был включен до начала выполнения команды битом h, но включится мотор лишь в конце выполнения команды, что нам не на руку. В общем включать мотор надо битом h. В реальности приходится использовать их оба, одновременно, что бы удостовериться, что головки находятся там где надо.
Теперь про сброс ВГ93. После аппаратного reset, ВГ93 начинает выполнять команду "восстановление", пытаясь выдать до 256 импульсов на перемещение головок дисковода к цилиндру 0. Но биты h & v не выставляются. На бетадиске мотор не включается. И команда висит в (похоже) бесконечном цикле. Ещё году в 1997-м я исследовал этот вопрос, и анализируя описание и делая опыты, пришёл к выводу, что надо делать прерывание команды используя "немедленное прерывание" (биты в описании посмотрите).
Про те конкретные процедуры не смотрел, но скажу общий принцип. Код TR-DOS работает с контроллером относительно медленно, поэтому почти любая замена ему, написанная не криво, работает быстрее. Отсюда и "турбо". У меня есть свой драйвер диска "radisk" с процедурами чтения, записи и форматирования, который я изначально разработал для программы восстановления дисков "RAWR Restore", а потом использовал в других своих прогах. Могу выложить исходник, если кому-нибудь интересно.