?login_element?

Subversion Repositories NedoOS

Rev

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