Would it not be better to use CSW and KSW rather than COUT and KEYIN?
Pertinent Definitions/Equates from my interpretation of the Apple II Monitors:
CSWL EQU $36 ; LOW BYTE OF OUTPUT ADDRESS VECTOR TO ROUTINE
; THAT PROCESSES OUTPUT CHARACTERS; SET WITH
; OUTPORT, & BY PR#S; RESET, "0" + CTRL-P, &
; PR#0, SET THIS LOCATION TO $FDF0 (COUT1: MON-
; ITOR OUTPUT TO SCREEN); "S" + CTRL-P, & PR#S,
; SET THIS LOCATION TO $CS00 (SLOT "S" ROM).
CSWH EQU $37 ; HIGH BYTE OF OUTPUT ADDRESS VECTOR TO ROUTINE
; THAT PROCESSES OUTPUT CHARACTERS; SET WITH
; OUTPORT, & BY PR#S; RESET, "0" + CTRL-P, &
; PR#0, SET THIS LOCATION TO $FDF0 (COUT1: MON-
; ITOR OUTPUT TO SCREEN); "S" + CTRL-P, & PR#S,
; SET THIS LOCATION TO $CS00 (SLOT "S" ROM).
KSWL EQU $38 ; LOW BYTE OF INPUT ADDRESS VECTOR TO ROUTINE
; THAT PROCESSES INPUT CHARACTERS; SET WITH
; INPORT, & BY IN#S; RESET, "0" + CTRL-K, &
; IN#0, SET THIS LOCATION TO $FD1B (KEYIN: MON-
; ITOR KEYBOARD INPUT ROUTINE); "S" + CTRL-K, &
; IN#S, SET THIS LOCN TO $CS00 (SLOT "S" ROM).
KSWH EQU $39 ; HIGH BYTE OF INPUT ADDRESS VECTOR TO ROUTINE
; THAT PROCESSES INPUT CHARACTERS; SET WITH
; INPORT, & BY IN#S; RESET, "0" + CTRL-K, &
; IN#0, SET THIS LOCATION TO $FD1B (KEYIN: MON-
; ITOR KEYBOARD INPUT ROUTINE); "S" + CTRL-K, &
; IN#S, SET THIS LOCN TO $CS00 (SLOT "S" ROM).
RNDL EQU $4E ; LOW BYTE OF NUMBER RANDOMIZED WITH EACH KEY
; ENTRY DONE BY MONITOR KEYIN ROUTINE (& BY
; MANY OTHER ROUTINES SUCH AS SERIAL & PARALLEL
; COMMUNICATIONS CARDS, WHICH ARE USED TO
; REPLACE KEYIN); RANDOMIZATION ACCOMPLISHED BY
; CONTINUOUSLY INCREMENTING WHILE AWAITING
; KEYBOARD INPUT.
RNDH EQU $4F ; HIGH BYTE OF NUMBER RANDOMIZED WITH EACH KEY
; ENTRY DONE BY MONITOR KEYIN ROUTINE (& BY
; MANY OTHER ROUTINES SUCH AS SERIAL & PARALLEL
; COMMUNICATIONS CARDS, WHICH ARE USED TO
; REPLACE KEYIN); RANDOMIZATION ACCOMPLISHED BY
; CONTINUOUSLY INCREMENTING WHILE AWAITING
; KEYBOARD INPUT.
;---------------------------------------------------------------------
KEYIN EQU $FD1B ; INCREMENT RANDOM NUMBER LOW; IF (RNDL)<>(0)
; -741 ; BRANCH TO KEYIN2; ELSE, INCREMENT RANDOM
; NUMBER HIGH (RNDH), IGNORING OVERFLOW.
KEYIN2 EQU $FD21 ; [BRANCH LABEL]; KEY DOWN?; IF NOT, BRANCH TO
; -735 ; KEYIN; REPLACE FLASHING CURSOR; GET KEYCODE;
; CLEAR KEY STROBE; RETURN TO CALLER; THE A-REG
; CONTAINS THE KEYPRESS KEYCODE.
;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; KEYIN~KEYIN2 GETS THE NEXT KEY INPUT FROM THE KEYBOARD: FIRST, KEYIN
; INCREMENTS THE RANDOM NUMBER FIELD (IGNORING OVERFLOW); THEN, KEYIN2
; TESTS THAT A KEY HAS BEEN PRESSED & IF NOT, LOOPS BACK TO KEYIN;
; ELSE, THE CHARACTER MODIFIED BY RDKEY IS RESTORED FROM FLASHING TO
; NORMAL/INVERSE/FLASHING [THE CHARACTER IN THE A-REG AT ENTRY IS
; STORED AT (BASL),Y]; NEXT, KEYIN2 LOADS THE A-REG FROM THE KEYBOARD
; WITH THE KEYCODE OF THE KEY PRESSED; THEN CLEARS THE KEYBOARD
; STROBE; & RETURNS TO CALLER; THE A-REG IS ALTERED.
;---------------------------------------------------------------------
COUT EQU $FDED ; VECTOR TO USER OUTPUT ROUTINE; OUTPUTS/PRINTS
; -531 ; THE CHARACTER/BYTE IN A-REG TO OUTPUT DEVICE
; SPECIFIED BY JUMP INDIRECT TO (CSWL~CSWH)--
; (NORMALLY TO COUT1); THE A-REG IS ALTERED.
Well, COUT is OK, rather than CSW, since it uses the vector too.