?login_element?

Subversion Repositories NedoOS

Rev

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

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