?login_element?

Subversion Repositories NedoOS

Rev

Rev 447 | Blame | Compare with Previous | 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,textpages
  9.         ld (hl),e
  10.         inc l
  11.         ld (npages),hl
  12.         ld a,e
  13.         SETPG32KHIGH
  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.         ret
  24.        
  25. unreservepage
  26. ;del page, npages--
  27. ;nz=error
  28.         ld hl,(npages)
  29.         ld a,l
  30.         or a
  31.         jr z,unreservepage_fail
  32.         dec l
  33.         ld (npages),hl
  34.         ld e,(hl)
  35.         OS_DELPAGE
  36.         xor a
  37.         ret ;z
  38. unreservepage_fail
  39.         xor a
  40.         dec a
  41.         ret ;nz
  42.        
  43. reserve_bmp_pages
  44.         ld hl,(freemem_hl)
  45.         ld a,(freemem_a)
  46.         ld (putchar_hl),hl
  47.         ld (putchar_a),a
  48.  
  49.         ld de,(curpichgt_visible)
  50.          ;inc de
  51.          ;srl d
  52.          ;rr e
  53.         ld bc,(curpicwidx3)
  54.         CALL MULWORD
  55.         ld d,b
  56.         ld e,c
  57.         ;hlde=bmp size
  58.        
  59. reserve_mem
  60. ;hlde=size
  61. ;out: ahl=freemem pointer
  62. ;меняет страницу в 0xc000
  63. ;ставит pgtemp в 0x8000
  64. ;ставит pgcode в 0x4000
  65. freemem_hl=$+1
  66.         ld bc,0
  67. freemem_a=$+1
  68.         ld a,0
  69.  
  70. ;freemem может указывать на начало пока не заказанной страницы
  71. ;1.если (freememaddr&0x3fff) == 0, то заказать страницу
  72. ;2.если остаток страницы >= hlde, то сдвигаем freememaddr и выходим
  73. ;3.уменьшить hlde на длину остатка страницы
  74. ;4.сдвинуть freememaddr на начало следующей страницы
  75. ;5.goto 1
  76. ;TODO уметь откатывать заказанные страницы, если не хватает памяти
  77. reserve_mem0
  78. ;если (freememaddr&0x3fff) == 0, то заказать страницу:
  79.          ;inc b
  80.          ;djnz reserve_mem_noreservepage
  81.          ;push bc
  82.          ;sla b
  83.          ;sla b
  84.          ;pop bc
  85.          ;jr nz,reserve_mem_noreservepage
  86.         push af
  87.         ld a,b
  88.         and 0x3f
  89.         or c
  90.         jr nz,reserve_mem_noreservepage
  91.         push bc
  92.         push de
  93.         push hl
  94.         push iy
  95. reserve_mem_pages_fail
  96.         call reservepage
  97.         or a
  98.         jr nz,reserve_mem_pages_fail ;repeat until success
  99.         pop iy
  100.         pop hl
  101.         pop de
  102.         pop bc
  103. reserve_mem_noreservepage
  104.         pop af
  105. ;если остаток страницы >= hlde (при прибавлении freememaddr+hlde-1 не меняется номер страницы), то сдвигаем freememaddr и выходим:
  106.         inc h
  107.         dec h
  108.         jr nz,reserve_mem_nolast
  109.         inc l
  110.         dec l
  111.         jr nz,reserve_mem_nolast
  112.    ;hldeHSW=0
  113.         push bc
  114.         push hl
  115.    ;bc=freememaddr&0xffff
  116.         res 7,b
  117.         res 6,b
  118.    ;bc=0..0x3fff
  119.         ld hl,0x4000
  120.         or a
  121.         sbc hl,bc ;NC
  122.    ;hl = остаток страницы = 0x4000..1
  123.         ;or a
  124.         sbc hl,de ;остаток страницы-hlde
  125.         pop hl
  126.         pop bc
  127.         jr c,reserve_mem_nolast
  128.  ;сдвигаем freememaddr и выходим:        
  129.         ex de,hl
  130.         add hl,bc
  131.         adc a,0 ;т.к. могли попасть ровно на конец страницы
  132.         ld (freemem_hl),hl
  133.         ld (freemem_a),a
  134.          push af
  135.          push hl
  136.          call showmem ;ставит pgcode в 0x4000
  137.          call setpgtemp8000
  138.          pop hl
  139.          pop af
  140.         ret
  141. reserve_mem_nolast
  142. ;уменьшить hlde на длину остатка страницы:
  143.         push bc
  144.         push hl
  145.    ;bc=freememaddr&0xffff
  146.         res 7,b
  147.         res 6,b
  148.    ;bc=0..0x3fff
  149.         ld hl,0x4000
  150.         or a
  151.         sbc hl,bc
  152.         ld b,h
  153.         ld c,l
  154.    ;bc = остаток страницы = 0x4000..1
  155.         pop hl
  156.         ex de,hl
  157.         or a
  158.         sbc hl,bc
  159.         ex de,hl
  160.         jr nc,$+3
  161.         dec hl ;hlde = hlde - остаток страницы
  162.         pop bc
  163. ;сдвинуть freememaddr на начало следующей страницы:
  164.         sla c
  165.         rl b
  166.         rla
  167.         sla c
  168.         rl b
  169.         rla
  170.         ;dec abc:
  171.         dec c
  172.         jr nz,reserve_mem_nolast_decabcq
  173.         dec b
  174.         djnz reserve_mem_nolast_decabcq
  175.         dec a
  176. reserve_mem_nolast_decabcq
  177.         inc a   ;next pg
  178.         ld bc,0 ;
  179.         srl a
  180.         rr b
  181.         rr c
  182.         srl a
  183.         rr b
  184.         rr c
  185.         jp reserve_mem0
  186.        
  187. writebyte
  188. ;c=byte
  189.         push af
  190.         push hl
  191.         call ahl_to_pgaddrc000
  192.         ld (hl),c
  193.         pop hl
  194.         pop af
  195.         jp skipbyte
  196.        
  197. writeword
  198. ;bc=word
  199.         push af
  200.         push hl
  201.         call ahl_to_pgaddrc000
  202.         ld (hl),c
  203.         pop hl
  204.         pop af
  205.         call skipbyte
  206.         push af
  207.         push hl
  208.         call ahl_to_pgaddrc000
  209.         ld (hl),b
  210.         pop hl
  211.         pop af
  212.         jp skipbyte
  213.        
  214. readbyte
  215. ;out: c
  216.         push af
  217.         push hl
  218.         call ahl_to_pgaddrc000
  219.         ld c,(hl)
  220.         pop hl
  221.         pop af
  222. skipbyte
  223.         inc l
  224.         ret nz
  225.         inc h
  226.         ret nz
  227.         inc a
  228.         ret
  229.        
  230. ahl_to_pgaddrc000
  231. ;keeps bc,de
  232. ;counts physical hl
  233.         rl h
  234.         rla
  235.         rl h
  236.         rla
  237.         scf
  238.         rr h
  239.         sra h
  240.         push bc
  241.         ld c,a
  242.         ld b,textpages/256
  243.         ld a,(bc)
  244.         SETPG32KHIGH
  245.         pop bc
  246.         ret
  247.  
  248. ahl_to_pgaddr_setpg32k
  249. ;keeps bc,de
  250. ;counts physical hl
  251.         rl h
  252.         rla
  253.         rl h
  254.         rla
  255.         srl h
  256.         scf
  257.         rr h
  258.         push bc
  259.         call setpg32k
  260.         pop bc
  261.         ret
  262.  
  263. setpg32k
  264. ;a=page number in table (0..)
  265.         push hl
  266.         ld l,a
  267.         ld h,textpages/256
  268.         ld a,(hl)
  269.         SETPG32KLOW
  270.         inc l
  271.         ld a,(hl)
  272.         SETPG32KHIGH
  273.         pop hl
  274.         ret
  275.  
  276. reservemem_puttomem
  277. ;hl=from
  278. ;bc=size
  279. ;out: ahl=addr
  280.         push hl
  281.         ld hl,(freemem_hl)
  282.         ld a,(freemem_a)
  283.         push af
  284.         push hl
  285.         push bc ;size
  286.         ld d,b
  287.         ld e,c
  288.         ld hl,0
  289. ;hlde=size
  290.         call reserve_mem
  291.         pop bc ;size
  292.         pop hl
  293.         pop af
  294.         pop de
  295. ;de=from
  296. ;ahl=to
  297. ;bc=size
  298.         push af
  299.         push hl
  300.         call puttomem
  301.         pop hl
  302.         pop af
  303.         ret
  304.        
  305. puttomem
  306. ;de=from
  307. ;ahl=to
  308. ;bc=size
  309.         ld (putchar_ldir_hl),de
  310.         push bc
  311.         rl h
  312.         rla
  313.         rl h
  314.         rla
  315.         scf
  316.         rr h
  317.         scf
  318.         rr h
  319. ;a=page number in table (0..)
  320.         ld c,a
  321.         ld b,textpages/256
  322.         ld a,(bc)
  323.         inc c
  324.          ld (purchar_nextpgtabaddr),bc
  325.         SETPG32KHIGH
  326.         ex de,hl
  327.         pop bc ;сколько байт копируем
  328.        
  329. ;если строка не помещается в страничке, то копируем сколько помещается, включаем следующую страницу и копируем остаток
  330.         ld hl,0
  331.         or a
  332.         sbc hl,de ;hl=сколько места осталось в страничке
  333.         or a
  334.         sbc hl,bc ;hl>=0: места хватает
  335.         jr nc,putchar_ldir
  336. ;места не хватает -hl байт
  337.          push hl ;-остаток ширины
  338.         add hl,bc ;hl=сколько места осталось в страничке
  339.         ld b,h
  340.         ld c,l
  341.         ld hl,(putchar_ldir_hl) ;локальное начало строки
  342.         ldir
  343. purchar_nextpgtabaddr=$+1
  344.         ld a,(0) ;ok
  345.         SETPG32KHIGH
  346.         ld de,0xc000
  347. ;hl=остаток строки
  348.          pop bc ;-остаток ширины
  349.         xor a
  350.         sub c
  351.         ld c,a
  352.         sbc a,b
  353.         sub c
  354.         ld b,a ;bc=остаток ширины
  355.         ldir
  356.         ret
  357. putchar_ldir
  358. putchar_ldir_hl=$+1
  359.         ld hl,0 ;локальное начало строки
  360.         ldir
  361.         ret
  362.        
  363.        
  364. getfrommem
  365. ;de=to
  366. ;ahl=from
  367. ;bc=size
  368.         ld (getfrommem_ldir_hl),de
  369.         push bc
  370.         rl h
  371.         rla
  372.         rl h
  373.         rla
  374.         scf
  375.         rr h
  376.         scf
  377.         rr h
  378. ;a=page number in table (0..)
  379.         ld c,a
  380.         ld b,textpages/256
  381.         ld a,(bc)
  382.         inc c
  383.          ld (getfrommem_nextpgtabaddr),bc
  384.         SETPG32KHIGH
  385.         ex de,hl
  386.         pop bc ;сколько байт копируем
  387.        
  388. ;если строка не помещается в страничке, то копируем сколько помещается, включаем следующую страницу и копируем остаток
  389.         ld hl,0
  390.         or a
  391.         sbc hl,de ;hl=сколько места осталось в страничке
  392.         or a
  393.         sbc hl,bc ;hl>=0: места хватает
  394.         jr nc,getfrommem_ldir
  395. ;места не хватает -hl байт
  396.          push hl ;-остаток ширины
  397.         add hl,bc ;hl=сколько места осталось в страничке
  398.         ld b,h
  399.         ld c,l
  400.         ld hl,(getfrommem_ldir_hl) ;локальное начало строки
  401.         ex de,hl
  402.         ldir
  403.         ex de,hl
  404. getfrommem_nextpgtabaddr=$+1
  405.         ld a,(0) ;ok
  406.         SETPG32KHIGH
  407.         ld de,0xc000
  408. ;hl=остаток строки
  409.          pop bc ;-остаток ширины
  410.         xor a
  411.         sub c
  412.         ld c,a
  413.         sbc a,b
  414.         sub c
  415.         ld b,a ;bc=остаток ширины
  416.         ex de,hl
  417.         ldir
  418.         ex de,hl
  419.         ret
  420. getfrommem_ldir
  421. getfrommem_ldir_hl=$+1
  422.         ld hl,0 ;локальное начало строки
  423.         ex de,hl
  424.         ldir
  425.         ex de,hl
  426.         ret
  427.  
  428. ;;;;;;;;;;;;;;;;;;;;;;;
  429.  
  430. ;структура списков:
  431. ;+0 3 следующий элемент или -1
  432. ;+3 3 предыдущий элемент или -1
  433. ;+6 данные
  434.        
  435. getprevelement
  436. ;ahl=pointer
  437.         call skipbyte
  438.         call skipbyte
  439.         call skipbyte
  440. getnextelement
  441. ;ahl=pointer
  442.         call readbyte ;c
  443.         ld e,c
  444.         call readbyte ;c
  445.         ld d,c
  446.         call readbyte ;c
  447.         ld a,c
  448.         ex de,hl
  449.         ret
  450.        
  451. readword
  452. ;ahl=pointer
  453. ;out: de=word
  454.         call readbyte ;c
  455.         ld e,c
  456.         call readbyte ;c
  457.         ld d,c
  458.         ret
  459.        
  460. isnull
  461. ;ahl=pointer
  462. ;out: z=null (pointer == -1)
  463.         push bc
  464.         ld c,a
  465.         and h
  466.         and l
  467.         inc a
  468.         ld a,c
  469.         pop bc
  470.         ret
  471.