Jep ![]()
Und Arrays über diesen Umweg (ein Labelname mit einer Nummer hinten), und Stacks über diese simulierten Arrays.
Jep ![]()
Und Arrays über diesen Umweg (ein Labelname mit einer Nummer hinten), und Stacks über diese simulierten Arrays.
Dass es bei Makro-Aufrufen nicht übergeben werden kann, liegt einfach daran, dass Makros hier keine Textersetzungen, sondern de facto Funktionsaufrufe sind - daher kann man dort als Parameter nicht einfach die Adressierungsart übergeben.
Ja, leider :-(, das hatte ich auch schon befürchtet.
Textersetzung würde Macros um 1000% mächtiger machen, für mich jedenfalls.
Hm, für mich ist das Bitte melde dich an, um diesen Link zu sehen. ein Indikator für einen imediate-Wert. Jetzt bin ich verwirrt.
lda $01 ; absolut, hex
lda 1 ; absolut, dez
lda #$01 ; immediate, hex
lda Bitte melde dich an, um diesen Link zu sehen. ; immediate, dez
lda #%00001111 ; immediate, binär, mit %-Zeichen als Erkennungsmerkmal
Nicht?
Keine Ahnung, warum das Code-Feld jetzt nicht geht.
Egal!
Assembliert problemlos und wie erwartet zu:
080D: lda $01
080F: lda $01
0811: lda #$01
0813: lda #$01
0815: lda #$0f
danke ![]()
Bin dem nochmals begegnet.
Hi,
gibts einen Menüpunkt oder eine Tastenkombination, mit der man alle ausgeklappten Macros bzw. Faltungen einfalten kann.
Manchmal stehen ALLE offen und die kann ich dann alle händisch (!!!) zumachen, was schon lange dauert (hab ja schon ein ganze Menge Macros).
Danke ![]()
<MOD>Als Wunsch hierher verschoben, zusammen mit Endurions Antwort
Hi Leute, wie versprochen in den zu diesem Thema passended Threads (Bitte melde dich an, um diesen Link zu sehen. und Bitte melde dich an, um diesen Link zu sehen.), habe ich an meinen Struktur-Macros gearbeitet und denke, dass das für euch interessant sein könnte.
Schaut euch einfach ein Dissassembly an, die Macros legen sehr schlanken Code ab.
Was ist es (für die, die die anderen Threads nicht verfolgt haben):
Macros, die z.B. IF_..- ELSE - ENDIF oder beispielsweise REPEAT-UNTIL_.. erstellen und damit zur Übersichtlichkeit von Assemblerprogrammen beitragen.
Deshalb der Name "MacroHLA" = Macro High Level Assembler, also keine Hochsprache, aber eine Assemblersprache, die strukturiertes Programmieren ermöglicht und dabei dennoch äußerst nah an Assembler bleibt (Bitte melde dich an, um diesen Link zu sehen., Bitte melde dich an, um diesen Link zu sehen.)
In der Datei sind alle Referenzen angegeben.
Ich stütze mich wesentlich auf diese Webseite. Die Macros habe ich von dort adaptiert (Bitte melde dich an, um diesen Link zu sehen.).
Viel Spaß damit, und eventuell Feedbacks und Bugs bitte melden. ![]()
Hi, Endurion,
was kann man mit Preferences-Tools machen, ich habe dort den WinVice, aber was kann ich da sonst noch machen?
Kann ich da meine eigenen Preprocessor (zum Beispiel) einbinden?
Hi, auch ein dringender Wunsch von mir (eigentlich 2, aber der 1. ist der dringendste
)
1. In Macros das zusammenfügen von Textteilen.
Ein Beispiel:
Das würde alle meine Wahnsinnsklimmzüge bezüglich der Stacks drastisch vereinfachen.
Und: man kann damit auch Arrays simulieren natürlich.
2. Optionale Parameter und eine Assemblervariable, die anzeigt, wieviele Parameter es gibt.
far = 1
!macro IF_EQUAL ?range
if Ass_ParameterCount=1 & range=far { ; eigtl. könnte man & range=far auch bleiben lassen
.. mache Code für far jump ..
}
if Ass_ParameterCount=0 {
.. mache Code für near jump ..
}
!end
; nur ein Beispiel, optional wäre also hier mit?
Aufruf:
+IF EQUAL far
+ENDIF
Alles anzeigen
Wie gesagt, Wunsch 1 ist der dringendste ![]()
Danke
Ha ha, ja, in der Tat.
Ich versuch diese EXIT_IF zu stacken. Damit er nacheinenander die Sprungziele befüllen kann.
Einfach, weils Spaß macht ![]()
Guck dir mal auch die anderen Macros an.
Da habe ich einiges schon, was deine Macros hergeben, verwendet.
Geht gut. Coole Sache! Danke für deine Arbeit. ![]()
Ich glaube, ich bin wieder auf einen Bug gestoßen:
!macro HANDLE_EXIT
!for .x=0 to __hla_NoExitIf
!warn __hla_NoExitIf
!if __hla_STACK2=__hla_EXITIF {
+__hla_PULL_STACK
+__hla_PULL_STACK
;+__hla_PULL_STACK ; FUNKTIONIERT MIT 2-mal +__hla_PULL_STACK, aber nicht mit 3 (????)
!warn "!"
}
!end
!end
!macro FOREVER
+HANDLE_EXIT
jmp __hla_STACK0
+__hla_PULL_STACK
+__hla_SHOW_STACK "FOREVER"
!end
Alles anzeigen
Oben Zeile 7 macht große Probleme. Bei 2-mal läufts, bei 3-mal meckert er etwas wie "Redefinition of label __hla_STACK9" und andere Labels auch.
Das ist aber auch NUR in DIESER Konstellation ein Problem. Ich könnte hunderte +__hla_PULL_STACK händisch hintereinander schreiben, er hätte kein Problem. Muss also irgendetwas mit dem !for oder !if zu tun haben.
Noch ein interessanter Aspekt. Schreibe ich ein "+__hla_PUSH_STACK *" zwischen 2. und 3. PULL, geht es auch wieder. Aber auch im Push werden dieselben Label verwendet, also warum der error "Redifintion"? ![]()
Habe das gesamte Projekt als Zip angehängt.
Feature Request:
Code-Ergänzungvorschlag nicht nur für Labels/Variablen, sondern auch für Macros.
Danke ![]()
Bei mir geht er recht gut.
Ich bin sehr zufrieden.
Würde noch die Bytes neben Adresse toll finden, aber super Tool. ![]()
Hat manchmal kleine Macken.
Beim Testen der IF habe ich z.b 150 nops erzeugt.
Die waren dann eine Liste von Bytes und keine Mnemonics.
So, ich biete mal wieder etwas von meiner Macro-Spielerei an.
Habe ein neues Konzept.
Diese Version erkennt nun, wenn eine Branch zu weit geht. Bricht dann mit Error ab.
Dann muss man die eXtended Version verwenden: IF_EQUAL geht zu weit --> IF_EQUALx (x=extended) verwenden.
Ab jetzt erkennen die Macros auch, ob sie einen Branch oder einen JUMP verändern müssen. Ich pushe das vorher auf den Stack, verwende jetzt also pro Eintrag 2 Stack-Zellen. Außerdem gibt es für den Stack eine Debug-Ausgabe, damit man sieht, was am Stack ist.
Viel Spaß ![]()
Endurion: Falls du Zeit und Lust hast dir mal die Möglichkeit von optionalen Parametern anzusehen und vom Umwandeln von Variableninhalten (=Nummern) in Texte und dann das Einfügen in den Quelltext als Text, egal an welcher Stelle? Ganz großes Danke, falls du Lust hast. ![]()
Das heißt locals (. @) sind local zum Macro?
Und Globals natürlich auch dort global?
Hab ich das richtig verstanden?
Mir ist gerade aufgefallen, dass Macros sich nicht in die !zone einfalten.
Anders formuliert, die !zone endet, wenn ein Macro kommt - faltungstechnisch.
Getestet:
LÄUFT EINWANDFREI:
!macro ENDIF {
.currPC=*
*=__hla_STACK0-1
!byte .currPC-__hla_STACK0
+PULL_STACK
*=.currPC
}
LÄUFT NICHT UND GIBT ERROR:
!macro ENDIF {
@currPC=*
*=__hla_STACK0-1
!byte @currPC-__hla_STACK0 ; <== das ist Line 79 (siehe Fehlermeldung unten)
+PULL_STACK
*=@currPC
}
Fehlermeldung:
79;E1001;C:...;Cannot evaluate expression __hla_STACK0@currPC-__hla_STACK0
Alles anzeigen
Cheap local Labels gehen also nicht.
Sind local Labels in Macros (die mit . und @ ????) eigentlich local.
Oder anders formuliert, startet ein Macro einen neuen Scope?