Просмотр полной версии : Корвет: ExtROM Open Source extender
Эта тема отерзана в отдельную
тут идет обсуждение и разработка адаптера к внешнему порту Корвета
который позволит загружать систему с внешней SD карты
работать должно и на машинах без дисковода.
отрезано из темы http://zx-pk.ru/showthread.php?t=23458
lets go ....
------------------------------------------------------------------------------------------------------------------------------
Сама CP/M может работать с носителями, если не ошибаюсь, до 32М. Только для этого придется сильно править биос.
не всё так плохо, во первых есть исходники ;)
во вторых надо только размер буфера ALV кажись увеличить, место там есть ;)
но смысла не особо
2. Еще лучше - задействовать боковой разъем. Скажем, подключить его к LPT-порту PC в двунаправленном режиме. Тут можно получить несравнимо большую скорость, ограниченную только скоростью процессора. Как вариант - загрузку ОС также делать через этот разъем, благо ОПТС это умеет. Все это схемотехнически не особо сложно, но надо писать свой биос, а вот это уже муторно. Но, с другой стороны, это хорошее упражнение для мозгов, почему бы и не заняться...
ага, по этому поводу есть давно ждущие планы,
однокристалку на боковой разъем
имеем загрузку из "внешнего пзу", и делаем что-хотим
уже есть мысли как грузить CP/M c монтрированием образов.
или сразу грузить свой cp/m или микродос, или что интереснее
сделать патчер, который при загрузке образа патчит существующие (их кол-во ограничено, и везде есть место, в CP/M точно)
правда с боковым - есть потенциальные проблеммы
во первых есть 2 типа разъемов, разных (был изначально РП15-50Г (мама), потом стали ставить DC-37(папа) )
во вторых, если разъемы были ПАПА (отдельный бред такое ставить) причем оригинально стояли нормальные,
то есть шанс поиметь сгоревший порт
т.к. там есть +5 на разъеме, а школьники закорочивали контакты типа ключами ...
но сделать можно, и будем пробовать.
---------- Post added at 23:12 ---------- Previous post was at 23:00 ----------
про скорость не подумал. у вас нет документации по порту расширения?
есть даже отдельная тема
http://zx-pk.ru/showthread.php?t=15297
SaintTurnip
14.06.2014, 00:46
странно, предыдущее сообщение (ответ esl) будто не отправилось.
порт расширения желанный (он параллельный, три шины, питание, прерывания), но я просмотрел имеющуюся документацию и не нашел про него ничего. надо будет скачать сканы документации, что Сергей выкладывал. если корвет может загружать программу через этот порт, здорово - туда можно подключить современный микроконтроллер с чем угодно - стореджем, езернетом для фтп, часами - и все в корпусе разъема.
проблема однако с софтом. найдется ли доброволец адаптировать софт? я готов поучаствовать в тематическом кикстартере :)
в свете этой проблемы, ЛВС выглядит привлекательней. электрическое сопряжение простое, писать для атмеги я немного умею, а низкая скорость не так страшна - жили же с магнитофонами.
хуже, что есть ограничение в 800 кб, но мне неясно, как оно влияет на сеть. допустим корнет это советский iscsi :), но линтех по описанию больше файловый, не?
---------- Post added at 00:46 ---------- Previous post was at 00:25 ----------
esl, спасибо, отличный пост, я и забыл про него. да, выходит что не так сложно задействовать внешнее пзу.
ага, по этому поводу есть давно ждущие планы,
однокристалку на боковой разъем
имеем загрузку из "внешнего пзу", и делаем что-хотим
К сожалению, не все так просто. Дело в том, что ОПТС при чтении внешнего ПЗУ не использует линии стробирования CE и OE. Они, похоже, тупо сидят на земле. ОПТС просто перебирает (через каналы B и С) адреса ПЗУ от 0 до максимального адреса, взятого из той же ПЗУ, и сразу читает данные через канал А. Тебе с твоим микроконтроллером придется отcлеживать изменение всех (вплоть до 16) линий адреса и мнгновенно выдавать данные, соответствующие этому адресу. Боюсь, тут даже скорости STM32 не хватит на такое. Видимо, все же придется ставить полноценную параллельную Flash-память.
Я нарвался на эту проблему, когда подключал PS/2 клавиатуру к корвету - родной клавиатуры у меня нет, пришлось извращаться. Так вот скорости Atmega32-16 не хватило на обработку адреса и вывод данных - пришлось вставлять таткты ожидания процессора через вход RDY.
правда с боковым - есть потенциальные проблеммы
во первых есть 2 типа разъемов, разных (был изначально РП15-50Г
там есть +5 на разъеме, а школьники закорочивали контакты типа ключами ...
Проще выпаять нафиг этот РП15 и поставить нормальный DB-37.
Ну и, кроме 5, там еще и 12В есть на разъеме, что потенциально гораздо опаснее.
---------- Post added at 07:18 ---------- Previous post was at 06:42 ----------
если доступ к накопителю блочный ("сервер, дай мне третий сектор пятого цилиндра"), то ограничения биоса могут проявляться каким-то образом. но при файловом доступе ("сервер, пришли мне klad2.com") биос вроде не затрагивается.
В CP/N сетевые запросы имитируют вызовы BDOS - open, close, fcreate, readseq итд. Оно работает так. Сервер NDR по сети передает маркер - двухбайтовый пакет FF8x, x - номер опрешиваемого РМУ. Если РМУ хочет пообщаться с сервером, то на маркер отвечает пакетом запроса, содержащим номер функции BDOS и подготовленный блок FCB. Сервер обрабатывает запрос и выдает в сеть сектор считываемых данных, ну или принимает сектор данных для записи на диск. Все это эмулировать никаких проблем не составляет.
Но, к сожалению, и блочный доступ тут также используется - для него выделен специальный код функции 0. Правда, только на чтение. Это используется для доступа к каталогу диска. В случае с образом KDI тут тоже никаких проблем, но вот если делать сетевой диск из директрии РС - придется поизвращаться.
по поводу образов на сд-карте - почему бы и нет. если переключение будет возможным через консоль корвета, то образы станут вожделенной альтернативой папок.
Да, конечно, штука получится достаточно удбная. Однако, когда даже убогий PIP будет грузиться секунд 10 - ты быстро озвереешь от такой работы. Хотя, может быть, все не так страшно.
Ну и стоит учесть, что не все здесь электронщики. Многие просто не смогут собрать конструкцию на МК и плюнут на эту красивую идею. Так что это только для себя получится.
Я пока пошел по другму пути - буду делать серверную программу на РС, эмулирующую NDR. Тут тоже трудностей хватает - придется, в принципе, написать с нуля всю дисковую часть BDOS. Зато потом такую программу можно запустить, например, на каком-нибудь андроид-планшете, поключить его к корвету, и получить то же самое, что и МК+SD, только более простым путем. Спаять переходник на компорт из трех сопротивлений и диода граздо проще...
forth32, да, о том и речь, что лвс куда проще делается, чем скоростное устройство на порте расширения. сервер можно запустить почти на чем угодно (я бы предпочёл rpi: андроидов не держу, а целый pc гонять для этого больно жирно).
Ну, воообщем, тут скорее дело вкуса. Главное разобрать протокол, а под чем гонять сервер - дело десятое. И на малинке, и на PC, и на планшете - все тот же линукс, перенести прграмму с железки на железку никаких проблем.
(про сложность эмуляции пзу удивился. какая же там скорость опроса? у корвета максимальное быстродействие меньше 500 тыс. оп./сек.)
Ну, может быть, тут и хватит. С контроллером клавиатуры мне нужно было уложиться в 1 импульс RD шириной в такт - это всего 0.4 мкс. Тут, конечно, от момента выдачи адреса до считывания данных проходят 2 коротких однобайтовых инструкции (ex de,hl и dec de). Это 9 тактов или 3.6 мкс. Сможешь за это время успеть понять, что некоторые из 15 адресных линий изменились, найти в памяти байт, сответствующий новому адресу и выставить его в выходной порт? С учетом того, что адрес процессор выставляет тоже не сразу, а вначале младший байт, потом, через некоторый промежуток времени, старший байт. Я прикинул возможную реализацию и решил, что мне проще впаять флешку, а подключением ее к линии данных управлять с помощью сигнала CS, идущего от МК. Во флешку можно залить хоть всю CP/M вместе с биосом, бдосом и ССР - места хватит.
кстати, будет время - напишите пожалуйста подробнее про протокол, который вы описали.
Какой протокол? CP/N ? Я его еще сам недокопал, сижу понемногу в IDA ковыряю. Как разберусь до конца - выложу здесь описание, и можно будет приступать к созданию самодельной серверной части.
Ну, может быть, тут и хватит. С контроллером клавиатуры мне нужно было уложиться в 1 импульс RD шириной в такт - это всего 0.4 мкс. Тут, конечно, от момента выдачи адреса до считывания данных проходят 2 коротких однобайтовых инструкции (ex de,hl и dec de). Это 9 тактов или 3.6 мкс. Сможешь за это время успеть понять, что некоторые из 15 адресных линий изменились, найти в памяти байт, сответствующий новому адресу и выставить его в выходной порт? С учетом того, что адрес процессор выставляет тоже не сразу, а вначале младший байт, потом, через некоторый промежуток времени, старший байт. Я прикинул возможную реализацию и решил, что мне проще впаять флешку, а подключением ее к линии данных управлять с помощью сигнала CS, идущего от МК. Во флешку можно залить хоть всю CP/M вместе с биосом, бдосом и ССР - места хватит.
я собирался сделать пару упрошений ;)
1) грузим ТОЛЬКО 1 (один) блок (256 байт) - boot loader
2) уже в нем грузим остальное по своему внутреннему протоколу
3) в теории можно отслеживать только 1 линю A0 (ну еще всё проверку наличия ПЗУ как флаг начала загрузки)
4) основной код использует MODE3 8055 (аппаратный flow)
т.е. там надо суммарно чтото около 16 проводов
Порт А как данные
Порт Б/C как управляющий для MODE3
это всё теория, пока не пробовал
по поводу CP/M - есть просто РОМ в котором сразц CP/M вместо бейсика ;)
и кстати - это есть живой контроллер ПЦ клавы для Корвета ???
---------- Post added at 23:05 ---------- Previous post was at 23:02 ----------
Да, конечно, штука получится достаточно удбная. Однако, когда даже убогий PIP будет грузиться секунд 10 - ты быстро озвереешь от такой работы. Хотя, может быть, все не так страшно.
откуда 10 секунд ?!
контролле работает с SD и корвету отдает "блоки"
я собирался сделать пару упрошений ;)
1) грузим ТОЛЬКО 1 (один) блок (256 байт) - boot loader
2) уже в нем грузим остальное по своему внутреннему протоколу
Да, логично, согласен. 8 линий адреса - это уже терпимо. Потом в режиме 2 неторопясь докачать остальное - при этом к МК можно подцепить 4Мбитную SPI флешку, коих как грязи на сдохших матерях. И записать туда целую ОС, даже с утилитами.
Хорошая идея. Завтра поеду в город - попробую подцепить мегу к боковому разъему и сделать пробную загрузку таким способом. У меня вроде бы должен был сохраниться монитор-отладчик для корвета, который я делал, когда его воскрешал из мертвых. На нем можно потренироваться.
3) в теории можно отслеживать только 1 линю A0 (ну еще всё проверку наличия ПЗУ как флаг начала загрузки)
А вот тут я не уверен. ДЕло в том, что ОПТС читает ПЗУ нелинейно - вначале читает только отдельные байты заголовка, а потом уже делает 2 полных прохода - для подсчета КС и загрузки. И тут надо смотреть, не попадутся ли подряд 2 байта с одинаковым младшим битом адреса.
по поводу CP/M - есть просто РОМ в котором сразц CP/M вместо бейсика ;)
Но это немного неспортивно :) Ну и у меня ROM0 намертво впаян в плату, и, учитывая низкое качество самой платы (даже маски нет), выпаивать ее и ставить колодку что-то пока не хочется. Мне бы ГЗУ перепаять на РУ5 для начала...
Кстати, интересно, а в чем смысл загонять CP/M в ПЗУ? Сэкономить 2 дорожки на диске?
и кстати - это есть живой контроллер ПЦ клавы для Корвета ???
Ну, да. А что мне оставалось делать? Мне досталась голая слегка покуроченная плата 8010. Без клавиатуры, разъемов, корпуса... Пришлось извращаться. Взял мегу8515, завел на нее все адреса, строб чтения клавиатуры и ее выходную шину данных. Но ширины одного импульса RD явно нехватало для подготовки выходных данных контроллером - пришлось растягивать чикл чтения клавиатуры через сигнал RDY процессора. В результате изредка имеем непонятные подвисания, природу которых я пока не понял. Ну и некоторые варианты биоса вообще отказываются работать с такой клавиатурой.
Я ведь эмулировал только построчное чтение, и чтение половины матрицы МК целиком (это когда выставляется адрес 00). Чтение произвольных сочетаний строк клавиатуры я делать не стал - слишком долго, нельзя тормозить процессор на такое время. Вобщем, получился костыль, но где мне взять родную корветовскую клавиатуру?
откуда 10 секунд ?!
контролле работает с SD и корвету отдает "блоки"
Вообще-то в данном контексте разговор шел об эмуляции сетевого диска через разъем LAN. Понятно, что через боковой разъем будет летать пулей - быстрее чем с реальной дискеты. Просто тут высказывали мысль, что сделать переходник на LAN проще, чем мудрить с контроллерами...
Боюсь, тут даже скорости STM32 не хватит на такое. Видимо, все же придется ставить полноценную параллельную Flash-память.
Можно ещё поставить статическое ОЗУ. Доступ к нему будет разрешаться битом C7 PPI2 (либо Корвет, либо Мега, наверное можно даже без мультиплексоров). Под сигнал записи в ОЗУ отдать старший бит адреса. А IRQ использовать как сигнал для обработки данных со стороны Корвета.
Получится такая схема:
1. после сброса мега грузит в ОЗУ загрузчик для Корвета и ждёт разрешения доступа C7 PPI2
2. если доступ есть, проверяет в ОЗУ флаг, загрузился ли загрузчик.
3. после того, как загрузчик загрузился, он установит вектор обработчика прерывания, подготовит команду меге, установит флаг и разрешение доступа.
4. мега, дождавшись флага, обработает команду, сбросит флаг и выдаст прерывание. После чего опять ждёт команду.
SaintTurnip
15.06.2014, 15:59
лучше оставить ОС в одном из образов на сд-карте, чтобы можно было обновлять без программатора.
Сергей, а возможно оставить совместимость с дисководами? Мне видится, что нет. Но было бы удобно - A и B для физических устройств, а C...Z для монтирования образов.
(рам-диск наверно и не нужен с такой штукой)
А вот тут я не уверен. ДЕло в том, что ОПТС читает ПЗУ нелинейно - вначале читает только отдельные байты заголовка, а потом уже делает 2 полных прохода - для подсчета КС и загрузки. И тут надо смотреть, не попадутся ли подряд 2 байта с одинаковым младшим битом адреса.
он в строго определённом порядке читает
Reset (check ext rom)
0004
0005
0006
0007
0000...00xx
0000...00xx
---------- Post added at 15:09 ---------- Previous post was at 15:07 ----------
при этом к МК можно подцепить 4Мбитную SPI флешку, коих как грязи на сдохших матерях. И записать туда целую ОС, даже с утилитами.
зачем SPI
SD Card и всё на ней.
---------- Post added at 15:13 ---------- Previous post was at 15:09 ----------
Кстати, интересно, а в чем смысл загонять CP/M в ПЗУ? Сэкономить 2 дорожки на диске?
на реале эти 2 дорожки секунд наверное 5 грузяться ?
уже не помню точно,
т.е. экономия на секундах,
но если работа постоянно идёт с дисковода - то смысл имеет
хотя я бы не ставил такой ром ;)
---------- Post added at 15:20 ---------- Previous post was at 15:13 ----------
Я ведь эмулировал только построчное чтение, и чтение половины матрицы МК целиком (это когда выставляется адрес 00). Чтение произвольных сочетаний строк клавиатуры я делать не стал - слишком долго, нельзя тормозить процессор на такое время. Вобщем, получился костыль, но где мне взять родную корветовскую клавиатуру?
по идее чтение "блок" идёт при xxFF а не 00
наличие PS/2 контроллера это круто!
Вообще-то в данном контексте разговор шел об эмуляции сетевого диска через разъем LAN.
я так и надеялся, но решил уточнить ;)
---------- Post added at 15:07 ---------- Previous post was at 15:02 ----------
Сергей, а возможно оставить совместимость с дисководами? Мне видится, что нет. Но было бы удобно - A и B для физических устройств, а C...Z для монтирования образов.
(рам-диск наверно и не нужен с такой штукой)
это надо делать конфигурябельно
пользователь сам определяет (например в конфиге), какие диски мапить на образ а какие на реальное железо
это позволит форматировать/копировать на реальные диски - если они есть
или для пк8010 вообще быть без дисководов реальных
рамдиск вообще не мешает ;)
в голову приходило что в cp/m диском D монтировать образ где всегда есть "менеджер виртуальных дисков" и другие полезные программы (в 800к их можно все напихать)
мое имхо больше дисков то и не нужно, при возможности перемонтировать
кол-во дисков лимитировано в биос (буфера под служебные области) и сейчас это
в CP/M только A,B,C,D+E
в микродосе A,B (иногда E)
но если будет надо - можно сделать и больше.
---------- Post added at 15:29 ---------- Previous post was at 15:20 ----------
Можно ещё поставить статическое ОЗУ. Доступ к нему будет разрешаться битом C7 PPI2 (либо Корвет, либо Мега, наверное можно даже без мультиплексоров). Под сигнал записи в ОЗУ отдать старший бит адреса. А IRQ использовать как сигнал для обработки данных со стороны Корвета.
интересная идея.
но я хотел чтоб было минимум микросхем, в идеале одной мегой обойтись.
Можно ещё поставить статическое ОЗУ. Доступ к нему будет разрешаться битом C7 PPI2 (либо Корвет, либо Мега, наверное можно даже без мультиплексоров). Под сигнал записи в ОЗУ отдать старший бит адреса. А IRQ использовать как сигнал для обработки данных со стороны Корвета.
Так, вроде понял твою идею. Значит, после старта заливаем в ОЗУ загрузчик, ждем, когда он прочитается, запустится и дернет линию control (PPI2 C7), а потом просто ждем команды от корвета и по необходимости или заливаем ему в ОЗУ блок данных, или читаем его оттуда.
Идея, вроде бы, здравая. Если мы делаем универсальный картридж для заливки в корвет системно-независимых программ, то получается то, что надо. Правда, без мультиплексоров на шине адреса все равно не обойтись.
Дело в том, что на боковой разъем не выведен сигнал RESET. Это, конечно, типичное разгильдяйство разработчиков - всякий мусор типа -12в вывели, а такой важный сигнал забыли. В результате мы можем поймать момент перезагрузки корвета только по деганию линии control. А поскольку после сброса все каналы PPI находяится в режиме вывода данных, может возникнуть неприятный конфликт.
Ну, да ладно. Все же - что мы хотим в конечном итоге получить? Тут, вроде как, обсуждается загрузчик CP/M с эмуляцией сетевых дисков. И в таком режиме буферное ОЗУ не дает никаких реальных преимуществ. Ибо тут будет так. Программа захотела прочитать сектор диска. Сетевой драйвер BIOS отправляет запрос в наш контроллер и впадает в цикл ожидания, затем контроллер набивает байт за байтом содержимое сектора в буферное ОЗУ, и сообщает драйверу что все готово (все это время драйвер висит в цикле ожидания). Затем драйвер байт за байтом вычитывает ОЗУ в буфер DMA и отдает его пользователю.
Но тогда проще перекидать сектор байт за байтом непосредственно из контроллера в порт, без промежуточной буферизации. Времени на это уйдет не больше, а может быть и меньше. Как справедливо заметил ESL, режим 2 PPI как раз для этого и предназначен. Единственное тонкое место, в котором может потребоваться буферная память - это начальная загрузка загрузчика ОС средствами ОПТС. Там жесткие тайминги и дурацкий протокол. Но я завтра попробую средствами меги сэмулировать начальную загрузку - сразу все станет ясно.
---------- Post added at 18:01 ---------- Previous post was at 17:39 ----------
он в строго определённом порядке читает
Ну, тогда ладно. Правда, есть один неприятный момент - ОПТС вначале выставляет младший адрес, а затем, через некоторое время, старший. Причем во время чтения байтов заголовка старший адрес вообще не формируется. А ты получаешь строб по младшему адресу, и отловить момент смены старшего - несколько нетривиальная задача. Впрочем, если мы читаем только 256 байт, то тут ты на 100% прав - старшего адреса нет, можно стробироваться по A0. Это я завтра опробую.
зачем SPI
SD Card и всё на ней.
А, ну если делать полностью автономное устройство, без интерфейса к PC, то да - сдкарту и на нее все образы. Правда, карта все равно будет в SPI режиме использоваться. А поддерживают ли современные SDHC карты такой режим?
А старую 2-гиговую карту найти теперь проблема...
На карте будет файловая система, придется в мегу пихать еще и драйвер FAT. Потянет все это мега? Должна, по идее. Хотя, я бы предпочел какой-нибудь ARM , например STM32 или TI Stellaris
на реале эти 2 дорожки секунд наверное 5 грузяться ?
уже не помню точно,
Насчет 5" дисководов не скажу, у меня на 3.5" грузится примерно секунду, а то и меньше. 2 доржки - это же 1 цилиндр, перемещения головки нет.
То есть экономия копеечная и бессмысленная. Но посмотреть интересно. Сейчас найду этот ROM и в эмулятор его.
по идее чтение "блок" идёт при xxFF а не 00
Гы. Ты рассуждаешь как программист. С точки зрения программиста - да, в адрес вписыается FF. Только вот между шиной адреса и разъемом клавиатуры стоит блок инверторов, и к контроллеру уже приходит 00. То есть клавиатура опрашивается именно подтяжкой горизонтали матрицы к земле. А на выходе клавиатуры стоит еще один блок инверторов, так что для процессора нажатая кнопка выглядит как 1, а для контроллера клавиатуры - как 0.
Если кому когда-нибудь потребуется - могу нарисовать и выложить схему и исходники прошивки. Контроллер - мега 8515. Только над такими исходниками народ смеяться будет... Делались они по принципу - быстрее бы заработало и можно поиграть с корветом.
Ну, сервером на PC я сейчас понемногу занимаюсь. Надеюсь, скоро смогу показать первые наработки. А вот тут я не понял:
Предложение. Давайте проектировать так, чтобы накопитель не занимал шину монопольно. Наворачивать много корпусов не хочется, но и терять шину жаль (у меня например есть планы на нее).
Шина - это порт расширения, так? Предлагаешь вешать на нее гирлянду устройств разного назначения и с разными протоколами? Но тогда и драйверов в биосе придется делать кучку и как-то согласовывать их работу - то есть вырабатывать единый протокол доступа, типа IEEE1284 для LPT-порта.
Не проще ли втыкать в порт то, что в данный момент нужно? Или требуется именно совместная работа нескольких устройств?
Вообще-то тогда пора подумать о системной шине, что выведена на разъем на плате рядом с процессором. Вот туда действительно можно напихать что угодно в любых количествах, только забуферировать не забыть. И RESET там есть :)
SaintTurnip
15.06.2014, 20:47
forth32, ох я протупил. Множественный доступ к порту это та еще задница.
Вот про системную шину процессора не знал, спасибо. Однако знаний скорее всего не хватит на что-нибудь вроде "нужно было уложиться в 1 импульс RD шириной в такт", поэтому трогать этот порт не буду.
На фотографии платы вижу еще несколько ВВ55. Почитаю про них.
forth32, ох я протупил. Множественный доступ к порту это та еще задница.
Да нет, все решаемо при желании. В 1284 ведь сделали, и довольно неплохо. А порт расширения корвета потолще, чем LPT-порт писюков, и работать с ним удобнее. Но только поздно уже придумывать всякие стандарты, этих корветов осталось-то пара сотен на всю планету. Вот был бы в конце 80-х такой форум... Даже фидо ведь несколько позже появилось.
Вот про системную шину процессора не знал, спасибо. Однако знаний скорее всего не хватит на что-нибудь вроде "нужно было уложиться в 1 импульс RD шириной в такт", поэтому трогать этот порт не буду.
Ну да, тут тоже не все так просто. Ибо нужно учитывать текущую конфигурацию памяти, то есть держать у себя в железке копию SYSREG и подключать свои порты в нужные адреса. Пожалуй, оно того не стоит. А так, конечно, можно было бы даже писюшные ISA-карты подключать к корвету, немного помудрив с адресами. Мультикарты, саундбластеры, модемы...
На фотографии платы вижу еще несколько ВВ55. Почитаю про них.
Остальные ВВ55 забиты наглухо. Принтер, видеоконтроллер, дисковод, магнитофон... Так что лучше ориентируйся все же на порт расширения.
SaintTurnip
15.06.2014, 22:08
А так, конечно, можно было бы даже писюшные ISA-карты подключать к корвету, немного помудрив с адресами. Мультикарты, саундбластеры, модемы...
Собственно, хочу звука добавить.
Остальные ВВ55 забиты наглухо. Принтер, видеоконтроллер, дисковод, магнитофон... Так что лучше ориентируйся все же на порт расширения.
Магнитофон и дисковод еще могут пригодиться, а принтер определенно можно пустить на свои нужды. Кому он нынче нужен.
Собственно, хочу звука добавить.
;)
можно AY повесить прямо на порт расширения - вообще просто
если делать KDI EXTender - то можно уже у него сделать "расширение портов" и поверх него вешать AY
или делать переключатель шины, и отключать KDI EXTender
там есть бит с другого порта, можно им
но это уже огород городить.
правда есть еще нечто под названием ЭУ8040*"ЭЛЕМЕНТ УПРАВЛЕНИЯ ЭУ8040"
и его дочерние платы, но имхо городить его не стоит ;)
описание есть тут (http://zx.pk.ru/showthread.php?t=9258&highlight=%DD%D38040&page=2)
я его описание только тут увидел, а до этого даже не слышал и в софта с его поддержкой не видел ;)
Ну, тогда ладно. Правда, есть один неприятный момент - ОПТС вначале выставляет младший адрес, а затем, через некоторое время, старший. Причем во время чтения байтов заголовка старший адрес вообще не формируется. А ты получаешь строб по младшему адресу, и отловить момент смены старшего - несколько нетривиальная задача. Впрочем, если мы читаем только 256 байт, то тут ты на 100% прав - старшего адреса нет, можно стробироваться по A0. Это я завтра опробую.
я хотел вешать перывание PINCHANGE на A0 ;)
в аттаче табличка котороую тут рисовал для себя, может будет полезна
там выводы разъемово (оба типа)
что пишет/читает ROM
планы распиновки mega128
48441
На карте будет файловая система, придется в мегу пихать еще и драйвер FAT. Потянет все это мега? Должна, по идее. Хотя, я бы предпочел какой-нибудь ARM , например STM32 или TI Stellaris
ты их же есть ;)
FatFs/Petit FatFs Module
http://elm-chan.org/fsw/ff/00index_e.html
и
https://github.com/vinxru/VinxFs
она требует по описанию 512 + 50 байтов памяти и 6-7к кода всего
stm32 это как вараинт, но по идее мег должно хватить для начала
главное разработать прототип а потом уже можно и на более "толстом" железе сделать всякие вкусности.
SaintTurnip
16.06.2014, 01:42
у меня была такая мышь, но без софта. утеряна.
звук хочу не AY, а набор банков, куда смогу заливать сэмплы и по команде проигрывать.
расширение портов у KDI EXT - хорошая идея, но и непаханное поле для дебага :)
Гы. Ты рассуждаешь как программист.
есть такое дело, я не электронщик ;)
я хотел вешать перывание PINCHANGE на A0 ;)
Поправь меня если ошибаюсь, но, насколько я помню, в меге 128 нет прерывания PINCHANGE. Его вообще почти ни в одной меге нет - это для тинек обычное дело. Если бы было - я бы не ныл тут о сложности захвата адреса, а ловил бы любое самое малое изменение в адресном порте в виде прерывания :) Но зато есть штук 8 обычных extint, и какое-то из них наверняка выведено на нулевой бит какого-нибудь порта.
Во, глянул даташт. PD0=INT0, как раз то что надо.
в аттаче табличка котороую тут рисовал для себя, может будет полезна
там выводы разъемово (оба типа)
что пишет/читает ROM
планы распиновки mega128
Я, наверно, еще тупой после вчерашнего, но что-то не могу понять из вкладки 3, куда ты собирался выводить старший и младший байты адреса. На порты A и C, что ли? Я так понимаю, это даже не чистая мега, а ты уже какую-то плату собрал и даже разъемы поставил (колока А табилцы).
---------- Post added at 06:34 ---------- Previous post was at 06:23 ----------
;)
правда есть еще нечто под названием ЭУ8040*"ЭЛЕМЕНТ УПРАВЛЕНИЯ ЭУ8040"
и его дочерние платы, но имхо городить его не стоит ;)
Кстати, в не сохранилось ли у тебя копий тех схем? Там ссылки уже дохлые. А глянуть было бы интересно.
Поправь меня если ошибаюсь, но, насколько я помню, в меге 128 нет прерывания PINCHANGE. Его вообще почти ни в одной меге нет - это для тинек обычное дело. Если бы было - я бы не ныл тут о сложности захвата адреса, а ловил бы любое самое малое изменение в адресном порте в виде прерывания :) Но зато есть штук 8 обычных extint, и какое-то из них наверняка выведено на нулевой бит какого-нибудь порта.
Во, глянул даташт. PD0=INT0, как раз то что надо.
я же готовился ;)
для мег их >1 как я понял, у тинек 1
Я, наверно, еще тупой после вчерашнего, но что-то не могу понять из вкладки 3, куда ты собирался выводить старший и младший байты адреса. На порты A и C, что ли? Я так понимаю, это даже не чистая мега, а ты уже какую-то плату собрал и даже разъемы поставил (колока А табилцы).
просто дома есть такое (оно под другую задачу было)
https://dl.dropboxusercontent.com/u/490774/mega128kit/P1460181.JPG
https://dl.dropboxusercontent.com/u/490774/mega128kit/P1800331.JPG
http://kosmodrom.com.ua/razrabotka/maket/atmega128kit-board.php
под нее и думал.
правда сейчас должны приехать ардуинки, может с ними буду пробовать ;)
---------- Post added at 09:40 ---------- Previous post was at 09:37 ----------
Кстати, в не сохранилось ли у тебя копий тех схем? Там ссылки уже дохлые. А глянуть было бы интересно.
https://yadi.sk/d/vBSOiBOlTVDaX
https://yadi.sk/d/D0D6buftTVDmY
https://yadi.sk/d/PiSCUxKCTVDpR
https://yadi.sk/d/bJm-K9scTVDry
SaintTurnip
16.06.2014, 21:03
PINCHANGE
извините, объясните, почему нельзя в духе
while(not_enough) { porta=read_eeprom(portb+offset) } ?
извините, объясните, почему нельзя в духе
while(not_enough) { porta=read_eeprom(portb+offset) } ?
Можно, но тогда надо под это дело 8 пинов отдать
А так можно одним обойтись, если это сработает.
Да, код сложнее но что делать.
По идее для скорости надо не из eeprom читать а из буфера в озу
Это как всегда или-или, что важнее.
Чем меньше пинов - тем проще проц поставить можно.
извините, объясните, почему нельзя в духе
while(not_enough) { porta=read_eeprom(portb+offset) } ?
Бесконечным циклом читать данные по нужному адресу и выставлять в выходной порт? Интересная идея.
Я тут давеча уже говорил, что нужно уложиться в 9 машинных тактов 580ВМ80. Как минимум. Лучше, наверное, в 8, чтобы к моменту чтения данные в порту уже стабилизировались. Попробуй прикинь, в какой кусок программного кода на ассемблере развернется твоя красивая строка на C? :) Уложишься в 3.2 мкс?
Кстати, может быть и уложишься. Я думаю что код будет примерно такой:
LDI R0,ROMDATA_H
LOOP:
IN ZL,PINB
ADD ZL,ROMDATA_L
ADC ZL,R0
LPM R16,Z
OUT PORTA,R16
TST ENDFLAG
BRNE LOOP
Ну и выход из этого цикла по прерыванию, устанавливающему флаг endflag. Лень вспоминать растактовку, но это будет примерно 10 тактов. На 16 МГц это будет 0.6 мкс.
Но встает проблема синхронизации. Ты можешь выбрать адрес незадолго до того, как он поменялся на входе, и выставить хосту неправильный байт. Пока выбираешь новый адрес, ищешь байт и пихаешь на выход - хост успеет неправильный байт прочитать. Наверное. Хотя, пожалуй, при цикле в 0.6 мкс данные успеют обновиться. Короче, тут проверять надо. Как только поборю лень и припаяю кабель к разъему DB37 - проверю и расскажу что получилось.
---------- Post added at 22:01 ---------- Previous post was at 21:58 ----------
Можно, но тогда надо под это дело 8 пинов отдать
А так можно одним обойтись, если это сработает.
Чтобы обойтись 1 пином, надо гарантированно поймать момент перезапуска ОПТС - у тебя ведь жесткая привязка к последовательности адресов. А как, все же, RESET собираешься ловить? По дерганию ножки select?
SaintTurnip
16.06.2014, 23:21
esl, один пин сэкономит не много, а программу усложнит. стоит ли?
forth32, оптимистично исходил из трех циклов while к одном чтению. даже если компьютер выставит новый адрес в самый невыгодный момент, то следующего цикла ждать недолго - у нас полно времени, чтобы прочитать и выдать данные (если быть точным, то два полных цикла while).
сколько времени будут устанавливаться данные на порту атмеги не знаю, но едва ли это сотни наносекунд. еще 0.1-0.5 мкс на прохождение данных через ВВ55. таким образом, даже при неудачном стечении обстоятельств у процессора данные будут актуальными целых 1-2 мкс и как раз в нужный момент, если верить твоему замечанию "от момента выдачи адреса до считывания данных проходят 2 коротких однобайтовых инструкции (ex de,hl и dec de). Это 9 тактов или 3.6 мкс"
По идее для скорости надо не из eeprom читать а из буфера в озу
прикинь, в какой кусок программного кода на ассемблере развернется твоя красивая строка на C
это была идея на псевдокоде.
Чтобы обойтись 1 пином, надо гарантированно поймать момент перезапуска ОПТС - у тебя ведь жесткая привязка к последовательности адресов. А как, все же, RESET собираешься ловить? По дерганию ножки select?
конечно, он же ОБЯЗАТЕЛЬНО дергается чтоб ОПТС определил что есть EXT ROM
т.к. на оригинальной железке как понял он выставляет CS для ПЗУ.
ну и проверка та что на вход PIC
на него прерыание и вход в режим EXT BOOT
---------- Post added at 23:54 ---------- Previous post was at 23:53 ----------
esl, один пин сэкономит не много, а программу усложнит. стоит ли?
экономия 7 пинов а не 1 ;)
SaintTurnip
17.06.2014, 01:02
экономия 7 пинов а не 1
я говорил про 7 ног в условиях избытка. или есть какие-то планы?
я говорил про 7 ног в условиях избытка. или есть какие-то планы?
я насчитывал 14 необходимых портов, если к ним кщк 7 прибавить это уже 21 ;)
а вообще надо пробовать, и смотреть что возможно.
Тут, конечно, от момента выдачи адреса до считывания данных проходят 2 коротких однобайтовых инструкции (ex de,hl и dec de). Это 9 тактов или 3.6 мкс.
посчитал тут такты немного, имхо там больше тактов
определение EXTROM
его ловим как инициатор старта "загрузчика"
сначала ставит c.7=0
потом ставит c.7=1 (это для нас признак начала работы)
с момента c.7=1 до первого чтения 67 тактов
RAM:04C5 mvi m, 0Eh ;0 000 111 0 (setc.7=0)
RAM:04C7 ;
RAM:04C7 ldax d
RAM:04C8 cma
RAM:04C9 ani 1
RAM:04CB jz noRom
RAM:04CE mvi m, 0Fh
RAM:04D0 ldax d ; 7
RAM:04D1 ani 1 ; 7
RAM:04D3 jnz okRom ; 10
...
RAM:0546 okRom: ; CODE XREF: RAM:04D3j
RAM:0546 mvi l, 0Bh ; 7 FA0B PPI0.RUS
RAM:0548 mvi m, 90h ; 10 1 00 1 0 0 0 0 = A - in, BC - OUT
RAM:054A mvi l, 9 ; 7 FA09 PPI0.B
RAM:054C mvi m, 4 ; 10 set ext addr=0004
RAM:054E xchg ; 4
RAM:054F dcx d ; 5 67=7+7+10+7+10+7+10+4+5 after c.7=1
RAM:0550 ldax d ;! 7 !
дальше, самый короткий интервал между сменой бита в адрессе и чтением - 33такта
вот в этом куске
RAM:054E xchg ; 4
RAM:054F dcx d ; 5 67=7+7+10+7+10+7+10+4+5 after c.7=1
RAM:0550 ldax d ;! 7 !
RAM:0551 mov l, a ; 4
RAM:0552 call extRomIncAddr ; 17+16 33T aftrer bit change
RAM:0555 ldax d ;
RAM:0556 mov h, a
т.е. самый короткий цикл - 33 такта
в циклах чтения/проверки/сравнения минимум вроде 43 такта
RAM:04BC ExtROM: ; CODE XREF: RAM:04AAj
RAM:04BC call CLS
RAM:04BF lxi h, PPI2_RUS
RAM:04C2 lxi d, PIC_RUS
RAM:04C5 mvi m, 0Eh ;0 000 111 0 (setc.7=0)
RAM:04C7 ;
RAM:04C7 ldax d
RAM:04C8 cma
RAM:04C9 ani 1
RAM:04CB jz noRom
RAM:04CE mvi m, 0Fh
RAM:04D0 ldax d ; 7
RAM:04D1 ani 1 ; 7
RAM:04D3 jnz okRom ; 10
RAM:04D6
RAM:04D6 noRom: ; CODE XREF: RAM:04CBj
RAM:04D6 ora c
RAM:04D7 jz R_LOAD_TST
RAM:04DA lxi h, mNoRom ; "Подключите внешнее ПЗУ"
RAM:04DD jmp msgHalt
RAM:04E0 ; ---------------------------------------------------------------------------
RAM:04E0
RAM:04E0 romError: ; CODE XREF: RAM:0574j
RAM:04E0 lxi h, mRomError ; "Внешнее ПЗУ неисправно"
RAM:04E3
RAM:04E3 msgHalt: ; CODE XREF: RAM:04DDj
RAM:04E3 lxi d, ACZU
RAM:04E6 call toSCR
RAM:04E9
RAM:04E9 _HALT: ; CODE XREF: RAM:05B0j
RAM:04E9 ; RAM:05C0j
RAM:04E9 hlt
RAM:0546 okRom: ; CODE XREF: RAM:04D3j
RAM:0546 mvi l, 0Bh ; 7 FA0B PPI0.RUS
RAM:0548 mvi m, 90h ; 10 1 00 1 0 0 0 0 = A - in, BC - OUT
RAM:054A mvi l, 9 ; 7 FA09 PPI0.B
RAM:054C mvi m, 4 ; 10 set ext addr=0004
RAM:054E xchg ; 4
RAM:054F dcx d ; 5 67=7+7+10+7+10+7+10+4+5 after c.7=1
RAM:0550 ldax d ;! 7 !
RAM:0551 mov l, a ; 4
RAM:0552 call extRomIncAddr ; 17+16 33T aftrer bit change
RAM:0555 ldax d ;
RAM:0556 mov h, a
RAM:0557 call extRomIncAddr
RAM:055A push h ; 4,5 START addr
RAM:055B ldax d
RAM:055C mov h, a
RAM:055D mvi l, 0
RAM:055F call extRomIncAddr
RAM:0562 push h
RAM:0563 ldax d
RAM:0564 mov b, a
RAM:0565 call resetRomAddr
RAM:0568 mvi c, 0
RAM:056A
RAM:056A crcLoop: ; CODE XREF: RAM:0570j
RAM:056A ldax d ; 7
RAM:056B add c ; 4
RAM:056C mov c, a ; 5
RAM:056D call extRomIncAddr ; 17+16
RAM:0570 jnz crcLoop ; 10
RAM:0573 inr c
RAM:0574 jnz romError
RAM:0577 call resetRomAddr
RAM:057A
RAM:057A rom2ramLoop: ; CODE XREF: RAM:0580j
RAM:057A ldax d ; 7
RAM:057B mov m, a ; 7
RAM:057C inx h ; 5
RAM:057D call extRomIncAddr ; 17+16
RAM:0580 jnz rom2ramLoop ; 10
RAM:0583 call resetRomAddr
RAM:0586 lxi h, ACZU+40h
RAM:0589 xthl
RAM:058A mvi c, 38h ; '8'
RAM:058C
RAM:058C VerifyRom: ; CODE XREF: RAM:05B9j
RAM:058C ldax d ; 7
RAM:058D cmp m ; 7
RAM:058E jz VerifyRomNextByte
RAM:0591 xchg
RAM:0592 xthl
RAM:0593 call PutHexDE
RAM:0596 mvi m, 20h ; ' '
RAM:0598 inx h
RAM:0599 ldax d
RAM:059A call PutHexA
RAM:059D mvi m, 20h ; ' '
RAM:059F inx h
RAM:05A0 xthl
RAM:05A1 mov a, m
RAM:05A2 xthl
RAM:05A3 call PutHexA
RAM:05A6
RAM:05A6 loc_5A6: ; CODE XREF: RAM:05ACj
RAM:05A6 mvi m, 20h ; ' '
RAM:05A8 inx h
RAM:05A9 mov a, l
RAM:05AA ani 0Fh
RAM:05AC jnz loc_5A6
RAM:05AF dcr c
RAM:05B0 jz _HALT
RAM:05B3 xthl
RAM:05B4 xchg
RAM:05B5
RAM:05B5 VerifyRomNextByte: ; CODE XREF: RAM:058Ej
RAM:05B5 inx h
RAM:05B6 call extRomIncAddr ;17+16
RAM:05B9 jnz VerifyRom ;10
RAM:05BC pop h
RAM:05BD mov a, c
RAM:05BE cpi 38h ; '8'
RAM:05C0 jnz _HALT
RAM:05C3 pop h
RAM:05C4 pchl
RAM:05C4 ; ---------------------------------------------------------------------------
RAM:05C5 mNoRom: .text "Подключите внешнее ПЗУ"
RAM:05C5 .db 0
RAM:05DC mRomError: .text "Внешнее ПЗУ неисправно" ; DATA XREF: RAM:romErroro
RAM:05DC .db 0
RAM:05F3
RAM:05F3 ; =============== S U B R O U T I N E =======================================
RAM:05F3
RAM:05F3
RAM:05F3 resetRomAddr: ; CODE XREF: RAM:0565p
RAM:05F3 ; RAM:0577p ...
RAM:05F3 xra a
RAM:05F4 inx d
RAM:05F5 stax d
RAM:05F6 inx d
RAM:05F7 stax d
RAM:05F8 dcx d
RAM:05F9 dcx d
RAM:05FA ret
RAM:05FA ; End of function resetRomAddr
RAM:05FA
RAM:05FB
RAM:05FB ; =============== S U B R O U T I N E =======================================
RAM:05FB
RAM:05FB
RAM:05FB extRomIncAddr: ; CODE XREF: RAM:0552p
RAM:05FB ; RAM:0557p ...
RAM:05FB inx d ;5 5
RAM:05FC ldax d ;7 12
RAM:05FD inr a ;5 17
RAM:05FE stax d ;7 24
RAM:05FF dcx d ;5 29 5
RAM:0600 rnz ;11 yes/5 40/34 16 (after bit change)
RAM:0601 inx d ;5 39
RAM:0602 inx d ;5 44
RAM:0603 ldax d ;7 51
RAM:0604 inr a ;5 56
RAM:0605 stax d ;7 63
RAM:0606 dcx d ;5 68
RAM:0607 dcx d ;5 73
RAM:0608 cmp b ;4 77
RAM:0609 ret ;10 87
RAM:0609 ; End of function extRomIncAddr
RAM:0609
посчитал тут такты немного, имхо там больше тактов
Ну, я гворил об этом:
Start_ext_ROM: ; CODE XREF: 0000:04CEj
ld l, 0Bh
ld (hl), 90h ; 'Р' ; IOP3 CWR
; порты B C - на вывод
; Порт A - ввод
; режим 0
ld l, 9 ; IOP3 port B
ld (hl), 4 ; (b)=4
ex de, hl
dec de
ld a, (de) ; Читаем порт A
ld l, a ; -> L
ld (hl),4 - выставляет адрес. Потом 2 короткие инструкции и чтение порта. Я тогда еще не понял до конца твою идею об обработке адреса по перепадам A0. Если так - то да, это первый читаемый байт и адрес его заранее известен.
Очень хочется проверить ее в железе. Но все как-то руки не поднимаются браться за паяльник. Заканчиваю отладку сервера CP/N-90, чтобы уже проверенное описание проткола опубликовать. А так я уже и программу для AVR написал, и мегу-32 в загашнике нашел. Осталось 12 проводков от разъема к макетке протянуть и мегу зашить.
понял, а то попалось "9 тактов", решил уточнить.
кстати, можно и без pinchange обойтись ?
тут я плавая, просто идея
while( portb != 4)
porta=B4
while( portb == 4)
porta=B5
while( portb == 5)
porta=B6
while( portb == 6)
porta=B7
while( portb == 7)
//crc
dataptr=0
do
{
porta=data[dataptr]
while( portb == dataptr)
dataptr++
} while ( dataptr != 0x100 );
again load
again compare
тут я плавая, просто идея
Ага, кажется понял. Вроде мы нечто подобное уже недавно обсуждали. То есть это одна из вариаций предложенного ранее
while(flag) { porta=data(pinb); }
Ну и выход из цикла, когда внешний сигнал от запустившегося загрузчика перекинет flag. Работать оно, кончно, будет. Только тогда придется распаивать полный порт B на все 8 бит адреса. Иначе твоя красивая конструкция while( portb == dataptr) работать не будет. А мы же хотели обойтись одним проводом нулевого бита адреса. Тут путь видится другой - создавать таблицу последовательности адресов и первые байты выбрать по ней, а потом уже по порядку. Я уже прикинул получающийся код, может быть кривенько, но надо проверить.
Блин. Пожалуй, завтра все же попробую взяться за паяльник. Пора начать проверять идеи в железе.
Только тогда придется распаивать полный порт B на все 8 бит адреса. Иначе твоя красивая конструкция while( portb == dataptr) работать не будет.
зачем 8, дочтаточно 1го ;)
проверка ведь на равенство/неравенство, т.е. нас интересует что он изменился
а конкретно какие биты за что отвечают - не важно ;)
остальные то точно не изменятся (их некому менять)
зачем 8, дочтаточно 1го
проверка ведь на равенство/неравенство, т.е. нас интересует что он изменился
а конкретно какие биты за что отвечают - не важно
остальные то точно не изменятся (их некому менять)
Так это...
Во-первых (на правах зануды, ты уж извини) portb вообще не поменяется никогда, пока сам его не запишешь. Если пин настроен на ввод (DDRB=0), то он определяет только состояние резистора подтяжки. Данные читают из PINB. Но это так, к слову.
А по существу вот что. У тебя dataptr - указатель в массиве передаваемых данных. Он пробегает все значения от 00 до FF. PINB - у него подключен только младший пин. Он принимает занчения 0 или 1. Поэтому, например, при dataptr=5, условие dataptr==pinb НИКОГДА не выполнится. Ни разу. Ибо dataptr будет равен 5, а pinb при этом = 1. Твоя программа просто вытолкнет на максимально возможной скорости все 256 байтов в порт А, пролетая уловие dataptr==pinb за один машинный цикл. Без всякой синхронизации с корветом.
Правильным будет такой вариант - while (pinb == (dataptr&1)); Вот так оно действительно будет работать. При этом мы просто от обработки адреса по прерыванию перешли на обработку по программному опросу. Ну, это нам сэкономит несколько тактов AVR, ибо вход в прерывание происходит достаточно медленно. Однако мы тут вроде посчитали, что у нас времени на выставление данных заложено с запасом. Так что, я думаю, можно делать хоть по прерыванию, хоть по опросу. Как легче писать.
Или я не прав и просто неправильно понял твою идею? Поправь, если ошибаюсь...
SaintTurnip
22.06.2014, 21:39
while (pinb == (dataptr&1))
forth32, красиво!
Так это...
Во-первых (на правах зануды, ты уж извини) portb вообще не поменяется никогда, пока сам его не запишешь. Если пин настроен на ввод (DDRB=0), то он определяет только состояние резистора подтяжки. Данные читают из PINB. Но это так, к слову.
ты прав конечно, эт я торможу, под portb я имел в виду данные из порта "B"
собственно я даже имел в виду скорее такое
//crc
dataptr=0
prevvalue=portb
do
{
porta=data[dataptr]
while( portb == prevvalue)
prevvalue=portb
dataptr++
} while ( dataptr != 0x100 );
т.е. что просто ловить изменение порта,
ловить не конкретный бит (тем более что не обязательно мапить A0 на бит0 контроллера, а можно мапить на удобный.
похоже написал одно а думал про другое ;)
ну а вообще ты прав конечно, это уже вариации на тему ;)
хотя опять же, это оптимизации еще не существуюшего кода
а как писал Вирт ...
Итак, рассказываю о первых опытах загрузки через боковой разъем корвета. Вначале предыстроия - о набитых по дороге шишках.
Я собрал макетку с Atmega32, подключил порт A меги к каналу A корвета, прерывание int0 меги - к сигналу Control, in1 - к каналу PB0 (0 бит адреса). То есть я пошел по пути, предложенному ESL - стробироваться единственным адресным битом. Получилась шина из 12 проводов (8 данных, 2 строба, земля, питание). Выглядит это так:
http://zx-pk.ru/picture.php?albumid=135&pictureid=928
http://zx-pk.ru/picture.php?albumid=135&pictureid=927
Написал программу для AVR, и небольшую тестовую программку для загрузки в корвет (она просто выводит строчку на экран и останавливает процессор). Запустил. И сразу огреб ошибку ОПТС - ОШИБКА ШИНЫ. Пришлось разбираться.
Во-первых, я решил просимулировать процесс загрузки. Еще раз спасибо ESL за сорцы его эмулятора. Я приделал к эмулятору загрузку с внешнего ПЗУ (добавил ключ -r в командную строку), и получил ту же самую Ошибку Шины! Уже в эмуляторе. Оказалось (я это разбирал в свое время в IDA, но уже забыл), что сумрачные гении, писавшие ОПТС, додумались тестировать шину путем записи битовых образцов в канал А того самого ВВ55, который выведен на боковой разъем. Предварительно переключив этот канал в режим вывода. Они решили, что это хорошая идея - срать в порт, к которому неизвестно что подключено и который они же потом используют для ввода. В конце концов, если уж так хочется, есть же порт данных принтера, к которому точно ничего, кроме принтера, подключено быть не может. А боковой разъем они же сами позиционировали как универсальный для радиолюбителей (судя по статьям в том же журнале радио). За такое я бы яйца отрывал, причем медленно.
Дело в том, что ВВ55 обладает интересной особенностью. При чтении порта он всегда выдает текущее состояние своих ножек. Независимо, работает канал на ввод или на вывод. В результате, если порт работает на вывод, в канал записана 1, а внешний сигнал подтянул ножку к земле - из канала прочитается 0. Отсюда и ошибка шины - моя бедная мега просто перетянула к земле некоторые биты порта. Оказалось, что переключать порт меги на вывод можно только после того, как сигнал Control станет 1. До этого порт должен быть в режиме ввода, чтобы не мешать ОПТС развлекаться с тестом шины. Проблема в том, что этот самый сигнал Control в момент включения питания может несколько раз дернуться вверх-вниз, и это все надо отслеживать.
Далее я доработал эмулятор для отслеживания сигнала control, и заодно добавил туда сборку лога обращений к эмулируемой внешней ПЗУ. Оказалось, что с полследовательностью адресов мы не ошиблись - 4,5,6,7,0 и далее 3 раза по кольцу все 256 адресов. Заодно проверил свою тестовую программку - в эмуляторе она загрузилась и запустилась нормально.
Теперь, зная о подводных камнях, я исправил программу в AVR. Приходится отслеживать оба перепада сигнала Control. Если он стал 0 - немедленно переводим порт А в режим ввода и ждем. Если стал 1 - выставляем в порт А первый в цепочке байт (по адресу 4) и начинаем отслеживать перепады PB0, выставляя по порядку байты в порт А. Вот и весь процесс загрузки.
В результате я получил 2 варианта загрузчика для AVR - один использует прерывание от PB0 (типа Pinchange - по обоим перепадам сигнала), другой - программный опрос сигнала PB0. Работоспособны оба. Но программный опрос имеет, на мой взгляд, 2 преимущества - он короче на 14 байт и может работать с любым битом любого порта AVR, то есть освобождается ценное прерывание Int1. А в меге32 этих прерываний всего 3, не так уж и много. Прикладываю к посту архив с обоими вариантами загрузчика. exr.asm - вариант с прерываниями, exr-poll.asm - вариант с программным опросом. extrom.bin - загружаемый блок с тестовой программкой. Для тех, кто захочет повторить мой эксперимент (похоже, вряд ли такие найдутся, но а вдруг...) - надо выставить FUSE на тактирование от внутреннего генератора на 8 МГц, и включить детектор напряжения питания на 4.5 V - чтобы программа не сходила с ума в момент включения питания. Естественно, можно использовать любую мегу, не только 32, и даже тиньку. Только подправить программу на используемые порты.
256-байтовый блок для загрузки в корвет размещается в NVRAM меги с адреса 0. Его можно прошить отдельно с помощью того же avrdude c ключем -U nvram. То есть можно менять эти блоки, не трогая основную флеш-память AVR. При страте программа переносит этот блок в основную SRAM с адреса 100, и оттуда уже выдает данные в порт по мере необходимости.
Итак, загрузчик работает. Что дальше? Я вижу несколько этапов, которые придется пройти.
1. Допаять еще несколько проводов - от канала С ВВ55 к какому-нибудь порту меги. Это буду сигнал управления двухсторонним обменом в режиме 2.
2. Придумать протокол загрузки и написать вторичный загрузчик. Он должен будет перекинуть в корвет образ системы (сетевой BIOS + BDOS + CCP). Примерно как сейчас заливается по сети CP/N.SYS.
3. Приделать к меге какое-нибдуь хранилище данных - хотя бы ту же SD-карту, хоть мне и очень не хочется связываться с драйвером VFAT. Кстати, на первых порах можно и без фата обойтись - просто разбить SD на несколько фиксированных зон и прописать туда данные с помощью обычного dd. Проблема еще в том, что SD требует 3v уровней - придется мудрить с согласованием, а я это очень не люблю...
4. Ну и, наконец, придумать и реализовать протокол взаимодействия между сетевым биосом и программой в AVR. Это самая интересная, но при этом громоздкая часть работы. За основу можно взять исходные тексты стандартного биоса корвета, добавив туда перехват запросов READ и WRITE при обращении к эмулируемым дискам, и какой-нибудь командный протокол для монтирования образов KDI.
... сумрачные гении, писавшие ОПТС, ....
5 балов !
очень точное и емкое определение !
кстати, в свое врем попалось, вроде в ОПТС от квана,
он тестируют ВВ с принтером
т.к. о них не распаян ext port ;)
и была вроде грабля, что установка стандартного пзу - вылетало с ошибкой шины.
---------- Post added at 14:21 ---------- Previous post was at 14:20 ----------
Я приделал к эмулятору загрузку с внешнего ПЗУ (добавил ключ -r в командную строку),
пачтиком поделись ! ??!?!
плизззз
Serebriakov
25.06.2014, 18:13
Нечто похожее, кстати, делали для Апогея:
http://vk.com/retropk?w=wall-41468278_22%2Fall
https://github.com/vinxru/86RKSD
2. Придумать протокол загрузки и написать вторичный загрузчик. Он должен будет перекинуть в корвет образ системы (сетевой BIOS + BDOS + CCP). Примерно как сейчас заливается по сети CP/N.SYS.
то что я думал, протокол нужен
что то типа
дай мне список образов на диске
дай список того что смонтировано
подключи образ XXX к диску Y
загрузи бут с диска
прочитай блок "NN" из образа c диска Y
запиши блок в образ на диска Y
прочитай конфиг
запиши конфиг
можно конечно и файловое апи отдать внутрь
собственно моя идея была - грузим обычный бут, как биос
потом патчим в нем bios call
это при том что кол-во биосов ограничено,
а во всех cp/m есть место
если правильно посмотрел то размер дырки в байтах ;)
1018
1077
1077
941
1060
825
818
801
953
762
т.е. туда можно черта запихнуть
p.s. я готовился ;)
---------- Post added at 17:45 ---------- Previous post was at 17:43 ----------
3. Приделать к меге какое-нибдуь хранилище данных - хотя бы ту же SD-карту, хоть мне и очень не хочется связываться с драйвером VFAT. Кстати, на первых порах можно и без фата обойтись - просто разбить SD на несколько фиксированных зон и прописать туда данные с помощью обычного dd. Проблема еще в том, что SD требует 3v уровней - придется мудрить с согласованием, а я это очень не люблю...
так это уже всё решено ;)
http://vinxru.livejournal.com/177621.html
http://i079.radikal.ru/1306/4d/93361ac854d1.jpg
https://github.com/vinxru/86RKSD
даже на мега8
кстати, в свое врем попалось, вроде в ОПТС от квана,
он тестируют ВВ с принтером
т.к. о них не распаян ext port ;)
Ну ведь логично тестировать через принтерный порт. Там ничего не бывает кроме принтера - это тебе не писюк c ковоксами :) , а принтер без строба печатать не будет. А вообще-то тест, по сути, идиотский. Что он вообще может выявить? Только замыкание на шине данных периферии. Я так сходу даже не могу представить, что может выйти из строя так, чтобы тест не прошел, но при этом ОПТС вообще хотя-бы доехал до этого теста... Вреда от него гораздо больше, чем пользы.
и была вроде грабля, что установка стандартного пзу - вылетало с ошибкой шины.
Однозначно должно было вылетать. Вот и я пару часов жизни убил об эти грабли...
пачтиком поделись ! ??!?!
плизззз
Да пожалуйста, если надо, мне не жалко. Только пользы от него тебе будет не очень много. Ибо это патч не к последней версии из репозитория, а к моей, которая с сетью. Ты ту доработку в основную ветку не принял, а я потом уже и не следил за изменениями - меня пока и так устраивает.
Кстати. РОМ-КТДП под эмулятором загрузился и запустился. И оказался полнее той дисковой версии, что есть у меня. Теперь вот думаю, как бы его в реальный корвет залить. Уж больно он большой - 16к, в nvram меги не влезет. Если только его в основную флеш прошить.
Ну или наконец собраться и приделать SD-карту.
Держи файлы эмулятора.
4. Ну и, наконец, придумать и реализовать протокол взаимодействия между сетевым биосом и программой в AVR. Это самая интересная, но при этом громоздкая часть работы. За основу можно взять исходные тексты стандартного биоса корвета, добавив туда перехват запросов READ и WRITE при обращении к эмулируемым дискам, и какой-нибудь командный протокол для монтирования образов KDI.
уже описал выше
кстати весь обмен можно свести к обмену блоками по 128 байт ;)
---------- Post added at 17:58 ---------- Previous post was at 17:57 ----------
Ну ведь логично тестировать через принтерный порт. Там ничего не бывает кроме принтера - это тебе не писюк c ковоксами :) , а принтер без строба печатать не будет. А вообще-то тест, по сути, идиотский. Что он вообще может выявить? Только замыкание на шине данных периферии. Я так сходу даже не могу представить, что может выйти из строя так, чтобы тест не прошел, но при этом ОПТС вообще хотя-бы доехал до этого теста... Вреда от него гораздо больше, чем пользы.
на РМУ нет принтерного порта ;)
---------- Post added at 18:00 ---------- Previous post was at 17:58 ----------
Теперь вот думаю, как бы его в реальный корвет залить. Уж больно он большой - 16к, в nvram меги не влезет. Если только его в основную флеш прошить.
я кстати и думал его в основном роме держать, места то там - вагон.
а меняться он после разработке не будет;)
---------- Post added at 18:01 ---------- Previous post was at 18:00 ----------
в список "АПИ" забыл первое и основное
"ЗАГРУЗИ STAGE2 BOOT LOADER"
и он уже спокойно отдает файл с флешки или там из рама если на флешке нет ...
---------- Post added at 18:03 ---------- Previous post was at 18:01 ----------
Ты ту доработку в основную ветку не принял, а я потом уже и не следил за изменениями - меня пока и так устраивает.
сорри, не успел пока, shame to me.
Ну что ж, тема вроде как народ заинтересовала. Это радует.
Теперь я попробую изложить свои соображения по организации системы - я тоже этот вопрос долго обдумывал, особенно после изучения работы CP/N-90. Итак, выношу на обсуждение свою концепцию.
Загрузка системы. Вначале в корвет стандартным протоколом отсылается загрузчик 2 ступени. Это, собственно, уже реализовано на практике. Осталось написать сам загрузчик, так, чтобы он влез в 256 байт.
Потом загрузчик 2 ступени включает карту памяти 1С, переводит ВВ55 канал А в режим 2, и ждет. AVR берет файл образа системы с SD, отсылает загрузчику 2 байта размера файла, потом побайтово перекидывает сам файл и 1 байт контрольной суммы, на всякий случай. Загрузчик проверяет КС, отправляет в AVR байт подтверждения, и передает управление на точку входа BOOT. На этом загрузка окончена.
Взаимодействие BIOS с AVR. Нам потребуется встроить свой код в 3 системных вызова - READ, WRITE и SELDSK. Насчет первых двух - понятно. SELDSK - это функция выбора диска, с которым далее будут выполняться операции чтения-записи. Вроде бы фигня, но дело в том, что при первом обращении к диску с него считывается информационный сектор, и на его основании запоняется блок DPB. Причем считывается он прямым обращением к портам FDC. В начале образа KDI этот сектор, естественно, есть, его нужно прочитать и отдать биосу на разбор. Делать параметры диска фиксированными, как в CP/N90, нельзя - перестанут читаться диски МИКРОДОС.
Итак, все сводится к 2 запросам к AVR - чтение сектора и запись сектора. Многосекторные операции биос не поддерживает, ну и не надо. Получается, все взаимодействие с контроллером на уровне биоса сводится к 2 последовательностям:
R W
отсылка команды чтения отсылка команды записи
прием буфера с сектором передача буфера с сектором
Сам командный сектор получается совсем коротким:
cmd: DS 1 ; код команды, 1 - чтение, 2 - запись
drv: DS 1 ; # устройства, 0 - A, 1 - B
track: DS 1 ; дорожка
sector: DS 1 ; сектор
Всего 4 байта. Сектор данных - всегда 128 байт. Таким образом, стандартными средствами BIOS мы можем поддерживать образы дисков до 8М, что не так уж и мало.
Теперь командный протокол. Как выше обсуждалось, нам как минимум потребуются команда "монтировать KDI к устройству A или B". Остальные операции опциональны. ESL привел такой список:
дай мне список образов на диске
дай список того что смонтировано
загрузи бут с диска
прочитай конфиг
запиши конфиг
Первый и второй запрос - чисто информационные, чтобы знать, что у нас есть на карте и не монтировать вслепую. Насчет программной перезагрузки - я не знаю, насколько оно полезно. Перезагрузка легко делается кнопкой Reset, что проще, чем вводить команду reboot с консоли. А уж если система повисла намертво - никакое API уже не поможет ее оживить. Хотя реализовать-то это дело не особо сложно. Ну и конфиг - я так понимаю, предлагаешь хранить на карте список монтирования по умолчанию? Логично. Посмотрим, что в конце у нас получится, но идея хорошая. Для обращения к этому API из программ можно было бы сделать дополнительные точки входа в биос, но, я думаю, не стоит - достаточно сделать стандартную библиотеку и работать через нее. Само обращение к AVR будет реализовано через тот же 4-байтовый командный пакет, с кодом команды в поле CMD, за которым будет следовать блок с параметрами (имя файла образа итд).
Теперь о реализации BIOS. Мы будем поддерживать 4 диска. A, B - эмулируемые образы, C, D - реальные дисководы, если есть. Рамдиск E можно вообще из биоса выкинуть для освобождения места. Пользы от него в 21 веке уже никакой.
Есть 2 варианта реализации. Первый предложил выше ESL - взять готовый двоичный биос, напихать наш код в свободные дырки в коде, и поставить ссылки на него в точках вызова API. Так было сделано в CP/N-90, правда, за счет кастрации многих подсистем BIOS. Путь очевидный, но не слишком удобный - распихивать код по дырам - это как-то немного унизительно :)
ESL, ты привел впечатляющий список дыр одного из биосов. Можешь показать, в каком из файлов твоих баз лежит этот биос? Я бы сам хотел глянуть. Дело в том, что в том биосе, который ковырял я, что-то не видно таких шикарных промежутков. Есть только щели в несколько десятков байт на месте зарезервированных таблиц. Естественно, дыры должны быть именно в BIOS - выше DA00. BDOS и CCP перезагружаются с диска при каждом рестарте системы, и код туда помещать, понятно, нельзя. А килобайтная дырка - это уже немало, пожалуй, в килобайт можно запихать почти все.
Или я тебя неправильно понял, и это не список дыр одного биоса, а список размеров дыр в каждом из известных тебе биосов? А дыра в биосе всего одна. Хотелось бы только посмотреть, где она находится.
Второй путь. Собрать BIOS с нуля из исходных текстов. К сожалению, исходников нормального биоса от CP/M я не нашел. Есть только огрызки от МИКРОДОС, лежащие у ESL в архиве с IDA базами. Исходники настолько странные, что мне проще разобрать работу кода по IDA-базе, чем по ним. Но есть еще один вариант - экспортировать ASM-файл из IDA-базы. И потом найти ассемблер, который сумеет сожрать эти исходники. Если все получится - это будет то, что надо. Тогда наш код можно встраивать напрямую в функции BIOS без всяких патчей. Только для этого нужно докопать код - чтобы везде, где нужно, стояли ссылки на метки вместо абсолютные адресов. К сожалению, разработчики вовсю пользовались грязнейшими хаками типа самомодифицирующегося кода и даже передачи управления в середину машинной команды! Уроды блин. Хотя это больше относится к ОПТС, биос вроде почище. В любом случае, я в выходные попробую заняться чисткой кода в базе. Если уж не получится - пойду по пути, прделоженному ESL, с патчем биоса в двоичном виде.
На выходных съезжу на дачу, там у меня валяется несколько дохлых кардридеров. Надо выдрать SD-гнездо, и поключить наконец к меге. ESL привел пример схемы. Она, собственно, совершенно тривиальна - карта подключена к порту SPI, через делители из сопротивлений для согласования уровней. Вот этих делителей я и хотел избежать. Во-первых, 6 лишних резисторов на плате. Во-вторых, эти самые делители искажают фронты сигнала, что иногда приводит к странным вещам. Но более простых путей, похоже, нет. Понизить питание меги до 3v нельзя - для нее станут опасными 5v TTL-уровни от корвета.
То, что мне очень не хотелось делать - драйвер vfat. Я посмотрел на предложенную PetitFS - вроде бы неплохая реализация. Держит 2 открытых файла параллельно - то что надо. Но придется ее разбирать детально - я стараюсь не использовать у себя чужой код втемную, всегда хочу понять как он работает. Может быть, окажется, что проще свое написать.
---------- Post added at 09:06 ---------- Previous post was at 08:59 ----------
Да, кстати.
на РМУ нет принтерного порта
Разъема для принтера нет. А сам порт - это же канал А ППИ2. Он есть на всех корветах, куда он денется... Вот его вполне можно использовать для теста шины.
Я смотрю, ты extrom уже приделал к эмулятору. Только ты как минимум файл ext_rom.h забыл в дерево положить :)
Я смотрю, ты extrom уже приделал к эмулятору. Только ты как минимум файл ext_rom.h забыл в дерево положить :)
вчера сначала забыл сделать gh add
и запушил
потом вспомнил, добавил файлы, зачекнинл,
а запушить забыл ;)
---------- Post added at 10:48 ---------- Previous post was at 10:47 ----------
Разъема для принтера нет. А сам порт - это же канал А ППИ2. Он есть на всех корветах, куда он денется... Вот его вполне можно использовать для теста шины.
торможу, точно.
Второй путь. Собрать BIOS с нуля из исходных текстов. К сожалению, исходников нормального биоса от CP/M я не нашел
я вроде выкладывал уже,
смотри в архиве
там очнь похоже что там есть именно исходник биос 1.2
и на вид пару приличных дизасмов 2.x
48559
ESL, ты привел впечатляющий список дыр одного из биосов. Можешь показать, в каком из файлов твоих баз лежит этот биос? Я бы сам хотел глянуть. Дело в том, что в том биосе, который ковырял я, что-то не видно таких шикарных промежутков. Есть только щели в несколько десятков байт на месте зарезервированных таблиц.
дырка одна, это просто размер дырок в разных биосах
смотри в аттаче
там есть ods с табличкой, сами биосы и куски дизасмов
48560
START END HOLE SIZE
12_87_11_niijaf EA06 EDFF 1018
12_88_3_alternativa E771 EBA6 1077
12_88_3_niijaf E771 EBA6 1077
12_90_5_kontur E7F9 EBA6 941
20_88___miks E782 EBA6 1060
21_89_2_niijaf2 E86D EBA6 825
21_89_2_niijaf E874 EBA6 818
21_89___wiza E885 EBA6 801
21_91___LAP E7ED EBA6 953
21m_____Shkanov E8AC EBA6 762
mdos1_861011
mdos1_861115
mdos1_870430
mdos2_880630
mdos2_900105
это я тут на досуге разбирал дисковые системы
выдрал со всех дисков загрузчики
определил где изменяемые области, замаскировал из
(таблички FKEYS, PRINTER, приветствие) их патчили все кому не лень
это список уникальных известных на сегодня
X.Y_YY_M_NAME
X.Y - версия биос
YY_M - дата внутри
ну и имя по мотивам имени на диски
там есть текстовый файлик, я туда вписывал отличия
в неочень упорядоченной форме ;)
получается у всех cp/m есть дырка в 700 байт,
в них ЛЕГКО помещается любой наш драйвер
главное чтобы я не ошибся и это были дыкри а не буфера.
Загрузка системы. Вначале в корвет стандартным протоколом отсылается загрузчик 2 ступени. Это, собственно, уже реализовано на практике. Осталось написать сам загрузчик, так, чтобы он влез в 256 байт.
Потом загрузчик 2 ступени включает карту памяти 1С, переводит ВВ55 канал А в режим 2, и ждет. AVR берет файл образа системы с SD, отсылает загрузчику 2 байта размера файла, потом побайтово перекидывает сам файл и 1 байт контрольной суммы, на всякий случай. Загрузчик проверяет КС, отправляет в AVR байт подтверждения, и передает управление на точку входа BOOT. На этом загрузка окончена.
не, имхо не так
мы загрузили 256, (назовем их Stage1 BOOT)
ExtRom переключился в command mode
далее Stage1 BOOT через обращение к апи (загрузи Stage2 BOOT)
получает образ файла в котором Stage2 BOOT
он уже радостно рисует менюшку на экране
считывает конфиг
показывет кто куда примонтирован
монтирует нужное
дальше грузит загрузочную запись (как ром с дискеты)
патчит её, и передает управление.
таким образом мы не привязываем конкретный биос, а грузим любой образ KDI
т.к. все CP/M BIOS из одного корня - структура их близка
и патчить там - легко
кстати, в Stage2 BOOT можно еще реализовать загрузку РОМ с SD
и еще например загрузку .BIN игрушек (для тех кому лень систему грузить)
ну это уже мысли далеко в будующее.
а, ну и сам Stage2 должен для начала читаться с SD
(легко пилить и отлаживать)
а вдруг его нет - грузить минимальный из ROM
p.s. надеюсь мы об одном говорим ;)
загрузи бут с диска
Насчет программной перезагрузки - я не знаю, насколько оно полезно. Перезагрузка легко делается кнопкой Reset, что проще, чем вводить команду reboot с консоли.
это имелся в виду загрузить Stage2 loader
---------- Post added at 13:38 ---------- Previous post was at 13:36 ----------
Для обращения к этому API из программ можно было бы сделать дополнительные точки входа в биос, но, я думаю, не стоит - достаточно сделать стандартную библиотеку и работать через нее. Само обращение к AVR будет реализовано через
имхо апи в биос - смысла нет, апи и так уже есть в "EROSe" ;)
делать прослойку - смысла нет.
---------- Post added at 13:38 ---------- Previous post was at 13:38 ----------
Взаимодействие BIOS с AVR. Нам потребуется встроить свой код в 3 системных вызова - READ, WRITE и SELDSK. Насчет первых двух - понятно. SELDSK - это функция выбора диска, с которым далее будут выполняться операции чтения-записи.
я думал патчить уровнем ниже
патчим DiskToMemory и MemoryToDisk (DTOM,MTOD)
переменные в которых имя диска, номер сектора и трека - известны,
больше нам и не надо
таким образом покрываем сразу ВСЕ вызовы, без сложного диспатчинга ;)
мало того, это дает ЛЕГКО реализовать выборочный маппинг дисков
т.е. смотрим если это зампленый диск - наши функции, если нет - родные как и были ;)
---------- Post added at 13:39 ---------- Previous post was at 13:38 ----------
Теперь о реализации BIOS. Мы будем поддерживать 4 диска. A, B - эмулируемые образы, C, D - реальные дисководы, если есть. Рамдиск E можно вообще из биоса выкинуть для освобождения места. Пользы от него в 21 веке уже никакой.
при том варианте реализации что выше - маппинг получам динамичесский
потом можно еще будет усложнить и сделать более сложные маппинг
например KDIA -> A, Physical A -> B:, Physycal B: -> D
кстатит забавно, CP/M поддерживает физичесски 4 диска
а микродос всегда только 2 ;)
это всё ради того чтобы можно было в теории при наличии физ дисководов слить на них информацию с образа.
ну и диск E - пусть будет, он не мешает ;)
---------- Post added at 13:43 ---------- Previous post was at 13:39 ----------
И потом найти ассемблер, который сумеет сожрать эти исходники. Если все получится - это будет то, что надо.
есть же обычный M80
есть даже его "исходники" ;)
есть еще xm80 by leo sandy, под msdos
правда не факт что удобно будет, но зато точно работает.
---------- Post added at 13:57 ---------- Previous post was at 13:43 ----------
К сожалению, разработчики вовсю пользовались грязнейшими хаками типа самомодифицирующегося кода и даже передачи управления в середину машинной команды! Уроды блин. Хотя это больше относится к ОПТС, биос вроде почище.
если ты про
2EC1 Zero_division_exit:
2EC1 ld e, 0Bh
2EC3 db 1
2EC4 Netxt_w_for_exit:
2EC4 ld e, 1
2EC6 db 1
2EC7 Array_redef_exit:
2EC7 ld e, 0Ah
2EC9 db 1
2ECA unkn_usr_exit:
2ECA ld e, 12h
2ECC db 1
и подобных
то это микрософт ;)
экономия на байтиках ;)
а чего, прикольно
В любом случае, я в выходные попробую заняться чисткой кода в базе. Если уж не получится - пойду по пути, прделоженному ESL, с патчем биоса в двоичном виде.
я готов этим занятся как будет моя железка готова
сейчас жду usb tvtuner,
ардуина уже доехала
остается запинать брата чтоб спаял всё это ;)
правда сроков пока нет, разве что на эмуляторе.
самое сложное для меня ты уже сделал, проверил идею !!!
было бы не плохо кстати померять такт скорость в этом MODE2 transfer
То, что мне очень не хотелось делать - драйвер vfat. Я посмотрел на предложенную PetitFS - вроде бы неплохая реализация. Держит 2 открытых файла параллельно - то что надо. Но придется ее разбирать детально - я стараюсь не использовать у себя чужой код втемную, всегда хочу понять как он работает. Может быть, окажется, что проще свое написать.
там же есть еще VinxFS, он так тоже говорил ;)
это пиленая чья-то либа
есть еще https://code.google.com/p/sdfatlib/
а про PetitFS - она сильно тестированная, очень распространненая либа.
---------- Post added at 15:31 ---------- Previous post was at 13:57 ----------
проверил по быстрому дырку
взял 21_89___wiza E885 EBA6 801
забил константой
загрузился
покопировал, позаписывал, пооптимизировал
сдампил память
константа осталась
понятно что не всё потестилось, но чтение/запись и разные диски были
а про Микродос для ОПТС2, прятать драйвер под экран (типа как DED делает)
в микродосе который поддерживает RAMDISK и работает и под ОПТС1 (mdos2_900105) там как раз живёт его драйвер
с патчем для работы ;)
т.е. мы легко его правим
для микродос ОПТС1 - будем думать, он работает в конфигурации без ацзу ...
или забить, там вообще глюк на глюке
даже автопределения размера диска нет, жестко забито кол-во системных секторов
во времена оны - не могли даже cp/m прочитать
про комманду O не знали...
Наконец-то я добрался до компьютера - а тут уже столько информации... Даже темы разделились, что меня поначалу сбило с толку.
После некоторго, может быть не до конца вдумчивого, ознакомления с твоими, ESL, рассуждениями, я понял твою идею до конца. Итак. Я предлагал написать собственный универсальный биос, и использовать для работы только его. Ты же предлагаешь пойти более сложным путем - загружать тот биос, что есть на текущем образе диска А, и модифицировать его на ходу, встроив код эмулируемых дисков в дырку перед буфером каталога.
Преимущество твоего метода - мы действительно можем использовать любой биос с любой дискеты. В том числе и микродос, что в моем случае практически невозможно. Недостатки, как я вижу, тут такие.
1. Тебе придется втиснуть весь код в щель размером 762 байта, судя по твоей таблице. Это не так уж и много как может показаться. Но тут будет видно, когда станем писать драйвер эмулируемых дисков.
2. Тебе придется держать во вторичном загрузчике базу всех известных биосов, и идентифицировать загруженный биос по каким-либо признакам - сигнатуре, контрольной сумме, ну или что ты там уже придумал. С учетом того, что если биоса в базе не найдется, придется подставлять резервный, если я правильно понял твою мысль. А если биос идентифицируется неправильно - получим крах системы в самый непредсказуемый момент.
Пока в голову приходит только это, может к утру еще чего придумается. Вроде бы не так уж и много, но вот оно того стоит? Я не ною, и согласен вести разработку по любому пути, если это действительно даст какие-либо преимущества.
Впрочем, наши с тобой методы можно и скомбинировать - и свои биос сделать, и встраивалку в чужие. Тем более что ты уже берешься за этот этап работы. Единственная тонкость - это убедиться, что в биосе там действительно дыра. Уж больно странная она. Беглый взгляд показал, что внутри лежат огрызки кода, в молодости бывшие куском явно какого-то отладчика. По крайней мере, все ссылки из этого кода ведут в младшие юзерские адреса типа E00. Твой эксперимент с заполнением области константой меня почти убедил, но я завтра попробую и сам, ты уж не обижайся. В идеале - попробую доработать отладчик эмулятора, чтобы срабатывал точкой останова на обращение к данным на указанном участке памяти.
Далее. Ты предлагаешь перехватывать вызовы только 2 подпрограмм - чтения сектора и записи сектора. Сразу говорю, что этого мало. Как минимум SELDSK работает с дискетой напрямую, да и еще кое-где я видел обращение и к флопу, и к регистру выбора устройства. Или мне так только показалось? Вообщем, тут путь один - раскопать дисковую подсистему одного биоса полностью, до последнего байта. Я биос особо плотно не копал, меня больше BDOS интересовал. Теперь, похоже, пора заняться. Вот на выходных, на даче, и займусь.
Ладно, это дело не самого близкого будущего. Нам до биоса пока далеко как пешком до китая. Я для себя наметил такой план.
1. Добываю SD-гнездо и на следующей неделе подключаю к меге SD-карту. Разбираюсь с ее протоколом, с драйвером vfat, учусь читать файлы.
2. Пишу для корвета загрузчик 1 уровня (тот который 256 байт) и поддержку в меге для него. Допаиваю от бокового порта к меге проводки порта С (там их потребуется штук 6, как я прикинул). Разбираюсь с двунаправленным режимом ВВ55 - я раньше с ним никогда не сталкивался, придется разбираться с нуля. В конце должна получиться система, умеющая загружать в корвет произвольный код с SD-карты, тот же КТДП к примеру, и запускать его.
3. Делаю в AVR обработчик запросов, поступающих из корвета через боковой порт. То самое API, про которое мы говорили ранее. Пока хотя бы функции чтения и записи секторов. Всякие там монтирование и прочее можно отложить на самый конец.
Вот после этих трех шагов уже можно будет готовить различные варианты загрузчиков 2 уровня, биосов итд. Я думаю, что это займет пару недель, не меньше, мне же не только корветом заниматься приходится :) Надеюсь на активную помощь от сообщества и в первую очередь ESL как основного генератора идей.
Задача осложняется тем, что все драйвера vfat написаны на С. Мне бы очень не хотелось писать на С задачи реального времени типа начального загрузчика. Можно скомбинировать код на С и ассемблере, но для AVR я такого не делал никогда. Даже не представляю, какие там соглашения о связях, сохранении регистров, стеке итд. Придется разбираться, ну или все писать на С с риском не влезть по времени между стробом адреса и посылкой данных в порт.
1. Тебе придется втиснуть весь код в щель размером 762 байта, судя по твоей таблице. Это не так уж и много как может показаться. Но тут будет видно, когда станем писать драйвер эмулируемых дисков.
только пробовать и пробовать ;)
---------- Post added at 23:42 ---------- Previous post was at 23:39 ----------
2. Тебе придется держать во вторичном загрузчике базу всех известных биосов, и идентифицировать загруженный биос по каким-либо признакам - сигнатуре, контрольной сумме, ну или что ты там уже придумал. С учетом того, что если биоса в базе не найдется, придется подставлять резервный, если я правильно понял твою мысль. А если биос идентифицируется неправильно - получим крах системы в самый непредсказуемый момент.
весь список уникальны на сегодня ты видел ;)
если не найдется - в теории не сильно большая грабля
речь то идёт только про ЗАГРУЗКУ с этого диска,
загрузчик скажет - НЕСМОГЛА, выбери другой диск
и возьмет человек другой диск.
чтоб была очень жеская привязка - почти небыло
мало того, в теории можно выбирать биос отдельно из всех врзможных при старте ;)
---------- Post added at 23:43 ---------- Previous post was at 23:42 ----------
Пока в голову приходит только это, может к утру еще чего придумается. Вроде бы не так уж и много, но вот оно того стоит? Я не ною, и согласен вести разработку по любому пути, если это действительно даст какие-либо преимущества.
пока есть желание пробовать,
а там посмотрим как пойдет.
---------- Post added at 23:45 ---------- Previous post was at 23:43 ----------
Впрочем, наши с тобой методы можно и скомбинировать - и свои биос сделать, и встраивалку в чужие. Тем более что ты уже берешься за этот этап работы.
имхо надо делать оба варианта
а там уж использовать более удобный
тогда не заморачивайся с "патчером", я эт она себя возьму.
---------- Post added at 23:48 ---------- Previous post was at 23:45 ----------
Единственная тонкость - это убедиться, что в биосе там действительно дыра. Уж больно странная она. Беглый взгляд показал, что внутри лежат огрызки кода, в молодости бывшие куском явно какого-то отладчика. По крайней мере, все ссылки из этого кода ведут в младшие юзерские адреса типа E00. Твой эксперимент с заполнением области константой меня почти убедил, но я завтра попробую и сам, ты уж не обижайся.
было бы просто СУПЕР,
т.к. это была теория, теперь её надо проверить всесторонне.
хотя природа появления дырки понятна
блок под биос - фиксированного размера, а кода - сколько получилось
а асм мусором заполнил пустой блок, и наверное не сильно на это обратили внимание тогда
---------- Post added at 23:53 ---------- Previous post was at 23:48 ----------
Далее. Ты предлагаешь перехватывать вызовы только 2 подпрограмм - чтения сектора и записи сектора. Сразу говорю, что этого мало. Как минимум SELDSK работает с дискетой напрямую, да и еще кое-где я видел обращение и к флопу, и к регистру выбора устройства. Или мне так только показалось? Вообщем, тут путь один - раскопать дисковую подсистему одного биоса полностью, до последнего байта. Я биос особо плотно не копал, меня больше BDOS интересовал. Теперь, похоже, пора заняться. Вот на выходных, на даче, и займусь.
да, про seldsk забыл, но посмотрел его код (он есть в исходниках для разных биосов что я выкладывал) посмотри INFO.MAC
там понятно что надо ловить,
по хорошему патчить там надо
; DSETUP - Процедура, устанавливающая требуемый трек,
; сектор, включает нужный диск, запускает
; мотор.
будем пробовать ;)
---------- Post added at 23:56 ---------- Previous post was at 23:53 ----------
Я для себя наметил такой план.
2. Пишу для корвета загрузчик 1 уровня (тот который 256 байт) и поддержку в меге для него. Допаиваю от бокового порта к меге проводки порта С (там их потребуется штук 6, как я прикинул). Разбираюсь с двунаправленным режимом ВВ55 - я раньше с ним никогда не сталкивался, придется разбираться с нуля. В конце должна получиться система, умеющая загружать в корвет произвольный код с SD-карты, тот же КТДП к примеру, и запускать его.
mode2 и для меня второй "темный" момент, на бумаге красиво
а в жизни, ждём твоих результатов
---------- Post added at 23:57 ---------- Previous post was at 23:56 ----------
Вот после этих трех шагов уже можно будет готовить различные варианты загрузчиков 2 уровня, биосов итд. Я думаю, что это займет пару недель, не меньше, мне же не только корветом заниматься приходится :) Надеюсь на активную помощь от сообщества и в первую очередь ESL как основного генератора идей.
всегда пожалуйста ;)
после провеки MODE2 и стабилизации API надо будет сразу эмулятор запатчить под это дело,
ибо отладку это упростит....
---------- Post added 27.06.2014 at 00:01 ---------- Previous post was 26.06.2014 at 23:57 ----------
Задача осложняется тем, что все драйвера vfat написаны на С. Мне бы очень не хотелось писать на С задачи реального времени типа начального загрузчика. Можно скомбинировать код на С и ассемблере, но для AVR я такого не делал никогда. Даже не представляю, какие там соглашения о связях, сохранении регистров, стеке итд. Придется разбираться, ну или все писать на С с риском не влезть по времени между стробом адреса и посылкой данных в порт.
я как раз собирался ВСЕ писать на C ;)
как доедет всё мое - буду пробовать.
я проникся твоим кодом загрузчиков
асм АВР не знаю, но и так всё понятно
красиво ;)
особенно проникся хранением адрессом следующего JMP в регистре
и порадовало что WAIT A0 таки сработал, это сильно упрощает требование к AVR?
SaintTurnip
29.06.2014, 20:14
посмотрел на цены microsd слотов в СПб, удивился. потом купил на aliexpress (http://www.aliexpress.com/item/Newest-Sale-Micro-SD-Storage-Board-Mciro-SD-TF-Card-Memory-Shield-Module-SPI-For-Arduino/1814071718.html) pcb с разъемом, слотом карты памяти и согласованием уровней - за $2
(и заодно это (http://www.aliexpress.com/snapshot/6126659302.html))
Serebriakov
29.06.2014, 23:50
посмотрел на цены microsd слотов в СПб, удивился.
Я обычно вместо слота для microSD (дорого стоит, редко где продается), использую переходник microSD-miniSD (почти всегда идет в комплекте с microSD флешкой - у меня их штук 10 ненужных валяется). Припаиваю его прямо к плате. Выходит очень надежный и удобный кардхолдер =)
Вот пример для модульной системы:
https://dl.dropboxusercontent.com/u/32466567/Korvet/SD_001.jpg https://dl.dropboxusercontent.com/u/32466567/Korvet/SD_002.jpg https://dl.dropboxusercontent.com/u/32466567/Korvet/SD_003.jpg
Кстати, по-поводу самих флешек. Как показала практика, в простых схемах на AVR лучше использовать карточки до 2ГБ, которые не HC/XC.
Кстати, по-поводу самих флешек. Как показала практика, в простых схемах на AVR лучше использовать карточки до 2ГБ, которые не HC/XC.
Да там разницы-то только то, что адресация не байтовая, а блочная. Как раз сейчас сижу разбираюсь...
А простых карт, не HC, уже не купишь теперь. Только если старые запасы использовать, у кого остались.
Да там разницы-то только то, что адресация не байтовая, а блочная. Как раз сейчас сижу разбираюсь...
А простых карт, не HC, уже не купишь теперь. Только если старые запасы использовать, у кого остались.
тут
http://we.easyelectronics.ru/AVR/mmcsd-i-avr-chast-1-inicializaciya-i-identifikaciya.html
http://we.easyelectronics.ru/AVR/mmcsd-i-avr-chast-2-rabota-s-kartoy.htmlрасписано
как правильно детектить тип карточки
там поочереди детяктят MMC/SD/SDHC
у VINXRU в VinxFS написано что "поддержка SDHC" в "драйвере SD"
кстати, судя по тормознутости этой операции
в апи надо добавлять функцию "Смонтируй SD" с флагом успешности?
ибо вызывать инит при страрте - мы рискуем пропустить всё интересное ;)
ну и его-же
http://we.easyelectronics.ru/AVR/usb-fleshka-na-atmega8-i-v-usb-ot-idei-k-gotovomu-ustroystvu.html
тут
как правильно детектить тип карточки
там поочереди детяктят MMC/SD/SDHC
Да, видел я эти статьи. Правда, нашел поздновато - в начале, как обычно, убил пару часов на чтение фирменных даташитов и разбор всяких регистров типа CID. В результате решил забить пока на все это и ограничиться только SD, благо в запасе нашлась кучка таких карточек.
у VINXRU в VinxFS написано что "поддержка SDHC" в "драйвере SD"
Ну да, при SDHC адрес сектора делится на 512. Тут, собственно, никаких проблем.
Поковырял я этот vinxfs. Вроде неплохо написан, не особо криво. Решил пока его использовать, хоть и не люболю вставлять чужой код без детального разбора - писать свой драйвер vfat с нуля не вызывает особой радости. Может быть, потом. Подогнал код под свои низкоуровневые процедуры доступа к карте, выкинул некоторые лишние сущности, вроде более-менее работает. Директорий чтиает, файлы открывает, размер файла отдает, пока вроде мне достаточно.
кстати, судя по тормознутости этой операции
в апи надо добавлять функцию "Смонтируй SD" с флагом успешности?
ибо вызывать инит при страрте - мы рискуем пропустить всё интересное ;)
Не, знаешь, делать еще и поддержку смены карты на ходу - это пока ну его нафиг. Там проблем вылезет выше крыши типа корректного размонтирования всех текущих образов дисков. Вроде не особо долго он и карту монтирует, ну секунду максимум. При этом параллельно вполне успевает отработать начальная загрузка в корвет.
ну и его-же
http://we.easyelectronics.ru/AVR/usb-fleshka-na-atmega8-i-v-usb-ot-idei-k-gotovomu-ustroystvu.html
Вот уж этот изврат - все равно что х$#м гвозди забивать. Я считаю, каждая вещь должна использоваться по назначению. Те же STM32F105 не дороже меги, но при этом имеют полноценный USB HOST. Плюс нормальный 32-битный АРМ, питание 3.3V, готовый интерфейс SDIO, и все порты выдерживают 5V TTL. Вот на чем надо было все делать изначально :)
Вообщем, переписал весь код загрузки на С. Очень не хотелось, но пришлось. Подключил SD-карту, научился с ней работать. Разобрался с режимом 2 ВВ55. Сейчас грею паяльник - допаяю на разъем линии управления от порта С. И начну потихонечку писать начальный загрузчик 1 фазы. Чтобы хотя бы тот же КТДП умел загружать.
Надеюсь, скоро слепится что-нибудь пригодное к употреблению.
После некоторого перерыва, возвращаюсь к разработке. Даю отчет о проделанной работе.
Итак, что сделано.
1. Полностью собрал схему контроллера. Она получилась на удивление простой - Мега32, 9 резисторов, 1 конденсатор, 1 светодиод, регулятор напряжения LM317, ну и разъемы. От корвета к плате идут 16 проводков, из них 2 - питание и земля.
2. Написал программу для контроллера. Она умеет заливать в корвет загрузчики 1 и 2 фазы, разбирается с файловой системой FAT на карте SD, ну и рудиментарно эмулирует пресловутое API, которое мы тут так долго обсуждали. Пока реализовано только 2 операции - чтение и запись логических секторов, и только для одного образа диска. Доделывать API дальше я не вижу смысла без реализации клиентской части.
3. Написал загрузчик 1 фазы, тот, который 256 байт. Он заливается в nvram и оттуда грузится в корвет при старте. Его единственная задача - получить и запустить загрузчик 2 фазы. Для расширения функциональности я добавил туда возможность выбора файла для загрузки. Работает это так. По умолчанию грузится с карты файл loader.bin - это загрузчик CP/M, как мы тут ранее и обсуждали. Если же во время тестов ОПТС нажать и удерживать одну из кнопок 0-7 на клавиатуре, то вместо loader.bin будет загруже файл ROMn.BIN, n-нажатая кнопка. Это позволяет, например, загрузить КТДП, если положить его на карту, обозвать ROM0.BIN, и при старте удерживать кнопку 0.
4. Написал загрузчик 2 фазы. Его цель - получить из смонтированного образа диска А системные дорожки, разместить их в памяти, и передать управление на точку входа биоса BOOT. Этот загрузчик уже взаимодействует с контроллером через дисковое API. Адрес точки входа, адрес загрузки, размер системной области и прочие параметры загрузчик берет из инфосектора диска.
В результате, после муторной отладки получилась вполне достойная вещь. Система уже функционирует полностью и грузит CP/M с образа KDI, записанного на карту. Но на этом и все. Сама CP/M, естественно, функционировать нормально не может, так как биос ничего не знает о дисковом API :) Если подключен дисковод - начинает работать с реальным дисководом как с диском А. Если не подключен - просто виснет.
Итак, железо готово, и программная поддержка API в контроллере имеется и более-менее отлажена. Теперь, для полного функционирования системы, надо написать BIOS, который имел бы в себе драйвер эмулируемых дисков.
Я тут, пока писал загрузчики, попрограммировал немного на ассемблере 8080. Блин, это АД и П#$%ец. Регистров всего 7, большинство операций требует аккумулятор, обрабатывается всего 8 бит за раз... Простейшая операция 16-разрядного деления превращается в монстра на полэкрана. Видимо, я уже зажрался современными процессорами. А ведь в конце 80-х, собрав свой первый РК-86, я много писал на этом ассемблере.
Вообщем, надо браться за биос. Не очень прятная работа, но хорошее упражнение для мозгов. Только с силами соберусь. Проблема еще и в том, что отлаживать его придется почти вслепую - поди пойми, что там, внутри корвета, виснет... Я предполагаю делать это так:
1. Выбрать из имющихся исходных текстов тот, который можно собрать ассемблером на PC.
2. Собрать целиком образ системных дорожек из исходников, и загрузить их в корвет, чтобы убедиться, что все собралось правильно.
3. Потихонечку добавить в исходники биоса свой драйвер эмулируемых дисков.
4. Собрать новый образ системных дорожек, уже с моим биосом, и начать муторную отладку.
Кстати, непоянтно еще, чем эти исходники собирать. Для Z80 есть отличный кроссасемблер Z80asm. Но все исходники биосов идут в нотации Intel (которую я терпеть не могу), а вот чем транслировать такой код (под линуксом, естественно) я пока толком не нашел. Только всякие странные полуживые проекты.
Тут ESL предлагал другой путь - взять готовый биос, напихать в дырку между биосом и буфером каталога свой код, и попроавить указатели в биосе на наши функции. Тоже хороший вариант. Только вот я теперь сомневаюсь, что весь код влезет в дыру меньше килобайта. У меня загрузчик второй фазы почти полкило весит, а он устроен гораздо проще, чем биос.
Ну или, может быть, кто-нибудь соберет себе такой же контроллер, да поможет мне с написанием кода? На вставной макетке сделать его можно меньше чем за час, а паять только провода к разъемам придется.
Ну, ладно. Прилагаю архив с исходниками. Туда же положил принципиальную схему моего варианта устройства. Понятно, что реализовать схему можно как угодно, необязательно точно так, как у меня. Например, регулятор напряжения LM317 (делающий 3.3v для СД-карты) некоторые заменяют просто парой диодов. Ну и так далее.
Надеюсь, кого-нибудь это все же заинтересует и я не зря старался.
крутизна неимоверная !
руки чешуться ! (но железки будут чуть позже :( )
вопросы
ты скорость не мерял ?
SD ?
и главное MODE2 transfer speed ??
сколько там выходит ?
p.s. попробую в эмулятор запилить (если ты еще не сделал для себя ) ;)
крутизна неимоверная !
руки чешуться ! (но железки будут чуть позже :( )
Ты вот на такую штуку посмотри - http://www.terraelectronica.ru/images/catalog/EIC-16020.jpg
С ней можно собрать контроллер за время, уходящее на пару кружек пива :) Если, конечно, все компоненты заранее заготовить. И паять практически ничего не надо.
вопросы
ты скорость не мерял ?
SD ?
и главное MODE2 transfer speed ??
сколько там выходит ?
Я бы померил, но как? Предложи методику, попробую реализовать. Просто в корвете толком нет никакой службы времени для измерения интервалов. Только если прерывания от таймера считать, но писать под это дело софт в коде 8080 - это удавиться проще...
p.s. попробую в эмулятор запилить (если ты еще не сделал для себя ) ;)
Вообще-то сделал :) Но получился настолько грязный хак, что я его даже упоминать не стал... Но сделать пришлось - загрузчик фазы 2 мне в железе было не отладить за разумное время.
Тут ведь вот в чем вопрос - до какй степени нам нужно все это эмулировать? Правильно было бы взять ядро эмуляции AVR, пустить его другим процессом, и наладить связь между виртуальным AVR и виртуальным корветом через unix-сокеты, ну или там tcp/ip. Задачка посложнее отладки загрузчика :) Я пошел таким путем: отдаю эмулятору загрузчик 2 фазы (его я и отлаживал) как обычный образ внешней ROM. Благо, формат файла у него сответствующий протоколу загрузки ОПТС. А в эмулятор добавил примерную эмуляцию дискового API - отслеживание записи в порт А и выдача через него же ответа якобы от контроллера. Ну и ввел ключ командной строки -u file, отдающий эмулятору API образ диска А. Вроде бы, все просто. Но надо отследить момент окончания загрузки ОПТС и переход к исполнению загруженного кода. Я это сделал путем перехвата момента записи в порт А. Если Control=1, то ОПТС в процессе загрузки только читает порт А. А первая же запись в этот порт - это уже команда API контроллеру.
Вообщем, получился костыль еще тот. Но загрузчик в результате я быстренько отладил. И по загруженному биосу немного походил в отладчике для интереса.
Прилагаю файлы с изменениями, так, на всякий случай. Думаю, ты все реализуешь гораздо проще и изящнее. Только не смейся, пожалуйста, и не ругай меня сильно - патч был сделан на скорою руку, только чтобы отладить загрузик.
И это еще моя, старая версия эмулятора. Твой новый код, с сетью, я увидел слишком поздно. Теперь мне для переезда на него надо перенести все мои внутренние патчи, которых нет в твоей ванильной версии. Вот в выходные и займусь. Может быть, ты и API дисковое в эмулятор к тому времени запилишь.
Кстати, непоянтно еще, чем эти исходники собирать. Для Z80 есть отличный кроссасемблер Z80asm. Но все исходники биосов идут в нотации Intel (которую я терпеть не могу), а вот чем транслировать такой код (под линуксом, естественно) я пока толком не нашел. Только всякие странные полуживые проекты.
тут попался забавный кроссам
http://members.shaw.ca/gp2000/zmac.html
еще не пробовал, но выглядит забавно
я сам недолюбливаю мнемонику i8080 и всё свое делаю в z80
причем еще со времен реального корвета ;)
сам пользовался sjasmplus
сейчас пробую pasmo (есть в убунте)
---------- Post added at 01:55 ---------- Previous post was at 01:06 ----------
полез смотреть исходник zasm
нифигасебе ченджлог
живой сорец который писался с 1978 года ....
* zmac -- macro cross-assembler for the Zilog Z80 microprocessor
* Bruce Norskog 4/78
* Revision History:
*
* jrp 3-8-82 Converted to run on Vax, updated syntax to conform better
* to the Zilog standard.
....
* cdk 2-5-87 Added 'cmp' as a synonym for 'cp', 'jmp' as a synonym for
* 'jp', and added tolerance of accumulator specification for arithmetic
* and logical instructions. (For example, 'or a,12' is now accepted,
* same as 'or 12'.)
*
* gwp 12-29-08 Changes to allow compilation with modern C compiler and using bison
* as the .y to .c converter. assert, tstate pseudo-ops.
* t(), tilo(), tihi() functions. ==, <=, >=, !=, !, <, > operators.
* -c to turn cycle counts off in listing. Usage, -h and version.
....
* gwp 8-11-13 Allow $ to start identifiers and do '$' dropping when macro
тут попался забавный кроссам
http://members.shaw.ca/gp2000/zmac.html
еще не пробовал, но выглядит забавно
А что, отличный ассемблер, кстати. Главное, поддерживает синтаксис Intel 8080 (ключ -8). Я его собрал, запустил, вроде работает. Порылся в твоей коллекции исходников биосов, нашел вполне приличный bios-2.1-89-MGU. Он, по крайней мере, нормально откомментирован.
Попробовал собрать. Как ни странно, собрался практически без проблем. На выходе получил кучку файлов в разных забавных форматах, пришлось читать доку, чтобы понять, что нужный мне сырой бинарник - это .CIM-файл. Взял дискету CP/M, посчитал смещения, записал этот бинарник внутрь системных дорожек. Попробовал загрузить с нее корвет.
Система бодро написала CP/M vers 2.2, а вот дальше на экран полез мусор. Сказка кончилась. Ну, тут сразу понятно, что мусор вылез из-за преобразования исходников из KOI-8 в UTF-8. Тут придется или вбить сообщения в виде хекс-кодов, или вообще использовать только латинские буквы.
Вообщем, сборка биоса вполне возможна. Единственное - я нотацию интела терпеть не могу, поэтому сделал еще один шаг - преобразовал исходники биоса в сиснтаксис Z80, к которому я больше привык. Транслировать его можно тем же xmac (он мне понравился, хороший ассемблер), можно и pasmo, и z80asm, это уже без разницы.
Сейчас схожу за пивком и попробую загрузить оттранслированный биос в эмулятор, посмотрю в отладчике, где оно виснет и почему. После того, как самоcборный биос успешно заработает, можно будет начинать вносить в него код драйвера эмулируемых дисков.
круто!
а у меня
прикрутил к эмулятору "эмулятор ext rom extender" ;)
по крайней мере stage1 грузит stage2
и stage2 грузит kdi
что не может не радовать ;)
напишу теперь тест скорости, есть идеи.
мне наконец приехал USB TV CAPTURE, поехал пробовать на реальном корвете
если заработает - заберу домой, буду пилить реальную железку ;)
ну и почти всё для железки тоже есть, плата, проц, тоже поеду братца пинать чтоб это все спаял в кучу ;)
---------- Post added at 17:52 ---------- Previous post was at 17:50 ----------
Ну, тут сразу понятно, что мусор вылез из-за преобразования исходников из KOI-8 в UTF-8. Тут придется или вбить сообщения в виде хекс-кодов, или вообще использовать только латинские буквы.
забить и оставить только ENGLISH
тем более и реальные биосы есть такие ;)
прикрутил к эмулятору "эмулятор ext rom extender"
по крайней мере stage1 грузит stage2
и stage2 грузит kdi
А поделиться? Мне тоже нужен рабочий инструмент для отладки проекта :)
А поделиться? Мне тоже нужен рабочий инструмент для отладки проекта :)
конечно, просто оно задышало буквально за 5 минут до поста :)
А после я убежал.
Ещё надо понять как это в приличном виде оформить
Надеюсь завтра что-то выложу.
Я наконец доотлаживал биос, предназначенный для работы с данным проектом. Выкладываю исходники.
В этом биосе диски A и B - это диски, эмулируемые через контроллер extrom. Реальные дисководы отображаются на буквы C и D. Диск E - это, как обычно, рамдиск в ГЗУ. Места мой драйвер занял на удивление мало, там в биосе еще места навалом под всякие расширения, если потребуются.
Исходники собирались макроассемблером ZMAC. Мне он понравился, очень хорошая вещь. В результате трансляции получается полный образ системных дорожек - этот бинарник можно прямо вписывать с начала KDI-файла, он имеет размер 10К и выровнен на границу физической дорожки.
Теперь настало время доработать прошивку контроллера для поддержки двух образов дисков (сейчас там один и тот же образ отображается и на А, и на В). И после этого можно будет подумать о расширении API для работы с образами - монтирование, список итд. Это будет, в принципе, уже финальная стадия проекта, после которой с эмулятором EXTROM можно будет полноценно работать. Я еще потом доделаю данный bios в плане косметики - работу с принтером по прерыванию, встроенный прямо в BDOS редактор командной строки типа деда, нормальные драйвера последовательного порта, может быть драйвер сетевого диска как в CP/N, итд.
Как важное дополнение к проекту, ESL обещал написать универсальный патчер, встраивающий драйвера extrom в любой BIOS из встречающихся. Прямо в памяти при загрузке. Ну, и на этом, пожалуй, все.
как всегда - круто!
продолжем пилить ;)
Знаешь, собирать системные дорожки из огрызков бинарников - это как-то не по мне. Проще собрать все из исходников.
Тот BDOS, который использовал я, после трансляции до последнего байта совпадает с BDOS, лежащим на дисках корвета. Потому как это оригинальный BDOS CP/M 2.2, исходники которого никто не менял. И я там пока ничего не трогал. Понятно, что у микродоса свой BDOS, но к микродосу и биос мой не подойдет. А так - какая разница, откуда он взят - со старых дисков или получен трансляцией исходников, если все это одно и то же.
Ну и, вообще-то, лезть в BDOS по абсолютным адресам, в обход официальных точек входа - это очень грязный прием. Конечно, некоторым программам это жизненно необходимо. Деду, например. Так дед с моей системой вполне корректно работает :)
Кстати. Таким примерно образом можно попробовать запустить CP/M поновее 2.2 Например 3.0. Исходники в сети есть, надо только разобраться, что там изменилось в интерфейсе с биосом.
Кстати. Таким примерно образом можно попробовать запустить CP/M поновее 2.2 Например 3.0. Исходники в сети есть, надо только разобраться, что там изменилось в интерфейсе с биосом.
можно, только это уже имхо совсем другой процесс ;)
Serebriakov
08.07.2014, 20:18
Как важное дополнение к проекту, ESL обещал написать универсальный патчер, встраивающий драйвера extrom в любой BIOS из встречающихся. Прямо в памяти при загрузке.
Я правильно понял, что можно будет подсовывать любой kdi и оно будет патчить образу биос "на лету" перед загрузкой? И как насчет МикроДоса, он есть в планах?
Кстати, а реально автоматически детектить уникальные биосы по каким-нибудь косвенным признакам? Чего-то мне кажется, что такие могут еще найтись.
Ну да, ESL обещал. Он уже и базу составил всех известных биосов - она где-то в этой теме лежит. Можно и микродос - по сути, его биос в плане работы с дисками не сильно отличается от биоса CP/M.
А вот как планируется детектить конкретный BIOS - это, я надеюсь, ESL нам сейчас расскажет. Я бы использовал или хеш (контрольеую сумму участка кода) или базу сигнатур.
Насчет неопознанных биосов - вряд ли их получится вот так запатчить, не раскапывая и не внося в базу. Предполагалось, что если биос не опознан - то вместо него будет подставляться стандартный, типа того что я выше выложил.
;)
ну мне уже и нечего добавить
как конкретно - будем пробовать.
проверим на пц, выберем минимум байт....
микродос - тоже будем пробовать, но это после всех cp/m
пока на всех наших дисках нашлось 10 версий уникальных биосов
и штук к 6 микродосов
4 только оптс1
2 только оптс2
и один универсальный.
rom5 - тест на RAW чтение/запись F0/F1
rom6 - тест на посекторную чтение/запись 01/02
32к данных
в ром6 - засекаем сколько полных прерываний заняло считать 256 секторов
первая цифра
треки 100...
сектора перебираются от 0, 1, 2, 3, ...
вторая цифра
треки 100...
сектора перебираются от 0, 9, 18, ...
т.е. заведомо прыгаем за 1к, проверка как поведет себя карточка.
испортит хвост диска с 100 трека ;)
понял что надо было делать CP/M тест чтоб читал не рав а через биос
но это уже носле....
можно было бы сравнить флоппи ...
rom5 - тест на RAW чтение/запись F0/F1
rom6 - тест на посекторную чтение/запись 01/02
32к данных
Вот результат на железе:
R: 0084 0091 01F1 | 54 51 2b
W: 004e 0039 01F1 | 62 68 2b
Если пересчитать по твоей таблице, получаем так:
to Korvet from korvet
Bytes in one int
84 132 6600 4e 78 3900
91 145 7250 39 57 2850
1f1 497 24850 1f1 497 24850
frames when transfer 0x8000
54 84 390.1 19504.8 62 98 334.4 16718.4
51 81 404.5 20227.2 68 104 315.1 15753.8
2b 43 762.0 38102.3 2b 43 762.0 38102.3
Что интересно, по 3 варианту скорость записи и чтения полностью идентичны. Это вполне предсказуемо - все процедуры похожи как близнецы. По 2 варианту в подпрограммах сидят лишние push af/pop af, они и гадят результат.
Правда, по нынешним временам цифра даже в 37 кб/с выглядит весьма убого. Блин, да у меня интернет-канал в 100 раз быстрее :) И это еще без учета тормозов SD-карты и VinxFS. Но, пожалуй, для тех времен и это неплохо.Учитывая, что ОЗУ у нас всего 64К - вся память перекидывается через интерфейс меньше чем за 2 секунды.
в ром6 - засекаем сколько полных прерываний заняло считать 256 секторов
А вот этот тест у меня вообще не пошел. То есть контроллер повис на первой же операции чтения, причем именно внутри процесса передачи, судя по индикатору. Попозже я соберусь с силами и попробую разобраться, что ты там такое напрограммировал. Тест-то интересный, он должен учесть и скорость SD-карты,
испортит хвост диска с 100 трека ;)
Не понял... У нас треков-то всего 80. Физические и логические треки совпадают по нумерации, разница только в отсутствии номера стороны и другом SPT. Я не знаю, что там будет делать эмулятор, но контроллер не сможет работать за границей файла образа KDI. Похоже, я теперь понял, что там виснет.
понял что надо было делать CP/M тест чтоб читал не рав а через биос
но это уже носле....
можно было бы сравнить флоппи ...
Вот это точно. Плюс биос и особенно BDOS тоже вносят свои тормоза, которые надо бы измерить.
Пожалуй, настало время впилить в контроллер поддержку 2 дисков, чтобы второй диск подсовывать чистый, и портить его в любом месте в процессе теста.
А то тебе проще - накидал свежих файлов в каталог extrom и готово, а мне надо вынуть карту из контроллера, вставить в PC, записать файлы, размонтировать и вернуть в контроллер. А это лишние телодвижения, которых хочется избежать.
Надо только понять, как в этой vinxfs переключаться между файлами. Пока я об этом даже не задумывался.
Не понял... У нас треков-то всего 80. Физические и логические треки совпадают по нумерации, разница только в отсутствии номера стороны и другом SPT. Я не знаю, что там будет делать эмулятор, но контроллер не сможет работать за границей файла образа KDI. Похоже, я теперь понял, что там виснет.
Тут речь идёт в терминах апи
Треки с 0 по 159
Сектора с 0 по 39
Для биоса то диск односторонний
Я в эмуляторе lseek пря из твоего кода и взял.
Да, ты прав, конечно, это я с утра не сообразил.
Все правильно, для биоса есть 160 дорожек. И все должно работать. Но виснет. В эмуляторе работает, а на реальной железке подвисает.
Я посмотрел - ты взял новые оптимизированные процедуры EXR_GETSEC. Попробовал поменять их на старые GETSEC - результат тот же. Виснет. Причем контроллер нормально воспринимает команду чтения дорожки 0 сектора 0, и более команд от корвета не поступает. Такое ощущение, что твоя программа пытается прочитать более 128 байт из интерфейса - а контроллер больше не отдает, вот и ждет. В эмуляторе, скорее всего, в этой ситуации отдается мусор.
Ладно, пока не буду ломать мозг над этой загадкой, тут есть более актуальные переделки. Сейчас доделаю работу с 2 дисками, и далее придется думать насчет API.
Все, прошивку контроллера я доработал:
1. Теперь она полноценно работает с 2 независимыми образами дисков A и B, выбирает их через поле DRV командного пакета. Чтобы не создавать на карте кашу, все образы дисков я перенес в каталог DISK на карте. Сейчас монтируются файлы DISKA.KDI и DISKB.KDI. Добавить в API смену образов на лету нетрудно, но пока нет особого смысла, ибо параллельно с этим придется написать и клиентскую утилиту под CP/M.
2. Я реализовал алгоритм автоматической подстановки системных дорожек при загрузке системы. Если происходит обращение к любому сектору дорожек 0 или 1, то вместо смонтированного образа диска A сектора берутся из файла SYSTEM.BIN в корне карты. В этот файл кладется образ системы, полученный при трансляции моего вчерашнего файла exrsystem.asm. Такой режим позволяет в качестве диска А выбирать абсолютно любой образ KDI, не трогая содержимого его системных дорожек. При этом запись на дорожки 0 и 1 диска А блокируется - контроллер принимает данные, но ничего с ними не делает.
Поскольку микродос использует 3, а не 2 системные дорожки, то образы дискет микродоса в устройстве А работать не будут (но они и раньше не работали). В устройстве B они будут работать вполне нормально.
Поскольку ESL собирается написать универсальный загрузчик различных систем, то такое поведение контроллера я сделал отключаемым. Для этого в API добавлена команда A0. Поле TRK командного пакета определяет - запретить (0) или разрешить (1) подстановку системы.
Архив с прошивкой прилагаю. Там, в extrom.c, полное описание API.
ESL, тебе придется доделать эмулятор для поддержки второго диска. Или ты его уже доделал? Функцию подстановки биоса можно пока не реализовывать, в эмуляторе она на данный момент не особо нужна.
Теперь о грустном. Похоже, придется несколько доделать базовую функциональность API. Я тут налетел на то, что некоторые программы самым наглым образом срут в порты PPI3. Ладно бы ОПТС, но, например, тест OLD тоже туда лезет. Я могу предположить, что и программы, работающие с джойстиком, полезут в этот порт.
В результате порт или вылетает из режима 2, или нарушается командная последовательность передачи данных. А у на слишком простой протокол - 4 любых байта, записанных в порт А, воспринимаются как команда, что сносит нафиг крышу бедному контроллеру. Я так уже несколько раз портил образы файлов на карте из-за случайных команд записи.
Поэтому протокол придется немного усложнить:
1. В командный пакет ввести 5 байт - контрольную сумму предыдущих 4. Если КС в пакете неправильная - контроллер просто игнорирует такой пакет и ничего не делает.
2. После передачи командного пакета, из контроллера в корвет передается 1 байт ответа - подтверждения команды (1) или отказа выполнять команду (0). Отказ может производиться, например, при неправильном коде команды, при ошибке чтения с карты, или если образ диска смонтирован с защитой от записи. Такой шаг позволяет не посылать команды в контроллер вслепую, а поддерживать двухсторонний диалог.
Если контроллер не дает подтверждения выполнения команды, то обмен данными не производится. Например, процедуры READ и WRITE биоса просто вернут флаг A=FF.
Данную переделку я уже готов внести в контроллер. Но, кроме контроллера, придется еще исправить BIOS (процедуры sendcmd, read и write), а также исмерители скорости, написанные ESL (также в процедуру sendcmd). Ну и, конечно, придется доделать эмулятор.
Если есть какие возражения и дополнения, высказывайте их сейчас. Потом поздно будет - весь код уже будет изменен.
2. Я реализовал алгоритм автоматической подстановки системных дорожек при загрузке системы.
отличная идея.
---------- Post added at 13:07 ---------- Previous post was at 13:05 ----------
ESL, тебе придется доделать эмулятор для поддержки второго диска. Или ты его уже доделал? Функцию подстановки биоса можно пока не реализовывать, в эмуляторе она на данный момент не особо нужна.
пока нет, но дело 5 минут ;)
там сейчас файл открывается/закрваается на каждое чтение сектора, так что вообще просто
в эмулятор подстановку тоже сделаю, а как без этого отлаживать ;)
---------- Post added at 13:09 ---------- Previous post was at 13:07 ----------
В результате порт или вылетает из режима 2, или нарушается командная последовательность передачи данных.
может его стоит инитиь при в SENDCMD ?
потерь особых не будет по скорости.
---------- Post added at 13:14 ---------- Previous post was at 13:09 ----------
Поэтому протокол придется немного усложнить:
Если есть какие возражения и дополнения, высказывайте их сейчас. Потом поздно будет - весь код уже будет изменен.
контроль таки да, имеет смысл.
жду новых версий.
может его стоит инитиь при в SENDCMD ?
потерь особых не будет по скорости.
Да, я тоже так подумал. Правда, не будут ли при перенастройке ВВ55 дергаться линии порта С? Это придется проверить.
Во всяких загрузчиках, пожалуй, так делать не стоит - они работают недолго и вполне предсказуемо.
контроль таки да, имеет смысл.
жду новых версий.
Уже начал писать. В контроллере все сделал, загрузчик 2 фазы сделал, а вот биос стал выдавать disk read error. Пока разбираюсь. Сам понимаешь, в реальном корвете нет встроенного отладчика...
вроде нашел ошибку в тесте rom6
там получилось что я посылал комманду чтения, и не читал данные
а потом новая комманда чтения уже с чтением данных.
очень может быть что по этому.
---------- Post added at 13:41 ---------- Previous post was at 13:40 ----------
это ты напсал что он виснет на чтении 0 трека/сектора
и я удевился, не должен он его читать в тесте ...
и полез смотреть
Вот видишь, что бывает, если не защищать пакет контрольной суммой. Ты нечаянно насрал в порт, а контроллер это воспринял как команду. Если бы первой шла цифра 2 - затер бы мне нафиг инфосектор :)
Вот видишь, что бывает, если не защищать пакет контрольной суммой. Ты нечаянно насрал в порт, а контроллер это воспринял как команду. Если бы первой шла цифра 2 - затер бы мне нафиг инфосектор :)
не, специально насрал, там вызов был SENDCMD, и CRC бы не помог ;)
и 2 бы пришла при тесте записи ;)
это не вычистил код из rom5.
Все, я закончил доработку API. Изменения коснулись 3 файлов - прошивки контроллера, загрузчика 2 фазы LOADER.ASM, и образа системы EXRSYSTEM.ASM. Теперь командный пакет защищен контрольной суммой, и если сумма неправильная - пакет просто игнорируется без каких-либо дополнительных действий. Также введена обратная связь - подтверждение приема контроллером команды.
В окончательном виде API выглядит так.
Формат командного пакета:
CMD: DS 1 ; код команды
DRV: DS 1 ; номер устройства, 0-A, 1-B
TRK: DS 1 ; номер дорожки
SEC: DS 1 ; номер сектора (размер сектора всегда 128 байт
CSUM: DS 1 ; Контрольная сумма предыдущих 4 байт,
Контрольная сумма равна беззнаковой 8-битной сумме всех предыдущих 4 байт минус 1:
CSUM=CMD+DRV+TRK+SEC-1
Если в команде не используются поля DRV, TRK, SEC, то их значение игнорируется.
Список команд:
Команды обмена секторами;
01 - чтение сектора
02 - запись сектора
Команды измерителя скорости.
F0 - прием 8000h байта мусора
F1 - передача 8000h байтов мусора
Комадны управления работой контроллера
00 - пустая операция, всегда возвращает ответ ОК (1)
A0 - включить/выключить подстановку системных дорожек. DRV всегда 0, TRK=0 - выключить, 1 - включить
После отправки командного пакета контроллер всегда отдает 1 байт подтверждения. Значение этого байта:
0 (error) - ошибка, команда отвергнута
1 (ok) - команда принята.
Если ответ 1, то далее идет обмен данными, как и раньше. Если ответ 0, то обмен данными не происходит, а контроллер ожидает следующего комадного пакета.
Диаграмма взаимодействия корвета и контроллера
Корвет Контроллер
--------------------------------------------------------
командный пакет
0 или 1
-- передача или прием блока данных, если требуется --
Я добавил еще одну команду - 00 (nop), Она всегда возвращает 1 (OK) и может быть использована для проверки функционирования контроллера (не повис ли он).
Измененные файлы лежат в аттаче. Заодно я вставил в загрузчик новую оптимизированную процедуру 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)
обновил эмулятор, новый биос и бутлоадер работают
disk_a.kdi & disk_b.kdi
Вот, спасибо! А то я уже сам хотел идти доделывать его. Инструмент-то для отладки позарез нужен. Заодно туда добавлю пробные варианты вызовов для монтирования образов, чтобы клиентскую часть под CP/M было где отлаживать.
кстати, есть баги похоже
на disk_b есть runner (не сразу, андо несколько раз не выходя из игры начать, прерывать)
Ладно, попробую. Может быть, и ты чего накопаешь.
и кстати не работают физ диски (те что A->C и B->D)
О, точно. И на железном корвете работать перестало. Но ведь работало же раньше! Где-то я в процедуре GETINFO биоса багу повесил. Это уже серьезно, сейчас буду смотерть, благо инструмент теперь есть.
Забыл написать
Подмена системных дорожек пока не реализована
Т.е вызов апи он кушает, но только флаг ставит у себя
Кстати а подмена только для A или для обоих ?
Забыл написать
Подмена системных дорожек пока не реализована
Т.е вызов апи он кушает, но только флаг ставит у себя
Кстати а подмена только для 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 не пускал ?
Не, я уже в пути на дачу, а там нет железного корвета. Теперь только в воскресенье смогу.
Дачный воздух пошел мне явно на пользу - я разобрался с BDOS ERROR в игрушке.
Опишу последовательность поиска, если кому интересно. Как мы тут уже заметили, BDOS error вылезает на ровном месте - к контроллеру обращений никаких нет. Я взял в зубы отладчик, поставил в биосе бряк и стал смотреть. Вижу - пришло обращение на чтение сектора. Форимруется запрос, пакет отсылается в порт. В логе эмулятора - тишина. Блин. Прикручиваю к эмулятору лог обращений к каналу А. Все 5 байт команды в порт уходят - и тишина. Уже думал, баг в эмуляторе. Но оказалось все проще. Опустился сигнал control. Это ППИ2 С7. Мы его используем для синхронизации начальной загрузки и отлова перезагрузки. Когда сигнал опущен - контроллер на команды не реагирует. Данные, идущие в порт А, просто тихо игнорируются, и все.
Приделал в лог трассировку этого сигнала. Оказалось, что через 5 примерно секунд после запуска игры он начинает делгаться туда-сюда с интервалом примерно полсекунды.
Теперь осталось найти, кто его дергает. Эмулятор с исходниками - великая вещь. Дописываю в лог вывод текущего PC в момент обращения к порту. Выявилось 2 точки - по адресу 2d1 и 33с. Обе точки, естественно, входят в адресное пространство программы. Смотрю туда в отладчике - точно. mov m,a. В HL - адрес ППИ2С.
Вот так. Придурок, писавший эту игрушку, решил, что срать от балды в произвольный порт - это прикольно.Я понимаю, когда лезут, например, к таймеру, или контроллеру прерываний. Но сюда-то зачем? Единственная функция этого сигнала - управление внешним ПЗУ.
И это только первая ласточка. Как я вижу, в мире корвета разгильляйство - норма жизни. Во всем - от ОПТС и журнальных статей до игрушек.
Самое поганое, что это не лечится. В эмуляторе можно, конечно, после загрузки системы игнорировать этот сигнал. А в железке - нельзя. По этому сигналу отслеживается момент перезагрузки системы. Еще одно, кстати, разгильдяйство - не вывести на боковой разъем сигнал RESET.
Исправить ситуацию можно, только пропатчив игрушку, забив 00 на место этих 2 команд. Но это тоже непросто - на диске runner.com выглядит совсем не так, как после загрузки в память. Упакован он там, что ли?
SaintTurnip
10.07.2014, 20:07
Это не может быть опросом джойстика?
Я считал, что джойстик висит на канале В ППИ 3. Зачем ему сигнал control?
Если же этот сигнал и правда для чего-то реально использовали, то мы имеем глубкую жопу. Ну или надо программно отключать реакцию контроллера на этот сигнал. Следствием чего будет невозможность перезагрузки корвета без ручной перезагрузки контроллера.
SaintTurnip
10.07.2014, 21:52
А может атавизм портирования?
А что, эту игрушку откуда-то портировали? Я просто в игрушках мало разбираюсь, хотя название - runner - что-то мне напоминает.
Все может быть, даже то, что на исходной платформе по этому адресу был какой-то полезный порт. Но попасть так прицельно именно на сигнал control...
В любом случае, игрушка в таком виде как сейчас использована быть не может. Патчить надо. И сколько еще таких программ найдется, подумать страшно.
В воскресенье приделаю к контроллеру желтый светоодиод, отображающий состояние сигнала control. Чтобы больше не вляпаться в такую же ситуацию.[COLOR="Silver"]
SaintTurnip
10.07.2014, 22:16
Если же этот сигнал и правда для чего-то реально использовали, то мы имеем глубкую жопу
там нельзя добавить еще один провод - сигнал выбора режима накопителя?
В смысле - сигнал на этом проводе заставит контролеер забить на сигнал Control? Это можно и без провода сделать, просто вызовом api. Только что будем делать, когда юзер нажмет кнопку Reset? Ведь тут же получим сообщение ОШИБКА ШИНЫ.
SaintTurnip
10.07.2014, 22:47
а при ресете выводы вв55 не сбросятся в ноль?
Serebriakov
10.07.2014, 22:52
Лучше, действительно, добавить индикацию.
Может сделать ее и для каких-нибудь других непредвиденных операций?
Понятно, что нет смысла вешать диоды на каждую ногу или порт =), но, к примеру, показывать чтение-запись на флеш-память.
Заодно мигать при включении, инициализации (флешка нашлась и определилась) и другом разном.
Устройство, как я понял, планируется самодостаточное (без участия пк), пусть бы сигналило, что происходит.
Может даже отладку на железе несколько упростит.
Ну или если есть свободные ноги, какой-нибудь простой цифровой индикатор повесить.
Парой индикаторов, да даже и одним, можно было бы показать много интересного онлайн, без необходимости лезть за логами на флешку.
Только, пожалуйста, без "LCD от Нокии" =), усложнит схему до безобразия.
Простые смертные то же хотят потом это собрать =)
по поводу runner - бага эмулятора ;(
при чтении из порта 2C читались 0 кроме статуса SoundEnabled
пофиксил
на реальной железке не должно повторяться
а RUNNER
делает
a=PPI2C
a&=0b11110111
PPI2C=a
вместо нормального
mvi a,6 (7)
stax ppi2rus
только делает это еще более медленно и многослова\но ;)
явно на ЯВУ писалось потому что ТАКОЕ нагенерить может только компилер ;)
оно еще для полного счасьтя и оверлейное ;)
я собственно по этой причине и гонял его, т.к. не так уж много игр на корвете использует диск во время работы
теперь надо их всех проверить.
RAM:0325 loc_325: ; CODE XREF: RAM:0316j
RAM:0325 ld hl, _1C_PPI2C_
RAM:0328 push hl
RAM:0329 ;
RAM:0329 ld hl, _1C_PPI2C_
RAM:032C ld d, 0
RAM:032E ld e, (hl)
RAM:032F push de
RAM:0330 ;
RAM:0330 ld hl, 11110111b ; TURN OFF SOUND ENABLE
RAM:0333 pop de
RAM:0334 ld a, l
RAM:0335 and e
RAM:0336 ld l, a
RAM:0337 ld a, h
RAM:0338 and d
RAM:0339 ld h, a
RAM:033A ;
RAM:033A ex de, hl
RAM:033B pop hl ; PPI2C
RAM:033C
RAM:033C XXX2:
RAM:033C ld (hl), e
сорри за панику ;)
но тему она подняла правильную, завтра отпишусь по этому поводу.
я думаю что софта который сбрасывает этот бит должно быть очень мало
и имхо можно поставть тумблер для таки случаев "ОТКЛЮЧИТЬ BOOT" ;)
такой себе хардкор ;)
Лучше, действительно, добавить индикацию.
Может сделать ее и для каких-нибудь других непредвиденных операций?
Я уже думал об этом. У нас пропадает более 10 ножек процессора, которые можно было бы для каких-нибудь целей использовать.
Понятно, что нет смысла вешать диоды на каждую ногу или порт =), но, к примеру, показывать чтение-запись на флеш-память.
Такая индикация уже есть - у меня же светодиод один висит на PB0. На ранних этапах я его использовал для отладки, а теперь он включается при входе в обработчик API, отключается при выходе. Получается типа лампочки на дисководе - весело помаргивает при обмене данными. Заодно, если программа недочитала из контроллера буфер - сразу видно по непогасшему светодиоду.
Заодно мигать при включении, инициализации (флешка нашлась и определилась) и другом разном.
Это я тоже планировал - сделать равномерное мигание с некоторой частотой в процессе ожидания загрузки. Поскольку PB0 - это еще и выход таймера T0. Впрочем, если повесить индикацию сигнала Control, то по нему и будет видно состояние загрузки.
Устройство, как я понял, планируется самодостаточное (без участия пк), пусть бы сигналило, что происходит.
Может даже отладку на железе несколько упростит.
Для отладки железа там есть последовательный порт, на который выдается исчерпывающая информация. Но вот на что точно надо вешать индикацию - это на ошибки. Если нет карты, если на карте нет загрузчика 1 фазы или он не читается, итд - как-то надо показать. Или добавить третий - красный - светодиод, или как-то хитро помигать уже существующим. Я это уже начал обдумывать, в воскресенье сделаю в железе.
Ну или если есть свободные ноги, какой-нибудь простой цифровой индикатор повесить.
Парой индикаторов, да даже и одним, можно было бы показать много интересного онлайн, без необходимости лезть за логами на флешку.
Не, это, я думаю, уже излишне. Это как минимум 8 провдков от меги только для одноразрядного индикатора, а для двухразрядного - уже 10, и два транзисторных ключа. Мне бы не хотелось усложнять схему без крайней необходимости, с учетом того, что она рассчитана на сборку далекими от электроники людьми :)
Только, пожалуйста, без "LCD от Нокии" =), усложнит схему до безобразия.
Вообще-то, LCD от нокии проще гораздо, чем семисегментный цифровой индикатор. Там всего 4 провода - DO, SS, CLK, C/D. Как на SD карте примерно. Уж 4 проводка любой начинающий запаяет. Хотя я ими пльзуюсь довольно широко в своих схемах, но тут, заметь, даже словом об этм не упоминал. Потому как старался делать как можно проще. Ну и сам LCD теперь не так просто добыть. Я покупаю их на ебее, уже прямо с несущей платой.
Простые смертные то же хотят потом это собрать =)
Вот и я о том же. Я думаю, ограничимся пока парой-тройкой светодиодов. Только надо функции придумать. Например так:
1 - обращение к контроллеру от корвета
2 - Control
3 - индикация ошибок.
По крайней мере, этого достаточно для отлова зависонов. А для более детального анализа - пдключаем через переходник к компорту РС и смотрим, что там происходит. Но это скорее для отладки железа нужно, не для работы.
---------- Post added at 07:18 ---------- Previous post was at 06:47 ----------
по поводу runner - бага эмулятора ;(
при чтении из порта 2C читались 0 кроме статуса SoundEnabled
пофиксил
на реальной железке не должно повторяться
О, а я себе уже всю голову сломал - почему у меня на корвете все работало, хотя явно не должно. А вот оно как. Только
a=PPI2C
a&=0b11110111
PPI2C=a
по идее, должно раз и навсегда сбросить control, раз из порта С читались нули. А он дергался туда-сюда. Ну да ладно, разобрались с проблемой.
только делает это еще более медленно и многослова\но ;)
явно на ЯВУ писалось потому что ТАКОЕ нагенерить может только компилер ;)
Ну вообщем да, писать такого уровня программы на ассемблере - это удавиться проще. Судя по твоему листингу ниже - операция AND делается с 16-битным числм DE, но потом используется только младший байт E. Человек такого никогда бы не написал. Но тут опять проявилось то самое разгильдяйство. Скорее всего, в коде было написано что-то вроде
*PORTA&=mask;
Причем mask описан как INT. Вот отсюда и монстр. Описали бы его как unsigned char - улжились бы в 3 инструкции. GCC в этом случае соптимизировал бы код, убрав лишние операции. А вот какой-нибудь C80 - он еще и сам кучу лишнего добавляет.
Я сейчас на этом С80 пытаюсь писать - это прост АД. Такой древний диалект языка С уже лет 20 мне не встречался.
не так уж много игр на корвете использует диск во время работы
теперь надо их всех проверить.
Я, еще когда с CP/N возился, обратил внимание, что игрушка KLAD открывает на диске какой-то DAT-файл. Но он не похож на оверлей - скорее всего, какая-нибудь таблица результатов. Но тоже надо бы проверить.
я думаю что софта который сбрасывает этот бит должно быть очень мало
и имхо можно поставть тумблер для таки случаев "ОТКЛЮЧИТЬ BOOT" ;)
такой себе хардкор ;)
Не, ну ведь тумблер - это не эстетично :) Проще сделать вызов API, запрещающий реакцию на Control. При этом в железке я просто отключу прерывание Int0, а в эмуляторе - добавишь еще один флаг к проверке при записи в PPI3 А. Ну и утилитку control с ключами -e и -d. При этом понимать, что при отключенном control перезагрузка возможна только отключением питания.
Serebriakov
11.07.2014, 09:45
Я уже думал об этом. У нас пропадает более 10 ножек процессора, которые можно было бы для каких-нибудь целей использовать.
Повесить какой-нибудь AY-3-8910 ? =) Будет еще и звуковая карта в довесок =)
А так может выделить какое-то количество ног и сделать какой-нибудь универсальный порт для подключения простых внешних устройств (порт корвета то будет занят теперь), для дальнейших экспериментов пригодится. Или нет смысла воротить комбайн?
... с учетом того, что она рассчитана на сборку далекими от электроники людьми :)
Кстати, когда схему будете рисовать, будет просьба, по-возможности, указывать номиналы или название всех деталей.
Вообще-то, LCD от нокии проще гораздо, чем семисегментный цифровой индикатор. Там всего 4 провода - DO, SS, CLK, C/D.
Не знал. Как-нибудь закажу поиграюсь.
Ну и сам LCD теперь не так просто добыть. Я покупаю их на ебее, уже прямо с несущей платой.
В Китае стоит 2.5$ всего, вроде дефицита пока нет. Только ждать пару месяцев пока доедет.
Повесить какой-нибудь AY-3-8910 ? =) Будет еще и звуковая карта в довесок =)
А так может выделить какое-то количество ног и сделать какой-нибудь универсальный порт для подключения простых внешних устройств
(порт корвета то будет занят теперь), для дальнейших экспериментов пригодится. Или нет смысла воротить комбайн?
Гы. Atmega32 - это тебе не inte core i3 :) Тут нет никакой многозадачности. Мега полностью занята обработкой запрсов и драйвером VinxFS, вешать на нее что-то еще - это сразу потеря скорости дискового ввода-вывода. А она и так не особо высока. Короче...
Во-первых, у нас полностью свободен порт B и 4 линии порта C PPI3. Этого, я думаю, вполне достаточно, чтобы повесить какой угодно контроллер. 8 линий данных, RD,WR, пара линий адреса. Управлять всем этим, конечно, надо с аккуратностью, чтобы не нарушить работу дискового канала. Но это 1 раз отладить драйвер и забыть о проблеме навсега.
Во-вторых, у нас же тут типа Open Source :) У тебя есть полная схема и откомментированные исходники прошивки. Если потребуется - добавляй в API свои функции для каких угодно вещей, в том числе и по управлению неиспользованными ногами контроллера. А потом выкладывай сюда свои наработки - обсудим и включим в основную ветку. Я ведь уже писал - мы API только еще формируем, и приветствуются любые конкретные предложения.
Но сейчас я стараюсь придерживаться условия максимальной простоты устройства. То есть схема делается как можно проще, а все что можно реализуется программно. То есть схема планируется для сборки кем угодно - вплоть до домохозяек, если может держать в руке паяльник.
Кстати, когда схему будете рисовать, будет просьба, по-возможности, указывать номиналы или название всех деталей.
Так я ее еще пару недель назад нарисовал и в архив с прошивкой положил. И номиналы вроде все указал в этот раз.
В Китае стоит 2.5$ всего, вроде дефицита пока нет. Только ждать пару месяцев пока доедет.
До Питера за месяц доезжает, иногда даже быстрее. Я обычно их сразу штук по 10 закупаю. Хорошая вещь. Но в данной схеме, конечно, ей не место, ESL совершенно прав.
немного запоздалых ответов ;)
Исправить ситуацию можно, только пропатчив игрушку, забив 00 на место этих 2 команд. Но это тоже непросто - на диске runner.com выглядит совсем не так, как после загрузки в память. Упакован он там, что ли?
тот вариант что на диске действительно упакован gold soft Executive files packer V1.0
та в конце написано ;)
несжатая 34816, сжататя 16896
несжатая есть в архиве
---------- Post added at 12:02 ---------- Previous post was at 11:56 ----------
А может атавизм портирования?
такое практичесски нереально
портирования были
1) с MSX (все порты НИИСЧЁТМАШ) (+ моя Atheletic Land aka Park)
2) c ZX (Dandare,Dandare 2, Deflector, Karate)
3) специалиста (целая одна ZOO)
все порты кроме специалистовскго - это полный дизасм, и адоптация
там хвостов не может быть
у порта со спеца - в теории может быть, это даже не порт а адоптация.
условно
3) с Commodore 16
тут вообзе только графика сдернута.
---------- Post added at 12:04 ---------- Previous post was at 12:02 ----------
А что, эту игрушку откуда-то портировали? Я просто в игрушках мало разбираюсь, хотя название - runner - что-то мне напоминает.
Это легенда ;)
http://ru.wikipedia.org/wiki/Lode_Runner
но это написанная специально для Корвета версия.
---------- Post added at 12:12 ---------- Previous post was at 12:04 ----------
В Китае стоит 2.5$ всего, вроде дефицита пока нет. Только ждать пару месяцев пока доедет.
или вот вариант ;)
http://www.banggood.com/IIC-Or-I2C-Or-TWI-SPI-LCD1602-Character-LCD-Module-For-Arduino-p-88316.html
16x2 по spi
можно и без spi тогда ног больше надо, чуть чуть .
но его если и делать то опционально, чтоб без его наличия всё работало
а если он есть то в качестве бонуса ....
---------- Post added at 12:14 ---------- Previous post was at 12:12 ----------
Я сейчас на этом С80 пытаюсь писать - это прост АД. Такой древний диалект языка С уже лет 20 мне не встречался.
дык
The Software toolworks
C80 compiler V3.1 4/11/84
;)
---------- Post added at 12:17 ---------- Previous post was at 12:14 ----------
Но сейчас я стараюсь придерживаться условия максимальной простоты устройства. То есть схема делается как можно проще, а все что можно реализуется программно. То есть схема планируется для сборки кем угодно - вплоть до домохозяек, если может держать в руке паяльник.
Это точно должна быть основная цель, по крайней мере до релизной версии
а уже потом можно изголяться ;)
---------- Post added at 12:19 ---------- Previous post was at 12:17 ----------
Так я ее еще пару недель назад нарисовал и в архив с прошивкой положил. И номиналы вроде все указал в этот раз.
диоды не подписаны...
а для меня слово "любой" не подходит, как я в магазине это скажу ;)
---------- Post added at 12:24 ---------- Previous post was at 12:19 ----------
Не, ну ведь тумблер - это не эстетично :) Проще сделать вызов API, запрещающий реакцию на Control. При этом в железке я просто отключу прерывание Int0, а в эмуляторе - добавишь еще один флаг к проверке при записи в PPI3 А. Ну и утилитку control с ключами -e и -d. При этом понимать, что при отключенном control перезагрузка возможна только отключением питания.
одно другому не противоречит
просто тумблер может просто отключить этот порт от контроллера, т.е. он всегда останется в режиме API, на всякий пожарный случай
еще из кнопок появилась такая идея
нам надо где-то держать софт "менеджер EXTROM"
завести кнопку "смонтировать диск с софтом в драйв"
например
три кнопки
A,B и SELECT
при нажатии A+SELECT монитруем насильно образ как бы
B+SELECT соответсвенно
A+B - отключить выход в режим boot
etc, etc ...
но такие кнопки уже в "расширенную" версию просятся в комплекте с индикатором.
а то как монитровать, не копировать же всё на софтину на все диски
или не так, а при нажатии кнопки монитровать как D всегда,
SaintTurnip
11.07.2014, 16:03
Кнопки, экран это уже перебор, не? Устройство не может работать без компьютера, поэтому и управлять им следует с компьютера. Тут и нормальный вывод, и удобный ввод, и габариты железки остаются в пределах разумного.
esl, а возможно сделать автодетект - если дисководов нет, чтобы все четыре буквы отдавались под образы? На 8010 дисководов нет. И с таким накопителем - не надо.
Кнопки, экран это уже перебор, не?
и я ж написал выше - эта вся красота в расширеной версии ;)
и будет работать и без него.
Устройство не может работать без компьютера, поэтому и управлять им следует с компьютера. Тут и нормальный вывод, и удобный ввод, и габариты железки остаются в пределах разумного.
а так и задумано,
при старте грузится загрузчик который на экране позволяет выбрать что надо и запустить.
а экран и кнопки - не сильно размер меняют
там то размер разъема лимитирует, +- пару сантиметров уже не роялит.
просто кнопки нужны на всякие экстренные случаи ...
esl, а возможно сделать автодетект - если дисководов нет, чтобы все четыре буквы отдавались под образы? На 8010 дисководов нет. И с таким накопителем - не надо.
в планах есть произвольвоный маппинг
т.е. в конфигураторе указываем что на какой букве
SD или реальный диск.
SaintTurnip
11.07.2014, 21:56
esl,
а экран и кнопки - не сильно размер меняют
я хочу вот так сделать:
http://www-user.tu-chemnitz.de/~heha/bastelecke/Rund%20um%20den%20PC/USB2LPT/ul-16i2.jpg
в планах есть произвольвоный маппинг
т.е. в конфигураторе указываем что на какой букве
SD или реальный диск.
Тут есть одно серьезное ограничение. VinxFS не может держать больше 2 файлов открытыми одновременно. Память в меге не резиновая, на буфера не напасешься. Это в эмуляторе ты можешь хоть все буквы от A до Z смонтировать :) Но вот а есть ли хоть какая-то практическая польза от 4 дисков одновременно? С учетом того, что в реальных корветах их было не более 2, а мы хоть сейчас уже можем создать образ KDI размером до 8 мегабайт без всякой переделки контроллера и драйверов. И напихать туда софта как на 10 обычных дискет :)
Насчет того, где хранить управляющий софт. Я тоже долго думал над этим.C учетом максимально возможной простоты устройства. Правда, софт еще не написан толком, но все же... Можно было бы встроиться в клавиатурный драйвер. Так как ты выше и писал, только вместо кнопки на контроллере использовать какую-нибудь из не особо нужных кнопок клавиатуры, например ГРАФ+А. Но это как-то грубовато получается.
Я думаю, на первых порах надо сделать так. Написать загрузчик типа LOADER.ASM и положить его в какой-нибудь ROM0.BIN. Загрузчик этот перед собственно загрузкй системы смонтирует к диску А образ SYSTEM.KDI, содержащий в себе весь необходимый софт. После загрузки юзер смонтирует к B свой рабочий диск и перепишет туда нужные ему программы. Вроде, довольно удобно получается. Программ будет немного, места они почти не займут.
Только вот теперь надо еще создать этот управляющий софт. АПИ я продумал, в контроллер его уже реализовал, в твой эмулятор тоже дописал обработчики новых вызовов. А вот с клиентской частью мучаюсь. Древнючий C80, в котором даже void нет, меня уже доканал. Да и транслирует он по полминуты каждую программу. Переехал работать в эмулятор - там придавил F6 и трансляция заканчивается мнгновенно. Но все равно, переключать рус-лат по ALT-CAPS я как-то до сих пор не привык.
Надеюсь, завтра все доделаю, а в всерксенье проверю на железе.
marinovsoft
12.07.2014, 07:35
forth32, не пробовали вместо C80 пользоваться кросс-компилятором С от vinxru ?
https://github.com/vinxru/OldLines/tree/master/C8080
forth32, не пробовали вместо C80 пользоваться кросс-компилятором С от vinxru ?
https://github.com/vinxru/OldLines/tree/master/C8080
Спасибо конечно, но.... Странная штука этот C8080. Вроде бы и на гитхабе лежит, но при этом там только бинарник по винду, и никаких исходных тескстов. Следовательно, толку мне от него никакго.
А вообще-то я, конечно, задумывался о кросскомпиляции. Тот же GCC есть под Z80 - http://z80gcc.sourceforge.net/, есть и специализированные кросс-компиляторы, типа http://www.bdsoft.com/resources/bdsc.html. Их вообще как грязи.
Только есть 2 проблемы. Во-первых, к компилятору нужна билиотека libc, поддерживающая интерфейс к BDOS/BIOS, причем именно версии 2.2, там API от версии к версии прилично различаются. А вот с этим уже есть проблемы. Версии, которые я видел, написаны для Z80, и вовсю используют отсутствующие в 8080 команды.
Во-вторых, отлаживать-то все равно придется в эмуляторе корвета. А как туда затащить скомпилированные .COM-файлы? После каждой трансляции впихивать их снаружи в KDI-образ? Неудобно, да и особо нечем. cpmtools глючит c записью в корветовски образы, в свою программу я так запись и не приделал. А других подходящих инструментов для работы с файловой системой CP/M я не нашел...
Serebriakov
12.07.2014, 15:25
А других подходящих инструментов для работы с файловой системой CP/M я не нашел...
Есть пару программ под Win с GUI (эмулятор VirtualKorvet (http://soviet-pc.narod.ru/VKorvet0129.zip), к примеру, открывает менеджер по CRTL+клик по дисководу), но я так понимаю здесь нужны Command Line и Linux.
И оно есть. Снова благодарим ELS, он писал такую программу. Не знаю как оно соберется под Linux, но, думаю, проблем особых не будет.
Вот оригинальные исходники ELS (xKorvet13.zip). (http://zx-pk.ru/showpost.php?p=716631&postcount=24)
Вот исходники несколько доработанной версии (xkorvet13f2.7z) от Marinovsoft. (http://zx-pk.ru/showpost.php?p=717394&postcount=31)
Вот Readme, которые шли с виндовыми бинарниками (там описаны command line параметры):
для FAR надо добавить в файл
C:\Program Files\Far\Plugins\MultiArc\Formats\custom.ini
или
C:\Program Files\Far2\Plugins\MultiArc\Formats\custom.ini
секцию
и положить xkorvet.exe чтоб он был в пути запуска
например в папку фара
[KDI]
Extension=kdi
TypeName=Korvet Disk Image
List="xkorvet l"
Errorlevel=1
Start="^Begin:"
End="^End."
; 01\RUNREDIT.COM 25856
Format0="nnnnnnnnnnnnnnnnnnnnn zzzzzzzz"
Extract=xkorvet e %%A %%f
ExtractWithoutPath=xkorvet e %%A %%f
Delete=xkorvet d %%A %%f
Add=xkorvet a %%A %%R\%%f
2003-02-06
dir :: fix len print for (E5)
1.1
2003-06-02 - Ver. 1.3
Add :: Добавлена обработка USER
Add :: fixed - если не мог открыть файл - выходил молча.
Add :: Ошибки передаем на верх, позволяет увидеть в фаре.
Wipe:: Сделан, очищает DIR & Empty Cluster
all :: Ругаемся на неверный USER, Е5 в том числе
all :: отдельно удаляем первый слеш
todo:
+ режим очистки свободного места.
+ очистить входы в директорию и свободные кластеры
сделать undocumented?
сделать режим сжимания свбодных входов и кластеров
(дабы хвост директории и диска были пустыми).
утилита для работы с образами дисков ПК "Корвет" - KDI
1) Создание пустого диска ЛЮБОГО размера
по умолчанию - стандартного 720к
в теории можно сделать диск
255 секторв Х 255 дорожек Х 2 стороны Х 1024 байта сектор = 128 метров.
с возможностью устанвкм ДИСК БИОСа из файла
2) копирование файла с ПЦ на ДИСК
3) копирование файла с ДИСКА на ПЦ
4) Удаление файла с диска
5) Очистка пустого места (пустых кластеров и входов в директорию)
6) манипуляция с биосом диска.
7) Диагностика и лечение диска от ошибок.
9) Редактор Диска ???
10) режим - указываем директорию, и все из нее помещается в диск
или файл со списком на вход.
общие замечания
USER - отображать как директории USER00/
как бороться с именами вида cp/n90.sys ?????
BIOS - отображать отображать как BIOS/
или как SYSTEM/ содержащей в том числе файл BIOS.SYS??
и кроме этого допустим INFO.TXT
А насчет кросс-компилятора от vinxru, может с ним связаться и попросить исходники?
---------- Post added at 14:25 ---------- Previous post was at 13:43 ----------
В общем, я ему отписал, может поделится.
---------- Post added at 20:38 ---------- Previous post was at 14:25 ----------
Из переписки:
Привет, я удалил исходники. Что бы ерундой не страдать :)
попозже полностью его планирую переписать
Ох, ё =(
marinovsoft
12.07.2014, 15:28
Исходники он удалил.
И оно есть. Снова благодарим ELS, он писал такую программу. Не знаю как оно соберется под Linux, но, думаю, проблем особых не будет.
Да, видел я те исходники. Сходу их собрать не получилось, а разбираться, почему не собирается, мне в тот момент было лень. Теперь, конечно, можно вернуться к этому вопросу, ну или свою программу доделать. Только есть более актуальные задачи.
А так - идею кросскомпиляции я пока отложил, потому как вначале надо найти подходящую STDLIB. Ну и просто интересно стало снова почувствовать себя в шкуре разработчика, пишущего программы на 8-битной платформе конца 80-х.
Да, видел я те исходники. Сходу их собрать не получилось, а разбираться, почему не собирается, мне в тот момент было лень. Теперь, конечно, можно вернуться к этому вопросу, ну или свою программу доделать. Только есть более актуальные задачи.
странно, он собрался как-то с пол пинка :(
правда мне от негу было нужно только чтение в тот момент
запись и чтение нормально работает только в USER 0
USER там предсталяются как директории типа 05/file.xet
вывод по быстрому добавил,а вот обработку для записи/удаления не правил
еще там надо ICONV прикрутить или в фильтр для MC,
т.е. для средств cross компиляции должен подойти
для кросс девелопмента попалась такая забавная штука
http://www.arrakis.es/~ninsesabe/aliados/
она транслирует вызовы cp/m в файловую систему
т.е работает с текущим содержимым директории
там не всё работает
как я понял автор его делал как раз для кромкомпиляции в Hi-Tech C
может тебе подойдёт ;)
это единственный эмуль cp/m я откопал который не требует образа а работает нативно с FS
Первый патченый биос - загрузился
но сейчас виснет, при некоторых условиях
ловлю баги
как откатаю первый - дальше уже будет проще
да, эмулятор с исходниками - штука удобная
сегодня ловил - пишется комманда в эмулятор - а он молчит
оказалось сброшен PPI2C.7
оказалось его глупый биос в HWINIT переинициализирует ;)
---------- Post added at 21:50 ---------- Previous post was at 21:43 ----------
Насчет того, где хранить управляющий софт. Я тоже долго думал над этим.C учетом максимально возможной простоты устройства. Правда, софт еще не написан толком, но все же... Можно было бы встроиться в клавиатурный драйвер. Так как ты выше и писал, только вместо кнопки на контроллере использовать какую-нибудь из не особо нужных кнопок клавиатуры, например ГРАФ+А.
Слушай,!!!
твоя идея навеяла !
по комбинации кнопок (на ее обработку много место в резиденте не нужно)
тупо грузи файл через апи в 0x100 и передаем ему управление !
и всё, не надо хранить на диске!
---------- Post added at 23:27 ---------- Previous post was at 21:50 ----------
Кстати это снимает и проблему с стдлиб
Т.к оно пуститься уже при наличии доса ...
сегодня ловил - пишется комманда в эмулятор - а он молчит
оказалось сброшен PPI2C.7
оказалось его глупый биос в HWINIT переинициализирует
О, я на это тоже налетал, когда биос делал. Они называют это что-то вроде инициализация принтера. И посылают в порт байт со сброшенным 8 битом. Опять то же самое разгильдяйство...
Тебе теперь придется в каждом биосе отловить это место и запатчить. Сочувствую...
по комбинации кнопок (на ее обработку много место в резиденте не нужно)
тупо грузи файл через апи в 0x100 и передаем ему управление !
Хорошая идея. Но тут есть ряд моментов.
1. Хоткей должен работать только в момент ожидания ввода командной строки. То есть встраиваться надо не в клавиатурный драйвер, а в BDOS. Зато хоткей можно выбрать абсолютно любой, тот же ctrl-a например.
2. Как передавать программе параметры командной строки? Или вводить их в диалоге уже после запуска программы?
Возможно, уж коли встраиваться в BDOS, проще добавить туда еще одну команду. Тут подумать надо.
Кстати это снимает и проблему с стдлиб
Т.к оно пуститься уже при наличии доса ...
А как это снимает проблему stdlib? КАк раз и нужна библиотека, работающая через BDOS. То есть, например, printf должен работать через
Bdos OUTCON (функция 2). Тот stdlib.rel, что идет с C80, именно так и работает. А те, что идут с кросскомпилятрами, работают или непонятно как, или используют расширения Z80.
что-то у меня непонятка
ком файлы до 8к читаются
большие или BDOS ERR ON
или виснет с эффектами :(
На всякий случай.
1. Проверь, правильно ли заполняется блок DPB при чтении инфосектор
2. Также проверь, не ошибся ли ты с указателем на буфер DMA. Не забудь, что он беззнаковый.
А то ты тут в эмуляторе, в ext_rom.c, крупно ошибся с этой самой беззнаковостью при чтении параметров из командного пакета :)
Настало время отчитаться об очередном этапе разработки контроллера - расширении API для управления монтированием образов.
Итак, в API у нас теперь добавилась группа команд 8x. Вот их описание:
80 — получить имя образа
Команда предназначена для получения имени KDI-файла, смонтированного в данный момент на логическом устройстве A или B. Номер устройства задается в поле DRV. Возвращается 14-байтовый буфер с именем файла, заканчивающийся 0.
81 — смонтировать образ
Команда монтирует один из имеющихся KDI-образов к логическому диску. Образы должны быть расположены на SD-карте в каталоге DISK/. Параметры команды:
DRV — номер устройства
TRK — режим доступа к диску: 0 — чтение/запись, 1 — только чтение.
SEC — 0 - временное мотирование, 1 - постоянное
Постоянное монтирование позволяет сохранить связь логического диска с конкретным KDI-образом после перезагрузки системы. Для этого в корне SD-карты создается файл MOUNT.CFG, содержащий в себе имена файлов, монтируемых к дискам А и В при загрузке системы. Если такого файла нет, то он создается, а в качестве имен файлов назначаются значения по умолчанию — DISKA.KDI и DISKB.KDI.
После ввода команды контроллеру передается 14-байтовый буфер с именем назначаемого файла, окнчивающийся 0. Контроллер проверяет наличие файла и его информационный сектор, в случае ошибок монтирование не происходит, а флаг состояния устройства опускается.
82 — проверка состояния устройства
Команда возвращает ответ ОК, если устройство смонтировано, или Fail, если не смонтировано. Флаг состояния автоматически опускается в случае ошибок ввода-вывода на данном устройстве. С помощью этой команды можно проверить результат предыдущего вызова mount (81)
83 — создать образ
Команда создает на SD-карте пустой KDI-файл с указанным именем, формирует в нем инфосектор и пустой каталог. Команде надо передать 14-байтовый буфер с именем создаваемого файла. Если файл существует, то он будет полностью затерт с потерей всей информации. После создания файл автоматически монтируется на указанный в DRV диск.
На данный момент создается стандартный KDI-файл размером 800К. В будущем планируется добавить параметры для создания файла произвольного размера.
84 — получить каталог образов
Команда предназначена для просмотра каталога всех KDI-файлов, имеющихся на карте. Она отдает цепочку строк размером 14 байт для каждого из имеющихся файлов. Признаком конца цепочи является байт 00 (строки имен файлов не могут начинаться с 00).
Теперь у нас есть все инструменты для управления образами дисков прямо с корвета. Я написал для этого утилиту MOUNT под CP/M. Для этого пришлось приспособиться к убогому компилятору C80, но в конце концов я приспособился и получилась вполне приличная вещь.
Формат командной строки:
MOUNT
- без аргументов показывает текущие смонтированные образы
MOUNT /L
- Выводит список файлов-образов KDI в каталоге DISK/ карты
MOUNT [ключи] DRV[:] FILE
подключает образ FILE к логическому диску DRV
FILE - образ KDI, лежит в каталоге DISK/ SD-карты контроллера
DRV - буква монтируемого диска, A или B. Двоеточие в коце необязательно.
/R - подключить образ в режиме только чтение.
/P - сделать назначение диска постоянным
/C - создать пустой образ диска и смонтировать его
Вот пример работы с программой:
CP/M-80 vers. 2.2
EXTROM disk emulation BIOS v1.02
A>MOUNT /L
HLP.KDI | DISK_B.KDI | TDISK.KDI | SYS.KDI |
DISK_A.KDI | OSCPM.KDI | TD.KDI | E.KDI |
-- Всего 8 файлов --
A>MOUNT /R B OSCPM
A>MOUNT
A: => (R/W) DISKA.KDI
B: => (R/O) OSCPM.KDI
A>MOUNT /C B TEST11
B: Создание файла...ok
A>MOUNT
A: => (R/W) DISKA.KDI
B: => (R/W) TEST11.KDI
Следует быть осторожным с постоянным монтированием диска А, пока мы не придумали интерфейс доступа к монтированию в аварийных ситуациях. Дело в том, что если на новом образе диска А не окажется программы MOUNT, то перемонтировать этот диск будет уже нечем. В этом случае следует просто удалить файл MOUNT.CFG из корня карты (или каталога extrom/ в эмуляторе). Тогда будут восстановлены образы DISKA и DISKB по умолчанию.
Во вложении я кладу архив extrom_mount.7z, содержащий новую прошивку контроллера с поддержкой данного расширения API, а также образ MOUNT.KDI, содержащий исходники и готовую собранную программу MOUNТ. Кроме того, я вложил туда текстовый документ api_v2.odt, с полным описанием текущей версии API. Этот файл можно использовать как базовый при написании будущего пакета документации к нашей разработке.
ESL, я позволил себе также внести все исправления в эмулятор. Сам понимаешь, для отладки мне жизненно необходим инструмент поудобнее реального корвета. Прикладываю архив kemu_newapi.7z, содержащий доработанный файл ext_rom.c. Мои изменения:
- Полностью введена поддержка новых вызовов 80-84.
- Поддержка флагов состояния устройства, и флагов R/O-R/W
- Поддержка постоянного монтирования и файла списка монтирования MOUNT.CFG такого же формата как и в реальном контроллера.
- Исправлена серьезная ошибка в приеме пакета (иногда получалась неправильная КС) и ошибка реализации команды NOP (00).
- Полностью реализован режим подмены системных дорожек (у тебя был только прием команды A0 и установка флага). Образы дорожек берутся из файла SYSTEM.BIN (это переименованный exrsystem.cim), лежащего в корне extrom/.
- Образы KDI теперь живут в каталоге DISK/ внутри extrom/, то есть как на реальном контроллере. Это нужно для того, чтобы образы дисков не мешались в кучу с другими служебными файлами и не лезли в список по команде DIR (84).
- Теперь все имена образов, а также DISK/ и MOUNT.CFG записаны большими буквами. Дело в том, что FAT, в отличие от ext*, не отличает больших и маленьких букв, и по стандарту в каталоге должны использоваться только большие буквы. Отнако линуксовый драйвер VFAT на это забивает, что иногда приводит к неприятным последствиям в виде двух файлов с одинаковым именем. Мне уже задрало каждый раз переименовывать файл при копировании из extrom/disk/ на реальную карту. Поэтому предлагаю на будущее имена образов дисков писать только большими буквами.
Что я не стал менять, так это различие в именовании дисков по умолчанию. В контроллере - DISKA и DISKB, у тебя в эмуляторе - DISK_A и DISK_B. Раз ты их так назвал - тебе и решать.
Ну, надеюсь, мои наработки тебе пригодятся при доработке эмулятора.
Теперь осталось придумать аварийный интерфейс для доступа к утилите mount, Мы тут начали это дело обсуждать, но как-то пока заглохло. И ждем универсальный загрузчик от ESL, он его уже отлаживает. Ну и на этом первый этап будет завершен - останется потестировать, исправить баги, и можно будет объъявлять первый релиз.
marinovsoft
14.07.2014, 12:20
Можно хотелку: интерфейс для работы с подключаемыми образами в виде, аналогичном sdrive для atari xe ?
http://www.youtube.com/watch?v=pyLWMHzBOiE
В смысмле - графический интерфейс с функциональностью, аналогичной mount? Знаю я этот SDRIVE, собирал в свое время для atari 130XE.
Дело в том, что там это системно-независимая программа, а здесь ее надо делать как обычную программу под CP/M. При этом с учетом особенностей видеоконтроллеров корвета. А попробуй попрограммировать под CP/M по-настоящему, хотя бы на C80 - так взвоешь от тоски. :) То есть можно, конечно, сделать что-то в стиле Proffer Commander, если как следует поуродоваться и если кому-то это действительно надо. Может, кто-нибудь возьмется? У нас же тут открытая разработка Open Source все же. Просто я, наоборот, предпочитаю утилиты командной строки...
Под досом для разработки интерфейса пользователя хотя бы Turbo Vision был, я на нем в свое время программы для ремонта жестких дисков делал. А тут - вообще ничего похожего на библиотеку пользовательского интерфейса. Интересно, на чем делали тот же Proffer Commander[COLOR="Silver"]
Вопрос по схеме из http://zx-pk.ru/showpost.php?p=722122&postcount=57
там точно указаны правильные номер контактов на разъеме корвета ?!?!
а то или доки неверные или ошибка в схеме.
например 24-25 у тебя написано IRQ9_Control
а по схеме выходит PB7 + +5v
ну и всё остальное там не совпадает ...
можеш глянуть ?
Попробовал тест скорости #6 (секторный) на реальном железе.
r: 67 6c
W: 25 28
Или меня уже совсем проглючило, или запись у нас идет быстрее чтения! Бред какой-то.
---------- Post added at 15:22 ---------- Previous post was at 15:19 ----------
Вопрос по схеме из http://zx-pk.ru/showpost.php?p=722122&postcount=57
там точно указаны правильные номер контактов на разъеме корвета ?!?!
а то или доки неверные или ошибка в схеме.
Мы это уже обсуждали как-то... Там нумерация указана дл разъема DB-37, который стоит в моем корвете. Для РП-9 нумерация будет зеркальной для каждого ряда, то есть
DB РП
19 1
18 2
...
1 19
И так же для второго ряда.
Попробовал тест скорости #6 (секторный) на реальном железе.
r: 67 6c
W: 25 28
Или меня уже совсем проглючило, или запись у нас идет быстрее чтения! Бред какой-то.
---------- Post added at 15:22 ---------- Previous post was at 15:19 ----------
Мы это уже обсуждали как-то... Там нумерация указана дл разъема DB-37, который стоит в моем корвете. Для РП-9 нумерация будет зеркальной для каждого ряда, то есть
DB РП
19 1
18 2
...
1 19
И так же для второго ряда.
спасибо, посмотрю!.
сегодня надеюсь заберу свои железки !
с тестом - забавно, надеюсь сегодня тоже проверить ;)
Ты там что - уже спаял контроллер? Если да, до я выложу сюда новую версию прошивки. Та, что в архиве несколькими письмами выше, содержит в себе серьезную ошибку, которую я выловил буквально час назад.
Ты там что - уже спаял контроллер? Если да, до я выложу сюда новую версию прошивки. Та, что в архиве несколькими письмами выше, содержит в себе серьезную ошибку, которую я выловил буквально час назад.
я ж не паяльщик.
вечером поеду к брату, он как раз знает чем паяльник от диода отличается.
надеюсь вечером запустим и тюнер и экстендер.
так что прошивку - конечно выкладывай.
p.s. и выложи скрипты которые шьют эту балалайку с нуля
я то avrdude пользовался, но всякие там fuse и прочее не шил.
так что прошивку - конечно выкладывай.
Выкладываю. На всякий случай - все файлы и сборочный скрипт. Также там лежит обновленная схема - на старой я забыл нарисовать кнопку сброса и подтяжку для этого сигнала. Хотя, конечно, нетрудно догадаться, куда эту кнопку вешать... :)
p.s. и выложи скрипты которые шьют эту балалайку с нуля
я то avrdude пользовался, но всякие там fuse и прочее не шил.
Далее я привожу команды для своего программатора STK500 на порту /dev/ttyACM0, тебе ключи -c и -P надо указать под твой программатор.
Значит, для Atmega32 фузы будут такими - H: D1, L: E4.
Команда записи:
avrdude -p m32 -c stk500 -P /dev/ttyACM0 -V -U lfuse:w:0xe4:m -U hfuse:w:0xd1:m
Фузы вписать один раз и больше не трогать.
Запись EEPROM - туда шьется загрузчик фазы 1 (который xboot.asm). При вышеуказанных фузах он не стирается при перезаписи флеша, поэтому его тоже вписать 1 раз и не трогать, пока не захочешь подправить сам код загрузчика.
avrdude -p m32 -c stk500 -P /dev/ttyACM0 -U eeprom:w:xboot.bin:r
Ну и, наконец, запись флеша - самая длинная операция.
avrdude -p m32 -c stk500 -P /dev/ttyACM0 -V -U flash:w:extrom.hex:i
Еще позволю себе дать несколько рекомендаций.
1. Перед вставкой карты обязательно измерь напряжение ее питания. Не знаю, как ты его будешь получать - LM-регулятором, диодами, делителем со стабилитроном, или еще чем... Но на всякий случай проверь, а то от 5в карта мнгновенно дохнет.
2. Также первый раз заливай фузы-еепром-флеш тоже без вставленной карты. Причем начинай именно с фузов, а потом уже остальное. При последующих перешивках карту можно не вынимать.
3. Имеется отладочный терминал на ножке TxD Usart. Его параметры - 1000000-8-N-1. Туда много полезного вываливается в процессе работы программы.
4. Ну и, естественно, перед подключением меги проверь и ее напряжение питания. А то там на разъеме и +12 есть, тут ошибиться раз плюнуть.
Надеюсь, у тебя все получится.
Ты там что - уже спаял контроллер? Если да, до я выложу сюда новую версию прошивки. Та, что в архиве несколькими письмами выше, содержит в себе серьезную ошибку, которую я выловил буквально час назад.
Подскажи пожалуйста, ты выложил исправленую прошивку ?
---------- Post added at 14:16 ---------- Previous post was at 13:08 ----------
ESL, я позволил себе также внести все исправления в эмулятор. Сам понимаешь, для отладки мне жизненно необходим инструмент поудобнее реального корвета. Прикладываю архив kemu_newapi.7z, содержащий доработанный файл ext_rom.c.
так конечно, для этого же и делаем.
---------- Post added at 14:18 ---------- Previous post was at 14:16 ----------
Что я не стал менять, так это различие в именовании дисков по умолчанию. В контроллере - DISKA и DISKB, у тебя в эмуляторе - DISK_A и DISK_B. Раз ты их так назвал - тебе и решать.
Ну, надеюсь, мои наработки тебе пригодятся при доработке эмулятора.
с дисками давай единообразно, переделаю на DISKA,DISKB
Как долезу до эмулятора - сразу включу.
Послендние несколько дней было не до эмулятора.
---------- Post added at 14:55 ---------- Previous post was at 14:18 ----------
В архиве у mount.kdi - неправильное crc инф. сектора
Cооветсвенно он не открывается ни xkorvet ни эмулятором.
скопировал из стандартного - заработал.
---------- Post added at 15:09 ---------- Previous post was at 14:55 ----------
В mount надо бы проверку вставить на наличие интерфейса.
About вывести в самом начале ?
И проверять что PPI2С.7=IRQ0=1 - упасьб если это не так.
Подскажи пожалуйста, ты выложил исправленую прошивку
Да вроде да, исправленную. Правда, с тех пор я ее еще доделал. Оптимизировал операции ввода-вывода блоков, как мы делали со стороны корвета, и добавил индикацию ошибок вымаргиванием светодиода.
Прикладываю в аттаче последнюю на данный момент версию.
В архиве у mount.kdi - неправильное crc инф. сектора
Cооветсвенно он не открывается ни xkorvet ни эмулятором.
скопировал из стандартного - заработал.
Да, блин, точно. Ошибка сидит в моей доработанной версии эмулятора - диск создавался по mount /c, а эмулятор по ошибке не дописывал последний байт инфосектора формируемого диска.
В процедуре emu_creatikdi, в массиве infosector[], надо дописать в конце еще один байт 0x10. Это полный дамп всех значимых полей инфосектора, а последний байт я где-то потерял. А не заметил я этого потому, что диск все время был A:, а там работает режим подстановки системных дорожек - этот инфосектор никогда никем не читался :)
В прошивке контроллера такой ошибки нет, хотя подпрограммы в контроллере и эмуляторе почти одинаковые.
В mount надо бы проверку вставить на наличие интерфейса.
About вывести в самом начале ?
И проверять что PPI2С.7=IRQ0=1 - упасьб если это не так.
Насчет about - я придерживался минимализма, свойственного всем утилитам CP/M. Всякие там PIP, STAT, SUBMIT и прочие тоже не имеют ни ABOUT, ни хелпа. Хотя хелп (/H), может быть, и надо бы добавить. Но я старался, чтобы COM файл получился как можно меньше.
А насчет проверки наличия интерфейса и активности сигнала Control - ты абсолютно прав. Надо доделать, иначе программа будет виснуть намертво при запуске без интерфейса.
Выкладываю. На всякий случай - все файлы и сборочный скрипт. Также там лежит обновленная схема - на старой я забыл нарисовать кнопку сброса и подтяжку для этого сигнала. Хотя, конечно, нетрудно догадаться, куда эту кнопку вешать... :)
файлы похоже приложить забыл ?
из радостных - тюнер заработал
светодиод на плате - работает
из не очень -
без авр корвет говоит ПЗУ неисправно.
с авр корвет говорит "ОШИБКА ШИНЫ"
на бейсике чтение и 3.A - читаются рандомные данные :(
платка 3 раза мигает светодиодом
установка карточки (fat32) не изменило
терминал тоже не заработал, воткнул его в ком ноута, он что-то похоже выводит
но не вменяемое ;)
может скорость до стандартной изменить можно ?
что посоветуеш ?
---------- Post added at 00:40 ---------- Previous post was at 00:39 ----------
Выкладываю. На всякий случай - все файлы и сборочный скрипт. Также там лежит обновленная схема - на старой я забыл нарисовать кнопку сброса и подтяжку для этого сигнала. Хотя, конечно, нетрудно догадаться, куда эту кнопку вешать... :).
похоже забыл приаттачить ?
файлы похоже приложить забыл ?
Да, забыл. Тормлзнул малость. Прикладываю сюда. Заодно очередная доработка прошивки - включен режим удвоения частоты SPI. Теперь карта работает на полной скорости, и все тормоза вносит исключительно драйвер VinxFS.
без авр корвет говоит ПЗУ неисправно.
У тебя ОПТС2? Там же тест ПЗУ - просто подсчет контрольной суммы. У меня он говорит "неверная КС". Хотя, может быть, твоя версия ОПТС отличается от моей. Вообщем, это нормально. Без АВР с просаженным сигналом Control он читает из порта А все FF, считает их сумму и, естественно, она оказываетсяч неправильной.
с авр корвет говорит "ОШИБКА ШИНЫ"
О, это моя любимая ошибка. Я полдня угробил в свое время на нее. Вообщем, у тебя AVR не отрабатывает прерывание от сигнала Control и не переводит порт A в режим ввода - поэтому из этого порта читается мусор вместо записанных туда данных. Уроды блин разработчики.
А не обрабатывается прерывание потому, что контроллер налетел на ошибку, о чем тебе и сообщает. При этом все внешние прерывания он отключает. Если в процедуре led_error ты уберешь перую строчку
GICR&=~(_BV(INT0)|_BV(INT1)); // Запрещаем оба внешних прерывания
То, скорее всего, сможешь загрузить загрузчик фазы 1 - тот, который в EEPROM. На экране получишь "Boot:", но на этом все.
платка 3 раза мигает светодиодом
Это ошибка инициализации файловой системы. Пожалуй, пора составить табличку с кодами ошибок, чтобы по исходнику не шарить в поисках.
установка карточки (fat32) не изменило
Сделал бы лучше Fat16, с 32 имели место быть глюки. mkfs.vfat -F 16.
И еще - не делай на карте разделов. То есть файловая система должна начинаться с блока 0, разбивать карту с помощью fdisk не надо. То есть примерно так:
mkfs.vfat -F 16 /dev/sdb
Ну и на карте должен как минимум уже лежать загрузчик 2 фазы LOADER.BIN. Но это уже другая ошибка - 2. А у тебя явно контроллер не признал карту. Надо смотреть терминал. Может быть, у тебя карта вообще SDHC - тогда, конечно, работать ничего не будет.
терминал тоже не заработал, воткнул его в ком ноута, он что-то похоже выводит
но не вменяемое ;)
может скорость до стандартной изменить можно ?
Скорость изменить, конечно, можно. Только это может повлиять на производительность - система начнет иногда ждать окончания вывода сообщения. Сейчас все сообщения выводятся параллельно с основной работой и не тормозят процесс.
Скорость задается в процедуре Main:
UBRRH=0;
UBRRL=0;
Это максимальная доступная скорость. Старший и младший байт делителя. Значения этих полей описываются в даташите на Atmega32, страница 167 (для частоты 8 МГц, U2X=1). Для 115200 делитель будет равен 8. (L=8 H=0).
Но вообще-то должно работать и на этой скорости. Ты через переходник USB-serial подключаешься? На всякий случай не забудь, что здесь неинвертированный TTL сигнал, надо подключаться непосредственно к микросхеме переходника или использовать преобразователь уровней на каком-нибудь Max232.
Я пускаю терминалку minicom такой командой:
minicom -D /dev/ttyUSB1 -b 1000000 -8 -R utf8 -w
Это снимает проблему кодировки, и разрешает заворот длинных строк.
Надеюсь, у тебя скоро все заработает. А то и прошивку некому потестировать...
Кстати, еще один момент. Старайся не экономить на фильтровых конденсаторах. Поставь пару керамических конденсаторов не менее 0.1 мкф с обоих сторон процессора у ножек питания, и один на вводе питания в плату. Я тут осциллографом посмотрел - там помехи приличные по питанию идут.
Ура, с твоими советами стало подавать намного больше признаков жизни!
У тебя ОПТС2? Там же тест ПЗУ - просто подсчет контрольной суммы. У меня он говорит "неверная КС". Хотя, может быть, твоя версия ОПТС отличается от моей. Вообщем, это нормально. Без АВР с просаженным сигналом Control он читает из порта А все FF, считает их сумму и, естественно, она оказываетсяч неправильной.
ОПТС 1.1
Это поянтно.
Я ж написал что в васике из порта читается бред
О, это моя любимая ошибка.
А не обрабатывается прерывание потому, что контроллер налетел на ошибку, о чем тебе и сообщает. При этом все внешние прерывания он отключает. Если в процедуре led_error ты уберешь перую строчку
GICR&=~(_BV(INT0)|_BV(INT1)); // Запрещаем оба внешних прерывания
помогло !
ура, на экрране !!!
48750
Это ошибка инициализации файловой системы. Пожалуй, пора составить табличку с кодами ошибок, чтобы по исходнику не шарить в поисках.
та эт совсем не сложно :)
я сразу полез и посмотрел
Сделал бы лучше Fat16, с 32 имели место быть глюки. mkfs.vfat -F 16.
И еще - не делай на карте разделов. То есть файловая система должна начинаться с блока 0, разбивать карту с помощью fdisk не надо. То есть примерно так:
mkfs.vfat -F 16 /dev/sdb
Ну и на карте должен как минимум уже лежать загрузчик 2 фазы LOADER.BIN. Но это уже другая ошибка - 2. А у тебя явно контроллер не признал карту. Надо смотреть терминал. Может быть, у тебя карта вообще SDHC - тогда, конечно, работать ничего не будет.
он судя по логу не доходит до фс
но переделал как написал.
*** Extrom - SD ***
Таймаут данных - 0 16
CARD MID=72 OID=b620
Product - ��4[(
rev 169 serail -27589
Таймаут данных - 0 512
fs_init error 0
*** Extrom - SD ***
Таймаут данных - 0 16
CARD MID=72 OID=b220
Product - ��4[(
rev 169 serail -28613
Таймаут данных - 0 512
fs_init error 0
*** Extrom - SD ***
Таймаут данных - 0 16
CARD MID=72 OID=b620
Product - ��5[(
rev 169 serail -28613
Таймаут данных - 0 512
fs_init error 0
*** Extrom - SD ***
Таймаут данных - 0 16
CARD MID=72 OID=9220
Product - ��4[(
rev 169 serail -28615
Таймаут данных - 0 512
fs_init error 0
*** Extrom - SD ***
Таймаут данных - 0 16
CARD MID=72 OID=b620
Product - ��4[(
rev 169 serail -27589
Таймаут данных - 0 512
fs_init error 0
карточкек пробовал парочку
одну таки sdhc
но откопал 256мб кингстон,
эффект тот-же
Скорость изменить, конечно, можно. Только это может повлиять на производительность - система начнет иногда ждать окончания вывода сообщения.
установил 115200 - помогло !
у меня встроенный порт ноута, может по этому
гланое задышало, а то вчера кроме как мигатния светодиода я от нее ничего не добился.
Надеюсь, у тебя скоро все заработает. А то и прошивку некому потестировать...
я тоже.
Кстати, еще один момент. Старайся не экономить на фильтровых конденсаторах. Поставь пару керамических конденсаторов не менее 0.1 мкф с обоих сторон процессора у ножек питания, и один на вводе питания в плату. Я тут осциллографом посмотрел - там помехи приличные по питанию идут.
напиши что точно и куда ставить, плата уже у меня, припаять то я смогу, но надо точно ЧТО и КУДА ;)
еще мы плату запитали от 12В
т.к. на разъеме было не 5 а 4.6в
на SD получалось около 3х
а на плате есть вход с кренкой, вот туда и подали 12
на SD стало 3.5 это вроде допустимо
выглядит сейчас так (https://dl.dropboxusercontent.com/u/490774/Korvet/P1830018.JPG)
судя по картинке плата - клон вот-этой (https://www.olimex.com/Products/AVR/Proto/AVR-P40-8515-8MHz/resources/AVR-P40-8515.pdf)
вечером еще перепроверю контакты в разъеме.
огромное спасибо!
*** Extrom - SD ***
Таймаут данных - 0 16
CARD MID=72 OID=b620
Product - ��4[(
rev 169 serail -27589
Таймаут данных - 0 512
fs_init error 0
У тебя однозначные проблемы с чтением карт. Даже блок идентификации по SPI не читается, а вместо него читается мусор. Должно быть примерно так:
*** Extrom - SD ***
Reset flag:1
CARD MID=2 OID=4d54
Product - SD02G
rev 56 serail 13224
-- Каталог диска --
0: MOUNT CFG
1: LOADER BIN
2: SYSTEM BIN
3: ROM6 BIN
4: ROM1 BIN
5: ROM3 BIN
6: ROM5 BIN
7: DISK
8: ROM0 BIN
Total 9 files
На всякий случай, попробовал карту на 512М из древнего фотоаппарата. С ней тоже все пошло:
*** Extrom - SD ***
Reset flag:1
CARD MID=13 OID=474b
Product - SD512
rev 16 serail 497
-- Каталог диска --
0: DCIM
1: MISC
Total 2 files
Так что проблемы ищи у себя в схеме. Я могу только предположить:
1. SD - карта сидит на том же порте SPI, что и программатор. Пробовал запускать с отсоединенным программатором? Некоторые программаторы не отключают свой буфер, и мешают работать схеме.
2. Перепутал местами провода, идущие от процессора к карте. Там 4 сигнала, запросто можно ошибиться. Или перепутал цоколевку карты. Там хитрый порядок пинов - 9-1-2-3-4-5-6-7-8. Плюс на самой колодке SD есть лишние пины для контроля вставки карты и защелки защиты записи.
3. Ошибся с номиналом резисторов делителей, впаял стабилитрон на ножке DO карты не на но напряжение или случайно впаял его задом наперед (надо анодом к земле, катодом к сигналу).
Если схема собрана правильно, и номиналы все так же правильные, то оно должно заработать сразу и без вариантов. Чудес не бывает, особенно в цифровой технике.
Проще всего проверить работу, ткнув осциллографом в ножку DO карты. Там должны быть видны ответные пакеты, идущие от карты.
Кстати.Он у тебя там что - постоянно самопроизвольно уходит в перезагрузку, судя по твоему логу? Или это ты кнопку Reset давишь?
карточкек пробовал парочку
одну таки sdhc
С ней ничего не выйдет, даже идентификатор не прочитается. Так какая-то другая система команд, но подробнее я не разбирался.
напиши что точно и куда ставить, плата уже у меня, припаять то я смогу, но надо точно ЧТО и КУДА ;)
Нужна парочка конденсаторов не менее 0.1 мкф, лучше 0.33, обязательно керамические. Припаять их с двух сторон процессора между ножками питания - 10-11 и 30-31. Кстати, не забыл подать питание на ножку 30? Без этого работать не будет.
еще мы плату запитали от 12В
т.к. на разъеме было не 5 а 4.6в
Напрасно вы так сделали. 4.6в - вполне нормальное напряжение для меги. Ему так даже немного легче работать. У меня тоже 4.6в питание с корвета идет, и все работает. По 12в в корвете сильная помеха идет от ВМ80. Хотя у тебя на плате приличный фильтр питания есть, так что это все несущественно.
на SD получалось около 3х
а на плате есть вход с кренкой, вот туда и подали 12
на SD стало 3.5 это вроде допустимо
Вообще-то, хорошо бы понизить все же до 3.3В. В карте имеется встроенный монитор питания, и в случае выхода его за пределы карта отключает работу с Flash-массивом. Правда, идентификация в любом случае должна проходить.
Вообщем, разбирайся с картой. Хорошо бы тебе найти карту на 1-2 гига, они все не HC. Но и н 256М - вроде тоже не особо древняя.
Из всех имеющихся у меня не-HC карт отказалась работать только древнючая Toshiba на 16 Mb. Остальные контроллером корректно опознаются.
Вот теперь думаю - может, пора переделывать драйвер на HC ? Но, с другой стороны, нафиг там HC, если весь имеющийся на свете корветовский софт занимает менее 1 гигобайта?
выглядит сейчас так
Что интересно, мой вариант выглядит почти так же - https://www.dropbox.com/s/7g8xs61qgc5ebr5/P1070752.JPG
Вообще-то, хорошо бы понизить все же до 3.3В. В карте имеется встроенный монитор питания, и в случае выхода его за пределы карта отключает работу с Flash-массивом. Правда, идентификация в любом случае должна проходить.
выбор был между 3.0 при 4.6
и 3.5 при 12
решили выбрать 3.5
---------- Post added at 12:22 ---------- Previous post was at 12:12 ----------
2. Перепутал местами провода, идущие от процессора к карте. Там 4 сигнала, запросто можно ошибиться. Или перепутал цоколевку карты. Там хитрый порядок пинов - 9-1-2-3-4-5-6-7-8. Плюс на самой колодке SD есть лишние пины для контроля вставки карты и защелки защиты записи.
вечером буду прозванивать.
Проще всего проверить работу, ткнув осциллографом в ножку DO карты. Там должны быть видны ответные пакеты, идущие от карты.
осцила нету, есть логичесскийй анализатор (прикупил на поиграться вот такое USB Saleae 24MHz 8Channel Logic Analyzer (http://www.banggood.com/USB-Saleae-24M-8CH-24MHz-8Channel-Logic-Analyzer-Latest-Support-1_1_15-p-74101.html))
попробую подключить - посмотреть.
он вроде spi умеет декодить.
Кстати.Он у тебя там что - постоянно самопроизвольно уходит в перезагрузку, судя по твоему логу? Или это ты кнопку Reset давишь?
ручные перезагрузки.
---------- Post added at 12:24 ---------- Previous post was at 12:22 ----------
Вот теперь думаю - может, пора переделывать драйвер на HC ? Но, с другой стороны, нафиг там HC, если весь имеющийся на свете корветовский софт занимает менее 1 гигобайта?
конечно делать, где сейчас найдёш SD карту ?
просто из этих соображений
а винксфс есть поддержка HC (в его драйвере SD)
и я кидал ссылку на форум easyelectronics там был инит с детектом типа карты.
выбор был между 3.0 при 4.6
и 3.5 при 12
решили выбрать 3.5
А чем вы там напряжение-то формируете? Если LM317, так там можно плавно отрегулировать напряжение, изменяя задающее сопротивление.
Но, в любом случае, дел явно не в напряжении. За неимением осциллографа, попробуй хотя бы логическим анализатором посмотреть. Только анализатор не покажет реальной амплитуды сигнала...
кстати, по поводу моих хождения по граблям
1. не надо отключать при ошибке обработчик BOOT
2. STAGE0 тоже должено общаться через апи
чтобы он мог узнать что карта не проинитилась и написать про это
3. добавить в апи getstatus (со строкой ответа)
тогда stage0 сможет вменяемо сказать Can't init SD CARD
3. добавить в апи работу с ROM образами
4. запихнуть в PROM например KTDP (ужатый) , чтобы при отсутсвии карты можно было хоть его загрузить.
он до 9500 ужимается.
(или мелкую игрушку, например SAUCER (file:///home/esl/Dropbox/Emulator/Korvet/web/archive/UCOZ/pk8020.narod.ru/game/saucer.html)) ужатый 2.3к
для теста и чтоб жило хоть как-то
---------- Post added at 12:52 ---------- Previous post was at 12:50 ----------
А чем вы там напряжение-то формируете? Если LM317, так там можно плавно отрегулировать напряжение, изменяя задающее сопротивление.
Но, в любом случае, дел явно не в напряжении. За неимением осциллографа, попробуй хотя бы логическим анализатором посмотреть. Только анализатор не покажет реальной амплитуды сигнала...
как ты на схеме нарисовал ;)
как заведётся - поеду переделаем на 5 в. чтобы было одинаково.
кстати, по поводу моих хождения по граблям
1. не надо отключать при ошибке обработчик BOOT
А зачем он нужен-то при ошибке? Его неотключение приводит к тому, что при самопроизвольно дергании сигнала Control контроллер начинает перезапускаться, что может привести к потере информации на SD-карте. Я на это дело уже нарывался.
2. STAGE0 тоже должено общаться через апи
чтобы он мог узнать что карта не проинитилась и написать про это
3. добавить в апи getstatus (со строкой ответа)
тогда stage0 сможет вменяемо сказать Can't init SD CARD
Это ты, конечно, здорово придумал, только вот не учел, что вся эта крутизна не влезет в 256 байт, отпущенных на этот загрузчик. Ну и потом - чем тройное мигание светодиода хуже надписи на экране? Информации и оттуда и оттуда ты получашь совершенно одинаково, только светодиод надежнее - будет мигать даже при полностью неработающем интерфейсе. А для проверки интерфейса надо придумать отдельный тест и свои коды ошибок.
3. добавить в апи работу с ROM образами
4. запихнуть в PROM например KTDP (ужатый) , чтобы при отсутсвии карты можно было хоть его загрузить.
Да, понимаю, что тебе хочется уже сейчас получить от контроллера хоть что-то, отсюда такие идеи. Но сам подумай - это все нужно только на этапе наладки контроллера. Потом, когда он нормально заработает, такая функциональность совершенно не нужна. Да и на данном этапе загрузка КТДП тебе не даст ничего, кроме морального удовлетворения от работы контроллера :)
В принципе, для целей отладки можно написать специальную версию прошивки со средствами диагностики карты и интерфейса. Только подумать, что туда напихать. Эта прошивка будет заливаться на этапе наладки, а потом заменяться стандартной.
А специально для тебя я могу попробовать сделать версию прошивки, в которой вместо средств работы с картой будет жестко прописана загрузка КТДП, зливаемого во флеш меги. Только надо придумать, как его туда поместить в двоичном виде. Если бы все писалось на ассемблере - вопросов бы не было. А вот С сам упраляет распределение данных во флеше, присоединять дополнительный блок двоичных данных к программе на С я никогда не пробовал.
А специально для тебя я могу попробовать сделать версию прошивки, в которой вместо средств работы с картой будет жестко прописана загрузка КТДП,
не не не
это были мысли так сказать вслух, на будующее.
как этим пользоваться "обычным пользователям".
пока типа записей в хотелки.
А, понял. Ну тогда давай подождем, пока ты доделаешь контроллер, поработаешь с ним, а потом тогда помотришь список хотелок и подумаешь, что из этого реально нужно.
Я вот уже с твоей подачи стал думать, как прикрутить диагностику интерейса. Битые ВВ55 встречаются не так уж и редко.
Фух, отловил баг !!!!
Два разных биоса работают !
3 дня и такие спецэффекты !
21_89___wiza.kdi.bin
12_87_11_niijaf.kdi.bin
Первый вроде работал но падал при загрузки >8к
Решил второй биос прикрутить, думал может где-то ошибся
Прикрутил а эффект ровно тот-же
А бага красивая ....
Я в резидент скопировал все копипастом, EXR_GETBYTE,....
Изменил метки, но в одном месте в чтении забыл исправить метку ...
Она ссылалась на код stage2
И когда его затерало то чудеса и начинались
Вот откуда мои 8к были, 0x2000 ;)
Пришлось даже в эмулятор прикрутить дамп всей памяти по чтению сектора.
Только так и отловил.
Больше ничего не делал, но очень радует что оно заработало !
Раз два работают, большенство остальных должны пойти легко.
---------- Post added at 00:37 ---------- Previous post was at 00:29 ----------
сразу отпишусь, что это на старой версии эмулятора, твои патчи пока не применял, решил не отвлекаться.
может что-то из этого уже и пофиксится
ты вроде что-то там с PPI2C.7 делал.
решил попробовать разный софт
и сразу
ABRIS виснет проверяет странную мышку ??
RAM:39FA MOUSE_Ext?: ; CODE XREF: RAM:1A53p
RAM:39FA 21 1D 3A ld hl, kbdVint?
RAM:39FD E5 push hl
RAM:39FE 21 08 00 ld hl, 8
RAM:3A01 E5 push hl
RAM:3A02 CD 7D 29 call setIntHandler
RAM:3A05 D1 pop de
RAM:3A06 D1 pop de
RAM:3A07 3E 82 ld a, PORT_C30_OUT|PORT_B_IN|MODE_B_0|PORT_C74_OUT|PORT_ A_OUT|MODE_A_0|_SET_MODE
RAM:3A09 32 0B FB ld (_1C_PPI3RUS), a
RAM:3A0C ;
RAM:3A0C 21 0A FB ld hl, _1C_PPI3C
RAM:3A0F 36 10 ld (hl), 10h
RAM:3A11 36 00 ld (hl), 0
RAM:3A13 3A 09 FB ld a, (_1C_PPI3B)
RAM:3A16 FE 38 cp 38h ; '8'
RAM:3A18 C0 ret nz
RAM:3A19 32 21 3C ld (MouseExtFlag?), a
RAM:3A1C C9 ret
AKVA - остатки защиты ??
читает из fdd, а в DRVREG неверное значение
судя по коду там кто-то забил нопы рядом,
надо уже допатчить штоль
в памяти
7004: D0 -> C9
c9 0a 0f d0 0f d2 02 70
c9 0a 0f c9 0f d2 02 70
poker - виснет на чтении
868d: mvi a,0
868f: sta ppi2C_
DANDARE - виснет на чтении
RAM:8D6C 3E 08 ld a, 8
RAM:8D6E 32 32 FB ld (_1C_PPI2C_), a
RAM:8DE2 AF xor a
RAM:8DE3 32 32 FB ld (_1C_PPI2C_), a
---------- Post added at 00:41 ---------- Previous post was at 00:37 ----------
Битые ВВ55 встречаются не так уж и редко.
та очередную голову отбить бы за DB37M
школьники баловались - ключами вжик по разъему
а там всё что нужно и +5 и +12 ....
ведь в оригинале стоял (тот что рп50 - мама)
оптимизаторы.
да и еще он похоже в корпус хуже ствновился
у меня вот чуть под углом.
Я, наконец, закончил доработку проекта по результатам предыдущих обсуждений. Итак, что добавлено.
Самое главное - полностью сделал управление реакцией контроллера на сигнал Control, что так сильно портило жизнь последнее время. Для этого я в API добавил еще одну команду - A1. Для тех, кто не очень понимает, что такое Control и зачем это нужно, привожу цитату из доки по API:
A1 — управление сигналом Control
Сигнал Control, выходящий из бита 7 канала С порта PPI2, используется контроллером Extrom для синхронизации начальной загрузки, а после окончания загрузки используется для определения момента перезагрузки корвета. Дело в том, что несознательные разработчики корвета проявили потрясающее разгильдяйство, не выведя на боковой разъем такой важный сигнал, как Reset. В результате приходится определять перезагрузку корвета по уходу этого сигнала в 0 (что происходит при аппаратном сбросе ВВ55). Но проблема уперлась в то, что некоторые умники, пишущие программы для корвета, считают своим долгом дергать этот сигнал как угодно, даже без определенной цели. В результате контроллер уходит в перезагрузку, а программа, работающая на корвете, теряет доступ к диску. Чтобы избежать этой ситуации, и используется данная команда. В поле TRK указывается 0 — запретить перезагрузку от Control, или 1 — разрешить ее. В режиме запрещения перезагрузки, если нажать кнопку Reset корвета, получим на экране сообщение Ошибка шины. В этом случае надо или отключить и снова включить питание, или нажать кнопку сброса на самом контроллере.
Еще одна проблема того же типа - перенастройка режима ВВ55 некоторыми программами - решается на уровне биоса, записывающего правильное кправляющее слово в ВВ55 при каждом обращении к диску. Правда, при этом может, например, перестать работать цифровой джойстик на канале В. Ну, эту проблему мы как-нибудь решим, когда возникнет.
Далее, я доработал утилиту mount, как тут обсуждалось.
1. Ввел проверку наличия интерфейса Extrom. Теперь, если запустить программу с обычной дискеты, без подключенного интерфейса, то она не виснет, а выводит соответствующее сообщение.
2. Ввел ключ /H - подсказку по командной строке. Для тех, кто не любит читать доки, а таких у нас большинство.
3. Добавил управление линией Control, используя вышеописанное расширение API. Вообще-то, по логике, эта функция собственно к mount (управлению монтированием образов) не особенно относится. Но уж больно не хотелось писать еще одну, отдельную утилиту. Так что пока засунул сюда, а там посмотрим.
MOUNT /K OFF - отключает перезагрузку от Control
MOUNT /K ON - включает ее обратно.
Режим OFF следует включать перед запуском тех программ, которые лезут в интерфейс и самопроизвольно трогают сигнал Control. Если программа в процессе работы вдруг теряет доступ к диску, а лампочка control в контроллере вдруг зажигается - значит, этот режим как раз вам и нужен.
В прошивке контроллера, кроме ввода нового вызова API, я исправил некоторые мелкие ошибки, ввел более тщательную диагностику наличия карты - теперь, в случае отстутствия карты, в терминал выдается сообщение "SD карта не найдена", и вымаргивается ошибка 5. Разрешил даже в ошибочном состоянии прерывание от сигнала Control - это позволяет запустить загрузчик фазы 1 и, таким образом, проверить работу интерфейса ВВ55.
Ну и, самое главное, включил, наконец, режим удвоения частоты SPI - теперь карта работает на максимально возможной скорости. Правда, производительности это добавило только процентов 20 - сказываются тормоза драйвера VinxFS.
Во вложении лежит новая прошивка контроллера, KDI с обновленным mount, и дока по API.
На сегодняшний день состояние проекта такое.
- Схема контроллера полностью готова и проверена мной при двухкратной сборке - на вставной макетке и окончательной плате. Еще ESL скоро доделает свою плату - будет уже три успешных сборки.
- API уже устаканили и по протоколу, и по составу команд. Реализован полностью и в прошивке контроллера, и в эмуляторе. И документация по API уже написана.
- Прошивка контроллера готова и более-менее отлажена. По крайней мере, последние дни я погонял несколько стресс-тестов и ошибок не выловил.
- Клиентская утилита управления образами дисков MOUNT готова и более-менее проверена. К сожалению пока я один только могу ее проверить, но скоро и ESL подтянеся.
- Эмулятор тоже почти готов. В нем еще нет поддержки последнего вызова A1, но ESL его, надеюсь, прикрутит. Я этим заниматься не стал, отлаживал на реальном железе, тем более что оно заработало практически с первого раза.
Ну, вроде бы, и все. Теперь мне надо сесть и написать полную документацию по проекту - наверное, займусь в выходные. А ESL обещал доделать универсальный загрузчик систем, тоже являющийся важной частью проекта. Также ему надо доделать свою плату контроллера, и потестировать мою прошивку у себя. После этого можно объявлять релиз. Интересно, хоть кто-нибудь, кроме меня и ESL, соберет себе такое устройство? :)
Из дальнейших планов я хочу подправить BIOS для поддержки больших дисков. По первым прикидкам - можно примерно 5Мб диск сделать, на большее не хватит ОЗУ. А то сидеть в 21 веке на мелких 800м образах как-то уже ломает.
Еще тут Marinovsoft высказывал хотелку графической морды над утилитой mount. Может, кто-нибудь возьмется? Я, как старый системщик, не особо умею делать гуи, всю жизнь предпочитал комстроку, за редким исключением. Мне проще прошивки писать, чем интерфейс пользователя.
Вообщем, мы потихонечку подбираемся к концу. Даже грустно немного. Хорошая была тренировка для мозгов.
Попробовал из опробованных ESL первую попавшуюся на глаза программу - DANDARE, игрушка какая-то. Отключил Control, запусил - повисла. Причем контроллер в перезагрузку не уходит, ждет команд, а команд нет.
Пришлось ввести в эмулятор обработку команды A1. Как ни странно, в эмуляторе DANDARE после этого отлично заработал. Получается, что эта программа кроме Control что-то еще портит в интерфейсе ППИ3. Поеду на дачу, по дороге попробую разобраться.
Прикладываю подправленные файлы эмулятора, может кому пригодятся. PPI.C я брал последний из репозитория.
УРА заработала !
забыли припаять три проводка на SD ;)
но заработала почти :(
почти все время говоит
CS ERR: r:ff c:0
я добавтл вывод комманды в консоль
вот лог
*** Extrom - SD ***
Reset flag:1
CARD MID=2 OID=4d54
Product - SD256
rev 13 serail -25735
-- Каталог диска --
0: LOADER BIN
1: ROM1 BIN
2: ROM2 BIN
3: ROM3 BIN
4: ROM4 BIN
5: ROM5 BIN
6: MOUNT CFG
7: SYSTEM BIN
8: ROM6 BIN
9: DISK
Total 10 files
Загрузка фазы 2
Loader file: LOADER.BIN
Loader base: 20
Loader si
Loader base: 20
Loader size: 3
Block # 1er base: 20
Loader size: 3
Block # 2
Загрузка фазы 2 окончена
Mount A: DISK/DISKA.KDI SPT=40
Mount B: DISK/DISKB.KDI SPT=40
CMD:0 DRV:0 TRK:0 SEC:0 csum:0
CS ERR: r:ff c:0
для ром5 тоже ошибки
но один раз - запустилось, некоторое время поработало а потом опять
CMD:f1 DRV:0 TRK:0 SEC:0 csum:f0
CMD:f0 DRV:0 TRK:0 SEC:0 csum:ef
CMD:f0 DRV:0 TRK:0 SEC:0 csum:ef
CMD:f0 DRV:0 TRK:0 SEC:0 csum:ef
CMD:f0 DRV:0 TRK:0 SEC:0 csum:ef
CMD:f0 DRV:0 TRK:0 SEC:0 csum:ef
CMD:f0 DRV:0 TRK:0 SEC:0 csum:ef
CMD:f1 DRV:0 TRK:0 SEC:0 csum:f0
CMD:f1 DRV:0 TRK:0 SEC:0 csum:f0
CMD:f1 DRV:0 TRK:0 SEC:0 csum:f0
CMD:f1 DRV:0 TRK:0 SEC:0 csum:f0
CMD:f1 DRV:0 TRK:0 SEC:0 csum:f0
CMD:f1 DRV:0 TRK:0 SEC:0 csum:70
CS ERR: r:f0 c:70
есть идеи какие ?
p.s. кондеры еще не вешал по питанию.
еще заметил что тот-же КТДП из ROMx не всегда стартует, в основном зависает после вывода первой буквы П
в слове Перемещение КТДП.
первые результаты по патчеру
работает со всеми стандартными CP/M биосами что есть
не работает с
KORNET
SFERA
т.к. их вообще не копал, а там сильные переделки
отложил на потом.
и нет обработки МИКРОДОС
на первое время сделаю чтобы оно писало что задетектило это
но оно работать не будет,
и включать подстановку биоса.
подстановку так-же можно быдет насильно включить если например удерживать SHIFT.
сейчас говорит что не смог определить тип и HALT.
и там похоже баг, только-что нашел, на работают физ. диски ;)
кое что забыл сделать.
это всё на основе старого stage2
хотя там в основном лоадере добавлен только
LD A,'@' ; Признак окончания загрузки - на экран
CALL PUTCH
call cpm_biod_patcher
и в конце
include "extrom-patcher.asm"
типы биосов там-же в архиве
сейчас оно если биос не детектит делает HALT
лоадер патчит очистку экрана, и патченый - не очищает экран.
теперь займусь новым апи
включу в эмулятор,
и уже патчер буду на этой ветке делать
а то новые функции нужны.
кстати, отрубание реакции на CS7 можно тоже по кнопке в stage2 включать
---------- Post added at 01:28 ---------- Previous post was at 01:09 ----------
радость, посмотрел свой порт Athletic Land на реальном корвете ;)
работает.
спасибо тебе forth32 !
УРА заработала !
забыли припаять три проводка на SD ;)
А вот я и говорил - при привильной сборке начинает работать сразу!
почти все время говоит
CS ERR: r:ff c:0
Похоже, данные искажаются при передаче через канал ВВ55 в режиме 2. В режиме 0 данные передаются нормально, что подтверждается корректной заливкой загрузчиков 1 и 2 фазы. Тут или битая ВВ55, или, скорее всего, ты просто напутал при подключении стробирующих сигналов (PC4-PC7) к разъему. Проверь их тщательно. Лучше всего вызвони прямо от ножек процессора PD3-PD6 к ножкам ВВ55 PC7-PC4. Скорее всего, ты или опять забыл запаять один проводок, или запаял его на другой пин разъема.
есть идеи какие ?
p.s. кондеры еще не вешал по питанию.
Вообще-то лучше повесь, это тоже может влиять на передачу данных в высокоскоростном режиме.
еще заметил что тот-же КТДП из ROMx не всегда стартует, в основном зависает после вывода первой буквы П
в слове Перемещение КТДП.
Это ты не отпускаешь кнопку на клавиатуре. Насколько я помню, у меня тоже так было.
---------- Post added at 07:22 ---------- Previous post was at 07:15 ----------
кстати, отрубание реакции на CS7 можно тоже по кнопке в stage2 включать
Можно конечно, только смысл? Это отрубание нужно крайне редко и только для запуска отдельных кривых программ. При нормальной работе оно крайне вредно, так как не даст нормально перезагрузить корвет.
Похоже, данные искажаются при передаче через канал ВВ55 в режиме 2. В режиме 0 данные передаются нормально, что подтверждается корректной заливкой загрузчиков 1 и 2 фазы. Тут или битая ВВ55, или, скорее всего, ты просто напутал при подключении стробирующих сигналов (PC4-PC7) к разъему. Проверь их тщательно. Лучше всего вызвони прямо от ножек процессора PD3-PD6 к ножкам ВВ55 PC7-PC4. Скорее всего, ты или опять забыл запаять один проводок, или запаял его на другой пин разъема.
не, оно же иногда работает
я же выше приводил пример что тест заработал, а потом упал по ошибке CRC.
А КТДП - тоже
сначала запускался, потом отказывался
перенес в другое место (к телевизору) - опять начал запускаться.
---------- Post added at 09:20 ---------- Previous post was at 09:18 ----------
Можно конечно, только смысл? Это отрубание нужно крайне редко и только для запуска отдельных кривых программ. При нормальной работе оно крайне вредно, так как не даст нормально перезагрузить корвет.
зато не надо использовать внешнюю программу
и оно всегда будет "с собой"
вопрос простоты использования
---------- Post added at 10:13 ---------- Previous post was at 09:20 ----------
вставил кучу нопов в iop_get_byte
заработало
пробовать сколько надо уже буду не сейчас
тогда надо и в iop_getbuf вставлсять
в общем - будем дальше пилить.
не, оно же иногда работает
я же выше приводил пример что тест заработал, а потом упал по ошибке CRC.
Значит, помеху сильную ловишь. Особенно, если там у тебя по шлейфу 12в идет, и если шлейф достаточно длинный. По опыту могу сказать, что длина линии небуферированных TTL сигналов не должна превышать 15-20см. Иначе надо или ставить буфера с низким выходным сопротивлением, или делать бутерброд, как в FDD шлейфе - чередовать сигнальные и земляные линии.
Наверное, я зря упустил все эти тонкости при описании контроллера, привык что все это и так знают. Надо, пожалуй, будет все это добавить в сопроводительную документацию.
Вставка задержки при формировании сигнала подтверждения приема - мысль хорошая. Таким образом дается время на стабилизацию сигналов. Правда, при этом теряется производительность. Наверное, разные ВВ55 имеют сильный разброс параметров - твой более тормозной, чем мой.
Жду рассказ об истории успеха, когда у тебя загрузится CP/M до промпта A>.
зато не надо использовать внешнюю программу
и оно всегда будет "с собой"
вопрос простоты использования
Имеешь в виду случай, когда на диске нет программы mount? Может быть, ты и прав. Раз уж ты там пишешь загрузчик фазы 2 - заодно и вставь туда, например, проверку на нажатие левого шифта. Хотя, мне кажется, что это довольно редкий случай, когда потребуется Control отключать.
Жду рассказ об истории успеха, когда у тебя загрузится CP/M до промпта A>.
Так сразу и загрузилась ;)
И MOUNT выдает список образов
Как бы я позапускал игрушки ;)
---------- Post added at 14:02 ---------- Previous post was at 14:00 ----------
Наверное, я зря упустил все эти тонкости при описании контроллера, привык что все это и так знают. Надо, пожалуй, будет все это добавить в сопроводительную документацию.
Я в этом с одной стороны "блондинко", и задаю глупые вопросы по электроники
Делаю все возможные ошибки.
С другой - понимаю как это работает, и могу там что-то подкрутить.
В обчем обычная работа QA ;)
---------- Post added at 14:03 ---------- Previous post was at 14:02 ----------
Имеешь в виду случай, когда на диске нет программы mount? Может быть, ты и прав. Раз уж ты там пишешь загрузчик фазы 2 - заодно и вставь туда, например, проверку на нажатие левого шифта. Хотя, мне кажется, что это довольно редкий случай, когда потребуется Control отключать.
Вставлю конечно.
Редкий, но если оно есть - удобно.
---------- Post added at 14:04 ---------- Previous post was at 14:03 ----------
Вставка задержки при формировании сигнала подтверждения приема - мысль хорошая. Таким образом дается время на стабилизацию сигналов. Правда, при этом теряется производительность. Наверное, разные ВВ55 имеют сильный разброс параметров - твой более тормозной, чем мой.
Я поиграюсь с длинной задержки, не быстро, но надо же этот анализатор к чему либо подключить ;)
Так сразу и загрузилась ;)
И MOUNT выдает список образов
Как бы я позапускал игрушки ;)[
А, так вон оно что. Значит, все работает? Ну вот и прекрасно. Значит, мы имеем уже двух людей на этой планете, успешно собравших контроллер. И ты еще раз подтвердил то, что я говорил в самом начале - если в схеме нет ошибок, то она начинает работать сразу без всякой настройки. Другое дело, что проводов там много и ошибку допустить раз плюнуть. Но это все зависит от внимательности при сборке и проверке.
Я поиграюсь с длинной задержки, не быстро, но надо же этот анализатор к чему либо подключить ;)
Анализатор тут тебе мало поможет - сигнал обрабатывается внутри ВВ55, туда ты анализатор не запихаешь. Но я сразу могу сказать, что 4 nop будет достаточно, ибо это укладывается в заданную фирмой интел минимальную ширину импульса. Я потом поигрался с оптимизацией, и убедился, что моему ВВ55 хватит и 2 nop. Видимо, надо поставить 4 и так и оставить, чтобы не отходить от стандарта.
Попробовал тут твой универсальный загрузчик. В принципе работает. Как обычно, несколько замечаний.
1. В самом начале загрузчика, еще до первого чтения секторов с диска, надо выдать команду А0 с trk=0, для отключения режима подстановки. Он по умолчанию включен.
2. В конце цепочки идентификации, если биос не опознан, не вешать систему намертво, а дать команду A0 с TRK=1 и потом безусловный переход обратно на начало загрузчика, чтобы загрузился дефлотный биос. Сигнатуру дефлотного биоса также внести в базу - он может встречаться на реальных образах дисков, и при его опознании просто его запустить без всяких патчей.
3. Реальные дисководы не работают. Ну тут ты, я думаю, уже разобрался с причиной. Но я о другом. Зря ты использовал маски 80 и 81 для идентификации эмулируемых дисков. Такая маска, будучи загружена в порт выбора дисковода, выбирает реальный физический дисковод - даже лампочка на нем загорается. Кроме того, такие маски формально являются допустимыми в системе - для 8" дисков А и В.
Именно поэтому я и использовал 00 - такой маски в природе не бывает, и даже если ее загрузить в порт - ничего выбрано не будет.
Теперь тебе еще надо для микродоса базу патчей сделать, ну и вроде как все. Также можно добавить хоткей для принудительной загрузки дефлотного биоса. Хотя это можно сделать, просто положив на карту нужный LOADER.BIN - с патчами или без.
Вообщем, доделывай загрузчик, и будем готовить к выпуску релиз нашей разработки.
Попробовал тут твой универсальный загрузчик. В принципе работает. Как обычно, несколько замечаний.
1. В самом начале загрузчика, еще до первого чтения секторов с диска, надо выдать команду А0 с trk=0, для отключения режима подстановки. Он по умолчанию включен.
Конечно, я же сразу написал что работы вел на старой редакции
чтоб время на это не тратить ;)
теперь как заработало - буду уже прикручивать плюшки.
---------- Post added at 19:49 ---------- Previous post was at 19:47 ----------
2. В конце цепочки идентификации, если биос не опознан, не вешать систему намертво, а дать команду A0 с TRK=1 и потом безусловный переход обратно на начало загрузчика, чтобы загрузился дефлотный биос. Сигнатуру дефлотного биоса также внести в базу - он может встречаться на реальных образах дисков, и при его опознании просто его запустить без всяких патчей.
Само собой ;)
Надпись для этого и вывожу, это заготовка.
Если не задетектил - выводим надпись и включаем эмуляцию.
чтобы человек увидел что загрузился не образ системы а подстановка.
---------- Post added at 19:52 ---------- Previous post was at 19:49 ----------
Зря ты использовал маски 80 и 81 для идентификации эмулируемых дисков. Такая маска, будучи загружена в порт выбора дисковода, выбирает реальный физический дисковод - даже лампочка на нем загорается. Кроме того, такие маски формально являются допустимыми в системе - для 8" дисков А и В.
Именно поэтому я и использовал 00 - такой маски в природе не бывает, и даже если ее загрузить в порт - ничего выбрано не будет.
8" - это точно нереально ;)
я хотел оставить номер т.к. надеюсь еще сделать ремапинг дисков находу
и хотелось для этого оставить метку
а разве она попадает в порт выбора ??
но идею понял, подумаю.
---------- Post added at 19:55 ---------- Previous post was at 19:52 ----------
Теперь тебе еще надо для микродоса базу патчей сделать, ну и вроде как все. Также можно добавить хоткей для принудительной загрузки дефлотного биоса. Хотя это можно сделать, просто положив на карту нужный LOADER.BIN - с патчами или без.
Микродос боюсь уже на следующей неделе.
---------- Post added at 20:00 ---------- Previous post was at 19:55 ----------
Также можно добавить хоткей для принудительной загрузки дефлотного биоса.
тут есть некая проблемма, т.к. я же детекчю конкретные байты по конкретным смещениям
а твой биос может меняться
по этому предлагаю в области текста или сразу за таблицой переховдов
добавить метку
которая не зависит от конкретной версии биоса, а просто сигнализирует о его наличии
типа :"EXTROMBIOSV1"
Само собой ;)
Надпись для этого и вывожу, это заготовка.
А, блин, вот оно что. Я тут весь мозг себе сломал - зачем ты первым же патчем в цепочке затираешь коды очистки экрана. Что ж, вполне логично. Заодно на экране останется адрес загрузки и количество системных дорожек, для отладки.
я хотел оставить номер т.к. надеюсь еще сделать ремапинг дисков находу
и хотелось для этого оставить метку
Только не забудь, что больше 2 эмулируемых дисков контроллер не потянет. Тогда особого смысла в таком переназначении не будет. Делать open перед каждым сектором, как ты в эмуляторе сделал, тут слишком накладно по времени.
а разве она попадает в порт выбора ??
Ну, видимо, как-то попадает, раз лампочка на дисководе зажглась. Но перепроверить сейчас не могу - корвет в городе остался. Может быть, меня и сглючило. В любом случае, использовать это поле для идентификации диска, имхо, не есть правильно. То есть можно с его помощью только определить, связан ли данный DPB с эмулируемым диском (=0) или физическим (!=0) и выбрать соответствующую ветку процедуры GETINFO. А для конкретного номера выбираемого диска в биосе есть специальные переменные.
Но это так, вообщем, в порядке занудства. Можно, в принципе, оставить и так, раз работает. Глюки выловим по мере эксплуатации.
а твой биос может меняться
по этому предлагаю в области текста или сразу за таблицой переховдов
добавить метку
которая не зависит от конкретной версии биоса, а просто сигнализирует о его наличии
типа :"EXTROMBIOSV1"
Принято. Вношу эту строку сразу за таблицей точек входа. Ты прав - дальше идут поля параметров диска и я их могу сдвинуть по необходимости. А таблица перехдов - она стандартна и неизменна. Прикладываю его в аттаче.
Еще, все же, надо бы вернуться к вопросу доступа к mount. Я тут, играясь с твоим патчером, уже много раз налетал на ситуацию, когда на обоих дисках нет MOUNT.COM и перемонтировать уже ничего нельзя. Предлагаю все же добавить в загрузчик хоткей, который примонтирует к А образ SYSTEM.KDI, лежащий на карте. Туда положить mount и набор системных утилит - pip,stat,submit,ddt и прочее. Это позволит сделать необходимые монтирования и потм перезагрузить систему уже с нужными дисками.
Но этим ты можешь не заморачиваться, если лень. Доделывай загрузку микродоса, а хоткеи я потом и сам могу прикрутить.
Поехал отдыхать
Напоследок набросал сканер который использует данные патчера
Отсканировал "базу" дисков - цифра кол-во KDI с этим типом биоса (как его определит PATCHER)
12_88_3_alternativa - 103
:MICRODOS_2_14336 - 54
21_89___wiza - 42
:MICRODOS_1_13312 - 39
21_89_2_niijaf2 - 36
21_89_2_niijaf - 28
1x_89_03_30_RAVI - 17
21_91___LAP - 7
-- undefied -- - 6
20_88___miks - 4
12_90_5_kontur - 4
12_87_11_niijaf - 3
21m_____Shkanov - 2
6144 - 2
12_87_09_NIIJAF - 2
1x_88_EPSON_V104 - 1
0 - 1
crc_failed - 1
То что не CP/M - это нужно не учитывать, т.к. они детектяться только по размеру.
-- undefied -- - это 3 SFERA, и 3 каких-то мутных, вроде битых
Числа - это размер загрузочной области
Я думал на первом месте бузет "ВИЗА" ;)
Теперь расставим в патчере в порядке вероятности.
как вернусь - проверю детально нет ли миссдетектов.
реально кол-во дисков чуть меньше, ибо в той папке у меня и "чистые диски" лежат, но сильно цифр это не меняет (скорее надо -1 кол-ву сделать) ;)
Еще, все же, надо бы вернуться к вопросу доступа к mount. Я тут, играясь с твоим патчером, уже много раз налетал на ситуацию, когда на обоих дисках нет MOUNT.COM и перемонтировать уже ничего нельзя. Предлагаю все же добавить в загрузчик хоткей, который примонтирует к А образ SYSTEM.KDI, лежащий на карте. Туда положить mount и набор системных утилит - pip,stat,submit,ddt и прочее. Это позволит сделать необходимые монтирования и потм перезагрузить систему уже с нужными дисками.
Именно про этот случай я с самого начала и говорил.
Только не монтировать образ, а по нажатию комбинации получить из API
файл, который загрузить с адреса 100 и передать управление
на первое время можно написанть минизаглкшук которая подмонтирует через апи нужный образ.
А потом - написать выбиралку
главное наличие такой возможности .
т.е. добавить вызов апи при вызове которого апи отдает содержимое файла.
или еще универсальнее
вызваем апи, ему передаём имя файла
а он отдает его
например в поле TRK задаем будет ли идти параметром имя файла
XXX,0,0,0,0 - загрузить допустим RESCUEMOUNT.BIN
XXX,0,0,0,1
"SUPERPUPER.BIN",0
загрузить SUPERPUPER.BIN
а в самом резиденте дергать уже эту функцию.
как такая идея ?
Идея имеет в себе некий изъян. А именно:
1. Как собираешься активировать данный вызов API. По хоткею, встраиваясь в клавиатурный драйвер? Но дело в том, что вызывать его можно только в тот момент, когда выполняется CCP и система ждет ввода команд. При работе прикладной программы ты ее просто затрешь в памяти. Или предлагаешь добавить новую команду в таблицу команд CCP? Но там места и так практически нет.
2. Как собираешься передавать программе параметры командной строки? По хоткею ты их точно не передашь.
Именно поэтому я и предлагал не загружать с карты саму программу mount, а подсунуть системе временный диск, на котором она есть и с которого ее можно запустить обычной командой. После совершения необходимых монтирований система перезагружается, и монтируются уже вновь назначенный диски.
Идея имеет в себе некий изъян. А именно:
1. Как собираешься активировать данный вызов API. По хоткею, встраиваясь в клавиатурный драйвер? Но дело в том, что вызывать его можно только в тот момент, когда выполняется CCP и система ждет ввода команд. При работе прикладной программы ты ее просто затрешь в памяти. Или предлагаешь добавить новую команду в таблицу команд CCP? Но там места и так практически нет.
тут 2 аргумента
1й, хоткей будет достаточно сложный, случайно не нажмеш
а если уж нажат - это на совести пользователя
2й - был вариант вывести на экран (прямо в ГЗУ) вопрос и спросить надо ли делать
и если пользователь ответит - опять на его совести.
это место много не займет, в резиденте пока есть немного памяти.
и еще посмотрю, может есть возможность задетектить CCP.
---------- Post added at 22:52 ---------- Previous post was at 22:50 ----------
2. Как собираешься передавать программе параметры командной строки? По хоткею ты их точно не передашь.
Это будет GUI, который и спросит
Я планирую сделать.
---------- Post added at 22:53 ---------- Previous post was at 22:52 ----------
Именно поэтому я и предлагал не загружать с карты саму программу mount, а подсунуть системе временный диск, на котором она есть и с которого ее можно запустить обычной командой. После совершения необходимых монтирований система перезагружается, и монтируются уже вновь назначенный диски.
всё в порядке,
на первое время я же написал
сделать стабик который и сделает имеено то о чем ты говориш
подмонтирует нужный образ через апи.
а потом как я напишу этот гуй, подменить бинарник и все.
---------- Post added at 23:04 ---------- Previous post was at 22:53 ----------
добавил в патчер детект всех версий МИКРОДОСА
и SFERA & KORNET
для них - выводит название, но говорит что не поддерживаются
Обновленная табличка по результатам детектора
Вспомнил что 12_88_3_alternativa это запатченная 12_88_3_niijaf
Патчи у них одинаковые абсолютно
Но решил оставить, пусть будет.
12_88_3_niijaf - 78
21_89___wiza - 42
MICRODOS_2_880630 - 41
21_89_2_niijaf2 - 36
21_89_2_niijaf - 28
MICRODOS_1_870430 - 28
12_88_3_alternativa - 25
1x_89_03_30_RAVI - 17
BAD_0000_14336 - 8
MICRODOS_1_861011 - 7
21_91___LAP - 7
20_88___miks - 4
12_90_5_kontur - 4
MICRODOS_2_900105 - 4
-- undefied -- - 3
12_87_11_niijaf - 3
21m_____Shkanov - 2
MICRODOS_1_871220 - 2
MICRODOS_1_861115 - 2
CPM_NET_SFERA1 - 2
12_87_09_NIIJAF - 2
CPM_NET_KORNET_drive_a - 2
1x_88_EPSON_V104 - 1
CPM_NET_KORNET_drive_b - 1
BAD_0000_0 - 1
crc_failed - 1
CPM_NET_SFERA2 - 1
а с микродосом вылезла проблема
у него тот ТОЛЬКО 2 ДИСКА
A и B
таблиц для C и D нет как класса
мало того, у части (ранних) микродос даже параметры диска забиты гвоздями а не с диска.
пока наверное сделаю полную подмену на виртуальные
а потом маппинг
и думаю опять-же делать не все версии а возможно одну, та что работает и на ОПТС1 и на ОПТС2
SaintTurnip
21.07.2014, 04:10
По поводу хоткея - может F1+F4? Запомнить легко, нажимать удобно, совпадение исключено.
По поводу хоткея - может F1+F4? Запомнить легко, нажимать удобно, совпадение исключено.
Не, не пойдет. Кнопки F1 и F4 могут иметь самостоятельный смысл в прикладной программе. Поскольку абсолютно одновременно нажать ты их не сможешь - программа может начать выполнять какие-либо незапрошенные операции.
Хоткей должен начинаться с кнопок, которые гарантированно сами ничего не делают. То есть с модификаторов типа ctrl, shift итд.
---------- Post added at 07:08 ---------- Previous post was at 06:55 ----------
Это будет GUI, который и спросит
Я планирую сделать.
А, вот что ты там запланировал. Графический mount. Ну, тогда отложим вопрос до того момента, когда ты этот гуй напишешь. Тут Marinovsoft как раз такую хотелку недавно высказывал. Пока что релиз можно делать и без нее, а все эти плюшки потом дописать - сдается мне, это дело не очень быстрое. Я бы и вообще не взялся :)
В принципе, нужные изменения в API я могу уже и сейчас добавить. Это будет выдача в интерфейс произвольного файла из корня карты, имя которого передается 14-байтовым блоком после команды. Все равно я сейчас API и прошивку доделываю по мелочи - прикрутил выбор каталога с дисками, еще кое-какую мелочь приделал, заодно могу сделать и это.
а с микродосом вылезла проблема
у него тот ТОЛЬКО 2 ДИСКА
A и B
таблиц для C и D нет как класса
То есть там только 2 DPB на весь биос? Ну или 3, включая рамдисковый. Весело. Хотя оно и логично - 4-дисковых корветов не было в живой природе, чего зря место в памяти переводить.
мало того, у части (ранних) микродос даже параметры диска забиты гвоздями а не с диска.
То есть там даже процедуры GETINFO нет? Весело. Хотя тебе еще проще :)
Ну так и правда - забей ты на реальные дисководы, кому они сейчас нужны? Если уж присрется что с дискеты забрать - загрузятся в обычный CP/M, благо он умеет микродосовые диски читать.
SaintTurnip
21.07.2014, 11:58
forth32, согласен, не подумал. Хотя в интерактивном режиме CP/M клавиши ф1-ф5 ничего особого не делают. Моя идея в том, чтобы хоткей был на краю клавиатуры и под одну руку. Вот как сочетания Alt-Tab, Ctrl-Esc и т.п. на PC.
forth32, согласен, не подумал. Хотя в интерактивном режиме CP/M клавиши ф1-ф5 ничего особого не делают. Моя идея в том, чтобы хоткей был на краю клавиатуры и под одну руку. Вот как сочетания Alt-Tab, Ctrl-Esc и т.п. на PC.
делают, на них висят комманды и этим постоянно пользовалась ;)
очень активно
даже редактор написали Klava F
обычно было F1 - DIR
у меня F10 было BASIC KEY
запустить бейсик и запустить сразу прогу которая попатчит fkeys для бейсика.
я например им вместо submit пользовался
просто набил m80 =zzz.asm
и link
а потом просто нажимал нужную Fn
я когда биосы разбирал - специально отдельно маскировал fkeys, ибо их каждый под себе делал.
---------- Post added at 11:14 ---------- Previous post was at 11:12 ----------
То есть там даже процедуры GETINFO нет? Весело. Хотя тебе еще проще :)
у первых - нет
у последних - есть.
---------- Post added at 11:19 ---------- Previous post was at 11:14 ----------
последний патчер,
теперь должны работать реальные диски
исправил пару кучек багов (в таблицах патча были не туда указаны jmp, нашел конда добавлял дополнительную проверку для уверенности)
и странный баг с прерываниями (добаил DI в чтение/запись)
без них были иногда интересные эффекты.
тут же детект кучи биосов/микродосов.
теперь займусь микродосом
если будет возможность проверь на нескольких реальных биосах ?
у меня чистый 8010 ;)
кстати, тут подумалось, а может при отсутствии ВГ93 нафиг отрубать диски C и D ?
А где твой патчер-то брать? :)
Или ты наступил на мои же грабли - забыл файл прицепить к сообщению?
Все, теперь вижу файлы. Чуть попозже проверю, надо вначале прошивку до рабочего состояния доделать...
по поводу комбинации -
посмотрел на клавиатуру корвета
Ctrl+Shift+STOP
много комбинаций со STOP не помню
Ну, можно и так. Сам CCP на stop не реагирует, конфиликтов не будет.
Ты бы к своему патчеру сразу исходники прикладывал, а то так вслепую неинтересно ковыряться...
даже сразу почти во все биосы вставил
(кроме парочки старых, вечером гляну)
Ctrl+Shift+Stop в верхней строке экрана выводит надпись 'CTRL+SHIFT+STOP pressed'
Ну, можно и так. Сам CCP на stop не реагирует, конфиликтов не будет.
Ты бы к своему патчеру сразу исходники прикладывал, а то так вслепую неинтересно ковыряться...
сорри, как то неподумал
лови.
толко сообразил, что детект твоего биоса так и не добавил :(
Сам CCP на stop не реагирует, конфиликтов не будет.
реагирует, но делает INIT диску, насколько помню.
по дефолту CTRL+SHIFT+STOP он не выделяет отдельно.
так что можно спокойно перехватывать.
реагирует, но делает INIT диску, насколько помню.
Да, точно. Сам же этим постоянно пользуюсь при смене диска. Ну ничего, даже если кто промахнется по кнопкам, лишний init системе не повредит.
толко сообразил, что детект твоего биоса так и не добавил
А я на это дело сразу нарвался :) У меня во всех образах, с которыми я работаю, системы или вообще нет, или моя система прописана.
---------- Post added at 13:28 ---------- Previous post was at 13:23 ----------
А, понял. Ты же так и не добавил вызов A0. Оно поэтому и не видит реальных дорожек дисков - контроллер дефлотный биос всегда подсовывает.
Сам видишь - без исходников я бы здесь не обошелся.
Проверил я новый загрузчик. На 3 разных биосах - уж что нашел на карте. В принципе, все работает корректно. Диски C и D правильно отображаются на дисководы. Есть некоторые проблемы несовместимости с моими новыми расширениями прошивки, но об этом завтра. Сейчас доделаю доки по API, завтра буду выкладывать новые версии и тогда опишу конкретнее, что именно надо дорабатывать.
Применил твои патчи на эмулятор.
все CP/M по нажатию CTRL+SHIFT+STOP выводят на экран надпись.
Кроме твоей, ибо ее я не патчу ;)
Микродос ковыряю, но сегодня привёл в соответсвие апи с загрузчиком.
Прикрутил 0xA0 к загрузчику.
Тех инфу выводит если зажат SHIFT
Еще я немного твой биос для экспериментов попатчил, убрал очистку экрана.
Ее надо или совсем убрать или разместить сразу за меткой, чтоб я затереть мог.
И в тот биос что подтсавляется написал SUBSTITUTED, чтоб их хоть как-то отличать.
Вот как это выглядит.
только что дошло
подставлять cp/m вместо микродоса - не прокатит
т.к. на микродос диске 3 системных дорожки
а подстановка подставит только 2
и инфа про диск прочитается как про две в результате будет чуш.
Я вроде как закончил следующий этап доработки контроллера. Даю отчет о сделанных за неделю двух важных изменениях.
Первая доработка касается способов хранения образов на карте. После недельного общения с контроллером я пришел к выводу, что хранение всех используемых образов в одном месте - каталоге DISK/, быстро делает из него помойку. Получается список из более чем полусотни файлов, не влезающий в экран по MOUNT /L. Поэтому я решил ввести возможность программно изменять имя каталога (папки, директория - кому как больше нравится их называть), в котором будут искаться вновь монтируемые образы (каталог по умолчанию). Таким образом, теперь в корне карты можно насоздавать несколько каталогов - TOOLS, GAMES, LANG и так далее, и разложить по ним используемые образы. Вложенные каталоги (то есть каталог в каталоге), допустимые в файловой системе FAT, я не стал поддерживать - это сильно усложняет и прошивку, и интерфейс API. Таким образом, глубина вложенности ограничена 1 - то есть все каталоги должны лежать в корне карты.
Для поддержки такой возможности я ввел 3 новых вызова API:
85 - Получить имя каталога по умолчанию
Возвращаются 14 байт с именем каталога
86 - Установить имя каталога по умолчанию
SEC=0 -временно 1-навсегда
После приема команды контрллер принимает 14 байт с именем каталога
87 - получить список каталогов, имеющихся на карте
Параметров команда не имеет.
Возвращаются строки по 14 байт с именами каталогов
В конце списка передается 00 (строки с нуля начинаться не могут).
Смена текущего каталога влияет только на вновь монтируемые образы. Текущие, уже смонтированные образы, остаются открытыми. Соответственно, в файл конфигурации MOUNT.CFG теперь сохраняются не только имена файлов образов, но и имена каталогов, в которых они лежат. Также в конфиг можно сохранить текущий каталог по умолчанию.
Соответственно доделан интерфейс программы MOUNT:
MOUNT /F[/P] dirname
Устанавливает dirname как каталог по умолчанию. С ключем /P - записывает его в конфиг, чтобы сохранить после перезагрузки. Контроллер проверяет наличие каталога на карте, и в случае его отсутствия операция не выполняется, а выдается соответствующее сообщение.
MOUNT /F/L
Выдает список имеющихся каталогов в корне карты. Вывод аналогичен MOUNT /L, ключ /F показывает, что мы хотим получить список каталогов, а не файлов в текущем каталоге.
Без параметров команда mount теперь, кроме выдачи списка монтирования, также показывает и текущий каталог по умолчанию. При первом запуске контроллера и отсутствии файла MOUNT.CFG по умолчанию назначается каталог DISK/.
Вторая, тоже важная переделка, касается поддержки более 2 образов. Я плотно покопался в драйвере VinxFS, и добился-таки поддержки 5 файлов, открытых одновременно. Теперь я уже уверен, что зря не взялся писать свой драйвер с нуля. За то время, за которое я въезжал в VinFS, я бы точно успел написать свой код. Ну, как получилось, так получилось.
Теперь я смог осуществить хотелку ESL о произвольном отображении реальных и эмулируемых дисков на логические буквы. Контроллер теперь поддерживает работу сразу с 4 эмулируемыми дисками, соответственно можно для бездисковых РМУ сделать все 4 диска эмулируемыми.
Соответственно дополнена программа mount:
A>MOUNT
DIR: SYSTEM
A: => (R/W) MOUNT2.KDI
B: => (R/W) SYSTEM.KDI
C: => $FDD 0
D: => $FDD 1
Это стандартная конфигурация. Диски A и B - эмулируемые, C и D - физические. Теперь можно, например, смонтировать диск С как эмулируемый:
A>MOUNT C C80
A>MOUNT
DIR: SYSTEM
A: => (R/W) MOUNT2.KDI
B: => (R/W) SYSTEM.KDI
C: => (R/W) C80.KDI
D: => $FDD 1
Можно назначать и реальные дисководы:
A>MOUNT B $0
A>MOUNT
DIR: SYSTEM
A: => (R/W) MOUNT2.KDI
B: => $FDD 0
C: => (R/W) C80.KDI
D: => $FDD 1
Таким образом, указание $n в качестве имени файла подключает физический дисковод n к букве диска. В качестве n допустимы 0-3, то есть если вдруг в машине есть более 2 дисководов, то и дисководы 2 и 3 тоже можно использовать.
Данная доработка конроллера потребовала также доработки и биоса (новый биос во вложении). Доработка касается процедур READ и WRITE (новый способ идентификации дисков).
ESL. С другими биосами это тоже будет работать, если откажешься от порочной практики вписывать в поле DRVMASK ненулевое значение для эмулируемых дисков. В данный момент программа mount с чужими биосами считает все диски реальными дисководами :) Ну и придется допатчить процедуры READ и WRITE.
Есть еще одна проблема. Программе mount для корректной работы нужно иметь доступ к блоку DPB. С моим стандартным биосом (программа mount его умеет детектить) просто берутся смещения, заранее полученные из листинга и вписанные в программу. Для других биосов для получения адреса DPB используется вызов SELDSK, который в HL возвращает нужный адрес. Но SELDSK пытается прочитать инфосектор с диска, поэтому для ошибочно смонтированных (не существующих) образов и реальных дисководов, в которые не вставлена дискета, BIOS начинает сыпать ошибки на консоль, что не очень красиво. В остальном все работает более-менее корректно. Если совсем не патчить READ и WRITE, то все тоже работает, однако переназначение дисков выполнить нельзя - A и B всегда будут эмулируемыми, C и D - реальными.
Ну и, наконец, схемная доработка. Дело в том, что при неправильном формате MOUNT.CFG контроллер при старте начинает сходить с ума. Также будут проблемы, если в конфиге указаны неправильные (отсутствующие на диске) имена образов. Мне задрало уже каждый раз после программного сбоя выдергивать карту, вставлять в РС и вручную удалять MOUNT.CFG. Поэтому я поставил кнопку между ногой PB3 (pin 4) и землей. Если при включении контроллера, или нажатия сброса, удерживать эту кнопку в течении 0.5с (можно и дольше, но смысла нет), то файл MOUNT.CFG с карты удаляется, и создается новый, со значениями по умолчанию. Если такая кнопка не нужна, то ее, понятно, можно и не впаивать, но вещь реально удобная.
Внимание! Перед первым запуском контроллера с новой прошивкой надо обязательно удалить старый файл MOUNT.CFG с карты!! Ну или, если кнопка впаяна, то нажать на нее. Иначе действия контроллера непредсказуемы!
Выкладываю архив с новой прошивкой, новой схемой, новым биосом и новой докой по API. Биос полностью соответствует соглашению об идентификациии, принятым с ESL - строчка "EXTROMBIOSV1" после таблицы переходов. Не забудьте его перетранслировать и положить в корень карты как SYSTEM.BIN.
Поскольку ESL так и зажал исходники запатченного эмулятора, выкладываю свой вариант, допатченный с учетом последних изменений. Поддерживаются 4 эмулируемых диска и работа с каталогами. Формат файла MOUNT.CFG также приведен в соответствие с контроллером - не забудьте удалить старый файл перед запуском нового эмулятора. Не также забудьте перетранслировать новый BIOS и положить его в SYSTEM.BIN для корректной работы переназначения физических дисководов.
Круто !
биосы - доделаем.
Поскольку ESL так и зажал исходники запатченного эмулятора, выкладываю свой вариант, допатченный с учетом последних изменений.
так там твои патчи прям без изменений, просто не запушил их ;)
так там твои патчи прям без изменений, просто не запушил их
А, понятно. Ну тогда просто замени файлы теми, что в архиве, и все.
Теперь насчет твоих предложений. Убрать команду очистки экрана - да пожалуйста, убирай, и я тогда у себя уберу. Выкладывать подправленный уже не буду, там всего 2 байта разница. Изменение принято.
Насчет SUBSTITUTED - тут я озадачен. А зачем это? Этот биос _всегда_ берется из SYSTEM.BIN, даже если встретится на диске (что вряд ли), все равно будет подставляться из SYSTEM.BIN, а не грузиться с системных дорожек. Так что по сути это только лишняя загромождающая экран информация. Причина загрузки этого биоса видна из лога твоего загрузчика.
Насчет загрузки патченного микродоса. Есть такой вариант. В корне карты положить файл MICRODOS.BIN, и в него образ 3 системных дорожек, уже запатченных заранее. Дополнить вызов A0 так, чтобы он по специальному параметру отдавал не SYSTEM.BIN, а MICRODOS.BIN. Загрузчик, встретив неподдерживаемую версию микродоса, просто посылает эту команду, и загружает дефлотный микродос.
API контроллера я готов доделать хоть сейчас, если подготовишь и выложишь дамп микродоса MICRODOS.BIN, чтобы было с чем отлаживать.
Просто загрузка разных версий CP/M-биосов мне не особо нужна - они же все мало отличаются друг от друга и моего биоса, по мне так все равно в чем работать. Другое дело - микродос. Это принципиально другая, довольно интересная система. В чем-то он даже лучше CP/M, например, поддерживает многосекторные передачи данных. С ним я давно хочу поиграться на контроллере, но для этого нужен твой загрузчик.
Насчет SUBSTITUTED - тут я озадачен. А зачем это? Этот биос _всегда_ берется из SYSTEM.BIN, даже если встретится на диске (что вряд ли), все равно будет подставляться из SYSTEM.BIN, а не грузиться с системных дорожек. Так что по сути это только лишняя загромождающая экран информация.
;)
Я же написал, что это для отладки было.
Чтобы точно понимать что загрузилось именно сейчас.
---------- Post added at 10:35 ---------- Previous post was at 10:24 ----------
Насчет загрузки патченного микродоса. Есть такой вариант. В корне карты положить файл MICRODOS.BIN, и в него образ 3 системных дорожек, уже запатченных заранее. Дополнить вызов A0 так, чтобы он по специальному параметру отдавал не SYSTEM.BIN, а MICRODOS.BIN. Загрузчик, встретив неподдерживаемую версию микродоса, просто посылает эту команду, и загружает дефлотный микродос.
API контроллера я готов доделать хоть сейчас, если подготовишь и выложишь дамп микродоса MICRODOS.BIN, чтобы было с чем отлаживать.
Я так и думал, правда есть мысль сделать еще резерв
0 - CPM.BIN,
1 - MICRODOS.BIN.
2.. - SYSTEM('2'+x).bin
вдруг еще чего вылезет.
постараюсь в ближайшее время.
Другое дело - микродос. Это принципиально другая, довольно интересная система. В чем-то он даже лучше CP/M, например, поддерживает многосекторные передачи данных.
Идеи там есть красивые, но вот реализация ...
Там есть PIPE ;)
Можно написать <aaa.txt и будет типа субста
Есть INITIAL.SUB - тип автостарта
Есть поддержка .SPR - что-то типа резидента ?
оно содержит в себе BITCOR и грузит его в MEMTOP
(правда за всё время есть только 1 (одна) прога в таком формате, редактор FKEYS под микродос, интерфейс полее чем страшен ибо НИИСЧЁТМАШ)
В тех местах где ввод с клавиатуры через стандартный ввод - можно нажать CTRL+D и выпасть в SHELL временно
Есть поддержка USER COMMAND 0..9 которые реализуются в биос.
Но повторюсь, реализация же еще та, может это адаптация под корвет
Цепочки из 4х JMP - это легко
Про оптимизацию похоже не сильно думали.
на первые версии вообще смотреть страшно, в сравнении с CP/M - АД
Работают в другой конфигурации памяти - где нет АЦЗУ
правда вывод CONOUT на экран всё равно через биос, так что тут разнцы вроде нет
но все хотели быстно на экран выводить, а тут - ой.
Потом (те версии что для ОПТС2) откатились на стандартную 1C как в CP/M
Используют драйвер клавиатуры из ПЗУ, что приводит к несовместимости версий для ОПТС1 и ОПТС2
в ОПТС1 драйвер по опросу рабтает, в ОПТС2 по прерываниям (типа как в CP/M)
соответственно версии для ОПТС2 тупо виснут на ОПТС1
Нет рамдиска.
Есть один образ (последний по дате), так он работает и везде, и есть рамдиск.
Правда глядя в код - я бы сказал что это не разработка НИИСЧЁТМАША а скорее чей-то хак,
ибо там прям HOTPATCH продцедур в зависимости от типа ОПТС,
и драйвер RAMDISK - отдельно, и живёт под клавиатурой.
еще минусы -
Памяти - меньше
На диске - больше
Хотя на Вектор-06Ц использовали именно его, я так понял CP/M там не распространился.
Как я понимаю это микс CP/M 2.2 + CP/M 3 + свои идеи.
Я так и думал, правда есть мысль сделать еще резерв
0 - CPM.BIN,
1 - MICRODOS.BIN.
2.. - SYSTEM('2'+x).bin
вдруг еще чего вылезет.
постараюсь в ближайшее время.
Ок, принимается. Только для сохранения совместимости (блин, уже начинается...) сделаем формат команды такой:
A0 TRK 0 0
TRK=0 - данные читаются прямо с дорожек образа диска А
1 - подставляется SYSTEM.BIN
2 - MICRODOS.BIN
3 и далее - SYSTEMn.BIN
Чуть позже я внесу изменения в контроллер и эмулятор и выложу. Отлаживать будем уже тогда, когда подготовишь MICRODOS.BIN.
и еще вспомнил, чтение параметров с диска - реализовано далеко не с первых версий биоса
в самых первых похоже вообще гвоздями забито
в той что была у нас для ОПТС1 - параметры читались но только первый раз
(вставил в Б микродосовский диск, посмотрел список файлов - ок
поменял его на CP/M - а вместо списка - мусор)
Как палетив есть стандартная комманда O - задать/посмотреть кол-во системных дорожек
но хто же про нее знал тогда.
и еще, в последнем микродосе есть даже поддержка двух кодировок которые есть в знакогенераторе
можно по коммандам переключиться между ними и оно даже будет корректно выводить сообщения (там в коде два комплекта, в двух кодировках)
и две таблички принтера
А ведь по сути микродос - вполне себе прогрессивная система. И с CP/M полностью совместима. Из CCP выкинуты малоиспользуемые команды типа SAVE, зато можно, как я понимаю, вносить свои. Тот же mount например. Правда, памяти микродос отжирает, как я вижу, поболее CP/M, а у нас ее и так мало. Кстати, исходники микродоса существуют в природе? Просто ты плотно ковырялся с той помойкой исходников, что лежит у тебя в архиве. Биос микродоса я видел в исходнках, а вот саму систему что-то не припомню. А было бы интересно попробовать собрать ее с нуля.
Ну и, конечно, меня все не оставляет мысль попробовать CP/M 3.0. Если ее, конечно, потянет наш корвет. Я эту 3.0 вживую никогда не видел, только описание читал. Методику адаптации системы мы отработали, поддержку реальных дисководов можно вообще снести как класс для освобождения памяти - там дисковый драйвер чуть ли не треть биоса занимает вместе с огромными буферами. Исходники системы 3.0 и референсного биоса доступны. Чем не развлекуха?
Ну, ладно. Я доделал API, контроллер и эмулятор для поддержки различных вариантов подстановок системы командой A0.
DRV — всегда 0.
TRK — 0-выключить режим подстановки,
1-подставлять файл SYSTEM.BIN (там лежит специальная версия CP/M 2.2)
2-подставлять файл MICRODOS.BIN (там лежит специальная версия microdos)
3-подставлять файл SYSTEMn.BIN, где n-значение параметра TRK. Это задел на будущее.
Выкладываю заново все файлы, включая BIOS с выкинутой очисткой экрана.
А ведь по сути микродос - вполне себе прогрессивная система. И с CP/M полностью совместима.
Конечно, она же много старше ;)
---------- Post added at 13:14 ---------- Previous post was at 12:58 ----------
Из CCP выкинуты малоиспользуемые команды типа SAVE, зато можно, как я понимаю, вносить свои. Тот же mount например.
не совсем,
в самом досе все забито гвоздями
RAM:C186 7E ld a, (hl)
RAM:C187 CD 81 C4 call CMP_0_9
RAM:C18A DA 96 C1 jp c, no_09
RAM:C18D F5 push af
RAM:C18E CD A5 C3 call prepareFCB?
RAM:C191 F1 pop af
RAM:C192 57 ld d, a
RAM:C193 C3 18 E4 jp j_cmd_0_9 - это как раз вызов биоса
...
no_09: ; CODE XREF: sub_C036+154j
RAM:C196 4E ld c, (hl)
RAM:C197 21 1E C2 ld hl, CMD ; "DEOUS"
RAM:C19A CD 57 C4 call findInArray
RAM:C19D 21 24 C2 ld hl, CMD_PTR
RAM:C1A0 D2 67 C3 jp nc, loc_C367
RAM:C1A3 F5 push af
RAM:C1A4 E5 push hl
RAM:C1A5 CD F8 C1 call initInCmdFCB
RAM:C1A8 CD F6 C3 call sub_C3F6
RAM:C1AB E1 pop hl
RAM:C1AC F1 pop af
RAM:C1AD C3 27 C5 jp jp_hltab_a
....
RAM:C21E 44 45 4F+CMD: .ascii 'DEOUS',0 ; DATA XREF: sub_C036+161o
RAM:C224 2E C2 CMD_PTR: dw D_DIR ; DATA XREF: sub_C036+167o
RAM:C226 D4 C2 dw E_ERASE
RAM:C228 EC C2 dw O_ShowSystemTacks
RAM:C22A 26 C3 dw U_USER
RAM:C22C 3E C3 dw S_SetSystemDrive??
а это обработчик 0-9 (из другого биоса - последнего)
RAM:E897 _exec09: ; CODE XREF: sub_C036:exec09j
RAM:E897 7A ld a, d
RAM:E898 B7 or a
RAM:E899 21 BA E8 ld hl, aE0 ; "\x1BE\x1B0$"
RAM:E89C CA 86 E4 jp z, PutSTR
RAM:E89F
RAM:E89F CHARSET2: ; DATA XREF: sub_C036-1CBo
RAM:E89F 3D dec a
RAM:E8A0 21 BF E8 ld hl, aE1 ; "\x1BE\x1B1$"
RAM:E8A3 CA 86 E4 jp z, PutSTR
RAM:E8A6 ;
RAM:E8A6
RAM:E8A6 21 C4 E8 ld hl, mCrLf ; "\r\n$"
RAM:E8A9 CD 86 E4 call PutSTR
RAM:E8AC CD 15 E4 call j_get_MSG_TAB
RAM:E8AF 11 04 00 ld de, 4 ; INCORRECT_COMMAND
RAM:E8B2 19 add hl, de
RAM:E8B3 7E ld a, (hl)
RAM:E8B4 23 inc hl
RAM:E8B5 66 ld h, (hl)
RAM:E8B6 6F ld l, a
RAM:E8B7 C3 86 E4 jp PutSTR
RAM:E8B7 ; END OF FUNCTION CHUNK FOR sub_C036
RAM:E8B7 ; ---------------------------------------------------------------------------
RAM:E8BA 1B 45 1B+aE0: .ascii '\x1BE\x1B0$' ; DATA XREF: sub_C036+2863o
RAM:E8BF 1B 45 1B+aE1: .ascii '\x1BE\x1B1$' ; DATA XREF: sub_C036+286Ao
RAM:E8C4 0D 0A 24 mCrLf: .ascii '\r\n' ; DATA XREF: sub_C036+2870o
RAM:E8C4 ; jGROUTPUT+4C9o
RAM:E8C4 .ascii '$'
плюс сам дос при коммандах 0..9 делает вызов функции "биос" с параметрами
в корвете это почти не используется, а вот в векторе например ...
https://code.google.com/p/vector06cc/wiki/MicroDOS_manual
смотри раздел
"4.5. Дополнительные команды"
т.е. ипользовать можно, но получается чистая "магия", без доки понять нельзя.
ну и на мой взгля Type выкинул зря ;)
Насколько я вижу, второй код поддерживает только команды 0 и 1, посылая управляющие коды на экран. там всего анализа-то OR A и потом DEC A. В первом коде вообще обработчика не видно. Впрочем, тут надо самому брать IDA и лезть в микродос, чтобы разобраться.
Я к тому, что ты тут очень хорошую доку привел на микродос от вектора. У меня в микродосах, которые я видел, команд S, K, A вообще нет. Сокращение команд до 1 буквы - это правильно, облегчает жизнь оператору, но надо было оставить и полные версии команд. Помню, в командах операторской консоли ОС ЕС так и было сделано. А то поди догадайся, что установка числа системных дорожек - это О, а переименование - 5. Вообще переименование по команде 5 - это верх наглядности :) Хотя имхо в тех микродосах что я видел команды 5 тоже нет.
Пожалуй, в выходные копну малость микродос. Интересно все же взглянуть на его потроха.
Насколько я вижу, второй код поддерживает только команды 0 и 1, посылая управляющие коды на экран. там всего анализа-то OR A и потом DEC A. В первом коде вообще обработчика не видно. Впрочем, тут надо самому брать IDA и лезть в микродос, чтобы разобраться.
именно так, "второй код" это обработчик комманд 0-9 в биосе
дос проверяте "это цифра?" и если да то вызывает биос
иначе проверяет по списку комманд
иначе ищет COM файл
etc.
кстати
cp/m 2.2 ~1980
CP/M was version 3, often called CP/M Plus, released in 1983
миркодос - 1984
вот дока/"реклама" http://www.computer-museum.ru/histsoft/mikrodos.htm
а вот единственна дока по микродос - но в версии профи
зато есть описание функция
особенно доставляет "расширение"
http://zxpress.ru/book.php?id=167
http://zxpress.ru/book.php?id=168
возможно там еще есть
в аттаче моя рабочая папка с микродосом
выкладываю ради bin файлов
это дампы памяти уже загруженных систем.
смотреть имхо стоит на последнюю
правда она себя активно патчит на старте
поэтому
mdos2_900105_START - сиситем до старта
mdos2_900105_ROM1 - запущенная с ОПТС1
mdos2_900105_ROM2 - запущенная с ОПТС2
драйвер рамдиска есть только в последней.
Я тут стормозил прицепил к предыдущим письмам не ту версию патченного эмулятора. Прикладываю правильные.
В той версии, что выкладывал ранее, не будут монтироваться образы мз каталога, отличного от DISK
У меня в микродосах, которые я видел, команд S, K, A вообще нет.
А то поди догадайся, что установка числа системных дорожек - это О, а переименование - 5. Вообще переименование по команде 5 - это верх наглядности :) Хотя имхо в тех микродосах что я видел команды 5 тоже нет.
а где ты нашел K и А ??
а команды 0-9 это биос специфик, как разработчик написал такой изврат и будет.
по ссылке это специфично для КОНКРЕТНОГО биоса Вектора ;)
а так да, такой себе компромис.
а где ты нашел K и А ??
так ты же ссыку на доку давал.
А - устанавливает 7-битовый код для обмена с консолью (КОИ-7);
К - устанавливает 8-битовый код для обмена с консолью (КОИ-8);
Команды для корвета нафиг не нужны, поскольку там прибитый гвоздями 8-битный терминал. Имхо поэтому их и кастрировали. А вот эту команду жалко:
S - назначает ситемное дисковое устройство;
Я так понял, с ее помощью можно грузить систему с диска, отличного от А.
Кстати, Еще одна фраза мне понравилась:
Генерация ОС МикроДОС
Адаптивность ОС МикроДОС. Как уже отмечалось ранее, требования ОС МикроДОС к аппаратным ресурсам микроЭВМ достаточно общи. В результате эта ОС может использоваться на очень широком классе существующих 8-разрядных микроЭВМ. Этому в значительной мере способствует легкость генерации ОС МикроДОС на различных микроЭВМ и четкая структуризация процедур доступа к различным аппаратным ресурсам микроЭВМ.
Интересно, из чего делали генерацию системы? Существовал какой-то набор для сборки, или полные исходные тексты? Жалко, что это все давно потеряно. И в НИИСЧЕТМАШ у меня знакомых никогда не было, хотя пересекаться с ними по работе приходилось.
так ты же ссыку на доку давал.
А - устанавливает 7-битовый код для обмена с консолью (КОИ-7);
К - устанавливает 8-битовый код для обмена с консолью (КОИ-8);
аа, заметил, они только в начале есть, а в разделе " 4. РЕЗИДЕНТН Е КОМАНД МикроДОС" их нет.
наверное самопал.
---------- Post added at 15:56 ---------- Previous post was at 15:52 ----------
S - назначает ситемное дисковое устройство;
Я так понял, с ее помощью можно грузить систему с диска, отличного от А.
S - есть, я же приводил кусок кода ;)
я думаю что нет, она же выполняется ужи в загруженной системе
что делает - не копал
S B:
---------- Post added at 15:57 ---------- Previous post was at 15:56 ----------
Интересно, из чего делали генерацию системы? Существовал какой-то набор для сборки, или полные исходные тексты? Жалко, что это все давно потеряно. И в НИИСЧЕТМАШ у меня знакомых никогда не было, хотя пересекаться с ними по работе приходилось.
Вообще не знаю.
Исходников не видел.
И даже док нет.
---------- Post added at 15:58 ---------- Previous post was at 15:57 ----------
Кстати, Еще одна фраза мне понравилась:
Ну имхо это они про то что надо только свой биос написать ;)
в общем описали генерацию CP/M ;)
---------- Post added at 16:00 ---------- Previous post was at 15:58 ----------
кстати, вспомнил еще ее плюс
вроде как, не проверял
что микродос при запуске ком
ищет его сначала в текущем ющере а потом в 0
т.е. можно например то-же компилер положить в USER0 а рабочие файлы в USER N
правда еще раз повторю - не проверял
cp/m вроде как только в текущем USER ищет.
Я тут подумал, что ведь наш контроллер могут использовать и на машинах, не имеющих реального FDC ВГ93. И ESL предлагал отрубить лишние диски на таких машинах.
Вообщем, подправил BIOS, чтобы он автоматически при старте определял наличие FDC, и если его нет, то все 4 логических диска становятся эмулируемыми.
Добавил в патчер микродосы, все ...
Ой какие они странные.
из неподдерживаемых - КОРНЕТ и SFERA, но это на перспективу.
Еще из нововведений,
Нажатие ctrl+shift - выпадаем в EXTROM биос насильно.
Для некоторых БИОС добавил проверк ПЗУ
ибо часть микродосов работают только с определенным биосом.
И нашлась пара редких CP.M которые тоде с ОПТС2 - не стратуют.
Patcher пишет что нужен OPTS X. и вываливет как несовместимый, с откатом в дефолтный.
Обработки хоткеев там нет пока, но надеюсь сделаю.
Ой, какие же они странные и разные
все mdos1 биосы работают в конфигурации 5C
Т.е. MOUNT говорит что нет EXTROM (порты по другим адресам)
легко исправить.
Комманда O - показать кол-во системных дорожек
в
mdos1_861011.kdi
mdos1_861115.kdi
Можно и установить, что позволяет читать cp/m диски,
по дефолту они считают что 3 дорожки
Можно сказать O 2
В остальных - О только показывает.
mdos1_870430.kdi
Вообще странный зверь, что-то на экране мусор, диски cp/m не показывает.
mdos1_871220.kdi
mdos2_880630.kdi
mdos2_900105.kdi
Работают в конфируации 1C
У них уже есть RAMDISK
880630 работает только с ОПТС2
При попытке запустить в ОПТС1 молча выпадает в бейсик
900105 и с ОПТС1 и ОПТС2 (self patching)
mount - запускается.
Новое АПИ пока не имплеменчено ;)
но поидее можно будкт взять 900105 и положить как microdos.sys
Осталось сделать чтоб в нужную ось fallback делал.
но уже после отдыха.
Устал я о них.
на TODO
fallback в микродос
маппинг дисков.
отключение при отсутсвии реальных.
этот кашмарик уже 5.3к
в основном конечно таблицы ...
Добрался наконец до компьютера - а тут уже ESL микродос загружает! Отлично, все самое главное ты сделал. Отдыхай спокойно, набирайся сил, я пока в MOUNT добавлю проверку карты памяти.
Обновил программу MOUNT для работы с разными картами памяти.
похоже mount надо серьёзно переделывать :(
собственно проблеммы - 2
микродос - там нет таблички с битмаской, там прямо в коде сравнивают и выбирают нужную таблицу
по этому надо вводить некое на уровне доса где будет карта маппинга
cp/m если нет диска в дисководе - замаунтить его невозможно
при seldsk возвращается 0
т.е. предлагаю ввести таки апи внутри биоса
например при тот-же seldsk при c=0xff
дополнительно верунть de=табличка маппинга, bc=0x55aa как флаг
микродос - там нет таблички с битмаской, там прямо в коде сравнивают и выбирают нужную таблицу
по этому надо вводить некое на уровне доса где будет карта маппинга
Давай уточним, чтобы я понял. Значит, в микродосе в DPB нет поля DRVMASK, а маска для записи в регистр вычилсяется прямо в коде исходя из номера дисковода? Это плохо. Очень плохо.
Может, тогда вообще забить на работу с реальными дисководами в микродосе, и оставить только эмуляцию для всех 4 дисков? Не так уж и нужны дисководы при наличии EXTROM.
Или, действительно, придется где-то в биосе выделить место, положить туда карту отображения дисков, и как-то сообщить программе mount адрес этой таблицы. Ну и сам биос научить определять тип диска по этой таблице. Задачка еще та :)
cp/m если нет диска в дисководе - заманутить его невозможно
при seldsk возвращается 0
Я на это уже нарывался. Поэтому для своего дефлотного биоса просто вбил в mount абсолютные адреса блоков DPB. С этим биосом все работает без вопросов.
Придурки разработчики CР/M не могли, блин, предусмотреть способ передать программе адрес DPB не трогая диска.
т.е. предлагаю ввести таки апи внутри биоса
например при тот-же seldsk при c=0xff
дополнительно верунть de=табличка маппинга, bc=0x55aa как флаг
Это ты про CP/M или микродос? Не знаю как в микродосе, но в CP/M SELDSK при C=FF штатно отдает адрес таблицы векторов прерываний. Нам же нужен способ получить адрес DPB нужного диска, не трогая его, то есть не вызывая процедуру GETINFO (которая при невставленной дискете начинает сыпать ошибки).
Я уже думал над расширением функции SELDSK, уже даже хотел выносить на обсуждение, а вот теперь и ты нарвался на то же самое. SELDSK в существующем виде не подходит для получения адреса DPB.
То есть в С придется оставить номер диска, для которого мы хотим получить адрес DPB. А в качестве флага того, что мы хотим просто получить адрес DPB, можно установить B=AA. AA я предлагаю потому, что FF или 00 могут оказаться в B чисто случайно, ведь по стандарту этот регистр параметров не содержит, и при вызове в нем может оказаться любой мусор.
Итак, вызов SELDSK:
C= #диска
B=AA - отдать DPB
не AA - вызвать GETINFO, а потом уже отдать DPB
Проверочный образец 55AA в данном случае не нужен, поскольку адрес DPB отдается в любом случае.
А вот что делать с микродосом... имхо проще плюнуть на физические диски. Ну а если нет - давай договариваться о формате таблицы дисков и об интерфейсе получения ее адреса. Хотя бы почти как ты предлагал, только C не FF, а что-нибудь другое, например AA или 55.
Я смотрю, биосы уже прямо распухают от патчей. Также твой загрузчик и программа MOUNT толстеют на глазах. Вот она, цена совместимости...
Давай уточним, чтобы я понял. Значит, в микродосе в DPB нет поля DRVMASK, а маска для записи в регистр вычилсяется прямо в коде исходя из номера дисковода? Это плохо. Очень плохо.
Why ?
и dpb/dph там ровно на 2 диска (+E)
---------- Post added at 14:26 ---------- Previous post was at 14:25 ----------
Или, действительно, придется где-то в биосе выделить место, положить туда карту отображения дисков, и как-то сообщить программе mount адрес этой таблицы. Ну и сам биос научить определять тип диска по этой таблице. Задачка еще та :)
Я как раз про этот вариант и говорил ;)
---------- Post added at 14:28 ---------- Previous post was at 14:26 ----------
Придурки разработчики CР/M не могли, блин, предусмотреть способ передать программе адрес DPB не трогая диска.
Вопрос филосовский.
Зачем вообще нужен DPH/DPB если диск неинициилизирован?
Кром таких извращенцев как мы оно и не надо то.
Кроме того, в 1980 году про это был повод думать ?
---------- Post added at 14:35 ---------- Previous post was at 14:28 ----------
Это ты про CP/M или микродос? Не знаю как в микродосе, но в CP/M SELDSK при C=FF штатно отдает адрес таблицы векторов прерываний. Нам же нужен способ получить адрес DPB нужного диска, не трогая его, то есть не вызывая процедуру GETINFO (которая при невставленной дискете начинает сыпать ошибки).
Нет, при C=FF в HL - таблица векторов
я думал добавть в остальные регистры флаг и адрес таблички DPB
но можно и при C=0xFE сделать
на неподдерживаемых будет HL=0
а поддерживаемые будут возвращать адрес таблички DPB
---------- Post added at 14:38 ---------- Previous post was at 14:35 ----------
То есть в С придется оставить номер диска, для которого мы хотим получить адрес DPB. А в качестве флага того, что мы хотим просто получить адрес DPB, можно установить B=AA. AA я предлагаю потому, что FF или 00 могут оказаться в B чисто случайно, ведь по стандарту этот регистр параметров не содержит, и при вызове в нем может оказаться любой мусор.
Итак, вызов SELDSK:
C= #диска
B=AA - отдать DPB
не AA - вызвать GETINFO, а потом уже отдать DPB
Проверочный образец 55AA в данном случае не нужен, поскольку адрес DPB отдается в любом случае.
в моем варианте просто возврщаем адрес таблики как в твоём MOUNT
там для диска или адресс DPB или например 0 как признак блокировки диска.
---------- Post added at 14:40 ---------- Previous post was at 14:38 ----------
А вот что делать с микродосом... имхо проще плюнуть на физические диски. Ну а если нет - давай договариваться о формате таблицы дисков и об интерфейсе получения ее адреса. Хотя бы почти как ты предлагал, только C не FF, а что-нибудь другое, например AA или 55.
При табличке - пофиг микродос это или нет
Я в микродосе сделаю fake dpb, который для mount будет как настоящий.
А 0 в табличке - информация что дисков нет.
---------- Post added at 14:45 ---------- Previous post was at 14:40 ----------
Я смотрю, биосы уже прямо распухают от патчей. Также твой загрузчик и программа MOUNT толстеют на глазах. Вот она, цена совместимости...
Не забивай себе голову ;)
В основном это моя головная боль.
Я это ожидал, и всё в пределах ожидания.
Вообще идея патчера это головная боль, но интересно ;)
p.s. сегодня немного копался в SFERA (эт та что сетевая с вторым диском под ученичесские)
там SELDSK забавный, содержит 16 копий ALV,
таблику 4x16 там смещения дисков и размер (копирует из нее значения в DPB.OFS и еще что-то)
---------- Post added at 14:48 ---------- Previous post was at 14:45 ----------
Сегодня родилась мысль еще
что можно mount&co монитровать в диск E по комбинации клавиш
или точнее спрашивать проинитить E или монитровать на диск.
На всех машинах точно 48к есть, и он работает.
в cp/m он есть везде, а в микродос - сделать поддержку только в последнем.
нажали кнопку - и на диск E скопировался посекторно образ диска с mount
там то копировать понты, и можно прям биосом и копировать посекторно ;)
Итак, давай еще раз определимся.
Программе mount не нужен DPB как таковой. Ему нужно всего одно поле - DRVMASK, по которому определяется - является ли диск эмулируемым (если 0) или реальным (если не 0). И если диск реальный, то он по маске определяется номер физического дисковода, связанного с данным DPB. Ну и, изменяя это поле, mount переотображает логическую букву диска на один из реальных дисководов или эмулируемый диск.
Значит, для CP/M таблица должна состоять из 4 двухбайтовых слов, хранящих адрес поля DRVMASK каждого из 4 DPB. То есть то самое, что я вбил намертво в mount для своего биоса. А вызов SELDSK с C=0FEh должен в HL возвращать адрес этой таблицы. Сама тблица будет расположена где-то внутри BIOS.
Вроде бы к этому и сводится твое предложение. Все логично, я полностью согласен и готов внести все изменения с свой BIOS и программу mount.
Теперь микродос. Тут, как я понимаю, только 2 DPB, и нет поля DRVMASK. Причем DPB#0 всегда должен отображаться на эмулируемый диск - отображать A: на реальную дискету бессмысленно и чревато зависанием системы.
Поэтому здесь мы можем играться только с назначением диска B: - или эмулируемый, или реальный дисковод 0. На дисковод 1 вполне можно плюнуть. Здесь SELDSK с C=0FEh должен вернуть в HL адрес однобайтового поля, хранящего тип диска B - эмулируемый (0) или реальный (не 0). Диски C и D в этой системе mount не отображает и не принимает в качестве аргументов команд.
Вроде бы все логично. Только скажи - как mount может отличить, запущен ли он в CP/M или микродосе? Можно добавить еще один признак при возврате из нашего варианта функции SELDSK C=0FEh: например в регистре A вернуть 0 для CP/M или не 0 для микродоса. Но, может быть, есть еще более простой путь определить тип ОС? Ты ковырял микродос, может знаешь какие-нибудь его отличительные признаки?
На всех машинах точно 48к есть, и он работает.
в cp/m он есть везде, а в микродос - сделать поддержку только в последнем.
нажали кнопку - и на диск E скопировался посекторно образ диска с mount
О, идея супер. Правда, при этом портится содержимое ГЗУ, но это фигня.
Только один момент: как биос получит образ маленького диска с mount от контроллера?
Давай сделаем не так. Давай в контроллер добавим еще один открытый файл, и при вызове READ с DRV=4 будут сразу возвращаться сектора намертво примонтированного к DRV4 диска c программой mount. А в биосе обращение к диску E будем заворачивать на драйвер EXTROM, как и остальные диски A-C.
Таким образом, в системе всегда будет доступен диск E, только для чтения, содержащий программу mount. А рамдиск - ну его нафиг. Кому он нужен-то в наше время? Но если уж так хочется, можно ввести в mount команду, отключающую от диска E эмулятор и подключающую обратно рамдиск. Хотя по мне так это явно излишне.
cp/m если нет диска в дисководе - замаунтить его невозможно
при seldsk возвращается 0
А разве для Корветовских МикроДОСов это не так-же?
Для Векторовских посмотрел свой старый код сюсинфы, нашёл следующее:
/* Перед соответствующей таблицей параметров диска DPB, располагается */
/* Таблица физических параметров дисковода размером в 7 байт: */
struct STDskParm
{
char HeadSpeed; /* 0-6мс, 1-12мс, 2-20мс, 3-30мс, 80H-3мс */
char SecPerTrack; /* Число физических секторов на дорожке */
char InSec; /* 0-single sided, 1-double sided */
char SecSize; /* Размер физич. сектора 0-128,...3-1024 */
char Track; /* Hомер текущей дорожки */
char Drive; /* Позиционный номер устр-ва 00000100 */
char Info; /* Флаг успешного считывания информ. сектора */
};
/* При вызове BIOS SELDSK в <HL> возвращается 0 для несуществующего привода */
/* или адрес Заголовка Дискетных Параметров: Diskette Parameter Header */
STDskParm.Info - не подойдёт как флаг успешного маунта диска с системой? Может, ошибаюсь
На всяк случай, приаттачу весь header. А если надо, могу весь код сюсинфы выложить и .com файл
Если бы все так было просто...
Дело в том, что программе mount нужно иметь информацию о типе логического диска - физический он или эмулируемый. Для этого мы используем поле DRVMASK (в твоей структуре - Drive). 0 - эмулируемый диск, не 0 - физический. Проблема в том, что для того, чтобы получить доступ к этому полю, надо знать адрес DPB. А хитрый вызов SELDSK не отдает этот адрес, если, например, в дисководе нет дискеты. Вот в это все и уперлось - пришлось дополнять вызов SELDSK своей функцией FE. Заодно таким образом можно программно определить, под микродосом мы сидим, или под CP/M.
Собственно, я уже написал весь необходимый код, и в эмуляторе его отладил. Но коварное начальство отправило меня на неделю в командировку в далекий Белгород. Я только что оттуда вернулся, сейчас проверю код на реальном железе (в Белгороде корвета у меня не было :), и ближе к вечеру выложу сюда на обсуждение.
А разве для Корветовских МикроДОСов это не так-же?
вот кусочек где происходит выбор маски у некоторых версий ;)
RAM:ED82 7E ld a, (hl) ; drive
RAM:ED83 B7 or a
RAM:ED84 06 01 ld b, 1
RAM:ED86 CA 8B ED jp z, loc_ED8B
RAM:ED89 06 02 ld b, 2
RAM:ED8B
RAM:ED8B loc_ED8B: ; CODE XREF: FDD_Setup+9j
в B тут маска выбора диска
Очень похоже что идею с блоком информации придумали в ОФП НИИЯФ МГУ
т.е. разработчики Корвета.
И CP/M адаптировали они, т.е. поддержкасразу.
А микродос адаптировали уже в НИИСЧЁТМАШ ...
И обработку этого блока сделали ну не сразу, а оно им надо было ?
А на векторе как понимаю - адаптировли люди заинтересованные.
в первых версиях микродоса - параметры диска вообще гвоздями прибиты.
---------- Post added at 09:20 ---------- Previous post was at 09:15 ----------
На всяк случай, приаттачу весь header. А если надо, могу весь код сюсинфы выложить и .com файл
вот кусочек описания биоса cp/m про диски ;)
https://dl.dropboxusercontent.com/u/490774/KORVET-DISK.pdf
---------- Post added at 09:28 ---------- Previous post was at 09:20 ----------
Но, может быть, есть еще более простой путь определить тип ОС? Ты ковырял микродос, может знаешь какие-нибудь его отличительные признаки?
Всё просто.
Вызов BDOS GetVER - врзвращает 0x26
---------- Post added at 09:34 ---------- Previous post was at 09:28 ----------
Здесь SELDSK с C=0FEh должен вернуть в HL адрес однобайтового поля, хранящего тип диска B - эмулируемый (0) или реальный (не 0). Диски C и D в этой системе mount не отображает и не принимает в качестве аргументов команд.
Имхо для микродоса тоже вернуть такую-же табличку как и в cp/m
Формально она фейковая, но какая разница.
А данные из неё я уже буду в резеденте брать.
Т.о для MOUNT они одинаковые.
Можно конечно для простоты в SELDSK возвращать флаг микродоса, но зачем?
Еще идея, возвращать табличку наличия физ дисков MOUNTу.
Чтобы он и не пытался монтировать при их отсутствии.
---------- Post added at 09:39 ---------- Previous post was at 09:34 ----------
О, идея супер. Правда, при этом портится содержимое ГЗУ, но это фигня.
Это совсем не страшно, ибо 0я страница всё равно отведена под графику
по дефолту она не видна (LUT)
и при нахождении в ДОС ее точно можно портить ;)
Только один момент: как биос получит образ маленького диска с mount от контроллера?
Так и просится в API чтение произвольного файла ....
---------- Post added at 09:41 ---------- Previous post was at 09:39 ----------
Давай сделаем не так. Давай в контроллер добавим еще один открытый файл, и при вызове READ с DRV=4 будут сразу возвращаться сектора намертво примонтированного к DRV4 диска c программой mount. А в биосе обращение к диску E будем заворачивать на драйвер EXTROM, как и остальные диски A-C.
Таким образом, в системе всегда будет доступен диск E, только для чтения, содержащий программу mount. А рамдиск - ну его нафиг. Кому он нужен-то в наше время? Но если уж так хочется, можно ввести в mount команду, отключающую от диска E эмулятор и подключающую обратно рамдиск. Хотя по мне так это явно излишне.
не, там же параметры диска (DPH) под фиксированный диск сделаны
подменить его так нельзя.
---------- Post added at 09:42 ---------- Previous post was at 09:41 ----------
Собственно, я уже написал весь необходимый код, и в эмуляторе его отладил. Но коварное начальство отправило меня на неделю в командировку в далекий Белгород. Я только что оттуда вернулся, сейчас проверю код на реальном железе (в Белгороде корвета у меня не было :), и ближе к вечеру выложу сюда на обсуждение.
Выкладывай!!
Я тоже опять подключусь.
Поглядел как я в сюсинфе достаю DPB логического диска. Следующим кодом:
int logon(disk)
int disk;
{
char *cp,csum;
int i;
/*-------HARDWARE TROUBLES---------------------------------------*/
NonCPMDisk=FALSE;
if (!(dph=bios(SELDSK,disk,0)))
{
printf("Can't log on [%c].\nLogin to drive only.\n",disk+'A');
return(FALSE);
}
bios(SETDMA,isp,0);
bios(SETTRK,0,0);
bios(SETSEC,1,0);
if (bios(READ,0,0))
{
puts("Can't read disk information sector in boot record.\n");
return(FALSE);
}
dparms=dph-sizeof(STDskParm);
dpb=dph->DPBV;
if (dpb->OFS) Bootable=TRUE;
else Bootable=FALSE;
if (dpb->CKS) Removable=TRUE;
else Removable=FALSE;
drive=disk;
/*--------SOFTWARE TROUBLES--------------------------------------*/
for ( cp=isp,i=0,csum=0 ; i < 31 ; i++ ) csum+=*cp++;
csum+=0x66;
if ( csum != isp->_CheckSum )
{
NonCPMDisk=TRUE;
}
return(TRUE);
}
Собсно приаттачу сырки (866 кодировка) и si.com
Интересно её на корвете запустить
Насчёт выбора диска без конверта, это вроде и в векторе на МикроДОСе висло. ЕМНИП на ВГ93 можно определять, вставлен-ли конверт по индексному маркеру и закрытому драйву, но сейчас уже и не припомню как, биос лет 20 назад писал.
PS.
Получается, что и правда, других нормальных вариантов достать DPB нету. Проранил si.com только-что на Векторе под MicroDOS 3.1 со своим биосом. DPB для логического диска (RAM drive) через SELDSK нашлась. Хотя это вряд-ли поможет если на Корвете не все биосы возвращают DPH.
вот кусочек где происходит выбор маски у некоторых версий ;)
...
в первых версиях микродоса - параметры диска вообще гвоздями прибиты.
Жесть!
ЕМНИП на ВГ93 можно определять, вставлен-ли конверт по индексному маркеру и закрытому драйву, но сейчас уже и не припомню как, биос лет 20 назад писал.
это только в динамике можно узнать
(всё время порашивая WriteProtect?? на предмет его смены)
Есть очень серьезное подозрение что впервые этот метод был реализован на корвете ;)
в PKTOOL, там при смене диска - автомато перечитывалась директория, было ЖУТКО удобно
Это увидел RST7 - и после этого появился RST Commander где это было реализовано.
а потом - пошло поехало ;)
---------- Post added at 12:27 ---------- Previous post was at 12:23 ----------
Хотя это вряд-ли поможет если на Корвете не все биосы возвращают DPH.
CP/M - возвращает
в Микродос просто нет этой таблицы перед DPB
---------- Post added at 13:40 ---------- Previous post was at 12:27 ----------
работает, только 64x16 ему маловат ;)
пришлось запустить граф биос, в нем влазит всё.
DISK INFORMATION FOR LOGICAL DRIVE A
*** YOUR BIOS NOT SUPPORT PHYSICAL DISKETTE PARAMETER TABLE ***
Advice: try to read physical parameters from boot record\
хотя вроде должен нормально сработать
а чем оно компилилось ?
---------- Post added at 13:50 ---------- Previous post was at 13:40 ----------
Жесть!
Скажи!
Вообще создаётся впечатление что всё к чему прикоснулся НИИСЧЁТМАШ - это шедевр.
Вон forth32 уже несколько раз озвучивал свое мнение о разработчиках ОПТС ;)
причем - смотриш на машину и тот-же cp/m - красота
ОПТС(биос)/микродос - ад
DISK INFORMATION FOR LOGICAL DRIVE A
*** YOUR BIOS NOT SUPPORT PHYSICAL DISKETTE PARAMETER TABLE ***
Advice: try to read physical parameters from boot record\[/CODE]
хотя вроде должен нормально сработать
Вот с этого места, выбери в меню опцию
1 - Work with Diskette Parameters Header DPH
(нажав клавишу 1)
Что видишь?
Появилось туча инфы про DPH и вложенное меню
0. Memory Dump
1. Sector Translation Table XLT
2. Work with Diskette Parameters Block DPB
3. Checksum Buffer
4. Disk Usage Map
В этом меню только опция 2 проимплеменчена и должна показать физику и логику про дисковые параметры.
Дальше я устал и забил имплементровать :v2_dizzy_facepalm:
На Векторе-и для CP/M и для МикроДОС работает. Попробуй на Корвете пожалуйста.
а чем оно компилилось ?
Так в сырках написано в каждом файле: for SuperSoft C ver.1.2.3 :)
Вот с этого места, выбери в меню опцию
3. DPB
4. Checksum Buffer
5. Disk Usage Map
На Векторе-и для CP/M и для МикроДОС работает. Попробуй на Корвете пожалуйста.
cp/m (это с граф драйвером экрана)
49005
микродос (родной текстовый режим)
49006
Работает. Попробуй опцию
2. Work with Diskette Parameters Block DPB
А вот что кажет Вектор для логического диска на 236К. Может прога будет вам с forth32 подспорьем по биосам лазать.
Работает. Попробуй опцию
2. Work with Diskette Parameters Block DPB
я ж сразу написал что работает ;)
оно должно на всех cp/m работать, вызовы то все стандартные
почему не печатает физ параметры, мне интеренсно, вечерком попробую глянуть.
Итак, очередной этап разработки готов к тестированию. На этот раз мы имеем 2 крупных изменения.
В биосе формируется таблица из 4 слов, содержащих адрес поля DRVMASK каждого из 4 DPB. Еще раз подчеркиваю - указатели показывают именно на байт с маской, а не начало официального DPB (CPMTxx).
В вызов SELDSK добавлен вариант C=FE. При этом в HL возвращается адрес этой таблицы. Теперь mount берет адреса DPB именно из этого вызова. Если он нарвется на старый биос, не поддерживающий это расширение, то в HL вернется признак ошибки 0000, и mount об этом скажет.
Также я обучил mount работать через bdos GETVER, и для microdos он теперь показывает только 2 диска. Проверить я этого пока не могу - нужен патч на микродос.
Второе изменение касается идеи ESL о mount-диске. Я хорошо подумал, и добавил в BIOS еще один диск с параметрами, идентичными рамдиску, и тоже прошитыми в биос намертво. Теперь рамдиск переехал на F, а на E монтируется образ EXRTOOLS.DSK, лежащий в корне карты (ну или прямо в каталоге extrom эмулятора). Расширение DSK я использовал потому, что это совсем не KDI файл. Он не имеет ни инфосектора, ни системных дорожек, а сразу начинается с каталога, и имеет размер 144К. Его параметры, как и для рамдиска, жестко забиты в биос, и перемонтировать его невозможно. Сейчас диск доступен для чтения-записи, в будущем запись надо отключить, во избежании разрушения информации на нем. И сделать через API включение разрешения записи для возможности обновления содержимого диска. На диск можно положить mount, pip, stat, ну и что там еще бывает часто нужно. С микродосом, как я понимаю, такой вариант не пройдет - там невозможно добавить еще один DPB. Там придется или пожертвовать рамдиском, или что-нибудь еще придумать.
Соответственно, контроллер и эмулятор обучены корректно обрабатывать вызовы с DRV=4. Патчи для эмулятора я прикладываю, прошивка контроллера будет завтра - что-то после недельного отдыха мой корвет сглючил, надо его подремонтировать.
ESL. Тебе придется сделать следующие изменения в биосах (в моем биосе все уже изменено, можешь прямо брать оттуда куски кода):
1. Создать таблицу адресов масок, как я в начале написал. У меня в биосе она называется DRVMASKTBL. Для CP/M эти поля физически существуют в блоках DPB. Для микродоса создавай такую же таблицу, но из 2 слов (поскольку в системе только 2 диска), и реально использоваться там будет только слово для B, поскольку А всегда эмулируемый. Оно должно также указывать на адрес байта, в который mount будет записывать маску, а тебе в вызовах READ и WRITE придется ее проверять. И обнулить при старте системы.
2. В вызове SELDSK при C=FE вернуть адрес этой таблицы в HL.
3. В вызове READ и WRITE перенести проверку на рамдиск с DRV==4 на DRV==5. А при 4 принудительно перейти к обработке эмулируемых дисков, поскольку диск E не может быть физическим.
4. Создать в биосе еще одну таблицу DPB, эквивалентную таблице рамдиска. Также создать для этого диска 18-байтовый массив распределения ALV, и головную таблицу DPH, поставив ссылку из нее на DPB и ALV.
5. В таблицу списка устройств DRVTAB внести адрес созданной DPH в позицию E, а то, что там было раньше, перенести на позицию F.
Вот вроде и все. В архиве прикладываю патчи для эмулятора, новый BIOS, новый mount, и EXRTOOLS.DSK - образ диска E. Его надо положить в корень карты, а в эмуляторе - в каталог EXTROM.
Теперь насчет предложения заставить mount проверять наличие контроллера FDC и при его отсутствии не давать монтировать физические диски. Идея отличная. Только, как думаешь, можно ли из прикладной программы срать в порты FDC? Не нарушит ли это работу биоса? Вроде бы не должно. Завтра починю корвет, а потом добавлю это в mount.
Доделал прошивку контроллера. Вроде теперь у меня все.
Теперь очередь ESL доделать загрузчик, и потом надо все это опробовать в работе.
Что-то подзаглохла тема в последнее время. Но вот я малость освободился и вернулся к разработке.
Теперь я дописал 1 часть документации - самую основную. Прикладываю ее сюда - почитайте, может быть, появятся вопросы или замечания. Кроме того, я произвел мелкие доработки системы - прошивки, mount, итд. Чтобы не заниматься каждый раз ерундой с выделением и упаковкой изменившихся файлов, я навел порядок в своем репозитории и открыл туда общий доступ.
https://bitbucket.org/forth32/korvet-extrom
Теперь все изменения будут отражаться там.
Осталось написать еще доку по сборке и отладке системы.
marinovsoft
18.08.2014, 18:36
Прочитал, исправил пару ошибок, выделил пару-тройку предложений желтым цветом.
выделил пару-тройку предложений желтым цветом.
А это что означает, желтый цвет? Вроде предложения как предложения.
marinovsoft
18.08.2014, 19:20
"Существовало 2 варианта поставки Корветов: полноценный ПК8020 и обрезок ПК8010."
Во-первых слово "поставка", в контексте поставки логичнее было бы упомянуть "поставка в составе КУВТ - 1 РМП (ПК 8020) и 10(?) РМУ (ПК 8010)", "поставка для розничного покупателя (ПК 8020)". Если же рассматривать семейство, то машин было больше, судя даже по этому разделу форма.
"Он имеется в большинстве дистрибутивов." Не совсем понятно о каких дистрибутивах речь. Или имеются в виду linux репозитараии?
"...то значит программа изгадила сигнал Control ..." - неблагозвучно :)
Serebriakov
18.08.2014, 19:40
Теперь я дописал 1 часть документации - самую основную.
Круто! Все по полочкам, фактически не о чем теперь и спросить =)
Пошел заказывать ATMega32 =)
Очепятка:
Для ПК8020 конфигурация будет немного другой:
Нужно:
Для ПК8010 конфигурация будет немного другой:
Всем привет !
Опять появилось время заняться проектом !
сейчас перечитаю хвост ветки и отпишусь ;)
---------- Post added at 19:07 ---------- Previous post was at 19:04 ----------
Прочитал, исправил пару ошибок, выделил пару-тройку предложений желтым цветом.
в опеноффисе есть прекрасное средство - комментарии
выделяем текст, потом Insert -> Comment (Ctrl+Alt+C)
справа появляется поля комента, там пишем всё что желаем
сразу видно к какому куску и какое коммент
мало того, комент можно удалить когда он уже не нужен
текст не портится, и легко искать комментарии.
---------- Post added at 19:17 ---------- Previous post was at 19:07 ----------
ну и для изменений - Edit -> Changes -> Record
после этого все изменения будут видны наглядно
их можно принять или отклонить,
В РАЗЫ удобнее
опять же, видно кто и что поправил
"Он имеется в большинстве дистрибутивов." Не совсем понятно о каких дистрибутивах речь. Или имеются в виду linux репозитараии?
Ну да, конечно. Обычно так и говорят всегда. Вообще-то с самого начала подразумевалось, что вся разработка идет на линуксе, я как-то подзабыл про альтернативные ОС.
Дописал на всякий случай в доку инофрмацию об этом. С остальным согласен, исправил. Обновил доку в репозитории, новые версии теперь надо брать оттуда.
ESL, рад тебя видеть. Теперь есть шанс довести разработку до релиза. Я буду писать доку по сборке и отладке, а тебе надо доделать свою часть работы:
- Приделать у биосам в функцию SELECT команду FE.
- добавить в загрузчик патч поддержки инструментального диска E. Там все просто, правда объем добавляемого кода получается приличный.
- сделать образ дефлотного биоса микродоса с уже встроенными драйверами в виде образа 3 системных дрожек, по аналогии с SYSTEM.BIN. Можешь просто выгрузить участок памяти из эмулятора :)
И будем тогда готовить релиз.
ESL, рад тебя видеть. Теперь есть шанс довести разработку до релиза. Я буду писать доку по сборке и отладке, а тебе надо доделать свою часть работы:
Конечно будем доделывать !
Зря я что-ли идею такой штуки года 2 вынашивал. (Раскопка EXTROM, Mode2, 256b stage1, A0 toggle, Patcher)
Только без Тебя бы еше два раза по столько лет "собирался" !
А ты раз - и сделал !
Теперь совесть не позволит бросать на самом интересном месте.
а по теме, а из под винды можно отфарматировать флешку чтоб его extrom опознал ?
а то есть подозрение что винда всегда делает MBR ??
а так как таких извращенцев как мы с линксом не так много, есть шанс поиметь проблеммы с потенциальными потребителями ?
---------- Post added at 22:35 ---------- Previous post was at 22:30 ----------
И поддержку SDHC было бы неплохо таки добавть
Причина опять-же прозаичесская, ворос не в размере а в доступности не HC карт.
Я пробовал найти не HC карту в продаже - уже найти невозможно
Свою реально откопал только в "закромах родины"
Т.е. по факту это сильно усложнит жизнь человеку которые хочет повторить.
---------- Post added at 22:39 ---------- Previous post was at 22:35 ----------
- добавить в загрузчик патч поддержки инструментального диска E. Там все просто, правда объем добавляемого кода получается приличный.
вот вот :(
это сильно смущает.
имхо диск E надо оставить диском E, чтоб было "как раньше"
да и мало ли где вылезет ?
а инструментальный добавть как F
по поводу патчера -
пихать еще один диск в "резидент" - ой как не хочется
тебе проще, просто добавил в исходник ;)
пока у меня желание попробовать свою идею с перезаписью по кнопке рамдиска
там кода по идее мало.
Конечно будем доделывать !
а по теме, а из под винды можно отфарматировать флешку чтоб его extrom опознал ?
а то есть подозрение что винда всегда делает MBR ??
Я, вообщем-то, без понятия, как это делают в винде - тут тебе виднее. Но все новые флешки, с завода, идут как раз без MBR. Есть подозрение, что именно винда их такими и делает. Но ты, если у тебя есть винда, можешь проверить.
На крайний случай, в драйвере Vinxfs имеется рудиментарный поиск начала раздела FS, так что и с MBR по идее будет более-менее работать. Только поиск этот реализован несколько кривовато.
И поддержку SDHC было бы неплохо таки добавть
Причина опять-же прозаичесская, ворос не в размере а в доступности не HC карт.
Я пробовал найти не HC карту в продаже - уже найти невозможно
Да ладно тебе, полно в продаже карт на 2 гига - они все не-HC. Я, когда был в Белгороде, под настроение накупил их штук 5 разных, про запас.
Конечно, можно сделать HC, но тогда потеряется возможность работы с не-HC. А сделать универсальный, причем надежный драйвер - это задачка еще та. Ладно, тут подумать надо. Может быть, что-нибудь и получится.
это сильно смущает.
имхо диск E надо оставить диском E, чтоб было "как раньше"
да и мало ли где вылезет ?
а инструментальный добавть как F
Дело в том, что при написании драйверов и обслуживающих программ, удобнее, когда эмулируемые диски идут последовательно, без разрыва. Ведь с точки зрения контроллера, инструментальный диск имеет номер 4, а не 5. Если его сделать F, тогда в куче мест драйвера придется делать пребразование номера диска 5 в 4 с риском где-нибудь допустить коварную ошибку. Я долго думал и решил, что оно того не стоит - ну не представляю я себе программу, жестко привязанную к диску Е. А если такая и надйется - ну так просто обломится при попытке записи, поскольку диск предусмотрительно защищен.
Давай пока оставим так, а потом, если уж совсем будет напрягать, тогда и подумаем что делать.
по поводу патчера -
пихать еще один диск в "резидент" - ой как не хочется
тебе проще, просто добавил в исходник ;)
Да ладно тебе. Ты попробуй - там же все очень просто. В загрузчике заранее готовишь блок, состоящий из DPH+DPB, вписываешь его на свободное место памяти и ссылки туда ставишь из таблицы DRVTAB. Ты же там, в патчере, уже почти реализовал скриптовый язык перемещающей загрузки - так что никаких проблем вылезти не должно.
пока у меня желание попробовать свою идею с перезаписью по кнопке рамдиска
там кода по идее мало.
Да пробуй, конечно, только кода там будет не меньше, а даже больше, если считать именно код, а не статические структуры данных. Плюс, такое решение выглядит как костыль - все графические программы будут затирать диск, и придется его кнопками восстанавливать после каждого выхода в командную строку. Причем вначале инициализировать рамдиск для записи на него пустого каталога, а потом уже писать туда файл. А на машинах с 48К ГЗУ, коих бльшинство, этот диск выглядит вообще ущербным.
Ну и, потом, где ты собрался брать образ mount.com и как записывать этот файл на рамдиск? Формально, ты не можешь из биоса делать вызов BDOS - это нарушает иерархию системы, поскольку BIOS находится ниже BDOS и ничего не знает о файлах. Это все равно как дисковый драйвер линукса (типа SD или SR) полез бы на диск за файлами :)
В результате BDOS, в свою очередь, опять вызовет BIOS для доступа к диску, а BIOS не реентерабелен, и тут могут вылезти странные и неуловимые глюки, например со стеком биоса.
Так что ты еще раз хорошо подумай над этой идеей - может ну его нафиг?
Перечитал доки, воскресил в памяти
добавлю в stage2 текущие маунты, чтоб при старте на экран выводились
попробовал сделать тебе pull request (первый раз в жизни)
там доки
их бы в каком-нибудь markodwn бы, чтоб хистори была нормальная ;)
---------- Post added at 23:13 ---------- Previous post was at 23:12 ----------
Да ладно тебе. Ты попробуй - там же все очень просто. В загрузчике заранее готовишь блок, состоящий из DPH+DPB, вписываешь его на свободное место памяти и ссылки туда ставишь из таблицы DRVTAB. Ты же там, в патчере, уже почти реализовал скриптовый язык перемещающей загрузки - так что никаких проблем вылезти не должно.
ломает искать всё эти адреса для всех биосов 8-)
и похоже надо будет чуть в разные места для разных биосов это пихать.
---------- Post added at 23:15 ---------- Previous post was at 23:13 ----------
Да пробуй, конечно, только кода там будет не меньше, а даже больше, если считать именно код, а не статические структуры данных. Плюс, такое решение выглядит как костыль - все графические программы будут затирать диск, и придется его кнопками восстанавливать после каждого выхода в командную строку. Причем вначале инициализировать рамдиск для записи на него пустого каталога, а потом уже писать туда файл. А на машинах с 48К ГЗУ, коих бльшинство, этот диск выглядит вообще ущербным.
ну и бог с ним что затирают, не страшно
да и делать это надо не каждый раз а когда нужен mount&co
в 48к должно влезть всё "самое нужное"
---------- Post added at 23:17 ---------- Previous post was at 23:15 ----------
Ну и, потом, где ты собрался брать образ mount.com и как записывать этот файл на рамдиск? Формально, ты не можешь из биоса делать вызов BDOS - это нарушает иерархию системы, поскольку BIOS находится ниже BDOS и ничего не знает о файлах. Это все равно как дисковый драйвер линукса (типа SD или SR) полез бы на диск за файлами :)
В результате BDOS, в свою очередь, опять вызовет BIOS для доступа к диску, а BIOS не реентерабелен, и тут могут вылезти странные и неуловимые глюки, например со стеком биоса.
Так что ты еще раз хорошо подумай над этой идеей - может ну его нафиг?
а зачем пофайлово ;)
тупо посекторное копирование с твоего DRIVE=4 в рамдиск
там прилитит всё сразу, вместе со структурой директории.
там кода - кот наплакал.
SaintTurnip
27.08.2014, 00:58
esl, forth, очень здорово, что у вас хватило энтузиазма, чтобы не бросить :)
Разгреб свои дела, попробую теперь найти Корвет 8010, рабочий, белый , с перламутровыми клавишами.
Forth32, напомни прав ли я?
Тут приделывают к stage2 инфу про замапленые диски
Вот задумался, выводить все 4 - смысла нет
По идее
При 8020 вывод маппинг а и б а для ц и д замапленые на реальные
Для 8010 выводим все 4
Для микродоса только 2
Правильно?
Вообщем да, все правильно - для CP/M 8020 эмулируется по умлчанию 2 диска, для 8010 - 4, для микродоса - 2. Вобще-то, правильнее было бы и для 8020 отобразить информацию от том, что диски C и D отображены на реальные дисководы. Но можно и обойтись.
Значит, приделать инструментальный диск к биосам тебе неохота? Ну, ладно, пока отложим. Доделывай свой загрузчик, а диск E я потом, пожалуй, и сам приделаю. Как найти поле DRVTAB в разных биосах - я знаю :) Но вначале закончу с доками.
Кстати, что ты там насчет белого фона писал? У меня он и так белый, на всех либреофисах, какие у меня есть на разных машинах.
Вобще-то, правильнее было бы и для 8020 отобразить информацию от том, что диски C и D отображены на реальные дисководы. Но можно и обойтись.
так и хочу, чтоб пользователь видел что сейчас сейчас куда подключено.
---------- Post added at 23:29 ---------- Previous post was at 23:27 ----------
Значит, приделать инструментальный диск к биосам тебе неохота? Ну, ладно, пока отложим. Доделывай свой загрузчик, а диск E я потом, пожалуй, и сам приделаю.
не то чтобы не хочу,
просто очень хочется оставить диск E диском Е
пока буду пробовать оба варианта
просто не охота сильно патчеры усложнять :(
тем более по патчеру тоже доку надо бы написать, чтобы если кто вдруг захочет продолжить ;)
---------- Post added at 23:32 ---------- Previous post was at 23:29 ----------
Кстати, что ты там насчет белого фона писал? У меня он и так белый, на всех либреофисах, какие у меня есть на разных машинах.
про фон на схеме (та что в PNG)
там бы еще поля обрезать ...
и я тебе там pullrequest прислал, видел ?
не то чтобы не хочу,
просто очень хочется оставить диск E диском Е
Я, вообщем-то, так и не понял, какой в этом смысл. Ну не представляю себе программу, жестко привязанную к диску Е. Тем более на машинах с 48к гзу это вообще не диск, а убогий огрызок.
Например, в клиентской части CP/N-90 этот диск спокойно переехал на F, а на E там эмулируемый сетевой диск, и все работает.
тем более по патчеру тоже доку надо бы написать, чтобы если кто вдруг захочет продолжить ;)
Это точно. Тебе придется описать и внутреннюю структуру твоей программы, и устройство базы сигнатур, и как добавлять в нее новые биосы. Да еще и на понятном нормальному человеку языке. Дело не особо интересное, но необходимое. А я пока доку по железу сделаю.
про фон на схеме (та что в PNG)
там бы еще поля обрезать ...
Вообще-то фон там вроде бы и так белый. Я вообще не помню, чтобы при экспорте картинки можно было его задавать. Там только 2 цветовые схемы - светлая и темная. Правильнее было бы поставить gEDA и печатать схему оттуда, в режиме векторной графики.
и я тебе там pullrequest прислал, видел ?
А откуда бы я про цвет фона узнал? Правда, о самом пуллреквесте я узнал только отсюда :) Я на сайт не хожу, и git log не смотрю, поскольку и так знаю, где что поменялось :) Теперь буду поглядывать.
Я, вообщем-то, так и не понял, какой в этом смысл. Ну не представляю себе программу, жестко привязанную к диску Е. Тем более на машинах с 48к гзу это вообще не диск, а убогий огрызок.
Например, в клиентской части CP/N-90 этот диск спокойно переехал на F, а на E там эмулируемый сетевой диск, и все работает.
для "целостности" впечалений,
чтобы "было как тогда"
это в основном.
про программы - в целом верно, но а вруг ?
48к всё равно использовали, можно было туда кое-что временно сбрасывать.
Игрался тут с апи в эмуляторе, возник вопрос про 0x84/0x87 получить список ...
Она отдает цепочку строк размером 14 байт для каждого из имеющихся файлов.
Признаком конца цепочи является байт 00 (строки имен файлов не могут начинаться с 00).
последняя посылка из 1го 0 или из 14 нулей ?
я ожидал что из 14
а в эмуляторе похоже из 1го
и на закуску, может тебе понравится
в атаче образ, подключи его с extrom
там demo.com
комманды
mount
dirs
images
fyi
последняя посылка из 1го 0 или из 14 нулей ?
я ожидал что из 14
а в эмуляторе похоже из 1го
Да нет, так и задумано - отдается именно 1 ноль, а не 14. И в прошивке, и в эмуляторе так сделать проще - вернуть однин ноль, а не формировать буфер из 14 нулей. Соответственно, тебе вначале нужно прочитать 1 байт ответа, и если там не 0, то дочитать остальные 13. Может быть, это не совсем логично, но так уж исторически сложилось - такой протокол я использовал в другой своей разработке, и по привычке сделал так и здесь.
и на закуску, может тебе понравится
в атаче образ, подключи его с extrom
там demo.com
Что, не поленился к форту поддержку дописать? :) У меня тоже есть похожая вещь, использовал ее при разработке и отладке API - API Tester, для передачи команд в контроллер. Только я думал, что кроме меня это никому не интересно. Форт ныне совсем забыт, и знающих его остались единицы.
Был бы в этом форте компилятор, тот же mount можно было бы целикм на нем сделать. получилось бы гораздо быстрее и компактнее, чем на С. Правда, разобраться в такой программе сможет далеко не каждый :)
К сожалению, по этому форту даже доки нормальной нет.
Да нет, так и задумано - отдается именно 1 ноль, а не 14. И в прошивке, и в эмуляторе так сделать проще - вернуть однин ноль, а не формировать буфер из 14 нулей. Соответственно, тебе вначале нужно прочитать 1 байт ответа, и если там не 0, то дочитать остальные 13. Может быть, это не совсем логично, но так уж исторически сложилось - такой протокол я использовал в другой своей разработке, и по привычке сделал так и здесь.
тогда это надо более чётко в документации оговорить, а то я не понял
хотя имхо - правильнее было бы отдать 14 байт 0
имхо было бы более единообразно ;)
---------- Post added at 11:32 ---------- Previous post was at 11:09 ----------
Что, не поленился к форту поддержку дописать? :) У меня тоже есть похожая вещь, использовал ее при разработке и отладке API - API Tester, для передачи команд в контроллер.
ух ты, было бы прикольно посмотреть ;)
Только я думал, что кроме меня это никому не интересно. Форт ныне совсем забыт, и знающих его остались единицы.
Твой ник как-бы намекает, я надеялся что угадал ;)
давным давно использовал forth32 на пц ;)
остались на удивление приятное послевкусие
решил попробовать ...
ибо твой подвиг с C80 - это не про меня ;)
Правда, разобраться в такой программе сможет далеко не каждый :)
с одной стороны - да
с другой - это всё just for fun
а такие мелочи и есть fun ;)
тем более уже есть C версия, так что ...
Был бы в этом форте компилятор, тот же mount можно было бы целикм на нем сделать. получилось бы гораздо быстрее и компактнее, чем на С.
К сожалению, по этому форту даже доки нормальной нет.
у меня есть бумажная книжка по форту из комплекта, (я постил тут фото обложки)
НО
это не продукт :(
это ПОДЕЛКА
очень похоже что его тоже сделали сильно для галочки, ибо он неюзабельный
по РМП форту есть только основная дока (да и то такая ..., в описнии слов не хватает букв, просто дырки)
исходники только в блоках
нет генерации системы (хотя упоминается)
РМУ форт - вообще песня
сидит в памяти выше ПЗУ, блоки - отжирают память
запись/чтение по сети выполняется методом записи в почтовый ящик строки
типа "область памяти с AAAA-BBBB"
правда единственная прога которая использует F3+reset
переход по ресету на свой код
т.е. warmstart прямо в форт.
может она для него и делалась
-----------
а я игрался не с ним, я игрался с DX-FORTH 4.05 (http://www.netbay.com.au/~dxforth/#dxforth)
DX-Forth v4.05 - Forth compiler for CP/M-80 (2014-07-19)
DX-Forth for CP/M-80 2.x or 3.x. Requires an 8080 or compatible CPU.
очень забавная штука, с докуметацией и полными исходниками
и доступным автором и датой последнего обновления 2014-07-19
самое для меня приятное оказалось
работа с текстовыми файлами .f (с инклудами)
генерация финального приложения (TURNKEY WORD FILENAME)
stub size ~ 7k
т.е писать можно в любимом редакторе на ПЦ
далее батником заосвываем исходники в KDI и запускаем эмулятор
далее на F5 вешаем текст (
"
C:
FORTH - INCLUDE MAIN
"
и после старта (+F6) получаем всё загруженное
прям на диске есть E, можно прямо проверить если что надо не выходя из эмулятора
---------- Post added at 11:37 ---------- Previous post was at 11:32 ----------
в детсве знакомый дал "Язык Форт и его реализации. С.Н. Баранов, Н.Р. Ноздрунов. Лениград, "Машиностроение" Ленинградское отделение, 1988."
тогда почитал, зацепило, но пощупать было негде
вторая итерация была на ПЦ,
ASTRO-FORTH (приходилось сидеть долго за поисками 1, он там единственный из доступных языков нормально работал)
потом
GP-FORTH/small32 - великая штука
там даже немного пописал тогда
и вот опять ;)
ух ты, было бы прикольно посмотреть ;)
Да там смотреть особо нечего - набор слов для отсылки команд и приема блоков данных. У тебя это все есть в твоем форте.
Но если интересно - могу вылжить. Только несколько позже - эти материалы у меня на даче остались. Если еще не потер за ненадбностью...
у меня есть бумажная книжка по форту из комплекта, (я постил тут фото обложки)
А поделиться? Я же там смысл слов буквально наощупь разбирал.
а я игрался не с ним, я игрался с DX-FORTH 4.05 (http://www.netbay.com.au/~dxforth/#dxforth)
Я знаю этот форт в ДОС-версии. Насчет CP/M - я всегда был уверен, что ему нужен Z-80. Ну коли не нужен - надо будет на него посмотреть.
генерация финального приложения (TURNKEY WORD FILENAME)
stub size ~ 7k
Вот это самое важное. Можно попробовать полный mount на нем написать. Может, получится компактее сишной версии с ее монстроподобным libc.
Появилось ряда вопросов/предложений по апи
1) Список файлов сейчас отдает все файлы из директории, обрезая их по длинне 14 символов
в теории это может вызвать проблеммы, типа файл есть а смонтировать нельзя
14 символов не так уж и много, сейчас народ привык называть "длинно""
предложение
в списке файлов выдавать только имена (без расширений) .KDI/.kdi
с одной стороны это не сильно усложнит со стороны апи
с другой уберёт мусор из списка файлов
ну и чуть более длинные имена можно использовать.
2) теоритичесская грабля с "русскими" именами файлов.
для V 1.0 это можно явно оговорить, явно написав что поддержка только eng имён файлов.
а в далёкой перспективе - сделать перекодировку имён в КОИ8.
---------- Post added at 10:56 ---------- Previous post was at 10:53 ----------
А поделиться? Я же там смысл слов буквально наощупь разбирал.
она бумажная :(
даже не собирался сканить,
но теперь запланирую, но она не ахти, прям скажем.
---------- Post added at 11:03 ---------- Previous post was at 10:56 ----------
Вот это самое важное. Можно попробовать полный mount на нем написать. Может, получится компактее сишной версии с ее монстроподобным libc.
дык это и была одна из основный причин, наряду с исходниками и достаточно удобным получившимся "техпроцессом"
приделал тут syntax highlight для sublime text,
очень даже стало
https://dl.dropboxusercontent.com/u/490774/Korvet/sublime-forth.png
Появилось ряда вопросов/предложений по апи
1) Список файлов сейчас отдает все файлы из директории, обрезая их по длинне 14 символов
в теории это может вызвать проблеммы, типа файл есть а смонтировать нельзя
14 символов не так уж и много, сейчас народ привык называть "длинно""
Дело в том, что здесь используется досовый вариант FAT, без LFN-расширений. То есть 8.3, и никаких русских букв. Это, собственно, проблема самого драйвера VinxFS - там хоть и попытались реализовать поддержку LFN, но криво и совершенно неюзабельно - нехватает RAM и начинаются случайные подвисания контроллера. Соотвественно, 14 байтов - это даже с запасом, на самом деле там надо всего 13 байт :)
По мне так вполне нормально. Сам CP/M ведь длинные русские имена файлов не поддерживает, и никто не возмущается. Надо будет в доке этот момент особо подчеркнуть.
Насчет не выводить расширение в списке файлов - по идее все правильно, но не совсем. Тогда надо, чтобы контроллер при чтении каталога пропускал файлы с расширением не-KDI. Сейчас можно примонтировать файл с любым расширением - DSK, IMG, BIN, да что угодно. Просто расширение KDI подставляется по умолчанию, если явно не задано в командной строке mount. Ведь монтировать можно не только корветовские образы, но и любые образы CP/M дисков, например орионовские ODI. Их внутренняя организвция целиком определяется инфосектором.
про 8.3 я не подумал, отвык уже от него
точно надо оговаривать в доке !.
Доделал черновой вариант доки по железу - выкладываю здесь. Почитайте, может быть какие вопросы и замечания появятся. Исходник .odt, если кому надо, лежит в репозитории https://bitbucket.org/forth32/korvet-extrom
Вроде бы пакет докумнтации готов. Схему я тоже привел в порядок - можно взять в том же репозитории.
правильно ли я понял что
85 — Получить имя текущего каталога
Если бы все образы дисков сваливались в корень карты, то там быстро наступил бы бардак, в котором практичсески невозможно найти нужный образ. Поэтому контроллер дает возможность разложить файлы в несколько каталогов, создаваемых в корне карты. Глубина вложенности каталогов — 1, то есть каталог внутри каталога создавать нельзя, контроллер его не увидит. Команда 85 возвращает имя текущего каталога, того, в котором контроллер будет искать вновь монтируемые образы дисков. После ввода команды контроллер отвечает 1 (ОК) и передает 14-байтовый буфер с именем каталога.
и
86 — Установить каталог по умолчанию
Эта команда устанавливает каталог по умолчанию. После ее выполнения все вновь монтируемые образы дисков контроллер будет искать именно в этом каталоге. Если параметр SEC=0, то текущий каталог устанавливается временно, до выключения питания или перезагрузки. При SEC=1 текущий каталог записывается в файл конфигурации MOUNT.CFG и будет сохранен после перезагрузки. После ввода команды контроллер отвечает 1 (ОК) и принимает 14-байтовый буфер с именем каталога. Если указанный каталог не существует на карте, то назначение не выполняется — сохраняется прежний каталог по умолчанию. Это можно проверить с помощью команды 85.
тогда 86 должен называться "Установить текущего каталога" ?
тогда 86 должен называться "Установить текущего каталога" ?
Ну вообщем да, так наверное логичнее ее называть.
посмотри демо
из асм слов только работа с get/put byte
вызов - T
можно повторно много раз позапускать
он там сохраняет выделяет текущее ...
посмотри демо
Решил графический mount сделать? Тоже неплохо, тут кто-то как раз такую хотелку высказывал.
Это все конечно хорошо, но когда ты все же загрузчик доделаешь? :)
Решил графический mount сделать? Тоже неплохо, тут кто-то как раз такую хотелку высказывал.
Это все конечно хорошо, но когда ты все же загрузчик доделаешь? :)
так я и хотел ;)
загрузчик - в ближайшее время,
собственно GUI для тестирования mount related featurees ;)
не очень удобно тестировать без хистори и автодолнения.
О, так ты собрался переписать загрузчик на форте? Вот это ты шикарно придумал. Представляю себе базу биосов в виде набора патчащих слов.
Кстати, загрузчик FreeBSD тоже целиком на форте написан.
Пока такай мысли небыло
Я не настолько хорошо на форте пишу
Хотя идея - заманчивая
Можно для в2 оставить
В теории там всё должно быть просто надо подумать
forth32,
обнаружил тут
если собрать эмулятор с -O то он падает в модуле extrom
если всё кроме него собрать с O3 а его без -O то всё работает.
CFLAGS = -O3 -g -MMD -fomit-frame-pointer -funroll-loops -Isrc
esl@esl-hp:~/Dropbox/Emulator/Korvet/korvet-pk8020-emulator$ ./kdbg -e extrom/ 1>z
*** buffer overflow detected ***: ./kdbg terminated
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x73e0f)[0x7f53664b4e0f]
/lib/x86_64-linux-gnu/libc.so.6(__fortify_fail+0x5c)[0x7f536654c7dc]
/lib/x86_64-linux-gnu/libc.so.6(+0x10a6a0)[0x7f536654b6a0]
/lib/x86_64-linux-gnu/libc.so.6(__fread_chk+0x13c)[0x7f536654bd7c]
./kdbg[0x41a80a]
./kdbg[0x40ee89]
./kdbg[0x40a39d]
./kdbg[0x4030eb]
./kdbg[0x402be2]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf5)[0x7f5366462ec5]
./kdbg[0x402c63]
======= Memory map: ========
00400000-0042f000 r-xp 00000000 08:15 658502 /home/esl/Dropbox/Emulator/Korvet/korvet-pk8020-emulator/kdbg
0062e000-0062f000 r--p 0002e000 08:15 658502 /home/esl/Dropbox/Emulator/Korvet/korvet-pk8020-emulator/kdbg
0062f000-0063e000 rw-p 0002f000 08:15 658502 /home/esl/Dropbox/Emulator/Korvet/korvet-pk8020-emulator/kdbg
....
7f5366d42000-7f5366d43000 rw-p 00000000 00:00 0
7fff94792000-7fff947b3000 rw-p 00000000 00:00 0 [stack]
7fff947b9000-7fff947bb000 r-xp 00000000 00:00 0 [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
Shutting down Allegro due to signal #6
Aborted
Я это еще пару месяцев назад заметил. Только разбираться не было никакого желания - типа работет и ладно. Это же все временный код, нужен только для отладки проекта. Сама по себе эмуляция extrom практической пользы не имеет ни для кого, кроме разработчиков, то есть нас с тобой.
Хотя, с другой стороны, подключение образов командой mount всяко удобнее, чем перезапуск эмулятора с указанием новых образов в командной строке. Так что, пожалуй, стоит разобраться, в чем там дело.
CodeMaster
10.09.2014, 08:21
Схему я тоже привел в порядок - можно взять в том же репозитории.
А можно её в pdf добавить? А то лазить, искать её на сайте...
Serebriakov
10.09.2014, 14:51
А что ее там искать? (https://bytebucket.org/forth32/korvet-extrom/raw/1d1df3c65817b0d4e28d1647a102190347f1f89a/sch/extrom-controller.png)
Репозиторий хорошо структирирован: https://bitbucket.org/forth32/korvet-extrom
CodeMaster
10.09.2014, 16:46
А что ее там искать?
То что она в другом месте, а так качнул один файл, всё под рукой - удобно.
очередное "демо"
уже немного похоже на "выбиралку"
пока ее отложу и займусь биосами,
приделаю таблички для mount
То что она в другом месте, а так качнул один файл, всё под рукой - удобно.
У меня есть свои причины не включать схему в доку. Дело в том, что исходник схемы - это SCH-файл, а PNG получается их него экспортом картинки в gEDA. Если я включу схему в доку, то каждый раз при изменении схемы мне придется импортировать картинку в доку заново, что крайне неудобно.
Тот файл с докой, что я клал сюда - это черновик, настоящий ODT также лежит в репозитрии, рядом со схемой. Предполагается, что к релизу все это будет упаковано в единый архив. А репозиторий, как правило, никто не вычитывает с сайта по одному файлу, а забирают себе целиком командой git clone.
forth32,
попалось такое
The hardware interface to the SD card should not use a resistor based
level shifter. SdFat sets the SPI bus frequency to 8 MHz which results
in signal rise times that are too slow for the edge detectors in many
newer SD card controllers when resistor voltage dividers are used.
The 5 to 3.3 V level shifter for 5 V arduinos should be IC based like
the 74HC4050N based circuit shown in the file SdLevel.png. The
Adafruit Wave Shield uses a 74AHC125N. Gravitech sells SD and MicroSD
Card Adapters based on the 74LCX245.
схема (https://github.com/greiman/SdFat-beta/blob/master/SdLevel.png)
https://github.com/greiman/SdFat-beta
вроде оно копеечное, может стоит сразу поставить для надёжности ?
поключил SD шилд к ардуине, залил скетч, запустил
SDHC c fat32 он опознал и выдал директорию.
(Binary sketch size: 11,804 bytes (of a 32,256 byte maximum))
выдача директории рекурсивно.
---------- Post added at 00:45 ---------- Previous post was at 00:25 ----------
sdfat
init time: 339 ms
Card type: SDHC
Manufacturer ID: 0X74
OEM ID: JE
Product: SDC
Version: 0.2
Serial number: 0XFF5F20E6
Manufacturing date: 1/2013
cardSize: 15811.48 MB (MB = 1,000,000 bytes)
flashEraseSize: 128 blocks
eraseSingleBlock: true
SD Partition Table
part,boot,type,start,length
1,0X0,0XC,8192,30873600
2,0X0,0X0,0,0
3,0X0,0X0,0,0
4,0X0,0X0,0,0
Volume is FAT32
blocksPerCluster: 64
clusterCount: 482272
init time: 787 ms
Card type: SD1
Manufacturer ID: 0X2
OEM ID: TM
Product: SD256
Version: 0.13
Serial number: 0X2B3C9B79
Manufacturing date: 12/2004
cardSize: 255.07 MB (MB = 1,000,000 bytes)
flashEraseSize: 128 blocks
eraseSingleBlock: true
SD Partition Table
part,boot,type,start,length
1,0X0,0XE,63,498113
2,0X0,0X0,0,0
3,0X0,0X0,0,0
4,0X0,0X0,0,0
Volume is FAT16
blocksPerCluster: 8
clusterCount: 62198
freeClusters: 61357
freeSpace: 251.32 MB (MB = 1,000,000 bytes)
fatStartBlock: 64
fatCount: 2
blocksPerFat: 248
rootDirStart: 560
dataStartBlock: 592
Data area is not aligned on flash erase boundaries!
Download and use formatter from www.sdcard.org/consumer!
---------- Post added at 00:47 ---------- Previous post was at 00:45 ----------
забавная фраза Data area is not aligned on flash erase boundaries!
после пары месяцев паузы :(
полез править исходники патчера под новые реалии
блин, всё из памяти вылетело,
убил вечер на борьбу с тем что в одном "биосе" исправил и он работал, а всё остальные не работали
долго бился....
буду писать "самодоку" для начала, а то уже тяжко.
переделываю чтоб исходники биос специфик данных для патчеров генерились из таблички
т.е. один "темплейт" с детальными комментариями что и откуда берется (30к однако) и табличка с данными для биосов
а то менять это кучу каждый раз руками - утомителяло
cp/m уже работает,
остались микродосы и unsupported.
после этого причешу код "резидентов" и займусь новыми фичами
а то без генератора трогать резидент - страшно, это же каждый чих править в 13 файлах синхронно ...
p.s. прикольный размер файла получился
extrom-patcher-template-cpm.asm│ 30000│Oct 15 00:36
patcher-data-cpm.csv │ 3115│Oct 14 16:52
а на выходе
include-patcher.asm │ 1210│Oct 15 00:36
patcher-cpm-12_87_09_NIIJAF.asm │ 1250│Oct 15 00:36
patcher-cpm-12_87_11_niijaf.asm │ 1250│Oct 15 00:36
patcher-cpm-12_88_3_alternativa.asm│ 1332│Oct 15 00:36
patcher-cpm-12_88_3_niijaf.asm │ 1243│Oct 15 00:36
patcher-cpm-12_90_5_kontur.asm │ 1243│Oct 15 00:36
patcher-cpm-1x_88_EPSON_V104.asm │ 1260│Oct 15 00:36
patcher-cpm-1x_89_03_30_RAVI.asm │ 1260│Oct 15 00:36
patcher-cpm-20_88___miks.asm │ 1239│Oct 15 00:36
patcher-cpm-21_89_2_niijaf.asm │ 1243│Oct 15 00:36
patcher-cpm-21_89_2_niijaf2.asm │ 1245│Oct 15 00:36
patcher-cpm-21_89___wiza.asm │ 29693│Oct 15 00:36
patcher-cpm-21_91___LAP.asm │ 1237│Oct 15 00:36
patcher-cpm-21m_____Shkanov.asm │ 1245│Oct 15 00:36
для patcher-cpm-21_89___wiza.asm размер больше т.к. темплейт с примерами для этого биоса
а для остальных все коменты выкинуты.
Powered by vBulletin® Version 4.2.5 Copyright © 2026 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot