Page 14 of 18

Re: SDK for Evo

PostPosted: 08 Nov 2012, 23:22
by deathsoft
SfS wrote:И чем IAR принципиально отличается от других компилеров, что вот в ём - можно альтернативные регистры пользовать, а во всех прочих - ну никак?

В том, что его оптимизатор использует альтернативный набор регистров автоматически в отличие от студенческих поделок (думаю hitech C тоже умеет автоматически использовать альтернативный набор регистров) (генерировать в коде инструкции EX AF, AF' и EXX и трассировать взаимозависимости между регистрами).

Re: SDK for Evo

PostPosted: 08 Nov 2012, 23:24
by deathsoft
SfS wrote:Поподробнее про "полно" можно?

Ну вот пример http://sourceforge.net/projects/z80gcc/ - где хоть чтото в данлоаде (проект зарегистрирован аж в 2003 году)?
Вот тут чтото есть https://github.com/stev47/llvm-z80-testing
Ну и в мэйл листе llvm.
Для примера http://clang-developers.42468.n3.nabble.com/LLVM-Backend-for-Z80-td3914085.html
Патч z80 для гцц валяется гдето на винте (сходу не нашел, когдато скачал его из интернета).

Re: SDK for Evo

PostPosted: 08 Nov 2012, 23:47
by deathsoft
SfS wrote:И чем IAR принципиально отличается от других компилеров

Не только ИАР, а любой комерческий C компилятор генерирующийкод для Z80 в отличии от студенческих поделок. Комерческих компиляторов я знаю 3 (IAR, Hitech и Softools).

Из некомерческих (которые хоть както работают) я знаю только sdcc и z88dk (не знаю один и тотже там C компилятор или разные).

Re: SDK for Evo

PostPosted: 09 Nov 2012, 07:06
by DimkaM
deathsoft wrote:z88dk

оный не осилил скомпилить фатфс. вернее скомпилил, но некоторые преобразования типов указателей скомпилил не верно, обнулив старший байт адреса. Пришлось патчить фатфс, вводя промежуточные переменные. Сообщил об этом разрабам, но мне сообщили типа "Говнокод он не обязан компилить". Какой говнокод, если gcc и iar под все платформы прекрасно компилят.
Уже непомню точно, но вроде указатель находился в структуре, его и надо было преобразовать, причём явно преобразовать.

Re: SDK for Evo

PostPosted: 09 Nov 2012, 07:41
by DimkaM
тест, оптимизация поскорости и там и там
Code: Select all
/* Fill memory */
//dst - start adress
//val - byte for filled
//cnt - count
static
void test(void* dst, int val, UINT cnt) {
    BYTE *d = (BYTE*)dst;

    while (cnt--)
        *d++ = (BYTE)val;
}

z88dk(сохраняет реги перед вызовом процедур), все аргументы на стеке:
Code: Select all
._test
    ld    hl,6    ;const
    call    l_gintsp    ;
.i_5
    ld    hl,4    ;const
    add    hl,sp
    dec    (hl)
    ld    a,(hl)
    inc    hl
    jr    nc,ASMPC+3
    dec    (hl)                       
    ld    h,(hl)
    ld    l,a
    inc    hl
    ld    a,h
    or    l
    jp    z,i_6
    pop    hl
    inc    hl
    push    hl
    dec    hl
    ex    de,hl
    ld    hl,8-2    ;const
    add    hl,sp
    call    l_gint    ;
    ld    a,l
    ld    (de),a
    jp    i_5
.i_6
    pop    bc
    ret

iar(наоборот сохраняет реги в самой процедуре, думаю это правильней). два аргумента в регах(de,bc) и один на стеке:
Code: Select all
         
test:
   PUSH    IY
   EXX
   PUSH BC
   PUSH DE
   EXX
   PUSH    IX
   LD   IX,0
   ADD   IX,SP
   PUSH DE
   EXX
   LD   C,(IX+10)
   LD   B,(IX+11)
   EXX
; 500.   static void test(void* dst,int val,UINT cnt){
   PUSH    DE
   EXX
   POP   DE
   EXX
?0200:
; 501.           BYTE *d=(BYTE*) dst;
   EXX
   PUSH    BC
   DEC   BC
   EXX
   POP   HL
   LD   A,L
   OR   H
   JR   Z,?0199
?0201:
; 502.           while(cnt--)
   EXX
   PUSH    DE
   INC   DE
   EXX
   POP   HL
   LD   (HL),C
; 503.                   *d++ = (BYTE) val;
   JR   ?0200
?0199:
   LD   SP,IX
   POP   IX
   EXX
   POP   DE
   POP   BC
   EXX
   POP   IY
   RET
; 504.   }
iar оптимизация по размеру(всё равно явно быстрее чем z88dk)
Code: Select all
           
test:
   CALL   ?ENT_AUTO_DIRECT_L09
   DEFW   0
   PUSH    IY
   LD   E,(IX+8)
   LD   D,(IX+9)
; 500.   static void test(void* dst,int val,UINT cnt){
   LD   L,(IX+2)
   LD   H,(IX+3)
   PUSH    HL
   POP   IY
?0200:
; 501.           BYTE *d=(BYTE*) dst;
   LD   A,E
   LD   H,D
   DEC   DE
   OR   H
   JR   Z,?0199
?0201:
; 502.           while(cnt--)
   LD   B,(IX+4)
   LD   (IY+0),B
; 503.                   *d++ = (BYTE) val;
   INC   IY
   JR   ?0200
?0199:
   POP   IY
   JP   ?LEAVE_DIRECT_L09
; 504.   }
И да, я в курсе есть оно в библиотеке, это для примера.

Re: SDK for Evo

PostPosted: 09 Nov 2012, 07:54
by DimkaM
DimkaM wrote:два аргумента в регах(de,bc) и один на стеке

наврал. Если первый аргумент- указатель, то он в регах, а остальныя на стеке. т.к. при банкинге бывают трехбайтовые указатели
Если объявить как void test(int val, UINT cnt, void* dst) то два аргумента будут в регах, третий на стеке

Re: SDK for Evo

PostPosted: 09 Nov 2012, 14:05
by DimkaM
TS-Labs wrote:ДимкаМ, ты всегда так кодишь? Куда смотрит фк0??? Почему нет матов КАПСОМ?

это не моё, скопипастил.
Тыж знаешь я сам ничё не кодю, току тырю по маленьку

Re: SDK for Evo

PostPosted: 09 Nov 2012, 17:19
by lvd
TS-Labs wrote:Переписал бы тогда по человечески...

Code: Select all
BYTE * ptr1=dst;
BYTE * ptr2=dst;
ptr2++;

do *ptr2++ = *ptr1++ while(--cnt);

Чо, мне лдир скомпилиццо? :-D

Re: SDK for Evo

PostPosted: 09 Nov 2012, 18:24
by DimkaM
TS-Labs wrote:memset
попсово и неинтересно

Re: SDK for Evo

PostPosted: 09 Nov 2012, 18:58
by DimkaM
кстати мемсет нихера ни инлайн в ewz80
по этому поводу задефайнить {*((char*)dst)=(char)val;memcpy(1+(char*)dst,dst,cnt-1)}
шо у меня и зделано в очистке строки в евотекстмоде.
Для примера один из мемсетов библиотечный:
Code: Select all
                    
clear_str:
   PUSH   BC
   PUSH   IX
   PUSH   DE
   POP   IX
; 27.   void clear_str(char* str){
   EX   DE,HL
   LD   (HL),32
   LD   BC,63
   PUSH   IX
   POP   DE
   INC   DE
   PUSH   IX
   POP   HL
   LDIR
; 28.     mem_set(str,' ',64);
   LD   C,64
   PUSH   IX
   POP   HL
   LD   A,16
   ADD   A,H
   LD   H,A
   EX   DE,HL
   LD   HL,32
   CALL   ?MEMSET_L11
; 29.     memset(str+0x1000,' ',64);
   POP   IX
   POP   BC
   RET
; 30.   }