Beiträge von Claus im Thema „Assemblierproblem mit ACME“
-
-
Prima, dass es jetzt geht! Wie Hexworx schon gesagt hat, ist noch ein bisschen überflüssiger Code in der Kopierroutine. adc addiert einen Wert auf den Akku. Du lädst zwar Werte aus den Speicherstellen $fb und $fd und addierst 255 dazu, aber tust nichts mit dem Ergebnis in A. Wenn das einen Effekt haben soll, müsstest Du danach mit sta das Ergebnis irgendwo hinspeichern. Aber: Deine innere Schleife geht ja von 0 bis 255 (einschließlich). Du musst also ohnehin nicht 255, sondern 256 addieren, was dem Erhöhen des Hi-Bytes in $fc und $fe entspricht (bei gleichbleibendem Lo-Byte). Du kannst also das Laden und Addieren des Lo-Bytes einfach rausschmeißen.
Außerdem ist am Ende Deiner inneren Schleife Y immer 0, also könntest Du am Ende statt nach copyouter auch nach copyinner branchen (macht aber keinen großen Unterschied).
Den Basic-Teil musst Du eigentlich nie anfassen, der Sys-Befehl wird immer zum Label start zeigen, wo immer Du das auch hintust.
-
Und schließlich musst Du auch den Basic-Header selber erzeugen, z.B. so wie unten. Aber das weißt Du sicher schon, es fehlt nur im bisherigen Sourcecode.
-
Ach und ich vergaß zu erwähnen: Am Anfang Deines Programms kommt dann
.segment "BYTEBREAKER"
.word $0801
; Basic-Header
...Damit setzt Du die Ladeadresse auf 0801. Deswegen auch das komische "0801-2" als Segment-Startaddresse im Linkerconfigfile: damit schaffst Du Platz für die 2 Bytes der Ladeadresse, die ja dann beim Laden verworfen werden).
-
Hi,
hm, da geht noch einiges durcheinander. cl65 ist das Link&Build-Tool für C-Code, für Assembly solltest Du den ld65 (den reinen Linker) benutzen. Das Linker-Configfile kann viel simpler aufgebaut sein, da Du in Deinem Fall nur ein einziges Segment brauchst. So etwa:
MEMORY {
BYTEBREAKERMEM:
start = $0801-2,
size = $1000,
file = "sid2.prg";
}SEGMENTS {
BYTEBREAKER:
load = BYTEBREAKERMEM,
define = yes;
}Für das SID brauchst Du kein Segment, da es nicht assembliert wird (ist es ja schon). Also kannst Du es einfach am Ende Deine Programms includen, musst es aber zur Laufzeit an die richtige Stelle kopieren. So wie es im Moment ist, erzeugst Du ein riesiges Loch mit Nullen mitten im Programm, damit das SID an die richtige Stelle geladen wird.
-
Das Segment Prinzip wird als überlegener Vorteil beschrieben
Das ist es auch, weil man damit Dinge wie "der Code soll halt da anfangen, wo der andere Code zuende ist" ohne händische rumrechnerei (am besten kombiniert mit meinem Lieblings-Workaround: Sprungtabellen
) lösen kann. In der Tat ist das Schreiben der Linker-Configfiles erstmal gewöhnungsbedürftig, aber wenn man mal weiß wie es geht, ist es kinderleicht. -
Oha. Naja, dafür würde ich auch nicht das Laden mit ,8: opfern
. Vielen Dank für die Info! -
Ja, ich kann mir denken, welchen Vorteil Du Dir davon versprichst
Welchen denn?