Retro Programming, Problem mit VASM

Gast #7174647
Lesenswert?

CPU: 6502

Code liegt in $E000 - $FFFF, (8kB für ein entsprechendes EEPROM 2864).

Wenn ich schreibe:
1
;RAM addresses, zero page:
2
      * = $20 
3
AnodeCounter =*    ; Counter 7seg. LED Anode 1-4
4
VAL2      *=*+1   ; save accu in DELAY loop
5
bitbang_1    *=*+1
6
bitbang_2     *=*+1
Dann wird für mein EEPROM ein 64k File erzeugt, weil der Assembler 
glaubt, eine ROM Section im Bereich $0-$23 anlegen zu müssen.

Wenn ich schreibe:
1
AnodeCounter = $20    ; Counter 7seg. LED Anode 1-4
2
VAL2 = $21   ; save accu in DELAY loop
3
bitbang_1 = $22
4
bitbang_2 = $23
Dann funktioniert der Code und das Binärfile ist wie gewünscht 8kB groß.

Die Frage ist: Wie kann ich dem Assembler abgewöhnen, das er eine 
zusätzliche Code Section die eigentlich RAM wäre, anlegt?
Gast #7175683
Lesenswert?

Bitmontierer schrieb:
> Die Frage ist: Wie kann ich dem Assembler abgewöhnen, das er eine
> zusätzliche Code Section die eigentlich RAM wäre, anlegt?

Ich vermute mal (bin kein 6502 Anwender), daß dein Assembler ein 
gültiges Segment erwartet und sich notfalls eins macht. Abgesehen davon 
sind mir diverse Details deiner Ausdrücke unverständlich:
   VAL2      *=*+1

Sowas würde man in den Gefilden, wo ich unterwegs bin, etwa so 
schreiben:
              SEG  RAM
              ORG  20h
AnodeCounter: DEFS 1
VAL2:         DEFS 1
bitbang_1:    DEFS 1
bitbang_2:    DEFS 1

Und da es Variablen sein sollen, darf dort natürlich nichts stehen, was 
Code erzeugen würde. Also keine Befehlsmnemoniks oder konstante Daten.

W.S.
Gast #7177091
Lesenswert?

Danke für deine Hilfe.
Ich hab das Beispiel
1
VAL2      *=*+1
aus nem uralten Emuf Sonderheft gefunden. Vielleicht ist der Assembler 
an der Stelle nicht kompatibel mit dem damaligen.

Dann ist noch etwas merkwürdig (Syntax).
Beispiel:
1
Mem_1 = $0200 ; 16-bit Adresse
2
; $0200 kann in ein Lo-Byte und in ein Hi-Byte zerlegt werden. Ich kenne die Vorgehensweise mit dem "<" Zeichen und dem ">" Zeichen. 
3
LDA <Mem_1 ; lädt Lo-Byte der Adresse ($00), funktioniert ordnungsgemäß
4
LDA >Mem_1 ; sollte das Hi-Byte der Adresse laden ($02). Stattdessen wird der Inhalt von $0200 geladen.
5

6
;das hier wird disassembliert:
7
00:E222 A500                 619:     LDA <MEM_1
8
00:E224 8504                 620:     STA $04        
9
00:E226 AD0002               621:     LDA >MEM_1      ;hier müsste A502 stehen, stattdessen AD0002
10
00:E229 8505                 622:     STA $05
Leider schweigt sich Manual des Autors auf diesen Syntax aus.
Gast #7177166
Lesenswert?

LDA <MEM_1       ; MEMORY DIRECT Pg. 3 - 5
vs.
  LDA #<MEM_1      ; MEMORY IMMEDIATE Pg. 3 - 6

Und ein
  *=*+1

ist nur ein einfaches Increment des jeweiligen Adresszeigers
des Assemblers und kein Voodoo.
Von denen kann es durchaus mehrere geben.
In der Schule haettest du fuer so ausgesprocehn mangelhafte
Kenntnisse des 6502 Assemblers wohl eine 6 bekommen.

Der Leventhal hat uebrigens 633 Seiten.
Fuer mehr als das Vorwort scheint es bei dir nicht gereicht zu haben.
#7177198
Lesenswert?

Cartman schrieb:
> *=*+1
>
> ist nur ein einfaches Increment des jeweiligen Adresszeigers

Nur kenne ich keinen Assembler, wo * ein gültiger Symbolbezeichner oder 
Platzhalter ist. Ein Symbol besteht aus mindestens einem Zeichen und 
darf keine Sonderzeichen beinhalten.
* ist für Multiplikation reserviert.

Auch erlauben Assembler nur eine Aktion je Zeile. D.h. Increment und 
Symboldefinition in der gleichen Zeile sind nicht zulässig.

Schmeißt denn der Assembler keinerlei Warnungen oder Fehler?
Gast #7177212
Lesenswert?

> Increment und
> Symboldefinition in der gleichen Zeile sind nicht zulässig
U.U. fehlten dem Assembler Ausdrucksmittel um Bereiche zu allokieren.
Etwa ein:
  DS

Da kommt dann ein *=*+16 schon handlich.

> keinerlei Warnungen oder Fehler
Vermutlich kennt der Assembler nur 2 Fehler:
- Syntax Error
- Empty input file
Gast #7177384
Lesenswert?

Peter D. schrieb:
> Nur kenne ich keinen Assembler, wo * ein gültiger Symbolbezeichner oder
> Platzhalter ist. Ein Symbol besteht aus mindestens einem Zeichen und
> darf keine Sonderzeichen beinhalten.

Na, da nenne ich dich mal einen Jungspund. Die Verwendung des * für den 
momentanen Stand des Speicherplatz-Zeigers war früher durchaus üblich. 
Allerdings sind solche Ausdrücke wie sie der TO gezeigt hat, nicht 
sonderlich lesefreundlich. Egal ob bei den Daten oder im Code.

Und was die Verwendung von Zeichen für Namen (Symbole, Identifier, 
Marken....) betrifft, da sollte man ins Manual des zuständigen Tools 
schauen, bevor man große Töne spuckt. Tja, bei der ersten Maschine, die 
ich unter den Fingern hatte, waren nur Großbuchstaben und Ziffern 
erlaubt und es durften maximal 4 Zeichen sein. War auch nicht 
berauschend...


Aber für den Bitmontierer wäre mein Ratschlag, auf solche Dinge wie 
"*=*+1" zu verzichten und stattdessen eine Schreibweise zu bevorzugen, 
wie ich sie weiter oben bereits gezeigt hatte - vorausgesetzt, das geht 
bei diesem Assembler überhaupt.

W.S.
Gast #7177389
Lesenswert?

Cartman schrieb:
> In der Schule haettest du fuer so ausgesprocehn mangelhafte
> Kenntnisse des 6502 Assemblers wohl eine 6 bekommen.

Das, wo Bauform B drauf hingewiesen hat, ist kein 6502-Assembler, 
sondern der "Macroassembler AS", also eine auf Multiplattform angelegte 
eierlegende Wollmilchsau, die (angeblich) gefühlte 1000 verschiedene 
Plattformen bedienen kann. Und du rüpelst hier herum.

W.S.
Gast #7177417
Lesenswert?

> Und du rüpelst hier herum.

Nein, es ist der TO der auf einer alten Plattform herumturnen
will und geistig herumruepelt.

Und "das" Standardwerk fuer den 6502 ist nunmal der Leventhal
und der hat offensichtlich ein paar mehr Seiten als die
Doku zum AS.

Den "AS" kenne ich durchaus auch, aber ich benutze dann schon
lieber den "Cross-32 Meta-Assembler". Der u.a. auch den 6502
bedienen koennte.

Nochmal zu der Erguessen des TO:
1
00:E222 A500                 619:     LDA <MEM_1
2
00:E224 8504                 620:     STA $04        
3
00:E226 AD0002               621:     LDA >MEM_1      ;hier müsste A502 stehen, stattdessen AD0002
4
00:E229 8505                 622:     STA $05

Sowohl das ersta "LDA <MEM_1" ist als auch das zweite sind ganz
offensichtlich falsch, da der "immediate" Anteil der Adresse
geladen werden soll. Also eher "A9 00 ... LDA #<MEM_1"
und "A9 02 ....".

Wie man mit solch mangelhafter Kenntnis ernsthaft etwas
"programmieren" will, erschliesst sich mir nicht.
Da fehlen ja schon die "Grundlagen" des 6502.
Von der Beherrschung des Assemblers, Linkers und Lokators
noch ganz abgesehen.
Gast #7177423
Lesenswert?

Cartman schreibte:

LDA <MEM_1       ; MEMORY DIRECT Pg. 3 - 5
vs.
  LDA #<MEM_1      ; MEMORY IMMEDIATE Pg. 3 - 6

Und ein
  *=*+1

Hallo Cartman, aber das ist doch gar nicht der Punkt. Hast du das 
Problem nicht verstanden? Und warum pöbelst du so laut herum? Bist du 
einer dieser nach altem Mann muffelnden Kreaturen die mit einer 
hässlichen Frau veheiratet sind, nichts mit ihrer Zeit anzufangen wissen 
und deshalb wie Stadler und Walldorf aus dem Lehnstuhl heraus jeden 
beleidigen?
Gast #7177513
Lesenswert?

Bitmontierer schrieb:
> Wenn ich schreibe:
> AnodeCounter = $20    ; Counter 7seg. LED Anode 1-4
> VAL2 = $21   ; save accu in DELAY loop
> bitbang_1 = $22
> bitbang_2 = $23
> Dann funktioniert der Code und das Binärfile ist wie gewünscht 8kB groß.
>
> Die Frage ist: Wie kann ich dem Assembler abgewöhnen, das er eine
> zusätzliche Code Section die eigentlich RAM wäre, anlegt?

Ich meine, es ist eher die Frage nach dem Schreibstil. Nun kenne ich 
deinen Assembler nicht, aber das, was du mit deinen Verwendungen von '*' 
da erzeugst, sieht für mich und vermutlich auch den Assembler aus wie 
das Erzeugen von Konstanten aus, die bei Verwendung von * obendrein noch 
irgend ein Attribut "Gehört zu einem Codesegment" abkriegen. Wenn das so 
ist, dann kannst du das dem Assembler überhaupt nicht abgewöhnen, denn 
es ist dann ein gegenseitiges Mißverständnis. Bleibt also nur der Weg, 
es anders zu formulieren.

W.S.
#7177792
Lesenswert?

Bitmontierer schrieb:
> CPU: 6502
>
> Code liegt in $E000 - $FFFF, (8kB für ein entsprechendes EEPROM 2864).
>
> Wenn ich schreibe:
>
1
> ;RAM addresses, zero page:
2
>       * = $20
3
> AnodeCounter =*    ; Counter 7seg. LED Anode 1-4
4
> VAL2      *=*+1   ; save accu in DELAY loop
5
> bitbang_1    *=*+1
6
> bitbang_2     *=*+1
7
>
> Dann wird für mein EEPROM ein 64k File erzeugt, weil der Assembler
> glaubt, eine ROM Section im Bereich $0-$23 anlegen zu müssen.

Ja, ist so gedacht.

> Wenn ich schreibe:
>
1
> AnodeCounter = $20    ; Counter 7seg. LED Anode 1-4
2
> VAL2 = $21   ; save accu in DELAY loop
3
> bitbang_1 = $22
4
> bitbang_2 = $23
5
>
> Dann funktioniert der Code und das Binärfile ist wie gewünscht 8kB groß.

Genau.

> Die Frage ist: Wie kann ich dem Assembler abgewöhnen, das er eine
> zusätzliche Code Section die eigentlich RAM wäre, anlegt?

Was für eine zusätzliche Code-Section? Die in der ersten Variante oder 
gibt es auch mit der zweiten ein Problem?
#7177794
Lesenswert?

Bitmontierer schrieb:
> Ich hab das Beispiel
>
1
> VAL2      *=*+1
2
>
> aus nem uralten Emuf Sonderheft gefunden. Vielleicht ist der Assembler
> an der Stelle nicht kompatibel mit dem damaligen.

Ist eine eher altmodische Syntax, funktioniert aber mit vasm auch. Aber 
damit wird natürlich die aktuelle Adresse gesetzt.

Gängiger wäre etwas wie
1
VAL2 ds 1

> Dann ist noch etwas merkwürdig (Syntax).
> Beispiel:
>
1
> Mem_1 = $0200 ; 16-bit Adresse
2
> ; $0200 kann in ein Lo-Byte und in ein Hi-Byte zerlegt werden. Ich kenne 
3
> die Vorgehensweise mit dem "<" Zeichen und dem ">" Zeichen.
4
> LDA <Mem_1 ; lädt Lo-Byte der Adresse ($00), funktioniert ordnungsgemäß
5
> LDA >Mem_1 ; sollte das Hi-Byte der Adresse laden ($02). Stattdessen 
6
> wird der Inhalt von $0200 geladen.

Nein, Hi-Byte der Adresse wäre LDA #>Mem_1 und erzeugt Opcode A9.
1
> ;das hier wird disassembliert:
2
> 00:E222 A500                 619:     LDA <MEM_1
3
> 00:E224 8504                 620:     STA $04
4
> 00:E226 AD0002               621:     LDA >MEM_1      ;hier müsste A502 
5
> stehen, stattdessen AD0002
6
> 00:E229 8505                 622:     STA $05
7
>
> Leider schweigt sich Manual des Autors auf diesen Syntax aus.

Das vasm-Manual beschreibt das im Kapitel "6502 cpu module => 
Extensions". Da wird auch beschrieben, welche Bedeutung die Modifier im 
Fall von absoluten Adressierungsarten haben ("force 16bit/zpage 
addressing).

Da vasm verschiedene CPU- und Syntax-Module unterstützt, muss man in der 
Doku in den entsprechenden Kapiteln schauen.

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