PDA

Просмотр полной версии : Восстановление Специалистов.



vinxru
27.12.2012, 16:48
Syscat мне прислал две платы Специалистов (ПК "ЛИНЁВСКИЙ"). Надо их привести в красивый вид, допаять и запустить.

Но на платах творится какой то ужас. Как вы думаете, может стоит попытаться их разобрать с помощью фена и заново впаять каждую микросхему?

Или плата не переживет распайки? Отвалятся дорожки, а текстолит расслоится. Или стоит просто запустить их, оставив этот ужас?

http://s56.radikal.ru/i152/1212/31/fc92a8942a1et.jpg (http://radikal.ru/F/s56.radikal.ru/i152/1212/31/fc92a8942a1e.jpg)

http://s017.radikal.ru/i411/1212/b4/b3c17231d6c5t.jpg (http://radikal.ru/F/s017.radikal.ru/i411/1212/b4/b3c17231d6c5.jpg)

И вообще, накой столько МГТФ-а ?!

На сайте http://www.spetsialist-mx.ru/index14.html такой же ужас

http://www.spetsialist-mx.ru/images/Linevski0.png

P.S. Делать это буду после завершения Цветных Линий и платы для Ориона.

---------- Post added at 15:48 ---------- Previous post was at 15:11 ----------

Пофиг, единственный способ узнать, это рискнуть.

Cat_Alex/QRP
27.12.2012, 17:19
В принципе можно,но не советую

vinxru
27.12.2012, 17:25
Распял. Все ок. Остальное паяльником по вытаскиваю.

http://s017.radikal.ru/i442/1212/e7/361d70faec88t.jpg (http://radikal.ru/F/s017.radikal.ru/i442/1212/e7/361d70faec88.jpg)

http://s020.radikal.ru/i711/1212/08/176d2d859f61t.jpg (http://radikal.ru/F/s020.radikal.ru/i711/1212/08/176d2d859f61.jpg)

Походу владелец канифоль смывал одеколоном. Аромат еще тот стоит.

Terazini
27.12.2012, 22:52
судя по количеству мгтфа, проще будет тот же экспресс сделать на макете.

vinxru
27.12.2012, 23:27
Там что то было собрано дополнительно. На ум приходит только контроллер цвета и программатор. Но контроллер цвета требует всего 3 микросхемы ОЗУ, а там их 8 штук запаяно было.

Но платы были после вандалов. Выкушены КМ-ки, разъемы, оборваны провода.

HardWareMan
28.12.2012, 02:21
Если добавочных микросхем было 8 и все микросхемы были РУ5, то вероятно это был МХ мод. Но я помню обсуждение, где мелькала похожая плата, и в ней стояли РУ6, поэтому там так много места под память.

bigral
28.12.2012, 03:09
Мда, Геракл! Я бы не решился на такую "реставрацию", когда-то у меня был профи версии 3.2(?) его мне мой друг отдал в таком же примерно состояниию.Так вот я когда его увидел думал что это токо на стенку повесить для создания локальной кунст-камеры, НО!!! Потом выяснилось что заработал этот комп при минимальных доработках и хотя выглядел как зомби работал без сбоев, и потом кому-то его передал и он продолжал еще работать и работать.

ВЫВОД: совcем не обязательно страшный внешний вид влияет на устойчивость работы, нужно просто следить чтоб каждый провод четко был припаян, надежно и как токо где-то отклеилась дорожка нужно менять сразу на надежный МГТФ проводник. Никаких повисших проводов тоже допускать нельзя. Ну и конечно никаких проводов кроме как МГТФ не применять.

То что плата была распаяна я считаю ошибкой, нужно было всего навсего поубирать ненадежные панельки и проводники, теперь же дорожки после ненужного дополнительного перегрева могут просто отпадать и трескаться.

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

vinxru
28.12.2012, 11:48
Второй я распаивать не буду. Там вроде все нормально.

Дополнительная панелька припаяна параллельно основному ПЗУ. И еще добавлена 555ЛА1.

---------- Post added at 10:36 ---------- Previous post was at 09:42 ----------

Полностью очистил плату. Зацените.

http://s09.radikal.ru/i182/1212/d0/4246e4c58783t.jpg (http://radikal.ru/F/s09.radikal.ru/i182/1212/d0/4246e4c58783.jpg)

http://s017.radikal.ru/i440/1212/27/03582c79abe7t.jpg (http://radikal.ru/F/s017.radikal.ru/i440/1212/27/03582c79abe7.jpg)

Прошлый владелец дофига дорожек перезал, я восстановлю нужные по схеме Специалиста.

Потом воткну туда контроллер PS/2 клавиатуры на одной Atmega8.

---------- Post added at 10:48 ---------- Previous post was at 10:36 ----------

Пострадали только черные разъемы.

fifan
28.12.2012, 19:19
судя по количеству мгтфа, проще будет тот же экспресс сделать на макете.
Конечно проще. Можно заказать Экспресс печатки сделать - я восстановил по шаблонам - у меня есть гербер файлы.


Потом воткну туда контроллер PS/2 клавиатуры на одной Atmega8.
Вау! Уже есть контроллер? Или только планы? Пока ни схемы ни рабочего экземпляра не встречал.
HardWareMan, ты удивлён? Или ты уже что-то там придумал?

vinxru
28.12.2012, 20:12
Я немного изменю контроллер для Ориона. Это одна ATMega8. И возможно кварц. Я уже все обдумал, там лишь десяток строк программы отличается.

Только у Специалиста 12 линий клавиатуры, все возможные комбинации рассчитать не хватит ОЗУ. Поэтому я рассчитаю две таблицы на первые 8 линий и 4 последних линии. И буду их комбинировать в обработчике прерывания.

PORTC = data1[PINB] & data2[PIND & 0x33];

Я за одно в контроллере для Ориона недочеты поправлю. Там кнопки иногда залипают. Я подозреваю, что это из за постоянного переключения приема-передачи. Таким макаром я прошу клавиатуру повременить с передачей, программа еще не готова. И видимо что то теряется.

Теперь же я буду переключаться в режим передачи лишь когда буду светодиодом мигать. (Раскладки QWERT, JCUKEN).

vinxru
28.12.2012, 22:17
Конечно проще. Можно заказать Экспресс печатки сделать - я восстановил по шаблонам - у меня есть гербер файлы.

Но не быстрее. Я наверное уже пол года жду платы Орион 128 и Пентагон 128, и наверное раньше весны не будет их.

Да в общем на старых платах даже аутентичнее.

vinxru
29.12.2012, 19:32
Что то уже работает.

http://s017.radikal.ru/i441/1212/db/225cf6a067act.jpg (http://radikal.ru/F/s017.radikal.ru/i441/1212/db/225cf6a067ac.jpg)

fifan
30.12.2012, 08:29
Что то уже работает.

Нужно в ПЗУ 2 кБайт записать тест (http://www.spetsialist-mx.ru/Soft/test_m.rar), его описание (http://www.spetsialist-mx.ru/Docs/mk1991_12.djvu). :v2_dizzy_christmas:

vinxru
30.12.2012, 21:05
К программированию пока душа не лежит. Вообще. Поэтому сел попаять.

Среди выпаянных из старого компа деталей я не нашел много нужных. И столько дорожек было перерезано, что я не удивлюсь, что это был не Специалист вовсе. Или владелец таким образом проверял микросхемы не выпаивая.

Была только одна проблема, у D8 ИЕ7 на выходах были частоты: 4, 2, 2, 1, 0.5 Мгц. Соответственно не было сигнала RAS. Долго втыкал в плату, искал замыкания, потом заменил эту микросхему и частоты стали 3.75, 2, 1, 0.5, 0.5 Мгц. Странно, но заработало.

На экране теперь стабильный мусор. (Ножку отсутствующего процессора SYN я замкнул на землю).

Осталось ПЗУ, Процессор, ВВ55, загрузку с магнитофона впаять. Ну да, еще резситоры и конденсаторы.

vinxru
31.12.2012, 01:21
Тест показал такую картинку. Наверное это хорошо.

http://s018.radikal.ru/i510/1212/ba/8ed77397b177.jpg

Теперь PS2 клавиатуру прикрутить и магнитофон. А потом контроллер цвета на отдельной плате. И Rom-диск.

http://s020.radikal.ru/i705/1212/09/c21d9c4c1b77t.jpg (http://radikal.ru/F/s020.radikal.ru/i705/1212/09/c21d9c4c1b77.jpg)

fifan
31.12.2012, 12:35
Тест показал такую картинку. Наверное это хорошо.

Да не очень. Что-то запутано с шиной данных.



Теперь PS2 клавиатуру прикрутить и магнитофон. А потом контроллер цвета на отдельной плате. И Rom-диск.
Без клавиатуры не один монитор не запуститься. Проверенно.
ROM-диск лучше использовать Flash от HardWareMan'а (http://zx-pk.ru/market/viewtopic.php?f=7&t=466). При этом можно зашить в ПЗУ мою прогу (http://www.zx.pk.ru/showpost.php?p=556999&postcount=50) для общения с данным Flash-диском (http://photo.qip.ru/users/fifan72/200812278/212717399/).

vinxru
31.12.2012, 12:44
Что-то запутано с шиной данных.


Я думаю старшие линии адреса отвалились, где то в районе мультиплексоров.

shoorick
31.12.2012, 14:30
у меня была "клавиатура" из четырех кнопок: СТР, ВК, ПС и сброс. хватало для запуска ;)

Terazini
31.12.2012, 15:14
ROM-диск лучше использовать Flash от HardWareMan'а (http://zx-pk.ru/market/viewtopic.php?f=7&t=466).


а он точно будет работать на любом клоне?
девайс для МХ-а же.
есть пруфы работы ром диска не "не МХ-ах" ?

HardWareMan
31.12.2012, 17:02
есть пруфы работы ром диска не "не МХ-ах" ?
Доставлено. (http://www.youtube.com/watch?v=z1Ifo-6ciqk) Подробно о диске тут (http://www.nedopc.org/forum/viewtopic.php?p=91912#91912).

fifan
31.12.2012, 17:29
Работать будет. Схема подключается через порт "программатора". Программа использует стандартные для Специалиста (не МХ) адреса ВВ55.
На Специалисте-МХ данная схема работать не будет. МХ2 - особый клон, который сочетает в себе свойства STD ("стандатного" Специалиста) и МХ. Переключение из одного режима в другой - программно. Это видно из видео от HardWareMan'а. Старт с SD карты Монитора-4. Далее по директиве @ - выход в загрузчик программ с Flash-дисков. А если набрать директиву X, то произойдёт переход в RAMFOS.
Это в Специалисте-МХ2. В STD я предлагаю перешить стандартную прошивку путём дополнения моей прошивки просмотра и запуска программ с Flash-диска. На Специалисте-Экспресс работает.
Вот во вложении - пилотная версия моей проги совмещенная с Монитором 2. Запускается по G D000.

Terazini
31.12.2012, 22:17
замечательно!

а есть для обычного Спеца контроллер ФДД ?
видел кривую схему для 20' флопика в журнале МК,
и контроллер для МХа, автор вроде ХардвареМен.
но не уверен будет ли работать на обычном Спеце.

http://rupix.org/images/77021582724686494521.gif

HardWareMan
31.12.2012, 22:33
Схема моя, совместима с МХ вариантом. Сепаратор и предкомпенсация взята с журнального дисковерта для Ориона (я его собирал - он отлично работал). Остальное - для Спеца.

fifan
01.01.2013, 11:49
Есть более современная от автора (http://www.spetsialist-mx.ru/index22.html), но только для 5-дюймовых дисководов. Проблема в том что нужна синхронизация 1 и 4 МГц от основной платы, а у Специалиста_МХ2 таковых нет. Внутренний генератор не прокатил.
Для обычного (STD) контроллера дисковода никогда не было. Нужно делать примочку - дополнение до МХ - селектор адресов (http://www.spetsialist-mx.ru/index8.html).

vinxru
01.01.2013, 19:51
Во всех схемах специалистов использующих РУ5 не сделана регенерация 7-ой линии адреса.

http://www.spetsialist-mx.ru/schemes/SpetsialistExp.png

Как оно работает вообще?

---------- Post added at 18:51 ---------- Previous post was at 18:38 ----------

D18.12 подключен на 0
D18.13 подключен на 1

Blade
01.01.2013, 19:53
У РУ5 A0..A6 используются для регенерации.

HardWareMan
01.01.2013, 19:55
Да, по идее, вертикальный счетчик должен дергать все 8 линий RAS, но тем не менее, в некоторых схемах это условие не выполняется. Именно поэтому, существует исправление: правильная регенерация (http://www.spetsialist-mx.ru/index18.html). И она требуется, при использовании РУ7 в МХ, причем старший бит всегда равен 0 для синхрогенератора и полностью зависит от регистра выбора страницы. Т.е., в регенерации так же не участвует, но тем не менее как-то работает...

Ах, вон оно что: согласно книжке "Микросхемы памяти и их применение" (автор О.Н.Лебедев, издательство "Радио и связь") у 565РУ6 не одна матрица 128х128 а 2 матрицы 64х64. Т.е., регенерация требуется только по 6 сигналам A0-A5. Если логически предположить, что 565РУ5 это развитие 565РУ6 (точнее, все идет от 565РУ3, в том числе и в пользу отказа от тройного питания), то у 565РУ5 не одна матрица 256х256 а 2 матрицы 128х128. То же самое, скорее всего, и с 565РУ7. Поэтому и взлетает.
http://savepic.ru/3750318.jpg

vinxru
01.01.2013, 20:33
Тогда уж 4 матрицы 64x64

64*64*4 = 16k

Оттуда же

В расчет времени-регенерации следует принимать время цикла при выбранном режиме регенерации, умножив его на число строк. Например, на регенерацию информации в ЭП одной стро*ки у микросхемы К565РУ5Б в режиме «Считывание-модифи*кация-запись» необходимо (см. табл. 2.13) 310 не, тогда для регенерации ЭП всех 256 строк потребуется 80 мк

---------- Post added at 19:33 ---------- Previous post was at 19:31 ----------

Где можно прочитать про регенерацию РУ5 всего 7-ю линиями адреса?

vinxru
02.01.2013, 02:33
Я просто подумал, что тест не проходит из за некорректной регенерации. А вдруг.

Я приделал переключатели, что бы можно было выбирать адрес видеостраницы, что бы глазами посмотреть на большую часть памяти. Вроде всё ок.

Решил оживить вторую плату и сравнить. Уже картинка есть, но процессор глючит, память глючит, мультиплексоры глючат.

---------- Post added at 01:33 ---------- Previous post was at 01:32 ----------

Можно было вместо D5 ИЕ5 ставить ИЕ2? 6,7 выводы на землю. Кончились у меня ИЕ5.

HardWareMan
02.01.2013, 13:34
Наверное можно. Кадры нормально формируются?

vinxru
02.01.2013, 13:40
Синхроимпульсы идеальные. Частота кадров 50 Гц.

Только есть один глюк. Я думаю, вдруг он из за ИЕ2.

В верхней половине экрана идут строки 128,128,130,130,132,132,134,134,136,136

В нижней половине идут 128,129,130,131,132,133,134,135,136

vinxru
07.01.2013, 22:47
Заменил мультиплексоры. (А так же 2x ТМ2, ЛА3, процессор)

http://i060.radikal.ru/1301/40/dc130b9a1a63.jpg

Вроде бы неисправны РУ5 и ИР12. На входе ИР12 сигнал есть, на выходе нет. Если выход ИР12 коротнуть на землю, то полоса на экране пропадает. Значит ИР1 (которая после ИР13) живая.

HardWareMan
08.01.2013, 00:49
Если выход ИР12 коротнуть на землю, то полоса на экране пропадает. Значит ИР1 (которая после ИР13) живая.
Это так же говорит в пользу ИР12. Меняй ОЗУ или проверяй шинку до ее DI/DO.

vinxru
08.01.2013, 01:28
Если выход РУ5, он же вход ИР12 коротить на землю/питание, то ничего не происходит.

При этом, эта РУ5 отлично читается самим процессором. Ведь тест она прошла.

ИМХО

HardWareMan
08.01.2013, 01:41
Если выход РУ5, он же вход ИР12 коротить на землю/питание, то ничего не происходит.

При этом, эта РУ5 отлично читается самим процессором. Ведь тест она прошла.

ИМХО

А это, стало быть, корова нагадила?
http://savepic.ru/3743291.png

vinxru
08.01.2013, 02:03
там два бита не отображается-черная и белая полоса рядом. один из за рушки, он то на тесте и выявляется.

vinxru
08.01.2013, 13:57
Да, это была ИР12 и я конденсатор впаял между шиной данных и землей.

Теперь тест проходит на ОК!

Добавил в схему 155ЛА6, что бы можно было использовать 16 Кб ПЗУ. На плате всего две панельки под ПЗУ, а я так понимаю, что полноценный Монитор-2 требует 3 ПЗУ по 2 Кб. Поэтому проще ЛА6 воткнуть, чем панельку и 24 провода.

Вход D47.13 + D53.5 + D54.3, выход D54.20.

---------- Post added at 12:57 ---------- Previous post was at 12:55 ----------

О, как раз прошивка от Fifan занимает 9 Кб

fifan
08.01.2013, 19:39
Вход D47.13 + D53.5 + D54.3, выход D54.20.
Это нумерация по какой схеме. Напоминаю, что схемы "Линёвского" варианта у меня ещё нет. Если ты её владеешь, то поделись - опубликую на своём сайте.

О, как раз прошивка от Fifan занимает 9 Кб
Так получилось: С000...CFFF - Монитор-2, D000...E5FF - External Flash Disk от меня.

vinxru
08.01.2013, 20:54
В D000 должен ведь быть знакогенератор

---------- Post added at 19:45 ---------- Previous post was at 19:44 ----------


Это нумерация по какой схеме. Напоминаю, что схемы "Линёвского" варианта у меня ещё нет. Если ты её владеешь, то поделись - опубликую на своём сайте.

Дак, я с твоего сайта его схему и скачал.

---------- Post added at 19:46 ---------- Previous post was at 19:45 ----------

http://www.spetsialist-mx.ru/index14.html

---------- Post added at 19:54 ---------- Previous post was at 19:46 ----------

Обьясни еще, а зачем в ROM-диске в регистр записываются линии адреса A8-A15, а напрямую используются A0-A7, A15-A20?

У меня вот нет регистра ИР33, а ТМ9 много

b2m
08.01.2013, 22:08
Обьясни еще, а зачем в ROM-диске в регистр записываются линии адреса A8-A15, а напрямую используются A0-A7, A15-A20?
Чтобы быстро читать по 256 байт, меняя только младший байт адреса.

vinxru
08.01.2013, 23:58
Читать 256 байт быстро можно и используя линии A0-A14. И записывая в регистр те же линии A0-A14.

Только в моем случае плюс в том, что можно использовать 155ТМ2, 155ТМ9, вместо ИР33, если не требуется большой объем.

fifan
09.01.2013, 07:22
В D000 должен ведь быть знакогенератор
А вот нет... В своей программе я использую BIOS от HardWareMan'а - там и знакогенератор и свой и опрос клавиатуры (здесь не используется).[/QUOTE]

зачем в ROM-диске в регистр записываются линии адреса A8-A15, а напрямую используются A0-A7, A15-A20?
Вот тут (http://www.nedopc.org/forum/viewtopic.php?t=9399&postdays=0&postorder=asc&start=675) почитай.

У меня вот нет регистра ИР33, а ТМ9 много
Аналог 374 регистра - это ИР23. У меня она и стоит. (http://photo.qip.ru/users/fifan72/200812278/212717399/) Можно использовать и с симметричными входами/выходами - К555ИР33.

b2m
09.01.2013, 11:07
если не требуется большой объем.
Фиксировать дополнительные биты шины адреса можно по разному - можно было самые старшие биты в регистр записывать, но он почему-то сделал именно так.

HardWareMan
09.01.2013, 12:12
Я понимаю, что SHLD позволяет одной командуй рулить большим количеством адресных линий. Но был ряд причин, почему ROM диск был сделан именно таким, какой он есть.
1. Порт C можно управлять побитно, поэтому он наиболее удобен именно для сигналов управления.
2. ROM диск изначально рассчитывался на флэши, т.е. его можно обновлять с самого спеца.
3. Схема, если честно, не совсем моя (http://www.nedopc.org/forum/viewtopic.php?p=91767#91767), моя просто очередная реализация.
4. Не нравится чужое - сделай свое, лучше.

vinxru
09.01.2013, 12:28
Да я не критикую. Просто подумалось, что если фиксировать старшие части адреса (а не средние), то можно было бы без регистра обойтись для маленьких объемов.

У меня сейчас только флешки 29F010. Вот думаю по одной в каждый компьютер поставить.

---------- Post added at 11:28 ---------- Previous post was at 11:26 ----------


А вот нет... В своей программе я использую BIOS от HardWareMan'а - там и знакогенератор и свой и опрос клавиатуры (здесь не используется).

Но ведь с точки зрения журнала, там знакогенератор должен быть. Может коммандер перенесем выше на 800h?

HardWareMan
09.01.2013, 12:44
Как показала практика, мой вывод символа нормально принимает любое расположение знакогенератора. Вот визуализация рабочего кода:
http://savepic.ru/3816940.png
В своем коде, я планировал оставить 128 байт на таблицу точек входа в разные сервисы, а следом за ними, с адреса 0080 расположить фонт. За фонтом уже собственно идут сами сервисы. И это все должно лежать в ПЗУ и работать прямо оттуда, на ходу включая-выключая ПЗУ. таким образом, системная область C000 используется как шлюз и, соответственно, в нее можно "запихать" больше расширенного сервиса, не теряя полной программной совместимости со старым софтом. Это была основная задумка. И хотя данная схема разрабатывалась для стандартного специалиста (МХ у меня появился поздно и я особо на нем не наработал человекочасы), но оно так же применимо и к МХу.

fifan
09.01.2013, 16:36
Но ведь с точки зрения журнала, там знакогенератор должен быть. Может коммандер перенесем выше на 800h?
Могу перенести в любое место. Всего код занимает 5639 байт. В каком месте он будет расположен всё равно.
Поправка: не коммандер, а External Flash Disk - зашивается сразу в ПЗУ. У коммандера (http://www.zx.pk.ru/showthread.php?t=17071&page=5) функций больше и работает он только в МХ. Планирую запускать с ROM-диска пользователя.

vinxru
09.01.2013, 20:21
У меня ПЗУ-х нет. Есть только две на 128 Кб. Думаю как быть.

Можно поставить ПЗУ на 128 Кб, но программ туда не особо много программ влезет. Даже если архивацию добавить.

Можно поставить ATMega + SD, но надо шевелить мозгами и писать меню. Хорошо, что меню можно на Си писать.

---------- Post added at 19:21 ---------- Previous post was at 19:20 ----------

И еще один вопрос к сообществу.

Что может быть неисправно в Специалисте, что 8 микросхем памяти выдают на тесте ошибку. При этом на экране нет глюков, как при записи, так и при чтении данных. Я даже адрес видеопамяти менял на адреса 0, 4000, 8000...

Разве что повреждения в области обратного хода и я их не вижу.

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

b2m
10.01.2013, 01:55
Я подозреваю какой то сбой счетчиков и неполную регенерацию памяти...
Скорее - неполная регенерация памяти. Регенерацией в Специалисте занимается вывод на экран, но если из-за особенностей адресации микросхем памяти она регенерируется не полностью, получишь идеальный экран и пропадающие данные в другом месте.

---------- Post added at 02:55 ---------- Previous post was at 02:46 ----------

Полагаю, подобная проблема может случиться, если перепутать RAS/CAS. Я точно не знаю, но вроде если видео перебирает все ряды, то регенерация будет полная, а если все колонки, то только там, где были считаны ряды.

vinxru
10.01.2013, 01:59
У меня две платы. Вроде бы идентичные. И одна работает, другая нет.

Я начал перепаивать микросхемы.

vinxru
10.01.2013, 21:34
Все 8 микросхем памяти не проходит проверку. Но изображение стабильно (области памяти 1000h-3FFFh, 5000h-7FFFh, 9000h-BFFFh). Работает как чтение, так и запись.

http://www.spetsialist-mx.ru/schemes/Linevski4.png

Безрезультатно заменил
D3
D6
D14
D16
D17
D19
D45
D53

Ставил конденсаторы на CAS, RAS, SYNC, счетные входы.
Поставил электролиты на питание 6300 мкф.
Память проверена на другом компе.

vinxru
11.01.2013, 02:18
Я написал тестовую программу, которая проверяет ОЗУ и выводит адрес сбойного байта на экран (а так же что бы записано и прочитано оттуда).

И складывается у меня впечатление, что ПЗУ проецируется на адреса 0..7FF, 4000...47FF, 8000...87FF и конфликтует с ОЗУ.

b2m
11.01.2013, 02:21
Проверяй схему начального пуска, которая подставляет ПЗУ с нуля после сброса :)

vinxru
11.01.2013, 02:32
Да вроде живая. Эта схема отключает ОЗУ... а оно работает.

Кажется мне, что дешифратор ПЗУ поломался.

vinxru
11.01.2013, 13:18
Не, дешифратор оказался рабочим.

Перепаял еще буфер процессора. То же был рабочий.

Схема начального запуска работает. Если схему начального запуска D9.2 коротить на землю, то ОЗУ отключается. Если на + (а там и так +), то ничего не происходит.

Поменял кварц, его конденсатор. С конденсатором на 100 пф, кварц заводится на 16 Мгц, вместо 8 Мгц. Процессор не запустился, а вот память даже регенерируется, мусор на экране стабилен.

---------- Post added at 12:18 ---------- Previous post was at 11:55 ----------

Нечаянно проверил область памяти 8000-BFFF. Идеально работает. То есть ПЗУ (или что там еще) там нет. (Отсоединил линию A15 от процессора)

Тест падает на адресе 0, там всегда записано 82h.

HardWareMan
11.01.2013, 13:36
Если процессор ВМ80А, то это нормально, ибо это код статуса чтения из памяти. Т.е., висячку читаем. Попробуй подтянуть ШД и посмотреть чего читается.

b2m
11.01.2013, 16:08
Получается по адресу ноль вообще ничего не выбрано, ни ОЗУ, ни ПЗУ.

vinxru
11.01.2013, 16:13
Да, только вот адреса 1000h-3FFFh работают. Чтение гарантировать не могу, но запись точно работает. Я переключал экран туда и наблюдал, как компьютер тестирует память.

HardWareMan
11.01.2013, 16:28
А не на РУ6 там рассчитано? Тогда А7 может идти мимо. В любом случае, я попрошу вызвонить настоящий дешифратор по факту на плате. Т.е., меня интересует формирование сигнала выборки к буферу данных ОЗУ, выборка к ПЗУ (ко всем банкам, если их более одного) и выборка к портам. Сможешь?

vinxru
11.01.2013, 16:41
А не на РУ6 там рассчитано?

И так и так. На плате есть перемычки. Линия адреса A7 (9-ый контакт) перемычкой подключена к мультиплексору. Я проверял это 50 раз. Я даже поменял мультиплексор.

Если бы был обрыв адресной линии, мы бы всё равно записали и прочитали бы память. А тут ничего не записывается.

Процессор записывает данные в области памяти 1000-3FFF, 5000-7FFF, 9000-BFFF. И данные там разные. Тестовая ПЗУ (91 года) написана так, что она гадит во всем ОЗУ.

Линия адреса A15 доходит от процессора до ОЗУ. Проверял несколько раз. Обрыв других адресных линий испортил бы экран.

---------- Post added at 15:38 ---------- Previous post was at 15:34 ----------


В любом случае, я попрошу вызвонить настоящий дешифратор по факту на плате.

Я менял дешифратор, который выделяет диапазон C000-FFFF. Если выход дешифратора закоротить в режим ПЗУ (D47.2 вывод 12), то запись на экран все равно производится, но записывается мусор. Если закоротить в режим ОЗУ, то программа виснет, ибо ПЗУ отключается.

---------- Post added at 15:41 ---------- Previous post was at 15:38 ----------

Я прозванивал адресные линии между процессором, буфером процессора и этим дешифратором.

Вечером попробую вытащить процессор и МГТФ-ом замкнуть ножки в панельке процессора, что бы получить адрес 0000. Посмотрю тестером, что будет на других микросхемах.

HardWareMan
11.01.2013, 16:42
А может есть схема данной версии Спеца? Можно подглядеть, мож чего и придет на ум.

vinxru
11.01.2013, 16:43
С точки зрения здравого смысла, невозможна ситуация, при которой в адресе 0000 нет ни ОЗУ ни ПЗУ.

Либо КЗ, либо какая то микросхема сдохла.

Тут даже регенерация памяти не учитывается, так как я проверяю память последовательностью команд

mov c, a
stax b
ldax b
cmp c
jnz error

---------- Post added at 15:43 ---------- Previous post was at 15:43 ----------

Есть, я выше ссылку разместил

---------- Post added at 15:43 ---------- Previous post was at 15:43 ----------

http://www.spetsialist-mx.ru/schemes/Linevski4.png

HardWareMan
11.01.2013, 16:55
Хмм, похожа на Экспресса. Там выборка ОЗУ завязана на задержанный SYNC сигнал арбитра памяти на DD12.1. Попробуй копнуть туда.

vinxru
11.01.2013, 17:31
Я кстати не понимаю, как там будут РУ6 работать.

---------- Post added at 16:07 ---------- Previous post was at 16:06 ----------

Им нужны раздельные сигналы CAS/RAS

---------- Post added at 16:24 ---------- Previous post was at 16:07 ----------

Хм... походу как раз в этом и ответ.

Я нашел первое отличие от схемы, ссылку на которую я привел.

У D7.3 выводы не соединены вместе.

---------- Post added at 16:31 ---------- Previous post was at 16:24 ----------

Во как

http://i080.radikal.ru/1301/db/2e86d07261d9t.jpg (http://radikal.ru/F/i080.radikal.ru/1301/db/2e86d07261d9.jpg)

HardWareMan
11.01.2013, 17:34
Ну вот, плата для РУ6, а стоят РУ5.

vinxru
11.01.2013, 17:57
Блин. Хотел красиво плату спаять, а я выпаивал микросхемы и на припой теперь не так красиво лежит.

Слушай, а твоя прошивка на 4 Кб, она поддерживает 256 символов, нормальное переключение РУС/ЛАТ и нормальное нажатие цифровых кнопок (без шифта)?

И полностью совместимо с Монитором-2, который должен занимать 6 Кб?


Еще вопрос HardWareMan-у

http://www.spetsialist-mx.ru/schemes/ColorController1.png

Можно ли заменить К589ИР12 на регистр поменьше. Например на ТМ9?

У регистра два входа записи. Один из которых используется для гашения. Но гашение так же выполняется самим компьютером, поэтому на выходах DD6 в любом случае будет 0. Значит тут оно избыточно.

UPD: Ступил. Там нет гашения.

HardWareMan
11.01.2013, 18:01
Кнопка ФБР/CAPS переключает язык (РУС/ЛАТ), кнопка ПОВТОР/REPT переключает большие и маленькие. Цифры без шифта в любом языке, символы под шифтом. Реализован автоповтор. Кодировка СР866, задается шрифтом и выбрана из-за FAT. Соответственно, для совместимости с мониторами требует допиливания, что я в будущем собираюсь сделать (введу переключение режимов: КОИ7, КОИ8 и нативный СР866).


По регистру и гашению - вроде да, гашение задается (по твоей схеме): DD6.3 смешивает HBLANK и VBLANK, через инвертор DD1.5 подается на половину дешифратора DD13, который используется для формирования циклов. В нужный момент гашение подмешивается к сигналу записи в регистр сдвига пикселей (DD49 и DD50) и запрещает запись в него. Т.к. младший бит его подключен к земле, то обновления информации нет и через последние 8 точек регистр сдвигает 0. Может выгореть, надо проверять.

vinxru
11.01.2013, 18:11
То есть со стандартными программами для Специалиста могут быть проблемы?

HardWareMan
11.01.2013, 18:13
То есть со стандартными программами для Специалиста могут быть проблемы?
Если честно - да, это для моего варианта. Для мониторов можно сделать усеченный и заточенный вариант под КОИ8 (использует редактор текстов "Практик"). Но я не проверял совместимость с RAM-FOSовским КОИ8.

vinxru
12.01.2013, 21:33
Теперь по экрану бегут черные помехи в момент записи куда либо (вв55, ОЗУ). Все тесты - ОК. Пока нажат сброс, помех нет.

vinxru
16.01.2013, 00:20
Оказалась перерезанная дорожка в схеме включения буферов ОЗУ. Буферы были всегда включены и мешали выводить графику не экран.

До этого она была залита припоем, но я сдул феном припой.

vinxru
17.01.2013, 12:40
Теперь надо бы ROM-диск собрать. Хотелось бы сделать SD-карту, что бы быстро и непринуждённо записывать свой софт. Так же хотелось бы всё это оформить в виде маленькой съемной платы.

Это даже проще, чем сделать плату с ПЗУ. Но у меня нет деталей для этого сейчас и в магазине нет.

Нет SD-карт, нет держателей под них, нет разъемов на плату. И всего этого нет в магазине, поэтому буду думать.

(Можно конечно купить микро-сд с переходником, и подпаяться к переходнику)

Я думал даже запаять на плату разъем LPT-порта. Но там 25 контактов, а надо 3*8+земля+питание = 26.

Так что пока думаю.

Eltaron
17.01.2013, 13:10
там 25 контактов
И ни с чем не соединенный металлический корпус - чем не земля?

vinxru
17.01.2013, 13:11
И ни с чем не соединенный металлический корпус - чем не земля?

Я сейчас посмотрел на разъемы на мамках. Они все двухэтажные. Не хочется такие использовать.

fifan
17.01.2013, 14:52
Я сделал прошивку для Специалиста с упомянутой мною программой для работы с Flash-диском. Разместил в конце области ПЗУ - D800.

vinxru
17.01.2013, 17:05
Я решил сделать разъем из контактов ISA-слотов (и т.п.). Контактная часть у них позолоченная. На печатной плате я сделаю возможность впаять стандартный разъем, так и набор отдельных контактов. А можно и провода впаять и установить держатель на передней стенке корпуса.

Помимо контактов на плате установлены 5 штырьков, которые центрируют и удерживают карту.

На фото макет сделанный крайне небрежно, ибо макет.

http://ic.pics.livejournal.com/vinxru/24784160/57835/57835_1000.jpg

http://ic.pics.livejournal.com/vinxru/24784160/57902/57902_1000.jpg

---------- Post added at 14:12 ---------- Previous post was at 14:10 ----------


Я сделал прошивку для Специалиста с упомянутой мною программой для работы с Flash-диском. Разместил в конце области ПЗУ - D800.

А ты на асме её писал? На Си умеешь писать?

---------- Post added at 15:59 ---------- Previous post was at 14:12 ----------

Как то так.
http://s018.radikal.ru/i500/1301/cf/b8ddf5a562df.jpg

---------- Post added at 16:05 ---------- Previous post was at 15:59 ----------

Общается с компьютером по 6 проводам.

D0,D1,D2,D3 - двунаправленная шина данных
DIR - направление (от компа)
CLC - тактовый сигнал (от компа)

SysCat
17.01.2013, 17:39
vinxru, ща должный прийти разъемы SD и я тебе несколько отправлю.

vinxru
17.01.2013, 17:44
vinxru, ща должный прийти разъемы SD и я тебе несколько отправлю.

О, спасибо.

fifan
17.01.2013, 18:48
А ты на асме её писал? На Си умеешь писать?

Писал на ассемблере, но брал большинство подпрограмм от HardWareMan'а.
Значит так. Мониторы, знакогенераторы и всё остальное (6 кБайт) ставьте свои, а вот с адреса D800 мои коды (efd_std.bin). Перед запуском наличие Flash-диска подключенного к порту программатора ВВ55 обязательно. Хотя надпись "Нет файлов" в случае ошибки высветиться. В архиве - исходники, сам асссемблер под Z80 и бинарник до конца забитый ff. Файлы fon_spets.bin и romdisk_std.a80 необходимы для головного исходника (efd_std.a80).

vinxru
18.01.2013, 12:43
Думаю, дай я перепишу твою программу на Си. За одно посмотрю, как под Специалист программировать.

Там 50% кода занимает функция вывода текста. Её не стоило переписывать, ибо тормозить будет. Мой компилятор пока не особо шустрый. Но что бы разобраться, переписал её. Работает не особо медленнее оригинала.

Обмозгую и добавлю ассемблерных вставок.



extern uchar chargen[2048];

#define LOADCHAR \
c = *text, ++text; \
if(c==0) break; \
down = (c >= 0xB0 && c < 0xF0); \
s = chargen + c*8;

#define PRINTX(M,V,A) \
*d = (*d & M); if(down) *d ^= (*s V); \
++d; \
for(i=8; i; --i) \
*d = (*d & M) ^ (*s V), ++d, ++s; \
--s; \
*d = (*d & M); if(down) *d ^= (*s V); \
d += A - 9; \

void printx(uchar* dd, char* text) {
register uchar* d = dd;
uchar* s;
uchar c, i, down;
while(1) {
// Фаза 1
LOADCHAR
PRINTX(0x03, << 2, 0)

// Фаза 2
LOADCHAR
PRINTX(0xFC, >> 4, 0x100)
s -= 7;
PRINTX(0x0F, << 4, 0)

// Фаза 3
LOADCHAR
PRINTX(0xF0, >> 2, 0x100)
s -= 7;
PRINTX(0x3F, << 6, 0)

// Фаза 4
LOADCHAR
PRINTX(0xC0, , 0x100)
}
}

#define COORDS(x,y) (uchar*)((y)*10+(x)*256+0x9000)

void main() {
uchar y;

memset((uchar*)(0x9000), 0, 0x3000);

//12345678901234567890123456789012345678901234567890 12345678901234
printx(COORDS(0, 0), "+------------ C:\\ ------------+ +------------ C:\\ ------------+");
for(y=1; y<23; y++)
printx(COORDS(0, y), "\xB3 \xB3 \xB3 \xB3 \xB3 \xB3");
printx(COORDS(0, 23), "+--------------+--------------+ +--------------+--------------+");
printx(COORDS(0, 24), "C:\\>");


Еще фаза некорректно выбирается. Точнее не выбирается вообще. И пока только черный фон.

Error404
19.01.2013, 11:44
Думаю, дай я перепишу твою программу на Си. За одно посмотрю, как под Специалист программировать.

Там 50% кода занимает функция вывода текста. Её не стоило переписывать, ибо тормозить будет. Мой компилятор пока не особо шустрый. Но что бы разобраться, переписал её. Работает не особо медленнее оригинала.

Обмозгую и добавлю ассемблерных вставок.



extern uchar chargen[2048];

#define LOADCHAR \
c = *text, ++text; \
if(c==0) break; \
down = (c >= 0xB0 && c < 0xF0); \
s = chargen + c*8;

#define PRINTX(M,V,A) \
*d = (*d & M); if(down) *d ^= (*s V); \
++d; \
for(i=8; i; --i) \
*d = (*d & M) ^ (*s V), ++d, ++s; \
--s; \
*d = (*d & M); if(down) *d ^= (*s V); \
d += A - 9; \

void printx(uchar* dd, char* text) {
register uchar* d = dd;
uchar* s;
uchar c, i, down;
while(1) {
// Фаза 1
LOADCHAR
PRINTX(0x03, << 2, 0)

// Фаза 2
LOADCHAR
PRINTX(0xFC, >> 4, 0x100)
s -= 7;
PRINTX(0x0F, << 4, 0)

// Фаза 3
LOADCHAR
PRINTX(0xF0, >> 2, 0x100)
s -= 7;
PRINTX(0x3F, << 6, 0)

// Фаза 4
LOADCHAR
PRINTX(0xC0, , 0x100)
}
}

#define COORDS(x,y) (uchar*)((y)*10+(x)*256+0x9000)

void main() {
uchar y;

memset((uchar*)(0x9000), 0, 0x3000);

//12345678901234567890123456789012345678901234567890 12345678901234
printx(COORDS(0, 0), "+------------ C:\\ ------------+ +------------ C:\\ ------------+");
for(y=1; y<23; y++)
printx(COORDS(0, y), "\xB3 \xB3 \xB3 \xB3 \xB3 \xB3");
printx(COORDS(0, 23), "+--------------+--------------+ +--------------+--------------+");
printx(COORDS(0, 24), "C:\\>");


Еще фаза некорректно выбирается. Точнее не выбирается вообще. И пока только черный фон.

Когда релиз компилера?
И очень нужен long (32 бита)

vinxru
19.01.2013, 12:14
Когда релиз компилера?
И очень нужен long (32 бита)

Специалисты доделаю, потом доделаю компилятор.

vinxru
21.01.2013, 12:51
Сейчас план такой:

1) Паяю контроллер SD-диска на весу и пишу для него прошивку.

http://s51.radikal.ru/i132/1301/2b/ad5f326ff2e1.jpg

2) Проверяю через стандартный монитор командами ввода и вывода.

3) Выпаиваю одну панельку под ПЗУ из компьютера, оставшуюся панельку переделываю под ПЗУ на 16 Кб.

4) Модифицирую ПЗУ для компьютера так, что бы компьютер грузился с флешки, если вставлена флешка.

5) Пишу программы тестирования клавиатуры, записываю на флешку и все проверяю.

6) Дорабатываю прошивку клавиатуры, что бы не залипали кнопки.

7) Если ATMega8 хватит, то оба расширения буду делать на DIP-корпусах. Если потребуется поставить ATMega16 в контроллер клавиатуры, то оба расширения буду делать на TQFP.

8) Делаю две новых платы (клавиатура и ROM диск), размещаю их над основной платой параллельно. А не как сейчас, перпендикулярно.

9) Запаиваю все не запаяные детали.

10) Делаю контроллер цвета.

11) Делаю корпус из оргстекла.

---------- Post added at 11:46 ---------- Previous post was at 11:43 ----------

По поводу SD-карты идея такая. Контроллер будет отслеживать CS ВВ55-ой, и после чтения байта компьютером автоматически подставлять следующий байт. То есть последовательно получать байты можно будет вызовом единственной команды

LXI H, 0F000h

MOV A, M
STAX D
INX D

или даже

MOV B, M
MOV C, M
PUSH B

11 тактов на байт. Прием 32 Кб данных (максимальный размер программы) будет происходить 0.3 сек.



---------- Post added at 11:51 ---------- Previous post was at 11:46 ----------

Контроллер выдает данные блоками по 512 байт. То есть читает с флешки в свою память 512 байт, а потом отдает компьютеру.

Чтение с SD может выполняться неопределенное кол-во времени. Во время чтения контроллер возвращает 0. Как только он будет готов передавать информацию, он передаст 1, а затем 512 байт данных.



; Ожидание готовности МК
LXI H, 0F000h
XRA A
Wait:
OR M
JZ Wait
DCR A
JNZ Error

; Прием данных

fifan
21.01.2013, 16:49
Если ATMega8 хватит, то оба расширения буду делать на DIP-корпусах.
Хорошо б что имено в Атмегу8 всё вошло.:v2_dizzy_keyboard:

perestoronin
21.01.2013, 18:28
Хорошо б что имено в Атмегу8 всё вошло.:v2_dizzy_keyboard:

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

vinxru
21.01.2013, 19:17
А если ATMega16 применить, то можно оба устройства на одном МК реализовать.

fifan
21.01.2013, 20:17
При применении квадратного планарного корпуса увеличивается размер печатной платы в том случае если взять все сигнальные линии прямо с ВВ55, с её панельки. Между двумя рядами DIP40 ни как не разместить упомянутый корпус Атмеги, только сбоку. Хотя на вкус и цвет, как говорится...

vinxru
22.01.2013, 02:29
Написал загрузчик для Специалиста и вставил его вместо ПЗУ Монитора (C800-CFFF). Нажимаем F6, Enter и загружается игра.

Только вот игра глючит на функции вывода текста, каждый раз по разному. И не реагирует на клавиши.

http://s005.radikal.ru/i210/1301/ea/dd2a31de1b7e.jpg
http://s019.radikal.ru/i620/1301/f1/5f533866e65b.jpg
http://s017.radikal.ru/i410/1301/bf/76f2ec0d30d1.jpg

Есть у меня подозрение, что это из за адреса стека, который я разместил по адресу C000. Тобишь в видеопамяти. Еще подозрение, что в памяти не инициализируются какие то нужные Биосу значения.

---------- Post added at 01:29 ---------- Previous post was at 01:18 ----------

Да, в эмуляторе эта игра работает только лишь с BIOS-ом C000-C7FFF.

fifan
22.01.2013, 05:34
Видимая часть экрана занимает адреса 9000...BFFF, а не с С000. С000...EFFF - это область ПЗУ.

vinxru
22.01.2013, 11:23
Я непонятно сказал. Я в SP занес С000h. Первый адрес стека будет BFFEh

---------- Post added at 10:23 ---------- Previous post was at 09:06 ----------

Еще идея. Поставив внешние резисторы к ATMega8 можно сэкономить несколько тактов.

vinxru
23.01.2013, 00:42
http://i056.radikal.ru/1301/10/c96e48dbe2da.jpg

Ура загружается!

В качестве тактового сигнала пока используется линия PC0, а не CS. Я решил постепенно двигаться, но у меня закончились чистые ПЗУ-хи.

Так же пока МК поддерживает лишь одну команду, загрузку файла \boot.rks. Этого пока хватит, а потом будут все команды файловой системы.

---------- Post added at 23:42 ---------- Previous post was at 23:40 ----------

Принимается критика по коду загрузчика:



; Загрузчик с SD-карты для компьютера Специалист

.org 0C800h

;----------------------------------------------------------------------------

BUS_PORT = 0F000h
SEND_MODE = 10001010b ; Настройка: 1 0 0 A СH 0 B CL 1=ввод 0=вывод
RECV_MODE = 10011010b

;----------------------------------------------------------------------------

Restart:
; Инициализация стека (аналогично стандартному монитору)
LXI SP, 08EE0h

; Начало передачи
MVI A, SEND_MODE
STA BUS_PORT+3

; Передаем код команды
LXI H, 0F000h
MVI M, 013h
CALL Pulse ; Этой команды не будет, когда будет использоваться CS в качестве тактового сигнала
MVI M, 0B4h
CALL Pulse ; Этой команды не будет
MVI M, 057h
CALL Pulse ; Этой команды не будет
MVI M, 001h
CALL Pulse ; Этой команды не будет

; Переключаемся в режим приема
MVI A, RECV_MODE
STA BUS_PORT+3

; МК должен ответить кодом 32h
CALL PulseAndRecv ; Вместо CALL PulseAndRecv будет LDA 0FF00h или MOV A, M
CPI 032h
JNZ Error

; Ждем пока МК прочитает файл
CALL WaitForReady

; Если файл найден и прочитан, МК должен ответить кодом 0EAh
CALL PulseAndRecv
CPI 0EAh
JNZ Error

; Принимаем длину файла в DE
call RecvWord
MOV D, B
MOV E, C

; Эти данные уже из файла - принимаем адрес загрузки в BC
CALL RecvWord
PUSH B

; Игнорируем длину из файла
CALL RecvWord
POP B
PUSH B

; Если размер файла <=512, то принять остаток X-4 байт и запустить
LXI H, 65535-512
DAD D
JNC L5

; Если размер файла был >512 байт, то принять остаток 512-4 байта
LXI H, 512-4

L3: CALL RecvBlock

; Уменьшаем счетчик на 512 байт
DCR D
DCR D

; Подождать
CALL WaitForReady

; Если DE<=512, то принять остаток и запустить
LXI H, 65535-512
DAD D
JNC L4

; Принять 512 байт
LXI H, 512
JMP L3

;----------------------------------------------------------------------------

L5: ; Приём файла размером меньше 512 байт. 4 байта уже принято.
DCX D
DCX D
DCX D
DCX D

L4: ; Принимаем остаток файла размером <=512 байт.
XCHG
CALL RecvBlock

; Принимаем контрольный байт
CALL PulseAndRecv
CPI 0E1h
JNZ Error

; Запуск загруженной программы
RET

;----------------------------------------------------------------------------

Error:
; Что бы не было конфликтов
MVI A, RECV_MODE
STA BUS_PORT+3

; Добавить сброс МК

; Пауза и пропуск данных
LXI D, 1000h
E2: CALL Pulse
DCR E
JNZ E2
DCR D
JNZ E2

JMP Restart

;----------------------------------------------------------------------------
; Принять слово в BC.
; Портим A.

RecvWord:
CALL PulseAndRecv
MOV C, A
CALL PulseAndRecv
MOV B, A
RET

;----------------------------------------------------------------------------
; Принять HL байт по адресу BC.
; Портим A.

RecvBlock:
INR H
XRA A
ORA L
JZ RecvBlock2
RecvBlock1:
CALL PulseAndRecv
STAX B ; 7
INX B ; 5
DCR L ; 5
JNZ RecvBlock1 ; 10
RecvBlock2:
DCR H ; 5
JNZ RecvBlock1 ; 10
RET

;----------------------------------------------------------------------------
; Ожидание готовности МК.
; Портим A.

WaitForReady:
CALL PulseAndRecv
ORA A
JZ WaitForReady
DCR A
JNZ Error ; Нарушение протокола
RET

;----------------------------------------------------------------------------
; Принять байт в A. Или отправить байт из регистра BUS_PORT.
; Эта подпрограмма будет исключена. Вмеcто PC0 будет использоваться CS.

Pulse:
PulseAndRecv:
MVI A, 1
STA BUS_PORT+2
XRA A
STA BUS_PORT+2
LDA BUS_PORT
RET

.End

vinxru
10.02.2013, 01:10
http://s019.radikal.ru/i631/1302/e5/9ca12956ffa1.jpg

Собрал два контроллера клавиатуры, запял преобразовать в -5 Вольт, запял разъемы и подключил их. Осталось:

1) Контроллер цвета (DataSoft презентовал PAL-кодер, спасибо ему большое, завтра пойду забирать посылку. Теперь у моего монитора-телевизора будет RGB вход. А то делать цвет в компе, когда нет возможности это увидеть, крайне странно)

2) Контроллер SD (Ждем разъемы под SD карту по почте и пишем софт)

3) Допаять один блок загрузки с магнитофона и проверить оба.

4) Выпаять панельку под ПЗУ в одном компе, добавить микросхему 155ЛА8 для поддержки ПЗУ на 16 Кб. Ну и проверить, будут ли работать ПЗУ на 16 Кб (ждем программатор по почте) (сделано)

5) Допаять кондеров.

6) Может быть вернуть 155КП2 вместо 155КП12. Я когда проверял, заменил пару КП2 на КП12

Ну и корпус попробую сделать из оргстекла.

vinxru
10.02.2013, 17:34
Я считаю, что "Специалист Линевской" был рассчитан в том числе под РУ3. Так как печатная плата нарисована так, что на все 1-ые выводы приходит -5 Вольт.

---------- Post added at 16:34 ---------- Previous post was at 15:43 ----------

http://s019.radikal.ru/i609/1302/68/b682f818fdc9.png

Адаптер SD будет выглядеть так. Паять буду, когда придут разъемы.

dmluk
10.02.2013, 21:55
[QUOTE=vinxru;574612]http://s019.radikal.ru/i631/1302/e5/9ca12956ffa1.jpg



У меня глюки или на одной из плат фотошаблоны верх-низ перепутаны?

vinxru
10.02.2013, 22:05
У меня глюки или на одной из плат фотошаблоны верх-низ перепутаны?

Перепутаны

vinxru
11.02.2013, 14:45
Как бы мне не хотелось, но Специалист потихоньку обрастает МГТФ-ом

http://s57.radikal.ru/i157/1302/f7/fc1017a5f844.jpg

1) Поддержка ПЗУ на 16 Кб (Добавлена 155ЛА1 для формирование сигнала ROM, к ПЗУ подведены дополнительные линии адреса).
2) Около процессора обрыв дорожки -5 Вольт.
3) Контроллер PS/2 клавиатуры к ножкам ВВ55 и разъему.
4) Питание к разъему.
5) Кнопка сброса на плате.

fifan
11.02.2013, 16:47
vinxru, как дело движется в сторону загрузки в память файлов с SD карты?

