Blob Blame History Raw
From 128991d868f94d471540a3964b682d902073460d Mon Sep 17 00:00:00 2001
From: "Curt J. Sampson" <cjs@cynic.net>
Date: Thu, 24 Oct 2019 13:46:41 +0900
Subject: [PATCH 080/170] libsrc/*/kplot.s: Use cbm_kernal.inc symbols, not
 hardcoded addrs

On C64, VIC-20 and Plus/4, the conio library PLOT routine uses direct
calls into the Kernal, including the Kernal PLOT routine that we're
replacing. These were previously hardcoded addresses; we change these
to use the symbols for those routines defined in cbm_kernal.inc. (This
changes no functionality.)

To do this, we need to import cbm_kernal.inc in a namespace so we
don't have a collision between the PLOT that we're defining and the
Kernal definition.

We also add a UPDCRAMPTR symbol (used by kplot for VIC-20 and C64) to
the direct entry kernal routines in in cbm_kernal.inc, and expand the
comments describing what the "direct entry" Kernal routines are.

<greg.king5@verizon.net> (GitHub: greg-king5) came up with this idea
and did initial testing of it.

This has been tested on VICE xvic, x64 and xplus4 emulators with a
program that does a cputs() call (github.com/0cjs/vic20cc65) to
confirm that it works the same way after as it did before.
---
 asminc/cbm_kernal.inc | 12 ++++++++++++
 libsrc/c64/kplot.s    | 11 ++++++-----
 libsrc/plus4/kplot.s  |  9 +++++----
 libsrc/vic20/kplot.s  | 10 ++++++----
 4 files changed, 29 insertions(+), 13 deletions(-)

diff --git a/asminc/cbm_kernal.inc b/asminc/cbm_kernal.inc
index 79edce06..6e1e1604 100644
--- a/asminc/cbm_kernal.inc
+++ b/asminc/cbm_kernal.inc
@@ -100,14 +100,26 @@ UDTIM          := $FFEA
 
 ; ---------------------------------------------------------------------------
 ; Kernal routines, direct entries
+;
+; Unlike the above, these are not standard functions with entries in the jump
+; table. They do not exist in all Kernals, and where they do the entry point is
+; specific to that particular machine and possibly even Kernal version.
+;
+; This list is not comprehensive: missing items for particular machines
+; should be added as needed.
+;
+; UPDCRAMPTR: Updates the color RAM pointer to match the screen RAM pointer.
+;
 
 .if .def(__VIC20__)
   CLRSCR       := $E55F
   KBDREAD      := $E5CF
+  UPDCRAMPTR   := $EAB2
 .elseif .def(__C64__)
   CLRSCR       := $E544
   KBDREAD      := $E5B4
   NMIEXIT      := $FEBC
+  UPDCRAMPTR   := $EA24
 .elseif .def(__C128__)
   CLRSCR       := $C142
   KBDREAD      := $C006
diff --git a/libsrc/c64/kplot.s b/libsrc/c64/kplot.s
index 2d60fd4a..856bd148 100644
--- a/libsrc/c64/kplot.s
+++ b/libsrc/c64/kplot.s
@@ -7,15 +7,16 @@
 
         .export         PLOT
 
+.scope  KERNAL
+        .include        "cbm_kernal.inc"
+.endscope
 
 .proc   PLOT
 
         bcs     @L1
-        jsr     $FFF0                   ; Set cursor position
-        jmp     $EA24                   ; Set pointer to color RAM
+        jsr     KERNAL::PLOT            ; Set cursor position using original ROM PLOT
+        jmp     KERNAL::UPDCRAMPTR      ; Set pointer to color RAM to match new cursor position
 
-@L1:    jmp     $FFF0                   ; Get cursor position
+@L1:    jmp     KERNAL::PLOT            ; Get cursor position
 
 .endproc
-
-
diff --git a/libsrc/plus4/kplot.s b/libsrc/plus4/kplot.s
index 7035b05d..7883c28a 100644
--- a/libsrc/plus4/kplot.s
+++ b/libsrc/plus4/kplot.s
@@ -6,16 +6,17 @@
 
         .export         PLOT
 
+.scope  KERNAL
+        .include        "cbm_kernal.inc"
+.endscope
+
         .include        "plus4.inc"
 
 .segment        "LOWCODE"               ; Must go into low memory
 
 .proc   PLOT
         sta     ENABLE_ROM              ; Enable the ROM
-        jsr     $FFF0                   ; Call the ROM routine
+        jsr     KERNAL::PLOT            ; Call the ROM routine
         sta     ENABLE_RAM              ; Switch back to RAM
         rts                             ; Return to caller
 .endproc
-
-
-                    
diff --git a/libsrc/vic20/kplot.s b/libsrc/vic20/kplot.s
index f37ed8fc..1a943d37 100644
--- a/libsrc/vic20/kplot.s
+++ b/libsrc/vic20/kplot.s
@@ -7,14 +7,16 @@
 
         .export         PLOT
 
+.scope  KERNAL
+        .include        "cbm_kernal.inc"
+.endscope
 
 .proc   PLOT
 
         bcs     @L1
-        jsr     $FFF0                   ; Set cursor position
-        jmp     $EAB2                   ; Set pointer to color RAM
+        jsr     KERNAL::PLOT            ; Set cursor position using original ROM PLOT
+        jmp     KERNAL::UPDCRAMPTR      ; Set pointer to color RAM to match new cursor position
 
-@L1:    jmp     $FFF0                   ; Get cursor position
+@L1:    jmp     KERNAL::PLOT            ; Get cursor position
 
 .endproc
-
-- 
2.26.0