\ saving and restroring screen parts
\	hs 13.08.97,
\ memory descriptor, offset in cells
\ 0: screenadr
\ 1: width in bytes
\ 2: height of screen block
\ 3:
\ 4:
\ 5:
\ 6:
\ 7:
\ 8: -- data

terminals also
hidden also definitions
code get-block-parameters
		r0	top		mov
		r0 r1 r2 3	r0 ia	ldm
		r3	top 8 cells #	add	\ r3 *data
		r4	'body (/line)	adr
		r4	r4 )		ldr
		r4	r4	r1	sub	\ r4 missing len of line
					return end-code
code (save-screen-block	( addr -- addr )
		' get-block-parameters	dolink branch
  begin		r5	r1		mov
    begin	r6	r0 byte )+	ldr
		r6	r3 byte )+	str
		r5	1		s decr
    eq until	r0	r0	r4	add
		r2	1		s decr
  eq until c;

code (restore-screen-block	( addr -- addr )
		' get-block-parameters	dolink branch 
  begin		r5	r1		mov
    begin	r6	r3 byte )+	ldr
		r6	r0 byte )+	str	
		r5	1		s decr
    eq until	r0	r0	r4	add
		r2	1		s decr
  eq until c;

forth definitions
: save-screen-block	( width height -- block )
	2dup * (width) * (height) *  8 cells+ allocate
	abort" can't allocate for block save screen" >r
	(height) *  r@ 2 cells+ !
	(width) * r@ cell+ !  cursor-adr r@ !
	r> (save-screen-block ;
: restore-screen-block	( addr -- )
	(restore-screen-block free drop ;
previous previous forth

