\ *** Block No. 0 Hexblock 0 
\\                       *** Tools ***                 25may86we
                                                                
In diesem File sind die wichtigsten Debugging-Tools enthalten.  
                                                                
Dazu geh”ren ein einfacher Decompiler, ein Speicherdump und     
der Tracer (s. Kapitel im Handbuch)                             
Vor allem der Tracer hat sich als sehr sinnvolles Werkzeug bei  
der Fehlerbek„mpfung entwickelt. Normalerweise sind Fehlerquel- 
len beim Tracen sofort auffindbar, manchmal allerdings auch     
nicht ganz so schnell ...                                       
                                                                
                                                                
                                                                
                                                                
                                                                
                                                                
\ *** Block No. 1 Hexblock 1 
\ Loadscreen for simple decompiler                     26oct86we
                                                                
Onlyforth    Vocabulary Tools  Tools also definitions           
                                                                
1 5 +thru                                                       
  6 +load     \ Tracer                                          
                                                                
Onlyforth                                                       
                                                                
                                                                
                                                                
                                                                
                                                                
                                                                
                                                                
                                                                
\ *** Block No. 2 Hexblock 2 
\ Tools for decompiling                                26oct86we
                                                                
| : ?:     dup 4 u.r ." :" ;                                    
| : @?     dup @ 6 u.r ;                                        
| : c?     dup c@ 3 .r ;                                        
                                                                
: s   ( adr - adr+ )                                            
   ?: space  c? 3 spaces  dup 1+ over c@ type                   
   dup c@ + 1+ even ;                                           
                                                                
: n   ( adr - adr+2 )    ?: @? 2 spaces  dup @ >name .name 2+ ; 
: k   ( adr - adr+2 )    ?: 5 spaces @? 2+ ;                    
: b   ( adr - adr+1)     ?: @? dup @ over + 5 u.r 2+ ;          
                                                                
                                                                
                                                                
\ *** Block No. 3 Hexblock 3 
\ Tools for decompiling                                26oct86we
                                                                
: d   ( adr n - adr+n)                                          
   2dup swap ?:  swap  0 DO c? 1+ LOOP  2 spaces  -rot type ;   
                                                                
: c   ( adr - adr+1)     1 d ;                                  
                                                                
                                                                
\\                                                              
: dump ( adr n -) bounds ?DO cr I 10 d drop stop? IF LEAVE      
THEN 10 +LOOP ;                                                 
                                                                
                                                                
                                                                
\ dekompiliere  String Name Konstant Char Branch Dump           
\               =      =    =        =    =      =              
\ *** Block No. 4 Hexblock 4 
\ General Dump Utility - Output                        26oct86we
                                                                
| : .2      ( n -- )       0  <#   # #   #>   type  space ;     
| : .6      ( d -- )       <#  # # # # # #  #>  type ;          
| : d.2     ( addr len -- )      bounds ?DO  I c@  .2  LOOP ;   
| : emit.   ( char -- )     $7F and                             
         dup bl $7E uwithin not IF drop Ascii . THEN  emit ;    
                                                                
| : dln   ( addr --- )                                          
     cr  dup 6 u.r  2 spaces  8 2dup d.2  space                 
     over + 8 d.2  space   $10 bounds ?DO  I c@ EMIT.  LOOP  ;  
| : ?.n    ( n1 n2 -- n1 )                                      
     2dup = IF  ." \/"  drop  ELSE  2 .r  THEN   space ;        
| : ?.a    ( n1 n2 -- n1 )                                      
     2dup = IF  ." v"  drop   ELSE  1 .r  THEN ;                
                                                                
\ *** Block No. 5 Hexblock 5 
\ Longdump  basics                                     24aug86we
                                                                
| : ld.2   ( hiaddr loaddr len -- hiaddr )                      
     bounds ?DO  I over lc@ .2  LOOP  ;                         
                                                                
| : ldln   ( hiaddr loaddr  -- )                                
     cr  dup >r  over   .6  2 spaces                            
     r@ 8 ld.2 space   r@ 8 + 8 ld.2 space                      
     r> $10 bounds ?DO  I over lc@ emit.  LOOP drop ;           
                                                                
| : .head   ( addr len -- addr' len' )                          
      swap  dup -$10 and  swap  $0F and  cr 8 spaces            
      8 0 DO  I ?.n  LOOP  space  $10 8 DO  I ?.n  LOOP         
      space  $10 0 DO  I ?.a  LOOP  rot + ;                     
                                                                
                                                                
\ *** Block No. 6 Hexblock 6 
\ Dump and Fill Memory Utility                         10sep86we
                                                                
Forth definitions                                               
                                                                
: ldump   ( laddr len -- )                                      
   base push hex   >r swap r>  .head                            
   bounds ?DO  dup I ldln  stop? IF  LEAVE  THEN                
               I $FFF0 = IF  1+  THEN  $10 +LOOP drop ;         
                                                                
: dump   ( addr len -- )                                        
   base push  hex    .head                                      
   bounds ?DO  I dln  stop? IF  LEAVE  THEN  $10 +LOOP ;        
                                                                
                                                                
                                                                
                                                                
\ *** Block No. 7 Hexblock 7 
\ Trace Loadscreen                                     26oct86we
                                                                
Onlyforth       \needs Tools    Vocabulary Tools                
Tools also definitions                                          
                                                                
\needs cpush   1 +load                                          
\needs >absaddr                 : >absaddr   0  forthstart d+ ; 
                                                                
2 8 +thru                                                       
                                                                
Onlyforth                                                       
                                                                
                                                                
                                                                
                                                                
                                                                
\ *** Block No. 8 Hexblock 8 
\ throw status on Return-Stack                         26oct86we
                                                                
