dmp86: proc options(main); /* dump 8086 relocatable object file */ %replace true by '1'b, false by '0'b; /* 80h THEADR T-module header 82h LHEADR L-module header 84h PEDATA Physical Enumerated Data 86h PIDATA Physical Iterated Data 88h HEX-88 8ah MODEND Module end 8ch HEX-8C 8eh HEX-8E 90h HEX-90 92h HEX-92 94h HEX-94 98h HEX-98 9ah HEX-9A 9ch HEX-9C */ dcl rec_hex(0:14) bit(8) static initial ('00'b4, '80'b4, '82'b4, '84'b4, '86'b4, '88'b4, '8A'b4, '8C'b4, '8E'b4, '90'b4, '92'b4, '94'b4, '98'b4, '9A'b4, '9C'b4), rec_sym(0:14) char(6) static initial ('BADREC', 'THEADR','LHEADR','PEDATA','PIDATA', 'HEX-88','MODEND','HEX-8C','HEX-8E', 'HEX-90','HEX-92','HEX-94','HEX-98', 'HEX-9A','HEX-9C'); dcl module file; dcl buffer (0:127) fixed(7), b_inx fixed(15); dcl line char(254) var; dcl b bit(8), c char(1), i fixed, mod_eof bit, check_sum fixed(7), rec_type fixed(7), rec_inx fixed(7), rec_len fixed(15); on undefinedfile(module) begin; put skip list('Missing Input File'); stop; end; open file(module) keyed title('$1.$1') env(f(128),b(4096)); on endfile(module) begin; put skip list('Premature EOF'); stop; end; b_inx = hbound(buffer,1) + 1; mod_eof = false; do while (^mod_eof); /* get next record */ check_sum = 0; rec_len = 32767; rec_type = lod_byte(); rec_len = lod_word(); i = match_rec(); put edit(unspec(rec_type),rec_sym(i)) (skip,b4(2),x(2),a); go to case(i); case(0): /* BADREC */ go to clear_rec; case(1): /* THEADR */ line = ' T-Module Name ' || lod_sym(); go to put_line; case(2): /* LHEADR */ line = ' L-Module Name ' || lod_sym(); go to put_line; case(3): /* PEDATA */ go to data_rec; case(4): /* PIDATA */ go to data_rec; case(5): /* HEX-88 */ go to clear_rec; case(6): /* MODEND */ mod_eof = true; go to clear_rec; case(7): /* HEX-8C */ go to clear_rec; case(8): /* HEX-8E */ go to clear_rec; case(9): /* HEX-90 */ go to clear_rec; case(10): /* HEX-92 */ go to clear_rec; case(11): /* HEX-94 */ go to clear_rec; case(12): /* HEX-98 */ go to clear_rec; case(13): /* HEX-9A */ go to clear_rec; case(14): /* HEX-9C */ go to clear_rec; data_rec: put edit(' Frame',lod_addr(),' Offset',gnb()) (a,b4(5),a,b4(3)); go to clear_rec; put_line: put list(line); clear_rec: do while (rec_len > 1); put edit(' ') (skip,a); line = ''; do rec_type = 1 to 16 while(rec_len > 1); b = lod_bit8(); put edit (b) (x(1),b4); if b < '80'b4 & b >= '20'b4 then unspec(c) = b; else c = '.'; line = line || c; end; put edit(line) (x(1),a); end; /* read the checksum information */ rec_type = lod_byte(); if check_sum ^= 0 then put skip list('** Check Sum Error **'); end; stop; match_rec: proc returns(fixed); dcl i fixed; do i = 1 to hbound(rec_hex,1); if rec_hex(i) = unspec(rec_type) then return (i); end; return (0); end match_rec; lod_sym: proc returns(char(254) var); dcl (i,len) fixed(7), x char(254) var; x = ''; len = lod_byte(); if len < 0 then return ('** Bad Symbol **'); do i = 1 to len; x = x || lod_char(); end; return(x); end lod_sym; lod_char: proc returns(char(1)); dcl x char(1); unspec(x) = lod_bit8(); return (x); end lod_char; lod_byte: proc returns(fixed(7)); return (gnf()); end lod_byte; lod_bit8: proc returns (bit(8)); return (gnb()); end lod_bit8; lod_word: proc returns (fixed(15)); dcl x fixed(15); unspec(x) = lod_addr(); return (x); end lod_word; lod_addr: proc returns(bit(16)); dcl x bit(8); x = gnb(); return (gnb() || x); end lod_addr; gnb: proc returns(bit(8)); dcl x fixed(7); x = gnf(); return (unspec(x)); end gnb; gnf: proc returns(fixed(7)); dcl x fixed(7); if b_inx > hbound(buffer,1) then do; read file(module) into(buffer); b_inx = 0; end; x = buffer(b_inx); check_sum = check_sum + x; b_inx = b_inx + 1; rec_len = rec_len - 1; if rec_len = -1 then put skip list('** Read Past EOR **'); return (x); end gnf; end dmp86;