ZXNet эхоконференция «code.zx»
тема: Программный детект модели IDE
от: Alexandr Sinyakov
кому: All
дата: 13 Feb 2007
Hello, All
Идём далее...
Как-нибудь можно программно определить, какая схема IDE подключена (или
подключена ли) к ZX?
Идея есть - читать регистр состояния IDE и проверять устройство на занятость.
Hо СМУК и АТМ-овский контроллер работают через теневые порты, а у меня
закрыдывается сомнение в том, что в каждом TRDos'e есть in a,(c); ret по одному
и тому же адресу.
от: Alexandr Sinyakov
кому: All
дата: 13 Feb 2007
Hello, goodboy
goo> может сначала сделать проверку на наличие in a,(c) в пзуTRDOS ?
goo> hl,#xxxx
goo> c,#13
goo> call #3d13
goo>
goo> 16 байт из адреса в HL, перенесутся в #5cdd
Во, об этом-то я и не подумал! Hачал искать ldir:ret...
Спасибо за напоминание.
2 EARL
Hе надо зацикливать. Можно же считать несколько тыс.раз. Если оно всё ещё
занято - значит его нет.
от: goodboy
кому: All
дата: 13 Feb 2007
Hello, EARL
может сначала сделать проверку на наличие in a,(c) в пзуTRDOS ?
hl,#xxxx
c,#13
call #3d13
16 байт из адреса в HL, перенесутся в #5cdd
от: Дмитрий Лимонов
кому: All
дата: 13 Feb 2007
Hello, SAM style
Если читать регистр состояния и проверять устройство на занятость так:
┌─- CODE ───
NO_BSY LD BC,#FFBE
CALL IN_A
RLCA
RET NC
JR NO_BSY
IN_A - функция чтения регистра контроллера
└── CODE ───
То в случае отсутствия проверяемого контроллера это приведет к зацикливанию.
Предлагаю сделать следующие: выбираем первое устройство на данном контроллере и
пишем, например, в регистр сектора какое-то значение, а потом проверяем его
содержимое, потом проделываем тоже самое для второго устройства контроллера.
Тут есть один большой недостаток, если неподключено ни одно устройство к
тестируемому контроллеру, а он на самом деле есть, то мы его не определим. Для
контроллеров 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.
от: Alexandr Sinyakov
кому: All
дата: 14 Feb 2007
Hello, EARL
Однако, прога гуд. Даже на некоторые мысли натолкнула. А контроль простым
изменением регистра сектора (как и сделано в начале каждой проги) разве не
прокатит?
Мне, кстати, не обязательно определять, есть ли винт (а с CD/DVD прога, вроде,
не будет работать, потому как там команда #EC считается за ошибку). Главное -
обнаружить схему (или её отсутствие) и настроить драйвер, через который потом
пойдёт определение ATA-устройств.
от: Дмитрий Лимонов
кому: All
дата: 14 Feb 2007
Hello, SAM style
Вот и обещанный код. Пришлось правда немного переписать, но вроде все работает
(проверял в Unreal Speccy 35B). Вызывать нужно функцию detect_ide, которая в
регистре A возвращает обнаруженные интерфейсы в битовом представлении:
0 - SMUC
1 - NEMO A8
2 - NEMO
goo> может сначала сделать проверку на наличие in a,(c) в пзуTRDOS ?
goo> hl,#xxxx
goo> c,#13
goo> call #3d13
goo>
goo> 16 байт из адреса в HL, перенесутся в #5cdd
Следует добавить эту проверку перед вызовом detect_ide!
Файл: ide_detect.rar http://zx.pk.ru/attachment.php?attachmentid=4594
от: Дмитрий Лимонов
кому: All
дата: 14 Feb 2007
Hello, SAM style
SAM> Однако, прога гуд. Даже на некоторые мысли натолкнула.
Спасибо! Это кусок кода вырезанный и переправленный из моего недописанного
BIOS'а, который предположительно должен был бы работать на всех машинах с любым
железом, но я так его и не закончил.
SAM> А контроль простым изменением регистра сектора (как и сделано в
SAM> начале каждой проги) разве не прокатит?
Думаю, что нет, потому что если устройство не подключено к тестируемому
контроллеру, то при чтение регистра сектора всегда возвращается одно и то же
значение (то ли #00, то ли #FF, сейчас не помню) и изменить его нельзя! Поэтому
приходиться перебирать все схемы и все утройства для каждой из них
(Master/Slave). Иначе мы ничего не определим.
SAM> а с CD/DVD прога, вроде, не будет работать, потому как там команда
SAM> #EC считается за ошибку
Hу да, только в этом случае можно считать значение из регистра цилиндра (прежде
записав туда что либо отличное от #14EB) и, если оно равно #14EB, то у нас
имеется CD-ROM, а значит и сам контроллер!
|