From 04cc463452de739262b91ef1fa4757ad249d6762 Mon Sep 17 00:00:00 2001
From: Oliver Schmidt
Date: Sun, 12 Jul 2020 22:19:38 +0200
Subject: [PATCH] Implemented some CONIO peek functions.
Please refer to https://github.com/cc65/cc65/pull/532 for background info.
I wrote in https://sourceforge.net/p/cc65/mailman/message/35873183/
===
cputs() wraps to the next line if the strings is too long to fit in the current line. I don't know if it's worth the effort to allow cpeeks() to continue reading from the next line. I'd like to discuss this aspect with the actual implementers.
===
This is still as unclear today as it was when I wrote the above. Therefore this change just doesn't add cpeeks() at all.
Since https://github.com/cc65/cc65/commit/f8c6c58373426551eed096dcfab4eab137fc0430 the Apple II CONIO implementation doesn't "need" revers() anymore - meaning that (nearly) every possible value can be placed in VRAM with a straight cputc() (without the need for a previous revers(1)).
The implementation of cpeekc() leverages that cputc() ability by always returning the value that can be fed into cputc() without a previous revers(1). Accordingly, cpeekrevers() always returns 0.
So after the sequence revers(1); cputc(x); a cpeekc() will return a value different from x! However, I don't see this behavior braking the cpeekc() contract. I see the cpeekc() contract being defined by the sequence textcolor(cpeekcolor()); revers(cpeekrevers()); cputc(cpeekc()); placing the very same value in VRAM that there was before. And that contract is fulfilled.
---
include/apple2.h | 2 ++
include/conio.h | 11 +++++++----
libsrc/apple2/cpeekc.s | 28 ++++++++++++++++++++++++++++
3 files changed, 37 insertions(+), 4 deletions(-)
create mode 100644 libsrc/apple2/cpeekc.s
diff --git a/include/apple2.h b/include/apple2.h
index dbed3364d..57d7086ce 100644
--- a/include/apple2.h
+++ b/include/apple2.h
@@ -207,6 +207,8 @@ void rebootafterexit (void);
#define _textcolor(color) COLOR_WHITE
#define _bgcolor(color) COLOR_BLACK
#define _bordercolor(color) COLOR_BLACK
+#define _cpeekcolor() COLOR_WHITE
+#define _cpeekrevers() 0
diff --git a/include/conio.h b/include/conio.h
index 72421af86..bac20e3c5 100644
--- a/include/conio.h
+++ b/include/conio.h
@@ -201,16 +201,19 @@ void __fastcall__ cputhex16 (unsigned val);
*/
#ifdef _textcolor
-# define textcolor(x) _textcolor(x)
+# define textcolor(color) _textcolor(color)
#endif
#ifdef _bgcolor
-# define bgcolor(x) _bgcolor(x)
+# define bgcolor(color) _bgcolor(color)
#endif
#ifdef _bordercolor
-# define bordercolor(x) _bordercolor(x)
+# define bordercolor(color) _bordercolor(color)
#endif
#ifdef _cpeekcolor
-# define cpeekcolor(x) _cpeekcolor(x)
+# define cpeekcolor() _cpeekcolor()
+#endif
+#ifdef _cpeekrevers
+# define cpeekrevers() _cpeekrevers()
#endif
diff --git a/libsrc/apple2/cpeekc.s b/libsrc/apple2/cpeekc.s
new file mode 100644
index 000000000..a547f7867
--- /dev/null
+++ b/libsrc/apple2/cpeekc.s
@@ -0,0 +1,28 @@
+;
+; 2020-07-12, Oliver Schmidt
+;
+; char cpeekc (void);
+;
+
+ .export _cpeekc
+
+ .include "apple2.inc"
+
+_cpeekc:
+ ldy CH
+ .ifdef __APPLE2ENH__
+ bit RD80VID ; In 80 column mode?
+ bpl peek ; No, just go ahead
+ tya
+ lsr ; Div by 2
+ tay
+ bcs peek ; Odd cols are in main memory
+ bit HISCR ; Assume SET80COL
+ .endif
+peek: lda (BASL),Y ; Get character
+ .ifdef __APPLE2ENH__
+ bit LOWSCR ; Doesn't hurt in 40 column mode
+ .endif
+ eor #$80 ; Invert high bit
+ ldx #$00
+ rts