vinxru
11.02.2013, 17:05
vinxru, как дело движется в сторону загрузки в память файлов с SD карты?

Пока только грузится файл boot.rks в память. Адрес загрузки берется из самого файла. В ближайших планах добавить загрузку произвольного файла и получение списка файлов.

И на экране Специалиста это все отобразить.

И еще хочу попробовать ускорить загрузку. Сейчас тактовый сигнал генерируется программно, а можно использовать сигналы CE,WR,RD. Из минусов этого подхода, еще 3 МГТФ провода.

vinxru
12.02.2013, 02:21
Подключил PAL-кодер.

http://s019.radikal.ru/i644/1302/74/b69131a24572t.jpg (http://radikal.ru/F/s019.radikal.ru/i644/1302/74/b69131a24572.jpg)

Цвет есть, жить можно. Но рябь жуткая. А синий мажется.

Nedopc Pal Coder Revision A

---------- Post added 12th February 2013 at 01:21 ---------- Previous post was 11th February 2013 at 23:50 ----------

Подстроил частоту и амплитуду генератора.

http://i069.radikal.ru/1302/9b/92f1b7541766t.jpg (http://radikal.ru/F/i069.radikal.ru/1302/9b/92f1b7541766.jpg)

Синий цвет видимо обрабатывается совсем по другому. Поскольку он единственный мажет.

BYTEMAN
12.02.2013, 03:02
При передаче сигнала цветности «красный» цветоразностный сигнал повторяют в следующей строке с поворотом фазы на 180 градусов. Для устранения фазовой ошибки декодер PAL складывает текущую строку и предыдущую из памяти, благодаря чему полностью устраняет фазовые ошибки, типичные для системы NTSC. При сложении двух сигналов взаимно уничтожаются «красные» цветоразностные компоненты из-за изменения их знака. При вычитании двух сигналов взаимно уничтожаются «синие». Таким образом, на выходах сумматора-вычитателя получаются разделённые сигналы U и V, являющиеся масштабно изменёнными R-Y и B-Y.

походу, из-за этого..

---------- Post added at 02:02 ---------- Previous post was at 02:01 ----------

но это должно давать только косяки по вертикали..

vinxru
12.02.2013, 15:13
Чуть чуть не влезло :)

http://s020.radikal.ru/i721/1302/10/3bb936737fb9.jpg

sergey2b
12.02.2013, 19:41
Подстроил частоту и амплитуду генератора.
объясните пожалуйста как вы подстраивали генератор ?

те получаеться что PAL кодер можно использовать и с советскими ПК которые были расчитанны на СЕКАМ

vinxru
12.02.2013, 20:59
те получаеться что PAL кодер можно использовать и с советскими ПК которые были расчитанны на СЕКАМ

Можно с любым устройством у которого есть RGB выход.

---------- Post added at 19:59 ---------- Previous post was at 19:57 ----------


объясните пожалуйста как вы подстраивали генератор ?


Изменяя ёмкость конденсатора стоящего рядом с кварцевым резонатором, можно чуть-чуть изменить частоту генерации.

А еще я сделал делитель на входе микросхемы. Чем меньше амплитуда сигнала приходящего с тактового генератора, тем меньше на изображении ряби. Но на определенном уровне, монитор перестает распознавать сигнал цветности.

HardWareMan
12.02.2013, 22:54
Для уменьшения помех от DOT CRAWL есть несколько методик. Все они включают в себя настройку LC цепочки в тракте прохождения поднесущей цвета до миксера композита. Вот, например, в Сеге:
http://savepic.ru/4043802m.png (http://savepic.ru/4043802.png)
Интересующий узел обведен пунктиром (здесь указаны для PAL4.43 для MegaDrive и NTSC3.59 для Genesis). играясь этими цепями я добивался довольно-таки четкого цвета в пределах возможностей системы PAL.

vinxru
14.02.2013, 10:33
Спаял контроллер цвета.

Не нравится мне PAL-кодер. Если вывести множество вертикальных линий, то на экране вместо цветов месево.

Решил восстановить Электронику 32ВТЦ-201м

Eltaron
14.02.2013, 10:46
Не нравится мне PAL-кодер. Если вывести множество вертикальных линий, то на экране вместо цветов месево.
А ты через композит или S-Video подключаешь? Разница колоссальная, именно в плане горизонтальной ряби.
Я когда палкодер через S-Video подключил, у меня прям челюсть отпала, я полчаса сидел и смотрел на zx-матрас с артефактами битой памяти, потому что никогда не видел настолько красивой и статичной цветной картинки.

vinxru
14.02.2013, 11:07
композит. Надо провод для SVideo покупать идти, а мне лень.

HardWareMan
14.02.2013, 12:04
Ну дык S-Video на порядок четче, так как нет взаимных помех между поднесущей цвета и яркостью. К тому же, из-за ненадобности фильтровать полосу для поднесущей, частота яркости может быть выше, что дополнительно дает ЧБ четкости.
А еще, в идеале у PAL/NTSC кодера поднесущая должна быть чистым синусом, две фазы которых модулируются по уровню (перемножаются). Если этот сигнал не синус (часто квадрат или треугольник), то входные цепи декодера начинают звенеть, вызывая буйство красок на мелких деталях.

vinxru
14.02.2013, 12:33
А еще, в идеале у PAL/NTSC кодера поднесущая должна быть чистым синусом, две фазы которых модулируются по уровню (перемножаются). Если этот сигнал не синус (часто квадрат или треугольник), то входные цепи декодера начинают звенеть, вызывая буйство красок на мелких деталях.

Это понятно. Прямоугольный сигнал имеет больший спектр и вылезает из положенной полосы. Попадает в яркость и видится нам как рябь.

А вообще, несущая PAL 4,43 МГц.

Полосатый экран у Специалиста (или БК), это примерно 16 кГц * 512/2 = 4 Мгц.

То есть в композитном PAL-е такой экран передать теоретически невозможно.

А так же невозможно передать цветное разрешение более чем 256 точек в ширину.

vinxru
16.02.2013, 20:42
Спаял контроллер цвета и починил монитор Электроника 32 ВТЦ 201М.

Пока я не успел прошить в ПЗУ новую прошивку. C вытащенным процессором экран Специалиста выглядит так:

http://s017.radikal.ru/i405/1302/99/1019a04ec292.jpg

vinxru
17.02.2013, 00:42
Запуск Специалиста с контроллером цвета.

http://s55.radikal.ru/i148/1302/8b/323107b275b5.jpg (http://www.youtube.com/watch?v=eG7na7Vbixw)
(Кликните для просмотра видео)

Я думаю, что в схеме ошибка. Цвета должны быть инвертированы.

---------- Post added at 23:42 ---------- Previous post was at 23:37 ----------



Вопрос знатокам. Какой цвет символов будет на экране, если на DD44.13, DD44.11, DD44.10 будет ноль? Эти три вывода, это регистр цвета. Логично что на экране будет черный, хотя в журнале написано что белый. И все игры написаны под то, что 000 это белый.

http://www.spetsialist-mx.ru/schemes/ColorController1.png

Тут по любому нужен еще инвертор. К155ЛН1.

fifan
17.02.2013, 09:25
Вот здесь (http://www.nedopc.org/forum/viewtopic.php?t=9399&postdays=0&postorder=asc&start=225) была полная разборка данной схемы. В Специалисте_МХ2 инверторы после ВВ55 до контроллера цвета стоят. Напомню, что в Специалисте_МХ2 (http://www.spetsialist-mx.ru/schemes/SpetsialistMX2.pdf) контроллер цвета состоит из:
1. Схемы инверсии цвета и переключателя 5/8 цветов (DD24,DD29,DD19.3);
2. входного регистра цвета (DD47);
3. SRAM ОЗУ цвета (DD38);
4. Выходного регистра цвета (DD48);
5. Мультиплексора выходного цвета (DD51);
6. Выходных усилителей R5...R21,VT1...VT3.
Напомню, что в Специалисте_МХ2 VGA выход.

vinxru
17.02.2013, 12:57
Я так понял, что журнальная схема косячная.

HardWareMan
17.02.2013, 14:06
Вот здесь (http://www.nedopc.org/forum/viewtopic.php?t=9399&postdays=0&postorder=asc&start=225) была полная разборка данной схемы. В Специалисте_МХ2 инверторы после ВВ55 до контроллера цвета стоят.
вот оно. (http://www.nedopc.org/forum/viewtopic.php?p=89478#89478)

vinxru
17.02.2013, 14:47
Я пока просто инвертор засунул.
http://s05.radikal.ru/i178/1302/6d/edf96e96f463.jpg

Про XOR подумаю.

vinxru
18.02.2013, 13:33
Очень часто, когда я собираю схемы по журналам, в схемах находятся ошибки. Так и с контроллером цвета, в котором было две ошибки. 9-ая ножка микросхемы не была подключена к массе и не было инверторов. Без инверторов на экране не было белого цвета, а он используется повсеместно. А все цветные цвета были обращены.

Схему надо читать так:

http://ic.pics.livejournal.com/vinxru/24784160/61174/61174_original.png
UPD: Еще обязательно эмиттерные повторители на КТ315 или C945.

Причем! В статье написано, что этот контроллер цвета должен быть совместим с прошлым 5-и цветным. Да, был еще один контроллер цвета в котором использовалось 2 микросхемы памяти (а не 3 как тут). Ну и следовательно цветов было меньше. Дак вот палитры старого и нового не совпадают:

Старый: белый, красный, синий, зеленый. (плюс черный фон).
Новый: белый, фиолетовый, голубой, синий, желтый, красный, зеленый, черный (плюс черный фон).

Подобное преобразование можно было бы сделать на одной микросхеме 4XOR. Но, а вдруг журнальный вариант правильный? Непонятно. Тогда надо ставить ПЗУ с несколькими палитрами с возможностью переключения. Но лень. Так как цветных игр не так и много и в любом варианте они выглядят нормально.

А вообще, этот контроллер цвета у меня вызывает смешанные чувства. С одной стороны, он выглядит как костыль. А с другой, это идеальное решение. Компьютер не теряет совместимости со всеми старыми программами и играми. А старые программы можно легко раскрасить, без перерисовки спрайтов, без серьезного изменений кода игры.

Для программиста этот контроллер цвета видится как ячейка памяти FFFE (и еще множества отражений в памяти из за неполной дешифрации). Программист записывает в эту ячейку цвет, и все что бы не рисовалось на экране будет окрашено этим цветом. Как будто функция Бейсика COLOR.

Контроллер собран прямо на плате. 7 микросхем.

http://ic.pics.livejournal.com/vinxru/24784160/61383/61383_original.jpg

http://ic.pics.livejournal.com/vinxru/24784160/61659/61659_original.jpg

Канифоль смою, когда припаяю контроллер SD карты. Это последнее, что осталось сделать.

shoorick
18.02.2013, 13:47
Я думаю, что в схеме ошибка. Цвета должны быть инвертированы.
смотря какой телевизор. я одному хлопцу в спектрум ЛП5 паял на цвета, тк у него ламповый цветной телек был, и родные цвета получились инверсные. ;)

vinxru
18.02.2013, 14:07
смотря какой телевизор. я одному хлопцу в спектрум ЛП5 паял на цвета, тк у него ламповый цветной телек был, и родные цвета получились инверсные.

Тут не совсем то инвертирование, что в Спектруме. В терминах Спектрума тут инвертировать надо только аттрибуты, графика остается без изменений.

Здесь черный цвет всегда остается черным. Белый при этом становится черным. И белых букв вообще не видно.

Даже в мониторе печатаешь вслепую.

---------- Post added at 13:07 ---------- Previous post was at 13:06 ----------

Видишь, я инверторы засунул в начало схемы, а не в конец.

vinxru
22.02.2013, 11:18
Ну и последняя доработка. Вчера нарисовал печатную плату.

Контроллер SD. Впаивается вторым этажом над ВВ55-ой, подобно контроллеру клавиатуры.

http://s019.radikal.ru/i616/1302/c5/88463795aa59.jpg

vinxru
24.02.2013, 17:37
Времени ну совсем нет. Только что сделал печатные платы.

http://s003.radikal.ru/i203/1302/c8/3ac8178dcae1.jpg

Vladimir_S
24.02.2013, 17:42
vinxru, сверлишь ручной машинкой? Входные отверстия по центру, а вот выходные с краю.Нужно это дело механизировать.А вообще красиво.

vinxru
24.02.2013, 17:56
Нужно это дело механизировать.

Сверлю моторчиком от магнитофона. А тут небольшой косяк с совмещением сторон. В пределах допустимого.

vinxru
24.02.2013, 22:00
http://ic.pics.livejournal.com/vinxru/24784160/61915/61915_original.jpg

2 шт

http://i056.radikal.ru/1302/f0/d72b7e66aaca.jpg
(номиналы резисторов указаны не корректно).

Всё просто. С одной стороны двунаправленная 8-битная шина между МК и компьютером. 9-ая линия, это тактовый сигнал. С другой стороны SD-карта и преобразователь 3.3 Вольта для карты.

Внутри МК зашита библиотека PetitFAT c которой общается компьютер. Эта библиотека не умеет создавать новые файлы и папки. Она умеет записывать в файлы, но только блоками по 512 байт и если размер файла не увеличивается.

Это потому что библиотека написана в крайне экономном стиле. Она использует всего несколько десятков байт ОЗУ. А для изменения размера файла нужно изменить несколько байт в таблице FAT. А карта памяти работает записывает данные блоками по 512 байт. То есть придется скопировать весь блок в память, изменить байт, а потом сохранить его обратно. На это потребуется 512 байт памяти.

Память то есть, но авторы PetitFS писали не для меня конкретно.

В будущем я использую другую библиотеку или доработаю эту.

vinxru
26.02.2013, 12:37
Ошибка в подключении проводов к SD. Пришлось бросить перемычку.

Ошибка в порядке проводов подключения в разъему. Я ведь был уверен, что контакты расположены в порядке D0-D7. Оказалось, что хаотично. Исправлю таблицей перекодирования в МК.

---------- Post added at 11:35 ---------- Previous post was at 11:35 ----------

Вчера подпаял контроллер на проводах и удачно загрузил программу.

---------- Post added at 11:37 ---------- Previous post was at 11:35 ----------

Пока будет 4 команды
1) Загрузка файла boot.rks (pf_open, pf_read)
2) Загрузка файла с произвольным именем (pf_open, pf_read)
3) Начало получения списка файлов в папке (pf_opendir)
4) Получение следующего файла в папке (pf_readdir)

vinxru
01.03.2013, 12:20
http://s018.radikal.ru/i518/1303/d8/c607cb3f444b.png

Вчера вечером сделал первые наброски файлового менеджера.

Каждый программист должен в своей жизни написать Norton Commander :) Пока контроллер работает только в режиме чтения, поэтому вторая панель не особо нужна.

Но! Она играет важную роль. Текст на экране рисуется относительно долго, и сократив его до двух колонок получилось значительно повысить скорость работы. При этом, при перемещении курсора (когда требуется скролл) я не рисую весь текст повторно, а активно использую копирование видеопамяти.

А копировать видеопамять в цвете у этого компьютера не получится, поэтому расцветки файлов не будет. :( Но зато быстро.

Теперь надо написать код связывающий его и микроконтроллер.

Как хорошо писать на Си под эти компы :) Функция копирования видеопамяти:



void scroll1(char* d, char* s, uchar w, uchar h) {
for(; w; --w, d+=0x100, s+=0x100)
memswap(d, s, h);
}


Просто и быстро. Хотя ассемблерные вставки то же пока присутствуют.



void fillRect1_int(uchar len, uchar x, uchar* a) {
asm {
lda fillRect1_int_2
fillRect1_int_cmd2:
nop ; CMA = 2F NOP = 00
mov d, a
lda fillRect1_int_1
mov e, a
fillRect1_int_l0:
mov a, m
fillRect1_int_cmd:
ora d ; XRA D = AA, ANA D = A2, ORA D = B2
mov m, a
inx h
dcr e
jnz fillRect1_int_l0
}
}

void fillRect1(uchar* a, ushort c, uchar l, uchar r, uchar h) {
if(c==0) {
fillRect1_int(h, l & r, a);
return;
}
--c;
fillRect1_int(h, l, a);
a += 0x100;
for(; c; --c) {
fillRect1_int(h, 0xFF, a);
a += 0x100;
}
fillRect1_int(h, r, a);
}

#define QUARDCOORDS(XX,YY) ((uchar*)(0x9000)+(YY)+((XX)*256) )

#define FILLRECTARGS(X0,Y,X1) QUARDCOORDS(X0/8, Y0), ((X1)+1)/8-(X0/8), (0xFF >> ((uchar)(X0) & 7)), (0xFF >> ((uchar)((X1)+1) & 7)) ^ 0xFF, (Y1)-(Y0)+1

void fillRect(ushort x0, uchar y0, ushort x1, uchar y1) {
fillRect1(FILLRECTARGS(x0, y0, x1, y1));
}

void graphXor() {
asm {
mvi a, 0AAh
jmp graph1_l1
}
}

void graph0() {
asm {
mvi a, 0A2h
sta fillRect1_int_cmd
mvi a, 02Fh
jmp graph1_l2
}
}

void graph1() {
asm {
mvi a, 0B2h
graph1_l1:
sta fillRect1_int_cmd
xra a
graph1_l2:
sta fillRect1_int_cmd2
}
}


Макросы я добавил, что ускорить программу. Что бы всё что можно рассчитать во время компиляции, считалось во время компиляции.