| Create: cpull                                                 
      rp@ count  2dup + even rp!  r> swap cmove ;               
                                                                
: cpush  ( addr len --)   r> -rot  over >r                      
      rp@ over 2+ -  even dup rp!  place  cpull >r  >r ;        
                                                                
                                                                
                                                                
                                                                
                                                                
                                                                
                                                                
                                                                
                                                                
\ *** Block No. 9 Hexblock 9 
\ Variables do-trace                                   10sep86we
                                                                
| Variable (W           \ Variable for saving W                 
| Variable <ip          \ start of trace trap range             
| Variable ip>          \ end of trace trap range               
| Variable nest?        \ True if NEST shall performed          
| Variable newnext      \ Address of new Next for tracing       
| Variable last'        \ holds adr of position in traced word  
| Variable #spaces      \ for indenting nested trace            
| Variable trap?        \ True if trace is allowed              
                                                                
                                                                
                                                                
                                                                
                                                                
                                                                
\ *** Block No. 10 Hexblock A 
\ install Tracer                                       11sep86we
                                                                
Label trnext   0 # D6 move   .l 0 D6 FP DI) jmp  end-code       
                                                                
Label (do-trace      newnext R#) D0 move  D0 trnext 2+ R#) move 
   .w trnext # D6 move   .l D6 reg) A0 lea    A0 D5 move        
   .w UP R#) D6 move                                            
   .l ' next-link >body c@ D6 FP DI) D6 .w move                 
   BEGIN   .l D6 reg) A1 lea   .w D6 tst  0<>                   
   WHILE   .w &10 # A1 suba   .l D5 A0 move                     
              A0 )+ A1 )+ move   A0 )+ A1 )+ move               
              .w 2 A1 addq   A1 ) D6 move                       
   REPEAT  rts   end-code                                       
                                                                
  Code do-trace  \ opposite of end-trace                        
     (do-trace bsr   Next end-code                              
\ *** Block No. 11 Hexblock B 
\ reenter tracer                                       04sep86we
                                                                
| : oneline   .status space query interpret  -&82 allot         
              rdrop  ( delete quit from tracenext ) ;           
                                                                
| Code (step                                                    
      RP )+ D7 move   .l D7 IP lmove   FP IP adda               
      .w (W R#) D7 move    -1 # trap? R#) move                  
Label fnext                                                     
      D7 reg) D6 move  D6 reg) jmp  end-code                    
                                                                
| Create: nextstep   (step ;                                    
                                                                
: (debug  ( addr -- )   \ start tracing at addr                 
 dup  <ip !  BEGIN  1+ dup @   ['] unnest =  UNTIL  2+ ip> ! ;  
                                                                
\ *** Block No. 12 Hexblock C 
\ check trace conditions                               10sep86we
                                                                
Label tracenext   tracenext newnext !                           
   IP )+ D7 move                                                
   trap? R#) tst    fnext beq                                   
   .b nest? R#) D0 move  \ byte order!!                         
   0= IF    .l IP D0 move   FP D0 sub                           
            .w <ip R#) D0 cmp  fnext bcs                        
               ip> R#) D0 cmp  fnext bhi                        
      ELSE  .b 0 # nest? R#) move  THEN  \ low byte still set   
                                                                
                            \ one trace condition satisfied     
  .w D7 (W R#) move     trap? R#) clr                           
                                                                
                                                                
                                                                
\ *** Block No. 13 Hexblock D 
\ tracer display                                       26oct86we
                                                                
;c:  nest? @                                                    
     IF  nest? off   r>  ip> push  <ip push  dup 2- (debug      
         #spaces push  1 #spaces +!  >r   THEN                  
 r@  nextstep >r  input push  output push  standardi/o          
 2-   dup last' !                                               
 cr #spaces @ spaces    dup 5 u.r   @ dup 6 u.r   2 spaces      
 >name .name    $1C col -  0 max spaces       .s                
 state push    blk push    >in push    ['] 'quit >body push     
 [ ' >interpret >body ] Literal push                            
 #tib push    tib #tib @ cpush    r0 push    rp@ r0 !           
 &82 allot    ['] oneline Is 'quit    quit ;                    
                                                                
                                                                
                                                                
\ *** Block No. 14 Hexblock E 
\ DEBUG with errorchecking                             11sep86we
                                                                
| : traceable  ( cfa -- adr)                                    
 recursive  dup @                                               
 ['] : @    case? ?exit                                         
 ['] key @  case? IF  >body c@  Input @ + @  traceable exit THEN
 ['] type @ case? IF  >body c@ Output @ + @  traceable exit THEN
 ['] r/w  @ case? IF  >body  @               traceable exit THEN
 drop dup @ @ $4EAB =  IF  @ 4+  exit  THEN \ 68000 voodoo code 
 >name .name ." can't be DEBUGged" quit ;                       
                                                                
: nest                  \ trace next high-level word executed   
    last' @ @ traceable drop  nest? on ;                        
                                                                
: unnest                \ ends tracing of actual word           
    <ip on  ip> off ;   \ clears trap range                     
\ *** Block No. 15 Hexblock F 
\ misc. words for tracing                              bp 9Mar86
                                                                
: endloop               \ sets trap range next current word     
    last' @ 4+ <ip ! ;  \ used to skip LOOPs, REPEATs, ...      
                                                                
' end-trace  Alias unbug                                        
                                                                
Forth definitions                                               
                                                                
: debug  ( --)          \ reads a word                          
      '  traceable  Tools   (debug                              
      nest? off  trap? on  #spaces off  do-trace ;              
                                                                
: trace' (  --)         \ traces fol. word                      
    debug  <ip perform  end-trace ;