Bastelprojekte (Computer bezogen)

  • Der Vorteil von 6502 ist die sehr einfache Erlernbarkeit. Für praktisch jedes Problem gibt es genau eine gute Lösung. Beinahe schon RISC (im Vergleich zu Z80).


    Als ich vor 40 Jahren noch den C64 mit Assembler traktiert habe, habe ich Parameter praktisch immer in der Zero Page übergeben. Das ist einfacher als auf dem Stack. Zur "Signatur" einer Routine gehörten also die Adressen (und selten auch Registernamen A, X oder Y), in denen die Parameter vorliegen. Spätestens wenn man mit den Parametern arbeiten will, braucht man sie sowieso in der Zeropage. Das ist ja quasi die 2te Registerbank des 6502.


    Beim Z80 kann man fast immer die Parameter in Register(paaren) übergeben. Mit a, bc, de, hl, ix, iy und noch der zweiten Registerbank hat man eigentlich immer genügend Register frei.

  • Man kann das auch so sehen: Beim Z80 mit den vielen Registern, die aber keine 'Universalregister' sind, hat man immer das falsche Argument im falschen Register - Kann einem mit dem 6502 nicht passieren ;)

  • Ich meine nur, für echtes modulares Programmieren, ist der Stack ziemlich bescheiden. Da wundert es, wie überhaupt 'modernere' sinnvolle Betriebsysteme für den 6502 via Compiler(?) entstehen konnten.

  • Ich meine nur, für echtes modulares Programmieren, ist der Stack ziemlich bescheiden. Da wundert es, wie überhaupt 'modernere' sinnvolle Betriebsysteme für den 6502 via Compiler(?) entstehen konnten.

    Man muß halt ein bißchen anders denken: Zum Programmieren braucht man keinen Stack.

  • Eigentlich bräuchte der 6502 doch eigentlich nur einen - je nach Kontext - umschaltbaren Stack. Dann wäre da genug Platz und man müßte sich auch keine Gedanken machen, ob jetzt alles wieder aufgeräumt ist.


    Also 6502 Assembler Programmierung ist schon eine sehr gewöhnungsbedüftige, bzw. umständliche Sache.da


    Das ist witzig, weil das Leute, die eher vom 6502 kommen, genau andersherum sehen würden. Von da aus gesehen ist eigentlich alles (!) andere megakompliziert. Etwa solche Konstrukte wie bei der Z80 mit 2 "halben" Registern für 16 Bit.


    Für die Parameterübergabe: gewöhn Dir einfach an, die in irgendwelche freien Stellen zw. $00 und $ff zu schreiben, und schon paßt das ganz prima.

    -- 1982 gab es keinen Raspberry Pi , aber Pi und Raspberries

  • ... schreibt der einfach 6309 da hin, ...
    Aber ich hab vor ein paar Wochen erfahren, dass der 6309 im EPSON HX20 drinnen steckt und das es eine 6809 "Variante" ist. 6809 war sich ein recht guter Prozesor.

    Aber kurz zurück zu meinem 6502 Problemchen:
    Ich hatte einen netten C-Code für ein kleines SID Demo gefunden in C schön elegant und Modular.
    Übersetzbar mit dem cc65 Compiler, für den C64, es funktionierte auch sofort im VICE Emulator.
    Dann habe ich mir mal den SID.S Assembler Code angeschaut, die übergeben da Parameter auch über den Stack,

    benutzen dafür aber ein paar eigenartige Lib Funktionen. evtl. werwenden die da einen emulierten Stack.
    So weit hab ich es nicht untersucht.

    Dann wollte ich auch Parameter über den normalen 6502 Stack übergeben, in meinem Fall maximal fünf 8Bit Parameter.
    Z.B. so:
    lda #$12 ; Param 4

    pha

    lda #$34 ; Param 3

    pha

    lda #$56 ; Param 2
    pha

    lda #$78 ; Param 1

    pha

    lda #$AA ; Param 0

    jsr my_funktion

    sta <Ergebnis>

    ...


    So wollte ich das halt machen.
    Geht auch, nur in der my_funktion muss man die Parameter da einzeln wieder raus kratzen, was auch schon geht.
    Hierzu hab ich eine getParam Funktion gebastelt und schon getestet.
    Aber das alles ist eigentlich schrecklich kompliziert und unhandlich.
    Dann wollte ich in der Funktion den Stack wieder korrigieren (noch unerledigt).
    Rückgabewert der Funktion über Akku.

    Das alles war zwar recht interessant, ist aber unsinnig.
    Besser man legt die Parameter doch in die zero Page auf fixe Adressen.

    Oder hat jemand eine andere bessere Idee ?

    Evtl. sollte man diese Diskussion tatsächlich in einen Thread umpacken, z.B. 6502 Programming Tricks odere so.

    6502 Erfahrung habe ich so gut wie keine.
    Andererseit ist der Prozessor schon irgendwie interessant.
    Er war ja nicht umsonst so extrem erfolgreich.

    mfG. Klaus Loy

  • Erfolgreich war er wohl v.a., weil er spottbillig war. Und das hat mit dem Befehlssatz o.ä nicht viel zu tun - eher mit der Zukunftsvision und den Wünschen des "Erfinders" (CP).


    Den Stack kann man auch manuell bedienen, weil man immer weiß, wo der gerade steht und man die Sachen da auch direkt reinschreiben kann und dann mit TSX und TXS den Stackpointer anpassen kann. Evtl. kommt dir das ja entgegen. Üblich ist aber eben wirklich - wie tofro oben schon geschrieben hat - sowas einfach anders zu machen. Beim 6502 (7501/8501) ist die Zeropage quasi sowas wie ein erweiterter Registersatz. Die schnellen Zugriffe dort kompensieren die fehlenden Register; aber man muß das natürlich auch so benutzen. Ist also mehr ein Frage des "Umdenkens". Man kann sich den 6502 auch als eine Art ARM mit nur einem Register denken, dann wird es evtl. verständlicher, was da jetzt noch komplex erscheint. Kurz: Ja, das Ding ist eigentlich eine sehr sehr reduziertes und rudimentäres Teil, aber genau das macht wohl den Reiz aus.

    -- 1982 gab es keinen Raspberry Pi , aber Pi und Raspberries

  • > Zeropage quasi sowas wie ein erweiterter Registersatz
    schon klar.


    Aber ich hätte halt gerne nur mit "lokalen Variablen", ohne fixe Adressen gearbeitet.
    Das hätte ich elegant gefunden, dafür wurde dann aber Code "schrecklich".

    > Erfolgreich war er wohl v.a., weil er spottbillig war.
    Auch klar. Aber er musste wohl auch technisch gut gewesen sein, sonst hätte es da nice sie coole und ausgeklügelte Software dafür gegeben.

    mfG. Klaus Loy

  • Das geht schon auch, dafür nimmt man indiziert indirekte Y Adressen. D.h. LDA ($D0),Y oder sowas.

    Da Deine Funktion weiß, wieviel Nummer sie erwartet, zählt sie dann einfach das Y hoch oder runter (INY,DEY) und eine Variable wird es, weil man den Inhalt von $D0/$D1 anpassen kann. Allerdings ist das dann auch relativ langsam.


    .data

    .5000 A0 B0 C0 B0 A0 90 80 70

    .5010 anderer 'Variablen'satz

    .5020 und noch einer


    LDA #$00

    STA $D0

    LDA #$50

    STA $D1


    .funktion

    LDY #$04

    LDA ($D0),Y

    use variable

    DEY

    BNE nächste Variable holen



    Auch klar. Aber er musste wohl auch technisch gut gewesen sein, sonst hätte es da nice sie coole und ausgeklügelte Software dafür gegeben.

    Hätte ich normalerweise auch so gesagt, aber mittlerweile würde ich schon denken, daß reiner Preis auch reicht. Die ganzen Homecomputers hätte es bei normalen Motorola Prozessorpreisen erst 8 Jahre später gegeben. Zumindest kann man das so sehen, daß das größte Geschenk von Chuck Peddle "an die Welt" war, daß er den Ablauf der Zeit beschleunigt hat - gekommen wäre das bestimmt, aber eben nicht so flott.


    Technisch "genial" ist am 6502 nicht so wirklich viel - aber es ist ein extrem gelungener minimalistischer Mix. Die Sachen gab es alle vorher schon woanders auch oder auch genau andersherum, aber hier hat es eben gut funktioniert und der Anbieter hat nicht so sehr aufs Geschäftliche geachtet. Die anderen mußten dann nachziehen - man müßte mal nach Z80 Angeboten zw. z.B. 1977 und 1983 schauen - gibt sicherlich eine eindrucksvolle Kurve.

    -- 1982 gab es keinen Raspberry Pi , aber Pi und Raspberries

  • Wen die "andere Philosophie des Programmierens" des 6502 interessiert, dem empfehle ich diese Videoserie. Dort hat jemand CP/M auf den 6502 portiert und das zeigt schon ein bißchen, wie man das mit dieser CPU macht, unter anderem auch mit einem automatischen Mechanismus zur Belegung der Zero Page und Runtime Relocation. Verfolgt man das, kann man sich ein bißchen einfühlen, wie man solche Projekte angeht - Das "Überstülpen" der Vorgehensweise, wie man das mit dem Z80 machen würde, funktioniert halt einfach nicht.

  • @ThoralfAsmussen,
    ich schau mal, ob ich meinen unfertigen Code auf ZeroPage Parameter umstelle.


    @tofro,
    danke für den Link, das werde ich mir rein ziehen.
    Schade, dass ich ab heute schon wieder zur Arbeit muss.
    Aber in Bayern ist ja der 06.01. ein Feiertag :)

    Bitte schieb diese coolen CP/M mit 6502 Link in den coole YouTube Thread rein.

    mfG. Klaus Loy

  • Aber ich hab vor ein paar Wochen erfahren, dass der 6309 im EPSON HX20 drinnen steckt und das es eine 6809 "Variante" ist.

    Es ist ein "aufgebohrter" 6809 mit erweitertem Register- und Befehlssatz von Hitachi.


    Was die im HX20 verwendete CPU betrifft, so widerspricht sich die deutsche Wikipedia. In der Kurzbeschreibung der technischen Daten wird zwar tastsächlich 6309 aufgeführt, aber im Fließtext steht 6301. Die englische Fassung spricht nur von 6301, ich denke, das kommt auch hin, also wohl doch keine 6309 im HX-20.

  • Technisch "genial" ist am 6502 nicht so wirklich viel - aber es ist ein extrem gelungener minimalistischer Mix. Die Sachen gab es alle vorher schon woanders auch oder auch genau andersherum, aber hier hat es eben gut funktioniert und der Anbieter hat nicht so sehr aufs Geschäftliche geachtet. Die anderen mußten dann nachziehen - man müßte mal nach Z80 Angeboten zw. z.B. 1977 und 1983 schauen - gibt sicherlich eine eindrucksvolle Kurve.

    Das geniale am 6502 ist nicht nur das einfache und damit günstige Design. Er ist auch schnell. Ein 1 MHz 6502 ist unterm Strich ungefähr so schnell wie ein 3 MHz Z80 (bei einem Programm mit vergleichbarer Funktionalität). Dazu muss man sich nur mal die Anzahl der Befehlszyklen anschauen. Es gibt im Netz einige Artikel dazu.


    Ein großer Nachteil des 6502 ist der kleine Stack. Dadurch sind Sprachen wie zum Beipiel C oder andere Sprachen mit lokalen Variablen oder das was Klaus hier vor hat, nicht so einfach umzusetzen.

    • i-Telex 7822222 dege d

    • technikum29 in Kelkheim bei Frankfurt

    • Marburger Stammtisch

    Douglas Adams: "Everything, that is invented and exists at the time of your birth, is natural. Everything that is invented until you´re 35 is interesting, exciting and you can possibly make a career in it. Everything that is invented after you´re 35 is against the law of nature. Apply this list to movies, rock music, word processors and mobile phones to work out how old you are."

  • Ein großer Nachteil des 6502 ist der kleine Stack.

    Mindestens ebenso schlimm finde ich, dass es keine echten 16 Bit Zeiger gibt. Wenn man einen Zeiger inkrementiert, muss man immer manuell prüfen, ob es einen Überlauf in's höherwertige Byte gab.

  • Ein großer Nachteil des 6502 ist der kleine Stack.

    Mindestens ebenso schlimm finde ich, dass es keine echten 16 Bit Zeiger gibt. Wenn man einen Zeiger inkrementiert, muss man immer manuell prüfen, ob es einen Überlauf in's höherwertige Byte gab.

    Aber das macht ja gerade den schlanken Befehlssatz aus. Wenn man 16 Bit-Register haben will, kann man ja den Z80 nehmen.

    Jedes zusätzliche Feature hätte den 6502 teurer gemacht. Der eine will 16-Bit-Register, der andere eine großen Stack, der nächste hat noch irgendwelche tollen Ideen... ;)

    • i-Telex 7822222 dege d

    • technikum29 in Kelkheim bei Frankfurt

    • Marburger Stammtisch

    Douglas Adams: "Everything, that is invented and exists at the time of your birth, is natural. Everything that is invented until you´re 35 is interesting, exciting and you can possibly make a career in it. Everything that is invented after you´re 35 is against the law of nature. Apply this list to movies, rock music, word processors and mobile phones to work out how old you are."

  • Das alles war zwar recht interessant, ist aber unsinnig.
    Besser man legt die Parameter doch in die zero Page auf fixe Adressen.

    Hallo Klaus,


    die Parameterübergabe via Stack ist natürlich sehr Compiler zentriert. Bei einem Compiler ist die Übergabe in einem Stack Frame, bei ansonsten wenigen vorhandenen Registern die am einfachsten zu realisierende Möglichkeit für einen "standardisierten" Aufruf.

    In Assembler würde ich beim 6502 bei mehr als drei Parametern (in den Registern A,X,Y) immer die Zeropage nehmen und als Parameter eventuell einen Zeiger auf diesen Bereich übergeben. Hierfür hat der 6502 mit seinen Index Befehlen einfach einen genialen Befehlssatz, da du dann über die einzelnen Bytes des Übergabevektors z.B. mit LDA ZP-Adresse,X oder auch LDA (ZP-Adresse),Y drüber iterieren kannst.

  • Ein großer Nachteil des 6502 ist der kleine Stack.

    Mindestens ebenso schlimm finde ich, dass es keine echten 16 Bit Zeiger gibt. Wenn man einen Zeiger inkrementiert, muss man immer manuell prüfen, ob es einen Überlauf in's höherwertige Byte gab.

    Das ist doch typisch RISC. Gab in der Chip #1 ja den schönen Vergleich Block move mit 6502/1MHz und Z80/40 Mhz. Der Z80 Code sieht schön klein aus, der 6502 ist aber schneller.

  • Bin gerade dabei, mein Atari 1010 und 1050 zu reparieren.

    Bei beiden sind die Riemen defekt.

    Für das Cassettenlaufwerk hab ich welche gefunden. Für das Floppy leider noch nicht.


    Retrogaming und klassische Computer