Subversion Repositories NedoOS

Rev

Rev 634 | Rev 842 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download

  1.  
  2. texted_XYTOP=0x0000
  3. texted_HGT=24
  4. texted_WID=80
  5. _texted_PANELCOLOR=0x0700;0x38
  6.  
  7. textview
  8.         ;xor a
  9.         ;ld h,a
  10.         ;ld l,a
  11.         ;call texted_settop
  12.         ;ld (curlineaddr),hl
  13.         ;ld (curlineaddrHSB),a
  14.         ;ld hl,1
  15.         ;ld (texted_ncurline),hl
  16.         ;ld hl,0
  17.         ;ld (curxy),hl
  18.         call texted_gotobof
  19.        
  20.         call texted_panel        
  21.        
  22.         call texted_calclines
  23.  
  24. texted_redrawloop
  25.         call setredrawflag
  26. texted_mainloop
  27. texted_lineredrawflag=$
  28.         scf ;/or a
  29.         call c,texted_prcurline ;might set redrawflag
  30. texted_redrawflag=$
  31.         scf ;/or a
  32.         call c,texted_prcurpage
  33.  
  34. ;texted_waitkey_nokey
  35.         ld de,(curxy)
  36.         call nv_setxy
  37.         ld a,2
  38. mainloop_yieldkeep
  39.         ld (wasnokey),a
  40.         YIELDKEEP
  41.         ld a,55+128 ;"or a"
  42.         ld (texted_wasyield),a
  43. texted_waitkey_nokey
  44.         GETKEY_ ;OS_GETKEYNOLANG
  45.         ;or a ;cp NOKEY ;keylang==0?
  46.         ;jr nz,texted_mainloop_keyq
  47.         ;cp c ;keynolang==0?
  48.         ;ld a,c ;keynolang
  49.         ;cp NOKEY ;TODO отличить от отсутствия фокуса nz? (не в фокусе клавиши не отдаются)
  50.         jr nz,texted_mainloop_keyq ;event
  51.         GETKEY_
  52.         jr nz,texted_mainloop_keyq ;event
  53. ;если два раза подряд нет события, то делаем YIELD, иначе YIELDKEEP
  54. ;рисовать панельку только при отсутствии события после YIELD
  55. wasnokey=$+1
  56.         ld a,1
  57.         dec a
  58.         jr nz,mainloop_yieldkeep
  59. texted_wasyield=$
  60.         scf
  61.         jr nc,nopanel
  62. texted_panelredrawflag=$
  63.         scf ;/or a
  64.         call c,texted_panel
  65.         ld de,(curxy)
  66.         call nv_setxy
  67. nopanel
  68.         YIELD
  69.         ld a,55 ;"scf"
  70.         ld (texted_wasyield),a
  71.         jr texted_waitkey_nokey
  72. texted_mainloop_keyq      
  73.  
  74.         cp key_redraw
  75.         jr z,texted_redrawloop
  76.         cp key_esc
  77.         ret z
  78.        
  79.         ld hl,texted_mainloop
  80.         push hl
  81.         cp key_up
  82.         jp z,texted_up
  83.         cp key_down
  84.         jp z,texted_down
  85.         cp key_pgup
  86.         jp z,texted_pgup
  87.         cp key_pgdown
  88.         jp z,texted_pgdown
  89.         ;cp 's'
  90.         ;jp z,texted_changeencoding
  91.         cp key_home
  92.         jp z,texted_home
  93.         cp key_end
  94.         jp z,texted_end
  95.         cp key_left
  96.         jp z,texted_left
  97.         cp key_right
  98.         jp z,texted_right
  99.         cp key_sspgup;ext3
  100.         jp z,texted_gotobof;home
  101.         cp key_sspgdown;ext4
  102.         jp z,texted_gotoeof;end
  103.         cp extW
  104.         jp z,texted_wrap
  105.          cp key_ins
  106.          jp z,texted_wrap
  107.         cp key_backspace
  108.         jp z,texted_backspace
  109.         cp key_del
  110.         jp z,texted_del
  111.         cp key_enter
  112.         jp z,texted_enter
  113.         cp key_csenter
  114.         jp z,texted_save
  115.         cp key_F2
  116.         jp z,texted_save
  117.         cp 0x20
  118.         ret c ;прочие системные кнопки не нужны
  119. typein
  120.         ld c,a
  121.         call linesize_minus_x ;sz<x = error
  122.         call c,insert_minushl_spaces
  123.         call calccursoraddr
  124.         call insertbyte
  125. ;TODO wrap (reprint screen if needed)        
  126.         call setlineredrawflag;texted_prcurpage
  127.         jp texted_right
  128.  
  129. linesize_minus_x
  130. ;sz<x = CY
  131.         ld hl,(curlineaddr)
  132.         ld a,(curlineaddrHSB)
  133.         call calclinesz ;hl=sz
  134.         ex de,hl
  135.         call calccurlinex
  136.         ex de,hl
  137.         or a
  138.         sbc hl,de ;sz<x = error
  139.         ret
  140.  
  141. insert_minushl_spaces
  142.         push bc
  143. textinsertsymbol_pseudospace0
  144.         push hl ;sz-x < 0
  145.         call texted_end
  146.         call calccursoraddr
  147.         ld c,' '
  148.         call insertbyte
  149.         pop hl ;sz-x < 0
  150.         inc hl
  151.         inc h
  152.         dec h
  153.         jr nz,textinsertsymbol_pseudospace0
  154.         call texted_end
  155.         pop bc
  156.         ret
  157.  
  158. texted_enter
  159.         call linesize_minus_x ;sz<x = error
  160.         ;jr nc,texted_enter_nopseudospaces
  161.         call c,texted_end
  162. ;texted_enter_nopseudospaces
  163.         call calccursoraddr
  164.         ld c,0x0d
  165.         call insertbyte
  166.         ld c,0x0a
  167.         call insertbyte
  168.         xor a
  169.         ld (curx),a
  170.         ld hl,0
  171.         ld (texted_prline_shift),hl
  172.  
  173.         call setredrawflag;texted_prcurpage
  174.  
  175.         call incnlines
  176.         jp texted_down
  177.        
  178. texted_save
  179. texted_filenameaddr=$+1
  180.         ld de,0;fcb_filename
  181.         OS_CREATEHANDLE
  182.         or a
  183.         ret nz
  184. ;b=new file handle
  185.         push bc
  186.         ld a,b
  187.         ld (cmd_savepage_handle),a
  188.  
  189.         ;ld de,(fcb+FCB_FSIZE)
  190.         ;ld hl,(fcb+FCB_FSIZE+2)
  191.         call getsize
  192.         ex de,hl
  193.         ld l,a
  194.         ld h,0
  195.         ld a,0 ;page number
  196. texted_save0
  197. ;a=page number in table (0..)
  198. ;hlde=remaining size
  199.         push af ;pg
  200.         push de ;remaining LSW
  201.         push hl ;remaining HSW
  202.         call setpg32k
  203.         ld a,d
  204.         and 0xc0
  205.         or h
  206.         or l
  207.         jr z,$+5 ;de=size
  208.         ld de,#4000
  209.         ex de,hl ;hl=pg size
  210.          push hl ;hl=pg size
  211.         call cmd_savepage
  212.          pop bc ;bc=pg size
  213.         pop hl ;remaining HSW
  214.         pop de ;remaining LSW
  215.         ex de,hl
  216.         or a
  217.         sbc hl,bc
  218.         ex de,hl
  219.         jr nc,$+3
  220.         dec hl ;size = size-pgsize
  221.         ld a,h
  222.         or l
  223.         or d
  224.         or e
  225.         jr z,texted_save_popq
  226.         pop af ;pg
  227.         inc a
  228.         jr texted_save0
  229. texted_save_popq
  230.         pop af
  231.         pop bc
  232.         OS_CLOSEHANDLE
  233.         ret
  234.  
  235. cmd_savepage
  236. ;hl=size
  237. ;out: a=error
  238. cmd_savepage_handle=$+1
  239.         ld b,0
  240.         ld de,#8000
  241. ;B = file handle, DE = Buffer address, HL = Number of bytes to write
  242.         OS_WRITEHANDLE
  243. ;HL = Number of bytes actually written, A=error
  244.         ret
  245.        
  246. setredrawflag
  247.         ld a,55 ;scf
  248.         ld (texted_redrawflag),a
  249.         ;ret
  250. setpanelredrawflag
  251.         ld a,55 ;scf
  252.         ld (texted_panelredrawflag),a
  253.         ret
  254. setlineredrawflag
  255.         ld a,55 ;scf
  256.         ld (texted_lineredrawflag),a
  257.         jr setpanelredrawflag;ret
  258.  
  259. calccurlinex
  260.         ld hl,(texted_prline_shift)
  261.         ld a,(curx)
  262.         add a,l
  263.         ld l,a
  264.         ret nc
  265.         inc h
  266.         ret
  267.        
  268. calccursoraddr
  269. ;TODO учитывать ширину строки (правее строки простое сложение бессмысленно)
  270.         call calccurlinex
  271.         ex de,hl
  272.         ld hl,(curlineaddr)
  273.         ld a,(curlineaddrHSB)
  274.         add hl,de
  275.         adc a,0
  276.         ret
  277.        
  278. texted_backspace
  279. ;TODO wrap (set y, reprint screen if needed)
  280.         call calccurlinex
  281.         ld a,h
  282.         or l
  283.         jr z,texted_backspace_startline
  284.  
  285.         call linesize_minus_x ;sz<x = error
  286.         jp c,texted_left
  287.  
  288.         call calccursoraddr
  289.         call prevbyte
  290.         ;call isbof
  291.         ;ret z
  292.         call deletebyte        
  293.         call setlineredrawflag
  294.         jp texted_left
  295. texted_backspace_startline
  296.         call calccursoraddr
  297.         call isbof
  298.         ret z
  299.         call prevbyte
  300.         call getbyte
  301.         push bc
  302.         call deletebyte
  303.         pop bc
  304.         ld b,a
  305.          ld a,c ;deleted byte
  306.          cp 0x0d
  307.          ld a,b
  308.          jr z,texted_backspace_startline_onlycr ;for CR texts
  309.         ld a,c
  310.         cp 0x0a
  311.         ld a,b
  312.         jr nz,texted_backspace_startline_onlycr
  313.         call isbof
  314.         jr z,texted_backspace_startline_onlycr
  315.         call prevbyte
  316.         call getbyte
  317.         ld b,a
  318.         ld a,c
  319.         cp 0x0d
  320.         ld a,b
  321.         ;jr nz,texted_backspace_startline_onlycr
  322.         call z,deletebyte ;0x0d
  323. texted_backspace_startline_onlycr
  324.         ;push af
  325.         push hl
  326.         call texted_prevline ;CY=error (impossible?)
  327.         ex de,hl
  328.         ;ld c,a
  329.         pop hl
  330.         ;pop af
  331.         or a
  332.         sbc hl,de
  333.         ;sbc a,c
  334.         call setxshift_hl
  335.        
  336.         call setredrawflag
  337.  
  338.         call decnlines
  339.         jp texted_up
  340.  
  341. decnlines
  342.         push hl
  343.         ld hl,(nlines)
  344.         dec hl
  345.         ld (nlines),hl
  346.         pop hl
  347.         ret
  348. incnlines
  349.         push hl
  350.         ld hl,(nlines)
  351.         inc hl
  352.         ld (nlines),hl
  353.         pop hl
  354.         ret
  355.  
  356. texted_home
  357. ;TODO wrap (set y)
  358.         ld hl,0
  359.         call setxshift_hl
  360.         jp setredrawflag
  361.  
  362. texted_end
  363. ;TODO wrap (set y)
  364.         ;call calccursoraddr
  365.         ld hl,(curlineaddr)
  366.         ld a,(curlineaddrHSB)
  367.         call calclinesz ;hl=sz
  368.         call setxshift_hl
  369.         jp setredrawflag
  370.  
  371. calclinesz
  372. ;ahl=line addr
  373. ;out: hl=sz (keeps bc,de)
  374.         push bc
  375.         call texted_nextline ;CY=error
  376.         call c,getsize
  377.         call nc,skipbackcrlf
  378.         ld bc,(curlineaddr)
  379.         or a
  380.         sbc hl,bc
  381.         pop bc
  382.         ret
  383.  
  384. skipbackcrlf
  385. ;out: ahl=eof or endline+1 (at cr/lf)
  386.         call isbof
  387.         ret z
  388.         call prevbyte
  389.         call getbyte
  390.         ld b,a
  391.          ld a,c
  392.          cp 0x0d
  393.          ld a,b
  394.          ret z ;for CR texts
  395.         ld a,c
  396.         cp 0x0a
  397.         ld a,b
  398.         jp nz,nextbyte
  399.         call isbof
  400.         ret z
  401.         call prevbyte
  402.         call getbyte
  403.         ld b,a
  404.         ld a,c
  405.         cp 0x0d
  406.         ld a,b
  407.         jp nz,nextbyte
  408.         ret
  409.        
  410. setxshift_hl
  411. ;X=hl=ahl-startline
  412. ;x+shift = X:
  413. ;x = min(X,texted_WID-1), но под mod8 должен совпадать с X
  414. ;shift = X-x
  415.         ld bc,texted_WID-1
  416.         call minhl_bc_tobc
  417.         ld a,c
  418.         xor l
  419.         and %11111000
  420.         xor l
  421.         ld c,a
  422.         ld (curx),a
  423.         or a
  424.         sbc hl,bc
  425.         ld (texted_prline_shift),hl
  426.         ret
  427.        
  428. texted_del
  429. ;TODO wrap (set y, reprint screen if needed)
  430.         call linesize_minus_x ;sz<x = error
  431.         jr c,texted_del_newline
  432.         jr z,texted_del_newline
  433.         call texted_right
  434.         jp texted_backspace
  435. texted_del_newline
  436. ;удаление ентера справа (backspace не умеет)
  437. ;hl=sz-x
  438.         call c,insert_minushl_spaces
  439.         call setredrawflag
  440.         call calccursoraddr
  441.         call iseof
  442.         ret z
  443.         call decnlines
  444.         call getbyte
  445.         push af
  446.         call deletebyte
  447.         pop bc ;b=deleted byte
  448.         ld c,a
  449.         ld a,b
  450.         cp 0x0a
  451.         ld a,c
  452.         ret z ;endline = 0x0a
  453.         call iseof
  454.         ret z
  455.         call getbyte
  456.         ld b,a
  457.         ld a,c
  458.         cp 0x0a
  459.         ld a,b
  460.         ret nz
  461.         call deletebyte        
  462.         ret
  463.        
  464. texted_wrap
  465.         ld a,(wrapflag)
  466.         xor 128
  467.         ld (wrapflag),a
  468.         ld hl,0
  469.         ld (texted_prline_shift),hl
  470.         ld (curxy),hl
  471.         call texted_calclines
  472.         ld hl,(curtoptextaddr)
  473.         ld a,(curtoptextHSB)
  474.         ld (curlineaddr),hl
  475.         ld (curlineaddrHSB),a
  476.         call texted_calccurline
  477.         jp setredrawflag;texted_prcurpage
  478.        
  479. texted_right
  480. ;TODO X<16384
  481.         call setpanelredrawflag
  482.         ld de,(curxy)
  483.         inc e
  484.         ld a,e
  485.         cp texted_WID
  486.         ld (curx),a
  487.         ret c
  488.          call iswrapon ;CY=on
  489.          jr c,texted_right_wrap
  490.         ld hl,(texted_prline_shift)
  491.         ld bc,8
  492.         add hl,bc
  493.         ld (texted_prline_shift),hl
  494.         ld a,e
  495.         sub c;8
  496.         ld (curx),a
  497.         jp setredrawflag;texted_prcurpage
  498.        
  499. texted_right_wrap
  500.         xor a
  501.         ld (curx),a
  502.         jp texted_down
  503.        
  504. texted_left
  505.         call setpanelredrawflag
  506.         ld de,(curxy)
  507.         ld a,e
  508.         sub 1
  509.         ld e,a
  510.         ld (curx),a
  511.         ret nc
  512.         xor a
  513.         ld (curx),a
  514.         ld hl,(texted_prline_shift)
  515.         ld bc,8
  516.         or a
  517.         sbc hl,bc
  518.         ret c
  519.         ld (texted_prline_shift),hl
  520.         ld a,e
  521.         add a,c;8
  522.         ld (curx),a
  523.         jp setredrawflag;texted_prcurpage
  524.        
  525. texted_prcurline
  526.         ld a,55+0x80 ;or a
  527.         ld (texted_lineredrawflag),a
  528.         ;TODO
  529.         ld de,(curxy)
  530.         ld e,0
  531.         push de
  532.         call nv_setxy
  533.         pop de
  534.         ld hl,(curlineaddr)
  535.         ld a,(curlineaddrHSB)
  536. texted_prcurline_continue0
  537.         push de
  538.         call texted_prline_nextline
  539.         call iseof
  540.         pop de
  541.         ret z
  542.         call prevbyte
  543.         call getbyte
  544.         ld b,a
  545.         ld a,c
  546.         cp 0x0d
  547.         ret z
  548.         cp 0x0a
  549.         ret z
  550.         inc d
  551.         ld a,d
  552.         cp texted_HGT
  553.         ret z
  554.         ld a,b
  555.         call nextbyte
  556.         jr texted_prcurline_continue0
  557.  
  558. texted_prcurpage
  559.          ;ld e,0
  560.          ;OS_CLS
  561.         ld a,55+0x80 ;or a
  562.         ld (texted_redrawflag),a
  563.         ld hl,(curtoptextaddr)
  564.         ld a,(curtoptextHSB)
  565.         jp texted_prpage
  566.        
  567. texted_gotobof
  568.         xor a
  569.         ld h,a
  570.         ld l,a
  571. ;texted_gotobof_ok
  572.         call texted_settop
  573.         ld (curlineaddr),hl
  574.         ld (curlineaddrHSB),a
  575.         ;ld hl,1
  576.         ;ld (texted_ncurline),hl
  577. ;ahl=curtextline (kept)
  578.         call texted_calccurline
  579.         ld hl,0
  580.         ld (curxy),hl
  581.         jp setredrawflag;texted_prcurpage
  582.  
  583. getsize
  584.         ld hl,(filesize)
  585.         ld a,(filesizeHSW)
  586.         ret
  587.        
  588. texted_gotoeof
  589.         call getsize
  590.         ld b,texted_HGT
  591. texted_end0
  592.         push bc
  593.         call texted_prevline
  594.         pop bc
  595.         djnz texted_end0
  596. ;ahl=curtextline (kept)
  597.         call texted_calccurline
  598.         ;push hl
  599.         ;ld hl,(texted_ncurline)
  600.         ;jr $
  601.         ;pop hl
  602.  
  603.         jp texted_pgdown_bottom
  604.  
  605.  
  606. deccurline
  607.         push hl
  608.         ld hl,(texted_ncurline)
  609.         dec hl
  610.         ld (texted_ncurline),hl
  611.         pop hl
  612.         ret
  613. deccury
  614.         push hl
  615.         ld hl,cury
  616.         dec (hl)
  617.         pop hl
  618.         ret
  619.        
  620. inccurline
  621.         push hl
  622.         ld hl,(texted_ncurline)
  623.         inc hl
  624.         ld (texted_ncurline),hl
  625.         pop hl
  626.         ret
  627. inccury
  628.         push hl
  629.         ld hl,cury
  630.         inc (hl)
  631.         pop hl
  632.         ret
  633.  
  634. texted_up
  635.         ld hl,(curlineaddr)
  636.         ld a,(curlineaddrHSB)
  637.         call texted_prevline
  638.         ret c
  639.         ld (curlineaddr),hl
  640.         ld (curlineaddrHSB),a
  641.         push af
  642.         push hl
  643.         call deccurline
  644.         call setpanelredrawflag
  645.         pop hl
  646.         pop af
  647.         ld c,a
  648.         ld a,(cury)
  649.         sub 1
  650.         ld (cury),a
  651.         ret nc
  652.         inc a
  653.         ld (cury),a
  654.         ld a,c
  655.         call texted_settop
  656.         push af
  657.         push hl
  658.         ld de,texted_XYTOP
  659.         ld hl,256*texted_HGT + texted_WID
  660.         call scrolldown ;OS_SCROLLDOWN
  661.         ld de,texted_XYTOP
  662.         call nv_setxy
  663.         pop hl
  664.         pop af
  665.         call texted_prline
  666.         ret
  667.  
  668. texted_down
  669.         ld hl,(curlineaddr)
  670.         ld a,(curlineaddrHSB)
  671.         call texted_nextline
  672.         ret c
  673.         ld (curlineaddr),hl
  674.         ld (curlineaddrHSB),a
  675.         push af
  676.         push hl
  677.         call inccurline
  678.         call setpanelredrawflag
  679.         pop hl
  680.         pop af
  681.         ld c,a
  682.         ld de,(curxy)
  683.         inc d
  684.         ld a,d
  685.         cp texted_HGT
  686.         ld (curxy),de
  687.         ret c
  688.         dec a
  689.         ld (cury),a
  690.         ld a,c
  691.         push af
  692.         push hl
  693.         ld de,texted_XYTOP
  694.         ld hl,256*texted_HGT + texted_WID
  695.         call scrollup ;OS_SCROLLUP
  696.         ld de,texted_XYTOP+((texted_HGT-1)*256)
  697.         call nv_setxy
  698.         pop hl
  699.         pop af
  700.         call texted_prline;_nextline
  701. curtoptextaddr=$+1
  702.         ld hl,0
  703. curtoptextHSB=$+1
  704.         ld a,0
  705.         call texted_nextline
  706. texted_settop        
  707.         ld (curtoptextaddr),hl
  708.         ld (curtoptextHSB),a
  709.         ret
  710.  
  711. texted_pgup
  712.         call setpanelredrawflag
  713.         ld a,(cury)
  714.         or a
  715.         ld b,a
  716.         ld hl,(curlineaddr)
  717.         ld a,(curlineaddrHSB)
  718.         jr z,texted_pgup_top
  719. texted_pgup_gotop0
  720.         push bc
  721.         call texted_prevline
  722.          call nc,deccurline
  723.          call nc,deccury
  724.         pop bc
  725.         djnz texted_pgup_gotop0
  726.         ld (curlineaddr),hl
  727.         ld (curlineaddrHSB),a
  728.         ret
  729. texted_pgup_top
  730.         ld b,texted_HGT-1
  731. texted_pgup0
  732.         push bc
  733.         call texted_prevline
  734.          call nc,deccurline
  735.         pop bc
  736.         djnz texted_pgup0
  737.         call texted_settop
  738.         ld (curlineaddr),hl
  739.         ld (curlineaddrHSB),a
  740.         call setredrawflag
  741.         ret
  742.        
  743. texted_pgdown
  744.         call setpanelredrawflag
  745.         ld a,(cury)
  746.         sub texted_HGT-1
  747.         neg
  748.         ld b,a
  749.         ld hl,(curlineaddr)
  750.         ld a,(curlineaddrHSB)
  751.         jr z,texted_pgdown_bottom
  752. texted_pgdown_gobottom0
  753.         push bc
  754.         call texted_nextline
  755.          call nc,inccurline
  756.          call nc,inccury
  757.         pop bc
  758.         djnz texted_pgdown_gobottom0
  759.         ld (curlineaddr),hl
  760.         ld (curlineaddrHSB),a
  761.         ret
  762. texted_pgdown_bottom
  763.         push af
  764.         xor a
  765.         ld (cury),a
  766.         pop af
  767.         call texted_settop
  768.         ld b,texted_HGT-1
  769. texted_pgdown0
  770.         push bc
  771.         call texted_nextline
  772.          call nc,inccurline
  773.          call nc,inccury
  774.         pop bc
  775.         djnz texted_pgdown0
  776.         ld (curlineaddr),hl
  777.         ld (curlineaddrHSB),a
  778.         jp setredrawflag
  779.        
  780. texted_calccurline
  781. ;ahl=curtextline (kept)
  782.         push af
  783.         push hl
  784.         ld (texted_calccurline_old),hl
  785.         ld (texted_calccurline_oldHSB),a
  786.         ld ix,1;0
  787.          or h
  788.          or l
  789.          jr z,texted_calccurline_countq
  790.         xor a
  791.         ld h,a
  792.         ld l,a
  793. texted_calccurline_count0
  794.         call texted_nextline ;texted_pseudoprline
  795.  
  796.         if 1==0
  797.         jr c,texted_calccurline_countq ;не помогает
  798.         ex de,hl
  799. texted_calccurline_old=$+1
  800.         ld hl,0
  801.         or a
  802.         sbc hl,de ;nc: hl<=old
  803.         ld l,a
  804. texted_calccurline_oldHSB=$+1
  805.         ld a,0
  806.         sbc a,l
  807.         ld a,l
  808.         inc ix
  809.         jr nc,texted_calccurline_count0 ;nc: ahl<=old
  810.         else
  811.        
  812.         push hl
  813. texted_calccurline_old=$+1
  814.         ld bc,0
  815.         or a
  816.         sbc hl,bc ;nc: hl>=old
  817.         ld l,a
  818. texted_calccurline_oldHSB=$+1
  819.         sbc a,0
  820.         ld a,l
  821.         pop hl
  822.         inc ix
  823.         jr c,texted_calccurline_count0 ;cy: ahl<old
  824.         endif
  825. texted_calccurline_countq
  826.         ;push ix
  827.         ;pop hl
  828.         ld (texted_ncurline),ix;hl
  829.         pop hl
  830.         pop af
  831.         ret
  832.        
  833. texted_calclines
  834. ;sets nlines
  835.         xor a
  836.         ld h,a
  837.         ld l,a
  838.         ld (nlines),hl
  839. texted_calclines0
  840.         call incnlines
  841.         call texted_nextline
  842.         jr nc,texted_calclines0
  843.         ret
  844.        
  845. clear_keyboardbuffer
  846.         push bc
  847.         ld b,50;5
  848. clear_keyboardbuffer0
  849.         push bc
  850.         GETKEY_
  851.         pop bc
  852.         djnz clear_keyboardbuffer0
  853.         pop bc
  854.         ret
  855.        
  856. texted_changeencoding
  857.         ld hl,texted_prline_recodepatch
  858.         ld a,(hl)
  859.         xor 0x7e ;"ld a,(hl)"
  860.         ld (hl),a
  861.         call setredrawflag;texted_prcurpage
  862.         ;call texted_prcurpage
  863.         ;ret
  864. texted_panel
  865.         ld a,55+0x80 ;or a
  866.         ld (texted_panelredrawflag),a
  867.         ld de,0x1800
  868.         call nv_setxy
  869.         ld de,_texted_PANELCOLOR
  870.         SETCOLOR_
  871.        
  872.         ld a,(texted_prline_recodepatch)
  873.         or a
  874.         ld hl,t866
  875.         jr z,$+5
  876.         ld hl,twin
  877.         call prtext
  878.        
  879.         ld a,' '
  880.         PRCHAR_
  881.         call calccurlinex
  882.         inc hl
  883.         call prword
  884.         ld a,','
  885.         PRCHAR_
  886. texted_ncurline=$+1
  887.         ld hl,0
  888.         call prword
  889.         ld a,'/'
  890.         PRCHAR_
  891.         ld hl,(nlines)
  892.         exx
  893.         ld hl,0
  894.         exx
  895.         call prdword
  896.         ld a,' '
  897.         PRCHAR_
  898.         call getsize
  899.         exx
  900.         ;ld hl,(fcb+FCB_FSIZE+2)
  901.         ld l,a
  902.         ld h,0
  903.         exx
  904.         ;ld hl,(fcb+FCB_FSIZE)
  905.         call prdword
  906.         ld de,tspaces
  907.         ld hl,42;43
  908.         call sendchars
  909. ;        ld b,43
  910. ;texted_panel0
  911. ;        ld a,' '
  912. ;        push bc
  913. ;        PRCHAR_ ;TODO speedup
  914. ;        pop bc
  915. ;        djnz texted_panel0
  916.         ;ld de,_texted_PANELCOLOR;#38
  917.         ;OS_PRATTR
  918.         ld de,_COLOR
  919.         SETCOLOR_
  920.        
  921.         ret
  922.        
  923. tspaces
  924.         ds 80,' '
  925.        
  926. twin
  927.         db "WIN",0
  928. t866
  929.         db "866",0
  930.  
  931.      
  932. isbof
  933. ;out: z=bof
  934.         push bc
  935.         ld c,a
  936.         or h
  937.         or l
  938.         ld a,c
  939.         pop bc
  940.         ret
  941. iseof
  942. ;out: z=eof
  943.         push bc
  944.         push de
  945.         push hl
  946.         ;ld de,(fcb+FCB_FSIZE)
  947.         ;ld bc,(fcb+FCB_FSIZE+2)
  948.         ;ld b,a
  949.         ;or a
  950.         ;sbc hl,de
  951.         ;sbc a,c
  952.         ;ld a,b
  953.         ex de,hl
  954.         ld c,a
  955.         call getsize
  956.         or a
  957.         sbc hl,de
  958.         sbc a,c
  959.         or h
  960.         or l
  961.         ld a,c
  962.         pop hl
  963.         pop de
  964.         pop bc
  965.         ret
  966.      
  967. texted_prpage
  968. ;ahl=addr
  969.         ld (curtoptextaddr),hl
  970.         ld (curtoptextHSB),a
  971.         push af
  972.         ld de,texted_XYTOP
  973.         call nv_setxy
  974.         pop af
  975.         ld b,texted_HGT
  976. texted_prpage0
  977.         push bc
  978.         ;push de
  979.         call texted_prline_nextline
  980.         call c,getsize
  981.         ;pop de
  982.         pop bc
  983.         ;inc d
  984.         djnz texted_prpage0
  985.         ;call clear_keyboardbuffer
  986.         ret
  987.        
  988. texted_prevline
  989. ;ahl=addr
  990. ;line < 16K
  991. ;out: ahl, CY=error (keeps de)
  992.         call isbof
  993.          scf
  994.         ret z
  995. ;перед нами может быть #0d или #0d,#0a или ничего
  996.         ld (findprevline_old),hl
  997.         ld (findprevline_oldHSB),a
  998.        
  999.         or a
  1000.         ld bc,0xffff
  1001.         jr nz,$+4
  1002.          ld b,h
  1003.          ld c,l
  1004.          
  1005.         push de
  1006.         ld de,0x4000
  1007.         or a
  1008.         sbc hl,de
  1009.         sbc a,e;0
  1010.         pop de
  1011.        
  1012.         push af
  1013.         push hl
  1014.         call ahl_to_pgaddr
  1015.         set 6,h
  1016. ;hl=c000+, можно уменьшать
  1017. ;bc=number of chars to go != 0
  1018.  
  1019. ;перед нами может быть #0d или #0d,#0a или ничего
  1020.         dec hl
  1021.         dec bc
  1022.         ld a,b
  1023.         or c
  1024.         jr z,texted_prevlineq
  1025.         ld a,0x0a
  1026.         cp (hl)
  1027.         jr nz,texted_prevline_nolf
  1028.         dec hl
  1029.         dec bc
  1030.         ld a,b
  1031.         or c
  1032.         jr z,texted_prevlineq
  1033. texted_prevline_nolf
  1034.         ld a,0x0d
  1035.         cp (hl)
  1036.         jr nz,texted_prevline_nocr
  1037.         dec hl
  1038.         dec bc
  1039.         ld a,b
  1040.         or c
  1041.         jr z,texted_prevlineq
  1042. texted_prevline_nocr
  1043. ;сейчас мы находимся перед символом конца предыдущей строки (не на нём)
  1044. texted_prevline0
  1045.         ld a,(hl)
  1046.         cp 0x0d
  1047.         jr z,texted_prevline_cr
  1048.         cp 0x0a
  1049.         jr z,texted_prevline_lf
  1050.         dec hl
  1051.         dec bc
  1052.         ld a,b
  1053.         or c
  1054.         jr nz,texted_prevline0
  1055. ;beginning of file
  1056.         jr texted_prevlineq
  1057. texted_prevline_cr
  1058. texted_prevline_lf
  1059. ;сейчас мы находимся на конце символа конца строки перед предыдущей
  1060.         inc hl
  1061. texted_prevlineq
  1062.         ex de,hl ;new addr (bits 13..0), bit 14 = overflow
  1063.         pop hl ;old addr
  1064.         pop af
  1065.         call pgaddr_to_ahl
  1066.         call iswrapon ;CY=on
  1067.         ret nc ;no wrap
  1068.  
  1069. findprevline_linewrap
  1070. ;ahl = в начале строки
  1071. ;перед ней может быть #0d или #0d,#0a
  1072. ;надо псевдонапечатать несколько псевдострок, пока не дойдём до текущей
  1073. findprevline_linewrap_count0
  1074.          push af
  1075.          push hl
  1076.         call texted_pseudoprline
  1077.         push hl
  1078. findprevline_old=$+1
  1079.         ld bc,0
  1080.         or a
  1081.         sbc hl,bc ;nc: hl>=old
  1082.         ld l,a
  1083. findprevline_oldHSB=$+1
  1084.         sbc a,0
  1085.         ld a,l
  1086.         pop hl
  1087.          pop de ;old addr
  1088.          pop bc ;b=old HSB
  1089.         jr c,findprevline_linewrap_count0
  1090.         ex de,hl
  1091.         ld a,b
  1092. ;ahl=на псевдострочку раньше
  1093.         ret ;nc
  1094.  
  1095. getmaxlinesize
  1096. ;ahl = addr
  1097. ;out: bc=max line size before eof, z=(bc==0) (keeps ahl,de)
  1098.          push de
  1099.         push af
  1100.         push hl
  1101.         ex de,hl
  1102.         ld c,a
  1103.         call getsize
  1104.         or a
  1105.         sbc hl,de
  1106.         sbc a,c
  1107.         ld bc,0
  1108.         jr c,getmaxlinesize_aftereof
  1109.         dec bc
  1110.         or a
  1111.         jr nz,$+4 ;filesize-addr >= 0x10000, will be 0xffff
  1112.          ld b,h
  1113.          ld c,l ;filesize-addr
  1114. getmaxlinesize_aftereof
  1115.         pop hl
  1116.         pop af
  1117.         ld e,a
  1118.         ld a,b
  1119.         or c
  1120.         ld a,e
  1121.          pop de
  1122.         ret
  1123.  
  1124. texted_prline_nextline
  1125.         push af
  1126.         push hl
  1127.         call texted_prline
  1128.         pop hl
  1129.         pop af
  1130. texted_nextline
  1131. ;if eof, returns eof addr
  1132. ;ahl=addr
  1133. ;line < 16K
  1134. ;out: ahl, CY=error (keeps de)
  1135.         call iswrapon ;CY=on
  1136.         jp c,texted_pseudoprline
  1137.         call getmaxlinesize ;bc=max line size before eof, z=(bc==0)
  1138.          scf
  1139.         ret z
  1140.         push af
  1141.         push hl
  1142.         call ahl_to_pgaddr
  1143. ;bc=number of chars to go != 0
  1144. texted_nextline0
  1145.         ld a,(hl)
  1146.         inc hl
  1147.         dec bc
  1148.         cp 0x0d
  1149.         jr z,texted_nextline_cr
  1150.         cp 0x0a
  1151.         jr z,texted_nextline_lf
  1152.         ld a,b
  1153.         or c
  1154.         jr nz,texted_nextline0
  1155. ;texted_nextline_eof
  1156.         pop hl ;old addr
  1157.         pop af
  1158.         scf ;error
  1159.         ret
  1160. texted_nextlineq
  1161.         ex de,hl ;new addr (bits 13..0), bit 14 = overflow
  1162.         pop hl ;old addr
  1163.         pop af
  1164.         jp pgaddr_to_ahl
  1165. texted_nextline_cr
  1166.         ld a,b
  1167.         or c
  1168.         jr z,texted_nextlineq
  1169.         ld a,(hl)
  1170.         cp 0x0a
  1171.         jr nz,texted_nextline_lf
  1172.         inc hl
  1173. texted_nextline_lf
  1174.         jr texted_nextlineq
  1175.        
  1176. texted_prline
  1177. ;ahl=addr
  1178. ;check for last line (vs. file size)
  1179. ;if filesize-addr < 80, then b=filesize-addr, else b=80
  1180.         call getmaxlinesize ;bc=max line size before eof, z=(bc==0)
  1181.         jr z,texted_prlinespc_all;ret z
  1182.         call ahl_to_pgaddr
  1183. ;hl=#8000+0..#3fff
  1184. ;bc=max line size before eof != 0
  1185. texted_prline_shift=$+1
  1186.         ld de,0
  1187.         call istherecr_or_lf ;add hl,de
  1188.         ;jr nz,$+3
  1189.         ;dec hl ;hl=cr/lf address
  1190.  
  1191.         push hl
  1192.         ld h,b
  1193.         ld l,c
  1194.         or a
  1195.         sbc hl,de
  1196.         ld b,h
  1197.         ld c,l ;bc=bc-lineshift
  1198.         pop hl
  1199.         ld a,texted_WID
  1200.         jr c,texted_prlinespc
  1201.         jr z,texted_prlinespc
  1202.  
  1203.         push hl
  1204.         ld hl,texted_WID
  1205.         call minhl_bc_tobc
  1206.         ld b,c
  1207.         pop hl
  1208. ;b=number of chars to print != 0
  1209.         ld de,prlinebuf
  1210.         ld c,texted_WID
  1211. texted_prline0
  1212.         ld a,(hl)
  1213.         inc hl
  1214.         cp 0x0d
  1215.         jr z,texted_prline_cr
  1216.         cp 0x0a
  1217.         jr z,texted_prline_cr;lf
  1218.         ;push bc
  1219.         push hl
  1220.         ld h,twinto866/256
  1221.         ld l,a
  1222. texted_prline_recodepatch=$
  1223.         nop ;/ld a,(hl)
  1224.         ld (de),a ;PRCHAR_
  1225.         inc de
  1226.         pop hl
  1227.         ;pop bc
  1228.         dec c
  1229.         djnz texted_prline0
  1230.         ;call print_prlinebuf
  1231.         ;jr nz,texted_prline_lf
  1232.         ;ret
  1233. texted_prline_cr
  1234.         call print_prlinebuf
  1235. ;texted_prline_lf
  1236. ;допечатать пробелы до конца строки
  1237.         jr texted_prlinespc
  1238. texted_prlinespc_all
  1239.         ld c,texted_WID
  1240. texted_prlinespc
  1241.         push af
  1242.         push hl
  1243.         ;ld l,b
  1244.         ;ld h,0
  1245.         ;ld de,tspaces
  1246.         ;call sendchars
  1247.          ld a,c
  1248.          or a
  1249.         call nz,clearrestofline_crlf
  1250.         pop hl
  1251.         pop af
  1252.         ret
  1253.  
  1254. print_prlinebuf
  1255.         push af
  1256.         push bc
  1257.         push hl
  1258. ;c=texted_WID-число символов
  1259.         ld de,prlinebuf
  1260.         ld a,texted_WID
  1261.         sub c
  1262.         ld l,a
  1263.         ld h,0
  1264.         call sendchars
  1265.         pop hl
  1266.         pop bc
  1267.         pop af
  1268.         ret
  1269.  
  1270. prlinebuf
  1271.         ds texted_WID
  1272.  
  1273. texted_pseudoprline
  1274. ;ahl=addr
  1275. ;out: ahl, CY=error
  1276. ;check for last line (vs. file size)
  1277. ;if filesize-addr < 80, then b=filesize-addr, else b=80
  1278.         call getmaxlinesize ;bc=max line size before eof, z=(bc==0)
  1279.          scf
  1280.         ret z
  1281.         push af
  1282.         push hl
  1283.         call ahl_to_pgaddr
  1284. ;hl=#8000+0..#3fff
  1285. ;bc=max line size before eof != 0
  1286.         push hl
  1287.         ld hl,texted_WID
  1288.         call minhl_bc_tobc
  1289.         ld b,c
  1290.         pop hl
  1291. ;b=number of chars to print != 0
  1292.         ld c,texted_WID
  1293. texted_pseudoprline0
  1294.         ld a,(hl)
  1295.         inc hl
  1296.         cp 0x0d
  1297.         jr z,texted_pseudoprline_cr
  1298.         cp 0x0a
  1299.         jr z,texted_pseudoprline_lf
  1300.         dec c
  1301.         djnz texted_pseudoprline0
  1302.          ld a,(hl)
  1303.          inc hl
  1304.          cp 0x0d
  1305.          jr z,texted_pseudoprline_crok
  1306.          cp 0x0a
  1307.          jr z,texted_pseudoprline_lf
  1308.          dec hl
  1309.         jp texted_nextlineq
  1310. texted_pseudoprline_cr
  1311.         dec b
  1312.         jp z,texted_nextlineq
  1313. texted_pseudoprline_crok
  1314.         ld a,(hl)
  1315.         cp 0x0a
  1316.         jr nz,texted_pseudoprline_lf
  1317.         inc hl
  1318. texted_pseudoprline_lf
  1319.         jp texted_nextlineq
  1320.        
  1321. ;по идее это псевдопечать N экранных позиций (там могут быть цветовые коды и т.п.)
  1322. istherecr_or_lf
  1323. ;hl=addr ;TODO ahl
  1324. ;de=length to search
  1325. ;out: z=found, hl=at match or after area (TODO ahl)
  1326.         ld a,d
  1327.         or e
  1328.         jr z,istherecr_or_lf_fail
  1329.          push hl
  1330.         ld a,0x0d
  1331.         call istherecrlfgo
  1332.         jr z,istherecr_or_lf_popafZret;ret z
  1333.          pop hl
  1334.         ld a,0x0a
  1335. istherecrlfgo
  1336.         push bc
  1337.         ld b,d
  1338.         ld c,e
  1339.         cpir ;TODO несколько раз через все блоки, если заканчиваются блоки, то их переключать
  1340.         pop bc
  1341.         ret nz ;nz=not found
  1342.          dec hl
  1343.         ret ;z=found
  1344. istherecr_or_lf_fail
  1345.         dec a
  1346.         ret ;nz=not found
  1347.        
  1348. istherecr_or_lf_popafZret
  1349.         pop af
  1350.         cp a ;Z
  1351.         ret
  1352.        
  1353. ;texted_closefcb
  1354. ;        ld de,fcb
  1355. ;        OS_FCLOSE
  1356. ;        ret
  1357.  
  1358. iswrapon
  1359. ;CY = on
  1360. wrapflag=$
  1361.         or a ;/scf
  1362.         ret
  1363.  
  1364. curlineaddr
  1365.         ds 3
  1366. curlineaddrHSB=$-1
  1367.  
  1368. nlines
  1369.         dw 0
  1370.  
  1371. curxy
  1372. curx
  1373.         db 0
  1374. cury
  1375.         db 0
  1376.        
  1377.         align 256
  1378. twinto866
  1379.         incbin "../_sdk/codepage/winto866"
  1380.