Медленно, потому что расчет адреса будет производится при вызове.
fillRect(8,5,184,232);

Быстро, потому что расчет адреса будет производится при компиляции.
fillRect1(FILLRECTARGS(8, 5, 184, 232));

Во вложении RKS файл, код на Си и промежуточный файл на асме.

Контроля переполнения буферов пути и ком строки я пока не сделал.

Еще надо будет свою функцию сканирования клавиатуры делать. Тут нет автоповтора и заглавных букв.

Я заголовочные файлы для BIOS начал писать и граф. библиотеку.

fifan
01.03.2013, 16:57
Каждый программист должен в своей жизни написать Norton Commander -
ха, верно сказано.
1. не стоит в упор копировать внешний вид окон Norton Commander'а, нужно искать что-то своё.
2. всё ж прорисовку линий нужно делать на ассемблере. Очень удачно сделал HardWareMan. У него вывод символов (окна у меня в программе нарисованы псевдографикой) сделан очень быстро.
3. я прорисовку окон, в том числе информационных и выбора дисков давно уже победил (http://www.zx.pk.ru/showthread.php?t=17071&page=5). На данный момент у меня уже есть: вывод и запуск файлов с Flash-диска, ROM-диска под МХ, файлов MX-DOS.
4. недоделки/хотелки пока таковы: считывание каталога/запуск файлов с SD карты, полноценные переходы по каталогам в MX-DOS, организация общения с RAM-диском (до 512 кБайт) и т.д.

И напоследок хочу сказать что офтопить как бы не желательно. Здесь vinxru обсуждает восстановление Специалистов, а уже идёт написание программ, изготовление новых девайсов и т.д.

vinxru
01.03.2013, 17:14
Эта программа, часть SD-контроллера. Поэтому не оффтопик :)

---------- Post added at 16:08 ---------- Previous post was at 16:07 ----------


всё ж прорисовку линий нужно делать на ассемблере. Очень удачно сделал HardWareMan. У него вывод символов (окна у меня в программе нарисованы псевдографикой) сделан очень быстро.

Рамка у меня рисуется линиями и очень быстро. Рисует функция как раз приведенная в прошлом посте.

---------- Post added at 16:12 ---------- Previous post was at 16:08 ----------


3. я прорисовку окон, в том числе информационных и выбора дисков давно уже победил. На данный момент у меня уже есть: вывод и запуск файлов с Flash-диска, ROM-диска под МХ, файлов MX-DOS.
4. недоделки/хотелки пока таковы: считывание каталога/запуск файлов с SD карты, полноценные переходы по каталогам в MX-DOS, организация общения с RAM-диском (до 512 кБайт) и т.д.

Я у тебя взял шрифты, функцию вывода на экран (только немного её оптимизировал).

Вообще, работает удивительно быстро. Доли секунды панель файлов перерисовывается при скоролле содержимого.

Я ждал от Специалиста диких тормозов.

---------- Post added at 16:14 ---------- Previous post was at 16:12 ----------

Размер шрифта 6 пикселей, а в байте 8 символов. Поэтому пришлось делать 4 функции рисования символов (как в твоей программе). Но внезапно это вылилось в то, что функция вывода текста может рисовать текст со смещением всего в 2 пикселя.

И тут я этим активно пользуюсь.

fifan
01.03.2013, 18:14
Я у тебя взял шрифты, функцию вывода на экран (только немного её оптимизировал).

А я взял все подпрограммы вывода символа и работу с SD картой у HardWareMan'а. Ему хвала. :v2_dizzy_bye:

HardWareMan
01.03.2013, 18:55
Мухаха! А я советую не редровить весь экран, а только строку с курсором. Я в свое время на кружке писал уже драйвер ROM диска с менюшкой. Все на отлично шустро прорисовывалось на стандартном тормозном выводе символа, т.к. рисовал только то, что нужно (т.н. "дифф"). Т.е., стираем курсор пропечатывая строку, где он был, рисуем новый опять же печатая где он должен быть. Весь скрин редровить только при тотальной смене картинки. Ну а с шустрым выводом должно просто летать.

Касаемо:

Размер шрифта 6 пикселей, а в байте 8 символов. Поэтому пришлось делать 4 функции рисования символов (как в твоей программе). Но внезапно это вылилось в то, что функция вывода текста может рисовать текст со смещением всего в 2 пикселя.

И тут я этим активно пользуюсь.
Мы этим пользовались еще на стандартном спеце 23 года назад в кружке. Именно поэтому, в быстром выводе 4 ветки вывода символа, а в оригинальном работа через сдвиг с помощью команды DAD и сохранением результата в стеке. Это же решает проблему хранения координаты Х, которая имеет 384 точки и не влазит в байт. Храним ее как X/2. Такие дела.

vinxru
01.03.2013, 20:04
Я даже курсор xor fillRect рисую.

HardWareMan
01.03.2013, 21:37
Именно.

vinxru
01.03.2013, 21:39
Сегодня сил нет паять.

HardWareMan
01.03.2013, 22:02
Ну дык тяпница же!

Error404
03.03.2013, 00:10
Мухаха! А я советую не редровить весь экран, а только строку с курсором. Я в свое время на кружке писал уже драйвер ROM диска с менюшкой. Все на отлично шустро прорисовывалось на стандартном тормозном выводе символа, т.к. рисовал только то, что нужно (т.н. "дифф"). Т.е., стираем курсор пропечатывая строку, где он был, рисуем новый опять же печатая где он должен быть. Весь скрин редровить только при тотальной смене картинки. Ну а с шустрым выводом должно просто летать.

Касаемо:

Мы этим пользовались еще на стандартном спеце 23 года назад в кружке. Именно поэтому, в быстром выводе 4 ветки вывода символа, а в оригинальном работа через сдвиг с помощью команды DAD и сохранением результата в стеке. Это же решает проблему хранения координаты Х, которая имеет 384 точки и не влазит в байт. Храним ее как X/2. Такие дела.


Я даже курсор xor fillRect рисую.

Робяты, а почему вы не хотите сделть отдельный драйвер с быстрым выводом? Допилить его до совместимости с VT52 и пользовать _общий_ драйвер из множества разных программ. А то fifan лепит прямо по экрану, vinxru лепит прямо по экрану, а используют одни и те же идеи вывода символа.

vinxru, если вы не принципиальный писатель исключительно своего кода, то может пригодится мой оконный драйвер? Я вот частенько заимствую из OpenSource - не всегда код (и не всегда он сомпилируем на наших слабых машинках) иногда идеи, и не. Мой драйвер теоретически для VT52, но оттуда используется только позиционирование курсора, очистка экрана и собственно вывод на экран - те п\п что у вас уже есть. Драйвер при вводе символа автоматически поддерживает "текстовый экранный буфер" (SCREEN.C), что при окрытии окна требует в 8 раз меньше места для сохранения подоконного содержимого (т.к. сохраняются коды символов, а не память), а при закрытии окна происходит перевывод на экран этого содержимого (при вашей быстрой п\п вывода символа будет очень симпатично, даже на тормозном Орионовском драйвере было терпимо), а самое главное дает оконные функции без переписывания всего экрана и лазания в экранную память в сугубой псевдографике, т.е. аппаратно независимо - хоть на Апогее с его текстовым экраном, хоть на Орионе с его графическим экраном. Написаны оконные функции (WINDOWS.C), несколько базовых контролов (CONTROL.C) поддерживается некая система псевдообъектных сущностей, связанных сообщениями/событиями. Двухпанельный коммандер как с картинки отрисовывался бы вызовом 2-х подпрограмм создания 2-х объектов (собственно такой коммандер на этих библиотеках и сделан - п\п do_menu() в MENU2.C). А все скроллинги внутри контролов уже реализованы, количество столбцов - это тупо свойство и может переключаться и т.п.
Написано на С. Либа минималистическая (компромисно с удобством), и эффективным компилятором компилируется в несколько килобайт.

vinxru
03.03.2013, 03:19
http://s58.radikal.ru/i161/1303/bc/99c7db759a6a.jpg

http://s49.radikal.ru/i125/1303/00/e0fe01ca7504.jpg

Все, с пайкой вроде покончено! Оcталось программы доделать. :)

---------- Post added at 02:17 ---------- Previous post was at 02:11 ----------

Процессоры кончились :( Один на 4 компьютера.

---------- Post added at 02:19 ---------- Previous post was at 02:17 ----------

Программатор шьет теперь только флешки на MX28F1000. Жду программатор из Китая.

HardWareMan
03.03.2013, 15:06
Робяты, а почему вы не хотите сделть отдельный драйвер с быстрым выводом? Допилить его до совместимости с VT52 и пользовать _общий_ драйвер из множества разных программ.
Я со временем допилю свой вывод до VT52, я уже вроде об этом говорил уже.

vinxru
03.03.2013, 16:34
Я посмотрю, даже попытаюсь скомпилировать. Но выводить графику напрямую на экран быстрее, чем через VT52

HardWareMan
03.03.2013, 18:14
Надо определиться6 графику или псевдографику. Второе быстро и через вывод символа.

vinxru
12.03.2013, 01:15
Время, время. Сегодня все мои родные заболели гриппом и ушли спать, поэтому у меня появилось время доделать Спец.

http://s018.radikal.ru/i500/1303/89/9da02f0ce1dd.jpg

Сделал чтение каталога. Остается это прикрутить к коммандеру.

Хотя есть еще мысль, сделать стандартные точки входа в BIOS. Запуск программы, чтение файла, чтение каталога. Что бы разделить коммандер и SD-контроллер.



#include <spec/bios.h>

typedef struct {
ulong fsize; /* File size */
ushort fdate; /* Last modified date */
ushort ftime; /* Last modified time */
uchar fattrib; /* Attribute */
char fname[13]; /* File name */
} FILINFO;

#define CLC_PORT (*(char*)0xF001)
#define DATA_PORT (*(char*)0xF002)
#define CTL_PORT (*(char*)0xF003)
#define CLC_BIT 0x80
#define SEND_MODE 0x90 // Настройка: 1 0 0 A СH 0 B CL 1=ввод 0=вывод
#define RECV_MODE 0x99

void pulse() {
CLC_PORT = CLC_BIT;
CLC_PORT = 0;
}

void cmdStart() {
// Начало передачи
CTL_PORT = SEND_MODE;

// Передаем код команды
DATA_PORT = 0x13;
pulse();
DATA_PORT = 0xB4;
pulse();
DATA_PORT = 0x57;
pulse();
}

uchar wait() {
for(;;) {
pulse();
if(DATA_PORT == 0) continue;
if(DATA_PORT == 1) return 0;
return 1;
}
}

uchar openDir(char* path) {
cmdStart();

// Код команды
DATA_PORT = 3;
pulse();

// Передаем путь
for(;;) {
DATA_PORT = *path;
pulse();
if(*path==0) break;
++path;
}

// Переключаемся в режим приема
CTL_PORT = RECV_MODE;

// МК должен ответить кодом 12h
pulse();
if(DATA_PORT != 0x12) return 0xEF;

// Ожидание готовности
if(wait()) return 0xEE;

// Результат выполнения
pulse();
return DATA_PORT;
}

void recvBuffer(void* b, uchar l) {
while(l) {
pulse();
*(uchar*)b = DATA_PORT;
++((uchar*)b);
--l;
}
}

uchar readDir(FILINFO* dir) {
uchar r;

cmdStart();

// Код команды
DATA_PORT = 4;
pulse();

// Переключаемся в режим приема
CTL_PORT = RECV_MODE;

// МК должен ответить кодом 12h
pulse();
if(DATA_PORT != 0x12) return 0xEF; // Ошибка

// Ожидание готовности
if(wait()) return 0xEE; // Ошибка

// МК должен ответить кодом ??
pulse();
r = DATA_PORT;

// Принимаем файл
recvBuffer(dir, sizeof(FILINFO));

// Последний файл
if(dir->fname[0]==0) return 0xEC;

return r;
}

void main() {
FILINFO dir;
uchar i;
uchar n;

puts("OPENDIR & READDIR TEST\r\n");

if(i=openDir("")) {
puts("OPENDIR RESULT ");
puthex(i);
puts("\r\n");
while(1);
}

puts("OPENED\r\n");

n=0;
for(;;) {
i=readDir(&dir);
if(i) break;
puthex(n);
putch(' ');
for(i=0; i<13 && dir.fname[i]; ++i) putch(dir.fname[i]);
for(; i<13; ++i) putch(' ');
putch(' ');
puthex(((char*)&dir.fsize)[3]);
puthex(((char*)&dir.fsize)[2]);
puthex(((char*)&dir.fsize)[1]);
puthex(((char*)&dir.fsize)[0]);
putch(' ');
puthex(((char*)&dir.fdate)[1]);
puthex(((char*)&dir.fdate)[0]);
putch(' ');
puthex(((char*)&dir.ftime)[1]);
puthex(((char*)&dir.ftime)[0]);
putch(' ');
puthex(dir.fattrib);
puts("\r\n");
++n;
}

puts("READDIR RESULT ");
puthex(i);
puts("\r\n");

while(1);
}

Error404
12.03.2013, 12:16
Сделал чтение каталога. Остается это прикрутить к коммандеру.

Хотя есть еще мысль, сделать стандартные точки входа в BIOS. Запуск программы, чтение файла, чтение каталога. Что бы разделить коммандер и SD-контроллер.


Собственно, это и будет операционная система, пускай и в первом приближении. А раз речь зашла об операционной системе, то может выбрать из имеющихся и допилить к ним BIOS с новыми фишками? Хоть какая-то совместимость с чем-то получится.

vinxru
12.03.2013, 12:22
Собственно, это и будет операционная система, пускай и в первом приближении. А раз речь зашла об операционной системе, то может выбрать из имеющихся и допилить к ним BIOS с новыми фишками? Хоть какая-то совместимость с чем-то получится.

Я кроме CP/M на 8080 ничего не знаю.

b2m
12.03.2013, 13:13
Я кроме CP/M на 8080 ничего не знаю.
Довольно сложно будет "подружить" CP/M и FAT на SD-карте. Если уж хочется, чтобы работали CP/M-программы, то скорее всего нужно будет делать "CP/M-прокладку", т.е. реализовать функции CP/M для своей ДОС.

vinxru
12.03.2013, 13:30
Довольно сложно будет "подружить" CP/M и FAT на SD-карте. Если уж хочется, чтобы работали CP/M-программы, то скорее всего нужно будет делать "CP/M-прокладку", т.е. реализовать функции CP/M для своей ДОС.

Конкретно про запуск CP/M на этом чуде. CP/M не будет видеть FAT32. На флешке будут находится образы дискет.

Есть конечно мысль, сделать новую ОС, совместимую по точкам входа с CP/M, но работающая с FAT-ом... Но есть другие, более нужные дела :)

fifan
12.03.2013, 18:25
На флешке будут находится образы дискет.
Образы дискет какого формата? На "Стандартном" Специалисте их не было. На Специалисте_МХ есть odi (http://www.nedopc.org/forum/viewtopic.php?t=9406&start=0) формат. У меня он будет поддерживаться на SpetsCommander'е.

vinxru
12.03.2013, 18:29
Образы дискет какого формата? На "Стандартном" Специалисте их не было. На Специалисте_МХ есть odi формат. У меня он будет поддерживаться на SpetsCommander'е.

RAW

Непрерывно идущие сектора.

fifan
12.03.2013, 19:33
А по подробнее... Нужно описание RAW.

vinxru
12.03.2013, 20:37
Посмотрел я на ODI. Я это и имею в виду.

---------- Post added at 19:37 ---------- Previous post was at 19:24 ----------

Только файловая система там не FAT12, а CP/M

vinxru
12.03.2013, 22:45
http://s56.radikal.ru/i154/1303/76/a16b39cc0171.jpg

http://s019.radikal.ru/i642/1303/8a/663b6e8483fe.jpg

Библиотека PetitFS (зашитая в МК) не хочет в подпапках открывать файлы. Буду разбираться.

Ну и дописать коммандер немного.

vinxru
13.03.2013, 12:44
Не хватает кнопок CTRL и ALT :(

Может туда прибить ПС и ПВ ?

HardWareMan
13.03.2013, 13:30
Для чего специалисту котрол и альт?!

vinxru
13.03.2013, 13:45
В коммандере ALT+F1, Ctrl+Enter, Ctrl+E, Ctrl+O нажимать.

Сразу бы сделал так, но останавливает мысль, что на других компах этих кнопок то же нет.

Error404
13.03.2013, 15:12
В коммандере ALT+F1, Ctrl+Enter, Ctrl+E, Ctrl+O нажимать.

Сразу бы сделал так, но останавливает мысль, что на других компах этих кнопок то же нет.

Похоже, планируется кроме экрана еще и в клавиатуру лазить напрямую мимо стандартных точек входа? Ужос. :)

Кстати, а на Спеце зоопарка клавиатур не было?
На Орионе было аж 3 типа подключения клавиатур (РК и 2 типа подключения МС7007), у каждого матрица включалась по-разному и фокус с прямым лазанием мимо Монитора или требовал геморойной настройки на клавиатуру, или приводил к неожиданному.

HardWareMan
13.03.2013, 15:31
Не, на Спеце все спокойно с клавой. Но так как в ней все выводы были подтянуты к + и не было диодов, это породило зоопарк кода опроса, что вываливается в сложность эмулятора клавки.

vinxru
13.03.2013, 15:32
Похоже, планируется кроме экрана еще и в клавиатуру лазить напрямую мимо стандартных точек входа? Ужос.

Да не ужас, а наоброт в порядке вещей. Все равно, клавиатура несовместима с 866 кодировкой, которая используется у меня. Нет там поддержки строчных букв и автоповтора.

b2m
13.03.2013, 15:34
Кстати, а на Спеце зоопарка клавиатур не было?
Если не считать, что Специалист-МХ имел несколько иную раскладку (смещённые функциональные клавиши и пара новых), то не было.

vinxru
13.03.2013, 15:37
смещённые функциональные клавиши и пара новых

Разве смещенные?

Просто переименовали в F1-F12.

b2m
13.03.2013, 15:41
Называй как хочешь, но факт остаётся фактом: F1-F10 не на одинаковых местах (битах клавиатурной матрицы).

vinxru
13.03.2013, 15:46
Если занудничать (а я этого делать не буду), то раньше вообще F1-F10 не было. И ESС, TAB не было

Было
http://www.spetsialist-mx.ru/images/keyboard1.png

Стало
http://www.spetsialist-mx.ru/images/Keyboard2.png

---------- Post added at 14:46 ---------- Previous post was at 14:45 ----------

Во, CTRL есть! :)

b2m
13.03.2013, 15:52
Ну HELP это же обычно F1 :)

HardWareMan
13.03.2013, 15:57
Называй как хочешь, но факт остаётся фактом: F1-F10 не на одинаковых местах (битах клавиатурной матрицы).
А как же я тогда клаву от МХа использовал на стандарте и наоборот?
На Экспрессе, был ряд: F F1 F2..., в МХе "F" переименовали ESC/АР2. Фотки тут показывал.

Стало
http://www.spetsialist-mx.ru/images/Keyboard2.png
Неправильно "стало". ESC там идет, а потом уже F1. Хотя, смотрю на брошурку и вижу несоответствие, т.к., у меня лежит МХ и там стандартная матрица.
http://savepic.ru/4270211.png

b2m
13.03.2013, 16:13
И ESС, TAB не было
Было. Если набрать и запустить в моём эмуляторе Специалиста:

L1: CALL 0C803h
CALL 0CE9Dh
JMP L1
то клавиши ESС и TAB выдают соответствующие им коды.

vinxru
13.03.2013, 16:30
На Экспрессе, был ряд: F F1 F2..., в МХе "F" переименовали ESC/АР2. Фотки тут показывал.

Зачем, если AP2/ESС стоит около пробела?

F оно и остается F. У меня F1, потому что весь верхний ряд непонятных кнопок вписывается в F1-F12.

Более того, легко понять это соответствие. На PC клавиатуре кнопки расположены подряд, так же как на оригинале.

---------- Post added at 15:30 ---------- Previous post was at 15:27 ----------

Вон там AP2. В правой колонке между пробелом и TAB-ом.

http://www.spetsialist-mx.ru/schemes/SpetsialistM_6.png

И F уже подписано как F1!

b2m
13.03.2013, 16:42
Сравните коды клавиш в таблицах драйвера клавиатуры:

Стандартный:

00 01 02 03 04 05 06 07 8A 8B 8C 1F
3B 31 32 33 34 35 36 37 38 39 30 2D
6A 63 75 6B 65 6E 67 7B 7D 7A 68 3A
66 79 77 61 70 72 6F 6C 64 76 7C 2E
71 7E 73 6D 69 74 78 62 60 2C 2F 7F
81 0C 19 1A 09 1B 20 08 80 18 0A 0D

MX:

1B 8A 00 01 02 03 04 05 06 8B 8C 1F
3B 31 32 33 34 35 36 37 38 39 30 2D
4A 43 55 4B 45 4E 47 5B 5D 5A 48 3A
46 59 57 41 50 52 4F 4C 44 56 5C 2E
51 5E 53 4D 49 54 58 42 40 2C 2F 5F
81 0C 19 1A 20 20 20 08 09 18 0A 0D

Клавиши с кодом 00-07 это, я считаю, F1-F8.

---------- Post added at 17:42 ---------- Previous post was at 17:37 ----------

У МХ, оказывается, наоборот меньше клавиш: нет клавиш с кодом 07 (F8) и 80 (ПВ повтор).

vinxru
13.03.2013, 16:48
AP2 и TAB то же нет.

---------- Post added at 15:47 ---------- Previous post was at 15:46 ----------

1B 8A 00 01 02 03 04 05 06 8B 8C 1F
3B 31 32 33 34 35 36 37 38 39 30 2D
4A 43 55 4B 45 4E 47 5B 5D 5A 48 3A
46 59 57 41 50 52 4F 4C 44 56 5C 2E
51 5E 53 4D 49 54 58 42 40 2C 2F 5F
81 0C 19 1A 20 20 20 08 09 18 0A 0D

---------- Post added at 15:47 ---------- Previous post was at 15:47 ----------

Что же они так небрежно отнеслись к клавишам, которые поддерживаются Монитором 2.

---------- Post added at 15:48 ---------- Previous post was at 15:47 ----------


Было. Если набрать и запустить в моём эмуляторе Специалиста:
Код:

L1: CALL 0C803h
CALL 0CE9Dh
JMP L1

то клавиши ESС и TAB выдают соответствующие им коды.

В Мониторе 1 нет этих точек входа. Попытался запустить.

Кстати на TAB реагирует совсем не так, как на AP2, F, F1, Пробел и все остальные. Значит там то же был TAB, а не 3 пробела.

b2m
13.03.2013, 16:50
AP2 и TAB то же нет.

1B 8A 00 01 02 03 04 05 06 8B 8C 1F
3B 31 32 33 34 35 36 37 38 39 30 2D
4A 43 55 4B 45 4E 47 5B 5D 5A 48 3A
46 59 57 41 50 52 4F 4C 44 56 5C 2E
51 5E 53 4D 49 54 58 42 40 2C 2F 5F
81 0C 19 1A 20 20 20 08 09 18 0A 0D

AP2 = Esc = 1B
TAB = Tab = 09

---------- Post added at 17:50 ---------- Previous post was at 17:48 ----------


Попытался запустить.
В моём эмуляторе? Глазам не верю :)

fifan
13.03.2013, 16:50
AP2 и TAB то же нет.
В Мониторе 1 нет этих точек входа. Попытался запустить.
AP2 и TAB в Мониторах 1 и 2 не было. А приведённая схема клавиатуры от Специалиста-М, в нём свой монитор был, так называемый "оконный". См. "примечание редакции" в этом номере МК (http://www.spetsialist-mx.ru/Docs/mk1991_09.djvu), выше рекламы на последней странице.

vinxru
13.03.2013, 16:55
У тебя 09 на месте кнопки ПВ.

---------- Post added at 15:52 ---------- Previous post was at 15:51 ----------

81 0C 19 1A 20 20 20 08 09 18 0A 0D

РУС - HOME - Стрелка - Стрелка - AP2 - TAB - Пробел - Стрелка - ПВ - Стрелка - ПС - ВК

---------- Post added at 15:53 ---------- Previous post was at 15:52 ----------


AP2 и TAB в Мониторах 1 и 2 не было. А приведённая схема клавиатуры от Специалиста-М, в нём свой монитор был, так называемый "оконный".

У меня коммандер то работает с TAB-ом и AP2 через Монитор 2

---------- Post added at 15:55 ---------- Previous post was at 15:53 ----------

Короче, Монитор-2 выдает коды 9 и 1B при нажатии клавиш, которые стоят рядом с пробелом

---------- Post added at 15:55 ---------- Previous post was at 15:55 ----------

Запустил только что реал и проверил.

b2m
13.03.2013, 16:58
Монитор 1 это у которого такая таблица:

82 83 84 85 86 87 88 89 8A 8B 8C 1F
3B 31 32 33 34 35 36 37 38 39 30 3D
4A 43 55 4B 45 4E 47 5B 5D 5A 48 3A
46 59 57 41 50 52 4F 4C 44 56 5C 2E
51 5E 53 4D 49 54 58 42 40 2C 2F 5F
81 0C 19 1A 20 09 03 08 80 18 0A 0D

?

vinxru
13.03.2013, 16:59
В моём эмуляторе? Глазам не верю

Ага. Подключил туда прошивку Монитор 1

vinxru
13.03.2013, 17:01
Монитор 1 это у которого такая таблица:

Я не знаю, не смотрел. Просто ROM файл подставил.

---------- Post added at 16:01 ---------- Previous post was at 16:00 ----------

Во мне укореняется мнение, что автор МХ-а совсем не думал о совместимости.

b2m
13.03.2013, 17:01
Короче, Монитор-2 выдает коды 9 и 1B при нажатии клавиш, которые стоят рядом с пробелом
Именно его я и использую в эмуляторе, в архиве с сайта Пыхонина с несколькими мониторами он помечен как "стандартный".

vinxru
13.03.2013, 17:09
Зато я понял, что хотел fifan, когда говорил о раскладках MX в контроллере клавы.

Добавим еще 2 раскладки.

fifan
13.03.2013, 17:14
Зато я понял, что хотел fifan, когда говорил о раскладках MX в контроллере клавы.

Добавим еще 2 раскладки.
Да, поэтому я и предлагал ввести сигнал MX/STD. Я так сделал в реплике Специалиста на FPGA.

vinxru
13.03.2013, 18:19
http://s019.radikal.ru/i607/1303/cf/1649f837657a.png

---------- Post added at 16:16 ---------- Previous post was at 16:15 ----------

Я сделал еще одну кнопку.

QWERTY MODE будет переключать QWERTY/ЙЦУКЕН раскладки и светится Scroll Lock-ом

MX MODE будет переключать раскладку MX и светится Caps Lock-ом

---------- Post added at 16:17 ---------- Previous post was at 16:16 ----------

А что делает кнопка ПС (или LF) ?

---------- Post added at 16:35 ---------- Previous post was at 16:17 ----------

Идеи по BIOS-у SD-контроллера.

Сейчас в MK используется библиотека PetitFAT, очень ограниченная в возможностях. А еще и тормозная. Но переделывать её некогда.
Поэтому функции BIOS я буду составлять исходя из его ограничений.

При включении компьютера, если вставлена флешка, автоматически будет загружаться файл /boot.rks.

Загрузка в память файла /boot.rks и запуск.
uchar boot();
Адрес 0D800h
Адрес памяти, куда будет загружаться файл берется из заголовка файла.
На выходе A - код ошибки. Если нет ошибки, файл запускается

Загрузка в память произвольного файла и запуск.
uchar exec(const char* fileName);
Адрес 0D803h
HL - имя файла
На выходе A - код ошибки. Если нет ошибки, файл запускается

Начать поиск файлов в папке
uchar findFirst(const char* pathName);
Адрес 0D806h
HL - имя папки и маска
На выходе A - код ошибки. 0 - если нет ошибки

Продолжить поиск файлов
ushort findNext(FileInfo* result, ushort max);
Адрес 0D809h
HL - адрес, куда записывать информацию о файлах
DE - максимальное кол-во файлов
На выходе
A - код ошибки. 0 - если нет ошибки
HL - кол-во записанных файлов

Загрузка в память произвольной области файла
ushort readFile(const char* fileName, ulong offset, ushort size, void* destAddr);
Адрес 0D80Сh
HL - имя файла
BC - адрес памяти, куда загружать.
DE - максимальная длина
PUSH - смещение в файле (32 бита)
На выходе
A - результат. 0-нет ошибки
HL - размер загруженного файла

Сохранение области памяти в произвольное место файла
uchar readFile(const char* fileName, ulong offset, ushort size, const void* srcAddr);
Адрес 0D80Fh
HL - имя файла
BC - адрес памяти, куда загружать.
DE - длина
PUSH - смещение в файле (32 бита)
На выходе
A - результат. 0-нет ошибки

+ еще 26 резервных точек входа.

* Функции сохранения в файл не могут создавать новые файлы и изменять размер существующих. А так же должны записывать данные выровненные по смещению 512 байт, длинной кратной 512 байтам.

---------- Post added at 17:19 ---------- Previous post was at 16:35 ----------

Я подумал, подумал. Во первых будет сложно засунуть 4 раскладки в 512 байт памяти, а во вторых лень их настраивать.

Я сделаю подмену клавиш в прошивке, когда включен режим MX

Отсутствующие клавиши TAB и AP2 на MX, будут заменяться на клавиши TAB (которая была ПВ) и AP2 (которая была F).

И сдвигать все клавиши верхнего ряда Специалиста вправо.

HardWareMan
13.03.2013, 18:59
Драйвер Монитор-4 использует эту раскладку:

00 01 02 03 04 05 06 07 8A 8B 8C 1F
3B 31 32 33 34 35 36 37 38 39 30 2D
6A 63 75 6B 65 6E 67 7B 7D 7A 68 3A
66 79 77 61 70 72 6F 6C 64 76 7C 2E
71 7E 73 6D 69 74 78 62 60 2C 2F 7F
81 0C 19 1A 09 1B 20 08 80 18 0A 0D
Нортон тоже. Все более старые мониторы, ЕМНИП, тоже. Драйвер от М я не знаю - не встречался. МХ использовал раскладку, показанную выше: значение функциональных клавиш сдвинуто, это верно. Но я все равно придерживаюсь раскладки из Монитора-4, это мой утёнок (http://lurkmore.to/%D0%A1%D0%B8%D0%BD%D0%B4%D1%80%D0%BE%D0%BC_%D1%83% D1%82%D0%B5%D0%BD%D0%BA%D0%B0), увы.

Тем не менее, напоминаю основную мысль, сказанную выше: аппаратно клавиатуры все одинаковы, разница лишь в интерпретации нескольких клавиш. Чего не скажешь за Орионовские варианты, правда?

vinxru
13.03.2013, 20:23
Ага. Радио 86РК то же под УКНЦ-шную клавиатуру выпускались. Это например Электроника КР02-КР04

vinxru
14.03.2013, 01:50
Два вечера пытался заставить функцию сортировки файлов работать. Работает.

fifan
14.03.2013, 05:32
vinxru, а когда будет готова прошивка под PS/2 адаптер? На следующей недели уже начну его паять.

vinxru
14.03.2013, 13:48
vinxru, а когда будет готова прошивка под PS/2 адаптер? На следующей недели уже начну его паять.

Ок, постораюсь доделать в ближайшее время:
1) Режим MX
2) Горячее подключение клавиатуры.

---------- Post added at 10:56 ---------- Previous post was at 10:10 ----------

Сортировка, отображение информации о файле, при выходе из папки курсор позиционируется на эту папку.

http://s019.radikal.ru/i616/1303/4b/3ff9de5d3624.jpg

0. Доделать SD BIOS
1. Надо еще расширения сделать по правому краю, отображение атрибутов.
2. Свой драйвер клавиатуры.
3. Файл привязки расширений к программам
4. Сохранение командной строки куда нибудь в ОЗУ, что бы запущенные программы могли это найти.
5. Сохранение состояние коммандера на диск, что бы при возврате из программ просмотра, можно было восстановить состояние. (Папку, положение скролла и курсора)
6. Совсем в далеком будущем, копирование, переименование, удаление файлов, удаление папок, выделение файлов, изменение атрибутов, поиск по диску, CTRL+L, изменение сортировки, разные виды панелей, определение размера папки нажатием F3
7. Программу просмотра, редактор.
8. Еще позже меню и все горячие клавиши и функции Volcov Commander.

Все это не сразу. Сначала сделаю командер в режиме read/only

---------- Post added at 12:48 ---------- Previous post was at 10:56 ----------

Как проще всего отмыть канифоль?

Terazini
15.03.2013, 15:58
Как проще всего отмыть канифоль?

зубную щётку макаешь в спирт/растворитель/ и шоркаешь ей плату.

кстати, у тебя монитор с AV входом или подключаешь через тв тюнер?

vinxru
15.03.2013, 16:05
зубную щётку макаешь в спирт/растворитель/ и шоркаешь ей плату.

Отчищаю я платы щеткой. Но остаются разводы канифоли. Как удалить полностью?

Платы поменьше, после щетки, я кладу в пластиковую ёмкость и многократно поливаю растворителем. А потом еще мою под водой и сушу в духовке, что бы налета не оставалось.

Но! Эта плата очень большая, у меня нет такой коробки и туда пол литра спирта/ацетона уйдет.

---------- Post added at 15:05 ---------- Previous post was at 15:04 ----------


кстати, у тебя монитор с AV входом или подключаешь через тв тюнер?

с AV входом. Только вот RGB входа нет.

HardWareMan
16.03.2013, 10:30
Приходи к нам (http://www.nedopc.org/forum/index.php), у нас есть годный рецепт.

fifan
16.03.2013, 19:16
Есть полный дизассемблированный текст прошивки Специалиста_МХ без программ ассемблера, отдатчика, дизассемблера. Мнемоника z80, восстановил из текстов дискет от Афанасьева. Выкладывать?

vinxru
16.03.2013, 19:45
выкладывай :)

