<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Programmieren am C64 &#8211; internet-navigator.de</title>
	<atom:link href="https://www.internet-navigator.de/tag/programmieren-am-c64/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.internet-navigator.de</link>
	<description>Der sichere Navigator durch die Informationsflut</description>
	<lastBuildDate>Mon, 18 Aug 2025 11:54:22 +0000</lastBuildDate>
	<language>de</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://www.internet-navigator.de/wp-content/uploads/2023/11/cropped-wind-34559_640-32x32.png</url>
	<title>Programmieren am C64 &#8211; internet-navigator.de</title>
	<link>https://www.internet-navigator.de</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Programmieren lernen am C64 – von BASIC bis Assembler</title>
		<link>https://www.internet-navigator.de/programmieren-lernen-am-c64-von-basic-bis-assembler/</link>
		
		<dc:creator><![CDATA[Jens]]></dc:creator>
		<pubDate>Mon, 18 Aug 2025 17:38:00 +0000</pubDate>
				<category><![CDATA[Retro Computing]]></category>
		<category><![CDATA[Programmieren am C64]]></category>
		<guid isPermaLink="false">https://www.internet-navigator.de/?p=3248</guid>

					<description><![CDATA[<p>Dieser Leitfaden führt dich Schritt für Schritt vom ersten BASIC-Listing bis zu ersten Assembler-Routinen auf dem Commodore 64. Warum ausgerechnet der Commodore 64? Weil er wie kaum ein anderer Rechner zeigt, was ein Computer wirklich tut: Speicher lesen und schreiben, Register setzen, Bits schieben – und daraus Text, Grafik und Musik formen. Am C64 ist ... <a title="Programmieren lernen am C64 – von BASIC bis Assembler" class="read-more" href="https://www.internet-navigator.de/programmieren-lernen-am-c64-von-basic-bis-assembler/" aria-label="Mehr Informationen über Programmieren lernen am C64 – von BASIC bis Assembler">Weiterlesen</a></p>
<p>Der Beitrag <a rel="nofollow" href="https://www.internet-navigator.de/programmieren-lernen-am-c64-von-basic-bis-assembler/">Programmieren lernen am C64 – von BASIC bis Assembler</a> erschien zuerst auf <a rel="nofollow" href="https://www.internet-navigator.de">internet-navigator.de</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p class="note">Dieser Leitfaden führt dich Schritt für Schritt vom ersten BASIC-Listing bis zu ersten Assembler-Routinen auf dem Commodore 64.</p>
<section class="lede">Warum ausgerechnet der <strong>Commodore 64</strong>? Weil er wie kaum ein anderer Rechner zeigt, <em>was</em> ein Computer wirklich tut: Speicher lesen und schreiben, Register setzen, Bits schieben – und daraus Text, Grafik und Musik formen. Am <a href="https://www.internet-navigator.de/original-oder-nachbau-so-findest-du-die-besten-bauteile-fuer-deinen-alten-commodore-64/">C64</a> ist die Distanz zwischen Code und Hardware winzig. Genau das macht ihn zum idealen Lernsystem für alle, die programmieren <em>verstehen</em> wollen – nicht nur „benutzen“.</p>
</section>
<h2>1) Was du brauchst – echte Hardware oder moderner Komfort</h2>
<div class="grid cols-2">
<div class="card">
<h3>Option A: Original C64</h3>
<ul>
<li>Commodore 64 (Brotkasten oder C64C) + Monitor/TV</li>
<li>Speichermedium: 1541/1571 Floppy, Datasette oder SD-Lösungen</li>
<li>Optional: Cartridge (z. B. für komfortablere <a href="https://www.internet-navigator.de/arbeiten-von-zuhause-die-passenden-tools-und-tricks/">Tools</a>)</li>
</ul>
<p class="note">Vorteil: maximal authentisch. Nachteil: mehr Pflege, Ladezeiten und Medien-Handling.</p>
</div>
<div class="card">
<h3>Option B: Moderne Toolchain</h3>
<ul>
<li>Emulator (z. B. VICE) zum schnellen Testen</li>
<li>Editor/IDE + Cross-Assembler (z. B. ACME, ca65, Kick Assembler)</li>
<li>Konverter/Tools für Grafik &amp; Sprite-Daten</li>
</ul>
<p class="note">Vorteil: schnell, debugfreundlich, perfekt fürs Lernen. Später kannst du alles auf echter Hardware laufen lassen.</p>
</div>
</div>
<h2>2) BASIC 2.0 verstehen – dein erster Fuß in der Tür</h2>
<p>Das im ROM integrierte <strong>Commodore BASIC 2.0</strong> ist knapp, aber lehrreich. Es bietet Variablen, Schleifen, Bedingungen, einfache Ein-/Ausgabe – und vor allem: direkten Zugriff auf Speicher via <code>PEEK</code> (lesen) und <code>POKE</code> (schreiben). Damit greifst du auf Grafik-, Klang- und Systemregister zu.</p>
<h3>2.1 Dein erstes Programm</h3>
<pre>10 PRINT "HALLO C64!"
20 GOTO 10
RUN</pre>
<p>Drücke <kbd>RUN/STOP</kbd> zum Abbrechen. Schon hier lernst du: Zeilennummern strukturieren Programme, <code>PRINT</code> schreibt auf den Bildschirm, <code>GOTO</code> springt – und du steuerst den Fluss.</p>
<h3>2.2 Variablen, Schleifen, Zufall</h3>
<pre>10 FOR I=1 TO 10
20 X=RND(1)*40 : Y=RND(1)*25
30 POKE 1024+INT(Y)*40+INT(X), 42  : REM Stern (*) ins Screen-RAM
40 NEXT
RUN</pre>
<p>Der sichtbare Textbildschirm beginnt beim <strong>Screen-RAM</strong> an Adresse <code>1024</code> (dezimal, also $0400). Ein Zeichen ist ein Byte. Mit der Formel setzt du Sterne an zufällige Positionen.</p>
<h3>2.3 Farben und Ränder</h3>
<p>Der C64 hat <em>Border</em>&#8211; und <em>Background</em>-Farbe in speziellen VIC-II-Registern:</p>
<ul>
<li><strong>Border:</strong> Adresse <code>53280</code> (dez. = $D020)</li>
<li><strong>Background:</strong> Adresse <code>53281</code> (dez. = $D021)</li>
</ul>
<pre>10 FOR C=0 TO 15
20 POKE 53280,C : POKE 53281,(C+2) AND 15
30 FOR T=1 TO 300:NEXT T
40 NEXT</pre>
<p>So fühlst du die Verbindung von Code zu Hardware: Ein Wert ins Register – sofort sichtbarer Effekt.</p>
<h3>2.4 Tastatur lesen, Interaktion bauen</h3>
<p>Über <code>GET A$</code> liest du Zeichen, ohne zu warten:</p>
<pre>10 PRINT "DRUECKE Q, UM ZU BEENDEN"
20 GET K$ : IF K$="Q" THEN END
30 GOTO 20</pre>
<p>Für <a href="https://www.internet-navigator.de/online-spiele/">Spiele</a> kombinierst du <code>GET</code> mit <code>POKE</code>-Eingriffen (z. B. Sprite-Koordinaten) – siehe unten.</p>
<h2>3) PEEK &amp; POKE – der direkte Draht zur Maschine</h2>
<p>Mit <code>POKE</code> schreibst du Bytewerte in Adressen; <code>PEEK</code> liest sie. Typische Bereiche:</p>
<ul class="check">
<li><strong>Screen-RAM</strong> ab 1024: Zeichen-Codes</li>
<li><strong>Farb-RAM</strong> ab 55296 ($D800): Farbcodes</li>
<li><strong>VIC-II-Register</strong> 53248–53311 ($D000–$D03F): Grafik/Sprites</li>
<li><strong>SID-Register</strong> 54272–54391 ($D400–$D47F): Sound</li>
</ul>
<h3>3.1 Einfache Sprite-Bewegung in BASIC</h3>
<p>Sprites sind Hardware-Objekte, die der VIC-II selbst blitted. Basisschritte:</p>
<ol>
<li>Sprite aktivieren</li>
<li>Position setzen</li>
<li>Daten (Form) zuweisen</li>
</ol>
<pre>5 REM  SPRITE 0 EIN, BASISWERTE
10 POKE 53269,1           : REM $D015 - Sprite 0 an
20 POKE 53248,100         : REM $D000 - X
30 POKE 53249,100         : REM $D001 - Y
40 POKE 2040,13           : REM Sprite-Pointer (zeigt auf 13*64 Bytes)
50 REM  GROBE FORMDATEN IN DEN RAM-BEREICH SCHREIBEN, z. B. AB $3400
60 REM  (Hier der Kürze wegen weggelassen – Tools erzeugen die 64-Byte-Daten)
70 FOR X=100 TO 220 : POKE 53248,X : FOR T=1 TO 4:NEXT T : NEXT</pre>
<p>Im Alltag erzeugst du Sprite-Daten komfortabel mit Grafik-Tools und lädst sie nach <em>64-Byte-Grenzen</em> ab. Der Pointer in <code>2040</code> ist der Index auf diese 64-Byte-Blöcke.</p>
<h3>3.2 Kleiner Sound-Kick</h3>
<p>Für einfache Effekte reicht ein Lautstärke-Impuls:</p>
<pre>10 FOR V=0 TO 15 : POKE 54296,V : FOR T=1 TO 30:NEXT T : NEXT
20 FOR V=15 TO 0 STEP -1 : POKE 54296,V : FOR T=1 TO 30:NEXT T : NEXT</pre>
<p><code>54296</code> ist das SID-Lautstärkeregister ($D418). Für „richtige“ Töne setzt du Frequenz, Wellenform und Hüllkurven der Stimmen – das folgt idealerweise in einem eigenen Kapitel.</p>
<h2>4) Von BASIC zu Assembler – warum und wann?</h2>
<p>BASIC ist großartig zum Lernen – aber <em>langsam</em> bei Grafik, Spielen und Echtzeit-Sound. <strong>Assembler</strong> ist die Sprache der CPU (6510, eine Variante des 6502). Sie lässt dich:</p>
<ul>
<li>Pixel und Sprites sehr schnell bewegen</li>
<li>präzise Soundroutinen und Effekte programmieren</li>
<li>Interrupts, Rasterzeilen-Tricks, Scroller und Demos bauen</li>
</ul>
<h3>4.1 Was du über den 6510 wissen solltest</h3>
<ul>
<li><strong>Register:</strong> A (Akkumulator), X, Y, Status, Stackpointer, Program Counter</li>
<li><strong>Adressierungsarten:</strong> <em>immediate</em> (<code>LDA #$01</code>), <em>absolute</em> (<code>LDA $D020</code>), <em>zero page</em> (<code>LDA $02</code>), <em>indiziert</em> (<code>LDA $D000,X</code>), <em>indirekt</em> u. a.</li>
<li><strong>Taktrate:</strong> ~1 MHz (PAL), dafür sehr nahe am Metall</li>
</ul>
<h3>4.2 Minimales Assembler-Programm (Farben blinken)</h3>
<p>Mit einem Cross-Assembler erzeugst du eine <code>.prg</code>, die du im Emulator startest. Beispiel (pseudoneutral, für gängige Assembler leicht anpassbar):</p>
<pre>; Setzt Border/Background in einer Schleife
        * = $0801        ; BASIC-Autostart-Stub könnte hier stehen (optional)
        * = $1000
Start   LDA #$00
Loop    STA $D020        ; Border
        CLC
        ADC #$01
        AND #$0F
        STA $D021        ; Background
        JSR Wait
        BNE Loop
Wait    LDY #$FF
W1      LDX #$FF
W2      DEX
        BNE W2
        DEY
        BNE W1
        RTS</pre>
<p>Das ist keine „schöne“ Zeitbasis – aber du siehst den Unterschied: direkte Registerzugriffe, kaum Overhead, sofortige Reaktion.</p>
<h2>5) Tool-Empfehlungen für den Start</h2>
<div class="grid cols-3">
<div class="card">
<h3>Emulator</h3>
<p>Ein aktueller C64-Emulator mit Debugger/Monitor (Breakpoints, Speicher-/Registeranzeige) ist Gold wert, um zu lernen und Fehler zu finden.</p>
</div>
<div class="card">
<h3>Assembler</h3>
<p>Cross-Assembler wie <em>ACME</em>, <em>ca65</em> oder <em>Kick Assembler</em> sind etabliert. Sie erzeugen verlässliche <code>.prg</code>-Dateien und bieten Makros/Includes.</p>
</div>
<div class="card">
<h3>Grafik/Sprite-Tools</h3>
<p>Sprite- und Charset-Editoren sparen Zeit. Exportiere Daten direkt als Bytefolgen, die du ins Ziel-RAM lädst.</p>
</div>
</div>
<h2>6) Praxis: Ein einfacher Assembler-Scroller (Text schieben)</h2>
<p>Ein klassischer Effekt ist der horizontale Text-Scroller im Textmodus. Kernidee: Das Screen-RAM (ab 1024) nach links schieben und rechts neue Zeichen einspeisen.</p>
<pre>; Sehr vereinfachte Idee (Pseudo-Assembler)
        * = $1000
SCROLL  LDY #$00
ROW     LDX #$00
LOOP1   LDA $0401,X      ; Zeichen aus Spalte 1
        STA $0400,X      ; nach links kopieren
        INX
        CPX #$27         ; 40 Spalten = $28, letzte bleibt für neuen Char
        BNE LOOP1
        LDA NewChar      ; neuer Buchstabe
        STA $0427        ; rechts anfügen
        ; nächste Zeile? (40er Schritte, +$28)
        ; ... (wiederholen, oder nur eine Zeile scollen)
        JMP SCROLL</pre>
<p>Für echte Demos nutzt man Raster-Interrupts, um das Timing exakt an den Bildaufbau zu koppeln – ein ideales Lernprojekt nachdem die Basics sitzen.</p>
<h2>7) Von der Theorie zur Praxis: Ein Lernpfad, der funktioniert</h2>
<ol>
<li><strong>BASIC-Warm-up:</strong> Variablen, Schleifen, Screen-RAM, Farben, <code>GET</code>-Eingaben. Schreibe ein kleines Textspiel (z. B. „Ratespiel“ mit Highscore).</li>
<li><strong>PEEK/POKE-Power:</strong> Sprite aktivieren, bewegen; Farbe/Position aus Eingaben ändern. Baue einen „Sprite-Editor light“, der Koordinaten in Variablen hält.</li>
<li><strong>Assembler-Hello:</strong> Lade eine Mini-Routine bei $1000 und starte sie aus BASIC (<code>SYS 4096</code>). Lasse Border/Background blinken, bewege einen Sprite-X-Wert in einer Schleife.</li>
<li><strong>Assembler-Spielstein:</strong> Positions-Update (X/Y), Kollision (Sprite-Kollisionsregister), Punkte zählen – zurückmelden an BASIC (gemeinsame Daten im RAM).</li>
<li><strong>Raster-IRQ:</strong> Richte einen Interrupt ein, der regelmäßig Logik/Grafik ausführt, während BASIC oder das Hauptprogramm ruhig bleibt.</li>
<li><strong>Sound-Step:</strong> Nutze eine einfache Tonroutine (Frequenz setzen, Gate an/aus). Erweitere später um Hüllkurven und Wellenform-Variationen.</li>
<li><strong>Miniprojekt abschließen:</strong> Einfache „Catch-the-Star“-Mechanik oder ein einzeiliger Scroller mit Sound-Tick.</li>
</ol>
<h2>8) Typische Stolpersteine – und wie du sie vermeidest</h2>
<ul>
<li><strong>Zeit &amp; Takt:</strong> BASIC-Schleifen wirken zufällig langsam; plane visuelle Effekte mit kleinen Warte-Schleifen oder (später) Raster-Interrupts.</li>
<li><strong>Speicherbereiche:</strong> Nicht jeden Bereich darfst du bedenkenlos überschreiben. Screen-RAM, Farb-RAM, Zero Page, I/O-Register – lerne ihre Adressen.</li>
<li><strong>Sprite-Datenlage:</strong> Sprite-Pointer zeigen auf 64-Byte-Blöcke. Achte auf korrekte Ausrichtung und Bank-Einstellungen, sonst „verzieht“ es Sprites.</li>
<li><strong>Emulator vs. echte Hardware:</strong> Filter, Timing, TV-Ausgabe – teste kritische Effekte auch „am Eisen“, wenn möglich.</li>
</ul>
<h2>9) Praxisbeispiele – kurz &amp; knackig</h2>
<h3>9.1 BASIC: Textlauflicht quer über den Bildschirm</h3>
<pre>10 POKE 53280,6 : POKE 53281,0 : CLR
20 T$=" C64 ROCKT!  "
30 FOR R=1 TO 200
40 FOR I=1 TO LEN(T$)
50 POKE 1024+I,ASC(MID$(T$,I,1))
60 NEXT I
70 FOR D=1 TO 80:NEXT D
80 FOR I=1 TO LEN(T$)-1
90 POKE 1024+I,PEEK(1024+I+1)
100 NEXT I
110 NEXT R</pre>
<h3>9.2 BASIC: Einfacher „Biep“ auf Knopfdruck</h3>
<pre>10 PRINT "DRUECKE LEERTASTE FUER BIEP"
20 GET K$ : IF K$&lt;&gt; " " THEN 20
30 FOR V=0 TO 15 : POKE 54296,V : NEXT : FOR V=15 TO 0 STEP -1 : POKE 54296,V : NEXT
40 GOTO 20</pre>
<h3>9.3 Assembler: Border blitzt beim Tastendruck</h3>
<pre>; Läuft ab $1000, Start via SYS 4096
        * = $1000
