6502-Crossassembler und Editor für Windows gesucht
6502-Crossassembler und Editor für Windows gesucht
von Dietrich » Sa 22. Apr 2006, 21:26
Hallo Leute,
ich möchte demnächst mal wieder ein OS in Assembler programmieren - aber auf dem PC, weil der einfach komfortabler ist (großer Bildschirm, schneller, bequemer Ausdruck möglich) und ich meinen Code auch mal kommentieren möchte, ohne dass der Speicher gleich aus dem Ruder läuft und ich Klimmzüge deswegen machen muss.
Einen Crossassembler habe ich bereits (bin aber für weitere Vorschläge offen), es fehlt mir noch ein geeigneter Editor für Windows (Me + XP). Ich brauche
- angezeigte Zeilennummern (um Assemblerfehler zu finden)
- Möglichkeit, meinen Assembler in den Editor einzuhängen, um ihn aufzurufen. Der Output des Assemblers sollte auch angezeigt werden
- Hex-Anzeige von Dateien (umschaltbar zur Textansicht)
- spaltenbezogene Tab-Einstellung (beim Drücken von Tab soll der Cursor zur nächsten Spalte gehen, der Editor soll dabei im Code Spaces ablegen, kein Tabs)
- veränderbare Schriftgröße
Wer kann mir einen Editor und/oder 6502-Crossassembler vorschlagen?
Gruß Dietrich
von cas » Sa 22. Apr 2006, 21:40
Hallo Dietrich,
Editor:
MED :
http://www.utopia-planitia.de/
Assembler:
as65 (Assembler des cc65)
http://www.cc65.org/
ATAsm :
http://atasm.sourceforge.net/
Ciao
Carsten
von pps » Sa 22. Apr 2006, 22:24
Also als Assembler kann ich nur MADS empfehlen. Es ist eine Weiterentwicklung vom XASM. Für etliche Editoren werden auch Syntaxes mitgeliefert, so daß man schön sehen kann, was Code und was Comment, Data ist.
Man hat auch Makros dabei, so daß es auch möglich ist, z.B. für XL & 5200 ein Programm zu schreiben ohne viel Code zu ändern. Die veränderten Hardwareadressen (z.B. $D***) werden einfach durch die Makros "ersetzt" und beim Assemblieren, wird je nach Option entweder der Code für den XL, oder der für das 5200 erzeugt.
Natürlich kann man auch eigene Makros erstellen.
http://mads.atari8.info/von Dietrich » So 23. Apr 2006, 00:29
Danke!
Ich hab jetzt mal den atasm 1.05 ausprobiert. Boah, bin schwer beeindruckt. Ich musste nur die *Kommentarzeilen in ; verändern, zwei .BANK-Direktiven einfügen und schon konnte ich das in MAC/65 geschriebene QMEG-OS assemblieren - und zwar direkt in ein ATR hinein. Sehr praktisch!
Hab noch nicht geprüft, ob der Code tatsächlich OK ist (der MAC/65 produziert überflüssige Segmente im assemblierten File, ein einfacher Dateivergleich hilft daher nicht). Gibt es vielleicht irgendwelche bekannten Fehler?
Gibt es für den MED eigentlich ein passendes Syntax-Highlighting (für atasm-Code)?
Gruß Dietrich (der in Zukunft nicht mehr auf dem Atari programmieren wird)
von HiassofT » So 23. Apr 2006, 15:13
Dietrich hat geschrieben:Hab noch nicht geprüft, ob der Code tatsächlich OK ist (der MAC/65 produziert überflüssige Segmente im assemblierten File, ein einfacher Dateivergleich hilft daher nicht). Gibt es vielleicht irgendwelche bekannten Fehler?
Ich verwende ATasm schon seit ein paar Jehren für alle meine Atari-Projekte, Fehler sind mir in der 1.05er Version bisher nicht aufgefallen. Frühere Versionen hatten aber zum Teil einige ärgerliche Bugs.
Wenn Du .COM Files mit Init-Blöcken erzeugst, mußt Du (wie in der Anleitung beschrieben) ein wenig aufpassen und .BANK-Direktiven verwenden, ATasm sortiert sonst die einzelnen .COM-Blöcke aufsteigend nach der Adresse (und der $02E2 Block kommt vor dem Code-Block).
Vor ein paar Monaten habe ich selber einen ganz einfachen Disassembler geschrieben der auch mit .COM Files klarkommt. Hier ist der C++ Sourcecode dazu:
http://www.horus.com/~hias/tmp/dis6502.tgz. Das Programm lässt sich unter Linux und Windows compilieren und wird komplett per Kommandozeile gesteuert. Per default wird von stdin gelesen (wenn kein File angegeben wurde) und die Ausgabe nach stdout geschrieben. Mit "-a adresse" kann man die Start-Adresse eines RAW-Blocks festlegen, mit "-e" kann man .COM Files disassemblieren. Defaulteinstellung ist "-a 0x1000". Hier ein paar Beispiele:
- Code: Alles auswählen
dis6502 -a 0xa000 basic.rom > basic.asm
dis6502 -e file.com > file.asm
dd if=test.atr bs=1 skip=16 count=384 | dis6502 -a 0x0700 > bootsect.asm
Der Disassembler macht übrigens keinerlei Cross-Referencing oder sonstigen Schnickschnack, nur reinen Assembler Output :-)
so long,
Hias
von Dietrich » So 23. Apr 2006, 22:23
HiassofT hat geschrieben:Wenn Du .COM Files mit Init-Blöcken erzeugst, mußt Du (wie in der Anleitung beschrieben) ein wenig aufpassen und .BANK-Direktiven verwenden
Genau deshalb musste ich auch zwei .BANK-Direktiven einsetzen. Der atasm ist wirklich klasse. Und da er MAC/65-kompatibel ist, kann ich den Sourcecode bei Bedarf zurück auf den Atari kopieren (wenn der Speicher dabei nicht überläuft

)
HiassofT hat geschrieben:Vor ein paar Monaten habe ich selber einen ganz einfachen Disassembler geschrieben
Hast Du evtl. den Disassembler auch als fertiges Windows-EXE-File, (ich habe keinen C-Compiler auf dem PC)?
Bisher benutze ich den Memory-Disassembler im Atari800Win und kopiere den Code seitenweise heraus, um ihn in einem Word-Dokument mit Mehrspalten-Format auszudrucken. Dieser Disassembler hat auch den Vorteil, dass er alle Systemadressen zusammen mit den offiziellen Atari-Labels ausgibt (z.B. LDA $D20D ; SERIN). Sehr gut - ich kenne nämlich nicht alle Adressen auswendig

