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 / CPM / MODEMS / MODEM / X25.ARK / X25.ASM < prev    next >
Assembly Source File  |  1986-07-28  |  31KB  |  1,318 lines

  1. title 'X25.ASM'
  2. ;************************************************
  3. ;*                        *
  4. ;*        X25.ASM                *
  5. ;*                        *
  6. ;*  X.25 protocol packet interface main program    *
  7. ;*                        *
  8. ;*  rev 0.46    05/04/85    E. Elizondo    *
  9. ;*                        *
  10. ;*  (c) 1985 E. Elizondo - all rights reserved. *
  11. ;*                        *
  12. ;*    This program may be used freely for non-  *
  13. ;*  commercial applications. It may not be sold *
  14. ;*  or used for commercial applications without *
  15. ;*  written permission of the author.           *
  16. ;*                         *
  17. ;************************************************
  18. ;    
  19. revmon    equ    05        ;program revision month
  20. revday    equ    04        ;program revision day
  21. revyr    equ    85        ;program revision year
  22.     
  23.     maclib    Z80        ;DR Z80 macro library
  24.  
  25. ;    miscellaneous equates
  26. false    equ    0
  27. true    equ    not false
  28. debug    equ    true
  29.  
  30. ;    standard ASCII equates
  31. bell    equ    07h
  32. tab    equ    09h
  33. cr    equ    0dh
  34. lf    equ    0ah
  35. ff    equ    0ch
  36. esc    equ    1bh
  37. bs    equ    08h
  38. del    equ    7fh
  39.  
  40.  
  41. ;    design parameters
  42.  
  43. ;    system commands
  44. mencmd:    equ    esc        ;command for main menu
  45. delcmd:    equ    'U'-40h        ;command to delete typed line
  46. lstcmd:    equ    'P'-40h        ;command to toggle printer flag
  47. brkcmd:    equ    'B'-40h        ;command to send interrupt packet
  48.  
  49. ;    Big Board parameters
  50. pfm:    equ    0f003h        ;PFM-80 warm start entry
  51. clscrn:    equ    1ah        ;clear screen character
  52. clrlin:    equ    18h        ;clear to end of line
  53.  
  54. ;    CP/M address equates:
  55. wboot:    equ    0000h        ;warm boot address
  56.  
  57.  
  58.  
  59. ;    hooks for other programs
  60.     public    l4stat        ;level 4 status flags
  61.  
  62. ;    definition of l4stat status bits
  63. ;    bit    set condition
  64. ;    0    prompt console for packet input
  65. ;    1    unasigned
  66. ;    2    unasigned
  67. ;    3    unasigned
  68. ;    4    unasigned
  69. ;    5    unasigned
  70. ;    6    unasigned
  71. ;    7    unasigned
  72.  
  73.  
  74.  
  75. ;    external subroutines
  76.  
  77. ;    from level1 module:
  78.     extrn    inisio        ;initialize level 1 hardware
  79.     extrn    txabo        ;transmit level 1 abort
  80.     extrn    poll        ;poll & service hardware
  81.     extrn    sbaud        ;set baud rate
  82.     extrn    t1off        ;turn off T1 timer
  83.  
  84. ;    from level2 module:
  85.     extrn    initl2        ;initialize level 2 parameters
  86.     extrn    conlk        ;connect level 2 link
  87.     extrn    disclk        ;disconnect level 2 link
  88.     extrn    qlksta        ;query level 2 link status
  89.     extrn    txifrm        ;transmit level 2 I frame
  90.     extrn    rxfrm        ;process received level 2 frame
  91.     extrn    txbadf        ;transmit bad frame
  92.  
  93. ;    from level3 module:
  94.     extrn    initl3        ;initialize level 3 parameters
  95.     extrn    txdpk        ;transmit data packet if avail
  96.     extrn    rxpk        ;receive packet if avail
  97.     extrn    txintp        ;transmit interrupt packet
  98.     extrn    txclrr        ;transmit clear request packet
  99.     extrn    txstar        ;transmit restart packet
  100.  
  101. ;    from files module:
  102.     extrn    iparms        ;initialize system parameters
  103.     extrn    wparms        ;write system parameters to disk
  104.     extrn    otxfil        ;open tx file
  105.     extrn    orxfil        ;open rx file
  106.     extrn    olgfil        ;open log file
  107.     extrn    crxfil        ;close rx file
  108.     extrn    ctxfil        ;close tx file
  109.     extrn    clgfil        ;close log file
  110.  
  111. ;    from xutil module:
  112.     extrn    ilprt        ;in-line print routine
  113.     extrn    ctype        ;type character
  114.     extrn    cview        ;display char on console (only)
  115.     extrn    instr        ;input console string
  116.     extrn    decbin        ;convert ASCII decimal to binary
  117.     extrn    hexbin        ;convert ASCII hex to binary
  118.     extrn    pbin        ;print byte in '1' and '0's
  119.     extrn    pdec        ;print binary number in decimal
  120.     extrn    phex1        ;print nibble in hex
  121.     extrn    disptch        ;dispatch to address in table
  122.  
  123. ;    from buffers module:
  124.     extrn    inibuf        ;initialize buffer parameters
  125.     extrn    clrtxb        ;clear all tx buffers
  126.     extrn    putbuf        ;put byte into a fifo buffer
  127.     extrn    getbuf        ;get byte from a fifo buffer
  128.     extrn    dcrbuf        ;decrement buffer count
  129.     extrn    clrbuf        ;clear buffer
  130.     extrn    setrdy        ;set buffer ready flag
  131.     extrn    getrdy        ;get state of buffer ready flag
  132.     extrn    clrrdy        ;clear buffer ready flag
  133.     extrn    getbct        ;get buffer count
  134.  
  135.  
  136.     
  137. ;    external addresses
  138.     
  139.     extrn    inbuf        ;A(console input buffer)
  140.     extrn    cibcb        ;A(console input buffer bcb)
  141.     extrn    cobcb        ;A(console output buffer bcb)
  142.     extrn    pobcb        ;A(printer output buffer bcb)
  143.     extrn    ctbcb        ;A(console transmit buffer bcb)
  144.     extrn    crbcb        ;A(console receive buffer bcb)
  145.     extrn    rxfree        ;A(list of free rx buffers bcb)
  146.     extrn    rxflst        ;A(list of rx frame buffers bcb)
  147.     extrn    rxplst        ;A(list of rx packet buffers bcb)
  148.  
  149.  
  150. ;    system status flags
  151.  
  152.     extrn    rxstat        ;level 1 rx status
  153.     extrn    txstat        ;level 1 tx status
  154.     extrn    tistat        ;timer status
  155.     extrn    lkstat        ;level 2 link status
  156.     extrn    l2stat        ;level 2 status flags
  157.     extrn    dtemod        ;DTE/DCE mode flag
  158.     extrn    l3stat        ;level 3 status flags
  159.     extrn    chstat        ;level 3 logical channel status
  160.     extrn    fstat        ;file status
  161.     extrn    prnflg        ;printer ena/dis flag
  162.  
  163. ;    level 1 parameters
  164.     extrn    baudop        ;default baud rate option
  165.  
  166. ;    level 2 parameters
  167.  
  168.     extrn    vr        ;V(r)
  169.     extrn    vs        ;V(s)
  170.     extrn    lastnr        ;last received N(r)
  171.     extrn    lastvs        ;last sent V(s)
  172.     extrn    maxvs        ;highest sent V(s)
  173.     extrn    pfbit        ;P/F bit
  174.  
  175. ;    level 3 parameters
  176.  
  177.     extrn    pr        ;P(r)
  178.     extrn    ps        ;P(s)
  179.     extrn    lastpr        ;last rx P(r)
  180.     extrn    lrxps        ;last rx P(s)
  181.     extrn    ltxps        ;last tx P(s)
  182.     extrn    pvcmod        ;PVC/VC mode flag
  183.     extrn    laddr        ;local DTE address
  184.     extrn    raddr        ;remote DTE address
  185.     extrn    laddrl        ;local DTE address length
  186.     extrn    raddrl        ;remote DTE address length
  187.     extrn    chan        ;logical channel #
  188.     extrn    qbit        ;Q bit
  189.     extrn    dbit        ;D bit
  190.     extrn    group        ;logical group #
  191.     
  192. ;    level 1 diagnostic counters
  193.  
  194.     extrn    rxbfct        ;bad rx frames
  195.     extrn    rxgfct        ;good rx frames
  196.     extrn    rxbbct        ;rx chars lost due to buff not avail
  197.     extrn    rxboct        ;rx chars lost due to buff overrun
  198.     extrn    rxcect        ;rx crc errors
  199.     extrn    rxoect        ;rx overrun errors
  200.     extrn    rxabct        ;rx aborts
  201.     extrn    txefct        ;tx end of frames
  202.     extrn    txuect        ;tx underrun errors
  203.     extrn    txabct        ;tx aborts
  204.  
  205. ;    level 2 diagnostic counters
  206.  
  207.     extrn    rbafct        ;rx bad address frames
  208.     extrn    rxbrct        ;rx bad response frames
  209.     extrn    rxbcct        ;rx bad command frames
  210.     extrn    rxcfct        ;rx command frames
  211.     extrn    rxrfct        ;rx response frames
  212.     extrn    rxifct        ;rx I frames
  213.     extrn    txifct        ;tx I frames
  214.     extrn    txfct        ;tx frames
  215.     extrn    txirct        ;I frame retransmissions
  216.  
  217. ;    level 3 diagnostic counters
  218.  
  219.     extrn    txpct        ;total tx packets
  220.     extrn    txfpct        ;total tx file data packets
  221.     extrn    txcpct        ;total tx console data packets
  222.     extrn    ntxbct        ;errors due to no free tx buffer
  223.     extrn    rxpct        ;total rx packets
  224.     extrn    rxdpct        ;total rx data packets
  225.     extrn    rbfpct        ;total rx bad format packets
  226.     extrn    rbcpct        ;total rx bad channel packets
  227.     extrn    rbapct        ;total rx bad address packets
  228.     extrn    rbipct        ;total rx bad id packets
  229.     extrn    rbgpct        ;total rx bad group packets
  230.     extrn    rxxpct        ;total discarded rx packets
  231.  
  232.  
  233. ;    *************************
  234. ;    *  start of program    *
  235. ;    *************************
  236.  
  237.  
  238.     jmp    begin        ;jump around debug entry point
  239.     jmp    mloop        ;debug entry point
  240. begin:
  241.     di            ;disable interrupts
  242.     lxi    h,0        ;get & save stack pointer
  243.     dad    sp        ;    /
  244.     shld    oldstk        ;      /
  245.     lxi    sp,stack    ;set up local stack
  246.     ei            ;enable interrupts
  247. ;
  248.     call    clear        ;clear crt screen
  249.     call    ilprt        ;log on
  250.     db    cr,lf
  251.     db    'X.25 packet communications program '
  252.     db    '(','0'+revmon/10,'0'+revmon mod 10,'/'
  253.     db    '0'+revday/10,'0'+revday mod 10,'/'
  254.     db    '0'+revyr/10,'0'+revyr mod 10,')',cr,lf
  255.     db    '(c) 1984 Ed Elizondo - all rights reserved'
  256.     db    cr,lf,0
  257. ;
  258.     call    iparms        ;initialize system defaults
  259.     call    inibuf        ;initialize buffer parameters
  260.     call    inisio        ;initialize level 1 hardware
  261.     call    initl2        ;initialize level 2 parameters
  262.     call    initl3        ;initialize level 3 parameters
  263. ;
  264.     call    menu2        ;get option
  265.     call    plstat        ;print link status
  266.     
  267.  
  268.  
  269. ;    *************************
  270. ;    * main program loop    *
  271. ;    *************************
  272. ;    
  273. ;    note: form optimum thruput, the following 
  274. ;          is recommended:
  275. ;          # of calls to rxfrm = 2 x # of calls to txifrm
  276. ;          # of calls to txifrm = 2 x # of calls to rxpk
  277. ;          # of calls to rxpk = 2 x # of calls to txdpk
  278.  
  279. mloop:    call    poll        ;service non interrupt hardware
  280.     call    pchar        ;process typed char, if any
  281.     call    rxfrm        ;process received frame
  282.     call    rxpk        ;process received packet
  283.     call    txdpk        ;transmit data packet to level 2
  284.     call    txifrm        ;transmit I frame
  285.     call    rxmsg        ;process received packet message
  286.     call    prompt        ;prompt for console packet data
  287.     jmp    mloop        ;keep doing it forever
  288.  
  289.  
  290. ;    *************************************************
  291. ;    *  service routines for main program loop    *
  292. ;    *************************************************
  293.  
  294.  
  295. ;    get and process typed character, if any
  296. pchar:    xra    a        ;clear <a> and flags
  297.     lxi    h,cibcb        ;console character avail?
  298.     call    getbuf        ;    /
  299.     rc            ;no, exit
  300. ;
  301.     ani    07fh        ;else strip parity
  302.     cpi    mencmd        ;escape?
  303.     jz    menu1        ;yes, go display main menu
  304. ;
  305.     cpi    del        ;delete?
  306.     jz    delchar        ;yes, go process it
  307. ;
  308.     cpi    delcmd        ;delete line command?
  309.     jz    deline        ;yes, go process it
  310. ;
  311.     cpi    brkcmd        ;break command?
  312.     jz    intrpt        ;yes, go process it
  313. ;
  314.     cpi    lstcmd        ;printer command?
  315.     jz    ptoggle        ;yes, go process it
  316. ;
  317.     cpi    cr        ;carriage return?
  318.     jz    cxfin        ;yes, handle end of message
  319. ;
  320. ;    else typed character is not special command
  321.     call    ctype        ;display char on console
  322.     call    cxmit        ;transmit char if link connected
  323.     ret
  324.  
  325.  
  326. ;    delete character previously typed
  327. delchar:
  328.     mvi    a,bs        ;get a backspace
  329.     call    ctype        ;back up cursor
  330.     mvi    a,' '        ;blank last typed char
  331.     call    ctype        ;    /
  332.     mvi    a,bs        ;and back up cursor again
  333.     call    ctype        ;    /
  334.     lxi    h,lkstat    ;link connected?
  335.     bit    2,m        ;    /
  336.     rz            ;no, do nothing else
  337. ;
  338.     lxi    h,ctbcb        ;else point to console tx buffer
  339.     call    getrdy        ;ready flag set?
  340.     rnz            ;yes, do nothing
  341. ;
  342.     call    dcrbuf        ;else delete last char
  343.     ret
  344.  
  345.  
  346. ;    delete last line typed
  347. deline:
  348.     mvi    a,cr        ;move cursor to beginning of line
  349.     call    cview        ;    /
  350.     mvi    a,clrlin    ;now clear to end of line
  351.     call    cview        ;    /
  352.     lxi    h,lkstat    ;link connected?
  353.     bit    2,m        ;    /
  354.     rz            ;no, do nothing else
  355. ;
  356.     lxi    h,ctbcb        ;point to console tx buffer
  357.     call    getrdy        ;ready flag set?
  358.     rnz            ;yes, do nothing
  359. ;
  360.     call    clrbuf        ;else clear buffer
  361.     ret
  362.  
  363.  
  364. ;    send interrupt packet
  365. intrpt:
  366.     mvi    b,0        ;<b>=interrupt cause (0 for now)
  367.     call    txintp        ;transmit interrupt packet
  368.     ret    
  369.  
  370.  
  371. ;    toggle printer on/off
  372. ptoggle:
  373.     lda    prnflg        ;get printer on/off flag
  374.     cma            ;toggle it
  375.     ora    a        ;printer going off?
  376.     jz    ptog1        ;yes, keep going
  377. ;
  378.     mvi    a,bell        ;else ding the console
  379.     call    cview        ;...like CP/M+
  380.     mvi    a,0ffh        ;get printer on flag
  381. ;
  382. ptog1:    sta    prnflg        ;and save new flag
  383.     ret
  384.  
  385.  
  386. ;    transmit character if link connected
  387. ;    on entry:    <a>=character
  388. ;    on exit:    flags, <a>,<hl> clobbered
  389.  
  390. cxmit:    lxi    h,lkstat    ;link connected?
  391.     bit    2,m        ;    /
  392.     rz            ;no, do nothing else
  393. ;
  394.     lxi    h,ctbcb        ;else point to console tx buffer
  395.     call    putbuf        ;put in tx buffer
  396.     ret
  397.  
  398.  
  399. ;    handle end of message if in flow control ready state
  400. cxfin:    call    ctype        ;display cr on console
  401.     call    plf        ;and also a line feed
  402.     lxi    h,lkstat    ;link connected?
  403.     bit    2,m        ;    /
  404.     rz            ;no, do nothing else
  405. ;
  406.     lxi    h,ctbcb        ;else point to console tx buffer
  407.     mvi    a,cr        ;put in cr
  408.     call    putbuf        ;    /
  409.     mvi    a,lf        ;and line feed
  410.     call    putbuf        ;    /
  411.     call    setrdy        ;signal buffer ready
  412.     lxi    h,l3stat    ;point to level 3 status
  413.     setb    7,m        ;and signal message waiting
  414.     ret
  415.  
  416.  
  417. ;    print a line feed on console
  418. plf:    mvi    a,lf
  419.     call    ctype
  420.     ret
  421.  
  422.  
  423. ;    process a byte from received packet message to console
  424. rxmsg:
  425.     lxi    h,crbcb        ;point to console rx buffer
  426.     call    getrdy        ;ready?
  427.     rz            ;no, exit
  428. ;
  429.     call    getbuf        ;is anything there?
  430.     rc            ;no, exit
  431. ;
  432.     if    debug        
  433.     mov    b,a        ;save first byte in <b>
  434. ;    tag all received packets for debug with '<r>'
  435.     mvi    a,'<'        ;indicate received msg
  436.     call    ctype        ;    /
  437.     mvi    a,'r'        ;      /
  438.     call    ctype        ;     /
  439.     mvi    a,'>'        ;    /
  440.     call    ctype        ;   /
  441.     mov    a,b        ;now restore first byte
  442.     endif
  443. ;
  444. ;    strip out all non-displayable characters
  445. rxmsg1:    cpi    20h        ;displayable ASCII char?
  446.     jnc    rxmsg2        ;yes, keep going
  447. ;
  448.     cpi    cr        ;carriage ret?
  449.     jz    rxmsg2        ;yes, keep going
  450. ;
  451.     cpi    lf        ;line feed?
  452.     jz    rxmsg2        ;yes, keep going
  453. ;
  454.     cpi    ff        ;form feed?
  455.     jz    rxmsg2        ;yes, keep going
  456. ;
  457.     cpi    tab        ;horizontal tab?
  458.     jz    rxmsg2        ;yes, keep going
  459. ;
  460.     cpi    bell        ;bell?
  461.     jz    rxmsg2        ;yes, keep going
  462. ;
  463.     cpi    bs        ;back space?
  464.     jz    rxmsg2        ;yes, keep going
  465. ;
  466.     mvi    a,'.'        ;else substitute a period
  467. ;
  468. rxmsg2:
  469.     call    ctype        ;send to console
  470.     call    getbuf        ;get next byte
  471.     jnc    rxmsg1        ;and process it if there
  472.     ret            ;else quit
  473.  
  474.  
  475. ;    clear crt screen
  476. ;    (internally called)
  477. clear:    mvi    a,clscrn
  478.     call    cview
  479.     ret
  480.  
  481.  
  482. ;    process menu command:
  483. ;    print main option menu
  484. menu1:    call    clear        ;clear crt screen
  485. menu2:    call    ilprt
  486.     db    cr,lf,'X.25 main menu:',cr,lf
  487.     db    lf,'normal operation:          '
  488.     db    tab,'diagnostics:',cr,lf
  489.     db    '    1. initialize link        '
  490.     db    tab,tab,'10. display system parameters',cr,lf
  491.     db    '    2. transmit restart packet'
  492.     db    tab,tab,'11. display status flags',cr,lf
  493.     db    '    3. transmit file          '
  494.     db    tab,tab,'12. display L1 and L2 statistics',cr,lf
  495.     db    '    4. abort file transmission'
  496.     db    tab,tab,'13. display L3 statistics',cr,lf
  497.     db    '    5. receive file           '
  498.     db    tab,tab,'14. set flow control ready flags',cr,lf
  499.     db    '    6. abort file reception   '
  500.     db    tab,tab,'15. transmit bad frame',cr,lf
  501.     db    '    7. transmit clear req. packet'
  502.     db    tab,'16. change frame sequence',cr,lf
  503.     db    '    8. query link status      '
  504.     db    tab,tab,'17. start frame logging',cr,lf
  505.     db    '    9. disconnect link        '
  506.     db    tab,tab,'18. stop  frame logging',cr,lf
  507.     db    lf,'miscellaneous:',cr,lf
  508.     db    '   19. change default parameters'
  509.     db    tab,'21. exit to monitor',cr,lf
  510.     db    '   20. change remote DTE address'
  511.     db    tab,'22. exit to CP/M',cr,lf
  512.     db    0
  513. optlp:    call    getopt        ;get option
  514.     rz            ;exit if nothing there
  515. ;
  516.     jc    optlp        ;get another if invalid
  517. ;
  518.     cpi    (optend-optbeg)/2    ;in range?
  519.     jnc    optlp        ;no, get another one
  520. ;
  521.     call    disptch        ;else dispatch on option in a
  522. optbeg:    dw    optlp        ;option 0 address
  523.     dw    conlk        ;option 1
  524.     dw    txstar        ;option 2
  525.     dw    txfile        ;option 3
  526.     dw    txfabo        ;option 4
  527.     dw    rxfile        ;option 5
  528.     dw    crxfil        ;option 6
  529.     dw    txclrr        ;option 7
  530.     dw    qlksta        ;option 8
  531.     dw    disclk        ;option 9
  532.     dw    pparms        ;option 10
  533.     dw    pflags        ;option 11
  534.     dw    pl2stat        ;option 12
  535.     dw    pl3stat        ;option 13
  536.     dw    setlkc        ;option 14
  537.     dw    txbadf        ;option 15
  538.     dw    chgseq        ;option 16
  539.     dw    olgfil        ;option 17
  540.     dw    clgfil        ;option 18
  541.     dw    cparms        ;option 19
  542.     dw    craddr        ;option 20
  543.     dw    pfmexit        ;option 21
  544.     dw    cpmexit        ;option 22
  545. optend:    equ    $
  546.  
  547.  
  548. ;    get selected option
  549. ;    on entry:    no parameters
  550. ;    on exit:    <a>= option #
  551. ;            carry set if invalid (non numeric)
  552.  
  553. getopt:    call    ilprt
  554.     db    lf,'option (cr to exit)= ',0
  555.     call    instr        ;input reply
  556.     call    plf        ;type line feed
  557.     lxi    h,inbuf        ;get # of characters
  558.     inx    h        ;    /
  559.     mov    a,m        ;      /
  560.     ora    a        ;any there?
  561.     rz            ;no, return with no action
  562. ;
  563.     call    decbin        ;convert input to binary
  564.     rc            ;return with carry set if invalid
  565. ;
  566.     mov    a,d        ;is upper byte=0?
  567.     ora    a        ;    /
  568.     stc            ;return with carry set if not
  569.     rnz            ;    /
  570. ;
  571.     mov    a,e        ;get lower byte of number
  572.     ora    a        ;set flags
  573.     ret                
  574.  
  575.  
  576. ;    prompt for console packet data input
  577. prompt:
  578.     lxi    h,l4stat    ;point to level 4 status
  579.     bit    0,m        ;prompt request?
  580.     rz            ;no, return
  581. ;
  582.     res    0,m        ;else reset request flag
  583.     call    ilprt        ;and show prompt
  584.     db    cr,lf,'>>',0
  585.     ret
  586.  
  587.  
  588.  
  589. ;    *************************
  590. ;    *  command options    *
  591. ;    *************************
  592.  
  593.     
  594. ;    exit program to CP/M
  595. cpmexit:
  596.     call    crxfil        ;close receiv file if open
  597.     call    ctxfil        ;close transmit file if open
  598.     call    clgfil        ;close log file if open
  599.     lhld    oldstk        ;get old stack pointer
  600.     sphl            ;restore it
  601.     jmp    wboot        ;and warm boot CP/M
  602.  
  603.  
  604. ;    exit program to Big Board Monitor (PFM)
  605.  
  606. pfmexit:jmp    pfm
  607.  
  608.  
  609. ;    transmit file
  610. txfile:    call    otxfil        ;open tx file
  611.     call    plstat        ;print link status
  612.     ret
  613.  
  614. ;    abort file transmission
  615. txfabo:    lxi    h,fstat        ;point to file status
  616.     bit    1,m        ;tx file open?
  617.     rz            ;no, do nothing
  618. ;
  619.     call    ilprt        ;else tell operator
  620.     db    cr,lf,'L4: file transmission aborted',cr,lf,0
  621.     call    ctxfil        ;close tx file
  622.     ret
  623.  
  624.  
  625. ;    receive file
  626. rxfile:    call    orxfil        ;open rx file
  627.     call    plstat        ;print link status
  628.     ret
  629.  
  630. ;    change frame transmit sequence number
  631. ;    (to force a reject packet & retransmission)
  632. chgseq:    lda    vs        ;get current V(s)
  633.     dcr    a        ;decrement mod 7
  634.     ani    7        ;    /
  635.     sta    vs        ;and update it
  636.     ret
  637.  
  638.  
  639. ;    print system parameters
  640.  
  641. pparms:
  642.     call    clear        ;clear crt screen
  643.     call    ilprt        ;print title
  644.     db    tab,tab,'System Parameters:',cr,lf
  645.     db    cr,lf,lf,tab,'Level 2'
  646.     db    tab,tab,tab,tab,'Level 1'
  647.     db    cr,lf,lf,'mode         =   ',0
  648.     lda    dtemod        ;get DTE/CE mode flag
  649.     cpi    1        ;is it DTE?
  650.     jnz    ppar1        ;no, keep going
  651. ;
  652.     call    ilprt        ;yes, print 'DTE'
  653.     db    'DTE      ',0    ;    /
  654.     jmp    ppar2        ;and keep going
  655. ;
  656. ppar1:    cpi    2        ;is it DCE?
  657.     jnz    ppar1a        ;no, keep going
  658. ;
  659.     call    ilprt        ;yes, print 'DCE'
  660.     db    'DCE      ',0    ;    /
  661.     jmp    ppar2        ;and keep going
  662. ;
  663. ppar1a:    cpi    3        ;is it self test mode?
  664.     jnz    ppar2        ;no, don't know mode
  665. ;
  666.     call    ilprt        ;else print 'self test'
  667.     db    'self test',0    ;    /
  668. ;
  669. ppar2:    call    ilprt        ;print baud rate
  670.     db    tab,tab,'baud rate    = ',0
  671.     lda    baudop        ;get current baud option
  672.     lxi    h,150        ;<hl>= 150 baud
  673. dbaud:    dad    h        ;multiply baud rate
  674.     dcr    a        ;by number of option
  675.     jnz    dbaud        ;until finished
  676. ;
  677.     call    pdec        ;and print resulting number
  678. ;
  679.     mvi    h,0        ;clear <h>
  680.     call    ilprt        ;print last N(r)
  681.     db    cr,lf,'last N(r)    = ',0
  682.     lda    lastnr    
  683.     mov    l,a    
  684.     call    pdec    
  685. ;
  686.     call    ilprt        ;print V(r)
  687.     db    cr,lf,'V(r)         = ',0
  688.     lda    vr
  689.     mov    l,a
  690.     call    pdec
  691. ;
  692.     call    ilprt        ;print V(s)
  693.     db    cr,lf,'V(s)         = ',0
  694.     lda    vs
  695.     mov    l,a
  696.     call    pdec
  697. ;
  698.     call    ilprt        ;print last V(s) sent
  699.     db    cr,lf,'last V(s)    = ',0
  700.     lda    lastvs
  701.     mov    l,a
  702.     call    pdec
  703. ;
  704.     call    ilprt        ;print max V(s) sent
  705.     db    cr,lf,'max  V(s)    = ',0
  706.     lda    maxvs
  707.     mov    l,a
  708.     call    pdec
  709. ;
  710.     call    ilprt        ;print P(r)
  711.     db    cr,lf,lf,tab,tab,tab,'Level 3',lf
  712.     db    cr,lf,'mode         =   ',0
  713.     lda    pvcmod        ;get PVC/VC mode flag
  714.     cpi    1        ;is it VC?
  715.     jnz    ppar3        ;no, keep going
  716. ;
  717.     call    ilprt        ;else print 'VC'
  718.     db    ' VC',0
  719.     jmp    ppar4        ;and keep going
  720. ;
  721. ppar3:    cpi    2        ;is it PVC?
  722.     jnz    ppar4        ;no, keep going
  723. ;
  724.     call    ilprt        ;else print 'PVC'
  725.     db    'PVC',0
  726. ;
  727. ppar4:
  728.     call    ilprt
  729.     db    tab,tab,'local DTE address length = ',0
  730.     lda    laddrl
  731.     mov    l,a    
  732.     call    pdec
  733. ;
  734.     call    ilprt
  735.     db    cr,lf,'P(r)         = ',0
  736.     lda    pr
  737.     mov    l,a
  738.     call    pdec
  739. ;
  740.     call    ilprt
  741.     db    tab,tab,'local DTE address (hex)  = ',0
  742.     lda    laddrl            ;get local address length
  743.     inr    a            ;increment by one
  744.     mov    b,a            ;and save in <b>
  745.     lxi    h,laddr            ;point to address
  746. ppar5:    dcr    b            ;end of address?
  747.     jz    ppar6            ;yes, exit loop
  748. ;
  749.     mov    a,m            ;else get char
  750.     call    phex1            ;display it in hex
  751.     inx    h            ;bump pointer
  752.     jmp    ppar5            ;and get next char
  753. ;
  754. ppar6:    call    ilprt        ;print P(s)
  755.     db    cr,lf,'P(s)         = ',0
  756.     lda    ps
  757.     mvi    h,0
  758.     mov    l,a
  759.     call    pdec
  760. ;
  761.     call    ilprt
  762.     db    tab,tab,'remote DTE address length= ',0
  763.     lda    raddrl
  764.     mov    l,a    
  765.     mvi    h,0
  766.     call    pdec
  767. ;
  768.     call    ilprt        ;print last tx P(s)
  769.     db    cr,lf,'last tx P(s) = ',0
  770.     lda    ltxps
  771.     mov    l,a
  772.     call    pdec
  773. ;
  774.     call    ilprt
  775.     db    tab,tab,'remote DTE address (hex) = ',0
  776.     lda    raddrl            ;get remote address length
  777.     inr    a            ;increment by one
  778.     mov    b,a            ;and save in <b>
  779.     lxi    h,raddr            ;point to address
  780. ppar7:    dcr    b            ;end of address?
  781.     jz    ppar8            ;yes, exit loop
  782. ;
  783.     mov    a,m            ;else get char
  784.     call    phex1            ;display it in hex
  785.     inx    h            ;bump pointer
  786.     jmp    ppar7            ;and get next char
  787. ;
  788. ppar8:    call    ilprt        ;print last rx P(r)
  789.     db    cr,lf,'last rx P(r) = ',0
  790.     lda    lastpr
  791.     mov    l,a
  792.     mvi    h,0
  793.     call    pdec
  794. ;
  795.     call    ilprt
  796.     db    tab,tab,'logical group number     = ',0
  797.     lda    group
  798.     mov    l,a
  799.     mvi    h,0
  800.     call    pdec
  801. ;
  802.     call    ilprt        ;print last rx P(s)
  803.     db    cr,lf,'last rx P(s) = ',0
  804.     lda    lrxps
  805.     mov    l,a
  806.     mvi    h,0
  807.     call    pdec
  808. ;
  809.     call    ilprt
  810.     db    tab,tab,'logical channel number   = ',0
  811.     lda    chan
  812.     mov    l,a
  813.     mvi    h,0
  814.     call    pdec
  815. ;
  816.     call    ilprt
  817.     db    cr,lf,lf,0
  818.     ret
  819.  
  820.  
  821.  
  822.  
  823. ;    change system defaults
  824. cparms:    
  825.     call    setbaud        ;select & set baud rate
  826.     call    setl2m        ;select level 2 mode
  827.     call    initl2        ;and re-initialize level 2
  828.     call    setl3m        ;select level 3 mode
  829.     call    setaddr        ;select level 3 addresses
  830.     call    initl3        ;and re-initialize level 3
  831.     call    wparms        ;write parameters on file
  832.     call    ilprt
  833.     db    cr,lf,lf,0
  834.     ret
  835.     
  836.  
  837. ;    select & set baud rate
  838. ;    on entry:    no parameters
  839. ;    on exit:    all regs, flags clobbered
  840.  
  841. setbaud:
  842.     call    ilprt
  843.     db    cr,lf,lf
  844.     db    'baud rates:',cr,lf,lf
  845.     db    '1.   300 baud',cr,lf
  846.     db    '2.   600 baud',cr,lf
  847.     db    '3.  1200 baud',cr,lf
  848.     db    '4.  2400 baud',cr,lf
  849.     db    '5.  4800 baud',cr,lf
  850.     db    '6.  9600 baud',cr,lf
  851.     db    '7. 19200 baud',cr,lf,0
  852. bdlp:    call    getopt            ;get option
  853.     rz                ;return if cr typed
  854. ;
  855.     jc    bdlp            ;if invalid try again
  856.     cpi    8            ;out of range?
  857.     jnc    bdlp            ;yes, get another one
  858. ;
  859.     call    sbaud            ;set baud rate
  860.     ret
  861.  
  862.  
  863.  
  864. ;    set level 2 DTE/DCE mode
  865. ;    on entry:    no parameters
  866. ;    on exit:    all regs, flags clobbered
  867.  
  868. setl2m:
  869.     call    ilprt
  870.     db    cr,lf,lf
  871.     db    'level 2 mode:',cr,lf,lf
  872.     db    '1. DTE (normal mode)',cr,lf
  873.     db    '2. DCE (test mode)',cr,lf
  874.     db    '3. self-test mode (with loopback connector)',cr,lf,0
  875. modlp:    call    getopt            ;get option
  876.     rz                ;return if cr typed
  877. ;
  878.     jc    modlp            ;if invalid get another
  879. ;
  880.     cpi    4            ;out of range
  881.     jnc    modlp            ;yes, get another
  882. ;
  883.     sta    dtemod            ;else update mode flag
  884.     ret
  885.  
  886.  
  887. ;    set level 3 VC/PVC mode
  888. ;    on entry:    no parameters
  889. ;    on exit:    all regs, flags clobbered
  890.  
  891. setl3m:
  892.     call    ilprt
  893.     db    cr,lf,lf
  894.     db    'level 3 mode:',cr,lf,lf
  895.     db    '1. Virtual Call circuit (VC)',cr,lf
  896.     db    '2. Permanent Virtual Circuit (PVC)',cr,lf,0
  897. modlp3:    call    getopt            ;get option
  898.     rz                ;return if cr typed
  899. ;
  900.     jc    modlp3            ;if invalid get another
  901. ;
  902.     cpi    3            ;out of range
  903.     jnc    modlp3            ;yes, get another
  904. ;
  905.     sta    pvcmod            ;update mode flag
  906.     ret
  907.  
  908.  
  909. ;    set level 3 dte addresses
  910. ;    on entry:    no parameters
  911. ;    on exit:    all regs, flags clobbered
  912.  
  913. setaddr:
  914. ;    clear local DTE address
  915.     mvi    b,15        ;max address size (hex digits)
  916.     lxi    h,laddr        ;point to address
  917.     xra    a        ;clear <a>
  918.     sta    laddrl        ;and address length
  919. seta1:    mov    m,a        ;clear digit
  920.     inx    h        ;bump pointer
  921.     dcr    b        ;last digit?
  922.     jnz    seta1        ;no, keep going
  923.  
  924. ;    get local DTE address
  925.     call    ilprt
  926.     db    cr,lf,'local DTE address '
  927.     db    '(0-15 hex digits) = ',0
  928.     call    instr        ;input reply
  929.     call    plf        ;print line feed
  930.     lxi    h,inbuf        ;get # of hex digits
  931.     inx    h        ;    /
  932.     mov    a,m        ;      /
  933.     ora    a        ;any there?
  934.     jz    craddr        ;no, next parameter
  935. ;
  936.     cpi    16        ;>15 digits?
  937.     jnc    setaddr        ;yes, invalid
  938. ;
  939.     sta    laddrl        ;else save address length
  940.     mov    b,a        ;and save it in <b>
  941.     inx    h        ;increment input buffer pointer
  942.     lxi    d,laddr        ;point <de> to address buffer
  943. seta2:    mov    a,m        ;get a char from input buffer
  944.     call    hexbin        ;convert to binary
  945.     jc    setaddr        ;restart if conversion error
  946. ;
  947.     stax    d        ;else save in buffer
  948.     inx    h        ;bump pointers
  949.     inx    d        ;    /
  950.     dcr    b        ;last char?
  951.     jnz    seta2        ;no, get another
  952. ;    else drop through to:
  953.  
  954.  
  955. ;    set level 3 remote DTE address
  956. ;    (internally called)
  957. ;    on entry:    no parameters
  958. ;    on exit:    all regs, flags clobbered
  959. craddr:
  960. ;    clear remote DTE address
  961.     mvi    b,15        ;max address size (hex digits)
  962.     lxi    h,raddr        ;point to address
  963.     xra    a        ;clear <a>
  964.     sta    raddrl        ;and address length
  965. seta4:    mov    m,a        ;clear digit
  966.     inx    h        ;bump pointer
  967.     dcr    b        ;last digit?
  968.     jnz    seta4        ;no, keep going
  969.  
  970. ;    get remote DTE address
  971.     call    ilprt
  972.     db    cr,lf,'remote DTE address '
  973.     db    '(0-15 hex digits) = ',0
  974.     call    instr        ;input reply
  975.     call    plf        ;print line feed
  976.     lxi    h,inbuf        ;get # of hex digits
  977.     inx    h        ;    /
  978.     mov    a,m        ;      /
  979.     ora    a        ;any there?
  980.     rz            ;no, return
  981. ;
  982.     cpi    16        ;>15 digits?
  983.     jnc    craddr        ;yes, invalid
  984. ;
  985.     sta    raddrl        ;else save address length
  986.     mov    b,a        ;and save it in <b>
  987.     inx    h        ;increment input buffer pointer
  988.     lxi    d,raddr        ;point <de> to address buffer
  989. seta5:    mov    a,m        ;get a char from input buffer
  990.     call    hexbin        ;convert to binary
  991.     jc    craddr        ;restart if conversion error
  992. ;
  993.     stax    d        ;else save in buffer
  994.     inx    h        ;bump pointers
  995.     inx    d        ;    /
  996.     dcr    b        ;last char?
  997.     jnz    seta5        ;no, get another
  998.     ret            ;else exit
  999.  
  1000.  
  1001.  
  1002. ;    get number input
  1003. ;    on entry:    no parameters
  1004. ;    on exit:    carry set if error
  1005. ;            <de>=number in binary (0-35756)
  1006.  
  1007. getnum:
  1008.     call    instr        ;input reply
  1009.     call    plf        ;print line feed
  1010.     lxi    h,inbuf        ;get # of characters
  1011.     inx    h        ;    /
  1012.     mov    a,m        ;      /
  1013.     ora    a        ;any there?
  1014.     stc            ;no, set carry
  1015.     rz            ;and return
  1016. ;
  1017.     call    decbin        ;else convert input to binary
  1018.     ret            ;return with carry if invalid
  1019.  
  1020.  
  1021.  
  1022. ;    display status flags
  1023.  
  1024. pflags:
  1025.     call    clear            ;clear crt screen
  1026.     call    ilprt
  1027.     db    lf
  1028.     db    tab,tab,tab,'System Status Flags',cr,lf,lf
  1029.     db    tab,'Level 1',tab,tab,tab,tab,'Level 2'
  1030.     db    cr,lf,'          bit # 76543210'
  1031.       db    tab,'            bit # 76543210'
  1032.     db    cr,lf,'     rx status: ',0
  1033.     lda    rxstat
  1034.     call    pbin
  1035.     call    ilprt
  1036.     db    tab,'     link status: ',0
  1037.     lda    lkstat    
  1038.     call    pbin
  1039.     call    ilprt
  1040.     db    cr,lf,'     tx status: ',0
  1041.     lda    txstat
  1042.     call    pbin
  1043.     call    ilprt
  1044.     db    tab,'         P/F bit: ',0
  1045.     lda    pfbit
  1046.     call    pbin
  1047.     call    ilprt
  1048.     db    cr,lf,'  Timer status: ',0
  1049.     lda    tistat
  1050.     call    pbin
  1051.     call    ilprt
  1052.     db    tab,'     flow status: ',0
  1053.     lda    l2stat
  1054.     call    pbin
  1055.     call    ilprt
  1056.     db    cr,lf,lf
  1057.     db    tab,'Level 3',tab,tab,tab,tab,'Disk Files'
  1058.     db    cr,lf,'          bit # 76543210'
  1059.     db    tab,'            bit # 76543210'
  1060.     db    cr,lf,'channel status: ',0
  1061.     lda    chstat
  1062.     call    pbin
  1063.     call    ilprt
  1064.     db    tab,'disk file status: ',0
  1065.     lda    fstat    
  1066.     call    pbin
  1067.     call    ilprt
  1068.     db    cr,lf,'flow status   : ',0
  1069.     lda    l3stat
  1070.     call    pbin
  1071.     call    ilprt
  1072.     db    cr,lf,'         Q bit: ',0
  1073.     lda    qbit
  1074.     call    pbin
  1075.     call    ilprt
  1076.     db    tab,tab,'Level 4'
  1077.     db    cr,lf,'         D bit: ',0
  1078.     lda    dbit
  1079.     call    pbin
  1080.     call    ilprt
  1081.     db    tab,'            bit # 76543210',0
  1082.     call    ilprt
  1083.     db    cr,lf,tab,tab,tab
  1084.     db    tab,'     flow status: ',0
  1085.     lda    l4stat
  1086.     call    pbin    
  1087.     call    ilprt
  1088.     db    cr,lf,lf,0
  1089.     ret
  1090.  
  1091.  
  1092. ;    print level 1 and level 2 statistics
  1093. pl2stat:
  1094.     call    clear        ;clear crt screen
  1095.     call    ilprt
  1096.     db    lf
  1097.     db    tab,tab,tab,'    System Statistics:',cr,lf
  1098.     db    tab,'receive',tab,tab,tab,tab,tab,tab,'transmit',cr,lf
  1099.     db    tab,'-------',tab,tab,tab,tab,tab,tab,'--------',cr,lf
  1100.     db    tab,tab,tab,tab,'Level 1',cr,lf
  1101.     db    'good frames        = ',0
  1102.     lhld    rxgfct
  1103.     call    pdec
  1104.     call    ilprt
  1105.     db    tab,tab,' total completed frames= ',0
  1106.     lhld    txefct
  1107.     call    pdec
  1108.     call    ilprt
  1109.     db    cr,lf,'bad  frames        = ',0
  1110.     lhld    rxbfct
  1111.     call    pdec
  1112.     call    ilprt
  1113.     db    tab,tab,tab,'underrun errors= ',0
  1114.     lhld    txuect
  1115.     call    pdec
  1116.     call    ilprt
  1117.     db    cr,lf,'aborts             = ',0
  1118.     lhld    rxabct
  1119.     call    pdec
  1120.     call    ilprt
  1121.     db    tab,tab,tab,'aborts         = ',0
  1122.     lhld    txabct
  1123.     call    pdec
  1124.     call    ilprt
  1125.     db    cr,lf,'crc errors         = ',0
  1126.     lhld    rxcect
  1127.     call    pdec
  1128.     call    ilprt
  1129.     db    cr,lf,'overrun errors     = ',0
  1130.     lhld    rxoect
  1131.     call    pdec
  1132.     call    ilprt
  1133.     db    cr,lf,'chars lost due to buffer unavail= ',0
  1134.     lhld    rxbbct
  1135.     call    pdec
  1136.     call    ilprt
  1137.     db    cr,lf,'chars lost due to buffer overrun= ',0
  1138.     lhld    rxboct
  1139.     call    pdec
  1140.     call    ilprt
  1141.     db    cr,lf,lf,tab,tab,tab,tab,'Level 2'
  1142.     db    cr,lf,'command frames     = ',0
  1143.     lhld    rxcfct
  1144.     call    pdec
  1145.     call    ilprt
  1146.     db    tab,tab,tab,'   total frames= ',0
  1147.     lhld    txfct
  1148.     call    pdec
  1149.     call    ilprt
  1150.     db    cr,lf,'I frames           = ',0
  1151.     lhld    rxifct
  1152.     call    pdec
  1153.     call    ilprt    
  1154.     db    tab,tab,tab,'       I frames= ',0
  1155.     lhld    txifct
  1156.     call    pdec
  1157.     call    ilprt    
  1158.     db    cr,lf,'response frames    = ',0
  1159.     lhld    rxrfct
  1160.     call    pdec
  1161.     call    ilprt
  1162.     db    tab,tab,'I frame retransmissions= ',0
  1163.     lhld    txirct
  1164.     call    pdec
  1165.     call    ilprt
  1166.     db    cr,lf,'bad address frames = ',0
  1167.     lhld    rbafct
  1168.     call    pdec
  1169.     call    ilprt
  1170.     db    cr,lf,'bad command frames = ',0
  1171.     lhld    rxbcct
  1172.     call    pdec
  1173.     call    ilprt
  1174.     db    cr,lf,'bad response frames= ',0
  1175.     lhld    rxbrct
  1176.     call    pdec
  1177.     call    ilprt
  1178.     db    cr,lf,lf,0
  1179.     ret
  1180.  
  1181. ;    print level 3 statistics
  1182. pl3stat:
  1183.     call    clear        ;clear crt screen
  1184.     call    ilprt
  1185.     db    lf
  1186.     db    tab,tab,tab,'    System Statistics:',cr,lf
  1187.     db    tab,'receive',tab,tab,tab,tab,tab,tab,'transmit',cr,lf
  1188.     db    tab,'-------',tab,tab,tab,tab,tab,tab,'--------',cr,lf
  1189.     db    cr,lf,tab,tab,tab,tab,'Level 3',cr,lf
  1190.     db    cr,lf,'total packets           = ',0
  1191.     lhld    rxpct
  1192.     call    pdec
  1193.     call    ilprt
  1194.     db    tab,tab,'total packets                = ',0
  1195.     lhld    txpct
  1196.     call    pdec
  1197.     call    ilprt
  1198.     db    cr,lf,'data packets            = ',0
  1199.     lhld    rxdpct
  1200.     call    pdec
  1201.     call    ilprt    
  1202.     db    tab,tab,'file data packets            = ',0
  1203.     lhld    txfpct
  1204.     call    pdec
  1205.     call    ilprt    
  1206.     db    cr,lf,'bad format packets      = ',0
  1207.     lhld    rbfpct
  1208.     call    pdec
  1209.     call    ilprt
  1210.     db    tab,tab,'console data packets         = ',0
  1211.     lhld    txcpct
  1212.     call    pdec
  1213.     call    ilprt
  1214.     db    cr,lf,'bad channel packets     = ',0
  1215.     lhld    rbcpct
  1216.     call    pdec
  1217.     call    ilprt
  1218.     db    tab,tab,'errors due to no free buffer = ',0
  1219.     lhld    ntxbct
  1220.     call    pdec
  1221.     call    ilprt
  1222.     db    cr,lf,'bad address packets     = ',0
  1223.     lhld    rbapct
  1224.     call    pdec
  1225.     call    ilprt
  1226.     db    cr,lf,'bad identifier packets  = ',0
  1227.     lhld    rbipct
  1228.     call    pdec
  1229.     call    ilprt
  1230.     db    cr,lf,'bad group # packets     = ',0
  1231.     lhld    rbgpct
  1232.     call    pdec
  1233.     call    ilprt
  1234.     db    cr,lf,'total discarded packets = ',0
  1235.     lhld    rxxpct
  1236.     call    pdec
  1237.     call    ilprt
  1238.     db    cr,lf,lf
  1239.     db    tab,tab,tab,tab,'Buffers',cr,lf
  1240.     db    cr,lf,'free rx buffers         = ',0
  1241.     lxi    h,rxfree
  1242.     call    getbct
  1243.     xchg
  1244.     call    pdec
  1245.     call    ilprt
  1246.     db    cr,lf,'buffers with frames     = ',0
  1247.     lxi    h,rxflst
  1248.     call    getbct
  1249.     xchg
  1250.     call    pdec
  1251.     call    ilprt
  1252.     db    cr,lf,'buffers with packets    = ',0
  1253.     lxi    h,rxplst
  1254.     call    getbct
  1255.     xchg
  1256.     call    pdec
  1257.     call    ilprt
  1258.     db    cr,lf,lf,0
  1259.     ret
  1260.  
  1261. ;    set link connect and flow control ready flags (for debug)
  1262. ;    (internally called)
  1263. ;    on entry:    no parameters
  1264. ;    on exit:    all flags, regs unchanged
  1265. setlkc:    push    psw            ;save flags
  1266.     push    h            ;save <hl>
  1267.     call    t1off            ;turn off T1 timer
  1268.     lxi    h,lkstat        ;point to link status flags
  1269.     mvi    m,0            ;clear all flags
  1270.     setb    2,m            ;and set link connected flag
  1271.     lxi    h,chstat        ;point to chanel status flags
  1272.     mvi    m,0            ;clear all flags
  1273.     setb    0,m            ;and set flow control ready state
  1274.     call    plstat            ;tell operator
  1275.     pop    h            ;restore <hl>
  1276.     pop    psw            ;restore flags
  1277.     ret
  1278.  
  1279.  
  1280. ;    print link status
  1281. ;    (internally called)
  1282. ;    on entry:    no parmameters
  1283. ;    on exit:    <a>,flags clobbered
  1284. ;            all other regs unchanged
  1285. plstat:    push    h        ;save <hl>
  1286.     lxi    h,lkstat    ;point to link status
  1287.     bit    0,m        ;link connect in process?
  1288.     jnz    plsta2        ;yes, exit
  1289. ;
  1290.     bit    2,m        ;link connected?
  1291.     jz    plsta1        ;no, keep going
  1292. ;
  1293.     call    ilprt        ;else display status
  1294.     db    'L2: link connected',cr,lf,0
  1295.     jmp    plsta2        ;and exit
  1296. ;
  1297. plsta1:    call    ilprt
  1298.     db    'L2: waiting for link connect from DCE',cr,lf,0
  1299. plsta2:    pop    h        ;restore <hl>
  1300.     ret            ;and exit
  1301.  
  1302.  
  1303.  
  1304. ;    *****************
  1305. ;    *  data area    *
  1306. ;    *****************
  1307.  
  1308.  
  1309.     dseg        ;data segment
  1310.  
  1311. l4stat:    db    0    ;level 4 status flags
  1312. oldstk:    ds    2    ;old stack pointer
  1313.     ds    200h    ;really big local stack area
  1314. stack:    equ    $
  1315.  
  1316.  
  1317.  
  1318.