Servus aus Wien ! Ich habe folgendes Problem: tasm 301: Bei dem Versuch folgenden Befehl zu assemblieren: STA $01, was STORE ACCU bedeutet - wird als 86 01 im Assembler übersetzt.Im Dump steht aber 8D 01 00. Wenn ich aber STA $803 assembliere --> ergibt das 8D 03 08 und das ist korrekt. Was läuft da falsch ? Oder soll ich einen anderen Assembler verwenden? Wenn ja, welches Programm? Sollte jemand ein Sourcecode Beispiel 65c02 und Pia haben,wäre mir das sehr hilfreich. mfg Don
:
Verschoben durch User
Hi! Also beim C64er ist STA $01 eben NICHT STA $0001 !!! Es sind zwei verschiedene Befehle (85 und 8D), beim STA $01 wird auf der "zero page" gespeichert, beim STA $xxxx irgendwo im Speicher; schaue dir alle Adressiermodi des 6502 an, LDA, LDX, LDY, STA, STY, STX, ROR, ROL... alle können die "zero page" benutzen. Lesenswert: http://de.wikipedia.org/wiki/Zeropage http://en.wikipedia.org/wiki/Zero_page http://www.obelisk.demon.co.uk/6502/addressing.html Gruß Norbi (Der Opcode für STA auf der zeropage ist eigentlich 85 und nicht 86...) http://www.6502.org/tutorials/6502opcodes.html#STA
Karl Tomacek schrieb: > Oder soll ich einen anderen Assembler verwenden? Wenn ja, welches > Programm? Braucht dein Assembler vielleicht eine besondere Syntax, damit er den Zero-Page Adressing Mode verwendet? Erzeugt er überhaupt freiwillig Zero-Page Codes? $86 wäre allerdings nicht STA sondern STX.
Karl Tomacek schrieb: > Bei dem Versuch folgenden Befehl zu assemblieren: STA $01, > was STORE ACCU bedeutet - wird als 86 01 im Assembler übersetzt.Im Dump > steht aber 8D 01 00. > Wenn ich aber STA $803 assembliere --> ergibt das 8D 03 08 und das ist > korrekt. Was läuft da falsch ? Probier mal "STA ($01)". Bei den 6502 Assemblern die ich kenne war das die Syntax um anzuzeigen, dass man in die Zero Page schreiben will ...
OHNE KLAMMER; 8024 85 01 STA $01 ;.BYTE $8D ; 8024 8D ;.BYTE 1 ; 8025 01 ; .BYTE 0 ; 8026 00 MIT KLAMMER; 8024 92 01 STA ($01) ;.BYTE $8D ; 8024 8D ;.BYTE 1 ; 8025 01 ;.BYTE 0 ; ABER NICHT 8D 01 00
86 01 ist, wenn ich nicht irre, STX $01 STA $01 (Zeropage) ist 85 01. Absolut adressiert ist das 8D 01 00. Sie mal in der TASM65.TAB nach, ob dort der Opcode 85 definiert ist (bei der mir vorliegenden TASM-Version 3.2 ist das nicht der Fall, was heißt, daß Zeropage-Adressierung anscheinend gar nicht vorgesehen ist) Du müßtest also evtl. die Tabelle erweitern.
bei mir ist das drin: STA (*,X) 81 2 NOP 1 STA (*),Y 91 2 NOP 1 STA (*) 92 2 NOP 2 STA *,X 9D 3 ZP 1 STA *,Y 99 3 NOP 1 STA * 8D 3 ZP 1 ------------------------ nicht aber 95 - was der Assembler ausgibt
Karl Tomacek schrieb: > wird als 86 01 im Assembler übersetzt > [...] > nicht aber 95 - was der Assembler ausgibt Was gibt er denn nun tatsächlich aus? Häng doch mal die Dateien mit an, zum Vergleich. Also bei mir ergibt folgendes 'Programm' (.ASM):
1 | .org $1000 |
2 | |
3 | sta $01 |
4 | sta $2345 |
5 | |
6 | .end |
folgende Ergebnisse: (.LST):
1 | 0001 0000 |
2 | 0002 0000 |
3 | 0003 1000 .org $1000 |
4 | 0004 1000 |
5 | 0005 1000 85 01 sta $01 |
6 | 0006 1002 8D 45 23 sta $2345 |
7 | 0007 1005 |
8 | 0008 1005 .end |
9 | tasm: Number of errors = 0 |
(.OBJ):
1 | :0510000085018D452370 |
2 | :00000001FF |
Also alles bestens. Warum das funktioniert, weiß ich auch nicht (wahrscheinlich hard-coded). Hast Du auch schon so etwas einfaches ausprobiert, nur um zu sehen, ob's überhaupt funktioniert?
8024 95 01 * (sollte so sein 8D 01 00 ) STA $01;($01) 8026 8026 8026 8026 A9 AD LDA #$AD 8028 8028 8028 8D 01 C0 STA $C001 * das wird ausgegeben Der obere stimmt nicht ! der untere schon.
Bitte liste mir Deine TASM65.TAB auf gleichfalls wird die EQU Anweisung nicht akzeptiert. mache ich Schreibfehler ? Ein kurzes Prog würde mir sehr weiterhelfen. mfg Don
.BYTE $8D ; 8080 8D .BYTE 6 ; 8081 06 .BYTE 0 ; 8082 00 Dann übersetz das mal ....
8D 01 00 STA $0006 Akkuinhalt nach §0001 schreiben 95 01 STA ,X Akkuinhalt nach !ZeroPage! $01 schreiben. Damit spart sich dein Assembler ein Byte. Ich glaube das nannte man damals auch tatsächlich die "Zeropage-Befehle" oder so ähnlich, vor 25 Jahren. Oje, wo sind meine Haare nur alle hin?
RESULTAT : 8130 85 06 STA $0006 ;.BYTE $8D ; 8131 8D 8132 ;.BYTE 6 ; 8132 06 8132 ;.BYTE 0 ; 8133 00 8132 UND GENAU DAS IST FALSCH !!!
HAst ja Recht. Sorry, meine Augen sind doch etwas müde. Feierabend für heute!
.equ funktioniert nicht? Das klingt schon sehr seltsam. Wie bereits gesagt: zeig doch mal bitte Deinen Quellcode (oder Teile davon). Aber nicht abtippen, sondern als Datei. Als Quellcodebeispiel kannst Du die Datei "TEST65.ASM" aus dem TASM-Verzeichnis nehmen (hab sie mit angehängt, falls Du sie nicht hast), sie sollte als Beispiel genügen. Und versuch, sie zu übersetzen (tasm -65 -x test65.asm), da siehst Du, ob es prinzipiell funktioniert.
mail schrieb: > 95 01 STA ,X Akkuinhalt nach !ZeroPage! $01 schreiben. Nein. Das ist was anderes. Das ,X steht da nicht ohne Grund, das ist eine andere Adressierungsart. Sieh Dir mal die Adressierungsarten des 6502 an.
Karl Tomacek schrieb: > STA (*,X) 81 2 NOP 1 > STA (*),Y 91 2 NOP 1 > STA (*) 92 2 NOP 2 > STA *,X 9D 3 ZP 1 > STA *,Y 99 3 NOP 1 > STA * 8D 3 ZP 1 Das ist irgendwie falsch, $92 ist ein illegaler Opcode, ich meine sogar einer, der den Prozessor abstürzen lässt. Der ZP-X-indiziert fehlt ganz. Hab bei mir im Emulator die folgenden Opcodes:
1 | ; STA Hex Bytes Clk |
2 | ;Zero Page $85 2 3 |
3 | ;Zero Page,X $95 2 4 |
4 | ;Absolute $8D 3 4 |
5 | ;Absolute,X $9D 3 5 |
6 | ;Absolute,Y $99 3 5 |
7 | ;Indirect,X $81 2 6 |
8 | ;Indirect,Y $91 2 6 |
Könnte es sein, dass der tasm etwas problematisch ist? Der 'kennt' soweit ich weiß keine ZP und anderes, sondern wandelt nur stur Text in Opcodes. Ich verwende derzeit diesen hier: http://exifpro.com/utils.html Mark
> STA (*) 92 2 NOP 2 > Das ist irgendwie falsch, $92 ist ein illegaler Opcode [...] Für den 6502 stimmt das, aber nicht für den R65C02:
1 | This is the instruction set definition table for the 6502 version of TASM. |
2 | /* Thomas N. Anderson, Speech Technology Incorported, June 1987. |
3 | /* Note that there are two classes of extended instructions beyond |
4 | /* the standard set. The classes are assigned bits as follows: |
5 | /* bit 0 = standard set |
6 | /* bit 1 = extended instructions for R65C02 |
7 | /* bit 2 = extended instructions for R65C00/21 |
Karl scheint einen 65C02 zu benutzen (siehe Eingangspost), daher ist das richtig.
Aber Zeropage-Adressierung scheint der TASM seltsamerweise trotzdem zu kennen, obwohl sie nicht in der .TAB aufgeführt ist (siehe oben)...
Miška schrieb: > Karl scheint einen 65C02 zu benutzen (siehe Eingangspost), daher ist das > richtig. Sorry, hab' ich nicht so direkt aus '6502/c02' raus verstanden und es war von ZP die Rede nicht von indirekt-ZP. Da steige ich bei dem TASM nicht so ganz durch, zieht der einfach bei Adressen kleiner $0100 $08 vom Opcode ab? Die Opcodes sind beim 6502 ja schön strukturiert.
$92 ist STA (zp) Das entspricht STA (zp),Y wenn Y den Wert 0 enthält. Das ist eine 65c02-spezifische Adressierungsart, die der Ur-6502 nicht kennt. Aber auch das ist etwas komplett anderes als STA zp Beschäftigt Euch mal mit den Adressierungsarten!
hab keinen angeschrien, hab nur den text kopiert ... sorry Feststelltaste war on ...
hab mit 6502 1.2.8 übersetzt BBS7 4, loc_8067 wird nicht erkannt,und STA $1 wird mit 85 01 statt 8D 01 00 übersetzt. ... ich wollte hier keinen beleidigen ..., bin froh,dass mir hier geholfen wird ..
Karl Tomacek schrieb: > und STA $1 wird mit 85 01 statt 8D 01 00 > übersetzt. 85 01 ist korrekt. Das ist "Zero-Page-Adressing", und benötigt nur eine 8-Bit-Adresse. 8d 01 00 ist "direct addressing" mit einer 16-Bit-Adresse, was ein Byte mehr Programmspeicher und einen Takt mehr Ausführungszeit benötigt. Wenn Du 8d 01 00 erhalten willst, hilft es möglicherweise, im Assemblerquelltext statt STA $1 STA $0001 zu schreiben.
hab ich versucht,klappt nicht ... Wenn ich im tasm versuche die tab datei zu ändern,dann wird ab 88D1 dann falsch übersetzt
Rufus Τ. Firefly schrieb: > 8d 01 00 ist "direct addressing" mit einer 16-Bit-Adresse, was ein Byte Ist das nicht "absolute addressing" (jetzt aus'm Kopf heraus) --- Karl: Interpretiere ich Deine Datei richtig, wenn ich sage, daß das einzige Problem darin besteht, ein Re-Assembliertes Programm mit TASM neu zu übersetzen, es aber nicht zum 1:1-Ergebnis führt? Kannst Du nicht einfach mit der Zeropage-Adressierung leben, oder bringt Dir das irgendwelche Timing-Probleme? Aus dem TASM User's Manual: > Note that Zero Page addressing can not be explicitly requested. > It is used if the value of the operand is representable in a > singlebyte for the applicable statements. Da ist wohl ein anderer Assembler fällig...
Miška schrieb: > Ist das nicht "absolute addressing" (jetzt aus'm Kopf heraus) Anderer Name, gleiches Spiel.
Exact ! Es wird mir wohl nichts anderes übrigbleiben,und rund 220 Befehle zu ändern...
Karl Tomacek schrieb: > Es wird mir wohl nichts anderes übrigbleiben,und rund 220 Befehle zu > ändern... Warum? Möchtest Du tatsächlich STA $01 durch STA $0001 ersetzen? Was soll das bezwecken? Beide Operationen bewirken das gleiche, nur ist die erste schneller und benötigt weniger Programmspeicher.
das ist meine TASM65.tab STA (*,X) 81 2 NOP 1 STA (*),Y 91 2 NOP 1 STA (*) 92 2 NOP 2 STA *,X 9D 3 ZP 1 STA *,Y 99 3 NOP 1 STA * 8D 3 ZP 1 das hab ich angehängt , STA * 85 3 ZP 1 STA * 95 2 NOP 1 bin aber nicht sicher ob es so korrekt ist,denn diese 2 opcodes fehlen bei mir, oder hat jemand eine tab, wo diese opcodes drin sind
Karl Tomacek schrieb: > das hab ich angehängt , > STA * 85 3 ZP 1 > STA * 95 2 NOP 1 Ist vermutlich nicht korrekt, $95 ist ZP-X-indiziert, wenn tasm überhaupt mit doppelten Definitionen umgehen kann, müsste es in der zweiten Zeile zumindest "STA *,X 95 2 ZP 1" oder so heißen. Karl Tomacek schrieb: > WELCHER EMULATOR ? Meine eigenen für den AVR, sind zwar inzwischen mehrere verschiedene, aber die Opcodes sind ja gleich. Mir ist bei meiner derzeitigen Beschäftigung mit 8-Bittern vor allem aufgefallen, dass es heutzutage ein ziemliches Chaos gibt und Vieles nicht immer so funktioniert, wie es eigentlich sollte. Es gibt heute Assembler, die speziell bspw. für einen (PC-)Emulator geschrieben wurden und sich nicht 100%-ig an das Original halten und Multi-Assembler, die ihre ganz eigene Syntax verwenden, um allen verschiedenen Besonderheiten vieler Prozessoren in eine Oberfläche zu quetschen. Ich programmiere derzeit 6510&Z80&6809 und AVRs und habe für alle andere Assembler. Den 6502-Assembler verwende ich u.a., weil ich den mit meinen frühen Profimat64 Erfahrungen problemlos verwenden kann, glaube aber, der kann keinen 65C02-Code. Muss man vielleicht einfach sehen, welche Software mit welchem Quellcode für welche Zielplattform geeignet ist. Eine Auswahl ist u.a. hier zu finden, zwar mehr 6502, aber auch 65C02: http://www.npsnet.com/danf/cbm/cross-development.html Mark
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.