Сабж.
Научите? :)
Читал статью Алко - как всегда бесполезно. А пример из Ревю вовсе запарывает диски скидывая кучу меджиков.
Всё что хочется, это подвигать головкой вперед-назад.
Вид для печати
Сабж.
Научите? :)
Читал статью Алко - как всегда бесполезно. А пример из Ревю вовсе запарывает диски скидывая кучу меджиков.
Всё что хочется, это подвигать головкой вперед-назад.
Можно через позиционирование сделать. Функция #02 у 3д13.
Напр:
Ld a,5 ; номер лог. дороги
Ld c,2
Call 3d13
Можешь дрыгать в конец диска, потом в начало и т.д.
Пс: люди умудрялись музыку делать дрыгая головой. Не знаю правда, как они делали. Может через 3д2ф. Но суть не меняется.
Штука в том что на ошибки оно не должно обращать внимание.
И команды нужны шаг вперед и назад, поскольку планируется вынуть мотор из дисковода... и использовать его для вращения кое-чего средствами спектрума.
Я в своё время взял из ZX-Ревю процедуру плавного зажигания лампочки и ставил туда разные частоты, так и получалась музыка. Думаю, остальные так же делали. Исходник ещё где-то лежит у меня. Головка там сама не двигается, только поднимается и опускается. Это опасно для механики, я один дисковод так разъюстировал. И работает не на всех дисководах, а на некоторых только при вставленной дискете.
кидать команды в порт вг - вообще не вопрос, в пзу трдос есть out (c),a:ret. тут важно разобраться, что и куда кидать;) для этого надо почитать даташит на вг.
Годная статья по программированию ВГ93 есть в журнале Радио 6/89, статья "Пользователям о корвете". Только надо адреса регистров перенести на ZX.
я видел такой, с поднимающейся-опускающейся. они правда существуют.
Ладно. Понял. Никто сабж никогда не делал и делать не умеет. Готовый пример ждать бесполезно.
newart, да многие делали и умеют..
Я вот например с тела. Отсюда мало че написать можно толкового.
У кого то ещё какие то сложности.
Ты поиск то делал хоть?
Есть тема типа список команд вг93.
Поищи. Там в конце есть ссылка на статью на zx.press про работу с вг93.
Там даже мне понятно всё стало.
Дай ссыль. Гляну
---------- 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
Если мы работаем именно с дисководом, на спектруме, то тут есть один момент. Дисковод будет двигать головками только в том случае, если включен мотор. Мотор включается в бетадиске несколько нестандартно. А именно, выставляется бит в команде seek - проверять положение МГ. Либо выполняется команда "восстановление", она всегда включает мотор. Когда мотор включен - будет работать команда "шаг". Перед командой шаг, надо во первых, загрузить правильно регистр дорожки правильным значением, и регистр данных нужным для перемещения значением.
в описании команды "шаг" ничего не говорится о регистре данных..
http://zxpress.ru/article.php?id=10374%20
кому верить?
советую запустить игрушку Sextris http://vtrdos.ru/full_ver/SEXTRIS.ZIP в 48ом режиме на реале.
вот ещё что обнаружил
http://zx.pk.ru/showthread.php?t=5716
плохой пример.. убивает дисковод..
лучше уж тогда это запускайте.. на реале естественно..
http://vtrdos.ru/gamez/m/MMIX2POS.ZIP
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", а потом использовал в других своих прогах. Могу выложить исходник, если кому-нибудь интересно.
Вот драйвер. Последняя версия.
Ассемблирование: ассемблер 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 и логику, связанную с их поддержкой. Это оказалось некрасивым архитектурным решением.
Вот такие дела.
под CP/M Profi обходился без библиотек, напрямую. ничего сложного там нет!
Doctor Max, ну покажи какой нить готовый продукт..
John North, их много есть.. ищите и обрящете... спросите у Syaman к примеру
Doctor Max, а у самого нет что ли под рукой?
нет, нету... к сожалению. а ёрничание про готовый продукт не к месту совершенно!
Doctor Max, это не «ёрничание» вообще то.. А просьба)