?login_element?

Subversion Repositories NedoOS

Rev

Rev 668 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

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