Kernal Hallo Welt
Aus C64-Wiki
![]() |
Dieser Artikel befindet sich im Aufbau und ist vorläufig als Entwurf einzustufen. |
So hat ein simpelster Kernal auszusehen.
Der Code ist ACME-Style und zeigt auf, was man alles erledigen muss, nur damit man ein simples "Hallo Welt" auf den Bildschirm kriegt.
;HalloWeltKernal by Markus Stehr aka BastetFurry/Dienstagstreff ;Dieser Quellcode darf als Basis für eigene Entwicklungen genutzt werden, auch mit ;geschlossenem Quellcode. ;Wir assemblieren in eine Datei ohne Startadresse !to "hallowelt.rom",plain ;Hier wird die zurzeitige Farbe für die CharOut Routine gespeichert. ;Zurzeit nur von ClearScreen (Bildschirm löschen) benutzt. ZP_CharColor = $02 ;;;;; Kernal fängt hier an *=$e000 ;Hier kommen wir nach einem Reset an. Reset_Entry: jsr InitZeroPage ;Einrichten der Zeropage mit den vorgabewerten jsr InitVIC ;Den VIC vorbereiten jsr ClearScreen ;Bildschirm löschen ldx #$00 ;und Text ausgeben, bedarf wohl keiner Erklärung textloop: lda hallowelt,x cmp #$00 beq Endless sta $0400,x inx jmp textloop ;da wir ansonsten nichts mehr zu tun haben, Maschine "stoppen" Endless: jmp Endless ;Diese Routine löscht den Bildschirmspeicher und das Farbram ClearScreen: ldx #$00 lda #$20 ClearScreenLoop1: sta $0400,x ; Bildschirmspeicher löschen sta $0500,x sta $0600,x sta $06e8,x dex bne ClearScreenLoop1: ldx #$00 lda ZP_CharColor ; Buchstabenfarbe aus der Zeropage holen ClearScreenLoop2: sta $d800,x ; Farbram löschen sta $d900,x sta $da00,x sta $dae8,x dex bne ClearScreenLoop2: rts ;Hier wird die Zeropage initialisiert, zurzeit nur mit dem Wert für die Buchstabenfarbe InitZeroPage: lda #$0e sta ZP_CharColor rts ;Initialisierung des VICs InitVIC: lda #$0e ;Rahmenfarbe Hellblau sta $d020 ;Setzen lda #$06 ;Hintergrund Blau sta $d021 ;Setzen lda #$14 ;\ sta $d018 ; \ lda #$08 ; |Normale Videokonfiguration sta $d016 ; |Setzen lda #$9B ; / sta $d011 ;/ rts ;Eingangspunkt für Interrupts ; ACHTUNG: Dies ist noch keine richtige Interruptabhandlung! INT_NMI_Entry; INT_IRQ_Entry: ;Alle Register auf den Stack pha txa pha tya pha ;Sollte der Interrupt vorzeitig beendet sein kann hier hin gesprungen werden ReturnFromINT: ;Alles wieder runter vom Stack und mit dem normalem Programmablauf fortfahren pla tay pla tax pla rti ;Strings hallowelt: !scr "hallo welt!" !byte $00 ;Alle Adressen für die IRQs und Reset *=$fffa ;NMI !word INT_NMI_Entry ;Reset !word Reset_Entry ;IRQ !word INT_IRQ_Entry