Оберон-клуб «ВЄДАsoft» https://zx.oberon.org/forum/ |
|
Тонкости сопряжения Оберона, Си, ассемблера https://zx.oberon.org/forum/viewtopic.php?f=10&t=202 |
Страница 1 из 3 |
Автор: | Reobne [ 05 июн 2014, 04:07 ] |
Заголовок сообщения: | Тонкости сопряжения Оберона, Си, ассемблера |
В этой теме будем обсуждать и развивать тонкие внутренние механизмы, которые помогут писателям библиотек. Для тех, кто просто хочет писать свои библиотеки, или задаётся вопросом "Как добавить в свою программу код на ассемблере Z80 или на Си?", должно хватить темы: Как создать новую библиотеку для ZXDev --------------- В Basic.h нашёл: #define __hash__ # #define __id__(x) x #define __ld_a__(x) if(x==0) {__asm xor a,a __endasm;}else{__asm ld a,__id__(__hash__)x __endasm;} #define __ld_c__(x) __asm ld c,__id__(__hash__)x __endasm В чём нетавтология первых двух определений? Оптимально ли сработает третье если х не константа? (Не проверял, но кажется, что будет построена полная условная конструкция.) Как называется применяемый диалект ассемблера z80 или где про него можно почитать? За подсказки что такое # и $ спасибо, помогли. ![]() |
Автор: | Zorko [ 06 июн 2014, 00:04 ] |
Заголовок сообщения: | Re: Тонкости сопряжения Оберона, Си, ассемблера |
Reobne писал(а): В чём нетавтология первых двух определений? Код: "C" #define __hash__ # Такой хитрый выход помог выработать Eltaron, за что ему огромное спасибо. Reobne писал(а): Оптимально ли сработает третье если х не константа? Просто превратит одно в другое. Т.е. LD A,__id__(__hash__)1+2 в LD A,#1+2, а как это транслировать — будет решать sdasz80.Reobne писал(а): Как называется применяемый диалект ассемблера z80 или где про него можно почитать? А вот тут: по ссылочке sourceforge.net/projects/sdcc/files/sdcc-doc/ есть доки, там в архиве раздел sdas посвящён исключительно ассемблеру.Reobne писал(а): За подсказки что такое # и $ спасибо, помогли. Там ещё точка обозначает текущий адрес. Т.е.![]() Код: "ASM" DJNZ . ; MET$: DJNZ MET$ ![]() |
Автор: | Reobne [ 17 июн 2014, 03:42 ] |
Заголовок сообщения: | Re: Тонкости сопряжения Оберона, Си, ассемблера |
Спасибо, читаю помаленьку. ![]() Прочитал(sdccman.pdf 3.14.1.2), что в sdcc ассемблерные вставки можно делать так: Код: "OBERON"
Тут "\n", это символ перевода строки; "\t" - табуляции. И подумалось мне, что возможно, было-бы удобно писать ассемблерный текст прямо в обероновском исходнике. Код: "OBERON"
Решил попробовать. Написал интерфейс библиотеки Asm Код: "OBERON"
Сохранил в "ZXDev\Lib\Mod" Компильнул "F11" Скопировал получившиеся Asm.c и Asm.h из "ZXDev\Lib\Obj" в "ZXDev\Lib" Переправил хедер Код: "OBERON"
Из Asm.c выкусил Asm_Code, (так как оно теперь в хедере, как предпроцессорный "макрос"). Собрал библиотеку. Попробовал компилить тестовый пример - не получается ![]() Потыкался, оказалось в батнике ZXDev\Bin\build.bat надо прописать "Asm.lib" В таком виде всё компилится и собирается, но "; This is a comment\n\tnop" - это заглушка. Надо подставлять строку с кодом из аргумента. И вот тут возник затык. Тестовый пример даёт такой сишный код Код: "OBERON"
Думаю, что из-за этого привидения типа "(void*)&", которое ОФронт понавставлял, и не работает. Кажется, осталось немного и всё заработает. Либо обмануть ОФронт, чтобы не генерировал "(void*)&", либо как-то хитро сишным предпроцессором его откусить. Мне пока не удалось. |
Автор: | Zorko [ 17 июн 2014, 14:02 ] |
Заголовок сообщения: | Re: Тонкости сопряжения Оберона, Си, ассемблера |
У меня тоже возникала эта проблема, и я не смог её решить. Ofront всегда приводит строку если не к "(void*)&" (в случае IN-параметра), то к "(CHAR*)". То есть требуется переделка Ofront'а. Пока не знаю как это лучше сделать. По поводу макропроцессора нужно консультироваться с продвинутыми сишниками. Но мне кажется, и здесь мало чего светит. Предлагаю пока так: Код: "OBERON"
Reobne писал(а): Да, так можно.
Ещё можно каждой ассемблерной инструкции сделать обёртку и писать, например: Код: "OBERON"
|
Автор: | Saferoll [ 19 июн 2014, 18:52 ] |
Заголовок сообщения: | Re: Тонкости сопряжения Оберона, Си, ассемблера |
Reobne писал(а): Думаю, что из-за этого привидения типа "(void*)&", которое ОФронт понавставлял, и не работает. Кажется, осталось немного и всё заработает. Либо обмануть ОФронт, чтобы не генерировал "(void*)&", либо как-то хитро сишным предпроцессором его откусить. Мне пока не удалось. Цитата: For procedures, Ofront allows a "-" sign after the keyword PROCEDURE in a procedure declaration to indicate that this procedure is an in-lined C code sequence.
The in-lined code is written in quotation marks after the procedure heading as in the following example: Код: "OBERON"
Код: "OBERON"
|
Автор: | Reobne [ 20 июн 2014, 02:36 ] |
Заголовок сообщения: | Re: Тонкости сопряжения Оберона, Си, ассемблера |
Saferoll писал(а): Возможно поможет средство Ofront PROCEDURE - Большое спасибо! Эта возможность ОFront-а удобна для написания библиотек. OFront сам генерирует #define. Править Си и Н файлы теперь можно меньше, или даже совсем не править! Одна проблема решена!! Осталось, для "полного счастья" найти, как описать ему тип аргумента строку, чтобы она и оставалась строкой, без приведения типа. |
Автор: | Zorko [ 20 июн 2014, 12:13 ] |
Заголовок сообщения: | Re: Тонкости сопряжения Оберона, Си, ассемблера |
Saferoll писал(а): Возможно поможет средство Ofront PROCEDURE - Попробовал и так, не получается:Код: "OBERON"
![]() Думаю попробовать модифицировать Ofront, чтобы помечать строковые параметры, которые не нужно приводить ни к какому типу, системным тегом [1], т.е. вот так: Код: "OBERON"
|
Автор: | Zorko [ 20 июн 2014, 13:46 ] |
Заголовок сообщения: | Re: Тонкости сопряжения Оберона, Си, ассемблера |
Сделал. В процедуру OPV.ActualPar добавляем: Код: "OBERON"
Определение Code на Обероне: Код: "OBERON"
Код: "OBERON"
|
Автор: | Reobne [ 20 июн 2014, 13:49 ] |
Заголовок сообщения: | Re: Тонкости сопряжения Оберона, Си, ассемблера |
Кажется получилось! ![]() Код: "OBERON"
KILLER берёт как свой аргумент (CHAR*) и ликвидирует его. |
Автор: | Zorko [ 20 июн 2014, 16:43 ] |
Заголовок сообщения: | Re: Тонкости сопряжения Оберона, Си, ассемблера |
Браво, Reobne! Элегантно и оригинально! ![]() ![]() На базе этого решения придумывается такая идея (думаю, легко будет реализовать): Код: "OBERON"
![]() Ну и откажемся от доработки тега [1], как я предлагал выше, — чтобы не разбивать совместимость. А то я уже засомневался и хотел делать для такого случая тег [2]. |
Страница 1 из 3 | Часовой пояс: UTC + 2 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |