Welcome, Guest. Please login or register.


Author Topic: C programozás (Aztec C / Hisoft C) (Read 13203 times)

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: C programozás (Aztec C / Hisoft C)
« Reply #15 on: 2015.December.21. 23:49:01 »
z88dk és SDCC összehasonlítása:

[ Guests cannot view attachments ]     (z88dk)
[ Guests cannot view attachments ]

[ Guests cannot view attachments ]
[ Guests cannot view attachments ]

zcc.exe +enterprise -lm -create-app -O3 -DFASTMATH -omandel_2 mandel_z88dk.c
zcc.exe +enterprise -lm -create-app -O3 -DFASTMATH -otunnel_2 tunnel_z88dk.c


[ Guests cannot view attachments ]     (SDCC)
[ Guests cannot view attachments ]

[ Guests cannot view attachments ]
[ Guests cannot view attachments ]
[ Guests cannot view attachments ]
[ Guests cannot view attachments ]

sdcc.exe -mz80 --code-loc 0x0200 --data-loc 0x4000 --stack-loc 0xf800 --opt-code-speed mandel.c
ihx2ep mandel.ihx loader.bin mandel.com
sdcc.exe -mz80 --code-loc 0x0200 --data-loc 0x4000 --stack-loc 0xf800 --opt-code-speed tunnel.c
ihx2ep tunnel.ihx loader.bin tunnel.com

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: C programozás (Aztec C / Hisoft C)
« Reply #16 on: 2015.December.22. 11:24:58 »
A fenti példák a gyakorlatban elsősorban a lebegőpontos rutinokat tesztelik, de az SDCC ezeknél meglepően lassú (a tunnel.com például csak kétszer gyorsabb, mint az IS-BASIC verzió, és a BASIC nagyobb pontosságú float típust használ). Lehet azonban, hogy a program írásánál vagy a fordításnál valamit nem jól oldottam meg. :oops:

Az alábbi egyszerű egész típuson végzett műveleteket tesztelő példát
Code: C
  1. int foo(int bar, int baz)
  2. {
  3.   int     i = 0;
  4.   while (baz < bar) {
  5.     baz = baz + (baz >> 3);
  6.     i++;
  7.   }
  8.   return i;
  9. }
így fordítja az SDCC (--opt-code-speed, --opt-code-size esetén a jobbra léptetést ciklussal oldja meg):
Code: ZiLOG Z80 Assembler
  1. _foo::
  2. ;c_test.c:5: while (baz < bar) {
  3.         ld      de,#0x0000
  4. 00101$:
  5.         ld      hl,#2
  6.         add     hl,sp
  7.         ld      iy,#4
  8.         add     iy,sp
  9.         ld      a,0 (iy)
  10.         sub     a, (hl)
  11.         ld      a,1 (iy)
  12.         inc     hl
  13.         sbc     a, (hl)
  14.         jp      PO, 00115$
  15.         xor     a, #0x80
  16. 00115$:
  17.         jp      P,00103$
  18. ;c_test.c:6: baz = baz + (baz >> 3);
  19.         ld      hl, #4
  20.         add     hl, sp
  21.         ld      b, (hl)
  22.         inc     hl
  23.         ld      c, (hl)
  24.         sra     c
  25.         rr      b
  26.         sra     c
  27.         rr      b
  28.         sra     c
  29.         rr      b
  30.         ld      hl,#4
  31.         add     hl,sp
  32.         ld      a,(hl)
  33.         add     a, b
  34.         ld      (hl),a
  35.         inc     hl
  36.         ld      a,(hl)
  37.         adc     a, c
  38.         ld      (hl),a
  39. ;c_test.c:7: i++;
  40.         inc     de
  41.         jr      00101$
  42. 00103$:
  43. ;c_test.c:9: return i;
  44.         ex      de,hl
  45.         ret
és a z88dk (-O3) - ez rövidebb, de sok a CALL:
Code: ZiLOG Z80 Assembler
  1. ._foo
  2.         ld      hl,0    ;const
  3.         push    hl
  4. .i_3
  5.         ld      hl,4    ;const
  6.         call    l_gintspsp      ;
  7.         ld      hl,8    ;const
  8.         call    l_gintsp        ;
  9.         pop     de
  10.         call    l_lt
  11.         jp      nc,i_4
  12.         ld      hl,4    ;const
  13.         add     hl,sp
  14.         push    hl
  15.         ld      hl,6    ;const
  16.         call    l_gintspsp      ;
  17.         ld      hl,8    ;const
  18.         call    l_gintspsp      ;
  19.         ld      hl,3    ;const
  20.         pop     de
  21.         call    l_asr
  22.         pop     de
  23.         add     hl,de
  24.         call    l_pint_pop
  25.         pop     hl
  26.         inc     hl
  27.         push    hl
  28.         dec     hl
  29.         jp      i_3
  30. .i_4
  31.         pop     hl
  32.         ret

Csak érdekességként ugyanez x64-re fordítva GCC-vel:
Code: [Select]
foo:
.LFB0:
        .cfi_startproc
        xor     eax, eax
        cmp     esi, edi
        jge     .L4
        .p2align 4,,10
        .p2align 3
.L3:
        mov     edx, esi
        add     eax, 1
        sar     edx, 3
        add     esi, edx
        cmp     edi, esi
        jg      .L3
        rep ret
.L4:
        rep ret
        .cfi_endproc

Szerintem inkabb azt kene megvizsgalni, hogy valoban szukseg van-e arra, hogy minden mukodjon 64K-s hatart attorve, vagy elfogadhato, ha adott esetben platform specifikus dolgok vannak, akar pl ugy, hogy a megfelelo C fuggvenynek valo entitassal az ember lapozgat, mintha asm lenne a dolog. Nem tul szep, az igaz.

Ha csak egy nagy méretű tömb kell, akkor annak a kezeléséhez (lefoglalás, felszabadítás, elem olvasása, elem írása) viszonylag könnyen lehet inline asm rutinokat írni. Az már problémásabb, ha a kód + változók + verem is többet igényel, mint 64K.

Offline Trefe

  • User
  • *
  • Posts: 65
  • Country: hu
Re: C programozás (Aztec C / Hisoft C)
« Reply #17 on: 2015.December.22. 18:48:51 »
Esetleg, ha nosztalgiázni akartok, akkor itt van néhány IS-DOS alatt is futó C compiler és egy interpreter is. Bár, nem mindegyiket próbáltam ki. A legteljesebb ezek közül a Hitech C fordítója 1987-89-ből, egész komoly rutin könyvtárral és használati útmutatóval. A leggyorsabb viszont a MESCC. Mindegyiknek megvan a maga fortélya. Jó kísérletezgetést!

Offline Lacika

  • EP addict
  • *
  • Posts: 3191
  • Country: hu
    • http://www.ep128.hu
Re: C programozás (Aztec C / Hisoft C)
« Reply #18 on: 2015.December.22. 21:17:11 »
A MESCC-el hogy kell .com-ot készítni?
A hextobin csak annyit ír ki, hogy Missing colon.

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: C programozás (Aztec C / Hisoft C)
« Reply #19 on: 2015.December.22. 22:47:42 »
A MESCC-el hogy kell .com-ot készítni?
A hextobin csak annyit ír ki, hogy Missing colon.

test.c fordítása A: lemezen:

cc test.c
ccopt test.zsm
zsm test.aaz
hextobin test.hex test.com


A forrás file elején #include <mescc.h> kell a C runtime inicializálásához.

Offline lgb

  • EP addict
  • *
  • Posts: 3563
  • Country: hu
  • æðsta yfirmaður
    • http://lgb.hu/
Re: C programozás (Aztec C / Hisoft C)
« Reply #20 on: 2015.December.23. 00:29:03 »
Quote
Ha csak egy nagy méretű tömb kell, akkor annak a kezeléséhez (lefoglalás, felszabadítás, elem olvasása, elem írása) viszonylag könnyen lehet inline asm rutinokat írni. Az már problémásabb, ha a kód + változók + verem is többet igényel, mint 64K.

Valoban. En arra celoztam pont, hogy specialis igenyekre lehet, de ha a C alapfilozofiajat, a pointer aritmetikat stb is at akarja vinni az ember, akkor az nem lenne ilyen egyszeru ... Bar sokszor a fenti is eleg lenne.

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: C programozás (Aztec C / Hisoft C)
« Reply #21 on: 2015.December.23. 18:18:57 »
Újabb fordító teszt: epcompress -raw -m3 kimenetének a kicsomagolása. A forrás file (amit ennél jobban is meg lehetett volna írni :oops:):

[ Guests cannot view attachments ]
[ Guests cannot view attachments ]

Assembly verzió:

[ Guests cannot view attachments ]
[ Guests cannot view attachments ]

Fordítás:

sjasm m3d_test.s m3d_test.com
zcc +enterprise -create-app -O3 -otest_m3d test_m3d.c -lm
sdcc -mz80 --code-loc 0x0200 --data-loc 0x4000 --stack-loc 0xf800 --opt-code-speed test_m3d.c
ihx2ep test_m3d.ihx loader.bin test_m3d.com


A bemeneti file és az időméréshez használt script:

[ Guests cannot view attachments ]
[ Guests cannot view attachments ]

Az eredmény (a z88dk-s program azért ennyire nagy, mert tartalmaz egy 12288 byte méretű statikus tömböt), csak a decompressData rutin futásideje:

[ Guests cannot view attachments ]     (assembly): 0.435 másodperc
[ Guests cannot view attachments ]     (SDCC): 1.943 másodperc
[ Guests cannot view attachments ]     (z88dk): 5.402 másodperc

Offline Lacika

  • EP addict
  • *
  • Posts: 3191
  • Country: hu
    • http://www.ep128.hu
Re: C programozás (Aztec C / Hisoft C)
« Reply #22 on: 2015.December.24. 10:29:46 »
Ez a függvény miért működik return nélkül?

itoa(n,s) /*n karakterre konvertalasa s-be */
char s[];
int n;
{
  int i,sign;
  sign=n; i=0;
  do { /* szamjegyek generalasa */
    s[i++]=abs(n%10)+'0';
  } while((n/=10)!=0);
  if(sign<0) s[i++]='-';
  s='\0';
  reverse(s);
}

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: C programozás (Aztec C / Hisoft C)
« Reply #23 on: 2015.December.24. 10:48:26 »
Nincs visszatérési érték, és az eredményt az s[]-be írja.

Offline Mayer Gábor

  • EP fan
  • *
  • Posts: 216
  • Country: hu
Re: C programozás (Aztec C / Hisoft C)
« Reply #24 on: 2015.December.26. 12:50:35 »
sdcc támogat lapozást z180-nal? ha igen akkor lehet, hogy átlehetne alakítani enterprise z80-hoz.

Offline Lacika

  • EP addict
  • *
  • Posts: 3191
  • Country: hu
    • http://www.ep128.hu
Re: C programozás (Aztec C / Hisoft C)
« Reply #25 on: 2015.December.31. 11:39:33 »
Valaki szakavatott meg tudná nézni valami mai debug alkalmatossággal, hogy a csatolt programban hol a hiba?
Rendben lefordul, de CTRL-Z-re ledermed. Amúgy kulcsszavakat számolna, részletesen a program elvi működése ittolvasható.

Offline Mayer Gábor

  • EP fan
  • *
  • Posts: 216
  • Country: hu
Re: C programozás (Aztec C / Hisoft C)
« Reply #26 on: 2015.December.31. 12:26:57 »
ezt cpm alól futtatod? mert ha nem akkor gondolom nem fog tudni hova kilépni. véget ér a program majd jó eséllyel lefagy a rendszer.

Offline Lacika

  • EP addict
  • *
  • Posts: 3191
  • Country: hu
    • http://www.ep128.hu
Re: C programozás (Aztec C / Hisoft C)
« Reply #27 on: 2015.December.31. 12:31:00 »
ezt cpm alól futtatod? mert ha nem akkor gondolom nem fog tudni hova kilépni. véget ér a program majd jó eséllyel lefagy a rendszer.

Ep-n, ISDOS alatt. Ki kellene írnia a begépelt kulcsszavak darabszámát, majd szabályosan kilépne a programból. De valamiért mégsem teszi.

Offline Mayer Gábor

  • EP fan
  • *
  • Posts: 216
  • Country: hu
Re: C programozás (Aztec C / Hisoft C)
« Reply #28 on: 2015.December.31. 13:05:34 »
kapcsold be fordításkor a warningokat is. megfelelő includok szükségesek pl. stdio.h.
« Last Edit: 2015.December.31. 13:35:37 by Mayer Gábor »

Offline Povi

  • EP addict
  • *
  • Posts: 2296
  • Country: hu
    • http://povi.fw.hu
Re: C programozás (Aztec C / Hisoft C)
« Reply #29 on: 2016.January.05. 12:37:48 »

Az eredmény (a z88dk-s program azért ennyire nagy, mert tartalmaz egy 12288 byte méretű statikus tömböt), csak a decompressData rutin futásideje:

(Attachment Link)    (assembly): 0.435 másodperc
(Attachment Link)    (SDCC): 1.943 másodperc
(Attachment Link)    (z88dk): 5.402 másodperc

Nem semmi, több, mint tízszeres lassulás! A másik (négyszeres) még elfogadható szerintem (sőt, kb. azt tartom reálisnak egy asm vs. fordított nyelv esetén).
*** Speicherplatz zu klein