feat(kernal): $E5B4, $EA24, and $ECF0 at their well-known addresses
cc65's C64 runtime and ip65 call past the jump table: $E5B4 takes the first key from the keyboard buffer (cgetc), $EA24 points USER at the colour RAM of PNT's line (cursor positioning), and $ECF0 holds the low bytes of the screen lines' addresses (ip65's VT100 code), as Mapping the Commodore 64 describes them. vicii_init's work moves out of $E5A0-$E5C8 to free $E5B4, and on the standard layout PNT and USER are worked out through the routine at $EA24.
This commit is contained in:
1 parent
ec4dc7df62
commit
a45f63e34e
9 files changed
+132
-39
No files matched your search
@@ -22,43 +22,9 @@ vicii_init:
|
||||
|
||||
} else {
|
||||
|
||||
; Clear everything - turn off sprites (observed hanging around after
|
||||
; running programs and resetting), etc.
|
||||
; The work is elsewhere: $E5B4, inside the 41 bytes it takes, is the
|
||||
; keyboard buffer's well-known entry (e5b4.get_from_keyboard_buffer.s)
|
||||
|
||||
lda #$00
|
||||
ldx #$2E
|
||||
@1:
|
||||
sta __VIC_BASE, x
|
||||
dex
|
||||
bpl @1
|
||||
|
||||
; Set up default IO values
|
||||
; - [CM64] page 129 - VIC_SCROLY
|
||||
; - [CM64] pages 140-144 - VIC_SCROLX
|
||||
; - [CM64] pages 145-146 - VIC_YMCSB
|
||||
|
||||
lda #$1B ; according to [CM64] page 137 some software assumes oldest bit is 0
|
||||
sta VIC_SCROLY
|
||||
lda #$C8
|
||||
sta VIC_SCROLX ; 40 column, etc.
|
||||
lda #$14
|
||||
sta VIC_YMCSB
|
||||
lda #$0F
|
||||
sta VIC_IRQ ; clear all interrupts
|
||||
|
||||
; We use a different colour scheme of white text on all blue by default,
|
||||
; but brand-specific color scheme can also be enabled
|
||||
|
||||
lda #CONFIG_COLOR_BG
|
||||
sta VIC_EXTCOL
|
||||
sta VIC_BGCOL0
|
||||
|
||||
; Setup default I/O devices
|
||||
|
||||
!ifdef CONFIG_IEC {
|
||||
jmp clrchn_reset
|
||||
} else {
|
||||
jmp CLRCHN
|
||||
}
|
||||
jmp vicii_init_registers
|
||||
|
||||
} ; ROM layout
|
||||
@@ -0,0 +1,52 @@
|
||||
;; #LAYOUT# STD * #TAKE
|
||||
;; #LAYOUT# CRT KERNAL_0 #TAKE
|
||||
;; #LAYOUT# M65 KERNAL_1 #TAKE
|
||||
;; #LAYOUT# * * #IGNORE
|
||||
|
||||
;
|
||||
; The VIC-II set-up of vicii_init (e5a0.vicii_init.s), moved out of $E5A0-$E5C8
|
||||
; so that $E5B4 is free
|
||||
;
|
||||
|
||||
|
||||
vicii_init_registers:
|
||||
|
||||
; Clear everything - turn off sprites (observed hanging around after
|
||||
; running programs and resetting), etc.
|
||||
|
||||
lda #$00
|
||||
ldx #$2E
|
||||
@1:
|
||||
sta __VIC_BASE, x
|
||||
dex
|
||||
bpl @1
|
||||
|
||||
; Set up default IO values
|
||||
; - [CM64] page 129 - VIC_SCROLY
|
||||
; - [CM64] pages 140-144 - VIC_SCROLX
|
||||
; - [CM64] pages 145-146 - VIC_YMCSB
|
||||
|
||||
lda #$1B ; according to [CM64] page 137 some software assumes oldest bit is 0
|
||||
sta VIC_SCROLY
|
||||
lda #$C8
|
||||
sta VIC_SCROLX ; 40 column, etc.
|
||||
lda #$14
|
||||
sta VIC_YMCSB
|
||||
lda #$0F
|
||||
sta VIC_IRQ ; clear all interrupts
|
||||
|
||||
; We use a different colour scheme of white text on all blue by default,
|
||||
; but brand-specific color scheme can also be enabled
|
||||
|
||||
lda #CONFIG_COLOR_BG
|
||||
sta VIC_EXTCOL
|
||||
sta VIC_BGCOL0
|
||||
|
||||
; Setup default I/O devices
|
||||
|
||||
!ifdef CONFIG_IEC {
|
||||
jmp clrchn_reset
|
||||
} else {
|
||||
jmp CLRCHN
|
||||
}
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
;; #LAYOUT# STD * #TAKE
|
||||
;; #LAYOUT# * * #IGNORE
|
||||
|
||||
;
|
||||
; Well-known Kernal routine, described in:
|
||||
;
|
||||
; - [CM64] Computes Mapping the Commodore 64 - $E5B4, LP2
|
||||
;
|
||||
; Takes the first key from the keyboard buffer, which must not be empty, and moves the
|
||||
; others up. Out: the key in A. X is kept.
|
||||
;
|
||||
|
||||
|
||||
get_from_keyboard_buffer:
|
||||
|
||||
lda KEYD
|
||||
pha
|
||||
jsr pop_keyboard_buffer
|
||||
pla
|
||||
|
||||
rts
|
||||
@@ -0,0 +1,3 @@
|
||||
cc65's C64 runtime calls $E5B4 (KBDREAD in its cbm_kernal.inc) from cgetc, once the keyboard
|
||||
buffer holds a key, and takes the key from A; so does every cc65 program that reads a key,
|
||||
Contiki's among them.
|
||||
@@ -0,0 +1,2 @@
|
||||
cc65's C64 runtime calls $EA24 (UPDCRAMPTR in its cbm_kernal.inc) after PLOT has set the cursor,
|
||||
for USER to follow PNT, before it stores a character's colour through USER.
|
||||
@@ -0,0 +1,24 @@
|
||||
;; #LAYOUT# STD * #TAKE
|
||||
;; #LAYOUT# * * #IGNORE
|
||||
|
||||
;
|
||||
; Well-known Kernal routine, described in:
|
||||
;
|
||||
; - [CM64] Computes Mapping the Commodore 64 - $EA24
|
||||
;
|
||||
; Sets USER to the colour RAM location of PNT's screen line. Screen RAM starts on a
|
||||
; kilobyte boundary, as the VIC-II fetches it, so the line's place within its kilobyte
|
||||
; is its place in the colour RAM.
|
||||
;
|
||||
|
||||
|
||||
screen_calculate_USER:
|
||||
|
||||
lda PNT+0
|
||||
sta USER+0
|
||||
lda PNT+1
|
||||
and #$03
|
||||
ora #>COLOR_RAM
|
||||
sta USER+1
|
||||
|
||||
rts
|
||||
@@ -0,0 +1,2 @@
|
||||
ip65's VT100 emulation (drivers/c64vt100.s) reads the low byte of a screen line's address from
|
||||
$ECF0, indexed by the line number.
|
||||
@@ -0,0 +1,17 @@
|
||||
;; #LAYOUT# STD * #TAKE
|
||||
;; #LAYOUT# * * #IGNORE
|
||||
|
||||
;
|
||||
; Well-known Kernal table, described in:
|
||||
;
|
||||
; - [CM64] Computes Mapping the Commodore 64 - $ECF0
|
||||
;
|
||||
; The low bytes of the 25 screen lines' addresses, 40 bytes apart
|
||||
;
|
||||
|
||||
|
||||
screen_line_lo_bytes:
|
||||
|
||||
!for line, 0, 24 {
|
||||
!byte <(line * 40)
|
||||
}
|
||||
@@ -26,7 +26,7 @@ screen_calculate_PNT_USER_from_X: ; entry point for screen_clear_line
|
||||
; Add 40 to PNT for every line
|
||||
|
||||
cpx #$00
|
||||
beq screen_calculate_USER
|
||||
beq @3
|
||||
@1:
|
||||
lda #40
|
||||
clc
|
||||
@@ -37,8 +37,13 @@ screen_calculate_PNT_USER_from_X: ; entry point for screen_clear_line
|
||||
@2:
|
||||
dex
|
||||
bne @1
|
||||
@3:
|
||||
|
||||
; FALLTROUGH
|
||||
!ifdef ROM_LAYOUT_STD {
|
||||
|
||||
jmp screen_calculate_USER ; at its well-known address, $EA24
|
||||
|
||||
} else {
|
||||
|
||||
screen_calculate_USER:
|
||||
|
||||
@@ -54,3 +59,4 @@ screen_calculate_USER:
|
||||
sta USER+1
|
||||
|
||||
rts
|
||||
}
|
||||
Reference in new issue
Block a user