Subversion Repositories NedoOS

Rev

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