![]() |
Ищу процедуру выключения мотора дисковода.
У меня следующая ситуация: есть процедурка (почти идентичная оригинальной TR-DOS'ной - нету только проверки на кнопку Break) по определению наличия диска в дисководе.
Так вот. Как корректно отключить мотор дисковода, если диска в дисководе нету? Буду весьма признателен за куслчек кода :) |
Посмотри дизассемблер ПЗУ, я сейчас не помню адрес, она там есть. Загружаешь номер дисковода кажется в A и вызываешь ее через #3D2F.
Она там вызывается при входе в командный процессор (#3D00). |
Quote:
Code:
; ПРОЦЕДУРА из TRDOS 5.03 и выше |
То что нужно! Спасибо, уважаемые коллеги! :)
|
Кстати, интересно...
Во-первых, вижу комментарий "5.03 и выше". Разве в 5.01 не было? Она не останавливала дисковод? Во-вторых, ВГ93 использовалась кроме Спека практически во всех бытовых машинах. А как там с этим поступали? В схемах их контроллеров нет имитации IP. |
Quote:
Quote:
Этим битом и включается/выключается мотор. |
Еще у меня вопросец образовался.
Ситуация такая: В дисководах A и B стоят диски. В портах TR-DOS и FF записаны значения касающиеся дисковода A. Теперь нужно перенастроиться на дисковод B - выставить регистры дорожки и сектора в правильные значения для B. Как это сделать не используя команду Восстановление? |
Странный код честно говоря. Помню что когда мне надо было остановить привод я смотрел как это было сделано в BestView. Изза чего кстати он и не работает на R80 под которым я пишу преимущественно - он использует команду восстановления вслед за которой сразу же (!) без всяких пауз идёт команда экстренного безусловного останова. Почему не работает в эмулях - да всё просто - эмулятор в отличие от реала успевает выполнить эту команду %) восстановления. Помню что в своей View для гашения привода я использовал немного другой алгоритм - любой из реалов и эмулей отрабатывал это корректней чем алгоритм из BestView - вначале восстановление и сброс, затем позиционирование на ту дорожку, где головка находилась до команды восстановления и так же принудительный сброс. На самом деле мотор остановится ещё на первой команде, вторая нужна чтобы дурные эмуляторы не глючили.
Пауза же в BestView была, но только в процедуре определения диска в флопике - там так же даётся команда восстановления, вслед за которой - после паузы - запускается подпрограмма IN_1F, опять же лучше почитать статьи Ивана Рощина, как он это делал и из каких соображений задавалась пауза. Ага, вот счас специально посмотрел в своей п/п чтения дисков, завершалась она так: LD A,(#5CF5) AND A RRA ; задаётся номер физической дорожки LD C,#7F CALL OUTCA LD A,#18 ; команда позиционирования с загрузкой - бит h=1 LD C,#1F CALL OUTCA LD A,#D0 ; команда принудительного прерывания JP OUTCA и OUTCA LD IX,OUTC JP TO_DOS ; OUTC есть OUTC EQU #2A53 Ага, я похоже изменил алгоритм - вместо того чтобы два раза позиционироваться - вначале на нулевую потом на основную дорожку, сразу ставил позиционирование на основную дорожку. |
Ничего странного. Команда прерывания отключает мотор только при присутствии диска. Это багофича у ВГ93 такая - останов мотора происходит после прошествия скольких-то индексных импульсов.
Указанный код гарантированно формирует пачку импульсов на выводе IP. Для этого в контроллере диод стоит между каким-то из битов порта #FF и IP. |
А я :) как же я? :)
|
| All times are GMT +4. The time now is 21:32. |
Powered by vBulletin® Version 3.8.3
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.