Hallo Besucher, der Thread wurde 5,5k mal aufgerufen und enthält 43 Antworten

letzter Beitrag von markusC64 am

16k bzw. 24k Kernal

  • Der eien oder andere von Euch kennt vielleicht ja 64er DOS V4. Das hat ja bekanntlich einen 16k Kernal im C64.


    "Leider" wird dort die Bankumschaltung über die Datasettenleitung "Sense" gemacht, was einen offensichtlichen Nachteil hat: Mit jener Hardwarelösung bekommt man es nicht hin, dass die Datasette mit einem Custom 16k Kernal weiterhin funktioniert. Dabei ist einer der Vorteile eines 16k Kernals, dass man eigentlich nicht Funktionen rauswerfen muss.


    Daher also die Frage, wie würdet Ihr die Bankumschaltung machen? Da das in der 1541 Ultimate II+ (und wenn es passt, auch in der 1541 Ultimate II) implementiert werden soll, müssen wir mit den Signalen, die am Expansionsport liegen, auskommen.


    Aus technischen Gründen können übrigens maximal 3 Bänke auf der 1541 Ultimate II(+) realisiert werden - idealerweise würde die Bankumschaltlogik also jene 3 Bänke auch ausschöpfen. (Bemerkung: Beim U64 mag das anders sein, da werden ggf. mehr Bänke realisierbar sein. Denn dort ist man nicht auf den Expansionsport eingeschränkt).


    PS: Aus naheliegenden Gründen wird natürlich die 64er Umschaltlogik auf jeden Fall enthalten sein. Aktuell ist davon ja nur eine funktionsmäßig eingeschränkte "Technology Preview" enthalten).




    Nachtrag: Natürlich könnte man ein Byte im IO1 bzw. IO2 nehmen. Bedenken gibt es dann zu Konflikten mit Modulen.

  • Schreibzugriff auf $d100 oder sowas ? So wird das z.B. im DTV gelöst ...


    DTV_Programming

  • Ich würde eine Logik einbauen, die abhängig von einem Lesezugriff auf eine bestimmte ROM-Adresse, die normalerweise nicht angesprungen wird (den "RRBY"-String z. B.), die Bank umschaltet. Natürlich nur, wenn per $01 auch ROM eingeblendet ist. Eventuell auch zwei oder drei oder vier Lesezugriffe hintereinander in einem bestimmten Muster (erst "B" lesen, dann ein "R", dann das "Y").


    Das dürfte in der Praxis nie vorkommen und sollte transparent sein.

    "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.


  • Schreibzugriff auf $d100 oder sowas ? So wird das z.B. im DTV gelöst ...

    Danke für den Vorschlag.



    Tja, da wären wir genau an der Stelle "wir müssten mit den Signalen des Expansionsport" auskommen. So ganz sehe ich noch nicht, wie man da hinkommen soll.


    Weder RONL, ROMH, IO1, IO2, ... signalisieren uns, dass auf $d1xx zugegriffen wird, uns fehlt also technisch gesprochen das /CS Signal.


    Nun denn, wir können Bus Sniffing machen. Aber dann erwischen wir auch alle Zugriffe aus das darunterliegende RAM, ohne das zu bemerken. Beim Dual SID des U2(+) mag das noch ok sein, dann klingt es im Zweifel mal daneben. Aber wenn die Kernalbank sich unbeabsichtigt wechselt, dann crashed alles.


    Ich sehe auch nicht, dass man eine Logik so ähnlich wie die Logik von Skow machen könnte, die ein Kernal-Repalcement erlaubt - und somit das CS-Signal für das Kernal-ROM rekonstruiert, ohne es zu haben.



    PS: Beim U64 müsste Gideon allerdings an das CS Signal rankommen... So gesehen ist die Lösung schon mal eine, die man als "weitere Implementierung" im Hinterkopf behalten sollte.

  • peiselulli


    Doch, deshalb das bestimmte Muster "out of order", lies bitte nochmals genau meinen Vorschlag. ;-)


    Drei LDAs sind außerdem gleich schnell wie ein LDA, ORA, STA fûr irgendein Portbit.

    "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.


  • Ich würde eine Logik einbauen, die abhängig von einem Lesezugriff auf eine bestimmte ROM-Adresse, die normalerweise nicht angesprungen wird (den "RRBY"-String z. B.), die Bank umschaltet. Natürlich nur, wenn per $01 auch ROM eingeblendet ist. Eventuell auch zwei oder drei oder vier Lesezugriffe hintereinander in einem bestimmten Muster (erst "B" lesen, dann ein "R", dann das "Y").

    Die Idee ist es wert, nachzugehen. Wobei man natürlich berücksichtigen muss, dass bei den Lesevorgängen zwischendurch die CPU aus dem ROM den nächsten Befehl mit Parametern holen muss. Das schlägt sich im Zugriffsmuster nieder.

  • Hatte ich auch erst mal drüber nachgedacht. Funktioniert bloss nicht, wenn ein Programm das komplette ROM von $e000-$ffff oder von $a000-$bfff in das darunter liegende RAM kopiert, um es zu modifizieren.

    Wohl wahr. Deswegen braucht man ja eine ganze Zugriffssequenz, die so designed ist, dass die beim Auslesen halt nicht vorkommt.

  • dass bei den Lesevorgängen zwischendurch die CPU aus dem ROM den nächsten Befehl mit Parametern holen muss

    Stimmt. Dann könnte man stattdessen Schreibzugriffe nehmen. Sollte auch nicht vorkommen und man kann es mit R/W verknüpfen.

    "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.


  • Stimmt. Dann könnte man stattdessen Schreibzugriffe nehmen. Sollte auch nicht vorkommen und man kann es mit R/W verknüpfen.

    Halte ich für eine gefährliche Idee - der Kernal ändert dadurch das darunterliegende RAM ab.

  • Z. B.:


    FFF6 52 52 42 59 R R B Y


    STA $FFF8

    STA $FFF6

    STA $FFF9

    STA $FFF7


    Sollte in der Praxis nicht vorkommen.

    "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.


  • Halte ich für eine gefährliche Idee - der Kernal ändert dadurch das darunterliegende RAM ab.

    Auch richtig. dann Lesezugriffe und die Opcode-Fetches werden ignoriert, die haben dann ja, weil es lauter LDAs sind, eine feste Breite, wenn ich nicht irre.

    "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.


  • Möchte wetten, dass Geos dort Daten liegen hat (Geos belegt eigentlich die ganzen 64k). Und ein Schreibzugriff aufs ROM geht nunmal ins darunterliegende RAM.

  • Opcode-Fetches werden ignoriert

    Erkennt man die irgendworan - wenn man nur die Leitungen des Expansionsportes beobachten kann?

  • Erkennt man die irgendworan - wenn man nur die Leitungen des Expansionsportes beobachten kann?

    Ich bin jetzt kien 6502-Spezialist, aber die sollten als ganz normale Lesezugirffe daher kommen (R=1). Die CPU holt den Opcode und macht für die Dauer der Verarbeitung in jedem Takt den gleichen Zugriff wieder. Es gubt Überlappungen, wenn der Befehl nur noch intern abgearbeitet wird und kein Buszugriff mehr benötigt wird, wie beim LDA, dann wird schon der nächste Opcode geholt.


    Ungefähr so (genau wird es nicht stimmen, da muss ein Experte ran):


    CPU holt nächstenb Opcode (hier für LDA $xxyy, LDA $xxxx braucht 4 Takte)

    CPU holt LSB (xx)

    CPU holt MSB (yy)

    CPU holt Wert von $xxyy ; den hier brauchen wir!, der erste

    CPU holt nächsten Opcode (hier für LDA $xxyy, LDA $xxxx braucht 4 Takte)

    CPU holt LSB (xx)

    CPU holt MSB (yy)

    CPU holt Wert von $xxyy ; den hier brauchen wir, der zweute

    CPU holt nächsten Opcode (hier für LDA $xxyy, LDA $xxxx braucht 4 Takte)

    CPU holt LSB (xx)

    CPU holt MSB (yy)

    CPU holt Wert von $xxyy ; den hier brauchen wir, der dritte

    CPU holt nächsten Opcode (hier für LDA $xxyy, LDA $xxxx braucht 4 Takte)

    CPU holt LSB (xx)

    CPU holt MSB (yy)

    CPU holt Wert von $xxyy ; den hier brauchen wir, der vierte

    "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.


  • Im Zweifel hilft da die Ultimate 64, die kann die Signale des Expansionsportes (genauer: fast alle) in Echtzeit zum PC per Ethernet schicken. Da sieht man dann genau, was anliegt, während man ein bestimmtes Programm laufen lässt.


    Wie auch immer, jetzt ist erst einmal Arbeiten angesagt. Ich melde mich später wieder.

  • Wenn man den 6510 durch einen 6502 ersetzt und den Prozessorport extern implementiert, stehen 2 zusätzliche Bits am Port zur Verfügung. Da die Manipulation dieser Bits die Font des Commodore 128 verändert, ist Software generel bereits so geschrieben, dass sie diese Bits nicht berührt, so dass die Folgen für die Kompatibilität begrenzt sind. In Kombination mit den bestehenden Konfigurationslinien LORAM, HIRAM und CHAREN kann die Anzahl der möglichen Konfigurationen des C64 von 8 auf 32 erhöht werden, genug, um einige KERNAL-Banken zu implementieren. Darüber hinaus sind alle Speicherkonfigurationsbits auf demselben Register besonders elegant.

  • Für die Ultimate64 und möglicherweise andere neue C64-Boards ist die obige Idee realisbaar. Nicht für den 1541U2, weil er in einem Original-C64 funktionieren muss. Also eine Idee, die mit dieser möglich ist. Der 1541U2 wendet bereits über seinen "alternate KERNAL" den Trick an, den Wert von HIRAM herauszufinden. So weiß der 1541U2, ob die Adresse auf dem Adressbus aus ROM oder RAM gelesen wird. Man könnten eine magische Adresse implementieren, die den Bankswitch auslöst.


    Zum beispiel:


    lda $f200 ; switch to KERNAL bank 0

    lda $f201 ; switch to KERNAL bank 1

    lda $f202 ; switch to KERNAL bank 2

    lda $f203 ; switch to KERNAL bank 3


    Um es sicherer zu machen und es vor versehentlich aus dem ROM lesender C64-Software zu schützen, konnte der 1541U2 testen, ob der vorherige Speicherzugriff (das Lesen des Befehls durch die CPU) ebenfalls vom KERNAL kam.


    Vom architektonischen Standpunkt aus gesehen ist dies ein viel unschönerer Hack als der vorherige, aber wahrscheinlich sehr effektiv.

  • Es liegt doch der komplette Adress-Bus an, dann kann man sich das CS selbst "ausrechnen".

    Aber nicht die Info, ob mit $D100 RAM, Char-ROM oder I/O gemeint ist.

    Ein einzelner Read ist ganz schlecht, weil wenn die ROM-Routine, die um $F200 herumliegt abgearbeitet wird knallt's, wenn auch nur der Opcode von der CPU geholt wird, der an $F20x liegt.


    Die Lösung sollte auch ohne Umbau des C64 auskommen. Die oben skizzierte Methode steht prinzipiell auch am ROM-Sockel zur Verfügung. Man muss also lediglich das Kernal durch das neue "ROM" inkl. der notwendigen Logik ersetzen.

    "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.