Gruß Dietrich (der mit atasm sehr zufrieden ist)
von HiassofT » So 23. Apr 2006, 23:05
Dietrich hat geschrieben:Hast Du evtl. den Disassembler auch als fertiges Windows-EXE-File, (ich habe keinen C-Compiler auf dem PC)?
Ich habe eine neue .tgz Datei hochgeladen, mit einem Win32 EXE mit drin. Das Lesen von stdin macht unter Windows irgendwelche Probleme, keine Ahnung was das schon wieder ist. Lesen von File klappt aber einwandfrei.
Dietrich hat geschrieben:Bisher benutze ich den Memory-Disassembler im Atari800Win und kopiere den Code seitenweise heraus, um ihn in einem Word-Dokument mit Mehrspalten-Format auszudrucken. Dieser Disassembler hat auch den Vorteil, dass er alle Systemadressen zusammen mit den offiziellen Atari-Labels ausgibt (z.B. LDA $D20D ; SERIN). Sehr gut - ich kenne nämlich nicht alle Adressen auswendig :wink:
An sowas hatte ich auch schon gedacht, wenn ich mal Zeit und Lust habe baue ich das evtl. auch in meinen kleinen Disassembler mit rein :-)
so long,
Hias
von HiassofT » Mo 24. Apr 2006, 00:48
Kurzes Update: ich habe gerade eben (0h27) wieder eine neue Version hochgeladen, mit der Option "-s" werden nun auch diverse Atari Speicheradressen im Klartext mit ausgegeben. zB:
- Code: Alles auswählen
44BA A9 D0 LDA #$D0
44BC 8D 0E D2 STA $D20E ; IRQEN
44BF 8A TXA
44C0 8D 0D D2 STA $D20D ; SEROUT
44C3 AE 0E D2 LDX $D20E ; IRQST
44C6 10 A1 BPL $4469
so long,
Hias
von Dietrich » Mo 24. Apr 2006, 20:19
Super,
dann kann ich mir ja das mühsame seitenweise rauskopieren aus dem Atari800Win-Emulator sparen.
Nur ein Problem: tgz? Kann ich nicht entpacken. Vermutlich ein Unix-Packformat! Könntest Du ein normales ZIP erstellen?
Gruß Dietrich
von HiassofT » Mo 24. Apr 2006, 20:47
Dietrich hat geschrieben:Nur ein Problem: tgz? Kann ich nicht entpacken. Vermutlich ein Unix-Packformat! Könntest Du ein normales ZIP erstellen?
Sollte Winzip eigentlich kennen (ist das selbe wie .tar.gz). Aber Du hast recht, ein .ZIP ist deutlich einfacher:
http://www.horus.com/~hias/tmp/dis6502.zip
so long,
Hias
von Dietrich » Mo 24. Apr 2006, 21:05
Ähh, ich habe kein Winzip auf meinem Rechner (hatte ich bisher nicht nötig).
Habe den Disassembler eben ausprobiert. Spitze! Das macht das Untersuchen von fremden Code wirklich einfach. Ein großes Dankeschön von mir

