aboutsummaryrefslogtreecommitdiff
path: root/amforth-6.5/common/lib/forth2012/blocks/blocks.frt
blob: c11be7038a768ba400a4cd6a37aad5268880a59c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
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 ;