Hallo,
ich bin auf der Suche nach jemandem, der mir bei C128-Programmierung in Assembler helfen kann. Ich habe da keine großen Kenntnisse.
Beste Grüße, TeSoto.
Hallo,
ich bin auf der Suche nach jemandem, der mir bei C128-Programmierung in Assembler helfen kann. Ich habe da keine großen Kenntnisse.
Beste Grüße, TeSoto.
Was ist denn das Problem?
Hier kann man das nachlesen.
Richtig. Aber die scheinen nicht richtig mit Einsteigern klarzukommen. Könnt ihr das?
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.
Sag doch mal welche Seite im ROM Listing. Bzw. Adresse etc. Noch besser natürlich Foto von der Stelle oder Link.
Mich wundert ja, daß das überhaupt geht, den C128 80Zeichen VideoChip vom C64 Mode aus zu benutzen. Darum geht es doch , oder ?
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.
Ich kann gut genug mit Assembler umgehen, daß ich direkt ein ROM per Hex-Code optimieren kann. Und gut vorbereitet bin ich auch.
Jede Änderung, jede Routine habe ich soweit ich kann dokumentiert. Es geht jetzt um die Punkte, bei denen ich allein nicht weiterkomme.
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.
Seite 61, rechts.
Wurde im F64 schon geschrieben.
Hilft das oder nicht ?
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:
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
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
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.
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.
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.
; 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
7F7A A9 00 LDA #$00 ; Load accu with $00
7F7C A0 D0 LDY #$D0 ; Load Y register with $D0
7F8E 85 DA STA $DA ; Store accu to address 218
7F80 84 DB STY $DB ; Store Y reg to address 219
7F82 A2 12 LDX #$12 ; Load X register with $12
7F84 A9 20 LDA #$20 ; Load accu with $20
7F86 20 AC F2 JSR $F2AC ; Set VDC routine
7F89 E8 INX ; Increase X register
7F8A A9 00 LDA #$00 ; Load accu with $00
7F8C 20 AC F2 JSR $F2AC ; Set VDC routine
7F90 A0 00 LDY #$00 ; Load Y register with $00
7F92 A2 0E LDX #$0E ; Load X register with $0E
7F94 A9 DA LDA #$DA ; Load accu with $DA
7F96 20 74 FF JSR $FF74 ; indfet Bank LDA (fetchvec),y <-----
7F99 20 AA F2 JSR $F2AA ; Set VDC Register 31
7F9C C8 INY ; Increase Y register
7F9E C0 08 CPY #$08 ; Compare Y register with 8
7FA1 90 EF BCC $7F92 ; if not 8 then back
7FA3 A9 00 LDA #$00 ; Load accu with $00
7FA5 20 AA F2 JSR $F2AA ; Set VDC Register 31
7FA8 88 DEY ; Decrement Y Register
7FA9 D0 FA BNE $7FA5 ; If not 0 then back
7FAB 18 CLC ; Clear Carry
7FAC A5 DA LDA $DA ; Load from adress 218
7FAE 69 08 ADC #$08 ; Add 8 with carry
7FB0 85 DA STA $DA ; Store accu to address 218
7FB2 90 DF BCC $7F92 ; If Carry not set back
7FB4 E6 DB INC $DB ; Increase address 219
7FB6 A5 DB LDA $DB ; Load from adress 219
7FB8 C9 E0 CMP #$E0 ; compare accu with 224
7FB0 90 E1 BCC $7F92 ; If Carry not set back
7FB2 60 RTS ; Return
Alles anzeigen
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
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
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.