Subversion Repositories NedoOS

Rev

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