EPAC-80 mit SDCC bespielen

  • Hallo,


    ich versuche den sdcc dazu zu überreden das ich ein bin File für den EPAC raus bekomme.

    Handbuch vom EPAC CONITEC EPAC-80.pdf


    Jetzt sitzt der ROM ab 0x0000 bis 0x1FFF und der RAM ab 0x4000 bis 0x5FFF also versucht mit folgend zu übersetzen:


    sdcc -mz80 main.c -c

    sdcc -mz80 --code-loc 0x0 --data-loc 0x4000 --no-std-crt0 crt0.rel main.rel -o main.ihx


    Das funktioniert solange wie ich kein delay im Code habe. Ich denke das er das RAM nicht nutzt und im Eprom kann er ja kaum was ändern... die crt0.s siehe unten.


    Danke & Beste Grüße,
    Ralf N.

  • Ich kann nicht sehen, wo du den Stack haben willst - Das Problem scheint mir nicht das Datensegment zu sein, sondern der Stack - Wenn ich's recht weiss, müsste dein crt0 den Stackpointer auf das Ende des RAMs setzen. Seh' ich aber bei dir nirgends. Und da delay() als einziger Funktionsaufruf den Stack nutzen will, fällt es halt auf die Nase.

  • Danke, ja das hab ich auch schon gedacht:

    Hatte das auch probiert, er bleibt im Simulator immer in der Schleife, auch hier kommt der nicht raus. Es kann doch nicht so kompliziert mit dem sdcc sein.

  • So, Problem gelöst, klassisch selbst veralbert --code-loc 0x0 ist natürlich falsch der Code aus der crt0.s muss ja auch irgendwo hin also einfach ein paar Bytes weiter nach hinten mit dem Programmcode --code-loc 0x0100 funktioniert, allerdings brauche ich nur ein paar Bytes vorne 256 sind etwas viel. :)


    Hier das Ergebnis, eine Blinkende LED 200ms (4MHz Quarz) Periodendauer am OUT10 vom epac-80: epac80sdcc.zip


    Das wars, jetzt brauche ich nur noch ein Problem das ich mit dem EPAC-80 lösen will. :shock:

    Einmal editiert, zuletzt von runni ()

  • So, Problem gelöst, klassisch selbst veralbert --code-loc 0x0 ist natürlich falsch der Code aus der crt0.s muss ja auch irgendwo hin also einfach ein paar Bytes weiter nach hinten mit dem Programmcode --code-loc 0x0100 funktioniert, allerdings brauche ich nur ein paar Bytes vorne 256 sind etwas viel. :)


    Hier das Ergebnis, eine Blinkende LED 200ms (4MHz Quarz) Periodendauer am OUT10 vom epac-80: epac80sdcc.zip


    Das wars, jetzt brauche ich nur noch ein Problem das ich mit dem EPAC-80 lösen will. :shock:

    Ist ja schön, dass es jetzt geht - aber warum tat's dann ohne delay()? So ganz erklärt sich mir das jetzt nicht.

  • Achso. Da dein code ab main() die Initialisierung überschrieben hat, wird er natürlich direkt ausgeführt. Steht delay() davor, läuft die CPU beim Start direkt da rein, macht eine kurze Pause und dann ein ret. Und das führt mangels irgendeiner Adresse auf dem Stack ins Nirwana.


    Ich hätte eigentlich erwartet, dass ein gescheiter Linker wenigstens eine Warnung ausgibt, wenn sich Code-Segmente überlappen. Mein z88dk macht das auch, obwohl es sdcc "unter der Haube" hat.

  • Bin mal wieder am SDCC basteln mit dem EPAC-80, drei stelliges Display funktioniert soweit:

    Jetzt die Frage macht ein NMI Interrupt Sinn um die Routine fürs Display aufzurufen, oder über die PIO wäre auch ein Zeit getriggerter Interrupt möglich. Und hat das schon mal Jemand im SDCC gemacht, und wenn ja wie?


    Beste Grüße, runni


    P.S. die weiteren drei Stellen stecken nur auf dem selben IC Sockel damit die PINs nicht abbrechen... :)