aboutsummaryrefslogtreecommitdiff
path: root/amforth-6.5/common/lib/forth2012/blocks
diff options
context:
space:
mode:
Diffstat (limited to 'amforth-6.5/common/lib/forth2012/blocks')
-rw-r--r--amforth-6.5/common/lib/forth2012/blocks/blocks.frt68
-rw-r--r--amforth-6.5/common/lib/forth2012/blocks/list-dump.frt10
-rw-r--r--amforth-6.5/common/lib/forth2012/blocks/list.frt24
-rw-r--r--amforth-6.5/common/lib/forth2012/blocks/load.frt20
4 files changed, 122 insertions, 0 deletions
diff --git a/amforth-6.5/common/lib/forth2012/blocks/blocks.frt b/amforth-6.5/common/lib/forth2012/blocks/blocks.frt
new file mode 100644
index 0000000..c11be70
--- /dev/null
+++ b/amforth-6.5/common/lib/forth2012/blocks/blocks.frt
@@ -0,0 +1,68 @@
+\
+\ simple block wordset
+\ single buffer management.
+\ non-standard block size (to save RAM).
+\ only basic routines. No hardware access
+\
+
+#require defer.frt
+#require buffer.frt
+
+\ high level blocksize, ANS94 says 1024 bytes, SD Cards have 512
+#512 constant blocksize
+variable scr
+
+\ API for low level drivers. They get the
+\ buffer address in RAM and the block number.
+Rdefer load-buffer ( buf-addr u -- )
+Rdefer save-buffer ( buf-addr u -- )
+
+\ single buffer blocks.
+variable blk1
+variable blk1-dirty
+blocksize buffer: blk1-buffer
+
+\ for turnkey
+: block:init
+ -1 blk1 !
+ 0 blk1-dirty !
+;
+
+: update -1 blk1-dirty ! ;
+: updated? ( u -- f )
+ blk1 @ = if
+ blk1-dirty @
+ else
+ 0
+ then
+;
+
+\ reloads the block only if the blocknumber differs
+: block ( u -- a-addr )
+ dup blk1 @ = if drop else
+ blk1 @ updated? if
+ blk1-buffer blk1 @ save-buffer
+ then
+ blk1-buffer swap dup blk1 ! load-buffer
+ 0 blk1-dirty !
+ then
+ blk1-buffer
+;
+
+\ a buffer is an un-initialized block.
+: buffer ( u -- a-addr ) block ;
+
+: save-buffers
+ blk1 @ updated? if
+ blk1-buffer blk1 @ save-buffer
+ then
+ 0 blk1-dirty !
+;
+
+: empty-buffers
+ -1 blk1 !
+ 0 blk1-dirty !
+;
+
+: flush save-buffers empty-buffers ;
+
diff --git a/amforth-6.5/common/lib/forth2012/blocks/list-dump.frt b/amforth-6.5/common/lib/forth2012/blocks/list-dump.frt
new file mode 100644
index 0000000..28a0df7
--- /dev/null
+++ b/amforth-6.5/common/lib/forth2012/blocks/list-dump.frt
@@ -0,0 +1,10 @@
+
+\ a trivial list in hexdump format
+#require dump.frt
+
+: list
+ dup scr !
+ buffer blocksize dump
+ scr @ updated? 0= if ." not " then ." modified" cr
+;
+
diff --git a/amforth-6.5/common/lib/forth2012/blocks/list.frt b/amforth-6.5/common/lib/forth2012/blocks/list.frt
new file mode 100644
index 0000000..2520aeb
--- /dev/null
+++ b/amforth-6.5/common/lib/forth2012/blocks/list.frt
@@ -0,0 +1,24 @@
+
+\ a list in text format. not suitable
+\ for binary data!
+
+\ #16 constant #lines
+\ #64 constant #cols
+
+ #8 constant #lines
+#64 constant #cols
+
+: list ( blk -- ) \ list selected screen
+ dup scr !
+ dup cr ." Listing of screen (" .
+ dup updated? if ." not " then ." modified)" cr
+ buffer
+ #lines 0
+ do
+ cr i 0 <# [char] : hold # # #> type space
+ dup i #cols * +
+ #cols type
+ [char] | emit
+ loop
+ cr
+ ;
diff --git a/amforth-6.5/common/lib/forth2012/blocks/load.frt b/amforth-6.5/common/lib/forth2012/blocks/load.frt
new file mode 100644
index 0000000..55cd14b
--- /dev/null
+++ b/amforth-6.5/common/lib/forth2012/blocks/load.frt
@@ -0,0 +1,20 @@
+\ load a block and evaluate its content
+\
+: source-block1
+ blk1-buffer blocksize
+;
+
+: load ( i*x n -- j*y )
+ ['] source defer@ >r >in @ >r
+ 0 >in !
+ buffer drop
+ ['] source-block1 is source
+ ['] interpret catch
+ r> >in ! r> is source
+ throw
+;
+
+
+: thru ( i*x n1 n2 -- j*y )
+ 1+ swap ?do i load loop
+;