REQUIRE PLACE ~mak/place.f REQUIRE [IF] ~mak/CompIF.f REQUIRE DISASSEMBLER lib/ext/disasm.f C" STREAM-FILE" FIND NIP [IF] : FROM_SOURCE-ID SOURCE-ID STREAM-FILE ; : TO_SOURCE-ID FILE>RSTREAM TO SOURCE-ID ; [ELSE] : FROM_SOURCE-ID SOURCE-ID ; : TO_SOURCE-ID TO SOURCE-ID ; [THEN] : INST [ ALSO DISASSEMBLER ] INST [ PREVIOUS ] ; C" -CELL" FIND NIP 0= [IF] -1 CELLS CONSTANT -CELL [THEN] CREATE FILE_NAME_L 120 ALLOT CREATE HERE-TAB 5000 CELLS ALLOT HERE CELL- CONSTANT HERE-TAB-MAX VARIABLE HERE-TAB-CUR HERE-TAB HERE-TAB-CUR ! VARIABLE S_STATE : HERE-TAB-CUR+ HERE-TAB-CUR @ CELL+ HERE-TAB-MAX UMIN HERE-TAB-CUR ! \ [ .( XXXX) DIS-OPT KEY DROP ] ; : HERE-TO-TAB DP @ HERE-TAB-CUR @ ! HERE-TAB-CUR+ ; CREATE SHERE-TAB 800 CELLS ALLOT HERE CELL- CONSTANT SHERE-TAB-MAX VARIABLE SHERE-TAB-CUR SHERE-TAB SHERE-TAB-CUR ! : SHERE-TAB-CUR+ SHERE-TAB-CUR @ CELL+ SHERE-TAB-MAX UMIN SHERE-TAB-CUR ! ; : SHERE-TO-TAB DP @ SHERE-TAB-CUR @ ! SHERE-TAB-CUR+ ; 80 VALUE DUMP_MAX : MDUMP ( addr u -- ) DUP 0= IF 2DROP EXIT THEN BASE @ >R HEX BEGIN CR OVER BASE-ADDR - 4 .0 SPACE 2DUP 0x10 MIN 2DUP 0 DO I 4 MOD 0= IF SPACE THEN DUP C@ 2 .0 SPACE 1+ LOOP DROP DUP >R PTYPE R@ - SWAP R> + SWAP DUP 0= UNTIL 2DROP R> BASE ! CR ; : .LIST ( ADDR ADDR1 -- ADDR1' ) S_STATE @ IF SWAP BEGIN 2DUP U> WHILE INST CR REPEAT NIP ELSE TUCK OVER - DUP IF DUP DUMP_MAX U> IF >R DUMP_MAX DUMP CR DUP U. R> DUMP_MAX - U. ." bytes" ELSE MDUMP THEN CR ELSE 2DROP THEN THEN ; VECT INCLUDED$ ' INCLUDED TO INCLUDED$ : INCLUDED_L [']
>BODY @ >R ['] HERE-TO-TAB TOHERE-TAB HERE-TAB-CUR ! SHERE-TAB SHERE-TAB-CUR ! 2DUP 2>R INCLUDED$ 2R> R> TO-1 SHERE-TAB-CUR @ ! SHERE-TAB-CUR+ HERE-TO-TAB HERE-TO-TAB -CELL HERE-TAB-CUR +! HERE-TAB-CUR @ @ -CELL HERE-TAB-CUR +! BEGIN HERE-TAB-CUR @ HERE-TAB <> WHILE HERE-TAB-CUR @ @ UMIN DUP HERE-TAB-CUR @ ! -CELL HERE-TAB-CUR +! REPEAT DROP S_STATE 0! SHERE-TAB SHERE-TAB-CUR ! 2DUP FILE_NAME_L PLACE S" _L" FILE_NAME_L +PLACE R/O OPEN-FILE THROW FILE_NAME_L COUNT 2DUP + 0! W/O CREATE-FILE THROW TIB >R >IN @ >R #TIB @ >R SOURCE-ID >R BLK @ >R CURSTR @ >R H-STDOUT >R BASE @ >R HEX C/L 2 + ALLOCATE THROW TO TIB BLK 0! TO H-STDOUT ." ZZ=" DUP . TO_SOURCE-ID CURSTR 0! HERE-TAB-CUR @ @ BEGIN REFILL WHILE SOURCE TYPE CR BEGIN SHERE-TAB-CUR @ @ HERE-TAB-CUR @ CELL+ @ U< WHILE SHERE-TAB-CUR @ @ .LIST SHERE-TAB-CUR+ S_STATE @ INVERT S_STATE ! REPEAT HERE-TAB-CUR+ HERE-TAB-CUR @ @ .LIST REPEAT DROP TIB FREE THROW FROM_SOURCE-ID ." ZZ=" DUP . CLOSE-FILE THROW ( ошибка закрытия файла ) H-STDOUT CLOSE-FILE THROW ( ошибка закрытия файла ) R> BASE ! R> TO H-STDOUT R> CURSTR ! R> BLK ! R> TO SOURCE-ID R> #TIB ! R> >IN ! R> TO TIB ; : REQUIRED_L ( waddr wu laddr lu -- ) 2SWAP SFIND IF DROP 2DROP EXIT ELSE 2DROP INCLUDED_L THEN ; [UNDEFINED] PSKIP [IF] : PSKIP SKIP ; [THEN] : REQUIRE_L ( "word" "libpath" -- ) BL PSKIP BL PARSE BL PSKIP BL PARSE 2DUP + 0 SWAP C! REQUIRED_L ; : : : SHERE-TO-TAB ; : ; POSTPONE ; SHERE-TO-TAB ; IMMEDIATE : SSSS HERE-TAB HERE-TAB-CUR ! SHERE-TAB SHERE-TAB-CUR ! ;