Idee: Andis SysGCC für Win ist eine Version 4.8.0 (laut der enthaltenen XML-Datei und eines Ordner-Namens) Laut dieser Webseite ist die enthaltene Newlib dann Version 2.0.0: https://gnutoolchains.com/m68k-elf/ Also den Weg von retroniker so modifizieren, dass zumindest der GCC in dieser Version gebaut wird. Die Newlib fasse ich erst einmal nicht an. Quellen: https://github.com/SteveMoody73/m68k-elf-toolchain Probleme auf dem Weg: Der GCC 4.8.0 führt beim Bau mit einem moderen GCC (13.3.0) zu Fehlern. Idee: Installation eines alten GCC neben dem modernen GCC auf dem Host GCC 4.8.0: https://ftp.gnu.org/gnu/gcc/gcc-4.8.0/ Newlib 2.0.0: https://sourceware.org/ftp/newlib/index.html Andis Delta: https://github.com/avg67/nkc/tree/main/SW/SysGCC-delta/m68k-elf Vorbereitung: # Ein bisschen was installieren: sudo apt install make git gcc g++ lhasa libgmp-dev libmpfr-dev libmpc-dev flex gettext bison texinfo # GCC 4.8.5 unter Linux Mint installieren (von https://askubuntu.com/questions/1450426/need-gcc-and-g-4-8-in-ubuntu-22-04-1) mkdir install_gcc-4.8 cd install_gcc-4.8 wget http://mirrors.kernel.org/ubuntu/pool/universe/g/gcc-4.8/g++-4.8_4.8.5-4ubuntu8_amd64.deb wget http://mirrors.kernel.org/ubuntu/pool/universe/g/gcc-4.8/libstdc++-4.8-dev_4.8.5-4ubuntu8_amd64.deb wget http://mirrors.kernel.org/ubuntu/pool/universe/g/gcc-4.8/gcc-4.8-base_4.8.5-4ubuntu8_amd64.deb wget http://mirrors.kernel.org/ubuntu/pool/universe/g/gcc-4.8/gcc-4.8_4.8.5-4ubuntu8_amd64.deb wget http://mirrors.kernel.org/ubuntu/pool/universe/g/gcc-4.8/libgcc-4.8-dev_4.8.5-4ubuntu8_amd64.deb wget http://mirrors.kernel.org/ubuntu/pool/universe/g/gcc-4.8/cpp-4.8_4.8.5-4ubuntu8_amd64.deb wget http://mirrors.kernel.org/ubuntu/pool/universe/g/gcc-4.8/libasan0_4.8.5-4ubuntu8_amd64.deb sudo apt install ./gcc-4.8_4.8.5-4ubuntu8_amd64.deb ./gcc-4.8-base_4.8.5-4ubuntu8_amd64.deb ./libstdc++-4.8-dev_4.8.5-4ubuntu8_amd64.deb ./cpp-4.8_4.8.5-4ubuntu8_amd64.deb ./libgcc-4.8-dev_4.8.5-4ubuntu8_amd64.deb ./libasan0_4.8.5-4ubuntu8_amd64.deb ./g++-4.8_4.8.5-4ubuntu8_amd64.deb # Diesen GCC 4.8.5 jetzt zum Standard-GCC machen (hinterher rückgängig!) sudo ln -sf /bin/gcc-4.8 /bin/gcc sudo ln -sf /bin/gcc-ar-4.8 /bin/gcc-ar sudo ln -sf /bin/gcc-nm-4.8 /bin/gcc-nm sudo ln -sf /bin/gcc-ranlib-4.8 /bin/gcc-ranlib sudo ln -sf /bin/g++-4.8 /bin/g++ Los geht's: mkdir m68k-elf-toolchain-TUTI cd m68k-elf-toolchain-TUTI git clone https://github.com/SteveMoody73/m68k-elf-toolchain cd m68k-elf-toolchain ## Makefile editieren für Release 4 vom GCC: #vorher: GCC_BRANCH := releases/gcc-13 #nachher: GCC_BRANCH := releases/gcc-4.8.0 make update # GCC-Version bestätigen make status-all # Ausgabe soll sein: GCC_Version=4.8.0 ## Erst einmal nur mit User-Rechten im lokalen Ordner compilieren. ## Daher Makefile erneut editieren (hier muss ein absoluter Pfad stehen, ## diesen also entsprechend anpassen!) #vorher: PREFIX ?= /opt/m68k-elf #nachher: PREFIX ?= /home/torsten/temp/m68k-elf-toolchain-TUTI/m68k-elf-toolchain/opt/m68k-elf # Jetzt alles bauen (das dauert sehr lange...) make all #FRAGE: Newlib ist jetzt wohl in der Version 4.1.0 enthalten. Also deutlich #neuer als die 2.0.0 aus der SysGCC. Mal gucken ob das passt oder ob wir hier #noch eine alte Version erzwingen müssen... # Andis GIT holen (brauchen wir hier eigentlich nicht komplett, schadet aber ja nicht :) ) git clone https://github.com/avg67/nkc # Delta hineinpatchen... cp -R nkc/SW/SysGCC-delta/m68k-elf m68k-elf-toolchain/opt mv m68k-elf-toolchain/opt/m68k-elf/m68k-elf/include/sys/FPGATimer.h m68k-elf-toolchain/opt/m68k-elf/m68k-elf/include/sys/fpgatimer.h # Schon einmal alles nach /opt kopieren (wir wollen gleich schon mal damit compilieren) sudo rm -rf /opt/m68k-toolchain sudo cp -R m68k-elf-toolchain/opt/m68k-elf /opt/m68k-toolchain # Nur beim ersten Kopieren auch den Pfad ergänzen: echo export PATH="${PATH}:/opt/m68k-toolchain/bin" >> ~/.bashrc source ~/.bash_profile # Jetzt fehlt noch die libnkc... cd m68k-elf-toolchain/opt/m68k-elf/nkc_common # Aus diesen Makefile die .exe entfernen: joe m68k-elf-toolchain/opt/m68k-elf/nkc_common/Makefile (8 Vorkommen) # Gerne schon mal ein "make" versuchen. Da kommen aber noch Fehler wegen Typ-Konflikten # Zur Lösung folgende Änderung vornehmen joe ../m68k-elf/sys-include/sys/config.h ## Die beiden Zeilen 260 und 262 auskommentieren, so dass int immer als Typ verwendet wird #vorher: #ifndef _READ_WRITE_RETURN_TYPE #nachher: //#ifndef _READ_WRITE_RETURN_TYPE und #vorher: #endif #nachher: //#endif # Diese Änderung auch nach /opt kopieren! sudo cp ../m68k-elf/sys-include/sys/config.h /opt/m68k-toolchain/m68k-elf/sys-include/sys/config.h # Vor dem Installieren noch eine Änderung im Makefile joe Makefile ## Die nkclib.a nicht im Unterordner m68000 installieren sondern eine Ebene höher #vorher: $(INSTALL) $(TARGET) ../m68k-elf/lib/m68000/ #nachher: $(INSTALL) $(TARGET) ../m68k-elf/lib/ # Noch einmal alles nach /opt kopieren cd ../../../.. sudo rm -rf /opt/m68k-toolchain sudo cp -R m68k-elf-toolchain/opt/m68k-elf /opt/m68k-toolchain # Das Problem mit den doppelten Sound-Deklarationen tritt bei diesem # Installations-Weg nun nicht mehr auf. Das JADOS-Beispiel lässt sich compilieren! :) cd nkc/SW/Jados_test ## Auch in diesem Makefile müssen die .exe entfernt werden (5 Vorkommen) ## Außerdem muss das gccdir angepasst werden: #vorher: gccdir = /c/SysGCC/m68k-elf #nachher: gccdir = /opt/m68k-toolchain # Aber dann (die Warnung nehmen wir erst einmal so hin...) m68k-elf-gcc -c -g -Os -m68000 -Wall -fomit-frame-pointer -nostartfiles -std=gnu99 -Dndrcomp -DUSE_JADOS test.c -o obj/test.o test.c: In function 'main': test.c:28:3: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing] *((uint32_t* )bfr) = jd_vers; ^ m68k-elf-gcc -g -Os -m68000 -Wall -fomit-frame-pointer -nostartfiles -std=gnu99 -Dndrcomp -DUSE_JADOS -c -o ./obj/crt0.o /opt/m68k-toolchain/nkc_common/crt0.c m68k-elf-gcc -g -Os -m68000 -Wall -fomit-frame-pointer -nostartfiles -std=gnu99 -Dndrcomp -DUSE_JADOS -T /opt/m68k-toolchain/nkc_common/rm_ram1.ld -Wl,-Map,./_out/test.map -o _out/test.elf ./obj/test.o /home/torsten/temp/m68k-elf-toolchain-TUTI/m68k-elf-toolchain/opt/m68k-elf/bin/m68k-elf-ld: warning: _out/test.elf has a LOAD segment with RWX permissions m68k-elf-objdump -S ./_out/test.elf > ./_out/test.lst m68k-elf-objcopy --output-target=binary ./_out/test.elf ./_out/test.68k m68k-elf-objcopy --output-target=srec _out/test.elf ./_out/test.s19 m68k-elf-size ./_out/*.elf text data bss dec hex filename 37970 1812 2704 42486 a5f6 ./_out/test.elf # Na super! Das Binary läuft auch auf dem NKC! # Es verhält sich aber leider ebenso wie das, das wir vorher auch schon # erzeugen konnten: printf wird geblockt und immer nur ein Zeichen # ausgegeben wenn man eine Taste drückt. # # Also noch einmal zurück auf Start und das Gleiche mit der alten Newlib 2.0.0 bauen? # Und sei es nur, um auszuschließen, dass es daran liegt...