Speccy - наш выбор!

Speccy - наш выбор! (http://zx-pk.ru/index.php)
-   Программирование (http://zx-pk.ru/forumdisplay.php?f=14)
-   -   Ищу процедуру выключения мотора дисковода. (http://zx-pk.ru/showthread.php?t=5884)

Evgeny Muchkin 2nd August 2007 03:20

Ищу процедуру выключения мотора дисковода.
 
У меня следующая ситуация: есть процедурка (почти идентичная оригинальной TR-DOS'ной - нету только проверки на кнопку Break) по определению наличия диска в дисководе.

Так вот. Как корректно отключить мотор дисковода, если диска в дисководе нету?

Буду весьма признателен за куслчек кода :)

Sonic 2nd August 2007 12:11

Посмотри дизассемблер ПЗУ, я сейчас не помню адрес, она там есть. Загружаешь номер дисковода кажется в A и вызываешь ее через #3D2F.
Она там вызывается при входе в командный процессор (#3D00).

caro 2nd August 2007 12:47

Quote:

Originally Posted by Sonic (Post 96542)
Посмотри дизассемблер ПЗУ, я сейчас не помню адрес, она там есть. Загружаешь номер дисковода кажется в A и вызываешь ее через #3D2F.

Вот она:
Code:

; ПРОЦЕДУРА из 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 2nd August 2007 12:58

То что нужно! Спасибо, уважаемые коллеги! :)

Sonic 2nd August 2007 15:22

Кстати, интересно...
Во-первых, вижу комментарий "5.03 и выше". Разве в 5.01 не было? Она не останавливала дисковод?
Во-вторых, ВГ93 использовалась кроме Спека практически во всех бытовых машинах. А как там с этим поступали? В схемах их контроллеров нет имитации IP.

caro 2nd August 2007 15:30

Quote:

Originally Posted by Sonic (Post 96563)
Кстати, интересно...
Во-первых, вижу комментарий "5.03 и выше". Разве в 5.01 не было? Она не останавливала дисковод?

В версии 5.01 эта же процедура расположена с адреса 02ABh.

Quote:

Originally Posted by Sonic (Post 96563)
Во-вторых, ВГ93 использовалась кроме Спека практически во всех бытовых машинах. А как там с этим поступали? В схемах их контроллеров нет имитации IP.

Например в контроллере Корвета, для управления мотором есть отдельный бит в управляющем регистре.
Этим битом и включается/выключается мотор.

Evgeny Muchkin 2nd August 2007 19:46

Еще у меня вопросец образовался.

Ситуация такая:
В дисководах A и B стоят диски. В портах TR-DOS и FF записаны значения касающиеся дисковода A. Теперь нужно перенастроиться на дисковод B - выставить регистры дорожки и сектора в правильные значения для B.
Как это сделать не используя команду Восстановление?

GriV 3rd August 2007 10:34

Странный код честно говоря. Помню что когда мне надо было остановить привод я смотрел как это было сделано в 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

Ага, я похоже изменил алгоритм - вместо того чтобы два раза позиционироваться - вначале на нулевую потом на основную дорожку, сразу ставил позиционирование на основную дорожку.

Sonic 3rd August 2007 10:58

Ничего странного. Команда прерывания отключает мотор только при присутствии диска. Это багофича у ВГ93 такая - останов мотора происходит после прошествия скольких-то индексных импульсов.
Указанный код гарантированно формирует пачку импульсов на выводе IP. Для этого в контроллере диод стоит между каким-то из битов порта #FF и IP.

Evgeny Muchkin 4th August 2007 02:04

А я :) как же я? :)


All times are GMT +4. The time now is 21:32.

Powered by vBulletin® Version 3.8.3
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.