Advertisement
Spectrum207

Z80 - Click / LongPress detect with debounce and 20s activation timeout

Sep 28th, 2022 (edited)
577
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Z80 Assembler 5.20 KB | Source Code | 0 0
  1. ;---------------------------------------------------------------------
  2.  
  3. PORT        .EQU    0
  4. RAMTOP      .EQU    32767
  5. BITMASK_X0  .EQU    %00000001       ; X0 INPUT (0 = BUTTON PRESSED)
  6. BITMASK_SYN .EQU    %10000000       ; 100 Hz SYNC INPUT
  7. BITMASK_V1  .EQU    %00000001       ; OUTPUT V1 (1 = ON)
  8. BITMASK_V2  .EQU    %00000010       ; OUTPUT V2 (1 = ON)
  9.  
  10. VARS        .EQU    300             ; START OF 7 BYTE STATIC VARS
  11. _OUTVAL_    .EQU    VARS            ; COMMON OUTPUT VARIABLE
  12. _X0_        .EQU    VARS+1          ; FILTERED INPUT
  13. _SHIFT_     .EQU    VARS+2          ; DEBOUNCE SHIFT REGISTER
  14. _TIME_      .EQU    VARS+3          ; 16 BIT TIME COUNTER
  15. _PHASE_     .EQU    VARS+5          ; 16 BIT STATE ADDR
  16.  
  17. ;---------------------------------------------------------------------
  18.  
  19.   .ORG 0
  20.  
  21. ;---------------------------------------------------------------------
  22.  
  23. SETUP:
  24.   DI                    ; NO INTERRUPT
  25.   XOR  A                ; CLEAR A
  26.   OUT  (PORT),A
  27.   LD   SP,RAMTOP+1      ; STACK AT RAM END
  28.   LD   (_OUTVAL_),A     ; INIT VARS
  29.   LD   (_SHIFT_),A
  30.   LD   (_X0_),A
  31.   LD   HL,IDLE          ; INITIAL STATE
  32.   LD   (_PHASE_),HL
  33.  
  34. MAINLOOP:
  35.   CALL SYNC             ; 10 ms TIMING
  36.   CALL READIN
  37.   CALL MACHINE
  38.   JP   MAINLOOP
  39.  
  40. ;---------------------------------------------------------------------
  41.  
  42. SYNC:
  43.   IN   A,(PORT)
  44.   AND  BITMASK_SYN
  45.   JP   NZ,SYNC          ; WAIT N-FRONT
  46.  
  47. J000:
  48.   IN   A,(PORT)
  49.   AND  BITMASK_SYN
  50.   JP   Z,J000           ; WAIT P-FRONT
  51.   RET
  52.  
  53. ;---------------------------------------------------------------------
  54.  
  55. READIN:
  56.   IN   A,(PORT)
  57.   CPL                   ; POSITIVE LOGIC
  58.   AND  BITMASK_X0       ; TEST INPUT BIT
  59.   CALL BOOL             ; REDUCE TO 0/1
  60.   CALL DEBOUNCE         ; 50 ms LOW PASS FILTER
  61.   LD   (_X0_),A         ; STORE FILTERED INPUT
  62.   RET
  63.  
  64. ;---------------------------------------------------------------------
  65.  
  66. BOOL:
  67.   AND  A                ; 0 ?
  68.   RET  Z                ; YES, RETURN
  69.   LD   A,1              ; NO, SET TO 1
  70.   RET
  71.            
  72. ;---------------------------------------------------------------------
  73.  
  74. DEBOUNCE:
  75.   RRA
  76.   LD   A,(_SHIFT_)
  77.   RLA
  78.   AND  %00111111
  79.   LD   (_SHIFT_),A
  80.   AND  A                ; ALL 0 ?
  81.   RET  Z                ; YES, RETURN 0
  82.   CP   %00111111        ; ALL 1 ?
  83.   LD   A,1
  84.   RET  Z                ; YES, RETURN 1
  85.   LD   A,(_X0_)         ; NO, MAINTAIN
  86.   RET
  87.  
  88. ;---------------------------------------------------------------------
  89.  
  90. MACHINE:
  91.   LD   HL,(_TIME_)
  92.   INC  HL
  93.   LD   (_TIME_),HL
  94.   LD   IY,(_PHASE_)     ; LOAD ACTIVE STATE ADDR
  95.   CALL J020
  96.   LD   (_PHASE_),IY     ; STORE NEW STATE ADDR
  97.   RET
  98.  
  99. J020:
  100.   JP   (IY)             ; JUMP TO ACTIVE STATE
  101.  
  102.  
  103. IDLE:
  104.   LD   A,(_X0_)         ; READ INPUT _X0_
  105.   AND  A                ; PRESSED ?
  106.   RET  Z                ; NO, RETURN
  107.   CALL RESTIME          ; RESET TIME FOR LONG PRESS DETECT
  108.   LD   IY,S_1           ; PHASE S_1
  109.   RET
  110.  
  111.  
  112. S_1:
  113.   LD   A,(_X0_)         ; READ INPUT _X0_
  114.   AND  A                ; RELEASED ?
  115.   JP   Z,S_1_1          ; YES, JUMP
  116.   LD   DE,70
  117.   CALL ELAPSED          ; ELAPSED 0,7 s ?
  118.   RET  C                ; NO, RETURN
  119.   CALL ONV2             ; LONG PRESS DETECT
  120.   CALL RESTIME          ; RESET TIME FOR 20 s TIMEOUT
  121.   LD   IY,S_2           ; PHASE S_2
  122.   RET
  123. S_1_1:
  124.   CALL ONV1             ; CLICK DETECT
  125.   CALL RESTIME          ; RESET TIME FOR 20 s TIMEOUT
  126.   LD   IY,S_3           ; PHASE S_3
  127.   RET
  128.  
  129.  
  130. S_2:
  131.   LD   A,(_X0_)         ; READ INPUT _X0_
  132.   AND  A                ; RELEASED ?
  133.   LD   IY,S_3
  134.   RET  Z                ; YES, PHASE 3
  135.   LD   IY,(_PHASE_)
  136.   LD   DE,2000
  137.   CALL ELAPSED          ; ELAPSED 20 s ?
  138.   RET  C                ; NO, RETURN SAME PHASE
  139.   CALL OFF              ; YES, OFF
  140.   LD   IY,S_4           ; PHASE 4
  141.   RET
  142.  
  143.  
  144. S_3:
  145.   LD   A,(_X0_)
  146.   AND  A                ; PRESSED ?
  147.   JP   NZ,S_3_1         ; YES, JUMP
  148.   LD   DE,2000
  149.   CALL ELAPSED          ; ELAPSED 20 s ?
  150.   RET  C                ; NO, RETURN
  151. S_3_1:
  152.   CALL OFF              ; PRESS OR TIMEOUT DETECT
  153.   LD   IY,S_4
  154.   RET
  155.  
  156.  
  157. S_4:
  158.   LD   A,(_X0_)         ; READ INPUT _X0_
  159.   AND  A                ; RELEASED ?
  160.   RET  NZ               ; NO, RETURN
  161.   LD   IY,IDLE          ; YES, IDLE PHASE
  162.   RET
  163.  
  164. ;---------------------------------------------------------------------
  165.  
  166. ELAPSED:
  167.   LD   HL,(_TIME_)      ; LOAD TIME
  168.   AND  A                ; CLEAR CARRY
  169.   SBC  HL,DE            ; Cf SET IF NO ELAPSED
  170.   RET
  171.  
  172. ;---------------------------------------------------------------------
  173.  
  174. RESTIME:
  175.   LD   HL,0
  176.   LD   (_TIME_),HL      ; CLEAR TIME COUNTER
  177.   RET
  178.  
  179. ;---------------------------------------------------------------------
  180.  
  181. ONV1:
  182.   LD   A,(_OUTVAL_)
  183.   OR   BITMASK_V1       ; SET V1 BIT
  184.   JP   J050
  185.  
  186. ONV2:
  187.   LD   A,(_OUTVAL_)
  188.   OR   BITMASK_V2       ; SET V2 BIT
  189.   JP   J050
  190.  
  191. OFF:
  192.   LD   A,BITMASK_V1
  193.   OR   BITMASK_V2
  194.   CPL
  195.   LD   E,A
  196.   LD   A,(_OUTVAL_)
  197.   AND  E                ; RESET ONLY V1 AND V2 BITS
  198.  
  199. J050:
  200.   LD   (_OUTVAL_),A     ; COMMON OUTPUT UPDATE
  201.   OUT  (PORT),A         ; OUTPUT UPDATE
  202.   RET
  203.  
  204. ;---------------------------------------------------------------------
  205.  
  206.   .END
  207.  
  208. ;---------------------------------------------------------------------
  209.  
  210.  
Tags: z80
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement