Screen 0 not modified 0 \\ Tools 11Nov86 1 Dieses File enthaelt die wichtigsten Werkzeuge zur Programm- 2 entwicklung: - den einfachen Decompiler 3 - der DUMP-Befehl 4 - den Tracer 5 6 Der einfache Decompiler wird benutzt, um neue Defining-Words 7 zu ueberpruefen. Der automatische Decompiler kann ja dafuer 8 nicht benutzt werden, da ihm diese Strukturen unbekannt sind. 9 (Benutzung: addr und dann, je nach Art: S N D L C oder B) 10 11 DUMP wird zum Ausgeben von Hexdumps benutzt. (from count DUMP) 12 13 Der Tracer erlaubt Einzelschrittausfuehrung von Worten. 14 Er ist unentbehrliches Hilfsmittel bei der Fehlersuche. 15 (Benutzung: DEBUG und END-TRACE) Screen 1 not modified 0 \ Loadscreen for simple decompiler and tracer 11Nov86 1 2 Onlyforth Vocabulary Tools Tools also definitions 3 4 01 05 +thru 5 06 +load \ Tracer 6 7 Onlyforth 8 9 : internal \ start headerless definitions 10 1 ?head ! ; 11 12 : external \ end headerless definitions 13 ?head off ; 14 15 Screen 2 not modified 0 \ Tools for decompiling 22feb86 1 2 | : ?: dup 4 u.r ." :" ; 3 | : @? dup @ 6 u.r ; 4 | : c? dup c@ 3 .r ; 5 6 : s ( adr - adr+ ) 7 ?: space c? 3 spaces dup 1+ over c@ type dup c@ + 1+ even ; 8 9 : n ( adr - adr+2 ) ?: @? 2 spaces dup @ >name .name 2+ ; 10 : d ( adr n - adr+n) 11 2dup swap ?: swap 0 DO c? 1+ LOOP 2 spaces -rot type ; 12 13 14 15 Screen 3 not modified 0 \ Tools for decompiling 22feb86 1 2 : l ( adr - adr+2 ) ?: 5 spaces @? 2+ ; 3 : c ( adr - adr+1) 1 d ; 4 : b ( adr - adr+1) ?: @? dup @ over + 5 u.r 2+ ; 5 6 7 8 \\ 9 : dump ( adr n -) bounds ?DO cr I 10 d drop stop? IF LEAVE 10 THEN 10 +LOOP ; 11 12 13 14 15 Screen 4 not modified 0 \ General Dump Utility - Output UH 07Jun86 1 2 | : .2 ( n -- ) 0 <# # # #> type space ; 3 | : .6 ( d -- ) <# # # # # # # #> type ; 4 | : d.2 ( addr len -- ) bounds ?DO I C@ .2 LOOP ; 5 | : emit. ( char -- ) 6 $7F and dup bl $7E uwithin not IF drop Ascii . THEN emit ; 7 | : dln ( addr --- ) 8 cr dup 6 u.r 2 spaces 8 2dup d.2 space 9 over + 8 d.2 space $10 bounds ?DO I C@ EMIT. LOOP ; 10 | : ?.n ( n1 n2 -- n1 ) 11 2dup = IF ." \/" drop ELSE 2 .r THEN space ; 12 | : ?.a ( n1 n2 -- n1 ) 13 2dup = IF ." V" drop ELSE 1 .r THEN ; 14 15 Screen 5 not modified 0 \ .head UH 03Jun86 1 2 3 | : .head ( addr len -- addr' len' ) 4 swap dup -$10 and swap $0F and cr 8 spaces 5 8 0 DO I ?.n LOOP space $10 8 DO I ?.n LOOP 6 space $10 0 DO I ?.a LOOP rot + ; 7 8 9 10 11 12 13 14 15 Screen 6 not modified 0 \ Dump and Fill Memory Utility UH 25Aug86 1 2 Forth definitions 3 4 : dump ( addr len -- ) 5 base push hex .head 6 bounds ?DO I dln stop? IF LEAVE THEN $10 +LOOP ; 7 8 Tools definitions 9 10 : du ( addr -- addr+$40 ) dup $40 dump $40 + ; 11 12 : dl ( line# -- ) c/l * scr @ block + c/l dump ; 13 14 Forth definitions 15 Screen 7 not modified 0 \ Trace Loadscreen 29Jun86 1 2 Onlyforth \needs Tools Vocabulary Tools 3 Tools also definitions 4 5 1 8 +thru 6 7 Onlyforth 8 9 \ clear 10 11 \ don't forget END-TRACE after using DEBUG 12 13 14 15 Screen 8 not modified 0 \ Variables do-trace UH 04Nov86 1 2 | Variable Wsave \ Variable for saving W 3 | Variable \ end of trace trap range 5 | Variable 'ip \ holds IP (preincrement!) 6 | Variable nest? \ True if NEST shall be performed 7 | Variable newnext \ Address of new Next for tracing 8 | Variable #spaces \ for indenting nested trace 9 | Variable tracing \ true if trace mode active 10 11 12 13 14 15 Screen 9 not modified 0 \ install Tracer UH 18Nov87 1 2 Tools definitions 3 4 | Code do-trace \ patch Next to new definition 5 $C3 A mvi ( jmp ) >next sta 6 newnext lhld >next 1+ shld Next 7 end-code 8 9 10 11 12 13 14 15 Screen 10 not modified 0 \ throw status on Return-Stack 29Jun86 1 2 | Create: npull 3 rp@ count 2dup + even rp! r> swap cmove ; 4 5 : npush ( addr len --) r> -rot over >r 6 rp@ over 1+ - even dup rp! place npull >r >r ; 7 8 | : oneline .status space query interpret -&82 allot 9 rdrop ( delete quit from tracenext ) ; 10 11 12 13 14 15 Screen 11 not modified 0 \ reenter tracer 04Nov86 1 2 | Code (step 3 true H lxi tracing shld IP rpop Wsave lhld H W mvx 4 Label fnext 5 xchg 6 M E mov H inx M D mov xchg pchl 7 end-code 8 9 | Create: nextstep (step ; 10 11 | : (debug ( addr --) \ start tracing at addr 12 dup ! ; 14 15 Screen 12 not modified 0 \ check trace conditions 04Nov86 1 2 Label tracenext tracenext newnext ! 3 IP ldax IP inx A L mov IP ldax IP inx A H mov 4 xchg tracing lhld H A mov L ora fnext jz 5 nest? 1+ lda A ana 6 0= ?[ 7 lhld 11 H A mov IP cmp fnext jc 12 0= ?[ L A mov IP' cmp fnext jc ]? 13 ][ A xra nest? 1+ sta ]? \ low byte still set 14 \ one trace condition satisfied 15 W H mvx Wsave shld false H lxi tracing shld Screen 13 not modified 0 \ tracer display UH 25Jan88 1 2 ;c: nest? @ 3 IF nest? off r> ip> push r THEN 5 r@ nextstep >r input push output push standardi/o 6 cr #spaces @ spaces 7 dup 'ip ! 2- dup 5 u.r @ dup 6 u.r 2 spaces 8 >name .name $1C col - 0 max spaces .s 9 state push blk push >in push ['] 'quit >body push 10 [ ' parser >body ] Literal push 11 span push #tib push tib #tib @ npush r0 push 12 rp@ r0 ! &82 allot ['] oneline Is 'quit quit ; 13 14 15 Screen 14 not modified 0 \ DEBUG with errorchecking 28Nov86 1 2 | : traceable ( cfa -- cfa' ) 3 recursive dup @ 4 ['] : @ case? ?exit 5 ['] key @ case? IF >body c@ Input @ + @ traceable exit THEN 6 ['] type @ case? IF >body c@ Output @ + @ traceable exit THEN 7 ['] r/w @ case? IF >body traceable exit THEN 8 dup 1+ @ [ ' Forth @ 1+ @ ] Literal = IF nip 1+ exit THEN 9 drop >name .name ." can't be DEBUGged" quit ; 10 11 also Forth definitions 12 13 : debug ( -- ) \ reads a word 14 ' traceable (debug Tools 15 nest? off #spaces off tracing on do-trace ; Screen 15 not modified 0 \ misc. words for tracing 28Nov86 1 Tools definitions 2 3 : nest \ trace next high-level word executed 4 'ip @ 2- @ traceable drop nest? on ; 5 6 : unnest \ ends tracing of actual word 7 off ; \ clears trap range 8 9 : endloop \ stop tracing loop 10 'ip @