Weblog & Podcast von Volker Strübing

16 shades of grey

Datum: 10.04.17
Kategorien: Best of Schnipselfriedhof, C64, Kloß und Spinne

Tertiäre Bezugsperson

Es ist ja nicht so, dass ich nichts zu tun hätte.
Ich bin frischgebackene „primäre Bezugsperson“ für einen frischgebackenen Erdenbürger, na gut, sekundäre, na gut, tertiäre, denn manchmal habe ich das Gefühl, dass unsere Tochter „den Rommelsbacher“ lieber hat als mich („der Rommelsbacher“ ist die Wärmelampe über dem Wickeltisch, welche bei jedem Wickeln für extatische Begeisterung bei ihr sorgt und brennende Eifersucht in mir auslöst).

P1140243

(Teile dieses Blog-Posts wurden unter erschwerten Bedingungen geschrieben. Es gab Bulette.)

Ich konnte seit Mitte Dezember insgesamt fünf oder sechs Nächte durchschlafen, interessiere mich plötzlich für Dinge wie Staubsaugerroboter, habe seit Wochen den Boden der Dreckwäschekiste nicht mehr gesehen und verliere langsam aber sicher meine Sprache und sämtliche mühsam erlernten Bewegungsmuster und sozialen Normen – wenn euch jemand erzählt, Babys würden ihre Eltern nachahmen, glaubt ihm nicht. Es verhält sich genau andersrum, bläh, bläh, göbbel glob! Nebenher versuche ich trotzdem zu schreiben, der eine oder andere Auftritt ist ebenfalls zu absolvieren und ab und zu muss man auch ein Bier trinken gehen, bevor einen die anderen Menschen komplett abschreiben.

kloss und spinne c64 01

(Kloß und Spinne Demo (Beta))

Und da dachte ich mir, Mensch, Volker, in dem bisschen Freizeit, dass dir bleibt, meist zwischen 22 und null Uhr, lernst du Assemblerprogrammierung. Und setzt Kloß und Spinne für den C64 um,  einen 8bit-Computer, der 1982 auf den Markt kam und 16 Farben  bei einer Auflösung von maximal 0,065 Megapixeln darstellen konnte. (Die Überschrift des Artikels rührt daher, dass es auf dem Schwarzweißfernseher in meinem Jugendzimmer 16 Grautöne waren, lustig, oder?!)

titel

(Das Geflacker enthält alle 16 Farben, und es sind die schönsten Farben der Welt: ekelgrün, schmutzigrot, braunrosa etc.)

Hogwarts ohne Hermine

1985 hatte ich meinen (ersten) C64 und er war das Coolste, was ich jemals hatte. Ein Tor in ein neues Universum mit unendlichen Möglichkeiten, eine Maschine, auf der man schreiben, mit der man Musik machen und bunte, bewegte Bilder auf einen Fernsehschirm bringen konnte. Wie besonders das damals war, können sich die Jüngeren vielleicht nicht vorstellen – aber damals war der Normalbürger rein passiver Medienkonsument. Er sah, las und hörte, was ihm vorgesetzt wurde. Die Möglichkeit, selbst zum Sender zu werden, war wahnsinnig aufregend.  Da war eine ganze Welt, die man erobern und gestalten konnte, und zu der außer uns Eingeweihten niemand Zutritt hatte. Und zu welcher Mädchen zu unserem Leidwesen überhaupt keinen Zutritt begehrten.

 

P1140137

(Größenvergleich verschiedener Peripheriegeräte: unten: 1541-Diskettenlaufwerk (C64), oben links: SD2IEC-Laufwerk (C64), oben rechts: Nuckel (Baby). Siehe weiter unten im Text.)

 

Es waren die Zeiten, als man sich noch zwischen Computer und Freundin entscheiden musste – ein Umstand, dem die Firma Commodore später Rechnung zollte, in dem sie ihre neue Heimcomputergeneration „Amiga“ – Freundin – taufte …

