Kernal Hallo Welt

Aus C64-Wiki

Wechseln zu: Navigation, Suche
Baustelle 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
Persönliche Werkzeuge