?login_element?

Subversion Repositories NedoOS

Rev

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

  1.         DEVICE ZXSPECTRUM128
  2.         include "../_sdk/sys_h.asm"
  3.  
  4. HEAPSORT_LH=1 ;byte order in poiters: LSB,HSB
  5.  
  6. MAXCMDSZ=COMMANDLINE_sz-1-4 ;not counting terminator (-4 for "cmd ")
  7.  
  8. TSPACES_FILENAME_SZ=43
  9.  
  10.         if PRSTDIO
  11. _COLOR=0x0007;0x07
  12. _PANELCOLOR=0x040f;0x4f
  13. _PANELDIRCOLOR=0x040f;0x4f
  14. _PANELEXECOLOR=0x040a;0x4c
  15. _PANELFILECOLOR=0x0407;0b00001111;0xf
  16. _PANELSELECTCOLOR=0x040b;0x4e
  17. _CURSORCOLOR=0x0600;0x28
  18. _FILECURSORCOLOR=0x0600;0x28
  19. _COLOR_RED=0x0107;0x17
  20. _COLOR_DIALOG=0x0300;0700 не видно курсор;0x38
  21. _HINTCOLOR1=0x0007;7
  22. _HINTCOLOR0=0x0600;5*8
  23.         else
  24. _COLOR=0x07
  25. _PANELCOLOR=0x4f
  26. _PANELDIRCOLOR=0x4f
  27. _PANELEXECOLOR=0x4c
  28. _PANELFILECOLOR=0x0f
  29. _PANELSELECTCOLOR=0x4e
  30. _CURSORCOLOR=0x28
  31. _FILECURSORCOLOR=0x28
  32. _COLOR_RED=0x17
  33. _COLOR_DIALOG=0x30
  34. _HINTCOLOR1=7
  35. _HINTCOLOR0=5*8
  36.         endif
  37.  
  38. ;8192fcbs*32bytes*2panels = 32 pages
  39. DIRPAGES=16
  40. FIRSTDIRPAGEFORRIGHTPANEL=128
  41.  
  42. NDRIVES=15
  43.  
  44. catbuf_left=0xc000
  45. catbuf_right=0xc000
  46. FILES_POINTERS_left=0xc000;0x3700
  47. FILES_POINTERS_right=0xc000;0x3b00
  48.  
  49. txtscrhgt=25
  50. txtscrwid=80
  51. CMDLINEY=txtscrhgt-2
  52. CONST_HGT_TABLE=txtscrhgt-4
  53. PANELDIRCHARS37=37
  54. left_panel_xy=0x0000
  55. right_panel_xy=0x0028
  56. firstfiley=left_panel_xy/256 + 1
  57. PROGRESBARWINXY=0x0f16 ;0x0919 + 051f ;de=yx
  58. PROGRESBARWINHGTWID=0x0324 ;0x051f ;bc=hgt,wid
  59.  
  60.         macro MYPRCHAR
  61.        if PRSTDIO
  62.         PRCHAR_
  63.        else
  64.         PRCHAR
  65.        endif
  66.         endm
  67.  
  68.         macro MYSETXY
  69.        if PRSTDIO
  70.         SETXY_
  71.        else
  72.         OS_SETXY
  73.        endif
  74.         endm
  75.  
  76.         macro PGW2elpg0
  77.         ;LD A,(HS_elpg)
  78.         ld a,(ix+PANEL.poipg)
  79.         SETPG32KLOW
  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.         SETPG32KLOW
  92.         endm
  93.  
  94.         macro PGW2strpg
  95.         ld ($+4),a
  96.         LD A,(HS_strpg)
  97.         SETPG32KLOW
  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.         SETPG32KHIGH
  110.         endm
  111.  
  112.         macro PGW3strpg
  113.         ld ($+4),a
  114.         LD A,(HS_strpg)
  115.         SETPG32KHIGH
  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}InsNam{ 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.         SETPG32KHIGH
  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.         ;SETPG32KHIGH
  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.         SETPG32KHIGH
  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. controlloop_nokey
  975.        if PRSTDIO
  976.         call yieldgetkeyloop
  977.        else
  978.         YIELDGETKEYLOOP
  979.        endif
  980.          or a
  981.          jr z,controlloop_nokey ;TODO handle mouse events
  982.         push af
  983.         ld ix,(curpanel)
  984.         call getfcbaddrundercursor
  985.         ;push hl
  986.         ;pop ix
  987.         call colorfile
  988.         ex de,hl ;hl=color
  989.         ld a,(ix+PANEL.files)
  990.         or (ix+PANEL.files+1)
  991.         call nz,prfilecursor_reprintfile ;remove file cursor if more than 0 files
  992.         ;call cmdcalccurxy
  993.         ;call nv_setxy
  994.         ;ld e,COLOR;7
  995.         ;OS_PRATTR ;remove cursor
  996.          ld de,_COLOR
  997.          call nv_setcolor ;even if we didn't reprint command line, draw windows with its color
  998.         pop af
  999.         ld hl,tnvcmds
  1000.         ld bc,nnvcmds
  1001.         cpir
  1002.         jp nz,editcmd_keyfail
  1003. ;bc=nnvcmds-(#команды+1) = 0..(nnvcmds-1)
  1004.         add hl,bc
  1005. ;hl=tnvcmds+nnvcmds
  1006.         add hl,bc
  1007.         add hl,bc
  1008. ;hl=tnvcmds+nnvcmds+ 2*(nnvcmds-(#команды+1))
  1009.         ld c,(hl)
  1010.         inc hl
  1011.         ld h,(hl)
  1012.         ld l,c
  1013.         push hl ;jump addr
  1014.         ld hl,cmdbuf
  1015.         ld ix,(curpanel)
  1016.         ret
  1017. editcmd_keyfail
  1018.         cp 0x20
  1019.         ret c ;прочие системные кнопки не нужны
  1020. editcmd_typein
  1021. ;keeps ix
  1022.         ld e,a
  1023.         ld hl,cmdbuf
  1024.         call strlen ;hl=length
  1025.         ld bc,MAXCMDSZ
  1026.         or a
  1027.         sbc hl,bc
  1028.         ret nc ;некуда вводить
  1029.         call cmdcalctextaddr ;hl=addr, a=curcmdx
  1030.         inc a
  1031.         ld (curcmdx),a
  1032.         jp strinsch
  1033.  
  1034. editcmd_space
  1035.         ld a,(cmdbuf)
  1036.         or a
  1037.         ld a,' '
  1038.         jr nz,editcmd_typein
  1039.         call getfcbaddrundercursor;hl=addr fcb ;ix=curpanel
  1040.         call isthisdotdir_hl
  1041.         call nz,changemark_hl
  1042.         push hl
  1043.         call setfilecursorxy
  1044.         pop hl
  1045.         call prdirfile
  1046.         ld ix,(curpanel)
  1047.         call drawpanelfilesandsize
  1048.         jp editcmd_down
  1049.        
  1050. editcmd_backspace
  1051.         call cmdcalctextaddr ;hl=addr, a=curcmdx
  1052.         or a
  1053.         jr z,editcmddirback;editcmdok ;нечего удалять
  1054.         dec a
  1055.         ld (curcmdx),a
  1056.         jp strdelch
  1057. editcmd_del
  1058.         call cmdcalctextaddr ;hl=addr, a=curcmdx
  1059.         or a
  1060.         ret z ;нечего удалять вправо
  1061.         inc hl
  1062.         jp strdelch
  1063.  
  1064. ;hl = poi to filename in string
  1065. ;out: de = after last slash
  1066. findlastslash.
  1067. nfopenfnslash.
  1068.         ld d,h
  1069.         ld e,l ;de = after last slash
  1070. nfopenfnslash0.
  1071.         ld a,[hl]
  1072.         inc hl
  1073.         or a
  1074.         ret z
  1075.         cp '/'
  1076.         jr nz,nfopenfnslash0.
  1077.         jr nfopenfnslash.
  1078.        
  1079. editcmddirback
  1080. editcmddirback_go
  1081.         call setpaneldir
  1082.         ld de,tdotdot
  1083.         OS_CHDIR
  1084. ;взять имя директории из последнего элемента paneldir
  1085.         call getcurpaneldir_hl
  1086.         call findlastslash. ;out: de = after last slash
  1087.         ex de,hl
  1088.         ld de,filenametext
  1089.         call strcopy
  1090.         ld hl,(curpanel)
  1091.         push hl
  1092.         call editcmd_setpaneldirfromcurdir_panelhl
  1093.         pop ix ;ld ix,(curpanel)
  1094.         call readdir
  1095.         call sortfiles
  1096. ;найти имя директории
  1097.         ;ld ix,(curpanel)
  1098.         call getfiles
  1099.         ld b,h
  1100.         ld c,l
  1101.         ld hl,0
  1102. editcmddirbackfind0
  1103.         push bc
  1104.         push hl
  1105.         call getfcbaddrunderhl
  1106.         ld de,FCB_EXTENTNUMBERLO
  1107.         add hl,de
  1108.         ld a,(hl)
  1109.         inc hl
  1110.         inc hl
  1111.         ld e,(hl)
  1112.         inc hl
  1113.         ld d,(hl)
  1114.         SETPG32KHIGH
  1115.         ld hl,filenametext
  1116.         call strcp
  1117.         pop hl
  1118.         pop bc
  1119.         jr z,editcmddirback_ok
  1120.         cpi
  1121.         jp pe,editcmddirbackfind0
  1122.         ld h,b
  1123.         ld l,c ;error!!! not found!!!
  1124. editcmddirback_ok
  1125. ;hl=номер элемента директории
  1126.         call nv_setcursor_hl ;установить на него курсор
  1127.  
  1128.         call drawpanel_with_files
  1129.         jp editcmd_readprompt_setendcmdx
  1130.  
  1131. editcmd_left
  1132.         ld a,(curcmdx)
  1133.         or a
  1134.         ret z ;некуда влево
  1135.         dec a
  1136.         ld (curcmdx),a
  1137.         ret
  1138.  
  1139. editcmd_right
  1140.         call cmdcalctextaddr ;hl=addr, a=curcmdx
  1141.         inc (hl)
  1142.         dec (hl)
  1143.         ret z ;некуда вправо, стоим на терминаторе
  1144.         inc a
  1145.         ld (curcmdx),a
  1146.         ret
  1147.  
  1148. editcmd_pageDown
  1149.         call count_filecursor_y
  1150.         cp CONST_HGT_TABLE-1+firstfiley -1 ;???
  1151.         jr c,editcmd_pageDown_nolastvisible ;not last visible file
  1152.         call nv_getdirpos_hl
  1153.         ld bc,CONST_HGT_TABLE
  1154.         add hl,bc
  1155. editcmd_pageDown_end_q        
  1156.         call cpfiles_setdirpos ;hl=dirpos
  1157.         ld bc,CONST_HGT_TABLE-1
  1158.         xor a
  1159.         sbc hl,bc
  1160.         jr nc,$+4
  1161.         ld h,a
  1162.         ld l,a;0
  1163.         jr editcmd_pageUpq
  1164. editcmd_pageDown_nolastvisible
  1165.         call nv_getdirscroll_bc
  1166.         ld hl,CONST_HGT_TABLE-1
  1167.         add hl,bc ;last visible file
  1168.         call cpfiles_setdirpos
  1169. editcmd_clearkbddrawpanel
  1170.         call drawpanel_files
  1171.         jp clear_keyboardbuffer ;TODO почему не работает?
  1172.  
  1173. editcmd_pageUp
  1174.         call count_filecursor_y
  1175.         cp firstfiley
  1176.         jr nc,editcmd_pageDown_nofirstvisible ;not first visible file
  1177.         call nv_getdirpos_hl
  1178.         ld bc,CONST_HGT_TABLE-1
  1179.         xor a
  1180.         sbc hl,bc
  1181.         jr nc,$+4
  1182.         ld h,a
  1183.         ld l,a;0
  1184.         call nv_setdirpos_hl
  1185. editcmd_pageUpq
  1186.         ld b,h
  1187.         ld c,l
  1188.         call nv_setdirscroll_bc
  1189.         jr editcmd_clearkbddrawpanel ;jp drawpanel_files      
  1190. editcmd_pageDown_nofirstvisible
  1191.         call nv_getdirscroll_bc
  1192.         ld h,b
  1193.         ld l,c
  1194.         call nv_setdirpos_hl
  1195.         jr editcmd_clearkbddrawpanel ;jp drawpanel_files      
  1196.  
  1197. editcmd_End
  1198.         ld hl,-1 ;>=files
  1199.         jp editcmd_pageDown_end_q
  1200.  
  1201. editcmd_Home
  1202.         xor a
  1203.         ld h,a
  1204.         ld l,a;0
  1205.         call nv_setdirpos_hl
  1206.         jr editcmd_pageUpq
  1207.  
  1208. editcmd_up
  1209.          ld hl,controlloop_noprline
  1210.          ex (sp),hl
  1211.         call nv_getdirpos_hl
  1212.         ld a,h
  1213.         or l
  1214.         ret z ;first file
  1215.         dec hl
  1216.         call nv_setdirpos_hl
  1217.         call count_filecursor_y
  1218.         cp firstfiley-2;or a
  1219.         ret nz ;not above first visible file
  1220.         call nv_getdirscroll_bc
  1221.         dec bc
  1222.         call nv_setdirscroll_bc
  1223.          push bc
  1224.         call nv_getpanelxy_de
  1225.         inc d
  1226.         push de
  1227.         ld hl,CONST_HGT_TABLE*256 + 40
  1228.        if PRSTDIO
  1229.         call scrolldown
  1230.        else
  1231.         OS_SCROLLDOWN
  1232.        endif
  1233.         pop de
  1234.         inc e
  1235.         call nv_setxy ;keeps de,hl,ix
  1236.          pop hl ;file number
  1237.         call getfcbaddrunderhl
  1238.         jp prdirfile
  1239.  
  1240. editcmd_down
  1241.          ld hl,controlloop_noprline
  1242.          ex (sp),hl
  1243.         call nv_getdirpos_hl
  1244.         call nv_getpanelfiles_bc
  1245.         inc hl
  1246.         or a
  1247.         sbc hl,bc
  1248.         add hl,bc
  1249.         ret z ;last file
  1250.         call nv_setdirpos_hl
  1251.         call count_filecursor_y
  1252.         cp CONST_HGT_TABLE-1+firstfiley
  1253.         ret c ;not last visible file
  1254.         call nv_getdirscroll_bc
  1255.         inc bc
  1256.         call nv_setdirscroll_bc
  1257.         ld hl,CONST_HGT_TABLE-1
  1258.         add hl,bc
  1259.         push hl
  1260.         call nv_getpanelxy_de
  1261.         inc d
  1262.         push de
  1263.         ld hl,CONST_HGT_TABLE*256 + 40
  1264.        if PRSTDIO
  1265.         call scrollup
  1266.        else
  1267.         OS_SCROLLUP
  1268.        endif
  1269.         pop de
  1270.         ld a,d
  1271.         add a,CONST_HGT_TABLE-1
  1272.         ld d,a
  1273.         inc e
  1274.         call nv_setxy ;keeps de,hl,ix
  1275.          pop hl ;file number
  1276.         call getfcbaddrunderhl
  1277.         jp prdirfile
  1278.  
  1279. editcmd_ss1
  1280.         ld hl,comparefilename
  1281.         jr editcmd_setsortmodehl
  1282. editcmd_ss2
  1283.         ld hl,compareext
  1284.         jr editcmd_setsortmodehl
  1285. editcmd_ss3
  1286.         ld hl,comparesize
  1287.         jr editcmd_setsortmodehl
  1288. editcmd_ss4
  1289.         ld hl,comparedate
  1290.         jr editcmd_setsortmodehl
  1291. editcmd_ss5
  1292.         ld hl,compareempty
  1293. editcmd_setsortmodehl
  1294.         call ifcmdnonempty_typedigit
  1295.         ld c,(ix+PANEL.dirsortproc)
  1296.         ld b,(ix+PANEL.dirsortproc+1)
  1297.         xor a
  1298.         sbc hl,bc
  1299.         add hl,bc
  1300.         jr nz,editcmd_setsortmodehl_noold
  1301.         ld a,(ix+PANEL.dirsortmode)
  1302.         cpl
  1303. editcmd_setsortmodehl_noold
  1304.         ld (ix+PANEL.dirsortmode),a
  1305.         ld (ix+PANEL.dirsortproc),l
  1306.         ld (ix+PANEL.dirsortproc+1),h
  1307.         jp editcmd_reprintcurpanel
  1308.  
  1309. editcmd_tab
  1310.         push ix
  1311.         call getanotherpanel_ix
  1312.         ld (curpanel),ix
  1313.         call drawpanel_head
  1314.         pop ix
  1315.         call drawpanel_head ;inactive panel
  1316.         jp editcmd_readprompt_setendcmdx
  1317.  
  1318. editcmd_enter
  1319.         ld a,(cmdbuf)
  1320.         or a
  1321.         jr nz,editcmd_enter_runcmd
  1322.         call getfcbundercursor ;->fcb
  1323.         ld a,(fcb+FCB_FATTRIB)
  1324.         and FATTRIB_DIR;#10
  1325.         jp z,editcmd_enter_run
  1326.          ld hl,fcb+FCB_FNAME
  1327.          ld a,(hl)
  1328.          cp '.'
  1329.          jr nz,editcmd_enter_nodotdot
  1330.          inc hl
  1331.          ld a,(hl)
  1332.          cp '.'
  1333.          jp z,editcmddirback_go
  1334. editcmd_enter_nodotdot
  1335.         call changedir_fromfcb
  1336. ;editcmd_setpaneldirfromcurdir
  1337.         ld hl,editcmd_reprintcurpanel
  1338.         push hl
  1339.         ld hl,(curpanel)
  1340. editcmd_setpaneldirfromcurdir_panelhl
  1341.         ld de,PANEL.dir
  1342.         add hl,de
  1343.         ex de,hl ;de=pointer to 64 byte (MAXPATH_sz!) buf
  1344.         OS_GETPATH
  1345.          jp clear_keyboardbuffer
  1346.  
  1347. editcmd_enter_runcmd
  1348. ;run "cmd <command to run>"
  1349.         OS_SETSYSDRV ;TODO каталог cmd
  1350.         ld hl,cmd_filename
  1351.         call copy_to_fcb_filename
  1352.  
  1353.         ld hl,cmdbuf
  1354. loadandrun_waitpid
  1355. ;hl=cmdbuf или cmdprompt (для loadandrun_restcmd)
  1356.         push hl
  1357.         call setdrawtablesneeded
  1358.        if PRSTDIO
  1359.         ld de,0
  1360.         call nv_setxy ;keeps de,hl,ix
  1361.         ld de,_COLOR
  1362.         SETCOLOR_
  1363.         CLS_
  1364.         ld de,0
  1365.         call nv_setxy ;keeps de,hl,ix
  1366.        else
  1367.         call nv_copyscreen1to0
  1368.         ld e,-1
  1369.         OS_SETGFX ;disable gfx, give focus ;before RUNAPP!!!
  1370.        endif
  1371.         ld ix,leftpanel
  1372.         call strdelpages
  1373.         ld ix,rightpanel
  1374.         call strdelpages
  1375.         call deletepages
  1376.         pop hl ;hl=cmdbuf или cmdprompt
  1377.          ;call setcurpaneldir
  1378.         call loadandrun ;nz=error, e=id
  1379.         jp nz,execcmd_error
  1380. ;команда scratch - реально cmd scratch в текущем терминале
  1381.         WAITPID
  1382. ;wait for focus
  1383.         if 1==0
  1384. execcmd_waitfocus0
  1385.          YIELD
  1386.          ld a,(user_scr0_low)
  1387.          ld hl,user_scr0_high
  1388.          cp (hl)
  1389.          jr z,execcmd_waitfocus0
  1390.         endif
  1391.        if PRSTDIO
  1392.         CLS_ ;scroll what was printed
  1393.        endif
  1394. execcmd_error
  1395.         call assignpages
  1396.        if PRSTDIO == 0
  1397.         ld e,6 ;textmode
  1398.         OS_SETGFX ;take focus (can be random after closing cmd)
  1399.         call nv_copyscreen0to1
  1400.         YIELDGETKEY ;key refresh
  1401.        endif
  1402.         xor a
  1403.         ld (cmdbuf),a
  1404.         ld (curcmdscroll),a
  1405.         jp editcmd_reprintall_keepcursor
  1406.  
  1407. editcmd_enter_run
  1408.         call setpaneldir
  1409.         ld hl,fcb_filename+8
  1410.         ld a,(hl)
  1411.         inc hl
  1412.         ld c,(hl)
  1413.         inc hl
  1414.         ld b,(hl)
  1415.         cp '$'
  1416.         jp z,editcmd_enter_runfile_hobeta
  1417.         or 0x20
  1418.         cp 'c'
  1419.         jr nz,editcmd_enter_runfile_nocom
  1420.         ld a,c
  1421.         or 0x20
  1422.         cp 'o'
  1423.         jr nz,editcmd_enter_runfile_nocom
  1424.         ld a,b
  1425.         or 0x20
  1426.         cp 'm'
  1427.         jr nz,editcmd_enter_runfile_nocom
  1428. editcmd_enter_runfile_com
  1429.         ld hl,cmdbuf
  1430.         ld (hl),0
  1431. ;hl=rest of command line
  1432.         jp loadandrun_waitpid
  1433.  
  1434. editcmd_enter_runfile_nocom
  1435.         ld hl,runfile_nocomq
  1436.         push hl
  1437.         call makeprompt_filename
  1438.        
  1439.         call runfile_findhandler ;find fcb_filename ext (spoiled) in "nv.ext"
  1440.         ret nz ;jp nz,execcmd_error
  1441.  
  1442.         ld de,cmdbuf
  1443.         ld hl,fcb_filename
  1444.         OS_PARSEFNAME ;de->hl
  1445.        
  1446.         OS_SETSYSDRV ;TODO директория cmd
  1447.         ld hl,cmdprompt
  1448.         jp loadandrun_waitpid
  1449.  
  1450. makeprompt_filename
  1451.         call setpaneldir_makeprompt ;keeps ix
  1452.         call getfcbundercursor ;->fcb
  1453.         ld hl,cmdprompt
  1454.         xor a
  1455.         cpir
  1456.         dec hl ;hl=адрес терминатора
  1457.         ld a,'/'
  1458.         dec hl
  1459.         cp (hl)
  1460.         inc hl
  1461.         jr z,$+4
  1462.          ld (hl),a
  1463.          inc hl
  1464.         ex de,hl ;de=prompt = "d:/path/" без терминатора
  1465.         ld hl,fcb_filename
  1466.         jp cpmname_to_dotname ;prompt = "d:/path/filename"
  1467.        
  1468. runfile_findhandler
  1469. ;find fcb_filename ext (spoiled) in "nv.ext"
  1470. ;out: nz=error, cmdbuf=handler
  1471.         ld hl,fcb_filename+8
  1472.         ld de,ext
  1473.         ld b,3
  1474. runfile_nocom_recodeext0
  1475.         ld a,(hl)
  1476.         or 0x20
  1477.         ld (de),a
  1478.         inc hl
  1479.         inc de
  1480.         djnz runfile_nocom_recodeext0
  1481.         OS_SETSYSDRV ;TODO директория nv
  1482.         ld de,fn_ext
  1483.         ;ld hl,ext_filename
  1484.         ;ld de,filenametext
  1485.         ;push de
  1486.         ;call cpmname_to_dotname
  1487.         ;pop de
  1488.         OS_OPENHANDLE
  1489.         or a
  1490.         ret nz ;error
  1491.         ld a,b
  1492.         ld (curhandle),a
  1493.         ld iy,file_buf_end
  1494. runfile_nocom_extloop
  1495.         call checkoneext ;c=ошибки, z=нет ошибок
  1496.         jr c,runfile_nocom_readerror
  1497.         jr z,runfile_nocom_extok
  1498.         call checkcomma
  1499.         jr c,runfile_nocom_readerror
  1500.         jr z,runfile_nocom_extloop
  1501.         call skiptonextline
  1502.         jr nz,runfile_nocom_extloop ;no EOF
  1503. runfile_nocom_readerror
  1504.         call nv_closehandle
  1505.         xor a
  1506.         dec a
  1507.         ret ;nz
  1508. runfile_nocom_extok
  1509.         call skiptocolon ;пройти к ':'
  1510.         ld hl,cmdbuf
  1511.         call loadtoendline
  1512.         call nv_closehandle
  1513.         xor a
  1514.         ret ;z
  1515.  
  1516. runfile_nocomq
  1517.         ld hl,cmdbuf
  1518.         ld (hl),0
  1519.         ld ix,(curpanel)
  1520. setpaneldir_makeprompt
  1521.         call setpaneldir ;keeps ix
  1522.         jp makeprompt ;-> prompt ;keeps ix
  1523.  
  1524.         macro READBYTE_A
  1525. ;out: z=EOF
  1526.         inc ly
  1527.         call m,readbyte_readbuf
  1528.         ld a,(iy)
  1529.         endm
  1530.  
  1531. checkoneext
  1532.         ld hl,ext
  1533.         ld bc,3*256
  1534. checkoneext0
  1535.         READBYTE_A
  1536.         ret z ;EOF
  1537.         cp 0x0a
  1538.         jr z,checkoneext0 ;skip LF
  1539.         or 0x20
  1540.         xor (hl)
  1541.         inc hl
  1542.         or c
  1543.         ld c,a
  1544.         djnz checkoneext0
  1545. ;c=ошибки, z=нет ошибок
  1546.         ret
  1547.  
  1548. skiptocolon
  1549.         READBYTE_A
  1550.         ret z ;EOF
  1551.         cp ':'
  1552.         jr nz,skiptocolon
  1553.         ret
  1554.  
  1555. checkcomma
  1556.         READBYTE_A
  1557.         cp ','
  1558.         ret ;TODO проверить EOF
  1559.  
  1560. loadtoendline
  1561. ;hl=buf
  1562.         READBYTE_A
  1563.         jr z,loadtoendlineq
  1564.         cp 0x0d
  1565.         jr z,loadtoendlineq
  1566.         ld (hl),a
  1567.         inc hl
  1568.         jr loadtoendline
  1569. loadtoendlineq
  1570.         ld (hl),0
  1571.         ret
  1572.  
  1573. skiptonextline
  1574.         READBYTE_A
  1575.         ret z ;EOF
  1576.         cp 0x0d
  1577.         jr nz,skiptonextline
  1578.         or a
  1579.         ret ;nz
  1580.  
  1581. readbyte_readbuf
  1582. ;out: z=EOF
  1583.         push bc
  1584.         push de
  1585.         push hl
  1586.         push ix
  1587.         ld de,file_buf
  1588.         push de
  1589.         ld hl,128
  1590.         call readcurhandle
  1591.         ld a,h
  1592.         or l ;z=no bytes read
  1593.         pop iy
  1594.         pop ix
  1595.         pop hl
  1596.         pop de
  1597.         pop bc
  1598.         ret
  1599.  
  1600. editcmd_enter_runfile_hobeta
  1601. hobetarunner=0x4100
  1602.         ld e,6 ;textmode
  1603.         OS_SETGFX
  1604.  
  1605.         ld a,(user_scr0_low) ;ok
  1606.         SETPG32KLOW
  1607.         inc a ;ld a,#ff-0
  1608.         SETPG32KHIGH
  1609. ;0x4000 : pgcode4000 ;(pg4 может запортиться от стека!!! причём не только этой задачи!!!)
  1610. ;0x8000 : pg1
  1611. ;0xc000 : pg0
  1612.         call loadhobeta
  1613.         ret nz ;error
  1614.  
  1615.         di
  1616.         ld a,(user_scr0_low) ;ok
  1617.         sub 4-1 ;ld a,#ff-4 ;pgkillable
  1618.         SETPG32KLOW
  1619.         ld hl,0x4000
  1620.         ld de,0x8000
  1621.         ld bc,0x4000
  1622.         ldir ;copy pgcode4000 -> pg4
  1623.  
  1624.         ld a,(user_scr0_low) ;ok
  1625.         SETPG32KLOW
  1626.         ;ld a,(user_scr0_low) ;ok
  1627.         sub 4-1 ;ld a,#ff-4 ;pgkillable
  1628.         SETPG16K
  1629.         ld hl,washobetarunner
  1630.         ld de,hobetarunner
  1631.         ld bc,hobetarunner_sz
  1632.         ldir
  1633. ;0x4000 : pg4 (может запортиться от стека!!! причём не только этой задачи!!!)
  1634. ;0x8000 : pg1
  1635. ;0xc000 : pg0
  1636.         ld hl,0x6000
  1637.         ld bc,(0x6000-17+11) ;len
  1638.         add hl,bc
  1639.         dec hl ;hl=load end
  1640.         ex de,hl
  1641.         ld hl,(0x6000-17+9) ;start
  1642.         ld (hobetarunner_jp),hl
  1643.         add hl,bc
  1644.         dec hl
  1645.         ex de,hl ;de=destination end
  1646.         lddr
  1647.         jp hobetarunner
  1648.  
  1649. loadhobeta
  1650.         ld hl,fcb_filename
  1651.         ld de,filenametext
  1652.         push de
  1653.         call cpmname_to_dotname
  1654.         pop de
  1655.         OS_OPENHANDLE
  1656.         or a
  1657.         ret nz ;error
  1658.         ld a,b
  1659.         ld (curhandle),a
  1660.         ld de,0x6000-17
  1661.         ld hl,-(0x6000-17)
  1662.         OS_READHANDLE
  1663.         call nv_closehandle
  1664.         xor a ;no error
  1665.         ret ;call nv_closefcb
  1666.  
  1667. loadandrun
  1668. ;hl=rest of command line
  1669. ;out: nz=error, e=id
  1670. ;load file in fcb from system current dir with parameters in tcmd, then set curpaneldir and run
  1671.         ld (loadandrun_restcmd),hl
  1672.         ld hl,fcb_filename
  1673.         ld de,filenametext
  1674.         push de
  1675.         call cpmname_to_dotname
  1676.         pop de
  1677.         OS_OPENHANDLE
  1678.         or a
  1679.         ret nz ;error
  1680.         ld a,b
  1681.         ld (curhandle),a
  1682.         ld hl,nv_closehandle
  1683.         push hl
  1684.         ;set current drive and dir (will be copied into new app)
  1685.         call setcurpaneldir
  1686.  
  1687.         OS_NEWAPP
  1688.         or a
  1689.         ret nz ;error
  1690. ;dehl=номера страниц в 0000,4000,8000,c000 нового приложения, b=id, a=error
  1691.         push bc ;b=id
  1692.         ld a,d
  1693.         SETPG32KHIGH
  1694.         push de
  1695.         push hl
  1696.         ld hl,fcb_filename
  1697.         ld de,0xc000+COMMANDLINE
  1698.         call cpmname_to_dotname ;de указывает на терминатор
  1699. loadandrun_restcmd=$+1
  1700.         ld hl,0
  1701.          ld a,(hl)
  1702.          or a
  1703.          jr z,loadandrun_noparams
  1704.         ld a,' '
  1705.         ld (de),a
  1706.         inc de
  1707. loadandrun_noparams
  1708.         ld bc,COMMANDLINE_sz;-tcmd_sz
  1709.         ldir ;copy command line ;можем залезть за 0x0100!
  1710.         xor a
  1711.         ld (0xc000+COMMANDLINE+COMMANDLINE_sz-1),a
  1712.         pop hl
  1713.         pop de
  1714.  
  1715.         call readfile_pages_dehl
  1716.  
  1717.         pop de
  1718.         ld e,d ;e=id
  1719. ;run "cmd <commandline>"
  1720.         push de
  1721.         OS_RUNAPP
  1722.         pop de
  1723.         xor a
  1724.         ret ;z
  1725.  
  1726. editcmd_1
  1727.         call ifcmdnonempty_typedigit
  1728. editcmd_F1
  1729.         ld ix,(curpanel)
  1730.         ld a,(ix+PANEL.xy)
  1731.         add a,10
  1732.         ld (windrv),a ;x
  1733.         add a,5
  1734.         ld (windrverr),a
  1735.         ld hl,editcmd_reprintcurpanel;editcmd_reprintall_onlyreadcurdir
  1736.         push hl
  1737.  
  1738. seldrv_redraw_mainloop
  1739.         ld hl,windrv
  1740. ;hl=window
  1741.         ld de,_COLOR_DIALOG
  1742.         call nv_setcolor
  1743.  
  1744.         call prwindow_text ;de=YX of last line
  1745. seldrv_mainloop
  1746.         ld de,(windrv)
  1747. seldrv_cury=$+1
  1748.         ld a,0
  1749.         add a,d
  1750.         add a,2
  1751.         ld d,a
  1752.         inc e
  1753.         inc e
  1754.         inc e
  1755.         push de
  1756.         ld hl,_CURSORCOLOR
  1757.         ld b,22
  1758.         call drawfilecursor_sizeb_colorhl ;draw cursor
  1759. seldrv_mainloop_nokey
  1760.        if PRSTDIO
  1761.         call yieldgetkeyloop
  1762.        else
  1763.         YIELDGETKEYLOOP
  1764.        endif
  1765.          or a
  1766.          jr z,seldrv_mainloop_nokey ;TODO handle mouse events
  1767.         ld a,c
  1768.         pop de
  1769.         push af
  1770.         ld hl,_COLOR_DIALOG
  1771.         ld b,22
  1772.         call drawfilecursor_sizeb_colorhl ;remove cursor
  1773.         pop af
  1774.         cp key_redraw
  1775.         jr z,seldrv_redraw_mainloop
  1776.         ld hl,seldrv_cury
  1777.         cp key_enter
  1778.         jr z,seldrv_selcursor
  1779.         cp key_esc
  1780.         ret z
  1781.         cp 'a'
  1782.         jr c,seldrv_cursor
  1783.         cp 'a'+NDRIVES;'p'
  1784.         jr c,seldrv_selletter
  1785. seldrv_cursor
  1786.         ld bc,seldrv_mainloop
  1787.         push bc
  1788.         cp key_down
  1789.         jr z,seldrv_down
  1790.         cp key_up
  1791.         jr z,seldrv_up
  1792.         ret
  1793. seldrv_selletter
  1794.         sub 'a'
  1795.         jr seldrv_ok
  1796. seldrv_selcursor
  1797.         ld a,(hl)
  1798. seldrv_ok
  1799.         ld e,a
  1800.         push de
  1801.         OS_SETDRV
  1802.         pop de
  1803.         or a
  1804.         jr z,seldrv_ok0
  1805.         ld de,_COLOR_RED
  1806.         call nv_setcolor
  1807.         ld hl,windrverr
  1808.         call prwindow_waitkey
  1809.         ld de,_COLOR
  1810.         call nv_setcolor
  1811.         jp seldrv_redraw_mainloop
  1812. seldrv_ok0
  1813.         ld a,e
  1814.         add a,'a'
  1815.         call getcurpaneldir_hl
  1816.         ;ld ix,(curpanel)
  1817.         ld (hl),a
  1818.         inc hl
  1819.         ld (hl),':'
  1820.         inc hl
  1821.         ld (hl),'/'
  1822.         inc hl
  1823.         ld (hl),0
  1824.         ret
  1825.  
  1826. seldrv_down
  1827.         ld a,(hl)
  1828.         inc a
  1829.         cp NDRIVES;15
  1830.         ret z
  1831.         ld (hl),a
  1832.         ret
  1833. seldrv_up
  1834.         ld a,(hl)
  1835.         or a
  1836.         ret z
  1837.         dec (hl)
  1838.         ret
  1839.  
  1840. editcmd_4
  1841.         call ifcmdnonempty_typedigit
  1842. editcmd_F4
  1843.         call getfcbundercursor ;->fcb
  1844.         ld a,(fcb+FCB_FATTRIB)
  1845.         and FATTRIB_DIR;#10
  1846.         ret nz
  1847.  
  1848.         ld hl,editcmd_reprintall_noreaddir
  1849.         push hl
  1850.  
  1851.         call makeprompt_filename
  1852.  
  1853.         ;call runfile_findhandler ;find fcb_filename ext (spoiled) in "nv.ext"
  1854.         ;ret nz ;jp nz,execcmd_error
  1855.  
  1856.         ;ld de,cmdbuf
  1857.         ;ld hl,fcb_filename
  1858.         ;OS_PARSEFNAME ;de->hl
  1859.  
  1860.         OS_SETSYSDRV ;TODO директория texted
  1861.  
  1862.         ld hl,texted_filename
  1863.         call copy_to_fcb_filename
  1864.  
  1865.         ;ld hl,cmdbuf
  1866.         ;ld (hl),0
  1867.         ld hl,cmdprompt
  1868. ;load file in fcb from system current dir with parameters in tcmd, then set curpaneldir and run
  1869.         jp loadandrun_waitpid
  1870.  
  1871. editcmd_9
  1872.         call ifcmdnonempty_typedigit
  1873.         ;ld e,1
  1874.         ;OS_SETSCREEN
  1875.         ;YIELDGETKEYLOOP
  1876.         ;ld e,0
  1877.         ;OS_SETSCREEN
  1878.         ret
  1879.  
  1880. editcmd_reprintall_keepcursor
  1881.         call readpanels_reprint_keepcursor
  1882.         jp editcmd_readprompt_setendcmdx
  1883.  
  1884. editcmd_reprintcurdir
  1885.         ld hl,leftpanel+PANEL.dir
  1886.         ld de,rightpanel+PANEL.dir
  1887.         call strcp
  1888.         jr nz,editcmd_reprintcurpanel
  1889. editcmd_reprintall
  1890.         call readpanels_reprint
  1891.         jp editcmd_readprompt_setendcmdx
  1892. editcmd_reprintcurpanel
  1893.         ld ix,(curpanel)
  1894.         call readdir
  1895.         call sortfiles
  1896.         call drawpanel_with_files
  1897.         jp editcmd_readprompt_setendcmdx
  1898. editcmd_reprintall_noreaddir
  1899.         ;ld e,COLOR
  1900.         ;OS_CLS
  1901.         call printhint
  1902.         ld ix,leftpanel
  1903.         call drawpanel_with_files
  1904.         ld ix,rightpanel
  1905.         jp drawpanel_with_files
  1906. ;editcmd_reprintall_onlyreadcurdir
  1907. ;       ld e,COLOR
  1908. ;       OS_CLS
  1909. ;       call printhint
  1910. ;       call getanotherpanel_ix
  1911. ;       call drawpanel_with_files
  1912. ;       jp editcmd_reprintcurpanel
  1913.  
  1914. editcmd_invfiles
  1915. ;ix=curpanel
  1916.         ld hl,changemark_hl
  1917.         call processfiles
  1918.         jp drawpanel_with_files
  1919.  
  1920. editcmd_6 ;ren
  1921.         call ifcmdnonempty_typedigit
  1922. editcmd_F6
  1923.         ld hl,editcmd_reprintall_keepcursor;editcmd_reprintall
  1924.         push hl
  1925.         call setpaneldir
  1926.         call getfcbundercursor
  1927.  
  1928.         if 1==1
  1929.         ld a,(fcb+FCB_EXTENTNUMBERLO)
  1930.         SETPG32KHIGH
  1931.         ld hl,(fcb+FCB_EXTENTNUMBERHI)
  1932.         ld de,filenametext
  1933.         push hl
  1934.         call strcopy
  1935.         pop hl
  1936.         ld de,tnewfilename
  1937.         call strcopy
  1938.         ;ld bc,64 ;max filename size+terminator
  1939.         ;ldir
  1940.         else
  1941.         ld hl,fcb_filename
  1942.         ld de,tnewfilename
  1943.         push de
  1944.         call cpmname_to_dotname
  1945.         pop hl
  1946.         ld de,filenametext
  1947.         ld bc,12
  1948.         ldir
  1949.         endif
  1950.  
  1951.         ld de,_COLOR_DIALOG
  1952.         call nv_setcolor
  1953.  
  1954.         ld hl,winrename
  1955.         ld de,tnewfilename
  1956.         ld c,63;13 ;max filename size
  1957.         call prwindow_edit ;CY=OK
  1958.         ret nc ;cancel
  1959. ;если в имени есть символы :,/,\, то выйти с ошибкой
  1960.         ld hl,tnewfilename
  1961. editcmd_ren_checkname0
  1962.         ld a,(hl)
  1963.         or a
  1964.         jr z,editcmd_ren_checknameq
  1965.         inc hl
  1966.         cp ':'
  1967.         ret z ;error
  1968.         cp '/'
  1969.         ret z ;error
  1970.         cp 0x5c;'\\'
  1971.         ret z ;error
  1972.         jr editcmd_ren_checkname0
  1973. editcmd_ren_checknameq
  1974.         ld de,filenametext
  1975.         ld hl,tnewfilename
  1976.         OS_RENAME
  1977.         ;todo error
  1978.         ret
  1979.  
  1980. editcmd_7 ;mkdir
  1981.         call ifcmdnonempty_typedigit
  1982. editcmd_F7
  1983.         ld hl,editcmd_reprintall_keepcursor;editcmd_reprintall
  1984.         push hl
  1985.         call setpaneldir
  1986.  
  1987.         ld de,_COLOR_DIALOG
  1988.         call nv_setcolor
  1989.         xor a
  1990.         ld hl,winmkdir
  1991.         ld de,tnewfilename
  1992.         ld (de),a
  1993.         ld c,63;13 ;max filename size
  1994.         call prwindow_edit ;CY=OK, de=filename
  1995.         ret nc ;cancel
  1996.         OS_MKDIR
  1997.         ;TODO error
  1998.         ret
  1999.  
  2000. editcmd_8 ;del
  2001.         call ifcmdnonempty_typedigit
  2002. editcmd_F8
  2003.         ;ld ix,(curpanel)
  2004.         call getmarkedfiles;countmarkedfiles
  2005.         ld a,h
  2006.         or l
  2007.         jr nz,editcmd_8_0      
  2008.         call getfcbaddrundercursor;hl=fcb
  2009.         call isthisdotdir_hl
  2010.         ret z ;"." or ".."
  2011.         call changemark_hl ;ld (hl),1
  2012. editcmd_8_0  
  2013.         ld de,_COLOR_RED
  2014.         call nv_setcolor
  2015.         ld hl,windel
  2016.         call prwindow_waitkey ;CY=OK
  2017.         jp nc,editcmd_reprintall_noreaddir
  2018.         ld hl,editcmd_reprintall_keepcursor;editcmd_reprintall
  2019.         push hl
  2020.         ld hl,windel2
  2021.         call prwindow_text
  2022.         ld hl,proc_del_file
  2023.         ld ix,(curpanel)
  2024.         jp processfiles
  2025.  
  2026. proc_del_file
  2027.         bit 0,(hl) ;marked?
  2028.         ret z
  2029.         call getfcbfromhl
  2030.  
  2031.         call getcurpaneldir_hl ;почему-то было через ix 10.02.2020
  2032.         ld de,dir_buf
  2033.         call strcopy;nv_strcopy_hltode
  2034.  
  2035.         ld hl,proc_del_file_batch
  2036.         ld (nv_batch_proc),hl
  2037.  
  2038. proc_del_file_batch
  2039. ;нельзя CHDIR, потому что это вызывается в цикле чтения директории в nv_batch1!
  2040.         ;ld de,dir_buf
  2041.         ;OS_CHDIR
  2042.  
  2043.        if 1==0
  2044.         ld de,filenametext ;wordbuf ;de=drive/path/file
  2045.         ld hl,fcb_filename
  2046.         call cpmname_to_dotname
  2047.        else
  2048.         ld a,(fcb+FCB_EXTENTNUMBERLO)
  2049.         SETPG32KHIGH
  2050.         ld hl,(fcb+FCB_EXTENTNUMBERHI)
  2051.         ld de,filenametext
  2052.         ld bc,63*256+0
  2053.         call prdirfile_copyfn
  2054.        endif
  2055.  
  2056.         ld de,dir3_buf;windel2_file ;dest
  2057.         push de
  2058.         ld bc,filenametext ;add
  2059.         ld hl,dir_buf ;src
  2060.         call nv_makefilepath_hltode ;result :  dest=hl'/'bc (de указывает после терминатора)
  2061.         pop hl
  2062.          ;ld hl,dir3_buf
  2063.          ld de,windel2_file
  2064.          push de
  2065.          ld bc,64
  2066.          ldir
  2067.          pop hl
  2068.         ;ld hl,windel2_file
  2069.         call nv_fillpathspaces_hl ;fill to 64bytes spaces
  2070.         ld hl,windel2
  2071.         call upwindow_text ;update window
  2072.  
  2073.         ld de,dir3_buf;windel2_file ;dest
  2074.         push de
  2075.         ld bc,filenametext ;add
  2076.         ld hl,dir_buf ;src
  2077.         call nv_makefilepath_hltode ;result :  dest=hl'/'bc (de указывает после терминатора)
  2078.         pop de
  2079.         ;ld de,filenametext
  2080.         OS_DELETE
  2081.         or a
  2082.         ret z ;if success return
  2083.  
  2084.         ld a,(fcb_attrib)
  2085.         and FATTRIB_DIR
  2086.         push af
  2087.         call nz,nv_copydir_add
  2088.         pop af
  2089.         jp nz,nv_copydir_add ;twice to remove empty dirs
  2090.         ret
  2091.  
  2092. editcmd_5 ;copy
  2093.         call ifcmdnonempty_typedigit
  2094. editcmd_F5
  2095.         ;ld ix,(curpanel)
  2096.         call getmarkedfiles ;countmarkedfiles
  2097.         ld a,h
  2098.         or l
  2099.         jr nz,editcmd_5_0      
  2100.         call getfcbaddrundercursor ;hl=fcb
  2101.         call isthisdotdir_hl
  2102.         ret z ;"." or ".."
  2103.         call changemark_hl ;ld (hl),1
  2104. editcmd_5_0
  2105.  
  2106.         call getanotherpanel_hl
  2107.         ld de,PANEL.dir
  2108.         add hl,de
  2109.         ld de,dir2_buf
  2110.         call strcopy;nv_strcopy_hltode
  2111.  
  2112.         call getcurpaneldir_hl
  2113.         ld de,dir_buf
  2114.         call strcopy;nv_strcopy_hltode
  2115.  
  2116.         ld de,_COLOR_DIALOG
  2117.         call nv_setcolor
  2118.          ld ix,(curpanel)
  2119.  
  2120.         ld hl,wincopy
  2121.         ld de,dir2_buf
  2122.         ld c,60
  2123.         call prwindow_edit ;CY=OK
  2124.         jp nc,editcmd_reprintall_noreaddir
  2125.  
  2126.         ld hl,editcmd_reprintall
  2127.         push hl ;don't change!
  2128.  
  2129.         ld hl,0
  2130.         ld (filescopied),hl
  2131.  
  2132. ;        ld de,PROGRESBARWINXY
  2133. ;        ld bc,PROGRESBARWINHGTWID
  2134. ;        call prwin
  2135.         ld hl,wincopy2
  2136.         call prwindow_text
  2137.         ld hl,proceditcmd_copy
  2138.         ld ix,(curpanel)
  2139.         jp processfiles
  2140.  
  2141. strcopy
  2142. ;hl->de
  2143. ;out: hl,de after terminator
  2144.         xor a
  2145. strcopy0
  2146.         cp (hl)
  2147.         ldi
  2148.         jp nz,strcopy0
  2149.         ret
  2150.  
  2151. strcopy_addslash
  2152. ;hl->de
  2153.         call strcopy;nv_strcopy_hltode
  2154. ;assumed that DE is after terminator
  2155.         dec de
  2156.         dec de
  2157.         ld a,(de)
  2158.         cp '/'
  2159.         jr z,nv_addslash0
  2160.         inc de
  2161.         ld a,'/'
  2162.         ld (de),a
  2163. nv_addslash0
  2164.         inc de
  2165.         xor a
  2166.         ld (de),a
  2167.         ret
  2168.  
  2169. ;TODO change this to strcopy_maxb
  2170. nv_makefilepath_hltode ;DE=dest HL=src BC=filename
  2171.         push bc
  2172.         call strcopy_addslash
  2173.         pop hl
  2174.         jp strcopy;nv_strcopy_hltode
  2175.  
  2176. ;TODO remove this
  2177. nv_fillpathspaces_hl
  2178.         ld b,0
  2179. nv_fillpathspaces_hl0
  2180.          ;ld a,b
  2181.          ;cp 64
  2182.          ;ret z
  2183.          bit 6,b
  2184.          ret nz
  2185.         ld a,(hl)
  2186.         inc b
  2187.         inc hl
  2188.         or a
  2189.         jr nz,nv_fillpathspaces_hl0
  2190.         dec hl
  2191.         dec b
  2192.         ld c,' '
  2193.         ld a,b
  2194. nv_fillpathspaces_hl1
  2195.         ld (hl),c
  2196.         inc hl
  2197.         inc a
  2198.         cp 64
  2199.         jr c,nv_fillpathspaces_hl1
  2200.         ret
  2201.  
  2202. strcopy_maxb
  2203. ;copy hl->de no more than b bytes, add spaces after
  2204. strcopy_maxb0
  2205.         ld a,(hl)
  2206.         or a
  2207.         jr z,strcopy_maxb_fill
  2208.         ld (de),a
  2209.         inc hl
  2210.         inc de
  2211.         djnz strcopy_maxb0
  2212.         ret
  2213. strcopy_maxb_fill
  2214.         ld a,' '
  2215. strcopy_maxb_fill0
  2216.         ld (de),a
  2217.         inc de
  2218.         djnz strcopy_maxb_fill0
  2219.         ret
  2220.  
  2221.  
  2222. nv_copydir_add;=nv_batch_pushrecord
  2223. ;       jp nv_batch_pushrecord
  2224. ;nv_batch_pushrecord
  2225.         OS_GETMAINPAGES
  2226.         ld a,h
  2227.         ld (savepg),a
  2228.         ld a,(dirpg)
  2229.         SETPG32KLOW
  2230.  
  2231.         ld hl,0x8000
  2232.         ld bc,(dir_batch_pointer)
  2233.         ld de,256
  2234. nv_batch_pushsrecord
  2235.         ld a,b
  2236.         or c
  2237.         jr z,nv_batch_pushsrecordend
  2238.         add hl,de
  2239.         dec bc
  2240.         jr nv_batch_pushsrecord
  2241. nv_batch_pushsrecordend
  2242.         push hl
  2243. ;dir 1
  2244.         ld de,dir_buf
  2245.         ex hl,de
  2246.         ld bc,filenametext
  2247.         call nv_makefilepath_hltode
  2248.         pop hl
  2249.         ld de,128 ;128 bytes for source, 128 bytes for dest???
  2250.         add hl,de
  2251. ;dir2
  2252.         ld de,dir2_buf
  2253.         ex hl,de
  2254.         ld bc,filenametext
  2255.         call nv_makefilepath_hltode
  2256.  
  2257.         ld bc,(dir_batch_pointer)
  2258.         inc bc
  2259.         ld (dir_batch_pointer),bc
  2260.         ld a,(savepg)
  2261.         SETPG32KLOW
  2262.         ret
  2263.  
  2264. nv_batch_poprecord ;z=empty
  2265.         OS_GETMAINPAGES
  2266.         ld a,h
  2267.         ld (savepg),a
  2268.         ld a,(dirpg)
  2269.         SETPG32KLOW
  2270.  
  2271.         ld hl,0x8000
  2272.         ld bc,(dir_batch_pointer)
  2273.         ld a,b
  2274.         or c
  2275.         jr z,nv_batch_popsrecordq ;empty :(
  2276.         dec bc
  2277.         ld de,256
  2278. nv_batch_popsrecord
  2279.         ld a,b
  2280.         or c
  2281.         jr z,nv_batch_popsrecordend
  2282.         add hl,de
  2283.         dec bc
  2284.         jr nv_batch_popsrecord
  2285. nv_batch_popsrecordend
  2286.         ld de,dir_buf
  2287.         ld bc,128
  2288.         ldir
  2289.         ld de,dir2_buf
  2290.         ld  c,128
  2291.         ldir
  2292.         ld bc,(dir_batch_pointer)
  2293.         dec bc
  2294.         ld (dir_batch_pointer),bc
  2295.         ld a,1
  2296.         or a ;NZ
  2297. nv_batch_popsrecordq
  2298.         ld a,(savepg)
  2299.         SETPG32KLOW
  2300.         ret
  2301.  
  2302. nv_batch
  2303.         call nv_batch_poprecord
  2304.         ret z;empty
  2305. nv_label
  2306.         or a
  2307.         ld hl,(processfiles_proc)
  2308.         ld de,proceditcmd_copy
  2309.         sbc hl,de
  2310.         jr nz,nv_batch_nocopydir ;if it's not copy
  2311.  
  2312.         ld de,dir2_buf
  2313.         OS_MKDIR
  2314.         ld de,dir2_buf
  2315.         OS_CHDIR ;de
  2316.         or a
  2317.         jr nz,nv_batch ;can't open dest dir
  2318. nv_batch_nocopydir
  2319.         ld de,dir_buf
  2320.         OS_CHDIR ;;
  2321.         or a
  2322.         jr nz,nv_batch ;can't open src dir
  2323.  
  2324.         ld de,emptypath
  2325.         OS_OPENDIR
  2326.         ;ld de,fcb
  2327.         ;OS_SETDTA
  2328.         ;ld de,fcbmask
  2329.         ;OS_FSEARCHFIRST
  2330.         or a
  2331.         jr nz,nv_batch
  2332.        
  2333.         ;ld de,fcb
  2334.         ;OS_SETDTA
  2335.         ;ld de,fcbmask
  2336.         ;OS_FSEARCHNEXT
  2337.         ;or a
  2338.         ;jr nz,nv_batch ;skip . and ..
  2339.         call loaddir_filinfo ;out: CY=end dir, or else Z="."
  2340.         call loaddir_filinfo ;out: CY=end dir, or else Z="."
  2341. nv_batch1
  2342.         ;ld de,fcb
  2343.         ;OS_SETDTA
  2344.         ;ld de,fcbmask
  2345.         ;OS_FSEARCHNEXT
  2346.         ;or a
  2347.         ;jr nz,nv_batch_nofiles
  2348.         call loaddir_filinfo ;out: CY=end dir, or else Z="."
  2349.         jr c,nv_batch_nofiles
  2350.         ;jr z,nv_batch1
  2351.  
  2352.         ld hl,filinfo+FILINFO_LNAME
  2353.         ld a,(hl)
  2354.         or a
  2355.         jr nz,$+5
  2356.         ld hl,filinfo+FILINFO_FNAME
  2357.         ld (fcb+FCB_EXTENTNUMBERHI),hl
  2358.         ;ex de,hl
  2359.         ;ld hl,fcb_filename
  2360.         ;call dotname_to_cpmname ;de -> hl
  2361.  
  2362.         ld a,(filinfo+FILINFO_FATTRIB)
  2363.         ld (fcb_attrib),a
  2364.          ld a,(dirpg)
  2365.          ld (fcb+FCB_EXTENTNUMBERLO),a ;NU
  2366.  
  2367. nv_batch_proc=$+1
  2368.         call proceditcmd_copy_fcb
  2369.         jr nv_batch1
  2370.  
  2371. nv_batch_nofiles
  2372.         or a
  2373.         ld hl,(processfiles_proc)
  2374.         ld de,proc_del_file
  2375.         sbc hl,de
  2376.         jp nz,nv_batch ;if not del
  2377.         ld a,'/'
  2378.         ld (dir2_buf),a
  2379.         xor a
  2380.         ld (dir2_buf+1),a
  2381.         ld de,dir2_buf
  2382.         OS_CHDIR
  2383.         ld de,dir_buf
  2384.         OS_DELETE
  2385.         jp nv_batch
  2386.  
  2387. skipword_hl
  2388.         ld a,(hl)
  2389.         or a
  2390.         ret z
  2391.         cp ' '
  2392.         ret z
  2393.         inc hl
  2394.         jr skipword_hl
  2395.  
  2396. proceditcmd_copy
  2397.         bit 0,(hl)
  2398.         ret z
  2399.         call getfcbfromhl
  2400.  
  2401.         ld hl,proceditcmd_copy_fcb
  2402.         ld (nv_batch_proc),hl
  2403.  
  2404. proceditcmd_copy_fcb
  2405. ;нельзя CHDIR, потому что это вызывается в цикле чтения директории в nv_batch1!
  2406.         ld hl,proceditcmd_copy_q
  2407.         push hl
  2408.         ;ld de,dir_buf
  2409.         ;OS_CHDIR
  2410.  
  2411.        if 1==0
  2412.         ld de,filenametext ;wordbuf ;de=drive/path/file
  2413.         ld hl,fcb_filename
  2414.         call cpmname_to_dotname
  2415.        else
  2416.         ld a,(fcb+FCB_EXTENTNUMBERLO)
  2417.         SETPG32KHIGH
  2418.         ld hl,(fcb+FCB_EXTENTNUMBERHI)
  2419.         ld de,filenametext
  2420.         ld bc,63*256+0
  2421.         call prdirfile_copyfn
  2422.        endif
  2423.  
  2424.         ld a,(fcb_attrib)
  2425.         and FATTRIB_DIR
  2426.         jp nz,nv_copydir_add
  2427.  
  2428.         ld de,dir3_buf;wincopy_dest
  2429.         push de
  2430.         ld bc,filenametext
  2431.         ld hl,dir2_buf
  2432.         call nv_makefilepath_hltode
  2433.         pop hl
  2434.          ;ld hl,dir3_buf
  2435.          ld de,wincopy_dest
  2436.          push de
  2437.          ld bc,64
  2438.          ldir
  2439.          pop hl
  2440.         ;ld hl,wincopy_dest
  2441.         call nv_fillpathspaces_hl
  2442.         ld hl,wincopy2
  2443.         call upwindow_text
  2444.  
  2445.         ld de,dir3_buf;wincopy_src ;update copy window
  2446.         push de
  2447.         ld bc,filenametext
  2448.         ld hl,dir_buf
  2449.         call nv_makefilepath_hltode
  2450.         pop hl
  2451.          ;ld hl,dir3_buf
  2452.          ld de,wincopy_src
  2453.          push de
  2454.          ld bc,64
  2455.          ldir
  2456.          pop hl
  2457.         ;ld hl,wincopy_src
  2458.         call nv_fillpathspaces_hl
  2459.  
  2460.         ld de,dir3_buf
  2461.         ;push de
  2462.         ;ld bc,filenametext
  2463.         ;ld hl,dir_buf
  2464.         ;call nv_makefilepath_hltode
  2465.         ;pop de
  2466.         push de
  2467.         OS_OPENHANDLE
  2468.         pop de
  2469.         or a
  2470.         ret nz ;jp nz,cmd_error_wrongfile
  2471.         ld a,b
  2472.         ld (cmd_copy_close_file1_handle),a
  2473.         ld hl,cmd_copy_close_file1
  2474.         push hl
  2475.  
  2476.         ;ld de,filenametext
  2477.         OS_GETFILETIME ;ix=date, hl=time
  2478.         ld (proceditcmd_copy_time),hl
  2479.         ld (proceditcmd_copy_date),ix
  2480.  
  2481.         ;ld de,dir2_buf
  2482.         ;OS_CHDIR
  2483.         ld de,dir3_buf;wincopy_dest ;256 bytes
  2484.          push de
  2485.          ld bc,filenametext
  2486.          ld hl,dir2_buf
  2487.          call nv_makefilepath_hltode
  2488.          pop de
  2489.         ;ld de,filenametext;swordbuf2 ;de=drive/path/file
  2490.         OS_CREATEHANDLE
  2491.         or a
  2492.         ret nz ;jp nz,cmd_error_cant_copy
  2493.         ld a,b
  2494.         ld (cmd_copy_close_file2_handle),a
  2495.         ld hl,cmd_copy_close_file2
  2496.         push hl
  2497. cmd_copy0
  2498.         ld hl,copybuf_sz
  2499.         ld de,copybuf
  2500.         ld a,(cmd_copy_close_file1_handle)
  2501.         ld b,a
  2502. ;B = file handle, DE = Buffer address, HL = Number of bytes to read
  2503.         push de
  2504.         OS_READHANDLE
  2505. ;HL = Number of bytes actually read, A=error
  2506.         pop de
  2507.         ld a,h
  2508.         or l
  2509.         ret z ;0 bytes remain
  2510.         ld a,(cmd_copy_close_file2_handle)
  2511.         ld b,a
  2512. ;B = file handle, DE = Buffer address, HL = Number of bytes to write
  2513.         OS_WRITEHANDLE
  2514.         jr cmd_copy0
  2515.  
  2516. cmd_copy_close_file1
  2517. cmd_copy_close_file1_handle=$+1
  2518.         ld b,0
  2519.         OS_CLOSEHANDLE
  2520.         ret
  2521.  
  2522. cmd_copy_close_file2
  2523. cmd_copy_close_file2_handle=$+1
  2524.         ld b,0
  2525.         OS_CLOSEHANDLE
  2526. proceditcmd_copy_time=$+1
  2527.         ld hl,0
  2528. proceditcmd_copy_date=$+2
  2529.         ld ix,0
  2530.         ld de,dir3_buf;wincopy_dest;filenametext
  2531.         OS_SETFILETIME
  2532.         ret
  2533.  
  2534. proceditcmd_copy_q
  2535. filescopied=$+1
  2536.         ld hl,0
  2537.          if 1==0
  2538.         inc hl
  2539.         ld (filescopied),hl
  2540.         ;ld bc,32
  2541.         ;ex de,hl ;ld de,(percentcopyfile)
  2542.         ;call mulbcde_ahl
  2543.         add hl,hl
  2544.         add hl,hl
  2545.         add hl,hl
  2546.         add hl,hl
  2547.         add hl,hl
  2548.         push hl
  2549.         ld ix,(curpanel)
  2550. ;ix = panel
  2551.         call getmarkedfiles ;out: hl'hl = files
  2552.         ex de,hl ;de=files
  2553.         pop hl ;filescopied*32
  2554.         call divhlde
  2555.         ld a,l
  2556.         or a
  2557.         ret z
  2558.         ld b,a
  2559.         ld de,PROGRESBARWINXY+#0102
  2560. proceditcmd_copy_q_progress0      
  2561.         push de
  2562.         push bc
  2563.         call nv_setxy ;keeps de,hl,ix
  2564.         ;ld e,#ff
  2565.         ;OS_PRATTR
  2566.         ld a,'*'
  2567.         MYPRCHAR
  2568.         pop bc
  2569.         pop de
  2570.         inc e
  2571.         djnz proceditcmd_copy_q_progress0
  2572.          endif
  2573.         ret
  2574.  
  2575. mulbcde_ahl
  2576. ;bc * de результат в ahl
  2577.         xor a
  2578.         ld h,a
  2579.         ld l,a
  2580.         dup 8
  2581.         rlc b
  2582.         jr nc,$+5 ; c - был перенос, nc - не было переноса    
  2583.         add hl,de
  2584.         adc a,0
  2585.         add hl,hl
  2586.         rla
  2587.         edup
  2588.         dup 7
  2589.         rlc c
  2590.         jr nc,$+5 ; c - был перенос, nc - не было переноса    
  2591.         add hl,de
  2592.         adc a,0
  2593.         add hl,hl
  2594.         rla
  2595.         edup
  2596.         rlc c
  2597.         ret nc
  2598.         add hl,de
  2599.         adc a,0
  2600.         ret
  2601.  
  2602. ;hl / de результат в hl
  2603. divhlde
  2604.         ld c,h
  2605.         ld a,l
  2606.         ld hl,0
  2607.         ld b,16
  2608. ;don't mind carry
  2609. _DIV0.
  2610. ;shift left hlca
  2611.         rla
  2612.         rl c
  2613.         adc hl,hl
  2614. ;no carry
  2615. ;try sub
  2616.         sbc hl,de
  2617.         jr nc,$+3
  2618.         add hl,de
  2619. ;carry = inverted bit of result
  2620.         djnz _DIV0.
  2621.         rla
  2622.         cpl
  2623.         ld l,a
  2624.         ld a,c
  2625.         rla
  2626.         cpl
  2627.         ld h,a
  2628. reter
  2629.         ret
  2630.  
  2631.        if PRSTDIO == 0
  2632. editcmd_showscr
  2633.         call nv_copyscreen1to0
  2634.         YIELDGETKEYLOOP
  2635.         xor a
  2636.         ld (leftpanel+PANEL.drawtableunneeded),a
  2637.         ld (rightpanel+PANEL.drawtableunneeded),a
  2638.         jp editcmd_reprintall_keepcursor
  2639.        endif
  2640.  
  2641. editcmd_0
  2642.         call ifcmdnonempty_typedigit
  2643. editcmd_quit
  2644.         ld de,_COLOR_RED
  2645.         call nv_setcolor
  2646.         ld hl,winquit
  2647.         call prwindow_waitkey ;CY=OK
  2648.         jp nc,editcmd_reprintall_keepcursor;editcmd_reprintall
  2649.         call makeprompt
  2650.         OS_SETSYSDRV
  2651.         ld de,fn_path
  2652.         OS_CREATEHANDLE
  2653.         push bc
  2654.         call cmdcalcpromptsz ;hl=strlen
  2655.         inc hl ;size
  2656.         pop bc
  2657.         push bc
  2658.         ld de,cmdprompt
  2659.         OS_WRITEHANDLE
  2660.         pop bc
  2661.         OS_CLOSEHANDLE
  2662.         ld hl,cmdprompt
  2663.         OS_CHDIR
  2664.         ld hl,0 ;result
  2665.         QUIT
  2666.  
  2667. ifcmdnonempty_typedigit
  2668. ;keeps ix
  2669.         ld c,a
  2670.         ld a,(cmdbuf)
  2671.         or a
  2672.         ld a,c
  2673.         ret z ;cmd is empty
  2674.          pop bc ;skip return to editcmdN
  2675.         jp editcmd_typein
  2676.  
  2677. editcmd_typeword
  2678.         call getfcbundercursor
  2679.         ld hl,fcb_filename
  2680.         ld de,tnewfilename
  2681.         call cpmname_to_dotname ;de указывает на терминатор
  2682.         ld hl,cmdbuf
  2683.         call strlen ;hl=length
  2684.         ld bc,MAXCMDSZ-11
  2685.         or a
  2686.         sbc hl,bc
  2687.         ret nc ;некуда вводить
  2688.         add hl,bc
  2689.         ld bc,cmdbuf
  2690.         add hl,bc
  2691.         ex de,hl ;de=end of cmdbuf
  2692.         ld a,(cmdbuf)
  2693.         or a
  2694.         ld hl,tnewfilename
  2695.         jr z,editcmd_typeword_empty
  2696.         dec hl ;с пробелом
  2697. editcmd_typeword_empty
  2698.         call strcopy;nv_strcopy_hltode ;out: hl,de at terminator
  2699.         ld hl,cmdbuf
  2700.         call strlen ;hl=length
  2701.         ld a,l
  2702.         ld (curcmdx),a
  2703.         ret
  2704.  
  2705. windrv
  2706.         dw 0x0003 ;de=yx
  2707.         dw 256*(3+NDRIVES)+28 ;0x0809 ;bc=hgt,wid
  2708.         db "Drive",0
  2709.         db 3 ;next line
  2710.         db "  A: - 1st Floppy",0,3
  2711.         db "  B: - 2nd Floppy",0,3
  2712.         db "  C: - 3rd Floppy",0,3
  2713.         db "  D: - 4th Floppy",0,3
  2714.         db "  E: - IDE Master p.1",0,3
  2715.         db "  F: - IDE Master p.2",0,3
  2716.         db "  G: - IDE Master p.3",0,3
  2717.         db "  H: - IDE Master p.4",0,3
  2718.         db "  I: - IDE Slave p.1",0,3
  2719.         db "  J: - IDE Slave p.2",0,3
  2720.         db "  K: - IDE Slave p.3",0,3
  2721.         db "  L: - IDE Slave p.4",0,3
  2722.         db "  M: - SD Z-controller",0,3
  2723.         db "  N: - SD NeoGS",0,3
  2724.         db "  O: - USB flash zx-net",0,3
  2725.         db 0 ;end of window
  2726.  
  2727. winmkdir
  2728.         dw 0x0a07 ;de=yx
  2729.         dw 0x0544 ;bc=hgt,wid
  2730.         db "Create new directory:",0
  2731.         db 3 ;next line
  2732.         db 2 ;print outer text
  2733.         dw tnewfilename
  2734.         db 0 ;end of window
  2735.  
  2736. winrename
  2737.         dw 0x0a07 ;de=yx
  2738.         dw 0x0544 ;bc=hgt,wid
  2739.         db "Rename file:",0
  2740.         db 3 ;next line
  2741.         db 2 ;print outer text
  2742.         dw tnewfilename
  2743.         db 0 ;end of window
  2744.  
  2745. wincopy
  2746.         dw 0x0a07 ;de=yx
  2747.         dw 0x0544 ;bc=hgt,wid
  2748.         db "Copy ",0
  2749.         db 1
  2750.         db " file(s)/dir(s) to:",0
  2751.         db 3 ;next line
  2752.         db 2 ;print outer text
  2753.         dw dir2_buf
  2754.         db 0 ;end of window
  2755.  
  2756.         db ' ' ;для typeword - перед tnewfilename
  2757. tnewfilename
  2758.         ds 64 ;max filename size+terminator
  2759.  
  2760. winquit
  2761.         dw 0x0a1f ;de=yx
  2762.         dw 0x0515 ;bc=hgt,wid
  2763.         db 3 ;next line
  2764.         db "Quit Nedovigator?",0
  2765.         db 0 ;end of window
  2766.  
  2767. windel
  2768.         dw 0x0919 ;de=yx
  2769.         dw 0x051f ;bc=hgt,wid
  2770.         db 3 ;next line
  2771.         db "Delete ",0
  2772.         db 1 ;nfiles
  2773.         db " file(s)?",0
  2774.         db 0 ;end of window
  2775.  
  2776. wincopy2
  2777.         dw 0x0706 ;de=yx
  2778.         db 68,8 ;wid,hgt
  2779.         db 3 ;next line
  2780.         db " Copying",0,3
  2781. wincopy_src
  2782.         db "                                                                ",0,3
  2783.         db " to",0,3
  2784. wincopy_dest
  2785.         db "                                                                ",0
  2786.         db 0 ;end of window
  2787.  
  2788. windel2
  2789.         dw 0x0706 ;de=yx
  2790.         db 68,6 ;bc=wid,hgt
  2791.         db " Deleting",0,3
  2792.         db 3 ;next line
  2793. windel2_file
  2794.         db "                                                                ",0
  2795.         db 0 ;end of window
  2796.  
  2797. windrverr
  2798.         dw 0x040f ;de=yx
  2799.         dw 0x0510 ;bc=hgt,wid
  2800.         db 3 ;next line
  2801.         db "Drive error!",0
  2802.         db 0 ;end of window
  2803.  
  2804. tdotdot
  2805.         dw "..",0
  2806.  
  2807.         STRUCT PANEL
  2808. xy              WORD
  2809. catbuf          WORD ;TODO remove
  2810. poipg           BYTE
  2811. pointers        WORD ;TODO remove
  2812. pgadd           BYTE ;0/DIRPAGES
  2813. curpgfcbpoi     WORD
  2814. curpglnamepoi   WORD
  2815. drawtableunneeded BYTE
  2816. totalsize       DWORD
  2817. files           WORD ;visible files
  2818. filesdirs       WORD ;files+dirs (no ".", "..")
  2819. markedfiles     WORD
  2820. markedsize      DWORD
  2821. dirpos          WORD
  2822. dirscroll       WORD
  2823. dirviewmode     BYTE
  2824. dirsortproc     WORD
  2825. dirsortmode     BYTE
  2826. dir             BLOCK MAXPATH_sz
  2827.         ENDS
  2828. ;PANEL_sz=13+MAXPATH_sz
  2829.  
  2830. leftpanel PANEL
  2831. rightpanel PANEL
  2832.  
  2833. ;<0x4000 for hobeta
  2834. fcb
  2835.         ds FCB_sz
  2836. fcb_filename=fcb+FCB_FNAME        
  2837. fcb_attrib=fcb+FCB_FATTRIB
  2838.  
  2839. ;TODO kill (used in batch)
  2840. fcbmask
  2841.         db 0
  2842.         db "???????????"
  2843.         ds FCB_sz-11-1
  2844. fcbmask_filename=fcbmask+FCB_FNAME        
  2845.  
  2846. fcb2
  2847.         ds FCB_sz
  2848. fcb2_filename=fcb2+FCB_FNAME        
  2849.  
  2850. fn_ext
  2851.         db "nv.ext",0
  2852. fn_path
  2853.         db "nv.pth",0
  2854. cmd_filename
  2855.         db "cmd     com"
  2856. texted_filename
  2857.         db "texted  com"
  2858.  
  2859. filenametext ;for change dir, rename
  2860.         ds 64 ;max filename size+terminator
  2861.  
  2862. ext
  2863.         ds 3 ;TODO объединить с filenametext
  2864.  
  2865. copybuf=0x4000 ;нельзя 0xc000 - поверх какой-нибудь директории (а она используется при копировании) ;0x8000 можно только после выставления страницы там
  2866. copybuf_sz=0x4000 ;$-copybuf
  2867.  
  2868. dir_batch_pointer db 0,0
  2869. savepg db 0,0
  2870. dirpg db 0,0
  2871.  
  2872. washobetarunner
  2873. ;pgsys=pagexor-10
  2874. ;pgfatfs=pagexor-9
  2875. ;pgtrdosfs=pagexor-8
  2876. ;pgkillable=pagexor-4 ;в 128K памяти, т.к. можно портить
  2877.         disp hobetarunner ;in pgkillable
  2878. ;$c loaded in pages 4,1,0
  2879. ;only ATM2 ports here!
  2880.         ;di ;было выше
  2881.         ld a,0x7f-5
  2882.         ld bc,0xbff7
  2883.         out (c),a ;4,5,0
  2884.         ld a,0x7f-4
  2885.         ld b,0xff;f7
  2886.         out (c),a ;4,5,4
  2887.         ld hl,0xc000
  2888.         ld de,0x8000
  2889.         ld bc,0x4000
  2890.         ldir ;pg4 -> pg5
  2891.         ld a,0x7f-8;pgtrdosfs ;нельзя TOPDOWNMEM!!!
  2892.         ld bc,0xfff7
  2893.         out (c),a ;4,5,8
  2894.         ld hl,0x1c00+0xc000
  2895.         ld de,0x1c00+0x8000
  2896.         ld bc,0x400
  2897.         ldir ;restore sysvars
  2898.         ld a,0x7f-2
  2899.         ld bc,0xbff7
  2900.         out (c),a
  2901.         ld a,0x7f-1
  2902.         ld b,0xff;f7
  2903.         out (c),a
  2904.         ld hl,0xc000
  2905.         ld de,0x8000
  2906.         ld bc,0x4000
  2907.         ldir ;pg1 -> pg2
  2908.         ld a,0x7f-0+0x80
  2909.         ld bc,0xfff7
  2910.         out (c),a
  2911.         xor a;ld a,0x00
  2912.         ld bc,0x7ffd
  2913.         out (c),a
  2914.         ld a,0x81 ;128 basic (with 7ffd)
  2915.         ld bc,0x3ff7
  2916.         out (c),a
  2917.         ld a,0x7f-5
  2918.         ld b,0x7f;f7
  2919.         out (c),a
  2920. ;128: pages DOS,5,2,0(7ffd)
  2921.         ld a,0x10
  2922.         ld bc,0x7ffd
  2923.         out (c),a
  2924. ;48: pages A,4,4,4
  2925.         ld a,0x7f-5
  2926.         ld bc,0x7ff7
  2927.         out (c),a
  2928.         ld a,0x7f-2
  2929.         ld b,0xbf;f7
  2930.         out (c),a
  2931.         ld a,0x7f-0+0x80
  2932.         ld b,0xff;f7
  2933.         out (c),a
  2934.         ld a,0x83 ;48 basic switchable to DOS
  2935.         ld b,0x3f;f7
  2936.         out (c),a
  2937. ;48: pages DOS,5,2,0(7ffd)
  2938.  
  2939.         LD A,0b10101011 ;6912
  2940.         ld bc,0xff77 ;shadow ports off, palette off
  2941.         out (c),a
  2942.         ld sp,0x6000
  2943.         ld iy,23610
  2944.         ld a,0xc9
  2945.         ld (0x5cc2),a
  2946.         ei
  2947. hobetarunner_jp=$+1
  2948.         jp 0x6000
  2949.         ent
  2950. hobetarunner_sz=$-washobetarunner
  2951.  
  2952. wordfiles
  2953.         db "1234567890 files ";,0
  2954. wordbytes
  2955.         db "1234567890 bytes ",0
  2956. emptypath=$-1
  2957.         ;db 0
  2958.  
  2959. filinfo
  2960.         ds FILINFO_sz
  2961.  
  2962.         include "nvsort.asm"
  2963.         include "heapsort.asm"
  2964.  
  2965.         include "nvjptbl.asm"
  2966.         include "nvunit.asm"
  2967.         include "nveditln.asm"
  2968.         include "nvview.asm"
  2969.         include "nvhexed.asm"
  2970.         include "nvfind.asm"
  2971.  
  2972.         include "prdword.asm"
  2973.         include "cmdpr.asm"
  2974.        if PRSTDIO
  2975.         include "../_sdk/stdio.asm"
  2976.        endif
  2977.  
  2978.         align 256
  2979. searchbuf
  2980. SEARCHBUF_SZ=128 ;2 таких
  2981. file_buf
  2982. dir_buf
  2983.         ds 128
  2984. file_buf_end=$-1
  2985. dir2_buf
  2986.         ds 128        
  2987. dir3_buf
  2988.         ds 256 ;max size for no bugs
  2989.  
  2990.         align 256
  2991. HS_strpg
  2992.         ds 256;DIRPAGES*2+2 ;по 1 байту на маркеры "0"
  2993.         align 256
  2994. textpages
  2995.         ds 256
  2996. twinto866
  2997.         incbin "../_sdk/codepage/winto866"
  2998. cmd_end
  2999.  
  3000.         display "nv size ",/d,cmd_end-cmd_begin," bytes"
  3001.  
  3002.        if PRSTDIO
  3003.         savebin "nv.com",cmd_begin,cmd_end-cmd_begin
  3004.        else
  3005.         savebin "nvfast.com",cmd_begin,cmd_end-cmd_begin
  3006.        endif
  3007.  
  3008.         LABELSLIST "../../us/user.l"
  3009.