Oh ja, wir haben Opfer gebracht für den Fortschritt! Eines Tages werde ich einen langen, langen Text darüber schreiben.

Ich hab keine Ahnung, was aus meinem alten C64 wurde. Letztes Jahr habe ich bei Ebay einen ersteigert. Anlass war ein Doku-Projekt über die Heimcomputerszene in der DDR, das leider vom Sender gecancelt wurde. Schade, wär schön geworden. Den C64 habe ich trotzdem nicht mehr hergegeben. Wenn ich ihn heute anschalte und der blaue Bildschirm erscheint, kann ich mich manchmal wieder in den Jugendlichen hineinversetzen, für den dieser Startbildschirm ungefähr dasselbe war wie das aufblasbare Raumschiff aus “Adolars phantastische Abenteuer”.  Das Ticket nach Hogwarts. Ein bisschen vom alten Zauber ist noch da.

P1140265

(Fragt nicht!)

Nachdem ich neulich für einen Blogartikel einen Kloß-und-Spinne-Screenshot in eine C64-Grafik konvertiert hatte, setzte sich plötzlich die Idee fest, eine Kloß-und-Spinne-Umsetzung für den C64 zu schreiben. Schnell war klar, dass ich mit BASIC nicht weit kommen würde und nur Assembler, wenn man so will die menschenlesbare Form der Maschinensprache, in Frage käme. Und dass ich diese von Grund auf lernen müsste. In den 80ern hatte ich mich ein bisschen damit beschäftigt, bin aber nie weit gekommen. Ich habe mich damals vor allem auf’s Spielen und Musikmachen und von-niemals-realisierten-Projekten-Träumen konzentriert. (Und auf Biertrinken, Rauchen und Punkkonzerte, wir waren zwar Nerds, aber trotzdem Menschen und junge Männer.)

Jetzt habe ich in drei Monaten eine lauffähige Demo-Version von „Kloß und Spinne – Reload,8,1“ geschrieben.

Und wenn demnächst wieder händeringend C64-Programmierer gesucht werden, weiß ich wofür ich das alles gemacht habe (ich glaube, die Bundeswehr sucht gerade mit großen Werbeplakaten welche ;)fail01

(Nicht alles hat auf Anhieb geklappt.)

Mit Flash etc. hätte sich das alles super einfach machen lassen, aber auf dem C64 ist das schon ein ziemlich umfangreiches und nicht ganz triviales Unterfangen. Es gibt Text-Bitmap-Splitscreens, Sprite-Multiplexer, zufallsgesteuerte gescripetete Sequenzen, für die ich sozusagen eine eigene Scriptsprache implementiert habe (ein zugegebenermaßen sehr großes Wort für das, was ich da mache, aber nicht komplett falsch), es gibt Bitmap-Animationen und ein ziemlich umfangreiches Hantieren mit Variablen, Statusbytes und allen möglichen Daten. (Nicht alles ist in dem Gif oben zu sehen.) Ein Profi kann darüber nur lachen, und wenn er sieht, wie ich das alles krumm und schief und mit Klebeband, Spucke und Bolognesesauce zusammengecoded habe, wird er sich die Haare ausraufen, aber hey, es läuft, mein erstes ernstzunehmendes Assembler-Programm!

murx

(Wow, ein Spritemultiplexer (alpha-Version))

