Hardware > Emulatoren
Hochkomma auf deutscher Atari-Tastatur
Mado:
--- Zitat von: gh-baden am So 10.07.2022, 07:28:25 ---Andere Funktionen nehmen, oder andere Library.
--- Ende Zitat ---
Noch eine interessante Aufgabe: Mal gucken, wie klein man mit C werden kann. -nostdlib oder so habe ich einige Male gesehen, aber was man alternativ dann braucht, muss ich noch auskundschaften...
mfro:
Wenn man das geschickt anstellt, ist es (fast) egal, wie groß das eigentliche Programm ist.
Am Ende willst Du ja möglichst nur die Key-Tabellen im Speicher behalten und Ptermres() zählt immer vom Start der Basepage (Du kannst also "nur hinten" Speicher freigeben).
Sorgt man dafür, dass die Tabellen ganz vorne im Textsegment des Programms liegen - z.B. so:
--- Code: --- .text
.globl _space
_space:
.fill 2048-256,1, 0
--- Ende Code ---
(und als erste Datei auf der Kommandozeile aufführen)
ist es egal, "wieviel Programm" dahinter noch kommt, Ptermres() gibt den Speicher ja ans OS zurück.
Wenn Du willst, kann die Tabelle auch ein - mit
--- Code: ---__attribute__((section(".text")))
--- Ende Code ---
"verschönertes" C-Array sein.
Thorsten Otto:
Mit gcc musst du die Tabellen nur mit "const" deklarieren, dann landen sie auch im Text-Segment.
Davon auszugehen daß sie am Anfang des Text-Segmentes liegen würde ich aber nicht, solange C-Code im Spiel ist. Man kann nie wissen was der Compiler dann anstellt, solche Tricks sollte man wirklich nur in Assembler benutzen.
Mado:
--- Zitat von: mfro am So 10.07.2022, 10:21:11 ---ist es egal, "wieviel Programm" dahinter noch kommt, Ptermres() gibt den Speicher ja ans OS zurück.
--- Ende Zitat ---
Das ist für mich die Herausforderung: Ptermres gibt ja nicht allen Speicher zurück, sondern nur vom Anfang der TPA + angegebene Größe "keepcnt". Wie ich diesen letzten Wert dann beim Aufruf von PTermres errechne, das wäre das Interessante. Hier: http://toshyp.atari.org/de/00500b.html#Ptermres steht:
"keepcnt Anzahl der Bytes, die resident gehalten werden sollen (gilt ab Anfang der Basepage und schließt die Länge des TEXT, DATA und BSS Segments des Programms plus der Länge des Stacks ein; Minimum sind 128 Bytes)."
(Nebenbei, das in der Klammer verstehe ich nicht. Wenn ich es selber angebe, dann ist es doch so, wie ich es angebe. Nur, wenn es selbst etwas errechnet, dann kann es die entsprechenden Segmente mit einschließen. Weil, dann entscheidet "Ptermres" und nicht ich. Die Formulierung ist missverständlich, zumindest für mich. Es müsste vielleicht heißen "... und schließt unter Umständen die Länge... ")
Ich weiß aber in C immer noch nicht, wie ich diesen Wert errechnen kann. Momentan habe ich einfach ordentlich Speicher spendiert. In Assembler kann ich nen Label setzen. Aber in C? Auch ein Label?
Zudem: keepcnt ist ja ab Null. Das Programm ist ja relozierbar. Ich müsste also keepcnt errechnen aus:
Ende des Arrays minus Anfang der TPA? Wie mach ich das? Am besten mit Label-Adressen, oder?
Oder wird der Beginn der TPA immer mit Null gezählt, so dass das Ende des Arrays nichtmehr die TPA (=0) abgezogen bekommen muss?
Sorry, wenn ich so frage. Aber ich bin da noch nicht so bewandert...
Mado:
Wenn die TPA immer bei Null beginnen würde, dann wäre es einfach:
keepcnt = Anfang des Arrays + Länge des Arrays.
Navigation
[0] Themen-Index
[#] Nächste Seite
[*] Vorherige Sete
Zur normalen Ansicht wechseln