Мои скромные железяки
Altair8800(в процессе)
ATARI 65хе
YAMAHA YIS503IIIR
PackardBell
HP Vectra 286/25n/VE/VL/VL800/VLi8, Kayak XA
AcerPower 433sv
Fujitsu-Siemens Scenic/S 2
Compaq deskpro en
МС 0511-01
Микро80(в процессе)
Микроком85
Апогей-БК01Ц
РадиоРК-86
БК0010/10-01/11/11М
ПК-8000
Львов ПК-01
Агат-9
ДВК-2(в процессе)
ДВК-3М
Вектор-06ц
Специалист
ХТ8088 nec-20
АТ286,386,486
PI-75-200ММХ
РII, III,IV
ZX-Evolution r.C3
Santaka-002
Дельта-С
Ленинград48к
[свернуть]
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
Владимир, я пошел по твоим стопам. Это на счет корпуса от Апогея.
Взял новенький в упаковке, такой же как у тебя, только синий. когда плату tnt23 пришлет, попробую воткнуть. только что FDD не хочу в корпус заводить, вдруг пригодиться для других моих компиков.
Мои скромные железяки
Altair8800(в процессе)
ATARI 65хе
YAMAHA YIS503IIIR
PackardBell
HP Vectra 286/25n/VE/VL/VL800/VLi8, Kayak XA
AcerPower 433sv
Fujitsu-Siemens Scenic/S 2
Compaq deskpro en
МС 0511-01
Микро80(в процессе)
Микроком85
Апогей-БК01Ц
РадиоРК-86
БК0010/10-01/11/11М
ПК-8000
Львов ПК-01
Агат-9
ДВК-2(в процессе)
ДВК-3М
Вектор-06ц
Специалист
ХТ8088 nec-20
АТ286,386,486
PI-75-200ММХ
РII, III,IV
ZX-Evolution r.C3
Santaka-002
Дельта-С
Ленинград48к
[свернуть]
Это отлично, т.к чем меньше всего есть для компьютера, тем он интереснее. А каких машин сейчас больше у пользователей, - МИКРОШ или АПОГЕЕВ?Сообщение от Ратмир
Вообще-то до этого был цикл ожидания RDY с ограничением времени в 2 секунды, чтобы спустя 2 секунды неготовности выдать надпись BAD SECTOR (или что-то подобное).Сообщение от Sancho45
Вы ввели просто паузу, удлинив п/п-мму READY до секунды. Это немного похоже на аппаратную задержку формирования сигнала READY из сигнала 'Device Select' на КМОП-вентилях, но есть существенное отличие, - если это сделано неграмотно, то это приведёт к торможению работы ДОС.
Вопрос в том, на каком исходнике Вы это делали и как. Нельзя ли "зыркнуть" на листинг?
Нежелательно это делать на оригинале Е.Седова. Потому что там нет флага о том, что колесо вращается, отчего любой вызов п/п-ммы READY будет длиться одинаково долго (секунду, что Вы отвели на раскрутку). А в варианте с эмуляцией, есть флаг PSKFLG, благодаря чему, вызов п/п READY только при невращающемся колесе длится долго, а последующие вызовы, когда колесо уже крутится, намного короче.
Если, как Вы пишете Вы ввели паузу до обслуживания READY, т.е до анализа флага PSKFLG, то это неправильно, т.к тормознёт. Но надо видеть листинг.
А чем Вас не устроил вариант с эмуляцией READY из сигнала INDEX? Работает ли это на реале, т.к проверялось только в эмуляторе? В эмуляторе есть разница в скорости реакции ДОС с аппаратным READY и ДОС с эмуляцией READY из сигнала INDEX. Разница в том, что в варианте с аппаратным READY реакция на команды быстрее. Вообще-то заметного торможения не должно быть, т.к при вызове READY при уже вращающемся колесе контроллируется только один оборот колеса, что тормозит на 0.2 секунды при каждом вызове. В принципе, можно убрать контроль на вращение колеса при повторных вызовах READY, т.е сразу же, если флаг PSKFLG выставлен, делать RET. Мне интересно, есть ли в реале такое торможение, потому что у меня в 90-тые такого не было. Т.е хочу знать это свойство эмулятора или реала.
о колесе
Но немного не так делается в BIOS CP/M. CP/M в отличие от RK-DOS ничего не знает о колесе и в ней нет подпрограммы OSTANOV. Это только RK-DOS после выполнения задачи, вызывает функцию OSTANOV и колесо останавливается. С БИС ВГ93 о пуске и останове колеса тоже заботиться не надо. Обычно (если сделано грамотно) для формирования сигнала старт, используют сигнал HLD (Head Load), который предназначен для пуска колеса и пуска магнита прижимающего головку к поверхности, или, (если КНГМД неграмотный), то используют одновибратор с константой на 4-5 секунд. Одновибратор, не нужен, т.к эту задержку даёт сам ВГ93, снимая спустя 4-5 секунд сигнал HLD. Потому при БИС ВГ93 в ДОС не требуется заботиться о колесе.
В CP/M на базе РК-КНГМД иначе. Здесь заботиться о колесе приходится программно. Задача в том, чтобы обеспечить останов колеса, если в течение 5 секунд не происходит обращения к дисководу. Понятно, что с таймером или прерываниями это легко решаемо. Но раз нет прерываний (т.к они истрачены на звук), то делается так. Вызов п/п-ммы READY запускает колесо, выставляет флаг PSKFLG и заносит в счётчик большое число. Естественно, READY в первый раз (т.е при входе в п/п-мму READY с сброшенным флагом PSKFLG и когда колесо не крутится), формируется спустя паузу (пауза, задержкой, если Вы так уж хотите) или спустя паузу на обнаружение того, что колесо вращается по импульсам на выходе INDEX. Но когда к READY обращаются после старта колеса, то паузы не происходит, т.к установлен флаг PSKFLG и возврат из READY происходит мгновенно.
Как останавливать колесо в ДОС, которые ничего не знают о РК-КНГМД, например CP/M? Для этого перед вызовом п/п-ммы F81B, которая является единственным интерфейсом с клавиатурой (STATUS тоже получают из неё, F812 не используется, т.к например, в РК86 она буферизована, что нам не надо) вставляется одна строчка CALL TICK (или CALL SYSTIK. В этой подпрограмме декрементируется тот большой счётчик, что был установлен по старту колеса. Когда ДОС закончила все дисковые процедуры, она возвращается к опросу клавиш, т.е начинается вызов в цикле п/п-ммы F81B, Обычно в цикле за секунду успевает произойти 1000....5000 вызовов F81B (в зависимсоти от такта и грамотности п/п-ммы опроса). При каждом вызове F81B счётчик уменьшается и через 5 секунд опроса F81B в цикле достигается ноль. Тогда вместо RET NZ, выполняется JMP OSTANOV и колесо останавливается.
К такой идее задержки приходится прибегать только, если в дисководе нет сигнала INDEX (например 5050, 5088), тогда нет ни самого сигнала READY, ни возможности его эмулировать из сигнала INDEX. Кстати, у меня как раз есть 5 таких дисководов и все без сигнала READY и INDEX, причём и сигнала TRK0 тоже нет (это фактически голая рама с мотором и улиткой). Такой дисковод стоил 200 USD в 1976 (для пересчёта на современные деньги надо умножить сумму на 5).
[свернуть]
Последний раз редактировалось barsik; 27.07.2017 в 06:48.
Вообще-то я так и написал :-
, что и есть ожидание RDY, и не 2 сек, а от FFFFh до 0000h в цикле(в сторону уменьшения), длительость цикла и такты не считал, но явно по ощущениям меньше 2-х сек.
вот фрагмет из ваших текстов:
Т.к. RDY припаян к земле, то из цикла выскакивает при первом проходе, а дисковод еще не готов !Код:READY: LD HL,0 RDYLOO: IN A,(0F1H) ; ***** LD A,(PORT+1) AND RDYMSK RET Z DEC HL LD A,H OR L JR NZ,RDYLOO LD A,3 JP PR_ERN ;────────────────────────────────────────────
Что я сделал :
Все тоже самое, только местами поменял и вместо 0000h-1 поставил 1FFFhКод:READY: LD HL,1FFFh RDYLOO: DEC HL LD A,H OR L JR NZ,RDYLOO IN A,(0F1H) ; ***** LD A,(PORT+1) AND RDYMSK RET Z LD A,3 JP PR_ERN ;────────────────────────────────────────────
Я просто дал время дисководу равное циклу 1FFFh для того что бы он был готов, и потом запрашиваю RDY и т.к. он на земле т.е. всегда готов и дисковод уже готов, то все работает и так же есть возможность аппаратной доработки сигнала(если не на земле а через хитрую схемку)
На счет раскрутки все равно надо 500мс, какая разница дос будет ждать раскрутки 500мс или просто ждать 500мс и потом читать RDY ?
Сигнал опрашивается один раз за сеанс , потом другие запросы , INDEX и тд. У меня все работает без тормозов, я не собираюсь тиражировать диски на микроше, что бы раз в сек опрашивать RDY, да и во всех программах что я просмотрел сигнал опрашивается один раз за сеанс при инициализации дисковода
- - - Добавлено - - -
Не правда. Причем тут RDY и BAD SECTOR. Здесь пишут,и у меня раньше было I/O ERR
Работа ,
не успел еще проверить ваш вариант.
Параллельно орион собираю.
И я вообще думал заменить проверку флага RDY на флаг INDEX
Но времени нет особо для отработки мыслей. Как время будет,попробую Ваш вариант и отпишусь.
Последний раз редактировалось Sancho45; 27.07.2017 в 04:39.
Sancho45, выложи свой вариант ПЗУ c задержкой перед RDY, проверю свои "нерабочие" флопы.
Ну да, как и описывалось, Вы ввели паузу на 0.5 секунды (кстати в счётчик времени ожидания HL загружается 0, т.к это было для ОРИОНА, который в 3-4 раза быстрее РК, в котором ожидание будет не 2 секунды, а в разы больше). Но эта пауза исполняется при каждом вызове п/п-ммы READY, тогда как она нужна только тогда, когда колесо не крутится. Если же колесо уже крутится, то пауза не нужна. На скорости чтения это не отразится, потому что при чтении сектора п/п-мма READY не вызывается, т.к ради ускорения, полагаются на то, что даже если первые попытки чтения, ещё при нераскрученном до номинальной скорости колесе, дадут ошибку, то это не важно, так как число попыток чтения велико.
Но, если Вы в редакторе текстов выполните поиск метки 'WRSKT:', то увидите, что при каждой записи сектора вызывается подпрограмма READY (т.к запись при нераскрученном колесе приводит к трагедии). Если средний размер игры 20 кб, т.е она имеет размер в 40 секторов по 512 байт, то вызов п/п-ммы READY 40 раз при копировании этого файла затормозит работу на 0.5 сек * 43 сектора (1 сектор в каталоге, 1 сектор во VTOC и 1 сектор Track/Sector LIST плюс число секторов самого файла) на 21.5 секунды. Если копируется диск 400 кб, где 800 секторов, то копирование затормозится на 400 секунд, т.е на 7 минут.
В CP/M и похожих ДОС нет развитой диагностики ошибок. Там всего 4 ошибки, отчего, когда что-то не так с дисководом, выдаётся сообщение "Bad Sector". Я привёл текст сообщения лишь примерно, как пример, что что-то подобное выдаётся. А сейчас посмотрел и обнаружил, что в RK-DOS ошибка с кодом 3 выдаёт текст "NO DISK", хотя лучше было бы выдавать текст, как в MSDOS "Drive Not Ready". Сообщение "I/O ERROR" у Вас было потому, что сигнал READY был заземлён, отчего колесо при чтении не успевало раскрутиться.Сообщение от Sancho45
А ещё один способ добиться чтения на НГМД без аппаратного сигнала READY заключается в том, чтобы в 3-4 раза увеличить число попыток чтения. Тогда надпись "I/O ERROR" будет выскакивать спустя минуту "долбёжки" дискеты. Это нехорошо тем, что тогда и при реальной дохлоте сектора, этот сектор будет пытаться считываться кучу раз, изнашивая головку дисковода.
Последний раз редактировалось barsik; 27.07.2017 в 06:53.
Когда разбирался с программированием дисковода, то пришёл к следующей схеме старта. Ориентироваться на READY бесполезно, т.к. зачастую он фэйковый ("34" на GND). Два раза даётся команда инициализации (именно два раза подряд, т.к. один раз почему-то не прокатывал, обнаружено эмпирически). Далее даётся команда перехода к целевому треку и ожидается её отработка по соотв. флагу ВГ93. Отработка означает, что по факту считан целевой номер трека, т.е. шпиндель 100% раскручен до нужной скорости (с трека читаются корректные данные). Боевой код получился ещё хитрее, т.к. пришлось вводить тайм-ауты на случай если READY тупо на земле, а в дисковод дискета не вставлена (в этом случае поиск целевого трека залипает до бесконечности).
Критиковать - значит объяснять автору, что он делает не так, как делал бы я, если бы умел
Эту тему просматривают: 2 (пользователей: 0 , гостей: 2)