Ramiros, когдаж мы наконец сможем открывать FDD в вашем эмуляторе ?;)
Вид для печати
Ramiros, когдаж мы наконец сможем открывать FDD в вашем эмуляторе ?;)
Ramiros, спрашивай вслух, тогда тебе будут отвечать :) У меня ведь сделана в vector06cc поддержка fdd, привем написана она на Си и все сорцы открыты. Формат там проще некуда - просто подряд сектора. 5 секторов на сторону, две стороны на дорожку, дорожка за дорожкой.. Ничего лишнего.
http://code.google.com/p/vector06cc/...src/fddimage.c
http://code.google.com/p/vector06cc/...src/fddimage.h
А .fdi файлы разбираются опенсорсно вот тут:
http://svn.akop.org/psp/trunk/fms/EMULib/
Правда, там очень интересный Си, но конь дареный так что грех жаловаться. Собственно, там и весь эмулятор дисковода есть. Если уж на то пошло.
посмотрел содержимое *.fdd файлов и пришел к выводу, что в них несодержится служебной информации типа: размер сектора, количества секторов на дорожке, и т.п. поправте меня если я ошибаюсь.
есть вопросы к svofski:
1. можно поподробней, в каком порядке размещена информация в самом файле, т.е. номер сотроны, номер дорожки, и т.д. по порядку?
2. сколько дорожек на стороне?
3. сколько секторов на дорожке?
4. какой размер сектора?
"Рыба есть, ловить надо уметь" (С) Генерал
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 минут
Секторы нумеруются с еденицы, дорожка - с нуля.
Дорожек всегда достаткол. Главное знать размер одной дорожки.
И что видно из этой информации? Логические номера секторов от 1 до 40, а сколько дорожек - неизвестно, видно только что записывается неполные 4 дорожки (логические?). Логический сектор - 128 байт (как минимум в CP/M, в МикроДОСе должно быть тоже, т.к. вроде как вызовы БДОС совместимы). Следовательно на дорожке 40*128=5120 байт, т.е. 5 секторов по 1 Кб. Однако там ничего не сказано про номер стороны. Я полагаю, что логический_номер_дорожки = реальный_номер_дорожки * 2 + номер_стороны. Это косвенно подтверждается тем, что зарезервировано системных дорожек 8, а каталог начинается с 41-го килобайта в .fdd
Не, я не спорю, варианты были. Определить геометрию диска по файлу, в котором только данные секторов, не так-то просто, учитывая что эмулятор не должен быть привязан к какой-либо эмулируемой ОС. Поэтому пока поддерживаются только образы 80х2х5х1024 (не считая 80х2х9х512, как исключение). При выборе других параметров, эмулятор просто будет записывать с пропуском 5 Кб если выбран односторонний диск, и до 400 Кб если выбрано 40 дорожек.
из структуры BootSector понятно что файлы fdd имеют заголовок длинной 128 byte,
но размер файла 839680 байт,
если 80х2х5х1024=819200 байт, прибавить к ним заголовок 128 байт получается 819128, отсюда вопрос - зачем еще 20352 байт?
и с какого байта в файле распологается сектор 1 стороны 0 дорожки 0 ?
и еще, почему незагрузочные fdd неимеют этого заголовка а заполнены константой $E5 ?
несудите строго если что, т.к. я никогда неразбирался как устроен дисковод и как он работает, к томуже на векторе у меня его никогда небыло.
Нет никакого заголовка, это часть первого сектора.
839680/1024/5/2=82
Некоторые дисководы (не самых ранних выпусков), с технической т.з., имеют ещё 2 технологические дорожки, которые могут использоваться системой в своих нуждах. Но обычно использовалось только 80.
С нулевого.
Видимо, МикроДОСу наплевать на этот заголовок, всё равно такой диск не загрузочный, а параметры диска считываются при загрузке с диска системы.
с этим вроде все понятно.
еще вопрос - skynet.fdd имеет размер 542720, поясните в чем разница?
(я предпологаю что там 53 дорожки т.е. 53х2х5х1024)
Просто создатель этого файла снял с диска только 53 дорожки, зачем лишняя информация. Не надо делать ограничений и проверок на количество дорожек - сколько есть, столько есть. Будешь записывать на не существующие в файле дорожки - скорректируешь длинну файла, и всё.
Меня никто не спрашивал, но это точно не относится к vector06cc. Там даже кода FAT на запись нет.Цитата:
Если я запишу на подобный диск (с 53мя дорожками) файлов в расчете на емкость диска с 80 дорожками, ну сказем 700кб, эмулятор сам скорректирует файл образа FDD?
b2m, как у тебя с реализацией команд 3-го типа:Read Address, Read Track, Write Track, в описании команд написано что там читается CRC ? в то же время в файлах образа этих CRC нету.
и как расчитывается CRC ?
b2m, у тебя в команде ReadSector после чтения последнего (1024-го) байта сектора в status регистре 2-й бит DRQ взводится? и поддерживает ли у тебя эмулятор в этой же команде мультисекторное чтение до конца дорожки?
DRQ "взводится", когда есть чего читать, а если данные в буфере закончились, то DRQ=0.
Мультисекторное чтение поддерживается, а вот использует ли кто его - вопрос.
почти все fdd стали запускаться, но skynet на второй деме вешается, подозреваю что некоректно реализовано Step, StepIn, StepOut, вопрос: как должны вести себя команды например StepOut если дорожка уже нулевая, или StepIn при максимальновозможной?
при выполнении команды контроллера FDD "WriteSector" после записи на сектор последнего 1024-го байта, флаг DRQ возводится должен или нет?
я конешно думаю что нет, но все же вдруг я ошибаюсь... хотя прогам похоже всеравно :)
Ramiros, наверняка не скажу, но вроде бы должен.
Кстати, на запись хороший тест -- это сделать что-нибудь вроде:
D>FILE.TXT
из микродоса. Попробуй, что получится.
В кишиневском загрузчике используется такая процедура:
Получается, что даже если диск не вставлен, то регистр контроллера SECTOR (19H) при чтении вернет то значение, которое было в него записано?Код:; проверка наличия дисковода
M0138H: MVI A,0BH
OUT 19H
MOV C,A
XTHL
XTHL
IN 19H
CMP C
JZ M0146H
XRA A
M0146H: ORA A
RET
Приложил.
Это очевидная вещь, но вопрос же был не в этом, а немного глубже. Меня интересует поведение регистра SR. Допустим, дисковод подключен, но диск не вставлен. Производится запись в SR. Регистр SR примет значение, которое в него пишут или нет? Есть ли зависимость от состояния "Готов/Не готов"? Я этого не знаю, потому и спрашиваю.
Ramiros уже сделал таким образом (в еще невыложенной версии): если образ не подключен, то дисковода считай нет и его регистры отсутствуют, соответственно загрузчик его не обнаруживает и не пытается с него грузиться.
b2m, может тебе стоит сделать в своем эмуляторе так же, тогда его не будет "колбасить" при отсутствии образов диска и квазидиска? Напротив, может есть какие-то причины, почему так делать не стоит?
Также:
1) может у кого-то есть PDF на аналог ВГ93 или ссылка?
2) какой однозначный 100%-ный признак наличия диска в дисководе (по состоянию регистров)? я бы поправил процедуру в загрузчике, если это никак не зависит от регистра SR. Бит7 регистра Status - "готов/не готов"?
Я ничего на отсечение не дам, но как я помню, внутреннее устройство 1793 таково, что регистр -- это просто регистр безо всякой семантики. Поэтому все, что в него записывается, должно так же и читаться.
Добавлено через 4 минуты
Я пользовался вот этим описанием
http://msx.retro8bits.com/msxwd1793.html
Собственно после этой статьи и возникли различного рода сомнения (после фразы "This register should not be loaded when the device is busy"). Проверки занятости в загрузчике нет, в SR сразу пишется несуществующий 11й сектор (почему 11й - понятно). Может все-таки корректнее было читать статус, а не тестить регистр на чтение-запись?
Золотые слова!
Я думаю что разработчики загрузчика ставили перед собой цель просто проверить наличие дисковода. конешно это как то неправильно :)
Добавлено через 2 минуты
Конешно... тогда дисковод вообще никогда неопределится, покрайней мере в эмуляторах :)
Выложил на сайт новую версию эмулятора от Ramiros
Добавлено через 1 час 51 минуту
Ничего не делай, я поправил загрузчик. Теперь будет нормально работать приоритет загрузки. Если нет EDD, загрузчик ищет FDD, если он есть, но нет диска, то ищет HDD и пытается грузиться с него и т.д.
Ramiros, в следующей версии верни назад обработку регистров контроллера дисковода, пусть он будет всегда. Загрузчик сам разберется, что делать, есть ли диск - по статусу.
Загрузчик еще потестирую и выложу.
b2m, возникли сомнения в корректности эмуляции флага "Готов/Не готов". Эффект проявляется при сравнении работы твоего эмулятора и версии 5.22 эмулятора Ramiros в отсутствие образов дисков и квазидиска. Загрузчик старый.
Процедура загрузчика (A=34H, команда STEP):
1) Эмулятор Ramiros: Загрузчик зацикливается в процедуре, т.к. эмулятор установил флаг "Не готов". Цикл крутится, пока не будет подключен образ.Код:M03A7H: MOV D,A
M03A8H: OUT 1CH
IN 1BH
RLC
MOV A,D
JC M03A8H
RET
2) Эмулятор b2m: Загрузчик не зацикливается в процедуре, т.к. эмулятор НЕ установил флаг "Не готов". Загрузчик периодически пытается загрузиться с диска, пока не будет подключен образ.
Кто прав?
Я бы сказал, не команда, всё таки вывод идёт не в порт 1Bh, а выбор дисковода и опрос его готовности. Наверное, я не прав. Честно говоря, я не знаю, в каком случае дисковод (а не контроллер) выдаёт готовность. Видимо, когда диск вставлен и карман защёлкнут, т.е. аналогично нашему - образ подключен.
Добавлено через 9 минут
Вобщем, я исправил.
Ну вот и разобрались :) Пока ваши эмуляторы проверишь, столько нового узнаешь ;)
Кстати, "Эмулятор 3000" эту ситуацию отрабатывает, почти как у Ramiros, но только не реагирует на вставку диска - приходится все-таки нажимать ВВОД+БЛК.