/* simple hunk-dump program */ ENUM HUNK_UNIT=$3E7, HUNK_NAME, HUNK_CODE, HUNK_DATA, HUNK_BSS, HUNK_RELOC32, HUNK_RELOC16, HUNK_RELOC8, HUNK_EXT, HUNK_SYMBOL, HUNK_DEBUG, HUNK_END, HUNK_HEADER, HUNK_OVERLAY=$3F5, HUNK_BREAK ENUM ER_NONE,ER_FILE,ER_MEM,ER_USAGE,ER_HUNKID,ER_BREAK,ER_FILETYPE DEF flen,o:PTR TO LONG,mem,handle=NIL,hunkid,noreloc=TRUE,hunknr=-1,f=TRUE PROC main() WriteF('ShowHunk v0.1 (c) 1992 $#%!\n') IF StrCmp(arg,'',1) OR StrCmp(arg,'?',2) error(ER_USAGE) ELSE flen:=FileLength(arg) handle:=Open(arg,OLDFILE) IF (flen<1) OR (handle=NIL) error(ER_FILE) ELSE mem:=New(flen) IF mem=NIL error(ER_MEM) ELSE IF Read(handle,mem,flen)<>flen THEN error(ER_FILE) ELSE process() ENDIF ENDIF ENDIF error(ER_NONE) ENDPROC PROC process() DEF end,type o:=mem end:=o+flen IF (o[]<>HUNK_HEADER) AND (o[]<>HUNK_UNIT) THEN error(ER_FILETYPE) WriteF('Hunk layout of file "\s" (\d bytes)\n\n',arg,flen) WHILE oHUNK_UNIT) AND (hunkid<>HUNK_HEADER) AND (hunkid<>HUNK_BREAK) IF f WriteF('HUNK \d',hunknr) INC hunknr ENDIF f:=FALSE ENDIF IF type IF type=$4000 WriteF('\t** hunk forced to CHIP-mem\n') ELSE WriteF('\t** type: \d\n',type) ENDIF ENDIF SELECT hunkid CASE HUNK_UNIT; WriteF('\thunk_unit: '); name() CASE HUNK_NAME; WriteF('\thunk_name: '); name() CASE HUNK_CODE; WriteF('\thunk_code: \d bytes\n',skip()) CASE HUNK_DATA; WriteF('\thunk_data: \d bytes\n',skip()) CASE HUNK_BSS; WriteF('\thunk_bss: \d bytes\n',Mul(o[]++,4)) CASE HUNK_RELOC32; WriteF('\thunk_reloc32\n'); reloc() CASE HUNK_RELOC16; WriteF('\thunk_reloc16\n'); reloc() CASE HUNK_RELOC8; WriteF('\thunk_reloc8\n'); reloc() CASE HUNK_EXT; WriteF('\thunk_ext\n'); symbol() CASE HUNK_SYMBOL; WriteF('\thunk_symbol\n'); symbol() CASE HUNK_DEBUG; WriteF('\thunk_debug: \d bytes\n',skip()) CASE HUNK_END; f:=TRUE CASE HUNK_HEADER; WriteF('\thunk_header\n'); head() CASE HUNK_OVERLAY; WriteF('\thunk_overlay\n'); overlay(); CASE HUNK_BREAK; WriteF('\thunk_break\n'); hunknr:=1; f:=TRUE DEFAULT error(ER_HUNKID) ENDSELECT ENDWHILE IF noreloc THEN WriteF('\nPosition independant code!\n') ELSE WriteF('\n') ENDPROC PROC overlay() DEF m,ts ts:=o[]++ WriteF('\t tablesize = \d\n',ts) m:=o[]++-2 WriteF('\t max. level overlay tree uses = \d\n',m) o:=ts*4+o hunknr:=1; f:=TRUE ENDPROC PROC symbol() DEF t,l,s,c,r t:=Char(o); l:=Int(o+2); o:=o+4 WHILE l IF CtrlC() THEN error(ER_BREAK) IF t<4 /* sym def */ s:=o; o:=l*4+o; c:=o[]++; PutChar(o-4,0) WriteF('\t \s = $\h\n',s,c) ELSEIF t=130 /* common ref */ s:=o; o:=l*4+o; c:=o[]++; PutChar(o-4,0); r:=o[]++ WriteF('\t \s (\d refs) commonsize = \d\n',s,r,c) o:=r*4+o ELSE /* sym ref */ s:=o; o:=l*4+o; r:=o[]++; PutChar(o-4,0) WriteF('\t \s (\d refs)\n',s,r) o:=r*4+o ENDIF t:=Char(o); l:=Int(o+2); o:=o+4 ENDWHILE ENDPROC PROC head() DEF a,b a:=0 b:=o[a]++ WHILE b WriteF('\t libname: \s\n',o) a:=a+b b:=o[a]++ ENDWHILE b:=o[]++ hunknr:=o[]++ a:=o[]++-hunknr+1 WriteF('\t #of hunks: \d\n',a) o:=a*4+o ENDPROC PROC reloc() DEF a noreloc:=FALSE a:=o[]++ WHILE a IF CtrlC() THEN error(ER_BREAK) WriteF('\t \d reloc entries for hunk #\d\n',a,o[]++) o:=a*4+o a:=o[]++ ENDWHILE ENDPROC PROC name() DEF a a:=o[]++ WriteF('\s\n',o) o:=a*4+o ENDPROC PROC skip() DEF a a:=Mul(o[]++,4) o:=o+a ENDPROC a PROC error(nr) IF handle THEN Close(handle) WriteF('\n') SELECT nr CASE ER_FILE; WriteF('Could not read file "\s" !\n',arg) CASE ER_MEM; WriteF('No memory for hunks!\n') CASE ER_USAGE; WriteF('USAGE: showhunk \n') CASE ER_HUNKID; WriteF('Illegal hunk id: $\h !\n',hunkid) CASE ER_BREAK; WriteF('** BREAK: ShowHunk\n') CASE ER_FILETYPE; WriteF('Not an executable or object file.\n') ENDSELECT CleanUp(0) ENDPROC