NKC Forum
Register | FAQ | Search | Who is online? | Member list | Today's posts | Calendar | Login



Author Topic: Dateiaustausch PC <--> NKC68k
smed
Stammgast
**
ID # 114


  Posted on April 02, 2021 10:48 AM (#41)  |  Quote Quote   PM PM   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 seit 1984 (Pause zw. 1988-2017)
CPU68k,CPU68000,4xROA64,6xIOE,6xGDP,GDPHS,8xSBC2/3,HEXIO,6xKEY,UHR3,PROMER,CENT,SER,SOUND,CAS,6xBUS2,4xBUS3,3xPOW5V,2xTAST..und einen ArduinoMEGA mit auf dem BUS, und eine selbstgebastelte MEM960k und eine FPGA-GDP.

NKC - OpenSource since 1983

Posts: 308 | Member since: January 2011 | IP address: not saved
smed
Stammgast
**
ID # 114


  Posted on April 02, 2021 01:11 PM (#42)  |  Quote Quote   PM PM   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

Posts: 308 | Member since: January 2011 | IP address: not saved
cerker68k
Kennt sich schon aus
**
ID # 219


  Posted on May 25, 2022 11:19 AM (#43)  |  Quote Quote   PM PM   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

Posts: 71 | Member since: October 2021 | IP address: not saved
cerker68k
Kennt sich schon aus
**
ID # 219


  Posted on June 04, 2022 08:33 PM (#44)  |  Quote Quote   PM PM   E-mail E-mail
So, jetzt hab ich auch ne SD-Karte mit MTOOLS am NKC.

Aber .. dummes Windows 10! :mad: :mad:

Hab hier ne 128MB-SD-Karte bekommen und man kann sie zwar in FAT16 formatieren, aber dann machts FAT16B mit Partitionstyp $0E welches die MTOOLS nicht fressen .. und natürlich kann ichs nicht einstellen weil ich als dummer (L)User ja zu dumm bin und das nicht zu wollen habe.

Wenn ich nicht noch regelmäßig am PC zocken würde, wäre ich bald bei Linux ..

Posts: 71 | Member since: October 2021 | IP address: not saved



| https://nkcforum.de | Board rules | Privacy policy


Tritanium Bulletin Board 1.8
© 2010–2021 Tritanium Scripts


Site created in 0.038228 seconds
Processed 15 files
gzip compression enabled
2222.14 KiB memory usage