?login_element?

Subversion Repositories NedoOS

Rev

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

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