Basic und MaschinencodeMaschinencode über HIMEMCPC-typisch ist aber die Methode, für den Basic und Maschinencode: Maschinencode über HIMEMMaschinencode über HIMEM etwas Speicherplatz zu opfern. Zwar ist die Lade-Adresse für das Assembler-Programm zunächst auch nicht vorhersehbar. Sobald es geladen ist, wird es aber nicht mehr verschoben. Es ist deshalb nicht nötig, den Maschinencode vollkommen ortsunabhängig zu gestalten. Es genügt, wenn man das Programmpaket einmal initialisiert, und dabei alle Adressierungsarten der Z80: Absolutabsoluten Adressen der tatsächlichen Lage des Programms anpasst, es also relocalisiert. Ausgesprochen schlecht ist man beraten, wenn man für eine universell verwendbare Erweiterung eine feste Adresse im RAM annimmt. Beispielsweise könnte man sich ja denken, dass in Einleitung: BASIC Das geht nur so lange gut, wie man auf diese geistreiche Idee kein zweites Mal verfällt. Auch der Software-Tauschpartner könnte mit dieser Adresse liebaeugeln und eine unheimlich tolle Erweiterung fest für diese Adresse assemblieren. Dann sieht man alt aus, wenn man beide Erweiterungen gleichzeitig zur Verfügung haben will (Das kann schon 'mal vorkommen. Ein Der Kernel - Software-Interrupts: DruckerspoolerDruckerspooler und eine Hardcopy-Routine sind bestimmt kein schlechtes Gespann.)! Man sollte auch immer bedenken, dass zu jeder Erweiterung, die man sich irgendwann in ferner Zukunft noch zulegen wird, möglicherweise eine Treibersoftware in einem Speicheraufteilung durch ein Vordergrund-Programm: Hintergrund-ROMsHintergrund-ROM gehört. Erstes Beispiel ist hier Die Abteilungen des Betriebssystems: AmsdosAmsdos, mit einem Speicherplatzverbrauch von nicht weniger als 1280 Datentypen: Bytes CALLIm Schneider-Basic ist es zwar möglich, Maschinencode durch Angabe der Einsprungs-Adresse aufzurufen. Da diese zunächst aber unbekannt ist, sollte man dafür Unterprogramme: VariablenVariablen vorsehen: 10 Die Aufteilung des RAM durch den Basic-Interpreter: Chaos über HIMEMHIMEM=HIMEM-prog.länge <-- Speicher reservieren 20 adr=Die Aufteilung des RAM durch den Basic-Interpreter: Chaos über HIMEMHIMEM+1:LOAD"grafik.bin",adr <-- Programmdatei einladen 30 Maschinencode über HIMEM: CALLCALL adr <-- Initialisieren, Relozieren 40 box = adr+&123 \ 50 Die Grafik-VDU: Circlecircle = adr+&234 > Unterprogramme: VariablenVariablen für die verschiedenen 60 triangle = adr+&345 / Einsprungsadressen definieren. .... .... 500 Maschinencode über HIMEM: CALLCALL box, 100,200,300,400 <-- Aufruf RSXDarüber hinaus können die Mcode-Routinen bei ihrer Initialisierung als Maschinencode über HIMEM: RSXRSX eingebunden werden. Dann stehen sie in Einleitung: BASIC 10 Die Aufteilung des RAM durch den Basic-Interpreter: Chaos über HIMEMHIMEM=HIMEM-prog.länge 20 adr=Die Aufteilung des RAM durch den Basic-Interpreter: Chaos über HIMEMHIMEM+1:LOAD"grafik.bin",adr 30 Maschinencode über HIMEM: CALLCALL adr <-- Relozieren, Initialisieren, Einbinden .... als Maschinencode über HIMEM: RSXRSX .... 500 |BOX, 100,200,300,400 <-- Aufruf eines RSX-Kommandos RSX-Kommandos werden in Einleitung: BASIC Dabei sind die beiden Methoden, eine Mcode-Routine aufzurufen, fast vollkommen gleichwertig. Ein Unterschied ist jedoch, dass bei RSX-Paketen das Basic-Programm die Lage der Einsprungs-Adressen nicht zu wissen braucht. Verschieben sich die Einsprungsadressen, weil man im Mcode Änderungen vorgenommen hat, so müssen bei RSX-Erweiterungen in den Basic-Programmen keine Aufruf-Adressen geändert werden. Wohl aber bei Aufrufen mit Maschinencode über HIMEM: CALLCALL. Außerdem können RSX-Erweiterungen auch in Erläuterung zu den Anschlüssen 40 bis 45: 42 - ROMEN (0)ROMs enthalten sein (und werden dann von Einleitung: BASIC |