Das Ganze macht mir gerade irrsinnig viel Spaß. Obwohl oder weil ich mich dabei so konzentrieren muss. Ich verwende Gehirnteile, die ansonsten derzeit brach liegen, deshalb ist es gleichzeitig sehr entspannend. Wahrscheinlich hat es einen ähnlichen Effekt, als würde ich in meiner Freizeit Sudokus oder komplizierte Mordfälle lösen. Die Lernkurve am Anfang ist ziemlich steil, das fetzt, man merkt, wie man besser wird. Wie stolz ich war, als die Grafik und die Sprites endlich korrekt dargestellt wurden und an der richtigen Stelle im Speicher lagen! Und als ich Kloß und Spinne und die anderen zum Blinzeln brachte, mannomann, das war was! Und als Horsts Kopf das erste Mal explodiert ist, da lief ich los, riss meine gerade gestilltwerdende Tochter aus den Armen ihrer Mutter, um ihr zu zeigen, was ihr Papa da tolles programmiert hat! Als sie schrie, wusste ich, dass der Effekt genauso schaurig und schockierend war, wie ich es geplant hatte! Das alles verblasst allerdings vor dem Stolz, den ich empfand, als die Sache mit den Dialogsequenzen schließlich funktionierte.

Irgendwann gibt es ein Update und irgendwann schreibe ich auch nochmal einen längeren Text über die ganze Sache mit den Computern in der DDR in den 80er Jahren. Und vielleicht ist irgendwann nirgendwann, weil ich momentan nicht dazu komme, weiterzumachen, aber egal, schon jetzt kann ich sagen: Es hat sich gelohnt!

Wer jetzt neugierig geworden ist, für den kommen hier einige Links und Downloads und ein Auszug aus dem Quelltext. Alle anderen verabschiede ich mit einem freundlichen SYS64738.

www.retro-programming.de

Ein wirklich tolles, umfangreiches, verständliches C64-Programmier-Tutorial. Wahnsinn. In diesen Seiten steck soviel Mühe und Liebe und ich hätte nicht eine Zeile gecoded ohne diese Seite (tatsächlich finden sich in meinem Quellcode noch einige VICII-Registerdefinitionen und eine Routine zur Anzeige eines Koala-Painter-Bildes, die ich direkt aus den Programmierbeispielen von retro-programming übernommen habe). Link:  www.retro-programming.de

CBM Program Studio

Wenn ich sage, dass ich den C64 programmiert habe, ist das ein bisschen geflunkert. Der C64 kam nur zum Testen zum Einsatz. Und meistens nicht einmal dann. CBM Program Studio ist eine Entwicklungsumgebung für Windows, mit der man mit dem heute üblichen Komfort C64-Software entwickeln und diese dann ebenfalls unter Windows in einem Emulator testen und debuggen kann. Ein geniales Tool, inklusive Sprite- und Charset-Editor. Hier geht’s zum Download: http://www.ajordison.co.uk/

Das bringt uns zu:

C64-Emulatoren

Davon gibt es eine Menge, ich verwende CCS64 und VICE64 und finde mal den einen, mal den anderen besser. Welcher originaler ist, kann ich nicht sagen. Die Grafik scheint mir bei beiden hundertprozentig umgesetzt, der Sound ist ein bisschen anders als bei meinem echten C64 aber nur ein bisschen und außerdem klang auch jeder C64 ein bisschen anders (zumindest die Exemplare mit dem alten 6581-Soundschip). Der größte Vorteil eines echten „Brotkastens“ ist … naja, eben der Brotkasten, das Gerät selbst, das Aussehen, das Klackern der Tasten, das Gewicht der Peripheriegeräte (nehmt mal so ein Netzgerät oder Diskettenlaufwerk in die Hand!), das ist ja doch ein Teil des Zaubers.

Wer im Keller noch einen C64 hat, jetzt Lust hat ihn hervorzuholen, der sollte trotzdem ein paar Euro inverstieren und sich ein

SD2IEC-Laufwerk

anschaffen – ein SD-Karten-Leser als Ersatz für ein Diskettenlaufwerk. Siehe Bild oben. Ein Bruchteil der Größe und des Gewichts und auf eine 4GB-SD-Karte passen soviele Daten wie auf ungefähr 28.000 5,25 Zoll-Disketten – genug, um das Saarland zweimal komplett zu bedecken!

