Subversion Repositories NedoOS

Rev

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

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