?login_element?

Subversion Repositories NedoOS

Rev

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

  1. reservepage
  2. ;new page, set page in textpages, npages++, set page in #c000
  3. ;nz=error
  4.         OS_NEWPAGE
  5.         or a
  6.         ret nz
  7. npages=$+1
  8.         ld hl,tpg
  9.         ld (hl),e
  10.         inc l
  11.         ld (npages),hl
  12.         ld a,e
  13.         SETPGC000
  14.         xor a
  15.         ret ;z
  16.  
  17. unreservepages
  18.          ;ld a,-1
  19.          ;ld (npages_old),a
  20. unreservepages0
  21.         call unreservepage
  22.         jr z,unreservepages0
  23.         ld hl,0xc000
  24.         ld (freemem_addr),hl
  25.         ld a,-1
  26.         ld (freemem_pg),a
  27.         ret
  28.        
  29. unreservepage
  30. ;del page, npages--
  31. ;nz=error
  32.         ld hl,(npages)
  33.         ld a,l
  34.         or a
  35.         jr z,unreservepage_fail
  36.         dec l
  37.         ld (npages),hl
  38.         ld e,(hl)
  39.         OS_DELPAGE
  40.         xor a
  41.         ret ;z
  42. unreservepage_fail
  43.         xor a
  44.         dec a
  45.         ret ;nz
  46.        
  47. reserve_mem
  48. ;bc=size
  49. ;out: a=pg, de=addr of free space
  50. ;изначально ни одной страницы не заказано
  51. freemem_addr=$+1
  52.         ld de,0xc000 ;при 0xc000 ещё не заказана страница
  53.         ld h,d
  54.         ld l,e
  55.         dec hl
  56.         bit 6,h
  57.         jr z,reserve_mem_pg ;при 0xc000 ещё не заказана страница
  58.         add hl,bc ;hl=конец блока
  59.         jr nc,reserve_mem_nopg
  60. reserve_mem_pg
  61.         ld hl,freemem_pg
  62.         inc (hl)
  63.         push bc
  64.         call reservepage
  65.         pop bc
  66.         ld de,0xc000
  67.         ld h,d
  68.         ld l,e
  69.         dec hl
  70.         add hl,bc ;hl=конец блока
  71. reserve_mem_nopg
  72.         inc hl ;может быть 0 (ещё не заказана страница)
  73.         set 7,h
  74.         set 6,h ;при 0xc000 ещё не заказана страница
  75.         ld (freemem_addr),hl ;0xc000..0xffff
  76. freemem_pg=$+1
  77.         ld a,-1;ld hl,tpg+0xff ;L=условный номер страницы в таблице ;изначально ни одной страницы не заказано
  78.         ;ld a,(hl)
  79. ;out: a=pg, de=addr of free space
  80.         ret
  81.