PDA

Просмотр полной версии : Вектор-06Ц: Эмуляция - контроллер дисковода



ZEman
14.10.2008, 13:04
Ramiros, когдаж мы наконец сможем открывать FDD в вашем эмуляторе ?;)

Ramiros
15.10.2008, 06:48
Ramiros, когдаж мы наконец сможем открывать FDD в вашем эмуляторе ?;)

к сожалению немогу пока даже нормальную инфу по структуре (формату) FDD файлов накопать :frown:
может b2m мне в этом поможет?

svofski
15.10.2008, 10:58
к сожалению немогу пока даже нормальную инфу по структуре (формату) FDD файлов накопать :frown:
может b2m мне в этом поможет?

Ramiros, спрашивай вслух, тогда тебе будут отвечать :) У меня ведь сделана в vector06cc поддержка fdd, привем написана она на Си и все сорцы открыты. Формат там проще некуда - просто подряд сектора. 5 секторов на сторону, две стороны на дорожку, дорожка за дорожкой.. Ничего лишнего.

http://code.google.com/p/vector06cc/source/browse/trunk/firmware/floppysrc/fddimage.c
http://code.google.com/p/vector06cc/source/browse/trunk/firmware/floppysrc/fddimage.h

b2m
15.10.2008, 12:33
5 секторов на сторону, две стороны на дорожку, дорожка за дорожкой.. Ничего лишнего.
Главное не перепутать с .fdi файлами :)

svofski
15.10.2008, 12:41
А .fdi файлы разбираются опенсорсно вот тут:
http://svn.akop.org/psp/trunk/fms/EMULib/
Правда, там очень интересный Си, но конь дареный так что грех жаловаться. Собственно, там и весь эмулятор дисковода есть. Если уж на то пошло.

b2m
15.10.2008, 13:09
Правда, там очень интересный Си
Нет, исходники от Файзуллина - это что-то! :)

Как говорится:

Ничего лишнего

Ramiros
16.10.2008, 07:46
посмотрел содержимое *.fdd файлов и пришел к выводу, что в них несодержится служебной информации типа: размер сектора, количества секторов на дорожке, и т.п. поправте меня если я ошибаюсь.

есть вопросы к svofski:
1. можно поподробней, в каком порядке размещена информация в самом файле, т.е. номер сотроны, номер дорожки, и т.д. по порядку?
2. сколько дорожек на стороне?
3. сколько секторов на дорожке?
4. какой размер сектора?

b2m
16.10.2008, 11:13
в них несодержится служебной информации типа: размер сектора, количества секторов на дорожке
"Рыба есть, ловить надо уметь" (С) Генерал
struct BootSector
{
WORD LoadAddress;
WORD RunAddress;
WORD LoadSectorCount;
BYTE SizeDisk; /* 0-5.25", 1-8" */
BYTE Density; /* 0-FM, 1-MFM */
BYTE TpI; /* 0-48 TpI, 1-96 TpI, 2-135 TpI */
BYTE SkewFactor; /* 1-no sector tranlation else = len(_SecTran) */
BYTE SecSize; /* 0-128, 1-256, 2-512, 3-1024 */
BYTE InSide; /* 0-single, 1-double */
WORD SecPerTrack;
WORD TrkPerDisk;
/*DPB*/
WORD SPT; /* logical sector(128) per track */
BYTE BSH; /* block shift */
BYTE BLM; /* block shift mask */
BYTE EXM; /* extent mask EXM=(BLM+1)*128/1024 - 1 - [DSM/256] */
WORD DSM; /* disk size - 1 */
WORD DRM; /* dir entry - 1 */
WORD AL; /* dir allocation */
WORD CKS; /* dir check table size CKS=(DRM+1)/4; 0 for fixed disk */
WORD OFS; /* offset, reserved tracks count */
BYTE CheckSum;
BYTE SecTran[96];
};


Добавлено через 5 минут
1. Размер сектора - ровно 1 килобайт, первым идёт сектор 1 головка 0 дорожка 0, затем остальные 4 сектора на этой дорожке/головке, затем идут 5 секторов второй головки (стороны), следом идёт вторая дорожка (10 секторов), третья, и т.д.
2. Странный вопрос. Всего дорожек 80.
3. На дорожке 5 секторов стороны 0 и 5 секторов стороны 1.
4. 1024 байт

Добавлено через 6 минут
Секторы нумеруются с еденицы, дорожка - с нуля.

svofski
16.10.2008, 12:52
Дорожек всегда достаткол. Главное знать размер одной дорожки.

