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 / BEEHIVE / TESERACT / TESS-004.ZIP / RELDUMP2.AQM / RELDUMP2.ASM
Assembly Source File  |  1994-01-28  |  9KB  |  472 lines

  1.     title    'RELDUMP version 1.1'
  2. ;
  3. ;    2/24/81 added ascii display to absolute lines (RGF)
  4. ;
  5. ;    Program to dump Microsoft format
  6. ;    rel files field by field
  7. ;    with field comments
  8. ;
  9. ;    See Microsoft 'linking loader' manual
  10. ;    for more information on .rel files
  11. ;
  12. ;
  13. ;    Requires Digital Research 'MAC'
  14. ;    assembler, or alternatively, you
  15. ;    can expand the macros and use
  16. ;    the cp/m assembler 'asm'.
  17. ;
  18. ;
  19. ;    8/22/80     by Ron Fowler
  20. ;               Westland, Mich.
  21. ;
  22. cr    equ    13
  23. lf    equ    10
  24. bdos    equ    5
  25. fcb    equ    5ch
  26. buf    equ    80h
  27. ;
  28. cifnc    equ    1
  29. prtchr    equ    2
  30. printf    equ    9
  31. cstsf    equ    11
  32. openf    equ    15
  33. readf    equ    20
  34. ;
  35. maxperline equ    16 ;abs items per line
  36. ;
  37. ;    define some macros
  38. ;
  39. pchar    macro    x
  40.     if not nul x
  41.     mvi    a,x
  42.     endif
  43.     call    outchr
  44.     endm
  45. ;
  46. print    macro    string
  47.     local    overstring
  48.     call    overstring
  49.     db    string
  50. overstring:
  51.     pop    d
  52.     mvi    c,printf
  53.     call    bdos
  54.     endm
  55. ;
  56. bits    macro    num
  57.     mvi    b,num
  58.     call    getbits
  59.     endm
  60.     page
  61. ;
  62. ;    get local stack and
  63. ;    set up fcb
  64. ;
  65.     ORG    100H
  66. ;
  67. base:    lxi    h,0
  68.     dad    sp
  69.     shld    stack
  70.     lxi    sp,stack
  71.     lda    fcb+9    ;look at filetype
  72.     cpi    ' '    ;see if type specified
  73.     jnz    sk1    ;jmp if so
  74.     lxi    h,'RE'    ;part of 'REl'
  75.     shld    fcb+9    ;store into fcb
  76.     mvi    a,'L'    ;rest of 'reL'
  77.     sta    fcb+11
  78. sk1:    mvi    c,openf ;open the .rel file
  79.     lxi    d,fcb
  80.     call    bdos
  81.     cpi    0ffh    ;should not be
  82.     jnz    main    ;jump if not
  83.     call    msgxit    ;else say can't find
  84.     db    'File not found.$'
  85.     page
  86. ;
  87. ;    main work loop
  88. ;
  89. main:    call    item    ;identify one item
  90.     jc    done    ;cy is eof indicator
  91.     call    stop    ;console says stop?
  92.     jnc    main    ;continue if not
  93. done:    call    msgxit    ;else print 'done'
  94.     db    cr,lf,'done.$'
  95. ;
  96. stop:    mvi    c,cstsf
  97.     call    bdos
  98.     ora    a
  99.     rz
  100.     mvi    c,cifnc
  101.     call    bdos
  102.     cpi    'C'-40h ;control-c?
  103.     stc        ;says stop
  104.     rz
  105.     cmc        ;false char
  106.     ret
  107.     page
  108. ;
  109. ;    decode an item
  110. ;
  111. item:    bits    1    ;get first bit of item
  112.     ora    a    ;test for zero
  113.     jnz    not$abs  ;not zero, jmp for rel
  114.     lxi    h,relflg
  115.     mov    a,m
  116.     mvi    m,0
  117.     ora    a
  118.     jz    cont1
  119.     call    crlf
  120.     mvi    a,maxperline+1
  121.     sta    abscnt
  122. cont1:    lxi    h,abscnt ;line up abs values
  123.     mov    a,m
  124.     inr    a
  125.     mov    m,a
  126.     cpi    maxperline
  127.     jc    lnok    ;max values per line
  128.     xra    a
  129.     mov    m,a
  130.     call    dmpasc    ;show values in ascii
  131.     call    crlf
  132.     print    'ABS: $'
  133.     mvi    a,4
  134.     sta    chrpos
  135. lnok:    bits    8    ;get 8 absolute bits
  136.     lhld    ascptr
  137.     mov    m,a    ;save for later asc disp
  138.     inx    h
  139.     shld    ascptr
  140.     lxi    h,ascnt ;increment count
  141.     inr    m
  142.     call    hexout
  143.     pchar    ' '
  144.     ora    a    ;no eof yet
  145.     ret
  146. ;
  147. not$abs:
  148.     call    dmpasc    ;dump ABS ascii if any
  149.     call    crlf
  150.     call    crlf
  151.     mvi    a,0ffh    ;idntfy rel iterm
  152.     sta    relflg
  153.     mvi    a,maxperline+1 ;make new abs line
  154.     sta    abscnt
  155.     print    'REL: type $'
  156.     bits    2    ;get rel type spec
  157.     push    psw
  158.     call    hexout
  159.     pop    psw
  160.     ora    a
  161.     jz    spl    ;0 is special type
  162.     dcr    a
  163.     jz    prgrel ;1 is program relative
  164.     dcr    a
  165.     jz    datrel ;2 is data relative
  166. ;
  167. ;    must be 3, common relative
  168. ;
  169.     print    ', com rel, val=$'
  170.     jmp    prnt16
  171. prgrel: print    ', prg rel, val=$' 
  172.     jmp    prnt16
  173. datrel: print    ', dat rel, val=$'
  174. prnt16: bits    8    ;get rel byte
  175.     push    psw    ;save lst sig byte
  176.     bits    8    ;next
  177.     call    hexout    ;print most sig
  178.     pop    psw
  179.     call    hexout    ;print least sig
  180.     pchar    ' '    ;print a space
  181.     ora    a    ;not eof yet
  182.     ret
  183.     page
  184. ;
  185. ;    handle special relative field
  186. ;
  187. spl:    print    ', (special), ctrl fld=$'
  188.     bits    4    ;spl fld has..
  189.     sta    ctrlfld ;..4 bits
  190.     push    psw
  191.     call    hexout    ;print it
  192.     print    ', $'
  193.     pop    psw
  194.     mov    l,a
  195.     mvi    h,0    ;ctl fld in hl
  196.     dad    h    ;offset for table
  197.     lxi    d,msgtable
  198.     dad    d
  199.     mov    e,m    ;get lo byte
  200.     inx    h
  201.     mov    d,m    ;de has field msg
  202.     mvi    c,printf
  203.     call    bdos    ;identify type
  204.     lda    ctrlfld ;get control byte
  205.     cpi    15    ;15 is eof
  206.     stc        ;so say so
  207.     rz
  208.     push    psw    ;new lin for a & b flds
  209.     call    crlf
  210.     print    '     $';tab over
  211.     pop    psw
  212.     cpi    4+1    ;type 0-4 has no a fld
  213.     jc    bonly
  214.     call    afield    ;show the a field
  215.     lda    ctrlfld 
  216.     cpi    14    ;end program...
  217.     jnz    not14    ;..forces byte boundary
  218.     call    refill    ;go next byte
  219.     ora    a    ;return cy clr
  220.     ret
  221. not14:    cpi    9    ;type 9-15 has no b
  222.     rnc
  223. bonly:    call    bfield
  224.     ora    a    ;say no eof
  225.     ret
  226.     page
  227. ;
  228. ;    handle special rel fields
  229. ;
  230. afield: print    'a fld type: $'
  231.     bits    2    ;get the a field
  232.     push    psw
  233.     call    hexout    ;print it
  234.     print    ', $'    ;make a comma,spc
  235.     pop    psw    ;get back a field
  236.     ora    a    ;examine it for type
  237.     jz    absad    ;0=absolute adrs
  238.     dcr    a
  239.     jz    prg2    ;1=program rel
  240.     dcr    a
  241.     jz    data2    ;2=data rel
  242. ;
  243. ;    must be common relative
  244. ;
  245.     print    '(common rel) value= $'
  246.     jmp    prnt16
  247. data2:    print    '(data   rel) value= $'
  248.     jmp    prnt16
  249. prg2:    print    '(prog   rel) value= $'
  250.     jmp    prnt16
  251. absad:    print    '(absolute) value= $'
  252.     jmp    prnt16
  253. ;
  254. bfield: bits    3    ;get b-field size
  255.     mov    e,a    ;make a counter
  256.     pchar    '"'    ;enclose in quotes
  257. bsym:    mov    a,e    ;when e is zero
  258.     ora    a    ;then we are done
  259.     jz    brout
  260.     dcr    e    ;count down
  261.     bits    8    ;get sym char
  262.     pchar        ;print it
  263.     jmp    bsym    ;loop till done
  264. brout:    pchar    '"'    ;close quotes
  265.     ret
  266.     page
  267. ;
  268. ;*************************
  269. ;*     subroutines     *
  270. ;*************************
  271. ;
  272. ;
  273. ;    get number of bits from
  274. ;    input stream as in b reg
  275. ;
  276. getbits: 
  277.     push    h
  278.     push    d
  279.     xra    a    ;zero our byte
  280. bitlop: call    nxtbit    ;next bit into cy flg
  281.     ral        ;shift into our byte
  282.     dcr    b    ;count down
  283.     jnz    bitlop
  284.     pop    d
  285.     pop    h
  286.     ret
  287. ;
  288. ;    get next bit from input stream
  289. ;
  290. nxtbit: push    b
  291.     mov    b,a    ;can't alter a
  292.     lda    bitcnt    ;any left this byte?
  293.     ora    a
  294.     cz    refill    ;get another if not
  295.     dcr    a
  296.     sta    bitcnt    ;update for nxt time
  297.     lda    char    ;current byte
  298.     ral        ;bit into cy
  299.     sta    char
  300.     mov    a,b    ;restore accumulator
  301.     pop    b
  302.     ret
  303. ;
  304. ;    get the next byte from input buffer
  305. ;
  306. refill: push    b
  307.     lda    bufptr
  308.     cpi    80h    ;see if buf empty
  309.     cz    diskrd    ;fill if so
  310.     mov    l,a
  311.     mvi    h,0    ;form 16 bits
  312.     inr    a    ;update buf pntr
  313.     sta    bufptr
  314.     lxi    d,buf
  315.     dad    d    ;point into buffer
  316.     mov    a,m    ;reach in and get byte
  317.     sta    char    ;save it
  318.     mvi    a,8    ;new bit count
  319.     sta    bitcnt
  320.     pop    b
  321.     ret
  322. ;
  323. ;    read next sector from file
  324. ;
  325. diskrd: mvi    c,readf
  326.     lxi    d,fcb
  327.     call    bdos
  328.     cpi    0ffh    ;should not be..
  329.     mvi    a,0    ;..early eof
  330.     rnz
  331.     call    msgxit    ;oops!
  332.     db    '??? Unexpected end of file.$'
  333. ;
  334. ;    print message pointed
  335. ;    to by tos then exit
  336. ;
  337. msgxit: pop    d
  338.     mvi    c,printf
  339.     call    bdos
  340.     lhld    stack
  341.     sphl
  342.     ret        ;to ccp
  343. crlf:    mvi    a,cr
  344.     call    outx
  345.     mvi    a,lf
  346.     call    outx
  347.     lda    lincnt
  348.     inr    a
  349.     sta    lincnt
  350.     cpi    61    ;lines/page
  351.     rnz
  352.     mvi    b,6    ;lines to nxt page
  353. formfd: mvi    a,lf
  354.     call    outx    ;<<<
  355.     dcr    b
  356.     jnz    formfd
  357.     mvi    a,1    ;say first line
  358.     sta    lincnt
  359.     ret
  360. hexout: push    psw
  361.     rar
  362.     rar
  363.     rar
  364.     rar
  365.     call    nybble
  366.     pop    psw
  367. nybble: ani    0fh
  368.     cpi    10
  369.     jc    xnum
  370.     adi    7
  371. xnum:    adi    '0'
  372.     pchar
  373.     ret
  374.     page
  375. ;
  376. ;    print char in a (called from
  377. ;    macros only).
  378. ;
  379. outchr: cpi    ' '    ;check for printable..
  380.     jnc    chka    ;..characters, make...
  381. fix:    mvi    a,'.'    ;...non-printing chars....
  382. chka:    cpi    7fh    ;....dots
  383.     jnc    fix
  384. outx:    push    h
  385.     push    d
  386.     push    b
  387.     mvi    c,prtchr
  388.     mov    e,a
  389.     call    bdos
  390.     lxi    h,chrpos
  391.     inr    m    ;increment line pos
  392.     pop    b
  393.     pop    d
  394.     pop    h
  395.     ret
  396. ;
  397. ;    dump the ascii buffer (used
  398. ;    in ABS dumps only)
  399. ;
  400. dmpasc: lda    ascnt
  401.     ora    a    ;see if zero count
  402.     mov    b,a    ;save count in b
  403.     jz    gobk    ;do nothing if no count
  404. tab:    lda    chrpos    ;see where on line we are
  405.     cpi    maxperline*3+10
  406.     jz    dmp1    ;tabbed over, then jump
  407.     pchar    ' '    ;else keep tabbing
  408.     jmp    tab
  409. dmp1:    lxi    h,ascbuf
  410. dmplp:    mov    a,m    ;pick up char
  411.     inx    h    ;point past
  412.     pchar        ;print it
  413.     dcr    b
  414.     jnz    dmplp
  415. gobk:    xra    a    ;get zero in accumulator
  416.     sta    ascnt    ;zero count
  417.     sta    chrpos    ;and line position
  418.     lxi    h,ascbuf ;reset ascii buffer pointer
  419.     shld    ascptr
  420.     ret
  421. ;
  422. ;    table of control-field
  423. ;    type messages
  424. ;
  425. msgtable:
  426.     dw    m0,m1,m2,m3
  427.     dw    m4,m5,m6,m7
  428.     dw    m8,m9,m10,m11
  429.     dw    m12,m13,m14,m15
  430. ;
  431. ;    the messages:
  432. ;
  433. m0:    db    '*      entry symbol      *$'
  434. m1:    db    '*      sel com blk       *$'
  435. m2:    db    '*      program name      *$'
  436. m3:    db    '* request library search *$'
  437. m4:    db    '*   extension link item  *$'
  438. m5:    db    '*       common size      *$'
  439. m6:    db    '*      chain external    *$'
  440. m7:    db    '*    define entry point  *$'
  441. m8:    db    '*    external - offset   *$'
  442. m9:    db    '*    external + offset   *$'
  443. m10:    db    '*    define data size    *$'
  444. m11:    db    '*     set loc counter    *$'
  445. m12:    db    '*      chain address     *$'
  446. m13:    db    '*      program size      *$'
  447. m14:    db    '*       end program      *$'
  448. m15:    db    '*       end of file      *$'
  449.     page
  450. ;
  451. ;    variables
  452. ;
  453. bufptr: db    80h    ;force initial read
  454. bitcnt: db    0    ;and empty char
  455. char:    db    0
  456. ctrlfld: db    0
  457. abscnt: db    maxperline+1  ;force initial crlf
  458. lincnt: db    1    ;start paper at line 1
  459. relflg: db    0
  460.     db    0
  461. chrpos: db    0    ;line position
  462. ascnt:    db    0    ;count of chars in ascii buffer
  463. ascptr: dw    ascbuf    ;pointer into ascii buffer
  464. ascbuf: ds    maxperline ;ascii buffer
  465.  
  466.     ds    50    ;stack space
  467. stack:            ;stk ptr save
  468.     end
  469. w    ascbuf    ;pointer into ascii buffer
  470. ascbuf: ds    maxperline ;ascii buffer
  471.  
  472.     ds    50    ;stack spac