Subversion Repositories NedoOS

Rev

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