Subversion Repositories NedoOS

Rev

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