; ANYCODE.ASM - A program to allow printer codes to be
;               transmitted to EPSON or other dot matrix
;               printer from within Wordstar text.
;
;               Author: D. M.  Hurst
;               Date:   April 23, 1984
;
        ORG     02DEh  ;Where XXXX is 02DEh for WS 2.26/3.0
                       ;and 02BBh for WS 3.3
mysub:  cpi     '`'    ;is it a code character?
                       ;you may substitute another
                       ;character if you use the
                       ;'' `'',often in your text
        jnz    ncheck  ;no, so next check
        sta    lead    ;yes, so store temporarily
        mvi    a,1     ;get a 1 in accumulator
        sta    fl      ;set fl flag
        ret            ;get another character
                       ;without printing
ncheck: cpi    '~'        ;is it a code character?
                       ;you may substitute another
                       ;character if you use the
                       ;'' ~'', often in your text
        jnz   hcheck   ;no, so check if part of
                       ;code sequence
        sta   lead     ;yes so store teporarily
        mvi   a,1      ;get a 1 in accumulator
        sta   fl       ;set fl flag
        mvi   a,1bh    ;~ means escape required so
        jmp   pout     ;send it.
hcheck: mov   b,a      ;set input char aside
        lda   lead     ;get contents of lead
        cpi   '`'      ;are we in code seq?
                       ;NOTE if you changed this code
                       ;above, change it here too.
        mov   a,b      ;char back in accumulator
        jz    flchk    ;yes, so check if flag set
        mov   b,a      ;no, so char back to b
        lda   lead     ;check lead again
        cpi   '~'         ;are we in code seq?
                       ;NOTE: if you changed this code
                       ;above, change it here too.
                       ;char back in accumulator 
        mov   a,b      ;char back in accumulator
        jz    flchk    ;yes, so check if flag set
        jmp   pout     ;no, so print char normally
flchk:  mov   b,a      ;set char aside again
        lda   fl       ;get fl flag
        cpi   00h      ;1 if set set
        mov   a,b      ;char back in accumulator
        jz    addsnd   ;not set, so last char in seq
        mov   b,a      ;yes, so set char aside again
        mvi   a,00h    ;no, so place 00h in accumulator
        sta   fl       ;and lower the flag
        mov   a,b      ;char back in accumulator
        cpi   39h      ;is code char letter?
        jm    nolet1   ;no, so never mind
        sui   07h      ;yes, so make it a number
nolet1: sui   30h      ;now down it from ASCII
        rlc            ;first char in code so
        rlc            ;move 4 low bits to high
        rlc
        rlc
        ani   0f0h     ;0 4 lower bits
        sta   first    ;store it
        ret            ;to get second char code
addsnd: mov   b,a      ;set 2nd code char aside
        mvi   a,00     ;0 the accumulator
        lxi   h,lead   ;get lead address pointer in hl
        mov   m,a      ;0 out the lead
        inx   h        ;up the hl
        mov   m,a      ;also 0 the flag
        mov   a,b      ;get char back
        cpi   39h      ;was 2nd code char a letter?
        jm    nolet2   ;so skip it
        sui   07h      ;yes so make it a number
nolet2: sui   30h      ;now down either from ASCII
        lxi   h,first  ;point to first code char addr
        mov   b,m      ;move actual char to b
        add   b        ;add a to b (result in a)
pout:   mvi   c,5      ;print full code char
        mov   e,a
        call  5
        ret            ;back for next real char
;
lead    ds    1        ;space for lead code
fl      ds    1        ;flag space
first   ds    1        ;store first code while
                       ;waiting for 2nd pro-
                       ;cess.
        end