Kernal Hallo Welt
Aus C64-Wiki
Zur Navigation springenZur Suche springenDieser 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