From 03ba3f74730e0898dabba33cff6ded1ebecb7d2c Mon Sep 17 00:00:00 2001
From: Marco van den Heuvel <blackystardust68@yahoo.com>
Date: Fri, 23 Mar 2018 14:27:15 -0700
Subject: [PATCH] Added c16/plus4 fast(), isfast() and slow() functions, and
 updated the documentation accordingly.

---
 asminc/plus4.inc      |  1 +
 doc/c128.sgml         | 16 +++++++++---
 doc/c16.sgml          | 12 +++++++++
 doc/funcref.sgml      | 59 +++++++++++++++++++++++++------------------
 doc/plus4.sgml        | 13 ++++++++++
 include/plus4.h       |  8 ++++++
 libsrc/plus4/fast.s   | 22 ++++++++++++++++
 libsrc/plus4/isfast.s | 22 ++++++++++++++++
 libsrc/plus4/slow.s   | 22 ++++++++++++++++
 9 files changed, 148 insertions(+), 27 deletions(-)
 create mode 100644 libsrc/plus4/fast.s
 create mode 100644 libsrc/plus4/isfast.s
 create mode 100644 libsrc/plus4/slow.s

diff --git a/asminc/plus4.inc b/asminc/plus4.inc
index 3b2f08c54..5ea4dcf88 100644
--- a/asminc/plus4.inc
+++ b/asminc/plus4.inc
@@ -73,6 +73,7 @@ TED_CURSLO      := $FF0D
 TED_V1FRQLO     := $FF0E
 TED_V2FRQLO     := $FF0F
 TED_V2FRQHI     := $FF10
+TED_CLK         := $FF13
 TED_BGCOLOR     := $FF15
 TED_COLOR1      := $FF16
 TED_COLOR2      := $FF17
diff --git a/doc/c128.sgml b/doc/c128.sgml
index 14c874998..2bfb37a3d 100644
--- a/doc/c128.sgml
+++ b/doc/c128.sgml
@@ -85,9 +85,6 @@ url="funcref.html" name="function reference"> for declaration and usage.
 <itemize>
 <item>videomode
 <item>c64mode
-<item>fast
-<item>slow
-<item>isfast
 </itemize>
 
 
@@ -123,6 +120,19 @@ declaration and usage.
 </itemize>
 
 
+<sect1>CBM specific CPU functions<p>
+
+Some CPU related functions are available for some of the Commodore
+machines. See the <url url="funcref.html" name="function reference"> for
+declaration and usage.
+
+<itemize>
+<item>fast
+<item>slow
+<item>isfast
+</itemize>
+
+
 <sect1>Hardware access<p>
 
 The following pseudo variables declared in the <tt/c128.h/ header file do
diff --git a/doc/c16.sgml b/doc/c16.sgml
index 1614516b7..27938ff1e 100644
--- a/doc/c16.sgml
+++ b/doc/c16.sgml
@@ -126,6 +126,18 @@ declaration and usage.
 </itemize>
 
 
+<sect1>CBM specific CPU functions<p>
+
+Some CPU related functions are available for some of the Commodore
+machines. See the <url url="funcref.html" name="function reference"> for
+declaration and usage.
+
+<itemize>
+<item>fast
+<item>slow
+<item>isfast
+</itemize>
+
 <sect1>Hardware access<p>
 
 The following pseudo variables declared in the <tt/c16.h/ header file do
diff --git a/doc/funcref.sgml b/doc/funcref.sgml
index 193a10c52..5f90cfd3e 100644
--- a/doc/funcref.sgml
+++ b/doc/funcref.sgml
@@ -140,6 +140,12 @@ function.
 
 <sect1><tt/c16.h/<label id="c16.h"><p>
 
+<itemize>
+<item><ref id="fast" name="fast">
+<item><ref id="isfast" name="isfast">
+<item><ref id="slow" name="slow">
+</itemize>
+
 (incomplete)
 
 
