Msg: 141 *Conference*

06-30-91 23:36:34

From: JAMES FIELDS

To : SYSOP

Subj: EXTRA KEYS

 The following program will read the PRINTER BUSY (Pin 25) and the BAR CODE
 DATA (WAND Pin 2) when they are crossed the PRINTER DATA LINE (Pins
 3,5,7,9,11,13,15,17) and PRINTER GND (all even lines except 26)
 
 PIN CROSSED        VALUE RETURNED
    none                   0
      3                    1
      5                    2
      7                    4
      9                    8
     11                   16
     13                   32
     15                   64
     17                  128
     GND                 255
 
 The program is written to take either a 2 or 16 byte string.  If 2 bytes; byte
 1 equals BUSY crossed with DATA/GND, byte 2 equals WAND DATA crossed with
 DATA/GND.  If 16 bytes; first 8 bytes are with BUSY, and second 8 are with
 BAR CODE DATA (0 in any position = not crossed, 1 = crossed; 8 1's means in
 first 8 positions = BUSY crossed, 8 1's in second 8 positions = WAND crossed)
 
 I wrote this program with no ORG for a relocatable assembler.
 
 DATA PIN=> 3  5  7  9 11 13 15 17 GND
            |  |  |  |  |  |  |  |  |
 BUSY (#25)-+--+--+--+--+--+--+--+--+
            |  |  |  |  |  |  |  |  |
 WAND DATA--+--+--+--+--+--+--+--+--+
            1     4    16    64    255
               2     8    32    128
 
 Two programs that can be used:
 
 Two byte string:
 10 'load machine code
 20 j$=space$(2)
 30 call address,,j$
 40 bu=asc(j$):wa=asc(right$(j$,1))
 50 'use bu for BUSY, wa for WAND
 
 Sixteen byte string
 10 'load machine code
 20 j$=space$(16)
 30 call address,,j$
 40 j1$=mid$(j$,1,8):j2$=mid$(j$,9,8)
 50 j1=instr(j1$,"11111111"):if j1=0 then j1=instr(j1$,"1") else j1=9
 60 j2=instr(j2$,"11111111"):if j2=0 then j2=instr(j2$,"1") else j2=9
 70 'use j1 for BUSY, j2 for WAND; 9=gounded
 
 START:PUSHPSW
 PUSHB
 PUSHD
 MOVA,M
 STALENGTH
 INXH
 MOVA,M
 INXH
 MOVH,M
 MOVL,A
 PUSHH
 LXIH,STRING
 PUSHH
 CALLCALL1
 RDBUSY:CALLCALL2
 CMA
 ANI$02
 RRC
 CALLCALL3
 STABUSY
 CALLCALL4
 JNZRDBUSY
 CALLCALL1
 RDBAR:CALLCALL2
 ANI$08
 RRC
 RRC
 RRC
 CALLCALL3
 STABAR
 CALLCALL4
 JNZRDBAR
 MOVEIT:POPH
 POPD
 LDALENGTH
 MOVB,A
 CPI$02
 JNZTRANS
 LXIH,BUSY
 TRANS:MOVA,M
 STAXD
 INXH
 INXD
 DCRB
 JNZTRANS
 ENDING:POPD
 POPB
 POPPSW
 RET
 CALL1:LXIB,$08FE
 LXID,$0000
 MOVA,C
 RET
 CALL2:OUT$B1
 IN$B3
 RET
 CALL3:MOVD,A
 MOVA,E
 ADDD
 RRC
 MOVE,A
 RET
 CALL4:MOVA,D
 ADI$30
 MOVM,A
 MOVA,C
 RLC
 MOVC,A
 INXH
 DCRB
 RET
 LENGTH:$00
 BUSY:$00
 BAR:$00
 STRING:"0000000000000000"
 
This is an easy way to add an additional keyboard (up to 18 keys)