;********************************************************
;*                                                      *
;*               KEYBOARD INPUT PATCH                   *
;*                                                      *
;*                SIMULATED FUNCTION                    *
;*    KEYS WITH CPM IN GENERAL; THE SORCERER COMPUTER   *
;*    IN PARTICULAR, USING KIP.HEX AND KID.COM &  DDT   *
;*                                                      *
;*    AS PUBLISHED IN DR DOBBS JOURNAL, ISSUE 55  MAY   *
;*    1981, BY JOHN B PALMER.                           *
;*         P.O. BOX 23                                  *
;*         BOONSVILLE, CA, 95415                        *
;*         USA                                          *
;*                                                      *
;*      See the Dr. Dobbs article for commented code    *
;*                                                      *
;********************************************************
;
;       Keyed in By     John Cepak
;                       Australia
;
FRERAM  EQU     5C00H
TEXT    EQU     FRERAM+256
KIFUN   EQU     01
TAB     EQU     09
LF      EQU     0AH
CR      EQU     0DH
EOF     EQU     01AH
;
ACTIVE  EQU     0FFH
INACTIV EQU     0
;
       ORG     FRERAM
;
KIP:
OLDST:  JMP     0
OLDIN:  JMP     0
NEWST:  JMP     STAT
NEWIN:  JMP     INP
;
ASWITCH DB      0
EOSTR:  DB      0
STRPTR: DW      0
SAVCHR: DB      0
;
STAT:
       LDA     SWITCH
       ORA     A
       RNZ
       JMP     OLDST
;
INP:
       LDA     SWITCH
       ORA     A
       JNZ     STRING
       CALL    OLDIN
       CPI     KIFUN
       RNZ
       CALL    OLDIN
       STA     SAVCHR
       ORI     20H
       SUI     '`'
       SUI     16
       CC      OLDIN
       LDA     SAVCHR
SEARCH:
       PUSH    B
       PUSH    H
       CPI     KIFUN
       JZ      PEEK
       MOV     B,A
       LXI     H,TEXT
TRY:
       CALL    IGNORE
       JC      EXIT
       JZ      TRY
       CMP     B
       JZ      FOUND
       CALL    SKIP
       JNC     TRY
EXIT:
       MVI     A,'?'
       POP     H
       POP     B
       RET
;
PEEK:
       MVI     A,CR
       CALL    DIO
       MVI     A,LF
       LXI     H,TEXT
PRINT:
       CALL    DIO
       MOV     A,M
       INX     H
       CPI     EOF
       JNZ     PRINT
       POP     H
       POP     B
       MVI     A,CR
       RET
;
DIO:
       PUSH    D
       PUSH    H
       LHLD    01
       LXI     B,9
       DAD     B
       MOV     C,A
       CALL    VIAHL
       POP     H
       POP     D
       RET
;
VIAHL:
       PCHL
FOUND:
       MOV     A,M
       STA     EOSTR
       INX     H
       SHLD    STRPTR
       MVI     A,ACTIVE
FIN:
       STA     SWITCH
       POP     H
       POP     B
       JMP     INP
;
SKIP:
       MOV     A,M
       CALL    EOFCHR
       RC
       MOV     C,A
       INX     H
TSTCHR:
       MOV     A,M
       INX     H
       CALL    EOFCHR
       RC
       CMP     C
       RZ
       JMP     TSTCHR
;
IGNORE:
       MOV     A,M
       INX     H
       CPI     ' '
       RZ
       CPI     9
       RZ
       CPI     ','
       RZ
       CPI     CR
       RZ
       CPI     LF
       RZ
EOFCHR:
       CPI     EOF
       STC
       CMC
       RNZ
       ORA     A
       STC
       RET
;
STRING:
       CALL    GETCHR
       RM
       CPI     '^'
       RNZ
       CALL    GETCHR
       RM
       CPI     '^'
       RZ
       ANI     01FH
       RET
;
GETCHR:
       PUSH    H
       LHLD    STRPTR
       MVI     A,EOF
       CMP     M
       JZ      WIERD
       LDA     EOSTR
       CMP     M
       JZ      WIERD
       INX     H
       SHLD    STRPTR
       CMP     M
       DCX     H
       MOV     L,M
       JNZ     READY
       SUB     A
       STA     SWITCH
READY:
       MOV     A,L
       POP     H
       ORA     A
       RET
;
WIERD:
       POP     PSW
       SUB     A
       STA     SWITCH
       DCR     A
       MVI     A,'?'
       POP     H
       RET
;
       END