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