Robotrontechnik-Forum

Registrieren || Einloggen || Hilfe/FAQ || Suche || Mitglieder || Home || Statistik || Kalender || Admins Willkommen Gast! RSS

Robotrontechnik-Forum » Technische Diskussionen » Hi-Tech C v3.09 für Z80.. » Themenansicht

Autor Thread - Seiten: -1-
000
18.01.2020, 20:59 Uhr
holm

Avatar von holm

..muddelt evtl. eine von Euch mit diesem C-Compiler herum?
Ich habe da ein Problem mit der Syntax des dazugehörigen Assemblers ZAS. Ich möchte eine Eingabe Routine in Inline Assembler schreiben und mich interessiert ganz einfach die Syntax für den IN Befehl.
Es gibt eine Textdatei Z80DOC.TXT die das normalerweise beschreibt, aber die Seiten um 55-60 die vom
Index am Ende referenziert werden, sind in allen mir über den Weg gelaufenen Versionen dieser Datei leer....

Komisch, ist aber so.

Weiß Einer weiter?

Gruß,
Holm
--
float R,y=1.5,x,r,A,P,B;int u,h=80,n=80,s;main(c,v)int c;char **v;
{s=(c>1?(h=atoi(v[1])):h)*h/2;for(R=6./h;s%h||(y-=R,x=-2),s;4<(P=B*B)+
(r=A*A)|++u==n&&putchar(*(((--s%h)?(u<n?--u%6:6):7)+"World! \n"))&&
(A=B=P=u=r=0,x+=R/2))A=B*2*A+y,B=P+x-r;}
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
001
19.01.2020, 17:42 Uhr
Bert



Bei mir sind diese Seiten auch leer. Vielleicht hat man da im Originaldokument Fotos drin gehabt...

Was gefällt dir an den C-Funktionen INP und OUTP nicht?

Quellcode:

char     inp(unsigned     port)
void     outp(unsigned, unsigned data)



Was sagt er zu 'normalem' Z80-Assembler?
Ggf. muß man die Langform nutzen: "IN L, (C)"

Der Rückgabewert muß je nach Länge in die passenden Register:

Quellcode:

Return values are in HL for words, and HL and DE for long words, with the high word in HL. Byte returns are in L. but sign or zero extended as appropriate into H.



Quelle: https://github.com/z88dk/z88dk/issues/972

Grüße,
Bert
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
002
20.01.2020, 09:18 Uhr
holm

Avatar von holm

An den Funktionen _inp() und _outp() gefällt mir nicht das ich dafür keine Zeit habe.

115200 Baud mit einem Zilog ESCC (Danke PIC18*) sind selbst auf einer 12Mhz Z280 eine Challange.
Ich habe deshalb versucht mit Inline Assembler gemäß der Doku was Brauchbars zu erzeugen, da wird aber nur Kuddelmuddel. Ich bin damit nicht glücklich geworden. Kannst ja mal versuchen mit "in a,(025H)" (von wegen, 0x25 geht) irgendwelchen Code zu erzeugen der funktioniert. Auch einen relativen Jump "jr label" sollte man sich besser sparen wenn man dann im Assembler Output des Compilers nicht Dinge wie "jr AF', label' lesen möchte.
Wenn ich das Ganze als eigenes Assembler File durch ZAS ziehe gehts aber zu linken und funktioniert.
Diese Behauptung das inline Assembler 1:1 an den Output durchgereicht wird, kann man in der Pfeife rauchen. Gerne crasht auch der Peephole Optimizer beim Nachdenken über den Code..

HiTech C v3.09 ist der einzige Compiler der Z80 code als Ansi Compiler erzeugen kann und es gibt Patches für Z280 optimierten Code.

Gruß,
Holm
--
float R,y=1.5,x,r,A,P,B;int u,h=80,n=80,s;main(c,v)int c;char **v;
{s=(c>1?(h=atoi(v[1])):h)*h/2;for(R=6./h;s%h||(y-=R,x=-2),s;4<(P=B*B)+
(r=A*A)|++u==n&&putchar(*(((--s%h)?(u<n?--u%6:6):7)+"World! \n"))&&
(A=B=P=u=r=0,x+=R/2))A=B*2*A+y,B=P+x-r;}
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
003
20.01.2020, 09:53 Uhr
volkerp
Default Group and Edit
Avatar von volkerp