Hier ist ein Link zum Händler mit dem schönen Namen “The future was 8bit”, der die niedliche mini-1541-Version verkauft:

https://www.thefuturewas8bit.com/shop/commodore/sd2iec-rc64.html

Falls jemand richtig neugierig ist:

Hier ist das „Kloß und Spinne“-Demo (bzw. die aktuelle Beta-Version) als CBM-Programstudio-Projekt für CBM-Prorgam Studio 3.10:

http://schnipselfriedhof.de/wp-content/uploads/2017/04/cbm-project-kloss-und-spinne.zip

Hier gibt’s das dazugehörige .prg-File, das man direkt im Emulator oder auf einem richtigen C64 laufen lassen kann:

http://schnipselfriedhof.de/wp-content/uploads/2017/04/demo-beta.zip

(TFM: “Q” startet eine Dialogsequenz, “N” startet den Norbert-erklärt-die-Welt-Screen, “H” lässt Horsts Kopf explodieren.)

Todo-Liste:  Fertigstellung des „Norbert erklärt die Welt“-Effekts, Kloß soll den Kopf schütteln können,  verschiedene Arm-Animationen für Spinne,  flexible Pupillenanimationen für Kloß und Sprinne,  Augenbrauen-Animation, die Katze soll atmen,  verschiedene Animationen für den Fernseher,  Soundimplementierung,  Erweiterung “Scriptsprache”,  Titelscreen inklusive Kloß-und-Spinne-Titelsong (SID edition),  noch irgendwas urst fetziges, was mir zwischendrin noch einfällt

Falls das hier übrigens jemand liest, der gut löten kann und Lust auf einen Bastelnachmittag bei Kaffee und Kuchen hat: Ich möchte einen zweiten Soundchip in meinen C64 einbauen. Habe alle Bauteile da, aber keinerlei Löterfahrung …

PS: Weil vielleicht nicht jeder direkt vor Augen hat, wie so ein C64-Programm aussieht ist hier der Quellcode des „Rumpfprogramms“ (ohne Variablendefinitionen, Subroutinen, Interruptroutinen etc., die ich getrennt editiert und mittels der Assembleranweisung „incasm“ eingebunden habe). Das ganze Programm mit allen Unterprogrammen hat ungefähr die 5-8fache Länge. Alles, was hinter einem Semikolon steht, ist ein Kommentar und kein Programmcode.

incasm "Variablen.asm"

*=$0801
;-----------------------------------------
;  ;  BASCIZEILE  SYS   2062
;------------------------------------------

 BYTE           $0B,$08,$DE,$07,$9E," 2062",$00,$00,$00 

;OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
;OO                                                                     OO
;OO                          INIT                                       OO
;OO                                                                     OO
;OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO

        lda $0001
        sta $d020
        and #%11111110
        sta $0001                       ; BASIC AUSSCHALTEN - RAM BEI A000 FREIGEBEN

incasm "init bitmap.asm"
incasm "init animations.asm"            

        jsr SR:SHOW_STANDARD_SPRITES         
        jsr SR:INIT_STANDARD_IRQS

;OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
;OO                                                                     OO
;OO                         TASTATURABFRAGE                             OO
;OO                                                                     OO
;OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO

R:TASTATURABFRAGE
 
        lda  F_SPRECHER
        bne R:TASTATURABFRAGE           ; solange noch jemand spricht keine   Tastaturabfrage
        lda $CB                         ;Tastatur-Matrixkoordinate lesen
        cmp M_Tastaturspeicher          ; hat sich etwas verändert?
        beq R:TASTATURABFRAGE           ; nö? weiter warten!
        sta M_Tastaturspeicher
        cmp #$40                        ;besteht die änderung darin, dass jetzt keine Taste mehr gedrückt ist?
        beq R:ANIMATION_SELECT  ; ja? Alles läuft weiter wie bisher    
        sta M_Tastaturspeicher          ; nein? D.h. es wurde gedrückt-> Speicher aktualisieren

R:ANIMATION_SELECT 
   
        lda M_Tastaturspeicher
        cmp #$1D                        ; H gedrückt?
        beq R:EXPLODIER
        cmp #$27                        ; N gedrückt?
        beq R:NORBERT_EDW
        cmp #$3E                        ; Q gedückt?
        beq R:_TEXT_PLUS_ANIMATION
        jmp R:TASTATURABFRAGE           ; etwas anderes gedrückt? zurück auf  start!
;OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
;OO                                                                     OO
;OO                          Texte und Animationen                      OO
;OO                                                                     OO
;OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO

R:_TEXT_PLUS_ANIMATION
;-----------------------------------------
;  Initialisierung / Textblockstart festlegen
;------------------------------------------
	jsr SR:GET_RND          		; Zufallszahl zur Anmationsauswahl
       and #%00001111          		;16 verschiedene Adressen
       tax                     		; Akku nach x
                                		;da wir mit der  Zufallszahl x-indizieren 
       lda $9ff0,x             		;x. Wert aus Animationsblock-
                               		;Einsprungtabelle laden
      sta MZ_Lesezeichen_Zero+1       	; als höherwertiges Lesezeichenbyte
                                   	;speichern
  	lda #$00                        	    
     	sta MZ_Lesezeichen_Zero         	; Lo-Byte auf 0

;-----------------------------------------
;  Initialisierung aktuelle Sprechblase
;------------------------------------------

R:NAECHSTE_SPRECHBLASE
        
        jsr SR:CLEARTEXT 
        ldy #$00;  Index Y auf 0 -> anfang der Sprechblase
        clc
;........... Befehlsbyte lesen, 9800 + x (erster durchlauf: +0)
        lda (MZ_Lesezeichen_Zero),y
        sta F_Sprecher                 ;in Sprecher-Flag speichern

;-----------------------------------------
; SPRECHER-ABFRAGE
;------------------------------------------

; ABFRAGE_OB_NORBERT_SPRICHT
      
        ;lda F_Sprecher                 ; ist eh noch im Akku
        cmp #$01                        ; 1 heißt: Norbert spricht
        bne R:ABFRAGE_OB_KLOSS_SPRICHT  ; nein? als nächstes Kloß abfragen!
                
; NORBERT SPRICHT

        lda SPRITE1OFFSET_BLICK_ZU_NORBERT ; (Kloßens Blickrichtung ändern)
        sta SPRITE1DATA
        lda #$05
        sta M_Standard_Farbe_Texthintergrund ; Text-BG=grün
        jmp R:ABFRAGE_SPRECHDAUER 

R:ABFRAGE_OB_KLOSS_SPRICHT

        lda F_Sprecher
        cmp #$02                        ; 
        bne R:ABFRAGE_OB_SPINNE_SPRICHT  ; nein? als nächstes Spinne abfragen!
                                          
; KLOSS SPRICHT

        lda SPRITE1OFFSET_BLICK_STANDARD ; KLoß Blick nach unten 
        sta SPRITE1DATA
        lda #$0e
        sta M_Standard_Farbe_Texthintergrund ; Text-BG=blau
        jmp R:ABFRAGE_SPRECHDAUER              

; ABFRAGE_OB_SPINNE_SPRICHT
R:ABFRAGE_OB_SPINNE_SPRICHT
        
        lda F_Sprecher        
        cmp #$03 
        bne R:ABFRAGE_OB_NIEMAND_SPRICHT  ; auch nicht? weiter abfragen!

; SPINNE SPRICHT
       
        lda SPRITE1OFFSET_BLICK_ZU_SPINNE ; KLoß Blick zu Spinne
        sta SPRITE1DATA
        lda #$02
        sta M_Standard_Farbe_Texthintergrund ; Text-BG=rot
        jmp R:ABFRAGE_SPRECHDAUER 

