?login_element?

Subversion Repositories NedoOS

Rev

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