vielleicht erzeugt Version 4.11 etwas besseren Code ?

http://www.cpcwiki.eu/forum/programming/hi-tech-c-v4-11-for-z80/
--
VolkerP

http://hc-ddr.hucki.net
(Z9001, Z1013, LC-80, ...)
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
004
20.01.2020, 12:13 Uhr
PIC18F2550

Avatar von PIC18F2550

Warum keine interne DMA verwenden?
Währen doch 1Mb machbar.
--
42 ist die Antwort auf die "Frage nach dem Leben, dem Universum und dem ganzen Rest"
Aktuelle Projektdokumentationen
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
005
20.01.2020, 14:26 Uhr
holm

Avatar von holm

@PIC:...weil es auf dem ECB Bus keine DMA Steuersignale gibt...
Ich werde erst mal sehen ob ich wenigstens die Interrupts zum Laufen bekomme, das ist auf dem Z280 INTA und ohne Vector, nebenbei kämpft man da unter CP/M 3.0 und Bankbios noch mit IO Pages...

@volkerp:4.11 ist ein DOS-Cross-Compiler. Das der Code deutlich besser wird, glaube ich nicht, weil der Overhead durch die Variablenübergabe zum Unterprogramm zustande kommt, bzw. eben des Rückkehrwertes. Das ist aber wirklich nicht kriegsentscheidend so lange ich ein Assembler-Unterprogramm einbinden kann. Letzteres funktioniert ja, nur mit dem Inlineassembler bin ich halt nicht klar gekommen, evtl. mache ich da ja auch was falsch. In der Doku steht sinngemäß das der zwischen #asm und #endasm eingebettete Assemblercode 1:1 übernommen wird, das scheint aber nicht so zu sein und auch der Optimizer gurkt dann da drin herum (der kommt vom Kommandozeilenaufruf einfach nicht wieder...Reset).

Es gibt wohl Quellcode zum v3.09, sicher auch auf meinem Rechner. Ich muß mal gucken was der CPP da macht, aber durtchzusteigen was p1, was cgen und was optim machen...traue ich mir nicht wirklich zu.

Quellcode:

K>c -V -O escctest.c
HI-TECH C COMPILER (CP/M-80) V3.09
Copyright (C) 1984-87 HI-TECH SOFTWARE
0:CPP -DCPM -DHI_TECH_C -Dz80 -I ESCCTEST.C $CTMP1.$$$
0:P1 $CTMP1.$$$ $CTMP2.$$$ $CTMP3.$$$
ESCCTEST.C: main()
   181: }
        ^ unused variable definition: k (warning)
        ^ unused variable definition: l (warning)
0:CGEN $CTMP2.$$$ $CTMP1.$$$
ESCCTEST.C:148: constant relational expression (warning)
0:OPTIM $CTMP1.$$$ $CTMP2.$$$
0:ZAS -J -N -oESCCTEST.OBJ $CTMP2.$$$
ERA $CTMP1.$$$
ERA $CTMP2.$$$
ERA $CTMP3.$$$
0:LINQ -Z -Ptext=0,data,bss -C100H -OESCCTEST.COM CRTCPM.OBJ ESCCTEST.OBJ LIBC.LIB
ERA ESCCTEST.OBJ
ERA $$EXEC.$$$

K>



Gruß,
Holm
--
float R,y=1.5,x,r,A,P,B;int u,h=80,n=80,s;main(c,v)int c;char **v;
{s=(c>1?(h=atoi(v[1])):h)*h/2;for(R=6./h;s%h||(y-=R,x=-2),s;4<(P=B*B)+
(r=A*A)|++u==n&&putchar(*(((--s%h)?(u<n?--u%6:6):7)+"World! \n"))&&
(A=B=P=u=r=0,x+=R/2))A=B*2*A+y,B=P+x-r;}

Dieser Beitrag wurde am 20.01.2020 um 14:26 Uhr von holm editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
006
20.01.2020, 19:32 Uhr
Mobby5



Da wirft sich mir die Frage auf: "Kann es sein, dass die Inline Assemblercodes nicht dokumentiert sind, weil der Inline Assembler nicht fertig ist?"
--
und ausserdem muss in Zeile 20 der Doppelpunkt durch ein Semikolon ersetzt werden

Dieser Beitrag wurde am 20.01.2020 um 19:32 Uhr von Mobby5 editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
007
20.01.2020, 19:48 Uhr
holm

Avatar von holm

Es steht in der vorhandenen Doku das die Befehle zwischen den #asm Tags unverändert durchgereicht werden zum ZAS, der diese also übersetzt. Ergo gibt es gar keinen Inline Assembler.

Gruß,
Holm
--
float R,y=1.5,x,r,A,P,B;int u,h=80,n=80,s;main(c,v)int c;char **v;
{s=(c>1?(h=atoi(v[1])):h)*h/2;for(R=6./h;s%h||(y-=R,x=-2),s;4<(P=B*B)+
(r=A*A)|++u==n&&putchar(*(((--s%h)?(u<n?--u%6:6):7)+"World! \n"))&&
(A=B=P=u=r=0,x+=R/2))A=B*2*A+y,B=P+x-r;}
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
008
20.01.2020, 20:14 Uhr
holm

Avatar von holm

Beispiel:
Testprogramm tt.c:


Quellcode:

#include <stdio.h>

char buf[128];

main()
{

buf[0]='Y';

#asm
global jjj
jjj: ld hl,_buf
     ld a,(hl)
     out (027H),a
#endasm

printf("Hallo!\r\n");
}



Übersetzung ohne Optimizer:
c -s tt.c, ergibt tt.as

Quellcode:

(jede Menge Kommentar gelöscht)
;stdio.h: 90: extern    struct _iobuf * fdopen(int, char *);
;stdio.h: 91: extern long       ftell(  struct _iobuf *);
;stdio.h: 92: extern char *     fgets(char *, int,      struct _iobuf *);
;stdio.h: 93: extern char *     _bufallo(void);
;TT.C: 3: char buf[128];
;TT.C: 5: main()
;TT.C: 6: {
psect   text
global  _main
_main:
global  ncsv, cret, indir
call    ncsv
defw    f30
;TT.C: 8: buf[0]='Y';
ld      a,.low.89
ld      (_buf),a
global jjj
;TT.C: 11: global jjj
jjj: ld hl,_buf
;TT.C: 12: jjj: ld hl,_buf
     ld a,(hl)
;TT.C: 13:      ld a,(hl)
     out (027H),a
;TT.C: 14:      out (027H),a
;TT.C: 17: printf("Hallo!\r\n");
global  _printf
ld      hl,19f
push    hl
call    _printf
ld      hl,2
add     hl,sp
ld      sp,hl
;TT.C: 18: }
l2:
jp      cret
f30     equ     0
psect   data
19:
defb    72,97,108,108,111,33,13,10,0
psect   bss
_buf:
        defs    128




..so weit, so hübsch, bist auf die Tatsache das 0x27 statt 027H nicht funktioniert (entgegen der Doku), ok geschenkt.
Läßt man das mit Optimizer laufen:


Quellcode:

K>c -O -V tt.c
HI-TECH C COMPILER (CP/M-80) V3.09
Copyright (C) 1984-87 HI-TECH SOFTWARE
0:CPP -DCPM -DHI_TECH_C -Dz80 -I TT.C $CTMP1.$$$
0:P1 $CTMP1.$$$ $CTMP2.$$$ $CTMP3.$$$
0:CGEN $CTMP2.$$$ $CTMP1.$$$
0:OPTIM $CTMP1.$$$ $CTMP2.$$$
0:ZAS -J -N -oTT.OBJ $CTMP2.$$$
$CTMP2.$$$:12:  Syntax error
ERA $CTMP1.$$$
ERA $CTMP2.$$$
ERA $CTMP3.$$$
ERA TT.OBJ
ERA $$EXEC.$$$



..kracht es auf Zeile 12. Nachforschungen ergeben dann, das das die Ausgabe von A nach 0x27 ist, der Optimizer scheint den Befehl gar nicht zu kennen...

Ich kann den selben Code aber in ein AS File schreiben und ZAS vorwerfen, es wird sauber ein OBJ gebaut, das sich mit LINQ auch zum C-Code linken läßt.

Nochmal einzeln die Dateien vor und nach Optim:

Quellcode:

K>type $CTMP1.$$$
psect   text
global  _main
_main:
global  ncsv, cret, indir
call    ncsv
defw    f30
global  _buf
ld      a,.low.89
ld      (_buf),a
global jjj
jjj: ld hl,_buf
     ld a,(hl)
     out (027H),a
global  _printf
ld      hl,19f
push    hl
call    _printf
ld      hl,2
add     hl,sp
ld      sp,hl
l2:
jp      cret
f30     equ     0
psect   data
19:
defb    72,97,108,108,111,33,13,10,0
psect   bss
_buf:
        defs    128



nach optim:

Quellcode:

global  _main
global  ncsv, cret, indir
global  _buf
global  jjj
global  _printf
psect   text
_main:
ld      a,89
ld      (_buf),a
ld      hl,_buf
ld      a,(hl)
hl      39
ld      hl,19f
push    hl
call    _printf
pop     bc
ret    
psect   data
19:
defb    72,97,108,108,111,33,13,10,0
psect   bss
_buf:
defs    128
psect   text



Aus "out(027H),a" ist "hl 39" geworden... ich kanns dem ZAS nicht übel nehmen wenn der darüber nörgelt.

Gruß,
Holm
--
float R,y=1.5,x,r,A,P,B;int u,h=80,n=80,s;main(c,v)int c;char **v;
{s=(c>1?(h=atoi(v[1])):h)*h/2;for(R=6./h;s%h||(y-=R,x=-2),s;4<(P=B*B)+
(r=A*A)|++u==n&&putchar(*(((--s%h)?(u<n?--u%6:6):7)+"World! \n"))&&
(A=B=P=u=r=0,x+=R/2))A=B*2*A+y,B=P+x-r;}

Dieser Beitrag wurde am 20.01.2020 um 21:01 Uhr von holm editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
009
20.01.2020, 20:54 Uhr
Bert



Wenn es mit extern übersetzen und linken geht, würde ich das so lassen.
Elegant geht manchmal mit der alten Software nicht, da besteht das eigene Projekt fast nur aus Workarounds :-)

Ich hatte mal mit BDS-C 1.60C etwas rumgespielt. Der hatte auch so seine Eigenheiten (von Bezeichnern sind z.B. nur die ersten acht Buchstaben relevant...).
Ob und wie der mit Assembler umgehen kann, weiß ich nicht.

Grüße,
Bert
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
010
20.01.2020, 21:02 Uhr
holm

Avatar von holm

Ja..wobei BDSC kein ANSI Compiler ist...aber auch noch nicht mal echt K&R, auch kann er keinen Z80 Code erzeugen, was angesichts der brach liegenden Schattenregister schade ist. Ich weiß allerdings das er romfähigen Code erzeugen kann und auch das man Assembler hinzu linken kann.

Ich habe nochwas gefunden das evtl. geht, bei den UZI280 Sachen liegt ein Ding Namens QC Compiler bei, ma gucken was ich draus basteln kann:

"This is a C compiler for the Z280. It is a modified
version of The Code Works' Q/C compiler.
It is copyrighted by them, and not legally distributable!"

Gruß,
Holm
--
float R,y=1.5,x,r,A,P,B;int u,h=80,n=80,s;main(c,v)int c;char **v;
{s=(c>1?(h=atoi(v[1])):h)*h/2;for(R=6./h;s%h||(y-=R,x=-2),s;4<(P=B*B)+
(r=A*A)|++u==n&&putchar(*(((--s%h)?(u<n?--u%6:6):7)+"World! \n"))&&
(A=B=P=u=r=0,x+=R/2))A=B*2*A+y,B=P+x-r;}

Dieser Beitrag wurde am 21.01.2020 um 10:27 Uhr von holm editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
Seiten: -1-     [ Technische Diskussionen ]  



Robotrontechnik-Forum

powered by ThWboard 3 Beta 2.84-php5
© by Paul Baecher & Felix Gonschorek