?login_element?

Subversion Repositories NedoOS

Rev

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