Просмотр полной версии : Ищу процедуру выключения мотора дисковода.
Evgeny Muchkin
02.08.2007, 02:20
У меня следующая ситуация: есть процедурка (почти идентичная оригинальной TR-DOS'ной - нету только проверки на кнопку Break) по определению наличия диска в дисководе.
Так вот. Как корректно отключить мотор дисковода, если диска в дисководе нету?
Буду весьма признателен за куслчек кода :)
Посмотри дизассемблер ПЗУ, я сейчас не помню адрес, она там есть. Загружаешь номер дисковода кажется в A и вызываешь ее через #3D2F.
Она там вызывается при входе в командный процессор (#3D00).
Посмотри дизассемблер ПЗУ, я сейчас не помню адрес, она там есть. Загружаешь номер дисковода кажется в A и вызываешь ее через #3D2F.
Вот она:
; ПРОЦЕДУРА из TRDOS 5.03 и выше
; ИММИТАЦИЯ УСТАНОВКИ ДИСКА ДЛЯ ОТКЛЮЧЕНИЯ
; МОТОРА ДИСКОВОДА
; В (A) код определяющий номер дисковода:
; 0 - A:, 1 - B:, 2 - C:, 3 - D:
L02B9: LD B,32 ;32/2 ИМПУЛЬСА ПО INDEX
L02BB: PUSH BC
XOR 1000B ;ИНВЕРСИЯ INDEX
OUT (FDCUP),A
PUSH AF
LD A,5
CALL DELA ;ПАУЗА DT*5
POP AF
POP BC
DJNZ L02BB ;ПОВТОРЯТЬ 32 РАЗА
RET
Evgeny Muchkin
02.08.2007, 11:58
То что нужно! Спасибо, уважаемые коллеги! :)
Кстати, интересно...
Во-первых, вижу комментарий "5.03 и выше". Разве в 5.01 не было? Она не останавливала дисковод?
Во-вторых, ВГ93 использовалась кроме Спека практически во всех бытовых машинах. А как там с этим поступали? В схемах их контроллеров нет имитации IP.
Кстати, интересно...
Во-первых, вижу комментарий "5.03 и выше". Разве в 5.01 не было? Она не останавливала дисковод?В версии 5.01 эта же процедура расположена с адреса 02ABh.
Во-вторых, ВГ93 использовалась кроме Спека практически во всех бытовых машинах. А как там с этим поступали? В схемах их контроллеров нет имитации IP.Например в контроллере Корвета, для управления мотором есть отдельный бит в управляющем регистре.
Этим битом и включается/выключается мотор.
Evgeny Muchkin
02.08.2007, 18:46
Еще у меня вопросец образовался.
Ситуация такая:
В дисководах 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.
Evgeny Muchkin
04.08.2007, 01:04
А я :) как же я? :)
ну я использовал этот код, который я привёл, его же пользует BestView (если это хоть что-то авторитет, то это точно BestView). С другой стороны искать индексные отверстия, если диска нет вообще, имхо и смысла нет. Так что смело используй тут процедуру что я привёл - она будет гарантированно гасить вращение если диск есть. А в случае если диска нет, то какая нафиг разница будет пауза или нет %)
В своих программах с успехом использую такую процедуру для останова дисковода (написанную по аналогии с ПЗУшной):
LD HL,12225;Для TR-DOS V5.01 - 12151
CALL DOS+3
LD A,(23830);Копия системного регистра
XOR 1
CALL DOS
LD A,(23830)
DOS LD HL,697;Для TR-DOS V5.01 - 683
PUSH HL
JP 15663
Кстати, ПЗУшная процедура (в командном процессоре) не останавливает дисковод B;.
Powered by vBulletin® Version 4.2.5 Copyright © 2026 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot