reservepage
;new page, set page in textpages, npages++, set page in #c000
;nz=error
OS_NEWPAGE
or a
ret nz
npages=$+1
ld hl,tpg
ld (hl),e
inc l
ld (npages),hl
ld a,e
SETPGC000
xor a
ret ;z
unreservepages
;ld a,-1
;ld (npages_old),a
unreservepages0
call unreservepage
jr z,unreservepages0
ld hl,0xc000
ld (freemem_addr),hl
ld a,-1
ld (freemem_pg),a
ret
unreservepage
;del page, npages--
;nz=error
ld hl,(npages)
ld a,l
or a
jr z,unreservepage_fail
dec l
ld (npages),hl
ld e,(hl)
OS_DELPAGE
xor a
ret ;z
unreservepage_fail
xor a
dec a
ret ;nz
reserve_mem
;bc=size
;out: a=pg, de=addr of free space
;изначально ни одной страницы не заказано
freemem_addr=$+1
ld de,0xc000 ;при 0xc000 ещё не заказана страница
ld h,d
ld l,e
dec hl
bit 6,h
jr z,reserve_mem_pg ;при 0xc000 ещё не заказана страница
add hl,bc ;hl=конец блока
jr nc,reserve_mem_nopg
reserve_mem_pg
ld hl,freemem_pg
inc (hl)
push bc
call reservepage
pop bc
ld de,0xc000
ld h,d
ld l,e
dec hl
add hl,bc ;hl=конец блока
reserve_mem_nopg
inc hl ;может быть 0 (ещё не заказана страница)
set 7,h
set 6,h ;при 0xc000 ещё не заказана страница
ld (freemem_addr),hl ;0xc000..0xffff
freemem_pg=$+1
ld a,-1;ld hl,tpg+0xff ;L=условный номер страницы в таблице ;изначально ни одной страницы не заказано
;ld a,(hl)
;out: a=pg, de=addr of free space
ret