Все, я закончил доработку API. Изменения коснулись 3 файлов - прошивки контроллера, загрузчика 2 фазы LOADER.ASM, и образа системы EXRSYSTEM.ASM. Теперь командный пакет защищен контрольной суммой, и если сумма неправильная - пакет просто игнорируется без каких-либо дополнительных действий. Также введена обратная связь - подтверждение приема контроллером команды.
В окончательном виде API выглядит так.
Формат командного пакета:
Контрольная сумма равна беззнаковой 8-битной сумме всех предыдущих 4 байт минус 1:Код:CMD: DS 1 ; код команды DRV: DS 1 ; номер устройства, 0-A, 1-B TRK: DS 1 ; номер дорожки SEC: DS 1 ; номер сектора (размер сектора всегда 128 байт CSUM: DS 1 ; Контрольная сумма предыдущих 4 байт,
CSUM=CMD+DRV+TRK+SEC-1
Если в команде не используются поля DRV, TRK, SEC, то их значение игнорируется.
Список команд:
После отправки командного пакета контроллер всегда отдает 1 байт подтверждения. Значение этого байта:Код:Команды обмена секторами; 01 - чтение сектора 02 - запись сектора Команды измерителя скорости. F0 - прием 8000h байта мусора F1 - передача 8000h байтов мусора Комадны управления работой контроллера 00 - пустая операция, всегда возвращает ответ ОК (1) A0 - включить/выключить подстановку системных дорожек. DRV всегда 0, TRK=0 - выключить, 1 - включить
0 (error) - ошибка, команда отвергнута
1 (ok) - команда принята.
Если ответ 1, то далее идет обмен данными, как и раньше. Если ответ 0, то обмен данными не происходит, а контроллер ожидает следующего комадного пакета.
Диаграмма взаимодействия корвета и контроллера
Я добавил еще одну команду - 00 (nop), Она всегда возвращает 1 (OK) и может быть использована для проверки функционирования контроллера (не повис ли он).Код:Корвет Контроллер -------------------------------------------------------- командный пакет 0 или 1 -- передача или прием блока данных, если требуется --
Измененные файлы лежат в аттаче. Заодно я вставил в загрузчик новую оптимизированную процедуру GETSEC, чтобы система быстрее грузилась.
ESL, тебе придется доработать эмулятор. Также подправь свои тесты скорости - просто вставь туда новую процедуру SENDCMD из биоса или загрузчика.
Ну, вот и все. Осталось приделать интерфейс для управления монтированием образов (я этим займусь в выходные), и проект будет полностью готов. Останется только потестировать, пооптимизировать, поискать баги, ну и ESL сделает универсальный загрузчик. Я, естественно, помогу чем смогу.
Блин, как-то уж больно быстро все заканчивается...
Да, чуть не забыл. Насчет установки режима ВВ55 в процедуре SENDCMD.
Или меня уже глючит, или ВВ55 в момент записи управляющего слова кратковременно выставляет ноль на всех ножках порта С. И тут же возвращает все обратно. В результате контроллер начинает глючить. Сейчас проверю более детально.
Придурки из Intel не предусмотрели чтение регистра управления. Казалось бы, чего проще? А так можно было бы вначале проверить режим, а потом уже принимать решение о записи нового управляющего слова.
обновил эмулятор, новый биос и бутлоадер работают
disk_a.kdi & disk_b.kdi
подмена биоса пока не реализована, но вызов - работает (только флаг ставит внутри).
доки по апи и исходники тестов теперь в extrom/
тесты обновил,
rom6 теперь использует диск B
кстати, есть баги похоже
на disk_b есть runner (не сразу, андо несколько раз не выходя из игры начать, прерывать)
это образ тот что disk\disk3
если его запустить - то он вываливает с bdos error on ...
и кстати не работают физ диски (те что A->C и B->D)
Вот, спасибо! А то я уже сам хотел идти доделывать его. Инструмент-то для отладки позарез нужен. Заодно туда добавлю пробные варианты вызовов для монтирования образов, чтобы клиентскую часть под CP/M было где отлаживать.
Ладно, попробую. Может быть, и ты чего накопаешь.Код:кстати, есть баги похоже на disk_b есть runner (не сразу, андо несколько раз не выходя из игры начать, прерывать)
О, точно. И на железном корвете работать перестало. Но ведь работало же раньше! Где-то я в процедуре GETINFO биоса багу повесил. Это уже серьезно, сейчас буду смотерть, благо инструмент теперь есть.и кстати не работают физ диски (те что A->C и B->D)
Забыл написать
Подмена системных дорожек пока не реализована
Т.е вызов апи он кушает, но только флаг ставит у себя
Кстати а подмена только для A или для обоих ?
Да ты же написал вроде выше. Я уже это учел и подсунул эмулятору образы со встроенным биосом. Тем более ты там для этого скрипт в extrom/ положил, только bitbucket у него права +x отобрал
Подмена, естественно, работает только для А. Для B это бессмысленно и даже вредно. На диске A системная область защищена от записи - запись в первые 2 дорожки ингорируется, чтобы не затереть system.bin на карте.
А вообще, можно использовать наш контрорллер для подготовки реальных дискет - посекторно скопировать B в C, например. Поскольку с B будет отдаваться реальная системная область. Только путаница будет с буквами - потому как форматировать дискету надо как FORMAT A:, а не FORMAT C:
Багу в биосе я нашел. Как обычно, соптимизировал пару байт на свою голову
Новый биос в аттаче.
баг с runner - повторяется
[steps to reproduce]
./kdbg -e extrom/
b:
runner
wait when stared
press F6 (turbo) for 5 second
press space
[expected result]
game started
[actual result]
Bdos Err on B: Bad Sector
Интересно, на реальном корвете я багу повторить не смог. Павда, F6 там нет, но я честно подождал минут 10, нажал пробел - игра пошла.
В эмуляторе - да, вылетает с BDOS ERROR. Но при этом обращения к диску через интерфейс не происходит,судя по логу. Неужели эта игрушка сама лезет в порты дисковода? BDOS Error может произойти в случае, если в блоке DPB изменили маску выбора диска, или текущим сделали отсутствующий диковод C или D.. Сейчас попробую глянуть в отладчике. Заодно можно повесить бряк на BIOS READ, и посмотреть, какой запрос приводи к ошибке.
я по логу апи в эмуляторе сразу глянул что нет обращения
ты rom6 не пускал ?
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)