Robotrontechnik-Forum

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

Robotrontechnik-Forum » Technische Diskussionen » sdcc c-compiler für den Z1013 » Themenansicht

Autor Thread - Seiten: -1-
000
20.02.2014, 11:58 Uhr
Hobi



Ich habe es geschafft eine ladbare Binärdatei aus dem Kompiler zu bekommen. Endlich hat die Frickelei mit Basic und Assembler ein Ende! Das ganze kann man leicht an den KC anpassen.


Quellcode:
void main()
{
    unsigned char c;
    
    PRST7("Hello World");
    OUTCH(0xd);
    PRST7("press a key");
    c=INCH();
    OUTCH(c);
    PRST7("quit.");
}


--
-------------------------------------------
Winterschlaf
-------------------------------------------

Dieser Beitrag wurde am 20.02.2014 um 12:00 Uhr von Hobi editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
001
20.02.2014, 17:19 Uhr
Mobby5



Dann lass uns mal an Deinem Erfolg teilhaben. Der Compiler und ein kleines Tutorial wäre nett.
--
und ausserdem muss in Zeile 20 der Doppelpunkt durch ein Semikolon ersetzt werden
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
002
20.02.2014, 19:22 Uhr
abnoname

Avatar von abnoname

Hallo,

habe mich zuletzt auch mit dem SDCC und dem Drumherum beschäftigt. Hier ist eine Anleitung für ein Setup, um Programme für eine MMS16 KGS zu schreiben:

http://abnoname.blogspot.de/2014/02/kgs-k7070-reparatur.html

VG
Franz
--
mein Blog: http://abnoname.blogspot.de
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
003
21.02.2014, 02:31 Uhr
Hobi



Danke ich hab mir deine Seite angeschaut. Da wir jetzt schon zu Zweit sind, können wir uns ja austauschen.

Das mit den IN-OUT Funktionen hätte man einfacher lösen können. Der SDCC hat das Schlüsselwort __sfr:


Quellcode:
__sfr __at (0x15) memsel ;
__sfr __at (0x016) dsel0;
__sfr __at (0x017) dsel1;

Zur Installation:
unter Linux braucht man nur die Pakete sdcc,jkcemu zu installieren,
für Windows kann man die Dateien von der SDCC Webseite herunterladen.

Hier noch das Makefile:

Quellcode:
OUT=sample1

all: obj/crt0.o src/main.c

    sdcc -c -o obj/main.o -mz80 src/main.c
    link-z80 -f main
    #convert format into loadable emulator image
    objcopy -Iihex -Obinary obj/main.ihx obj/$(OUT).z80
    #pad the executable name into the header
    echo -n $(OUT) >obj/filename.txt
    dd bs=1 if=obj/filename.txt of=obj/$(OUT).z80 seek=16 conv=notrunc
    hexdump -C "obj/$(OUT).z80"
        
obj/crt0.o:src/crt0.s
    as-z80 -plosgff "obj/crt0.o" "src/crt0.s"


Um aus den Objektkode ein für den Z1013 ausführbares Programm zu erstellen müssen noch der Startupkode crt0.s und die Linkerparameter angepasst werden.

Leider kann ich hier keine Dateien hochladen. Ich werden den Link aber bald mitliefern.
--
-------------------------------------------
Winterschlaf
-------------------------------------------

Dieser Beitrag wurde am 21.02.2014 um 02:37 Uhr von Hobi editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
004
22.02.2014, 12:30 Uhr
Hobi



Ich habe die Makefiles aufgeräumt, Startupcode angepasst und alles mal zusammengebaut. Am besten man benutzt Cygwin als Entwicklungsumgebung.

Z1013 Bibliotheken und Beispiele

sdasz80 mit Bugfix

Makefile:

Quellcode:
OUT=printf
OBJECTS=printf.rel

include ../lib/z1013_app.make

printf.c:

Quellcode:
#include <stdio.h>

void main() {
  
   printf("Hello World!\n");
}

app.make:

Quellcode:
obj/$(OUT).z80 : ../lib/z1013/crt0.rel ../lib/z1013/z1013.lib $(OBJS)
    $(LINK) -mjwx -b _CODE=0x0100 -i "obj/$(OUT).ihx" -k ../lib/z1013 -l z80 $^
    objcopy -Iihex -Obinary "obj/$(OUT).ihx" "$@"
    echo -n $(OUT) >obj/filename.txt
    dd bs=1 if=obj/filename.txt of="$@" seek=16 conv=notrunc
    hexdump -C "$@"

obj/%.rel : src/%.c obj
    sdcc -mz80 -c -o "$@" -Iinclude -I../include $(CFLAGS) "$<"

obj/%.rel : src/%.s obj
    $(AS) -plosgff "$@" "$<"

startup code:

Quellcode:
.module crt0
    .globl    _main

    .area    _HEADER (ABS)
    
    ;preparing "headersave" file header attached to the final rom image as loadable .z80 format
    .org 0xe0
    .dw s__CODE
    .dw start_of_stackframe
    .dw init
    .ascii 'sdccz80'
    .db 0xd3,0xd3,0xd3
    .ascii '               '
    
    ;; Ordering of segments for the linker.
    .area    _HOME
    .area    _CODE
    .area    _INITIALIZER
    .area _GSINIT
    .area _GSFINAL
    .area _GSEXIT
    .area _GSEXITFINAL
    .area    _DATA
    .area    _INITIALIZED
    .area    _BSEG
    .area _BSS
    .area _STACK
    .area _HEAP
    .area _CODE
    
_monitor_entry .equ 0xf05f
    
init:
    ;; Stack at the top of memory.
    ld    sp,#end_of_stackframe
    ; mark stack frame
    ld  hl,#0xbbbb
  ld (#start_of_stackframe),hl
    push hl
    
  ;; Initialise global variables
  call  gsinit
    call    _main
    call  gsexit
    ld    sp,#0x00b0
    jp    _monitor_entry
    rst     0x38

    .area   _GSINIT
gsinit::
    ld    bc, #l__INITIALIZER
    ld    a, b
    or    a, c
    jr    Z, gsinit_next
    ld    de, #s__INITIALIZED
    ld    hl, #s__INITIALIZER
    ldir
gsinit_next:

    .area   _GSFINAL
    ret

    .area   _GSEXIT
gsexit::

    .area   _GSEXITFINAL
    ret


  .area   _STACK
  ;For now just allocate 1k for stack.
  ; stack frame marker - top
start_of_stackframe:
  .ds     2
  .ds     1024
  ; stack frame marker - bottom
  .ds     2
  ; z1013 has predecrement stack
end_of_stackframe:

  .include "rst8.s"

z1013.lib

Quellcode:
#define PRST7(X) \
  __asm__("rst 0x20"); \
  __asm__(".db 2 ;PRST7"); \
  __asm__(".ascis "#X);

void OUTCH(unsigned char c)
{
  __asm__("ld    hl, #2+0");
  __asm__("add    hl, sp");
  __asm__("ld    a, (hl)");
  __asm__("rst 0x20");
  __asm__(".db 0");
}

unsigned char INCH()
{
  __asm__("rst 0x20");
  __asm__(".db 1");
  __asm__("ld l,a");
}


--
-------------------------------------------
Winterschlaf
-------------------------------------------

Dieser Beitrag wurde am 22.02.2014 um 12:32 Uhr von Hobi editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
005
25.02.2014, 04:15 Uhr
Hobi



Die Anzahl der Antworten halten sich hier in Grenzen. Vielleicht hätte ich den Titel anders wählen sollen. Die Idee lässt sich leicht auf andere Computer übertragen, so kann man z.B. auch für den KC85 programmieren.
--
-------------------------------------------
Winterschlaf
-------------------------------------------
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
006
25.02.2014, 11:50 Uhr
abnoname

Avatar von abnoname

Hallo,

danke für deine Codes. Ich muss mal schauen, wann ich mich wieder mit dem Z80 SDCC beschäftige. Ich hatte das ja zur Fehlersuche genutzt. Die Karte funktioniert inzwischen aber wieder.

Im Kreise der Bastler hier hat BASIC und Assembler einen hohen Stellenwert. Ich bin dagegen mit C/C++ aufgewachsen und habe damit täglich zu tun. Daher war mir das angenehmer :-) Das erklärt aber, warum die Resonanz gering ist.

Trotzdem weiter machen :-)

VG
Franz
--
mein Blog: http://abnoname.blogspot.de
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
007
28.02.2014, 13:25 Uhr
funkheld



Jup, sieht ja gut aus.

Kannst du das mal für einen Laien erklären, wie man mit Window7 eine Binär erstellt die auf dem Z1013 läuft.

Verstehe das ganze drum herum nicht.
Welche aufgabe hat die cygwin1.dll auf einem Windossystem ? Die fehlt nämlich.

Danke.
Gruss
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
008
28.02.2014, 14:18 Uhr
Hobi



Im Schnelldurchgang:

sdcc latest build

Z1013 crt0.rel und bibliothek

./include
./lib
./lib/src
./lib/z1013
./sample_hello
./sample_hello/include
./sample_hello/obj
./sample_hello/src
./sample_printf
./sample_printf/include
./sample_printf/src


der Rest steht im Makefile. Ich mag cygwin als Entwicklungsumgebung. Es geht aber auch ohne.

