Hello, Guest the thread was called2.4k times and contains 19 replays

last post from ChaosCreator at the

Spez. Tipps zum Expansionsport

  • Hallo liebe C64-Freunde,


    aufgrund von aktuellen Ideen, die der Club verfolgt, brauchen wir dringend Literatur und Tipps zur Ansteuerung und allgemeinen Programmierung des Expansionsports. Vereinzelt sind schon Bücher vorhanden (Hardware-Bastelleien; C64-Intern). Der Inhalt befasst sich aber leider (fast) immer nur um die Hardware und nicht wie und was abläuft, wenn ein Steckmodul in Betrieb ist.
    Wir brauchen in dem Sinne Literatur-Tipps, die sich ausschließlich um die Software-Seite befasst.


    Vielen Dank schon mal im voraus.

  • hmnajaaa.....die softwareseite ist je nachdem was ihr anschließt verschieden.....


    wenn ihr zum beispiel nen 2. sid an den expansionsport anschließt wird der genauso programmiert wie der erste sid , nur das er net bei $d400 liegt sondenr zum beispiel bei $de00....
    also alles was ihr anschließt wird direkt in dne speicher des c64 gemappt...


    oder meint ihr eher software-module ?


    chaos

  • Es geht schon darum, den Expansionsport im allgemeinen zu beschreiben. Wie liest er z.B. Steckkarten oder Epromkarten aus. Was läuft allgemein im Datenaustausch zwischen 64er und eingesteckter Karte ab. Das ist die Frage, die uns beschäftigt.

  • dann kann ich Dir mal auch noch "der commodore 64 und der rest der welt" empfehlen.....
    da sind einige expansionsport-infos drin (zwar hauptächlich hardware , allerdings gibts wirklich nicht viel mehr zum expansionsport zu sagen)


    naja , ich glaub Du stellst Dir das alles ein kleines bißchen falsch vor(schlag mich wenn ich unrecht hab) ;)
    der expansionsport wird nicht so programmiert wie der userport etwa...beim userport mußt Du über die cia die sachen die dranhängen ansprechen....


    beim expansionsport isses so , das das modul das Du einsteckst DIREKT an die cpu angeschlossen ist , d.h. das das was Du da anshcließt für die CPU ganz normaler speicher ist, wie zum beispiel das kernal-rom und du genauso darauf zugreifen kannst....


    die karten werdne also im grunde genommen garnicht ausgelesne und in den speicher des c64 reingeschrieben , sondern SIND der speicher des c64(im moment wo dsa modul eingesteckt is)


    und zwar gibt es 3 (einfache) möglichkeiten ein eprom-modul in den speicher zu mappen...


    1. ein modul das im speicherbereich $8000-$9fff liegt...
    2. ein modul das im speicherbereich $a000-$bfff liegt....
    (ja richtig , das is der bereich wo normalerweise das BAISC-ROM liegt , somit kann man dieses einfach ersetzen mit einem eigenen rom , ohne den c64 zu öffnen)
    3. eine kombination aus beiden($8000-$bfff)



    wenn man ein modul nach $8000 mappt , dann hat man aber normalerweise ein problem...
    da liegt jetzt dsa modul im speicher und nix passiert(der c64 startet ganz normal)
    der user müßtze das modul mit sys $8000 starten , was natürlich etwas blöd bei spielen auf modulen wär...


    eshalb gibt es eine möglichkeit zum autostart , und zwar die ersten 9 byte in diesme rom...


    byte 1-2 kaltstart des roms(nach dem einschalten)
    byte 3-4 warmstart des roms(nach nem reset)
    byte 5-9 zeichenkette"CBM80"


    die ersten 4 byte sind je 2 adressen in low und highbyte zerlegt die (normalerweise) in das rom auf den code zeigen der bei nem start des roms ausgeführt weden sollen...


    die CBM80-kennung sagt dme c64 , das hier ein modul mit autostart vorhandne is und die bytes vorher angesprungen werdne sollen wenn ein kaltstart oder reset ausgelöst wird....



    hoffe das hilft dir shconmaln bißchen weiter....


    chaos

  • @ chaos,


    hallo was du geschrieben hast hilft uns schon mal emens - auf jeden Fall die Sache mit dem Autostart.
    es geht uns im endeffect darum, wie die Kommunikation zwischen C64 und Modul abläuft.
    So weit ich weiß, bietet der Expansionsport die Möglichkeit auf den Adress (16Bit) und den Datenbuss (8Bit) zu zugreifen.
    Hintergrund ist folgender: wir möchten ein eigenes Modul bauen und nicht eine gegebene Eprombank nutzen.
    Wenn ich also die DMA Leitung auf low setze, die 8 Bit des Datenbusses setze und den Adressbuss mit der Speicheradresse füttere, welche ich anprechen will, müsste der C64 auf ein Signal warten, das anzeigt das ich alles gesetzt habe und nun der Speicher beeinflusst werden soll....
    (Ich hoffe das das jetzt überhaupt jemand verstanden hat ;-) )... Also irgentwie wie eine Art Handshake....

  • hmmmm...also mit der dma-leitung hab ich noch net so viel rumgespielt , aber was cih weiß is , das wenn Du auf den bus zugreifen willst Du vorher den prozessor anhalten mußt , weil sonst kommts Du dem in die quere , was nette abstürze verursacht....
    dazu mußt Du BA (pin 12) 3 zyklen bevor du zugreifen willst auf high(vielleicht auch low bin mir netmeh rsicher) setzen....
    dann hällt der prozessor an...ich denke mal danach könntest du die dma-leitung setzen und somit die prozessorleitungen auf tri-state ziehn....
    dann könntest du auf dne speicher zugreifen....allerdings nur in der hälfte eines taktzyklus , in der andenr hälfte greift der vic zu....
    (die daten sid ohne gewähr , sollten aber stimmen)



    ich hätte aber ne viel einfachere methode , die kostet dich zwar ein paar byte in deinem rom , aber die wär ie weniger aufwändig und relativ einfach zu realisieren....


    ihr legt ein modul in dne beriech $8000-$9fff , mit autostart...
    das modul wird angesprungen und führt ne kopierroutine aus , die den eigentlichen teil des moduls an die richtige stelle kopiert....
    jetzt startet ihr dsa ganze in dem kopierprogramm mit jmp xxxx
    (ode rihr startets auch net , wie ihr wollt)
    is das getan setzt sie ein bit , in dem kleinen chip den ihr im i/o-bereich mit dme modul reinmapped auf 1 und somit wird das komplette modul incl. i/o-chip aus dme speicher geworfen....


    rückt man den resettaster schaltet sich das modul wieder ein und legt sich wieder nach 8000 bis alles kopiert is....


    wenn ihr das auch über software-reset erreichen wollt könntet ihr zum beispiel irgendwie den basic-interpreter ersetzen , anstatt das modul nach 8000 legen , das würde allerdings ein bißchen komplizierter werden den wieder einzublenden und richtig zum laufne zu bringen....


    was wollt ihr eigentlich genau bauen ?


    chaos

  • Wir haben eine Möglichkeit gefunden, mit Hilfe des PC's mehrere digitale Ein- und Ausgänge anderer Hardware bedienen zu können. Nun überlegen wir, ob es möglich ist, einen C64 "Modul-Emulator" mit Hilfe des PC's zu basteln. Dieser würde dann eine völlig neue Möglichkeit bieten, Informationen zwischen PC und C64 auszutauschen. Aber dazu brauchen wir viele Informationen zum technischen Ablauf zwischen Expansionsport und Modul, um eine möglichst genaue Emulation zu ermöglichen.
    Ist aber im Moment noch eine Idee, weil wir noch nicht wissen, ob es sich realisieren lässt.

  • aaahso....
    ich dneke shcon dsa sich dsa realisieren läßt...und zwar auf 2 möglichkeiten....


    die eine wäre so ne art eprom-simulator in expansionsport-steckkarte....


    also ein normales modul in dme allerdings ein ram steckt was üpber dne pc(z.b. über serielle schnittstelle) beschrieben werdn ekann und im speicher des c64 liegt.....


    dann gäbe es noch eine 2. methode die wohl eher euren vorstellungen entspricht und irgendwie ne echt geile idee wär*g*
    man schließt ein modul an das über dne pc gesteuert daten direkt in den speicher des c64 schiebt....


    die hardware dazu könnte man sogar recht einfach gestalten indem man für jede leitung die man kontrollierne will(R/W , BA , DMA , Adressleitungen , Datenleitungen ) über latches (die man auf tri-state schaltne kann) mit dme pc verbindet....
    so kann jedes einzelne bit vom pc selbst so gesetzt werdne wie mans haben will => keine probleme bei fehler im zugriffsprotokoll da man keine hardwar ewumbaun muß....


    zusätzlich sollte man noch dne c64-takt auf nen eingang des pc´s legen um das ganze zu synchronisieren....


    wenn man jetzt was in dne speiche rschreiben will hällt man zuerst den prozessor mit ba an , schaltet ihn dann mit dma auf tri state , schreibt die richtige adresse und daten in die latches und schaltet dann bei nem high-impuls(könnte auch low sien , je nachdem wann der vic zugreift ,weiß netmeh rgenau) am takt-pin die latches auf ausgang(also nicht mehr auf tri-state) und dann aber shcnell genug(bevor der takt von low nach high ode rumgekehrt wehcselt) wieder auf tri-state weil sonst eine kollision mit den daten die der vic lesne will passiert....


    hoffe das war jetzt wenigstens ETWAS verständlich....gewähr übernehm ich keine aber im großen und ganzen sollts hinkommen...


    was ihr baucht is eher ne komplette beschreibung zu dne vorgängen und zugriffen im c64 anstatt zum expansionsport...





    ......hmm...mist , da is mir grad noch was eingefallen , da gibts ein problem....
    der vic schaltet ab und zu auch mal den prozessor ab um auf den ram zuzugreifen(zum beispiel für spritedaten zu laden)
    in den takten önnt ihr net zugreifen....auch bin ih mir jetzt netmehr besonder ssicher ob DMA überhaupt ein ausgang als vielmehr ien eingang is.....
    die zugriffe des vic kann man aber verhindern indem man den bildschirm abschaltet.....


    chaos






    chaos

  • hiho !
    ja doch , cih hab mich da n bißchen vertan....


    also , ihr müßt DMA setzen um auf das ram zugreifen zu können , wenn der VIC zugreift setzt er BA auf high und ihr dürft nicht mehr zugreifen.....der rest bleibt gleich....


    bin mir bloß nicht so ganz sicher was der 6510 zu der sache sagt...hab mal versucht ne cpu-bremse zu bauen und die weil ichs net besser wußte an DMA angeschlossen....
    die chance das das funzt is 50:50 ...anhalten tut er immer , bloß fortsetzen kann ich nur bei jedem 2. versuch*g*
    ich denke mal das is aber eher ein timing-problem....


    achso ja , hier ein paar infos über die erwähnte z80-karte
    http://home.hccnet.nl/g.baltissen/c64_cpm.htm


    chaos

  • Einfach von aussen einen DMA erzeugen wird nicht klappen. Es gibt zwei Möglichkeiten: Vom 6510 aus in ein Register auf der Erweiterung schreiben, so dass dort das Timing bekannt ist und man nicht mitten während eines 6510 Zugriffs den Bus deaktiviert. Oder über BA beobachten, wenn der VIC die CPU sowieso schon angehalten hat, und sich dann danach einklinken.

    Zuletzt repariert:
    21.2. Logitech M570 Microschalter ausgetauscht - geplante Obsoleszenz durch Billigtaster?
    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!

  • Also wir haben mal geguckt was wir noch so an Literatur zu dem Thema haben...


    1. Commodore 64 und der Rest der Welt
    2. C64 Intern
    3. Hardwarebasteleien am C64
    4. und noch einige andere in denen das Thema in einem Absatz abgehandelt wird.


    Aus den Informationen aus den Büchern und natürlich auch hier aus dem Forum leite ich ab, das wir uns wohl oder übel mit dem Timig des C64 rumschalgen müssen und nicht einfach einen Handshake machen können wie z.B. am Userport.


    @Chaos, wir hatte eigentlich vor das auf die 2. von dir beschriebene Methode zu machen - also direkt ins Ram des C64 zu schreiben.


    Falls einer noch ergänzende Literatur zu unserer hat, könnte er/sie uns ein par Seiten zu dem Thema kopieren... das währe sehr nett - da wir versuchen möglichst viele Informationen zusammen zu bekommen.


    Gruss an alle ....
    (Bin jetzt bis Mo in Urlaub und melde mich dann wieder)

  • Einen DMA Zugriff zu machen ist timingtechnisch nicht so trivial. Das Grundproblem ist der 6567.
    Im normalen Betrieb teilt der VIC-II sich den Speicherzugriff mit der CPU. Dazu gibt es die Leitungen AEC und BA. (Adress enable control und Bus available)
    Beides sind Ausgänge vom VIC und BA ist normalerweise mit den RDY Eingängen der anderen 65xx Chips verbunden.


    In dem zweiphasigen Takt ist es so geregelt, daß der VIC-II normalerweise die erste Taktphase für Zugriffe nutzen kann und die CPU die 2te. Dazu ist normalerweise AEC in der ersten Taktphase immer durch den VIC-II auf 1 gesetzt.
    Im Textmodus holt der VIC damit pro Takt die entsprechende Bitmatrix des Zeichens.


    Alle acht Rasterzeilen muß der VIC-II aber zusätzlich noch die Zeichencodes holen. Dazu benötigt er mehr Speicherzugriffe und damit auch die 2te Taktphase. Dazu wird BA während der ersten Taktphase auf 0 gelegt. Danach bleiben der CPU noch drei 2te Taktphasen um laufende Speicherzugriffe abzuschliessen (vgl. Taktbedarf von Befehlen mit 16bit Operand wie jsr $xxxx).
    Während der vierten 2ten Taktphase bleibt AEC auf Low und der VIC-II nutzt die nächsten 40 2ten Taktphasen um die Videomatrixzeiger zu holen.
    Bei aktivierten Sprites braucht er noch mehr 2te Taktphasen.


    Das Problem bei DMA Zugriffen ist nun, dass man diese VIC-Zugriffe beachten muss. Üblicherweise wird die CPU bei einem DMA-Zugriff genauso wie es der VIC-II machen wuerde gestoppt. (Die /DMA Leitung deaktiviert BA und aktiviert AEC).
    Vielleicht weiß jemand, wie zB die REU die VIC-Badlines berücksichtigt? (Oder wird der VIC Zugriff verhindert solange, imho würde das nur über Screen Blank gehen ?!?)


    Bei einer REU zB wird der DMA durch einen Software Zugriff getriggert. Damit brauch man hier keine 3 Takte warten bis die CPU eventuelle Schreibzugriffe abgeschlossen hat. Durch das triggern (meist per STA $xxxx) ist der aktuelle Schreibzugriff in dem moment gerade abgeschlossen.
    Genauso funktioniert die 8500 zu Z80 Umschaltung im C128.


    Im 2Mhz Modus des C128 nutzt die REU auch nur die 2ten Taktphasen für den DMA, da in den ersten Taktphasen der VIC nach jeder Rasterzeile noch 5 Refreshadressen erzeugt. Das ist nicht leicht vorhersehbar.


    Ciao...
    ...Micha

  • ich wieß nicht wies die reu macht , aber wie Du gesagt hast setzt der VIC wenn er zugreifen will die BA-leitung 3 takte vorher auf 0.....
    Die BA-Leitung stewht am expansionsport zur verfügung , also um rauszufinden wann man nicht zugreifen kann prüftman ganz einfach auf welchen level die BA-Leitung ist....ist sie 0 wartet man , ist sie 1 darf man zugreifen.....


    chaos

  • Moin Moin,


    hmmm aus welcher Literatur/Dokumentation bezieht ihr euer Wissen?
    In den Büchern die mir zur Verfügung stehen steht leider nicht so viel drin.
    Könnte es denn klappen, das man die DMA setzt und damit den Prozessor stoppt - nun setzt man die Daten auf Adress- und Datenbus um z.B. das Zeichen A auf in die erste Stelle des Bildschirmspeichers zu schreiben. Nun deaktiviert man DMA wieder und siehe da das Zeichen Steht auf dem Bildschirm ?....
    Wie würdet Ihr das lösen (Ein a über den Expansionsport in den Bildschirmspeicher zu schreiben) ?

  • also cih hab davon relativ wenig aus büchern , hauptsächlich internet , und früher die 64er magazine....


    rein theoretisch würde das im groben so klappen wie Du das sagst , das problem is nur den prozessro danach wieder sicher zum laufen zu kriegen , denn die DMA-leitung schaltet gleichzeitig RDY(cpu anhalten) und AEC(CPU vom bus trennen)....
    das Dumme is beim 6510 nur , das er nur anhällt wenn er grade etwas aus dme speicher LESEN will....wenn er aber schreiben soll hällt er net an....
    also kanns passieren das ihr den prozessor mit de rDMA-leitung vom bus trennt und er obwohl er shcon getrennt is versucht zu schreiben(was natürlich recht wenig erfolg hat)...


    aber wie x1541schon gesagt hat , man könnte warten bis der VIC den 6510 deaktiviert hat(der vic wartet bis der prozessor wirklich angehaltne hat bevor er ihn trennt) , wartet dann bis der vic fertig is , hällt den prozessor über DMA an und greift dann auf dne speicher zu.....


    ich denke das sollte sich mit nem flankengetriggerten d-flipflop relativ einfach realisieren lassen...


    chaos

  • @Chaos,


    Wir werden das mal testen (verschiedene Varianten probieren) und dann die Ergebisse im Forum Posten... mal sehen wie viele 64'er wir dabei schrotten :D


    Danke an alle, die zur theoretischen Seite was beigetragen haben.
    Trozdem wenn jemand noch gute Literatur zum Thema hat, währen wir Dankabar wenn wir das (als Kopie) bekommen könnten.