--- /dev/null
+;
+; 2016-02-28, Groepaz
+; 2017-06-22, Greg King
+;
+; char cpeekc (void);
+;
+
+ .export _cpeekc
+
+; Get a system-specific file.
+; Note: The cbm610, and c128 targets need special
+; versions that handle RAM banking and the 80-column VDC.
+
+.if .def(__C16__)
+ .include "plus4.inc" ; both C16 and Plus4
+.elseif .def(__C64__)
+ .include "c64.inc"
+.elseif .def(__CBM510__)
+ .import CURS_X: zp, SCREEN_PTR: zp
+ .include "cbm510.inc"
+.elseif .def(__PET__)
+ .include "pet.inc"
+.elseif .def(__VIC20__)
+ .include "vic20.inc"
+.endif
+
+
+_cpeekc:
+ ldy CURS_X
+ lda (SCREEN_PTR),y ; get screen code
+ ldx #>$0000
+ and #<~$80 ; remove reverse bit
+
+; Convert the screen code into a PetSCII code.
+; $00 - $1F: +$40
+; $20 - $3F
+; $40 - $5f: +$20
+; $60 - $7F: +$40
+
+ cmp #$20
+ bcs @sk1 ;(bge)
+ ora #$40
+ rts
+
+@sk1: cmp #$40
+ bcc @end ;(blt)
+ cmp #$60
+ bcc @sk2 ;(blt)
+ ;sec
+ adc #$20 - $01
+@sk2: ;clc ; both above cmp and adc clear carry flag
+ adc #$20
+@end: rts