?login_element?

Subversion Repositories NedoOS

Rev

Rev 555 | Blame | Compare with Previous | Last modification | View Log | Download

  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.        ld hl,waitkeyq
  93.        push hl
  94.         cp key_esc
  95.         ret z
  96.         cp key_enter
  97.         ret z
  98.         cp key_left
  99.         ret z
  100.         cp key_right
  101.         ret z
  102.         cp key_up
  103.         ret z
  104.         cp key_down
  105.         ret z
  106.        pop hl
  107.        ld hl,chrscontroldraw0
  108.        push hl
  109.         ld hl,(chrs_xscroll)
  110.         cp 'o';key_left
  111.         jr z,chrs_left
  112.         cp 'p';key_right
  113.         jr z,chrs_right
  114.         ld hl,(chrs_yscroll)
  115.         cp 'q';key_up
  116.         jr z,chrs_up
  117.         cp 'a';key_down
  118.         jr z,chrs_down
  119.         ret
  120.        
  121. chrs_left
  122.         ld a,h
  123.         or l
  124.         ret z
  125.         dec hl
  126.         ld (chrs_xscroll),hl
  127.         ret
  128.        
  129. chrs_right
  130.         inc hl
  131. ;не двигаем xscroll, если правая граница (=wid-xscroll) получается <32
  132.         ex de,hl
  133.         ld hl,(chrswid)
  134.         or a
  135.         sbc hl,de ;wid-xscroll
  136.         ld bc,32
  137.         or a
  138.         sbc hl,bc
  139.         ex de,hl
  140.         ret c
  141.         ld (chrs_xscroll),hl
  142.         ret
  143.        
  144. chrs_up
  145.         ld a,h
  146.         or l
  147.         ret z
  148.         dec hl
  149.         ld (chrs_yscroll),hl
  150.         ret
  151.        
  152. chrs_down
  153.         inc hl
  154. ;не двигаем yscroll, если нижняя граница (=hgt-yscroll) получается <24
  155.         ex de,hl
  156.         ld hl,(chrshgt)
  157.         or a
  158.         sbc hl,de ;hgt-yscroll
  159.         ld bc,24
  160.         or a
  161.         sbc hl,bc
  162.         ex de,hl
  163.         ret c
  164.         ld (chrs_yscroll),hl
  165.         ret
  166.        
  167. chrsdraw
  168.         ld hl,(chrshgt)
  169.         ld bc,24
  170.         call minhl_bc_tobc
  171.         push bc
  172. ;count data start shift = (chrslinesize*y) + (type*x)
  173.         ld bc,(chrslinesize)
  174. chrs_yscroll=$+1
  175.         ld de,0
  176.         call MULWORD ;out: HLBC=DE*BC
  177.         ld d,b
  178.         ld e,c
  179. ;hlde
  180. chrs_xscroll=$+1
  181.         ld bc,0
  182.         ld a,(chrstype)
  183.         ex de,hl
  184. chrdrawincx0
  185.         add hl,bc
  186.         jr nc,$+3
  187.         inc de
  188.         dec a
  189.         jr nz,chrdrawincx0
  190.         ex de,hl
  191.         ld b,h
  192. ;bde=data start shift
  193. chrsdataaddr=$+1
  194.         ld hl,0
  195. chrsdataaddrHSB=$+1
  196.         ld a,0
  197.         add hl,de
  198.         adc a,b
  199.         pop bc
  200.        
  201.         ld de,0x4000
  202.         ld b,c;24 ;TODO
  203. drawchrslines0
  204.         push bc
  205.        
  206.         push af
  207.         push hl
  208.  
  209.         push de
  210.        
  211.         call ahl_to_pgaddr_setpg32k ;sets hl=0x8000+
  212.        
  213.         ld hx,d
  214.         ld a,d
  215.         rra
  216.         rra
  217.         rra
  218.         and 3
  219.         add a,0x58
  220.         ld hy,a
  221. drawchrs_scrwid=$+2
  222.         ld lx,32 ;TODO
  223. drawchrs0
  224.          ld a,(user_scr0_high) ;ok
  225.          SETPG16K
  226.         ld d,hx
  227.         dup 7
  228.         ld a,(hl)
  229.         inc hl
  230.         ld (de),a
  231.         inc d
  232.         edup
  233.         ld a,(hl)
  234.         inc hl
  235.         ld (de),a
  236.         ld d,hy
  237.         ld a,(hl)
  238.         inc hl
  239.         ld (de),a
  240.        
  241. chrstype=$+1
  242.         ld a,0
  243.         cp 18
  244.         jr nz,drawchrs_skipscr2
  245.        
  246.          ld a,(user_scr1_high) ;ok
  247.          SETPG16K
  248.         ld d,hx
  249.         dup 7
  250.         ld a,(hl)
  251.         inc hl
  252.         ld (de),a
  253.         inc d
  254.         edup
  255.         ld a,(hl)
  256.         inc hl
  257.         ld (de),a
  258.         ld d,hy
  259.         ld a,(hl)
  260.         inc hl
  261.         ld (de),a
  262. drawchrs_skipscr2
  263.         inc e
  264.         dec lx
  265.         jr nz,drawchrs0
  266.         pop de
  267.         ld a,e
  268.         add a,32
  269.         ld e,a
  270.         jr nc,$+6
  271.         ld a,d
  272.         add a,8
  273.         ld d,a
  274.        
  275.         pop hl
  276.         pop af
  277. chrslinesize=$+1
  278.         ld bc,18*32 ;TODO
  279.         add hl,bc
  280.         adc a,0
  281.        
  282.         pop bc
  283.         dec b
  284.         jp nz,drawchrslines0
  285.         ret
  286.        
  287.  
  288. minhl_bc_tobc
  289.         or a
  290.         sbc hl,bc
  291.         add hl,bc
  292.         ret nc ;bc<=hl
  293.         ld b,h
  294.         ld c,l
  295.         ret
  296.  
  297. MULWORD
  298. ;out: HLBC=DE*BC
  299.         LD HL,0
  300.         LD A,17
  301. MULWOR0 RR B
  302.         RR C
  303.         DEC A
  304.         RET Z
  305.         JR NC,$+3
  306.         ADD HL,DE
  307.         RR H
  308.         RR L
  309.         JR MULWOR0
  310.  
  311. chrswid
  312.         dw 0
  313. chrshgt
  314.         dw 0
  315.        
  316. reservepage
  317. ;new page, set page in textpages, npages++, set page in #c000
  318. ;nz=error
  319.         OS_NEWPAGE
  320.         or a
  321.         ret nz
  322. npages=$+1
  323.         ld hl,textpages
  324.         ld (hl),e
  325.         inc l
  326.         ld (npages),hl
  327.         ld a,e
  328.         SETPG32KHIGH
  329.         xor a
  330.         ret ;z
  331.  
  332. unreservepages
  333.          ;ld a,-1
  334.          ;ld (npages_old),a
  335. unreservepages0
  336.         call unreservepage
  337.         jr z,unreservepages0
  338.         ret
  339.        
  340. unreservepage
  341. ;del page, npages--
  342. ;nz=error
  343.         ld hl,(npages)
  344.         ld a,l
  345.         or a
  346.         jr z,unreservepage_fail
  347.         dec l
  348.         ld (npages),hl
  349.         ld e,(hl)
  350.         OS_DELPAGE
  351.         xor a
  352.         ret ;z
  353. unreservepage_fail
  354.         xor a
  355.         dec a
  356.         ret ;nz
  357.  
  358. readbyte
  359. ;out: c
  360.         push af
  361.         push hl
  362.         call ahl_to_pgaddrc000
  363.         ld c,(hl)
  364.         pop hl
  365.         pop af
  366. skipbyte
  367.         inc l
  368.         ret nz
  369.         inc h
  370.         ret nz
  371.         inc a
  372.         ret
  373.        
  374. ahl_to_pgaddrc000
  375. ;keeps bc,de
  376. ;counts physical hl
  377.         rl h
  378.         rla
  379.         rl h
  380.         rla
  381.         scf
  382.         rr h
  383.         sra h
  384.         push bc
  385.         ld c,a
  386.         ld b,textpages/256
  387.         ld a,(bc)
  388.         SETPG32KHIGH
  389.         pop bc
  390.         ret
  391.  
  392. ahl_to_pgaddr_setpg32k
  393. ;keeps bc,de
  394. ;counts physical hl
  395.         rl h
  396.         rla
  397.         rl h
  398.         rla
  399.         srl h
  400.         scf
  401.         rr h
  402.         push bc
  403.         call setpg32k
  404.         pop bc
  405.         ret
  406.  
  407. setpg32k
  408. ;a=page number in table (0..)
  409.         push hl
  410.         ld l,a
  411.         ld h,textpages/256
  412.         ld a,(hl)
  413.         SETPG32KLOW
  414.         inc l
  415.         ld a,(hl)
  416.         SETPG32KHIGH
  417.         pop hl
  418.         ret
  419.  
  420.         align 256
  421. textpages
  422.         ds 256
  423.