home *** CD-ROM | disk | FTP | other *** search
/ TAP YIPL / TAP_and_YIPL_Collection_CD.iso / PHREAK / BOXES / DTMF_PIC.ASM < prev    next >
Assembly Source File  |  1998-02-07  |  4KB  |  219 lines

  1. ;
  2. ; keypad tone generator with wakeup on keypress
  3. ;
  4.  
  5.         DEVICE PIC16C56,HS_OSC,PROTECT_OFF,WDT_OFF
  6.  
  7. TONE_DURATION    equ    30000
  8.  
  9. audioport    equ    RA
  10. ROWMASK        equ    00000001b
  11. COLMASK        equ    00000010b
  12. keyport        equ    RB
  13. KEYMASK        equ    00001111b
  14. col0        equ    RB.4
  15. col1        equ    RB.5
  16. col2        equ    RB.6
  17.  
  18. temp        equ    09h
  19. colcount    equ    0ah
  20. ccount        equ    0bh
  21. rowcount    equ    0ch
  22. rcount        equ    0dh
  23. tonetimehi    equ    0eh
  24. tonetimelo    equ    0fh
  25. row0        equ    10h        ; current state of key row 0
  26. row1        equ    11h        ; current state of key row 1
  27. row2        equ    12h        ; current state of key row 2
  28. keycode        equ    13h
  29.  
  30.         RESET Start
  31.  
  32. zzzzz
  33.         clrb    col0
  34.         clrb    col1
  35.         clrb    col2
  36.         sleep
  37.  
  38. ; KeyMap -- map key ID to DTMF tone code
  39. KeyMap
  40.         jmp    PC+W
  41. ; straightforward matrix
  42. ;        retw    0000b,0001b,0010b
  43. ;        retw    0100b,0101b,0110b
  44. ;        retw    1000b,1001b,1010b
  45. ;        retw    1100b,1101b,1110b
  46. ; PacTec brain damaged membrane keyboard
  47.         retw    1000b,0000b,1100b
  48.         retw    0100b,1001b,0001b
  49.         retw    1101b,0101b,1010b
  50.         retw    0010b,1110b,0110b
  51.  
  52.  
  53. ;697 Hz        90    123A row
  54. ;770 Hz        81    456B row
  55. ;852 Hz        73    789C row
  56. ;941 Hz        66    *0#D row
  57. ;1209 Hz    52    147* col
  58. ;1336 Hz    47    2580 col
  59. ;1477 Hz    42    369# col
  60. ;1633 Hz    38    ABCD col
  61.  
  62. RowTab
  63.         jmp    PC+W
  64.         retw    90,81,73,66
  65. ColTab
  66.         jmp    PC+W
  67.         retw    52,47,42,38
  68.  
  69. ;
  70. ; DTMF_send -- send a DTMF tone pair as encoded in W on entry.
  71. ;    encoding is xxxxRRCC where x = dont care, RR = row#, CC = col#
  72. ;
  73.  
  74. DTMF_send
  75.         ; get row and col encoding into rowcount,colcount
  76.         mov    colcount,W
  77.         mov    rowcount,W
  78.         and    colcount,#00000011b
  79.         rr    rowcount
  80.         rr    rowcount
  81.         and    rowcount,#00000011b
  82.  
  83.         ; replace with actual counts from lookup tables
  84.         mov    W,colcount
  85.         call    ColTab
  86.         mov    colcount,W
  87.         mov    W,rowcount
  88.         call    RowTab
  89.         mov    rowcount,W
  90.  
  91.         ; preload counters && timers
  92.         mov    rcount,rowcount
  93.         mov    ccount,colcount
  94.         mov    tonetimehi,#TONE_DURATION<
  95.         mov    tonetimelo,#TONE_DURATION>
  96.  
  97. :dtmf_loop
  98.         ; time to stop?
  99.         dec    tonetimelo
  100.         jnz    :keepon
  101.         dec    tonetimehi
  102.         snz
  103.         ret    ; done! get out.
  104.  
  105. :keepon
  106.         ; wait for clock tick
  107.         mov    temp,RTCC
  108. :tickwait
  109.         mov    W,RTCC
  110.         xor    W,temp
  111.         jz    :tickwait
  112.  
  113.         ; decrement counters
  114.         djnz    rcount,:checkcol
  115.  
  116.         ; row count reached zero -- toggle audio and reset counter
  117.         mov    W,audioport
  118.         xor    W,#ROWMASK
  119.         mov    audioport,W
  120.         mov    rcount,rowcount
  121. :checkcol
  122.         djnz    ccount,:dtmf_loop
  123.  
  124.         ; col count reached zero -- toggle audio and reset counter
  125.         mov    W,audioport
  126.         xor    W,#COLMASK
  127.         mov    audioport,W
  128.         mov    ccount,colcount
  129.         jmp    :dtmf_loop
  130.  
  131. Scan
  132.         clrb    col0
  133.         mov    row0,keyport
  134.         setb    col0
  135.         xor    row0,#KEYMASK
  136.         and    row0,#KEYMASK
  137.  
  138.         clrb    col1
  139.         mov    row1,keyport
  140.         setb    col1
  141.         xor    row1,#KEYMASK
  142.         and    row1,#KEYMASK
  143.  
  144.         clrb    col2
  145.         mov    row2,keyport
  146.         setb    col2
  147.         xor    row2,#KEYMASK
  148.         and    row2,#KEYMASK
  149.  
  150.         ret
  151.  
  152. Decode
  153.         clr    keycode
  154.  
  155.         test    row0
  156.         jz    :tryrow1
  157.  
  158.         ; definitely a bit on in row0
  159.         mov    keycode,#1
  160. :loop0
  161.         snb    row0.0
  162.         ret
  163.         rr    row0
  164.         inc    keycode
  165.         jmp    :loop0
  166.  
  167. :tryrow1
  168.         test    row1
  169.         jz    :tryrow2
  170.  
  171.         ; definitely a bit on in row1
  172.         mov    keycode,#5
  173. :loop1
  174.         snb    row1.0
  175.         ret
  176.         rr    row1
  177.         inc    keycode
  178.         jmp    :loop1
  179.  
  180. :tryrow2
  181.         test    row2
  182.         snz
  183.         ret
  184.  
  185.         ; definitely a bit on in row2
  186.         mov    keycode,#9
  187. :loop2
  188.         snb    row2.0
  189.         ret
  190.         rr    row2
  191.         inc    keycode
  192.         jmp    :loop2
  193.  
  194. Start
  195.         mov    OPTION,#00000100b    ; RTCC @ 125 KHz
  196.         mov    !RB,#00001111b
  197.         mov    !RA,#0000b        ; all outputs
  198.  
  199.         setb    col0
  200.         setb    col1
  201.         setb    col2
  202.  
  203. Wakeup
  204.         call    Scan        ; read keyboard
  205.         call    Decode        ; decode bit pattern to key ID
  206.         test    keycode
  207.         jz    :release    ; if no key, don't send
  208.         dec    keycode
  209.         mov    W,keycode    ; get key ID
  210.         call    KeyMap        ; map key ID to DTMF code
  211.         call    DTMF_send    ; send DTMF tone
  212.         ; now wait for key to be released and sleep
  213. :release
  214.         call    Scan
  215.         call    Decode
  216.         test    keycode
  217.         jnz    :release
  218.         jmp    zzzzz
  219.