From 67d25d837ac55f28a366c0a3b262e439a6e75fc3 Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Sat, 19 Aug 2017 12:15:28 +0200 Subject: Add AmForth --- amforth-6.5/common/lib/forth2012/blocks/blocks.frt | 68 ++++++++++++++++++++++ .../common/lib/forth2012/blocks/list-dump.frt | 10 ++++ amforth-6.5/common/lib/forth2012/blocks/list.frt | 24 ++++++++ amforth-6.5/common/lib/forth2012/blocks/load.frt | 20 +++++++ 4 files changed, 122 insertions(+) create mode 100644 amforth-6.5/common/lib/forth2012/blocks/blocks.frt create mode 100644 amforth-6.5/common/lib/forth2012/blocks/list-dump.frt create mode 100644 amforth-6.5/common/lib/forth2012/blocks/list.frt create mode 100644 amforth-6.5/common/lib/forth2012/blocks/load.frt (limited to 'amforth-6.5/common/lib/forth2012/blocks') 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 +; -- cgit v1.2.3