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
Wrap
Assembly Source File
|
1994-01-28
|
9KB
|
472 lines
title 'RELDUMP version 1.1'
;
; 2/24/81 added ascii display to absolute lines (RGF)
;
; Program to dump Microsoft format
; rel files field by field
; with field comments
;
; See Microsoft 'linking loader' manual
; for more information on .rel files
;
;
; Requires Digital Research 'MAC'
; assembler, or alternatively, you
; can expand the macros and use
; the cp/m assembler 'asm'.
;
;
; 8/22/80 by Ron Fowler
; Westland, Mich.
;
cr equ 13
lf equ 10
bdos equ 5
fcb equ 5ch
buf equ 80h
;
cifnc equ 1
prtchr equ 2
printf equ 9
cstsf equ 11
openf equ 15
readf equ 20
;
maxperline equ 16 ;abs items per line
;
; define some macros
;
pchar macro x
if not nul x
mvi a,x
endif
call outchr
endm
;
print macro string
local overstring
call overstring
db string
overstring:
pop d
mvi c,printf
call bdos
endm
;
bits macro num
mvi b,num
call getbits
endm
page
;
; get local stack and
; set up fcb
;
ORG 100H
;
base: lxi h,0
dad sp
shld stack
lxi sp,stack
lda fcb+9 ;look at filetype
cpi ' ' ;see if type specified
jnz sk1 ;jmp if so
lxi h,'RE' ;part of 'REl'
shld fcb+9 ;store into fcb
mvi a,'L' ;rest of 'reL'
sta fcb+11
sk1: mvi c,openf ;open the .rel file
lxi d,fcb
call bdos
cpi 0ffh ;should not be
jnz main ;jump if not
call msgxit ;else say can't find
db 'File not found.$'
page
;
; main work loop
;
main: call item ;identify one item
jc done ;cy is eof indicator
call stop ;console says stop?
jnc main ;continue if not
done: call msgxit ;else print 'done'
db cr,lf,'done.$'
;
stop: mvi c,cstsf
call bdos
ora a
rz
mvi c,cifnc
call bdos
cpi 'C'-40h ;control-c?
stc ;says stop
rz
cmc ;false char
ret
page
;
; decode an item
;
item: bits 1 ;get first bit of item
ora a ;test for zero
jnz not$abs ;not zero, jmp for rel
lxi h,relflg
mov a,m
mvi m,0
ora a
jz cont1
call crlf
mvi a,maxperline+1
sta abscnt
cont1: lxi h,abscnt ;line up abs values
mov a,m
inr a
mov m,a
cpi maxperline
jc lnok ;max values per line
xra a
mov m,a
call dmpasc ;show values in ascii
call crlf
print 'ABS: $'
mvi a,4
sta chrpos
lnok: bits 8 ;get 8 absolute bits
lhld ascptr
mov m,a ;save for later asc disp
inx h
shld ascptr
lxi h,ascnt ;increment count
inr m
call hexout
pchar ' '
ora a ;no eof yet
ret
;
not$abs:
call dmpasc ;dump ABS ascii if any
call crlf
call crlf
mvi a,0ffh ;idntfy rel iterm
sta relflg
mvi a,maxperline+1 ;make new abs line
sta abscnt
print 'REL: type $'
bits 2 ;get rel type spec
push psw
call hexout
pop psw
ora a
jz spl ;0 is special type
dcr a
jz prgrel ;1 is program relative
dcr a
jz datrel ;2 is data relative
;
; must be 3, common relative
;
print ', com rel, val=$'
jmp prnt16
prgrel: print ', prg rel, val=$'
jmp prnt16
datrel: print ', dat rel, val=$'
prnt16: bits 8 ;get rel byte
push psw ;save lst sig byte
bits 8 ;next
call hexout ;print most sig
pop psw
call hexout ;print least sig
pchar ' ' ;print a space
ora a ;not eof yet
ret
page
;
; handle special relative field
;
spl: print ', (special), ctrl fld=$'
bits 4 ;spl fld has..
sta ctrlfld ;..4 bits
push psw
call hexout ;print it
print ', $'
pop psw
mov l,a
mvi h,0 ;ctl fld in hl
dad h ;offset for table
lxi d,msgtable
dad d
mov e,m ;get lo byte
inx h
mov d,m ;de has field msg
mvi c,printf
call bdos ;identify type
lda ctrlfld ;get control byte
cpi 15 ;15 is eof
stc ;so say so
rz
push psw ;new lin for a & b flds
call crlf
print ' $';tab over
pop psw
cpi 4+1 ;type 0-4 has no a fld
jc bonly
call afield ;show the a field
lda ctrlfld
cpi 14 ;end program...
jnz not14 ;..forces byte boundary
call refill ;go next byte
ora a ;return cy clr
ret
not14: cpi 9 ;type 9-15 has no b
rnc
bonly: call bfield
ora a ;say no eof
ret
page
;
; handle special rel fields
;
afield: print 'a fld type: $'
bits 2 ;get the a field
push psw
call hexout ;print it
print ', $' ;make a comma,spc
pop psw ;get back a field
ora a ;examine it for type
jz absad ;0=absolute adrs
dcr a
jz prg2 ;1=program rel
dcr a
jz data2 ;2=data rel
;
; must be common relative
;
print '(common rel) value= $'
jmp prnt16
data2: print '(data rel) value= $'
jmp prnt16
prg2: print '(prog rel) value= $'
jmp prnt16
absad: print '(absolute) value= $'
jmp prnt16
;
bfield: bits 3 ;get b-field size
mov e,a ;make a counter
pchar '"' ;enclose in quotes
bsym: mov a,e ;when e is zero
ora a ;then we are done
jz brout
dcr e ;count down
bits 8 ;get sym char
pchar ;print it
jmp bsym ;loop till done
brout: pchar '"' ;close quotes
ret
page
;
;*************************
;* subroutines *
;*************************
;
;
; get number of bits from
; input stream as in b reg
;
getbits:
push h
push d
xra a ;zero our byte
bitlop: call nxtbit ;next bit into cy flg
ral ;shift into our byte
dcr b ;count down
jnz bitlop
pop d
pop h
ret
;
; get next bit from input stream
;
nxtbit: push b
mov b,a ;can't alter a
lda bitcnt ;any left this byte?
ora a
cz refill ;get another if not
dcr a
sta bitcnt ;update for nxt time
lda char ;current byte
ral ;bit into cy
sta char
mov a,b ;restore accumulator
pop b
ret
;
; get the next byte from input buffer
;
refill: push b
lda bufptr
cpi 80h ;see if buf empty
cz diskrd ;fill if so
mov l,a
mvi h,0 ;form 16 bits
inr a ;update buf pntr
sta bufptr
lxi d,buf
dad d ;point into buffer
mov a,m ;reach in and get byte
sta char ;save it
mvi a,8 ;new bit count
sta bitcnt
pop b
ret
;
; read next sector from file
;
diskrd: mvi c,readf
lxi d,fcb
call bdos
cpi 0ffh ;should not be..
mvi a,0 ;..early eof
rnz
call msgxit ;oops!
db '??? Unexpected end of file.$'
;
; print message pointed
; to by tos then exit
;
msgxit: pop d
mvi c,printf
call bdos
lhld stack
sphl
ret ;to ccp
crlf: mvi a,cr
call outx
mvi a,lf
call outx
lda lincnt
inr a
sta lincnt
cpi 61 ;lines/page
rnz
mvi b,6 ;lines to nxt page
formfd: mvi a,lf
call outx ;<<<
dcr b
jnz formfd
mvi a,1 ;say first line
sta lincnt
ret
hexout: push psw
rar
rar
rar
rar
call nybble
pop psw
nybble: ani 0fh
cpi 10
jc xnum
adi 7
xnum: adi '0'
pchar
ret
page
;
; print char in a (called from
; macros only).
;
outchr: cpi ' ' ;check for printable..
jnc chka ;..characters, make...
fix: mvi a,'.' ;...non-printing chars....
chka: cpi 7fh ;....dots
jnc fix
outx: push h
push d
push b
mvi c,prtchr
mov e,a
call bdos
lxi h,chrpos
inr m ;increment line pos
pop b
pop d
pop h
ret
;
; dump the ascii buffer (used
; in ABS dumps only)
;
dmpasc: lda ascnt
ora a ;see if zero count
mov b,a ;save count in b
jz gobk ;do nothing if no count
tab: lda chrpos ;see where on line we are
cpi maxperline*3+10
jz dmp1 ;tabbed over, then jump
pchar ' ' ;else keep tabbing
jmp tab
dmp1: lxi h,ascbuf
dmplp: mov a,m ;pick up char
inx h ;point past
pchar ;print it
dcr b
jnz dmplp
gobk: xra a ;get zero in accumulator
sta ascnt ;zero count
sta chrpos ;and line position
lxi h,ascbuf ;reset ascii buffer pointer
shld ascptr
ret
;
; table of control-field
; type messages
;
msgtable:
dw m0,m1,m2,m3
dw m4,m5,m6,m7
dw m8,m9,m10,m11
dw m12,m13,m14,m15
;
; the messages:
;
m0: db '* entry symbol *$'
m1: db '* sel com blk *$'
m2: db '* program name *$'
m3: db '* request library search *$'
m4: db '* extension link item *$'
m5: db '* common size *$'
m6: db '* chain external *$'
m7: db '* define entry point *$'
m8: db '* external - offset *$'
m9: db '* external + offset *$'
m10: db '* define data size *$'
m11: db '* set loc counter *$'
m12: db '* chain address *$'
m13: db '* program size *$'
m14: db '* end program *$'
m15: db '* end of file *$'
page
;
; variables
;
bufptr: db 80h ;force initial read
bitcnt: db 0 ;and empty char
char: db 0
ctrlfld: db 0
abscnt: db maxperline+1 ;force initial crlf
lincnt: db 1 ;start paper at line 1
relflg: db 0
db 0
chrpos: db 0 ;line position
ascnt: db 0 ;count of chars in ascii buffer
ascptr: dw ascbuf ;pointer into ascii buffer
ascbuf: ds maxperline ;ascii buffer
ds 50 ;stack space
stack: ;stk ptr save
end
w ascbuf ;pointer into ascii buffer
ascbuf: ds maxperline ;ascii buffer
ds 50 ;stack spac