?login_element?

Subversion Repositories NedoOS

Rev

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

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