Как стать автором
Обновить

Комментарии 33

Немного не понял. Хотя вроде читал внимательно. Можно ли данное изделие использовать например с mach3.? Или это тока для вашего принтера?

У меня не принтер, у меня программатор. Не могу сказать точно на счет Mach3, но скорее всего можно.

Нельзя, Mach3 напрямую, дёргая пины, формирует импульсы шаговым двигателям, задержки критичны, она и с настоящим LPT не с каждым нормально работает.

Некоторое время назад у одного заказчика возникла задача запрограммировать как раз параллельное ППЗУ с УФ стиранием (та самая "29 серия"). Я как-то даже начал делать программатор на STM32F100 (с преобразователем 5В от USB в 12В для программирования ПЗУ, с "высоковольтным" ключом, который управлялся от таймера МК, т.к. импульс программирования должен быть определённой длительности, при меньшей длительности память "недопрограммируется", и возможна потеря данных, при большей длительности она "поджаривается").
А потом оказалось, что такие программаторы относительно легко доступны... в среде тех, кто занимается тюнингом ЭБУ автомобильных двигателей. И за 2т.р. в тот же день был куплен китайский программатор (с китайским софтом, ага), подключаемый к ПК через USB, который прекрасно читает и пишет хоть параллельные "высоковольтные" УФППЗУ, хоть последовательные современные флэши.

А можно название китайского программатора? Так, на будущее.

Этот программатор реально очень крутой и, пожалуй, едва ли не самый навороченный из устройств "любительского" класса. Помимо флешек и EPROM он также "берёт" целый модельный ряд МК, включая все популярные модели PIC и AVR.
Единственное — если брать новым, рекомендую TL866 Plus.

TL866 хорош, даже есть Android софт на него, что редкость для программаторов. Китайцы давно сняли его с производства и его преемник сейчас зовется T48. Зато бэушные TL866 подешевели, для большинства применений не связанных с программированием NAND его хватает за глаза. Совет при покупке бэушного - в софте есть самотестирование программатора.

Про железо.

«использовали специальные программы замедляющие процессор, чтобы замедлить скорость работы IO»

Текущие материнки с lpt подвержены такой же проблеме? Например, J4125B-ITX? Ссылка Старый софт может некорректно работать на них?

Долго искал что-то старое и маленькое с lpt, нашёл Lenovo thinkcentre m32 тонкий клиент win7 32 embedded. Фото и апгрейд на пикабу (не мое). Как один из вариантов.

Текущие материнки с lpt подвержены такой же проблеме?


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

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

Это было круто! :)

А я все ещё с deviceIo разбираюсь

Какой deviceIo? DeviceIoControl?

Да, я тоже хочу поработать с драйверами напрямую :)

Спасибо, захватывающе! Когда-то схожим образом (перехват отладочных исключений) эмулировал в глаза не виданный фирменный программатор TI XDS510.

По дальнейшему увеличению скорости - относительно V-USB и control transfer есть куда двигаться, просто перейдя на какой-нибудь Cypress FX2, который даст USB HS, сократите период посылки пакетов в разы. Да и перейдя с control transfer на bulk (хоть на том же железе), назначив каждому регистру по endpoint, тоже сэкономите.

Однако, как написали выше, есть дешёвый TL866.

Cypress конечно хорош, но вот работа сним вне библиотек кейла - то ещё удовольствие. Я вот таки заставил sdcc все собрать как надо и то патчить hex пришлось. А так да, неплохая плата (fx2lp на AliExpress) за 400 рублей для любителя поиграться.

Под SDCC есть вот такой фреймворк https://github.com/djmuhlestein/fx2lib, с которым всё довольно просто собирается, вот пример https://github.com/flowswitch/upandup/tree/master/FX2, портированный с Keil (тоже под программатор, кстати, но "пожирнее", 256 пиндрайверов).

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

Инструкцию LONG JMP можно осуществить только со сменой страницы, и мне не хочется вникать в вопрос всегда ли винда использует для кода одну и ту же страницу, так что эту инструкцию отбрасываем. Зато в те же шесть байт помещается PUSH DWORD+RET, что по сути тот же LONG JMP, но без смены страницы. Его и использовал.

Что-то, простите? Что такое "смена страницы" и почему номер страницы вас вообще заботит?


Если вы писали про сегменты, то как использование PUSH DWORD защищает вас от нестандартного сегмента? Если вы не знаете сегмент исполнения кода, то в и адрес для перехода не знаете.


Но в long mode и в compatibility mode сегменты не поддерживаются, так что на 64х-битных системах про них можно не думать.

Что-то, простите? Что такое "смена страницы" и почему номер страницы вас вообще заботит?

Страницой я по привычке назвал сегмент. Смена страницы - смена смена дескриптора сегмента.

Если вы писали про сегменты, то как использование PUSH DWORD защищает вас от нестандартного сегмента?

А где я говорил о каком-то нестандартном сегменте? Лишь о переходе на абсолютный адрес без смены сегмента (который я ошибочно назвал страницей)

Но в long mode и в compatibility mode сегменты не поддерживаются, так что на 64х-битных системах про них можно не думать.

Можно, но мое приложение 32-х битное, соответственно предполагается что оно работает в protected mode. В реальности это сейчас почти всегда будет compatibility mode, но все же не стоит забывать что кто-то еще использует 32-х битные винды.

Так, кажется я понял о чём речь. Операции jump far cs:DWORD просто нет...


Но вот в чём была принципиальная проблема использовать near jump всё ещё не понимаю. Ну да, надо разницу между адресами посчитать.

Подскажите, это какой опкод позволяет сделать JMP FAR CS:xxxx?

Привидевшийся мне на лекции по ассемблеру лет 13 назад, разумеется. Я там отредактировал комментарий.

Да, JMP NEAR с оффсем можно было бы, логичнее и компактнее. Понятия не имею почему я так не сделал. Если снова вернусь к этому проекту - исправлю.

Кстати, вопрос.

В чём разница между ptr16 и m16?

Адрес и непосредственное значение

Я понимаю разницу между, например, 16:32 и [16:32]. Но первое это imm, а второе ptr []. Почему указано "m"?

Эта нотация описана в интеловском мануале, том 2, раздел "3.1.1.3 Instruction Column in the Opcode Summary Table". Так же обращаю внимание на заметку об ModRM.


ModRM - это дополнительный байт в инструкции, которым определяется адресация и часть опкода для некоторых команд (сложная адресация вроде [offset + reg * 4] тоже реализована через него). В данном случае он используется для определения того, где будет лежать адрес. Например, CALL FAR [start + EAX] - это вызов функции, адрес которой лежит по адресу [start + EAX]. Это и есть префикс m.


А ptr это просто непосредственное значение, сразу за инструкцией.

Т.е., это EA (Effective Address)? Тогда почему для FF/4 указано r/m, а для FF/5 только m, если оба варианта помечены сноской М?

Такое ощущение, что все, кто внятно документировал опкоды для i8080 так же ушли в Zilog.

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

Отличная статья. Всегда было интересно, реально ли запустить старые девайсы под LPT с их аутентичным софтом. Даже пытался искать что-то в этом направлении, но поэкспериментировать руки так и не доходили.
Насчёт USB2LPT — там обычно стоит чип от Prolific (PL-2305). У меня была парочка таких шнурков, но в плане экспериментов с ними всё весьма печально.

А через виртуальные порты на виртуальных машинах VMware\VirtualPC переброс на USB\LPT провернуть можно? Там бы заодно с старым софтом проблем не было.

Хороший вопрос. Надо будет поэксперементировать.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории