NKC Forum
Registrieren | FAQ | Suche | Wer ist online? | Mitgliederliste | Heutige Beiträge | Einloggen



Autor Thema: Dateiaustausch PC <--> NKC68k
smed
Stammgast
**
ID # 114


  Erstellt am 02. April 2021 11:48 (#41)  |  Zitat Zitat   PN PN   E-Mail E-Mail
Hallo Jens,

>man GP-Aufrufe am einfachsten programmiert
Klar, das das Deine erste Mission ist :D

Erst kommt eine lange Antwort, dann der Verweis auf wie Thorsten das in seiner CLIB geloest hat...

Da habe ich ganz schoen rumprobiert, eine wirklich perfekte Loesung habe ich nicht wirklich, ist aber natuerlich machbar.

Das Problem ist so kompliziert wie es trivial ist: Wie kriegt man gcc dazu Funktions- Uebergabewerte (garantiert) in entsprechenden Register zu schreiben?

Das Keyword hierfuer ist ABI und geht ins gcc Eingemachte ! Google mal "gcc m68k ABI"

https://bumbershootsoft.wordpress.com/2018/03/10/variations-on-the-68000-abi/

Schau dir mal das Assembler Listing von einem einfachen Funktionsaufruf an:

typedef unsigned char byte; // .b
typedef unsigned short word; // .w

word hello(byte a, byte b) {
return a + b;
}

int result;

void _start() { // _start ist default start, nicht main()
result = hello(10, 20);
}

In welches Register a und b geladen werden und wo der Rueckgabewert ist, beschreibt die gcc ABI, und die sieht (wenn ich mich jetzt recht erinnere) beim gcc m68k Wertuebergabe per Stack vor.

Um Werte in Register zu zwingen, kann der inline Assembler helfen, allerdings braucht man die Funktionen des "GCC extended asm".

https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html

Der (moegliche) clash kommt bei der Optimierung, die moechte die Lufthoheit ueber Registervergabe haben, das mach ja einen groessen Teil der Optimierung aus. Wenn man die Optimierung abschaltet (-O weglassen) bekommt man besser vorhersehbare Registerzuweisungen, aber auch nicht garantiert.

Den extended gcc asm kann ich nicht wirklich empfehlen.

Thorsten hat GP Aufrufe in seiner CLIB geloesst und eine library in GNU Assembler geschrieben die dann einfach dazugelinkt wird, das file ist:

NKC-CLIB-master\nkc\llnkc.S

Er hat einen wrapper um jeden GP Aufruf (per TRAP) die die Werte vom Stack in die Register umschaufelt und dann den Trap ausloesst. Das funktioniert sicher.

Da ich fuer meine Spiele keine GP Aufrufe brauche habe ich das nicht weiterverfolgt. Das ist auch viel zu langsam fuer mich, vom Stack in Register, dann noch der TRAP...zu lagsam fuer Spiele. Fur JADOS etc natuerlich kein Problem.

BTW, Thorsten hat auch die entsprechended routinen fuer malloc() usw. geschrieben. Fuer SpaceInvaders & Co brauchte ich das aber nicht.

Ich hoffe das ist einigermassen verstaendlich, ist alles 1 Jahr her, als die Shamus Demo fertig war, habe ich den NKC auseinadergebaut und eingemottet - kann also nicht mal schnell ausprobieren.

Gruss
smed

-----------------------
NKC'ler und RDK Fan seit 1984 (Pause zw. 1988-2017)
CPU68k,CPU68000,4xROA64,6xIOE,6xGDP,GDPHS,8xSBC2/3,HEXIO,6xKEY,FLO2,PROMER,CENT,SER,SOUND,CAS,4xBUS2,3xPOW5V,2xTAST..und neuerdings einen Arduino mit auf dem BUS. Und eine selbstgebastelte MEM960k. UHR, IDE und COL256 noch nicht gebastelt.

NKC - OpenSource since 1983

Beiträge: 153 | Mitglied seit: Januar 2011 | IP-Adresse: nicht gespeichert
smed
Stammgast
**
ID # 114


  Erstellt am 02. April 2021 14:11 (#42)  |  Zitat Zitat   PN PN   E-Mail E-Mail
...noch ein Tipp, wie gesagt es wird nix von gcc mit eingelinkt, also auch nicht sowas sinnvolles wie eine startup sequenz die zB das RAM an den Stellen wo das erwartet wird auf 0 setzt, daher hier etwas Nuetzliches:

int volatile initMemory() {

//clear BSS section
int *text_sta = &_text_sta; //siehe Linkserscript
int *bss_start = &_bss_sta;
int *bss_end = &_bss_end;

int size = bss_end - bss_start;
memset(bss_start, 0x00, size); //memset code kommt von gcc automatisch dazu, okay...


//Speicherinhalt aufsummieren, ergibt das wirklich 0 ?
//int checksum = 0;
//for (int i=(int)&_bss_sta; i < (int)&_bss_end; i++) {
//int val = LONG_AT(i);
//checksum += val;
//}

//bss
//DebugPrintPos(0, 110, "tex start: $", (int)&_text_sta, HEX);
//DebugPrintPos(0, 100, "bss start: $", (int)&_bss_sta, HEX);
//DebugPrintPos

Beiträge: 153 | Mitglied seit: Januar 2011 | IP-Adresse: nicht gespeichert
cerker68k
Ist öfters hier
**
ID # 219


  Erstellt am 25. Mai 2022 12:19 (#43)  |  Zitat Zitat   PN PN   E-Mail E-Mail
Ich hänge das mal hier an, das Forum ist ja nicht soo aktiv dass es verloren geht ...

.. hat jemand diese NKC-CLIB schonmal verwendet? Ist das eine "vollständige" libc, also dass Sachen wie printf etc. gehen?

Gruß,
Christian

Beiträge: 30 | Mitglied seit: Oktober 2021 | IP-Adresse: nicht gespeichert



| NDR Computer | Boardregeln


Tritanium Bulletin Board 1.6
© 2010–2016 Tritanium Scripts


Seite in 2,632548 Sekunden erstellt
16 Dateien verarbeitet
gzip Komprimierung ausgeschaltet
762,98 KiB Speichernutzung