programming-tools.f

来自「这个是关于G.726算法的源程序」· F 代码 · 共 117 行

F
117
字号
\ Definitions for PROGRAMMING TOOLS words.
\
\ Ommisions: SEE not implemented.
\
\ This code has been placed in the Public Domain by J.D.Medhurst (aka Tixy)

\ ----------------------------------------------------------------------------

: ?   ( a-addr -- )
	@ . ;

: .S   ( -- )
	CR
	DEPTH
	DUP 0< IF ." Stack underflow!" EXIT THEN
	32   \ Max elements to show
	2DUP U> IF ." ... " NIP ELSE DROP THEN
	BEGIN
		DUP
	WHILE
		DUP PICK .
		1-
	REPEAT
	DROP
;

\ ----------------------------------------------------------------------------
\ Implementation of DUMP

16 CONSTANT DUMP-WIDTH   \ Number of chars to dump per line

\ HERE TRUE C, C@   CONSTANT MAX-CHAR   \ Maximum value of a char

: FOR-EACH-DIGIT   ( u xt -- )
	\ Execute xt a number of times equal to the number of digits it would
	\ take to display u
	BEGIN
		2>R R@ EXECUTE 2R>
		SWAP 0 BASE @ UM/MOD NIP SWAP   \ divide u by BASE
		OVER 0=
	UNTIL
	2DROP
;

: U.PAD   ( u1 u2 -- ) \ Print u1 using same number of digits as u2 would take
	>R
	0 <# BL HOLD 
	R> ['] # FOR-EACH-DIGIT
	#> TYPE
;

: DUMP-ADDRESS   ( addr -- )
	TRUE U.PAD ;

: DUMP-MEMORY   ( c-addr u -- c-addr u )   \ Dump char values
	DUMP-WIDTH 0
	DO
		I 3 AND 0= IF SPACE THEN   \ Add a space every 4 chars
		I OVER U<
		IF
			\ Display char value...
			OVER I CHARS + C@
			MAX-CHAR U.PAD   
		ELSE 
			\ Padding for absent char...
			MAX-CHAR ['] SPACE FOR-EACH-DIGIT
			SPACE
		THEN
	LOOP
	SPACE
;

: DUMP-CHARS   ( c-addr u -- )   \ Dump characters
	0 ?DO
		DUP C@
		DUP BL U> 0=
		IF DROP [CHAR] . THEN   \ use dot for non-displayable charavters
		EMIT
		CHAR+
	LOOP
	DROP
;

: DUMP-LINE   ( c-addr u -- )
	DUP DUMP-WIDTH U>
	IF DROP DUMP-WIDTH THEN
	OVER DUMP-ADDRESS
	DUMP-MEMORY
	DUMP-CHARS
	CR
;

: MAKE-CHAR-RANGE   ( addr1 u1 - c-addr2 u2 )
	\ Turn address range addr1 u1 into character aligned range c-addr2 u2
	OVER +                             \ Turn u into end address
	0 1 CHARS UM/MOD SWAP IF 1+ THEN   \ Make end into character index
	SWAP 0 1 CHARS UM/MOD NIP SWAP	   \ Make start address character index
	OVER -                             \ Turn end into character count u
	SWAP CHARS SWAP                    \ Turn start onto c-addr
;

: DUMP   ( addr u -- )
	MAKE-CHAR-RANGE
	BASE @ >R
	HEX
	BEGIN
		2DUP DUMP-LINE
		DUP DUMP-WIDTH U>
	WHILE
		DUMP-WIDTH -
		SWAP DUMP-WIDTH CHARS + SWAP
	REPEAT
	2DROP
	R> BASE !
;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?