Welcome, Guest. Please login or register.


Author Topic: Enterprise C Compiler PC-re (Read 34110 times)

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: Enterprise C Compiler PC-re
« Reply #45 on: 2018.March.16. 15:42:13 »
Nem tudom, hasznos-e, mivel z88dk helyett SDCC-t használ, de a régebben feltöltött epiview.com programnak ez a forráskódja:

[ Guests cannot view attachments ]

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

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

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: Enterprise C Compiler PC-re
« Reply #46 on: 2018.March.16. 16:45:26 »
z88dk változat, jelenleg néhány korlátozással (fix "IMAGE.EPZ" file név, nincs hibakezelés a file olvasásnál):
[ Guests cannot view attachments ]

Online Tomato77

  • EP user
  • *
  • Posts: 397
  • Country: hu
    • Támogató Támogató
Re: Enterprise C Compiler PC-re
« Reply #47 on: 2018.March.17. 11:00:58 »
Mindenképp hasznosak ezek a források. C-t utoljára a suliban láttam, vissza kell rázódni, és az Enterprise specifikus részeket is meg lehet bennük nézni. Nagy segítség, köszönöm!
Kotasoft

Online Tomato77

  • EP user
  • *
  • Posts: 397
  • Country: hu
    • Támogató Támogató
Re: Enterprise C Compiler PC-re
« Reply #48 on: 2018.March.26. 20:51:33 »
Miért nem működik az alábbi rutin? Arra tippelek, hogy rosszul próbálom kivenni/visszatenni a stackből/be a paramétereket. Hogyan lehet ezt korrekten megcsinálni? Nézegetem a Z88dk forrásait, de nem jövök rá. Köszönöm! Még egy kérdés: 8 bites (unsigned char) változót így bele lehet tölteni egy 16 bites regiszterbe? Megcsinálja rendesen, vagy  8 bites regisztert kéne megadni? Emiatt nem jó?

#include <stdio.h>

void Set_EXOS_Var(unsigned char Variable, unsigned char Value)
{
  #asm
  pop    BC   ; return address
  pop    HL   ; Variable
  pop    DE   ; Value
  push   DE   ; restore stack
  push   HL
  push   BC
  ld     B,1  ; SET mode
  ld     C,L  ; Variable
  ld     D,E  ; Value
  rst    30H
  defb   16
  #endasm
}

void main()
{     
  printf("Black ");
  while (getk() != 13) {};
  printf("Purple ");
  Set_EXOS_Var(27, 104);
  while (getk() != 13) {};
  printf("White ");
  Set_EXOS_Var(27, 255);
  while (getk() != 13) {};
}
Kotasoft

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: Enterprise C Compiler PC-re
« Reply #49 on: 2018.March.26. 22:30:53 »
Fordított a paraméterek sorrendje, tehát BC = visszatérési cím, HL = érték, DE = változó. A Set_EXOS_Var első hívása:

Code: ZiLOG Z80 Assembler
  1.   0259  21 1B 00     LD    HL, 001B
  2.   025C  E5           PUSH  HL
  3.   025D  21 68 00     LD    HL, 0068
  4.   0260  E5           PUSH  HL
  5.   0261  CD 2B 02     CALL  022B
  6.   0264  C1           POP   BC
  7.   0265  C1           POP   BC

Részletesebb leírás itt található. Ha csak egy paraméter van, akkor az a HL regiszterben is átadható a __FASTCALL__ használatával.
« Last Edit: 2018.March.26. 22:41:21 by IstvanV »

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: Enterprise C Compiler PC-re
« Reply #50 on: 2018.March.26. 23:08:43 »
Még egy lehetőség kisebb optimalizálásra a __CALLEE__, ennek a használatakor a hívott függvénynek kell leemelnie a paramétereket a veremről, tehát megtakarítható a PUSH DE és PUSH HL, illetve visszatérés után sem lesz két POP BC.

Online Tomato77

  • EP user
  • *
  • Posts: 397
  • Country: hu
    • Támogató Támogató
Re: Enterprise C Compiler PC-re
« Reply #51 on: 2018.March.27. 00:03:44 »
Műxik, köszi! :) Nem jöttem volna rá.

Bemásolom, hogy itt legyen a jó változat. Talán így elegánsabb, mint kiszedni a veremből és visszatenni. Az első működő assembly rutinom Enterprise-ra. :)

void Set_EXOS_Var(unsigned char Variable, unsigned char Value)
{
  #asm
  ld     HL,2
  add    HL,SP   ; skip over return address on stack
  ld     D,(HL)  ; "Value"
  inc    HL
  inc    HL
  ld     C,(HL)  ; "Variable"
  ld     B,1     ; SET mode
  rst    30H
  defb   16
  #endasm
}
« Last Edit: 2018.March.27. 00:46:43 by Tomato77 »
Kotasoft

Online Tomato77

  • EP user
  • *
  • Posts: 397
  • Country: hu
    • Támogató Támogató
Re: Enterprise C Compiler PC-re
« Reply #52 on: 2018.March.27. 16:52:07 »
Kérdezhetek még? :)

- Jól látom, hogy a Z88dk nem támogatja a több dimenziós tömböket? Pl. egy unsigned char x[10][10]; nem fordul le. Egy 100 elemű egy dimenziós tömbbel kikerülhető, úgyhogy nem okoz nagy gondot, csak kíváncsi vagyok, hogy én bénázok-e.

