Метка: Deepseek

  • Эксперименты с Pocket 8086 или как выйти в интернет с «печатной машинки» и поговорить с Гигачат.

    Эксперименты с Pocket 8086 или как выйти в интернет с «печатной машинки» и поговорить с Гигачат.

    Знакомство с компьютером

    На волне повышения интереса к ретро компьютерам в продаже появилась интересная модель — Pocket 8086. Примечательна она тем, что работает на клоне древнего процессора х86 и сделана в форм-факторе карманного компьютера.

    Модель на мой взгляд получилась интересной и она полностью отвечала моим требованиям «печатной машинки». К клавиатуре придется привыкнуть, но это не проблема.

    Pocket 8086

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

    На компьютер производитель установил MS-DOS в составе которого имеется Edit для редактирования текстовых файлов. Так же есть GW-basic, Qbasic, какая-то среда для программирования на Си, FoxPro, пара игр и что-то ещё.

    Из интерфейсов коммуникации есть IDC разъемы для подключения переходника на COM-порт, LPT.

    Больше всего меня поразило, что эта конфигурация работает на процессоре с тактовой частотой 4-10 МГц. И по-большому счету никакого дискомфорта для работы в режиме печатной машинки это не создает.

    Вызов

    Обнаружив QBasic я задался вопросом: «а смогу ли я выйти в интернет с помощью этой балалайки?»

    Поиск в интернете показал, что варианты какие-то есть, но они сводились к подключению старых сетевых устройств и поиску драйверов под них. Это не показалось мне привлекательным.

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

    Старый знакомый

    Тогда я решил обратиться к проверенному модулю – ESP8266. Да-да, тактовая частота микроконтроллера в 8 раз больше процессора компьютера.

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

    Идея была в том, чтобы воспользоваться «голым» ESP8266 (с родной прошивкой), и организовать выход в интернет на Pocket 8086. Напомню, что там в качестве ОС установлена MS-DOS.

    У ESP8266 есть UART с набором AT команд для настройки и осуществления HTTP запросов.

    Используем подход идти мелкими итерациями — от создания программы а-ля терминал для общения с внешним устройством через COM-порт, и, наращивая функциональность, дойти до какого-то значимого результата в контексте формулировки «выход в интернет».

    Модуль ESP8266 достаточно спорный, у него есть старший брат ESP32, который по многим параметрам лучше, но меня привлекает его скрытые возможности, взять хотя бы смену MAC адреса «из коробки».

    Hardware setup

    Для начала нужно решить hardware задачу — выравнивание уровней напряжения UART: у Pocket 8086 — 12В (если я правильно понял схемы, вольтметром не замерял), а у ESP8266 — это 3.3В. Использовал самый дешёвый конвертер уровней с разъемом под COM-порт.

    Разъем нужен был, чтобы легко подключить к идущему в комплекте с ноутбуком переходнику IDC-COM.

    Для отладки подключения я взял Arduino, в которую загрузил примитивную программу, которая отправлял тестовое сообщение на UART раз в секунду.

    Deepseek в помощь

    Сразу же возник вопрос, а как программу писать для этого ноутбука. Хотелось получить результат как можно скорее. Несмотря на возможность писать на Си решил все-таки добавить пикантности эксперименту и писать на QBasic. Возврат к истокам – первые программы я писал именно на бейсике.

    Как оказалось, с помощью DeepSeek навайбкодить программу на QBasic — это почти не проблема. Порой он делал очень странные ошибки: называл переменные системными именами, использовал одновременно несколько способов объявления типов данных, использовал запрещенные символы в названиях — вообщем явно игнорировал некоторые нюансы и особенности языка.

    Промт из нескольких предложений и программа, которая выводит на экран полученные сообщения от устройства подключенного к COM-порту готова! Все подключил, но тестовых сообщений от Ардуино не было.

    Тогда DeepSeek посоветовал пойти более простым путем и для начала протестировать эхо вывод. Это когда на экран выводится ровно то, что было отправлено в COM-порт. Нюанс в том, что данные для вывода берутся из COM-порта. Для этого достаточно замкнуть RX и TX com порта компьютера и все что отправляется из программы на выход должно приходить на вход.

    Этот подход заработал, т.е. работать из QBasic с COM-портом не составляет труда, но почему тогда я не видел на экране тестовых сообщений от Ардуино?!

    Перебрав различные варианты открытия порта решил пойти на крайнюю меру и поменять местами подключение RX и TX. И это, чёрт побери, сработало!

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

    Отладка COM-порта и общения с ESP8266

    Следующий этап — подключение и общение с ESP8266. Чтобы упростить себе жизнь, взял переходних для ESP, который конвертирует уровни до 5В, а так же модуль питания. Это позволило подключить ESP к Ардуино и поменять модулю настройки скорости соединения.

    Для начала я выставил на ESP8266 скорость общения 9600 бод. Я предположил, что эта скорость будет подходящей для общения между устройствами. Первое время на этой скорости даже все работало, и я начал задумываться о том, чтобы её попробовать увеличить.

    Подключив ESP8266 к Pocket 8086 и написав с Deepseek первую версию что-то напоминающее терминал приступил к проверке с помощью ручных AT команд, которые позволяют делать с ESP8266 запросы в сеть.

    HW setup

    Настроив wi-fi, и делая первые запросы к хостам, стало понятно, что что-то не так. Часть ответов теряется, а временами программа вылетает с ошибками.

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

    Итак, первая победа — через навайбкоденый терминал используя AT команды я смог делать ручные HTTP запросы к серверами и вывести ответ на экран. Под ручными я понимаю тот факт, что даже длину запроса считал вручную и заголовок набирал через терминал.

    Нюансы работы ESP8266

    В качестве проверки работоспособности я использовал запросы к своим API, которые когда-то писал для монитора новостей.

    На коротких ответах всё работало, ровно так как и ожидалось, а вот на больших всплыл момент, что ответ не стримится непрерывным потоком, а передается порциями с разделителем, который портил вид и добавлял мусора: +IPD,<len>:<данные> (конечно же это описано в документации чипа про работу AT-команд, но кто ж читает). Примечательно, что DeepSeek этот момент учел при решении задачи: «Сделай опцию вывода ответа без заголовка» и ответы стали чистыми.

    Проблемы с конвертацией из UTF-8

    UTF-8 <-> CP866 = боль

    Тот кто хоть раз сталкивался с необходимостью выводить что-то за пределами английского языка в кодировке UTF-8 на 8 битных микроконтроллерах когда нет поддержки UTF-8 «из коробоки» запоминает этот опыт хорошо.

    Моя цель была не что-то абстрактное выводить, а текст на русском языке.

    На удивление мне понадобилось значительное время для взаимодействия с DeepSeek, чтобы сделать конвертацию из UTF-8 в CPP866. По сути проблема была одна, но её не удавалось никак решить.

    В итоге все свелось к тому, что Deepseek написал дополнительну программу, которая выводит всю таблицу символов, чтобы разобраться почему его код не может нормально сконвертировать UTF-8 в CPP866. Только после предоставления лога этой дополнительной программы он разобрался как это сделать.

    Вывод таблицы символов для отладки конвертации UTF-8.

    После этого мы споткнулись на букве ё, т.к. в UTF-8 она может быть как монолитная так и составная — один код непосредственно буква е, второй — двойные точки над ней. Т.е. пришлось учитывать этот момент в конвертации.

    Ещё пришлось отдельно ставить задачу на автозамену длинных тире и двойных угловых кавычек на обычные т.к. в CP866 ничего такого нет.

    Вообще я замечал, что в разные дни DeepSeek вел себя по-разному. В какие-то дни прям с первого раза решал, в какие-то откровенно лажал (например, мог в качестве имени переменной использовать зарезервированное слово или использовать не синтаксис QBasic).

    GigaChat Short

    Когда с русским языком разобрались захотелось чего-то большего. Вместе с DeepSeek сделали небольшую подпрограмму для общения с Gigachat.

    GigaChat Short на Pocket 8086

    Я назвал её GigaChat Short. Работает по принципу: «один запрос — один ответ». Никакого контекста, никаких файлов, JSON структур, только голый текст.

    Проблема в том, что для общения с API Гигачата нужно HTTPS и возможность работы с JSON. И то, и то мне не хотелось тянуть в проект. HTTPS — это возиться с сертификатами на уровне ESP8266. А оборачивать запросы в JSON структуры и разбирать его на QBasic на текущий момент выглядит как перебор.

    Для реализации этого подхода у меня есть прокси-сервер, которые через GET параметр HTTP-запроса получает текст пользователя и уже через HTTPS передает его Гигачату. Соответственно, полученный ответ в голом виде (без JSON) возвращается в виде такого же текста.

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

    Всё получилось, ГигаЧат уверенно отвечает на запросы, вся цепочка работает. Да, медленно. Да, без контекста. Да, небезопасно… но работает…

    Неспешный вайбкодинг без IDE и с ручным переносом кода на флешке с одного компьютера на другой позволяет с большим удовольствием погружаться в low-tech и изучать основы.

    Слово DeepSeek

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

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

    Изучив интерфейс, обнаружил, что историю чатов можно экспортировать (в профиле пользователя).

    Дальше, очевидное решение – предоставить файл экспорта дипсику с задачей написать историю. Но вот беда, файл экспорта уже очень большой для обработки. При подходе «в лоб» LLM готова был обработать только 22% данных.

    Можно было бы и руками вырезать ненужное, но это очень долго. Как же сократить объем?

    Попросил дипсик написать HTML-страничку для обработки файла экспорта, благо история – это JSON файл. Загружаем его, отмечаем по названию нужные диалоги и вуаля получаем небольшой файл.

    Программа на экране Pocket 8086.

    История, как её «увидел» DeepSeek:

    (Я откидываюсь в кресле и делаю глоток кофе, глядя на мерцающий экран с черным фоном и белыми буквами. Вы, мой слушатель, кажется, ждете историю о чем-то современном, может, о нейросетях или облачных технологиях. Но я расскажу вам о путешествии, которое гораздо интереснее — о том, как мы построили мост из эпохи дискет и DOS прямо в сегодняшний день, используя язык, которому тридцать лет.)

    Представьте себе: среда MS-DOS, редактор QBasic 1.0 с его синим экраном, ограничением в 64 КБ памяти и полным отсутствием современных библиотек. И в этой среде мы решили создать терминал, который бы не просто общался с COM-портом, а выходил в интернет и разговаривал с облачным ИИ. Звучит как безумная идея? Так и было. Но именно с этого всё и началось в марте 2026 года.

    Первые шаги: Приручение COM-порта

    Первая задача казалась простой — просто прочитать данные из COM-порта. Я написал несколько строк кода, открыл порт… и тут же получил холодный душ в виде ошибки Device Timeout. Оказалось, что старый QBasic, привыкший к модемам с их линиями квитирования, упрямо ждал сигналов CTS, DSR, DCD. А наша ESP8266, конечно, ничего такого не выдавала. Мы добавили в строку открытия порта магические параметры CS0, DS0, CD0, OP0, и порт, словно нехотя, открылся. Первая победа — мы увидели байты на экране.

    Дальше мы принялись строить настоящий терминал: с окном вывода, строкой ввода, настройками скорости и даже логированием в файл. Но когда подключили реальное устройство — тишина. Данные не шли. Выяснилось, что на дешёвом китайском модуле HW-044 была перепутана маркировка пинов Rx и Tx. Прямое соединение — и всё заработало. Вот вам урок: никогда не доверяйте распиновке, пока не проверите мультиметром.

    Выход в сеть: Война с буфером

    Следующий шаг был амбициозным — научить терминал управлять ESP8266 через AT-команды, настраивать Wi-Fi и отправлять HTTP-запросы. Я добавил в главное меню раздел ESP8266, реализовал подменю для сканирования сетей, ввода SSID и пароля, а также ручного формирования GET/POST запросов. Всё выглядело отлично, пока мы не попытались получить ответ от реального сервера.

    Программа падала с ужасающей ошибкой Communication buffer overflow. Представьте: данные с сервера льются потоком, а QBasic, работающий в однозадачной среде, просто не успевает их вычитывать. Мы пробовали увеличить буфер приёма (RB4096), оптимизировали циклы, но поток на 9600 бод был неумолим. И тогда пришлось принять нетривиальное решение: снизить скорость до 2400 бод. Заработало! Медленнее, но стабильно. Это был важный урок: иногда лучший апгрейд — это даунгрейд.

    Битва за русский язык: Символы, псевдографика и буква «ё»

    Самой эпической битвой, которая до сих пор вызывает у меня уважение и трепет, стала борьба за корректное отображение русских букв. Интернет говорит на UTF-8, а DOS — на кодовой странице CP866. Я написал функцию Utf8ToDos$, но она работала отвратительно: буквы р, с, т, у превращались в псевдографику. Пришлось вооружиться тестовой таблицей символов CP866, и тогда меня осенило: в этой кодировке строчные буквы разбиты на два диапазона — а-п и р-я! Моя функция наивно отправляла всех в один. Исправил — и русский текст ожил.

    Но это было не всё. Буква «ё» упорно не желала отображаться. Оказалось, я просто забыл добавить её код в обработчик строчных букв. Добавили — заработало. А потом мы заметили, что в ответах сервера полно типографских изысков: угловые кавычки « », длинные тире — и прочие прелести, которые в чистом тексте выглядят как мусор. Мы доработали конвертер, чтобы он безжалостно заменял всё это на стандартные " и -. И вишенкой на торте стала обработка составной буквы «ё» (когда она приходит как е + ̈). Мы учли и этот случай. Битва за чистоту русского языка была выиграна.

    Кульминация: GigaChat Short

    Финальным аккордом стало создание раздела GigaChat Short. Теперь из чёрного окна DOS с мигающим курсором можно было ввести вопрос на русском языке, а программа через ESP8266 отправляла его в облачный сервис GigaChat, получала ответ и выводила его в том же терминале. Мы встроили в код ASCII-арт логотипа, реализовали ручной ввод строки с поддержкой ESC, а для длинных ответов я написал простой, но эффективный просмотрщик с прокруткой на стрелках.

    Заключение

    Оглядываясь назад, я понимаю, что мы не просто написали программу. Мы прошли через настоящую инженерную школу: научились договариваться со старым железом и ПО, искать обходные пути, бороться за каждый байт и каждый символ. Эта программа — памятник не технологиям, а упорству и умению решать нестандартные задачи.

    И если кто-нибудь скажет вам, что на QBasic невозможно создать что-то серьёзное — просто расскажите ему эту историю.

    Исходный код программы для QBasic.