home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / sigm / vol165 / readrel.asn < prev    next >
Encoding:
Text File  |  1984-07-09  |  13.7 KB  |  626 lines

  1.  
  2.  
  3. ;    ------------------------------------------------------------
  4. ;    .REL files are encoded as a bitstream according to certain
  5. ;    rules which are spelled out in Microsoft's FORTRAN manual.
  6. ;    As a consequence a normal disk dump program will not be very
  7. ;    intelligible, even to people who have learned to recognize
  8. ;    8080 opcodes in hexadecimal form, or to spot ASCII constants
  9. ;    in a program. The purpose of READREL.CMD is to generate a
  10. ;    hexadecimal dump of a .REL file, interspersed with special
  11. ;    directives as they are produced by M80.COM, F80.COM or other
  12. ;    relocating assemblers using the same format.
  13. ;
  14. ;             READREL - Copyright (C) 1983
  15. ;            Universidad Autonoma de Puebla
  16. ;                  November 24, 1983
  17. ;
  18. ;    [Harold V. McIntosh, 24 November 1983]
  19. ;    ------------------------------------------------------------
  20.  
  21.  
  22. BDOS    equ    224        ;CP/M interrupt to BDOS
  23.  
  24. TFCB    equ    005CH
  25. TSIZ    equ    0080H        ;CP/M's record size
  26. DSIZ    equ    0100H        ;size of .OUT buffer (must be 100H)
  27. RSIZ    equ    0400H        ;size of relfile buffer
  28. LSIZ:    equ    16        ;line length (maximum spaces per line)
  29.  
  30. LF    equ    0AH
  31. CR    equ    0DH
  32.  
  33. ;    -------------
  34.     org    0100H
  35. ;    -------------
  36.  
  37. BEGN:    sto    #0000,BCTR        ;byte counter
  38.     sto    #DSIZ,DCTR        ;output downcounter
  39.     sto    #DBUF,DPTR        ;output pointer
  40.     sto    #0000,RCTR        ;relfile counter
  41.     sto    #RBUF,RPTR        ;relfile pointer
  42.     stob    #LSIZ,LCTR        ;count 16 bytes/line
  43.     stob    #00,COLM        ;FF=column 1
  44.     cmpb    TFCB+1,#' '
  45.     jnz    NNUL
  46.     ld    dx,#LOGO        ;'UAP...'
  47.     call    MSSG            ;type text at (dx)
  48.     ld    dx,#TUTO        ;instructions for usage
  49.     call    MSSG            ;type text at (dx)
  50.     jmp    GBYE            ;normal exit
  51.  
  52. NNUL:    ld    cl,#021H        ;count
  53.     ld    dx,#TFCB        ;source
  54.     ld    bx,#RFCB        ;.REL FCB = destination
  55.     call    MIUC            ;block move
  56.  
  57.     stob    #'R',RFCB+9
  58.     stob    #'E',RFCB+10
  59.     stob    #'L',RFCB+11
  60.     stob    #00H,RFCB+12
  61.  
  62.     ld    cl,#15            ;(0F) open file
  63.     ld    dx,#RFCB        ;.REL FCB
  64.     int    BDOS
  65.     cmpb    al,#0FFH
  66.     ld    dx,#COSO        ;'can''t open .REL file'
  67.     jnz    ORLF
  68.     jmp    TEMA            ;type text at (dx), quit
  69.  
  70. ORLF:    stob    #00,DOUT        ;z=no disk output
  71.     cmpb    TFCB+17,#' '        ;output filename
  72.     jz    NOUT
  73.     stob    #0FFH,DOUT        ;z=no disk output
  74.  
  75.     ld    cl,#16
  76.     ld    dx,#TFCB+16
  77.     ld    bx,#TFCB    ;CP/M's file control block (.OUT)
  78.     call    MIUC
  79.  
  80.     cmpb    TFCB+9,#' '    ;output extension
  81.     jnz    YEXT
  82.     stob    #'O',TFCB+9
  83.     stob    #'U',TFCB+10
  84.     stob    #'T',TFCB+11
  85.  
  86. YEXT:    ld    cx,#0003
  87.     ld    bx,#TFCB+9
  88.     ld    dx,#RFCB+9
  89. YEXX:    xchg    bx,dx
  90.     ld    al,[bx]
  91.     xchg    bx,dx
  92.     cmp    al,[bx]
  93.     inc    bx
  94.     inc    dx
  95.     loopz    YEXX
  96.     jnz    NEQL
  97.     ld    dx,#MEQL    ;'extensions equal'
  98.     jmp    TEMA        ;type text at (dx), quit
  99.  
  100. NEQL:    ld    cl,#19        ;(13) delete file
  101.     ld    dx,#TFCB    ;CP/M's file control block (.OUT)
  102.     int    BDOS
  103.  
  104.     ld    cl,#22        ;(16) create file
  105.     ld    dx,#TFCB    ;CP/M's file control block (.OUT)
  106.     int    BDOS
  107.  
  108.     ld    cl,#15        ;(0F) open file
  109.     ld    dx,#TFCB    ;CP/M's file control block (.OUT)
  110.     int    BDOS
  111.     cmp    al,#0FFH
  112.     ld    dx,#DDFU    ;'no more directory'
  113.     jnz    NOUT
  114.     jmp    TEMA        ;type text at (dx), quit
  115.  
  116. NOUT:    sto    #0FF00H,ROBY    ;rotating byte, bit counter
  117.     call    REFI        ;process the .REL file
  118.     cmpb    DOUT,#00    ;z=no disk output
  119.     jz    FINI
  120.  
  121. ;    Fill the remainder of the output file with ^Z's, write
  122. ;    the tag end to disk, and close the file.
  123.  
  124.     ld    cx,DCTR        ;output downcounter
  125.     ld    bx,DPTR        ;output pointer
  126.     ld    al,#1AH        ;^Z
  127.     jcxz    CLOP
  128. CLOO:    sto    al,[bx]
  129.     loop    CLOO
  130.  
  131. CLOP:    cmpb    DBUF,#1AH    ;^Z
  132.     jz    CLOS
  133.     ld    cl,#26        ;(1A) set DMA address
  134.     ld    dx,#DBUF
  135.     int    BDOS
  136.  
  137.     call    BUDK        ;record to disk
  138.  
  139.     cmpb    DBUF+TSIZ,#1AH    ;^Z
  140.     jz    CLOS
  141.     ld    cl,#26        ;(1A) set DMA address
  142.     ld    dx,#DBUF+TSIZ
  143.     int    BDOS
  144.  
  145.     call    BUDK        ;record to disk
  146.  
  147. CLOS:    ld    cl,#16        ;(10) close file
  148.     ld    dx,#TFCB    ;CP/M's file control block (.OUT)
  149.     int    BDOS
  150.     cmp    al,#0FFH
  151.     ld    dx,#NCLO    ;'can''t close file'
  152.     jnz    FINI
  153.     jmp    EDSK        ;delete .OUT file, type messages
  154.  
  155. FINI:    call    CRLF        ;CR,LF
  156. GBYE:    ld    dl,#00
  157.     ld    cl,#00
  158.     int    BDOS
  159.  
  160. ;    Type CR, LF.
  161.  
  162. CRLF:    ld    al,#CR
  163.     call    CONA        ;console from A
  164.     ld    al,#LF
  165.     call    CONA        ;console from A
  166.     stob    #LSIZ,LCTR    ;count 16 bytes/line
  167.     stob    #0FFH,COLM    ;FF=column 1
  168.     ld    cl,#11        ;(0B) console status
  169.     int    BDOS
  170.     or    al,al
  171.     jz    CRLR
  172.     ld    cl,#1        ;(01) read console
  173.     int    BDOS
  174.     ld    dx,#IRRP    ;'analysis interrupted'
  175.     call    MSSG
  176.     cmpb    DOUT,#00    ;z=no disk output
  177.     jz    GBYE
  178.     jmp    EDSQ        ;delete .OUT file, type messages
  179. CRLR:    ret
  180.  
  181. ;    word: type dx as four nibbles.
  182. ;    byte: type A as two nibbles.
  183.  
  184. WORD:    mov    al,dh
  185.     call    BYTE        ;type A as two nibbles
  186.     mov    al,dl
  187. BYTE:    call    TADR        ;type address if column 1
  188. BEIT:    push    ax
  189.     rcr    al
  190.     rcr    al
  191.     rcr    al
  192.     rcr    al
  193.     call    NIBL        ;type A as hex
  194.     pop    ax
  195. NIBL:    and    al,#0FH
  196.     add    al,#90H
  197.     daa
  198.     adc    al,#40H
  199.     daa
  200. CONA:    push    bx
  201.     push    dx
  202.     push    ax
  203.     ld    cl,#2        ;(02) write console
  204.     mov    dl,al
  205.     int    BDOS
  206.     pop    ax
  207.     cmpb    DOUT,#00    ;z=no disk output
  208.     jz    CONB
  209.     call    DDDA
  210. CONB:    pop    dx
  211.     pop    bx
  212.     ret
  213.  
  214. ;    Type several spaces.
  215.  
  216. DUBL:    call    SNGL        ;type one space
  217. SNGL:    decb    LCTR        ;count 16 bytes/line
  218.     jnz    NOCR
  219.     call    CRLF
  220. NOCR:    ld    al,#' '
  221.     jmp    CONA
  222.  
  223. ;    Type relative address if at start of a new line.
  224.  
  225. TADR:    push    bx
  226.     incb    COLM        ;FF=column 1
  227.     jnz    TRET
  228.     push    ax
  229.     ld    al,#'('
  230.     call    CONA
  231.     ld    bx,BCTR
  232.     mov    al,bh
  233.     call    BEIT
  234.     mov    al,bl
  235.     call    BEIT
  236.     ld    al,#')'
  237.     call    CONA
  238.     call    SNGL
  239.     pop    ax
  240. TRET:    pop    bx
  241.     ret
  242.  
  243. ;    Type message at (dx).
  244.  
  245. MSSG:    xchg    bx,dx
  246. MSSH:    ld    al,[bx]
  247.     cmp    al,#'$'
  248.     jz    MSSR
  249.     call    CONA
  250.     inc    bx
  251.     jmp    MSSH
  252. MSSR:    ret
  253.  
  254. ;    Type message, erase .OUT file, quit.
  255.  
  256. EDSK:    call    MSSG
  257. EDSQ:    ld    cl,#19        ;(13) delete file
  258.     ld    dx,#TFCB    ;CP.M's file control block (.OUT)
  259.     int    BDOS        ;don't leave a partial file
  260.     ld    dx,#ERAD    ;'output file erased'
  261. TEMA:    call    MSSG
  262.     jmp    GBYE
  263.  
  264. ;    Block move.
  265.  
  266. MIUC:    xchg bx,dx
  267.     ld    al,[bx]
  268.     xchg    bx,dx
  269.     sto    al,[bx]
  270.     inc    bx
  271.     inc    dx
  272.     dec    cl
  273.     jnz    MIUC        ;block move
  274.     ret
  275.  
  276. ;    Place disk output in buffer, store the buffer in the
  277. ;    disk as it is filled and reinitialize it.
  278.  
  279. DDDA:    cmp    DCTR,#0000
  280.     jnz    DDDB
  281.     call    BUDI        ;output downcounter
  282. DDDB:    dec    DCTR
  283.     ld    bx,DPTR        ;output pointer
  284.     sto    al,[bx]
  285.     inc    DPTR        ;output downcounter
  286.     ret
  287.  
  288. ;    Send DBUF to disk.
  289.  
  290. BUDI:    push    ax
  291.     call    BUDJ
  292.     sto    #DBUF,DPTR    ;output pointer
  293.     sto    #DSIZ,DCTR
  294.     pop    ax
  295.     ret
  296.  
  297. BUDJ:    ld    cl,#26        ;(1A) set DMA address
  298.     ld    dx,#DBUF    ;output buffer
  299.     int    BDOS
  300.  
  301.     call    BUDK        ;record to disk
  302.  
  303.     ld    cl,#26        ;(1A) set DMA address
  304.     ld    dx,#DBUF+TSIZ    ;CP/M's record size
  305.     int    BDOS
  306.  
  307. BUDK:    ld    cl,#21        ;(15) write one record
  308.     ld    dx,#TFCB    ;CP/M's file control block (.OUT)
  309.     int    BDOS
  310.     cmp    al,#00H
  311.     ld    dx,#DIWR    ;'disk write error'
  312.     jnz    EDSK        ;delete .OUT file, type messages
  313.     ret
  314.  
  315. ;    Get next bit.
  316.  
  317. GEBI:    incb    ROBY+1
  318.     jnz    GEBJ
  319.     call    NXHX
  320.     stob    al,ROBY
  321.     stob    #0F8H,ROBY+1    ;-8
  322. GEBJ:    rclb    ROBY
  323.     ret
  324.  
  325. ;    Read sixteen bits from the .REL file, leave them in dx.
  326.  
  327. GEWO:    call    GEBY
  328.     push    ax
  329.     call    GEBY
  330.     pop    dx
  331.     mov    dh,al
  332.     ret
  333.  
  334. ;    Read a full byte from the .REL file, leave it in al.
  335.  
  336. GEBY:    ld    cl,#08
  337. BITS:    ld    ch,#00
  338. MORE:    call    GEBI        ;get next bit
  339.     rcl    ch
  340.     dec    cl
  341.     jnz    MORE
  342.     mov    al,ch
  343.     ret
  344.  
  345. ;    Get next relfile element.
  346.  
  347. NXHX:    push    cx
  348.     push    bx
  349.     cmp    RCTR,#0000    ;relfile counter
  350.     jnz    NXHV        ;byte available
  351.     sto    #RBUF,RPTR
  352. NXHY:    cmp    RPTR,#(RBUF+RSIZ)
  353.     jnc    NXHU        ;reset relfile, read 1st element
  354.     ld    cl,#26        ;(1A) set DMA address
  355.     ld    dx,RPTR        ;relfile buffer
  356.     int    BDOS
  357.     ld    cl,#20        ;(14) read one record
  358.     ld    dx,#RFCB    ;.REL FCB
  359.     int    BDOS
  360.     cmp    al,#000H
  361.     jnz    NXHZ
  362.     add    RPTR,#TSIZ
  363.     add    RCTR,#TSIZ
  364.     jmp    NXHY
  365.  
  366. NXHZ:    cmp    al,#001H
  367.     ld    dx,#DIRD    ;'disk read error'
  368.     jz    NXHU
  369.     jmp    TEMA        ;type text at (dx), quit
  370.  
  371. NXHU:    sto    #RBUF,RPTR
  372. NXHV:    dec    RCTR
  373.     ld    bx,RPTR
  374.     inc    RPTR
  375.     ld    al,[bx]
  376.     pop    bx
  377.     pop    cx
  378.     ret
  379.  
  380. ;    -------------------
  381. ;    Read the .REL file.
  382. ;    -------------------
  383.  
  384.  
  385. ;    The first bit read determines whether a single byte
  386. ;    follows (bit = 0), to be used without alteration, or
  387. ;    whether the following information may be relocatable
  388. ;    (bit = 1).
  389.  
  390. REFI:    call    GEBI        ;get next bit
  391.     jc    RELA        ;not absolute byte
  392.     call    GEBY        ;full byte from .REL
  393.     call    BYTE        ;type A as two nibbles
  394.     call    SNGL        ;type one space
  395.     inc    BCTR        ;byte counter
  396.     jmp    REFI        ;.REL read loop
  397.  
  398. ;    When the leadin bit is 1, two more bits are read to
  399. ;    distinguish four alternatives: 00 for further analysis,
  400. ;    01 for program segment, 10 for data segment, or 11 for
  401. ;    common segment. In the latter three cases, a two-byte
  402. ;    address will be read, which a loader would assign to its
  403. ;    proper memory segment.
  404.  
  405. RELA:    ld    cl,#2
  406.     call    BITS        ;get C bits from .REL
  407.     or    al,al
  408.     jz    SPEC        ;'special LINK element'
  409.     call    TADR        ;type address if column 1
  410.     call    GTYQ        ;fetch segment descriptor
  411.     call    MSSG        ;type text at (dx)
  412.     call    GEWO        ;sixteen bits from .REL
  413.     call    WORD        ;type dx as four nibbles
  414.     call    CRLF        ;CR, LF
  415.     ld    bx,BCTR        ;byte counter
  416.     inc    bx
  417.     inc    bx
  418.     sto    bx,BCTR        ;byte counter
  419.     jmp    REFI        ;.REL read loop
  420.  
  421. ;    There are sixteen 'special LINK elements' ranging from
  422. ;    entry point definitions to the EOF indicator. They fall
  423. ;    into three or four general groups, depending on whether
  424. ;    they are associated with an eight-byte ASCII label, a
  425. ;    relocatable address, both, or neither. Since they represent
  426. ;    parenthetic information, they are set off on a line by
  427. ;    themselves.
  428.  
  429. SPEC:    cmpb    LCTR,#LSIZ    ;max spaces/line
  430.     jz    SPED
  431.     call    CRLF        ;CR,LF
  432. SPED:    stob    #0,COLM        ;FF=column 1
  433.     ld    cl,#4
  434.     call    BITS        ;get C bits from .REL
  435.     ld    ah,#0
  436.     add    ax,ax        ;case number indexes two tables
  437.     mov    bx,ax
  438.     ld    di,#META    ;case table for messages
  439.     ld    dx,[bx+di]
  440.     ld    di,#JUTA    ;case table for action addresses
  441.     push    [bx+di]
  442.     jmp    MSSG        ;type text at (dx)
  443.  
  444. ;    Message table, to correspond to the 'special' relocation
  445. ;    elements, of which there are sixteen. These are the
  446. ;    descriptive messages inserted into the output stream.
  447.  
  448. META:    dw    ME0        ;'entry symbol'
  449.     dw    ME1        ;'COMMON block'
  450.     dw    ME2        ;'program name'
  451.     dw    ME3        ;'request library search'
  452.     dw    ME4        ; reserved
  453.     dw    ME5        ;'COMMON size'
  454.     dw    ME6        ;'chain external'
  455.     dw    ME7        ;'define entry'
  456.     dw    ME8        ; reserved
  457.     dw    ME9        ;'external add offset'
  458.     dw    MEA        ;'size of DATA area'
  459.     dw    MEB        ;'loading location counter'
  460.     dw    MEC        ;'chain address'
  461.     dw    MED        ;'define program size'
  462.     dw    MEE        ;'end of program'
  463.     dw    MEF        ;'end of file'
  464.  
  465. ;    There may be a label or a further address associated
  466. ;    with each 'special LINK item.' These subroutines take
  467. ;    the appropriate action in each case.
  468.  
  469. JUTA:    dw    TEXT        ;ASCII label
  470.     dw    TEXT        ;ASCII label
  471.     dw    TEXT        ;ASCII label
  472.     dw    TEXT        ;ASCII label
  473.     dw    TEXT        ;ASCII label
  474.     dw    STYP        ;storage type
  475.     dw    STYP        ;storage type
  476.     dw    STYP        ;storage type
  477.     dw    STYP        ;storage type
  478.     dw    PHUE        ;storage type w/ address
  479.     dw    PHUE        ;storage type w/ address
  480.     dw    PHUE        ;storage type w/ address
  481.     dw    PHUE        ;storage type w/ address
  482.     dw    PHUE        ;storage type w/ address
  483.     dw    PHOO        ;program end - flush byte
  484.     dw    EOFI        ;EOF
  485.  
  486. ;    The 'special LINK item' includes an 8-byte label
  487. ;    or similar ASCII string. 8 bytes is maximum, there
  488. ;    must be at least 1, 8 is taken for 0.
  489.  
  490. TEXT:    ld    cl,#3
  491.     call    BITS        ;get C bits from .REL
  492.     or    al,al        ;take 0 to mean 8
  493.     jnz    X2X
  494.     ld    al,#8
  495. X2X:    push    ax
  496.     call    GEBY        ;full byte from .REL
  497.     call    CONA
  498.     pop    ax
  499.     dec    al
  500.     jnz    X2X
  501.     call    CRLF        ;CR,LF
  502.     jmp    REFI        ;.REL read loop
  503.  
  504. ;    The 'special LINK item' requires identification via
  505. ;    the following two bits, as to whether it is absolute
  506. ;    (00), code (01), data (10), or common (11).
  507.  
  508. STYP:    call    GTYP        ;ascertain storage type
  509.     call    MSSG        ;type text at (dx)
  510.     call    TWRD        ;read & type word from .REL
  511.     call    DUBL        ;type one space
  512.     jmp    TEXT        ;ASCII label
  513.  
  514. ;    Read two bits to ascertain storage type, then load
  515. ;    address of appropriate descriptor for console typing.
  516.  
  517. GTYP:    ld    cl,#2
  518.     call    BITS        ;get C bits from .REL
  519. GTYQ:    ld    dx,#MABS    ;'ABS:'
  520.     or    al,al
  521.     jz    GTYR
  522.     ld    dx,#MPRG    ;'PREL'
  523.     dec    al
  524.     jz    GTYR
  525.     ld    dx,#MDAT    ;'DREL'
  526.     dec    al
  527.     jz    GTYR
  528.     ld    dx,#MCOM    ;'CREL'
  529. GTYR:    ret
  530.  
  531. ;    This class of 'special LINK items' require a two-bit
  532. ;    storage classigication followed by a two-byte address.
  533.  
  534. PHUE:    call    GTYP        ;ascertain storage type
  535.     call    MSSG        ;type text at (dx)
  536.     call    TWRD        ;read & type word from .REL
  537.     call    CRLF        ;CR,LF
  538.     jmp    REFI        ;.REL read loop
  539.  
  540. ;    At the program end, the bit stream should be squared
  541. ;    off at a byte boundary. A start address may be present.
  542.  
  543. PHOO:    call    GTYP        ;ascertain storage type
  544.     call    MSSG        ;type text at (dx)
  545.     call    TWRD        ;read & type word from .REL
  546.     call    CRLF        ;CR,LF
  547.     sto    #0FF00H,ROBY    ;rotating byte, bit counter
  548.     jmp    REFI        ;.REL read loop
  549.  
  550. ;    End of File.
  551.  
  552. EOFI:    ret
  553.  
  554. ;    Read a word from .REL and type it.
  555.  
  556. TWRD:    call    GEWO        ;sixteen bits from .REL
  557.     jmp    WORD        ;type dx as four nibbles
  558.  
  559. ;    -------------------------------------------------------
  560.  
  561.  
  562. LOGO:    db    CR,LF
  563.     db    '        READREL/ICUAP',CR,LF
  564.     db    'Universidad Autonoma de Puebla',CR,LF
  565.     db    '      November 24, 1983',CR,LF,'$'
  566.  
  567. TUTO:    db    CR,LF
  568.     db    'READREL.CMD will decompose the bitstream which',CR,LF
  569.     db    'constitutes a .REL file into hexadecimal bytes',CR,LF
  570.     db    'and addresses interspersed with commentaries',CR,LF
  571.     db    'derived from the ''special LINK elements'' and',CR,LF
  572.     db    'other clarifying information. The command:',CR,LF,CR,LF
  573.     db    '    READREL [D:]FILE[.REL] [[D:]LIST[.OUT]]',CR,LF,CR,LF
  574.     db    'will analyze the requested file. If no extension',CR,LF
  575.     db    'is given, .REL will be used. The analysis will',CR,LF
  576.     db    'always appear at the console. When a second file is',CR,LF
  577.     db    'given (with default extension .OUT), it will gather',CR,LF
  578.     db    'in the output listing. Pressing any key will stop',CR,LF
  579.     db    'the program.',CR,LF
  580.     db    '$'
  581.  
  582. ME0:    db    'entry symbol  $'
  583. ME1:    db    'COMMON block  $'
  584. ME2:    db    'program name  $'
  585. ME3:    db    'req lib srch  $'
  586. ME4:    db    'reserved      $'
  587. ME5:    db    'COM  size $'
  588. ME6:    db    'chain ext $'
  589. ME7:    db    'def entry $'
  590. ME8:    db    'reserved  $'
  591. ME9:    db    'extnl + offset $'
  592. MEA:    db    'size DATA area $'
  593. MEB:    db    'ldng locn cntr $'
  594. MEC:    db    'chain address  $'
  595. MED:    db    'def prgrm size $'
  596. MEE:    db    'end of program $'
  597. MEF:    db    'EOF$'
  598. MABS:    db    'ABS: $'
  599. MPRG:    db    'PREL $'
  600. MDAT:    db    'DREL $'
  601. MCOM:    db    'CREL $'
  602. DIRD:    db    'Disk read error.$'
  603. DIWR:    db    'Disk write error.$'
  604. COSO:    db    'Can''t open .REL file.$'
  605. DDFU:    db    'Disk or Directory full.$'
  606. NCLO:    db    'Cannot close file.$'
  607. MEQL:    db    'Duplicate extensions.$'
  608. IRRP:    db    '-- Analysis interrupted --',CR,LF,'$'
  609. ERAD:    db    '- Output file suppressed -$'
  610.  
  611. RFCB:    ds    21H        ;.REL FCB
  612. RBUF:    ds    RSIZ        ;relfile buffer (400H)
  613. RPTR:    ds    2        ;relfile pointer
  614. RCTR:    ds    2        ;relfile counter
  615. ROBY:    ds    2        ;rotating byte, bit counter
  616. DOUT:    ds    1        ;z=no disk output
  617. DCTR:    ds    2        ;output downcounter
  618. DPTR:    ds    2        ;output pointer
  619. LCTR:    ds    1        ;count 16 bytes/line
  620. COLM:    ds    1        ;FF=column 1
  621. BCTR:    ds    2        ;byte counter
  622. DBUF:    ds    DSIZ        ;.OUT buffer
  623.  
  624.     end
  625.  
  626.