Tim0xA
16.10.2008, 13:12
2. Странный вопрос. Всего дорожек 80.

Может быть 40 дорожек.
Вот напимер, результат работы утилиты sysgen

b2m
16.10.2008, 13:58
Вот напимер, результат работы утилиты sysgen
И что видно из этой информации? Логические номера секторов от 1 до 40, а сколько дорожек - неизвестно, видно только что записывается неполные 4 дорожки (логические?). Логический сектор - 128 байт (как минимум в CP/M, в МикроДОСе должно быть тоже, т.к. вроде как вызовы БДОС совместимы). Следовательно на дорожке 40*128=5120 байт, т.е. 5 секторов по 1 Кб. Однако там ничего не сказано про номер стороны. Я полагаю, что логический_номер_дорожки = реальный_номер_дорожки * 2 + номер_стороны. Это косвенно подтверждается тем, что зарезервировано системных дорожек 8, а каталог начинается с 41-го килобайта в .fdd

Tim0xA
16.10.2008, 14:32
И что видно из этой информации? Логические номера секторов от 1 до 40, а сколько дорожек - неизвестно
Да не там, выше.
Вопрос:
"Число дорожек на стороне диска - 80 (Y/N)"
Я ответил N и sysgen пишет:
"Тогда, 40-дорожек"

И я делаю вывод, что дорожек может быть 40 или 80, как минимум, были такие варианты.

b2m
16.10.2008, 14:57
Не, я не спорю, варианты были. Определить геометрию диска по файлу, в котором только данные секторов, не так-то просто, учитывая что эмулятор не должен быть привязан к какой-либо эмулируемой ОС. Поэтому пока поддерживаются только образы 80х2х5х1024 (не считая 80х2х9х512, как исключение). При выборе других параметров, эмулятор просто будет записывать с пропуском 5 Кб если выбран односторонний диск, и до 400 Кб если выбрано 40 дорожек.

Ramiros
16.10.2008, 17:04
из структуры BootSector понятно что файлы fdd имеют заголовок длинной 128 byte,
но размер файла 839680 байт,
если 80х2х5х1024=819200 байт, прибавить к ним заголовок 128 байт получается 819128, отсюда вопрос - зачем еще 20352 байт?
и с какого байта в файле распологается сектор 1 стороны 0 дорожки 0 ?

и еще, почему незагрузочные fdd неимеют этого заголовка а заполнены константой $E5 ?

несудите строго если что, т.к. я никогда неразбирался как устроен дисковод и как он работает, к томуже на векторе у меня его никогда небыло.

b2m
16.10.2008, 17:28
из структуры BootSector понятно что файлы fdd имеют заголовок длинной 128 byte,
Нет никакого заголовка, это часть первого сектора.


отсюда вопрос - зачем еще 20352 байт?
839680/1024/5/2=82
Некоторые дисководы (не самых ранних выпусков), с технической т.з., имеют ещё 2 технологические дорожки, которые могут использоваться системой в своих нуждах. Но обычно использовалось только 80.


с какого байта в файле распологается сектор 1 стороны 0 дорожки 0 ?
С нулевого.


почему незагрузочные fdd неимеют этого заголовка а заполнены константой $E5 ?
Видимо, МикроДОСу наплевать на этот заголовок, всё равно такой диск не загрузочный, а параметры диска считываются при загрузке с диска системы.

Ramiros
17.10.2008, 07:24
с этим вроде все понятно.
еще вопрос - skynet.fdd имеет размер 542720, поясните в чем разница?
(я предпологаю что там 53 дорожки т.е. 53х2х5х1024)

b2m
17.10.2008, 10:52
Просто создатель этого файла снял с диска только 53 дорожки, зачем лишняя информация. Не надо делать ограничений и проверок на количество дорожек - сколько есть, столько есть. Будешь записывать на не существующие в файле дорожки - скорректируешь длинну файла, и всё.

Tim0xA
17.10.2008, 11:29
Просто создатель этого файла снял с диска только 53 дорожки, зачем лишняя информация. Не надо делать ограничений и проверок на количество дорожек - сколько есть, столько есть. Будешь записывать на не существующие в файле дорожки - скорректируешь длинну файла, и всё.
Если я запишу (из МикроДОС) на подобный диск (с 53мя дорожками) файлов в расчете на емкость диска с 80 дорожками, ну сказем 700кб, эмулятор сам скорректирует файл образа FDD?

svofski
17.10.2008, 11:45
Если я запишу на подобный диск (с 53мя дорожками) файлов в расчете на емкость диска с 80 дорожками, ну сказем 700кб, эмулятор сам скорректирует файл образа FDD?
Меня никто не спрашивал, но это точно не относится к vector06cc. Там даже кода FAT на запись нет.

b2m
17.10.2008, 13:50
эмулятор сам скорректирует файл образа FDD?
Вроде да. По крайней мере у меня никогда проблем с этим не было, даже когда я делал образ пустого диска минимального размера, т.е. только до конца секторов пустого каталога.

Ramiros
17.10.2008, 19:34
b2m, как у тебя с реализацией команд 3-го типа:Read Address, Read Track, Write Track, в описании команд написано что там читается CRC ? в то же время в файлах образа этих CRC нету.
и как расчитывается CRC ?

b2m
17.10.2008, 19:57
как у тебя с реализацией команд 3-го типа:Read Address, Read Track, Write Track
Read Address проблем никаких не составляет.
А Read Track, Write Track как и у всех - не реализовано :)

Ramiros
20.10.2008, 16:16
b2m, у тебя в команде ReadSector после чтения последнего (1024-го) байта сектора в status регистре 2-й бит DRQ взводится? и поддерживает ли у тебя эмулятор в этой же команде мультисекторное чтение до конца дорожки?

b2m
20.10.2008, 17:23
DRQ "взводится", когда есть чего читать, а если данные в буфере закончились, то DRQ=0.
Мультисекторное чтение поддерживается, а вот использует ли кто его - вопрос.

Ramiros
20.10.2008, 19:47
почти все fdd стали запускаться, но skynet на второй деме вешается, подозреваю что некоректно реализовано Step, StepIn, StepOut, вопрос: как должны вести себя команды например StepOut если дорожка уже нулевая, или StepIn при максимальновозможной?

Ramiros
28.10.2008, 23:22
при выполнении команды контроллера FDD "WriteSector" после записи на сектор последнего 1024-го байта, флаг DRQ возводится должен или нет?
я конешно думаю что нет, но все же вдруг я ошибаюсь... хотя прогам похоже всеравно :)

svofski
29.10.2008, 00:54
Ramiros, наверняка не скажу, но вроде бы должен.

Кстати, на запись хороший тест -- это сделать что-нибудь вроде:
D>FILE.TXT
из микродоса. Попробуй, что получится.

Tim0xA
06.11.2008, 14:13
3. Незнаю, почему загрузчик его определяет, но бит "Не готов" взводится при отсутствии образа.
В кишиневском загрузчике используется такая процедура:


; проверка наличия дисковода
M0138H: MVI A,0BH
OUT 19H
MOV C,A
XTHL
XTHL
IN 19H
CMP C
JZ M0146H
XRA A
M0146H: ORA A
RET
Получается, что даже если диск не вставлен, то регистр контроллера SECTOR (19H) при чтении вернет то значение, которое было в него записано?



5. Хм.. чено говоря даже невидел этих rXX файлов :)
Приложил.

b2m
06.11.2008, 18:33
Получается, что даже если диск не вставлен, то регистр контроллера SECTOR (19H) при чтении вернет то значение, которое было в него записано?
Причём тут диск?
Это же

; проверка наличия дисковода
Если дисковода в компе нет, то из порта явно считается не 0BH.

Tim0xA
06.11.2008, 19:00
Если дисковода в компе нет, то из порта явно считается не 0BH.
Это очевидная вещь, но вопрос же был не в этом, а немного глубже. Меня интересует поведение регистра SR. Допустим, дисковод подключен, но диск не вставлен. Производится запись в SR. Регистр SR примет значение, которое в него пишут или нет? Есть ли зависимость от состояния "Готов/Не готов"? Я этого не знаю, потому и спрашиваю.

Ramiros уже сделал таким образом (в еще невыложенной версии): если образ не подключен, то дисковода считай нет и его регистры отсутствуют, соответственно загрузчик его не обнаруживает и не пытается с него грузиться.
b2m, может тебе стоит сделать в своем эмуляторе так же, тогда его не будет "колбасить" при отсутствии образов диска и квазидиска? Напротив, может есть какие-то причины, почему так делать не стоит?

Также:
1) может у кого-то есть PDF на аналог ВГ93 или ссылка?
2) какой однозначный 100%-ный признак наличия диска в дисководе (по состоянию регистров)? я бы поправил процедуру в загрузчике, если это никак не зависит от регистра SR. Бит7 регистра Status - "готов/не готов"?

svofski
06.11.2008, 19:31
Я ничего на отсечение не дам, но как я помню, внутреннее устройство 1793 таково, что регистр -- это просто регистр безо всякой семантики. Поэтому все, что в него записывается, должно так же и читаться.

