Кстати для Микроши контроллер дисковода производился серийно.
Кстати для Микроши контроллер дисковода производился серийно.
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
Это отлично, т.к чем меньше всего есть для компьютера, тем он интереснее. А каких машин сейчас больше у пользователей, - МИКРОШ или АПОГЕЕВ?Сообщение от Ратмир
Вообще-то до этого был цикл ожидания 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.
Сделал.
Нет, ноль в оригиале Седова, счетчик идет на уменьшение , т.е. от 0000h -1 при первом проходе и до 0000h
Да, это так при записи, при чтении такого нет !
Гораздо меньше от 1FFFh до 0, в сторону уменьшения, другими словами от 0 до 1FFFh , что меньше 0.5 сек. Я так же взял в расчет, что проц выполняет и др п/п доса до проверки RDY, что тоже занимает время и в сумме с циклом дает необходимое время.
Все это в теории, но (см. выше, цикл для RDY меньше 0.5), игрушек по 20кб не так много и записывать их один раз , а не тиражировать).Да и так все работает без тормозов и очень быстро, 7 мин я ни разу не ждал (это перебор ))). Хотя и софта который мне интересен и на дискетку то не набралось))
- - - Добавлено - - -
Пожалуйста
dos29_delay_rdy.rar
константа для задержки со смещением 0D45 h от начала прошивки, там 00 1F, т.е. в нормальном порядке 1f00, что даже меньше чем я указал выше. можно сделать больше или меньше. Для микроши D3 C1 исправленно на D3 D1. Если кто на 86рк, то надо обратно D3 C1 со смщением 0DBE h от начала прошивки. И сигнал RDY со стороны контроллера на землю)
О результатах отпишитесь пожалуйста .
Последний раз редактировалось Sancho45; 27.07.2017 в 09:12.
Подскажите пожалуйста как мне лучше подсоединить плату НГМД к старой плате РК-86 в смысле разъема . И какие все-таки номиналы сопротивлений в плате НГМД.
Радио-86РК +375292940812
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)