?login_element?

Subversion Repositories NedoOS

Rev

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