- Hogyan tudok assembly kódban a C változóihoz hozzáférni, vagy fordítva: C-ben hogyan tudom elérni a CPU regisztereket? (Hasonlóan, mint pl. Pascal-ban az RA, RB, stb. használatával.) Azaz hogyan lehet értéket átadni egymás között, ha egy rövid C kód után assembly sorokra van szükség, de nincs hívott függvény, így a stack-ből nem tudom kinyerni az értékeket? Se a példákban, se a neten nem találtam ilyen példát.

Köszi előre is!
Kotasoft

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: Enterprise C Compiler PC-re
« Reply #53 on: 2018.March.27. 17:20:29 »
Bemásolom, hogy itt legyen a jó változat. Talán így elegánsabb, mint kiszedni a veremből és visszatenni. Az első működő assembly rutinom Enterprise-ra. :)

Még tömörebb változat, bár sok jelentősége nincs az EXOS hívás lassúsága miatt:
Code: ZiLOG Z80 Assembler
  1. void __CALLEE__ Set_EXOS_Var(unsigned char Variable, unsigned char Value)
  2. {
  3.   #asm
  4.   pop    HL   ; return address
  5.   pop    DE   ; Value
  6.   pop    BC   ; Variable
  7.   ld     B,1  ; SET mode
  8.   ld     D,E  ; Value
  9.   rst    30H
  10.   defb   16
  11.   JP     (HL)
  12.   #endasm
  13. }

- Jól látom, hogy a Z88dk nem támogatja a több dimenziós tömböket? Pl. egy unsigned char x[10][10]; nem fordul le. Egy 100 elemű egy dimenziós tömbbel kikerülhető, úgyhogy nem okoz nagy gondot, csak kíváncsi vagyok, hogy én bénázok-e.

Valóban nem működik, a wiki említi is korlátozásként. Az SDCC támogatja.

Quote
- Hogyan tudok assembly kódban a C változóihoz hozzáférni, vagy fordítva: C-ben hogyan tudom elérni a CPU regisztereket? (Hasonlóan, mint pl. Pascal-ban az RA, RB, stb. használatával.) Azaz hogyan lehet értéket átadni egymás között, ha egy rövid C kód után assembly sorokra van szükség, de nincs hívott függvény, így a stack-ből nem tudom kinyerni az értékeket? Se a példákban, se a neten nem találtam ilyen példát.

A "kevert" C és assembly kódot (pl. regiszterek használatát C-ben) nem tudom, hogyan lehet megoldani, de a globális C változók és függvények az assembly kódban elérhetők a név elején _ karakterrel, például "unsigned char valtozo" -> LD A, (_valtozo).

Online Tomato77

  • EP user
  • *
  • Posts: 397
  • Country: hu
    • Támogató Támogató
Re: Enterprise C Compiler PC-re
« Reply #54 on: 2018.March.27. 19:58:53 »
Kipróbáltam, tényleg működik, el lehet érni a változókat. Nagyon szuper, köszönöm!
Kotasoft

Online Tomato77

  • EP user
  • *
  • Posts: 397
  • Country: hu
    • Támogató Támogató
Re: Enterprise C Compiler PC-re
« Reply #55 on: 2018.March.27. 22:23:12 »
A Z88dk fordításkor kiírja a szintaktikailag hibás sorok számát. Az assembly kódnál magát a sort is, de a C kódnál nem, ezért pár száz soros forrásban már kicsit nehéz megtalálni a hiányzó pontosvesszőt. Ha beszúrok egy x-et valahová, direkt hibát okozva, be lehet lőni, hogy kb. merre van a valós hiba. Ha messze van, arrébb kell célozni az x-szel.

Tök jó, hogy ott voltam a legutóbbi klubnapon és Csabától megtudtam, hogy ilyen fejlesztő eszköz is van Enterprise-hoz.
Kotasoft

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: Enterprise C Compiler PC-re
« Reply #56 on: 2018.March.28. 11:15:14 »
Ha a forráskód szerkesztésére használt program kiírja az aktuális sor számát, akkor könnyen megtalálható a hibás sor csak a szám alapján. De a hibaüzenetekben nem mindig pontos a szám, talán az előfeldolgozás miatt, az #asm és #endasm például két sornak számít. :)

Online Zozosoft

  • Global Moderator
  • EP addict
  • *
  • Posts: 14721
  • Country: hu
    • http://enterprise.iko.hu/
Re: Enterprise C Compiler PC-re
« Reply #57 on: 2018.March.28. 11:18:26 »
Ha a forráskód szerkesztésére használt program kiírja az aktuális sor számát
Erre szoktam javasolni: Programmer's Notepad

Offline IstvanV

  • EP addict
  • *
  • Posts: 4822
Re: Enterprise C Compiler PC-re
« Reply #58 on: 2018.March.28. 11:42:53 »
Lehet, hogy ez csak Wine alatt van így, de nálam a z88dk "szemetel" a TEMP könyvtárban, fordításkor létrejön néhány átmeneti file, ami nem törlődik. Elvileg a -cleanup vagy -no-cleanup engedélyezi vagy tiltja a törlést. Az utóbbi azonban hasznos is lehet debug célra, mert elérhető marad az assembly forráskód (.asm) és a globális szimbólumok címei (.map).

Online Tomato77

  • EP user
  • *
  • Posts: 397
  • Country: hu
    • Támogató Támogató
Re: Enterprise C Compiler PC-re
« Reply #59 on: 2018.March.28. 12:36:00 »
Én egy batch fájlt csináltam a fordításhoz, aminek egyetlen paramétere a forrás (.c nélkül). Ez meghívja a zcc.exe-t, letörli a fordított .com-ot, az .app-t átnevezi .com-ra és letörli a fordításkor keletkező egyéb fájlokat.
Kotasoft