?login_element?

Subversion Repositories NedoOS

Rev

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

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