?login_element?

Subversion Repositories NedoOS

Rev

Rev 1509 | Blame | Compare with Previous | Last modification | View Log | Download

  1. NVVIEW_XYTOP=0x0000 ;может потом сместиться из-за меню
  2. ;NVVIEW_HGT=txtscrhgt-1 ;может потом уменьшиться из-за меню
  3. NVVIEW_WID=80 ;может потом уменьшиться из-за скроллбара
  4.        if PRSTDIO
  5. _NVVIEW_PANELCOLOR=0x0700;0x38
  6.        else
  7. _NVVIEW_PANELCOLOR=0x38
  8.        endif
  9.  
  10. editcmd_3
  11.         call ifcmdnonempty_typedigit
  12. editcmd_F3
  13.         call getfcbundercursor ;->fcb
  14.         ld a,(fcb+FCB_FATTRIB)
  15.         and FATTRIB_DIR;#10
  16.         ret nz
  17.  
  18.         ;call nv_openfcb ;autopush nv_closefcb
  19.         ;ret nz ;error
  20.         ld hl,fcb_filename
  21.         ld de,filenametext
  22.         call cpmname_to_dotname
  23.  
  24.         call setcurpaneldir
  25.  
  26.         call setdrawtablesneeded
  27.         ld hl,editcmd_reprintall_noreaddir ;TODO а если файл изменится?
  28.         push hl
  29. nvview
  30.         ld de,filenametext
  31. ;de=filename
  32.         OS_OPENHANDLE
  33.         or a
  34.         ret nz ;error
  35.         ld a,b
  36.         ld (curhandle),a
  37.         ;ld hl,nv_closehandle
  38.         ;push hl
  39.  
  40.        if PRSTDIO
  41.         ld de,0
  42.         call nv_setxy ;keeps de,hl,ix
  43.         CLS_
  44.        else
  45.         ld e,_COLOR
  46.         OS_CLS
  47.        endif
  48.  
  49.         ld hl,unreservepages
  50.         push hl
  51.        
  52.         ld hl,0
  53.         ld de,0
  54. nvview_load0
  55.         push de
  56.         push hl
  57.         call reservepage
  58.         pop hl
  59.         pop de
  60.         ret nz ;no memory
  61. ;nvview_load0nonewpg        
  62.         ld a,0xc000/256
  63.         call cmd_loadpage
  64.         jr nz,nvview_load0q
  65.         add hl,bc
  66.         jr nc,$+3
  67.         inc de
  68.          ;TODO nvview_load0nonewpg with new pointer if no new page
  69.         ld a,b
  70.         or c
  71.         jr nz,nvview_load0
  72. nvview_load0q
  73. ;dehl=true file size (for TRDOSFS)
  74.         ld (filesize),hl
  75.         ld (filesizeHSW),de
  76.         call nv_closehandle
  77.  
  78.         call setunchanged
  79.  
  80.         ld hl,filenametext
  81.         ld de,tshown_filename
  82.         ld b,TSPACES_FILENAME_SZ
  83.         call strcopy_maxb
  84.  
  85.         xor a
  86.         ld h,a
  87.         ld l,a
  88.         call nvview_settop
  89.        
  90.         ;call nvview_panel        
  91.        
  92.         call nvview_calclines
  93.         ld hl,1;0
  94.         ld (nvview_ncurline),hl
  95.  
  96. nvview_redrawloop
  97.         ;jp nvview_hexeditor
  98.  
  99.         call nvview_prcurpage
  100. nvview_mainloop
  101. nvview_mainloop_nokey
  102.         YIELD
  103.        if PRSTDIO
  104.         GETKEY_
  105.         jr nz,nvview_mainloop_keyq
  106.         ;GETKEY_
  107.         ;jr nz,nvview_mainloop_keyq
  108.         ;GETKEY_
  109.         ;jr nz,nvview_mainloop_keyq ;event бывает 3-символьный
  110.        else
  111.         GET_KEY
  112.         ;jr z,nvview_mainloop_nokeygo
  113. ;есть событие (a=0: от мыши)
  114.         ld a,c ;keynolang
  115.         ;cp NOKEY
  116.          or a
  117.         jr nz,nvview_mainloop_keyq
  118.        endif
  119.         call nvview_panel ;97359 t
  120.         jr nvview_mainloop_nokey
  121. nvview_mainloop_keyq
  122.         cp key_redraw
  123.         jr z,nvview_redrawloop
  124.         cp key_esc
  125.         ret z
  126.         cp key_tab
  127.         jp z,nvview_hexeditor
  128.         ld hl,nvview_mainloop
  129.         push hl
  130.         cp key_up
  131.         jp z,nvview_up
  132.         cp key_down
  133.         jp z,nvview_down
  134.         cp key_pgup
  135.         jp z,nvview_pgup
  136.         cp key_pgdown
  137.         jp z,nvview_pgdown
  138.          cp key_csenter
  139.          jp z,hexeditor_save
  140.          cp key_F2
  141.          jp z,hexeditor_save
  142.         cp key_F1;'s'
  143.         jp z,nvview_changeencoding
  144.         cp key_home
  145.         jp z,nvview_home
  146.         cp key_sspgup;ext3
  147.         jp z,nvview_home
  148.         cp key_end
  149.         jp z,nvview_end
  150.         cp key_sspgdown;ext4
  151.         jp z,nvview_end
  152.         cp key_left
  153.         jp z,nvview_left
  154.         cp key_right
  155.         jp z,nvview_right
  156.         cp key_ins;'w'
  157.         jp z,nvview_wrap
  158.         ret
  159.  
  160. nvview_hexeditor
  161.         ;pop af ;снимаем адрес возврата
  162.         ld de,0x0000
  163.         call nv_setxy ;keeps de,hl,ix
  164.         ld hl,(curtoptextaddr)
  165.         ld a,(curtoptextHSB)
  166.         ld (hexaddrlineHSB),a
  167.         ld a,l
  168.         and 0xf0
  169.         ld l,a
  170.         ld (hexaddrline),hl
  171.         ld hl,0
  172.         ld (hexcuraddrxy),hl
  173.         jp hexeditor_redrawloop
  174. nvview_hexeditorq
  175.         call nvview_calclines
  176.         ld hl,(hexaddrline)
  177.         ld a,(hexaddrlineHSB)
  178.         call nvview_nextline
  179.         call nvview_prevline ;line beginning (TODO fix uneven sizes in wrap mode)
  180.        
  181.         call nvview_settop
  182.         call nvview_calccurline
  183.        
  184.         jp nvview_redrawloop
  185.  
  186. nvview_wrap
  187.         ld a,(wrapflag)
  188.         xor 128
  189.         ld (wrapflag),a
  190.         ld hl,0
  191.         ld (nvview_prline_shift),hl
  192.         ld hl,(curtoptextaddr)
  193.         ld a,(curtoptextHSB)
  194.         call nvview_pgdown_pgup_ahl;nvview_prcurpage
  195.         call nvview_calclines
  196.         ld hl,(curtoptextaddr)
  197.         ld a,(curtoptextHSB)
  198.         jp nvview_calccurline
  199.        
  200. nvview_right
  201.         ld a,(nvview_prline_shift)
  202.         add a,8
  203.         ret c
  204.         ld (nvview_prline_shift),a
  205.         call nvview_prcurpage
  206.         jp clear_keyboardbuffer
  207.        
  208. nvview_left
  209.         ld a,(nvview_prline_shift)
  210.         sub 8
  211.         ret c
  212.         ld (nvview_prline_shift),a
  213.         call nvview_prcurpage
  214.         jp clear_keyboardbuffer
  215.        
  216. nvview_prcurpage
  217.         ld hl,(curtoptextaddr)
  218.         ld a,(curtoptextHSB)
  219.         jp nvview_prpage
  220.        
  221. nvview_home
  222.         ld hl,1;0
  223.         ld (nvview_ncurline),hl
  224.         xor a
  225.         ld h,a
  226.         ld l,a
  227.         call nvview_settop
  228.         jp nvview_prpage
  229.        
  230. nvview_end
  231.         ld hl,(filesize)
  232.         ld a,(filesizeHSW)
  233.         ;ld b,NVVIEW_HGT
  234.         ld bc,(nvviewhgt-1) ;b
  235. nvview_end0
  236.         push bc
  237.         call nvview_prevline
  238.         pop bc
  239.         djnz nvview_end0
  240.         call nvview_calccurline
  241.         jp nvview_prpage
  242.  
  243. deccurline
  244.         push hl
  245.         ld hl,(nvview_ncurline)
  246.         dec hl
  247.         ld (nvview_ncurline),hl
  248.         pop hl
  249.         ret
  250.        
  251. inccurline
  252.         push hl
  253.         ld hl,(nvview_ncurline)
  254.         inc hl
  255.         ld (nvview_ncurline),hl
  256.         pop hl
  257.         ret
  258.  
  259. nvview_up
  260.         ld hl,(curtoptextaddr)
  261.         ld a,(curtoptextHSB)
  262.         call isbof
  263.         ret z
  264.         call nvview_prevline
  265.         call nvview_settop
  266.         push af
  267.         push hl
  268.         ld de,NVVIEW_XYTOP
  269.         ;ld hl,256*NVVIEW_HGT + NVVIEW_WID
  270.         ld hl,(nvviewhgt-1) ;h
  271.         ld l,NVVIEW_WID
  272.        if PRSTDIO
  273.         call scrolldown
  274.        else
  275.         OS_SCROLLDOWN
  276.        endif
  277.         ld de,NVVIEW_XYTOP
  278.         call nv_setxy ;keeps de,hl,ix
  279.         pop hl
  280.         pop af
  281.         call nvview_prline
  282.          ;ld de,+(txtscrhgt-1)*256+79
  283.         ld de,(scrhgt-1) ;d
  284.         dec d ;последняя строка экрана
  285.         ld e,txtscrwid-1
  286.          call nv_setxy ;avoid cursor at 0x0100
  287.         call deccurline
  288.         ld hl,(curbottomtextaddr)
  289.         ld a,(curbottomtextHSB)
  290.         call nvview_prevline
  291.         jp nvview_setbottom
  292.  
  293. nvview_down
  294. curbottomtextaddr=$+1
  295.         ld hl,0
  296. curbottomtextHSB=$+1
  297.         ld a,0
  298.         call iseof
  299.         ret z
  300.         push af
  301.         push hl
  302.         ld de,NVVIEW_XYTOP
  303.         ;ld hl,256*NVVIEW_HGT + NVVIEW_WID
  304.         ld hl,(nvviewhgt-1) ;h
  305.         ld l,NVVIEW_WID
  306.        push de
  307.        push hl
  308.        if PRSTDIO
  309.         call scrollup
  310.        else
  311.         OS_SCROLLUP
  312.        endif
  313.         ;ld de,NVVIEW_XYTOP+((NVVIEW_HGT-1)*256)
  314.        pop hl
  315.        pop de
  316.        dec h
  317.        ld l,0
  318.        add hl,de
  319.        ex de,hl ;de=NVVIEW_XYTOP+((NVVIEW_HGT-1)*256)
  320.         call nv_setxy ;keeps de,hl,ix
  321.         pop hl
  322.         pop af
  323.         call nvview_prline_nextline
  324.         call nvview_setbottom
  325.         call inccurline
  326. curtoptextaddr=$+1
  327.         ld hl,0
  328. curtoptextHSB=$+1
  329.         ld a,0
  330.         call nvview_nextline
  331. nvview_settop        
  332.         ld (curtoptextaddr),hl
  333.         ld (curtoptextHSB),a
  334.         ret
  335.  
  336. nvview_pgup
  337.         ld hl,(curtoptextaddr)
  338.         ld a,(curtoptextHSB)
  339. nvview_pgup_go
  340.         ;ld b,NVVIEW_HGT
  341.         ld bc,(nvviewhgt-1) ;b
  342. nvview_pgup0
  343.         push bc
  344.         call nvview_prevline
  345.          call nc,deccurline
  346.         pop bc
  347.         djnz nvview_pgup0
  348.         call nvview_prpage
  349.         jp clear_keyboardbuffer
  350.        
  351. nvview_pgdown
  352.          ld hl,(nvview_ncurline)
  353.          ;ld bc,NVVIEW_HGT
  354.         ld bc,(nvviewhgt) ;c
  355.         ld b,0
  356.          add hl,bc
  357.          ld (nvview_ncurline),hl
  358.         ld hl,(curbottomtextaddr)
  359.         ld a,(curbottomtextHSB)
  360. nvview_pgdown_pgup_ahl
  361.         ;ld b,NVVIEW_HGT
  362.         ld bc,(nvviewhgt-1) ;b
  363. nvview_pgdown0
  364.         push bc
  365.         call nvview_nextline
  366.          call nc,inccurline
  367.         pop bc
  368.         djnz nvview_pgdown0
  369.         jr nvview_pgup_go
  370.         if 1==0
  371.         ;ld b,NVVIEW_HGT
  372.         ld bc,(nvviewhgt-1) ;b
  373. nvview_pgdown1
  374.         push bc
  375.         call nvview_prevline
  376.          call nc,deccurline
  377.         pop bc
  378.         djnz nvview_pgdown1
  379.         call nvview_prpage
  380.         jp clear_keyboardbuffer
  381.         endif
  382.        
  383. nvview_calccurline
  384.         ;ld hl,(curtoptextaddr)
  385.         ;ld a,(curtoptextHSB)
  386. ;ahl=curtextline (kept)
  387.         push af
  388.         push hl
  389.         ld (nvview_calccurline_old),hl
  390.         ld (nvview_calccurline_oldHSB),a
  391.         ld ix,1;0
  392.          or h
  393.          or l
  394.          jr z,nvview_calccurline_countq
  395.         xor a
  396.         ld h,a
  397.         ld l,a
  398. nvview_calccurline_count0
  399.         call nvview_nextline;nvview_pseudoprline
  400.         push hl
  401. nvview_calccurline_old=$+1
  402.         ld bc,0
  403.         or a
  404.         sbc hl,bc ;nc: hl>=old
  405.         ld l,a
  406. nvview_calccurline_oldHSB=$+1
  407.         sbc a,0
  408.         ld a,l
  409.         pop hl
  410.         inc ix
  411.         jr c,nvview_calccurline_count0 ;cy: ahl<old
  412. nvview_calccurline_countq
  413.         ;push ix
  414.         ;pop hl
  415.         ld (nvview_ncurline),ix;hl
  416.         pop hl
  417.         pop af
  418.         ret
  419.        
  420. nvview_calclines
  421. ;out ix = lines
  422.         ld ix,0
  423.         xor a
  424.         ld h,a
  425.         ld l,a
  426. nvview_calclines0
  427.         inc ix
  428.         call nvview_nextline
  429.         call iseof
  430.         jp nz,nvview_calclines0
  431.         ld (nlines),ix
  432.         ret
  433.        
  434. clear_keyboardbuffer
  435.         push bc
  436.         ld b,50;5
  437. clear_keyboardbuffer0
  438.         push bc
  439.        if PRSTDIO
  440.         GETKEY_
  441.        else
  442.         GET_KEY
  443.        endif
  444.         pop bc
  445.         djnz clear_keyboardbuffer0
  446.         pop bc
  447.         ret
  448.        
  449. nvview_changeencoding
  450.         ld hl,nvview_prline_recodepatch
  451.         ld a,(hl)
  452.         xor 0x7e ;"ld a,(hl)"
  453.         ld (hl),a ;TODO utf8
  454.         call nvview_prcurpage
  455.         ;ret
  456. nvview_panel
  457.         ;ld de,+(txtscrhgt-1)*256
  458.         ld de,(scrhgt-1) ;d
  459.         dec d ;последняя строка экрана
  460.         ld e,0
  461.         call nv_setxy ;keeps de,hl,ix
  462.         ld de,_NVVIEW_PANELCOLOR;#38
  463.        if PRSTDIO
  464.         SETCOLOR_
  465.        else
  466.         call nv_setcolor
  467.        endif
  468.         ld a,(nvview_prline_recodepatch)
  469.         or a
  470.         ld hl,t866
  471.         jr z,$+5
  472.         ld hl,twin
  473.          ld c,0
  474.         call prtext
  475.        
  476. fchanged=$+1
  477.         ld a,' '
  478.         MYPRCHAR
  479. nvview_ncurline=$+1
  480.         ld hl,0
  481.         ld de,0
  482.         call prdword_dehl
  483.         ld a,'/'
  484.         MYPRCHAR
  485.         ld hl,(nlines)
  486.         ld de,0
  487.         call prdword_dehl
  488.         ld a,' '
  489.         MYPRCHAR
  490.         ld hl,(filesize)
  491.         ld de,(filesizeHSW)
  492.         call prdword_dehl
  493.         ld de,tspaces_filename
  494.         ld hl,TSPACES_FILENAME_SZ
  495.         call sendchars
  496.         ;ld e,NVVIEW_PANELCOLOR;#38
  497.         ;OS_PRATTR
  498.         ld de,_COLOR;#38
  499.        if PRSTDIO
  500.         SETCOLOR_
  501.        else
  502.         call nv_setcolor
  503.        endif
  504.         ret
  505.        
  506. tspaces_filename
  507.         db ' '
  508. tshown_filename
  509.         ds TSPACES_FILENAME_SZ,' '
  510.        
  511. twin
  512.         db "WIN",0
  513. t866
  514.         db "866",0
  515.  
  516.      
  517. isbof
  518.         push bc
  519.         ld c,a
  520.         or h
  521.         or l
  522.         ld a,c
  523.         pop bc
  524.         ret
  525. iseof
  526.         push bc
  527.         push de
  528.         push hl
  529.         ld de,(filesize)
  530.         ld bc,(filesizeHSW)
  531.         ld b,a
  532.         or a
  533.         sbc hl,de
  534.         sbc a,c
  535.         ld a,b
  536.         pop hl
  537.         pop de
  538.         pop bc
  539.         ret
  540.      
  541. nvview_prpage
  542. ;ahl=addr
  543.         ld (curtoptextaddr),hl
  544.         ld (curtoptextHSB),a
  545.         push af
  546.         ld de,NVVIEW_XYTOP
  547.         call nv_setxy ;keeps de,hl,ix
  548.         pop af
  549.         ;ld b,NVVIEW_HGT
  550.         ld bc,(nvviewhgt-1) ;b
  551. nvview_prpage0
  552.         push bc
  553.         ;push de
  554.         ;push af
  555.         ;push hl
  556.         ;call nv_setxy
  557.         ;pop hl
  558.         ;pop af
  559.         call nvview_prline_nextline
  560.         ;pop de
  561.         pop bc
  562.         ;inc d
  563.         djnz nvview_prpage0
  564. nvview_setbottom
  565.         ld (curbottomtextaddr),hl
  566.         ld (curbottomtextHSB),a
  567.         ret
  568.        
  569. nvview_prevline
  570. ;ahl=addr
  571. ;line < 16K
  572. ;out: ahl, CY=error
  573.         call isbof
  574.          scf
  575.         ret z
  576. ;перед нами может быть #0d или #0d,#0a или ничего
  577.         ld (findprevline_old),hl
  578.         ld (findprevline_oldHSB),a
  579.        
  580.         or a
  581.         ld bc,0xffff
  582.         jr nz,$+4
  583.          ld b,h
  584.          ld c,l
  585.        
  586.         ld de,0x4000
  587.         or a
  588.         sbc hl,de
  589.         sbc a,e;0
  590.         push af
  591.         push hl
  592.         call ahl_to_pgaddr
  593.         set 6,h
  594. ;hl=c000+, можно уменьшать
  595. ;bc=number of chars to go != 0
  596.  
  597. ;перед нами может быть #0d или #0d,#0a или ничего
  598.         dec hl
  599.         dec bc
  600.         ld a,b
  601.         or c
  602.         jr z,nvview_prevlineq
  603.         ld a,0x0a
  604.         cp (hl)
  605.         jr nz,nvview_prevline_nolf
  606.         dec hl
  607.         dec bc
  608.         ld a,b
  609.         or c
  610.         jr z,nvview_prevlineq
  611. nvview_prevline_nolf
  612.         ld a,0x0d
  613.         cp (hl)
  614.         jr nz,nvview_prevline_nocr
  615.         dec hl
  616.         dec bc
  617.         ld a,b
  618.         or c
  619.         jr z,nvview_prevlineq
  620. nvview_prevline_nocr
  621. ;сейчас мы находимся перед символом конца предыдущей строки (не на нём)
  622. nvview_prevline0
  623.         ld a,(hl)
  624.         cp 0x0d
  625.         jr z,nvview_prevline_cr
  626.         cp 0x0a
  627.         jr z,nvview_prevline_lf
  628.         dec hl
  629.         dec bc
  630.         ld a,b
  631.         or c
  632.         jr nz,nvview_prevline0
  633. ;beginning of file
  634.         jr nvview_prevlineq
  635. nvview_prevline_cr
  636. nvview_prevline_lf
  637. ;сейчас мы находимся на конце символа конца строки перед предыдущей
  638.         inc hl
  639. nvview_prevlineq
  640.         ex de,hl ;new addr (bits 13..0), bit 14 = overflow
  641.         pop hl ;old addr
  642.         pop af
  643.         call pgaddr_to_ahl
  644.         call iswrapon ;CY=on
  645.         ret nc ;no wrap
  646.  
  647. findprevline_linewrap
  648. ;ahl = в начале строки
  649. ;перед ней может быть #0d или #0d,#0a
  650. ;надо псевдонапечатать несколько псевдострок, пока не дойдём до текущей
  651. findprevline_linewrap_count0
  652.          push af
  653.          push hl
  654.         call nvview_pseudoprline
  655.         push hl
  656. findprevline_old=$+1
  657.         ld bc,0
  658.         or a
  659.         sbc hl,bc ;nc: hl>=old
  660.         ld l,a
  661. findprevline_oldHSB=$+1
  662.         sbc a,0
  663.         ld a,l
  664.         pop hl
  665.          pop de ;old addr
  666.          pop bc ;b=old HSB
  667.         jr c,findprevline_linewrap_count0
  668.         ex de,hl
  669.         ld a,b
  670. ;ahl=на псевдострочку раньше
  671.         ret ;nc
  672.  
  673. getmaxlinesize
  674. ;ahl = addr
  675. ;out: bc=max line size before eof, z=(bc==0)
  676.         push af
  677.         push hl
  678.         ex de,hl
  679.         ld hl,(filesize)
  680.         ld c,a
  681.         ld a,(filesizeHSW)
  682.         or a
  683.         sbc hl,de
  684.         sbc a,c
  685.         ld bc,0
  686.         jr c,getmaxlinesize_aftereof
  687.         dec bc
  688.         or a
  689.         jr nz,$+4 ;filesize-addr >= 0x10000, will be 0xffff
  690.          ld b,h
  691.          ld c,l ;filesize-addr
  692. getmaxlinesize_aftereof
  693.         pop hl
  694.         pop af
  695.         ld e,a
  696.         ld a,b
  697.         or c
  698.         ld a,e
  699.         ret
  700.  
  701. nvview_prline_nextline
  702.         push af
  703.         push hl
  704.         call nvview_prline
  705.         pop hl
  706.         pop af
  707. nvview_nextline
  708. ;if eof, returns eof addr
  709. ;ahl=addr
  710. ;line < 16K
  711. ;out: ahl, CY=error
  712.         call iswrapon ;CY=on
  713.         jp c,nvview_pseudoprline
  714.         call getmaxlinesize ;bc=max line size before eof, z=(bc==0)
  715.          scf
  716.         ret z
  717.         push af
  718.         push hl
  719.         call ahl_to_pgaddr
  720. ;bc=number of chars to go != 0
  721. nvview_nextline0
  722.         ld a,(hl)
  723.         inc hl
  724.         dec bc
  725.         cp 0x0d
  726.         jr z,nvview_nextline_cr
  727.         cp 0x0a
  728.         jr z,nvview_nextline_cr;lf
  729.         ld a,b
  730.         or c
  731.         jr nz,nvview_nextline0
  732. nvview_nextlineq
  733.         ex de,hl ;new addr (bits 13..0), bit 14 = overflow
  734.         pop hl ;old addr
  735.         pop af
  736. pgaddr_to_ahl
  737. ;de = new addr (bits 13..0), bit 14 = overflow
  738. ;ahl = old addr
  739.         bit 6,d
  740.         ld bc,0x4000
  741.         jr z,$+4
  742.         add hl,bc
  743.         adc a,c;0
  744.         ld c,a
  745.         ld l,e
  746.         ld a,d
  747.         xor h
  748.         and 0x3f
  749.         xor h
  750.         ld h,a ;bits 13..0 copied
  751.         ld a,c ;ahl = new addr
  752.         ret ;nc
  753. nvview_nextline_cr
  754.         ld a,b
  755.         or c
  756.         jr z,nvview_nextlineq
  757.         ld a,(hl)
  758.         cp 0x0a
  759.         jr nz,nvview_nextline_lf
  760.         inc hl
  761. nvview_nextline_lf=nvview_nextlineq
  762.         jr nvview_nextlineq
  763.        
  764. nvview_prline
  765. ;ahl=addr
  766. ;check for last line (vs. file size)
  767. ;if filesize-addr < 80, then b=filesize-addr, else b=80
  768.         call getmaxlinesize ;bc=max line size before eof, z=(bc==0)
  769.         jr z,nvview_prlinespc_all;ret z
  770.         call ahl_to_pgaddr
  771. ;hl=#8000+0..#3fff
  772. ;bc=max line size before eof != 0
  773. nvview_prline_shift=$+1
  774.         ld de,0
  775.         call istherecr_or_lf ;add hl,de
  776.         ;jr nz,$+3
  777.         ;dec hl ;hl=cr/lf address
  778.  
  779.         push hl
  780.         ld h,b
  781.         ld l,c
  782.         or a
  783.         sbc hl,de
  784.         ld b,h
  785.         ld c,l ;bc=bc-lineshift
  786.         pop hl
  787.         ;ld a,NVVIEW_WID
  788.         jr c,nvview_prlinespc_all
  789.         jr z,nvview_prlinespc_all ;maxlinesize<=lineshift
  790.  
  791.         push hl
  792.         ld hl,NVVIEW_WID
  793.         call minhl_bc_tobc
  794.         ld b,c
  795.         pop hl
  796. ;b=number of chars to print != 0
  797.         ld de,prlinebuf
  798.         ld c,0;NVVIEW_WID
  799. nvview_prline0
  800.         ld a,(hl)
  801.         inc hl
  802.         cp 0x0d
  803.         jr z,nvview_prline_cr
  804.         cp 0x0a
  805.         jr z,nvview_prline_cr;lf
  806.         ;push bc
  807.         push hl
  808.         ld h,twinto866/256
  809.         ld l,a
  810. nvview_prline_recodepatch=$
  811.         nop ;/ld a,(hl)
  812.        if PRSTDIO
  813.         cp 0x1b
  814.         jr nz,$+3
  815.         xor a ;can't print 0x1b!
  816.        endif
  817.         ld (de),a ;PRCHAR_
  818.         inc de
  819.         pop hl
  820.         ;pop bc
  821.         inc c;dec c
  822.         djnz nvview_prline0
  823.         ;call print_prlinebuf
  824.         ;jr nz,nvview_prline_lf
  825.         ;ret
  826. nvview_prline_cr
  827. ;c=linesize [80-linesize]
  828.         call print_prlinebuf
  829. ;c=x
  830. ;nvview_prline_lf
  831. ;допечатать пробелы до конца строки
  832.         jr nvview_prlinespc
  833. nvview_prlinespc_all
  834.         ld c,0;NVVIEW_WID
  835. nvview_prlinespc
  836.         push af
  837.         push hl
  838.         ;ld l,b
  839.         ;ld h,0
  840.         ;ld de,tspaces
  841.         ;call sendchars
  842.          ld a,c
  843.          ;or a
  844.          ;ld a,NVVIEW_WID
  845.          ;sub c
  846.          ;ld c,a
  847.          cp NVVIEW_WID
  848.         call nz,clearrestofline_crlf
  849.         pop hl
  850.         pop af
  851.         ret
  852.  
  853. print_prlinebuf
  854.         push af
  855.         push bc
  856.         push hl
  857. ;c=x [NVVIEW_WID-число символов]
  858.         ld de,prlinebuf
  859.         ;ld a,NVVIEW_WID
  860.         ;sub c
  861.         ld l,c;a
  862.         ld h,0
  863.         inc l
  864.         dec l
  865.          ld c,h
  866.          call nz,sendchars
  867.         pop hl
  868.         pop bc
  869.         pop af
  870.         ret
  871.  
  872. prlinebuf
  873.         ds NVVIEW_WID
  874.  
  875. nvview_pseudoprline
  876. ;ahl=addr
  877. ;out: ahl, CY=error
  878. ;check for last line (vs. file size)
  879. ;if filesize-addr < 80, then b=filesize-addr, else b=80
  880.         call getmaxlinesize ;bc=max line size before eof, z=(bc==0)
  881.          scf
  882.         ret z
  883.         push af
  884.         push hl
  885.         call ahl_to_pgaddr
  886. ;hl=#8000+0..#3fff
  887. ;bc=max line size before eof != 0
  888.         push hl
  889.         ld hl,NVVIEW_WID
  890.         call minhl_bc_tobc
  891.         ld b,c
  892.         pop hl
  893. ;b=number of chars to print != 0
  894.         ld c,NVVIEW_WID
  895. nvview_pseudoprline0
  896.         ld a,(hl)
  897.         inc hl
  898.         cp 0x0d
  899.         jr z,nvview_pseudoprline_cr
  900.         cp 0x0a
  901.         jr z,nvview_pseudoprline_lf
  902.         dec c
  903.         djnz nvview_pseudoprline0
  904.          ld a,(hl)
  905.          inc hl
  906.          cp 0x0d
  907.          jr z,nvview_pseudoprline_crok
  908.          cp 0x0a
  909.          jr z,nvview_pseudoprline_lf
  910.          dec hl
  911.         jp nvview_nextlineq
  912. nvview_pseudoprline_cr
  913.         dec b
  914.         jp z,nvview_nextlineq
  915. nvview_pseudoprline_crok
  916.         ld a,(hl)
  917.         cp 0x0a
  918.         jr nz,nvview_pseudoprline_lf
  919.         inc hl
  920. nvview_pseudoprline_lf
  921.         jp nvview_nextlineq
  922.        
  923. istherecr_or_lf
  924. ;hl=addr
  925. ;de=length to search
  926. ;out: z=found, hl=at match or after area
  927.         ld a,d
  928.         or e
  929.         jr z,istherecr_or_lf_fail
  930.          push hl
  931.         ld a,0x0d
  932.         call istherecrlfgo
  933.         jr z,popafZret;ret z
  934.          pop hl
  935.         ld a,0x0a
  936. istherecrlfgo
  937.         push bc
  938.         ld b,d
  939.         ld c,e
  940.         cpir ;TODO несколько раз через все блоки, если заканчиваются блоки, то их переключать
  941.         pop bc
  942.         ret nz ;nz=not found
  943.          dec hl
  944.         ret ;z=found
  945. istherecr_or_lf_fail
  946.         dec a
  947.         ret ;nz=not found
  948.        
  949. popafZret
  950.         pop af
  951.         cp a ;Z
  952.         ret
  953.        
  954. ;nvview_closefcb
  955. ;        ld de,fcb
  956. ;        OS_FCLOSE
  957. ;        ret
  958.  
  959. setunchanged
  960.         ld a,' '
  961.         jr setchanged_a
  962. setchanged
  963.         ld a,'*'
  964. setchanged_a
  965.         ld (fchanged),a
  966.         ret
  967.  
  968. iswrapon
  969. ;CY = on
  970. wrapflag=$
  971.         scf;or a ;/scf
  972.         ret
  973.  
  974. reservepage
  975. ;new page, set page in textpages, npages++, set page in #c000
  976. ;nz=error
  977.         OS_NEWPAGE
  978.         or a
  979.         ret nz
  980. npages=$+1
  981.         ld hl,textpages
  982.         ld (hl),e
  983.         inc l
  984.         ld (npages),hl
  985.         ld a,e
  986.         SETPGC000
  987.         xor a
  988.         ret ;z
  989.  
  990. unreservepages
  991. unreservepages0
  992.         call unreservepage
  993.         jr z,unreservepages0
  994.         ret
  995.        
  996. unreservepage
  997. ;del page, npages--
  998. ;nz=error
  999.         ld hl,(npages)
  1000.         ld a,l
  1001.         or a
  1002.         jr z,unreservepage_fail
  1003.         dec l
  1004.         ld (npages),hl
  1005.         ld e,(hl)
  1006.         OS_DELPAGE
  1007.         xor a
  1008.         ret ;z
  1009. unreservepage_fail
  1010.         xor a
  1011.         dec a
  1012.         ret ;nz
  1013.        
  1014. ahl_to_pgaddr
  1015. ;keeps bc,de
  1016. ;counts physical hl
  1017.         rl h
  1018.         rla
  1019.         rl h
  1020.         rla
  1021.         srl h
  1022.         scf
  1023.         rr h
  1024.         push bc
  1025.         call setpg32k
  1026.         pop bc
  1027.         ret
  1028.  
  1029. setpg32k
  1030. ;a=page number in table (0..)
  1031.         push hl
  1032.         ld l,a
  1033.         ld h,textpages/256
  1034.         ld a,(hl)
  1035.         SETPG8000
  1036.         inc l
  1037.         ld a,(hl)
  1038.         SETPGC000
  1039.         pop hl
  1040.         ret
  1041.  
  1042. filesize
  1043.         dw 0
  1044. filesizeHSW
  1045.         dw 0
  1046.  
  1047. nlines
  1048.         dw 0
  1049.