home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / sigm / vol165 / readrel.asm < prev    next >
Encoding:
Assembly Source File  |  1984-07-09  |  14.2 KB  |  690 lines

  1.  
  2. ;    ------------------------------------------------------------
  3. ;    .REL files are encoded as a bitstream according to certain
  4. ;    rules which are spelled out in Microsoft's FORTRAN manual.
  5. ;    As a consequence a normal disk dump program will not be very
  6. ;    intelligible, even to people who have learned to recognize
  7. ;    8080 opcodes in hexadecimal form, or to spot ASCII constants
  8. ;    in a program. The purpose of READREL.COM is to generate a
  9. ;    hexadecimal dump of a .REL file, interspersed with special
  10. ;    directives as they are produced by M80.COM, F80.COM or other
  11. ;    relocating assemblers using the same format.
  12. ;
  13. ;             READREL - Copyright (C) 1983
  14. ;            Universidad Autonoma de Puebla
  15. ;                  November 20, 1983
  16. ;
  17. ;    [Harold V. McIntosh, 20 November 1983]
  18. ;    ------------------------------------------------------------
  19.  
  20.  
  21. bdos    equ    0005H
  22. tfcb    equ    005CH
  23. tsiz    equ    0080H        ;CP/M's record size
  24. dsiz    equ    0100H        ;size of .OUT buffer (must be 100H)
  25. rsiz    equ    0400H        ;size of relfile buffer
  26. lsiz:    equ    16        ;line length (maximum spaces per line)
  27.  
  28. LF    equ    0AH
  29. CR    equ    0DH
  30.  
  31. ;    -------------
  32.     org    0100H
  33. ;    -------------
  34.  
  35. begn:    lxi    h,0000
  36.     shld    bctr        ;byte counter
  37.     dad    sp
  38.     shld    stak        ;save sp
  39.     lxi    sp,stak        ;stackend
  40.     lxi    h,dsiz        ;size of OUT buffer
  41.     shld    dctr        ;output downcounter
  42.     lxi    h,dbuf        ;output buffer
  43.     shld    dptr        ;output pointer
  44.     lxi    h,rsiz        ;size of relfile buffer
  45.     shld    rinx        ;relfile index
  46.     mvi    a,lsiz        ;max spaces/line
  47.     sta    lctr        ;count 16 bytes/line
  48.     xra    a
  49.     sta    colm        ;FF=column 1
  50.     lda    tfcb+1
  51.     cpi    ' '
  52.     jnz    nnul
  53.     lxi    d,logo        ;'UAP...'
  54.     call    mssg        ;type text at (DE)
  55.     lxi    d,tuto        ;instructions for usage
  56.     call    mssg        ;type text at (DE)
  57.     jmp    gbye        ;normal exit
  58.  
  59. nnul:    mvi    c,021H        ;count
  60.     lxi    d,tfcb        ;source
  61.     lxi    h,rfcb        ;.REL FCB = destination
  62.     call    miuc        ;block move
  63.  
  64.     lxi    h,rfcb+9    ;.REL ext = destination
  65.     mvi    m,'R'
  66.     inx    h
  67.     mvi    m,'E'
  68.     inx    h
  69.     mvi    m,'L'
  70.     inx    h
  71.     mvi    m,00H
  72.  
  73.     mvi    c,15        ;(0F) open file
  74.     lxi    d,rfcb        ;.REL FCB
  75.     call    bdos
  76.     cpi    0FFH
  77.     lxi    d,coso        ;'can''t open .REL file'
  78.     jz    tema        ;type text at (DE), quit
  79.  
  80.     xra    a
  81.     sta    dout        ;z=no disk output
  82.     lda    tfcb+17        ;output filename
  83.     cpi    ' '
  84.     jz    nout
  85.     sta    dout        ;z=no disk output
  86.  
  87.     mvi    c,16
  88.     lxi    d,tfcb+16
  89.     lxi    h,tfcb        ;CP/M's file control block (.OUT)
  90.     call    miuc
  91.  
  92.     lxi    h,tfcb+9    ;output extension
  93.     mov    a,m
  94.     cpi    ' '
  95.     jnz    yext
  96.     mvi    m,'O'
  97.     inx    h
  98.     mvi    m,'U'
  99.     inx    h
  100.     mvi    m,'T'
  101.  
  102. yext:    mvi    c,3
  103.     lxi    h,tfcb+9
  104.     lxi    d,rfcb+9
  105. yexx:    ldax    d
  106.     cmp    m
  107.     jnz    neql
  108.     inx    h
  109.     inx    d
  110.     dcr    c
  111.     jnz    yexx
  112.     lxi    d,meql        ;'extensions equal'
  113.     jmp    tema        ;type text at (DE), quit
  114.  
  115. neql:    mvi    c,19        ;(13) delete file
  116.     lxi    d,tfcb        ;CP/M's file control block (.OUT)
  117.     call    bdos
  118.  
  119.     mvi    c,22        ;(16) create file
  120.     lxi    d,tfcb        ;CP/M's file control block (.OUT)
  121.     call    bdos
  122.  
  123.     mvi    c,15        ;(0F) open file
  124.     lxi    d,tfcb        ;CP/M's file control block (.OUT)
  125.     call    bdos
  126.     cpi    0FFH
  127.     lxi    d,ddfu        ;'no more directory'
  128.     jz    tema        ;type text at (DE), quit
  129.  
  130. nout:    lxi    h,0FF00H
  131.     shld    roby        ;rotating byte, bit counter
  132.     lxi    d,0000
  133.     call    refi        ;process the .REL file
  134.     lda    dout        ;z=no disk output
  135.     ora    a
  136.     jz    fini
  137.  
  138. ;    Fill the remainder of the output file with ^Z's, write
  139. ;    the tag end to disk, and close the file.
  140.  
  141.     lhld    dctr        ;output downcounter
  142.     xchg
  143.     lhld    dptr        ;output pointer
  144. cloo:    mov    a,e
  145.     ora    d
  146.     jz    clop
  147.     mvi    m,1AH
  148.     dcx    d
  149.     jmp    cloo
  150.  
  151. clop:    lxi    d,dbuf
  152.     ldax    d
  153.     cpi    1AH        ;^Z
  154.     jz    clos
  155.     mvi    c,26        ;(1A) set DMA address
  156.     call    bdos
  157.  
  158.     call    budk        ;record to disk
  159.  
  160.     lxi    d,dbuf+tsiz        ;CP/M's record size
  161.     ldax    d
  162.     cpi    1AH        ;^Z
  163.     jz    clos
  164.     mvi    c,26        ;(1A) set DMA address
  165.     call    bdos
  166.  
  167.     call    budk        ;record to disk
  168.  
  169. clos:    mvi    c,16        ;(10) close file
  170.     lxi    d,tfcb        ;CP/M's file control block (.OUT)
  171.     call    bdos
  172.     cpi    0FFH
  173.     lxi    d,nclo        ;'can''t close file'
  174.     jz    edsk        ;delete .OUT file, type messages
  175.  
  176. fini:    call    crlf        ;CR,LF
  177. gbye:    lhld    stak        ;save sp
  178.     sphl
  179.     ret
  180.  
  181. ;    Type CR, LF.
  182.  
  183. crlf:    mvi    a,CR
  184.     call    cona        ;console from A
  185.     mvi    a,LF
  186.     call    cona        ;console from A
  187.     mvi    a,lsiz        ;max spaces/line
  188.     sta    lctr        ;count 16 bytes/line
  189.     mvi    a,0FFH
  190.     sta    colm        ;FF=column 1
  191.     mvi    c,11        ;(0B) console status
  192.     call    bdos
  193.     ora    a
  194.     rz
  195.     mvi    c,1        ;(01) read console
  196.     call    bdos
  197.     lxi    d,irrp        ;'analysis interrupted'
  198.     call    mssg
  199.     lda    dout        ;z=no disk output
  200.     ora    a
  201.     jz    gbye
  202.     jmp    edsq        ;delete .OUT file, type messages
  203.  
  204. ;    word: type HL as four nibbles.
  205. ;    byte: type A as two nibbles.
  206.  
  207. word:    mov    a,d
  208.     call    byte        ;type A as two nibbles
  209.     mov    a,e
  210. byte:    call    tadr        ;type address if column 1
  211. beit:    push    psw
  212.     rar
  213.     rar
  214.     rar
  215.     rar
  216.     call    nibl        ;type A as hex
  217.     pop    psw
  218. nibl:    ani    0FH
  219.     adi    90H
  220.     daa
  221.     aci    40H
  222.     daa
  223. cona:    push    h
  224.     push    d
  225.     push    psw
  226.     mvi    c,2        ;(02) write console
  227.     mov    e,a
  228.     call    bdos
  229.     pop    b
  230.     lda    dout        ;z=no disk output
  231.     ora    a
  232.     jz    conb
  233.     mov    a,b
  234.     call    ddda
  235. conb:    pop    d
  236.     pop    h
  237.     ret
  238.  
  239. ;    Type several spaces.
  240.  
  241. dubl:    call    sngl        ;type one space
  242. sngl:    push    h
  243.     lxi    h,lctr        ;count 16 bytes/line
  244.     dcr    m
  245.     cz    crlf
  246.     pop    h
  247.     mvi    a,' '
  248.     jmp    cona
  249.  
  250. ;    Type relative address if at start of a new line.
  251.  
  252. tadr:    push    h
  253.     lxi    h,colm        ;FF=column 1
  254.     inr    m
  255.     jnz    tret
  256.     push    psw
  257.     mvi    a,'('
  258.     call    cona
  259.     lhld    bctr
  260.     mov    a,h
  261.     call    beit
  262.     mov    a,l
  263.     call    beit
  264.     mvi    a,')'
  265.     call    cona
  266.     call    sngl
  267.     pop    psw
  268. tret:    pop    h
  269.     ret
  270.  
  271. ;    Type message at (DE).
  272.  
  273. mssg:    xchg
  274. mssh:    mov    a,m
  275.     cpi    '$'
  276.     rz
  277.     call    cona
  278.     inx    h
  279.     jmp    mssh
  280.  
  281. ;    Type message, erase .OUT file, quit.
  282.  
  283. edsk:    call    mssg
  284. edsq:    mvi    c,19        ;(13) delete file
  285.     lxi    d,tfcb        ;CP.M's file control block (.OUT)
  286.     call    bdos        ;don't leave a partial file
  287.     lxi    d,erad        ;'output file erased'
  288. tema:    call    mssg
  289.     jmp    gbye
  290.  
  291. ;    Block move.
  292.  
  293. miuc:    ldax    d
  294.     mov    m,a
  295.     inx    h
  296.     inx    d
  297.     dcr    c
  298.     jnz    miuc        ;block move
  299.     ret
  300.  
  301. ;    Place disk output in buffer, store the buffer in the
  302. ;    disk as it is filled and reinitialize it.
  303.  
  304. ddda:    push    psw
  305.     lhld    dctr        ;output downcounter
  306.     mov    a,l
  307.     ora    h
  308.     cz    budi
  309. dddb:    dcx    h
  310.     shld    dctr        ;output downcounter
  311.     lhld    dptr        ;output pointer
  312.     pop    psw
  313.     mov    m,a
  314.     inx    h
  315.     shld    dptr        ;output pointer
  316.     ret
  317.  
  318. ;    Send dbuf to disk. Must return with dsiz in HL.
  319.  
  320. budi:    call    budj
  321.     lxi    h,dbuf        ;output buffer
  322.     shld    dptr        ;output pointer
  323.     lxi    h,dsiz
  324.     ret
  325.  
  326. budj:    mvi    c,26        ;(1A) set DMA address
  327.     lxi    d,dbuf        ;output buffer
  328.     call    bdos
  329.  
  330.     call    budk        ;record to disk
  331.  
  332.     mvi    c,26        ;(1A) set DMA address
  333.     lxi    d,dbuf+tsiz    ;CP/M's record size
  334.     call    bdos
  335.  
  336. budk:    mvi    c,21        ;(15) write one record
  337.     lxi    d,tfcb        ;CP/M's file control block (.OUT)
  338.     call    bdos
  339.     cpi    00H
  340.     lxi    d,diwr        ;'disk write error'
  341.     jnz    edsk        ;delete .OUT file, type messages
  342.     ret
  343.  
  344. ;    Get next bit.
  345.  
  346. gebi:    push    h
  347.     lxi    h,roby        ;rotating byte, bit counter
  348.     mov    a,m
  349.     inx    h
  350.     inr    m
  351.     jnz    gebj
  352.     call    nxhx
  353.     mvi    m,0F8H
  354. gebj:    add    a
  355.     dcx    h
  356.     mov    m,a
  357.     pop    h
  358.     ret
  359.  
  360. ;    Read a full byte from the .REL file.
  361.  
  362. geby:    mvi    c,08
  363. bits:    mvi    b,00
  364. more:    call    gebi        ;get next bit
  365.     mov    a,b
  366.     ral
  367.     mov    b,a
  368.     dcr    c
  369.     jnz    more
  370.     ret
  371.  
  372. ;    Get next relfile element.
  373.  
  374. nxhx:    push    b
  375.     push    h
  376.     lhld    rinx        ;relfile index
  377.     inx    h
  378.     lxi    d,rsiz        ;size of relfile buffer
  379.     mov    a,l
  380.     sub    e
  381.     mov    a,h
  382.     sbb    d
  383.     jc    nxhv        ;byte available
  384.     lxi    h,0000
  385. nxhy:    shld    rinx        ;relfile index
  386.     lxi    d,rsiz        ;size of relfile buffer
  387.     mov    a,l
  388.     sub    e
  389.     mov    a,h
  390.     sbb    d
  391.     jnc    nxhu        ;reset relfile, read 1st element
  392.     lxi    d,rbuf        ;relfile buffer
  393.     dad    d
  394.     xchg
  395.     mvi    c,26        ;(1A) set DMA address
  396.     call    bdos
  397.     lxi    d,rfcb        ;.REL FCB
  398.     mvi    c,20        ;(14) read one record
  399.     call    bdos
  400.     cpi    000H
  401.     jz    nxhz        ;add record to relfile
  402.     cpi    001H
  403.     lxi    d,dird        ;'disk read error'
  404.     jnz    tema        ;type text at (DE), quit
  405.     lxi    h,rsiz-1
  406.     shld    rinx        ;relfile index
  407. nxhz:    lhld    rinx        ;relfile index
  408.     lxi    d,tsiz        ;CP/M's record size
  409.     dad    d
  410.     jmp    nxhy        ;no more refills
  411.  
  412. nxhu:    lxi    h,0000
  413. nxhv:    shld    rinx        ;relfile index
  414.     lxi    d,rbuf        ;relfile buffer
  415.     dad    d
  416.     mov    a,m
  417.     pop    h
  418.     pop    b
  419.     ret
  420.  
  421. ;    -------------------
  422. ;    Read the .REL file.
  423. ;    -------------------
  424.  
  425.  
  426. ;    The first bit read determines whether a single byte
  427. ;    follows (bit = 0), to be used without alteration, or
  428. ;    whether the following information may be relocatable
  429. ;    (bit = 1).
  430.  
  431. refi:    call    gebi        ;get next bit
  432.     jc    rela        ;not absolute byte
  433.     call    geby        ;full byte from .REL
  434.     call    byte        ;type A as two nibbles
  435.     call    sngl        ;type one space
  436.     lhld    bctr        ;byte counter
  437.     inx    h
  438.     shld    bctr        ;byte counter
  439.     jmp    refi        ;.REL read loop
  440.  
  441. ;    When the leadin bit is 1, two more bits are read to
  442. ;    distinguish four alternatives: 00 for further analysis,
  443. ;    01 for program segment, 10 for data segment, or 11 for
  444. ;    common segment. In the latter three cases, a two-byte
  445. ;    address will be read, which a loader would assign to its
  446. ;    proper memory segment.
  447.  
  448. rela:    mvi    c,2
  449.     call    bits        ;get C bits from .REL
  450.     ora    a
  451.     jz    spec        ;'special LINK element'
  452.     call    tadr        ;type address if column 1
  453.     call    gtyq        ;fetch segment descriptor
  454.     call    mssg        ;type text at (DE)
  455.     call    geby        ;full byte from .REL
  456.     push    psw
  457.     call    geby        ;full byte from .REL
  458.     pop    d
  459.     mov    e,d
  460.     mov    d,a
  461.     call    word        ;type HL as four nibbles
  462.     call    crlf        ;CR, LF
  463.     lhld    bctr        ;byte counter
  464.     inx    h
  465.     inx    h
  466.     shld    bctr        ;byte counter
  467.     jmp    refi        ;.REL read loop
  468.  
  469. ;    There are sixteen 'special LINK elements' ranging from
  470. ;    entry point definitions to the EOF indicator. They fall
  471. ;    into three or four general groups, depending on whether
  472. ;    they are associated with an eight-byte ASCII label, a
  473. ;    relocatable address, both, or neither. Since they represent
  474. ;    parenthetic information, they are set off on a line by
  475. ;    themselves.
  476.  
  477. spec:    lda    lctr        ;count 16 bytes/line
  478.     cpi    lsiz        ;max spaces/line
  479.     cnz    crlf        ;CR,LF
  480.     xra    a
  481.     sta    colm        ;FF=column 1
  482.     mvi    c,4
  483.     call    bits        ;get C bits from .REL
  484.     add    a        ;case number indexes two tables
  485.     mov    c,a
  486.     mvi    b,0
  487.     lxi    h,meta        ;case table for messages
  488.     dad    b
  489.     mov    e,m
  490.     inx    h
  491.     mov    d,m
  492.     lxi    h,juta        ;case table for interpretations
  493.     dad    b
  494.     mov    a,m
  495.     inx    h
  496.     mov    h,m
  497.     mov    l,a
  498.     push    h        ;action address after typing mssg
  499.     jmp    mssg        ;type text at (DE)
  500.  
  501. ;    Message table, to correspond to the 'special' relocation
  502. ;    elements, of which there are sixteen. These are the
  503. ;    descriptive messages inserted into the output stream.
  504.  
  505. meta:    dw    me0        ;'entry symbol'
  506.     dw    me1        ;'COMMON block'
  507.     dw    me2        ;'program name'
  508.     dw    me3        ;'request library search'
  509.     dw    me4        ; reserved
  510.     dw    me5        ;'COMMON size'
  511.     dw    me6        ;'chain external'
  512.     dw    me7        ;'define entry'
  513.     dw    me8        ; reserved
  514.     dw    me9        ;'external add offset'
  515.     dw    mea        ;'size of DATA area'
  516.     dw    meb        ;'loading location counter'
  517.     dw    mec        ;'chain address'
  518.     dw    med        ;'define program size'
  519.     dw    mee        ;'end of program'
  520.     dw    mef        ;'end of file'
  521.  
  522. ;    There may be a label or a further address associated
  523. ;    with each 'special LINK item.' These subroutines take
  524. ;    the appropriate action in each case.
  525.  
  526. juta:    dw    text        ;ASCII label
  527.     dw    text        ;ASCII label
  528.     dw    text        ;ASCII label
  529.     dw    text        ;ASCII label
  530.     dw    text        ;ASCII label
  531.     dw    styp        ;storage type
  532.     dw    styp        ;storage type
  533.     dw    styp        ;storage type
  534.     dw    styp        ;storage type
  535.     dw    phue        ;storage type w/ address
  536.     dw    phue        ;storage type w/ address
  537.     dw    phue        ;storage type w/ address
  538.     dw    phue        ;storage type w/ address
  539.     dw    phue        ;storage type w/ address
  540.     dw    phoo        ;program end - flush byte
  541.     dw    eofi        ;EOF
  542.  
  543. ;    The 'special LINK item' includes an 8-byte label
  544. ;    or similar ASCII string. 8 bytes is maximum, there
  545. ;    must be at least 1, 8 is taken for 0.
  546.  
  547. text:    mvi    c,3
  548.     call    bits        ;get C bits from .REL
  549.     ora    a        ;take 0 to mean 8
  550.     jnz    x2x
  551.     mvi    a,8
  552. x2x:    push    psw
  553.     call    geby        ;full byte from .REL
  554.     call    cona
  555.     pop    psw
  556.     dcr    a
  557.     jnz    x2x
  558.     call    crlf        ;CR,LF
  559.     jmp    refi        ;.REL read loop
  560.  
  561. ;    The 'special LINK item' requires identification via
  562. ;    the following two bits, as to whether it is absolute
  563. ;    (00), code (01), data (10), or common (11).
  564.  
  565. styp:    call    gtyp        ;ascertain storage type
  566.     call    mssg        ;type text at (DE)
  567.     call    twrd        ;read & type word from .REL
  568.     call    dubl        ;type one space
  569.     jmp    text        ;ASCII label
  570.  
  571. ;    Read two bits to ascertain storage type, then load
  572. ;    address of appropriate descriptor for console typing.
  573.  
  574. gtyp:    mvi    c,2
  575.     call    bits        ;get C bits from .REL
  576. gtyq:    lxi    d,mabs        ;'ABS:'
  577.     ora    a
  578.     rz
  579.     lxi    d,mprg        ;'PREL'
  580.     dcr    a
  581.     rz
  582.     lxi    d,mdat        ;'DREL'
  583.     dcr    a
  584.     rz
  585.     lxi    d,mcom        ;'CREL'
  586.     ret
  587.  
  588. ;    This class of 'special LINK items' require a two-bit
  589. ;    storage classigication followed by a two-byte address.
  590.  
  591. phue:    call    gtyp        ;ascertain storage type
  592.     call    mssg        ;type text at (DE)
  593.     call    twrd        ;read & type word from .REL
  594.     call    crlf        ;CR,LF
  595.     jmp    refi        ;.REL read loop
  596.  
  597. ;    At the program end, the bit stream should be squared
  598. ;    off at a byte boundary. A start address may be present.
  599.  
  600. phoo:    call    gtyp        ;ascertain storage type
  601.     call    mssg        ;type text at (DE)
  602.     call    twrd        ;read & type word from .REL
  603.     call    crlf        ;CR,LF
  604.     lxi    h,0FF00H
  605.     shld    roby        ;rotating byte, bit counter
  606.     jmp    refi        ;.REL read loop
  607.  
  608. ;    End of File.
  609.  
  610. eofi:    ret
  611.  
  612. ;    Read a word from .REL and type it.
  613.  
  614. twrd:    call    geby        ;full byte from .REL
  615.     push    psw
  616.     call    geby        ;full byte from .REL
  617.     pop    d
  618.     mov    e,d
  619.     mov    d,a
  620.     jmp    word        ;type HL as four nibbles
  621.  
  622. ;    -------------------------------------------------------
  623.  
  624.  
  625. logo:    db    CR,LF
  626.     db    '        READREL/ICUAP',CR,LF
  627.     db    'Universidad Autonoma de Puebla',CR,LF
  628.     db    '      November 20, 1983',CR,LF,'$'
  629.  
  630. tuto:    db    CR,LF
  631.     db    'READREL.COM will decompose the bitstream which',CR,LF
  632.     db    'constitutes a .REL file into hexadecimal bytes',CR,LF
  633.     db    'and addresses interspersed with commentaries',CR,LF
  634.     db    'derived from the ''special LINK elements'' and',CR,LF
  635.     db    'other clarifying information. The command:',CR,LF,CR,LF
  636.     db    '    READREL [D:]FILE[.REL] [[D:]LIST[.EXT]]',CR,LF,CR,LF
  637.     db    'will analyze the requested file. If no extension',CR,LF
  638.     db    'is given, .REL will be used. The analysis will',CR,LF
  639.     db    'always appear at the console; but if a second file',CR,LF
  640.     db    'is mentioned, it will also be used for output. Its',CR,LF
  641.     db    'default extension will be .OUT',CR,LF
  642.     db    '$'
  643.  
  644. me0:    db    'entry symbol  $'
  645. me1:    db    'COMMON block  $'
  646. me2:    db    'program name  $'
  647. me3:    db    'req lib srch  $'
  648. me4:    db    'reserved      $'
  649. me5:    db    'COM  size $'
  650. me6:    db    'chain ext $'
  651. me7:    db    'def entry $'
  652. me8:    db    'reserved  $'
  653. me9:    db    'extnl + offset $'
  654. mea:    db    'size DATA area $'
  655. meb:    db    'ldng locn cntr $'
  656. mec:    db    'chain address  $'
  657. med:    db    'def prgrm size $'
  658. mee:    db    'end of program $'
  659. mef:    db    'EOF$'
  660. mabs:    db    'ABS: $'
  661. mprg:    db    'PREL $'
  662. mdat:    db    'DREL $'
  663. mcom:    db    'CREL $'
  664. dird:    db    'Disk read error.$'
  665. diwr:    db    'Disk write error.$'
  666. coso:    db    'Can''t open .REL file.$'
  667. ddfu:    db    'Disk or Directory full.$'
  668. nclo:    db    'Cannot close file.$'
  669. meql:    db    'Duplicate extensions.$'
  670. irrp:    db    '-- Analysis interrupted --',CR,LF,'$'
  671. erad:    db    '- Output file suppressed -$'
  672.  
  673. rfcb:    ds    21H        ;.REL FCB
  674. rbuf:    ds    rsiz+1        ;relfile buffer (400H)
  675. rinx:    ds    2        ;relfile index
  676. dout:    ds    1        ;z=no disk output
  677. dctr:    ds    2        ;output downcounter
  678. dptr:    ds    2        ;output pointer
  679. lctr:    ds    1        ;count 16 bytes/line
  680. colm:    ds    1        ;FF=column 1
  681. bctr:    ds    2        ;byte counter
  682. dbuf:    ds    100H        ;.OUT buffer
  683. reco:    ds    1        ;record counter
  684. rbrk:    ds    2        ;record breakpoint
  685. roby:    ds    2        ;rotating byte, bit counter
  686.     ds    20H
  687. stak:    ds    2        ;stackend
  688.  
  689.     end
  690.