2010-12-03 11:32:16 +01:00
|
|
|
#! /usr/bin/gforth
|
2010-12-10 01:04:21 +01:00
|
|
|
|
2011-01-20 22:15:28 +01:00
|
|
|
\ variable cr-count
|
|
|
|
\ : cr cr cr-count dup @ 1+ swap ! ;
|
|
|
|
\ : cr-reset 0 cr-count ! ;
|
|
|
|
\ : page page cr-reset ;
|
|
|
|
|
2011-01-15 18:51:06 +01:00
|
|
|
\ 2-rot ist bei gforth anscheinend nicht definiert
|
|
|
|
: 2-rot { a1 a2 b1 b2 c1 c2 } c1 c2 a1 a2 b1 b2 ;
|
|
|
|
|
2011-01-16 17:23:45 +01:00
|
|
|
needs ansi.fs
|
|
|
|
|
|
|
|
\ at-xy? war mal bestandteil von gforth:
|
|
|
|
\ http://www.complang.tuwien.ac.at/cvsweb/cgi-bin/cvsweb/gforth/contrib/ansi.fs?rev=1.1;hideattic=0
|
|
|
|
: read-cdnumber ( c - n | read a numeric entry delimited by character c)
|
|
|
|
>r 0 begin
|
|
|
|
key dup r@ -
|
|
|
|
while
|
|
|
|
swap 10 * swap [char] 0 - +
|
|
|
|
repeat
|
|
|
|
r> 2drop
|
|
|
|
;
|
|
|
|
: at-xy? ( -- x y | return the current cursor coordinates)
|
|
|
|
ESC[ ." 6n"
|
|
|
|
key drop key drop \ <esc> [
|
|
|
|
[char] ; read-cdnumber [char] R read-cdnumber
|
|
|
|
1- swap 1-
|
|
|
|
;
|
|
|
|
|
|
|
|
: escape ( -- addr len ) s\" \e" ;
|
|
|
|
: csi ( -- addr len ) s\" \e[" ;
|
2011-01-19 22:46:31 +01:00
|
|
|
: sgr ( u -- ) ESC[ 0 .r [char] m emit ;
|
2011-01-02 21:12:37 +01:00
|
|
|
: term-size form ;
|
|
|
|
: term-height ( -- i ) term-size drop ;
|
|
|
|
: term-width ( -- i ) term-size nip ;
|
2011-01-16 17:23:45 +01:00
|
|
|
: cursor@ ( -- x y ) at-xy? ;
|
|
|
|
: cursor! ( x y -- ) at-xy ;
|
|
|
|
: cursorx@ ( -- x ) cursor@ drop ;
|
|
|
|
: cursory@ ( -- y ) cursor@ nip ;
|
|
|
|
: cursorx! ( x -- ) cursory@ cursor! ;
|
|
|
|
: cursory! ( x -- ) cursorx@ swap cursor! ;
|
2011-01-19 22:46:31 +01:00
|
|
|
|
2011-01-20 22:15:28 +01:00
|
|
|
: cursor' ( i c -- ) swap dup if ESC[ 0 u.r emit else 2drop then ;
|
2011-01-19 22:13:45 +01:00
|
|
|
: cursor^ ( i -- ) [char] A cursor' ;
|
|
|
|
: cursor_ ( i -- ) [char] B cursor' ;
|
|
|
|
: cursor> ( i -- ) [char] C cursor' ;
|
|
|
|
: cursor< ( i -- ) [char] D cursor' ;
|
2011-01-19 22:46:31 +01:00
|
|
|
: screen^ ( i -- ) [char] S cursor' ;
|
|
|
|
: screen_ ( i -- ) [char] T cursor' ;
|
2011-01-02 21:12:37 +01:00
|
|
|
|
2010-12-31 18:52:41 +01:00
|
|
|
: isnewline? ( c -- i ) dup 10 = swap 13 = or ;
|
2011-01-16 17:23:45 +01:00
|
|
|
: isspace? ( c -- i ) dup 9 = over 11 = or swap 32 = or ;
|
2010-12-31 18:52:41 +01:00
|
|
|
: anyspaces? ( c -- i ) dup isnewline? isspace? or ;
|
|
|
|
|
|
|
|
: clearwspace ( c -- c )
|
|
|
|
dup
|
|
|
|
case
|
|
|
|
9 of 32 endof
|
|
|
|
11 of 32 endof
|
|
|
|
13 of 10 endof
|
|
|
|
dup
|
|
|
|
endcase nip
|
|
|
|
;
|
|
|
|
|
2011-01-16 13:33:07 +01:00
|
|
|
variable typewriter-delay
|
|
|
|
: typewriter-type ( addr len -- )
|
|
|
|
typewriter-delay @ -rot
|
|
|
|
over + swap +do
|
|
|
|
dup ms i @ emit
|
|
|
|
loop
|
|
|
|
drop
|
|
|
|
;
|
|
|
|
50 typewriter-delay !
|
2011-01-16 01:52:12 +01:00
|
|
|
|
2011-01-16 17:23:45 +01:00
|
|
|
variable scroll-delay
|
|
|
|
: scroll-type ( addr len -- )
|
2011-01-21 00:38:04 +01:00
|
|
|
dup 1 < if 2drop exit then
|
2011-01-16 17:23:45 +01:00
|
|
|
term-width over - dup cursorx@ - swap cursorx!
|
|
|
|
-rot 2dup type scroll-delay @ ms dup 1 + cursor< 2dup type s" " type
|
|
|
|
rot scroll-delay @ swap 1 +do
|
|
|
|
dup ms -rot dup 2 + cursor< 2dup type s" " type rot
|
|
|
|
loop
|
|
|
|
2drop drop
|
|
|
|
;
|
2011-01-21 00:38:04 +01:00
|
|
|
10 scroll-delay !
|
2011-01-16 17:23:45 +01:00
|
|
|
|
2011-01-19 22:13:45 +01:00
|
|
|
variable ptype-indent \ Zeile Einruecken
|
2011-01-20 22:15:28 +01:00
|
|
|
variable ptype-curx \ cursorx@-emulation durch zaehlen.
|
|
|
|
: ptype-cursorx@ ( -- i ) ptype-curx @ ;
|
|
|
|
: ptype-curx@! ( -- ) cursorx@ ptype-curx ! ;
|
2011-01-16 01:52:12 +01:00
|
|
|
defer ptype-type
|
|
|
|
' type is ptype-type
|
2010-12-31 18:52:41 +01:00
|
|
|
: ptype-word ( addrw addrc c -- addrc+1 )
|
|
|
|
-rot \ c addrw addrc
|
2011-01-16 01:52:12 +01:00
|
|
|
dup -rot over - ptype-type \ c addrc
|
2010-12-31 18:52:41 +01:00
|
|
|
swap emit 1+ \ addrc+1
|
|
|
|
;
|
2011-01-19 22:13:45 +01:00
|
|
|
: ptype-init ( addr len lenm x -- addre lenm lenl addrw addre addr )
|
2011-01-20 22:15:28 +01:00
|
|
|
dup ptype-indent @ \ addr len lenm x x indent
|
|
|
|
swap - \ addr len lenm x indent-x
|
|
|
|
dup 0>= if
|
|
|
|
cursor> drop ptype-indent @
|
|
|
|
else drop then
|
|
|
|
{ addr len lenm x } addr len + lenm x addr addr len + addr
|
2010-12-31 18:52:41 +01:00
|
|
|
;
|
2011-01-19 22:13:45 +01:00
|
|
|
: ptype-newline ( lenm lenl addrw addrc -- lenm lenl addrw )
|
2010-12-31 18:52:41 +01:00
|
|
|
10 ptype-word \ lenm lenl addrw=addrc+1
|
2011-01-19 22:13:45 +01:00
|
|
|
ptype-indent @ dup cursor> swap \ lenm lenl0 addrw
|
2010-12-31 18:52:41 +01:00
|
|
|
;
|
|
|
|
: ptype-space ( lenm lenl addrw addrc -- lenm lenl1 addrw )
|
|
|
|
32 ptype-word \ lenm lenl addrw=addrc+1
|
|
|
|
swap 1+ swap \ lenm lenl+=1 addrw
|
|
|
|
;
|
|
|
|
: ptype-anychar ( lenm lenl addrw addrc -- lenm lenl addrw addrc )
|
|
|
|
2over <=
|
|
|
|
if
|
|
|
|
\ lenm lenl addrw addrc
|
2011-01-19 22:13:45 +01:00
|
|
|
rot tuck over swap - \ lenm addrw lenl addrc addrc-lenl
|
2010-12-31 18:52:41 +01:00
|
|
|
2over drop >= \ lenm addrw lenl addrc addrc-lenl>=addrw
|
|
|
|
if \ Wort ist laenger als eine Zeile -> muss umgebrochen werden.
|
|
|
|
1- -rot 1- -rot 2dup - \ lenm lenl addrc-1 addrw addrc-1-addrw
|
2011-01-16 01:52:12 +01:00
|
|
|
ptype-type ." -" nip 1 swap dup \ lenm lenl addrw=addrc-1 addrc-1
|
2011-01-19 22:13:45 +01:00
|
|
|
else \ Wort erst in der naechsten Zeile ausgeben.
|
2010-12-31 18:52:41 +01:00
|
|
|
nip 2dup - negate -rot \ lenm addrc-addrw addrw addrc
|
|
|
|
then
|
2011-01-19 22:13:45 +01:00
|
|
|
cr
|
|
|
|
rot ptype-indent @ dup cursor> + -rot
|
2010-12-31 18:52:41 +01:00
|
|
|
then
|
|
|
|
rot 1+ -rot
|
|
|
|
;
|
2011-01-19 22:13:45 +01:00
|
|
|
: ptype' ( addre lenm lenl addrw addre addr -- )
|
2010-12-31 18:52:41 +01:00
|
|
|
\ addre ist fuer die schleife unwichtig
|
|
|
|
+do \ lenm lenl addrw
|
|
|
|
i dup c@ \ lenm lenl addrw addrc c
|
|
|
|
clearwspace
|
|
|
|
case \ lenm lenl addrw addrc c
|
|
|
|
10 of ptype-newline endof
|
|
|
|
32 of ptype-space endof
|
2011-01-19 22:13:45 +01:00
|
|
|
drop ptype-anychar
|
2010-12-31 18:52:41 +01:00
|
|
|
endcase
|
|
|
|
loop \ addre lenm lenl addrw
|
2011-01-20 22:15:28 +01:00
|
|
|
swap ptype-curx ! nip tuck - ptype-type
|
2010-12-31 18:52:41 +01:00
|
|
|
;
|
2011-01-20 22:15:28 +01:00
|
|
|
: ptype ( addr len -- ) term-width 1- ptype-cursorx@ ptype-init ptype' ;
|
|
|
|
: ptype-reset ( -- )
|
|
|
|
0 ptype-indent !
|
|
|
|
0 ptype-curx !
|
|
|
|
; \ Nicht einruecken
|
2011-01-19 22:13:45 +01:00
|
|
|
ptype-reset
|
2010-12-31 18:52:41 +01:00
|
|
|
|
2011-01-19 22:13:45 +01:00
|
|
|
: beep 0 term-height 2 - cursor! 7 emit s" *beep* not" type ;
|
2010-12-31 18:52:41 +01:00
|
|
|
|
2010-12-21 19:31:35 +01:00
|
|
|
\ Es folgen ein paar syntaktische Textauszeichnungen.
|
2010-12-23 22:30:28 +01:00
|
|
|
: {i} ( addr -- addr ) 7 sgr ;
|
2010-12-31 18:52:41 +01:00
|
|
|
: <i> ( -- ) ['] {i} , ;
|
2010-12-23 22:30:28 +01:00
|
|
|
: {/i} ( addr -- addr ) 27 sgr ;
|
2010-12-31 18:52:41 +01:00
|
|
|
: </i> ( -- ) ['] {/i} , ;
|
2010-12-25 15:40:07 +01:00
|
|
|
: {b} ( addr -- addr ) 1 sgr ; \ bold
|
2010-12-31 18:52:41 +01:00
|
|
|
: <b> ( -- ) ['] {b} , ;
|
2010-12-23 22:30:28 +01:00
|
|
|
: {/b} ( addr -- addr ) 22 sgr ;
|
2010-12-31 18:52:41 +01:00
|
|
|
: </b> ( -- ) ['] {/b} , ;
|
2010-12-25 15:40:07 +01:00
|
|
|
: {u} ( addr -- addr ) 4 sgr ; \ underline
|
|
|
|
: <u> ( -- ) ['] {u} , ;
|
2010-12-31 18:52:41 +01:00
|
|
|
: {/u} ( addr -- addr ) 24 sgr ;
|
2010-12-25 15:40:07 +01:00
|
|
|
: </u> ( -- ) ['] {/u} , ;
|
2010-12-31 18:52:41 +01:00
|
|
|
: {fc} ( addr -- addr ) dup @ 30 + sgr cell+ ; \ frontcolor
|
2010-12-25 15:40:07 +01:00
|
|
|
: <fc> ( -- ) ['] {fc} , , ;
|
2010-12-31 18:52:41 +01:00
|
|
|
: {/fc} ( addr -- addr ) 39 sgr ;
|
2010-12-23 22:30:28 +01:00
|
|
|
: </fc> ( -- ) ['] {/fc} , ;
|
2010-12-31 18:52:41 +01:00
|
|
|
: {bc} ( addr -- addr ) dup @ 40 + sgr cell+ ; \ backgroundcolor
|
2010-12-25 15:40:07 +01:00
|
|
|
: <bc> ( -- ) ['] {bc} , , ;
|
2010-12-31 18:52:41 +01:00
|
|
|
: {/bc} ( addr -- addr ) 49 sgr ;
|
2010-12-23 22:30:28 +01:00
|
|
|
: </bc> ( -- ) ['] {/bc} , ;
|
2011-01-02 21:12:37 +01:00
|
|
|
: {br} ( addr -- addr ) cr ptype-reset ;
|
2011-01-15 18:51:06 +01:00
|
|
|
: <br> ( -- , xt-{br} ) ['] {br} , ;
|
2011-01-16 13:33:07 +01:00
|
|
|
: {animation} ( addr , xt -- addr ) dup @ ['] ptype-type defer! cell+ ;
|
|
|
|
: <animation> ( xt -- addr u- , xt-{animation} xt ) ['] {animation} , , ;
|
|
|
|
: {/animation} ( addr -- addr ) ['] type is ptype-type ;
|
|
|
|
: </animation> ( -- , xt-{/animation} ) ['] {/animation} , ;
|
|
|
|
: <tw> ( -- , xt xt ) ['] typewriter-type <animation> ;
|
|
|
|
: </tw> ( -- , xt ) </animation> ;
|
2011-01-16 17:23:45 +01:00
|
|
|
: <scroll> ( -- , xt xt ) ['] scroll-type <animation> ;
|
|
|
|
: </scroll> ( -- , xt ) </animation> ;
|
2011-01-02 21:12:37 +01:00
|
|
|
\ Es folgen ein paar blockorientierte Kennzeichnungen.
|
2011-01-15 18:51:06 +01:00
|
|
|
: {h} ( addr , len -- addr )
|
2011-01-02 21:12:37 +01:00
|
|
|
cr
|
|
|
|
term-width over @ - 2 / \ addr width-twidth/2
|
2011-01-20 22:15:28 +01:00
|
|
|
dup ptype-curx ! cursor>
|
2011-01-19 22:13:45 +01:00
|
|
|
cell+ {b}
|
2011-01-02 21:12:37 +01:00
|
|
|
; \ header
|
2011-01-15 18:51:06 +01:00
|
|
|
: <h> ( -- addr 0 , xt-{h} 0 ) ['] {h} , here 0 , 0 ;
|
|
|
|
: {/h} ( addr , len -- addr1 )
|
2011-01-19 22:13:45 +01:00
|
|
|
{/b} cursorx@ 1+ \ addr x
|
2011-01-02 21:12:37 +01:00
|
|
|
cr
|
2011-01-19 22:13:45 +01:00
|
|
|
over @ term-width swap - 2 / 1- \ addr x indent
|
|
|
|
cursor> \ addr x
|
|
|
|
cursorx@ +do ." =" loop \ addr
|
|
|
|
cr cell+
|
2011-01-02 21:12:37 +01:00
|
|
|
;
|
2011-01-15 18:51:06 +01:00
|
|
|
: </h> ( addr len -- , xt-{/h} len0 ) ['] {/h} , dup , swap ! ;
|
2011-01-02 21:12:37 +01:00
|
|
|
: {p} ( addr -- addr ) cr ptype-reset cell+ ; \ paragraph
|
2011-01-15 18:51:06 +01:00
|
|
|
: <p> ( -- addr u0 , xt-{p} 0 ) ['] {p} , here 0 , 0 ;
|
2011-01-02 21:12:37 +01:00
|
|
|
: {/p} ( addr -- addr ) cr ;
|
2011-01-15 18:51:06 +01:00
|
|
|
: </p> ( addr len -- , xt-{/p} ) ['] {/p} , swap ! ;
|
2011-01-02 21:12:37 +01:00
|
|
|
: {li} ( addr -- addr )
|
2011-01-19 22:13:45 +01:00
|
|
|
2 cursor> space 1 cursor>
|
2011-01-20 22:15:28 +01:00
|
|
|
6 dup ptype-indent ! ptype-curx !
|
2011-01-02 21:12:37 +01:00
|
|
|
cell+
|
|
|
|
;
|
2011-01-15 18:51:06 +01:00
|
|
|
: <li> ( -- addr u0 , xt-{li} 0 ) ['] {li} , here 0 , 0 ;
|
2011-01-02 21:12:37 +01:00
|
|
|
: {/li} ( addr -- addr ) cr ;
|
2011-01-15 18:51:06 +01:00
|
|
|
: </li> ( addr len -- , xt-{/li} ) ['] {/li} , swap ! ;
|
2011-01-21 11:31:43 +01:00
|
|
|
33 constant table-color
|
|
|
|
: {|} ( addr -- addr )
|
|
|
|
dup @ dup ptype-cursorx@ - \ addr > >-i
|
|
|
|
dup 1 < if
|
|
|
|
drop
|
|
|
|
else
|
|
|
|
1- spaces
|
|
|
|
endif
|
|
|
|
ptype-curx ! table-color sgr ." |" 39 sgr cell+
|
|
|
|
;
|
|
|
|
: <|> ( i -- addr , xt-{|} i ) ['] {|} , , ;
|
|
|
|
: {-} ( addr -- addr ) cr dup @ 0 table-color sgr +do [char] - emit loop 39 sgr cell+ cr ;
|
|
|
|
: <-> ( i -- addr , xt-{-} i ) ['] {-} , , ;
|
2010-12-21 19:31:35 +01:00
|
|
|
|
2011-01-15 23:04:40 +01:00
|
|
|
variable enumerationCount ( -- addr )
|
2011-01-16 13:14:45 +01:00
|
|
|
: {||} ( addr -- addr ) \ increments enumeration count and prints prefix
|
2011-01-19 22:13:45 +01:00
|
|
|
enumerationCount dup @ 1+ dup rot !
|
2011-01-20 22:15:28 +01:00
|
|
|
2 cursor> 0 u.r ." ." 1 cursor>
|
|
|
|
6 dup ptype-indent ! ptype-curx !
|
2011-01-15 23:04:40 +01:00
|
|
|
;
|
2011-01-19 22:13:45 +01:00
|
|
|
: <||> ( -- , xt-{||} 0 ) ['] {||} , ;
|
2011-01-15 23:04:40 +01:00
|
|
|
: {/||} ( addr -- addr ) cr ;
|
2011-01-16 13:14:45 +01:00
|
|
|
: </||> ( -- , xt-{/||} ) ['] {/||} , ;
|
2011-01-15 23:04:40 +01:00
|
|
|
|
2011-01-19 22:13:45 +01:00
|
|
|
: {en} ( -- )
|
|
|
|
5 ptype-indent ! \ 6 Zeichen weit einruecken
|
|
|
|
0 enumerationCount ! \ resets enumeration count
|
|
|
|
;
|
2011-01-16 13:14:45 +01:00
|
|
|
: <en> ( -- , xt-{en} ) ['] {en} , ;
|
2011-01-19 22:13:45 +01:00
|
|
|
: {/en} ( -- ) ptype-reset ;
|
2011-01-16 13:14:45 +01:00
|
|
|
: </en> ( -- , xt-{/en} ) ['] {en} , ;
|
2011-01-15 23:04:40 +01:00
|
|
|
|
2011-01-16 19:06:02 +01:00
|
|
|
256 Constant max-line
|
|
|
|
Create line-buffer max-line 2 + allot
|
|
|
|
|
|
|
|
0 Value fd-in
|
|
|
|
: open-input ( addr u -- ) r/o open-file throw to fd-in ;
|
|
|
|
|
2011-01-21 00:38:04 +01:00
|
|
|
: printsource ( from to addr u 1/0 -- )
|
2011-01-20 22:50:44 +01:00
|
|
|
{ showLines }
|
2011-01-20 22:15:28 +01:00
|
|
|
open-input
|
|
|
|
cr
|
|
|
|
0
|
|
|
|
begin
|
|
|
|
1+ line-buffer max-line fd-in read-line throw
|
|
|
|
while
|
|
|
|
swap 2over rot tuck >= if
|
|
|
|
tuck <= if
|
|
|
|
dup 0 <# #s #> \ ... i str l
|
|
|
|
dup ptype-indent @ \ i str l l indent
|
|
|
|
dup ptype-curx ! 1- \ i str l l indent
|
2011-01-21 00:38:04 +01:00
|
|
|
swap - dup 0< if drop else cursor> then \ i str l
|
|
|
|
showLines if
|
|
|
|
type ." |" \ ... i \ Eingerueckt Zahl ausgeben
|
|
|
|
else 2drop \ Eingerueckt keine Zahl ausgeben
|
|
|
|
endif
|
2011-01-20 22:15:28 +01:00
|
|
|
swap line-buffer swap ptype cr
|
|
|
|
else nip
|
|
|
|
endif
|
|
|
|
else nip nip
|
2011-01-16 19:06:02 +01:00
|
|
|
endif
|
2011-01-20 22:15:28 +01:00
|
|
|
repeat
|
|
|
|
2drop 2drop
|
|
|
|
fd-in close-file throw
|
|
|
|
;
|
2011-01-16 19:06:02 +01:00
|
|
|
|
2011-01-21 00:38:04 +01:00
|
|
|
: printCodeHeader ( end start namelen addr 1/0 -- ) \ prints source code header containing line numbers
|
2011-01-20 22:50:44 +01:00
|
|
|
{ showLines }
|
2011-01-20 22:15:28 +01:00
|
|
|
swap 2swap \ addr namelen end start
|
|
|
|
2dup > if swap then \ addr namelen start/end end/start
|
2011-01-21 00:38:04 +01:00
|
|
|
showLines if dup 0 <# #s #> nip else 0 then ptype-reset 1+ ptype-indent !
|
2011-01-20 22:15:28 +01:00
|
|
|
2swap \ start end addr namelen
|
2011-01-20 22:50:44 +01:00
|
|
|
showLines printsource cr
|
2011-01-20 22:15:28 +01:00
|
|
|
;
|
2011-01-16 19:06:02 +01:00
|
|
|
|
2011-01-21 11:31:43 +01:00
|
|
|
: {source} ( -- ) ;
|
2011-01-16 19:06:02 +01:00
|
|
|
: <source> ( -- , xt-{source} ) ['] {source} , ;
|
2011-01-21 11:31:43 +01:00
|
|
|
: {/source} ( -- ) dup dup dup dup @ swap cell + @ 2swap cell 2 * +
|
2011-01-20 22:50:44 +01:00
|
|
|
@ swap cell 3 * + @ 1 printCodeHeader 4 cells + ;
|
2011-01-16 19:06:02 +01:00
|
|
|
: </source> ( -- , xt-{/source} ) ['] {/source} , , , , , ;
|
|
|
|
|
2011-01-21 11:31:43 +01:00
|
|
|
: {file} ( -- ) ;
|
2011-01-20 21:56:15 +01:00
|
|
|
: <file> ( -- , xt-{file} ) ['] {file} , ;
|
2011-01-21 11:31:43 +01:00
|
|
|
: {/file} ( -- ) dup dup dup dup @ swap cell + @ 2swap cell 2 * +
|
2011-01-20 22:50:44 +01:00
|
|
|
@ swap cell 3 * + @ 0 printCodeHeader 4 cells + ;
|
2011-01-20 21:56:15 +01:00
|
|
|
: </file> ( -- , xt-{/file} ) ['] {/file} , , , , , ;
|
|
|
|
|
2010-12-25 15:40:07 +01:00
|
|
|
: {np} ( -- )
|
|
|
|
0 sgr \ Alle Bildschirmeigenschaften zuruecksetzen
|
2011-01-02 21:12:37 +01:00
|
|
|
page \ Bildschirm leeren
|
2010-12-25 15:40:07 +01:00
|
|
|
;
|
2011-01-02 21:12:37 +01:00
|
|
|
: {/np} ( -- )
|
|
|
|
\ 30 sgr 40 sgr
|
2011-01-20 22:15:28 +01:00
|
|
|
0 term-height dup cursory@ - 2 / dup 0< if drop else screen_ then 2 - cursor!
|
2011-01-02 21:12:37 +01:00
|
|
|
;
|
2011-01-15 18:51:06 +01:00
|
|
|
: <np> ( -- addr , xt-{/np} xt-{np} )
|
|
|
|
\ Wir legen jede Anfangsadresse einer Seite auf den Stack (Achtung, in umgekehrter Reihenfolge)
|
|
|
|
['] {/np} ,
|
|
|
|
here
|
|
|
|
['] {np} ,
|
2010-12-21 19:31:35 +01:00
|
|
|
;
|
2010-12-31 18:52:41 +01:00
|
|
|
|
2010-12-25 15:40:07 +01:00
|
|
|
: {!!} ( addr -- addr+2 )
|
2010-12-31 18:52:41 +01:00
|
|
|
dup @ \ addr straddr
|
|
|
|
swap \ straddr addr
|
|
|
|
cell+ \ straddr addr
|
|
|
|
tuck \ addr straddr addr
|
|
|
|
@ \ addr straddr strlen
|
2011-01-02 21:12:37 +01:00
|
|
|
ptype \ addr
|
2010-12-25 15:40:07 +01:00
|
|
|
cell+
|
|
|
|
;
|
2011-01-15 18:51:06 +01:00
|
|
|
: !! ( len0 addr1 len1 -- len , xt-{!!} addr1 len1 )
|
2010-12-25 15:40:07 +01:00
|
|
|
['] {!!} ,
|
2010-12-21 19:31:35 +01:00
|
|
|
dup \ len0 addr1 len1 len1
|
|
|
|
rot , , \ len0 len1 len1 addr1 -> len0 len1
|
2010-12-25 15:40:07 +01:00
|
|
|
+ \ len0+len1
|
|
|
|
;
|
2011-01-02 21:12:37 +01:00
|
|
|
:noname ( -- ) 34 parse save-mem !! ; :noname 34 parse postpone sliteral postpone !! ; interpret/compile: !"
|
|
|
|
:noname ( -- ) \"-parse save-mem !! ; :noname \"-parse postpone sliteral postpone !! ; interpret/compile: !\"
|
2010-12-25 15:40:07 +01:00
|
|
|
|
|
|
|
: pres_page_cur ( addr -- addr ) ;
|
|
|
|
: pres_page_from ( addr -- addr ) cell+ ;
|
|
|
|
: pres_page_to ( addr -- addr ) 2 cells + ;
|
2010-12-21 19:31:35 +01:00
|
|
|
|
|
|
|
\ faddr: erste Seitenzeigeradresse (letzte Presentationsseite)
|
|
|
|
\ laddr: letzte Seitenzeigeradresse (erste Presentationsseite)
|
|
|
|
\ paddr: derzeitige Seitenzeigeradresse
|
2010-12-03 11:32:16 +01:00
|
|
|
|
2010-12-31 18:52:41 +01:00
|
|
|
: page_steps ( laddr paddr 0 [u] -- u )
|
2010-12-21 19:31:35 +01:00
|
|
|
\ u muss ungleich 0 sein. falls u nicht vorhanden: 1
|
2010-12-23 22:30:28 +01:00
|
|
|
dup 0= if 1 then \ laddr paddr 0 u
|
2010-12-31 18:52:41 +01:00
|
|
|
nip
|
2010-12-21 19:31:35 +01:00
|
|
|
;
|
|
|
|
: validpage? ( faddr laddr paddr -- faddr laddr paddr u )
|
2010-12-31 18:52:41 +01:00
|
|
|
2dup <= \ faddr laddr paddr u
|
|
|
|
2over drop rot tuck >
|
2010-12-25 15:40:07 +01:00
|
|
|
rot \ faddr laddr paddr u u
|
2011-01-15 18:51:06 +01:00
|
|
|
if drop cell - 1 \ faddr laddr paddr-1 -1 \ paddr-overflow
|
|
|
|
else if cell+ -1 \ faddr laddr paddr+1 -1 \ paddr-underflow
|
2010-12-25 15:40:07 +01:00
|
|
|
else 0 \ faddr laddr paddr 0
|
|
|
|
then then
|
2010-12-21 19:31:35 +01:00
|
|
|
;
|
|
|
|
: showpage' ( paddr -- )
|
2010-12-31 18:52:41 +01:00
|
|
|
dup cell - \ paddr paddr+cell
|
2010-12-23 22:30:28 +01:00
|
|
|
@ swap @ \ naddr addr \ Seiteninhaltsadressen
|
2010-12-31 18:52:41 +01:00
|
|
|
begin 2dup >
|
2010-12-23 22:30:28 +01:00
|
|
|
while
|
|
|
|
dup cell+ swap \ naddr xtaddr xtaddr
|
|
|
|
@ \ naddr xtaddr xt
|
|
|
|
execute \ verschiebt eventuell den Zeiger noch weiter, wenn es Parameter erwartet.
|
|
|
|
repeat
|
2010-12-25 15:40:07 +01:00
|
|
|
2drop
|
2010-12-21 19:31:35 +01:00
|
|
|
;
|
2011-01-15 18:51:06 +01:00
|
|
|
: showpage ( faddr laddr paddr -- faddr laddr paddr0 0 )
|
|
|
|
validpage? 0 tuck 2-rot drop \ i 0 faddr laddr paddr0
|
|
|
|
dup showpage' 0 2rot drop \ faddr laddr paddr0 0 i
|
2010-12-25 15:40:07 +01:00
|
|
|
if beep then
|
2011-01-02 21:12:37 +01:00
|
|
|
;
|
2011-01-15 18:51:06 +01:00
|
|
|
: n ( faddr laddr paddr 0 [u] -- faddr laddr paddr 0 ) page_steps cells - showpage ;
|
|
|
|
: g ( faddr laddr paddr 0 u -- faddr laddr paddr 0 ) cells nip nip over swap - showpage ;
|
|
|
|
: p ( faddr laddr paddr 0 [u] -- faddr laddr paddr 0 ) page_steps cells + showpage ;
|
|
|
|
: u ( faddr laddr paddr X -- faddr laddr paddr 0 ) drop showpage ;
|
2011-01-02 21:12:37 +01:00
|
|
|
: q bye ;
|
2010-12-03 11:32:16 +01:00
|
|
|
|
2011-01-15 18:51:06 +01:00
|
|
|
: <presentation> ( -- addr0 0 addr1 , xt-{np} ) here 0 here ['] {np} , ;
|
2011-01-02 21:12:37 +01:00
|
|
|
: </presentation> ( 0 <addr...> -- faddr laddr paddr 0 !! endaddr 0 0 0 0 <...addr> )
|
|
|
|
<np>
|
|
|
|
here \ 0 <addr...> faddr
|
|
|
|
begin swap dup \ 0 <addr..> addr0 faddr
|
|
|
|
while , \ 0 <addr..> faddr
|
|
|
|
repeat \ .s cr
|
|
|
|
drop \ faddr
|
|
|
|
here dup 0 \ faddr laddr paddr 0
|
|
|
|
\ u \ Praesentation starten
|
|
|
|
;
|