Subversion Repositories NedoOS

Rev

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

  1.         DEVICE ZXSPECTRUM128
  2.         include "../_sdk/sys_h.asm"
  3. ;usage: man filename_without_ext
  4.  
  5. PRSTDIO=1
  6.         if PRSTDIO
  7. _COLOR=0x0007;0x07
  8. _COLOR_RED=0x0107;0x17
  9. _NVVIEW_PANELCOLOR=0x0700;0x38
  10.         else
  11. _COLOR=0x07
  12. _COLOR_RED=0x17
  13. _NVVIEW_PANELCOLOR=0x38
  14.         endif
  15.  
  16. NVVIEW_XYTOP=0x0000
  17. NVVIEW_HGT=24
  18. NVVIEW_WID=80
  19. txtscrwid=80
  20. TSPACES_FILENAME_SZ=43+3
  21.  
  22.         macro MYPRCHAR
  23.        if PRSTDIO
  24.         PRCHAR_
  25.        else
  26.         PRCHAR
  27.        endif
  28.         endm
  29.  
  30.         org PROGSTART
  31. cmd_begin
  32.         ld sp,0x4000
  33.        if PRSTDIO
  34.         call initstdio
  35.         ld a,(stdiohgt)
  36.         ld (scrhgt),a
  37.         dec a
  38.         ld (nvviewhgt),a ;может потом уменьшиться из-за меню
  39.         ;ld (hexedhgt),a
  40.         sub 3
  41.         ld (filesperpanel),a
  42.         call clearterm ;print <stdiohgt> lines of spaces except one space, set cursor to 0,0
  43.        else
  44.         OS_HIDEFROMPARENT
  45.         ld e,6 ;textmode
  46.         OS_SETGFX
  47.         ld e,_COLOR
  48.         OS_CLS
  49.        endif
  50.  
  51.         OS_GETMAINPAGES
  52. ;dehl=номера страниц в 0000,4000(copybuf),8000,c000*(dirbuf)
  53.         push hl
  54.         ld e,h
  55.         OS_DELPAGE
  56.         pop hl
  57.         ld e,l
  58.         OS_DELPAGE
  59.  
  60.         ld hl,COMMANDLINE ;command line
  61.         call skipword
  62.         call skipspaces
  63.         ld a,(hl)
  64.         or a
  65.         jr z,noautoload
  66. ;command line = "texted <file to load>"
  67.         ld (texted_filenameaddr),hl
  68.         call skipword
  69.         ld (hl),'.'
  70.         inc hl
  71.         ld (hl),'t'
  72.         inc hl
  73.         ld (hl),'x'
  74.         inc hl
  75.         ld (hl),'t'
  76.         inc hl
  77.         ld (hl),0
  78. noautoload
  79.         call lister
  80.  
  81.         QUIT
  82.  
  83. lister
  84.         OS_SETSYSDRV
  85.         ld de,res_path
  86.         OS_CHDIR
  87.  
  88. texted_filenameaddr=$+1
  89.         ld de,filenametext
  90. ;de=filename
  91.         OS_OPENHANDLE
  92.         or a
  93.         ret nz ;error
  94.         ld a,b
  95.         ld (curhandle),a
  96.  
  97.         ld hl,unreservepages
  98.         push hl
  99.        
  100.         ld hl,0
  101.         ld de,0
  102. nvview_load0
  103.         push de
  104.         push hl
  105.         call reservepage
  106.         pop hl
  107.         pop de
  108.         ret nz ;no memory
  109. ;nvview_load0nonewpg        
  110.         ld a,0xc000/256
  111.         call cmd_loadpage
  112.         jr nz,nvview_load0q
  113.         ex de,hl
  114.         add hl,bc
  115.         ex de,hl
  116.         jr nc,$+3
  117.         inc hl
  118.          ;TODO nvview_load0nonewpg with new pointer if no new page
  119.         ld a,b
  120.         or c
  121.         jr nz,nvview_load0
  122. nvview_load0q
  123. ;hlde=true file size (for TRDOSFS)
  124.         ld (filesize),de
  125.         ld (filesizeHSW),hl
  126.  
  127.         ld a,(curhandle)
  128.         ld b,a
  129.         OS_CLOSEHANDLE
  130.  
  131.         ld hl,(texted_filenameaddr)
  132.         ld de,tshown_filename
  133.         ld b,TSPACES_FILENAME_SZ
  134.         call strcopy_maxb
  135.  
  136.         xor a
  137.         ld h,a
  138.         ld l,a
  139.         call nvview_settop
  140.        
  141.         ;call nvview_panel        
  142.         ;jr $
  143.         call nvview_calclines
  144.         ld hl,1;0
  145.         ld (nvview_ncurline),hl
  146.  
  147. nvview_redrawloop
  148.         ;jp nvview_hexeditor
  149.  
  150.         call nvview_prcurpage
  151. nvview_mainloop
  152. nvview_mainloop0
  153.         YIELD ;halt ;если сделать просто di:rst #38, то 1.сдвинем таймер и 2.можем потерять кадровое прерывание, а если без ei, то будут глюки
  154.        if PRSTDIO
  155.         GETKEY_
  156.         jr nz,nvview_mainloop_keyq
  157.         ;GETKEY_
  158.         ;jr nz,nvview_mainloop_keyq
  159.         ;GETKEY_
  160.         ;jr nz,nvview_mainloop_keyq ;event бывает 3-символьный
  161.        else
  162.         GET_KEY
  163.         ;jr z,nvview_mainloop_nokeygo
  164. ;есть событие (a=0: от мыши)
  165.         ld a,c ;keynolang
  166.         ;cp NOKEY
  167.          or a
  168.         jr nz,nvview_mainloop_keyq
  169.        endif
  170.         call nvview_panel
  171.         jr nvview_mainloop0
  172. nvview_mainloop_keyq
  173.         cp key_redraw
  174.         jr z,nvview_redrawloop
  175.         cp key_esc
  176.         ret z
  177.         ;cp key_tab
  178.         ;jp z,nvview_hexeditor
  179.         ld hl,nvview_mainloop
  180.         push hl
  181.         cp key_up
  182.         jp z,nvview_up
  183.         cp key_down
  184.         jp z,nvview_down
  185.         cp key_pgup
  186.         jp z,nvview_pgup
  187.         cp key_pgdown
  188.         jp z,nvview_pgdown
  189.         ;cp 's';csss
  190.         ;jp z,nvview_changeencoding
  191.         cp key_home
  192.         jp z,nvview_home
  193.         cp key_sspgup;ext3
  194.         jp z,nvview_home
  195.         cp key_end
  196.         jp z,nvview_end
  197.         cp key_sspgdown;ext4
  198.         jp z,nvview_end
  199.         cp key_left
  200.         jp z,nvview_left
  201.         cp key_right
  202.         jp z,nvview_right
  203.         ;cp 'w'
  204.         ;jp z,nvview_wrap
  205.         ret
  206.  
  207. nvview_wrap
  208.         ld a,(wrapflag)
  209.         xor 128
  210.         ld (wrapflag),a
  211.         ld hl,0
  212.         ld (nvview_prline_shift),hl
  213.         ld hl,(curtoptextaddr)
  214.         ld a,(curtoptextHSB)
  215.         call nvview_pgdown_pgup_ahl;nvview_prcurpage
  216.         call nvview_calclines
  217.         ld hl,(curtoptextaddr)
  218.         ld a,(curtoptextHSB)
  219.         jp nvview_calccurline
  220.  
  221.        
  222. nvview_right
  223.         ld a,(nvview_prline_shift)
  224.         add a,8
  225.         ret c
  226.         ld (nvview_prline_shift),a
  227.         call nvview_prcurpage
  228.         jp clear_keyboardbuffer
  229.        
  230. nvview_left
  231.         ld a,(nvview_prline_shift)
  232.         sub 8
  233.         ret c
  234.         ld (nvview_prline_shift),a
  235.         call nvview_prcurpage
  236.         jp clear_keyboardbuffer
  237.        
  238. nvview_prcurpage
  239.         ld hl,(curtoptextaddr)
  240.         ld a,(curtoptextHSB)
  241.         jp nvview_prpage
  242.        
  243. nvview_home
  244.         ld hl,1;0
  245.         ld (nvview_ncurline),hl
  246.         xor a
  247.         ld h,a
  248.         ld l,a
  249.         call nvview_settop
  250.         jp nvview_prpage
  251.        
  252. nvview_end
  253.         ld hl,(filesize)
  254.         ld a,(filesizeHSW)
  255.         ;ld b,NVVIEW_HGT
  256.         ld bc,(nvviewhgt-1) ;b
  257. nvview_end0
  258.         push bc
  259.         call nvview_prevline
  260.         pop bc
  261.         djnz nvview_end0
  262.         call nvview_calccurline
  263.         jp nvview_prpage
  264.  
  265. deccurline
  266.         push hl
  267.         ld hl,(nvview_ncurline)
  268.         dec hl
  269.         ld (nvview_ncurline),hl
  270.         pop hl
  271.         ret
  272.        
  273. inccurline
  274.         push hl
  275.         ld hl,(nvview_ncurline)
  276.         inc hl
  277.         ld (nvview_ncurline),hl
  278.         pop hl
  279.         ret
  280.  
  281. nvview_up
  282.         ld hl,(curtoptextaddr)
  283.         ld a,(curtoptextHSB)
  284.         call isbof
  285.         ret z
  286.         call nvview_prevline
  287.         call nvview_settop
  288.         push af
  289.         push hl
  290.         ld de,NVVIEW_XYTOP
  291.         ;ld hl,256*NVVIEW_HGT + NVVIEW_WID
  292.         ld hl,(nvviewhgt-1) ;h
  293.         ld l,NVVIEW_WID
  294.        if PRSTDIO
  295.         call scrolldown
  296.        else
  297.         OS_SCROLLDOWN
  298.        endif
  299.         ld de,NVVIEW_XYTOP
  300.         call nv_setxy ;keeps de,hl,ix
  301.         pop hl
  302.         pop af
  303.         call nvview_prline
  304.          ;ld de,+(txtscrhgt-1)*256+79
  305.         ld de,(scrhgt-1) ;d
  306.         dec d ;последняя строка экрана
  307.         ld e,txtscrwid-1
  308.          call nv_setxy ;avoid cursor at 0x0100
  309.         call deccurline
  310.         ld hl,(curbottomtextaddr)
  311.         ld a,(curbottomtextHSB)
  312.         call nvview_prevline
  313.         jp nvview_setbottom
  314.  
  315. nvview_down
  316. curbottomtextaddr=$+1
  317.         ld hl,0
  318. curbottomtextHSB=$+1
  319.         ld a,0
  320.         call iseof
  321.         ret z
  322.         push af
  323.         push hl
  324.         ld de,NVVIEW_XYTOP
  325.         ;ld hl,256*NVVIEW_HGT + NVVIEW_WID
  326.         ld hl,(nvviewhgt-1) ;h
  327.         ld l,NVVIEW_WID
  328.        push de
  329.        push hl
  330.        if PRSTDIO
  331.         call scrollup
  332.        else
  333.         OS_SCROLLUP
  334.        endif
  335.         ;ld de,NVVIEW_XYTOP+((NVVIEW_HGT-1)*256)
  336.        pop hl
  337.        pop de
  338.        dec h
  339.        ld l,0
  340.        add hl,de
  341.        ex de,hl ;de=NVVIEW_XYTOP+((NVVIEW_HGT-1)*256)
  342.         call nv_setxy ;keeps de,hl,ix
  343.         pop hl
  344.         pop af
  345.         call nvview_prline_nextline
  346.         call nvview_setbottom
  347.         call inccurline
  348. curtoptextaddr=$+1
  349.         ld hl,0
  350. curtoptextHSB=$+1
  351.         ld a,0
  352.         call nvview_nextline
  353. nvview_settop        
  354.         ld (curtoptextaddr),hl
  355.         ld (curtoptextHSB),a
  356.         ret
  357.  
  358. nvview_pgup
  359.         ld hl,(curtoptextaddr)
  360.         ld a,(curtoptextHSB)
  361. nvview_pgup_go
  362.         ;ld b,NVVIEW_HGT
  363.         ld bc,(nvviewhgt-1) ;b
  364. nvview_pgup0
  365.         push bc
  366.         call nvview_prevline
  367.          call nc,deccurline
  368.         pop bc
  369.         djnz nvview_pgup0
  370.         call nvview_prpage
  371.         jp clear_keyboardbuffer
  372.        
  373. nvview_pgdown
  374.          ld hl,(nvview_ncurline)
  375.          ;ld bc,NVVIEW_HGT
  376.         ld bc,(nvviewhgt) ;c
  377.         ld b,0
  378.          add hl,bc
  379.          ld (nvview_ncurline),hl
  380.         ld hl,(curbottomtextaddr)
  381.         ld a,(curbottomtextHSB)
  382. nvview_pgdown_pgup_ahl
  383.         ;ld b,NVVIEW_HGT
  384.         ld bc,(nvviewhgt-1) ;b
  385. nvview_pgdown0
  386.         push bc
  387.         call nvview_nextline
  388.          call nc,inccurline
  389.         pop bc
  390.         djnz nvview_pgdown0
  391.         jr nvview_pgup_go
  392.         if 1==0
  393.         ;ld b,NVVIEW_HGT
  394.         ld bc,(nvviewhgt-1) ;b
  395. nvview_pgdown1
  396.         push bc
  397.         call nvview_prevline
  398.          call nc,deccurline
  399.         pop bc
  400.         djnz nvview_pgdown1
  401.         call nvview_prpage
  402.         jp clear_keyboardbuffer
  403.         endif
  404.        
  405. nvview_calccurline
  406.         ;ld hl,(curtoptextaddr)
  407.         ;ld a,(curtoptextHSB)
  408. ;ahl=curtextline (kept)
  409.         push af
  410.         push hl
  411.         ld (nvview_calccurline_old),hl
  412.         ld (nvview_calccurline_oldHSB),a
  413.         ld ix,1;0
  414.          or h
  415.          or l
  416.          jr z,nvview_calccurline_countq
  417.         xor a
  418.         ld h,a
  419.         ld l,a
  420. nvview_calccurline_count0
  421.         call nvview_nextline;nvview_pseudoprline
  422.         push hl
  423. nvview_calccurline_old=$+1
  424.         ld bc,0
  425.         or a
  426.         sbc hl,bc ;nc: hl>=old
  427.         ld l,a
  428. nvview_calccurline_oldHSB=$+1
  429.         sbc a,0
  430.         ld a,l
  431.         pop hl
  432.         inc ix
  433.         jr c,nvview_calccurline_count0 ;cy: ahl<old
  434. nvview_calccurline_countq
  435.         ;push ix
  436.         ;pop hl
  437.         ld (nvview_ncurline),ix;hl
  438.         pop hl
  439.         pop af
  440.         ret
  441.        
  442. nvview_calclines
  443. ;out ix = lines
  444.         ld ix,0
  445.         xor a
  446.         ld h,a
  447.         ld l,a
  448. nvview_calclines0
  449.         inc ix
  450.         call nvview_nextline
  451.         call iseof
  452.         jp nz,nvview_calclines0
  453.         ld (nlines),ix
  454.         ret
  455.        
  456. clear_keyboardbuffer
  457.         push bc
  458.         ld b,50;5
  459. clear_keyboardbuffer0
  460.         push bc
  461.        if PRSTDIO
  462.         GETKEY_
  463.        else
  464.         GET_KEY
  465.        endif
  466.         pop bc
  467.         djnz clear_keyboardbuffer0
  468.         pop bc
  469.         ret
  470.        
  471. nvview_changeencoding
  472.         ld hl,nvview_prline_recodepatch
  473.         ld a,(hl)
  474.         xor 0x7e ;"ld a,(hl)"
  475.         ld (hl),a ;TODO utf8
  476.         call nvview_prcurpage
  477.         ;ret
  478. nvview_panel
  479.         ;ld de,+(txtscrhgt-1)*256
  480.         ld de,(scrhgt-1) ;d
  481.         dec d ;последняя строка экрана
  482.         ld e,0
  483.         call nv_setxy ;keeps de,hl,ix
  484.         ld de,_NVVIEW_PANELCOLOR;#38
  485.        if PRSTDIO
  486.         SETCOLOR_
  487.        else
  488.         call nv_setcolor
  489.        endif
  490.  
  491.        if 0
  492.         ld a,(nvview_prline_recodepatch)
  493.         or a
  494.         ld hl,t866
  495.         jr z,$+5
  496.         ld hl,twin
  497.          ld c,0
  498.         call prtext
  499.        endif
  500.        
  501. fchanged=$+1
  502.  
  503.         ld a,' '
  504.         MYPRCHAR
  505. nvview_ncurline=$+1
  506.         ld hl,0
  507.         exx
  508.         ld hl,0
  509.         exx
  510.         call prdword
  511.         ;ix
  512.         ld a,'/'
  513.         MYPRCHAR
  514.         ld hl,(nlines)
  515.         exx
  516.         ld hl,0
  517.         exx
  518.         call prdword
  519.         ld a,' '
  520.         MYPRCHAR
  521.         ld hl,(filesizeHSW)
  522.         exx
  523.         ld hl,(filesize)
  524.         call prdword
  525.         ld de,tspaces_filename
  526.         ld hl,TSPACES_FILENAME_SZ
  527.         call sendchars
  528.  
  529.  
  530.  
  531.  
  532.         ;ld e,NVVIEW_PANELCOLOR;#38
  533.         ;OS_PRATTR
  534.         ld de,_COLOR;#38
  535.        if PRSTDIO
  536.         SETCOLOR_
  537.        else
  538.         call nv_setcolor
  539.        endif
  540.         ret
  541.        
  542. tspaces_filename
  543.         db ' '
  544. tshown_filename
  545.         ds TSPACES_FILENAME_SZ,' '
  546.        
  547. twin
  548.         db "WIN",0
  549. t866
  550.         db "866",0
  551.  
  552.      
  553. isbof
  554.         push bc
  555.         ld c,a
  556.         or h
  557.         or l
  558.         ld a,c
  559.         pop bc
  560.         ret
  561. iseof
  562.         push bc
  563.         push de
  564.         push hl
  565.         ld de,(filesize)
  566.         ld bc,(filesizeHSW)
  567.         ld b,a
  568.         or a
  569.         sbc hl,de
  570.         sbc a,c
  571.         ld a,b
  572.         pop hl
  573.         pop de
  574.         pop bc
  575.         ret
  576.      
  577. nvview_prpage
  578. ;ahl=addr
  579.         ld (curtoptextaddr),hl
  580.         ld (curtoptextHSB),a
  581.         push af
  582.         ld de,NVVIEW_XYTOP
  583.         call nv_setxy ;keeps de,hl,ix
  584.         pop af
  585.         ;ld b,NVVIEW_HGT
  586.         ld bc,(nvviewhgt-1) ;b
  587.  
  588. nvview_prpage0
  589.         push bc
  590.         ;push de
  591.         ;push af
  592.         ;push hl
  593.         ;call nv_setxy
  594.         ;pop hl
  595.         ;pop af
  596.         call nvview_prline_nextline
  597.         ;pop de
  598.         pop bc
  599.         ;inc d
  600.         djnz nvview_prpage0
  601. nvview_setbottom
  602.         ld (curbottomtextaddr),hl
  603.         ld (curbottomtextHSB),a
  604.         ret
  605.        
  606. nvview_prevline
  607. ;ahl=addr
  608. ;line < 16K
  609. ;out: ahl, CY=error
  610.         call isbof
  611.          scf
  612.         ret z
  613. ;перед нами может быть #0d или #0d,#0a или ничего
  614.         ld (findprevline_old),hl
  615.         ld (findprevline_oldHSB),a
  616.        
  617.         or a
  618.         ld bc,0xffff
  619.         jr nz,$+4
  620.          ld b,h
  621.          ld c,l
  622.        
  623.         ld de,0x4000
  624.         or a
  625.         sbc hl,de
  626.         sbc a,e;0
  627.         push af
  628.         push hl
  629.         call ahl_to_pgaddr
  630.         set 6,h
  631. ;hl=c000+, можно уменьшать
  632. ;bc=number of chars to go != 0
  633.  
  634. ;перед нами может быть #0d или #0d,#0a или ничего
  635.         dec hl
  636.         dec bc
  637.         ld a,b
  638.         or c
  639.         jr z,nvview_prevlineq
  640.         ld a,0x0a
  641.         cp (hl)
  642.         jr nz,nvview_prevline_nolf
  643.         dec hl
  644.         dec bc
  645.         ld a,b
  646.         or c
  647.         jr z,nvview_prevlineq
  648. nvview_prevline_nolf
  649.         ld a,0x0d
  650.         cp (hl)
  651.         jr nz,nvview_prevline_nocr
  652.         dec hl
  653.         dec bc
  654.         ld a,b
  655.         or c
  656.         jr z,nvview_prevlineq
  657. nvview_prevline_nocr
  658. ;сейчас мы находимся перед символом конца предыдущей строки (не на нём)
  659. nvview_prevline0
  660.         ld a,(hl)
  661.         cp 0x0d
  662.         jr z,nvview_prevline_cr
  663.         cp 0x0a
  664.         jr z,nvview_prevline_lf
  665.         dec hl
  666.         dec bc
  667.         ld a,b
  668.         or c
  669.         jr nz,nvview_prevline0
  670. ;beginning of file
  671.         jr nvview_prevlineq
  672. nvview_prevline_cr
  673. nvview_prevline_lf
  674. ;сейчас мы находимся на конце символа конца строки перед предыдущей
  675.         inc hl
  676. nvview_prevlineq
  677.         ex de,hl ;new addr (bits 13..0), bit 14 = overflow
  678.         pop hl ;old addr
  679.         pop af
  680.         call pgaddr_to_ahl
  681.         call iswrapon ;CY=on
  682.         ret nc ;no wrap
  683.  
  684. findprevline_linewrap
  685. ;ahl = в начале строки
  686. ;перед ней может быть #0d или #0d,#0a
  687. ;надо псевдонапечатать несколько псевдострок, пока не дойдём до текущей
  688. findprevline_linewrap_count0
  689.          push af
  690.          push hl
  691.         call nvview_pseudoprline
  692.         push hl
  693. findprevline_old=$+1
  694.         ld bc,0
  695.         or a
  696.         sbc hl,bc ;nc: hl>=old
  697.         ld l,a
  698. findprevline_oldHSB=$+1
  699.         sbc a,0
  700.         ld a,l
  701.         pop hl
  702.          pop de ;old addr
  703.          pop bc ;b=old HSB
  704.         jr c,findprevline_linewrap_count0
  705.         ex de,hl
  706.         ld a,b
  707. ;ahl=на псевдострочку раньше
  708.         ret ;nc
  709.  
  710. getmaxlinesize
  711. ;ahl = addr
  712. ;out: bc=max line size before eof, z=(bc==0)
  713.         push af
  714.         push hl
  715.         ex de,hl
  716.         ld hl,(filesize)
  717.         ld c,a
  718.         ld a,(filesizeHSW)
  719.         or a
  720.         sbc hl,de
  721.         sbc a,c
  722.         ld bc,0
  723.         jr c,getmaxlinesize_aftereof
  724.         dec bc
  725.         or a
  726.         jr nz,$+4 ;filesize-addr >= 0x10000, will be 0xffff
  727.          ld b,h
  728.          ld c,l ;filesize-addr
  729. getmaxlinesize_aftereof
  730.         pop hl
  731.         pop af
  732.         ld e,a
  733.         ld a,b
  734.         or c
  735.         ld a,e
  736.         ret
  737.  
  738. nvview_prline_nextline
  739.         push af
  740.         push hl
  741.         call nvview_prline
  742.         pop hl
  743.         pop af
  744. nvview_nextline
  745. ;if eof, returns eof addr
  746. ;ahl=addr
  747. ;line < 16K
  748. ;out: ahl, CY=error
  749.         call iswrapon ;CY=on
  750.         jp c,nvview_pseudoprline
  751.         call getmaxlinesize ;bc=max line size before eof, z=(bc==0)
  752.          scf
  753.         ret z
  754.         push af
  755.         push hl
  756.         call ahl_to_pgaddr
  757. ;bc=number of chars to go != 0
  758. nvview_nextline0
  759.         ld a,(hl)
  760.         inc hl
  761.         dec bc
  762.         cp 0x0d
  763.         jr z,nvview_nextline_cr
  764.         cp 0x0a
  765.         jr z,nvview_nextline_cr;lf
  766.         ld a,b
  767.         or c
  768.         jr nz,nvview_nextline0
  769. nvview_nextlineq
  770.         ex de,hl ;new addr (bits 13..0), bit 14 = overflow
  771.         pop hl ;old addr
  772.         pop af
  773. pgaddr_to_ahl
  774. ;de = new addr (bits 13..0), bit 14 = overflow
  775. ;ahl = old addr
  776.         bit 6,d
  777.         ld bc,0x4000
  778.         jr z,$+4
  779.         add hl,bc
  780.         adc a,c;0
  781.         ld c,a
  782.         ld l,e
  783.         ld a,d
  784.         xor h
  785.         and 0x3f
  786.         xor h
  787.         ld h,a ;bits 13..0 copied
  788.         ld a,c ;ahl = new addr
  789.         ret ;nc
  790. nvview_nextline_cr
  791.         ld a,b
  792.         or c
  793.         jr z,nvview_nextlineq
  794.         ld a,(hl)
  795.         cp 0x0a
  796.         jr nz,nvview_nextline_lf
  797.         inc hl
  798. nvview_nextline_lf=nvview_nextlineq
  799.         jr nvview_nextlineq
  800.        
  801. nvview_prline
  802. ;ahl=addr
  803. ;check for last line (vs. file size)
  804. ;if filesize-addr < 80, then b=filesize-addr, else b=80
  805.         call getmaxlinesize ;bc=max line size before eof, z=(bc==0)
  806.         jr z,nvview_prlinespc_all;ret z
  807.         call ahl_to_pgaddr
  808. ;hl=#8000+0..#3fff
  809. ;bc=max line size before eof != 0
  810. nvview_prline_shift=$+1
  811.         ld de,0
  812.         call istherecr_or_lf ;add hl,de
  813.         ;jr nz,$+3
  814.         ;dec hl ;hl=cr/lf address
  815.  
  816.         push hl
  817.         ld h,b
  818.         ld l,c
  819.         or a
  820.         sbc hl,de
  821.         ld b,h
  822.         ld c,l ;bc=bc-lineshift
  823.         pop hl
  824.         ;ld a,NVVIEW_WID
  825.         jr c,nvview_prlinespc_all
  826.         jr z,nvview_prlinespc_all ;maxlinesize<=lineshift
  827.  
  828.         push hl
  829.         ld hl,NVVIEW_WID
  830.         call minhl_bc_tobc
  831.         ld b,c
  832.         pop hl
  833. ;b=number of chars to print != 0
  834.         ld de,prlinebuf
  835.         ld c,0;NVVIEW_WID
  836. nvview_prline0
  837.         ld a,(hl)
  838.         inc hl
  839.         cp 0x0d
  840.         jr z,nvview_prline_cr
  841.         cp 0x0a
  842.         jr z,nvview_prline_cr;lf
  843.         ;push bc
  844.         push hl
  845.         ld h,twinto866/256
  846.         ld l,a
  847. nvview_prline_recodepatch=$
  848.         nop ;/ld a,(hl)
  849.        if PRSTDIO
  850.         cp 0x1b
  851.         jr nz,$+3
  852.         xor a ;can't print 0x1b!
  853.        endif
  854.         ld (de),a ;PRCHAR_
  855.         inc de
  856.         pop hl
  857.         ;pop bc
  858.         inc c;dec c
  859.         djnz nvview_prline0
  860.         ;call print_prlinebuf
  861.         ;jr nz,nvview_prline_lf
  862.         ;ret
  863.  
  864. nvview_prline_cr
  865. ;c=linesize [80-linesize]
  866.         call print_prlinebuf
  867. ;c=x
  868. ;nvview_prline_lf
  869. ;допечатать пробелы до конца строки
  870.         jr nvview_prlinespc
  871. nvview_prlinespc_all
  872.         ld c,0;NVVIEW_WID
  873. nvview_prlinespc
  874.         push af
  875.         push hl
  876.         ;ld l,b
  877.         ;ld h,0
  878.         ;ld de,tspaces
  879.         ;call sendchars
  880.          ld a,c
  881.          ;or a
  882.          ;ld a,NVVIEW_WID
  883.          ;sub c
  884.          ;ld c,a
  885.          cp NVVIEW_WID
  886.         call nz,clearrestofline_crlf
  887.         pop hl
  888.         pop af
  889.         ret
  890.  
  891. print_prlinebuf
  892.         push af
  893.         push bc
  894.         push hl
  895. ;c=x [NVVIEW_WID-число символов]
  896.         ld de,prlinebuf
  897.         ;ld a,NVVIEW_WID
  898.         ;sub c
  899.         ld l,c;a
  900.         ld h,0
  901.         inc l
  902.         dec l
  903.          ld c,h
  904.          call nz,sendchars
  905.         pop hl
  906.         pop bc
  907.         pop af
  908.         ret
  909.  
  910. prlinebuf
  911.         ds NVVIEW_WID
  912.  
  913. nvview_pseudoprline
  914. ;ahl=addr
  915. ;out: ahl, CY=error
  916. ;check for last line (vs. file size)
  917. ;if filesize-addr < 80, then b=filesize-addr, else b=80
  918.         call getmaxlinesize ;bc=max line size before eof, z=(bc==0)
  919.          scf
  920.         ret z
  921.         push af
  922.         push hl
  923.         call ahl_to_pgaddr
  924. ;hl=#8000+0..#3fff
  925. ;bc=max line size before eof != 0
  926.         push hl
  927.         ld hl,NVVIEW_WID
  928.         call minhl_bc_tobc
  929.         ld b,c
  930.         pop hl
  931. ;b=number of chars to print != 0
  932.         ld c,NVVIEW_WID
  933. nvview_pseudoprline0
  934.         ld a,(hl)
  935.         inc hl
  936.         cp 0x0d
  937.         jr z,nvview_pseudoprline_cr
  938.         cp 0x0a
  939.         jr z,nvview_pseudoprline_lf
  940.         dec c
  941.         djnz nvview_pseudoprline0
  942.          ld a,(hl)
  943.          inc hl
  944.          cp 0x0d
  945.          jr z,nvview_pseudoprline_crok
  946.          cp 0x0a
  947.          jr z,nvview_pseudoprline_lf
  948.          dec hl
  949.         jp nvview_nextlineq
  950. nvview_pseudoprline_cr
  951.         dec b
  952.         jp z,nvview_nextlineq
  953. nvview_pseudoprline_crok
  954.         ld a,(hl)
  955.         cp 0x0a
  956.         jr nz,nvview_pseudoprline_lf
  957.         inc hl
  958. nvview_pseudoprline_lf
  959.         jp nvview_nextlineq
  960.        
  961. istherecr_or_lf
  962. ;hl=addr
  963. ;de=length to search
  964. ;out: z=found, hl=at match or after area
  965.         ld a,d
  966.         or e
  967.         jr z,istherecr_or_lf_fail
  968.          push hl
  969.         ld a,0x0d
  970.         call istherecrlfgo
  971.         jr z,popafZret;ret z
  972.          pop hl
  973.         ld a,0x0a
  974. istherecrlfgo
  975.         push bc
  976.         ld b,d
  977.         ld c,e
  978.         cpir ;TODO несколько раз через все блоки, если заканчиваются блоки, то их переключать
  979.         pop bc
  980.         ret nz ;nz=not found
  981.          dec hl
  982.         ret ;z=found
  983. istherecr_or_lf_fail
  984.         dec a
  985.         ret ;nz=not found
  986.        
  987. popafZret
  988.         pop af
  989.         cp a ;Z
  990.         ret
  991.        
  992. ;nvview_closefcb
  993. ;        ld de,fcb
  994. ;        OS_FCLOSE
  995. ;        ret
  996.  
  997. setunchanged
  998.         ld a,' '
  999.         jr setchanged_a
  1000. setchanged
  1001.         ld a,'*'
  1002. setchanged_a
  1003.         ld (fchanged),a
  1004.         ret
  1005.  
  1006. iswrapon
  1007. ;CY = on
  1008. wrapflag=$
  1009.         scf;or a ;/scf
  1010.         ret
  1011.  
  1012. reservepage
  1013. ;new page, set page in textpages, npages++, set page in #c000
  1014. ;nz=error
  1015.         OS_NEWPAGE
  1016.         or a
  1017.         ret nz
  1018. npages=$+1
  1019.         ld hl,textpages
  1020.         ld (hl),e
  1021.         inc l
  1022.         ld (npages),hl
  1023.         ld a,e
  1024.         SETPGC000
  1025.         xor a
  1026.         ret ;z
  1027.  
  1028. unreservepages
  1029. unreservepages0
  1030.         call unreservepage
  1031.         jr z,unreservepages0
  1032.         ret
  1033.        
  1034. unreservepage
  1035. ;del page, npages--
  1036. ;nz=error
  1037.         ld hl,(npages)
  1038.         ld a,l
  1039.         or a
  1040.         jr z,unreservepage_fail
  1041.         dec l
  1042.         ld (npages),hl
  1043.         ld e,(hl)
  1044.         OS_DELPAGE
  1045.         xor a
  1046.         ret ;z
  1047. unreservepage_fail
  1048.         xor a
  1049.         dec a
  1050.         ret ;nz
  1051.        
  1052. ahl_to_pgaddr
  1053. ;keeps bc,de
  1054. ;counts physical hl
  1055.         rl h
  1056.         rla
  1057.         rl h
  1058.         rla
  1059.         srl h
  1060.         scf
  1061.         rr h
  1062.         push bc
  1063.         call setpg32k
  1064.         pop bc
  1065.         ret
  1066.  
  1067. setpg32k
  1068. ;a=page number in table (0..)
  1069.         push hl
  1070.         ld l,a
  1071.         ld h,textpages/256
  1072.         ld a,(hl)
  1073.         SETPG8000
  1074.         inc l
  1075.         ld a,(hl)
  1076.         SETPGC000
  1077.         pop hl
  1078.         ret
  1079.  
  1080. skipword
  1081. ;hl=string
  1082. ;out: hl=terminator/space addr
  1083. getword0
  1084.         ld a,(hl)
  1085.         or a
  1086.         ret z
  1087.         cp ' '
  1088.         ret z
  1089.         inc hl
  1090.         jr getword0
  1091.  
  1092. skipspaces
  1093. ;hl=string
  1094. ;out: hl=after last space
  1095.         ld a,(hl)
  1096.         cp ' '
  1097.         ret nz
  1098.         inc hl
  1099.         jr skipspaces
  1100.  
  1101. nv_setxy
  1102. ;de=yx (kept)
  1103. ;keeps hl
  1104.         push de
  1105.         push hl
  1106.         push ix
  1107.         SETXY_
  1108.         pop ix
  1109.         pop hl
  1110.         pop de
  1111.         ret
  1112.        
  1113. minhl_bc_tobc
  1114.         or a
  1115.         sbc hl,bc
  1116.         add hl,bc
  1117.         ret nc ;bc<=hl
  1118.         ld b,h
  1119.         ld c,l
  1120.         ret
  1121.  
  1122.        if !PRSTDIO
  1123. sendchars
  1124. ;send chars to stdout (in: de=buf, hl=size, out: A=error)
  1125.         ld b,h
  1126.         ld c,l
  1127.         ex de,hl
  1128. sendchars0
  1129.         push bc
  1130.         push hl
  1131.         ld a,(hl)
  1132.         MYPRCHAR
  1133.         pop hl
  1134.         pop bc
  1135.         cpi
  1136.         jp pe,sendchars0
  1137.         ret
  1138.        endif
  1139.  
  1140.        if 0
  1141. ;receivechars - read chars from stdin
  1142. receivechars
  1143. ;de=buf, hl=size
  1144. ;out: de=end addr in buf (if EOF), CY=error(EOF))
  1145. receivechars0
  1146.         push de
  1147.         push hl
  1148.         ;ld a,(stdinhandle)
  1149. stdinhandle=$+1
  1150.         ld b,0;a
  1151.         OS_READHANDLE ;hl=size actually received
  1152.         ld b,h
  1153.         ld c,l
  1154.         pop hl
  1155.         pop de
  1156.         or a
  1157.         scf
  1158.         ret nz ;error
  1159.         ex de,hl
  1160.         add hl,bc ;addr+=readed
  1161.         ex de,hl
  1162.         or a
  1163.         sbc hl,bc ;size-=readed
  1164.         jr nz,receivechars0
  1165.         ret
  1166.        endif
  1167.  
  1168. cmd_loadpage
  1169. ;out: a=error, bc=bytes read
  1170. ;keeps hl,de
  1171.         push de
  1172.         push hl
  1173.         ld d,a
  1174.         xor a
  1175.         ld l,a
  1176.         ld e,a
  1177.         sub d
  1178.         ld h,a ;de=buffer, hl=size
  1179.         call readcurhandle
  1180.         ld b,h
  1181.         ld c,l
  1182.         pop hl
  1183.         pop de
  1184.         or a
  1185.         ret
  1186.  
  1187. readcurhandle
  1188. curhandle=$+1
  1189.         ld b,0
  1190.         OS_READHANDLE
  1191.         ret
  1192.  
  1193. strcopy_maxb
  1194. ;copy hl->de no more than b bytes, add spaces after
  1195. strcopy_maxb0
  1196.         ld a,(hl)
  1197.         or a
  1198.         jr z,strcopy_maxb_fill
  1199.         ld (de),a
  1200.         inc hl
  1201.         inc de
  1202.         djnz strcopy_maxb0
  1203.         ret
  1204. strcopy_maxb_fill
  1205.         ld a,' '
  1206. strcopy_maxb_fill0
  1207.         ld (de),a
  1208.         inc de
  1209.         djnz strcopy_maxb_fill0
  1210.         ret
  1211.  
  1212.         include "../_sdk/stdio.asm"
  1213.  
  1214.         include "../_sdk/prdword.asm"
  1215.         ;include "../_sdk/stdio.asm"
  1216.  
  1217.         align 256
  1218. twinto866
  1219.         incbin "../_sdk/codepage/winto866"
  1220.  
  1221.        if PRSTDIO
  1222. scrhgt
  1223.         db 33
  1224. nvviewhgt
  1225. hexedhgt
  1226.         db 33-1 ;может потом уменьшиться из-за меню
  1227. filesperpanel
  1228.         db 33-4
  1229.        else
  1230. scrhgt
  1231.         db 25
  1232. nvviewhgt
  1233. hexedhgt
  1234.         db 25-1 ;может потом уменьшиться из-за меню
  1235. filesperpanel
  1236.         db 25-4
  1237.        endif
  1238.  
  1239. res_path
  1240.         db "../doc",0
  1241.  
  1242. filenametext
  1243.         db "nedoos.txt",0
  1244.         ds filenametext+DIRMAXFILENAME64-$
  1245. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1246. cmd_end
  1247.  
  1248. filesize
  1249.         dw 0
  1250. filesizeHSW
  1251.         dw 0
  1252.  
  1253. nlines
  1254.         dw 0
  1255.  
  1256.         align 256
  1257. textpages
  1258.         ds 256
  1259.         ;display "man size ",/d,cmd_end-cmd_begin," bytes"
  1260.  
  1261.         savebin "man.com",cmd_begin,cmd_end-cmd_begin
  1262.  
  1263.         LABELSLIST "../../us/user.l",1
  1264.