Forum: Mikrocontroller und Digitale Elektronik Frage an Assembler Programmierer 6502/c02


von Karl T. (don_karlo)


Lesenswert?

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
von Norbert T. (atos)


Lesenswert?

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

von Wolfgang (Gast)


Lesenswert?

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.

von CHH (Gast)


Lesenswert?

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 ...

von Karl T. (don_karlo)


Lesenswert?

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

von Miška (Gast)


Lesenswert?

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.

von Karl T. (don_karlo)


Lesenswert?

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

von Miška (Gast)


Lesenswert?

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?

von Karl T. (don_karlo)


Lesenswert?

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.

von Karl T. (don_karlo)


Lesenswert?

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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

http://www.6502.org/tutorials/6502opcodes.html#STA


95 ist der Opcode für STA $01,X

von Karl T. (don_karlo)


Lesenswert?

.BYTE $8D ;      8080 8D
.BYTE  6 ;      8081 06
.BYTE  0 ;      8082 00

Dann übersetz das mal ....

von mail (Gast)


Lesenswert?

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?

von (prx) A. K. (prx)


Lesenswert?

mail schrieb:

> 8D 01 00   STA $0006   Akkuinhalt nach §0001 schreiben

Hmm. 1=6?

von Karl T. (don_karlo)


Lesenswert?

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 !!!

von mail (Gast)


Lesenswert?

HAst ja Recht. Sorry, meine Augen sind doch etwas müde. Feierabend für 
heute!

von Miška (Gast)


Angehängte Dateien:

Lesenswert?

.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.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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.

von Mark L. (m2k10) Benutzerseite


Lesenswert?

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

von Miška (Gast)


Lesenswert?

> 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.

von Miška (Gast)


Lesenswert?

Aber Zeropage-Adressierung scheint der TASM seltsamerweise trotzdem zu 
kennen, obwohl sie nicht in der .TAB aufgeführt ist (siehe oben)...

von Mark L. (m2k10) Benutzerseite


Lesenswert?

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.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

$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!

von Karl T. (don_karlo)


Lesenswert?

WELCHER EMULATOR ?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Karl Tomacek schrieb:
> WELCHER EMULATOR ?

Wen schreist Du da plenkend an?

von Karl T. (don_karlo)


Lesenswert?

hab keinen angeschrien, hab nur den text kopiert ... sorry
Feststelltaste war on ...

von Karl T. (don_karlo)


Lesenswert?

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 ..

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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.

von Karl T. (don_karlo)


Angehängte Dateien:

Lesenswert?

... so da ist ein Testteil als Datei

von Karl T. (don_karlo)


Lesenswert?

hab ich versucht,klappt nicht ...

Wenn ich im tasm versuche die tab datei zu ändern,dann wird ab 88D1 dann 
falsch übersetzt

von Miška (Gast)


Lesenswert?

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...

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Miška schrieb:
> Ist das nicht "absolute addressing" (jetzt aus'm Kopf heraus)

Anderer Name, gleiches Spiel.

von Karl T. (don_karlo)


Lesenswert?

Exact !

Es wird mir wohl nichts anderes übrigbleiben,und rund 220 Befehle zu 
ändern...

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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.

von Karl T. (don_karlo)


Lesenswert?

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

von Mark L. (m2k10) Benutzerseite


Lesenswert?

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

von Karl T. (don_karlo)


Lesenswert?

werde mir das mal reinziehen...

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
Noch kein Account? Hier anmelden.