NKC Forum |
Autor | Thema: Dateiaustausch PC <--> NKC68k |
---|---|
smed Stammgast ID # 114 |
Erstellt am 02. April 2021 11:48 (#41)
Zitat
PN E-Mail
Hallo Jens,
>man GP-Aufrufe am einfachsten programmiert Klar, das das Deine erste Mission ist 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. NKC - OpenSource since 1983 |
Beiträge: 182 | Mitglied seit: Januar 2011 | IP-Adresse: nicht gespeichert | |
smed Stammgast ID # 114 |
Erstellt am 02. April 2021 14:11 (#42)
Zitat
PN 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: 182 | Mitglied seit: Januar 2011 | IP-Adresse: nicht gespeichert | |
cerker68k Kennt sich schon aus ID # 219 |
Erstellt am 25. Mai 2022 12:19 (#43)
Zitat
PN 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: 71 | Mitglied seit: Oktober 2021 | IP-Adresse: nicht gespeichert | |
cerker68k Kennt sich schon aus ID # 219 |
Erstellt am 04. Juni 2022 21:33 (#44)
Zitat
PN E-Mail
So, jetzt hab ich auch ne SD-Karte mit MTOOLS am NKC.
Aber .. dummes Windows 10! 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 .. |
Beiträge: 71 | Mitglied seit: Oktober 2021 | IP-Adresse: nicht gespeichert |
| https://hschuetz.selfhost.eu | Boardregeln | Datenschutzerklärung
Tritanium Bulletin Board 1.8
© 2010–2021 Tritanium Scripts
Seite in 0,028106 Sekunden erstellt
15 Dateien verarbeitet
gzip Komprimierung eingeschaltet
2431,73 KiB Speichernutzung