Kernal Hallo Welt

Aus C64-Wiki
Zur Navigation springenZur Suche springen

Dieser Code in ACME-Style ist ein Beispiel für einen KERNAL-Ersatz, der die minimal nötigen Initialisierungen (des VIC etc.) nach einem Reset vornimmt und danach "Hallo Welt" auf den Bildschirm schreibt.

Der Code kann als Ausgangspunkt für z.B. eigene Entwicklungen von Steckmodulen (die im Ultimax-Modus der PLA laufen) benutzt werden.

;HalloWeltKernal by Alexandra 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