Skip to content

Instantly share code, notes, and snippets.

@ekipan
Last active April 28, 2023 00:39
Show Gist options
  • Select an option

  • Save ekipan/5691d14c17aed55041bdb4a2fb68e494 to your computer and use it in GitHub Desktop.

Select an option

Save ekipan/5691d14c17aed55041bdb4a2fb68e494 to your computer and use it in GitHub Desktop.
\ marker --
header save-buffers
header empty-buffers header flush
header update header buffer
header block header list
latest
( save each block in a separate
prg file "b001" "b002" etc. )
header 's 's' c, '0' c, ':' c,
header 'b 'b' , 0 ,
: "b000" ['] 'b 4 ;
: "s0:b000" ['] 's 7 ;
: path! ( b-) #10 /mod #10 /mod
'0' + [ ' 'b 1+ ] literal c!
'0' + [ ' 'b 2+ ] literal c!
'0' + [ ' 'b 3 + ] literal c! ;
( in comments 'b' is a block index,
'i' a buffer index 0 1 2, and 'a'
a buffer address $6800 $6c00 $7000 )
create abs 0 , 0 c, ( assigned blocks )
create dirty 0 , 0 c, ( need saved )
: >addr ( i-a) #10 lshift $6800 + ;
: save-buf ( i-)
dup dirty + c@ 0= IF drop exit THEN
dup abs + c@ path!
"s0:b000" $f $f open ioabort $f close
dup >addr dup $400 + "b000" saveb
0 swap dirty + c! ;
define save-buffers ( -)
0 save-buf 1 save-buf 2 save-buf ;
define empty-buffers ( -)
abs 3 0 fill dirty 3 0 fill ;
define flush ( -)
save-buffers empty-buffers ;
( always assign block 1 2 3 4 5 6 7
to buffer 1 2 0 1 2 0 1, to keep
things simple. )
0 value ab ( assigned block )
: buf ( -i) ab 3 mod ;
: addr ( -a) buf >addr ;
: diff? ( -f) buf abs + c@ ab <> ;
: reassign ( -)
buf save-buf ab buf abs + c! ;
define update ( -) -1 buf dirty + c! ;
define buffer ( b-a)
to ab diff? IF reassign THEN addr ;
define block ( b-a)
to ab diff? IF reassign
ab path! "b000" addr loadb 0= IF
addr $400 0 fill THEN THEN addr ;
define list ( b-) block $400 type ;
to latest
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment