User Tag List

Страница 20 из 38 ПерваяПервая ... 161718192021222324 ... ПоследняяПоследняя
Показано с 191 по 200 из 377

Тема: Ищу Си для Z80

  1. #191
    Super Moderator Аватар для Alex Rider
    Регистрация
    07.02.2008
    Адрес
    г. Рязань
    Сообщений
    2,913
    Спасибо Благодарностей отдано 
    29
    Спасибо Благодарностей получено 
    90
    Поблагодарили
    32 сообщений
    Mentioned
    4 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Вот тут есть почитать про настройку Code::Blocks + SDCC, там есть примеры ассемблерных вставок, но, вроде, ничего не увидел про передачу параметров. Много примеров исзодников для SDCC (в том числе, и с ассемблерными вставками) есть в поставке Оберона.
    ZX Evolution Rev C + ZXM-SoundCard Extreme + NeoGS.

  2. #192
    Member
    Регистрация
    21.05.2006
    Адрес
    Canada
    Сообщений
    78
    Спасибо Благодарностей отдано 
    3
    Спасибо Благодарностей получено 
    2
    Поблагодарили
    2 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Alex Rider Посмотреть сообщение
    Вот тут есть почитать про настройку Code::Blocks + SDCC, там есть примеры ассемблерных вставок, но, вроде, ничего не увидел про передачу параметров.
    Во всех случаях возвращается значение в подгруппе DEHL. Если возвращаемое значение 32 бита это в DEHL, если это 16-бит Это в HL, если это 8-бит это в L. Кроме того, во всех случаях ваш подпрограмма не должна изменять IX или IY.

    Есть три связи:

    Скрытый текст


    In all cases the return value is in a subset of DEHL. If the return value is 32-bits it's in DEHL, if it's 16-bits it's in HL, if it's 8-bits it's in L. Also in all cases your subroutine must not modify IX or IY.

    There are three linkages:
    [свернуть]


    1. Normal
    Параметры помещаются в стек в правом левом порядке. Стек не должен быть изменен вызываемой функции. Интс 2 байта, Лонги и поплавков 4 байта. Чар выталкивается в 1 байт, но если функция va_arg, символы продвигаются в целое перед толкнул. Возвращаемое значение находится в подгруппе DEHL.

    Скрытый текст


    Parameters are pushed onto the stack in right to left order. The stack must not be altered by the called function. Ints are 2-bytes, Longs and Floats are 4-bytes. Char is pushed as 1-byte but if the function is vararg, chars are promoted to int before being pushed. Return value is in a subset DEHL.
    [свернуть]


    extern char *strcpy(char *dst, const char *src);

    Код:
    _strcpy:
    
       pop af   ;; return address
       pop de  ;; de = char *dst
       pop hl   ;; hl = char *src
    
       push hl
       push de
       push af
    
       ..
    
       ;; return value in HL
    
       ret

    2. Fastcall
    Реализованные на совместимость z88dk в 3.5.5 купить исправления были применены после этого релиза. Использовать текущий SDCC для обеспечения он работает правильно.
    Один параметр передается в регистре в подгруппе DEHL и возвращаемое значение в подгруппе DEHL.

    Скрытый текст


    Implemented for z88dk compatibility in 3.5.5 but bugfixes were applied after that release. Use the current sdcc to ensure it works properly.
    A single parameter is passed by register in a subset of DEHL and the return value is in a subset of DEHL.
    [свернуть]


    extern int strlen(char *s) __z88dk_fastcall;

    Код:
    _strlen:
    
       ;; hl = char *s
    
       ...
    
       ;; return value in HL
    
       ret
    SDCC не в состоянии генерировать звонки на быстрых функций обработки вызовов с помощью указателей функций, если он не имеет права использовать регистр IY. В z88dk мы делаем функция указатели другой способ, чтобы они всегда работать.

    Скрытый текст


    sdcc is unable to generate calls to fastcall functions through function pointers unless it is allowed to use the IY register. In z88dk we do function pointers a different way so that they always work.
    [свернуть]


    3. Callee
    Реализованные на совместимость z88dk в 3.5.5 купить исправления были применены после этого релиза. Использовать текущий SDCC для обеспечения он работает правильно.
    Параметры помещаются в стек в справа налево для того, как в [B] 1. Normal [/ B], но называется функция отвечает за ремонт стек. Преимуществом является абонент не должен очистить стек после вызова функции каждого. Возвращаемое значение находится в подгруппе DEHL.

    Скрытый текст


    Implemented for z88dk compatibility in 3.5.5 but bugfixes were applied after that release. Use the current sdcc to ensure it works properly.
    Parameters are pushed onto the stack in right to left order as in 1.Normal but the called function is responsible for repairing the stack. The advantage is the caller does not have to clear the stack after every function call. The return value is in a subset of DEHL.
    [свернуть]


    extern char *strcpy(char *dst, const char *src) __z88dk_callee;

    Код:
    _strcpy:
    
       pop hl   ;; hl = return address
       pop de  ;; de = char *dst
       ex (sp),hl   ;; hl = char *src, ret address onto stack
    
       ..
    
       ;; return value in HL
    
       ret
    Я не уверен, что если SDCC может генерировать указатель функции звонки на вызываемого абонента функций. Если он может, они будут по-разному набрали, так что указатели на функции не вызываемого абонента может быть назначен указателей на обычные функции. В z88dk мы делаем функция указатели другой способ, так что все работает прозрачно.

    Скрытый текст


    I'm not sure if sdcc can generate function pointer calls to callee functions. If it can, they will be typed differently so that pointers to callee functions cannot be assigned to pointers to regular functions. In z88dk we do function pointers a different way so everything works transparently.
    [свернуть]



    В дополнение к этому есть новые __preserves_regs () атрибут, который может сказать, что компилятор регистрирует функцию АНМ не меняется. На данный момент SDCC использует только информацию о нашей BC и DE, но я включаю все регистры главного набора в только в случае, SDCC расширяет это в будущем:

    Скрытый текст


    In addition to this there is a new __preserves_regs() attribute that can tell the compiler what registers the asm function does not change. At the moment sdcc only uses information about BC and DE but I include all registers of the main set in just in case sdcc expands this in the future:
    [свернуть]


    extern int strlen(char *s) __preserves_regs(d,e) __z88dk_fastcall;

    Собрать среда для SDCC немного болезненные так много людей встроить свои функции ASM внутри C функций, которые вы можете сделать, но это не самый лучший способ делать вещи. Самый лучший способ, чтобы полностью отдельных ASM функции из кода C. Если вы сделаете это вы будете иметь больше контроля над тем, где ASM код находится в памяти, имея свободу, чтобы присвоить код АНМ в конкретной области или раздела. Также помните, что встроенный монтаж мешает глазок оптимизатора SDCC в:

    Скрытый текст


    The assemble environment for sdcc is a little bit painful so many people inline their asm functions inside C functions, which you can do, but it is not the best way to do things. The best way is to completely separate asm functions from the C code. If you do this you will have more control over where asm code is placed in memory by having the freedom to assign the asm code to a specific area or section. Also be aware that inlined assembly interferes with sdcc's peephole optimizer:
    [свернуть]


    Код:
    void myfunc(void)
    {
    .....
    // sdcc peepholer can't look into the asm block so it assumes all registers are modified by the "di"
    __asm
    di
    __endasm;
    ...
    }
    В z88dk мы ввели встроенные функции, так что общие одиночные инструкции, как ди Е.И. остановке, и т.д. могут быть встроены, не влияя на глазок слишком много:

    Скрытый текст


    In z88dk we introduced intrinsics so that common single instructions like di, ei, halt, etc can be inlined without impacting the peepholer too much:
    [свернуть]


    Код:
    void myfunc(void)
    {
    .....
       intrinsic_di();
    .....
    }
    Призыв к intrinsic_di() заменяется на "di", прежде чем глазок видит. Функция объявлена как сохранение всех регистров, так что компилятор может сохраняться регистры по вызову.

    Скрытый текст


    The call to intrinsic_di() is replaced by "di" before the peepholer sees it. The function is declared as preserving all registers so that the compiler is able to persist registers across the call.
    [свернуть]
    Последний раз редактировалось Alcoholics Anonymous; 03.02.2016 в 09:08. Причина: автоматический перевод

  3. #193
    Master
    Регистрация
    15.02.2015
    Адрес
    г. Могилёв, Беларусь
    Сообщений
    840
    Спасибо Благодарностей отдано 
    12
    Спасибо Благодарностей получено 
    99
    Поблагодарили
    66 сообщений
    Mentioned
    3 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Кто-нибудь сделайте и выложите небольшой проект с двумя-тремя функциями и ассемблерными вставками. У меня чего-то выдаёт ошибку - <a> неправильное размещение в памяти.

    - - - Добавлено - - -

    Нашёл ошибку. Написал ld a, 2 ,а надо было ld a, #2.
    Какой файл crt0.s нужен для спекки?
    ¡Un momento, señor fiscal!


  4. #194
    Veteran Аватар для Oleg N. Cher
    Регистрация
    24.08.2007
    Адрес
    Днепропетровская обл.
    Сообщений
    1,643
    Спасибо Благодарностей отдано 
    2,246
    Спасибо Благодарностей получено 
    147
    Поблагодарили
    112 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    У меня такой:
    Код:
    	.module crt0
    	.globl	_main
    	jp	_main
    Просто переход на ф-цию main. Может не работать инициализация неконстантных массивов. Могут быть другие проблемы.

    Если прога стартует с самого начала - юзаем ключик --no-std-crt0

  5. #195
    Master Аватар для s_kosorev
    Регистрация
    19.06.2014
    Адрес
    г. Харьков, Украина
    Сообщений
    731
    Спасибо Благодарностей отдано 
    6
    Спасибо Благодарностей получено 
    16
    Поблагодарили
    15 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Smalovsky Посмотреть сообщение
    for (i=16384;i<22528;i++){
    p=(char*)i;
    *p=(char)0xf;
    }
    на memset замени и еще быстрее будет

  6. #196
    Master
    Регистрация
    15.02.2015
    Адрес
    г. Могилёв, Беларусь
    Сообщений
    840
    Спасибо Благодарностей отдано 
    12
    Спасибо Благодарностей получено 
    99
    Поблагодарили
    66 сообщений
    Mentioned
    3 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Oleg N. Cher, скипнул crt0.s, но опциях линкера поставил -
    --code-loc 35000
    --stack-loc 55000
    Набросал пробную программу:

    #include <stdio.h>
    #include <stdlib.h>

    int main()
    {
    int i=0;
    char *p;
    __asm
    call 3435
    ld a, #2
    call 5633
    ld a, #22
    rst 16
    ld a, #10
    rst 16
    ld a, #10
    rst 16
    ld bc, #12345
    call 11563
    call 11747
    __endasm;

    for (i=16384;i<22528;i++){
    p=(char*)i;
    *p=(char)0xf;
    }

    return 0;
    }
    Собрал, прогнал через hex2bin и bin2tap. Всё работает - экран очищается, быстро выводится число 12345 и рисуется "зебра". Правда всё очень быстро происходит - скорость отличная!
    Вложения Вложения
    • Тип файла: zip Result.zip (281 байт, Просмотров: 52)
    ¡Un momento, señor fiscal!


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

  8. #197
    Master Аватар для s_kosorev
    Регистрация
    19.06.2014
    Адрес
    г. Харьков, Украина
    Сообщений
    731
    Спасибо Благодарностей отдано 
    6
    Спасибо Благодарностей получено 
    16
    Поблагодарили
    15 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    вот только зачем тут си?

  9. #198
    Master
    Регистрация
    15.02.2015
    Адрес
    г. Могилёв, Беларусь
    Сообщений
    840
    Спасибо Благодарностей отдано 
    12
    Спасибо Благодарностей получено 
    99
    Поблагодарили
    66 сообщений
    Mentioned
    3 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от s_kosorev Посмотреть сообщение
    вот только зачем тут си?
    Специфика программирования для спекки подразумевает использования ассемблерных вставок, поэтому я потренировался совместить ассемблерный код и код Си. Еще предстоит написать графические процедуры с использованием ассемблера, а логика программы будет на Си.
    Если есть у кого готовые библиотеки, то выкладывайте.
    ¡Un momento, señor fiscal!


  10. #199
    Master Аватар для s_kosorev
    Регистрация
    19.06.2014
    Адрес
    г. Харьков, Украина
    Сообщений
    731
    Спасибо Благодарностей отдано 
    6
    Спасибо Благодарностей получено 
    16
    Поблагодарили
    15 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Smalovsky Посмотреть сообщение
    Специфика программирования для спекки подразумевает использования ассемблерных вставок, поэтому я потренировался совместить ассемблерный код и код Си
    тут ассемблер с вставками на си

  11. #200
    Guru Аватар для Sayman
    Регистрация
    16.02.2006
    Адрес
    Новосибирск
    Сообщений
    3,280
    Спасибо Благодарностей отдано 
    17
    Спасибо Благодарностей получено 
    91
    Поблагодарили
    54 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Smalovsky, возьми за правило скидывать весь асмовый код в отдельные модули/библиотеки которые потом просто вызываешь в основном коде. когда ты кидаешь и сишный код и асм в один скроллинг, код становится громоздким и нечитаемым. ты сам начнёшь косяки пороть и думать в чём проблема. и вызывать бейсиковые процедуры тоже не есть гут. они медленные. напиши сам их замену или возьми из того, что уже было до тебя написано. В библиотеках сдцц и z88dk многое есть в открытом виде, можно подсмотреть или использовать то, что уже скомпилино в библиотеки.
    и кстати, большая часть ответов на твои вопросы по сдцц есть в его родном мануале. Несколькими страницами назад есть даже модифицированный crt0.s...
    0A заповедей:
    I. Не удаляй каталог свой.
    II. Не удаляй до времени ни одного файла.
    III. Не кради файлы.
    IV. Не желай программы ближнего своего.
    V. Почитай BDOS и BIOS как родителей своих ...
    ---
    Sprinter resurrect:
    Telegram
    Discord
    Repo
    Forum

Страница 20 из 38 ПерваяПервая ... 161718192021222324 ... ПоследняяПоследняя

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

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

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

Ваши права

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