home *** CD-ROM | disk | FTP | other *** search
- \ DECOM.SEQ The F83 decompiler Enhancements by Tom Zimmer
-
- \ A Forth decompiler is a utility program that translates
- \ executable forth code back into source code. Normally this is
- \ impossible, since traditional compilers produce more object
- \ code than source, but in Forth it is quite easy. The decompiler
- \ is almost one to one, failing only to correctly decompile the
- \ various Forth control stuctures and special compiling words.
- \ It was written with modifiability in mind, so if you add your
- \ own special compiling words, it will be easy to change the
- \ decompiler to include them. This code is highly implementation
- \ dependant, and will NOT work on other Forth system. To invoke
- \ the decompiler, use the word SEE <name> where <name> is the
- \ name of a Forth word.
-
- : +TAB ( --- )
- 8 LMARGIN +! ;
-
- : -TAB ( --- )
- LMARGIN @ 8 - 0 MAX LMARGIN ! ;
-
- : CRTAB RMARGIN @ ?LINE ;
-
- HIDDEN DEFINITIONS
-
- : ASSOCIATIVE:
- CONSTANT
- DOES> ( N -- INDEX )
- DUP @ ( N PFA CNT ) -ROT DUP @ 0 ( CNT N PFA CNT 0 )
- DO 2+ 2DUP @ = ( CNT N PFA' BOOL )
- IF 2DROP DROP I 0 0 LEAVE THEN
- ( CLEAR STACK AND RETURN INDEX THAT MATCHED )
- LOOP 2DROP ;
-
- : .WORD ( IP -- IP' )
- DUP X@ >NAME YC@ 64 AND
- IF DUP YC@ 31 AND 10 + ?LINE
- ." [COMPILE] "
- THEN DUP X@ >NAME.ID 2+ ;
-
- : .LIT ( IP -- IP' )
- 6 ?LINE
- 2+ DUP X@ . 2+ ;
-
- : .IF ( IP -- IP' )
- CRTAB 4 + ." IF " TAB +TAB ;
-
- : .ELSE ( IP -- IP' )
- -TAB CRTAB 4 + ." ELSE " TAB +TAB ;
-
- : .DO ( IP -- IP' )
- CRTAB 4 + ." DO " TAB +TAB ;
-
- : .?DO ( IP -- IP' )
- CRTAB 4 + ." ?DO " TAB +TAB ;
-
- : .LOOP ( IP -- IP' )
- -TAB CRTAB 4 + ." LOOP " TAB ;
-
- : .+LOOP ( IP -- IP' )
- -TAB CRTAB 4 + ." +LOOP " TAB ;
-
- : .WHILE ( IP -- IP' )
- -TAB CRTAB 4 + ." WHILE " TAB +TAB ;
-
- : .REPEAT ( IP -- IP' )
- -TAB CRTAB 4 + ." REPEAT " TAB ;
-
- : .UNTIL ( IP -- IP' )
- -TAB CRTAB 4 + ." UNTIL " TAB ;
-
- : .AGAIN ( IP -- IP' )
- -TAB CRTAB 4 + ." AGAIN " TAB ;
-
- : .BEGIN ( IP -- IP' )
- CRTAB 2+ ." BEGIN " TAB +TAB ;
-
- : .THEN ( IP -- IP' )
- -TAB CRTAB 2+ ." THEN " TAB ;
-
- : .QUOTE ( IP -- IP' )
- .WORD .WORD ;
-
- : .STRING." ( IP -- IP' )
- 2+ DUP X@ C@ 5 + ?LINE
- ASCII . EMIT ASCII " EMIT SPACE
- DUP 2+ SWAP X@ COUNT TYPE ASCII " EMIT SPACE ;
-
- : .STRING" ( IP -- IP' )
- 2+ DUP X@ C@ 4 + ?LINE
- ASCII " EMIT SPACE
- DUP 2+ SWAP X@ COUNT TYPE ASCII " EMIT SPACE ;
-
- : .ABORT" ( IP -- IP' )
- 2+ DUP X@ C@ 10 + ?LINE
- ." ABORT" ASCII " EMIT SPACE
- DUP 2+ SWAP X@ COUNT TYPE ASCII " EMIT SPACE ;
-
- : .(;CODE) ( IP -- IP' )
- .WORD DOES?
- IF ." DOES> "
- ELSE DROP FALSE THEN ;
-
- : .UNNEST ( IP -- IP' )
- ." ; " DROP 0 ;
-
- : .FINISH ( IP -- IP' )
- .WORD DROP 0 ;
-
- 20 ASSOCIATIVE: EXECUTION-CLASS
- ( 0 ) ' (LIT) , ( 1 ) ' ?BRANCH ,
- ( 2 ) ' BRANCH , ( 3 ) ' (LOOP) ,
- ( 4 ) ' (+LOOP) , ( 5 ) ' (DO) ,
- ( 6 ) ' COMPILE , ( 7 ) ' (.") ,
- ( 8 ) ' (ABORT") , ( 9 ) ' (;CODE) ,
- ( 10 ) ' UNNEST , ( 11 ) ' (") ,
- ( 12 ) ' (?DO) , ( 13 ) ' (;USES) ,
- ( 14 ) ' ?UNTIL , ( 15 ) ' ?WHILE ,
- ( 16 ) ' DOAGAIN , ( 17 ) ' DOREPEAT ,
- ( 18 ) ' DOBEGIN , ( 19 ) ' DOTHEN ,
-
-
- : .EXECUTION-CLASS ( N1 --- )
- 0 MAX 20 MIN EXEC:
- ( 0 ) .LIT ( 1 ) .IF
- ( 2 ) .ELSE ( 3 ) .LOOP
- ( 4 ) .+LOOP ( 5 ) .DO
- ( 6 ) .QUOTE ( 7 ) .STRING."
- ( 8 ) .ABORT" ( 9 ) .(;CODE)
- ( 10 ) .UNNEST ( 11 ) .STRING"
- ( 12 ) .?DO ( 13 ) .FINISH
- ( 14 ) .UNTIL ( 15 ) .WHILE
- ( 16 ) .AGAIN ( 17 ) .REPEAT
- ( 18 ) .BEGIN ( 19 ) .THEN
- ( 20 ) .WORD ;
-
- : .PFA ( CFA -- )
- >BODY @
- SAVESTATE
- 8 LMARGIN !
- 70 RMARGIN !
- BEGIN
- ?CR DUP PFASAV @ OVER =
- IF >ATTRIB4
- THEN X@ EXECUTION-CLASS .EXECUTION-CLASS
- >NORM
- DUP 0= KEY? OR
- UNTIL DROP RESTORESTATE ;
-
- : .IMMEDIATE ( CFA -- )
- >NAME YC@ 64 AND
- IF ." IMMEDIATE" THEN ;
-
- : .CONSTANT ( CFA -- )
- DUP >BODY ? ." CONSTANT " >NAME.ID ;
-
- : .VARIABLE ( CFA -- )
- DUP C@ 232 =
- IF DUP >BODY . ." VARIABLE " DUP >NAME.ID
- ." Value = " >BODY ?
- ELSE >NAME.ID THEN ;
-
- : .: ( CFA -- )
- ." : " DUP >NAME .ID CR TAB .PFA ;
-
- : .DOES> ( CFA -- )
- BODY> @REL>ABS DUP >.ID ." DOES> " .PFA ;
-
- : .USER-VARIABLE ( CFA -- )
- DUP >BODY ? ." USER VARIABLE " DUP >NAME.ID
- ." Value = " >IS ? ;
-
-
- : .DEFER ( CFA -- )
- ." DEFERRED " DUP >NAME.ID ." IS " >IS @ (SEE) ;
-
- : .USER-DEFER ( cfa -- )
- ." USER DEFERRED " DUP >NAME.ID ." IS " >IS @ (SEE) ;
-
- : .OTHER ( CFA -- )
- DUP >NAME.ID
- DUP C@ 232 <> \ cfa doesn't contain a call for code
- IF DROP ." is Code" EXIT
- THEN
- DUP DOES? \ Is this a DOES> word?
- IF .DOES> DROP EXIT
- THEN 2DROP ." is Unknown" ;
-
- 6 ASSOCIATIVE: DEFINITION-CLASS
- ( 0 ) ' QUIT @REL>ABS , ( 1 ) ' 0 @REL>ABS ,
- ( 2 ) ' STATE @REL>ABS , ( 3 ) ' BASE @REL>ABS ,
- ( 4 ) ' CR @REL>ABS , ( 5 ) ' EMIT @REL>ABS ,
-
- : .DEFINITION-CLASS ( N1 --- )
- 0 MAX 6 MIN EXEC:
- ( 0 ) .: ( 1 ) .CONSTANT
- ( 2 ) .VARIABLE ( 3 ) .USER-VARIABLE
- ( 4 ) .DEFER ( 5 ) .USER-DEFER
- ( 6 ) .OTHER ;
-
- : ((SEE)) ( Cfa -- )
- CR DUP DUP @REL>ABS
- DEFINITION-CLASS .DEFINITION-CLASS
- .IMMEDIATE ; ' ((SEE)) IS (SEE)
-
- FORTH DEFINITIONS
-
- : SEE ( | name -- )
- ' (SEE) ;
-
- VARIABLE CFASAV CFASAV ON
-
- DEFER SRCSPACES ' SPACES IS SRCSPACES
-
- : SRCEEOLCR 77 #OUT @ - SRCSPACES CRLF ;
-
- : SHOWSRC ( --- ) \ Show the source for the current debugging word.
- #out @ #line @ >r >r
- 0 0 AT DEFCFA @ CFASAV @ <>
- IF 18 0
- DO 0 I AT 80 SRCSPACES
- LOOP DEFCFA @ CFASAV !
- THEN 0 1 AT
- ['] SRCEEOLCR IS CR
- defcfa @ (SEE)
- ['] CRLF IS CR
- 0 17 AT 78 SRCSPACES
- 0 18 AT >ATTRIB4
- ." C-continuous, F-forth, N-nest, Q-quit, Z-zip, X-source-off"
- 77 #OUT @ - SRCSPACES >NORM
- r> r> at ;
-
- : SRCCR ( --- ) \ Source CR for the debugger, subscreen scroll.
- 0 19 AT -LINE 0 24 AT ;
-
-
- : SRCON ( --- ) \ Enable source printing durring debugging.
- ['] showsrc is .defsrc
- ['] SRCCR IS CCR ; srcon
-
- : SRCOFF ( --- ) \ disable source printing durring debugging.
- ['] noop is .defsrc
- ['] CRLF IS CCR ;
-
-