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 / PLOG.ASM < prev    next >
Assembly Source File  |  1986-07-28  |  9KB  |  416 lines

  1. title 'PLOG.ASM'
  2. ;************************************************
  3. ;*                        *
  4. ;*        PLOG.ASM            *
  5. ;*                        *
  6. ;*  program to print session history log       *
  7. ;*  from X.25 protocol interface program         *
  8. ;*                        *
  9. ;*  rev 0.5    07/18/83    E. Elizondo    *
  10. ;*                        *
  11. ;*  (c) 1984 E. Elizondo - all rights reserved. *
  12. ;*                        *
  13. ;*    This program may be used freely for non-  *
  14. ;*  commercial applications. It may not be sold *
  15. ;*  or used for commercial applications without *
  16. ;*  written permission of the author.           *
  17. ;*                         *
  18. ;************************************************
  19. ;    
  20.     maclib    seqio        ;DR sequential I/O library
  21.     maclib    Z80        ;DR Z80 library
  22.  
  23. ;    local parameters
  24. bsize:    equ    16        ;block size in log file
  25.  
  26.  
  27. ;    X.25 standard parameters:
  28.  
  29. ;    frame addresses (X.25 para 2.4.1)
  30. ;    bit #   8765$4321
  31. addra    equ    0000$0011b    ;address A
  32. addrb    equ    0000$0001b    ;address B
  33.  
  34. ;    frame control (id) bytes (table 3/X.25)
  35. ;    bit #   8765$4321
  36. ifid    equ    0000$0000b    ;I
  37. rrfid    equ    0000$0001b    ;RR
  38. rnrfid    equ    0000$0101b    ;RNR
  39. rejfid    equ    0000$1001b    ;REJ
  40. sarmfid    equ    0000$1111b    ;SARM (not used in LAPB)
  41. dmfid    equ    0000$1111b    ;DM
  42. sabmfid    equ    0010$1111b    ;SABM
  43. discfid    equ    0100$0011b    ;DISC
  44. uafid    equ    0110$0011b    ;UA
  45. cmdrfid    equ    1000$0111b    ;CMDR
  46. frmrfid    equ    1000$0111b    ;FRMR
  47. badfid    equ    1111$1111b    ;bad frame for testing
  48.  
  49. ;    misc constants
  50. cr    equ    0dh        ;carriage ret
  51. lf    equ    0ah        ;line feed
  52. ff    equ    0ch        ;form feed
  53. tab    equ    09h        ;horizontal tab
  54.  
  55. ;    CP/M equates
  56. conotf    equ    2        ;console output function
  57. bdos    equ    0005h        ;BDOs entry point
  58. wboot    equ    0000h        ;warm boot address
  59.  
  60.     cseg            ;code section
  61.  
  62.     lxi    sp,stack    ;set up local stack
  63.  
  64.  
  65. ;    open file for access
  66.     file    infile,logfil,,X25,LOG,1024,logbuf
  67. ;
  68.     call    ilprt
  69.     db    ff,tab,tab,tab,'X.25 session log',cr,lf
  70.     db    cr,lf,'tx/rx',tab,'addr',tab,'p/f',tab,'frame'
  71.     db    tab,'N(r)',tab,'N(s)',0
  72.  
  73. mloop:    mvi    c,bsize        ;<c>=# bytes in block
  74.     call    ilprt
  75.     db    cr,lf,0
  76. ;
  77. bloop:    call    getdat        ;read first byte
  78.     cpi    1ah        ;end of file?
  79.     jz    exit        ;yes, exit
  80.     dcr    c        ;decrement byte count
  81.     mvi    h,0        ;move contents to <hl>
  82.     mov    l,a        ;    /
  83.     call    pdec        ;print it
  84.     call    ilprt        ;tab to next column
  85.     db    tab,0        ;    /  
  86.     call    getdat        ;read address byte
  87.     dcr    c        ;decrement byte count
  88.     cpi    addra        ;address A?
  89.     jnz    addr1        ;no, keep going
  90.     call    ilprt        ;else print it
  91.     db    '  A',0        ;    /
  92.     jmp    ctrl1        ;and go for next byte
  93. addr1:    cpi    addrb        ;address B?
  94.     jnz    addr2        ;no, keep going
  95.     call    ilprt        ;else print it
  96.     db    '  B',0    ;    /
  97.     jmp    ctrl1        ;and go for next byte
  98. addr2:    mov    l,a        ;else print address in decimal
  99.     mvi    h,0        ;    /
  100.     call    pdec        ;    /
  101.     call    ilprt        ;and a '?'
  102.     db    '?',0        ;    /
  103. ;
  104. ctrl1:    call    getdat        ;get next byte
  105.     mov    b,a        ;save byte in <b>
  106.     dcr    c        ;decrement byte count
  107.     ani    0001$0000b    ;extract P/F bit
  108.     rrc            ;move to bit 0
  109.     rrc            ;    /
  110.     rrc            ;      /
  111.     rrc            ;     /
  112.     mov    l,a        ;print it
  113.     mvi    h,0        ;    /
  114.     call    pdec        ;      /
  115.     call    ilprt        ;and tab over
  116.     db    tab,0        ;    /
  117.     mov    a,b        ;get back control byte
  118.     bit    0,a        ;I frame?
  119.     jz    fi        ;yes, process it
  120. ;
  121.     ani    1110$1111b    ;extract all bits except p/f
  122.     cpi    sabmfid        ;SABM frame?
  123.     jz    fsabm        ;yes, process it
  124. ;
  125.     cpi    discfid        ;DISC frame?
  126.     jz    fdisc        ;yes, process it
  127. ;
  128.     cpi    dmfid        ;DM frame?
  129.     jz    fdm        ;yes, process it
  130. ;
  131.     cpi    uafid        ;UA frame?
  132.     jz    fua        ;yes, process it
  133. ;
  134.     cpi    cmdrfid        ;CMDR/FRMR frame?
  135.     jz    fcmdr        ;yes, process it
  136.  
  137. ;    branch to numbered frames
  138.     ani    0000$1111b    ;discard N(r) sequence bits
  139.     cpi    rrfid        ;RR frame?
  140.     jz    frr        ;yes, process it
  141. ;
  142.     cpi    rnrfid        ;RNR frame?
  143.     jz    frnr        ;yes, process it
  144. ;
  145.     cpi    rejfid        ;REJ frame?
  146.     jz    frej        ;yes, process it
  147. ;
  148.     mov    l,b        ;else id is unrecognized
  149.     call    pbin        ;so print it
  150.     call    ilprt        ;followed by a '?'
  151.     db    '?',0
  152. ;
  153. zloop:    call    getdat        ;read rest of block
  154.     jz    exit        ;exit if end of file
  155.     dcr    c        ;until end 
  156.     jnz    zloop        ;    /
  157.     jmp    mloop        ;and then go for another block
  158. ;
  159. exit:    call    ilprt        ;end of page
  160.     db    cr,ff,0
  161.     finis    logfil        ;close file
  162.     jmp    wboot        ;and exit
  163. ;
  164. ;
  165. ;    process SABM frame
  166. ;
  167. fsabm:    call    ilprt
  168.     db    'SABM',0
  169.     jmp    zloop
  170. ;
  171. fdisc:    call    ilprt
  172.     db    'DISC',0
  173.     jmp    zloop
  174. ;
  175. fua:    call    ilprt
  176.     db    'UA',0
  177.     jmp    zloop
  178. ;
  179. fi:    call    ilprt
  180.     db    'INFO',0
  181.     call    prtnr    
  182.     call    ilprt        ;tab to next column
  183.     db    tab,0
  184.     mov    a,b        ;get back control byte
  185.     ani    0000$1110b    ;extract N(s)
  186.     rrc            ;move down to bits 0-2
  187.     mov    l,a        ;print it
  188.     mvi    h,0        ;    /
  189.     call    pdec        ;      /
  190.     jmp    zloop
  191. ;
  192. frr:    call    ilprt
  193.     db    'RR',0
  194.     call    prtnr
  195.     jmp    zloop
  196. ;
  197. frnr:    call    ilprt
  198.     db    'RNR',0
  199.     call    prtnr
  200.     jmp    zloop
  201. ;
  202. frej:    call    ilprt
  203.     db    'REJ',0
  204.     call    prtnr
  205.     jmp    zloop
  206. ;
  207. fdm:    call    ilprt
  208.     db    'DM',0
  209.     jmp    zloop
  210. ;
  211. fcmdr:    call    ilprt
  212.     db    'CMDR',0
  213.     jmp    zloop
  214. ;
  215. prtnr:    call    ilprt        ;tab to next column
  216.     db    tab,0
  217.     mov    a,b        ;get control byte
  218.     ani    1110$0000b    ;extract N(r)
  219.     rrc            ;move to bits 0-2
  220.     rrc            ;    /
  221.     rrc            ;      /
  222.     rrc            ;     /
  223.     rrc            ;    /
  224.     mov    l,a        ;print it
  225.     mvi    h,0        ;    /
  226.     call    pdec        ;      /
  227.     ret
  228.  
  229.  
  230. ;    get a byte of data from log disk file
  231. ;    on entry:    no parameters
  232. ;    on exit:    <a>=character, if available
  233. ;            zero flag set if end of file
  234. ;            all other regs unchanged
  235. getdat:    push    h        ;save regs
  236.     push    d        ;    /
  237.     push    b        ;      /
  238.     get    logfil        ;read byte
  239.     pop    b        ;restore regs
  240.     pop    d        ;    /  
  241.     pop    h        ;      /
  242.     ret
  243.  
  244.  
  245. ;    in-line print routine
  246. ;    on entry:    text to be printed follows call
  247. ;            to this routine, and is
  248. ;            terminated by a 0
  249. ;    on exit:    <a>, flags clobbered
  250. ;            all other registers unchanged
  251. ;            routine returns to instruction 
  252. ;            immediately following message
  253. ;
  254.  
  255. ilprt:    xthl
  256. ilplp:    mov    a,m
  257.     ora    a
  258.     jz    ilpret
  259.     call    ctype
  260.     inx    h
  261.     jmp    ilplp
  262. ;
  263. ilpret:    xthl
  264.     ret
  265.  
  266.  
  267. ;    output character in <a> to console buffer
  268. ;    on entry:    <a>= character
  269. ;    on exit:    all flags, regs unchanged
  270. ;
  271. ctype:    push    b
  272.     push    d
  273.     push    h
  274.     mvi    c,conotf
  275.     mov    e,a
  276.     call    bdos
  277.     pop    h
  278.     pop    d
  279.     pop    b
  280.     ret
  281.  
  282.  
  283.  
  284. ;    print binary number in ASCII
  285. ;    on entry:    <hl>=binary number
  286. ;    on exit:    <a>,flags clobbered
  287. ;            all other regs unchanged
  288.  
  289. pdec:    
  290.     push    h        ;save regs
  291.     push    d        ;    /
  292.     push    b        ;      /
  293.     lxi    d,numbuf    ;point to number buffer
  294.     call    bindec        ;convert # to ASCII
  295.     lxi    h,numbuf    ;point to number buffer
  296.     mvi    b,4        ;max # of leading zeros
  297.     mvi    a,'0'        ;blank leading zeros
  298. blnklp:    cmp    m        ;is char a zero?
  299.     jnz    pdec1        ;no, all finished
  300.     mvi    m,' '        ;yes, blank it
  301.     inx    h        ;bump pointer
  302.     dcr    b        ;last leading zero?
  303.     jnz    blnklp        ;no, keep going
  304. pdec1:    call    ilprt        ;print it
  305. numbuf:    db    '00000',0
  306.     pop    b        ;restore regs
  307.     pop    d        ;    /
  308.     pop    h        ;      /
  309.     ret
  310.  
  311.  
  312.  
  313.  
  314. ;    convert binary number 0-65535 to decimal ASCII
  315. ;    (internally called)
  316. ;    on entry:    <hl>=binary number
  317. ;            <de>=address of buffer to put ASCII digits
  318. ;    on exit:    buffer contains ASCII number 
  319. ;            terminated by binary 0
  320. ;            regs, flags clobbered
  321.  
  322. bindec:    lxi    b,-10000    ;digit value
  323.     call    cdigit        ;convert first digit
  324.     lxi    b,-1000        ;convert next digit
  325.     call    cdigit        ;    /
  326.     lxi    b,-100        ;convert next digit
  327.     call    cdigit        ;    /
  328.     lxi    b,-10        ;convert next digit
  329.     call    cdigit        ;    /
  330.     lxi    b,-1        ;convert last digit
  331.     call    cdigit        ;    /
  332.     mvi    a,0        ;put terminator in buffer
  333.     stax    d        ;    /
  334.     ret
  335.     
  336.  
  337. ;    convert a digit
  338. cdigit:    mvi    a,'0'-1        ;initialize ASCII value
  339.     push    d        ;save buffer pointer
  340. cdloop:    mov    e,l        ;save last iteration
  341.     mov    d,h        ;    /
  342.     inr    a        ;increment ASCII digit
  343.     dad    b        ;subtract value
  344.     jc    cdloop        ;repeat till underflow
  345.     mov    l,e        ;get previous iteration
  346.     mov    h,d        ;    /
  347.     pop    d        ;restore buffer pointer
  348.     stax    d        ;store byte in buffer
  349.     inx    d        ;bump pointer
  350.     ret    
  351.  
  352.  
  353.  
  354.  
  355. ;    print byte in binary '1''s and '0''s
  356. ;    (clever routine adapted from TDL)
  357. ;    on entry:    <a>=byte
  358. ;    on exit:    <a>,flags clobbered
  359. ;            all other regs unchanged
  360. pbin:
  361.     push    b        ;save <bc>
  362.     mvi    b,8        ;# of bits to output
  363. pbit:    ral            ;move msb to carry
  364.     push    psw        ;sabe byte
  365.     mvi    a,'0'/2        ;make '0' or '1'
  366.     adc    a        ;    /
  367.     call    ctype        ;output char
  368.     pop    psw        ;restore byte
  369.     dcr    b        ;last bit?
  370.     jnz    pbit        ;no, keep going
  371.     pop    b        ;else restore <bc>
  372.     ret
  373.  
  374.  
  375. ;    convert byte to ASCII hex format
  376. ;    (externally and internally called)
  377. ;    on entry:    <a>=byte
  378. ;            <hl>=address of ASCII output buffer
  379. ;    on exit:    <a>,flags clobbered
  380. ;            <hl>=<hl>+2
  381. ;            all other regs unchanged
  382.  
  383. phex:    push    psw        ;save byte
  384.     rrc            ;move upper nibble down
  385.     rrc            ;    /
  386.     rrc            ;      /
  387.     rrc            ;     /
  388.     call    phex1        ;output it
  389.     pop    psw        ;restore byte
  390. phex1:    ani    0fh        ;strip lower nibble
  391.     adi    90h        ;convert to ASCII character
  392.     daa            ;    /
  393.     aci    40h        ;      /
  394.     daa            ;     /
  395.     mov    m,a        ;output character to buffer
  396.     inx    h        ;and bump pointer
  397.     ret
  398.  
  399.  
  400. ;    ***************
  401. ;    *  data area  *
  402. ;    ***************
  403.  
  404.     dseg
  405.  
  406.     ds    80h        ;local stack area
  407. stack:    equ    $
  408. logbuf    ds    1024        ;file buffer area
  409.  
  410.  
  411.  
  412.  
  413.  
  414.  
  415.  
  416.