C128-Programmierer gesucht

  • Hier kann man das nachlesen. :tüdeldü:


    Vollständige VDC-Unterstützung für den C64-Modus - Forum64
    Hallo!Ich bin auf der Suche nach einer Sammlung an Routinen, die es komplett ermöglichen, den VDC vom C64-Modus aus zu unterstützen.Es gibt zwar diverse…
    www.forum64.de

  • Richtig. Aber die scheinen nicht richtig mit Einsteigern klarzukommen. Könnt ihr das?

    Mit Verlaub: das ist - wie Du an der Diskussion drüben vielleicht gemerkt hast - nicht unbedingt ein Einsteiger-Thema. Und das liegt nicht an Assembler oder Basic, sondern an der Hardware, und gilt gleich doppelt, wenn es nicht nur auf Deinem C-128 laufen soll, sondern auf jedem und mit jeder VDC-Revision (und auf jedem C-64 und mit jeder SID-Revision zuverlässig nicht abstürzen soll).


    Was Du wirklich suchst, scheint nicht unbedingt jemand zu sein, der Dir hilft, sondern jemand, der Dir eine fertige Bibliothek zur Verfügung stellen kann -- richtig?

  • Bisher scheint es ja noch keine komplette Routinensammlung gegeben haben, die den VDC im C64-Modus

    vollständig wie im C128-Modus initialisiert. Also wäre es ja nicht schlecht, wenn mir da jemand was zur

    Verfügung stellen kann. Aber so ganz notwendig ist das ja gar nicht, denn die meisten Sachen habe ich ja

    aus dem C128-ROM auch angepaßt. Es fehlen mehr oder weniger noch Details.


    Die Char-Copy-Routine verwendet die Routine $FF74, um auf das Char-ROM im C128-Modus zuzugreifen.

    Das geht aber im C64-Modus nicht. Es wäre also am sinnvollsten, die Adresse vom aktuell benutzten VIC-

    Charset als Basis zu verwenden und von dort aus 4096 Bytes in die VDC-Register zu schieben. Ich habe die

    Routine vor mir und sehe an INX, INY, DEY, INC usw. daß da irgendwelche Loops ablaufen, aber was genau

    passiert kann ich nicht sagen. Dazu war das 128-ROM-Listing nicht gut genug dokumentiert.

  • Hier, such nach "Set Up 80". CE27: 20 74 FF JSR $FF74 ; indfet Bank LDA (fetchvec),y ist der Teil, der im C64-Modus nicht geht.


    Ja, den VDC kann man vom C64-Modus aus benutzen. Eye of the Beholder nutzt ihn als Automap. Das Spiel schaltet optional den VIC in der Zeit, wo der Rasterstrahl nicht sichtbar ist, den C128 auf 2 MHz. Damit bekommt man eine Taktfrequenz von ca. 1,3 MHz.


    Das Demo 'Risen from Oblivion' kann man glaube ich auch aus dem C64-Modus starten, auch die VDC-Version. Die neuen Register des VIC-IIe im C128 lassen sich natürlich auch vom C128-Modus aus nutzen. Eye of the Beholder nutzt die Zusatztasten des C128, die werden ja im VIC-IIe abgefragt.

  • Richtig. Aber die scheinen nicht richtig mit Einsteigern klarzukommen. Könnt ihr das?

    Das würde ich nicht so sehen. Da wird gerne bei allen Problemen rund C64 und Derivate geholfen. Gerade auch bei Einsteigern.

    Das Problem dort ist ja eher, dass du die Tipps mangels Assemblerkenntnisse nicht verstehst.

    Deswegen die Hinweise, dass man sich erst mal mit Assembler beschäftigen sollte, wenn man Assembler programmieren möchte.

  • Dann verstehe ich deine Reaktionen im F64-Thread nicht. Aber egal. Bin wieder raus.

  • Für mich ist es ganz einfach unverständlich, weshalb man nicht einfach mal jemandem helfen kann.

    Ich mache das immer, wenn ich kann.


    Ich kann auch mieses zwischenmenschliches Verhalten nicht leiden. Wenn Leute anstatt nützlicher

    Ergebnisse nur viel Energie in Beleidigungen und Vorwürfe bringen, aber keine nützlichen Ergebnisse

    vorweisen, ist das doch nicht akzeptabel.


    Wenn ihr den Forum64-Thread verfolgt, dann sagt mir mal, wie viel Sinnvolles die anderen zu dem Thread

    beigetragen haben. Und wenn detlef jetzt abhaut, ist er auch nicht diskussionsfähig.

  • Habe ich schon gesehen, das hilft nicht so recht. Es geht ja erst mal darum, den VDC zu initialisieren.

    Der nächste Schritt wäre es also, eine Tabelle mit den Standarddaten in die VDC-Register zu schieben.

    Das wäre die hier:


    Code
    7FB3  .BYTE  00 7F 01 50 02 66 03 49
    7FBB  .BYTE  04 26 05 19 06 19 07 20
    7FC3  .BYTE  08 20 09 E7 0A A0 0B E7
    7FCB  .BYTE  0C 00 0D 00 0E 00 0F 00
    7FD3  .BYTE  14 04 15 00 16 78 17 E8
    7FDB  .BYTE  18 20 19 40 1A F2 1B 00
    7FE3  .BYTE  1C 2F 1D E7 22 7D 23 40
    7FEB  .BYTE  24 F5 FF


    Das ist jeweils abwechselnd das Register und der Wert. $ED ist das Abschlußbyte.

    Die Hauptänderung ist die Zeichenfarbe, die ist jetzt weiß auf blau wie beim C65.

    Es muß also ein Loop sein, der Register und Wert aus der Tabelle liest und dann

    mit den VDC-Write-Routinen setzt. Beim Wert $FF wird der Loop beendet.

    Ich hatte irgendwo mal eine VDC-Routine gefunden, die diese Tabelle verwendet,

    da war die für NTSC. Ich habe sie bisher habe ich sie aber nicht wiedergefunden.

  • Hallo TeSoto,


    leider kann zu den technischen Aspekten nichts beisteuern - das sind zu viele "böhmische Dörfer" für mich...


    Allerdings habe ich als unbeteiligter, neutraler Beobachter mal den Thread im F64 durchgelesen. Ehrlich gesagt kommt die Verschärfung des Tons von Deiner Seite und ich kann die folgenden Reaktionen dort gut nachvollziehen. Vielleicht solltest Du Deine Beiträge dort noch mal - jetzt mit etwas Abstand - im Kontext lesen und neu(?) bewerten...


    Bei geschriebenen Texten im Internet fehlen so viele Komponenten der Kommunikation: Stimmlage, Mimik und Körpersprache. Viel zu schnell versteht man etwas falsch und ist ab da in einem Zug der immer weiter auf der Schiene geradeaus fährt. Es ist zugegeben schwierig diesen Zug anzuhalten, in Ruhe noch mal alles zu betrachten und dann seine Beiträge zu korrigieren oder sich auch zu entschuldigen, weil man einfach etwas "in den falschen Hals bekommen hat".


    Ich versuche immer, alle Texte von anderen wohlwollend und positiv zu verstehen, hier und da mal mit einem Witz oder einer kleinen Stichelei muss ja auch erlaubt sein. Wenn ich mir unsicher bin, frage ich konkret nach, wie etwas gemeint ist. Aber als beleidigte Leberwurst kommt man in der Regel nicht allzu weit...


    Viele Grüße und viel Erfolg mit Deinem Projekt!

    Lars

  • zu den technischen Sachen


    Irgendwie ruft der da die FETCH Routine auf, die anscheinend Sachen aus einer RAM Disk nach irgendwohin umlopiert. Das setzt a.) voraus, daß eine RAM Disk da ist (REU) bzw. die entsprechende Bank bestückt ist und b. gibt es wohl bei alten Varianten des OS genau da einen Fehler. Man sollte also evtl. eine passende Kernal Version benutzen.


    Im C64 Mode steht ziemlich sicher nicht an Adresse $02a2 eine Kopierroutine - wäre so meine Vermutung. Da solltest Du mal direkt schauen, zumindest wird dorthin gesprungen und dort mit eingestellter Bank und Bytezahl umkopiert.



    Der bei einem alten ROM auftretende Fehler ist bei "1985" https://www.c64-wiki.de/wiki/FETCH_(BASIC_7.0) erwähnt.




  • zum allgemeinen Verständnis für alle


    $D600-$D601
    C128 memory mapping and reference guide
    c128lib.github.io


    bei $D600 sind die Zugriffe auf den Chip möglich. Dabei hat der verschiedene Register. Um ein Register zu lesen/beschreiben wird im X Register die Nummer des gewünschten Registers übergeben und nach $D600 geschrieben. Über den Akku wird nach $D601 geschrieben/gelesen - wo dann jeweils das gewünschte Register (Nr. aus X / $D600) eingeblendet ist.


    Um das zu beschleunigen kann man für das Register No 31 auch direkt auf $CDCA springen. Da wird die #$1F direkt gesetzt und man kann sich ein LDX sparen.


    Warum ist das so "seltsam" ? Der 128 Videochip kann so einen Art "MemoryTransfer" oder "BlockCopy" - von seinem private-RAM nach außen, aber nicht von allein (wäre wohl zuviel verlangt). Dazu wird eine Startadresse übergeben und dann kann durch wiederholtes Schreiben auf Register 31 ein weiters "Datum" (Byte) kopiert werden, wobei aber immerhin die Adresse (Start/Ziel) automatisch hochgezählt wird. Das ist nicht ganz schnell (echter Blitter), aber schneller als Selbermachen.


    https://c128lib.github.io/Reference/Vdc#vdcinternalregister

    (siehe (fast) ganz unten bei memory read/write)



    .


    Da Du schreibst, daß der Abbruch bei dem JSR $FF74 kommt und anscheinend ja Dein Rechner irgendwie nicht komplett abraucht (normalerweise sagt ein Videochip bei falschen Werten oder auch nur leicht vom zugelassenen abweichenden relativ schnell Bescheid - in Form komischer oder schwarzer Bildschirme), sollte man dem da folgenden mal nachgehen. Und der landet eben bei der FETCH Routine, von der man annehmen könnte, daß sie im 64er Mode gar nicht komplett funktioniert - weil sie das auch nicht muß und evtl. die benutzten Bereich im unteren RAM beim 64er schon für andere Sachen mißbraucht werden.

  • poste doch mal deinen Quellcode mit Kommentaren, wo es klemmt. Die Initalisierung aus der Registertabelle, der Zugriff auf den Speicher, und damit das Ausgeben von Text, kann jetzt nicht das Problem sein?


    Ich bin bei Assembler auch nur Fussgänger. Aber das scheint für mich nur eine Fingerübung zu sein? Oder ich verstehe das Problem nicht.


    Über menschliches oder unmenschliches Verhalten müssen wir hier nicht diskutieren. Ist halt so, und wer sich gerne und freiwillig mit der Thematik dieser Foren beschäftigt muss zwangsläufig andere Defizite haben. Jeder weiss das, jeder akzeptiert es und geht damit um. Wenn nicht: Problem ;)

    Zuletzt repariert:
    19.11. Toshiba 3,5" Floppy defekter Elko durch Kerko getauscht auf Motorplatine
    27.11. 1541B Dauerlauf, Elko im Resetschaltkreis defekt, nicht der 7406 wie zuerst verdächtigt!
    21.5. PET2001 zweimal 7805 Regler getauscht, 6540-010 durch Adapter ersetzt, sowie 3x 6550

  • ThoralfAsmussen


    Also von wegen RAM Disk sehe ich in der Charset-Routine nichts. Es gibt einen Aufruf nach $FFCA. Das ist ein Pointer für die Routine $F7D0, um die MMU umzuschalten, daß man ans Character Memory kommt. Das gibt es aber im C64 heraus, also kann der Aufruf JSR $FF74 ; indfet Bank LDA (fetchvec),y raus. Er muß jetzt durch etwas ersetzt werden, daß man auf einem C64 nutzen kann. Man muß der Routine die Werte übergeben, die sonst von der MMU kommen. Nur wie und wo werden diese Daten von der MMU abgelegt? Da sind eben die C128-Programmierer gefragt, die sich mit der MMU auskennen.


    Die Werte sollten die Adresse sollte auf den aktuell verwendeten VIC-Zeichensatz zeigen. Dazu müssen die Register beim VIC ausgelesen werden und an die Routine weitergegeben werden. Das dürfte nicht allzu schwierig sein, aber ich kann das nicht.

  • Die vom Forum 64 sind nicht offen für neue Dinge. Ich habe auch diverse Hardwareprojekte vorgeplant, die allesamt eins gemeinsam haben: Sie sind kompatibel zur Original-Hardware und man kann sie selbst zusammenbauen. Deshalb braucht man nur die Platine produzieren und sie werden günstig. Aber an so etwas hat da niemand Interesse, die kaufen lieber für mehrere hundert Euro irgendwelche FPGA-Nachbauten.


    Ich bin ja ein großer Fan der Flash 8. Meine läuft inzwischen mit 9 MHz, nur durch Tausch des 32 MHz-Quarz gegen ein 36 MHz-Quarz. Ich habe ZIP-RAM mit 60 ns bekommen, es sind Kühlkörper drauf und anstelle des 120 ns-EPROM kommt ein 45 ns-EEPROM drauf. Damit halte ich mich an die Spezifikationen der Flash 8. Und meine läuft total stabil, seit Jahren. Aber die kapieren das nicht. Irgendwann hat irgendjemand mal das Gerücht gestreut, daß die instabil wäre und das glauben alle. Dabei wäre es mal hochinteressant, die Daten des verwendeten MACH 130 CPLD's herauszubekommen. Vielleicht war Rossmöller nachlässig genug, das Leseschutz-Bit nicht zu setzen, ansonsten müßte man das mal per Reverse Engineering machen. Die Flash 8 besteht neben DIP-65C816 und ZIP-RAM sonst nur aus ein paar TTL-Bausteinen, man könnte sie ebenfalls leicht nachbauen. Aber an sowas besteht da kein Interesse. Warum? Man könnte so für wenig Geld eine Turbokarte für jeden C64 bekommen.


    Den Kernal der Flash 8 habe ich übrigens überarbeitet. Das JiffyDOS 6.01 war so etwas zusammengestückelt, ich habe das mal aufgeräumt und habe einige neue Befehle hinzugefühgt, z.B. um den 65C816 in den 8- oder 16 bit-Modus zu schalten. Die Flash 8 hat auch ein 32K-ROM in Bank 31, das ist der Adressbereich $1F0000 bis $1F7FFF. Das wäre ein idealer Platz für ein neues Basic, z.B. von Ardndt Dettke's optimiertes Tuned Simons' Basic. Dann kann man das Basic V2 in den ersten 64K abschalten und hat mehr BASIC-RAM. Oder man verlegt den BASIC-Speicher komplett in den hohen Bereich und hat dann 960 KB BASIC RAM. Und bei einer Geschwindigkeit von 9 MHz kommt man mit BASIC gut aus. Aber: es müßte sich mal jemand daran machen, den MACH 130 auszulesen. Die Modifikationen des F8-Kernals habe ich übrigens in einem 8-seitigen Dokument genau dokumentiert.

  • Also bzgl Mach auslesen musst du dich mal an User wenden, die schon die CMD SCPU128 nachgebaut haben. Es gibt Möglichkeiten, müsstest du aber selbst ergreifen.


    toms01  fhw72

    Zuletzt repariert:
    19.11. Toshiba 3,5" Floppy defekter Elko durch Kerko getauscht auf Motorplatine
    27.11. 1541B Dauerlauf, Elko im Resetschaltkreis defekt, nicht der 7406 wie zuerst verdächtigt!
    21.5. PET2001 zweimal 7805 Regler getauscht, 6540-010 durch Adapter ersetzt, sowie 3x 6550

  • Ich habe bisher alles versucht, irgendwo einen CPLD auszulesen, kein Erfolg.


    Eine SuperCPU 128 habe ich auch, aber ich habe sie nie eingesetzt. Sie ist mir zu klobig, paßt nicht an mein C128-Setup.

    Am C64 geht sie nicht, da ich kein passendes Netzteil habe. Die Flash 8 läuft sogar mit der alten BBGRAM 2 MB per

    Y-Adapter am Standard-Netzteil. Zusammen mit einer BBGRAM/NeoRAM 2 MB hat man unter GEOS 3 MB RAM, das

    reicht für zwei RAM 1581. Mit 9 MHz ist GEOS ein Traum.


    Das jemand versucht, die SuperCPU nachzubauen, habe ich kurz überflogen. Aber so richtig scheint es ja noch nicht

    zu werden. Dazu wird das Ding sehr teuer. Bei der Flash 8 kommt man bei 65C816, ZIP-RAM und EEPROM auf knapp

    35 Euro, dazu noch ein paar Euro für Sockel, TTL-Bauteile und Quarz. Wenn die Platine nicht zu teuer wird, könnte man

    sich also für knapp 60 Euro eine Turbokarte zusammenlöten. Nur den MACH 130/131 zu bekommen wird schwierig.

  • Der SCPU128 Nachbau funktioniert, aber du hast recht, er ist sehr teuer. Ich habe einen.


    Beim Auslesen wird dein MACH wahrscheinlich zerstört. Das Risiko musst du eingehen. Bei der SCPU128 hat sich jemand gefunden, der dies getan hat. Der muss jetzt mit einer Kopie leben, da sein Original zerstört ist.


    Wenn man die Logikterme dann hätte, könnte man die auch auf einem leichter erhältlichen 5V Chip brennen.

    Zuletzt repariert:
    19.11. Toshiba 3,5" Floppy defekter Elko durch Kerko getauscht auf Motorplatine
    27.11. 1541B Dauerlauf, Elko im Resetschaltkreis defekt, nicht der 7406 wie zuerst verdächtigt!
    21.5. PET2001 zweimal 7805 Regler getauscht, 6540-010 durch Adapter ersetzt, sowie 3x 6550

  • Jetzt aber zurück zu der Zeichensatzgeschichte. Hier sind einige Informationen über den VIC-II.


    Im Register $DD00 befindet die aktuelle VIC Speicherbank. Bit 0 und 1:


    11 = Bank 0 $0000 - $3FFF

    10 = Bank 1 $4000 - $7FFF

    01 = Bank 2 $8000 - $BFFF

    00 = Bank 3 $c000 - $FFFF


    Im Register $DD18 befindet sich der Offset in der 16K VIC Speicherbank.

    Die ist mit den Bits 1 bis 3 definiert, Bit 0 ist unbenutzt.


    000 (0) = $0000 - $07FF

    001 (1) = $0800 - $0FFF

    010 (2) = $1000 - $17FF

    011 (3) = $1800 - $1FFF

    100 (4) = $2000 - $27FF

    101 (5) = $2800 - $2FFF

    110 (6) = $3000 - $37FF

    111 (7) = $3800 - $3FFF


    Also die VIC Speicherbank plus Offset ergibt die 16 Bit-Adresse des Charakterspeichers.

    Jetzt muß man halt diese Adresse der Char-Copy-Routine geben, wie es sonst die MMU des

    C128 bei Routine $F7D0 macht. Hier ist die noch mal, aber das hilft glaube ich nicht groß weiter.


    Code
    ; Get Char From Memory Bank
    
    F7D0: 8D AA 02    STA $02AA
    F7D3: BD F0 F7    LDA $F7F0,X  ; MMU Bank Configuration Values
    F7D6: AA          TAX
    F7D7: 4C A2 02    JMP $02A2    ; Bank Peek Subroutine


    Falls Werte zwischengespeichert werden müssen, die Adressen 251 bis 254 sind beim C64 noch frei.

  • Sag mal noch an, ob Du im C64 Mode Dein Programm ausführst ? Ich hatte das zumindest so verstanden, daß es darum geht den VDC im C64 Mode auszuführen.


    Wenn das so sein sollte, dann schaun doch mal nach, was an der Adresse $02a2 so steht (disassembliert). Ich würde nämlich behaupten, daß dort überhaupt kein sinnvoller Code steht, weil nämlich bei einem Reset im C128er Mode dort erst diese Umkopierroutinen hinkopiert werden (aus dem EPROM ins RAM).



    Eine schöne Übersicht - für alle die Miträtseln wollen - wie der 128er so funktioniert betreffs MMU (ja das heißt da tatsächlich so), findet man bei

    auf zwei Seiten beschrieben (p12, p13 usf).

  • Ja, der VDC soll im C64-Modus vollständig unterstützt werden.


    Beim C128 wird der Bereich $02a2 - $02ae (674 - 686) als Kernal RAM bezeichnet. Da wird die MMU und

    andere Hardware des C128 kurzzeitig Daten ablegen. Also so wie ich das im Bereich 251 - 254 machen wollte.


    So, hier ist das Listing. Ich hoffe das ist richtig so, muß jede Opcode-Funktion einzeln nachschauen :P



    Es werden in der Routine also die Adressen 218 und 219 verwendet. Der ist in der Speicherbelegungstabelle

    ganz informativ als "00da-00df Misc Editor work area" bezeichnet. Auf jeden Fall ist es ein Zwischenspeicher.

    Demnach müßte man doch 218/219 gegen 253/254 ändern können. Also $DA/DB gegen $FD/FE.

  • Und das ist jetzt Deine eigene Routine ?


    Die macht aber auch den Aufruf von $FF74 und springt damit über ein paar Schritte mit

    Code
    F7D7: 4C A2 02    JMP $02A2    ; Bank Peek Subroutine

    direkt nach $02A2. Und wenn da im C64 Mode nichts sinnvolles steht, dann ist klar, warum die Sache abstürzt.


    Das müßtest Du halt mal direkt bei $02A2 nachschauen, ob da "echtes Programm" steht (und vielleicht am Besten mal hier mit reinstellen, was genau da zu lesen ist).

    Immerhin hattest Du bei #8 oben geschrieben, daß der Teil ist, der nicht funktioniert.



    Vielleicht magst Du ja auch mal noch dau schreiben, was genau passiert - ob der Rechner abstürzt, blockt, schwarzes BIld zeigt ...

  • Im Moment ist das alles Theorie, ich teste da gar nichts. Das soll so gut wie möglich vorausgeplant werden und wird dann ins ROM übernommen.

    Die C128-Routinen sind ja auch nicht mehr interessant. Es geht jetzt darum, die auf dem C64 nicht nutzbare Routine

    Code
    7F96  20 74 FF   JSR $FF74    ; indfet Bank LDA (fetchvec),y

    gegen etwas zu ersetzen, was auf dem C64 funktioniert. Ich denke, man muß der Copy-Routine jetzt die Adresse vom VIC-Charset geben.

    Die C128-Routine nutzt die Adressen 218/219 als temporären Speicher, beim C64 wird es 253/254 sein, da diese Speicherplätze frei sind.