Subversion Repositories NedoOS

Rev

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

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