-
Notifications
You must be signed in to change notification settings - Fork 9
/
Copy pathblocks.f
80 lines (61 loc) · 3.09 KB
/
blocks.f
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
69
70
71
72
73
74
75
76
77
78
79
80
\ block words
variable scr
variable recent-buffer
variable buffer-map
variable buffers-base
variable max-buffers
variable blockfile
variable max-blocks
variable bfname
create bfname0 bl string blockfile
: buffer-addr ( n -- a ) 1024 * buffers-base @ + ;
: buffer-block ( n -- a ) 2 cells * buffer-map @ + ;
: buffer-dirty ( n -- a ) buffer-block cell+ ;
: open-blockfile ( -- )
blockfile @ 0= if bfname @ count r/w open-file ?fcheck
blockfile ! then ;
: update ( -- ) recent-buffer @ buffer-dirty on ;
: save-buffer ( n -- ) dup buffer-block @ 1024 *
blockfile @ reposition-file ?fcheck dup buffer-addr 1024
blockfile @ write-file ?fcheck buffer-dirty off ;
: flush ( -- ) blockfile @ if max-buffers @ 0 do i
buffer-dirty @ if i save-buffer then loop then ;
: empty-buffers ( -- ) buffer-map @ max-buffers @ 2 cells *
erase ;
: next-buffer ( n1 -- n2 ) 1+ max-buffers @ mod ;
: buffer ( n -- a ) max-buffers @ 0 do recent-buffer @ i +
next-buffer dup buffer-dirty @ 0= if dup recent-buffer ! dup
>r buffer-block ! r> buffer-addr unloop exit then drop loop
recent-buffer @ next-buffer dup save-buffer dup recent-buffer
! dup >r buffer-block ! r> buffer-addr ;
: block ( n -- a ) open-blockfile
max-buffers @ 0 do dup i buffer-block @ = if drop
i buffer-addr i recent-buffer ! unloop exit then loop dup
1024 * blockfile @ reposition-file ?fcheck buffer dup 1024
blockfile @ read-file ?fcheck drop ;
: load ( n -- ) >r save-input r@ blk ! r> block >r
>in off 1024 >limit ! r> sourcebuf ! interpret restore-input
0= if space s" unable to restore input" type cr abort then
blk @ ?dup if block sourcebuf ! then ;
: thru ( n1 n2 -- ) 1+ swap do i load loop ;
: .row ( n -- ) 2 .r [char] │ emit ;
: .blkhdr ( n -- ) s" ╭BLOCK: " type 4 u.r
s" ─────────────────────────────────────────────────────╮" type cr ;
: list ( n -- ) base @ >r decimal dup scr ! dup .blkhdr
block 16 0 do i .row dup 64 type [char] │ emit cr 64
+ loop drop r> base !
s" ╰────────────────────────────────────────────────────────────────╯"
type cr ;
: .buffers ( -- ) base @ cr
." Buffer Block Dirty Address" cr
." ─────────────────────────────" cr
max-buffers @ 0 do decimal
6 spaces i 2 .r 3 spaces i buffer-block @ 4 .r
4 spaces i buffer-dirty @ if [char] X else [char] - then
emit 3 spaces hex i buffer-addr 8 .r cr
loop base ! ;
\ initialization
16 max-buffers !
heaptop @ max-buffers @ 1024 * - buffers-base !
bfname0 bfname ! 1024 max-blocks !
buffers-base @ max-buffers @ 2 cells * - buffer-map !