R:ABFRAGE_OB_NIEMAND_SPRICHT
        
        lda F_Sprecher        
        cmp #$00 
        bne R:ABFRAGE_SPRECHDAUER   ; auch nicht? weiter zur näxten abt.!

; NIEMAND SPRICHT
       
        lda SPRITE1OFFSET_BLICK_STANDARD ; KLoß Blick nach unten 
        sta SPRITE1DATA
        lda #$0f
        sta M_Standard_Farbe_Texthintergrund
        jmp R:ABFRAGE_SPRECHDAUER 

;-----------------------------------------
; SPRECHDAUER
;------------------------------------------           
R:ABFRAGE_SPRECHDAUER                   
        
        ldy #$01
        lda (MZ_Lesezeichen_Zero),y   ;Befehlsbyte 2 lesen,  9800 + y (+1)
        sta C_countdown_sprachdauer 
        lda F_Sprecher        
;........... Eine 0 heißt:NIEMAND spricht -> weiter zur Warteschleife
        cmp            #$00 
        bne R:INIT_OUTPUT_TEXT  ; nicht 0? Text ausgeben
;-----------doch 0? Kein Sprecher? Kein Text?
        jmp R:NAECHSTE_ANIMATION_STARTEN               
      
;-----------------------------------------
; TEXTAUSGABE INITIALISIEREN
;------------------------------------------  

R:INIT_OUTPUT_TEXT

        clc
        ;........... X wird der Zähler für die Schreibschleife  
        ldy #$00

;-----------------------------------------
; TEXTAUSGABE LOOP
;------------------------------------------  

R:OUTPUT_TEXT
       
        lda   (MZ_Lesezeichen_Zero),y  


; ABFRAGE DER END-BEFEHLE
;---------------------------------
        
        cmp #$fe
        beq R:NAECHSTE_ANIMATION_STARTEN
        cmp #$ff
        beq R:NEUE_TASTATUR_ABFRAGE
        ;.......Nichts davon? Zeichen ausgeben!
        sta $43fe,y
        iny 
        jmp R:OUTPUT_TEXT
        
R:NAECHSTE_ANIMATION_STARTEN
         ;.......warten bis Dauer abgelaufen (in interrupt S2) 
        lda C_countdown_sprachdauer
        bne R:NAECHSTE_ANIMATION_STARTEN
        
        lda SPRITE6OFFSET           ; Münder auf Anfangswert
        sta SPRITE6DATA 
        lda SPRITE7OFFSET
        sta SPRITE7DATA
        lda SPRITE4OFFSET
        sta SPRITE4DATA
        lda SPRITE5OFFSET
        sta SPRITE5DATA
        
        ;.......y zu Lesezeichen Zero Lobyte dazuadieren
        
        tya    ; y in den Akku
        adc MZ_Lesezeichen_Zero ; aktuelles Lobyte Lesezeichen dazuaddieren
        sta MZ_Lesezeichen_Zero ; und wieder dort speichern
        bcs R:NEXT_256er_PAGE   ; wenn Lobyte-Überlauf
        jmp R:NAECHSTE_SPRECHBLASE

R:NEXT_256er_PAGE
        inc MZ_Lesezeichen_Zero+1 ; HiByte erhöhen, umblättern
        clc
        jmp R:NAECHSTE_SPRECHBLASE

R:NEUE_TASTATUR_ABFRAGE
        jmp R:TASTATURABFRAGE

;OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
;OO                                                                     OO
;OO                      FINISH                                         OO
;OO                                                                     OO
;OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO

;-----------------------------------------
; Andere Programmteile inkludieren
;------------------------------------------

