SDK for Evo

ZX evolution software and hardware

Postby deathsoft » 08 Nov 2012, 23:22

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

В том, что его оптимизатор использует альтернативный набор регистров автоматически в отличие от студенческих поделок (думаю hitech C тоже умеет автоматически использовать альтернативный набор регистров) (генерировать в коде инструкции EX AF, AF' и EXX и трассировать взаимозависимости между регистрами).
User avatar
deathsoft
 
Posts: 358
Joined: 07 Apr 2007, 01:58
Group: Registered users

Postby deathsoft » 08 Nov 2012, 23:24

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 для гцц валяется гдето на винте (сходу не нашел, когдато скачал его из интернета).
User avatar
deathsoft
 
Posts: 358
Joined: 07 Apr 2007, 01:58
Group: Registered users

Postby deathsoft » 08 Nov 2012, 23:47

SfS wrote:И чем IAR принципиально отличается от других компилеров

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

Из некомерческих (которые хоть както работают) я знаю только sdcc и z88dk (не знаю один и тотже там C компилятор или разные).
User avatar
deathsoft
 
Posts: 358
Joined: 07 Apr 2007, 01:58
Group: Registered users

Postby DimkaM » 09 Nov 2012, 07:06

deathsoft wrote:z88dk

оный не осилил скомпилить фатфс. вернее скомпилил, но некоторые преобразования типов указателей скомпилил не верно, обнулив старший байт адреса. Пришлось патчить фатфс, вводя промежуточные переменные. Сообщил об этом разрабам, но мне сообщили типа "Говнокод он не обязан компилить". Какой говнокод, если gcc и iar под все платформы прекрасно компилят.
Уже непомню точно, но вроде указатель находился в структуре, его и надо было преобразовать, причём явно преобразовать.
ZX-Evo rev B, ZX-Evo rev C, ZXNetUsb rev A, ZXNetUsb rev С
http://nedoos.ru/
DimkaM
 
Posts: 1365
Joined: 24 Mar 2010, 13:42
Location: джунгли Амазонки
Group: Registered users

Postby DimkaM » 09 Nov 2012, 07:41

тест, оптимизация поскорости и там и там
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.   }
И да, я в курсе есть оно в библиотеке, это для примера.
Last edited by DimkaM on 09 Nov 2012, 07:58, edited 1 time in total.
ZX-Evo rev B, ZX-Evo rev C, ZXNetUsb rev A, ZXNetUsb rev С
http://nedoos.ru/
DimkaM
 
Posts: 1365
Joined: 24 Mar 2010, 13:42
Location: джунгли Амазонки
Group: Registered users

Postby DimkaM » 09 Nov 2012, 07:54

DimkaM wrote:два аргумента в регах(de,bc) и один на стеке

наврал. Если первый аргумент- указатель, то он в регах, а остальныя на стеке. т.к. при банкинге бывают трехбайтовые указатели
Если объявить как void test(int val, UINT cnt, void* dst) то два аргумента будут в регах, третий на стеке
ZX-Evo rev B, ZX-Evo rev C, ZXNetUsb rev A, ZXNetUsb rev С
http://nedoos.ru/
DimkaM
 
Posts: 1365
Joined: 24 Mar 2010, 13:42
Location: джунгли Амазонки
Group: Registered users

Postby DimkaM » 09 Nov 2012, 14:05

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

это не моё, скопипастил.
Тыж знаешь я сам ничё не кодю, току тырю по маленьку
ZX-Evo rev B, ZX-Evo rev C, ZXNetUsb rev A, ZXNetUsb rev С
http://nedoos.ru/
DimkaM
 
Posts: 1365
Joined: 24 Mar 2010, 13:42
Location: джунгли Амазонки
Group: Registered users

Postby lvd » 09 Nov 2012, 17:19

TS-Labs wrote:Переписал бы тогда по человечески...

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

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

Чо, мне лдир скомпилиццо? :-D
Многого нет здесь: http://lvd.nedopc.com
Image
User avatar
lvd
 
Posts: 1711
Joined: 07 Apr 2007, 22:28
Group: Registered users

Postby DimkaM » 09 Nov 2012, 18:24

TS-Labs wrote:memset
попсово и неинтересно
ZX-Evo rev B, ZX-Evo rev C, ZXNetUsb rev A, ZXNetUsb rev С
http://nedoos.ru/
DimkaM
 
Posts: 1365
Joined: 24 Mar 2010, 13:42
Location: джунгли Амазонки
Group: Registered users

Postby DimkaM » 09 Nov 2012, 18:58

кстати мемсет нихера ни инлайн в 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.   }
ZX-Evo rev B, ZX-Evo rev C, ZXNetUsb rev A, ZXNetUsb rev С
http://nedoos.ru/
DimkaM
 
Posts: 1365
Joined: 24 Mar 2010, 13:42
Location: джунгли Амазонки
Group: Registered users

PreviousNext

Return to Пентева - софт и железо

Who is online

Users browsing this forum: No registered users and 7 guests

cron