Subversion Repositories NedoOS

Rev

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

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