Frage an Assembler Programmierer 6502/c02

OP #2667350
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
#2667360
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
Gast #2667365
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.
Gast #2667373
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 ...
Gast #2667458
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.
Gast #2668013
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?
Gast #2668507
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?
Gast #2668801
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.
Angehängte Dateien:
(Firma: TH Köln) Persönliche Seite #2668902
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
Gast #2668917
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.
(Firma: TH Köln) Persönliche Seite #2669000
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.
Persönliche Seite #2669130
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.
Gast #2669232
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...
OP #2669446
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
(Firma: TH Köln) Persönliche Seite #2669548
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren