?login_element?

Subversion Repositories NedoOS

Rev

Rev 528 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. loadchr
  2. ;dehl=size
  3. ;TODO streaming & reserve mem
  4.        
  5. loadchr_pages0
  6. ;dehl=size
  7.         push de
  8.         push hl
  9.         call setpgs_scr2
  10.         call cleanafter8000
  11.         pop hl
  12.         pop de
  13.  
  14. ;dehl=remaining size
  15.         ld a,h
  16.         or l
  17.         or d
  18.         or e
  19.         jr z,loadchr_pagesq
  20.         push de
  21.         push hl
  22.         call reservepage
  23.  
  24.         ld de,0xc000
  25.         ld hl,0x4000
  26.          push hl
  27.         call readstream_file
  28.         ld b,h
  29.         ld c,l
  30. ;bc = Number of bytes actually read
  31.          pop hl
  32.         or a
  33.         sbc hl,bc ;NZ = bytes to read != bytes actually read
  34.        
  35.         pop hl
  36.         pop de
  37. ;dehl=remaining size
  38.         push af
  39.         or a
  40.         sbc hl,bc
  41.         jr nc,$+3
  42.         dec de
  43.        
  44.         pop af ;NZ = bytes to read != bytes actually read
  45.         jr z,loadchr_pages0
  46. loadchr_pagesq
  47.        
  48.        
  49.         call closestream_file
  50.  
  51.         ;jr $
  52.         ld hl,0x0004
  53.         xor a
  54.        
  55.         call readbyte ;c=wid
  56.          ld b,0
  57.          ld (chrswid),bc
  58.         call readbyte ;c=hgt
  59.          ld b,0
  60.          ld (chrshgt),bc
  61.         call readbyte ;c=type
  62.         ld (chrsdataaddr),hl
  63.         ld (chrsdataaddrHSB),a
  64.          ld a,c
  65.          ld (chrstype),a
  66.  
  67.         ld b,0
  68.         ld de,(chrswid)
  69.         call MULWORD ;out: HLBC=DE*BC
  70.         ld (chrslinesize),bc
  71.  
  72.         ld hl,(chrswid)
  73.         ld bc,32
  74.         call minhl_bc_tobc
  75.         ld a,c
  76.         ld (drawchrs_scrwid),a
  77.  
  78. chrscontroldraw0
  79.         call chrsdraw
  80. chrscontrol0
  81.         ld a,(chrstype)
  82.         cp 18
  83.         ld a,1
  84.         jr z,$+3
  85.         xor a
  86.         xor 0
  87.         ld ($-1),a
  88.         ld e,a
  89.         OS_SETSCREEN ;e=screen=0..1
  90.         call yieldgetkeynolang
  91.         jr z,chrscontrol0
  92.         cp key_esc
  93.         ret z
  94.         cp key_enter
  95.         ret z
  96.         ld hl,chrscontroldraw0
  97.         push hl
  98.         ld hl,(chrs_xscroll)
  99.         cp key_left
  100.         jr z,chrs_left
  101.         cp key_right
  102.         jr z,chrs_right
  103.         ld hl,(chrs_yscroll)
  104.         cp key_up
  105.         jr z,chrs_up
  106.         cp key_down
  107.         jr z,chrs_down
  108.         ret
  109.        
  110. chrs_left
  111.         ld a,h
  112.         or l
  113.         ret z
  114.         dec hl
  115.         ld (chrs_xscroll),hl
  116.         ret
  117.        
  118. chrs_right
  119.         inc hl
  120. ;не двигаем xscroll, если правая граница (=wid-xscroll) получается <32
  121.         ex de,hl
  122.         ld hl,(chrswid)
  123.         or a
  124.         sbc hl,de ;wid-xscroll
  125.         ld bc,32
  126.         or a
  127.         sbc hl,bc
  128.         ex de,hl
  129.         ret c
  130.         ld (chrs_xscroll),hl
  131.         ret
  132.        
  133. chrs_up
  134.         ld a,h
  135.         or l
  136.         ret z
  137.         dec hl
  138.         ld (chrs_yscroll),hl
  139.         ret
  140.        
  141. chrs_down
  142.         inc hl
  143. ;не двигаем yscroll, если нижняя граница (=hgt-yscroll) получается <24
  144.         ex de,hl
  145.         ld hl,(chrshgt)
  146.         or a
  147.         sbc hl,de ;hgt-yscroll
  148.         ld bc,24
  149.         or a
  150.         sbc hl,bc
  151.         ex de,hl
  152.         ret c
  153.         ld (chrs_yscroll),hl
  154.         ret
  155.        
  156. chrsdraw
  157.         ld hl,(chrshgt)
  158.         ld bc,24
  159.         call minhl_bc_tobc
  160.         push bc
  161. ;count data start shift = (chrslinesize*y) + (type*x)
  162.         ld bc,(chrslinesize)
  163. chrs_yscroll=$+1
  164.         ld de,0
  165.         call MULWORD ;out: HLBC=DE*BC
  166.         ld d,b
  167.         ld e,c
  168. ;hlde
  169. chrs_xscroll=$+1
  170.         ld bc,0
  171.         ld a,(chrstype)
  172.         ex de,hl
  173. chrdrawincx0
  174.         add hl,bc
  175.         jr nc,$+3
  176.         inc de
  177.         dec a
  178.         jr nz,chrdrawincx0
  179.         ex de,hl
  180.         ld b,h
  181. ;bde=data start shift
  182. chrsdataaddr=$+1
  183.         ld hl,0
  184. chrsdataaddrHSB=$+1
  185.         ld a,0
  186.         add hl,de
  187.         adc a,b
  188.         pop bc
  189.        
  190.         ld de,0x4000
  191.         ld b,c;24 ;TODO
  192. drawchrslines0
  193.         push bc
  194.        
  195.         push af
  196.         push hl
  197.  
  198.         push de
  199.        
  200.         call ahl_to_pgaddr_setpg32k ;sets hl=0x8000+
  201.        
  202.         ld hx,d
  203.         ld a,d
  204.         rra
  205.         rra
  206.         rra
  207.         and 3
  208.         add a,0x58
  209.         ld hy,a
  210. drawchrs_scrwid=$+2
  211.         ld lx,32 ;TODO
  212. drawchrs0
  213.          ld a,(user_scr0_high) ;ok
  214.          SETPG16K
  215.         ld d,hx
  216.         dup 7
  217.         ld a,(hl)
  218.         inc hl
  219.         ld (de),a
  220.         inc d
  221.         edup
  222.         ld a,(hl)
  223.         inc hl
  224.         ld (de),a
  225.         ld d,hy
  226.         ld a,(hl)
  227.         inc hl
  228.         ld (de),a
  229.        
  230. chrstype=$+1
  231.         ld a,0
  232.         cp 18
  233.         jr nz,drawchrs_skipscr2
  234.        
  235.          ld a,(user_scr1_high) ;ok
  236.          SETPG16K
  237.         ld d,hx
  238.         dup 7
  239.         ld a,(hl)
  240.         inc hl
  241.         ld (de),a
  242.         inc d
  243.         edup
  244.         ld a,(hl)
  245.         inc hl
  246.         ld (de),a
  247.         ld d,hy
  248.         ld a,(hl)
  249.         inc hl
  250.         ld (de),a
  251. drawchrs_skipscr2
  252.         inc e
  253.         dec lx
  254.         jr nz,drawchrs0
  255.         pop de
  256.         ld a,e
  257.         add a,32
  258.         ld e,a
  259.         jr nc,$+6
  260.         ld a,d
  261.         add a,8
  262.         ld d,a
  263.        
  264.         pop hl
  265.         pop af
  266. chrslinesize=$+1
  267.         ld bc,18*32 ;TODO
  268.         add hl,bc
  269.         adc a,0
  270.        
  271.         pop bc
  272.         dec b
  273.         jp nz,drawchrslines0
  274.         ret
  275.        
  276.  
  277. minhl_bc_tobc
  278.         or a
  279.         sbc hl,bc
  280.         add hl,bc
  281.         ret nc ;bc<=hl
  282.         ld b,h
  283.         ld c,l
  284.         ret
  285.  
  286. MULWORD
  287. ;out: HLBC=DE*BC
  288.         LD HL,0
  289.         LD A,17
  290. MULWOR0 RR B
  291.         RR C
  292.         DEC A
  293.         RET Z
  294.         JR NC,$+3
  295.         ADD HL,DE
  296.         RR H
  297.         RR L
  298.         JR MULWOR0
  299.  
  300. chrswid
  301.         dw 0
  302. chrshgt
  303.         dw 0
  304.        
  305. reservepage
  306. ;new page, set page in textpages, npages++, set page in #c000
  307. ;nz=error
  308.         OS_NEWPAGE
  309.         or a
  310.         ret nz
  311. npages=$+1
  312.         ld hl,textpages
  313.         ld (hl),e
  314.         inc l
  315.         ld (npages),hl
  316.         ld a,e
  317.         SETPG32KHIGH
  318.         xor a
  319.         ret ;z
  320.  
  321. unreservepages
  322.          ;ld a,-1
  323.          ;ld (npages_old),a
  324. unreservepages0
  325.         call unreservepage
  326.         jr z,unreservepages0
  327.         ret
  328.        
  329. unreservepage
  330. ;del page, npages--
  331. ;nz=error
  332.         ld hl,(npages)
  333.         ld a,l
  334.         or a
  335.         jr z,unreservepage_fail
  336.         dec l
  337.         ld (npages),hl
  338.         ld e,(hl)
  339.         OS_DELPAGE
  340.         xor a
  341.         ret ;z
  342. unreservepage_fail
  343.         xor a
  344.         dec a
  345.         ret ;nz
  346.  
  347. readbyte
  348. ;out: c
  349.         push af
  350.         push hl
  351.         call ahl_to_pgaddrc000
  352.         ld c,(hl)
  353.         pop hl
  354.         pop af
  355. skipbyte
  356.         inc l
  357.         ret nz
  358.         inc h
  359.         ret nz
  360.         inc a
  361.         ret
  362.        
  363. ahl_to_pgaddrc000
  364. ;keeps bc,de
  365. ;counts physical hl
  366.         rl h
  367.         rla
  368.         rl h
  369.         rla
  370.         scf
  371.         rr h
  372.         sra h
  373.         push bc
  374.         ld c,a
  375.         ld b,textpages/256
  376.         ld a,(bc)
  377.         SETPG32KHIGH
  378.         pop bc
  379.         ret
  380.  
  381. ahl_to_pgaddr_setpg32k
  382. ;keeps bc,de
  383. ;counts physical hl
  384.         rl h
  385.         rla
  386.         rl h
  387.         rla
  388.         srl h
  389.         scf
  390.         rr h
  391.         push bc
  392.         call setpg32k
  393.         pop bc
  394.         ret
  395.  
  396. setpg32k
  397. ;a=page number in table (0..)
  398.         push hl
  399.         ld l,a
  400.         ld h,textpages/256
  401.         ld a,(hl)
  402.         SETPG32KLOW
  403.         inc l
  404.         ld a,(hl)
  405.         SETPG32KHIGH
  406.         pop hl
  407.         ret
  408.  
  409.         align 256
  410. textpages
  411.         ds 256
  412.