Subversion Repositories NedoOS

Rev

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

  1.         DEVICE ZXSPECTRUM128
  2.         include "../_sdk/sys_h.asm"
  3.  
  4. HEAPSORT_LH=1 ;byte order in poiters: LSB,HSB
  5.  
  6. MAXCMDSZ=COMMANDLINE_sz-1-4 ;not counting terminator (-4 for "cmd ")
  7.  
  8. _COLOR=0x0007;0x07
  9. _PANELCOLOR=0x040f;0x4f
  10. _PANELDIRCOLOR=0x040f;0x4f
  11. _PANELEXECOLOR=0x040a;0x4c
  12. _PANELFILECOLOR=0x0407;0b00001111;0xf
  13. _PANELSELECTCOLOR=0x040b;0x4e
  14. _CURSORCOLOR=0x0600;0x28
  15. _FILECURSORCOLOR=0x0600;0x28
  16. _COLOR_RED=0x0107;0x17
  17. _COLOR_DIALOG=0x0300;0700 не видно курсор;0x38
  18. _HINTCOLOR1=0x0007;7
  19. _HINTCOLOR0=0x0600;5*8
  20.  
  21. ;8192fcbs*32bytes*2panels = 32 pages
  22. DIRPAGES=16
  23. FIRSTDIRPAGEFORRIGHTPANEL=128
  24.  
  25. NDRIVES=15
  26.  
  27. catbuf_left=0xc000
  28. catbuf_right=0xc000
  29. FILES_POINTERS_left=0xc000;0x3700
  30. FILES_POINTERS_right=0xc000;0x3b00
  31.  
  32. txtscrhgt=25
  33. txtscrwid=80
  34. CMDLINEY=23;24
  35. CONST_HGT_TABLE=21
  36. PANELDIRCHARS37=37
  37. left_panel_xy=0x0000
  38. right_panel_xy=0x0028
  39. firstfiley=left_panel_xy/256 + 1
  40. PROGRESBARWINXY=0x0f16 ;0x0919 + 051f ;de=yx
  41. PROGRESBARWINHGTWID=0x0324 ;0x051f ;bc=hgt,wid
  42.  
  43.         macro PGW2elpg0
  44.         ;LD A,(HS_elpg)
  45.         ld a,(ix+PANEL.poipg)
  46.         SETPG32KLOW
  47.         endm
  48.        
  49.         macro PGW2elpg
  50.                 ;LD      A,H
  51.                 ;RLCA
  52.                 ;RLCA
  53.                 ;AND     1
  54.         ;LD A,(HS_elpg)
  55.         ;jr z,$+5
  56.         ;LD A,(HS_elpg+1)
  57.         ld a,(ix+PANEL.poipg)
  58.         SETPG32KLOW
  59.         endm
  60.  
  61.         macro PGW2strpg
  62.         ld ($+4),a
  63.         LD A,(HS_strpg)
  64.         SETPG32KLOW
  65.         endm
  66.  
  67.         macro PGW3elpg
  68.                 ;LD      A,H
  69.                 ;RLCA
  70.                 ;RLCA
  71.                 ;AND     1
  72.         ;LD A,(HS_elpg)
  73.         ;jr z,$+5
  74.         ;LD A,(HS_elpg+1)
  75.         ld a,(ix+PANEL.poipg)
  76.         SETPG32KHIGH
  77.         endm
  78.  
  79.         macro PGW3strpg
  80.         ld ($+4),a
  81.         LD A,(HS_strpg)
  82.         SETPG32KHIGH
  83.         endm
  84.  
  85.         org PROGSTART
  86. cmd_begin
  87.         ld sp,0x4000
  88.         call initstdio
  89.  
  90.         ;ld e,6 ;textmode
  91.         ;OS_SETGFX
  92.        
  93.         ;call nv_copyscreen0to1
  94.         ;GET_KEY ;съедаем key_redraw
  95.  
  96.         CLS_ ;print 25 lines of spaces except one
  97.        
  98. ;        ld de,nvpal
  99. ;        OS_SETPAL
  100.        
  101.         OS_GETMAINPAGES
  102. ;dehl=номера страниц в 0000,4000(copybuf),8000,c000*(dirbuf)
  103.         push de
  104.         push hl
  105.         ld e,h
  106.         OS_DELPAGE
  107.         pop hl
  108.         ld e,l
  109.         OS_DELPAGE
  110.         pop de ;e
  111.         OS_DELPAGE
  112.  
  113.         call assignpages
  114.  
  115.         ld hl,left_panel_xy
  116.         ld (leftpanel+PANEL.xy),hl
  117.  
  118.         ld hl,right_panel_xy
  119.         ld (rightpanel+PANEL.xy),hl
  120.  
  121.         ld hl,FILES_POINTERS_left
  122.         ld (leftpanel+PANEL.pointers),hl
  123.         ld hl,catbuf_left
  124.         ld (leftpanel+PANEL.catbuf),hl
  125.         xor a
  126.         ld (leftpanel+PANEL.pgadd),a
  127.  
  128.         ld hl,FILES_POINTERS_right
  129.         ld (rightpanel+PANEL.pointers),hl
  130.         ld hl,catbuf_right
  131.         ld (rightpanel+PANEL.catbuf),hl
  132.         ld a,FIRSTDIRPAGEFORRIGHTPANEL;DIRPAGES+1
  133.         ld (leftpanel+PANEL.pgadd),a
  134.  
  135.         ld hl,compareext
  136.         ld (leftpanel+PANEL.dirsortproc),hl
  137.         ld (rightpanel+PANEL.dirsortproc),hl
  138.  
  139.         ;ld a,0xc3
  140.         ;ld (leftpanel+PANEL.sorterjp),a
  141.         ;ld (rightpanel+PANEL.sorterjp),a
  142.         ;ld hl,sorter1
  143.         ;ld (leftpanel+PANEL.sorter),hl
  144.         ;ld hl,sorter2
  145.         ;ld (rightpanel+PANEL.sorter),hl
  146.        
  147.         ld hl,rightpanel
  148.         call editcmd_setpaneldirfromcurdir_panelhl
  149.         ld hl,leftpanel
  150.         call editcmd_setpaneldirfromcurdir_panelhl
  151.  
  152.         call readpanels_reprint
  153.  
  154. mainloop
  155.         call editcmd_readprompt_setendcmdx
  156.         call controlloop
  157.         jp mainloop
  158.  
  159. assignpages
  160.         OS_NEWPAGE ; for dircopy batch
  161.         ld hl,dirpg
  162.         ld (hl),e
  163.  
  164.         OS_NEWPAGE ;выделяем по одной страничке для каталогов
  165.         ld hl,HS_strpg
  166.         ld (hl),e
  167.         inc hl
  168.         ld (hl),0 ;маркер конца списка страниц
  169.         OS_NEWPAGE ;выделяем по одной страничке для длинных имён
  170.         ld hl,HS_strpg+DIRPAGES+1
  171.         ld (hl),e
  172.         inc hl
  173.         ld (hl),0 ;маркер конца списка страниц        
  174.  
  175.         OS_NEWPAGE
  176.         ld hl,HS_strpg+FIRSTDIRPAGEFORRIGHTPANEL;DIRPAGES+1
  177.         ld (hl),e
  178.         inc hl
  179.         ld (hl),0 ;маркер конца списка страниц
  180.         OS_NEWPAGE ;выделяем по одной страничке для длинных имён
  181.         ld hl,HS_strpg+FIRSTDIRPAGEFORRIGHTPANEL+DIRPAGES+1
  182.         ld (hl),e
  183.         inc hl
  184.         ld (hl),0 ;маркер конца списка страниц        
  185.        
  186.         ld hl,left_panel_xy
  187.         ld (leftpanel+PANEL.xy),hl
  188.         OS_NEWPAGE
  189.         ld a,e
  190.         ld (leftpanel+PANEL.poipg),a
  191.  
  192.         ld hl,right_panel_xy
  193.         ld (rightpanel+PANEL.xy),hl
  194.         OS_NEWPAGE
  195.         ld a,e
  196.         ld (rightpanel+PANEL.poipg),a
  197.  
  198.         OS_NEWPAGE
  199.         ld a,e
  200.         SETPG16K ;copybuf
  201.         ret
  202.  
  203. deletepages
  204.         ld a,(dirpg)
  205.         call delpage_a ;for dircopy batch
  206.         ld a,(HS_strpg)
  207.         call delpage_a ;по одной страничке для каталогов
  208.         ld a,(HS_strpg+DIRPAGES+1)
  209.         call delpage_a ;по одной страничке для длинных имён
  210.         ld a,(HS_strpg+FIRSTDIRPAGEFORRIGHTPANEL)
  211.         call delpage_a ;по одной страничке для каталогов
  212.         ld a,(HS_strpg+FIRSTDIRPAGEFORRIGHTPANEL+DIRPAGES+1)
  213.         call delpage_a ;по одной страничке для длинных имён      
  214.         ld a,(leftpanel+PANEL.poipg)
  215.         call delpage_a
  216.         ld a,(rightpanel+PANEL.poipg)
  217.         call delpage_a
  218.         OS_GETMAINPAGES
  219. ;dehl=номера страниц в 0000,4000(copybuf),8000,c000*(dirbuf)
  220.         ld a,e
  221. delpage_a
  222.         ld e,a
  223.         OS_DELPAGE
  224.         ret
  225.  
  226. strdelpages ;удаляем str страницы. IX - панель. первую страничку не удаляем
  227.         ld hl, HS_strpg
  228.         ld e, (ix+PANEL.pgadd)
  229.         ld d,0; (ix+PANEL.pgadd+1)
  230.         add hl,de
  231.         ld (ix+PANEL.curpgfcbpoi),l
  232.         ld (ix+PANEL.curpgfcbpoi+1),h
  233.         call strdelpages_next
  234. strdelpages_lname
  235.         ld hl, HS_strpg+DIRPAGES+1 ;HS_lnamepg
  236.         ld e, (ix+PANEL.pgadd)
  237.         ld d,0; (ix+PANEL.pgadd+1)
  238.         add hl,de
  239.         ld (ix+PANEL.curpglnamepoi),l
  240.         ld (ix+PANEL.curpglnamepoi+1),h
  241.         ;jp strdelpages_next
  242.  
  243. strdelpages_next
  244.         inc hl
  245.         ld a, (hl)
  246.         or a
  247.         ret z
  248.         ld e, a
  249.         push hl
  250.         push ix
  251.         OS_DELPAGE
  252.         pop ix
  253.         pop hl
  254.         xor a
  255.         ld (hl), a
  256.         jr strdelpages_next
  257.  
  258. lnamenewpage ;выделяем новую страничку IX - панель, [E номер странички в HS_strpg]
  259.         push hl
  260.         push de
  261.         push ix
  262.         OS_NEWPAGE
  263.         pop ix
  264.         ld l,(ix+PANEL.curpglnamepoi)
  265.         ld h,(ix+PANEL.curpglnamepoi+1)
  266.         ld (hl),e
  267.         inc hl
  268.         ld (hl),0 ; маркер конца списка
  269.         ld (ix+PANEL.curpglnamepoi),l
  270.         ld (ix+PANEL.curpglnamepoi+1),h
  271.         pop de
  272.         pop hl
  273.         ret
  274.        
  275. strnewpage ;выделяем новую страничку IX - панель, [E номер странички в HS_strpg]
  276.         push hl
  277.         push de
  278.         push ix
  279.         OS_NEWPAGE
  280.         pop ix
  281.         ld l,(ix+PANEL.curpgfcbpoi)
  282.         ld h,(ix+PANEL.curpgfcbpoi+1)
  283.         ld (hl),e
  284.         inc hl
  285.         ld (hl),0 ; маркер конца списка
  286.         ld (ix+PANEL.curpgfcbpoi),l
  287.         ld (ix+PANEL.curpgfcbpoi+1),h
  288.         pop de
  289.         pop hl
  290.         ret
  291.  
  292. printhint
  293.         ld de,24*256
  294.         call nv_setxy
  295.         ld hl,thint
  296. prhint0
  297.         ld a,(hl)
  298.         inc hl
  299.         or a
  300.         ret z
  301.         cp '{'
  302.         jr z,prhint_color0
  303.         cp '}'
  304.         jr z,prhint_color1
  305.         push hl
  306.         PRCHAR_
  307.         pop hl
  308.         jr prhint0
  309. prhint_color0
  310.         ld de,_HINTCOLOR1;7
  311.         jr prhint_color
  312. prhint_color1
  313.         ld de,_HINTCOLOR0;5*8
  314. prhint_color
  315.         call nv_setcolor
  316.         jr prhint0
  317. thint
  318.         db "{1}Drive { 2}Find  { 3}View  { 4}Edit  { 5}Copy  { 6}Rename{ 7}MkDir { 8}Delete{ 9}InsNam{ 0}Quit  ",0
  319.  
  320. readpanels_reprint
  321.         call printhint
  322.         ld ix,leftpanel
  323.         call readsortdrawpanel
  324.         ld ix,rightpanel
  325. readsortdrawpanel
  326.         call readdir
  327.         call sortfiles
  328.         jp drawpanel_with_files
  329.  
  330. readpanels_reprint_keepcursor
  331.         call printhint
  332.         ld ix,leftpanel
  333.         call readsortdrawpanel_keepcursor
  334.         ld ix,rightpanel
  335. readsortdrawpanel_keepcursor
  336.         call readdir_keepcursor
  337.         call sortfiles
  338.         jp drawpanel_with_files
  339.  
  340. drawpanel_head ;ix=panel (keep!!!)
  341.         call nv_getpanelxy_de
  342.         inc e
  343.         inc e
  344.         call nv_setxy
  345.         push ix
  346.         pop hl
  347.         ld de,(curpanel)
  348.         or a
  349.         sbc hl,de
  350.         add hl,de
  351.         jr nz,drawpanel_dir
  352.         ld de,_FILECURSORCOLOR
  353.         jr drawpanel_dir0
  354. drawpanel_dir
  355.         ld de,_PANELCOLOR
  356. drawpanel_dir0
  357.         call nv_setcolor
  358.         ld de,PANEL.dir
  359.         add hl,de
  360.         push hl
  361.         ld c,0
  362.         call panelprtext
  363.         call setpanelcolor
  364.         pop hl
  365.         call strlen ;hl=len
  366.         ex de,hl
  367.         ld hl,PANELDIRCHARS37
  368.         or a
  369.         sbc hl,de
  370.         ret c
  371.         ret z
  372.         ld de,tdoublehoriz
  373.         push ix
  374.         call sendchars
  375.         pop ix
  376.         ret
  377.  
  378. drawpanel_with_files
  379. ;ix=panel
  380.         call setpanelcolor
  381.         call nv_getpanelxy_de
  382.         bit 0,(ix+PANEL.drawtableunneeded)
  383.         set 0,(ix+PANEL.drawtableunneeded)
  384.         call z,prtable ;keeps ix
  385.  
  386.         call setpaneldir_makeprompt ;keeps ix
  387.         ld de,_COLOR
  388.         call nv_setcolor
  389.  
  390.         call drawpanel_head
  391.         call drawpanelfilesandsize
  392.  
  393. drawpanel_files
  394. ;ix=panel
  395.         call setpanelcolor
  396.         ld l,(ix+PANEL.files)
  397.         ld h,(ix+PANEL.files+1)
  398.         call nv_getdirscroll_bc
  399.         push bc ;dirscroll
  400.         or a
  401.         sbc hl,bc ;hl=number of files in panel - scroll in panel
  402.         ld bc,CONST_HGT_TABLE
  403.         call minhl_bc_tobc ;bc = min(CONST_HGT_TABLE, number of files in panel - scroll in panel)
  404.         pop de ;dirscroll
  405.         call gotofilepointer_numberde ;hl=file pointer
  406.         call nv_getpanelxy_de
  407.         inc d
  408.         inc e
  409.         ld b,c ;files to show
  410.         ld a,b
  411.         or a
  412.         jr z,premptyfiles
  413. prNfiles0
  414.         push bc
  415.         push de
  416.         call nv_setxy ;keeps de,hl,ix
  417.         ;ld e,(hl)
  418.         ;inc hl
  419.         ;ld d,(hl)
  420.         ;inc hl
  421.         call getfilepointer_de_fromhl ;uses ix
  422.         push hl
  423.         ex de,hl
  424.         push ix
  425.         call prdirfile
  426.         pop ix
  427.         pop hl
  428.         pop de
  429.         pop bc
  430.         inc d
  431.         djnz prNfiles0
  432. premptyfiles
  433. ;c=files to show
  434.         ld a,CONST_HGT_TABLE
  435.         sub c
  436.         ret z
  437.         push ix
  438.         ld b,a
  439. premptyfiles0
  440.         push bc
  441.         push de
  442.         call nv_setxy ;keeps de,hl
  443.         ;ld e,(hl)
  444.         ;inc hl
  445.         ;ld d,(hl)
  446.         ;inc hl
  447.         ;call getfilepointer_de_fromhl
  448.         ;push hl
  449.         ;ex de,hl
  450.         ;push ix
  451.         ld de,emptyfilelinebuf
  452.         ld hl,emptyfilelinebuf_sz
  453.         call sendchars
  454.         ;pop ix
  455.         ;pop hl
  456.         pop de
  457.         pop bc
  458.         inc d
  459.         djnz premptyfiles0
  460.         pop ix
  461.         ret
  462.  
  463. fileiscom ;fcb ;output: z=com
  464.         ld a,(fcb+9);(ix+9)
  465.          or 0x20
  466.          cp 'c'
  467.         jr nz,fileiscom_ix_nocom_a
  468.         ld a,(fcb+10);(ix+10)
  469.          or 0x20
  470.          cp 'o'
  471.         jr nz,fileiscom_ix_nocom
  472.         ld a,(fcb+11);(ix+11)
  473.          or 0x20
  474.          cp 'm'
  475.         ret z
  476. fileiscom_ix_nocom
  477.         ld a,(fcb+9);(ix+9)
  478. fileiscom_ix_nocom_a
  479.         cp '$'
  480.         ret nz ;jr nz,fileiscom_ix_nohobeta
  481.         ld a,(fcb+10);(ix+10)
  482.          or 0x20
  483.          cp 'c'
  484.         ret
  485.  
  486. colorfile
  487. ;out: de=color
  488.         ld a,(fcb);(ix) ;mark
  489.         rra
  490.         ld de,_PANELSELECTCOLOR
  491.         ret c
  492.         ld a,(fcb+FCB_FATTRIB);(ix+FCB_FATTRIB)
  493.         and FATTRIB_DIR
  494.         ld de,_PANELDIRCOLOR
  495.         ret nz
  496.         call fileiscom
  497.         ld de,_PANELEXECOLOR
  498.         ret z
  499.         ld de,_PANELFILECOLOR
  500.         ret
  501.  
  502. prdirfile_copyfn
  503. ;pgc000=(fcb+FCB_EXTENTNUMBERLO)
  504. ;hl=(fcb+FCB_EXTENTNUMBERHI)
  505. ;de=filelinebuf
  506. ;b=maxlen
  507. ;c=pad char
  508. prdirfile_fn0
  509.         ld a,(hl)
  510.         or a
  511.         jr z,prdirfile_fn0q
  512.         ld (de),a
  513.         inc hl
  514.         inc de
  515.         djnz prdirfile_fn0
  516.         jr prdirfile_fn0qq
  517. prdirfile_fn0q
  518.         ld a,c;' '
  519. prdirfile_fn1
  520.         ld (de),a
  521.         inc de
  522.         djnz prdirfile_fn1        
  523. prdirfile_fn0qq
  524.         ret
  525.  
  526. prdirfile
  527. ;hl=fcb
  528.         call getfcbfromhl
  529.         call colorfile ;de=color
  530. prdirfile_ix_decolor
  531.         call nv_setcolor
  532.        if 1==0
  533.         ld hl,fcb+1
  534.         ld de,filelinebuf
  535.         ld bc,11
  536.         ldir
  537.        else
  538.         ld a,(fcb+FCB_EXTENTNUMBERLO)
  539.         SETPG32KHIGH
  540.         ld hl,(fcb+FCB_EXTENTNUMBERHI)
  541.         ld de,filelinebuf
  542.         ld bc,25*256+' '
  543.         call prdirfile_copyfn
  544.        endif
  545.         ld de,filelinebuf+15
  546.         exx
  547.         ld hl,(fcb+FCB_FSIZE+2)
  548.         exx
  549.         ld hl,(fcb+FCB_FSIZE)
  550.         ld a,(fcb+FCB_FATTRIB)
  551.         and FATTRIB_DIR
  552.         call z,prdword_de
  553.          ld de,filelinebuf+28 ;skip "cursor right" over | (which has different color)
  554.         ld hl,(fcb+FCB_FDATE)
  555.         push hl
  556.         ld a,l
  557.         and 0x1f
  558.         call prNNcmd ;day
  559.         pop hl
  560.         push hl
  561.         add hl,hl
  562.         add hl,hl
  563.         add hl,hl
  564.         ld a,h
  565.         and 0x0f
  566.         add a,a
  567.         ld l,a
  568.         ld h,0
  569.         ld bc,tmonth-2
  570.         add hl,bc
  571.         ldi
  572.         ldi
  573.         pop hl
  574.         ld a,h
  575.         srl a
  576.         sub 20
  577.         jr nc,$+4
  578.         add a,100 ;XX century
  579.         call prNNcmd ;year        
  580.          inc de
  581.         ld hl,(fcb+FCB_FTIME)
  582.         push hl
  583.         ld a,h
  584.         rra
  585.         rra
  586.         rra
  587.         and 0x1f
  588.         call prNNcmd ;hour
  589.          inc de ;skip ':'
  590.         pop hl
  591.         add hl,hl
  592.         add hl,hl
  593.         add hl,hl
  594.         ld a,h
  595.         and 0x3f
  596.         call prNNcmd ;minute
  597.         ld de,filelinebuf
  598.         ld hl,filelinebuf_sz
  599.         jp sendchars ;kills ix!!!
  600. prNNcmd
  601. ;a=NN
  602. ;de=buf
  603.         ld bc,10+(256*('0'-1))
  604.         sub c
  605.         inc b
  606.         jr nc,$-2
  607.          ex de,hl
  608.          ld (hl),b
  609.          ex de,hl
  610.          inc de
  611.         add a,'0'+10
  612.          ld (de),a
  613.          inc de
  614.         ret
  615.  
  616. filelinebuf
  617.         db "filename.ext   1234567890",0x1b,"[CDDmmYY hh:mm"
  618. filelinebuf_sz=$-filelinebuf
  619. emptyfilelinebuf
  620.         db "                         ",0x1b,"[C            "
  621. emptyfilelinebuf_sz=$-emptyfilelinebuf
  622. tmonth ;month=0 is at tmonth-2 (spaces)
  623.         ;db "jan"
  624.         ;db "feb"
  625.         ;db "mar"
  626.         ;db "apr"
  627.         ;db "may"
  628.         ;db "jun"
  629.         ;db "jul"
  630.         ;db "aug"
  631.         ;db "sep"
  632.         ;db "oct"
  633.         ;db "nov"
  634.         ;db "dec"
  635.         db "ja","fe","mr","ap","my","jn","jl","au","se","oc","no","de"
  636.        
  637. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  638.  
  639. readdir
  640. ;ix=panel
  641.         call readdir_keepcursor
  642. nv_setcursor_zero
  643.         ld bc,0
  644.         call nv_setdirscroll_bc
  645.         jp nv_setdirpos_zero
  646.  
  647. nv_setcursor_hl
  648.         call nv_setdirpos_hl
  649.         ld bc,CONST_HGT_TABLE*2/3;CONST_HGT_TABLE-1
  650.         xor a
  651.         sbc hl,bc
  652.         jr nc,$+4
  653.          ld h,a
  654.          ld l,a
  655.         ld b,h
  656.         ld c,l
  657.         jp nv_setdirscroll_bc
  658.  
  659. readdir_keepcursor
  660. ;ix=panel
  661.         xor a
  662.         ld (ix+PANEL.totalsize),a
  663.         ld (ix+PANEL.totalsize+1),a
  664.         ld (ix+PANEL.totalsize+2),a
  665.         ld (ix+PANEL.totalsize+3),a
  666.         ld (ix+PANEL.markedsize),a
  667.         ld (ix+PANEL.markedsize+1),a
  668.         ld (ix+PANEL.markedsize+2),a
  669.         ld (ix+PANEL.markedsize+3),a
  670.         ld (ix+PANEL.markedfiles),a
  671.         ld (ix+PANEL.markedfiles+1),a
  672.  
  673.         push ix
  674.         ;call setpaneldir
  675.         call strdelpages
  676.         ;ld de,fcb
  677.         ;OS_SETDTA ;set disk transfer address = de
  678.         ;call makeemptymask
  679.         ;ld de,fcbmask
  680.         ;OS_FSEARCHFIRST
  681.         pop hl ;get IX
  682.         push hl
  683.         ld de,PANEL.dir
  684.         add hl,de
  685.         ex de,hl ;de=path
  686.         OS_CHDIR
  687.         ld de,emptypath
  688.         OS_OPENDIR
  689.         pop ix
  690.         or a
  691.  
  692.         ld hl,0xc000
  693.         ld (loaddir_curlnameaddr),hl
  694.  
  695.         ld e,(ix+PANEL.catbuf)     ;00
  696.         ld d,(ix+PANEL.catbuf+1)   ;c0
  697.         ld l,(ix+PANEL.pointers)   ;00  номер страницы
  698.         ld h,(ix+PANEL.pointers+1) ;c0  номер файла
  699.         ld bc,0 ;nfiles
  700.         jp nz,loaddir_error
  701.                 ;ld a,(fcb+1)
  702.                 ;cp '.'
  703.                 ;jp z,loaddir_onedot
  704. loaddir0
  705.         call loaddir_filinfo ;keep ix!!! ;out: CY=end dir, or else Z="." or ".."
  706.         jp c,loaddirq
  707.         jr z,loaddir0
  708.        
  709.         push bc
  710.  
  711.         push de
  712.         push hl
  713.        
  714.         ;ld l,(ix+PANEL.curpgfcbpoi)
  715.         ;ld h,(ix+PANEL.curpgfcbpoi+1)
  716.         ;ld a,(hl)
  717.         ;SETPG32KHIGH
  718.         ld a,e
  719.         and 31
  720.         add a,(ix+PANEL.pgadd)
  721.         PGW3strpg
  722.         ld a,e
  723.         and 0xe0 ;отбрасываем младшую часть (<32) с номером страницы, остается только номер файла
  724.         ld e,a
  725.         xor a
  726.         ld (de),a ;mark
  727.         inc de
  728.         ;ld hl,fcb+1
  729.         ;ld bc,31;FCB_sz
  730.         ;ldir ; копируем fcb в catbuf
  731.         ld hl,filinfo+FILINFO_FNAME
  732.         ;ld bc,8
  733.         ;ldir
  734.         ;inc hl
  735.         ;ld c,3
  736.         ;ldir
  737.         ex de,hl
  738.         push hl
  739.         call dotname_to_cpmname ;de -> hl
  740.         pop hl
  741.         ld bc,11
  742.         add hl,bc
  743.         ex de,hl
  744.         ld (loaddir_fcb_lnamepgpoi),de
  745.         inc de ;extent number - NU
  746.         ld hl,filinfo+FILINFO_FATTRIB
  747.         ldi
  748.         ld (loaddir_fcb_lnameaddrpoi),de
  749.         inc de ;record count - NU
  750.         inc de ;extent number hi - NU
  751.         ld hl,filinfo+FILINFO_FSIZE
  752.         ;TODO через процедуру
  753.         push hl
  754.         ld a,(hl)
  755.         add a,(ix+PANEL.totalsize)
  756.         ld (ix+PANEL.totalsize),a
  757.         inc hl
  758.         ld a,(hl)
  759.         adc a,(ix+PANEL.totalsize+1)
  760.         ld (ix+PANEL.totalsize+1),a
  761.         inc hl
  762.         ld a,(hl)
  763.         adc a,(ix+PANEL.totalsize+2)
  764.         ld (ix+PANEL.totalsize+2),a
  765.         inc hl
  766.         ld a,(hl)
  767.         adc a,(ix+PANEL.totalsize+3)
  768.         ld (ix+PANEL.totalsize+3),a
  769.         pop hl
  770.         ld  c,4
  771.         ldir
  772.         ld hl,filinfo+FILINFO_FTIME
  773.         ld c,2
  774.         ldir
  775.         ex de,hl
  776.         ld c,8
  777.         add hl,bc
  778.         ex de,hl
  779.         ld hl,filinfo+FILINFO_FDATE
  780.         ld c,2
  781.         ldir
  782.  
  783. loaddir_curlnameaddr=$+1
  784.         ld de,0
  785. ;если нету места под длинное имя в текущей странице, заказать новую и сдвинуть указатель
  786.         ld a,d
  787.         inc a
  788.         jr nz,loaddirlname_nonewpg
  789.         ld a,e
  790.         cp -DIRMAXFILENAME64
  791.         jr c,loaddirlname_nonewpg
  792.         call lnamenewpage
  793.         ld de,0xc000        
  794. loaddirlname_nonewpg
  795. ;записать текущий указатель на длинное имя в fcb
  796. ;записать длинное имя по указателю
  797.         ld l,(ix+PANEL.curpglnamepoi)
  798.         ld h,(ix+PANEL.curpglnamepoi+1)
  799.         ld a,(hl)
  800. loaddir_fcb_lnamepgpoi=$+1
  801.         ld (0),a
  802. loaddir_fcb_lnameaddrpoi=$+2
  803.         ld (0),de
  804.         SETPG32KHIGH
  805.         ld hl,filinfo+FILINFO_LNAME
  806.         ld a,(hl)
  807.         or a
  808.         jr nz,$+5
  809.         ld hl,filinfo+FILINFO_FNAME
  810.         call strcopy ;out: hl,de after terminator
  811.         ld (loaddir_curlnameaddr),de
  812.        
  813.         pop hl
  814.         pop de
  815.         call putfilepointer_de_tohl ; возвращает в верхнее окно страницу poipg и в pointers заносит de
  816.         ex de,hl
  817.         ld bc,32
  818.         add hl,bc
  819.         ex hl,de ; увеличили на 32 catbuf
  820.         jr nc,nonewpg ; всё ещё умещаемся в страницу
  821.         inc de ;next page de
  822.         call strnewpage
  823.         set 7,d
  824.         set 6,d
  825. nonewpg:
  826.        
  827.         pop bc
  828.         inc bc ;nfiles
  829.         bit 5,b;1,b ;страничка pgtemp закончилась? max 512 файлов по 32 байта
  830.         jp z,loaddir0
  831. loaddir_error
  832. loaddirq
  833. ;bc=nfiles
  834.         ld (ix+PANEL.files),c
  835.         ld (ix+PANEL.files+1),b
  836.  
  837.         call countfiles
  838.         ld (ix+PANEL.filesdirs),l
  839.         ld (ix+PANEL.filesdirs+1),h
  840.        
  841.         ex de,hl
  842.         call nv_getdirpos_hl
  843.         or a
  844.         sbc hl,de ;dirpos<files?
  845.         ret c ;OK
  846.         jp nv_setcursor_zero
  847.  
  848. loaddir_filinfo
  849. ;keep ix!!!
  850. ;out: CY=end dir, or else Z="." or ".."
  851.         push bc
  852.         push de
  853.         push hl
  854.         push ix
  855.         ld de,filinfo
  856.         OS_READDIR
  857.         pop ix
  858.         pop hl
  859.         pop de
  860.         pop bc
  861.         or a
  862.          scf
  863.         ret nz ;CY
  864.         ld a,(filinfo+FILINFO_FNAME)
  865.         or a
  866.          scf
  867.         ret z ;CY
  868.         ld a,(filinfo+FILINFO_FNAME+1)
  869.         or a
  870.         ret nz ;not one dot ;NC
  871.         ld a,(filinfo+FILINFO_FNAME)
  872.         cp '.'
  873.         ret z ;Z,NC ;one dot
  874.         or a ;NZ,NC
  875.         ret
  876.  
  877. controlloop
  878.         call fixscroll_prcmd
  879. controlloop_noprline
  880.         ld hl,controlloop
  881.         push hl
  882.         ld ix,(curpanel)
  883.         ld a,(ix+PANEL.files)
  884.         or (ix+PANEL.files+1)
  885.        push af
  886.         call z,nv_setdirpos_zero ;can't move cursor if 0 files
  887.        pop af
  888.         ;ld e,CURSORCOLOR;#38
  889.         ;OS_PRATTR ;draw cursor
  890.         ld hl,_FILECURSORCOLOR
  891.         call nz,prfilecursor_reprintfile ;more than 0 files
  892.         call cmdcalccurxy
  893.         call nv_setxy
  894.         ;SETX_ ;force reprint cursor
  895. controlloop_nokey
  896.         call yieldgetkeyloop ;YIELDGETKEYLOOP
  897.          or a
  898.          jr z,controlloop_nokey ;TODO handle mouse events
  899.         push af
  900.         ld ix,(curpanel)
  901.         call getfcbaddrundercursor
  902.         ;push hl
  903.         ;pop ix
  904.         call colorfile
  905.         ex de,hl ;hl=color
  906.         ld a,(ix+PANEL.files)
  907.         or (ix+PANEL.files+1)
  908.         call nz,prfilecursor_reprintfile ;remove file cursor if more than 0 files
  909.         ;call cmdcalccurxy
  910.         ;call nv_setxy
  911.         ;ld e,COLOR;7
  912.         ;OS_PRATTR ;remove cursor
  913.          ld de,_COLOR
  914.          call nv_setcolor ;even if we didn't reprint command line, draw windows with its color
  915.         pop af
  916.         ld hl,tnvcmds
  917.         ld bc,nnvcmds
  918.         cpir
  919.         jp nz,editcmd_keyfail
  920. ;bc=nnvcmds-(#команды+1) = 0..(nnvcmds-1)
  921.         add hl,bc
  922. ;hl=tnvcmds+nnvcmds
  923.         add hl,bc
  924.         add hl,bc
  925. ;hl=tnvcmds+nnvcmds+ 2*(nnvcmds-(#команды+1))
  926.         ld c,(hl)
  927.         inc hl
  928.         ld h,(hl)
  929.         ld l,c
  930.         push hl ;jump addr
  931.         ld hl,cmdbuf
  932.         ld ix,(curpanel)
  933.         ret
  934. editcmd_keyfail
  935.         cp 0x20
  936.         ret c ;прочие системные кнопки не нужны
  937. editcmd_typein
  938. ;keeps ix
  939.         ld e,a
  940.         ld hl,cmdbuf
  941.         call strlen ;hl=length
  942.         ld bc,MAXCMDSZ
  943.         or a
  944.         sbc hl,bc
  945.         ret nc ;некуда вводить
  946.         call cmdcalctextaddr ;hl=addr, a=curcmdx
  947.         inc a
  948.         ld (curcmdx),a
  949.         jp strinsch
  950.  
  951. editcmd_space
  952.         ld a,(cmdbuf)
  953.         or a
  954.         ld a,' '
  955.         jr nz,editcmd_typein
  956.         call getfcbaddrundercursor;hl=addr fcb ;ix=curpanel
  957.         call isthisdotdir_hl
  958.         call nz,changemark_hl
  959.         push hl
  960.         call setfilecursorxy
  961.         pop hl
  962.         call prdirfile
  963.         ld ix,(curpanel)
  964.         call drawpanelfilesandsize
  965.         jp editcmd_down
  966.        
  967. editcmd_backspace
  968.         call cmdcalctextaddr ;hl=addr, a=curcmdx
  969.         or a
  970.         jr z,editcmddirback;editcmdok ;нечего удалять
  971.         dec a
  972.         ld (curcmdx),a
  973.         jp strdelch
  974. editcmd_del
  975.         call cmdcalctextaddr ;hl=addr, a=curcmdx
  976.         or a
  977.         ret z ;нечего удалять вправо
  978.         inc hl
  979.         jp strdelch
  980.  
  981. ;hl = poi to filename in string
  982. ;out: de = after last slash
  983. findlastslash.
  984. nfopenfnslash.
  985.         ld d,h
  986.         ld e,l ;de = after last slash
  987. nfopenfnslash0.
  988.         ld a,[hl]
  989.         inc hl
  990.         or a
  991.         ret z
  992.         cp '/'
  993.         jr nz,nfopenfnslash0.
  994.         jr nfopenfnslash.
  995.        
  996. editcmddirback
  997. editcmddirback_go
  998.         call setpaneldir
  999.         ld de,tdotdot
  1000.         OS_CHDIR
  1001. ;взять имя директории из последнего элемента paneldir
  1002.         ld hl,(curpanel)
  1003.         push hl
  1004.         ld de,PANEL.dir
  1005.         add hl,de
  1006.         call findlastslash. ;out: de = after last slash
  1007.         ex de,hl
  1008.         ld de,filenametext
  1009.         call strcopy
  1010.         pop hl ;ld hl,(curpanel)
  1011.         push hl
  1012.         call editcmd_setpaneldirfromcurdir_panelhl
  1013.         pop ix ;ld ix,(curpanel)
  1014.         call readdir
  1015.         call sortfiles
  1016. ;найти имя директории
  1017.         ;ld ix,(curpanel)
  1018.         call getfiles
  1019.         ld b,h
  1020.         ld c,l
  1021.         ld hl,0
  1022. editcmddirbackfind0
  1023.         push bc
  1024.         push hl
  1025.         call getfcbaddrunderhl
  1026.         ld de,FCB_EXTENTNUMBERLO
  1027.         add hl,de
  1028.         ld a,(hl)
  1029.         inc hl
  1030.         inc hl
  1031.         ld e,(hl)
  1032.         inc hl
  1033.         ld d,(hl)
  1034.         SETPG32KHIGH
  1035.         ld hl,filenametext
  1036.         call strcp
  1037.         pop hl
  1038.         pop bc
  1039.         jr z,editcmddirback_ok
  1040.         cpi
  1041.         jp pe,editcmddirbackfind0
  1042.         ld h,b
  1043.         ld l,c ;error!!! not found!!!
  1044. editcmddirback_ok
  1045. ;hl=номер элемента директории
  1046.         call nv_setcursor_hl ;установить на него курсор
  1047.  
  1048.         call drawpanel_with_files
  1049.         jp editcmd_readprompt_setendcmdx
  1050.  
  1051. editcmd_left
  1052.         ld a,(curcmdx)
  1053.         or a
  1054.         ret z ;некуда влево
  1055.         dec a
  1056.         ld (curcmdx),a
  1057.         ret
  1058.  
  1059. editcmd_right
  1060.         call cmdcalctextaddr ;hl=addr, a=curcmdx
  1061.         inc (hl)
  1062.         dec (hl)
  1063.         ret z ;некуда вправо, стоим на терминаторе
  1064.         inc a
  1065.         ld (curcmdx),a
  1066.         ret
  1067.  
  1068. editcmd_pageDown
  1069.         call count_filecursor_y
  1070.         cp CONST_HGT_TABLE-1+firstfiley -1 ;???
  1071.         jr c,editcmd_pageDown_nolastvisible ;not last visible file
  1072.         call nv_getdirpos_hl
  1073.         ld bc,CONST_HGT_TABLE
  1074.         add hl,bc
  1075. editcmd_pageDown_end_q        
  1076.         call cpfiles_setdirpos ;hl=dirpos
  1077.         ld bc,CONST_HGT_TABLE-1
  1078.         xor a
  1079.         sbc hl,bc
  1080.         jr nc,$+4
  1081.         ld h,a
  1082.         ld l,a;0
  1083.         jr editcmd_pageUpq
  1084. editcmd_pageDown_nolastvisible
  1085.         call nv_getdirscroll_bc
  1086.         ld hl,CONST_HGT_TABLE-1
  1087.         add hl,bc ;last visible file
  1088.         call cpfiles_setdirpos
  1089. editcmd_clearkbddrawpanel
  1090.         call drawpanel_files
  1091.         jp clear_keyboardbuffer ;TODO почему не работает?
  1092.  
  1093. editcmd_pageUp
  1094.         call count_filecursor_y
  1095.         cp firstfiley
  1096.         jr nc,editcmd_pageDown_nofirstvisible ;not first visible file
  1097.         call nv_getdirpos_hl
  1098.         ld bc,CONST_HGT_TABLE-1
  1099.         xor a
  1100.         sbc hl,bc
  1101.         jr nc,$+4
  1102.         ld h,a
  1103.         ld l,a;0
  1104.         call nv_setdirpos_hl
  1105. editcmd_pageUpq
  1106.         ld b,h
  1107.         ld c,l
  1108.         call nv_setdirscroll_bc
  1109.         jr editcmd_clearkbddrawpanel ;jp drawpanel_files      
  1110. editcmd_pageDown_nofirstvisible
  1111.         call nv_getdirscroll_bc
  1112.         ld h,b
  1113.         ld l,c
  1114.         call nv_setdirpos_hl
  1115.         jr editcmd_clearkbddrawpanel ;jp drawpanel_files      
  1116.  
  1117. editcmd_End
  1118.         ld hl,-1 ;>=files
  1119.         jp editcmd_pageDown_end_q
  1120.  
  1121. editcmd_Home
  1122.         xor a
  1123.         ld h,a
  1124.         ld l,a;0
  1125.         call nv_setdirpos_hl
  1126.         jr editcmd_pageUpq
  1127.  
  1128. editcmd_up
  1129.          ld hl,controlloop_noprline
  1130.          ex (sp),hl
  1131.         call nv_getdirpos_hl
  1132.         ld a,h
  1133.         or l
  1134.         ret z ;first file
  1135.         dec hl
  1136.         call nv_setdirpos_hl
  1137.         call count_filecursor_y
  1138.         cp firstfiley-2;or a
  1139.         ret nz ;not above first visible file
  1140.         call nv_getdirscroll_bc
  1141.         dec bc
  1142.         call nv_setdirscroll_bc
  1143.          push bc
  1144.         call nv_getpanelxy_de
  1145.         inc d
  1146.         push de
  1147.         ld hl,CONST_HGT_TABLE*256 + 40
  1148.         call scrolldown ;OS_SCROLLDOWN
  1149.         pop de
  1150.         inc e
  1151.         call nv_setxy
  1152.          pop hl ;file number
  1153.         call getfcbaddrunderhl
  1154.         jp prdirfile
  1155.  
  1156. editcmd_down
  1157.          ld hl,controlloop_noprline
  1158.          ex (sp),hl
  1159.         call nv_getdirpos_hl
  1160.         call nv_getpanelfiles_bc
  1161.         inc hl
  1162.         or a
  1163.         sbc hl,bc
  1164.         add hl,bc
  1165.         ret z ;last file
  1166.         call nv_setdirpos_hl
  1167.         call count_filecursor_y
  1168.         cp CONST_HGT_TABLE-1+firstfiley
  1169.         ret c ;not last visible file
  1170.         call nv_getdirscroll_bc
  1171.         inc bc
  1172.         call nv_setdirscroll_bc
  1173.         ld hl,CONST_HGT_TABLE-1
  1174.         add hl,bc
  1175.         push hl
  1176.         call nv_getpanelxy_de
  1177.         inc d
  1178.         push de
  1179.         ld hl,CONST_HGT_TABLE*256 + 40
  1180.         call scrollup ;OS_SCROLLUP
  1181.         pop de
  1182.         ld a,d
  1183.         add a,CONST_HGT_TABLE-1
  1184.         ld d,a
  1185.         inc e
  1186.         call nv_setxy
  1187.          pop hl ;file number
  1188.         call getfcbaddrunderhl
  1189.         jp prdirfile
  1190.  
  1191. editcmd_ss1
  1192.         ld hl,comparefilename
  1193.         jr editcmd_setsortmodehl
  1194. editcmd_ss2
  1195.         ld hl,compareext
  1196.         jr editcmd_setsortmodehl
  1197. editcmd_ss3
  1198.         ld hl,comparesize
  1199.         jr editcmd_setsortmodehl
  1200. editcmd_ss4
  1201.         ld hl,comparedate
  1202.         jr editcmd_setsortmodehl
  1203. editcmd_ss5
  1204.         ld hl,compareempty
  1205. editcmd_setsortmodehl
  1206.         call ifcmdnonempty_typedigit
  1207.         ld c,(ix+PANEL.dirsortproc)
  1208.         ld b,(ix+PANEL.dirsortproc+1)
  1209.         xor a
  1210.         sbc hl,bc
  1211.         add hl,bc
  1212.         jr nz,editcmd_setsortmodehl_noold
  1213.         ld a,(ix+PANEL.dirsortmode)
  1214.         cpl
  1215. editcmd_setsortmodehl_noold
  1216.         ld (ix+PANEL.dirsortmode),a
  1217.         ld (ix+PANEL.dirsortproc),l
  1218.         ld (ix+PANEL.dirsortproc+1),h
  1219.         jp editcmd_reprintcurpanel
  1220.  
  1221. editcmd_tab
  1222.         push ix
  1223.         call getanotherpanel_ix
  1224.         ld (curpanel),ix
  1225.         call drawpanel_head
  1226.         pop ix
  1227.         call drawpanel_head ;inactive panel
  1228.         jp editcmd_readprompt_setendcmdx
  1229.  
  1230. editcmd_enter
  1231.         ld a,(cmdbuf)
  1232.         or a
  1233.         jr nz,editcmd_enter_runcmd
  1234.         call getfcbundercursor ;->fcb
  1235.         ld a,(fcb+FCB_FATTRIB)
  1236.         and FATTRIB_DIR;#10
  1237.         jp z,editcmd_enter_run
  1238.          ld hl,fcb+FCB_FNAME
  1239.          ld a,(hl)
  1240.          cp '.'
  1241.          jr nz,editcmd_enter_nodotdot
  1242.          inc hl
  1243.          ld a,(hl)
  1244.          cp '.'
  1245.          jp z,editcmddirback_go
  1246. editcmd_enter_nodotdot
  1247.         call changedir_fromfcb
  1248. ;editcmd_setpaneldirfromcurdir
  1249.         ld hl,editcmd_reprintcurpanel
  1250.         push hl
  1251.         ld hl,(curpanel)
  1252. editcmd_setpaneldirfromcurdir_panelhl
  1253.         ld de,PANEL.dir
  1254.         add hl,de
  1255.         ex de,hl ;de=pointer to 64 byte (MAXPATH_sz!) buf
  1256.         OS_GETPATH
  1257.          jp clear_keyboardbuffer
  1258.         ;ret
  1259.  
  1260. editcmd_enter_runcmd
  1261. ;run "cmd <command to run>"
  1262.         OS_SETSYSDRV ;TODO каталог cmd
  1263.         ld hl,cmd_filename
  1264.         call copy_to_fcb_filename
  1265.  
  1266.         ld hl,cmdbuf
  1267. loadandrun_waitpid
  1268. ;hl=cmdbuf или cmdprompt (для loadandrun_restcmd)
  1269.         push hl
  1270.         call setdrawtablesneeded
  1271.         ld de,0
  1272.         SETXY_
  1273.         ld de,_COLOR
  1274.         SETCOLOR_
  1275.         CLS_
  1276.         ld de,0
  1277.         SETXY_
  1278.          ;jr $
  1279.         ld ix,leftpanel
  1280.         call strdelpages
  1281.         ld ix,rightpanel
  1282.         call strdelpages
  1283.         call deletepages
  1284.         pop hl ;hl=cmdbuf или cmdprompt
  1285.          ;call setcurpaneldir
  1286.         call loadandrun ;nz=error, e=id
  1287.         jp nz,execcmd_error
  1288. ;команда scratch - реально cmd scratch в текущем терминале
  1289.         WAITPID
  1290. ;wait for focus
  1291.         if 1==0
  1292. execcmd_waitfocus0
  1293.          YIELD
  1294.          ld a,(user_scr0_low)
  1295.          ld hl,user_scr0_high
  1296.          cp (hl)
  1297.          jr z,execcmd_waitfocus0
  1298.         endif
  1299.         CLS_ ;scroll what was printed
  1300. execcmd_error
  1301.         call assignpages
  1302.         ld hl,cmdbuf
  1303.         ld (hl),0
  1304.         jp editcmd_reprintall_keepcursor
  1305.  
  1306. editcmd_enter_run
  1307.         call setpaneldir
  1308.         ld hl,fcb_filename+8
  1309.         ld a,(hl)
  1310.         inc hl
  1311.         ld c,(hl)
  1312.         inc hl
  1313.         ld b,(hl)
  1314.         cp '$'
  1315.         jp z,editcmd_enter_runfile_hobeta
  1316.         or 0x20
  1317.         cp 'c'
  1318.         jr nz,editcmd_enter_runfile_nocom
  1319.         ld a,c
  1320.         or 0x20
  1321.         cp 'o'
  1322.         jr nz,editcmd_enter_runfile_nocom
  1323.         ld a,b
  1324.         or 0x20
  1325.         cp 'm'
  1326.         jr nz,editcmd_enter_runfile_nocom
  1327. editcmd_enter_runfile_com
  1328.         ld hl,cmdbuf
  1329.         ld (hl),0
  1330. ;hl=rest of command line
  1331.         jp loadandrun_waitpid
  1332.  
  1333. editcmd_enter_runfile_nocom
  1334.         ld hl,runfile_nocomq
  1335.         push hl
  1336.         call makeprompt_filename
  1337.        
  1338.         call runfile_findhandler ;find fcb_filename ext (spoiled) in "nv.ext"
  1339.         ret nz ;jp nz,execcmd_error
  1340.  
  1341.         ld de,cmdbuf
  1342.         ld hl,fcb_filename
  1343.         OS_PARSEFNAME ;de->hl
  1344.        
  1345.         OS_SETSYSDRV ;TODO директория cmd
  1346.         ld hl,cmdprompt
  1347.         jp loadandrun_waitpid
  1348.  
  1349. makeprompt_filename
  1350.         call setpaneldir_makeprompt ;keeps ix
  1351.         call getfcbundercursor ;->fcb
  1352.         ld hl,cmdprompt
  1353.         xor a
  1354.         cpir
  1355.         dec hl ;hl=адрес терминатора
  1356.         ld a,'/'
  1357.         dec hl
  1358.         cp (hl)
  1359.         inc hl
  1360.         jr z,$+4
  1361.          ld (hl),a
  1362.          inc hl
  1363.         ex de,hl ;de=prompt = "d:/path/" без терминатора
  1364.         ld hl,fcb_filename
  1365.         jp cpmname_to_dotname ;prompt = "d:/path/filename"
  1366.        
  1367. runfile_findhandler
  1368. ;find fcb_filename ext (spoiled) in "nv.ext"
  1369. ;out: nz=error, cmdbuf=handler
  1370.         ld hl,fcb_filename+8
  1371.         ld de,ext
  1372.         ld b,3
  1373. runfile_nocom_recodeext0
  1374.         ld a,(hl)
  1375.         or 0x20
  1376.         ld (de),a
  1377.         inc hl
  1378.         inc de
  1379.         djnz runfile_nocom_recodeext0
  1380.         OS_SETSYSDRV ;TODO директория nv
  1381.         ld hl,ext_filename
  1382.         ld de,filenametext
  1383.         push de
  1384.         call cpmname_to_dotname
  1385.         pop de
  1386.         OS_OPENHANDLE
  1387.         or a
  1388.         ret nz ;error
  1389.         ld a,b
  1390.         ld (curhandle),a
  1391.         ld iy,file_buf_end
  1392. runfile_nocom_extloop
  1393.         call checkoneext ;c=ошибки, z=нет ошибок
  1394.         jr c,runfile_nocom_readerror
  1395.         jr z,runfile_nocom_extok
  1396.         call checkcomma
  1397.         jr c,runfile_nocom_readerror
  1398.         jr z,runfile_nocom_extloop
  1399.         call skiptonextline
  1400.         jr nz,runfile_nocom_extloop ;no EOF
  1401. runfile_nocom_readerror
  1402.         call nv_closehandle
  1403.         xor a
  1404.         dec a
  1405.         ret ;nz
  1406. runfile_nocom_extok
  1407.         call skiptocolon ;пройти к ':'
  1408.         ld hl,cmdbuf
  1409.         call loadtoendline
  1410.         call nv_closehandle
  1411.         xor a
  1412.         ret ;z
  1413.  
  1414. runfile_nocomq
  1415.         ld hl,cmdbuf
  1416.         ld (hl),0
  1417.         ld ix,(curpanel)
  1418. setpaneldir_makeprompt
  1419.         call setpaneldir ;keeps ix
  1420.         jp makeprompt ;-> prompt ;keeps ix
  1421.  
  1422.         macro READBYTE_A
  1423. ;out: z=EOF
  1424.         inc ly
  1425.         call m,readbyte_readbuf
  1426.         ld a,(iy)
  1427.         endm
  1428.  
  1429. checkoneext
  1430.         ld hl,ext
  1431.         ld bc,3*256
  1432. checkoneext0
  1433.         READBYTE_A
  1434.         ret z ;EOF
  1435.         cp 0x0a
  1436.         jr z,checkoneext0 ;skip LF
  1437.         or 0x20
  1438.         xor (hl)
  1439.         inc hl
  1440.         or c
  1441.         ld c,a
  1442.         djnz checkoneext0
  1443. ;c=ошибки, z=нет ошибок
  1444.         ret
  1445.  
  1446. skiptocolon
  1447.         READBYTE_A
  1448.         ret z ;EOF
  1449.         cp ':'
  1450.         jr nz,skiptocolon
  1451.         ret
  1452.  
  1453. checkcomma
  1454.         READBYTE_A
  1455.         cp ','
  1456.         ret ;TODO проверить EOF
  1457.  
  1458. loadtoendline
  1459. ;hl=buf
  1460.         READBYTE_A
  1461.         jr z,loadtoendlineq
  1462.         cp 0x0d
  1463.         jr z,loadtoendlineq
  1464.         ld (hl),a
  1465.         inc hl
  1466.         jr loadtoendline
  1467. loadtoendlineq
  1468.         ld (hl),0
  1469.         ret
  1470.  
  1471. skiptonextline
  1472.         READBYTE_A
  1473.         ret z ;EOF
  1474.         cp 0x0d
  1475.         jr nz,skiptonextline
  1476.         or a
  1477.         ret ;nz
  1478.  
  1479. readbyte_readbuf
  1480. ;out: z=EOF
  1481.         push bc
  1482.         push de
  1483.         push hl
  1484.         push ix
  1485.         ld de,file_buf
  1486.         push de
  1487.         ld hl,128
  1488.         call readcurhandle
  1489.         ld a,h
  1490.         or l ;z=no bytes read
  1491.         pop iy
  1492.         pop ix
  1493.         pop hl
  1494.         pop de
  1495.         pop bc
  1496.         ret
  1497.  
  1498. editcmd_enter_runfile_hobeta
  1499. hobetarunner=0x4100
  1500.         ld e,6 ;textmode
  1501.         OS_SETGFX
  1502.  
  1503.         ld a,(user_scr0_low) ;ok
  1504.         SETPG32KLOW
  1505.         inc a ;ld a,#ff-0
  1506.         SETPG32KHIGH
  1507. ;0x4000 : pgcode4000 ;(pg4 может запортиться от стека!!! причём не только этой задачи!!!)
  1508. ;0x8000 : pg1
  1509. ;0xc000 : pg0
  1510.         call loadhobeta
  1511.         ret nz ;error
  1512.  
  1513.         di
  1514.         ld a,(user_scr0_low) ;ok
  1515.         sub 4-1 ;ld a,#ff-4 ;pgkillable
  1516.         SETPG32KLOW
  1517.         ld hl,0x4000
  1518.         ld de,0x8000
  1519.         ld bc,0x4000
  1520.         ldir ;copy pgcode4000 -> pg4
  1521.  
  1522.         ld a,(user_scr0_low) ;ok
  1523.         SETPG32KLOW
  1524.         ;ld a,(user_scr0_low) ;ok
  1525.         sub 4-1 ;ld a,#ff-4 ;pgkillable
  1526.         SETPG16K
  1527.         ld hl,washobetarunner
  1528.         ld de,hobetarunner
  1529.         ld bc,hobetarunner_sz
  1530.         ldir
  1531. ;0x4000 : pg4 (может запортиться от стека!!! причём не только этой задачи!!!)
  1532. ;0x8000 : pg1
  1533. ;0xc000 : pg0
  1534.         ld hl,0x6000
  1535.         ld bc,(0x6000-17+11) ;len
  1536.         add hl,bc
  1537.         dec hl ;hl=load end
  1538.         ex de,hl
  1539.         ld hl,(0x6000-17+9) ;start
  1540.         ld (hobetarunner_jp),hl
  1541.         add hl,bc
  1542.         dec hl
  1543.         ex de,hl ;de=destination end
  1544.         lddr
  1545.         jp hobetarunner
  1546.  
  1547. loadhobeta
  1548.         ld hl,fcb_filename
  1549.         ld de,filenametext
  1550.         push de
  1551.         call cpmname_to_dotname
  1552.         pop de
  1553.         OS_OPENHANDLE
  1554.         or a
  1555.         ret nz ;error
  1556.         ld a,b
  1557.         ld (curhandle),a
  1558.         ld de,0x6000-17
  1559.         ld hl,-(0x6000-17)
  1560.         OS_READHANDLE
  1561.         call nv_closehandle
  1562.         xor a ;no error
  1563.         ret ;call nv_closefcb
  1564.  
  1565. loadandrun
  1566. ;hl=rest of command line
  1567. ;out: nz=error, e=id
  1568. ;load file in fcb from system current dir with parameters in tcmd, then set curpaneldir and run
  1569.         ld (loadandrun_restcmd),hl
  1570.         ld hl,fcb_filename
  1571.         ld de,filenametext
  1572.         push de
  1573.         call cpmname_to_dotname
  1574.         pop de
  1575.         OS_OPENHANDLE
  1576.         or a
  1577.         ret nz ;error
  1578.         ld a,b
  1579.         ld (curhandle),a
  1580.         ld hl,nv_closehandle
  1581.         push hl
  1582.         ;set current drive and dir (will be copied into new app)
  1583.         call setcurpaneldir
  1584.  
  1585.         OS_NEWAPP
  1586.         or a
  1587.         ret nz ;error
  1588. ;dehl=номера страниц в 0000,4000,8000,c000 нового приложения, b=id, a=error
  1589.         push bc ;b=id
  1590.         ld a,d
  1591.         SETPG32KHIGH
  1592.         push de
  1593.         push hl
  1594.         ld hl,fcb_filename
  1595.         ld de,0xc000+COMMANDLINE
  1596.         call cpmname_to_dotname ;de указывает на терминатор
  1597. loadandrun_restcmd=$+1
  1598.         ld hl,0
  1599.          ld a,(hl)
  1600.          or a
  1601.          jr z,loadandrun_noparams
  1602.         ld a,' '
  1603.         ld (de),a
  1604.         inc de
  1605. loadandrun_noparams
  1606.         ld bc,COMMANDLINE_sz;-tcmd_sz
  1607.         ldir ;copy command line ;можем залезть за 0x0100!
  1608.         xor a
  1609.         ld (0xc000+COMMANDLINE+COMMANDLINE_sz-1),a
  1610.         pop hl
  1611.         pop de
  1612.  
  1613.         call readfile_pages_dehl
  1614.  
  1615.         pop de
  1616.         ld e,d ;e=id
  1617. ;run "cmd <commandline>"
  1618.         push de
  1619.         OS_RUNAPP
  1620.         pop de
  1621.         xor a
  1622.         ret ;z
  1623.  
  1624. editcmd_1
  1625.         call ifcmdnonempty_typedigit
  1626. editcmd_F1
  1627.         ld ix,(curpanel)
  1628.         ld a,(ix+PANEL.xy)
  1629.         add a,10
  1630.         ld (windrv),a ;x
  1631.         add a,5
  1632.         ld (windrverr),a
  1633.         ld hl,editcmd_reprintcurpanel;editcmd_reprintall_onlyreadcurdir
  1634.         push hl
  1635.  
  1636. seldrv_redraw_mainloop
  1637.         ld hl,windrv
  1638. ;hl=window
  1639.         ld de,_COLOR_DIALOG
  1640.         call nv_setcolor
  1641.  
  1642.         call prwindow_text ;de=YX of last line
  1643. seldrv_mainloop
  1644.         ld de,(windrv)
  1645. seldrv_cury=$+1
  1646.         ld a,0
  1647.         add a,d
  1648.         add a,2
  1649.         ld d,a
  1650.         inc e
  1651.         inc e
  1652.         inc e
  1653.         push de
  1654.         ld hl,_CURSORCOLOR
  1655.         ld b,22
  1656.         call drawfilecursor_sizeb_colorhl ;draw cursor
  1657. seldrv_mainloop_nokey
  1658.         call yieldgetkeyloop ;YIELDGETKEYLOOP
  1659.          or a
  1660.          jr z,seldrv_mainloop_nokey ;TODO handle mouse events
  1661.         ld a,c
  1662.         pop de
  1663.         push af
  1664.         ld hl,_COLOR_DIALOG
  1665.         ld b,22
  1666.         call drawfilecursor_sizeb_colorhl ;remove cursor
  1667.         pop af
  1668.         cp key_redraw
  1669.         jr z,seldrv_redraw_mainloop
  1670.         ld hl,seldrv_cury
  1671.         cp key_enter
  1672.         jr z,seldrv_selcursor
  1673.         cp key_esc
  1674.         ret z
  1675.         cp 'a'
  1676.         jr c,seldrv_cursor
  1677.         cp 'a'+NDRIVES;'p'
  1678.         jr c,seldrv_selletter
  1679. seldrv_cursor
  1680.         ld bc,seldrv_mainloop
  1681.         push bc
  1682.         cp key_down
  1683.         jr z,seldrv_down
  1684.         cp key_up
  1685.         jr z,seldrv_up
  1686.         ret
  1687. seldrv_selletter
  1688.         sub 'a'
  1689.         jr seldrv_ok
  1690. seldrv_selcursor
  1691.         ld a,(hl)
  1692. seldrv_ok
  1693.         ld e,a
  1694.         push de
  1695.         OS_SETDRV
  1696.         pop de
  1697.         or a
  1698.         jr z,seldrv_ok0
  1699.         ld de,_COLOR_RED
  1700.         call nv_setcolor
  1701.         ld hl,windrverr
  1702.         call prwindow_waitkey
  1703.         ld de,_COLOR
  1704.         call nv_setcolor
  1705.         jp seldrv_redraw_mainloop
  1706. seldrv_ok0
  1707.         ld a,e
  1708.         add 'a'
  1709.         ld ix,(curpanel)
  1710.         ld (ix+PANEL.dir),a
  1711.         ld (ix+PANEL.dir+1),':'
  1712.         ld (ix+PANEL.dir+2),'/'
  1713.         ld (ix+PANEL.dir+3),0
  1714.         ret
  1715.  
  1716. seldrv_down
  1717.         ld a,(hl)
  1718.         inc a
  1719.         cp NDRIVES;15
  1720.         ret z
  1721.         ld (hl),a
  1722.         ret
  1723. seldrv_up
  1724.         ld a,(hl)
  1725.         or a
  1726.         ret z
  1727.         dec (hl)
  1728.         ret
  1729.  
  1730. editcmd_4
  1731.         call ifcmdnonempty_typedigit
  1732. editcmd_F4
  1733.         call getfcbundercursor ;->fcb
  1734.         ld a,(fcb+FCB_FATTRIB)
  1735.         and FATTRIB_DIR;#10
  1736.         ret nz
  1737.  
  1738.         ld hl,editcmd_reprintall_noreaddir
  1739.         push hl
  1740.  
  1741.         call makeprompt_filename
  1742.  
  1743.         ;call runfile_findhandler ;find fcb_filename ext (spoiled) in "nv.ext"
  1744.         ;ret nz ;jp nz,execcmd_error
  1745.  
  1746.         ;ld de,cmdbuf
  1747.         ;ld hl,fcb_filename
  1748.         ;OS_PARSEFNAME ;de->hl
  1749.  
  1750.         OS_SETSYSDRV ;TODO директория texted
  1751.  
  1752.         ld hl,texted_filename
  1753.         call copy_to_fcb_filename
  1754.  
  1755.         ;ld hl,cmdbuf
  1756.         ;ld (hl),0
  1757.         ld hl,cmdprompt
  1758. ;load file in fcb from system current dir with parameters in tcmd, then set curpaneldir and run
  1759.         jp loadandrun_waitpid
  1760.  
  1761. editcmd_9
  1762.         call ifcmdnonempty_typedigit
  1763.         ;ld e,1
  1764.         ;OS_SETSCREEN
  1765.         ;YIELDGETKEYLOOP
  1766.         ;ld e,0
  1767.         ;OS_SETSCREEN
  1768.         ret
  1769.  
  1770. editcmd_reprintall_keepcursor
  1771.         call readpanels_reprint_keepcursor
  1772.         jp editcmd_readprompt_setendcmdx
  1773.  
  1774. editcmd_reprintcurdir
  1775.         ld hl,leftpanel+PANEL.dir
  1776.         ld de,rightpanel+PANEL.dir
  1777.         call strcp
  1778.         jr nz,editcmd_reprintcurpanel
  1779. editcmd_reprintall
  1780.         call readpanels_reprint
  1781.         jp editcmd_readprompt_setendcmdx
  1782. editcmd_reprintcurpanel
  1783.         ld ix,(curpanel)
  1784.         call readdir
  1785.         call sortfiles
  1786.         call drawpanel_with_files
  1787.         jp editcmd_readprompt_setendcmdx
  1788. editcmd_reprintall_noreaddir
  1789.         ;ld e,COLOR
  1790.         ;OS_CLS
  1791.         call printhint
  1792.         ld ix,leftpanel
  1793.         call drawpanel_with_files
  1794.         ld ix,rightpanel
  1795.         jp drawpanel_with_files
  1796. ;editcmd_reprintall_onlyreadcurdir
  1797. ;       ld e,COLOR
  1798. ;       OS_CLS
  1799. ;       call printhint
  1800. ;       call getanotherpanel_ix
  1801. ;       call drawpanel_with_files
  1802. ;       jp editcmd_reprintcurpanel
  1803.  
  1804. editcmd_invfiles
  1805. ;ix=curpanel
  1806.         ld hl,changemark_hl
  1807.         call processfiles
  1808.         jp drawpanel_with_files
  1809.  
  1810. editcmd_6 ;ren
  1811.         call ifcmdnonempty_typedigit
  1812. editcmd_F6
  1813.         ld hl,editcmd_reprintall_keepcursor;editcmd_reprintall
  1814.         push hl
  1815.         call setpaneldir
  1816.         call getfcbundercursor
  1817.  
  1818.         if 1==1
  1819.         ld a,(fcb+FCB_EXTENTNUMBERLO)
  1820.         SETPG32KHIGH
  1821.         ld hl,(fcb+FCB_EXTENTNUMBERHI)
  1822.         ld de,filenametext
  1823.         push hl
  1824.         call strcopy
  1825.         pop hl
  1826.         ld de,tnewfilename
  1827.         call strcopy
  1828.         ;ld bc,64 ;max filename size+terminator
  1829.         ;ldir
  1830.         else
  1831.         ld hl,fcb_filename
  1832.         ld de,tnewfilename
  1833.         push de
  1834.         call cpmname_to_dotname
  1835.         pop hl
  1836.         ld de,filenametext
  1837.         ld bc,12
  1838.         ldir
  1839.         endif
  1840.  
  1841.         ld de,_COLOR_DIALOG
  1842.         call nv_setcolor
  1843.  
  1844.         ld hl,winrename
  1845.         ld de,tnewfilename
  1846.         ld c,63;13 ;max filename size
  1847.         call prwindow_edit ;CY=OK
  1848.         ret nc ;cancel
  1849. ;если в имени есть символы :,/,\, то выйти с ошибкой
  1850.         ld hl,tnewfilename
  1851. editcmd_ren_checkname0
  1852.         ld a,(hl)
  1853.         or a
  1854.         jr z,editcmd_ren_checknameq
  1855.         inc hl
  1856.         cp ':'
  1857.         ret z ;error
  1858.         cp '/'
  1859.         ret z ;error
  1860.         cp 0x5c;'\\'
  1861.         ret z ;error
  1862.         jr editcmd_ren_checkname0
  1863. editcmd_ren_checknameq
  1864.         ld de,filenametext
  1865.         ld hl,tnewfilename
  1866.         OS_RENAME
  1867.         ;todo error
  1868.         ret
  1869.  
  1870. editcmd_7 ;mkdir
  1871.         call ifcmdnonempty_typedigit
  1872. editcmd_F7
  1873.         ld hl,editcmd_reprintall_keepcursor;editcmd_reprintall
  1874.         push hl
  1875.         call setpaneldir
  1876.  
  1877.         ld de,_COLOR_DIALOG
  1878.         call nv_setcolor
  1879.         xor a
  1880.         ld hl,winmkdir
  1881.         ld de,tnewfilename
  1882.         ld (de),a
  1883.         ld c,63;13 ;max filename size
  1884.         call prwindow_edit ;CY=OK, de=filename
  1885.         ret nc ;cancel
  1886.         OS_MKDIR
  1887.         ;TODO error
  1888.         ret
  1889.  
  1890. editcmd_8 ;del
  1891.         call ifcmdnonempty_typedigit
  1892. editcmd_F8
  1893.         ;ld ix,(curpanel)
  1894.         call getmarkedfiles;countmarkedfiles
  1895.         ld a,h
  1896.         or l
  1897.         jr nz,editcmd_8_0      
  1898.         call getfcbaddrundercursor;hl=fcb
  1899.         call isthisdotdir_hl
  1900.         ret z ;"." or ".."
  1901.         call changemark_hl ;ld (hl),1
  1902. editcmd_8_0  
  1903.         ld de,_COLOR_RED
  1904.         call nv_setcolor
  1905.         ld hl,windel
  1906.         call prwindow_waitkey ;CY=OK
  1907.         jp nc,editcmd_reprintall_noreaddir
  1908.         ld hl,editcmd_reprintall_keepcursor;editcmd_reprintall
  1909.         push hl
  1910.         ld hl,windel2
  1911.         call prwindow_text
  1912.         ld hl,proc_del_file
  1913.         ld ix,(curpanel)
  1914.         jp processfiles
  1915.  
  1916. proc_del_file
  1917.         bit 0,(hl) ;marked?
  1918.         ret z
  1919.         call getfcbfromhl
  1920.  
  1921.          ld ix,(curpanel)
  1922.         ld de,PANEL.dir
  1923.          add ix,de
  1924.          push ix
  1925.          pop hl
  1926.         ld de,dir_buf
  1927.         call strcopy;nv_strcopy_hltode
  1928.  
  1929.         ld hl,proc_del_file_batch
  1930.         ld (nv_batch_proc),hl
  1931.  
  1932. proc_del_file_batch
  1933. ;нельзя CHDIR, потому что это вызывается в цикле чтения директории в nv_batch1!
  1934.         ;ld de,dir_buf
  1935.         ;OS_CHDIR
  1936.  
  1937.        if 1==0
  1938.         ld de,filenametext ;wordbuf ;de=drive/path/file
  1939.         ld hl,fcb_filename
  1940.         call cpmname_to_dotname
  1941.        else
  1942.         ld a,(fcb+FCB_EXTENTNUMBERLO)
  1943.         SETPG32KHIGH
  1944.         ld hl,(fcb+FCB_EXTENTNUMBERHI)
  1945.         ld de,filenametext
  1946.         ld bc,63*256+0
  1947.         call prdirfile_copyfn
  1948.        endif
  1949.  
  1950.         ld de,dir3_buf;windel2_file ;dest
  1951.         push de
  1952.         ld bc,filenametext ;add
  1953.         ld hl,dir_buf ;src
  1954.         call nv_makefilepath_hltode ;result :  dest=hl'/'bc (de указывает после терминатора)
  1955.         pop hl
  1956.          ;ld hl,dir3_buf
  1957.          ld de,windel2_file
  1958.          push de
  1959.          ld bc,64
  1960.          ldir
  1961.          pop hl
  1962.         ;ld hl,windel2_file
  1963.         call nv_fillpathspaces_hl ;fill to 64bytes spaces
  1964.         ld hl,windel2
  1965.         call upwindow_text ;update window
  1966.  
  1967.         ld de,dir3_buf;windel2_file ;dest
  1968.         push de
  1969.         ld bc,filenametext ;add
  1970.         ld hl,dir_buf ;src
  1971.         call nv_makefilepath_hltode ;result :  dest=hl'/'bc (de указывает после терминатора)
  1972.         pop de
  1973.         ;ld de,filenametext
  1974.         OS_DELETE
  1975.         or a
  1976.         ret z ;if success return
  1977.  
  1978.         ld a,(fcb_attrib)
  1979.         and FATTRIB_DIR
  1980.         push af
  1981.         call nz,nv_copydir_add
  1982.         pop af
  1983.         jp nz,nv_copydir_add ;twice to remove empty dirs
  1984.         ret
  1985.  
  1986. editcmd_5 ;copy
  1987.         call ifcmdnonempty_typedigit
  1988. editcmd_F5
  1989.         ;ld ix,(curpanel)
  1990.         call getmarkedfiles ;countmarkedfiles
  1991.         ld a,h
  1992.         or l
  1993.         jr nz,editcmd_5_0      
  1994.         call getfcbaddrundercursor ;hl=fcb
  1995.         call isthisdotdir_hl
  1996.         ret z ;"." or ".."
  1997.         call changemark_hl ;ld (hl),1
  1998. editcmd_5_0
  1999.  
  2000.         call getanotherpanel_ix
  2001.         ld de,PANEL.dir
  2002.          add ix,de
  2003.          push ix
  2004.          pop hl
  2005.         ld de,dir2_buf
  2006.         call strcopy;nv_strcopy_hltode
  2007.  
  2008.          ld ix,(curpanel)
  2009.         ld de,PANEL.dir
  2010.          add ix,de
  2011.          push ix
  2012.          pop hl
  2013.         ld de,dir_buf
  2014.         call strcopy;nv_strcopy_hltode
  2015.  
  2016.         ld de,_COLOR_DIALOG
  2017.         call nv_setcolor
  2018.          ld ix,(curpanel)
  2019.  
  2020.         ld hl,wincopy
  2021.         ld de,dir2_buf
  2022.         ld c,60
  2023.         call prwindow_edit ;CY=OK
  2024.         jp nc,editcmd_reprintall_noreaddir
  2025.  
  2026.         ld hl,editcmd_reprintall
  2027.         push hl ;don't change!
  2028.  
  2029.         ld hl,0
  2030.         ld (filescopied),hl
  2031.  
  2032. ;        ld de,PROGRESBARWINXY
  2033. ;        ld bc,PROGRESBARWINHGTWID
  2034. ;        call prwin
  2035.         ld hl,wincopy2
  2036.         call prwindow_text
  2037.         ld hl,proceditcmd_copy
  2038.         ld ix,(curpanel)
  2039.         jp processfiles
  2040.  
  2041. strcopy
  2042. ;hl->de
  2043. ;out: hl,de after terminator
  2044.         xor a
  2045. strcopy0
  2046.         cp (hl)
  2047.         ldi
  2048.         jp nz,strcopy0
  2049.         ret
  2050.  
  2051. nv_makefilepath_hltode ;DE=dest HL=src BC=filename
  2052.         push bc
  2053.         call strcopy;nv_strcopy_hltode
  2054.         pop bc
  2055. ;assumed that DE is after terminator
  2056.         dec de
  2057.         dec de
  2058.         ld a,(de)
  2059.         cp '/'
  2060.         jr z,nv_addslash0
  2061.         inc de
  2062.         ld a,'/'
  2063.         ld (de),a
  2064. nv_addslash0
  2065.         inc de
  2066.         xor a
  2067.         ld (de),a
  2068.         ld h,b
  2069.         ld l,c
  2070.         jp strcopy;nv_strcopy_hltode
  2071.  
  2072. nv_fillpathspaces_hl
  2073.         ld b,0
  2074. nv_fillpathspaces_hl0
  2075.          ;ld a,b
  2076.          ;cp 64
  2077.          ;ret z
  2078.          bit 6,b
  2079.          ret nz
  2080.         ld a,(hl)
  2081.         inc b
  2082.         inc hl
  2083.         or a
  2084.         jr nz,nv_fillpathspaces_hl0
  2085.         dec hl
  2086.         dec b
  2087.         ld c,' '
  2088.         ld a,b
  2089. nv_fillpathspaces_hl1
  2090.         ld (hl),c
  2091.         inc hl
  2092.         inc a
  2093.         cp 64
  2094.         jr c,nv_fillpathspaces_hl1
  2095.         ret
  2096.  
  2097. nv_copydir_add;=nv_batch_pushrecord
  2098. ;       jp nv_batch_pushrecord
  2099. ;nv_batch_pushrecord
  2100.         OS_GETMAINPAGES
  2101.         ld a,h
  2102.         ld (savepg),a
  2103.         ld a,(dirpg)
  2104.         SETPG32KLOW
  2105.  
  2106.         ld hl,0x8000
  2107.         ld bc,(dir_batch_pointer)
  2108.         ld de,256
  2109. nv_batch_pushsrecord
  2110.         ld a,b
  2111.         or c
  2112.         jr z,nv_batch_pushsrecordend
  2113.         add hl,de
  2114.         dec bc
  2115.         jr nv_batch_pushsrecord
  2116. nv_batch_pushsrecordend
  2117.         push hl
  2118. ;dir 1
  2119.         ld de,dir_buf
  2120.         ex hl,de
  2121.         ld bc,filenametext
  2122.         call nv_makefilepath_hltode
  2123.         pop hl
  2124.         ld de,128 ;128 bytes for source, 128 bytes for dest???
  2125.         add hl,de
  2126. ;dir2
  2127.         ld de,dir2_buf
  2128.         ex hl,de
  2129.         ld bc,filenametext
  2130.         call nv_makefilepath_hltode
  2131.  
  2132.         ld bc,(dir_batch_pointer)
  2133.         inc bc
  2134.         ld (dir_batch_pointer),bc
  2135.         ld a,(savepg)
  2136.         SETPG32KLOW
  2137.         ret
  2138.  
  2139. nv_batch_poprecord ;z=empty
  2140.         OS_GETMAINPAGES
  2141.         ld a,h
  2142.         ld (savepg),a
  2143.         ld a,(dirpg)
  2144.         SETPG32KLOW
  2145.  
  2146.         ld hl,0x8000
  2147.         ld bc,(dir_batch_pointer)
  2148.         ld a,b
  2149.         or c
  2150.         jr z,nv_batch_popsrecordq ;empty :(
  2151.         dec bc
  2152.         ld de,256
  2153. nv_batch_popsrecord
  2154.         ld a,b
  2155.         or c
  2156.         jr z,nv_batch_popsrecordend
  2157.         add hl,de
  2158.         dec bc
  2159.         jr nv_batch_popsrecord
  2160. nv_batch_popsrecordend
  2161.         ld de,dir_buf
  2162.         ld bc,128
  2163.         ldir
  2164.         ld de,dir2_buf
  2165.         ld  c,128
  2166.         ldir
  2167.         ld bc,(dir_batch_pointer)
  2168.         dec bc
  2169.         ld (dir_batch_pointer),bc
  2170.         ld a,1
  2171.         or a ;NZ
  2172. nv_batch_popsrecordq
  2173.         ld a,(savepg)
  2174.         SETPG32KLOW
  2175.         ret
  2176.  
  2177. nv_batch
  2178.         call nv_batch_poprecord
  2179.         ret z;empty
  2180. nv_label
  2181.         or a
  2182.         ld hl,(processfiles_proc)
  2183.         ld de,proceditcmd_copy
  2184.         sbc hl,de
  2185.         jr nz,nv_batch_nocopydir ;if it's not copy
  2186.  
  2187.         ld de,dir2_buf
  2188.         OS_MKDIR
  2189.         ld de,dir2_buf
  2190.         OS_CHDIR ;de
  2191.         or a
  2192.         jr nz,nv_batch ;can't open dest dir
  2193. nv_batch_nocopydir
  2194.         ld de,dir_buf
  2195.         OS_CHDIR ;;
  2196.         or a
  2197.         jr nz,nv_batch ;can't open src dir
  2198.  
  2199.         ld de,emptypath
  2200.         OS_OPENDIR
  2201.         ;ld de,fcb
  2202.         ;OS_SETDTA
  2203.         ;ld de,fcbmask
  2204.         ;OS_FSEARCHFIRST
  2205.         or a
  2206.         jr nz,nv_batch
  2207.        
  2208.         ;ld de,fcb
  2209.         ;OS_SETDTA
  2210.         ;ld de,fcbmask
  2211.         ;OS_FSEARCHNEXT
  2212.         ;or a
  2213.         ;jr nz,nv_batch ;skip . and ..
  2214.         call loaddir_filinfo ;out: CY=end dir, or else Z="." or ".."
  2215.         call loaddir_filinfo ;out: CY=end dir, or else Z="." or ".."
  2216. nv_batch1
  2217.         ;ld de,fcb
  2218.         ;OS_SETDTA
  2219.         ;ld de,fcbmask
  2220.         ;OS_FSEARCHNEXT
  2221.         ;or a
  2222.         ;jr nz,nv_batch_nofiles
  2223.         call loaddir_filinfo ;out: CY=end dir, or else Z="." or ".."
  2224.         jr c,nv_batch_nofiles
  2225.         ;jr z,nv_batch1
  2226.  
  2227.         ld hl,filinfo+FILINFO_LNAME
  2228.         ld a,(hl)
  2229.         or a
  2230.         jr nz,$+5
  2231.         ld hl,filinfo+FILINFO_FNAME
  2232.         ld (fcb+FCB_EXTENTNUMBERHI),hl
  2233.         ;ex de,hl
  2234.         ;ld hl,fcb_filename
  2235.         ;call dotname_to_cpmname ;de -> hl
  2236.  
  2237.         ld a,(filinfo+FILINFO_FATTRIB)
  2238.         ld (fcb_attrib),a
  2239.          ld a,(dirpg)
  2240.          ld (fcb+FCB_EXTENTNUMBERLO),a ;NU
  2241.  
  2242. nv_batch_proc=$+1
  2243.         call proceditcmd_copy_fcb
  2244.         jr nv_batch1
  2245.  
  2246. nv_batch_nofiles
  2247.         or a
  2248.         ld hl,(processfiles_proc)
  2249.         ld de,proc_del_file
  2250.         sbc hl,de
  2251.         jp nz,nv_batch ;if not del
  2252.         ld a,'/'
  2253.         ld (dir2_buf),a
  2254.         xor a
  2255.         ld (dir2_buf+1),a
  2256.         ld de,dir2_buf
  2257.         OS_CHDIR
  2258.         ld de,dir_buf
  2259.         OS_DELETE
  2260.         jp nv_batch
  2261.  
  2262. skipword_hl
  2263.         ld a,(hl)
  2264.         or a
  2265.         ret z
  2266.         cp ' '
  2267.         ret z
  2268.         inc hl
  2269.         jr skipword_hl
  2270.  
  2271. proceditcmd_copy
  2272.         bit 0,(hl)
  2273.         ret z
  2274.         call getfcbfromhl
  2275.  
  2276.         ld hl,proceditcmd_copy_fcb
  2277.         ld (nv_batch_proc),hl
  2278.  
  2279. proceditcmd_copy_fcb
  2280. ;нельзя CHDIR, потому что это вызывается в цикле чтения директории в nv_batch1!
  2281.         ld hl,proceditcmd_copy_q
  2282.         push hl
  2283.         ;ld de,dir_buf
  2284.         ;OS_CHDIR
  2285.  
  2286.        if 1==0
  2287.         ld de,filenametext ;wordbuf ;de=drive/path/file
  2288.         ld hl,fcb_filename
  2289.         call cpmname_to_dotname
  2290.        else
  2291.         ld a,(fcb+FCB_EXTENTNUMBERLO)
  2292.         SETPG32KHIGH
  2293.         ld hl,(fcb+FCB_EXTENTNUMBERHI)
  2294.         ld de,filenametext
  2295.         ld bc,63*256+0
  2296.         call prdirfile_copyfn
  2297.        endif
  2298.  
  2299.         ld a,(fcb_attrib)
  2300.         and FATTRIB_DIR
  2301.         jp nz,nv_copydir_add
  2302.  
  2303.         ld de,dir3_buf;wincopy_dest
  2304.         push de
  2305.         ld bc,filenametext
  2306.         ld hl,dir2_buf
  2307.         call nv_makefilepath_hltode
  2308.         pop hl
  2309.          ;ld hl,dir3_buf
  2310.          ld de,wincopy_dest
  2311.          push de
  2312.          ld bc,64
  2313.          ldir
  2314.          pop hl
  2315.         ;ld hl,wincopy_dest
  2316.         call nv_fillpathspaces_hl
  2317.         ld hl,wincopy2
  2318.         call upwindow_text
  2319.  
  2320.         ld de,dir3_buf;wincopy_src ;update copy window
  2321.         push de
  2322.         ld bc,filenametext
  2323.         ld hl,dir_buf
  2324.         call nv_makefilepath_hltode
  2325.         pop hl
  2326.          ;ld hl,dir3_buf
  2327.          ld de,wincopy_src
  2328.          push de
  2329.          ld bc,64
  2330.          ldir
  2331.          pop hl
  2332.         ;ld hl,wincopy_src
  2333.         call nv_fillpathspaces_hl
  2334.  
  2335.         ld de,dir3_buf
  2336.         ;push de
  2337.         ;ld bc,filenametext
  2338.         ;ld hl,dir_buf
  2339.         ;call nv_makefilepath_hltode
  2340.         ;pop de
  2341.         push de
  2342.         OS_OPENHANDLE
  2343.         pop de
  2344.         or a
  2345.         ret nz ;jp nz,cmd_error_wrongfile
  2346.         ld a,b
  2347.         ld (cmd_copy_close_file1_handle),a
  2348.         ld hl,cmd_copy_close_file1
  2349.         push hl
  2350.  
  2351.         ;ld de,filenametext
  2352.         OS_GETFILETIME ;ix=date, hl=time
  2353.         ld (proceditcmd_copy_time),hl
  2354.         ld (proceditcmd_copy_date),ix
  2355.  
  2356.         ;ld de,dir2_buf
  2357.         ;OS_CHDIR
  2358.         ld de,dir3_buf;wincopy_dest ;256 bytes
  2359.          push de
  2360.          ld bc,filenametext
  2361.          ld hl,dir2_buf
  2362.          call nv_makefilepath_hltode
  2363.          pop de
  2364.         ;ld de,filenametext;swordbuf2 ;de=drive/path/file
  2365.         OS_CREATEHANDLE
  2366.         or a
  2367.         ret nz ;jp nz,cmd_error_cant_copy
  2368.         ld a,b
  2369.         ld (cmd_copy_close_file2_handle),a
  2370.         ld hl,cmd_copy_close_file2
  2371.         push hl
  2372. cmd_copy0
  2373.         ld hl,copybuf_sz
  2374.         ld de,copybuf
  2375.         ld a,(cmd_copy_close_file1_handle)
  2376.         ld b,a
  2377. ;B = file handle, DE = Buffer address, HL = Number of bytes to read
  2378.         push de
  2379.         OS_READHANDLE
  2380. ;HL = Number of bytes actually read, A=error
  2381.         pop de
  2382.         ld a,h
  2383.         or l
  2384.         ret z ;0 bytes remain
  2385.         ld a,(cmd_copy_close_file2_handle)
  2386.         ld b,a
  2387. ;B = file handle, DE = Buffer address, HL = Number of bytes to write
  2388.         OS_WRITEHANDLE
  2389.         jr cmd_copy0
  2390.  
  2391. cmd_copy_close_file1
  2392. cmd_copy_close_file1_handle=$+1
  2393.         ld b,0
  2394.         OS_CLOSEHANDLE
  2395.         ret
  2396.  
  2397. cmd_copy_close_file2
  2398. cmd_copy_close_file2_handle=$+1
  2399.         ld b,0
  2400.         OS_CLOSEHANDLE
  2401. proceditcmd_copy_time=$+1
  2402.         ld hl,0
  2403. proceditcmd_copy_date=$+2
  2404.         ld ix,0
  2405.         ld de,dir3_buf;wincopy_dest;filenametext
  2406.         OS_SETFILETIME
  2407.         ret
  2408.  
  2409. proceditcmd_copy_q
  2410. filescopied=$+1
  2411.         ld hl,0
  2412.          if 1==0
  2413.         inc hl
  2414.         ld (filescopied),hl
  2415.         ;ld bc,32
  2416.         ;ex de,hl ;ld de,(percentcopyfile)
  2417.         ;call mulbcde_ahl
  2418.         add hl,hl
  2419.         add hl,hl
  2420.         add hl,hl
  2421.         add hl,hl
  2422.         add hl,hl
  2423.         push hl
  2424.         ld ix,(curpanel)
  2425. ;ix = panel
  2426.         call getmarkedfiles ;out: hl'hl = files
  2427.         ex de,hl ;de=files
  2428.         pop hl ;filescopied*32
  2429.         call divhlde
  2430.         ld a,l
  2431.         or a
  2432.         ret z
  2433.         ld b,a
  2434.         ld de,PROGRESBARWINXY+#0102
  2435. proceditcmd_copy_q_progress0      
  2436.         push de
  2437.         push bc
  2438.         SETXY_
  2439.         ;ld e,#ff
  2440.         ;OS_PRATTR
  2441.         ld a,'*'
  2442.         PRCHAR_
  2443.         pop bc
  2444.         pop de
  2445.         inc e
  2446.         djnz proceditcmd_copy_q_progress0
  2447.          endif
  2448.         ret
  2449.  
  2450. mulbcde_ahl
  2451. ;bc * de результат в ahl
  2452.         xor a
  2453.         ld h,a
  2454.         ld l,a
  2455.         dup 8
  2456.         rlc b
  2457.         jr nc,$+5 ; c - был перенос, nc - не было переноса    
  2458.         add hl,de
  2459.         adc a,0
  2460.         add hl,hl
  2461.         rla
  2462.         edup
  2463.         dup 7
  2464.         rlc c
  2465.         jr nc,$+5 ; c - был перенос, nc - не было переноса    
  2466.         add hl,de
  2467.         adc a,0
  2468.         add hl,hl
  2469.         rla
  2470.         edup
  2471.         rlc c
  2472.         ret nc
  2473.         add hl,de
  2474.         adc a,0
  2475.         ret
  2476.  
  2477. ;hl / de результат в hl
  2478. divhlde
  2479.         ld c,h
  2480.         ld a,l
  2481.         ld hl,0
  2482.         ld b,16
  2483. ;don't mind carry
  2484. _DIV0.
  2485. ;shift left hlca
  2486.         rla
  2487.         rl c
  2488.         adc hl,hl
  2489. ;no carry
  2490. ;try sub
  2491.         sbc hl,de
  2492.         jr nc,$+3
  2493.         add hl,de
  2494. ;carry = inverted bit of result
  2495.         djnz _DIV0.
  2496.         rla
  2497.         cpl
  2498.         ld l,a
  2499.         ld a,c
  2500.         rla
  2501.         cpl
  2502.         ld h,a
  2503.         ret
  2504.  
  2505. editcmd_0
  2506.         call ifcmdnonempty_typedigit
  2507. editcmd_quit
  2508.         ld de,_COLOR_RED
  2509.         call nv_setcolor
  2510.         ld hl,winquit
  2511.         call prwindow_waitkey ;CY=OK
  2512.         jp nc,editcmd_reprintall_keepcursor;editcmd_reprintall
  2513.         QUIT
  2514.  
  2515. ifcmdnonempty_typedigit
  2516. ;keeps ix
  2517.         ld c,a
  2518.         ld a,(cmdbuf)
  2519.         or a
  2520.         ld a,c
  2521.         ret z ;cmd is empty
  2522.          pop bc ;skip return to editcmdN
  2523.         jp editcmd_typein
  2524.  
  2525. editcmd_typeword
  2526.         call getfcbundercursor
  2527.         ld hl,fcb_filename
  2528.         ld de,tnewfilename
  2529.         call cpmname_to_dotname ;de указывает на терминатор
  2530.         ld hl,cmdbuf
  2531.         call strlen ;hl=length
  2532.         ld bc,MAXCMDSZ-11
  2533.         or a
  2534.         sbc hl,bc
  2535.         ret nc ;некуда вводить
  2536.         add hl,bc
  2537.         ld bc,cmdbuf
  2538.         add hl,bc
  2539.         ex de,hl ;de=end of cmdbuf
  2540.         ld a,(cmdbuf)
  2541.         or a
  2542.         ld hl,tnewfilename
  2543.         jr z,editcmd_typeword_empty
  2544.         dec hl ;с пробелом
  2545. editcmd_typeword_empty
  2546.         call strcopy;nv_strcopy_hltode ;out: hl,de at terminator
  2547.         ld hl,cmdbuf
  2548.         call strlen ;hl=length
  2549.         ld a,l
  2550.         ld (curcmdx),a
  2551.         ret
  2552.  
  2553. windrv
  2554.         dw 0x0003 ;de=yx
  2555.         dw 256*(3+NDRIVES)+28 ;0x0809 ;bc=hgt,wid
  2556.         db "Drive",0
  2557.         db 3 ;next line
  2558.         db "  A: - 1st Floppy",0,3
  2559.         db "  B: - 2nd Floppy",0,3
  2560.         db "  C: - 3rd Floppy",0,3
  2561.         db "  D: - 4th Floppy",0,3
  2562.         db "  E: - IDE Master p.1",0,3
  2563.         db "  F: - IDE Master p.2",0,3
  2564.         db "  G: - IDE Master p.3",0,3
  2565.         db "  H: - IDE Master p.4",0,3
  2566.         db "  I: - IDE Slave p.1",0,3
  2567.         db "  J: - IDE Slave p.2",0,3
  2568.         db "  K: - IDE Slave p.3",0,3
  2569.         db "  L: - IDE Slave p.4",0,3
  2570.         db "  M: - SD Z-controller",0,3
  2571.         db "  N: - SD NeoGS",0,3
  2572.         db "  O: - USB flash zx-net",0,3
  2573.         db 0 ;end of window
  2574.  
  2575. winmkdir
  2576.         dw 0x0a07 ;de=yx
  2577.         dw 0x0544 ;bc=hgt,wid
  2578.         db "Create new directory:",0
  2579.         db 3 ;next line
  2580.         db 2 ;print outer text
  2581.         dw tnewfilename
  2582.         db 0 ;end of window
  2583.  
  2584. winrename
  2585.         dw 0x0a07 ;de=yx
  2586.         dw 0x0544 ;bc=hgt,wid
  2587.         db "Rename file:",0
  2588.         db 3 ;next line
  2589.         db 2 ;print outer text
  2590.         dw tnewfilename
  2591.         db 0 ;end of window
  2592.  
  2593. wincopy
  2594.         dw 0x0a07 ;de=yx
  2595.         dw 0x0544 ;bc=hgt,wid
  2596.         db "Copy ",0
  2597.         db 1
  2598.         db " file(s)/dir(s) to:",0
  2599.         db 3 ;next line
  2600.         db 2 ;print outer text
  2601.         dw dir2_buf
  2602.         db 0 ;end of window
  2603.  
  2604.         db ' ' ;для typeword - перед tnewfilename
  2605. tnewfilename
  2606.         ds 64 ;max filename size+terminator
  2607.  
  2608. winquit
  2609.         dw 0x0a1f ;de=yx
  2610.         dw 0x0515 ;bc=hgt,wid
  2611.         db 3 ;next line
  2612.         db "Quit Nedovigator?",0
  2613.         db 0 ;end of window
  2614.  
  2615. windel
  2616.         dw 0x0919 ;de=yx
  2617.         dw 0x051f ;bc=hgt,wid
  2618.         db 3 ;next line
  2619.         db "Delete ",0
  2620.         db 1 ;nfiles
  2621.         db " file(s)?",0
  2622.         db 0 ;end of window
  2623.  
  2624. wincopy2
  2625.         dw 0x0706 ;de=yx
  2626.         db 68,8 ;wid,hgt
  2627.         db 3 ;next line
  2628.         db " Copying",0,3
  2629. wincopy_src
  2630.         db "                                                                ",0,3
  2631.         db " to",0,3
  2632. wincopy_dest
  2633.         db "                                                                ",0
  2634.         db 0 ;end of window
  2635.  
  2636. windel2
  2637.         dw 0x0706 ;de=yx
  2638.         db 68,6 ;bc=wid,hgt
  2639.         db " Deleting",0,3
  2640.         db 3 ;next line
  2641. windel2_file
  2642.         db "                                                                ",0
  2643.         db 0 ;end of window
  2644.  
  2645. windrverr
  2646.         dw 0x040f ;de=yx
  2647.         dw 0x0510 ;bc=hgt,wid
  2648.         db 3 ;next line
  2649.         db "Drive error!",0
  2650.         db 0 ;end of window
  2651.  
  2652. tdotdot
  2653.         dw "..",0
  2654.  
  2655.         STRUCT PANEL
  2656. xy              WORD
  2657. catbuf          WORD ;TODO remove
  2658. poipg           BYTE
  2659. pointers        WORD ;TODO remove
  2660. pgadd           BYTE ;0/DIRPAGES
  2661. curpgfcbpoi     WORD
  2662. curpglnamepoi   WORD
  2663. drawtableunneeded BYTE
  2664. totalsize       DWORD
  2665. files           WORD ;visible files
  2666. filesdirs       WORD ;files+dirs (no ".", "..")
  2667. markedfiles     WORD
  2668. markedsize      DWORD
  2669. dirpos          WORD
  2670. dirscroll       WORD
  2671. dirviewmode     BYTE
  2672. dirsortproc     WORD
  2673. dirsortmode     BYTE
  2674. dir             BLOCK MAXPATH_sz
  2675.         ENDS
  2676. ;PANEL_sz=13+MAXPATH_sz
  2677.  
  2678. leftpanel PANEL
  2679. rightpanel PANEL
  2680.  
  2681. ;<0x4000 for hobeta
  2682. fcb
  2683.         ds FCB_sz
  2684. fcb_filename=fcb+FCB_FNAME        
  2685. fcb_attrib=fcb+FCB_FATTRIB
  2686.  
  2687. ;TODO kill (used in batch)
  2688. fcbmask
  2689.         db 0
  2690.         db "???????????"
  2691.         ds FCB_sz-11-1
  2692. fcbmask_filename=fcbmask+FCB_FNAME        
  2693.  
  2694. fcb2
  2695.         ds FCB_sz
  2696. fcb2_filename=fcb2+FCB_FNAME        
  2697.  
  2698. cmd_filename
  2699.         db "cmd     com"
  2700. ext_filename
  2701.         db "nv      ext"
  2702. texted_filename
  2703.         db "texted  com"
  2704.  
  2705. filenametext ;for change dir, rename
  2706.         ds 64 ;max filename size+terminator
  2707.  
  2708. ext
  2709.         ds 3 ;TODO объединить с filenametext
  2710.  
  2711. copybuf=0x4000 ;нельзя 0xc000 - поверх какой-нибудь директории (а она используется при копировании) ;0x8000 можно только после выставления страницы там
  2712. copybuf_sz=0x4000 ;$-copybuf
  2713.  
  2714. dir_batch_pointer db 0,0
  2715. savepg db 0,0
  2716. dirpg db 0,0
  2717.  
  2718. washobetarunner
  2719. ;pgsys=pagexor-10
  2720. ;pgfatfs=pagexor-9
  2721. ;pgtrdosfs=pagexor-8
  2722. ;pgkillable=pagexor-4 ;в 128K памяти, т.к. можно портить
  2723.         disp hobetarunner ;in pgkillable
  2724. ;$c loaded in pages 4,1,0
  2725. ;only ATM2 ports here!
  2726.         ;di ;было выше
  2727.         ld a,0x7f-5
  2728.         ld bc,0xbff7
  2729.         out (c),a ;4,5,0
  2730.         ld a,0x7f-4
  2731.         ld b,0xff;f7
  2732.         out (c),a ;4,5,4
  2733.         ld hl,0xc000
  2734.         ld de,0x8000
  2735.         ld bc,0x4000
  2736.         ldir ;pg4 -> pg5
  2737.         ld a,0x7f-8;pgtrdosfs ;нельзя TOPDOWNMEM!!!
  2738.         ld bc,0xfff7
  2739.         out (c),a ;4,5,8
  2740.         ld hl,0x1c00+0xc000
  2741.         ld de,0x1c00+0x8000
  2742.         ld bc,0x400
  2743.         ldir ;restore sysvars
  2744.         ld a,0x7f-2
  2745.         ld bc,0xbff7
  2746.         out (c),a
  2747.         ld a,0x7f-1
  2748.         ld b,0xff;f7
  2749.         out (c),a
  2750.         ld hl,0xc000
  2751.         ld de,0x8000
  2752.         ld bc,0x4000
  2753.         ldir ;pg1 -> pg2
  2754.         ld a,0x7f-0+0x80
  2755.         ld bc,0xfff7
  2756.         out (c),a
  2757.         xor a;ld a,0x00
  2758.         ld bc,0x7ffd
  2759.         out (c),a
  2760.         ld a,0x81 ;128 basic (with 7ffd)
  2761.         ld bc,0x3ff7
  2762.         out (c),a
  2763.         ld a,0x7f-5
  2764.         ld b,0x7f;f7
  2765.         out (c),a
  2766. ;128: pages DOS,5,2,0(7ffd)
  2767.         ld a,0x10
  2768.         ld bc,0x7ffd
  2769.         out (c),a
  2770. ;48: pages A,4,4,4
  2771.         ld a,0x7f-5
  2772.         ld bc,0x7ff7
  2773.         out (c),a
  2774.         ld a,0x7f-2
  2775.         ld b,0xbf;f7
  2776.         out (c),a
  2777.         ld a,0x7f-0+0x80
  2778.         ld b,0xff;f7
  2779.         out (c),a
  2780.         ld a,0x83 ;48 basic switchable to DOS
  2781.         ld b,0x3f;f7
  2782.         out (c),a
  2783. ;48: pages DOS,5,2,0(7ffd)
  2784.  
  2785.         LD A,0b10101011 ;6912
  2786.         ld bc,0xff77 ;shadow ports off, palette off
  2787.         out (c),a
  2788.         ld sp,0x6000
  2789.         ld iy,23610
  2790.         ld a,0xc9
  2791.         ld (0x5cc2),a
  2792.         ei
  2793. hobetarunner_jp=$+1
  2794.         jp 0x6000
  2795.         ent
  2796. hobetarunner_sz=$-washobetarunner
  2797.  
  2798. wordfiles
  2799.         db "1234567890 files ";,0
  2800. wordbytes
  2801.         db "1234567890 bytes ",0
  2802. emptypath=$-1
  2803.         ;db 0
  2804.  
  2805. filinfo
  2806.         ds FILINFO_sz
  2807.  
  2808.         include "nvsort.asm"
  2809.         include "heapsort.asm"
  2810.  
  2811.         include "nvjptbl.asm"
  2812.         include "nvunit.asm"
  2813.         include "nveditln.asm"
  2814.         include "nvview.asm"
  2815.         include "nvhexed.asm"
  2816.         include "nvfind.asm"
  2817.  
  2818.         include "prdword.asm"
  2819.         include "cmdpr.asm"
  2820.         include "../_sdk/stdio.asm"
  2821.  
  2822.         align 256
  2823. searchbuf
  2824. SEARCHBUF_SZ=128 ;2 таких
  2825. file_buf
  2826. dir_buf
  2827.         ds 128
  2828. file_buf_end=$-1
  2829. dir2_buf
  2830.         ds 128        
  2831. dir3_buf
  2832.         ds 256 ;max size for no bugs
  2833.  
  2834.         align 256
  2835. HS_strpg
  2836.         ds 256;DIRPAGES*2+2 ;по 1 байту на маркеры "0"
  2837.         align 256
  2838. textpages
  2839.         ds 256
  2840. twinto866
  2841.         incbin "../_sdk/codepage/winto866"
  2842. cmd_end
  2843.  
  2844.         display "nv size ",/d,cmd_end-cmd_begin," bytes"
  2845.  
  2846.         savebin "nv.com",cmd_begin,cmd_end-cmd_begin
  2847.  
  2848.         LABELSLIST "../../us/user.l"
  2849.