Комментарии 33
Лет 15 назад я сделал игру Magic Tokens для ZX Spectrum как раз на SDCC с ассемблерными вставками. Публиковалась с исходниками. Потом ещё делал SDK для разработки игр на C для ZX Evolution, на котором другие люди сделали пару десятков игр.
прикольно если бы вы вывели последнюю аски в спектруме ) они же символы ) я ничего не понял, но сам пишу 3д на GL как раз нечайно на С захотелось)
интересно а 3д на спектруме влезет?
Влезет. Только при условии, что оно будет очень скромное. https://zxart.ee/rus/soft/games/simulation-game/vehicle-simulators/space-simulators/elite/
Совмещаем Ассемблер и Си в одном проекте
Эта статья напомнила мне мои молодые программистские годы, напомнила мне мои первые книги по программированию, которые были посвящены именно комплексированию программ на Ассемблере и языках программирования ПЛ/1 и ПЛ/1 оптимизирующий, а также Фортран:

Язык Си в те далёкие годы (начало 80-х) только-только пробивал себе дорогу в СССР. Надо сказать, что книги пользовались у программистов спросом.
Дык почти все ЕС — это разной степени точности клоны IBM System/360, а PL/1 создавался IBM именно для этой серии комьпютеров. Еще бы этот язык не пользовался спросом. :-) А С, получается, — это язык врага (коммерческого, а не по холодной войне), потому что появление UNIX и C — нарушение вендор лока IBM...
вики пишет что IBM System/360 и PL/1 это 64 год, PDP-7 вышел в 65 но он схож с PDP-4 а он вышел раньше, ну по вики если смотреть а там и мультикс стартовал, а мультикс пишут в вики написан на PL/1, получается С стал аргументом поидее
Конечно, позже. C и UNIX — это конец 1960-ых. Эра UNIX началась в полночь 01 января 1970 года.
я к тому что DEC отошла IBM но не смогла забрать ОС потомучто видимо тот мейнфрейм на котором был написан С был приобретен раньше чем IBM поглотила DEC ну поидее
на нем был Мультикс а потом стал Юникс на нём, потомучто Юникс использовал наработки Мультикс, ну поидее а там конечно не знаю, но интересно, посмотрел, витиевато конечно, ой не IBM а Компак
Но надо отдать должное НИЦ ЭВТ-у. Наряду с ОС ЕС для ЕС ЭВМ была создана и МОС ЕС (Мобильная Операционная Системв семейства Unix), где уже не было PL/1, а базовым языком уже был язык Си:

Jail break, U.S.S.R. edition. ;-)
На Википедии о МОС ЕС всего два слова, но забавно:
Также существовала Мобильная операционная система МОС ЕС, представлявшая собой реализацию ОС Unix на ЕС ЭВМ. Но Unix в те времена считался упрощённой «системой для домохозяек» (буквальная цитата из[27]) в сравнении с «настоящими» системами МВС, ОС ЕС и СВМ, поэтому за рамки академических экспериментов МОС ЕС практически не вышла.
Да уж, не вышла. ;)
Так оказывается это цитата из моей книги:
Орлов В. Н. и др. Мобильная операционная система МОС ЕС. — М.: Финансы и статистика, 1990. — 208 с. — ISBN 5-279-00356-5.
но только контекст был совсем другой. Смысл был и есть в том, что с ней может работать и домохозяйка.

"Мобильная Операционная Система" это же по сути дословный перевод расшифровки аббревиатуры POSIX (Portable Operating System Interface)?

Для меня эта книга по сути была настольной книгой много лет ( десятилетий? ; ) начиная с ранних 90х - там и по командам UNIX справочник, и по Си (именно с уклоном в UNIX - с fork и т.д.)
P.S. То что книга была "настольной" можно легко понять по наличию круглого пятна от чая (кофе) ;)
Спасибо за упоминание! Ставлю ссылку на эту статью в свой форум ;)
P.S. Также вставил в свой форум исходник своего варианта программы BIN2TAP и там же прицепил бейсик-загрузчик TAPE, который загружает кодовый блок с адреса 32768 (т.е. после ./bin2tap habr_demo.bin #8000 TAPE на выходе получится уже готовый TAP-файл, который можно грузить через LOAD "" в эмулятор спектрума или в живой спектрум скажем через DivMMC).
Поправочка (голая решётка не нравится башу):
./bin2tap habr_demo.bin 32768 TAPE
Кстати в версии SDCC что есть у меня (3.8.0) похоже все аргументы идут через стек, поэтому вышеприведённый пример заработал только после модификации ассемблерной функции get_next_line_wrapper:

Я так понял, есть несколько версий bin2tap написанных разными людьми. У меня стоит bin2tap из комплекта zx spectrum utils
Вот отсюда:
А оно умеет бейсик загрузчик добавлять?
Поизучал вопрос с передачей аргументов через регистры - похоже это появилось только в SDCC 4.1.12 (2021?).
Ещё момент - необязательно писать конкретный адрес в --data-loc т.к. если просто указать там 0, то оно разместит сегмент данных сразу после кода (т.е. bin-файл будет меньше без кучи нулей в середине).
Чтобы разобраться в основном языке программирования, который лежит в основе всего, и на котором написано всё остальное - языке программирования Си (он же "Pure C", он же "Си без плюсов") я рекомендую книгу The C Programming Language.
Чего это? Си хайпанул на фоне продвижения UNIX, не более, в основе чего-либо "базового" не был замечен. (Сам UNIX был переписан на Си)
z88dk это и есть sdcc, только либы свои. Плюс есть ещё iar.
P.S. С crt0 разобрался? Или до сих пор эмпирически запускаешь?!
Я бы так не упрощал - z88dk может и форкнулся от sdcc много-много лет назад (хотя я думал что они оба из Small-C произошли), но затем развивался только как компилятор сей для Z80, но кто сказал, что sdcc с тех пор стоял на месте? Например передачу аргументов функций через регистры Z80 они сделали только в версии 4.1 буквально 3 года назад (как я сегодня узнал). А вот IAR старый и к тому же платный - нафиг он вообще нужен?....
Ой, DimkaM привет - вопрос про IAR снимается ;)
Интересующимся темой могу посоветовать почитать статью как я портировал дос игру. Там 32 битные ассемблерные исходники дос игры были обернуты, почти как есть, в C++ обертку, чтобы это все запускалось на современных системах.
Использую похожий подход только на другом, менее популярном z80-компьютере, Galaksija.
Отличная статья! Поймал себя на том, что смотрю на нули и единицы в закодированном представлении bitmap-а, и вижу мышку.
Хочу спросить про ассемблерную процедуру: вы в ней испортили HL и A, их не надо было сохранять и восстанавливать?
И про сам язык хотел спросить. Вы положили в массив и размеры битмапа, и сам битмап. А нет в языке поддержки struct, чтобы длину и ширину класть в именованные поля?
Когда начинал кодить на ассемблере, долго медитировал над тем, какие регистры сохранять, а какие - нет.
Возвращать нужно те регистры, в которых внешний код что-то хранит.
Регистр HL в данном случае особенный, потому что в нем лежит аргумент. Это внешний код пытается передать что-то нам. И по стандарту pure C аргументы копируются по значению, то есть, я могу менять эти значения как хочу, и они не будут влиять на переменные во внешнем коде. В ассемблере это выглядит так, что мне дали регистр, и никуда копировать его не надо, это и есть та локальная переменная.
На счет регистра A , по идее, да, его можно восстановить, но я уже по опыту знаю, что это регистр для вычислений, и хранить там что-то долгое время, это совершенно бессмысленный геморрой, потому что вообще при любом действии A задействуется и меняется.
Со временем можно привыкнуть.
Спасибо за статью!
Очень не хватает вот такого кода на стыке железа и софта современным программистам. Где нет этого стека размером с небоскрёб между кодом и железом.
Интересно есть ли что-то подобное среди более современных платформ? Так сказать что-то более дружелюбное к современным программистам. Посоветуете?
И кажется нашел опечатку:
Там же написано, что возврат значения в регистре DL
Хотя судя по коду и картинке регистр "DE"
"Раз пошла такая пьянка, режь последний огурец!"
Если касаться темы программирования на ретроплатформах, то будет неправильным не вспомнить Стивена Хугга с его сайтом 8BitWorkshop. На этом сайте есть и IDE, позволяющая создавать программы для ретроплатформ прямо в браузере. Кроме ассемблера в IDE можно использовать и Си, как минимум на части платформ. Там же можно ознакомится с программированием на Verilog. Так же автор написал несколько книг посвященных написанию игр Making Games For The Atari 2600, Making 8-Bit Arcade Games in C, Designing Video Game Hardware in Verilog, Making Games For The NES.
Так же нельзя не вспомнить Keith 'Akuyou' с его сайтом где он рассказывает о мультиплатформенном программировании игр на ассемблере от Z80, 6502, 68000, 8086, ARM и ARM Thumb, 65816, 6809 до PDP-11, Risc-V, MIPS, TMS9900, SuperH, IBM370 and PowerPC. Автор также активно ведет свой ютуб канал, где еженедельно выкладывает новые уроки по программированию на конкретной платформе. Так же он выпустил свои уроки в виде книг.
Совмещаем Ассемблер и Си в одном проекте