Subversion Repositories NedoOS

Rev

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