fifan
16.03.2013, 20:48
Вот (http://www.spetsialist-mx.ru/Soft/Specimx2.rar).

vinxru
17.03.2013, 01:08
Еще не смотрел, сил нет. Сегодня доделал колонки, которые год назад начал делать. Делал надписи на задней стенке (http://s018.radikal.ru/i504/1303/a1/be4ca7625e22.jpg).

vinxru
25.03.2013, 00:01
Сделал автоматическую загрузку с флешки, если она вставлена. ПЗУ контроллера запускается первым.

Поэтому мне пришлось перенести инициализацию к себе



; Схема начального запуска
EI
MVI A, 82h
STA 0FF03h

; Инициализация стека (аналогично стандартному монитору -1)
LXI SP, 07FFEh

; Какие то системные переменные
lxi h, 0C473h
lxi d, 0C494h
lxi b, 08FDFh
call 0C42Dh

; Очистка экрана
lxi h, aHello
call 0C438h

vinxru
27.03.2013, 01:19
Переписал BIOS и прошивку контроллера SD. Готовы функции:

D800
Запустить файл boot.rks

D803
Получить версию набора команд и текст для вывода на экран (дата прошивки)
HL-адрес 17 байтного буфера (1 байт - версия команд МК, 16 байт текст из МК)
A-код ошибки

D806
Запустить произвольный файл
HL-имя файла
A-код ошибки

D809
Получить список файлов в папке
BC-путь, HL-максимум файлов для загрузки, DE-адрес буфера
DE-сколько загрузили, A-код ошибки

D80С
Получить недополученные файлы
HL-максимум файлов для загрузки, DE-адрес буфера
DE-сколько загрузили, A-код ошибки



typedef struct {
ulong fsize; /* File size */
ushort fdate; /* Last modified date */
ushort ftime; /* Last modified time */
uchar fattrib; /* Attribute */
char fname[11]; /* File name */
} FileInfo;

vinxru
27.03.2013, 15:39
D80F
Прочитать кусочек файла
DE-имя файла, HL-размер, BC-адрес в памяти, STACK32-смещение в файле
DE-загруженный размер, A-код ошибки

---------- Post added at 14:39 ---------- Previous post was at 14:30 ----------

Получается код паравозиком.

Функция Си вызывает BIOS



uchar readFile(const char* fileName, uint offsetl, uint offseth, void* buf, uint len, uint* readed) {
asm {
PUSH B
; Стек - смещение в файле
LHLD openDir_3
PUSH H
LHLD openDir_2
PUSH H
; BC - адрес
LHLD openDir_4
MOV B, H
MOV C, L
; DE - имя файла
LHLD openDir_1
XCHG
; HL - размер
LHLD openDir_5
; Вызов
CALL 0D80Fh
; Сохраняем кол-во загруженных в *cnt
LHLD openDir_6
MOV M, E
INX H
MOV M, D

POP B
}
}


BIOS вызывает МК



CmdReadFile:
; Код команды
PUSH B
MVI B, 6
CALL StartCommand
POP B

; Размер блока
CALL SendWord ; HL-размер

; Имя файла
XCHG
CALL SendString ; DE-имя файла (далее только DE содержит полезные данные)

; Смещение в файле из стека
POP D ; Адрес возврата
POP H
CALL SendWord
POP H
CALL SendWord
PUSH D ; Адрес возврата

; Переключаемся в режим приема
MVI A, RECV_MODE
STA CTL_PORT

; МК должен ответить кодом 12h
CALL PulseAndRecv
CPI 012h
MVI A, ERR_COMMAND
RNZ

; Ждем пока МК прочитает
CALL WaitForReady
RNZ

; Результат выполнения команды
CALL PulseAndRecv
ORA A
RNZ

; Размер загруженных данных
CALL PulseAndRecv
MOV E, A
CALL PulseAndRecv
MOV D, A

; Прием блока. Адрес BC длина DE.
PUSH D
CALL RecvBuf
POP D

; Прием кода ошибки
CALL PulseAndRecv
RET


МК передает управление PetitFS



void cmd_loadPartFile() {
ulong off=0;
ushort len=0;

// Прием аргументов
recvBin((char*)&len, sizeof(len));
recvString();
recvBin((char*)&off, sizeof(off));

// Ответ
SEND_START(0x12);
startWait();

// Читаем
bootLoadFileCommon(off, len);
}

// Общая функция для Boot и LoadFile
void bootLoadFileCommon(ulong loff, ushort llen) {
// Тут может быть задержка, компьюетр будет принимать нули
if(pf_open(buf)) {
sysinit();
if(pf_open(buf)) {
readError = 1;
stopWait();
SEND(readError);
return;
}
}

...

while(1) {
sendBuffer(buf, bufLen);
if(d2==0) break;

startWait();
readNext();
stopWait();
}
SEND(readError);
}


Далее управление передается драйверу SD, который посылает данные SD карте.

SD карта сама компьютер...

fifan
27.03.2013, 16:50
Я уже писал, что описанные здесь программные заморочки не вписываются в формат темы. Вообще-то это флуб. Создай отдельную тему, как я создал тему "Новые программы для Нового Специалиста". Свой Специалист ты уже давно восстановил, началась опытная эксплуатация с новым оборудованием, тем же контроллером SD карты. Твой контроллер отличается от контроллера от HardWareMan'а, значит нужно больше раскрыть его хард часть (схемы не было или я пропустил?). ПО под данный контроллер оформленное тобой в BIOS нуждается в соответственно оформленной теме.
Набралось чуть менее 200 топиков, а по теме наверное только 20. Попроси разъединить тему модераторов. Хорошо б видеть конечный результат работы BIOS. Если б я писал результат работы каждой версии своего SpetsCommander'а то не какого бы форума не хватило бы.

vinxru
27.03.2013, 17:12
Если б я писал результат работы каждой версии своего SpetsCommander'а то не какого бы форума не хватило бы.

Я думал, вдруг кто то придет скажет что то умное. Лучше что бы сказали пока я делаю, потому что в конце мне будет крайне лень что то передывать.

---------- Post added at 16:09 ---------- Previous post was at 16:06 ----------


Твой контроллер отличается от контроллера от HardWareMan'а, значит нужно больше раскрыть его хард часть (схемы не было или я пропустил?).

Была вроде.

http://zx-pk.ru/showpost.php?p=579262&postcount=123

Хард часть крайне простая. Флешка - микроконтроллер - порт компьютера. Плюс стабилизатор/переходник на 3.3 Вольта.

---------- Post added at 16:09 ---------- Previous post was at 16:09 ----------


Попроси разъединить тему модераторов.

Модераторы, делите тему, как вам угодно.

---------- Post added at 16:12 ---------- Previous post was at 16:09 ----------

Вообще, осталась одна функция - запись в файл. Потом еще раз всё проверю и один компьютер отправится в долгое путешествие почтой России.

А я займусь контроллерами для Ориона, БК и Апогея. То же самое, но слегка адаптированное.

fifan
27.03.2013, 17:15
Я то слежу за твоими изысканиями, решения применяемые в процедурах радуют. Я то ни очень хорошо пишу программы. Если натыкаюсь на тупик, то потом долго не начинаю, а ты прям стросишь и строчишь. Но я чувствую, что у тебя потеряется совместимость с оригинальным Мониторм Специалиста или ты не трогаешь его? Я свой SpetsBrowser поместил в верхние 8 кБайт ПЗУ, не трогая Монитор.

vinxru
27.03.2013, 17:48
Но я чувствую, что у тебя потеряется совместимость с оригинальным Мониторм Специалиста или ты не трогаешь его? Я свой SpetsBrowser поместил в верхние 8 кБайт ПЗУ, не трогая Монитор.

У меня SDBIOS сидит по адресу D800.

В оригинальном ПЗУ я поменял только первые три байта на JMP D800, после старта управление передается SDBIOS. Он проверяет наличие флешки и загружает файл boot.rks. Если такого файла нет, то переходит на стандартную ПЗУ.

---------- Post added at 16:20 ---------- Previous post was at 16:19 ----------

Я этот BIOS задумал для совместимости с твоей программой и программой Hardwareman-а.

Когда руки дойдут, вставлю в код переходы на SDBIOS :)

---------- Post added at 16:24 ---------- Previous post was at 16:20 ----------

Собственно SDBIOS нужен только для загрузки первого файла. Дальше программы могут сами работать с железом.

Размещать функции работы с флешкой в ПЗУ - это риск. Их не так просто будет обновить.

Но с другой стороны, я могу даже в эмуляторе b2m запускать программы. Напишу BIOS работающий с внешним ПЗУ, которое с легкостью можно эмулировать.

---------- Post added at 16:25 ---------- Previous post was at 16:24 ----------

Надо не забыть сделать точки входа в ОЗУ, что бы можно было загружать альтернативные драйверы.

---------- Post added at 16:38 ---------- Previous post was at 16:25 ----------

Мысль определенно хорошая. Вот например, я дарю fifan-у один такой контроллер. А ему никак не поставить SDBIOS в D800. Либо там вообще нет ПЗУ, либо что то полезное.

Надо подумать, куда засунуть точки входа.

Можно сдвинуть стек и разместить переменные в 7FFF. Есть маленькая вероятность, что какая то программа из за этого упадет.

А можно где то выше в области 8000-8FFF. Туда обычно никто не загружается.

---------- Post added at 16:48 ---------- Previous post was at 16:38 ----------

Еще надо коммандную строку запихнуть

HardWareMan
27.03.2013, 23:17
А я свое пишу, уже полностью поддерживается браузинг по папкам и чтение FAT12/FAT16 (FAT32 возможно в будущем), при этом код использует только 512 байт для буферизирования сектора и десяток ячеек для работы FS в целом. Для записи уже сделано 60% подпрограмм, и количество используемой памяти кодом не изменится. Но если понадобиться открывать более одного файла, тогда придется строить область FCB (http://en.wikipedia.org/wiki/File_control_block), а это 512 на сектор + десяток байт на состояние. Но зато все будет по взрослому, весь спектр сервиса DOS будет доступен. Думаю, если выделить 2КБ под работу FS, тогда можно будет поддержать до 2х открытых файлов в режиме потока (по сектору на файл, сектор для FS и служебные байты). В общем, пока бросать не собираюсь.

vinxru
27.03.2013, 23:26
Здорово. Вот поэтому я и хочу предложить сделать универсальный API.

vinxru
03.04.2013, 02:27
Сделал у себя в программах 4 раскладки клавиатуры



'+' ,'!' ,'"' ,'#' ,'$' ,'%' ,'^' ,'&' ,'*' ,'(' ,')' ,'=',
'J' ,'C' ,'U' ,'K' ,'E' ,'N' ,'G' ,'{' ,'}' ,'Z' ,'H' ,':',
'F' ,'Y' ,'W' ,'A' ,'P' ,'R' ,'O' ,'L' ,'D' ,'V' ,'\\','>',
'Q' ,'^' ,'S' ,'M' ,'I' ,'T' ,'X' ,'B' ,'@' ,'<' ,'?' ,8 ,

';' ,'1' ,'2' ,'3' ,'4' ,'5' ,'6' ,'7' ,'8' ,'9' ,'0' ,'-',
'j' ,'c' ,'u' ,'k' ,'e' ,'n' ,'g' ,'[' ,']' ,'z' ,'h' ,'*',
'f' ,'y' ,'w' ,'a' ,'p' ,'r' ,'o' ,'l' ,'d' ,'v' ,'\\','.',
'q' ,'^' ,'s' ,'m' ,'i' ,'t' ,'x' ,'b' ,'@' ,',' ,'/' ,8 ,

'+' ,'!' ,'"' ,'#' ,'$' ,'%' ,'^' ,'&' ,'*' ,'(' ,')' ,'=',
'Й' ,'Ц' ,'У' ,'К' ,'Е' ,'Н' ,'Г' ,'Ш' ,'Щ' ,'З' ,'Х' ,':',
'Ф' ,'Ы' ,'В' ,'А' ,'П' ,'Р' ,'О' ,'Л' ,'Д' ,'Ж' ,'Э' ,'>',
'Я' ,'Ч' ,'С' ,'М' ,'И' ,'Т' ,'Ь' ,'Б' ,'Ю' ,'<' ,'?' ,8 ,

';' ,'1' ,'2' ,'3' ,'4' ,'5' ,'6' ,'7' ,'8' ,'9' ,'0' ,'-',
'й' ,'ц' ,'у' ,'к' ,'е' ,'н' ,'г' ,'ш' ,'щ' ,'з' ,'х' ,'*',
'ф' ,'ы' ,'в' ,'а' ,'п' ,'р' ,'о' ,'л' ,'д' ,'ж' ,'э' ,'.',
'я' ,'ч' ,'с' ,'м' ,'и' ,'т' ,'ь' ,'б' ,'ю' ,',' ,'/' ,8 ,

roma
03.04.2013, 21:02
Имеется специалист-экспресс,

на CRT телевизоре изображение начинается за видимой областью, не видно первых два столбца и изображение немного плавает,

на LCD телевизоре перый столбец виден, но изображение плавает намного сильнее.

Вопрос к схемотехникам что и где крутить, что менять?

Схема и фото прилагаются.

vinxru
03.04.2013, 22:39
на CRT телевизоре изображение начинается за видимой областью, не видно первых два столбца и изображение немного плавает,

Тут даже сервисное меню телевизора не всегда помогает (там можно уменьшить ширину по горизонтали). Это особенность видеоадаптера компьютера.

HardWareMan
03.04.2013, 22:47
Будем отталкиваться от стандартной платы:
http://savepic.org/3160245m.jpg (http://savepic.org/3160245.jpg)
В первую очередь, ищем ЛА2 на торце:
http://savepic.org/3151029m.jpg (http://savepic.org/3151029.jpg)
Режем по красному и соединяем по синему:
http://savepic.org/3197108m.jpg (http://savepic.org/3197108.jpg)
В оригинале у Экспресса очень узкий кадровый импульс. Его хавают телики (даже многие современные), но он сводил с ума мой ТВ тюнер. Данная доработка удлиняет его и все становится шоколадно. Если этого недостаточно, то делается доработка №2:
http://savepic.org/3199156m.jpg (http://savepic.org/3199156.jpg)
Ее суть заключается в том, чтобы заменить штатный делитель в эммитерном повторителе на подстроечник, подкрутив который можно согласовать размер размах видеосигнала. Так же, мне пришлось закоротить конденсатор на выходе:
http://savepic.org/3200180m.jpg (http://savepic.org/3200180.jpg)
Этого более, чем достаточно. Замутишь - отпишись.

---------- Post added at 00:47 ---------- Previous post was at 00:40 ----------


Тут даже сервисное меню телевизора не всегда помогает (там можно уменьшить ширину по горизонтали). Это особенность видеоадаптера компьютера.
Мне только единственный раз пришлось крутить "сервисное меню" в телике для юзания Спеца: это в моем старом 3УСЦТ "Реккорд-Ц275" и только фазу строчной развертки, ибо: 1. она была с завода не правильной, 2. этого требовало RGB подключение, которое опережает обычный сигнал. В остальных случаях данный доработанный Спец на отлично показывал на всех моих теликах, в том числе на современном LED 3D и обычном LCD 24" и китайском 8".

vinxru
03.04.2013, 23:11
Мне только единственный раз пришлось крутить "сервисное меню" в телике для юзания Спеца: это в моем старом 3УСЦТ "Реккорд-Ц275" и только фазу строчной развертки, ибо: 1. она была с завода не правильной, 2. этого требовало RGB подключение, которое опережает обычный сигнал. В остальных случаях данный доработанный Спец на отлично показывал на всех моих теликах, в том числе на современном LED 3D и обычном LCD 24" и китайском 8".

Видимо тебе повезло, у тебя был всего один телик в жизни :) Шучу.

У меня страдали этим все трубчатые телики (в жизни). Монитор Электронику 32ВТЦ вообще крутилками настроить невозможно, что бы весь растр влезал. Я настроил так, что справа 16 пикселей не видно. Лучший вариант.

Почти у всех китайских CRT телевизоров края растра кривые, а сам растр изменяет размер в зависимости от яркости в строке. Поэтому китайцы его растягивают значительно шире экрана, что бы не пугать зрителя. Я настроил телик под растр УКНЦ и теперь наблюдаю весь этот ужас.

HardWareMan
03.04.2013, 23:15
Ну почему, у меня есть ВТЦ32 (он даже тут засветился). Я его вполне быстро подстроил (уменьшил размер растра и подкрутил фазу). Правда, сделал я это для Сеги а не спеца, но спец там тоже на отлично показывал.

vinxru
03.04.2013, 23:19
Напряжение в БП подстраивал? Это просто единственное, что я не делал.

roma
04.04.2013, 00:04
@HardWareMan спасибо, помогло !

Пункт первый не понадобился, а вот второй - помог. Замкнул конденсатор на выходе и немного уменьшил амплитуду выходного сигнала впаяв последовательно с резистором 100 ОМ ещё один такой же. Теперь на LCD телевизоре изображение отличное и стабильное. На CRT изображение тоже стабильнее, но первого столбца так и не видно ...

vinxru
14.04.2013, 02:28
А я добавил в библиотеку PetitFat функции

- Создать файл/папку.
- Удалить файл/папку.
- Изменить размер файла.

Отладить всё и можно полноценно с файловой системой работать.

vinxru
16.04.2013, 11:01
Как то так. Если кто то заметит ошибку, кричите.



/*-----------------------------------------------------------------------*/
/* Format name for directory entry */
/*-----------------------------------------------------------------------*/

// Стандартная функция create_name изменяет второй аргумент, а это
// нам не надо.

static FRESULT create_name_2(DIR* dj, const char* name) {
return create_name(dj, &name);
}

/*-----------------------------------------------------------------------*/
/* Save sector */
/*-----------------------------------------------------------------------*/

// Сохранить сектор на диск

static DRESULT disk_write(const BYTE* buf, DWORD sector) {
DRESULT r;
// Начало операции записи
if(r = disk_writep(0, sector)) return r;
// Запись данных
if(r = disk_writep(buf, 512)) return r;
// Окончание операции записи
return disk_writep(0, 0);
}

/*-----------------------------------------------------------------------*/
/* Reset free space counters on start */
/*-----------------------------------------------------------------------*/

// Вызов этой функции надо добавить в конец pf_mount
//
// if(fs->fs_type==FS_FAT32 && LD_WORD(buf+BPB_RsvdSecCnt-13)>0)
// if(resetFreeSpace(bsect+1, buf512))
// return FR_DISK_ERR;

static DRESULT resetFreeSpaceFat32(unsigned long bootSectorPlus1, BYTE* buf512) {
DRESULT r;
if(r = disk_readp(buf512, bootSectorPlus1, 0, 512)) return r;
if(*(unsigned long*)buf512 != 0x41615252) return RES_OK;
if(*(unsigned long*)(buf512+0x1E4) != 0x61417272) return RES_OK;
if(*(unsigned long*)(buf512+0x1FC) != 0xAA550000) return RES_OK;
*(unsigned long*)(buf512+0x1E8) = 0xFFFFFFFF;
*(unsigned long*)(buf512+0x1EC) = 0xFFFFFFFF;
return disk_write(buf512, bootSectorPlus1);
}

/*-----------------------------------------------------------------------*/
/* Save fat sector in all FAT tables */
/*-----------------------------------------------------------------------*/

static char saveFatSector(unsigned long sector, const BYTE* buf) {
if(sector == -1) return 0;
if(FatFs->fatbase2) if(disk_write(buf, FatFs->fatbase2 + sector)) return 1;
return disk_write(buf, FatFs->fatbase + sector);
}

/*-----------------------------------------------------------------------*/
/* Alloc cluster */
/*-----------------------------------------------------------------------*/

static FRESULT allocClusterFat32(unsigned long* cluster, BYTE* buf) {
unsigned char i;
unsigned long s, sectorsInFat, *a;

// Кол-во секторов в таблице FAT
sectorsInFat = (FatFs->n_fatent + 127) / 128;
// В первом секторе первых 2 числа пропускаем
i = 2, a = ((unsigned long*)buf)+2;
// Последовательно перебираем сектора
for(s = 0; s < sectorsInFat; s++) {
if(disk_readp(buf, FatFs->fatbase + s, 0, 512)) return FR_DISK_ERR;
// Среди 128 чисел в секторе ищем 0
for(; i < 128; i++, a++) {
if(*a == 0) {
// Мы могли вылететь за пределы таблицы FAT
*cluster = i + s * 128;
if(*cluster >= FatFs->n_fatent) return FR_NO_FREE_SPACE;
// Помечаем кластер как последний
*a = 0x0FFFFFFF;
// Сохраняем изменения
if(saveFatSector(s, buf)) return FR_DISK_ERR;
// Ок
return FR_OK;
}
}
// Для цикла выше.
i = 0, a = (unsigned long*)buf;
}
// Свобожных кластеров нет.
return FR_NO_FREE_SPACE;
}

/*-----------------------------------------------------------------------*/
/* Add cluster in chain */
/*-----------------------------------------------------------------------*/

static char setNextClusterFat32(unsigned long cluster, unsigned long nextCluster, BYTE* buf512) {
unsigned long sector;
sector = cluster/128;
if(disk_readp(buf512, FatFs->fatbase + sector, 0, 512)) return 1;
((unsigned long*)buf512)[cluster % 128] = nextCluster;
return saveFatSector(sector, buf512);
}

/*-----------------------------------------------------------------------*/
/* Alloc directoy entry */
/*-----------------------------------------------------------------------*/

static FRESULT allocEntryFat32(DIR* dj, const char* name, BYTE* buf512, BYTE** outEntry) {
FRESULT res;
BYTE c, *a;
unsigned char i;
DWORD cluster;

// Форматируем имя
if(res = create_name_2(dj, name)) return res;
// Ищем это имя в папке
res = dir_find(dj, buf512);
if(res != FR_NO_FILE) {
if(res == FR_OK) return FR_FILE_EXISTS;
return res;
}
// Перематываем папку в начало
if(res = dir_rewind(dj)) return res;
// Ищем в папке пустой описатель
res = FR_NO_FILE;
while (dj->sect) {
if (disk_readp(buf512, dj->sect, 0, 512)) return FR_DISK_ERR;
for(i=0, a=buf512; i<16; i++, a+=32) {
if((a[DIR_Attr] & AM_VOL) == 0 && (*a == 0 || *a == 0xE5)) {
// Если мы добавляем в последний элемент, то надо надо создать последний элемент
if(*a==0) {
if(i<15) {
memset(a+32, 0, 512-32-i*32);
} else
if(dj->index/16+1 < FatFs->csize) {
// Это последний элемент в секторе, но не в кластере
memset(buf512, 0, 512);
if(disk_write(buf512, dj->sect+1)) return FR_DISK_ERR;
// Восстанавливаем буфер
if(disk_readp(buf512, dj->sect, 0, 512)) return FR_DISK_ERR;
}
}
// Инициализируем найденный элемент
memset(a, 0, 32);
goto break2;
}
}
// Следующий сектор
dj->index += 15;
if(res = dir_next(dj)) {
if(res != FR_NO_FILE) return res;
// В папке может быть не более 65535 файлов
if((unsigned short)dj->index==65535)
return FR_DIR_FULL;
// Добавить еще один кластер к папке.
if(res = allocClusterFat32(&cluster, buf512)) return res;
if(setNextClusterFat32(dj->clust, cluster, buf512)) return FR_DISK_ERR;
dj->clust = cluster;
dj->sect = clust2sect(cluster);
// Инициализируем сектор
memset(buf512, 0, 512);
a = buf512;
break;
}
}
break2:
// Запоняем имя
dj->fn = a;
create_name_2(dj, name);
// Возвращаем указатель на найденный элемент
if(outEntry) *outEntry = a;
// Ок
return FR_OK;
}

/*-----------------------------------------------------------------------*/
/* Free cluster chain */
/*-----------------------------------------------------------------------*/

static FRESULT freeChain(unsigned long cluster, BYTE* buf512) {
unsigned long s, s1, *a;
s1 = -1;
while(cluster >= 2 && cluster < FatFs->n_fatent) {
s = cluster/128;
if(s!=s1) {
if(saveFatSector(s1, buf512)) return FR_DISK_ERR;
s1 = s;
if(disk_readp(buf512, FatFs->fatbase+s, 0, 512)) return FR_DISK_ERR;
}
a = (unsigned long*)(buf512 + (cluster%128)*4);
cluster = *a;
*a = 0;
}
if(saveFatSector(s1, buf512)) return FR_DISK_ERR;
return FR_OK;
}

/*-----------------------------------------------------------------------*/
/* Is empty folder */
/*-----------------------------------------------------------------------*/

static FRESULT isEmptyFolder(DWORD cluster, BYTE* buf512) {
DIR dir;
FRESULT res;
BYTE* a;
unsigned char i;

// Для последовательного четния всех секторов папки
dir.sclust = cluster;
if(res = dir_rewind(&dir)) return res;
// Первые два элемента пропускаем (должны быть .. и .)
i = 2, a = buf512 + 64;
// Обрабатываем все сектора
while(dir.sect) {
if(disk_readp(buf512, dir.sect, 0, 512)) return FR_DISK_ERR;
// В секторе 16 описателей
for(; i < 16; i++, a += 32) {
// Это был последний описатель
if(*a == 0) return FR_OK;
// Найден файл или папка, ошибка
if((a[DIR_Attr] & AM_VOL) == 0 && *a != 0xE5) return FR_DIR_NOT_EMPTY;
}
// Следующий сектор
dir.index += 15;
if(res = dir_next(&dir)) {
// Это был последний сектор, всё ок.
if(res == FR_NO_FILE) return FR_OK;
// Ошибка
return res;
}
// Для цикла выше
i = 0, a = buf512;
}
}

/*-----------------------------------------------------------------------*/
/* Convert bytyes to clusters */
/*-----------------------------------------------------------------------*/

static unsigned long bytesToClusters(unsigned long sizeInBytes) {
unsigned long bytesInCluster;
bytesInCluster = FatFs->csize*512;
return (sizeInBytes + bytesInCluster - 1) / bytesInCluster;
}

vinxru
16.04.2013, 11:01
/*-----------------------------------------------------------------------*/
/* Create file */
/*-----------------------------------------------------------------------*/

FRESULT pf_createFile(const char *path, const char* new_name, BYTE* buf512) {
DIR dir;
FRESULT res;

if(FatFs->fs_type != FS_FAT32) return FR_NO_FREE_SPACE;

// Ищем папку
if(res = pf_opendir(&dir, path)) return res;

// Добавляем в папку описатель
if(res = allocEntryFat32(&dir, new_name, buf512, 0)) return res;

// Сохраняем описатель на диск
if(disk_write(buf512, dir.sect)) return FR_DISK_ERR;
return FR_OK;
}

/*-----------------------------------------------------------------------*/
/* Create Directory */
/*-----------------------------------------------------------------------*/

FRESULT pf_createDir(const char *path, const char* new_name, BYTE* buf512) {
DIR dir;
FRESULT res;
BYTE* entry;
DWORD cluster;

if(FatFs->fs_type != FS_FAT32) return FR_NO_FREE_SPACE;

// Ищем папку
if(res = pf_opendir(&dir, path)) return res;

// Выделяем кластер
if(res = allocClusterFat32(&cluster, buf512)) return res;

// Добавляем в папку описатель
if(res = allocEntryFat32(&dir, new_name, buf512, &entry)) return res;

// Заполняем описатель
entry[DIR_Attr] = AM_DIR;
*(unsigned short*)(entry+DIR_FstClusHI) = cluster>>16;
*(unsigned short*)(entry+DIR_FstClusLO) = (unsigned short)cluster;

// Сохраняем описатель на диск
if(disk_write(buf512, dir.sect)) return FR_DISK_ERR;

// Создаем пустую папку
memset(buf512, 0, 512);
memset(buf512, ' ', 11);
buf512[0] = '.';
buf512[DIR_Attr] = 0x10;
*(unsigned short*)(buf512+DIR_FstClusHI) = cluster>>16;
*(unsigned short*)(buf512+DIR_FstClusLO) = (unsigned short)cluster;
memset(buf512+32, ' ', 11);
buf512[32+0] = '.';
buf512[32+1] = '.';
buf512[32+DIR_Attr] = 0x10;
if(dir.sclust>2) {
*(unsigned short*)(buf512+32+DIR_FstClusHI) = dir.sclust>>16;
*(unsigned short*)(buf512+32+DIR_FstClusLO) = (unsigned short)dir.sclust;
}

// Сохраняем папку
if(disk_write(buf512, clust2sect(cluster))) return FR_DISK_ERR;

return FR_OK;
}

/*-----------------------------------------------------------------------*/
/* Delete file or folder */
/*-----------------------------------------------------------------------*/

FRESULT pf_delete(const char *path, BYTE* buf512) {
DIR dir;
FRESULT res;
long cluster;

if(FatFs->fs_type != FS_FAT32) return FR_NO_FREE_SPACE;

// Ищем файл
dir.fn = buf512 + 32;
if(res = follow_path(&dir, buf512, path)) return res;

// Это корневая папка
if(buf512[0] == 0) return FR_NO_PATH;

// Первый кластер файла или папки
cluster = LD_CLUST(buf512);

// В папке не должно быть файлов
if(buf512[DIR_Attr] & AM_DIR) {
if(res = isEmptyFolder(cluster, buf512)) return res;
}

// Удаляем описатель
if(disk_readp(buf512, dir.sect, 0, 512)) return FR_DISK_ERR;
buf512[(dir.index % 16) * 32] = 0xE5;
if(disk_write(buf512, dir.sect)) return FR_DISK_ERR;

// Освобождаем цепочку кластеров
return freeChain(cluster, buf512);
}

/*-----------------------------------------------------------------------*/
/* Change file length */
/*-----------------------------------------------------------------------*/

FRESULT pf_setSize(const char *path, unsigned long fileSize, BYTE* buf512) {
DIR dir;
FRESULT res;
BYTE* entry;
unsigned long cluster, needClusters, firstCluster, prevCluster;

if(FatFs->fs_type != FS_FAT32) return FR_NO_FREE_SPACE;

// Ищем файл
dir.fn = buf512 + 32;
res = follow_path(&dir, buf512, path);
if(res != FR_OK) return res;
if(buf512[0]==0 || (buf512[DIR_Attr]&AM_DIR)!=0) return FR_NO_PATH; // Это корневая папка или папка

// Первый кластер файла
cluster = LD_CLUST(buf512);
if(cluster < 2 || cluster >= FatFs->n_fatent) cluster=0; // Коррекция ошибки
firstCluster = cluster;

// Расчет кол-ва кластеров
needClusters = bytesToClusters(fileSize);

// Пропуск кластеров
prevCluster = 0;
while(cluster && needClusters) {
needClusters--;
prevCluster = cluster;
cluster = get_fat(cluster);
if(cluster < 2 || cluster >= FatFs->n_fatent) cluster=0;
}

if(needClusters) {
// Добавление кластеров
for(;needClusters; --needClusters) {
res = allocClusterFat32(&cluster, buf512);
if(res != FR_OK) return res;
if(prevCluster) setNextClusterFat32(prevCluster, cluster, buf512);
else firstCluster = cluster;
prevCluster = cluster;
}
} else
if(cluster) {
// Удаление кластеров
if(prevCluster) setNextClusterFat32(prevCluster, 0x0FFFFFFF, buf512);
else firstCluster = 0;
freeChain(cluster, buf512);
}

// Корректируем описание файла

if(disk_readp(buf512, dir.sect, 0, 512)) return FR_DISK_ERR;

entry = buf512 + (dir.index % 16) * 32;
*(unsigned long *)(entry+DIR_FileSize ) = fileSize;
*(unsigned short*)(entry+DIR_FstClusHI) = firstCluster>>16;
*(unsigned short*)(entry+DIR_FstClusLO) = (unsigned short)firstCluster;

if(disk_write(buf512, dir.sect)) return FR_DISK_ERR;

return FR_OK;
}

fifan
17.04.2013, 18:23
vinxru, ты наверное единственный кто ваяет программы не на ассемблере. Так что извините, не бульмесиум...

Error404
17.04.2013, 18:54
vinxru, два вопроса:
1. Компилируешь своим компилятором С? Когда релиз?
2. Либы FAT что ты юзаешь, используют 32-битные типы? Почему спрашиваю: я в свое время использовал FatFS от Chan, использованные там 32-битные типы серьезно ограничивали в выборе компилятора.

vinxru
17.04.2013, 19:16
1. Компилируешь своим компилятором С? Когда релиз?

Это компилируется для AVR микроконтроллера.


Эти функции, это расширение для сверх-популярной библиотеки PetitFat от Chan. Большая FatFS от Chan не влезает в 1 Кб оперативки и 8 Кб ПЗУ, которые есть у ATMega8.

---------- Post added at 18:15 ---------- Previous post was at 18:15 ----------


Когда релиз?

Сразу после Специалистов займусь. Пока он крайне сырой.

Причем. Я был "в отпуске" последние недели, все мои компьютеры и паяльники были упакованы в коробки. И завтра я возвращаюсь к себе в офис-мастерскую!

Более того, на майских праздниках будет много свободного времени.



---------- Post added at 18:16 ---------- Previous post was at 18:15 ----------


Либы FAT что ты юзаешь, используют 32-битные типы? Почему спрашиваю: я в свое время использовал FatFS от Chan, использованные там 32-битные типы серьезно ограничивали в выборе компилятора.

Да, использую

Pimas
18.02.2021, 21:25
Уважаемые Специалисты, помогите в ремонте.
Изначально при включении не было ни видео, ни звуков. Заменил ИЕ1 и проц, теперь загружается, но выдает следующее:
https://zx-pk.ru/attachment.php?attachmentid=74745&d=1613672070&thumb=1&stc=1
https://zx-pk.ru/attachment.php?attachmentid=74746&d=1613672100&thumb=1&stc=1
https://zx-pk.ru/attachment.php?attachmentid=74747&d=1613672127&thumb=1&stc=1

Обзвонил несколько сервисов, на возможность прошить РФ тестом, но пока, безрезультатно.
В каком порядке проверять?

У меня Специалист, явно "ТЕМП", на РУ5

Serg6845
18.02.2021, 23:41
Уважаемые Специалисты, помогите в ремонте.
Изначально при включении не было ни видео, ни звуков. Заменил ИЕ1 и проц, теперь загружается, но выдает следующее:
Обзвонил несколько сервисов, на возможность прошить РФ тестом, но пока, безрезультатно.
В каком порядке проверять?
У меня Специалист, явно "ТЕМП", на РУ5

тонкие вертикальные линии - скорее всего узел формирования видео (в оригинальной схеме это 589ИР12 и 2шт. 155ИР1), причем скорее всего непропай одного из входов. с полностью дохлым разрядом ОЗУ вряд ли бы монитор загрузился. а толстые огрызки - возможно проблемы с адресами (и скорее тоже наука о контактах). так что внимательно смотреть на предмет треснувших дорожек и непропаев.

HardWareMan
19.02.2021, 06:28
Заменил ИЕ1
Откуда ИЕ1 в Специалисте?

Pimas
22.02.2021, 13:37
Откуда ИЕ1 в Специалисте?

Ошибся, ИР1. Serg6845 прав, из за, нее.

Pimas
24.02.2021, 18:06
Начал проверять адресные шины, добрался до мультиплексоров кп2 и столкнулся с проблемой несоответствия схемы с оригинальной из МК. У первой кп2, 12 ножка заведена через резистор 2к на +5В, а 13-я на массу. Что за схема, как это работает?

fifan
28.02.2021, 19:58
"10" - это старшие адреса области видео ОЗУ. Т.е. это выборка памяти 8000h...BFFFh. Подробнее читайте здесь (http://www.spetsialist-mx.ru/index3.html).