Not logged in

Artifact 254a8f6ffa7cb5376a2fe61c73a911496abd1c22:

File autopsy.rx part of check-in [7326d0b4e8] - autopsy: add ":see" for non-parsing usage of decompiler by charleschilders on 2011-04-02 21:04:16. [annotate]


0000: 28 20 41 75 74 6f 70 73 79 20 2d 2d 2d 2d 2d 2d  ( Autopsy ------
0010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 29 0a  ------------- ).
0050: 28 20 43 6f 70 79 72 69 67 68 74 20 5b 63 5d 20  ( Copyright [c] 
0060: 32 30 31 30 20 2d 20 32 30 31 31 2c 20 43 68 61  2010 - 2011, Cha
0070: 72 6c 65 73 20 43 68 69 6c 64 65 72 73 20 20 20  rles Childers   
0080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29 0a                ).
00a0: 28 20 43 6f 70 79 72 69 67 68 74 20 5b 63 5d 20  ( Copyright [c] 
00b0: 32 30 31 31 2c 20 4d 61 72 63 20 53 69 6d 70 73  2011, Marc Simps
00c0: 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  on              
00d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
00e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29 0a                ).
00f0: 28 20 4c 69 63 65 6e 73 65 3a 20 49 53 43 20 20  ( License: ISC  
0100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29 0a                ).
0140: 28 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ( --------------
0150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 29 0a  ------------- ).
0190: 6e 65 65 64 73 20 64 69 73 73 65 63 74 27 0a 0a  needs dissect'..
01a0: 63 68 61 69 6e 3a 20 61 75 74 6f 70 73 79 27 0a  chain: autopsy'.
01b0: 20 20 3a 20 64 65 63 6f 6d 70 69 6c 65 20 20 28    : decompile  (
01c0: 20 61 2d 61 20 29 20 20 64 75 70 20 5e 64 69 73   a-a )  dup ^dis
01d0: 73 65 63 74 27 64 65 63 6f 6d 70 69 6c 65 20 73  sect'decompile s
01e0: 77 61 70 20 22 25 64 20 25 73 5c 6e 22 20 70 75  wap "%d %s\n" pu
01f0: 74 73 20 31 2b 20 3b 0a 0a 28 20 2d 2d 5b 20 42  ts 1+ ;..( --[ B
0200: 6f 78 20 44 72 61 77 69 6e 67 20 43 6f 64 65 20  ox Drawing Code 
0210: 5d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ]---------------
0220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0240: 2d 2d 2d 2d 2d 2d 20 29 0a 0a 28 20 2d 2d 5b 20  ------ )..( --[ 
0250: 42 6f 78 20 67 65 6f 6d 65 74 72 79 20 5d 2d 2d  Box geometry ]--
0260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0280: 2d 2d 2d 2d 2d 2d 2d 2d 20 29 0a 31 36 20 76 61  -------- ).16 va
0290: 72 69 61 62 6c 65 3a 20 62 6f 78 57 69 64 74 68  riable: boxWidth
02a0: 0a 20 34 20 76 61 72 69 61 62 6c 65 3a 20 62 6f  . 4 variable: bo
02b0: 78 4d 61 72 67 69 6e 0a 20 34 20 76 61 72 69 61  xMargin. 4 varia
02c0: 62 6c 65 3a 20 62 6f 78 2f 6c 69 6e 65 0a 0a 7b  ble: box/line..{
02d0: 7b 0a 20 20 28 20 2d 2d 5b 20 43 6f 72 65 20 5d  {.  ( --[ Core ]
02e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
02f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0310: 20 29 0a 0a 20 20 3a 20 70 75 74 63 73 20 20 20   )..  : putcs   
0320: 20 28 20 63 6e 2d 20 20 29 20 20 20 5b 20 64 75   ( cn-  )   [ du
0330: 70 20 70 75 74 63 20 5d 20 74 69 6d 65 73 20 64  p putc ] times d
0340: 72 6f 70 20 3b 0a 0a 20 20 3a 20 70 61 64 43 6f  rop ;..  : padCo
0350: 75 6e 74 20 20 28 20 6e 2d 6e 20 29 20 20 20 40  unt  ( n-n )   @
0360: 62 6f 78 57 69 64 74 68 20 40 62 6f 78 4d 61 72  boxWidth @boxMar
0370: 67 69 6e 20 2d 20 73 77 61 70 20 2d 20 3b 0a 20  gin - swap - ;. 
0380: 20 3a 20 2e 70 61 64 20 20 20 20 20 20 28 20 6e   : .pad      ( n
0390: 2d 6e 20 29 20 20 20 70 61 64 43 6f 75 6e 74 20  -n )   padCount 
03a0: 33 32 20 73 77 61 70 20 70 75 74 63 73 20 3b 0a  32 swap putcs ;.
03b0: 20 20 3a 20 2e 70 61 64 73 20 20 20 20 20 28 20    : .pads     ( 
03c0: 24 2d 20 20 29 20 20 20 77 69 74 68 4c 65 6e 67  $-  )   withLeng
03d0: 74 68 20 73 77 61 70 20 70 75 74 73 20 2e 70 61  th swap puts .pa
03e0: 64 20 3b 0a 20 20 3a 20 2e 6e 75 6d 62 65 72 20  d ;.  : .number 
03f0: 20 20 28 20 6e 2d 20 20 29 20 20 20 74 6f 53 74    ( n-  )   toSt
0400: 72 69 6e 67 20 2e 70 61 64 73 20 3b 0a 0a 20 20  ring .pads ;..  
0410: 3a 20 2e 62 6f 78 65 64 6e 20 20 20 28 20 6e 2d  : .boxedn   ( n-
0420: 20 20 29 20 20 20 27 7c 20 70 75 74 63 20 73 70    )   '| putc sp
0430: 61 63 65 20 2e 6e 75 6d 62 65 72 20 73 70 61 63  ace .number spac
0440: 65 20 27 7c 20 70 75 74 63 20 3b 0a 20 20 3a 20  e '| putc ;.  : 
0450: 2e 65 6d 70 74 79 20 20 20 20 28 20 20 2d 20 20  .empty    (  -  
0460: 29 20 20 20 27 7c 20 70 75 74 63 20 2d 32 20 2e  )   '| putc -2 .
0470: 70 61 64 20 27 7c 20 70 75 74 63 20 3b 0a 0a 20  pad '| putc ;.. 
0480: 20 3a 20 78 74 2d 3e 6e 61 6d 65 20 20 28 20 24   : xt->name  ( $
0490: 2d 24 20 29 20 20 20 74 6f 4e 75 6d 62 65 72 20  -$ )   toNumber 
04a0: 78 74 2d 3e 64 20 64 75 70 20 5b 20 64 2d 3e 6e  xt->d dup [ d->n
04b0: 61 6d 65 20 5d 20 5b 20 64 72 6f 70 20 22 22 20  ame ] [ drop "" 
04c0: 5d 20 69 66 20 3b 0a 0a 20 20 76 61 72 69 61 62  ] if ;..  variab
04d0: 6c 65 20 65 73 63 43 65 6c 6c 0a 20 20 3a 20 6c  le escCell.  : l
04e0: 6f 6f 6b 75 70 20 20 20 20 28 20 61 2d 24 20 29  ookup    ( a-$ )
04f0: 0a 20 20 20 20 40 65 73 63 43 65 6c 6c 0a 20 20  .    @escCell.  
0500: 20 20 5b 20 74 6f 53 74 72 69 6e 67 20 65 73 63    [ toString esc
0510: 43 65 6c 6c 20 6f 66 66 20 5d 0a 20 20 20 20 5b  Cell off ].    [
0520: 20 5e 64 69 73 73 65 63 74 27 6c 6f 6f 6b 75 70   ^dissect'lookup
0530: 4f 70 63 6f 64 65 20 5b 20 5b 20 65 73 63 43 65  Opcode [ [ escCe
0540: 6c 6c 20 6f 6e 20 5d 20 69 66 54 72 75 65 20 5d  ll on ] ifTrue ]
0550: 20 5b 20 64 72 6f 70 20 78 74 2d 3e 6e 61 6d 65   [ drop xt->name
0560: 20 5d 20 69 66 20 5d 20 69 66 20 3b 0a 20 20 3a   ] if ] if ;.  :
0570: 20 2e 6c 6f 6f 6b 75 70 20 20 20 28 20 61 2d 20   .lookup   ( a- 
0580: 20 29 20 27 7c 20 70 75 74 63 20 73 70 61 63 65   ) '| putc space
0590: 20 6c 6f 6f 6b 75 70 20 2e 70 61 64 73 20 73 70   lookup .pads sp
05a0: 61 63 65 20 27 7c 20 70 75 74 63 20 3b 0a 0a 20  ace '| putc ;.. 
05b0: 20 3a 20 2e 66 69 6c 6c 20 20 20 20 20 28 20 63   : .fill     ( c
05c0: 2d 20 20 29 20 40 62 6f 78 57 69 64 74 68 20 40  -  ) @boxWidth @
05d0: 62 6f 78 4d 61 72 67 69 6e 20 32 20 2d 20 2d 20  boxMargin 2 - - 
05e0: 70 75 74 63 73 20 3b 0a 20 20 3a 20 2e 65 64 67  putcs ;.  : .edg
05f0: 65 20 20 20 20 20 28 20 20 2d 20 20 29 20 27 2b  e     (  -  ) '+
0600: 20 70 75 74 63 20 27 2d 20 2e 66 69 6c 6c 20 27   putc '- .fill '
0610: 2b 20 70 75 74 63 20 3b 0a 20 20 3a 20 2e 72 75  + putc ;.  : .ru
0620: 6c 65 20 20 20 20 20 28 20 20 2d 20 20 29 20 27  le     (  -  ) '
0630: 7c 20 70 75 74 63 20 27 2d 20 2e 66 69 6c 6c 20  | putc '- .fill 
0640: 27 7c 20 70 75 74 63 20 3b 0a 0a 20 20 28 20 2d  '| putc ;..  ( -
0650: 2d 5b 20 44 69 61 67 72 61 6d 20 66 6f 72 20 4e  -[ Diagram for N
0660: 20 63 6f 6e 74 69 67 75 6f 75 73 20 63 65 6c 6c   contiguous cell
0670: 73 20 5d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  s ]-------------
0680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 29 0a 0a 20 20 36  --------- )..  6
0690: 20 63 6f 6e 73 74 61 6e 74 20 62 6f 78 52 6f 77   constant boxRow
06a0: 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s               
06b0: 20 20 63 72 65 61 74 65 20 62 6f 78 74 62 6c 20    create boxtbl 
06c0: 62 6f 78 52 6f 77 73 20 61 6c 6c 6f 74 0a 0a 20  boxRows allot.. 
06d0: 20 62 6f 78 74 62 6c 20 76 61 72 69 61 62 6c 65   boxtbl variable
06e0: 3a 20 63 75 72 72 65 6e 74 52 6f 77 0a 20 20 3a  : currentRow.  :
06f0: 20 62 6f 78 52 6f 77 2c 20 40 63 75 72 72 65 6e   boxRow, @curren
0700: 74 52 6f 77 20 21 20 63 75 72 72 65 6e 74 52 6f  tRow ! currentRo
0710: 77 20 2b 2b 20 3b 0a 0a 20 20 5b 20 28 20 61 2d  w ++ ;..  [ ( a-
0720: 20 29 20 2e 65 64 67 65 20 64 72 6f 70 20 20 20   ) .edge drop   
0730: 3b 20 5d 20 62 6f 78 52 6f 77 2c 0a 20 20 5b 20  ; ] boxRow,.  [ 
0740: 28 20 61 2d 20 29 20 2e 62 6f 78 65 64 6e 20 20  ( a- ) .boxedn  
0750: 20 20 20 20 3b 20 5d 20 62 6f 78 52 6f 77 2c 0a      ; ] boxRow,.
0760: 20 20 5b 20 28 20 61 2d 20 29 20 2e 72 75 6c 65    [ ( a- ) .rule
0770: 20 64 72 6f 70 20 20 20 3b 20 5d 20 62 6f 78 52   drop   ; ] boxR
0780: 6f 77 2c 0a 20 20 5b 20 28 20 61 2d 20 29 20 40  ow,.  [ ( a- ) @
0790: 20 2e 62 6f 78 65 64 6e 20 20 20 20 3b 20 5d 20   .boxedn    ; ] 
07a0: 62 6f 78 52 6f 77 2c 0a 20 20 5b 20 28 20 61 2d  boxRow,.  [ ( a-
07b0: 20 29 20 40 20 2e 6c 6f 6f 6b 75 70 20 20 20 20   ) @ .lookup    
07c0: 3b 20 5d 20 62 6f 78 52 6f 77 2c 0a 20 20 5b 20  ; ] boxRow,.  [ 
07d0: 28 20 61 2d 20 29 20 2e 65 64 67 65 20 64 72 6f  ( a- ) .edge dro
07e0: 70 20 20 20 3b 20 5d 20 62 6f 78 52 6f 77 2c 0a  p   ; ] boxRow,.
07f0: 0a 20 20 3a 20 28 2e 72 6f 77 29 20 20 28 20 61  .  : (.row)  ( a
0800: 71 6e 2d 61 71 6e 20 29 0a 20 20 20 20 72 65 70  qn-aqn ).    rep
0810: 65 61 74 20 64 75 70 20 30 20 3d 20 69 66 3b 0a  eat dup 0 = if;.
0820: 20 20 20 20 5b 20 6f 76 65 72 20 31 2b 20 5b 20      [ over 1+ [ 
0830: 74 75 63 6b 20 64 6f 20 5d 20 64 69 70 20 73 77  tuck do ] dip sw
0840: 61 70 20 5d 20 64 69 70 20 31 2d 20 61 67 61 69  ap ] dip 1- agai
0850: 6e 20 3b 0a 0a 20 20 3a 20 2e 72 6f 77 20 20 20  n ;..  : .row   
0860: 20 28 20 61 71 6e 2d 20 20 20 20 29 20 63 72 20   ( aqn-    ) cr 
0870: 28 2e 72 6f 77 29 20 32 64 72 6f 70 20 64 72 6f  (.row) 2drop dro
0880: 70 20 3b 0a 0a 20 20 3a 20 28 2e 63 65 6c 6c 73  p ;..  : (.cells
0890: 29 20 28 20 61 6e 2d 20 29 0a 20 20 20 20 30 20  ) ( an- ).    0 
08a0: 72 65 70 65 61 74 20 64 75 70 20 62 6f 78 52 6f  repeat dup boxRo
08b0: 77 73 20 3d 20 69 66 3b 20 64 75 70 20 31 2b 0a  ws = if; dup 1+.
08c0: 20 20 20 20 5b 20 28 20 61 6e 6e 20 29 20 62 6f      [ ( ann ) bo
08d0: 78 74 62 6c 20 2b 20 40 20 28 20 61 6e 71 20 29  xtbl + @ ( anq )
08e0: 20 5b 20 32 6f 76 65 72 20 5d 20 64 69 70 20 73   [ 2over ] dip s
08f0: 77 61 70 20 2e 72 6f 77 20 28 20 61 6e 20 29 20  wap .row ( an ) 
0900: 5d 20 64 69 70 20 61 67 61 69 6e 20 3b 0a 0a 20  ] dip again ;.. 
0910: 20 28 20 2d 2d 5b 20 55 74 69 6c 69 74 79 20 77   ( --[ Utility w
0920: 6f 72 64 73 20 66 6f 72 20 66 69 6e 64 69 6e 67  ords for finding
0930: 20 74 68 65 20 52 45 54 20 6f 70 63 6f 64 65 20   the RET opcode 
0940: 5d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 29 0a  ]------------ ).
0950: 0a 20 20 3a 20 66 69 6e 64 52 65 74 20 28 20 61  .  : findRet ( a
0960: 2d 6e 61 20 29 20 20 31 20 73 77 61 70 20 72 65  -na )  1 swap re
0970: 70 65 61 74 20 64 75 70 20 5e 64 69 73 73 65 63  peat dup ^dissec
0980: 74 27 65 6e 64 4f 66 57 6f 72 64 3f 20 69 66 3b  t'endOfWord? if;
0990: 20 26 31 2b 20 62 69 40 20 61 67 61 69 6e 20 3b   &1+ bi@ again ;
09a0: 0a 2d 2d 2d 72 65 76 65 61 6c 2d 2d 2d 0a 0a 20  .---reveal---.. 
09b0: 20 3a 20 2e 63 65 6c 6c 73 20 28 20 61 6e 2d 20   : .cells ( an- 
09c0: 29 0a 20 20 20 20 64 75 70 20 40 62 6f 78 2f 6c  ).    dup @box/l
09d0: 69 6e 65 20 3e 0a 20 20 20 20 5b 20 40 62 6f 78  ine >.    [ @box
09e0: 2f 6c 69 6e 65 20 2d 20 5b 20 40 62 6f 78 2f 6c  /line - [ @box/l
09f0: 69 6e 65 20 28 2e 63 65 6c 6c 73 29 20 64 72 6f  ine (.cells) dro
0a00: 70 20 2b 20 5d 20 64 69 70 20 2e 63 65 6c 6c 73  p + ] dip .cells
0a10: 20 5d 0a 20 20 20 20 5b 20 28 2e 63 65 6c 6c 73   ].    [ (.cells
0a20: 29 20 32 64 72 6f 70 20 64 72 6f 70 20 5d 20 69  ) 2drop drop ] i
0a30: 66 20 3b 0a 0a 20 20 3a 20 2e 63 65 6c 6c 20 20  f ;..  : .cell  
0a40: 20 28 20 61 2d 20 29 20 20 31 20 2e 63 65 6c 6c   ( a- )  1 .cell
0a50: 73 20 3b 0a 20 20 3a 20 2e 74 68 72 65 61 64 20  s ;.  : .thread 
0a60: 28 20 61 2d 20 29 20 20 64 75 70 20 66 69 6e 64  ( a- )  dup find
0a70: 52 65 74 20 64 72 6f 70 20 2e 63 65 6c 6c 73 20  Ret drop .cells 
0a80: 3b 0a 7d 7d 0a 0a 28 20 2d 2d 5b 20 22 73 65 65  ;.}}..( --[ "see
0a90: 22 20 61 6e 64 20 22 65 78 70 6c 6f 72 65 22 20  " and "explore" 
0aa0: 5d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ]---------------
0ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ad0: 2d 2d 2d 20 29 0a 76 61 72 69 61 62 6c 65 20 76  --- ).variable v
0ae0: 65 72 74 69 63 61 6c 0a 7b 7b 0a 20 20 3a 20 68  ertical.{{.  : h
0af0: 65 6c 70 20 20 28 20 2d 20 29 0a 20 20 20 20 63  elp  ( - ).    c
0b00: 6c 65 61 72 0a 20 20 20 20 22 41 75 74 70 6f 73  lear.    "Autpos
0b10: 79 20 69 73 20 61 20 74 6f 6f 6c 20 66 6f 72 20  y is a tool for 
0b20: 65 78 70 6c 6f 72 69 6e 67 20 69 6d 61 67 65 73  exploring images
0b30: 20 69 6e 74 65 72 61 63 74 69 76 65 6c 79 2e 5c   interactively.\
0b40: 6e 5c 6e 22 20 70 75 74 73 0a 20 20 20 20 22 2b  n\n" puts.    "+
0b50: 2d 2d 2d 2b 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ---+------------
0b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b70: 2d 2d 2d 2d 2d 2d 2b 5c 6e 22 20 70 75 74 73 0a  ------+\n" puts.
0b80: 20 20 20 20 22 7c 20 69 20 7c 20 42 61 63 6b 74      "| i | Backt
0b90: 72 61 63 6b 20 64 69 73 70 6c 61 79 20 62 79 20  rack display by 
0ba0: 6f 6e 65 20 61 64 64 72 65 73 73 20 7c 5c 6e 22  one address |\n"
0bb0: 20 70 75 74 73 0a 20 20 20 20 22 2b 2d 2d 2d 2b   puts.    "+---+
0bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0be0: 2d 2d 2b 5c 6e 22 20 70 75 74 73 0a 20 20 20 20  --+\n" puts.    
0bf0: 22 7c 20 6a 20 7c 20 42 61 63 6b 74 72 61 63 6b  "| j | Backtrack
0c00: 20 64 69 73 70 6c 61 79 20 62 79 20 6f 6e 65 20   display by one 
0c10: 73 63 72 65 65 6e 20 20 7c 5c 6e 22 20 70 75 74  screen  |\n" put
0c20: 73 0a 20 20 20 20 22 2b 2d 2d 2d 2b 2d 2d 2d 2d  s.    "+---+----
0c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2b 5c  --------------+\
0c50: 6e 22 20 70 75 74 73 0a 20 20 20 20 22 7c 20 6b  n" puts.    "| k
0c60: 20 7c 20 41 64 76 61 6e 63 65 20 64 69 73 70 6c   | Advance displ
0c70: 61 79 20 62 79 20 6f 6e 65 20 61 64 64 72 65 73  ay by one addres
0c80: 73 20 20 20 7c 5c 6e 22 20 70 75 74 73 0a 20 20  s   |\n" puts.  
0c90: 20 20 22 2b 2d 2d 2d 2b 2d 2d 2d 2d 2d 2d 2d 2d    "+---+--------
0ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2b 5c 6e 22 20 70  ----------+\n" p
0cc0: 75 74 73 0a 20 20 20 20 22 7c 20 6c 20 7c 20 41  uts.    "| l | A
0cd0: 64 76 61 6e 63 65 20 64 69 73 70 6c 61 79 20 62  dvance display b
0ce0: 79 20 6f 6e 65 20 73 63 72 65 65 6e 20 20 20 20  y one screen    
0cf0: 7c 5c 6e 22 20 70 75 74 73 0a 20 20 20 20 22 2b  |\n" puts.    "+
0d00: 2d 2d 2d 2b 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ---+------------
0d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d20: 2d 2d 2d 2d 2d 2d 2b 5c 6e 22 20 70 75 74 73 0a  ------+\n" puts.
0d30: 20 20 20 20 22 7c 20 7a 20 7c 20 51 75 69 74 20      "| z | Quit 
0d40: 41 75 74 6f 73 70 79 20 20 20 20 20 20 20 20 20  Autospy         
0d50: 20 20 20 20 20 20 20 20 20 20 20 20 7c 5c 6e 22              |\n"
0d60: 20 70 75 74 73 0a 20 20 20 20 22 2b 2d 2d 2d 2b   puts.    "+---+
0d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d90: 2d 2d 2b 5c 6e 22 20 70 75 74 73 0a 20 20 20 20  --+\n" puts.    
0da0: 22 7c 20 3f 20 7c 20 44 69 73 70 6c 61 79 20 74  "| ? | Display t
0db0: 68 69 73 20 68 65 6c 70 20 73 63 72 65 65 6e 20  his help screen 
0dc0: 20 20 20 20 20 20 20 20 7c 5c 6e 22 20 70 75 74          |\n" put
0dd0: 73 0a 20 20 20 20 22 2b 2d 2d 2d 2b 2d 2d 2d 2d  s.    "+---+----
0de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2b 5c  --------------+\
0e00: 6e 22 20 70 75 74 73 0a 20 20 20 20 22 7c 20 31  n" puts.    "| 1
0e10: 20 7c 20 4a 75 6d 70 20 74 6f 20 61 64 64 72 65   | Jump to addre
0e20: 73 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ss              
0e30: 20 20 20 20 7c 5c 6e 22 20 70 75 74 73 0a 20 20      |\n" puts.  
0e40: 20 20 22 2b 2d 2d 2d 2b 2d 2d 2d 2d 2d 2d 2d 2d    "+---+--------
0e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2b 5c 6e 22 20 70  ----------+\n" p
0e70: 75 74 73 0a 20 20 20 20 22 5c 6e 50 72 65 73 73  uts.    "\nPress
0e80: 20 61 6e 79 20 6b 65 79 20 74 6f 20 72 65 74 75   any key to retu
0e90: 72 6e 20 74 6f 20 61 75 74 6f 73 70 79 2e 5c 6e  rn to autospy.\n
0ea0: 22 20 20 20 20 70 75 74 73 0a 20 20 20 20 67 65  "    puts.    ge
0eb0: 74 63 20 64 72 6f 70 20 3b 0a 0a 20 20 32 20 65  tc drop ;..  2 e
0ec0: 6c 65 6d 65 6e 74 73 20 78 20 6d 6f 72 65 3f 0a  lements x more?.
0ed0: 0a 20 20 3a 20 67 6f 54 6f 41 64 64 72 65 73 73  .  : goToAddress
0ee0: 20 28 20 22 2d 20 29 0a 20 20 20 20 63 6c 65 61   ( "- ).    clea
0ef0: 72 20 22 41 64 64 72 65 73 73 20 74 6f 20 6a 75  r "Address to ju
0f00: 6d 70 20 74 6f 3a 20 22 20 70 75 74 73 20 67 65  mp to: " puts ge
0f10: 74 54 6f 6b 65 6e 20 74 6f 4e 75 6d 62 65 72 20  tToken toNumber 
0f20: 21 78 20 3b 0a 20 20 3a 20 72 6f 77 73 20 40 63  !x ;.  : rows @c
0f30: 68 20 32 20 2d 20 3b 0a 20 20 3a 20 63 6f 6c 73  h 2 - ;.  : cols
0f40: 20 40 63 77 20 31 20 2d 20 3b 0a 20 20 3a 20 68   @cw 1 - ;.  : h
0f50: 61 6e 64 6c 65 0a 20 20 20 20 63 6f 6c 73 20 5b  andle.    cols [
0f60: 20 27 2d 20 70 75 74 63 20 5d 20 74 69 6d 65 73   '- putc ] times
0f70: 20 63 72 0a 20 20 20 20 67 65 74 63 0a 20 20 20   cr.    getc.   
0f80: 20 20 20 5b 20 27 69 20 3d 20 5d 20 5b 20 64 72     [ 'i = ] [ dr
0f90: 6f 70 20 78 20 2d 2d 20 20 20 20 20 20 20 20 5d  op x --        ]
0fa0: 20 77 68 65 6e 0a 20 20 20 20 20 20 5b 20 27 6b   when.      [ 'k
0fb0: 20 3d 20 5d 20 5b 20 64 72 6f 70 20 78 20 2b 2b   = ] [ drop x ++
0fc0: 20 20 20 20 20 20 20 20 5d 20 77 68 65 6e 0a 20          ] when. 
0fd0: 20 20 20 20 20 5b 20 27 6a 20 3d 20 5d 20 5b 20       [ 'j = ] [ 
0fe0: 64 72 6f 70 20 72 6f 77 73 20 2d 78 20 20 20 20  drop rows -x    
0ff0: 20 5d 20 77 68 65 6e 0a 20 20 20 20 20 20 5b 20   ] when.      [ 
1000: 27 6c 20 3d 20 5d 20 5b 20 64 72 6f 70 20 72 6f  'l = ] [ drop ro
1010: 77 73 20 2b 78 20 20 20 20 20 5d 20 77 68 65 6e  ws +x     ] when
1020: 0a 20 20 20 20 20 20 5b 20 27 3f 20 3d 20 5d 20  .      [ '? = ] 
1030: 5b 20 64 72 6f 70 20 68 65 6c 70 20 20 20 20 20  [ drop help     
1040: 20 20 20 5d 20 77 68 65 6e 0a 20 20 20 20 20 20     ] when.      
1050: 5b 20 27 31 20 3d 20 5d 20 5b 20 64 72 6f 70 20  [ '1 = ] [ drop 
1060: 67 6f 54 6f 41 64 64 72 65 73 73 20 5d 20 77 68  goToAddress ] wh
1070: 65 6e 0a 20 20 20 20 20 20 5b 20 27 7a 20 3d 20  en.      [ 'z = 
1080: 5d 20 5b 20 64 72 6f 70 20 6d 6f 72 65 3f 20 6f  ] [ drop more? o
1090: 66 66 20 20 20 5d 20 77 68 65 6e 0a 20 20 20 20  ff   ] when.    
10a0: 64 72 6f 70 20 3b 0a 20 20 3a 20 62 72 6f 77 73  drop ;.  : brows
10b0: 65 20 20 20 20 20 28 20 20 2d 20 29 0a 20 20 20  e     (  - ).   
10c0: 20 5b 20 63 6c 65 61 72 20 40 78 20 72 6f 77 73   [ clear @x rows
10d0: 20 26 64 65 63 6f 6d 70 69 6c 65 20 74 69 6d 65   &decompile time
10e0: 73 20 64 72 6f 70 20 68 61 6e 64 6c 65 20 40 6d  s drop handle @m
10f0: 6f 72 65 3f 20 5d 20 77 68 69 6c 65 20 3b 0a 20  ore? ] while ;. 
1100: 20 3a 20 67 65 74 41 64 64 72 65 73 73 20 28 20   : getAddress ( 
1110: 22 2d 20 29 0a 20 20 20 20 67 65 74 54 6f 6b 65  "- ).    getToke
1120: 6e 20 64 75 70 20 66 69 6e 64 20 5b 20 6e 69 70  n dup find [ nip
1130: 20 40 64 2d 3e 78 74 20 5d 20 5b 20 64 72 6f 70   @d->xt ] [ drop
1140: 20 74 6f 4e 75 6d 62 65 72 20 5d 20 69 66 20 3b   toNumber ] if ;
1150: 0a 2d 2d 2d 72 65 76 65 61 6c 2d 2d 2d 0a 20 20  .---reveal---.  
1160: 3a 20 3a 73 65 65 20 20 20 20 28 20 61 2d 20 29  : :see    ( a- )
1170: 0a 20 20 20 20 63 72 20 40 76 65 72 74 69 63 61  .    cr @vertica
1180: 6c 0a 20 20 20 20 5b 20 5b 20 64 65 63 6f 6d 70  l.    [ [ decomp
1190: 69 6c 65 20 64 75 70 20 31 2d 20 5e 64 69 73 73  ile dup 1- ^diss
11a0: 65 63 74 27 65 6e 64 4f 66 57 6f 72 64 3f 20 6e  ect'endOfWord? n
11b0: 6f 74 20 5d 20 77 68 69 6c 65 20 64 72 6f 70 20  ot ] while drop 
11c0: 5d 20 26 2e 74 68 72 65 61 64 20 69 66 20 3b 0a  ] &.thread if ;.
11d0: 20 20 3a 20 73 65 65 20 20 20 20 20 28 20 22 2d    : see     ( "-
11e0: 20 29 20 67 65 74 41 64 64 72 65 73 73 20 3a 73   ) getAddress :s
11f0: 65 65 20 3b 0a 20 20 3a 20 65 78 70 6c 6f 72 65  ee ;.  : explore
1200: 20 28 20 22 2d 20 29 20 67 65 74 41 64 64 72 65   ( "- ) getAddre
1210: 73 73 20 21 78 20 6d 6f 72 65 3f 20 6f 6e 20 62  ss !x more? on b
1220: 72 6f 77 73 65 20 3b 0a 7d 7d 0a 3b 63 68 61 69  rowse ;.}}.;chai
1230: 6e 0a 0a 67 6c 6f 62 61 6c 20 77 69 74 68 20 61  n..global with a
1240: 75 74 6f 70 73 79 27 0a                          utopsy'.