incasm "init irq.asm"
incasm "NorbertWelt.asm"
incasm  "Explosion.asm"
incasm "show sprites.asm"
incasm "interrupt S1 - Textfenster.asm"
incasm "interrupt S2 - Screen Split.asm"
incasm "interrupt S3 - Animationen.asm"
incasm "interrupt N1 - Splitscreen.asm" 
incasm "interrupt N2 - Top Sprites.asm"
incasm "interrupt N3 - bottom Sprites.asm"
incasm "subroutines.asm"

;-----------------------------------------
; Charset / Sprites / Bitmap
;------------------------------------------

*=$4800           ;charset DATEN ab 4800
incbin    "c64_lower.64c",2

*=$5000           ;SPRITE DATEN ab 5000
incbin    "Sprites05.bin"

*=$6000                      
incbin    "spin07.koa",2        ;Bild einbinden

*=$a000                       
incbin    "shapestest3.koa",2   ; Bitmap Animationsdaten

;-----------------------------------------
; TEXTDATEN
;------------------------------------------

*=$9800 ; Block 1


        byte            $ff         ; Ende des Animationsblocks 
     
*=$9a00 ; Block 2
        byte            03, 70      ; Figur 3 (Spinne)
        text            'Norbert, machste mir ne Brause?'
        byte            $fe
        
        byte            00, 20      ; Pause
        byte            $fe


        byte            01, $cc      ; Figur 1 (Norbert)
        text            'Brause ham wer nich. Schnaps kannste    '
        text            'haben.'
        byte            $fe

        
        byte            03, $b0      ; Figur 3 (Spinne) 
        text            'Och, nee, lass mal. n andermal gerne.   '
        text            'Und Kloss, wie gehts?            '
        byte            $fe

        byte            02, $cc      ; Figur 1 (Norbert)
        text            'Scheisse gehts. Manchmal denk ich, wir  '
        text            'leben in der Matrix ... '
        byte            $fe

        byte            00, 30      ; Pause
        byte            $fe

        byte            02, $a0      ; Figur 2 (Kloß) 
        text            '... und die Matrix ist ein C64!          '
        byte            $ff
      
*=$9c00 ; Block 3

        byte            01, $40      
        text            'Test 1'
        byte            $ff

*=$9d00 ; Block 4

        byte            02, $40      
        text            'Test 2'
        byte            $ff

*=$9e00 ;  Block 5

        byte            03, $40      
        text            'Test 3'
        byte            $ff
     
;Einsprungtabelle für Animationsblöcke     
*=$9ff0
        byte $9a, $9c, $9d, $9e
        byte $9a, $9c, $9d, $9e
        byte $9a, $9c, $9d, $9e
        byte $9a, $9c, $9d, $9e


6 thoughts on “16 shades of grey

    1. Danke! Und Dir großen Respekt, dass Du bis zum Kommentarbutton am Endes des Univer … äh.. Beitrags vorgedrungen bist ! (Wenn Du hinten raus ein bisschen ins Scrollen gekommen bist, ist das vollkommen in Ordnung ;) Liebe Grüße!

  1. Da kommen auch bei mir Erinnerungen hoch. Ich bin nur etwa ein Jahr jünger als Du und hatte damals auch einen C64. Die Faszination, die davon ausging, habe ich auch so erlebt. Damals habe ich viel BASIC programmiert (Sounds, Sprites), aber auch ein ganz kleines bisschen Maschinensprache.
    Natürlich erinnert man sich an “,8,1” (“,8,8” ging auch, hab ich nie kapiert). Aber bei dem SYS-Befehl habe ich erst gestutzt. Ich war überzeugt, es war SYS 64783, aber Du hast Recht. Trotzdem. Dass man sich so eine Zahl über 30 Jahre lang merkt?!

    1. Und ich hab erst SYS 49152 hingeschrieben … und dann noch mal nacgeguckt und gesehen, dass das ar nicht der Reset, sondern nur eine beliebte Einsprungadresse für Maschinensprachroutinen war ;) An Sys 64738 hat mich erst die Recherche wieder erinnert ;)

Comments are closed.