PDA

Просмотр полной версии : Программный детект модели IDE



SAM style
13.02.2007, 10:48
Идём далее...
Как-нибудь можно программно определить, какая схема IDE подключена (или подключена ли) к ZX?
Идея есть - читать регистр состояния IDE и проверять устройство на занятость. Но СМУК и АТМ-овский контроллер работают через теневые порты, а у меня закрыдывается сомнение в том, что в каждом TRDos'e есть in a,(c); ret по одному и тому же адресу.

EARL
13.02.2007, 12:54
Если читать регистр состояния и проверять устройство на занятость так:


NO_BSY LD BC,#FFBE
CALL IN_A
RLCA
RET NC
JR NO_BSY

IN_A - функция чтения регистра контроллера

То в случае отсутствия проверяемого контроллера это приведет к зацикливанию.

Предлагаю сделать следующие: выбираем первое устройство на данном контроллере и пишем, например, в регистр сектора какое-то значение, а потом проверяем его содержимое, потом проделываем тоже самое для второго устройства контроллера. Тут есть один большой недостаток, если неподключено ни одно устройство к тестируемому контроллеру, а он на самом деле есть, то мы его не определим. Для контроллеров NEMO и NEMO A8 нужно проводить дополнительный тест, для уточнения конкретной схемы. Я сделал так:
1. Выбираем любую модель NEMO/NEMO A8
2. Забиваем в буфер размером 512 байт значением #FF
3. Выдаем контроллеру команду #EC (Drive Identify)
4. Читаем блок данных в наш буфер
5. Проверяем значение в буфере по смещению 256. Если это значение отличается от #FF (не помню почему, но в этом месте при успешном считывании точно не будет #FF), то у нас выбранная модель, иначе у нас другая модель

PS. В связи с отсутствием под рукой реальной машины с любым из контроллеров IDE все тесты проводились на эмуляторе Unreal Speccy
PPS. Если кому интересно, то могу вечерком могу выложить реализацию всего вышеописанного для моделей NEMO, NEMO A8 и SMUC.

SAM style
13.02.2007, 15:43
может сначала сделать проверку на наличие in a,(c) в пзуTRDOS ?
hl,#xxxx
c,#13
call #3d13

16 байт из адреса в HL, перенесутся в #5cdd
Во, об этом-то я и не подумал! Начал искать ldir:ret...
Спасибо за напоминание.
2 EARL
Не надо зацикливать. Можно же считать несколько тыс.раз. Если оно всё ещё занято - значит его нет.

EARL
14.02.2007, 00:25
Вот и обещанный код. Пришлось правда немного переписать, но вроде все работает (проверял в Unreal Speccy 35B). Вызывать нужно функцию detect_ide, которая в регистре A возвращает обнаруженные интерфейсы в битовом представлении:
0 - SMUC
1 - NEMO A8
2 - NEMO


может сначала сделать проверку на наличие in a,(c) в пзуTRDOS ?
hl,#xxxx
c,#13
call #3d13

16 байт из адреса в HL, перенесутся в #5cdd
Следует добавить эту проверку перед вызовом detect_ide!

SAM style
14.02.2007, 01:02
Однако, прога гуд. Даже на некоторые мысли натолкнула. А контроль простым изменением регистра сектора (как и сделано в начале каждой проги) разве не прокатит?
Мне, кстати, не обязательно определять, есть ли винт (а с CD/DVD прога, вроде, не будет работать, потому как там команда #EC считается за ошибку). Главное - обнаружить схему (или её отсутствие) и настроить драйвер, через который потом пойдёт определение ATA-устройств.

EARL
14.02.2007, 13:57
Однако, прога гуд. Даже на некоторые мысли натолкнула.
Спасибо! Это кусок кода вырезанный и переправленный из моего недописанного BIOS'а, который предположительно должен был бы работать на всех машинах с любым железом, но я так его и не закончил.

А контроль простым изменением регистра сектора (как и сделано в начале каждой проги) разве не прокатит?
Думаю, что нет, потому что если устройство не подключено к тестируемому контроллеру, то при чтение регистра сектора всегда возвращается одно и то же значение (то ли #00, то ли #FF, сейчас не помню) и изменить его нельзя! Поэтому приходиться перебирать все схемы и все утройства для каждой из них (Master/Slave). Иначе мы ничего не определим.

а с CD/DVD прога, вроде, не будет работать, потому как там команда #EC считается за ошибку
Ну да, только в этом случае можно считать значение из регистра цилиндра (прежде записав туда что либо отличное от #14EB) и, если оно равно #14EB, то у нас имеется CD-ROM, а значит и сам контроллер!