Gruß Dietrich
von mega-hz » Mo 24. Apr 2006, 22:54
Gibt es nicht auch nen Assembler/Disassembler für 6502 unter Windows?
Gruß,
Wolfram.
von HiassofT » Mo 24. Apr 2006, 23:55
mega-hz hat geschrieben:Gibt es nicht auch nen Assembler/Disassembler für 6502 unter Windows?
Einen? Ich würde sagen hunderte :-)
Der Grund, wieso ich den hundertundersten 6502 Disassembler geschrieben habe war aber ganz einfach, daß ich mich mit den anderen Disassemblern nicht so richtig anfreunden konnte. Zum einen wollte ich einen Disassembler, der direkt unter Linux läuft, zum anderen waren mir die meisten anderen Disassembler einfach zu überladen und/oder konnten nicht direkt mit Atari .COM-Files umgehen.
Assembler habe ich dann doch keinen geschrieben, mit dem ATasm bin ich (auch) sehr zufrieden!
so long,
Hias
von mega-hz » Di 25. Apr 2006, 00:43
Das es sehr viele gibt, hab ich schon gesehen, aber für Windows???
Dein Disassembler hat doch auch keine Windows-Oberfläche, oder?
Gruß,
Wolfram.
von HiassofT » Di 25. Apr 2006, 01:09
mega-hz hat geschrieben:Das es sehr viele gibt, hab ich schon gesehen, aber für Windows???
Da gibt's zB den "Dis6502" (jaja, ich weiß, irgendwie heissen alle 6502 Disassembler "dis6502" :-) :
http://www.atarimax.com/dis6502/Dein Disassembler hat doch auch keine Windows-Oberfläche, oder?
Windows-Oberfläche hat er zwar nicht, aber das .EXE ist eine echte Win32 Konsolenapplikation - läuft also nicht unter DOS. Insofern ist es also schon ein "richtiges" Windows Programm :-)
so long,
Hias
von HiassofT » Do 11. Mai 2006, 01:57
Dietrich hat geschrieben:Ich hab jetzt mal den atasm 1.05 ausprobiert.
[...]
Gibt es vielleicht irgendwelche bekannten Fehler?
Ich bin beim Stöbern in meiner Mailbox gerade über Bugreports gestolpert, die ich vor ca. 2 Jahren submitted habe. Muß ich wohl bei Gelegenheit noch mal schicken.
Bei folgendem source generiert ATasm eine falsche Symboltabelle und auch falschen Output. Er scheint darüber zu stolpern, daß er nicht weiß ob der Code nun ein 8 oder 16-bit adresse generiert:
- Code: Alles auswählen
* = $1000
L1 LDA ADR
L2 RTS
ADR = L2 - L1
Bei 'atasm -v -s' sieht man, daß er ADR auf 3 setzt und L2 aut $1003 (statt 2 und $1002). Der generierte code ist "a5 03 60".
Der Fehler tritt aber nur bei "LDA ADR" auf, nicht bei "LDA #ADR", ist also zugegebenermassen etwas esoterisch (kommt aber von irgendeinem realen Code her, nur weiß ich nach 2 Jahren nicht mehr woher...)
Und noch ein Fehler: SET 6 klappt nicht mit negativen Werten (zB SET 6,-1). Das läßt sich mit folgendem patch aber recht einfach beheben:
- Code: Alles auswählen
diff -Nur atasm105.orig/src/asm.c atasm105/src/asm.c
--- atasm105.orig/src/asm.c Thu Nov 13 02:51:38 2003
+++ atasm105/src/asm.c Sun Mar 14 20:01:25 2004
@@ -1501,7 +1501,7 @@
str=get_nxt_word(1);
squeeze_str(str);
if (strlen(str)) {
- ofs=get_expression(str,1);
+ ofs=get_signed_expression(str,1);
if ((ofs>=-65535)&&(ofs<=65535)) {
activeBank->offset=ofs;
} else {
diff -Nur atasm105.orig/src/setparse.c atasm105/src/setparse.c
--- atasm105.orig/src/setparse.c Thu Nov 13 02:51:40 2003
+++ atasm105/src/setparse.c Sun Mar 14 20:01:55 2004
@@ -150,6 +150,10 @@
This function calculates the value of an expression, or generates an error
*=========================================================================*/
unsigned short get_expression(char *str, int tp) {
+ return (unsigned short) get_signed_expression(str, tp);
+}
+
+int get_signed_expression(char *str, int tp) {
char buf[256], work[80];
char *look, *walk, *w;
int v;
@@ -291,6 +295,6 @@
}
*walk=0;
v=parse_expr(buf);
- return (unsigned short)v;
+ return v;
}
/*=========================================================================*/
so long,
Hias
von Dietrich » Do 11. Mai 2006, 21:41
Ah, danke.
Der erste Fehler ist leicht verschmerzbar, sowas schafft der MAC/65 auch nicht (es gibt dann einen Phase Error). Dafür bräuchte man einen 3-Pass-Assembler. Meine Version des MAC/65 mag übrigens keine JMPs auf Zero-Page-Adressen.
SET habe ich noch nie benötigt...
Gruß Dietrich