home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / sigm / vol238 / level1.aqm / LEVEL1.ASM
Assembly Source File  |  1986-02-10  |  20KB  |  832 lines

  1. title 'LEVEL1.ASM'
  2. ;************************************************
  3. ;*                        *
  4. ;*        LEVEL1.ASM            *
  5. ;*                        *
  6. ;*  Hardware level initialization and interrupt    *
  7. ;*  service routines for X.25 protocol.        *
  8. ;*  Implemented for Digital Research Computers    *    
  9. ;*  'Big Board' single board computer.        *
  10. ;*  (Z80+SIO+CTC using mode 2 interrupts)    *
  11. ;*                        *
  12. ;*  rev 1.39    08/21/84    E. Elizondo    *
  13. ;*                        *
  14. ;*  (c) 1984 E. Elizondo - all rights reserved. *
  15. ;*                        *
  16. ;*    This program may be used freely for non-  *
  17. ;*  commercial applications. It may not be sold *
  18. ;*  or used for commercial applications without *
  19. ;*  written permission of the author.           *
  20. ;*                         *
  21. ;************************************************
  22. ;    
  23.     maclib    Z80        ;DR Z80 macro library
  24.  
  25.  
  26. ;    design parameters
  27.  
  28. ;    timer periods (seconds)
  29. t1:    equ    10        ;level 2 timer T1
  30. t20:    equ    180        ;level 3 timer T20
  31. t21:    equ    200        ;level 3 timer T21
  32. t22:    equ    180        ;level 3 timer T22
  33. t23:    equ    180        ;level 3 timer T23
  34.  
  35. ;    BIG BOARD equates
  36.  
  37. ;    I/O port assignments
  38. BAUDA:    equ    00h    ;channel A baud generator
  39. SIO:    equ    04h    ;dual serial I/O
  40. SIODPA:    equ    SIO+0    ;SIO data port A
  41. SIOCPA:    equ    SIO+2    ;SIO control/status port A
  42. CTC:    equ    18h    ;quad counter/timer circuit
  43. CTC0:    equ    CTC+0    ;CTC channel 0
  44. CTC1:    equ    CTC+1    ;CTC channel 1
  45.  
  46. ;    interrupt vector locations
  47. SIOV4:    equ    0FF08h    ;SIO port A xmit buffer empty int vector
  48. SIOV5:    equ    0FF0Ah    ;SIO port A external status change
  49. SIOV6:    equ    0FF0Ch    ;SIO port A receive data available
  50. SIOV7:    equ    0FF0Eh    ;SIO port A special receive condition
  51. CTCV1:    equ    0FF12h    ;CTC channel 1 interrupt
  52.  
  53. ;    SIO commands
  54. srcres    equ    0011$0000b    ;reset special rx cond errors
  55. eomres    equ    1100$0000b    ;reset tx eom latch
  56. crcres    equ    1000$0000b    ;reset tx crc
  57. escres    equ    0001$0000b    ;reset external status interrupt
  58. intpres    equ    0010$1000b    ;reset tx interupt pending
  59. abort    equ    0000$1000b    ;HDLC abort command
  60.  
  61. ;    special Level 2 frame identifiers
  62.  
  63. cmdrfid    equ    1000$0111b    ;X.25 CMDR frame identifier
  64.  
  65.  
  66. ;    hooks for main program
  67.  
  68. ;    subroutine entry points
  69.     public    inisio        ;initialize SIO channel A
  70.     public    sbaud        ;set baud rate
  71.     public    txwake        ;start frame transmission
  72.     public    txabo        ;transmit immediate abort
  73.     public    t1on        ;start level 2 timer T1
  74.     public    t1off        ;stop level 2 timer T1
  75.     public    t20on        ;start level 3 timer T20
  76.     public    t20off        ;stop level 3 timer T20
  77.     public    t21on        ;start level 3 timer T21
  78.     public    t21off        ;stop level 3 timer T21
  79.     public    t22on        ;start level 3 timer T22
  80.     public    t22off        ;stop level 3 timer T22
  81.     public    t23on        ;start level 3 timer T23
  82.     public    t23off        ;stop level 3 timer T23
  83.  
  84.  
  85. ;    addresses
  86.     public    baudop        ;default baud rate option
  87.     public    rxgfct        ;count of good received frames
  88.     public    rxbfct        ;count of bad received frames
  89.     public    rxbbct        ;count of buffer busy
  90.     public    rxboct        ;count of buffer overrun
  91.     public    rxcect        ;count of crc errors
  92.     public    rxoect        ;count of received frame overruns
  93.     public    rxabct        ;count of received aborts
  94.     public    txefct        ;count of tx end of frames
  95.     public    txuect        ;count of tx underrun errors
  96.     public    txabct        ;count of transmitted aborts
  97.     public    txaddr        ;tx address byte
  98.     public    txctrl        ;tx control byte
  99.     public    rxstat        ;receive status flags
  100.     public    txstat        ;transmit status flags
  101.     public    tistat        ;timer status flags
  102.  
  103. ;    definition of rxstat flag byte:
  104. ;    bit    set condition
  105. ;    0    rx active
  106. ;    1    undefined
  107. ;    2    undefined
  108. ;    3    undefined
  109. ;    4    undefined
  110. ;    5    receiver buffers unavailable
  111. ;    6    undefined
  112. ;    7    undefined
  113.  
  114. ;    definition of txstat flag byte:
  115. ;    bit    set condition
  116. ;    0    tx active
  117. ;    1    tx message complete
  118. ;    2    tx frame underrun
  119. ;    3    next tx character is control
  120. ;    4    undefined
  121. ;    5    undefined
  122. ;    6    undefined
  123. ;    7    undefined
  124.  
  125. ;    definition of tistat flag byte:
  126. ;    bit    set condition
  127. ;    0    level 2 timer t1 timed out
  128. ;    1    level 3 timer t20 timed out
  129. ;    2    level 3 timer t21 timed out
  130. ;    3    level 3 timer T22 timed out
  131. ;    4    level 3 timer T23 timed out
  132. ;    5    undefined
  133. ;    6    undefined
  134. ;    7    undefined
  135.  
  136.  
  137. ;    external suboutines
  138.     extrn    ilprt        ;in line print routine
  139.     extrn    putbuf        ;write char to buffer
  140.     extrn    getbuf        ;read char from buffer
  141.     extrn    bpoint        ;point to bcb address
  142.     extrn    newrxb        ;get new rx buffer
  143.     extrn    clrbuf        ;clear buffer for new use
  144.     extrn    resbcb        ;restore bcb pointers
  145.     extrn    delay        ;wait a bit
  146.  
  147. ;    external addresses
  148.     extrn    rxbact        ;active rx buffer #
  149.     extrn    rxbtab        ;table of rx bcb pointers
  150.     extrn    rxfree        ;bcb for list of free rx buffers
  151.     extrn    rxflst        ;bcb for list of complete rx buffers
  152.     extrn    rxbcbp        ;active rx bcb
  153.     extrn    txbtab        ;table of tx bcb pointers
  154.     extrn    txbcbp        ;active tx bcb
  155.     extrn    txubcb        ;bcb for CMDR/FRMR I data
  156.  
  157.  
  158. ;    miscellaneous equates
  159.     
  160. cr    equ    0Dh    ;carriage ret
  161. lf    equ    0Ah    ;line feed
  162.  
  163.  
  164.     cseg            ;code segment
  165.  
  166.  
  167. ;    *********************************
  168. ;    * initialization section    *
  169. ;    *********************************
  170.  
  171.  
  172. ;    initialize SIO port A
  173. ;    (externally called)
  174. ;    on entry:    no paramters
  175. ;    on exit:    flags, regs clobbered
  176.  
  177. inisio:    
  178. ;    initialize interrupt vectors
  179.     lxi    h,siotbe    ;tx interrupt service
  180.     shld    siov4
  181.     lxi    h,sioesc    ;ext status change service
  182.     shld    siov5
  183.     lxi    h,siorca    ;rx interrupt service
  184.     shld    siov6
  185.     lxi    h,siosrc    ;special rx condition service
  186.     shld    siov7
  187.     lxi    h,tick        ;1 second timer interrupt
  188.     shld    ctcv1
  189.  
  190. ;    initialize baud rate
  191.     lda    baudop        ;get initial baud rate option
  192.     call    sbaud        ;set rate
  193.  
  194. ;    initialize programmable I/O devices
  195.     lxi    h,intab        ;point to SIO parameter table
  196. inilp:    mov    b,m        ;b= loop bytecount
  197.     inx    h
  198.     mov    c,m        ;c= device control port #
  199.     inx    h    
  200.     outir            ;output byte string 
  201.     mov    a,m        ;test for end of table
  202.     inr    a        ;    /
  203.     jnz    inilp        ;loop again if not at end
  204.  
  205. ;    initialize program status flags
  206.     xra    a    
  207.     sta    rxstat        ;clear receive flags
  208.     sta    txstat        ;clear transmit flags
  209.  
  210. ;    clear sio rx buffer
  211.     in    siodpa        ;clear out SIO data buffer
  212.     in    siodpa        ;again for luck
  213.     ret
  214.  
  215. ;    *********************************
  216. ;    * interrupt service routines    *
  217. ;    *********************************
  218.  
  219.  
  220. ;    receive character interupt service routine
  221. ;    (externally called)
  222. ;    on entry:    no parameters
  223. ;    on exit:    all flags, registers unchanged
  224.  
  225. siorca:
  226.     call    save        ;save registers
  227.     in    siodpa        ;get received char
  228.     mov    b,a        ;save char in <b>
  229.     lxi    h,rxstat    ;point to rx status flag
  230.     setb    0,m        ;set rx active
  231.     bit    5,m        ;rx buffer available?
  232.     jnz    erxbusy        ;no, handle error
  233. ;
  234.     mov    a,b        ;get byte
  235.     lhld    rxbcbp        ;<hl>=active bcb pointer
  236.     call    putbuf        ;store in buffer    
  237.     rnc            ;exit if no buffer overflow
  238. ;    
  239.     lhld    rxboct        ;else increment buffer overflow
  240.     inx    h        ;..error counter
  241.     shld    rxboct        ;    /
  242.     ret
  243.  
  244. ;    handle no buffer available error
  245. erxbusy:
  246.     lhld    rxbbct        ;get buffer busy error count
  247.     inx    h        ;increment it
  248.     shld    rxbbct        ;and save updated count
  249.     ret
  250.  
  251.  
  252. ;    special receive condition interrupt service routine
  253. ;    (externally called)
  254. ;    on entry:    no parameters
  255. ;    on exit:    all flags, regs unchanged
  256.  
  257. siosrc:
  258.     call    save        ;save registers
  259.     mvi    a,1        ;select rr1
  260.     out    siocpa        ;    /
  261.     in    siocpa        ;read rr1
  262.     mov    b,a        ;save status in <b>
  263.     mvi    a,srcres    ;reset error command
  264.     out    siocpa        ;    /
  265.     in    siodpa        ;clear data byte
  266.     lxi    h,rxstat    ;clear rx active
  267.     res    0,m
  268.     bit    7,b        ;check end of frame bit
  269.     jnz    eof        ;yes, service it
  270. ;
  271. ;    process error conditions
  272.     lhld    rxbfct        ;update bad frame count
  273.     inx    h        ;    /
  274.     shld    rxbfct        ;      /
  275.     bit    6,b        ;crc error?
  276.     cnz    crcerr        ;yes, service it
  277. ;
  278.     bit    5,b        ;overrun error?
  279.     cnz    orerr        ;yes, service it
  280. ;
  281.     call    flush        ;clear rx buffer
  282.     ret
  283. ;
  284. ;    process end of frame
  285. eof:
  286.     lda    rxbact        ;get active buffer #
  287.     lxi    h,rxflst    ;point to list of rx frames
  288.     call    putbuf        ;hand over frame
  289.     call    newrxb        ;get new rx buffer if avail
  290.     lhld    rxgfct        ;update good frame count
  291.     inx    h        ;    /
  292.     shld    rxgfct        ;      /
  293.     ret
  294. ;
  295. ;
  296. crcerr:    lhld    rxcect        ;update crc error counter
  297.     inx    h        ;    /
  298.     shld    rxcect        ;      /
  299.     ret
  300. ;
  301. orerr:    lhld    rxoect        ;update overrun error counter
  302.     inx    h        ;    /
  303.     shld    rxoect        ;      /
  304.     ret
  305.  
  306.             
  307. ;    tx wake routine (starts transmission of frame)
  308. ;    (externally called)
  309. ;    on entry:    no paramters
  310. ;    on exit:    flags, regs clobbered
  311.  
  312. txwake:
  313.     lxi    h,txstat    ;point to tx status flag
  314.     setb    0,m        ;signal tx active
  315.     setb    3,m        ;signal next char is control
  316.     mvi    a,crcres    ;reset tx crc
  317.     out    siocpa        ;    /
  318.     lda    txaddr        ;get address byte
  319.     out    siodpa        ;transmit it
  320.     mvi    a,eomres    ;reset tx eom latch
  321.     out    siocpa        ;    /
  322.     ret
  323.  
  324.  
  325. ;    tx buffer empty interrrupt service routine
  326. ;    (externally called)
  327. ;    on entry:    no parameters
  328. ;    on exit:    all flags, regs unchanged
  329.  
  330. siotbe:
  331.     call    save        ;save registers
  332.     lxi    h,txstat    ;point to tx status flag
  333.     bit    1,m        ;message complete?
  334.     jnz    txeof        ;yes, process end of frame
  335. ;
  336.     lda    txctrl        ;get control byte
  337.     bit    3,m        ;next char is control?
  338.     jz    txnext        ;no, process remainder of frame
  339. ;
  340.     res    3,m        ;yes, reset flag
  341.     out    siodpa        ;transmit control byte
  342.     ret
  343. ;    
  344. ;    process remainder of frame
  345. txnext:    bit    0,a        ;I frame?
  346.     jz    txinfo        ;yes, process it
  347. ;
  348.     ani    1110$1111b    ;CMDR frame?
  349.     cpi    cmdrfid        ;    /
  350.     jnz    txeom        ;no, process end of message
  351. ;
  352.     lxi    h,txubcb    ;yes, point to CMDR bcb
  353.     call    getbuf        ;byte available?
  354.     jc    txeom        ;no, process end of message
  355. ;
  356.     out    siodpa        ;else output byte
  357.     ret            
  358.  
  359. ;    process I frame
  360. txinfo:    lhld    txbcbp        ;point to active bcb
  361.     call    getbuf        ;end of buffer?
  362.     cc    resbcb        ;yes, restore bcb pointers
  363.     jc    txeom        ;and process end of message
  364. ;
  365.     out    siodpa        ;else output byte
  366.     ret            
  367. ;    
  368.  
  369. ;    process end of transmitted message
  370. txeom:    lxi    h,txstat    ;point to tx status flag
  371.     setb    1,m        ;set message complete semaphore
  372.     lhld    txefct        ;increment end of frame count
  373.     inx    h        ;    /
  374.     shld    txefct        ;      /
  375.     jmp    txexi
  376.  
  377. ;    process end of transmitted frame
  378. txeof:    res    1,m        ;clear tx mc flag
  379.     res    0,m        ;set tx inactive
  380. txexi:    mvi    a,intpres    ;reset tbe int pending
  381.     out    siocpa        ;    /
  382.     ret
  383.  
  384.  
  385. ;    service external status change interrupt
  386. ;    (externally called)
  387. ;    on entry:    no parameters
  388. ;    on exit:    all flags, regs unchanged
  389.  
  390. sioesc:
  391.     call    save         ;save registers
  392.     in    siocpa        ;read rr0
  393.     mov    b,a        ;save status in <b>
  394.     bit    6,b        ;tx buffer underrun?
  395.     jnz    txurun        ;yes, process it
  396. ;
  397.     bit    7,b        ;abort received?
  398.     jnz    rxabo        ;yes, process it
  399. ;
  400. ;    else it's only a sync detect
  401.     in    siodpa        ;clear extraneous char
  402.     jmp    escexi        ;and exit
  403. ;
  404. ;    process rx abort
  405. rxabo:
  406.     mvi    a,3        ;wr3
  407.     out    siocpa        ;    /
  408.     mvi    a,1101$0001b    ;enter hunt phase
  409.     out    siocpa
  410.     in    siodpa        ;clear any extraneous char
  411.     lhld    rxabct        ;increment rx abort count
  412.     inx    h        ;    /
  413.     shld    rxabct        ;      /
  414.     call    flush        ;clear rx buffer
  415.     call    delay        ;wait a little bit
  416.     jmp    escexi        ;and exit
  417. ;
  418. ;    process tx buffer underrun
  419. txurun:    mvi    a,eomres    ;reset eom/underrun latch
  420.     out    siocpa        ;    /
  421.     lxi    h,txstat    ;point to tx status flag
  422.     bit    1,m        ;tx message complete?
  423.     jnz    escexi        ;yes, it's normal termination
  424. ;
  425. ;    process real tx buffer underrun error
  426.     res    0,m        ;clear tx busy flag
  427.     lhld    txuect        ;increment underrun error count
  428.     inx    h        ;    /
  429.     shld    txuect        ;      /
  430.     call    txabo        ;and abort transmission
  431.     lda    txctrl        ;get control byte
  432.     bit    0,a        ;I frame?
  433.     jnz    escexi        ;no, exit
  434. ;
  435.     lhld    txbcbp        ;yes, point to active tx bcb
  436.     call    resbcb        ;and reset pointers
  437. ;
  438. ;    common exit
  439. escexi:    mvi    a,escres    ;reset esc condition
  440.     out    siocpa        ;    /
  441.     ret
  442.  
  443.  
  444. ;    clear active rx buffer
  445. ;    (internally called)
  446. flush:    lhld    rxbcbp        ;point to active rx bcb 
  447.     call    clrbuf        ;clear buffer
  448.     ret
  449.  
  450.  
  451. ;    service 1 second timer interrupt from CTC-1
  452. ;    (externally called)
  453. ;    on entry:    no parameters
  454. ;    on exit:    all flags, regs unchanged
  455.  
  456. tick:
  457.     call    save        ;save registers
  458.     lxi    d,tistat    ;<de>=A(timer status word)
  459.     lxi    h,t1ct        ;point to first counter
  460.     xra    a        ;clear <a>
  461.     cmp    m        ;count=0?
  462.     jz    tick1        ;yes, keep going
  463.     dcr    m        ;else decrement count
  464.     jnz    tick1        ;keep going if not 0
  465.     xchg            ;else set timeout flag
  466.     setb    0,m        ;    /
  467.     xchg            ;      /
  468. tick1:    inx    h        ;point to next counter
  469.     cmp    m        ;count=0?
  470.     jz    tick2        ;yes, keep going
  471.     dcr    m        ;else decrement count
  472.     jnz    tick2        ;keep going if not 0
  473.     xchg            ;else set timeout flag
  474.     setb    1,m        ;    /
  475.     xchg            ;      /
  476. tick2:    inx    h        ;point to next counter
  477.     cmp    m        ;count=0?
  478.     jz    tick3        ;yes, keep going
  479.     dcr    m        ;else decrement count
  480.     jnz    tick3        ;keep going if not 0
  481.     xchg            ;else set timeout flag
  482.     setb    2,m        ;    /
  483.     xchg            ;      /
  484. tick3:    inx    h        ;point to next counter
  485.     cmp    m        ;count=0?
  486.     jz    tick4        ;yes, keep going
  487.     dcr    m        ;else decrement count
  488.     jnz    tick4        ;keep going if not 0
  489.     xchg            ;else set timeout flag
  490.     setb    3,m        ;    /
  491.     xchg            ;      /
  492. tick4:    inx    h        ;point to next counter
  493.     cmp    m        ;count=0?
  494.     jz    tick5        ;yes, keep going
  495.     dcr    m        ;else decrement count
  496.     jnz    tick5        ;keep going if not 0
  497.     xchg            ;else set timeout flag
  498.     setb    4,m        ;    /
  499.     xchg            ;      /
  500. tick5:                ;room for expansion
  501.     ret
  502.  
  503.  
  504. ;    save register routine for interrrupt service
  505.  
  506. save:    xthl            ;save <hl> & point to service routine
  507.     push    d        ;save the other regs
  508.     push    b        ;    /
  509.     push    psw        ;      /
  510.     call    go        ;go and return here from service routine
  511.     pop    psw        ;restore registers
  512.     pop    b        ;    /
  513.     pop    d        ;      /
  514.     pop    h        ;and get <hl> back from stack
  515.     ei            ;enable interupts
  516.     reti            ;restore interrupt chain
  517. ;
  518. go:    pchl            ;dispatch to <hl>
  519.  
  520.  
  521. ;    *********************************
  522. ;    * level 1 control subroutines    *
  523. ;    *********************************
  524.  
  525.  
  526. ;    transmit abort signal
  527. ;    (externally and internally called)
  528. ;    on entry:    no parameters
  529. ;    on exit:    flags, regs clobbered
  530.  
  531. txabo:
  532.     mvi    a,abort        ;send immediate abort
  533.     out    siocpa        ;    /
  534.     lhld    txabct        ;increment transmitted abort count
  535.     inx    h        ;    /
  536.     shld    txabct        ;      /
  537.     ret
  538.  
  539.  
  540. ;    stop level 2 timer T1
  541. ;    (externally and internally called)
  542. ;    on entry:    no paramters
  543. ;    on exit:    all flas, regs unchanged
  544.  
  545. t1off:
  546.     push    psw        ;save regs and flags
  547.     push    h        ;    /
  548.     xra    a        ;set count to 0
  549.     sta    t1ct        ;    /
  550.     lxi    h,tistat    ;reset timeout flag
  551.     res    0,m        ;    /
  552.     pop    h        ;restore regs and flags
  553.     pop    psw        ;    /
  554.     ret
  555.  
  556.  
  557. ;    stop level 3 timer T20
  558. ;    (externally and internally called)
  559. ;    on entry:    no paramters
  560. ;    on exit:    all flas, regs unchanged
  561.  
  562. t20off:
  563.     push    psw        ;save regs and flags
  564.     push    h        ;    /
  565.     xra    a        ;set count to 0
  566.     sta    t20ct        ;    /
  567.     lxi    h,tistat    ;reset timeout flag
  568.     res    1,m        ;    /
  569.     pop    h        ;restore regs and flags
  570.     pop    psw        ;    /
  571.     ret
  572.  
  573.  
  574. ;    stop level 3 timer T21
  575. ;    (externally and internally called)
  576. ;    on entry:    no paramters
  577. ;    on exit:    all flas, regs unchanged
  578.  
  579. t21off:
  580.     push    psw        ;save regs and flags
  581.     push    h        ;    /
  582.     xra    a        ;set count to 0
  583.     sta    t21ct        ;    /
  584.     lxi    h,tistat    ;reset timeout flag
  585.     res    2,m        ;    /
  586.     pop    h        ;restore regs and flags
  587.     pop    psw        ;    /
  588.     ret
  589.  
  590.  
  591. ;    stop level 3 timer T22
  592. ;    (externally and internally called)
  593. ;    on entry:    no paramters
  594. ;    on exit:    all flas, regs unchanged
  595.  
  596. t22off:
  597.     push    psw        ;save regs and flags
  598.     push    h        ;    /
  599.     xra    a        ;set count to 0
  600.     sta    t22ct        ;    /
  601.     lxi    h,tistat    ;reset timeout flag
  602.     res    3,m        ;    /
  603.     pop    h        ;restore regs and flags
  604.     pop    psw        ;    /
  605.     ret
  606.  
  607.  
  608. ;    stop level 3 timer T23
  609. ;    (externally and internally called)
  610. ;    on entry:    no paramters
  611. ;    on exit:    all flas, regs unchanged
  612.  
  613. t23off:
  614.     push    psw        ;save regs and flags
  615.     push    h        ;    /
  616.     xra    a        ;set count to 0
  617.     sta    t23ct        ;    /
  618.     lxi    h,tistat    ;reset timeout flag
  619.     res    4,m        ;    /
  620.     pop    h        ;restore regs and flags
  621.     pop    psw        ;    /
  622.     ret
  623.  
  624.  
  625. ;    start level 2 timer T1
  626. ;    (externally called)
  627. ;    on entry:    no parameters
  628. ;    on exit:    all regs, flags unchanged
  629.  
  630. t1on:
  631.     push    psw        ;save regs and flags
  632.     push    h        ;    /
  633.     mvi    a,t1        ;intitialize count
  634.     sta    t1ct        ;    /
  635.     lxi    h,tistat    ;reset timeout flag
  636.     res    0,m        ;    /
  637.     pop    h        ;restore flags, regs
  638.     pop    psw        ;    /
  639.     ret
  640.  
  641.  
  642. ;    start level 3 timer T20
  643. ;    (externally called)
  644. ;    on entry:    no parameters
  645. ;    on exit:    all regs, flags unchanged
  646.  
  647. t20on:
  648.     push    psw        ;save regs and flags
  649.     push    h        ;    /
  650.     mvi    a,t20        ;intitialize count
  651.     sta    t20ct        ;    /
  652.     lxi    h,tistat    ;reset timeout flag
  653.     res    1,m        ;    /
  654.     pop    h        ;restore flags, regs
  655.     pop    psw        ;    /
  656.     ret
  657.  
  658.  
  659. ;    start level 3 timer T21
  660. ;    (externally called)
  661. ;    on entry:    no parameters
  662. ;    on exit:    all regs, flags unchanged
  663.  
  664. t21on:
  665.     push    psw        ;save regs and flags
  666.     push    h        ;    /
  667.     mvi    a,t21        ;intitialize count
  668.     sta    t21ct        ;    /
  669.     lxi    h,tistat    ;reset timeout flag
  670.     res    2,m        ;    /
  671.     pop    h        ;restore flags, regs
  672.     pop    psw        ;    /
  673.     ret
  674.  
  675.  
  676. ;    start level 3 timer T22
  677. ;    (externally called)
  678. ;    on entry:    no parameters
  679. ;    on exit:    all regs, flags unchanged
  680.  
  681. t22on:
  682.     push    psw        ;save regs and flags
  683.     push    h        ;    /
  684.     mvi    a,t22        ;intitialize count
  685.     sta    t22ct        ;    /
  686.     lxi    h,tistat    ;reset timeout flag
  687.     res    3,m        ;    /
  688.     pop    h        ;restore flags, regs
  689.     pop    psw        ;    /
  690.     ret
  691.  
  692.  
  693. ;    start level 3 timer T23
  694. ;    (externally called)
  695. ;    on entry:    no parameters
  696. ;    on exit:    all regs, flags unchanged
  697.  
  698. t23on:
  699.     push    psw        ;save regs and flags
  700.     push    h        ;    /
  701.     mvi    a,t23        ;intitialize count
  702.     sta    t23ct        ;    /
  703.     lxi    h,tistat    ;reset timeout flag
  704.     res    4,m        ;    /
  705.     pop    h        ;restore flags, regs
  706.     pop    psw        ;    /
  707.     ret
  708.  
  709.  
  710.  
  711. ;    set baud rate
  712. ;    (externally and internally called)
  713. ;    on entry:    <a>=baud option (0-7)
  714. ;    on exit:    <a>=upper 4 bits=0
  715. ;            all other regs unchanged
  716.  
  717. sbaud:
  718.     ani    07h        ;extract lower 3 bits
  719.     sta    baudop        ;save option
  720.     push    h        ;save registers
  721.     push    d        ;    /
  722.     lxi    h,baudtab    ;point to baud table
  723.     mov    e,a        ;option to <de>
  724.     mvi    d,0
  725.     dad    d        ;point to desired baud
  726.     mov    a,m        ;get baud rate byte
  727.     sta    baudtab        ;save it
  728.     out    bauda        ;program the 8116
  729.     pop    d        ;restore registers
  730.     pop    h
  731.     ret
  732.  
  733.  
  734. ;    *****************
  735. ;    * data tables    *
  736. ;    *****************
  737.  
  738.  
  739.     dseg        ;data segment
  740.     
  741. baudop    db    1        ;default baud rate option
  742.  
  743. ;    table of constants for 8116 baud rate generator
  744. baudtab    db    0000$0000b    ;0= current baud rate
  745.     db    0000$0101b    ;1=   300 baud
  746.     db    0000$0110b    ;2=   600 baud
  747.     db    0000$0111b    ;3=  1200 baud
  748.     db    0000$1010b    ;4=  2400 baud
  749.     db    0000$1100b    ;5=  4800 baud
  750.     db    0000$1110b    ;6=  9600 baud
  751.     db    0000$1111b    ;7= 19200 baud
  752.  
  753. ;    SIO initialization table
  754.     
  755. intab:    db    t1end-$-2    ;byte count
  756.     db    siocpa        ;SIO channel a control port
  757.     db    0        ;WR0 for sure
  758.     db    0001$1000b    ;reset channel a
  759.     db    4        ;WR4
  760.     db    0010$0000b    ;HDLC mode
  761.     db    7        ;WR7
  762.     db    0111$1110b    ;HDLC flag
  763.     db    1        ;WR1
  764.     db    0001$1111b    ;interrupt control
  765.     db    5        ;WR5
  766.     db    1110$1011b    ;tx parameters + tx enable
  767. t1end:    equ    $
  768.  
  769.  
  770. ;    initialize CTC0
  771.     db    t2end-$-2    ;byte count
  772.     db    CTC0        ;CTC0 control port
  773.     db    00100111b    ;put CTC0 in timer mode
  774.     db    105        ;with period=105*256*0.4 us
  775. t2end:    equ    $        ;(=10752 us)
  776.  
  777.  
  778. ;    initialize CTC1 
  779.     db    t3end-$-2    ;byte count
  780.     db    CTC1        ;CTC1 control port
  781.     db    11000111b    ;put CTC1 in counter mode
  782.     db    93        ;with period=93*10752 us
  783. t3end:    equ    $        ;(=1sec) & interrupt enabled
  784.  
  785.     
  786. ;    initialize SIO receive section
  787. ;    (separated to facilitate initialization in self test mode)
  788.     db    t4end-$-2    ;byte count
  789.     db    siocpa        ;SIO-A control port
  790.     db    3        ;WR3
  791.     db    1101$0001b    ;rx parameters + rx enable
  792. t4end:    equ    $
  793.  
  794.  
  795.     db    -1        ;end of table marker
  796.  
  797. ;    *************************
  798. ;    * global variables    *
  799. ;    *************************
  800.  
  801. rxstat    db    0        ;rx status flags
  802. txstat    db    0        ;tx status flags
  803. tistat    db    0        ;timer status flags
  804. txaddr    db    0        ;tx address byte
  805. txctrl    db    0FFh        ;tx control byte
  806.  
  807. ;    system timers (must be contiguous)
  808. t1ct:    db    0        ;level 2 timer T1 count
  809. t20ct:    db    0        ;level 3 timer T20 count
  810. t21ct:    db    0        ;level 3 timer T21 count
  811. t22ct:    db    0        ;level 3 timer T22 count
  812. t23ct:    db    0        ;level 3 timer T23 count
  813.  
  814. ;    level 1  diagnostic counters
  815. rxbfct    dw    0000h        ;bad received frames
  816. rxgfct    dw    0000h        ;good received frames
  817. rxbbct    dw    0000h        ;chars lost due to buffers not avail
  818. rxboct    dw    0000h        ;chars lost due to buffer overrrun
  819. rxcect    dw    0000h        ;received crc errors
  820. rxoect    dw    0000h        ;receive overrun errors
  821. rxabct    dw    0000h        ;received aborts
  822. txefct    dw    0000h        ;tx end of frame count
  823. txuect    dw    0000h        ;tx underrun errors
  824. txabct    dw    0000h        ;transmitted aborts
  825.  
  826.  
  827.  
  828.  
  829.  
  830.  
  831.  
  832.