|
DataMuseum.dkPresents historical artifacts from the history of: Rational R1000/400 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Rational R1000/400 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - download
Length: 5248 (0x1480) Types: TextFile Notes: R1k Text-file segment
└─⟦8527c1e9b⟧ Bits:30000544 8mm tape, Rational 1000, Arrival backup of disks in PAM's R1000 └─ ⟦cfc2e13cd⟧ »Space Info Vol 2« └─⟦3830b737a⟧ └─⟦this⟧
-- raw_dump -- -- This file provides two procedures, raw_dump_w_addr and raw_dump, both -- print out a dump of memory: -- ----------------------- -- procedure raw_dump_w_addr( -- addr: system.address; -- count: integer; -- p_addr: unsigned_types.unsigned_integer) -- -- Raw_dump_w_addr displays both the value and ascii interpretation of -- "count" bytes starting at "addr". The display is 16 bytes per line -- and each line is preceded by an address, which starts out as the value -- of p_addr and is incremented by 16 for each successive line. Here is -- some example output, preceded by "--": -- -- AAABBB: 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 "abcdefghijklmnop" -- AAABCB: 71 72 73 74 75 76 77 78 79 7A 41 42 43 44 45 46 "qrstuvwxyzABCDEF" -- -- There is an example test program at the bottom of this file that -- calls both of these subprograms. ----------------------- -- procedure raw_dump(addr: system.address; count: integer) -- -- Raw_dump prints count bytes starting at addr. See the comment -- at the end of the file for a couple of example calls on raw_dump. -- with hex; with system; use system; with text_io; with unchecked_conversion; with unsigned_types; procedure raw_dump_w_addr( addr: system.address; count: integer; p_addr: unsigned_types.unsigned_integer) is -- number of hex digits in an integer HEX_DIGITS: constant := integer'size / 4; left_to_do: integer := count; type byte is range 0..16#ff#; for byte'size use 8; type memline_rep is array (0..15) of byte; memline: memline_rep; mp: integer := 0; -- "char_star" is a reference to C, where the following two declarations -- would probably have been: -- -- char *byte_ptr; -- type char_star is access byte; byte_ptr: char_star; byte_val: integer; ptr_val: unsigned_types.unsigned_integer; pr_addr: unsigned_types.unsigned_integer := p_addr; val_count: integer := 0; line: string(1..80); lp: integer; procedure finish_line is begin if mp < 16 then for i in 1..(16-mp) * 3 loop line(lp) := ' '; lp := lp + 1; end loop; end if; line(lp) := '"'; lp := lp + 1; for i in 0..(mp-1) loop if integer(memline(i)) >= character'pos(' ') and integer(memline(i)) <= character'pos('~') then line(lp) := character'val(memline(i)); else line(lp) := '.'; end if; lp := lp + 1; end loop; line(lp) := '"'; end finish_line; function addr_to_ptr is new unchecked_conversion( source => system.address, target => char_star); use unsigned_types; function ptr_to_uint is new unchecked_conversion( source => char_star, target => unsigned_integer); function uint_to_ptr is new unchecked_conversion( source => unsigned_integer, target => char_star); begin byte_ptr := addr_to_ptr(addr); while left_to_do > 0 loop val_count := 16; if val_count > left_to_do then val_count := left_to_do; end if; left_to_do := left_to_do - val_count; line(1..HEX_DIGITS) := hex.unsigned_to_hex(pr_addr, HEX_DIGITS); pr_addr := pr_addr + unsigned_integer(val_count); line(HEX_DIGITS+1) := ':'; line(HEX_DIGITS+2) := ' '; lp := HEX_DIGITS+3; mp := 0; for ii in 1 .. val_count loop byte_val := integer(byte_ptr.all); memline(mp) := byte_ptr.all; mp := mp + 1; ptr_val := ptr_to_uint(byte_ptr); ptr_val := ptr_val + 1; byte_ptr := uint_to_ptr(ptr_val); line(lp..lp+1) := hex.integer_to_hex(byte_val, 2, '0'); line(lp+2) := ' '; lp := lp + 3; end loop; finish_line; text_io.put_line(line(1..lp)); end loop; end; with raw_dump_w_addr; with unchecked_conversion; with system; with unsigned_types; procedure raw_dump(addr: system.address; count: integer) is function a_to_u is new unchecked_conversion( source => system.address, target => unsigned_types.unsigned_integer); begin raw_dump_w_addr(addr, count, a_to_u(addr)); end; -- The following test program calls both raw_dump and raw_dump_w_addr -- and provides the listing shown on a machine with big-endian byte -- order (Sun3, Sun4, HP300). On a little-endian machine, some of -- the bytes will be reversed (VAX, PS/2, Symmetry, DECstation 3100) -- -- Note that the last 3 lines should be the same on any machine! -- -- EFFFC20: 11 00 EE FF 33 22 CC DD 55 44 AA BB 77 66 88 99 "....3"..UD..wf.." -- 3788: 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 "abcdefghijklmnop" -- 3798: 71 72 73 74 75 76 77 78 79 7A 41 42 43 44 45 46 "qrstuvwxyzABCDEF" -- 37A8: 31 32 33 34 35 "12345" -- AAABBB: 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 "abcdefghijklmnop" -- AAABCB: 71 72 73 74 75 76 77 78 79 7A 41 42 43 44 45 46 "qrstuvwxyzABCDEF" -- AAABDB: 31 32 33 34 35 "12345" -- --with raw_dump; --with raw_dump_w_addr; --with unsigned_types; --procedure test is -- type int4 is array(1..4) of integer; -- mem: int4 := (16#1100eeff#, 16#3322ccdd#, 16#5544aabb#, 16#77668899#); -- ccc: constant string := "abcdefghijklmnopqrstuvwxyzABCDEF12345"; --begin -- raw_dump(mem(1)'address, 16); -- raw_dump(ccc'address, ccc'last); -- -- raw_dump_w_addr(ccc'address, ccc'last, -- unsigned_types.unsigned_integer(16#aaabbb#)); --end