MAC65 Fehler beim Assemblieren


MAC65 Fehler beim Assemblieren

von Bernd » Mi 6. Jan 2010, 15:59
Hallöchen zusammen,
nach sehr langer Zeit versuche ich mich mal wieder im Proggen in Assembler.
Die Software wird langsam Stück für Stück fertiggestellt. Seit der letzten Ergänzung erhalte ich eine Fehlermeldung,
bei der ich die Ursache aus der Beschreibung nicht verstehe. Was ich brauche ist etwas Hilfe :praying:
Alle Labels werden ab einer Zeile mit einem Fehler ausgegeben, die 30 vorherigen werden korrekt erfasst.
Hinter jeder Zeile steht dann ERROR - 13, PHASE....

In der Fehlerbeschreibung aus dem Handbuch steht:
13 - OUT OF PHASE
The address generated in pass 2 for a label does not match the address generated in pass 1. A common cause of this
error are forward referenced addresses. If using conditional assembly (with or without macros), this error can result from
a .IF evaluating true during one pass and false during the other.

Kann damit einer etwas anfangen?

Viele Grüße,
Bernd
Image1.jpgImage1.jpg

Re: MAC65 Fehler beim Assemblieren

von Mathy » Mi 6. Jan 2010, 20:51
Hallo Bernd

Bernd hat geschrieben:13 - OUT OF PHASE
The address generated in pass 2 for a label does not match the address generated in pass 1. A common cause of this
error are forward referenced addresses. If using conditional assembly (with or without macros), this error can result from
a .IF evaluating true during one pass and false during the other.

Ich kenne mich mit Assembler nicht aus, werde aber mal probieren das zu übersetzen:

Die im zweiten Durchgang generierte Adresse für ein bestimmtes Label kommt nicht überein mit der Adresse die im ersten Durchgang generiert worden ist. Oft passiert dass mit vorwärts referierende Adressen. Wenn man "conditional" Maschinensprache benutzt (mit oder ohne Makro's) kann dies' eine Folge davon sein, das bei einer .IF beim einen Durchgang das Resultat "true" ist und bei einem anderen Durchgang "false".

"conditional" verstehe ich als "If ... (Then) ... Else" in BASIC.

Tschüß

Mathy

Re: MAC65 Fehler beim Assemblieren

von KMK » Mi 6. Jan 2010, 21:10
Bernd

MAC/65 phase error means exactly what they write: a label (like UIO3 in your program) has different value in second pass than it had in the first pass. What they don't write in the manual, is the most often occurring cause of that: a forward declaration of a ZERO PAGE variable.

Consider such an example:

Code: Alles auswählen
100   *= $0600
110 start
120   lda #$00
130   sta zptmp
140 loop
150   jmp loop
160 zptmp = $80
170 *= $02e0
180 .word start


In the first pass, the assembler finds (in line 130) an undeclared (so far) label zptmp, but, since the first pass calculates all addresses, it has to assume a size of the argument. So it assumes that the label represents a two-byte absolute address. Next (line 160) the label gets declared and it has now a value of $80. Now go to the second pass, the actual code generation. This time the label has a value, so the assembler knows that it is a zero page location. So in line 130 it generates a zero page addressing mode, eventhough in the first pass it assumed that it will be an absolute addressing mode. THUS: the next line triggers the phase error, because the label "loop", valued $0605 in the first pass, has a value of $0604 (= one less) in the second pass.

The cure is to delcare all zp labels at the beginning of your program.

Gtx,
KMK

Re: MAC65 Fehler beim Assemblieren

von Bernd » Mi 6. Jan 2010, 22:08
First, thanks Mathy and KMK for our help.
I found the mistake in my program and of course, it was very simple.
KMK, your info to check all labels give me the answer. I forgot a "#" in the mnemonics.

0900 LDA <SURE - that was the error.
0900 LDA # <SURE - correct mnemonics.

The ERROR - 13, PHASE give me many lines of mistakes, not the line with the only one.

Thanks and many greetings,
Bernd

Re: MAC65 Fehler beim Assemblieren

von Bernd » So 10. Jan 2010, 14:58
Hallo beisammen,
ich brauche mal wieder Hilfe. Das Proggen bei mir ist schon sehr lange her.
Mit fällt der Befehl leider nicht mehr ein, der dafür sorgt, dass die Display List
auf einer Page landet. Das Problem bei der DLI:
Adresse: $3FFB Data $02,$02,$02,
$3FFE Data $42,$08
$4000 Data $49 ..........
Nach dem DLI-Ladebefehl $42 liegt der Zeiger auf dem Datenbereich zwischen $3FFF und $4000,
ausgegeben wird dabei statt $4908 der Displaybereich $0008......
Das Handbuch habe ich schon durchgeforstet, leider ohne Erfolg.

Danke schon vorab,
Bernd

Re: MAC65 Fehler beim Assemblieren

von Koche » So 10. Jan 2010, 20:05
Hallo Bernd,

Vielleicht verstehe ich Dich falsch, aber es gibt an sich keinen Befehl, der dafür sorgt, dass die Dlist in einer Page landet. Dafür musst Du schon selbst sorgen ;-) Kannst Du nicht irgend etwas anderes vor ziehen, so dass Deine Display List auf 0x4000 oder etwas später beginnt?

Vielleicht hilft Dir / meinst Du den Antic Befehl 0x41 xx yy = "Jump yyxx". Meist findet man ihn nur am Ende einer Dlist und soll den Antic zum Sprung auf den Start der DLISt veranlassen. Du könntest damit aber auch einen 2ten Teil, eine weitere Dlist Befehlskette damit "anspringen" und abarbeiten lassen.

also in deinem Falle so etwas ...

statt ....

Code: Alles auswählen
$3FFB Data $02,$02,$02,
$3FFE Data $42,$08
$4000 Data $49 ..........


Code: Alles auswählen
$3FFB Data $02,$02               ; alt .....
$3FFD Data $41, $00, $40         ; neu >jmp $4000
$4000 Data $2                    ; fehlt noch, ehemals auf $3ffd   
$4001 Data $42, $08, $49


Vorsicht. Kann sein, dass Du Dich mit diesem Befehl dann auch über die Pagegrenzen hinweg setzen darfst. Genau sagen kann ich es Dir im Moment aber leider nicht. Sauberer wäre sicherlich aber, wenn Du wie oben geschrieben etwas anderes vor ziehst.


Viele Grüße
Alexander

Re: MAC65 Fehler beim Assemblieren

von Bernd » Mo 11. Jan 2010, 00:12
Hallo Alexander,
ich habe mittels "1000 .DS $FF" 255 Bytes reserviert und so die Display List auf die nächste Seite geschoben.
Das Problem ist vorerst gelöst.
Solch ein Problem ist selten in einem Buch beschrieben.

Danke für deinen Tipp,
Bernd