Subversion Repositories NedoOS

Rev

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