START   LDA #$06
        STA $D020
WARTEN  JSR GETKEY        ; eigene Routine, die 0 zurückgibt, wenn kein Key
        BEQ WARTEN
        LDA #$02          ; andere Farbe
        STA $D020
        JSR DELAY
        LDA #$06
        STA $D020
        JMP WARTEN

GETKEY  LDA $C6           ; Tastatur-Pufferzähler (einfacher Poll)
        RTS

DELAY   LDY #$FF
D1      LDX #$FF
D2      DEX
        BNE D2
        DEY
        BNE D1
        RTS</pre>
<p class="note">Die Key-Abfrage hier ist minimalistisch. „Richtig“ tastet man die CIA-Ports ab oder nutzt KERNAL-Routinen – das lernst du im nächsten Schritt deiner Reise.</p>
<h2>10) Didaktischer Mehrwert – C64-Programmieren als Bildungskatalysator</h2>
<p>Ein Retro-System reduziert Komplexität: kein Paket-Chaos, keine Milliarden-Bibliotheken, keine GUI-„Magie“. Du interagierst direkt mit Speicher und Registern – ausgezeichnet, um <em>Algorithmik</em> (Schleifen, Bedingungen, Datenstrukturen) und <em>Systemverständnis</em> (Speicher, I/O, Interrupts) zu verankern. In Lernumgebungen (AGs, Maker-Spaces, Hochschul-Propädeutik) liefert der C64 schnelle Erfolgserlebnisse und fördert Transfer: Wer hier PEEK/POKE meistert, denkt auch in modernen Umgebungen näher an der Maschine.</p>
<h2>11) Projektideen für deine ersten Wochen</h2>
<ul class="check">
<li><strong>„Snake light“</strong> in BASIC mit Score und Wänden</li>
<li><strong>Sprite-Demo</strong>: ein Objekt folgt Eingaben (links/rechts/hoch/runter)</li>
<li><strong>Scroller</strong> mit Logo (Textmodus), später <em>Char-Animation</em> (eigene Tiles)</li>
<li><strong>Mini-SFX</strong> (BASIC): kurze Lautstärke-Hüllkurve, „Treffer“-Sound</li>
<li><strong>Assembler-Upgrade</strong>: Sprite-Bewegung in IRQ-Routine für weiches Scrolling</li>
</ul>
<h2>12) Nächste Schritte – wie es sinnvoll weitergeht</h2>
<ol>
<li>Lege dir eine <strong>Cheatsheet-Liste</strong> mit Kernadressen an (Screen-RAM, VIC-II, SID, CIA).</li>
<li>Nutze den Emulator-Monitor: Step-by-Step, Register betrachten, Speicher „live“ ändern.</li>
<li>Trenne Logik und Darstellung früh – erst Daten, dann Anzeige. Das lohnt sich auch bei 1 MHz.</li>
<li>Lerne ein <strong>Assembler-Makrosystem</strong>, um wiederkehrende Muster (Warteschleifen, Sprite-Updates) sauber zu kapseln.</li>
<li>Baue dir eine <strong>kleine Libray</strong> (IRQ-Init, Zeitbasis, Zufall, Text-Out), die du in neue Projekte übernimmst.</li>
</ol>
<div class="ok">
<p><strong>Fazit:</strong> Der C64 ist ein wunderbarer Lehrer. Mit BASIC lernst du die Grundlagen elegant und sichtbar. Mit PEEK/POKE öffnest du die Tür zur Hardware. Mit Assembler erschließt du Geschwindigkeit, Präzision und Effekte, die auch heute noch begeistern. Beginne klein, halte deinen Code lesbar – und steigere dich Schritt für Schritt zu Sprites, Scrolling, Sound und Interrupts. Viel Spaß beim Coden!</p>
</div>
<p>Der Beitrag <a rel="nofollow" href="https://www.internet-navigator.de/programmieren-lernen-am-c64-von-basic-bis-assembler/">Programmieren lernen am C64 – von BASIC bis Assembler</a> erschien zuerst auf <a rel="nofollow" href="https://www.internet-navigator.de">internet-navigator.de</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
