{"id":3777,"date":"2010-11-20T01:21:19","date_gmt":"2010-11-20T00:21:19","guid":{"rendered":"http:\/\/www.bernd-leitenberger.de\/blog\/?p=3777"},"modified":"2013-07-03T23:17:36","modified_gmt":"2013-07-03T21:17:36","slug":"bankswitching-beim-c64-und-c128","status":"publish","type":"post","link":"https:\/\/www.bernd-leitenberger.de\/blog\/2010\/11\/20\/bankswitching-beim-c64-und-c128\/","title":{"rendered":"Bankswitching beim C64 und C128"},"content":{"rendered":"<p>der heutige Aufsatz kommt von Hans. Damit ihr ihn in aller Ausf&uuml;hrlichkeit genie&szlig;en k&ouml;nnt gibt es erst am Montag einen neuen Blog von mir.<\/p>\n<p>Aufbauend auf den Artikel von Bernd hier ein paar Details zu den grossen Konkurenten der CPC-Serie. Als erstes w&auml;ren da die CPUs zu nennen, das sind n&auml;mlich keine reinen 6502-CPUs, sondern Abwandlungen davon. Sie sind allerdings Befehlssatzkompatibel. Beim C64 ist das eine 6510 CPU, beim 128er eine 8502 CPU. Beiden gemeinsam ist, das sie &uuml;ber einen 6 Pin Port verf&uuml;gen, &uuml;ber den das Speichermanagement gesteuert wird. Genutzt werden davon allerdings nur 3 Bits, die anderen drei werden zur Steuerung der Datasette, also des Kassettenrecorders zum Datenspeichern benutzt. Die 8502 CPU im 128er kann ausserdem noch mit der doppelten Taktfrequenz von 2MHz arbeiten. Und beim 128er kommt noch eine programmierbare MMU (Memory Management Unit) dazu, aber dazu sp&auml;ter.<\/p>\n<p>Die Speicherchips sind fast identisch; beim C64 sind acht, beim 128er sechzehn 4164 RAM-Chips verbaut. Dazu kommen beim 64er zwei ROMs vom Typ 2364A, eines vom Typ 2332A sowie ein spezielles Color-RAM, Typ 2114L-3. Der C128 hat vier ROMs vom Typ 23128, wovon zwei auch vom Typ 23256 sein k&ouml;nnen, und einen Steckplatz, d.h. IC-Sockel f&uuml;r ein f&uuml;nftes 23256 ROM. Ausserdem hat er noch zwei 4416 RAMs f&uuml;r den 80-Zeichen Controller.<!--more--><\/p>\n<p>Im Gegensatz zum Z80 oder 8086 und anderen Prozessoren kennen 6502 und kompatible CPUs keine separaten I\/O-Operationen, d.h. sie haben keine Portbefehle wie IN oder OUT. Der Datentranfer mit I\/O-Bausteinen l&auml;uft bei ihnen &uuml;ber die normalen Lade- und Speicherbefehle, mit denen auch der RAM-Speicher angesprochen wird. Dem entsprechend ben&ouml;tigen sie einen speziellen Adressbereich, in dem die Register der Peripheriebausteine ansprechbar sind. Das ist der sogenannte I\/O-Bereich, der bei den hier behandelten Rechnern zwischen den Adressen $D000 bis $DFFF liegt. Ist dieser I\/O Bereich aktiv, dann korrespondiert jede Adresse mit einem Register eines I\/O-Chips. Der Grafikcontroller des C64\/128 belegt beispielsweise den Adressraum von $D000 bis $D3FF. Schreibt der Prozessor also etwas an die Adresse $D000, so wird dieser Wert in das Register 0 des Grafikchips geschrieben.<br \/>\nDa es in diesem Bereich aber auch RAM-Speicher gibt, muss das Bankswitching dies auch ber&uuml;cksichtigen, indem der I\/O-Bereich ein oder ausgeschaltet werden kann. Denn nur wenn der I\/O-Bereich deaktiviert ist, kann auf das darunter liegende RAM zugegriffen werden. Daher ist besondere Umsicht geboten, wenn man in diesem Bereich Programmcode ablegt, der auch auf die Peripheriebausteine zugreifen soll; &#8211; man hat es in der Regel vermieden. Bliebe noch anzumerken, das man beim C64 aber nie von Bankswitching gesprochen hat, sondern immer nur von Speicherverwaltung, oder -management.<br \/>\nUm die 6 Portpins der CPU programmieren zu k&ouml;nnen, hat sie spezielle Portregister in den Speicheradressen 0 und 1. In Adresse 0 wird dabei definiert, ob die Portpinne zur Eingabe oder Ausgabe dienen sollen (Datenrichtungsregister). Je nach dem, was man ins Portregister bei Adresse 1 schreibt, werden bestimmte RAM- oder ROM-Bereiche bzw. der I\/O-Bereich ein oder aus geschaltet. Da der Prozessor sich den RAM Speicher jedoch auch mit dem Videocontroller teilen muss, der auch regelm&auml;ssig darauf zugreift, f&uuml;hren die Pinne vom Prozessorport auf einen komplizierteren Spezialbaustein, der den Speicherzugriff zwischen CPU und Videocontroller koordiniert. Dabei handelt es sich um den von Bernd erw&auml;hnten ULA. In diesem Fall ein FPLA, also ein Field Programmable Logic Array mit 28 Pinnen. (FPLAs sind eine Untergruppe der ASICs, also der Anwendungsspezifischen ICs; die Programmierung erfolgt dabei durch den Hersteller.) Der von Bernd ebenfalls erw&auml;hnte 74LS620 kann das also nicht sein, denn der hat 40 Anschlusspinne.<\/p>\n<p>Der C64 verf&uuml;gt &uuml;ber 64KB RAM und 20 KB ROM. Die genaue Aufteilung zeigt die Grafik.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone\" title=\"Speicheraufteilung des C64\" src=\"\/img\/c64-0.jpg\" alt=\"\" width=\"814\" height=\"194\" \/><\/p>\n<p>Wie man der Zeichnung entnehmen kann &uuml;berlappt sich der I\/O-Bereich ausser mit dem RAM noch mit dem Character ROM. Darin sind f&uuml;r den Videocontroller die Informationen abgelegt sind, wie die im Textmodus darzustellenden Zeichen aussehen sollen. Dann gilt es noch zu ber&uuml;cksichtigen, das der VIC-Chip, d.h. der Grafikchip des C64\/128 kein eigenes Video RAM kennt. Er benutzt daf&uuml;r sowohl im Text- als auch im Grafikmodus den RAM-Speicher des Prozessors. (Beim PC hat man dieses Prinzip bei AGP-Karten verwendet.) Dadurch entfallen im Textmodus 2KB auf den Bildschirminhalt und im Grafikmodus 9KB.<\/p>\n<p>Der PLA-Baustein des C128 ist ein 48-Pin Chip, zu dem sich noch eine frei programmierbare Memory  Management Unit (MMU) gesellt. Denn der 128er verf&uuml;gt nicht nur &uuml;ber doppelt so viel RAM wie der C64, sondern auch &uuml;ber wesentlich mehr ROM, wie man der Abbildung 2 entnehmen kann. Das System ist in der Grundkonfiguration auf 256KB RAM aufr&uuml;stbar, und man kann auch noch eine (interne) ROM Erweiterung einbauen. Daf&uuml;r gibt es einen IC-Sockel auf der Systemplatine. Das RAM ist in B&auml;nke zu je 64KB aufgeteilt; &#8211; auf welche Bank der Prozessor zugreift, wird durch die MMU gesteuert. (Hier wurde dann auch erst der Begriff Bankswitching eingef&uuml;hrt.) Dazu arbeitet im 128er auch ein Z80 Prozessor, sofern man ihn l&auml;sst. Das ist allerdings nur kurz beim einschalten der Fall, oder wenn man CP\/M bootet um damit zu arbeiten. Ein kurzes Testprogramm &uuml;berpr&uuml;ft nach dem Einschalten, ob eine CP\/M Diskette im Laufwerk liegt. Wenn ja, wird davon gebootet, wenn nein, gibt der Z80 die Kontrolle an den 8502 ab, was durch setzen eines Bits in einem MMU-Register erfolgt.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone\" title=\"Speicheraufteilung des C128\" src=\"\/img\/c64-1.jpg\" alt=\"\" width=\"814\" height=\"194\" \/><\/p>\n<p>Der Basicinterpreter des C128 meldet beim einschalten, dass 122365 Bytes, also knapp 120 KB frei sind. Die restlichen 8KB werden von Systemvariablen und der Common Area belegt. Basic arbeitet nun so, das der Quelltext in Bank 0 abgelegt wird, und Variablen des Basicprogramms in Bank 1. Gem&auml;ss der Initalisierungsroutine vom Basicinterpreter stehen 56? KB f&uuml;r Quelltext und knapp 63KB f&uuml;r Variablen zur Verf&uuml;gung. Problematisch wird das nur, wenn ein ca. 50+x KB grosses Basicprogramm mit Grafik arbeiten soll, weil dann 9KB vom Speicher f&uuml;r Quelltext abgezogen werden m&uuml;ssen, in denen dann der Bildschirmspeicher des Videocontrollers liegt. Danach bleiben aber immer noch 47 KB f&uuml;r Quelltext &uuml;brig. Ich hab allerdings noch kein C128-BasicProgramm gesehen, das so lang war. Nebenbei ist es mit dem Basic 7.0 recht einfach, Sound und Grafik zu programmieren, da die entsprechende Hardware voll unterst&uuml;tzt wird. Eine Ausnahme bildet da nur der 80-Zeichen Controller, den es im 128er gibt. Der wird vom Basicinterpreter nur begrenzt d.h. nur im Textmodus unterst&uuml;tzt. Der Controller besitzt seinen eigenen Bildschirmspeicher von 16KB, der genauso wie seine vielen Steuerregister nur &uuml;ber zwei Bytes im I\/O-Bereich angesprochen werden kann. Dieser Chip kann zwar auch Grafik darstellen, die muss man aber vollst&auml;ndig selbst programmieren. (Das wurde meines Wissens nach aber nur wenig gemacht, weshalb es nicht viele Grafikprogramme gab, die den Chip nutzten.)<\/p>\n<p>Die Common Area ist ein Speicherbereich, der in allen RAM-B&auml;nken identisch ist. In ihr liegen u.a. auch spezielle Routinen des Betriebssystems, die es erm&ouml;glichen, das ein Programm, (u.a. der Basicinterpreter) auf RAM Speicher zugreifen kann, der an der gleichen physikalischen Adresse, aber in einer anderen RAM-Bank liegt. Der Basicinterpreter nutzt diese Routinen um einerseits den Quelltext in Bank 0 auswerten (interpretieren) zu k&ouml;nnen, und andererseits um auf die Variablen in Bank 1 zuzugreifen.<\/p>\n<p>Die Gr&ouml;sse und die Lage dieser Common Area kann durch die MMU programmiert werden. Zur Auswahl stehen 1, 4, 8 und 16KB Gr&ouml;sse, wahlweise am oberen oder unteren Ende der 64KB, die der Prozessor ansprechen kann, bzw. zu gleichen Teilen an beiden Enden. Man kann die Commonarea aber auch ganz abschalten, wenn man es f&uuml;r n&ouml;tig h&auml;lt. Diese M&ouml;glichkeit zum Verschieben der Common Area ist u.a auch f&uuml;r den Betrieb von CP\/M n&ouml;tig, weil dann Teile des ROM in andere Adressbereiche gemappt werden m&uuml;ssen. Denn CP\/M benuzt ja eine andere Aufteilung des Speichers, was in der anderen Prozessorarchitektur begr&uuml;ndet liegt. Ebenfalls nutzt das CP\/M des 128ers die im ROM vorhandenen I\/O-Routinen f&uuml;r den 8502 als BIOS, wobei der Z80 die Kontrolle f&uuml;r I\/O Operationen an den 8502 abgibt. Welcher der beiden Prozessoren arbeitet, wird dabei auch durch die MMU gesteuert. Es kann immer nur einer arbeiten, ein Parallelbetrieb funktioniert nicht.<br \/>\nSoweit mal eine Erl&auml;uterung zum Bankswitching in den Commodore Rechnern. &#8211; Ich hoffe, ich hab nichts vergessen&#8230; \ud83d\ude09<\/p>\n<p>Verwendete Literatur:<br \/>\nLarry Greenly u.a.; Das C128 Buch, Sybex, 1. Auflage 1986, ISBN 3-88745618-1<br \/>\nSchieb u.a.; Commodore 128 Intern, Data Becker, 1. Auflage 1986, ISBN 3-89011-098-3<br \/>\nBr&uuml;ckmann u.a.; 64 Intern, Data Becker, 7. Auflage 1988, ISBN 3-89011-000-2<\/p>\n","protected":false},"excerpt":{"rendered":"<p>der heutige Aufsatz kommt von Hans. Damit ihr ihn in aller Ausf&uuml;hrlichkeit genie&szlig;en k&ouml;nnt gibt es erst am Montag einen neuen Blog von mir. Aufbauend auf den Artikel von Bernd hier ein paar Details zu den grossen Konkurenten der CPC-Serie. Als erstes w&auml;ren da die CPUs zu nennen, das sind n&auml;mlich keine reinen 6502-CPUs, sondern [&hellip;]<\/p>\n","protected":false},"author":165,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[529],"tags":[1650,1656,1655],"class_list":["post-3777","post","type-post","status-publish","format-standard","hentry","category-gastbeitraege","tag-bankswitching","tag-c128","tag-c64","entry"],"jetpack_featured_media_url":"","jetpack-related-posts":[{"id":18610,"url":"https:\/\/www.bernd-leitenberger.de\/blog\/2026\/03\/27\/galileos-cds-teil-1\/","url_meta":{"origin":3777,"position":0},"title":"Galileos CDS &#8211; Teil 1","author":"Bernd Leitenberger","date":"27. M\u00e4rz 2026","format":false,"excerpt":"Hall\u00f6chen, es wird Zeit das ich mich mal wieder melde. Es gab zwei Gr\u00fcnde, warum ich mich so rar gemacht habe. Das eine ist das es gerade nicht so viel aktuelles gibt, au\u00dfer einem Update zu Artemis, zu dem ich vielleicht noch etwas schreibe. W\u00e4hrend Trump das ganze Programm nach\u2026","rel":"","context":"In &quot;Raumfahrt&quot;","block_context":{"text":"Raumfahrt","link":"https:\/\/www.bernd-leitenberger.de\/blog\/category\/raumfahrt\/"},"img":{"alt_text":"","src":"https:\/\/vg07.met.vgwort.de\/na\/4fb81c7bafbd4d9d88b5695abdb33d29","width":350,"height":200},"classes":[]},{"id":18380,"url":"https:\/\/www.bernd-leitenberger.de\/blog\/2025\/09\/03\/die-glorreichen-10-das-war-mal-weg-pc-hardware\/","url_meta":{"origin":3777,"position":1},"title":"Die glorreichen 10 &#8211; Das war mal weg: PC Hardware","author":"Bernd Leitenberger","date":"3. September 2025","format":false,"excerpt":"Ich will heute mal zwei ZDF Info \/ Neo Sendungen verbinden. Die glorreichen 10, die bei mir als Vorlage f\u00fcr einige Blogs dienten und die von mir noch mehr gesch\u00e4tzte Sendung \"Das war mal weg\", wo es um Dinge geht, die fr\u00fcher fast jeder hatte und die heute aus unserem\u2026","rel":"","context":"In &quot;Die Glorreichen 10&quot;","block_context":{"text":"Die Glorreichen 10","link":"https:\/\/www.bernd-leitenberger.de\/blog\/category\/allgemein\/die-glorreichen-10\/"},"img":{"alt_text":"","src":"https:\/\/vg02.met.vgwort.de\/na\/876c61d389304d98aa0332fadd769381","width":350,"height":200},"classes":[]},{"id":18612,"url":"https:\/\/www.bernd-leitenberger.de\/blog\/2026\/03\/28\/galileos-cds-teil-2\/","url_meta":{"origin":3777,"position":2},"title":"Galileos CDS \u2013 Teil 2","author":"Bernd Leitenberger","date":"28. M\u00e4rz 2026","format":false,"excerpt":"So, heute geht es weiter mit Teil 2 \u00fcber Galileos CDS, dieser Beitrag schlie\u00dft nahtlos an den ersten Beitrag von gestern an, wie man schon an der ersten Textzeile sieht. Nach der Einleitung im ersten Teil geht es heute weiter damit warum der RCA 1802 genutzt wurde und was seine\u2026","rel":"","context":"In &quot;Raumfahrt&quot;","block_context":{"text":"Raumfahrt","link":"https:\/\/www.bernd-leitenberger.de\/blog\/category\/raumfahrt\/"},"img":{"alt_text":"","src":"https:\/\/vg07.met.vgwort.de\/na\/191e4b0728de42829cf656027b84dc82","width":350,"height":200},"classes":[]},{"id":4557,"url":"https:\/\/www.bernd-leitenberger.de\/blog\/2011\/04\/03\/atom-und-wahlnachlese\/","url_meta":{"origin":3777,"position":3},"title":"Atom- und Wahlnachlese","author":"Bernd Leitenberger","date":"3. April 2011","format":false,"excerpt":"Nun einige Wochen nach dem Super-Gau von Japan wird es an der Zeit f?r eine Nachlese und zwar eine etwas allgemeiner gehaltene. Ich m?chte an dieser Stelle mal meine Einstellung zur Kernkraft in den letzten Jahrzehnten reflektieren. Ich war urspr?nglich f?r Kernkraft. Wie viele andere, glaubte ich an umweltfreundliche Energie\u2026","rel":"","context":"In &quot;Allgemein&quot;","block_context":{"text":"Allgemein","link":"https:\/\/www.bernd-leitenberger.de\/blog\/category\/allgemein\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":18614,"url":"https:\/\/www.bernd-leitenberger.de\/blog\/2026\/03\/29\/galileos-cds-teil-3\/","url_meta":{"origin":3777,"position":4},"title":"Galileos CDS &#8211; Teil 3","author":"Bernd Leitenberger","date":"29. M\u00e4rz 2026","format":false,"excerpt":"So nun zum dritten Teil \u00fcber das prim\u00e4re Computersystem von Galileo, das CDS. Nachdem sich die ersten beiden Teile nur mit dem RCA 1802, warum er gew\u00e4hlt wurde und seiner Architektur befassten geht es heute um das Computersystem selbst. Der Artikel schlie\u00dft so an seine beiden Vorg\u00e4nger gestern und vorgestern\u2026","rel":"","context":"In &quot;Raumfahrt&quot;","block_context":{"text":"Raumfahrt","link":"https:\/\/www.bernd-leitenberger.de\/blog\/category\/raumfahrt\/"},"img":{"alt_text":"","src":"https:\/\/vg07.met.vgwort.de\/na\/6e7f572a246b4ac395de9c260733b707","width":350,"height":200},"classes":[]},{"id":18396,"url":"https:\/\/www.bernd-leitenberger.de\/blog\/2025\/09\/19\/die-falcon-9-eine-nachlese-2\/","url_meta":{"origin":3777,"position":5},"title":"Die Falcon 9 \u2013 eine Nachlese (2)","author":"Bernd Leitenberger","date":"19. September 2025","format":false,"excerpt":"So und hier folgt der zweite Teil der Nachbetrachtung der Falcon 9, er schlie\u00dft an den ersten Teil von gestern an. Den ganzen Artikel gibt es auch auf der Website. Nutzlastverkleidung Ein einziges System wurde beim \u00dcbergang von der ersten zur heutigen Version kleiner: Die Nutzlastverkleidung wurde von 15,24 auf\u2026","rel":"","context":"In &quot;SpaceX&quot;","block_context":{"text":"SpaceX","link":"https:\/\/www.bernd-leitenberger.de\/blog\/category\/raumfahrt\/spacex\/"},"img":{"alt_text":"","src":"https:\/\/vg02.met.vgwort.de\/na\/56024d59119b4e4685580cdc237045c2","width":350,"height":200},"classes":[]}],"jetpack_sharing_enabled":true,"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.bernd-leitenberger.de\/blog\/wp-json\/wp\/v2\/posts\/3777","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.bernd-leitenberger.de\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.bernd-leitenberger.de\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.bernd-leitenberger.de\/blog\/wp-json\/wp\/v2\/users\/165"}],"replies":[{"embeddable":true,"href":"https:\/\/www.bernd-leitenberger.de\/blog\/wp-json\/wp\/v2\/comments?post=3777"}],"version-history":[{"count":0,"href":"https:\/\/www.bernd-leitenberger.de\/blog\/wp-json\/wp\/v2\/posts\/3777\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.bernd-leitenberger.de\/blog\/wp-json\/wp\/v2\/media?parent=3777"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.bernd-leitenberger.de\/blog\/wp-json\/wp\/v2\/categories?post=3777"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.bernd-leitenberger.de\/blog\/wp-json\/wp\/v2\/tags?post=3777"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}