Добавлено через 4 минуты
Я пользовался вот этим описанием
http://msx.retro8bits.com/msxwd1793.html

Ramiros
06.11.2008, 19:37
2) какой однозначный 100%-ный признак наличия диска в дисководе (по состоянию регистров)? я бы поправил процедуру в загрузчике, если это никак не зависит от регистра SR. Бит7 регистра Status - "готов/не готов"?

Я думаю, если делать по уму то надо читать бит Готов/Неготов

b2m
06.11.2008, 19:39
какой однозначный 100%-ный признак наличия диска в дисководе (по состоянию регистров)?
Включить мотор и последить за индексным маркером, если "моргает", то диск есть :)

Tim0xA
06.11.2008, 19:49
Я пользовался вот этим описанием
http://msx.retro8bits.com/msxwd1793.html
Собственно после этой статьи и возникли различного рода сомнения (после фразы "This register should not be loaded when the device is busy"). Проверки занятости в загрузчике нет, в SR сразу пишется несуществующий 11й сектор (почему 11й - понятно). Может все-таки корректнее было читать статус, а не тестить регистр на чтение-запись?

Ramiros
06.11.2008, 20:29
Может все-таки корректнее было читать статус, а не тестить регистр на чтение-запись?

Золотые слова!

Я думаю что разработчики загрузчика ставили перед собой цель просто проверить наличие дисковода. конешно это как то неправильно :)

Добавлено через 2 минуты

Включить мотор и последить за индексным маркером, если "моргает", то диск есть :)

Конешно... тогда дисковод вообще никогда неопределится, покрайней мере в эмуляторах :)

b2m
06.11.2008, 22:50
тогда дисковод вообще никогда неопределится, покрайней мере в эмуляторах
Если надо, то я доделаю, и в моём будет определяться ;)

Tim0xA
07.11.2008, 00:21
Выложил на сайт новую версию эмулятора от Ramiros

Добавлено через 1 час 51 минуту

Если надо, то я доделаю, и в моём будет определяться ;)
Ничего не делай, я поправил загрузчик. Теперь будет нормально работать приоритет загрузки. Если нет EDD, загрузчик ищет FDD, если он есть, но нет диска, то ищет HDD и пытается грузиться с него и т.д.

Ramiros, в следующей версии верни назад обработку регистров контроллера дисковода, пусть он будет всегда. Загрузчик сам разберется, что делать, есть ли диск - по статусу.

Загрузчик еще потестирую и выложу.

Tim0xA
07.11.2008, 16:59
b2m, возникли сомнения в корректности эмуляции флага "Готов/Не готов". Эффект проявляется при сравнении работы твоего эмулятора и версии 5.22 эмулятора Ramiros в отсутствие образов дисков и квазидиска. Загрузчик старый.

Процедура загрузчика (A=34H, команда STEP):


M03A7H: MOV D,A
M03A8H: OUT 1CH
IN 1BH
RLC
MOV A,D
JC M03A8H
RET

1) Эмулятор Ramiros: Загрузчик зацикливается в процедуре, т.к. эмулятор установил флаг "Не готов". Цикл крутится, пока не будет подключен образ.
2) Эмулятор b2m: Загрузчик не зацикливается в процедуре, т.к. эмулятор НЕ установил флаг "Не готов". Загрузчик периодически пытается загрузиться с диска, пока не будет подключен образ.

Кто прав?

b2m
07.11.2008, 18:30
команда STEP
Я бы сказал, не команда, всё таки вывод идёт не в порт 1Bh, а выбор дисковода и опрос его готовности. Наверное, я не прав. Честно говоря, я не знаю, в каком случае дисковод (а не контроллер) выдаёт готовность. Видимо, когда диск вставлен и карман защёлкнут, т.е. аналогично нашему - образ подключен.

Добавлено через 9 минут
Вобщем, я исправил.

Tim0xA
07.11.2008, 18:57
Ну вот и разобрались :) Пока ваши эмуляторы проверишь, столько нового узнаешь ;)
Кстати, "Эмулятор 3000" эту ситуацию отрабатывает, почти как у Ramiros, но только не реагирует на вставку диска - приходится все-таки нажимать ВВОД+БЛК.

ZEman
07.11.2008, 19:48
а можете реализовать в эмуляторе какойнибудь индикатор, чтоб видна была активность дисководов ?

Tim0xA
07.11.2008, 19:56
а можете реализовать в эмуляторе какойнибудь индикатор, чтоб видна была активность дисководов ?
У Ramiros это уже есть :)