Der RESET beim C64

Es gibt 35 Antworten in diesem Thema, welches 7.121 mal aufgerufen wurde. Der letzte Beitrag (20. Januar 2014 um 10:59) ist von Gerrit.

  • Gerrit: Also ich werde mir das jetzt mit x64 auf VICE einmal ansehen was das im DRAM steht (mein echter C64 ist gerade auseinandergerupft)

    Dennoch wäre es dann interessant zu erfahren wieso beim C64 eben das in den Speicherzellen steht das in den Speicherzellen steht.

    Bei meiner PET hatte ich früher immer angenommen die AA kämen von einem destruktiven Speichertest.

    In Sachen PET hat einer mir einer jedoch gesagt der Speichertest wäre eben NICHT destruktiv.

    Dann kam bei mir jedoch die Frage auf wieso steht beim Einschalten AA in den Speicherzellen.

  • Beim 8032 war der Speichertest destruktiv. Zumindest der Teil, der sich um das BASIC-RAM kümmerte. Müsste dann beim PET dasselbe sein.

    Bei einem nicht destruktiven Test ergibt sich das Bitmuster beim Einschalten aus der Schaltung des DRAMs, also welche Zellen werden invertiert behandelt (die sind 1) und welche nicht (die sind 0). Das ist abhängig von Hersteller und Revision des RAMs. Wäre diese partielle Invertierung nicht drin wären alle Bits Null (und damit die Bytes $00).

    Wegen der Invertierung... Für den Benutzer des RAMs ist das nicht relevant, er bekommt immer genau das geliefert was er reinschreibt. Ob das geschriebene '1'-Bit als geladener oder leerer Kondensator repräsentiert wird ist nach aussen nicht sichtbar. Nur nach dem Einschalten kannst du es sehen, sobald deine Daten drinstehen ist es nicht mehr erkennbar.

  • Der C64-Speichertest liest erst den Speicher ab $0400 byteweise aus, schreibt erst $55 und dann $aa rein, liest beide Werte ebenfalls aus und prüft damit, ob sie noch drin stehen. Danach wird der Ursprungswert rekonstruiert. Der Test hört auf, wenn zum ersten Mal der zuletzt geschriebene Wert ($55 oder $aa) *nicht* ausgelesen wird, das ist üblicherweise der Fall, wenn das Basic-ROM erreicht ist ($a000). Das letzte Byte wird dann nicht rekonstruiert (ist ja eh "kaputt"), weshalb an $a000 im RAM eben $aa stehenbleibt. Wie auch immer, diese Adresse wird Memory-Top ($0283/84), woraus sich dann "Bytes free" errechnet. Nachzulesen im ROM ab $fd68 (dort muss $00 im Y-Register stehen, für die, die da probehalber mal einspringen wollen).

    Arndt

    GoDot C64 Image Processing
    Bitte melde dich an, um diesen Link zu sehen. - Bitte melde dich an, um diesen Link zu sehen. - Bitte melde dich an, um diesen Link zu sehen.
    Bitte melde dich an, um diesen Link zu sehen. - Bitte melde dich an, um diesen Link zu sehen. - Bitte melde dich an, um diesen Link zu sehen.

  • Ich hatte eben noch erfahren daß der C64 bei seinem Speichertest den wert AA verwendet.

    Das hat mich wohl zu der Analogie verleitet der Speichertest beim C64 wäre der gleiche wie bei einer 8032 weil bei einer 8032 immer AA im leeren Speicher steht.

    Langsam lüftet sich der Nebel.

    Jedenfalls gehe ich jetzt davon aus was auch immer ich nach dem hochfahren bei einem C64 im Speicher finde das ist was im Speicher steht nach dem Einschalten der Versorgungsspannung da der Speíchertest bei einem C64 nicht destruktiv ist.

  • Allerdings ist $A000 überschrieben, weil das letzte byte nicht wiederhergestellt wird. Bei ROM-Cartridge entsprechend $8000.

  • Wenn das Muster nach dem Einschalten doch je Ram und sonst was verschieden ausfallen kann, wie kann sich dann ein Programm auf konsistente Einschaltwerte verlassen.., wie du es meinst ? Das beides (Vorposting und Antwort) zusammen widerspricht sich so doch.

    Das ist böse, denn wenn man eine Mischbestückung verschiedender Hersteller hat (gabs auch schon ab Werk, ich habe einen C64 mit RAMs von 3 Herstellern!) sind die 0 und 1 Bits nach dem Einschalten unterschiedlich verteilt und es ist nichts mehr mit 00 und FF in festen Blöcken.


    wie schon gesagt ... in der theorie kann man sich da nicht drauf verlassen da die werte zufällig sind. in der praxis gibts aber jede menge programme mit zb fehlerhaften depackern, welche hinter dem gepackten programm an einer pagegrenze eine 0 erwarten - und diese programme funktionieren (fast) immer. das legt nahe das das resetmuster in wirklichkeit nicht gar so zufällig ist wie man denken möchte :)

  • Bei DRAMs ist das Muster eben nicht zufällig sondern in der Maske des jeweiligen RAMs kodiert. Zufällige Muster findest du nur bei SRAM. Aber je nach Hersteller ist das Muster unterschiedlich.

    Wer allerdings davon ausgeht, daß nicht benutzter Speicher einen bestimmten Wert enthält sollte seinen Beruf wechseln, als Programmierer taugt er nicht.

  • Wer allerdings davon ausgeht, daß nicht benutzter Speicher einen bestimmten Wert enthält sollte seinen Beruf wechseln, als Programmierer taugt er nicht.


    mit absicht macht das auch keiner - hoffentlich :)

  • Zitat

    mit absicht macht das auch keiner - hoffentlich :)


    Nun ja, früher habe ich das mal gemacht. Ich wusste es nicht besser. :wink:

  • Jetzt ist mir gerade gekommen ich könnte den RESET Vektor in der Zeropage verbiegen bevor ich einen RESET auslöse.

    Dann wird hoffentlich noch vor einem Speichertest irgendwo anderes hin verzweigt?


    Was sehr gut geht, ist dem C64 vorzugaukeln, es würde ein Cartridge stecken:

    Einfach folgendes:

    Code
    ldx #9
    cbm80
    lda reset_vektor-1,x
    sta $8000-1,x
    dex
    bne cbm80
    
    
    reset_vektor; 9 bytes
    !byte $0b,$08,$0b,$08,$c3,$c2,$cd,$38,$30; restart at $080b CBM80...)


    Klartext: an Adresse $8000 schreibt man zwei mal die gewünschte Reset-Adresse (jeweils LowByte-HiByte) und den Text CBM80

    Es sind keine anzeigbaren Aktivitäten vorhanden.

    Einmal editiert, zuletzt von :TheRyk (6. Januar 2014 um 17:09)

  • Die Reset-Routine schreibt 55 & AB nicht AA. Für AA hätte man ASL verwenden müssen, wegen CMP und Carry-Flag.

    :prof:

    Es ist praktisch unmöglich, ein schnelles Programm zu schreiben, wenn man es in Basic programmiert.

  • Die Reset-Routine schreibt 55 & AB nicht AA.


    Warum schaust du nicht ins ROM? Natürlich wird $55 und $aa verwendet ($aa durch ROL). Findest du ab $fd68, wie schon mal erwähnt...

    Arndt

    (Edit)

    GoDot C64 Image Processing
    Bitte melde dich an, um diesen Link zu sehen. - Bitte melde dich an, um diesen Link zu sehen. - Bitte melde dich an, um diesen Link zu sehen.
    Bitte melde dich an, um diesen Link zu sehen. - Bitte melde dich an, um diesen Link zu sehen. - Bitte melde dich an, um diesen Link zu sehen.

  • Sieht auf dem ersten Blick so aus, aber weil CMP das Carry-Flag setzt wird dieses durch den ROL wieder mit ins A-Register geschoben. Der Progger hätte besser ASL verwenden sollen.

    Es ist praktisch unmöglich, ein schnelles Programm zu schreiben, wenn man es in Basic programmiert.

  • ausserdem steht nach dem test bei $a000 natürlich $55 und nicht $aa (oder $ab) :)

  • Eigentlich sind bei DRAMs alle Speicherzellen beim Einschalten Null (Kondensator der Zelle leer), aber anscheinend wird die Hälfte der Matrix invertiert behandelt. Gibt sicher einen technischen Grund dafür, nur kenne ich den nicht.


    Damit versucht man, die Energiemenge im Chip auf einem "halben" Level zu halten. Ein Muster aus Code und Tabellen kann durchaus große Strecken Ähnlicher Muster oder gar größere Strecken Nullen und $ff enthalten, aber selten ein Muster aus "gerade pages $00, ungerade pages $ff". Mit der nun besser vorhersagbaren Energiemenge die im Chip gespeichert werden muss, ist auch die Stromaufnahme einfacher zu dimensionieren.

    Damals war man noch auf dem Trip, dass ein Chip immer nur einen Masse- und einen Versorgungspin hatte. Erst in den frühen 90er Jahren ist man auf die Idee gekommen, auch die Bias-Voltage Vbb nach außen zu führen um sie extern mit einem Kondensator zu stützen, und seit die Chips immer größere Leistungsaufnahme haben ist man sich einig, dass rund ein Drittel der Pins für Stromversorgung geopfert werden muss. Spätestens wenn man den Chip so gut an die Versorgung angekoppelt hat, braucht man sich keine Krücken mehr auszudenken, wie man die statistische/durchschnittliche Stromaufnahme einer Speicherzeile reduziert.

    Jens

    Bitte melde dich an, um diesen Link zu sehen. - Das offizielle iComp Supportforum ist online.

  • Naja, bei DIP kann man nicht einfach so mal ein paar Pins hinzufügen, auch bei PLCC nicht, der IC wird einfach zu groß (siehe 68000, 64pins und gigantischer IC), aber sobald man bei PGA oder BGA ist hat man durch die zusätzliche Dimension weniger Probleme in dieser Richtung.

    Vbb erinnert mich an den 8375 beim Amiga... Der braucht einen Kondensator für Vbb, der von der Funktion her identische 8372 brauchte das noch nicht. Mir ist bisher keine Erklärung dafür untergekommen. Die-shrink so daß der on-Die Generator für Vbb nicht mehr reichte und einen Kondensator brauchte?