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