home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / ENTERPRS / CPM / UTILS / A / BIOSR4.ARC / CXINTR.ASM < prev    next >
Assembly Source File  |  1987-04-26  |  19KB  |  967 lines

  1.     title    'Interrupt handler    26 April 87'
  2.  
  3. ; Changes in this module were to remove the 40 column cursor flash
  4. ; routine and to add labels to let the code in CXIO change the 
  5. ; keboard feel and repeat rate.
  6. ; User assumes _ALL_ liability for it's use. Original copyright is still
  7. ; maintained by Commodore
  8.  
  9.     maclib    z80
  10.  
  11.     maclib    cxequ
  12.  
  13.     public    ?sysint
  14.  
  15.     public    repeat        ; repeat and delay added to allow code
  16.     public    delay        ; in CXIO to change repeat and feel of
  17.                 ; keyboard
  18.  
  19. done$scan:    equ    11110111b
  20.  
  21. clear$TxD$bit:    equ    10010111b    ; 2nd byte of   res  2,a
  22. set$TxD$bit:    equ    11010111b    ; 2nd byte of   setb 2,a
  23.  
  24. buf$end    equ    low(RxD$buffer+RxD$buf$size)
  25.  
  26.     page
  27. ;
  28. ;    The DE register is not changed by the interrupt handler
  29. ;
  30. ;        maximun of     T states advaliable per interrupt
  31. ;        DMA uses about 10 % (or   ) leaving only 
  32. ;        interrupt vectoring use a few more.
  33. ;
  34. ;        if both recv$state and send$state are in idle
  35. ;    T states   209+82++ (191max,38min) = (482max,329min)
  36. ;
  37. ;
  38. ;        if ether recv$state and send$state are active
  39. ;    T states   209+++ (289max, 82min) = (498max,291min)
  40. ;
  41.     CSEG
  42. ?sysint:
  43.     push    psw            ;11
  44.     push    b            ;11
  45.     push    h            ;11
  46. ;
  47.     lxi    b,CIA$1+int$ctrl    ;10
  48.     inp    a            ;12  clear CIA$1 interrupts
  49. ;
  50.     lxi    b,CIA2+data$a        ;10
  51.     inp    a            ;12
  52. out$rs232$cia    equ    $+1
  53.     setb    2,a            ;8   this instruction gets modified
  54.     outp    a            ;12
  55.  
  56.     inr    c            ;4   point to data$b (C=1)
  57.     inp    a            ;12
  58.     mov    h,c            ;4   set H=1
  59. recv$state:
  60.     call    recv$idle        ;17+(153max,54min)
  61.  
  62. send$state:
  63.     call    send$idle        ;17+(136max,28min)
  64.  
  65.     dcr    h            ;4     did H=1 ?
  66.     lxi    h,current$key$delay    ;10
  67.     jnz    skip$keyboard        ;10
  68.  
  69.     page
  70. ;
  71. ;    T states  32    if not done
  72. ;    T states  56+    if key scan done
  73. ;
  74. vector$key$state:
  75.     dcr    m            ;11
  76.     jrnz    exit$int        ;7/12
  77.     lda    int$rate        ;13
  78.     mov    m,a            ;7
  79. key$state:
  80.     call    key$scan$state        ;17+(191max,38min)
  81.     db    21h            ; lxi h,(mvi m,1)
  82. skip$keyboard:
  83.     mvi    m,1            ;
  84. exit$int:
  85.     pop    h
  86.     pop    b
  87.     pop    psw
  88.     ei
  89.     ret
  90.  
  91.  
  92. RxD$count:
  93.     db    0        ; number of bits left to receive
  94. TxD$count:
  95.     db    0        ; number of bits left to transmit
  96.  
  97. current$key$delay:
  98.     db    1
  99.  
  100.     page
  101. ;
  102. ;    T states  52    start bit
  103. ;    T states      no start bit, que inactive 
  104. ;    T states      no start bit, que active, DAV set
  105. ;    T states     no start bit, que active, DAV cleared
  106. ;
  107. recv$idle:
  108.     rar                ;4
  109.     jrnc    set$test$start$bit    ;7/(12+36)
  110.  
  111. ;11+12+31=54
  112. ;
  113. RxD$unque:            ;(36)+12+(105) = 153 max
  114.     jr    test$que        ;12
  115.  
  116. ;
  117. ;    T states  31    no process required
  118. ;    T states  91    que count adjusted (not empty)
  119. ;    t states 105    que count adjusted (empty)
  120. ;
  121. test$que:
  122.     lda    RS232$status        ;13    no processing req if QUE
  123.     ani    00100000b        ;7    bit (5) is clear
  124.     rz                ;5/11
  125.  
  126.     mvi    a,que$to$data-test$que    ;7
  127.     sta    RxD$unque+1        ;13    set next sub state
  128.  
  129.     lxi    h,RxD$buf$get        ;10
  130.     inr    m            ;11
  131.     mov    a,m            ;7
  132.     cpi    buf$end            ;7
  133.     rnz                ;5/11
  134.     mvi    m,low(RxD$buffer)    ;10
  135.     ret                ;10
  136.  
  137. ;
  138. set$test$start$bit:
  139.     lxi    h,test$start$bit    ;10
  140.     shld    recv$state+1        ;16
  141.     ret                ;10
  142.  
  143.     page
  144. ;
  145. ;    T states  28    if DAV still set
  146. ;    T states  89    to move char from que to recv$data
  147. ;
  148. que$to$data:
  149.     lda    RS232$status        ;13
  150.     rrc                ;4
  151.     rc                ;5/11
  152.  
  153.     lxi    h,RxD$buf$get        ;10
  154.     mov    l,m            ;7
  155.     mov    a,m            ;7
  156.     sta    recv$data        ;13
  157.  
  158.     mvi    a,adjust$cnt-test$que    ;7
  159.     sta    RxD$unque+1        ;13    set next sub state
  160.     ret                ;10
  161.  
  162. ;
  163. ;    T states  82    count not zero
  164. ;    T states  99    count becomes zero 
  165. ;
  166. adjust$cnt:
  167.     xra    a            ;4
  168.     lxi    h,RxD$buf$count        ;10
  169.     dcr    m            ;11
  170.     mvi    l,low(RS232$status)    ;7
  171.     setb    0,m            ;15    set DAV flag
  172.     jrnz    adj$cont        ;7/12
  173.     res    5,m            ;15    que empty turn QUE bit(5) off
  174.     mvi    a,que$empty-test$que    ;7
  175. adj$cont:
  176.     sta    RxD$unque+1        ;13
  177.     ret                ;10
  178. ;
  179. ;    T states  52/94
  180. ;
  181. que$empty:
  182.     xra    a            ;4    offset of zero for JR
  183.     sta    RxD$unque+1        ;13    (to get to test$que)
  184.     lxi    h,xon$xoff$flag        ;10
  185.     mvi    a,XON            ;7
  186.     cmp    m            ;7
  187.     rz                ;5/11
  188.     mov    m,a            ;7
  189.     mvi    a,send$x-send$norm    ;7
  190.     sta    send$idle+1        ;13
  191.     ret                ;10
  192.  
  193.  
  194.     page
  195. ;
  196. ;    test for false start
  197. ;
  198. ;    T states  72    if valid start
  199. ;    T states  52    if false start
  200. ;
  201. test$start$bit:
  202.     rar                ;4
  203.     jrc    set$recv$idle        ;7/(12+36)    RxD in carry bit
  204.     lxi    h,RS232$status        ;10
  205.     setb    1,m            ;15    set receiving data flag
  206.     lxi    h,start$idle$1        ;10
  207.     shld    recv$state+1        ;16
  208.     ret                ;10
  209.  
  210. ;
  211. ;    T states  36
  212. ;
  213. set$recv$idle:
  214.     lxi    h,recv$idle        ;10
  215.     shld    recv$state+1        ;16
  216.     ret                ;10
  217.  
  218.  
  219. ;
  220. ;    T states  93
  221. ;
  222. start$idle$1:
  223.     xra    a            ;4
  224.     sta    recv$bit+2        ;13
  225.     lda    XxD$config        ;13
  226.     ani    1            ;7
  227.     adi    7            ;7
  228.     sta    RxD$count        ;13
  229.     lxi    h,que$full$test        ;10
  230.     shld    recv$state+1        ;16
  231.     ret                ;10
  232.  
  233.     page
  234. ;
  235. ;    T states  57    RxD buffer not full
  236. ;    T states 117    RxD buffer full (send XOFF)
  237. ;    T states  86    RxD buffer full (XOFF sent already)
  238. ;
  239. que$full$test:
  240.     lxi    h,recv$bit        ;10
  241.     shld    recv$state+1        ;16
  242.     lda    RxD$buf$count        ;13
  243.     cpi    RxD$buf$size-16        ;7
  244.     rc                ;5/11
  245.     lxi    h,xon$xoff$flag        ;10
  246.     mvi    a,XOFF            ;7
  247.     cmp    m            ;7
  248.     rz                ;5/11
  249.     mov    m,a            ;7    set mode to send Xoff
  250.     mvi    a,send$x-send$norm    ;7
  251.     sta    send$idle+1        ;13
  252.     ret                ;10
  253.  
  254. ;
  255. ;    T states  64
  256. ;
  257. recv$bit:
  258.     rar                ;4
  259.     mvi    a,00            ;7    RxD in carry bit
  260.     rar                ;4    move data bit into MSB
  261.     sta    recv$bit+2        ;13
  262.     lxi    h,recv$bit$done$test    ;10
  263.     shld    recv$state+1        ;16
  264.     ret                ;10
  265.  
  266. ;
  267. ;    T states   69    if bits still remaining
  268. ;    T states  
  269. ;
  270. recv$bit$done$test:
  271.     lxi    h,RxD$count        ;10
  272.     dcr    m            ;11
  273.     jrnz    enter$recv$bit$idle    ;7/(12+36)
  274.  
  275.     lda    XxD$config        ;13
  276.     rlc                ;4
  277.     lxi    h,enter$RxD$stop    ;10
  278.     jrnc    do$test$stop        ;7/12
  279.     lxi    h,enter$RxD$parity    ;10
  280. do$test$stop:
  281.     shld    recv$state+1        ;16
  282.  
  283.     ani    1*2            ;7    A=0 if 7 bits else 8 bits
  284.     lda    recv$bit+2        ;13
  285.     jrnz    done$adj        ;7/12
  286.     rrc                ;4
  287. done$adj:
  288.     sta    RxD$data        ;13
  289.     ret                ;10
  290.  
  291. ;
  292. ;    T states  36
  293. ;
  294. enter$recv$bit$idle:
  295.     lxi    h,recv$bit$idle        ;10
  296.     shld    recv$state+1        ;16
  297.     ret                ;10
  298.  
  299. ;
  300. ;    T states  36+(28/105)
  301. ;
  302. recv$bit$idle:
  303.     lxi    h,recv$bit        ;10
  304.     shld    recv$state+1        ;16
  305.     jmp    RxD$unque        ;10
  306.     
  307.     page
  308. ;
  309. ;    T states  36+(28/105)
  310. ;
  311. enter$RxD$parity:
  312.     lxi    h,test$RxD$parity    ;10
  313.     shld    recv$state+1        ;16
  314.     jmp    RxD$unque        ;10
  315.  
  316. ;
  317. ;    T states      bit hi
  318. ;    T states      bit low
  319. ;
  320. test$RxD$parity:
  321.     lxi    h,RxD$parity$idle    ;10        RxD data bit in carry
  322.     shld    recv$state+1        ;16
  323.     rar                ;4
  324.     lda    XxD$config        ;13
  325.     jrc    RxD$parity$hi        ;7/12
  326.     rlc                ;4
  327.     rlc                ;4        mark space mode ? 
  328.     jrnc    test$parity$space    ;7/(12+15/46)    yes, go test it
  329.     rlc                ;4        get odd even mode
  330.     jr    test$odd$even        ;12+35/54
  331.  
  332. ;
  333. test$parity$space:        ;15/
  334.     rlc                ;4
  335.     rnc                ;5/11
  336.     jr    parity$error        ;12+25
  337.  
  338. ;
  339. test$parity$mark:        ;15/
  340.     rlc                ;4
  341.     rc                ;5/11
  342.     jr    parity$error        ;12+25
  343.  
  344.     page
  345. ;
  346. RxD$parity$hi:                ;4
  347.     rlc                ;4
  348.     rlc                ;4        mark/space mode ?
  349.     jrnc    test$parity$mark    ;7/12        yes, go test it
  350.     rlc                ;4        get odd/even flag
  351.     cmc                ;4        toggle it
  352. test$odd$even:            ;35/
  353.     lda    recv$bit+2        ;13
  354.     aci    0            ;7    
  355.     ana    a            ;4
  356.     rpe                ;5/11
  357. parity$error:            ;35
  358.     lxi    h,RS232$status        ;10
  359.     setb    4,m            ;15    set parity error
  360.     ret                ;10
  361.  
  362. ;
  363. ;    T states  36
  364. ;
  365. RxD$parity$idle:
  366.     lxi    h,enter$RxD$stop    ;10
  367.     shld    recv$state+1        ;16
  368.     jmp    RxD$unque        ;10
  369.  
  370.     page
  371. ;
  372. ;    T states   90     if que not in use and DAV is cleared
  373. ;    T states 149/151 if data placed in que
  374. ;
  375. enter$RxD$stop:
  376.     lda    RS232$status        ;13
  377.     ani    00100001b        ;7    DAV set or data in que?
  378.     jrnz    place$in$que        ;7/12    yes, place new char in que
  379.     lda    RxD$data        ;13    no, place char in data reg.
  380.     sta    recv$data        ;13
  381.     lxi    h,test$RxD$stop$dav    ;10
  382.     shld    recv$state+1        ;16
  383.     ret                ;10
  384.  
  385. ;
  386. place$in$que:            ;116/118
  387.     lxi    h,RxD$buf$count        ;10
  388.     inr    m            ;11
  389.     inr    l            ;4
  390.     mov    a,m            ;7
  391.     inr    a            ;4
  392.     cpi    buf$end            ;7
  393.     jrnz    put$buf$ok        ;7/12
  394.     mvi    a,low(RxD$buffer)    ;7
  395. put$buf$ok:
  396.     mov    m,a            ;7
  397.     mov    l,a            ;4
  398. RxD$data    equ    $+1
  399.     mvi    a,00            ;7
  400.     mov    m,a            ;7
  401.     lxi    h,test$RxD$stop$que    ;10
  402.     shld    recv$state+1        ;16
  403.     ret
  404.  
  405.     page
  406. ;
  407. ;    T states      no errors
  408. ;    T states      framing error    
  409. ;
  410. test$RxD$stop$que:
  411.     rar                ;4
  412.     mvi    a,00100000b        ;7
  413.     jmp    test$RxD$cont        ;10
  414.  
  415. ;
  416. ;    T states       no errors
  417. ;    T states       framing error    
  418. ;
  419. test$RxD$stop$dav:
  420.     rar                ;4
  421.     mvi    a,00000001b        ;7
  422. test$RxD$cont:
  423.     jrc    good$RxD$stop        ;7/12
  424.     ori    00001000b        ;7    set framing error
  425. good$RxD$stop:
  426.     lxi    h,RS232$status        ;10
  427.     ora    m            ;7
  428.     ani    11111101b        ;7    clear recv active flag bit
  429.     mov    m,a            ;7
  430.     lxi    h,recv$idle        ;10
  431.     shld    recv$state+1        ;16
  432.     ret                ;10
  433.  
  434.     page
  435. ;*
  436. ;*    T states       stay in idle state
  437. ;*    T states      exit idle state (recv buffer not full)
  438. ;*    T states      exit idle state (recv buffer full)
  439. ;*
  440. send$idle:
  441.     jr    send$norm        ;12
  442.  
  443. send$norm:
  444.     lda    RS232$status        ;13
  445.     rlc                ;4
  446.     rnc                ;5/11
  447.  
  448.     lxi    h,start$send$1        ;10
  449.     shld    send$state+1        ;16
  450.     mvi    a,clear$TxD$bit        ;7
  451.     sta    out$rs232$cia        ;13    send the start bit
  452.     ret                ;10
  453.  
  454. ;
  455. ;    T states   12+118
  456. ;
  457. send$x:
  458. xon$xoff$flag    equ    $+1
  459.     mvi    a,XON            ;7    
  460.     sta    send$bits+1        ;13
  461.     xra    a            ;4
  462.     sta    send$idle+1        ;13
  463.     mvi    a,clear$TxD$bit        ;7
  464.     sta    out$rs232$cia        ;13    send the start bit
  465.     lxi    h,RS232$status        ;10
  466.     setb    6,m            ;15    flag send bussy
  467.     lxi    h,start$xon$xoff    ;10
  468.     shld    send$state+1        ;16
  469.     ret                ;10
  470.  
  471.     page
  472.  
  473. ;
  474. ;    T states  107
  475. ;
  476. start$send$1:
  477.     lda    xmit$data        ;13
  478.     sta    send$bits+1        ;13
  479.     lxi    h,RS232$status        ;10
  480.     mov    a,m            ;7
  481.     xri    0C0h            ;7    clear bit 7 and set bit 6
  482.     mov    m,a            ;7
  483. start$xon$xoff:
  484.     lda    XxD$config        ;13
  485.     ani    1            ;7
  486.     adi    7            ;7
  487.     sta    TxD$count        ;13
  488. enter$send$bits:
  489.     lxi    h,start$bit$idle    ;10
  490.     shld    send$state+1        ;16
  491.     ret                ;10
  492.  
  493. ;
  494. ;    T states  36
  495. ;
  496. start$bit$idle:
  497.     lxi    h,send$bits        ;10
  498.     shld    send$state+1        ;16
  499.     ret                ;10
  500.  
  501. ;
  502. ;    T states  94    data bit low
  503. ;    T states  92    data bit hi    
  504. ;
  505. send$bits:
  506.     mvi    a,00            ;7
  507.     rrc                ;4
  508.     sta    send$bits+1        ;13
  509.     lxi    h,count$TxD        ;10
  510.     shld    send$state+1        ;16
  511. send$TxD:            ;42/44
  512.     mvi    a,set$TxD$bit        ;7
  513.     jrc    send$hi$bit        ;7/12
  514.     mvi    a,clear$TxD$bit        ;7
  515. send$hi$bit:
  516.     sta    out$rs232$cia        ;13
  517.     ret                ;10
  518.  
  519. ;
  520. ;    T states      if more data bits to send
  521. ;    T states      if done sending bits
  522. ;
  523. count$TxD:
  524.     lxi    h,TxD$count        ;10
  525.     dcr    m            ;11
  526.     jrnz    enter$send$bits        ;7/12
  527.     lxi    h,TxD$parity$wait    ;10
  528.     shld    send$state+1        ;16
  529.     ret                ;10
  530.  
  531.     page
  532. ;
  533. ;    T states  36
  534. ;
  535. TxD$parity$wait:
  536.     lxi    h,TxD$parity        ;10
  537.     shld    send$state+1        ;16
  538.     ret                ;10
  539.  
  540. ;
  541. ;
  542. ;    T states   85    if no parity
  543. ;    T states  124    if mark parity
  544. ;    T states  126    if space parity
  545. ;    T states  136    if even parity
  546. ;    T states  129    if odd parity
  547. ;
  548. TxD$parity:
  549.     lda    XxD$config        ;13
  550.     rlc                ;4
  551.     jrnc    TxD$stop        ;7/(12+56)
  552.     lxi    h,TxD$parity$idle$1    ;10
  553.     shld    send$state+1        ;16
  554.     rlc                ;4
  555.     jrnc    send$mark$space        ;7/(12+16+42/44)
  556.     rlc                ;4
  557.     lda    send$bits+1        ;13
  558.     aci    0            ;7
  559.     ana    a            ;4
  560.     mvi    a,set$TxD$bit        ;7
  561.     jpo    send$TxD$parity        ;10
  562.     mvi    a,clear$TxD$bit        ;7
  563. send$TxD$parity:
  564.     sta    out$rs232$cia        ;13
  565.     ret                ;10
  566. ;
  567. send$mark$space:
  568.     rlc                ;4
  569.     jr    send$TxD        ;12+42/44
  570.  
  571. ;
  572. ;    T states  36
  573. ;
  574. TxD$parity$idle$1:
  575.     lxi    h,TxD$parity$idle$2        ;10
  576.     shld    send$state+1            ;16
  577.     ret                    ;10
  578.  
  579. ;
  580. ;    T states  36
  581. ;
  582. TxD$parity$idle$2:
  583.     lxi    h,TxD$stop            ;10
  584.     shld    send$state+1            ;16
  585.     ret                    ;10
  586.  
  587.     page
  588. ;
  589. ;    T states   103/101
  590. ;
  591. TxD$stop:
  592.     lxi    h,TxD$stop$idle            ;10
  593.     shld    send$state+1            ;16
  594.  
  595.     mvi    a,set$TxD$bit            ;7
  596.     sta    out$rs232$cia            ;13
  597.  
  598.     lda    XxD$config            ;13
  599.     ani    2                ;7
  600.     jrnz    one$stop$bit            ;7/12
  601.     mvi    a,5                ;7
  602. one$stop$bit:
  603.     inx    h                ;6
  604.     mov    m,a                ;7
  605.     ret                    ;10
  606.  
  607. ;
  608. ;    T states  35/90
  609. ;
  610. TxD$stop$idle:
  611.     mvi    a,00                ;7
  612.     dcr    a                ;4
  613.     sta    TxD$stop$idle+1            ;13
  614.     rnz                    ;5/11
  615.     lxi    h,RS232$status            ;10
  616.     res    6,m                ;15
  617.     lxi    h,send$idle            ;10
  618.     shld    send$state+1            ;16
  619.     ret                    ;10
  620.     
  621.     page
  622. ;
  623. ;
  624. ;
  625. Key$Scan$State:
  626.     jr    scan$CIA        ;12
  627.  
  628. ;
  629. ;    T states    no new key down
  630. ;    T states    state change
  631. ;    T states      new key down
  632. ;
  633. scan$CIA:
  634.     stc                ;4
  635.     mvi    a,11111110b        ;7    data field updated by code
  636.     lxi    b,key$row        ;10
  637.     outp    a            ;12
  638.     cpi    11111111b        ;7
  639.     jrz    extra$3            ;7/12 carry=0 if A=11111111
  640.     ral                ;4
  641.     sta    scan$CIA+1+1        ;13
  642.     lxi    h,key$scan$tbl        ;10   get current new table pointer
  643.     inr    c            ;4    point to KEY$COL (input)
  644.     jmp    cont$read        ;10
  645. ;
  646. extra$3:
  647.     ral                ;4
  648.     sta    scan$CIA+1+1        ;13
  649.     mvi    a,scan$VIC-scan$CIA    ;7
  650.     sta    Key$Scan$State+1    ;13
  651.     ret                ;10
  652.  
  653.     page
  654. ;
  655. ;    T states      no new key and no state change
  656. ;
  657. scan$VIC:
  658.     mvi    a,11101110b        ;7
  659.     lxi    h,key$scan$tbl        ;10   get current new table pointer
  660.     lxi    b,vic$key$row        ;10
  661.     outp    a            ;12    
  662.     rlc                ;4
  663.     sta    scan$VIC+1        ;13
  664.     jrnc    normal$8        ;7/12
  665.     lxi    b,key$col        ;10
  666. cont$read:
  667.     inp    a            ;12   0FFh if no key down
  668.     inr    m            ;11
  669.     mov    l,m            ;7
  670.     mov    b,m            ;7    get old value in B
  671.     mov    m,a            ;7    save new value
  672.     xra    b            ;4    get differances
  673.     ana    b            ;4    test for only new keys down
  674.     rz                ;5/11
  675.     sta    matrix$byte        ;13
  676.     lxi    h,key$found        ;10
  677.     shld    key$state+1        ;16
  678.     ret                ;10
  679. ;
  680. ;
  681. normal$8:
  682. ;    mvi    a,scan$CIA-scan$CIA    ;7
  683.     xra    a            ;4
  684.     sta    Key$Scan$State+1    ;13
  685.     mov    m,l            ;7    reset current table pointer
  686.     lxi    h,Key$Repeat$State    ;10
  687.     shld    key$state+1        ;16
  688.     ret                ;10
  689.  
  690.     page
  691. ;
  692. ;    T states   48    repeat not active
  693. ;    T states  124    testing repeat (key realeased)
  694. ;    T states  110    testing repeat (not found)
  695. ;    T states  109    testing repeat (found)
  696. ;
  697. Key$Repeat$State:
  698.     lxi    h,Key$Scan$State
  699.     shld    key$state+1        ;16
  700. repeat$count    equ    $+1
  701.     mvi    a,00            ;7
  702.     ora    a            ;4
  703.     rz                ;5/11
  704.     lxi    h,repeat$count        ;10
  705.     dcr    a            ;4    yes, test for repeat yet
  706.     jrnz    not$repeat$yet        ;7/(12+(42/56))
  707. ;
  708. ;    the following 4 lines of code may NOT be changed.
  709. ;    CONF.COM looks for them to change the repeat rate.
  710. ;    also looks for RET ; MVI A,xx ; STA xxxx (see set$key$parm)
  711.  
  712. repeat    equ    $+1
  713.     mvi    m,3            ;10
  714.     lxi    h,save$key        ;10
  715.     shld    key$state+1        ;16
  716.     ret                ;10
  717. ;
  718. not$repeat$yet:            ;42/56
  719.     mov    m,a            ;7
  720. matrix$pos    equ    $+1
  721.     lda    Key$scan$tbl        ;13
  722. repeat$mask    equ    $+1
  723.     mvi    b,00            ;7
  724.     ana    b            ;4    key still down? (A=0)
  725.     rz                ;5/11 yes, exit for now
  726.     mvi    m,0            ;10
  727.     ret                ;10
  728.  
  729.     page
  730. ;
  731. ;
  732. ;
  733. ;
  734. ;
  735. key$found:    ;148/138/157/147/166/156/161/167
  736. matrix$byte    equ    $+1
  737.     mvi    b,00            ;7
  738.     mov    a,b            ;4
  739.     ani    11110000b        ;7
  740.     jz    check$low$4        ;10+(138/128/133/139)
  741.     ani    11000000b        ;7
  742.     jrz    check$5$and$4        ;7/(12+(110/100))
  743.     ani    10000000b        ;7
  744.     mvi    c,6            ;7
  745.     jrnz    is$add$1        ;7/(12+70)
  746.     mvi    a,01000000b        ;7
  747.     jr    is$common        ;12+66
  748. ;
  749. check$5$and$4:            ;110/100
  750.     mov    a,b            ;4
  751.     ani    00100000b        ;7
  752.     mvi    c,4            ;7
  753.     jrnz    is$add$1        ;7/(12+70)
  754.     mvi    a,00010000b        ;7
  755.     jr    is$common        ;12+66
  756. ;
  757. ;
  758. check$low$4:        ;138/128/133/139
  759.     mov    a,b            ;4
  760.     ani    00001111b        ;7
  761.     jrz    exit$found        ;7/12
  762.     ani    00001100b        ;7
  763.     jrz    check$1$and$0        ;7/12+(96/102)
  764.     ani    00001000b        ;7
  765.     mvi    c,2            ;7
  766.     jrnz    is$add$1        ;7/(12+70)
  767.     mvi    a,00000100b        ;7
  768.     jr    is$common        ;12+66
  769. ;
  770. check$1$and$0:            ;
  771.     mov    a,b            ;4
  772.     ani    00000010b        ;7
  773.     mvi    c,0            ;7
  774.     jrnz    is$add$1        ;7/(12+70)
  775.     inr    a            ;4    set A=1
  776.     jr    is$common        ;12+66
  777. ;
  778. ;
  779. is$add$1:            ;70
  780.     inr    c            ;4
  781. is$common:            ;66
  782.     sta    mask$value        ;13
  783.     mov    a,c            ;4
  784.     sta    bit$value        ;13
  785.     lxi    h,key$found$2        ;10
  786.     shld    key$state+1        ;16
  787.     ret                ;10
  788. ;
  789. exit$found:
  790.     lxi    h,Key$Scan$state    ;10
  791.     shld    key$state+1        ;16
  792.     ret                ;10
  793.  
  794.     page
  795. ;
  796. ;    T states
  797. ;
  798. key$found$2:
  799.     lxi    h,matrix$byte        ;10
  800. mask$value    equ    $+1
  801.     mvi    a,00            ;7
  802.     xra    m            ;7   clear current bit
  803.     mov    m,a            ;7
  804. bit$value    equ    $+1
  805.     mvi    b,00            ;7
  806.     lxi    h,key$scan$tbl        ;10  get the pointer
  807.     mov    a,m            ;7
  808.     sub    l            ;4   remove the bias
  809.     dcr    a            ;4   then one extra (pointer)
  810.     add    a            ;4
  811.     add    a            ;4
  812.     add    a            ;4   shift left 3 bits
  813.     add    b            ;4   add in bit position
  814.     sta    key$code        ;13  save as the key code
  815.     lxi    h,remove$special$keys    ;10
  816.     shld    key$state+1        ;16
  817.     ret                ;10
  818.  
  819.     page
  820. ;
  821. ;    T states          if not a shift of control key
  822. ;    T states  68/82/96    if cntr / rt_shift / lf_shift
  823. ;
  824. remove$special$keys:
  825.     lxi    h,key$found        ;10
  826.     lda    key$code        ;13
  827.     cpi    38h+2            ;7    control key pressed ?
  828.     jrz    bad$key            ;7/12
  829.     cpi    30h+4            ;7
  830.     jrz    bad$key            ;7/12
  831.     cpi    08h+7            ;7
  832.     jrz    bad$key            ;7/12
  833.  
  834.     lxi    h,set$key$parm        ;10
  835. bad$key:
  836.     shld    key$state+1        ;16
  837.     ret                ;10
  838.  
  839. ;
  840. ;    T states
  841. ;
  842. ;    do not change the next 2 lines. CONF uses them to
  843. ;    the set repeat rate. (also RET above here)
  844. ;
  845. delay    equ    $+1
  846. set$key$parm:
  847.     mvi    a,8            ;7
  848.     sta    repeat$count        ;13  number of counts for repeat
  849.     lda    key$scan$tbl        ;13
  850.     sta    matrix$pos        ;13
  851.     lda    mask$value        ;13
  852.     sta    repeat$mask        ;13
  853.     lxi    h,build$cntr$byte    ;10
  854.     shld    key$state+1        ;16
  855.     ret                ;10
  856.  
  857. ;
  858. ;    T states  
  859. ;
  860. build$cntr$byte:
  861.     lda    key$scan$tbl+1+7    ;13  get control byte row
  862.     cma                ;4
  863.     ani    04h            ;7   test control key bit
  864.     jrz    not$control        ;7/12
  865.     mvi    a,7            ;7
  866. not$control:
  867.     mov    b,a            ;4
  868.     lda    key$scan$tbl+1+6    ;13  get rigth shift byte row
  869.     cma                ;4
  870.     ani    10h            ;7   test right key bit
  871.     ora    b            ;4
  872.     mov    b,a            ;4
  873.     lda    key$scan$tbl+1+1    ;13  get left shift byte row
  874.     cma                ;4
  875.     ani    80h            ;7   test left key bit
  876.     ora    b            ;4
  877.     mov    b,a            ;4
  878.     ani    90h            ;7   either shift key down?
  879.     mov    a,b            ;4
  880.     jrz    no$shift        ;7/12 no, jump
  881.     ori    2            ;7    yes, set shift control bit
  882. no$shift:
  883.     sta    ctrl$byte        ;13
  884.     lxi    h,save$key        ;10
  885.     shld    key$state+1        ;16
  886.     ret                ;10
  887.  
  888.     page
  889. ;
  890. ;
  891. ;    NOTE:    character buffer MUST be on one page
  892. ;         (and have even number of bytes)
  893. ;
  894. ; buffer is FULL when data at put pointer does not equal 0ffh
  895. ; insert new character at (put pointer)
  896. ; and character control byte at (put pointer)+1
  897. ;    T states 38 if buffer is full
  898. ;    T states 146/148
  899. ;
  900. save$key:
  901.     lhld    key$put$ptr        ;16   get put pointer
  902.     mov    a,m            ;7    get byte from buffer
  903.     inr    a            ;4    room in buffer? (-1 if so)
  904.     rnz                ;5/11 no, wait for room in buffer
  905. key$code    equ    $+1        
  906.     mvi    m,00            ;10   get matrix position
  907.     inr    l            ;4
  908. ctrl$byte    equ    $+1
  909.     mvi    a,00            ;7
  910.     mov    m,a            ;7
  911.     inr    l            ;4
  912.     mov    a,l            ;4
  913.     cpi    low(key$buffer+key$buf$size)    ;7
  914.     jrnz    put$ptr$ok        ;7/12
  915.     mvi    a,low(key$buffer)    ;7
  916. put$ptr$ok:
  917.     sta    key$put$ptr        ;13  adjust the low byte of the put ptr
  918.     lxi    h,Key$tick        ;10
  919.     shld    key$state+1        ;16
  920.     ret                ;10
  921. ;
  922. ;    T states
  923. ;
  924. key$tick:
  925.     lxi    b,sid+24        ;10
  926.     lda    tick$vol        ;13
  927.     outp    a            ;12
  928.     mvi    c,low(sid+11)        ;7
  929.     mvi    a,80h            ;7
  930.     outp    a            ;12
  931.     inr    a            ;4
  932.     outp    a            ;12
  933.     lxi    h,key$scan$state    ;10
  934.     shld    key$state+1        ;16
  935.     ret                ;10
  936.  
  937.     page
  938.  
  939. ;
  940. ;_____      _____ _____ _____ _____ _____ _____ _____ _____ _____ __________
  941. ;    |     |     |     |     |     |     |     |     |     |     |    |    |
  942. ;    |  S  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  P  |   stop  |
  943. ;    |_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|    |    |_
  944. ;
  945. ;
  946. ;  Reciever State Machine
  947. ;
  948. ;
  949. ;_____      _____ _____ _____ _____ _____ _____ _____ _____ _____ __________
  950. ;    |     |     |     |     |     |     |     |     |     |     |    |    |
  951. ;    |  S  |  0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  P  |   stop  |
  952. ;    |_____|_____|_____|_____|_____|_____|_____|_____|_____|_____|    |    |_
  953. ;
  954. ;
  955. ;  Transmitter State Machine (TSM)
  956. ;
  957. ;
  958.  
  959. ;
  960. ;  Keyboard Scan State Machine (KSSM)
  961. ;
  962. |_____|_____|_____|    |    |_
  963. ;
  964. ;
  965. ;  Transmitter