@@ -502,6 +508,12 @@ It does not declare any functions.
 
 <sect1><tt/plus4.h/<label id="plus4.h"><p>
 
+<itemize>
+<item><ref id="fast" name="fast">
+<item><ref id="isfast" name="isfast">
+<item><ref id="slow" name="slow">
+</itemize>
+
 (incomplete)
 
 
@@ -3292,21 +3304,21 @@ program, it may not be able to read it.
 
 <quote>
 <descrip>
-<tag/Function/Switch the C128 into 2MHz mode.
-<tag/Header/<tt/<ref id="c128.h" name="c128.h">/
+<tag/Function/Switch the CPU into fast mode (C128: 2MHz mode, C16/Plus4: double clock mode).
+<tag/Header/<tt/<ref id="c128.h" name="c128.h">,
+<ref id="c16.h" name="c16.h">, <ref id="plus4.h" name="plus4.h">/
 <tag/Declaration/<tt/void fast (void);/
-<tag/Description/The function will switch the clock of the C128 to 2MHz. This
-will nearly double the speed compared to slow mode.
+<tag/Description/The function will switch the clock of the CPU to fast mode. For the C128
+target it means switching the CPU into 2MHz mode. For the C16/Plus4 target it means
+switching the CPU into double clock mode.
 <tag/Notes/<itemize>
-<item>The function is specific to the C128.
-<item>2MHz clock will not work in 40 column mode.
+<item>The function is specific to the C128, C16 and Plus4.
+<item>On the C128 the 2MHz clock will not work in 40 column mode.
 </itemize>
-<tag/Availability/C128
+<tag/Availability/cc65 (not all platforms)
 <tag/See also/
 <ref id="isfast" name="isfast">,
 <ref id="slow" name="slow">,
-<ref id="toggle_videomode" name="toggle_videomode">,
-<ref id="videomode" name="videomode">
 <tag/Example/None.
 </descrip>
 </quote>
@@ -3960,19 +3972,18 @@ fastcall function, so it may only be used in presence of a prototype.
 
 <quote>
 <descrip>
-<tag/Function/Check if the C128 is in 2MHz mode.
-<tag/Header/<tt/<ref id="c128.h" name="c128.h">/
+<tag/Function/Check if the CPU is in fast mode (C128: 2MHz mode, C16/Plus4: double clock mode).
+<tag/Header/<tt/<ref id="c128.h" name="c128.h">,
+<ref id="c16.h" name="c16.h">, <ref id="plus4.h" name="plus4.h">/
 <tag/Declaration/<tt/unsigned char isfast (void);/
-<tag/Description/The function returns a 1 if the C128 is in 2MHz mode.
+<tag/Description/The function returns a 1 if the CPU is in fast mode (C128: 2MHz mode, C16/Plus4: double clock mode).
 <tag/Notes/<itemize>
-<item>The function is specific to the C128.
+<item>The function is specific to the C128, C16 and Plus4.
 </itemize>
-<tag/Availability/C128
+<tag/Availability/cc65 (not all platforms)
 <tag/See also/
 <ref id="fast" name="fast">,
 <ref id="slow" name="slow">,
-<ref id="toggle_videomode" name="toggle_videomode">,
-<ref id="videomode" name="videomode">
 <tag/Example/None.
 </descrip>
 </quote>
@@ -6086,20 +6097,20 @@ be used in presence of a prototype.
 
 <quote>
 <descrip>
-<tag/Function/Switch the C128 into 1MHz mode.
-<tag/Header/<tt/<ref id="c128.h" name="c128.h">/
+<tag/Function/Switch the CPU into slow mode (C128: 1MHz mode, C16/Plus4: single clock mode).
+<tag/Header/<tt/<ref id="c128.h" name="c128.h">,
+<ref id="c16.h" name="c16.h">, <ref id="plus4.h" name="plus4.h">/
 <tag/Declaration/<tt/void slow (void);/
-<tag/Description/The function will switch the clock of the C128 to 1MHz. This
-will halve the speed compared to fast mode.
+<tag/Description/The function will switch the clock of the CPU to slow mode. for the C128
+target it means switching the CPU into 1MHz mode. for the C16/Plus4 target it means
+switching the CPU into single clock mode.
 <tag/Notes/<itemize>
-<item>The function is specific to the C128.
+<item>The function is specific to the C128, C16 and Plus4.
 </itemize>
-<tag/Availability/C128
+<tag/Availability/cc65 (not all platforms)
 <tag/See also/
 <ref id="fast" name="fast">,
 <ref id="isfast" name="isfast">,
-<ref id="toggle_videomode" name="toggle_videomode">,
-<ref id="videomode" name="videomode">
 <tag/Example/None.
 </descrip>
 </quote>
diff --git a/doc/plus4.sgml b/doc/plus4.sgml
index 36d53e753..c1b6165f6 100644
--- a/doc/plus4.sgml
+++ b/doc/plus4.sgml
@@ -124,6 +124,19 @@ declaration and usage.
 </itemize>
 
 
+<sect1>CBM specific CPU functions<p>
+
+Some CPU related functions are available for some of the Commodore
+machines. See the <url url="funcref.html" name="function reference"> for
+declaration and usage.
+
+<itemize>
+<item>fast
+<item>slow
+<item>isfast
+</itemize>
+
+
 <sect1>Hardware access<p>
 
 The following pseudo variables declared in the <tt/plus4.h/ header file do
diff --git a/include/plus4.h b/include/plus4.h
index 81e3c5286..6edb947e5 100644
--- a/include/plus4.h
+++ b/include/plus4.h
@@ -59,6 +59,14 @@
 extern void plus4_stdjoy_joy[];   /* Referred to by joy_static_stddrv[] */
 extern void plus4_stdser_ser[];
 
+void fast (void);
+/* Switch the CPU into double clock mode. */
+
+void slow (void);
+/* Switch the CPU into single clock mode. */
+
+unsigned char isfast (void);
+/* Returns 1 if the CPU is in double clock mode. */
 
 
 /* End of plus4.h */
diff --git a/libsrc/plus4/fast.s b/libsrc/plus4/fast.s
new file mode 100644
index 000000000..e48813969
--- /dev/null
+++ b/libsrc/plus4/fast.s
@@ -0,0 +1,22 @@
+;
+; Marco van den Heuvel, 2018-03-20
+;
+; void fast (void);
+; /* Switch the CPU into double clock mode. */
+;
+
+        .export         _fast
+
+        .include        "plus4.inc"
+
+
+.proc   _fast
+
+        lda     TED_CLK
+        and     #%11111101
+        sta     TED_CLK
+        rts
+
+.endproc
+
+
diff --git a/libsrc/plus4/isfast.s b/libsrc/plus4/isfast.s
new file mode 100644
index 000000000..ff104d97f
--- /dev/null
+++ b/libsrc/plus4/isfast.s
@@ -0,0 +1,22 @@
+;
+; Marco van den Heuvel, 2018-03-20
+;
+; unsigned char isfast (void);
+; /* Returns 1 if the CPU is in double clock mode. */
+;
+
+        .export         _isfast
+
+        .include        "plus4.inc"
+
+
+.proc   _isfast
+
+        lda     TED_CLK
+        lsr
+        and     #$01
+        ldx     #$00
+        rts
+
+.endproc
+
diff --git a/libsrc/plus4/slow.s b/libsrc/plus4/slow.s
new file mode 100644
index 000000000..18b8c231c
--- /dev/null
+++ b/libsrc/plus4/slow.s
@@ -0,0 +1,22 @@
+;
+; Marco van den Heuvel, 2018-03-28
+;
+; void slow (void);
+; /* Switch the CPU into single clock mode. */
+;
+
+        .export         _slow
+
+        .include        "plus4.inc"
+
+
+.proc   _slow
+
+        lda     TED_CLK
+        ora     #%00000010
+        sta     TED_CLK
+        rts
+
+.endproc
+
+