Важная информация

User Tag List

Страница 2 из 3 ПерваяПервая 123 ПоследняяПоследняя
Показано с 11 по 20 из 29

Тема: Программирование голого железа Raspberry Pi

  1. #11
    Administrator Аватар для CityAceE
    Регистрация
    13.01.2005
    Адрес
    г. Москва
    Сообщений
    4,574
    Записей в дневнике
    7
    Спасибо Благодарностей отдано 
    399
    Спасибо Благодарностей получено 
    1,207
    Поблагодарили
    394 сообщений
    Mentioned
    48 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Smalovsky Посмотреть сообщение
    Для программирования голого распберри есть версия Лазаруса -Ультибо.
    Да, спасибо, я встречал уже упоминания о Ultbio. А ещё народ на Си пишет серьёзные вещи под голое железо с использованием уже упоминавшейся библиотеки Circle. Отличный пример такого результата - эмулятор ZXBaremulator. Это всё хорошо, но такие решения по сути своей ничем не отличаются от обычного программирования на языках высокого уровня - всю работу по обслуживанию железа берут на себя библиотеки, не важно через операционную систему или напрямую. А, как я уже писал, для меня программирование на ассемблере голого железа - это своего рода спорт. В данном случае результат - дело второе, важнее сам процесс. Мне лично это доставляет точно такое же удовольствие, как и программирование на Спектруме. А особенно, если что-то получается
    С уважением, Станислав.

  2. #12
    Administrator Аватар для CityAceE
    Регистрация
    13.01.2005
    Адрес
    г. Москва
    Сообщений
    4,574
    Записей в дневнике
    7
    Спасибо Благодарностей отдано 
    399
    Спасибо Благодарностей получено 
    1,207
    Поблагодарили
    394 сообщений
    Mentioned
    48 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию Arm Versatble Express

    Не знаю, заметили вы или нет, но примеры, которые я привёл выше, хоть и написаны на ассемблере для процессора ARM, который лежит в основе Raspberry Pi, не предназначены для запуска из на Raspberry Pi. Приведённые примеры относятся к плате разработке Arm Versatile Express. О чем говорит ключ запуска эмулятора QEMU "-M vexpress-a9"

    Есть несколько разновидностей этого устройства и выглядят они примерно так:



    На задней панели выведены следующие разъёмы и порты:



    Одних только UART можно насчитать 4 шт.!

    Данная плата предназначена прежде всего для разработчиков и в свободной продаже отсутствовала. Но я выбрал его в качестве целевой просто потому, что именно для неё я нашёл первые примеры на ассемблере с выводом графики (помните демо FreeFull?), которые можно было скомпилировать и запустить под эмулятором QEMU. При этом эмулятор поддерживает необходимый минимум устройств:


    • PL041 audio
    • PL181 SD controller
    • PL050 keyboard and mouse
    • PL011 UARTs
    • SP804 timers
    • I2C controller
    • PL031 RTC
    • PL111 LCD display controller
    • Flash memory
    • LAN9118 ethernet


    И программируется всё это легко, так как адресуется, как обычная память (MMIO). Пример инициализации и работы с графическим экраном (PL111) есть, с клавиатурой (PL050) я тоже привёл. Не хватает реализации работы с внешним накопителем (PL181), и неплохо бы ещё уметь программировать звук (PL041). Но, опять же, адреса этих устройств известны, и при достаточном усердии и с ними тоже можно научиться работает. И всё бы хорошо, но реальные устройства - это слишком нишевый продукт, да ещё и недоступный для простых смертных.

    Другое дело Raspberry Pi - одна из моделей скорее всего лежит где-нибудь в закромах у многих! Но тут обратная ситуация, во-первых всё программируется сложнее, так как прямого доступа к железу всё-таки нет, а во-вторых все примеры, которые можно найти запускаются исключительно на реальном железа, а под эмулятором они же работать не хотят.

    Вот поэтому я начал своё изучение ARM с платформы Arm Versatile Express под эмулятором параллельно пытаясь разобраться как всё-таки можно что-то писать под Raspberry Pi и потом запускать не только на реальном железе, но и под эмулятором для отладки. И мои старания не прошли даром, мне удалось таки решить эту задачу.

    А в заключении этого сообщения хочу поделиться с вами ссылкой на страничку Arm IntrO Challenge, где помимо уже опубликованной демки FreeFull, есть ещё несколько примеров на ассемблере для Arm Versatile Express.



    Последний раз редактировалось CityAceE; 29.08.2023 в 12:07.
    С уважением, Станислав.

  3. #13
    Administrator Аватар для CityAceE
    Регистрация
    13.01.2005
    Адрес
    г. Москва
    Сообщений
    4,574
    Записей в дневнике
    7
    Спасибо Благодарностей отдано 
    399
    Спасибо Благодарностей получено 
    1,207
    Поблагодарили
    394 сообщений
    Mentioned
    48 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию Peter Lemon aka krom

    А теперь давайте перейдём непосредственно к Raspberry Pi. Если вы, как и я, всерьёз интересовались bare metal программированием Raspberry Pi, то вы довольно быстро вышли на репозиторий Perter'а Lemon'а aka krom. О нём я уже упоминал в одном из предыдущих постов.

    Вот адрес этого замечательного репозитория: https://github.com/PeterLemon/RaspberryPi

    Здесь автор на чистом bare metal ассемблере на примерах показывает как запрограммировать то или иное действие на Raspberry Pi. Здесь вы найдёте примеры "Hello, World!" в графическом режиме, опроса геймпада NES, подключенного к GPIO-порту, вывод звука в разных режимах, анимацию фракталов, и даже вывод видео! А также много чего ещё, включая эмулятор GameBoy. Это поистине бесценная кладезь примеров! И там помимо исходных текстов сразу лежат скомпилированные бинариники для запуска на реальных микрокомпьютерах Raspberry Pi. И я лично убедился, что они работают! Рекомендую и вам сделать то же самое. Для этого нужно всего лишь скачать с репозитория скомпилированные ядра (kernel*.img) и записать их на SD-карту вместо существующих, рядом с другими системными файлами. Более подробно о загрузке Raspberry Pi я писал ранее.

    Но при попытке запустить эти примеры под эмулятором, вас будет встречать лишь чёрный экран. Собственно, и меня он встречал. А когда я спросил Питера, как же он отлаживал свой код, он мне ответил, что после того, как написал что-то и откомпилировал, он честно записывал всё на SD-карту и проверял что получилось на реальной Raspberry Pi. То есть никакого отладчика и никакого эмулятора. Капец, как грустно! Я так точно не умею! И это на фоне того, что мне так и не удалось найти ни одного упоминания о том, что кто-то что-то запустил под эмулятором QEMU, кроме RaspbianOS с кастомным ядром.

    Однако в итоге выяснилось, что всё не настолько печально! И вот вам в качестве доказательства пара скриншотов программ Питера Лемона, запущенных под эмулятором QEMU:

    Последний раз редактировалось CityAceE; 19.09.2023 в 10:55.
    С уважением, Станислав.

  4. Эти 2 пользователя(ей) поблагодарили CityAceE за это полезное сообщение:

    Kakos_nonos (31.08.2023), Oleg N. Cher (31.08.2023)

  5. #14
    Veteran Аватар для Kakos_nonos
    Регистрация
    26.12.2010
    Адрес
    Кубань
    Сообщений
    1,154
    Спасибо Благодарностей отдано 
    33
    Спасибо Благодарностей получено 
    39
    Поблагодарили
    23 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Очень интеесная тема! Спасибо!

  6. Этот пользователь поблагодарил Kakos_nonos за это полезное сообщение:

    CityAceE (31.08.2023)

  7. #15
    Administrator Аватар для CityAceE
    Регистрация
    13.01.2005
    Адрес
    г. Москва
    Сообщений
    4,574
    Записей в дневнике
    7
    Спасибо Благодарностей отдано 
    399
    Спасибо Благодарностей получено 
    1,207
    Поблагодарили
    394 сообщений
    Mentioned
    48 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию Загрузчик по UART

    Прежде чем окончательно перейти к теме эмуляции, мне хочется рассказать про ещё один метод отладки программ прямо на железе.

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

    Вот так выглядела типичная проверка кода без какого-либо инструментария:

    1. Выключаем Raspberry Pi
    2. Извлекаем из неё SD-карту
    3. Вставляем SD-карту в кард-ридер
    4. Подключаем кард-ридер к компьютеру
    5. Монтируем карту и ждём
    6. Копируем бинарный файл на SD-карту
    7. Синхронизируемся и ждём
    8. Размонтируем карту
    9. Вставляем SD-карту в Raspberry Pi
    10. Включаем Raspberry Pi
    11. Начинаем всё сначала

    Очень долго и муторно. А ведь именно так и отлаживал свои программы упомянутый мной выше Питер Лемон. Но, к счастью, энтузиаст David Welch (dwelch67) придумал и воплотил метод, который существенно облегчил жизнь bare metal программистам. Суть метода заключается в том, что на SD-карту один раз записывается загрузчик, а сама Raspberry Pi подключается к компьютеру посредством USB-TTL адаптера:




    Подключение осуществляется всего тремя проводами к разъёму GPIO:

    • GPIO6 - GND
    • GPIO8 - RXD
    • GPIO10 - TXD



    Единственная задача загрузчика - загрузка файла по UART в ОЗУ и передача ему управления. Это мне напомнило загрузку компьютер Вектор-06Ц, только там использовался не UART, а магнитофонный порт Сам загрузчик располагается по адресу 0x200000, то есть у вас есть 0x200000 байт (2 Мб) под собственную программу.

    Таким образом, с помощью этого загрузчика всё сводится к следующим действиям:

    1. Выключаем Raspberry Pi
    2. Включаем Raspberry Pi
    3. На компьютере набираем команду передачи файла.

    Но всё можно ещё более упростить, если распаять кнопку RESET, пины под которую есть на всех моделях Raspberry Pi:



    Так вот если эту кнопку распаять, то первые два пункта сводятся просто к нажатию на RESET.

    Думаю, что такой метод отладки не потерял своей актуальности и сегодня, когда QEMU более-менее сносно научился эмулировать Raspberry Pi.

    Ну и в заключении приведу ссылку на репозиторий с исходниками и скомпилированным загрузчиком (есть несколько его версий), о котором шла речь в этом сообщении: https://github.com/dwelch67/raspberrypi
    Последний раз редактировалось CityAceE; 02.09.2023 в 20:29.
    С уважением, Станислав.

  8. Эти 6 пользователя(ей) поблагодарили CityAceE за это полезное сообщение:

    ALS (03.09.2023), creator (03.09.2023), Kakos_nonos (02.09.2023), Oleg N. Cher (03.09.2023), Outcast (07.03.2024), parallelno (06.03.2024)

  9. #16
    Administrator Аватар для CityAceE
    Регистрация
    13.01.2005
    Адрес
    г. Москва
    Сообщений
    4,574
    Записей в дневнике
    7
    Спасибо Благодарностей отдано 
    399
    Спасибо Благодарностей получено 
    1,207
    Поблагодарили
    394 сообщений
    Mentioned
    48 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Отснял небольшой ролик с демонстрации работы загрузки по UART:



    Используемый загрузчик: https://github.com/dwelch67/raspberr...r05/kernel.img
    Самая первая программа (мигание светодиодом): https://github.com/dwelch67/raspberr.../blinker01.bin

    В видео используется вот этот терминал: https://www.emtec.com/zoc/index.html
    Если кто-то знает какой-то терминал попроще и побесплатнее, и который ещё заработает в этой связке, то пожалуйста, поделитесь ссылкой.

    UPDATE

    Нашёл ещё одну терминальную программу, которая успешно передаёт файлы. На этот раз программа бесплатная и с исходниками. Называется Tera Term.



    Не знаю проблема ли это моего конкретного адаптера или, возможно, это везде так, но нормальное общение и передача данных возможна только на скорости 115200 бит/сек - ни больше, ни меньше. Имейте это ввиду, если вдруг захотите тоже попробовать.
    Последний раз редактировалось CityAceE; 03.09.2023 в 14:19.
    С уважением, Станислав.

  10. #16
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  11. #17
    Administrator Аватар для CityAceE
    Регистрация
    13.01.2005
    Адрес
    г. Москва
    Сообщений
    4,574
    Записей в дневнике
    7
    Спасибо Благодарностей отдано 
    399
    Спасибо Благодарностей получено 
    1,207
    Поблагодарили
    394 сообщений
    Mentioned
    48 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию Запуск собственных программ под эмулятором

    Ну вот теперь мы вплотную приблизились к эмулятору Raspberry Pi. На самом деле я мог бы сейчас одной фразой сказать, как скомпилировать программу, чтобы она запустилась на эмуляторе. Но, думаю, что так будет менее интересно. Судя по активности, данная тема заинтересовала лишь 2-3 человека, да и для них, скорее всего интересен не конечный результат, а повествование. Поэтому я расскажу, как я пришёл к конечному результату, шаг за шагом.

    Для того, чтобы писать приложения под операционную систему особенно не требуется каких-то изощрений. Писать и отлаживать можно прямо на Raspberry Pi. Другое дело низкоуровневое программирование - bare metal. Здесь нужно либо поверять написанную программу на реальном железе, либо иметь эмулятор. Правда в итоге написанную программу всё равно придётся запускать на настоящем микрокомпьютере, так как ни один эмулятор не способен обеспечить 100%-ного качества эмуляции. Пик интереса к bare metal программированию пришёлся на 7-10 лет назад, спустя короткое время после выхода Raspberry Pi, когда этот микрокомпьютер утвердился в качестве некоего стандарта, и когда появилось достаточное количество информации о его схемотехнике. Но на тот момент вообще не существовало какого-либо эмулятора этого устройства. Да, уже тогда существовал QEMU, который неплохо эмулировал устройства, базирующие на архитектуре ARM, но среди них не было платформы Raspberry Pi. Разработчики игры PiFox, очевидно для удобства отладки, на базе QEMU сделали свой эмулятор, который худо-бедно мог эмулировать архитектуру Raspberry Pi. Доводилось мне читать упоминания и о других подобных начинаниях. Но в конечном итоге, спустя несколько лет в QEMU появилась официальная поддержка Raspberry Pi. И начали они с эмуляции Raspberry Pi 2. А на сегодня мы имеем возможность эмулировать Raspberry Pi 1, 2, 3 и Zero.

    Когда я только начал изучать вопрос, то поиски приводили меня лишь к всевозможным инструкциям для запуска RaspbianOS на QEMU. Сам запуск осуществлялся на кастомном ядре и на архитектуре отличной от Raspberry Pi - Arm Versatile. Предлагались инструкции по самостоятельным конфигурированию и сборке ядра, также готовые ядра под разные версии RaspbianOS. Но в итоге в QEMU завезли нативную эмуляцию Raspberry Pi и появилась возможность использовать стандартное ядро для запуска RaspbianOS. Правда, ядро не может подхватываться из образа, его предварительно необходимо оттуда извлечь, положить рядом с загружаемым образом и прописать в ключ запуска.
    Вот так примерно будет выглядеть довольно длинная строка запуска нативной эмуляции RaspbianOS:

    Код:
    qemu-system-aarch64 -M raspi3b -append "rw earlyprintk loglevel=8 console=ttyAMA0,115200 dwc_otg.lpm_enable=0 root=/dev/mmcblk0p2 rootdelay=1" -dtb ./dtbs/bcm2710-rpi-3-b-plus.dtb -sd 2020-08-20-raspios-buster-armhf-full.img -kernel kernel8.img -m 1G -smp 4 -serial stdio -usb -device usb-mouse -device usb-kbd
    И действительно, всё загружается и работает. Только это никак не помогает понять как же загрузить свою собственную программу в эмулятор QEMU. Из всего этого стало лишь понятно, что нужен особым образом скомпилированный kernel. И что я только не делал, как только не экспериментировал, но моя программа отказывалась запускаться под эмулятором. Вот оно по всем законам должно работать, но работает! И, честно сказать, руки мои практически опустились. Но тут мои поиски привели меня вот к этому примеру. Этот пример написан на ассемблере, он в графическом виде выводит надпись "NO OS" на экран, а также выводит надпись "No OS installed" в консоль. И при этом данный пример должен был запускаться под эмулятором! (Тоже скачайте его себе для экспериментов, я в дальнейшем буду объяснять всё именно на его примере!)

    И у меня получилось скомпилировать и запустить эту простую программу под эмулятором!



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


    FASMARM

    В качестве кросс-ассемблера я остановил свой выбор на FASMARM. Я уже достоверно не помню как я на него вышел, но скорее всего потому что этот кросс-ассемблер фигурировал в примерах Питера Лемона. По своей сути FASMARM является аддоном для Flat Assembler и работает как под Windows, так и под Linux. Этот инструмент представляет из себя крохотный по сегодняшним меркам исполняемый файл. Он не требует инсталляции и не подтягивает какие-либо сторонние библиотеки.

    Любопытно, что данный кросс-ассемблер сам написан на ассемблере. А что самое интересное - все последние версии FASMARM компилируются на Flat Assembler'е, то есть на самом себе.

    Скачать сам ассемблер и его исходники можно с официальной странички: https://arm.flatassembler.net/

    Использование его предельно простое:

    Код:
    fasmarm filename.s
    А на выходе моментально получим готовый для запуска файл filename.bin.

    Но определяющим при выборе ассемблера для меня стал всё-таки синтаксис. Дело в том, разные программы написанные на ассемблере ARM под разные компиляторы скорее всего потребуют доработок, а иногда весьма серьёзных из-за различий в синтаксисе. Например, FASMARM для обозначения комментариев использует привычную для меня точку с запятой ( ; ), а стандартные инструменты для этой же цели используют "собаку" ( @ ). Также весьма существенно отличается синтаксис макросов, обозначение чисел, наличие и отсутствие некоторых псевдокоманд. Нет смысла сейчас подробно останавливаться на этих различиях, а достаточно просто знать, что они есть.

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

    Arm GNU Toolchain

    Для начала нужно скачать инструментарий на сайте ARM. Инструментарий бесплатный, но с недавних пор, чтобы скачать его из РФ придётся воспользоваться VPN или Tor.
    Качаем с этой страницы: https://developer.arm.com/downloads/...hain-downloads
    Прямую ссылку на установочный файл не привожу, так как с выходом новых версий она меняется. Но вам нужно будет скачать примерно такой файл: arm-gnu-toolchain-12.3.rel1-mingw-w64-i686-arm-none-eabi.exe ,где:
    w64-i686 - платформа компилятора Windows 64 бит
    arm-none-eabi - целевая платформа ARM 32 бит

    Скачиваем и устанавливаем.

    Чтобы скомпилировать тот самый пример я подготовил вот такой bat-файл, основываясь на информации из Makefile:
    Код:
    @set file=boot-arm-raspi
    @set toolchain="c:\Program Files (x86)\Arm GNU Toolchain arm-none-eabi\12.3 rel1\bin\arm-none-eabi"
    
    python bmp2inc.py > bmp_no_os.inc
    %toolchain%-as -o %file%.o -mcpu=arm1176jzf-s %file%.s
    %toolchain%-ld -o %file%.elf -Ttext 0x8000 %file%.o
    
    @if exist %file%.o del %file%.o
    На выходе получаем boot-arm-raspi.elf, который можем запустить в эмуляторе следующей командой:

    Код:
    "c:\Program Files\qemu\qemu-system-arm.exe" -M raspi2b -serial stdio -kernel boot-arm-raspi.elf
    Оказалось, что QEMU может обрабатывать elf-файлы, забирая оттуда всю необходимую для запуска информацию.

    И всё бы хорошо, но этот вариант годится только для компилирования исходников с помощью Arm GNU Toolchain, а мне хотелось как и раньше пользоваться FASMARM. И я в итоге разобрался как прикрутить FASMARM к этой цепочке.

    Прежде всего в исходном тексте своей программы в самом начале нужно добавить вот такие строки:

    Код:
    format ELF
        section '.text' executable
        public _start
    org 0x8000
    _start:
    А для компиляции я создал вот такой батник:

    Код:
    @set file=filename
    @set toolchain="c:\Program Files (x86)\Arm GNU Toolchain arm-none-eabi\12.3 rel1\bin\arm-none-eabi"
    
    fasmarm %file%.s
    %toolchain%-ld.exe -o %file%.elf -Ttext 0x8000 %file%.o
    
    @if exist %file%.o del %file%.o
    Ну и сразу здесь же напишу, что на выходе вы можете получить не только elf, но и бинарный файл, который можно записать на SD-карту и запустить на реальной Raspberry Pi. Для этого в конец цепочки компиляции нужно добавить ещё одну строку:
    Код:
    %toolchain%-objcopy %file%.elf -O binary %file%.img
    Собственно, это и есть рабочий рецепт, которым я и начал пользоваться. И на этом можно было бы завершить данное сообщение. Но оказалось, что на деле для запуска скомпилированых программ под эмулятором можно обойтись вообще без всех этих плясок с Arm GNU Toolchain. И всё делается предельно просто!

    В процессе изучения другого вопроса, я натолкнулся на ключ QEMU "-d in_asm", который показывает в консоли последние выполненные команды. Я сделал и скомпилироваал простую программу, состоящую из одной строки:

    Код:
    lable: b lable
    Я запустил её под эмулятором с указанным ключом. И что же я увидел:



    Данная команда работает по адресу 0x10000! Это очень странный адрес! 32-х битные приложения запускаются и работают с адреса 0x8000. Для старых ядер адрес запуска был нулевой (0x0000). (Этот адрес можно вернуть, если в системной файле Raspberry Pi config.txt прописать команду kernel_old = 1.) Есть ещё адрес 0x200000 - это адрес запуска 64-х битных бинарников. Но никогда и нигде мне не попадалось упоминание о 0x10000. Я попробовал скомпилировать и запустить первую попавшуюся программу с этого адреса. И она как ни в чём не бывало запустилась под QEMU! Всё оказалось до безобразия просто.

    Для запуска под эмулятором вам нужно всего лишь в своём коде прописать org 0x10000! (Собственно, это и есть та самая фраза, которой можно было ограничиться в этом сообщении.)

    Теперь вы можете брать примеры Питера Лемона, о которых говорилось выше, менять там ORG, компилировать, и запускать всё под QEMU.
    Последний раз редактировалось CityAceE; 06.09.2023 в 14:27.
    С уважением, Станислав.

  12. Эти 6 пользователя(ей) поблагодарили CityAceE за это полезное сообщение:

    ALS (07.09.2023), andrews (06.09.2023), Outcast (07.03.2024), parallelno (06.03.2024), SoftLight (27.02.2024), svofski (06.09.2023)

  13. #18
    Administrator Аватар для CityAceE
    Регистрация
    13.01.2005
    Адрес
    г. Москва
    Сообщений
    4,574
    Записей в дневнике
    7
    Спасибо Благодарностей отдано 
    399
    Спасибо Благодарностей получено 
    1,207
    Поблагодарили
    394 сообщений
    Mentioned
    48 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Создал тематическую группу в Telegram. Кому интересна тема программирования на ассемблере под голое железо (bare metal), милости прошу.

    https://t.me/bare_asm

    Пока я там один, но рассчитываю хотя бы на десяток человек, разделяющих мой интерес.
    Последний раз редактировалось CityAceE; 27.02.2024 в 10:20.
    С уважением, Станислав.

  14. Этот пользователь поблагодарил CityAceE за это полезное сообщение:

    parallelno (06.03.2024)

  15. #19
    Administrator Аватар для CityAceE
    Регистрация
    13.01.2005
    Адрес
    г. Москва
    Сообщений
    4,574
    Записей в дневнике
    7
    Спасибо Благодарностей отдано 
    399
    Спасибо Благодарностей получено 
    1,207
    Поблагодарили
    394 сообщений
    Mentioned
    48 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Собственно рассказал то, что о чём уже писал в этой теме.

    С уважением, Станислав.

  16. Эти 6 пользователя(ей) поблагодарили CityAceE за это полезное сообщение:

    ALS (07.03.2024), creator (07.03.2024), Oleg N. Cher (08.03.2024), Outcast (07.03.2024), parallelno (08.03.2024), svofski (07.03.2024)

  17. #20
    Guru Аватар для creator
    Регистрация
    02.07.2006
    Адрес
    Новосибирск
    Сообщений
    2,198
    Спасибо Благодарностей отдано 
    429
    Спасибо Благодарностей получено 
    219
    Поблагодарили
    130 сообщений
    Mentioned
    6 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    CityAceE, вторую часть анонсируем, не стесняемся.
    В правильно заданном вопросе содержится половина ответа

Страница 2 из 3 ПерваяПервая 123 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Raspberry Pi 400 - альтернатива ZX Spectrum Next?
    от CityAceE в разделе Зарубежные компьютеры
    Ответов: 26
    Последнее: 03.11.2020, 23:48
  2. Эмуляторы ZX Spectrum для Raspberry Pi
    от CityAceE в разделе Эмуляторы
    Ответов: 32
    Последнее: 01.10.2019, 18:23

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •