Login

Subversion Repositories NedoOS

Rev

Blame | Last modification | View Log | Download | RSS feed

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