sdcc -mz80 -c -o main.asm -Iinclude -I../include main.c
sdasz80 -plosgff main.rel main.asm
sdldz80 -mjwx -b _CODE=0x0100 -i main.ihx -k ../lib/z1013 -l z80 ../lib/z1013/crt0.rel ../lib/z1013/z1013.lib main.rel
#hier hat man das ihex file, das muss man in ein binary umwandeln
#vielleicht geht das auch mit sdobjcopy
objcopy -Iihex -Obinary main.ihx main.z80
# das binaerfile hat einen .z80 header, so dass man es direkt in den Emulator laden kann
# das hier ist optional: der Dateiname wird per Hand an offset 0x10 in
# den Header eingefügt
echo -n main.z80 >obj/filename.txt
dd bs=1 if=obj/filename.txt of=main.z80 seek=16 conv=notrunc


Quellcode:
vorher:
00000000  00 01 ae 01 00 01 73 64  63 63 7a 38 30 d3 d3 d3  |......sdccz80...|
00000010  20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20  |                |
00000020  31 b2 05 21 bb bb 22 ae  01 e5 cd 97 01 cd 6d 01  |1..!..".......m.|

nachher:

00000010  68 65 6c 6c 6f 20 20 20  20 20 20 20 20 20 20 20  |hello           |


--
-------------------------------------------
Winterschlaf
-------------------------------------------

Dieser Beitrag wurde am 28.02.2014 um 14:21 Uhr von Hobi editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
009
28.02.2014, 14:56 Uhr
funkheld



Jup danke für die Info.

Gruss
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
010
02.03.2014, 12:22 Uhr
Olli

Avatar von Olli

Mh... man müsste Ihn sich mal anschauen - in wie weit man Ihn z.B. für den z8000 erweitern kann. Ich habe ja die Quellen eines alten Z8000 pcc Derivates - also opcodes & co sind kein Problem.... nur meine Zeit..... habe z.Zt. so viel andere mich interessierende Projekte am laufen..... verdammt.... am besten kündigen - dann hat man 24/7 Wird wohl nie was....
--
P8000 adventures: http://pofo.de/blog/?/categories/1-P8000

Dieser Beitrag wurde am 02.03.2014 um 12:34 Uhr von Olli editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
011
02.03.2014, 13:09 Uhr
Hobi



Da triffst du ziemlich genau ins schwarze. Ich hatte mich etwas tiefer mit dem U8000 beschäftigt und auch einen Emulator fertiggestellt.
Ich habe das schon in Erwägung gezogen, aber vor ein paar Tagen das Projekt Z8000 aufgegeben und meine Samples verkauft. Der Emulator sollte noch irgendwo rumliegen und für den Anfang kann man ja einen Z80 ähnlichen Port vornehmen ohne viel an den Registern zu schrauben.
Zeit Zeit Zeit.... Ich würde lieber den JKC Emulator aufs Android tablet bringen.
--
-------------------------------------------
Winterschlaf
-------------------------------------------

Dieser Beitrag wurde am 02.03.2014 um 14:33 Uhr von Hobi editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
012
09.03.2014, 11:34 Uhr
Hobi



ich habe die SDCC Bibliothek aktualisiert und ein Beispiel für "banked" Code hinzugefügt. Vom Compiler wird die Funktion leidlich unterstützt, nur dem Assember und Linker muss man per Hand (oder per Shellscript) unter die Arme greifen.

Z1013 crt0.rel und bibliothek

statt direkt _msg2 aufzurufen erfolgt der Sprung über banked_call:

Quellcode:
.include "bank.inc"

;src/main.c:16: msg2();
    call    banked_call
    .dw    _msg2
    .dw BANK_OF__msg2     ; PENDING: bank support

leider weiss weder der Linker noch Assembler so richtig den Wert von BANK_OF__msg2. Der Einfachheit halber habe ich die Liste von Hand erstellt und eingebunden "bank.inc":

Quellcode:
BANK_OF__msg1 .equ 1
BANK_OF__msg2 .equ 2


--
-------------------------------------------
Winterschlaf
-------------------------------------------

Dieser Beitrag wurde am 09.03.2014 um 11:37 Uhr von Hobi editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
013
16.04.2018, 23:35 Uhr
Hobi



Ich habe die Fehler beim Kompilieren berichtigt. Der SDCC hat wieder ein neues Problem: Variablen, die eigentlich Konstanten enthalten werden wegoptimiert.
Eigentlich war das mal von Vorteil, da eine "konstante" Variable im Register gehalten werden kann und dann nur noch ein Register/Register Vergleich benötigt wird.

git clone https://github.com/anchorz/sdcc-z1013-kc85.git


Quellcode:

#define BYTES_PER_LINE 40

char count;

void foo() {
  count= BYTES_PER_LINE;
  count/=2; !!! hier wirft der SDCC einen Fehler, da er Konstanten nicht so einfach durch 2 Teilen kann
  for (;i<count;) { //hier wird dadurch Vergleich CP A,B durch CP A,count ersetzt
  }
}


--
-------------------------------------------
Winterschlaf
-------------------------------------------

Dieser Beitrag wurde am 16.04.2018 um 23:35 Uhr von Hobi 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