home *** CD-ROM | disk | FTP | other *** search
- ;
- ; Reldmp - Print dump of Microsoft relocatable file
- ;
- ; Syntax :
- ; reldmp object.rel
- ; Where :
- ; object.rel is the MICROSOFT Relocatable format file
- ; to dump.
- ;
- ; Originally Written By T. Stockman
- ;
- ; Extension Link Item Processing Added By D. Bloodgood
- ;
- .z80
- aseg
- bdos equ 5
- ifcb equ 5ch
- buf equ 80h
- cr equ 'M'-40h
- lf equ 'J'-40h
- cseg
- ;
- reldmp:: ld sp,(6) ;set stack
- ld a,79 ;set width
- ld (width),a
- sub a ;clear column
- ld (column),a
- ld de,ifcb ;open input file
- ld c,15
- call bdos
- inc a ;error if can't open
- ld de,opnmsg
- jp z,error
- sub a ;set to first sector
- ld (ifcb+32),a
- call filbuf ;prime input buffer
- ld (bytep),hl
- ld (bitc),de
- ld hl,0 ;clear record counter
- ld (record),hl
- rdmp0:: ld de,recmsg ;print out file position
- call pmsg
- ld a,(record+1)
- call phb
- ld a,(record)
- call phb
- ld de,bytmsg
- call pmsg
- ld hl,bitc+1
- ld a,80h
- sub (hl)
- call phb
- call endln0
- ld hl,0 ;clear loading location
- ld (loc),hl
- ld a,'''' ;clear loading loaction mode
- ld (locm),a
- ;
- ; rdmp - main program loop
- ;
- rdmp:: ld b,1 ;get item type bit
- call gbits
- or a ;jump if not absolute item
- jr nz,rdmp1
- ld a,2
- call lstnxt ;advance listing for another item
- ld b,8 ;get and print byte
- call gbits
- call phb
- ld hl,(loc) ;advance loading location
- inc hl
- ld (loc),hl
- jr rdmp
- ;
- rdmp1:: ld b,2 ;get item relocation mode
- call gbits
- or a ;jump if special link item
- jr z,rdmp2
- push af
- ld a,5
- call lstnxt ;advance listing for another item
- pop af
- call pafld0 ;let pafld worry about printing it
- ld hl,(loc) ;advance loading location
- inc hl
- inc hl
- ld (loc),hl
- jr rdmp
- ;
- rdmp2:: call endln ;end line if not at beginning of line
- ld b,4 ;get special item type
- call gbits
- push af
- ld hl,types ;print out item type
- call addmsg
- call pmsg
- pop af
- cp 4 ;B field only?
- jr c,rdmp3
- cp 5 ;Special Link Item
- jr c,rdmp31
- cp 8 ;both A and B fields?
- jr c,rdmp4
- cp 11 ;set location?
- jr z,rdmp5
- cp 14 ;check for end of program
- jr z,rdmp6
- cp 15 ;end of file?
- jr z,rdmp7
- call pafld ;print A field
- call endln0
- jr rdmp
- ;
- rdmp3:: call pbfld ;print B field
- call endln0
- jr rdmp
- ;
- rdmp31:: call pextlk
- call endln0
- jp rdmp
- ;
- rdmp4:: call pafld ;print A field
- ld a,' '
- call putc
- call pbfld ;print B field
- call endln0
- jp rdmp
- ;
- rdmp5:: call pafld ;print A field
- ld (loc),hl ;save loading location
- ld (locm),a ;save loading mode
- call endln0
- jp rdmp
- ;
- rdmp6:: call pafld ;print A field
- call endln0
- call endln0
- call endln0
- ld a,(bitc) ;force to next byte
- cp 8
- jp z,rdmp0
- ld b,a
- call gbits
- jp rdmp0
- ;
- rdmp7:: call endln
- jp 0
- ;
- ; pafld - print out "A" type field
- ;
- ; exit:: a = mode character ( '"!)
- ; hl = address
- ; uses:: af, bc, de, hl
- ; calls:: gbits, phb, putc
- ;
- pafld:: ld b,2 ;address mode
- pafld8:: call gbits
- ld b,' ' ;absolute mode?
- or a
- jr z,pafld1
- pafld0:: ld b,'''' ;program (code) relative?
- dec a
- jr z,pafld1
- ld b,'"' ;data relative?
- dec a
- jr z,pafld1
- ld b,'!' ;then it's common relative
- pafld1:: push bc ;save mode indicator
- ld b,8 ;get low byte of address
- call gbits
- push af ;save it
- ld b,8 ;get and print high byte of address
- call gbits
- ld h,a
- call phb
- pop af
- ld l,a
- call phb ;print low byte of address
- pop af
- jp putc ;print mode indicator
- ;
- ; pbfld - print out "B" type field
- ;
- ; uses:: af, bc, de, hl
- ; calls:: gbits, putc
- ;
- pbfld:: ld b,3 ;get symbol length
- call gbits
- or a ;return if zero length
- ret z
- ld b,a
- pbfld1:: push bc
- ld b,8 ;get a byte of symbol
- call gbits
- call putc ;print it
- pop bc
- djnz pbfld1
- ret
- ;
- ; pextlk - prints extension link item
- ;
- pextlk:: ld b,3 ;get length field
- call gbits
- push af ;save length
- ld b,8 ;get type
- call gbits
- sub 'A' ;convert to 0-2
- push af ;save type
- ld hl,extypes
- call addmsg
- call pmsg ;print message describing type
- pop af ;restore type ( 0-2 )
- cp 1 ;compare to 0,1 or 2
- jr c,extop ;have an operator
- jr z,extext ;have a label field
- ;
- ; Must have an local symbol
- ;
- pop af ;throw away length
- ld b,8 ;get 8 bits for type
- jp pafld8 ;print it as an A field
- ;
- ; Have an Operator
- ;
- extop:: pop af ;discard length
- ld b,8
- call gbits ;get operator
- ld hl,opertab ;operator table
- call addmsg
- jp pmsg ;print operator
- ;
- ; Must be a Symbol
- ;
- extext:: pop af ;restore count
- dec a ;account for type byte
- ld b,a ;into b for counter
- extex1:: push bc
- ld b,8 ;get a byte of symbol
- call gbits
- call putc ;print it
- pop bc
- djnz extex1
- ret
- ;
- ; gbits - get bits from rel file
- ;
- ; Note:: The following code must be executed before the first
- ; call to gbits (after openning the rel file) to "prime"
- ; the input buffer.
- ;
- ; call filbuf
- ; ld (bytep),hl
- ; ld (bitc),de
- ;
- ; entry:: b = # of bits to get (1 - 8)
- ; exit:: a = assembled bits (right justified)
- ; uses:: af, bc, de, hl
- ; calls:: filbuf
- ;
- gbits:: ld hl,(bytep) ;get current pos'n
- ld de,(bitc)
- xor a ;clear assembly register
- gbit1:: rlc (hl) ;move a bit into the assembly
- rla
- dec e ;skip advance if still bits in this byte
- jr nz,gbit2
- ld e,8 ;reset bit counter
- inc hl ;advance byte pointer
- dec d ;refill buffer if last byte
- call z,filbuf
- gbit2:: djnz gbit1 ;loop if more bits needed
- ld (bytep),hl ;save pos'n
- ld (bitc),de
- ret
- ;
- ; filbuf - fill input buffer from rel file
- ;
- ; exit:: d = 128 (# bytes in buffer)
- ; e = 8 (# bits in byte)
- ; hl = fwa buffer
- ; uses:: de, hl
- ; calls:: bdos, error
- ;
- filbuf:: push af
- push bc
- ld de,ifcb ;read a sector
- ld c,20
- call bdos
- or a ;trap errors
- ld de,rdmsg
- jp nz,error
- pop bc
- pop af
- ld hl,(record) ;increment record count
- inc hl
- ld (record),hl
- ld hl,buf ;set pointers for return
- ld de,128*256+8
- ret
- ;
- ; lstnxt - advance listing for next item
- ;
- ; entry:: a = # columns item will occupy
- ; uses:: af, bc
- ; calls:: endln, phb, putc
- ;
- lstnxt:: push af
- inc a ;add one column for the space
- ld bc,(column) ;go print location if beginning of line
- inc c
- dec c
- jr z,lstn2
- add a,c ;try adding item on this line
- ld bc,(width) ;jump if line would be too wide
- cp c
- jr nc,lstn1
- ld (column),a ;update column counter
- pop af
- ld a,' ' ;push out a space
- jp putc
- ;
- lstn1:: call endln0 ;go to the next line
- lstn2:: pop bc
- ld a,(loc+1) ;print out the loading location
- call phb
- ld a,(loc)
- call phb
- ld a,(locm)
- call putc
- ld a,' ' ;space over
- call putc
- call putc
- ld a,7 ;init column counter
- add a,b ;add in width of this item
- ld (column),a
- ret
- ;
- ; endln - end the current listing line
- ;
- ; uses:: af
- ; calls:: putc
- ;
- endln:: ld a,(column) ;return if already at beginning of line
- or a
- ret z
- endln0:: sub a ;clear column counter
- ld (column),a
- ld a,cr
- call putc
- ld a,lf
- jp putc
- ;
- ; amsgadd - return pointer to the a'th message in table
- ; at (de)
- ;
- addmsg:: ld d,0
- ld e,a
- add hl,de
- add hl,de ;get to table entry
- ld e,(hl)
- inc hl
- ld d,(hl)
- ret
- pmsg:: ld a,(de)
- call putc
- bit 7,a
- ret nz
- inc de
- jr pmsg
- ;
- phb:: push psw
- rrca
- rrca
- rrca
- rrca
- call phb1
- pop psw
- phb1:: and 0fh
- add a,90h
- daa
- adc a,40h
- daa
- ; jr putc
- ;
- putc:: push af
- push bc
- push de
- push hl
- and 7fh
- ld e,a
- ld c,2
- call bdos
- pop hl
- pop de
- pop bc
- pop af
- ret
- ;
- error:: ld c,9
- call bdos
- jp 0
- ;
- ; Special link item types
- ;
- types:: dw type0,type1,type2,type3
- dw type4,type5,type6,type7
- dw type8,type9,type10,type11
- dw type12,type13,type14,type15
- ;
- type0:: dc 'Entry Symbol='
- type1:: dc 'Common Block='
- type2:: dc 'Program Name='
- type3:: dc 'Search Library='
- type4:: dc 'Extension Link Item '
- type5:: dc 'Common Size='
- type6:: dc 'Chain External='
- type7:: dc 'Entry Point='
- type8:: dc 'External-Offset='
- type9:: dc 'External+Offset='
- type10:: dc 'Data Area Size='
- type11:: dc 'Loading Location='
- type12:: dc 'Chain Address='
- type13:: dc 'Program Size='
- type14:: dc 'End Program, Xfer='
- type15:: dc 'End of File'
- ;
- extypes:: dw etype0,etype1,etype2
- etype0:: dc 'Operator = '
- etype1:: dc 'External = '
- etype2:: dc 'Local Symbol = '
- ;
- opertab:: dw op0,op1,op2,op3,op4,op5,op6,op7
- dw op8,op9,opa,opb
- op0: dc '???'
- op1: dc 'Store Byte'
- op2: dc 'Store Word'
- op3: dc 'High'
- op4: dc 'Low'
- op5: dc '???'
- op6: dc '???'
- op7: dc '-'
- op8: dc '+'
- op9: dc '*'
- opa: dc '/'
- opb: dc 'Mod'
- ;
- recmsg:: dc '+ Record='
- bytmsg:: dc ' Byte='
- ;
- opnmsg:: db 'Can''t open input file$'
- rdmsg:: db 'Read error$'
- ;
- loc:: ds 2 ;current loading location
- locm:: ds 1 ;loading location mode
- record:: ds 2 ;current record of rel file
- bytep:: ds 2 ;input byte pointer
- bitc:: ds 2 ;bit counter + byte counter
- column:: ds 1 ;current output column
- width:: ds 1 ;maximum output width
- ;
- end reldmp
-
- 0B>