Hallo Besucher, der Thread wurde 3,3k mal aufgerufen und enthält 19 Antworten

letzter Beitrag von kinzi am

Problem mit dem indirekten JMP Befehl

  • Ich emuliere mit VICE einen CBM8032.


    In einem Listing habe ich einen Hinweis gefunden es wären indirekte JMP ($xxFF) Befehle zu vermeiden deren Adresse auf FF endet.


    Da habe ich mir gedacht das probierst Du jetzt selber aus.


    Erst habe ich einen JMP ($10FE) versucht. Das hat problemlos funktionert.


    Dann habe ich einen JMP($10FF) versucht und von VICE eine Fehlermeldung "CPU Jam at $B016" bekommen.


    wieso mag die PET keine JMP ($xxFF) Befehle?

  • Ein 6502 Bug/Quirk.

    The 6502's memory indirect jump instruction, JMP (<address>), is partially broken. If <address> is hex xxFF (i.e., any word ending in FF), the processor will not jump to the address stored in xxFF and xxFF+1 as expected, but rather the one defined by xxFF and xx00 (for example, JMP ($10FF) would jump to the address stored in 10FF and 1000, instead of the one stored in 10FF and 1100). This defect continued through the entire NMOS line, but was corrected in the CMOS derivatives.

  • Das liegt nicht am PET, sondern am NMOS-6502. Die CPU-Varianten in C64 und Konsorten haben das gleiche Problem. Bei einem JMP($10FF) wird der Vektor nicht von $10ff und $1100 geholt, sondern von $10ff und $1000. Es fehlt schlicht und einfach die Anpassung des High-Bytes.


    ACME gibt eine Warnung aus, wenn sowas assembliert wird.


    EDIT: Beim CMOS-Redesign des Prozessors wurde das behoben, im C65 z.B. würde der Fehler nicht auftreten.

  • Danke!


    Das ist sehr aufschlußreich.


    Ich habe mir eben gerade auch gedacht, es müsse an der CPU liegen, denn das 6502er Listing, das ich abtippe, ist aus einer Zeit, da gab es noch keinen 8032.


    Da steht in den CMOS Derivaten sei der Fehler behoben worden.


    woher kann ich erkennen daß in meinem 8032 eine CMOS CPU und keine NMOS CPU habe?


    Könnte ich die in einer echten PET problemlos gegeneinander austauschen?

  • woher kann ich erkennen daß in meinem 8032 eine CMOS CPU und keine NMOS CPU habe?

    Kannst Dir ja ein Testprogramm basteln: Einen solchen JMP machen und beide Adressen mit sinnvollen Werten belegen. An den einen Ziel steht eine Routne, die "alles ok" ausgibt, an der anderen eine Routine, die "CPU hat JMP-Bug" ausgibt.

  • ich würde das nicht als Fehler seitens MOS ansehen wollen.


    vielmehr hat man einen gegenüber dem MC6800 deutlich billigeren Prozessor zu bauen angestrebt und dafür einiges auf der Chipfläche "freigeräumt". Heute las ich in einem Wiki, dass der 6502 nach neuesten Erkenntnissen mit nur 3510 Transistoren aufgebaut ist.


    Da ist eben die 16bit-Addition (bzw. ihr Übertrag / "Carry"-Berücksichtigung) für den Adreßzähler beim indirekten Sprung "hinten runtergefallen".
    Und das Problem zu umgehen lässt sich auch mit der Faustregel beschreiben: "den Vektor für Jmp indirect nur auf geraden Speicheradressen ablegen". Dann kommt man automatisch nie an die Pagegrenze, denn die ist ja ebenfalls geradzahlig.

  • Der 6502 hat tatsächlich ein paar Gatter mehr als der 6800, aber er ist deutlich kleiner, weil er den Adreßbus nicht abschalten kann. Damit bekommt man nicht nur mehr Chips pro Wafer, sondern auch eine höhere Ausbeute an 'guten' Chips.


    Ein weiteres Rotstift-Opfer waren die vielen Zwischenspeicher zwischen den internen Baugruppen. Beim 6502 wird zum Beispiel der Stapelzeiger in der normalen ALU inkrementiert/ dekrementiert. Und da das SP-Register in dieser Zeit leer steht, wird es bei JSR-Befehlen mal eben als Zwischenspeicher hergenommen- 'richtige' Prozessoren haben dafür extra ein zusätzliches, normalerweise unsichtbares Adreßregister.


    Dafür sind die Zeropage-Index-Adressierungsmodi deutlich komplexer als das, was andere 8-Bit-CPU so bieten.

  • Halte ich für keine sehr gute Idee, wenn Deine Software auf jedem beliebigen CBM8032 laufen soll. Wenn die Software nur für Dich ist, dann ists natürlich egal.

  • Kann er doch...und den Datenbus noch dazu...

    Nein, der normale 6502 kann den Adressbus nicht abschalten, deshalb gibt es im VC-20 die 74LS245 zwischen CPU und VIC. Erst der 6510 bekam die nötigen Gatter und das AEC-Signal.


    Den Datenbus kann der 6502 hingegen abschalten, wäre auch komisch wenn nicht, wie sollte er sonst aus dem RAM oder ROM lesen können wenn er die Ausgangstreiber nicht abschalten kann?

  • Kann man somit sagen, dass obige Aussagen bzw. Verbesserungen

    Der 6502 hat tatsächlich ein paar Gatter mehr als der 6800, aber er ist deutlich kleiner, weil er den Adreßbus nicht abschalten kann. Damit bekommt man nicht nur mehr Chips pro Wafer, sondern auch eine höhere Ausbeute an 'guten' Chips.

    ... von MOS / CSG bei der Schaffung des 6510 wieder revidiert wurden? Denn durch das Wiedereinfügen der ehedem weggelassenen Adreßbus-Treiber mit ihrer Treiberleistung (=Flächenbedarf auf dem Chip) müsste ja die Anzahl der Chips pro Wafer und die Ausbeute an "Guten Chips" wieder gesunken sein ...
    es sei denn, die Verfahrenstechnik wäre inzwischen weiter fortgeschritten (Lernkurve).

  • Hi Gerrit,

    Nein, der normale 6502 kann den Adressbus nicht abschalten, deshalb gibt es im VC-20 die 74LS245 zwischen CPU und VIC. Erst der 6510 bekam die nötigen Gatter und das AEC-Signal.

    So man 1 Pin des 6502 abschaltet schaltet sich der 6502 ab und somit geht der Adressbus hochommig.
    Nach einschalten des Pins startet der 6502 wieder neu.
    So könnte ein anderer Prozessor das System übernehmen.


    Gruß Jogi


    PS Commodore macht das selbst in einem Commodore Computer...

  • ich finde auf die Schnelle das Datenblatt nicht, aber der 6504 zumindest hat auf Pin 1 den RESET-Anschluß.


    Meinst du wenn man den auf Low legt - und dann aber LOW belässt statt wie beim normalen Reset nur einen kurzen Impuls? Ich kann mir vorstellen, dass der Adreßbus dann insofern (relativ) hochohmig wird als er %1111 1111 1111 1111 ausgibt, was nur mit den relativ schwachen Pullup-"Transistoren" geschieht, die man leicht von außen übersteuern kann.

  • So man 1 Pin des 6502 abschaltet schaltet sich der 6502 ab und somit geht der Adressbus hochommig.Nach einschalten des Pins startet der 6502 wieder neu.

    Pin 1 ist einer der Stromversorgungspins. Wenn man die Stromversorgung des Prozessors abschaltet und noch Signale an den anderen Pins anliegen, befindet sich der Chip in einem Betriebszustand jenseits seiner erlaubten Betriebsbedingungen und es ist nicht nur sein Verhalten undefiniert, er kann dadurch auch dauerhaft beschädigt werden.


    Zitat

    PS Commodore macht das selbst in einem Commodore Computer...

    Bitte keine Nebelkerzen sondern Fakten: Welcher?

  • Hi,

    Pin 1 ist einer der Stromversorgungspins. Wenn man die Stromversorgung des Prozessors abschaltet und noch Signale an den anderen Pins anliegen, befindet sich der Chip in einem Betriebszustand jenseits seiner erlaubten Betriebsbedingungen und es ist nicht nur sein Verhalten undefiniert, er kann dadurch auch dauerhaft beschädigt werden.

    Das hättest du mal besser Commodore erklährt die wusten das scheinbar nicht.


    Lustig wie aus "1 Pin abschalten" Pin 1 wird...


    Es ist Pin 8.


    Der Computer ist der Commodore MMF9000/Superpet.


    Pläne zu finden... http://www.zimmers.net/anonftp…s/pet/SuperPET/index.html


    Gruß Jogi

  • Pin 1 ist beim 6502 Vss, also GND. Man kann diesen Pin also nicht "auf LOW legen", weil er bereits auf LOW liegt und das für einen ordentlichen Betrieb auch so sein muss. :)


    http://archive.6502.org/datash…_preliminary_aug_1975.pdf



    [EDIT] Und Pin 8 ist Vcc. Klar, wenn ich den abschalte, dann hält der 6502 an. :rolleyes: Und wenn ich wieder Saft draufgebe läuft er wieder los.[/EDIT]

    "Wenn du überredet, ermahnt, unter Druck gesetzt, belogen, durch Anreize gelockt, gezwungen, gemobbt, bloßgestellt, beschuldigt, bedroht, bestraft und kriminalisiert werden musst. Wenn all dies als notwendig erachtet wird, um deine Zustimmung zu erlangen, dann kannst du absolut sicher sein, dass das, was angepriesen wird, nicht zu deinem Besten ist." - Quelle unbekannt.


    "Steve Jobs hat User hervorgebracht, Jack Tramiel Experten." - Quelle unbekannt.

    "Mein Herr, ich teile Ihre Meinung nicht, aber ich würde mein Leben dafür einsetzen, dass Sie sie äußern dürfen." - Voltaire.

    "Diskutiere nie mit einem Idioten - er zieht dich auf sein Niveau hinunter und schlägt dich dort mit seiner Erfahrung!" - Volksweisheit.


    Einmal editiert, zuletzt von kinzi ()

  • Steht im zitierten Schaltplan extra noch dabei: "VCC" ...

    "Wenn du überredet, ermahnt, unter Druck gesetzt, belogen, durch Anreize gelockt, gezwungen, gemobbt, bloßgestellt, beschuldigt, bedroht, bestraft und kriminalisiert werden musst. Wenn all dies als notwendig erachtet wird, um deine Zustimmung zu erlangen, dann kannst du absolut sicher sein, dass das, was angepriesen wird, nicht zu deinem Besten ist." - Quelle unbekannt.


    "Steve Jobs hat User hervorgebracht, Jack Tramiel Experten." - Quelle unbekannt.

    "Mein Herr, ich teile Ihre Meinung nicht, aber ich würde mein Leben dafür einsetzen, dass Sie sie äußern dürfen." - Voltaire.

    "Diskutiere nie mit einem Idioten - er zieht dich auf sein Niveau hinunter und schlägt dich dort mit seiner Erfahrung!" - Volksweisheit.


  • Der Pin wird gar nicht auf GND gezogen, der bleibt offen.


    Auch wenn man die Stromversorgung an Vcc abschaltet ist das nicht unproblematisch- Stichwort Schutzdioden und parasitäre PN-Übergänge. Kurz gesagt: es kann passieren daß ein stromloser Chip versucht, seine Versorgungsspannung aus den ganzen Busleitungen zu beziehen- das ruiniert mindestens mal die Funktion der übrigen Schaltung und richtet schlimmstenfalls Schaden an, sowohl bei dem eigenen Chip als auch beim Rest der Schaltung. Wenn man _weiß_ daß es unproblematisch ist, kann man es so amchen- und es war 'damals' auch ein beliebter Trick für größere Eprom-Bänke mit ihrem hohen Stromverbrauch.


    (und natürlich stammt die SuperPET-Erweiterung nicht von Commodore selbst, sondern von der University of Waterloo in Kanada...)


    Tante EDIT bemerkt aus dem Hintergrund, daß ein RESET der CPU bei jedem Bus-Master-Wechsel wenig hilfreich ist, wenn man z.B. ein Videosignal mit den CPU-Zyklen verschachteln will, a la VC20. Da könnte man den Chip ja gleich per Hand aus dem Sockel ziehen und wieder stecken, 1000 mal 8 mal 50 Mal pro Sekunde...

  • Fakt ist, dass der 6502 - im Gegensatz zum 6510 - den Bus nicht gezielt abschalten kann; sieht man mal von der "Triviallösung" der Abschaltung der Versorgungsspannung ab - mit all den von @mc71 korrekt skizzierten Problemen.


    Damit könnten wir ja eigentlich zurück zum Thema ... :)

    "Wenn du überredet, ermahnt, unter Druck gesetzt, belogen, durch Anreize gelockt, gezwungen, gemobbt, bloßgestellt, beschuldigt, bedroht, bestraft und kriminalisiert werden musst. Wenn all dies als notwendig erachtet wird, um deine Zustimmung zu erlangen, dann kannst du absolut sicher sein, dass das, was angepriesen wird, nicht zu deinem Besten ist." - Quelle unbekannt.


    "Steve Jobs hat User hervorgebracht, Jack Tramiel Experten." - Quelle unbekannt.

    "Mein Herr, ich teile Ihre Meinung nicht, aber ich würde mein Leben dafür einsetzen, dass Sie sie äußern dürfen." - Voltaire.

    "Diskutiere nie mit einem Idioten - er zieht dich auf sein Niveau hinunter und schlägt dich dort mit seiner Erfahrung!" - Volksweisheit.