Forum: Mikrocontroller und Digitale Elektronik Knightrider lauflicht mit 6809


von Johannes Studer (Gast)


Angehängte Dateien:

Lesenswert?

guten tag !

ich habe mich mal an ein knight rider lauflicht gewagt.
als testumgebung habe ich ein system mit dem 6809 und dem externen
PIA-baustein (8leds, 8schalter).
doch irgendwie funktioniert dieser code nicht.
sieht irgendjemand einen fehler?


gruss

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Zunächst:

Was bringt Dich dazu, ausgerechnet das Excel-Dateiformat zu verwenden?
Warum nicht ... ein Photo im Adobe-Photoshop-Format?

Um Probleme in Deinem Code zu beurteilen, bedarf es noch einiger
Informationen:

Wie ist das System aufgebaut? Welchen Adressraum hat Speicher, an
welcher Adresse ist die 6821 zu finden? Soll das etwa $2800 sein?

Was macht die Funktion Pinit und wo ist deren Quelltext?

Wie wird der Prozessor beim Reset initialisiert?

Anscheinend wird Dein Programm ja von einem Monitor aufgerufen; kümmert
sich der um die Initialisierung des Stacks?

Desweiteren: Was bitte heisst "irgendwie funktioniert dieser code
nicht"?
Könntest Du versuchen, den Fehler etwas deutlicher zu beschreiben?

Rein interessehalber: Wie um alles in der Welt bist Du an ein
6809-System gelangt?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Nachtrag:
Beschreibe bitte detailliert den Inhalt aller Register bei Aufruf von
"main" - was steht beispielsweise in U? Da Du den User-Stack
verwendest, sollte der auch initialisiert sein.

Warum verwendest Du den Userstack? Das Carry-Flag solltest Du auch
anderswo aufheben können, schlimmstenfalls auf dem normalen Stack, den
Du ja auch verwendest (mit JSR).

Achja, und was macht DEL_Xms und wo ist der Quelltext davon?

Hat Dein ROM-Monitor etwa in der Gegend von $3000 eine Art
Einsprungtabelle?

Warum verwendest Du LBNE, wenn bei Deiner Codegröße auch BNE
funktionieren würde?

In Zeile 23 ist LBNE übrigens falsch geschrieben.

Deine Hand-Assemblierung der beiden Branch-Befehle ist nicht in
Ordnung; Branch adressiert relativ zum Programmzähler.

Du schreibst

  0247  LBNE lauf_links

(lauf_links ist bei 0238), und übersetzt das mit dem Opcode 10 26 02
38. Das springt an die Adresse 047F (0247 + 0238)

Tatsächlich aber müsstest Du den PC nicht um 0238 erhöhen, sondern um
000F reduzieren, so daß Dein Opcode besser 10 26 FF F0 lauten sollte.

Der 16-Bit-Offset ist hier aber ganz unnötig, so daß Dein Programm
durch die Verwendung von BNE um jeweils zwei Bytes kürzer wird:

0247 BNE lauf_links, was sich mit 26 F0 übersetzen lassen müsste.


Es ist bei mir schon seeehr lange her, daß ich mich das letzte Mal mit
6809-Assembler beschäftigt habe; meine Berechnung der Sprungziele bei
Branch-Befehlen mag ungenau sein und um einige Bytes danebenliegen.
Du solltest in Deiner Dokumentation des 6809 noch mal genau nachlesen,
wie exakt die Branch-Befehle funktionieren.

Es gibt beim 09 keine absolut adressierenden bedingten Sprünge, wie sie
von anderen Prozessoren wie Z80 etc. her bekannt sind. JMP und JSR sind
die Ausnahmen.

Dank BSR (und LBSR) lassen sich übrigend Programme vollkommen
relokatibel schreiben, das bedeutet, daß das Programm funktioniert,
egal, an welche Adresse im Speicher es in übersetzter Form geladen
wird.

von Toni V. (Gast)


Lesenswert?

Ich finde es toll dass auch mal ein älteres System
von jemanden wieder aktiviert wird...
Rufus hat eh schon alles gesagt, -läufts eigentlich
schon? Dieser Code müsste eigentlich auch funktionieren, es fällt
dabei die Sicherung des Carry-Flags weg, (push usw. kann man
weglassen).



  ...
  LDA #$01
lauf_l  ASLA
  STA LED
  JSR DEL_Xms
  TFR A,B
  SUBB #$80
  BNE lauf_l

  LDA #$80
lauf_r  LSRA
  ...



---------
DEL_Xms

  (PSHS)
  ....
LOOP  DEY
  BNE LOOP
  DEX
  BNE LOOP
  (PULS)
  RTS

von Johannes Studer (Gast)


Angehängte Dateien:

Lesenswert?

vielen dank schonmal für die ausführlichen antworten.
ich muss euch leider enttäuschen. ich habe hier lediglich so ein
schulungssystem  .. dokumentation konnte ich bis jetzt noch nicht
auftreiben ..

das mit dem LBNE hab ich jetzt kapiert, es ist ja eine relative
adressierung. das habe ich jetzt auch mal soweit gefixt. doch jetzt
leuchten nur die 2 leds von rechts.

das carryflag habe ich zwischengespeichert, weil mir die DEL_Xms immer
das carryflag gelöscht hat.

im anhang nochmals meinen momenanen code.


vielen dank nochmals im voraus.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Oh.



Das mit dem Photoshop-Format war nicht wirklich ernstgemeint.

Eine simple Text-Datei wäre vollkommen ausreichend.

Deine Branches funktionieren immer noch nicht. BNE erwartet einen
vorzeichenbehafteten Offset. Du gibt 0F an, das ist positiv. Also
springt BNE "nach vorne", und nicht zurück.

Mach Dir das Leben nicht unnötig schwer und besorge Dir einen
symbolischen Assembler, der übernimmt für Dich das Berechnen der
Sprungziele etc.

von Johannes Studer (Gast)


Lesenswert?

stimmt. ich habs jetzt aber mal geändert. ich habe mit $F0 und $F1
probiert. geht nicht ..

0247  26 F0 BNE $F0

0247  26 F0 BNE $F1


'symbolischen Assembler' .. gibt der maschinencode aus ?  ich kann
eben bei meinem system lediglich maschinencode eingeben ..


vielen dank für eure mühe,

gruss johannes

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Ein symbolischer Assembler (wobei man das Wort "symbolisch" eigentlich
auch weglassen kann) erzeugt aus Assembler-Quelltext ausführbaren
Maschinencode, macht also genau das, was Du von Hand machst.
Dein Assemblerquelltext steht in der dritten und vierten Spalte (wenn
man die Kommentare übersieht).

Ein 6809-Crossassembler sollte das Problem lösen. Das ist ein
Assembler, der zum Beispiel auf einem PC läuft, aber Maschinencode für
6809 erzeugt.

Es gibt übrigens auch die Möglichkeit, einen 6809-Rechner auf einem PC
zu simulieren; eine Seite, die verschiedene Simulatoren und auch
sonstige Dokumente auflistet, ist http://koti.mbnet.fi/~atjs/mc6809/
Da finden sich auch mehrere (cross-) Assembler.

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.