Posts by alx

    "dec X, a" berechnet die Adresse indem X und (sign extended) a addiert werden. Der Inhalt der Adresse wird dann un 1 verringert.
    "dec X + a" berechnet die Adresse indem X und (zero extended) a addiert werden....
    "dec (X, a)" bedeutet dass eine Adresse aus X+(sign extended) a errechnet wird und dann an der stelle eine andere Adresse geladen wird und die Speicherstelle, auf die das zeigt wird dann um 1 verringert.


    (Edit2: 0x80 sign extended = 0xff80 = -128; 0x80 zero extended = 0x0080 = 128; wenn das oberste bit nicht gesetzt ist, also 0..127, dann machen beide das selbe)


    Gehe ich recht in der Annahme, daß R++ bedeutet "postinkrement um 2" und bei den 16-Bit-Registern angewendet wird?

    Ja, und wenn etwas in Klammern steht dann bedeutet das indirekte Adressierung, wie oben beschrieben. (und ich hatte ja auch geschrieben dass R = X,Y,S,PC und r = a,b ist).



    Und noch eine abschließende Frage: Wie kopiert man den Inhalt des X-Registers in das Y-Register (oder auch S) und umgekehrt?

    Mit "lea" - das ist ein operator der sehr nützlich ist, es ist die Abkürzung von load effective address. Es wird die Ziel-Adresse berechnet (wie oben) aber diese wird dann in das angegebene Register geschrieben (anstelle etwas von da zu laden/speichern). "leax y, -10" sorgt also dafür das y-10 in x geschrieben wird. (oder "leax x,-1" == "dex")



    Edit:
    Die Idee ist bei fast allen Computer die, dass du deine Variablen nicht an festen adressen hast sondern sie irgendwo sind, und sie über eine addition mit einer basis-adresse (z.B. in X oder Y) zu erreichen. Dann baucht man sehr oft nur ein kleiner Offset und der Opcode ist kurz. (Währen beim lda 0x1234 der opcode lang ist und auch noch nicht mal flexibel)
    Zudem ist es mit solchen mitteln temporäre Variablen ganz einfach auf dem Stack zu nutzen. Beispiel:
    leas s, -4 ; reserviere 4 bytes auf dem stack
    lda s, 3 ; liest das letzte reservierte byte
    leas s, 4 ; lösche die 4 bytes vom stack (die daten werden nicht angefasst nur der stackpointer geändert)

    Ich hatte mir auch schon mehrfach Gedanken um eine neue 8-bit CPU gemacht.
    Sie soll so einfach sein, dass man sie hätte auch damals™ bauen können.


    Hier meine aktuellste Idee:

    • Register:

      • 8-bit: A, B, CC (die CC-bits wie beim AVR 8-bit, nur da heisst das register SREG)
      • 16-bit: X, Y, S, PC
    • 2-Byte Befehle:

      • Adressierungs-Modus: R, n7 und (R, n7)
        adca, adda, anda, bita, cmpa, eora, lda, ora, sta, sbca, suba
        ldb, stb
        cmpx, ldx, leax, stx
        cmpy, ldy, leay, sty
        leas
        jmp, jsr
        clr, dec, inc, lsl, lsr, rol, ror, tst
        R = X,Y,S,PC; Register relativ mit 7bit (-64..+63) Offset und ohne oder mit indirektion
        Im zweiten Byte wird das Offset und die indirektion gespeichert (diese Befehle belegen 50% der Opcodes)
      • Adressierungs-Modus: R, r; (R, r); R + r; (R + r); R+; R++; -R; --R; (R++); (--R)
        adca, adda, anda, bita, cmpa, eora, lda, ora, sta, sbca, suba
        ldb, stb
        cmpx, ldx, leax, stx
        cmpy, ldy, leay, sty
        leas
        jmp, jsr
        clr, dec, inc, lsl, lsr, rol, ror, tst
        R = X,Y,S,PC; r = a,b; R, r = r wird als signed angesehen; R + r = r wird als unsigned angesehen
      • Adressierungs-Modus: PC, n8
        brcc, brvc, brne, brpl, bric, brsc, brtc, bra
        brcs, brvs, breq, brmi, bris, brss, brts, brn
        bsr
      • Adressierungs-Modus: i8 (8-Bit-Konstante)
        andai, bitai, cmpai, eorai, ldai, orai, sbcai, subai
        cmpbi, ldbi, sbcbi, subbi
        andcci, bitcci, eorcci, orcci
      • Stack
        pull regs
        pullpc regs (hierdurch können mehrere Register gleichzeitig mit einer Konstante geladen werden: pullpc a,b,x; byte "a"; byte "b"; word "x"; nächste Operation)
        push regs
        regs = beliebige kombination von: A, B, CC, X, Y, S, PC
      • Sonstiges
        wai (gff. interrupt anschalten und warten dass einer eintritt)
        tfr/eab/ect (Transfer bzw. Austausch von 8-Bit-Registern, nur über diesen Weg kann der eingebaute 8-Bit-Port angesprochen werden; Austausch von C und T)
    • 3-Byte Befehle:

      • Adressierungs-Modus: i16 (16-Bit-Konstante)
        cmpxi, ldxi
        cmpyi, ldyi
        ldsi
        jmp, jsr
      • Adressierungs-Modus: addr (16-Bit-Adresse)
        cmpa, lda, sta
        ldb, stb
        cmpx, ldx, stx
        cmpy, ldy, sty
      • Adressierungs-Modus: R, n16 (Register mit 16-Bit-Offset)
        leas S,n16
        leax X,n16
        leay Y,n16
        jmp PC,n16
        jsr PC,n16
    • 1-Byte Befehle:

      • Adressierungs-Modus: Register
        clra, deca, inca, lsla, lsra, rola, rora, tsta
        clrb, decb, incb, lslb, lsrb, rolb, rorb, tstb
      • Adressierungs-Modus: Sonstige
        nop
        reset
        ret
        swi
    • Bemerkungen:
      Falls jemand addai und adcai vermisst, diese können durch die Subtraktion des negierten Wertes erreicht werden (und da das Carry bei add+sub gleich funktioniert ist dieses auch wie von einer Addition erwartet)
      reti gibt es nicht als eigenen Befehl, aber "pull cc,pc" hat das selbe Ergebnis.
      Die Befehle/Adressierungs-Modi sind einfach aus dem Opcode zu entnehmen.
      Das 1. Byte besagt bereits wie viele weitere Bytes folgen (dies ist z.B. beim 6809 anders, an den ich mich aber oft angelehnt habe).
      Der Befehlssatz und die Adressierungs-Modi wurden absichtlich gering gehalten ich bin aber dennoch davon überzeugt dass dies mehr als ausreichend ist.

    Mein hex file ist 435 Bytes, aber das sollte passen (kann je nach chip variieren).


    Wenn du den Programmer im Makefile eingetragen hast kannst du mit `make program` den Chip Programmieren.

    Ich hab' ne Idee für ne kleine Erweiterung aber kann keine Platinen designen.
    Da drauf müssten: 1 mal LQFP64, 1 mal Spannungswandler (incl. kleinkram), 1 mal 1*6 Buchsenleiste, 1 mal 2*3 Stiftleiste, ca. 6 lötbrücken die man bei bedarf aufschneiden oder zulöten kann und es muss in den Expansionsport des C64.
    Wenn jemand Interesse hat... und super wäre es auch wenn du noch zusätzlich die SMD Bauteile drauflöten könntest ;-)

    Warum zur Hölle müsst ihr den immer auf den einzigen anderen Termin im September legen den ich habe (und der steht schon 2-4 Jahre im voraus fest)?

    Das ding nutzt weder ROML noch ROMH, interessant.
    - Versuch mal es auf RAM zu stellen, GAME off und bei EXROM weiss ich es nicht
    - und dann ein einfaches 8k spiel an die richtige stelle zu laden (z.B. das angehängte prg)
    - dann auf ROM stellen
    - "POKE 32772,0" (dies sorgt dafür dass das ins C64-RAM geladene CRT nicht "aktiv" ist)
    - dann EXROM auf on und reset


    Wenn die batterie (zumindest ein bisschen) geht, dann den C64 aus und einschalten.

    Files

    • test.prg

      (8.19 kB, downloaded 6 times, last: )

    In welcher Sprache ist eigentlich der Browser geshrieben? Ich habe gerade mal die Quellen geschaut. Das sieht ja merkwürdig aus. :gruebel

    In einem Strukturierten Assembler, mein eigener da ich keinen guten finden konnte. Besonderer Vorteil: ist nicht eigenständig sondern ist nur eine Bibliothek die zusammen mit eigenen Daten/Funktionen genutzt wird.