Autor Thema: C am CPC  (Gelesen 320 mal)

0 Mitglieder und 1 Gast betrachten dieses Thema.

Offline TFM

  • Administrator
  • CPC 6128+
  • *****
  • Beiträge: 2004
  • Liked: 428
  • Karma: +20/-0
  • Geschlecht: Männlich
  • FutureSoft und CPC - Ein starkes Team!
    • FutureOS
C am CPC
« am: 15. Januar 2018, 20:44:08 »
Hallo Leute,

Welches C benutzt ihr um am bzw. für den CPC etwas zu programmieren.

Bin selber kein C Code, aber habe mich mal etwas mit dem Small-C unter CP/M beschäftigt.

Welchen Compiler kann man empfehlen?
TFM of FutureSoft
http://www.FutureOS.de

Offline Shining

  • Erweiterte Mitglieder
  • CPC 664
  • *
  • Beiträge: 206
  • Liked: 112
  • Karma: +11/-0
Re: C am CPC
« Antwort #1 am: 16. Januar 2018, 16:44:51 »
Ich denke, dass die meisten Leute, heutzutage C-Code am CPC schreiben, den SDCC-Compiler benutzen. Dieser ist imho am weitesten entwickelt und der wird auch aktiv weiter entwickelt. Die Leute z.B. die CPCtelera benutzen, müssen den auch alle nehmen.

Ich persönlich programmiere halt beruflich (heutzutage zwar viel weniger) in C/C++ und mir liegt das dann eher, mir die groben Abläufe in C auszudenken und umzusetzen. Du kannst dann z.B. dir eine Spriteroutine in Assembler schreiben, musst dich halt an eine bestimmte Konvention der Parameterübergabe halten, macht dann einen C-Rahmen drum und benutzt die Assembler-Spriteroutine aus C-heraus. Oft bin ich halt schneller bei eitwas, wenn ich es erst einmal in C-Code und anschliessend den ein oder anderen Teil durch Assembler ersetze.

Ein Nachteil, wenn man auf SDCC setzt und, wie ich, auch viel in assembler macht, ist dass der assemblercode teilweise etwas anders geschrieben werden muss. z.b. ld a,#0x23. Ausserdem kennt er die "illegalen" opcodes nicht. Hier kann man sich aber durch makros behelfen.

Zum Thema debugger: SDCC kann mit bereits existierenden debuggern umgehen(z.b.: http://fivedots.coe.psu.ac.th/~cj/masd/resources/sdcc-doc/SDCCUdoc-28.html für die kommandozeile). Aber es würde z.B. schon folgendes eine grosseHhilfe sein: Der compiler spuckt immer eine Datei aus, in der alle funktionen und globalen variablen mit adressen hinterlegt sind. Wenn man jetzt im CPC-Debugger auf diese funktionen breakpoints setzen könnte, die dann auch noch abgespeichert wären und sich die inhalte der gewünschten variablen in einem fenster anzeigen lassen könnte, wäre schon viel vereinfacht.....

Offline TFM

  • Administrator
  • CPC 6128+
  • *****
  • Beiträge: 2004
  • Liked: 428
  • Karma: +20/-0
  • Geschlecht: Männlich
  • FutureSoft und CPC - Ein starkes Team!
    • FutureOS
Re: C am CPC
« Antwort #2 am: 16. Januar 2018, 22:13:42 »
Ah, vielen Dank für die ausführliche Antwort.  :smiley027: Wie kommuniziert das SDCC denn mit dem CPC? Ist das alles in einer Library? Gibt's da den Source Code? Kann man die ändern?  :o

Habe daran gedacht so eine Library umzubauen, dass das SDCC auch für FutureOS zu gebrauchen ist. Den Assembler-Teil hätte ich wohl ganz schnell zusammen, nur den C-Teil...  :)
TFM of FutureSoft
http://www.FutureOS.de

Offline HAL6128

  • Schreibgeschützter
  • *
  • Beiträge: 18
  • Liked: 12
  • Karma: +6/-0
Re: C am CPC
« Antwort #3 am: 17. Januar 2018, 00:16:06 »
Also, ich habe nie ernsthaft versucht in C zu programmieren, mich reizt das Thema dennoch, da die Programmiersprache sehr viel mehr Möglichkeiten bietet als andere, um „maschinennah“ zu arbeiten. Ich hatte mal Kontakt (direkt am CPC) mit dem Hi-Soft C Compiler oder dem von Arnor. Beide versprechen nah am KR Standard zu sein, obwohl das heute wahrscheinlich gar nicht mehr so viel bedeutet.
Ich habe zuviel in Basic gemacht, daher fällt es mir relativ schwer in C mich zurechtzufinden. Muss halt mehr üben. Das Einbinden von Assemblercode finde ich einfach auch gut zur Erweiterung der Möglichkeiten.
SDCC scheint neben Z88DK am aktuellsten zu sein. Sind nicht beide ineinander aufgegangen oder vertausche ich hier was?

Offline Shining

  • Erweiterte Mitglieder
  • CPC 664
  • *
  • Beiträge: 206
  • Liked: 112
  • Karma: +11/-0
Re: C am CPC
« Antwort #4 am: 17. Januar 2018, 03:43:42 »
Ne Library wäre z.b. das cpctelera. Ich nutze aber quasi meine eigene library.

Es gibt zuerst eine startup-datei in assembler für den c-code. Wenn man in C keine globale initialisierte variablen benutzt, braucht man in dieser startup-datei nix anderes tun als .org #4712 und dann jp _main. Der Assembler kennt alle c-variablen und funktionen indem man ein _ davor schreibt. Was passiert: ich lande automatisch in meiner void main(void). Hier kann ich dann meine eigenen lib-funktionen aufrufen.

Ich nutze kein cpctelera, da ich schon ganz gerne mein eigener herr bin und das cpctelera ja eher generisch ist und viele dinge (noch) nicht kann. Ich schaue mir natürlich gerne an, wie die manche sachen lösen.

So sieht dann z.B. eine Lib-Funktion von mir aus:
void ClsC000(void) __naked
{
__asm
ld hl, #0xc000
ld ( hl ), #0
ld de, #0xc001
ld bc, #0x3FFF
ldir
ret
__endasm;
}

Das naked heisst übrigens das die funktion nix automatisch rettet und ich dafür verantwortlich bin, dass die register dannach korrupt sind.

Anderes Beispiel, wo der compiler die register rettet (den code sieht man natürlich nicht hier):
void SetColorDirect(unsigned char nColorIndex, unsigned char nPalette)
{
nColorIndex;
nPalette;

  __asm
  ld   ix, #2      ;; [3] IX Points to SP+2 (first 2 bytes are return address)
  add  ix, sp      ;; [3]    , to use it for getting parameters from stack
  ld e, 0( ix )
ld l, 1( ix )

ld b, #0x7f
ld c, e
di
out (c), c
ld c, l
out (c), c
ei
  __endasm;


Offline HAL6128

  • Schreibgeschützter
  • *
  • Beiträge: 18
  • Liked: 12
  • Karma: +6/-0
Re: C am CPC
« Antwort #5 am: 17. Januar 2018, 05:13:55 »
...reicht es in Deiner "naked" variante nicht einfach aus mit push & pop die Register vorher zu stapeln und wieder zurückzuholen?

Offline Shining

  • Erweiterte Mitglieder
  • CPC 664
  • *
  • Beiträge: 206
  • Liked: 112
  • Karma: +11/-0
Re: C am CPC
« Antwort #6 am: 17. Januar 2018, 17:01:03 »
Wenn Du sie retten willst, dann geht das so, aber wenn du sie, wie ich in dem Beispiel nicht retten musst, dann wäre das retten verschwendung von rechenzeit und speicherplatz.

Offline TFM

  • Administrator
  • CPC 6128+
  • *****
  • Beiträge: 2004
  • Liked: 428
  • Karma: +20/-0
  • Geschlecht: Männlich
  • FutureSoft und CPC - Ein starkes Team!
    • FutureOS
Re: C am CPC
« Antwort #7 am: 17. Januar 2018, 20:35:32 »
... Wenn man in C keine globale initialisierte variablen benutzt, braucht man in dieser startup-datei nix anderes tun als .org #4712 und dann jp _main.

Den Speicher unter &4712 kann man also nicht nutzen?

TFM of FutureSoft
http://www.FutureOS.de

Offline Shining

  • Erweiterte Mitglieder
  • CPC 664
  • *
  • Beiträge: 206
  • Liked: 112
  • Karma: +11/-0
Re: C am CPC
« Antwort #8 am: 18. Januar 2018, 19:03:13 »
Weiss jetzt nicht, ob das ernst gemeint war oder eine echte Frage. Aber bezüglich Speicheraufteilung ist der C-Kram ja nicht anders als Assembler.
Pentomino z.B. benutzt das komplette RAM von 0x40-0xFFFF. Bei Defence ist das ähnlich, da nutze ich aber den Bereich wo AMSDOS initialisert nur für temp-kram, da ich das amsdos ja zwischendurch zum laden/speichern brauche...

Bei dem demo, an dem ich gerade arbeite , liegt der overscan bei 0x200-0x7FFF. (für ein 64kB-Programm).

Offline TFM

  • Administrator
  • CPC 6128+
  • *****
  • Beiträge: 2004
  • Liked: 428
  • Karma: +20/-0
  • Geschlecht: Männlich
  • FutureSoft und CPC - Ein starkes Team!
    • FutureOS
Re: C am CPC
« Antwort #9 am: 18. Januar 2018, 19:57:00 »
Ok, man kann also den ganzen Speicher nutzen. Die Frage war schon ernst gemeint, denn bei Small C für CP/M kann man nix unter org &0100 nutzen. Leider hab ich von C wirklich zu wenig Ahnung um für den SDCC eine Library zu schreiben, um FutureOS zu unterstützen.

Wenn jemand Lust hätte da mitzuhelfen, dann würde ich den ASM Teil machen. Das FIOLIB (meine Library für Small-C für FutureOS) gibt's ja schon, aber es ist hald nur Small-C.  ::)
TFM of FutureSoft
http://www.FutureOS.de