Subversion Repositories NedoOS

Rev

Rev 1108 | Rev 1213 | 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.         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.         jp z,editcmd_pageUp ;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.         jp z,editcmd_pageDown ;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. start_from_ext
  1348.         ld hl,cmdbuf - 1
  1349.         xor a
  1350. start_from_ext_l1
  1351.         inc hl
  1352.         cp (hl)
  1353.         jr nz,start_from_ext_l1
  1354.         ld a,' '
  1355.         ld (hl),a
  1356.         ld de,cmdprompt
  1357. start_from_ext_l2
  1358.         inc hl
  1359.         ld a,(de)
  1360.         ld (hl),a
  1361.         inc de
  1362.         or a
  1363.         jr nz,start_from_ext_l2
  1364.        
  1365. editcmd_enter_runcmd
  1366. ;run "cmd <command to run>"
  1367.         OS_SETSYSDRV ;TODO каталог cmd
  1368.         ld hl,cmd_filename
  1369.         call copy_to_fcb_filename
  1370.  
  1371.         ld hl,cmdbuf
  1372. loadandrun_waitpid
  1373. ;hl=cmdbuf или cmdprompt (для loadandrun_restcmd)
  1374.         push hl
  1375.         call setdrawtablesneeded
  1376.        if PRSTDIO
  1377.         ld de,0
  1378.         call nv_setxy ;keeps de,hl,ix
  1379.         ld de,_COLOR
  1380.         SETCOLOR_
  1381.         CLS_
  1382.         ld de,0
  1383.         call nv_setxy ;keeps de,hl,ix
  1384.        else
  1385.         call nv_copyscreen1to0
  1386.         ld e,-1
  1387.         OS_SETGFX ;disable gfx, give focus ;before RUNAPP!!!
  1388.        endif
  1389.         ld ix,leftpanel
  1390.         call strdelpages
  1391.         ld ix,rightpanel
  1392.         call strdelpages
  1393.         call deletepages
  1394.         pop hl ;hl=cmdbuf или cmdprompt
  1395.          ;call setcurpaneldir
  1396.         call loadandrun ;nz=error, e=id
  1397.         jp nz,execcmd_error
  1398. ;команда scratch - реально cmd scratch в текущем терминале
  1399.         WAITPID
  1400. ;wait for focus
  1401.         if 1==0
  1402. execcmd_waitfocus0
  1403.          YIELD
  1404.          ld a,(user_scr0_low)
  1405.          ld hl,user_scr0_high
  1406.          cp (hl)
  1407.          jr z,execcmd_waitfocus0
  1408.         endif
  1409.        if PRSTDIO
  1410.         CLS_ ;scroll what was printed
  1411.        endif
  1412. execcmd_error
  1413.         call assignpages
  1414.        if PRSTDIO == 0
  1415.         ld e,6 ;textmode
  1416.         OS_SETGFX ;take focus (can be random after closing cmd)
  1417.         call nv_copyscreen0to1
  1418.         YIELDGETKEY ;key refresh
  1419.        endif
  1420.         xor a
  1421.         ld (cmdbuf),a
  1422.         ld (curcmdscroll),a
  1423.         jp editcmd_reprintall_keepcursor
  1424.  
  1425. editcmd_enter_run
  1426.         call setpaneldir
  1427.         ld hl,fcb_filename+8
  1428.         ld a,(hl)
  1429.         inc hl
  1430.         ld c,(hl)
  1431.         inc hl
  1432.         ld b,(hl)
  1433.         cp '$'
  1434.         jp z,editcmd_enter_runfile_hobeta
  1435.         or 0x20
  1436.         cp 'c'
  1437.         jr nz,editcmd_enter_runfile_nocom
  1438.         ld a,c
  1439.         or 0x20
  1440.         cp 'o'
  1441.         jr nz,editcmd_enter_runfile_nocom
  1442.         ld a,b
  1443.         or 0x20
  1444.         cp 'm'
  1445.         jr nz,editcmd_enter_runfile_nocom
  1446. editcmd_enter_runfile_com
  1447.         ld hl,cmdbuf
  1448.         ld (hl),0
  1449. ;hl=rest of command line
  1450.         jp loadandrun_waitpid
  1451.  
  1452. editcmd_enter_runfile_nocom
  1453.         ld hl,runfile_nocomq
  1454.         push hl
  1455.         call makeprompt_filename
  1456.        
  1457.         call runfile_findhandler ;find fcb_filename ext (spoiled) in "nv.ext"
  1458.         ret nz ;jp nz,execcmd_error
  1459.         jp start_from_ext
  1460.         ; ld de,cmdbuf
  1461.         ; ld hl,fcb_filename
  1462.         ; OS_PARSEFNAME ;de->hl
  1463.        
  1464.         ; OS_SETSYSDRV ;TODO директория cmd
  1465.         ; ld hl,cmdprompt
  1466.         ; jp loadandrun_waitpid
  1467.  
  1468. makeprompt_filename
  1469.         call setpaneldir_makeprompt ;keeps ix
  1470.         call getfcbundercursor ;->fcb
  1471.         ld hl,cmdprompt
  1472.         xor a
  1473.         cpir
  1474.         dec hl ;hl=адрес терминатора
  1475.         ld a,'/'
  1476.         dec hl
  1477.         cp (hl)
  1478.         inc hl
  1479.         jr z,$+4
  1480.          ld (hl),a
  1481.          inc hl
  1482.         ex de,hl ;de=prompt = "d:/path/" без терминатора
  1483.         ld hl,fcb_filename
  1484.         jp cpmname_to_dotname ;prompt = "d:/path/filename"
  1485.        
  1486. runfile_findhandler
  1487. ;find fcb_filename ext (spoiled) in "nv.ext"
  1488. ;out: nz=error, cmdbuf=handler
  1489.         ld hl,fcb_filename+8
  1490.         ld de,ext
  1491.         ld b,3
  1492. runfile_nocom_recodeext0
  1493.         ld a,(hl)
  1494.         or 0x20
  1495.         ld (de),a
  1496.         inc hl
  1497.         inc de
  1498.         djnz runfile_nocom_recodeext0
  1499.         OS_SETSYSDRV ;TODO директория nv
  1500.         ld de,fn_ext
  1501.         ;ld hl,ext_filename
  1502.         ;ld de,filenametext
  1503.         ;push de
  1504.         ;call cpmname_to_dotname
  1505.         ;pop de
  1506.         OS_OPENHANDLE
  1507.         or a
  1508.         ret nz ;error
  1509.         ld a,b
  1510.         ld (curhandle),a
  1511.         ld iy,file_buf_end
  1512. runfile_nocom_extloop
  1513.         call checkoneext ;c=ошибки, z=нет ошибок
  1514.         jr c,runfile_nocom_readerror
  1515.         jr z,runfile_nocom_extok
  1516.         call checkcomma
  1517.         jr c,runfile_nocom_readerror
  1518.         jr z,runfile_nocom_extloop
  1519.         call skiptonextline
  1520.         jr nz,runfile_nocom_extloop ;no EOF
  1521. runfile_nocom_readerror
  1522.         call nv_closehandle
  1523.         xor a
  1524.         dec a
  1525.         ret ;nz
  1526.         display "runfile_nocom_extok ",$
  1527. runfile_nocom_extok
  1528.         call skiptocolon ;пройти к ':'
  1529.         ld hl,cmdbuf
  1530.         call loadtoendline
  1531.         call nv_closehandle
  1532.         xor a
  1533.         ret ;z
  1534.  
  1535. runfile_nocomq
  1536.         ld hl,cmdbuf
  1537.         ld (hl),0
  1538.         ld ix,(curpanel)
  1539. setpaneldir_makeprompt
  1540.         call setpaneldir ;keeps ix
  1541.         jp makeprompt ;-> prompt ;keeps ix
  1542.  
  1543.         macro READBYTE_A
  1544. ;out: z=EOF
  1545.         inc ly
  1546.         call m,readbyte_readbuf
  1547.         ld a,(iy)
  1548.         endm
  1549.  
  1550. checkoneext
  1551.         ld hl,ext
  1552.         ld bc,3*256
  1553. checkoneext0
  1554.         READBYTE_A
  1555.         ret z ;EOF
  1556.         cp 0x0a
  1557.         jr z,checkoneext0 ;skip LF
  1558.         or 0x20
  1559.         xor (hl)
  1560.         inc hl
  1561.         or c
  1562.         ld c,a
  1563.         djnz checkoneext0
  1564. ;c=ошибки, z=нет ошибок
  1565.         ret
  1566.  
  1567. skiptocolon
  1568.         READBYTE_A
  1569.         ret z ;EOF
  1570.         cp ':'
  1571.         jr nz,skiptocolon
  1572.         ret
  1573.  
  1574. checkcomma
  1575.         READBYTE_A
  1576.         cp ','
  1577.         ret ;TODO проверить EOF
  1578.  
  1579. loadtoendline
  1580. ;hl=buf
  1581.         READBYTE_A
  1582.         jr z,loadtoendlineq
  1583.         cp 0x0d
  1584.         jr z,loadtoendlineq
  1585.         ld (hl),a
  1586.         inc hl
  1587.         jr loadtoendline
  1588. loadtoendlineq
  1589.         ld (hl),0
  1590.         ret
  1591.  
  1592. skiptonextline
  1593.         READBYTE_A
  1594.         ret z ;EOF
  1595.         cp 0x0d
  1596.         jr nz,skiptonextline
  1597.         or a
  1598.         ret ;nz
  1599.  
  1600. readbyte_readbuf
  1601. ;out: z=EOF
  1602.         push bc
  1603.         push de
  1604.         push hl
  1605.         push ix
  1606.         ld de,file_buf
  1607.         push de
  1608.         ld hl,128
  1609.         call readcurhandle
  1610.         ld a,h
  1611.         or l ;z=no bytes read
  1612.         pop iy
  1613.         pop ix
  1614.         pop hl
  1615.         pop de
  1616.         pop bc
  1617.         ret
  1618.  
  1619. editcmd_enter_runfile_hobeta
  1620. hobetarunner=0x4100
  1621.         ld e,6 ;textmode
  1622.         OS_SETGFX
  1623.  
  1624.         ld a,(user_scr0_low) ;ok
  1625.         SETPG32KLOW
  1626.         inc a ;ld a,#ff-0
  1627.         SETPG32KHIGH
  1628. ;0x4000 : pgcode4000 ;(pg4 может запортиться от стека!!! причём не только этой задачи!!!)
  1629. ;0x8000 : pg1
  1630. ;0xc000 : pg0
  1631.         call loadhobeta
  1632.         ret nz ;error
  1633.  
  1634.         di
  1635.         ld a,(user_scr0_low) ;ok
  1636.         sub 4-1 ;ld a,#ff-4 ;pgkillable
  1637.         SETPG32KLOW
  1638.         ld hl,0x4000
  1639.         ld de,0x8000
  1640.         ld bc,0x4000
  1641.         ldir ;copy pgcode4000 -> pg4
  1642.  
  1643.         ld a,(user_scr0_low) ;ok
  1644.         SETPG32KLOW
  1645.         ;ld a,(user_scr0_low) ;ok
  1646.         sub 4-1 ;ld a,#ff-4 ;pgkillable
  1647.         SETPG16K
  1648.         ld hl,washobetarunner
  1649.         ld de,hobetarunner
  1650.         ld bc,hobetarunner_sz
  1651.         ldir
  1652. ;0x4000 : pg4 (может запортиться от стека!!! причём не только этой задачи!!!)
  1653. ;0x8000 : pg1
  1654. ;0xc000 : pg0
  1655.         ld hl,0x6000
  1656.         ld bc,(0x6000-17+11) ;len
  1657.         add hl,bc
  1658.         dec hl ;hl=load end
  1659.         ex de,hl
  1660.         ld hl,(0x6000-17+9) ;start
  1661.         ld (hobetarunner_jp),hl
  1662.         add hl,bc
  1663.         dec hl
  1664.         ex de,hl ;de=destination end
  1665.         lddr
  1666.         jp hobetarunner
  1667.  
  1668. loadhobeta
  1669.         ld hl,fcb_filename
  1670.         ld de,filenametext
  1671.         push de
  1672.         call cpmname_to_dotname
  1673.         pop de
  1674.         OS_OPENHANDLE
  1675.         or a
  1676.         ret nz ;error
  1677.         ld a,b
  1678.         ld (curhandle),a
  1679.         ld de,0x6000-17
  1680.         ld hl,-(0x6000-17)
  1681.         OS_READHANDLE
  1682.         call nv_closehandle
  1683.         xor a ;no error
  1684.         ret ;call nv_closefcb
  1685.  
  1686. loadandrun
  1687. ;hl=rest of command line
  1688. ;out: nz=error, e=id
  1689. ;load file in fcb from system current dir with parameters in tcmd, then set curpaneldir and run
  1690.         ld (loadandrun_restcmd),hl
  1691.         ld hl,fcb_filename
  1692.         ld de,filenametext
  1693.         push de
  1694.         call cpmname_to_dotname
  1695.         pop de
  1696.         OS_OPENHANDLE
  1697.         or a
  1698.         ret nz ;error
  1699.         ld a,b
  1700.         ld (curhandle),a
  1701.         ld hl,nv_closehandle
  1702.         push hl
  1703.         ;set current drive and dir (will be copied into new app)
  1704.         call setcurpaneldir
  1705.  
  1706.         OS_NEWAPP
  1707.         or a
  1708.         ret nz ;error
  1709. ;dehl=номера страниц в 0000,4000,8000,c000 нового приложения, b=id, a=error
  1710.         push bc ;b=id
  1711.         ld a,d
  1712.         SETPG32KHIGH
  1713.         push de
  1714.         push hl
  1715.         ld hl,fcb_filename
  1716.         ld de,0xc000+COMMANDLINE
  1717.         call cpmname_to_dotname ;de указывает на терминатор
  1718. loadandrun_restcmd=$+1
  1719.         ld hl,0
  1720.          ld a,(hl)
  1721.          or a
  1722.          jr z,loadandrun_noparams
  1723.         ld a,' '
  1724.         ld (de),a
  1725.         inc de
  1726. loadandrun_noparams
  1727.         ld bc,COMMANDLINE_sz;-tcmd_sz
  1728.         ldir ;copy command line ;можем залезть за 0x0100!
  1729.         xor a
  1730.         ld (0xc000+COMMANDLINE+COMMANDLINE_sz-1),a
  1731.         pop hl
  1732.         pop de
  1733.  
  1734.         call readfile_pages_dehl
  1735.  
  1736.         pop de
  1737.         ld e,d ;e=id
  1738. ;run "cmd <commandline>"
  1739.         push de
  1740.         OS_RUNAPP
  1741.         pop de
  1742.         xor a
  1743.         ret ;z
  1744.  
  1745. editcmd_1
  1746.         call ifcmdnonempty_typedigit
  1747. editcmd_F1
  1748.         ld ix,(curpanel)
  1749.         ld a,(ix+PANEL.xy)
  1750.         add a,10
  1751.         ld (windrv),a ;x
  1752.         add a,5
  1753.         ld (windrverr),a
  1754.        ;ld hl,editcmd_reprintcurpanel;editcmd_reprintall_onlyreadcurdir
  1755.        ;push hl
  1756.  
  1757. seldrv_redraw_mainloop
  1758.         ld hl,windrv
  1759. ;hl=window
  1760.         ld de,_COLOR_DIALOG
  1761.         call nv_setcolor
  1762.  
  1763.         call prwindow_text ;de=YX of last line
  1764. seldrv_mainloop
  1765.         ld de,(windrv)
  1766. seldrv_cury=$+1
  1767.         ld a,0
  1768.         add a,d
  1769.         add a,2
  1770.         ld d,a
  1771.         inc e
  1772.         inc e
  1773.         inc e
  1774.         push de
  1775.         ld hl,_CURSORCOLOR
  1776.         ld b,22
  1777.         call drawfilecursor_sizeb_colorhl ;draw cursor
  1778. seldrv_mainloop_nokey
  1779.        if PRSTDIO
  1780.         call yieldgetkeyloop
  1781.        else
  1782.         YIELDGETKEYLOOP
  1783.        endif
  1784.          or a
  1785.          jr z,seldrv_mainloop_nokey ;TODO handle mouse events
  1786.         ld a,c
  1787.         pop de
  1788.         push af
  1789.         ld hl,_COLOR_DIALOG
  1790.         ld b,22
  1791.         call drawfilecursor_sizeb_colorhl ;remove cursor
  1792.         pop af
  1793.         cp key_redraw
  1794.         jr z,seldrv_redraw_mainloop
  1795.         ld hl,seldrv_cury
  1796.         cp key_enter
  1797.         jr z,seldrv_selcursor
  1798.         cp key_esc
  1799.         jp z,editcmd_reprintall_noreaddir ;ret z
  1800.         cp 'a'
  1801.         jr c,seldrv_cursor
  1802.         cp 'a'+NDRIVES;'p'
  1803.         jr c,seldrv_selletter
  1804. seldrv_cursor
  1805.         ld bc,seldrv_mainloop
  1806.         push bc
  1807.         cp key_down
  1808.         jr z,seldrv_down
  1809.         cp key_up
  1810.         jr z,seldrv_up
  1811.         ret
  1812. seldrv_selletter
  1813.         sub 'a'
  1814.         jr seldrv_ok
  1815. seldrv_selcursor
  1816.         ld a,(hl)
  1817. seldrv_ok
  1818.         ld e,a
  1819.         push de
  1820.         OS_SETDRV
  1821.         pop de
  1822.         or a
  1823.         jr z,seldrv_ok_ok
  1824.         ld de,_COLOR_RED
  1825.         call nv_setcolor
  1826.         ld hl,windrverr
  1827.         call prwindow_waitkey
  1828.         ld de,_COLOR
  1829.         call nv_setcolor
  1830.         jp seldrv_redraw_mainloop
  1831. seldrv_ok_ok
  1832.         ld a,e
  1833.         add a,'a'
  1834.         call getcurpaneldir_hl
  1835.         ;ld ix,(curpanel)
  1836.         ld (hl),a
  1837.         inc hl
  1838.         ld (hl),':'
  1839.         inc hl
  1840.         ld (hl),'/'
  1841.         inc hl
  1842.         ld (hl),0
  1843.         jp editcmd_reprintcurpanel ;ret
  1844.  
  1845. seldrv_down
  1846.         ld a,(hl)
  1847.         inc a
  1848.         cp NDRIVES;15
  1849.         ;ret z
  1850.          jr nz,$+3
  1851.          xor a
  1852.         ld (hl),a
  1853.         ret
  1854. seldrv_up
  1855.         ld a,(hl)
  1856.         or a
  1857.         ;ret z
  1858.          jr nz,$+4
  1859.          ld (hl),NDRIVES
  1860.         dec (hl)
  1861.         ret
  1862.  
  1863. editcmd_4
  1864.         call ifcmdnonempty_typedigit
  1865. editcmd_F4
  1866.         call getfcbundercursor ;->fcb
  1867.         ld a,(fcb+FCB_FATTRIB)
  1868.         and FATTRIB_DIR;#10
  1869.         ret nz
  1870.  
  1871.         ld hl,editcmd_reprintall_noreaddir
  1872.         push hl
  1873.  
  1874.         call makeprompt_filename
  1875.  
  1876.         ;call runfile_findhandler ;find fcb_filename ext (spoiled) in "nv.ext"
  1877.         ;ret nz ;jp nz,execcmd_error
  1878.  
  1879.         ;ld de,cmdbuf
  1880.         ;ld hl,fcb_filename
  1881.         ;OS_PARSEFNAME ;de->hl
  1882.  
  1883.         OS_SETSYSDRV ;TODO директория texted
  1884.  
  1885.         ld hl,texted_filename
  1886.         call copy_to_fcb_filename
  1887.  
  1888.         ;ld hl,cmdbuf
  1889.         ;ld (hl),0
  1890.         ld hl,cmdprompt
  1891. ;load file in fcb from system current dir with parameters in tcmd, then set curpaneldir and run
  1892.         jp loadandrun_waitpid
  1893.  
  1894. editcmd_9
  1895.         call ifcmdnonempty_typedigit
  1896.         ;ld e,1
  1897.         ;OS_SETSCREEN
  1898.         ;YIELDGETKEYLOOP
  1899.         ;ld e,0
  1900.         ;OS_SETSCREEN
  1901.         ret
  1902.  
  1903. editcmd_reprintall_keepcursor
  1904.         call readpanels_reprint_keepcursor
  1905.         jp editcmd_readprompt_setendcmdx
  1906.  
  1907. editcmd_reprintcurdir
  1908.         ld hl,leftpanel+PANEL.dir
  1909.         ld de,rightpanel+PANEL.dir
  1910.         call strcp
  1911.         jr nz,editcmd_reprintcurpanel
  1912. editcmd_reprintall
  1913.         call readpanels_reprint
  1914.         jp editcmd_readprompt_setendcmdx
  1915. editcmd_reprintcurpanel
  1916.         ld ix,(curpanel)
  1917.         call readdir
  1918.         call sortfiles
  1919. ;editcmd_reprintcurpanel_ix_noreaddir
  1920.         call drawpanel_with_files
  1921.         jp editcmd_readprompt_setendcmdx
  1922. editcmd_reprintall_noreaddir
  1923.         ;ld e,COLOR
  1924.         ;OS_CLS
  1925.         call printhint
  1926.         ld ix,leftpanel
  1927.         call drawpanel_with_files
  1928.         ld ix,rightpanel
  1929.         jp drawpanel_with_files
  1930. ;editcmd_reprintall_onlyreadcurdir
  1931. ;       ld e,COLOR
  1932. ;       OS_CLS
  1933. ;       call printhint
  1934. ;       call getanotherpanel_ix
  1935. ;       call drawpanel_with_files
  1936. ;       jp editcmd_reprintcurpanel
  1937.  
  1938. editcmd_invfiles
  1939. ;ix=curpanel
  1940.         ld hl,changemark_hl
  1941.         call processfiles
  1942.         jp drawpanel_with_files
  1943.  
  1944. editcmd_6 ;ren
  1945.         call ifcmdnonempty_typedigit
  1946. editcmd_F6
  1947.         ld hl,editcmd_reprintall_keepcursor;editcmd_reprintall
  1948.         push hl
  1949.         call setpaneldir
  1950.         call getfcbundercursor
  1951.  
  1952.         if 1==1
  1953.         ld a,(fcb+FCB_EXTENTNUMBERLO)
  1954.         SETPG32KHIGH
  1955.         ld hl,(fcb+FCB_EXTENTNUMBERHI)
  1956.         ld de,filenametext
  1957.         push hl
  1958.         call strcopy
  1959.         pop hl
  1960.         ld de,tnewfilename
  1961.         call strcopy
  1962.         ;ld bc,64 ;max filename size+terminator
  1963.         ;ldir
  1964.         else
  1965.         ld hl,fcb_filename
  1966.         ld de,tnewfilename
  1967.         push de
  1968.         call cpmname_to_dotname
  1969.         pop hl
  1970.         ld de,filenametext
  1971.         ld bc,12
  1972.         ldir
  1973.         endif
  1974.  
  1975.         ld de,_COLOR_DIALOG
  1976.         call nv_setcolor
  1977.  
  1978.         ld hl,winrename
  1979.         ld de,tnewfilename
  1980.         ld c,63;13 ;max filename size
  1981.         call prwindow_edit ;CY=OK
  1982.         ret nc ;cancel
  1983. ;если в имени есть символы :,/,\, то выйти с ошибкой
  1984.         ld hl,tnewfilename
  1985. editcmd_ren_checkname0
  1986.         ld a,(hl)
  1987.         or a
  1988.         jr z,editcmd_ren_checknameq
  1989.         inc hl
  1990.         cp ':'
  1991.         ret z ;error
  1992.         cp '/'
  1993.         ret z ;error
  1994.         cp 0x5c;'\\'
  1995.         ret z ;error
  1996.         jr editcmd_ren_checkname0
  1997. editcmd_ren_checknameq
  1998.         ld de,filenametext
  1999.         ld hl,tnewfilename
  2000.         OS_RENAME
  2001.         ;todo error
  2002.         ret
  2003.  
  2004. editcmd_7 ;mkdir
  2005.         call ifcmdnonempty_typedigit
  2006. editcmd_F7
  2007.         ld hl,editcmd_reprintall_keepcursor;editcmd_reprintall
  2008.         push hl
  2009.         call setpaneldir
  2010.  
  2011.         ld de,_COLOR_DIALOG
  2012.         call nv_setcolor
  2013.         xor a
  2014.         ld hl,winmkdir
  2015.         ld de,tnewfilename
  2016.         ld (de),a
  2017.         ld c,63;13 ;max filename size
  2018.         call prwindow_edit ;CY=OK, de=filename
  2019.         ret nc ;cancel
  2020.         OS_MKDIR
  2021.         ;TODO error
  2022.         ret
  2023.  
  2024. editcmd_8 ;del
  2025.         call ifcmdnonempty_typedigit
  2026. editcmd_F8
  2027.         ;ld ix,(curpanel)
  2028.         call getmarkedfiles;countmarkedfiles
  2029.         ld a,h
  2030.         or l
  2031.         jr nz,editcmd_8_0      
  2032.         call getfcbaddrundercursor;hl=fcb
  2033.         call isthisdotdir_hl
  2034.         ret z ;"." or ".."
  2035.         call changemark_hl ;ld (hl),1
  2036. editcmd_8_0  
  2037.         ld de,_COLOR_RED
  2038.         call nv_setcolor
  2039.         ld hl,windel
  2040.         call prwindow_waitkey ;CY=OK
  2041.         jp nc,editcmd_reprintall_noreaddir
  2042.         ld hl,editcmd_reprintall_keepcursor;editcmd_reprintall
  2043.         push hl
  2044.         ld hl,windel2
  2045.         call prwindow_text
  2046.         ld hl,proc_del_file
  2047.         ld ix,(curpanel)
  2048.         jp processfiles
  2049.  
  2050. proc_del_file
  2051.         bit 0,(hl) ;marked?
  2052.         ret z
  2053.         call getfcbfromhl
  2054.  
  2055.         call getcurpaneldir_hl ;почему-то было через ix 10.02.2020
  2056.         ld de,dir_buf
  2057.         call strcopy;nv_strcopy_hltode
  2058.  
  2059.         ld hl,proc_del_file_batch
  2060.         ld (nv_batch_proc),hl
  2061.  
  2062. proc_del_file_batch
  2063. ;нельзя CHDIR, потому что это вызывается в цикле чтения директории в nv_batch1!
  2064.         ;ld de,dir_buf
  2065.         ;OS_CHDIR
  2066.  
  2067.        if 1==0
  2068.         ld de,filenametext ;wordbuf ;de=drive/path/file
  2069.         ld hl,fcb_filename
  2070.         call cpmname_to_dotname
  2071.        else
  2072.         ld a,(fcb+FCB_EXTENTNUMBERLO)
  2073.         SETPG32KHIGH
  2074.         ld hl,(fcb+FCB_EXTENTNUMBERHI)
  2075.         ld de,filenametext
  2076.         ld bc,63*256+0
  2077.         call prdirfile_copyfn
  2078.        endif
  2079.  
  2080.         ld de,dir3_buf;windel2_file ;dest
  2081.         push de
  2082.         ld bc,filenametext ;add
  2083.         ld hl,dir_buf ;src
  2084.         call nv_makefilepath_hltode ;result :  dest=hl'/'bc (de указывает после терминатора)
  2085.         pop hl
  2086.          ;ld hl,dir3_buf
  2087.          ld de,windel2_file
  2088.          push de
  2089.          ld bc,64
  2090.          ldir
  2091.          pop hl
  2092.         ;ld hl,windel2_file
  2093.         call nv_fillpathspaces_hl ;fill to 64bytes spaces
  2094.         ld hl,windel2
  2095.         call upwindow_text ;update window
  2096.  
  2097.         ld de,dir3_buf;windel2_file ;dest
  2098.         push de
  2099.         ld bc,filenametext ;add
  2100.         ld hl,dir_buf ;src
  2101.         call nv_makefilepath_hltode ;result :  dest=hl'/'bc (de указывает после терминатора)
  2102.         pop de
  2103.         ;ld de,filenametext
  2104.         OS_DELETE
  2105.         or a
  2106.         ret z ;if success return
  2107.  
  2108.         ld a,(fcb_attrib)
  2109.         and FATTRIB_DIR
  2110.         push af
  2111.         call nz,nv_copydir_add
  2112.         pop af
  2113.         jp nz,nv_copydir_add ;twice to remove empty dirs
  2114.         ret
  2115.  
  2116. editcmd_5 ;copy
  2117.         call ifcmdnonempty_typedigit
  2118. editcmd_F5
  2119.         ;ld ix,(curpanel)
  2120.         call getmarkedfiles ;countmarkedfiles
  2121.         ld a,h
  2122.         or l
  2123.         jr nz,editcmd_5_0      
  2124.         call getfcbaddrundercursor ;hl=fcb
  2125.         call isthisdotdir_hl
  2126.         ret z ;"." or ".."
  2127.         call changemark_hl ;ld (hl),1
  2128. editcmd_5_0
  2129.  
  2130.         call getanotherpanel_hl
  2131.         ld de,PANEL.dir
  2132.         add hl,de
  2133.         ld de,dir2_buf
  2134.         call strcopy;nv_strcopy_hltode
  2135.  
  2136.         call getcurpaneldir_hl
  2137.         ld de,dir_buf
  2138.         call strcopy;nv_strcopy_hltode
  2139.  
  2140.         ld de,_COLOR_DIALOG
  2141.         call nv_setcolor
  2142.          ld ix,(curpanel)
  2143.  
  2144.         ld hl,wincopy
  2145.         ld de,dir2_buf
  2146.         ld c,60
  2147.         call prwindow_edit ;CY=OK
  2148.         jp nc,editcmd_reprintall_noreaddir
  2149.  
  2150.         ld hl,editcmd_reprintall
  2151.         push hl ;don't change!
  2152.  
  2153.         ld hl,0
  2154.         ld (filescopied),hl
  2155.  
  2156. ;        ld de,PROGRESBARWINXY
  2157. ;        ld bc,PROGRESBARWINHGTWID
  2158. ;        call prwin
  2159.         ld hl,wincopy2
  2160.         call prwindow_text
  2161.         ld hl,proceditcmd_copy
  2162.         ld ix,(curpanel)
  2163.         jp processfiles
  2164.  
  2165. strcopy
  2166. ;hl->de
  2167. ;out: hl,de after terminator
  2168.         xor a
  2169. strcopy0
  2170.         cp (hl)
  2171.         ldi
  2172.         jp nz,strcopy0
  2173.         ret
  2174.  
  2175. strcopy_addslash
  2176. ;hl->de
  2177.         call strcopy;nv_strcopy_hltode
  2178. ;assumed that DE is after terminator
  2179.         dec de
  2180.         dec de
  2181.         ld a,(de)
  2182.         cp '/'
  2183.         jr z,nv_addslash0
  2184.         inc de
  2185.         ld a,'/'
  2186.         ld (de),a
  2187. nv_addslash0
  2188.         inc de
  2189.         xor a
  2190.         ld (de),a
  2191.         ret
  2192.  
  2193. ;TODO change this to strcopy_maxb
  2194. nv_makefilepath_hltode ;DE=dest HL=src BC=filename
  2195.         push bc
  2196.         call strcopy_addslash
  2197.         pop hl
  2198.         jp strcopy;nv_strcopy_hltode
  2199.  
  2200. ;TODO remove this
  2201. nv_fillpathspaces_hl
  2202.         ld b,0
  2203. nv_fillpathspaces_hl0
  2204.          ;ld a,b
  2205.          ;cp 64
  2206.          ;ret z
  2207.          bit 6,b
  2208.          ret nz
  2209.         ld a,(hl)
  2210.         inc b
  2211.         inc hl
  2212.         or a
  2213.         jr nz,nv_fillpathspaces_hl0
  2214.         dec hl
  2215.         dec b
  2216.         ld c,' '
  2217.         ld a,b
  2218. nv_fillpathspaces_hl1
  2219.         ld (hl),c
  2220.         inc hl
  2221.         inc a
  2222.         cp 64
  2223.         jr c,nv_fillpathspaces_hl1
  2224.         ret
  2225.  
  2226. strcopy_maxb
  2227. ;copy hl->de no more than b bytes, add spaces after
  2228. strcopy_maxb0
  2229.         ld a,(hl)
  2230.         or a
  2231.         jr z,strcopy_maxb_fill
  2232.         ld (de),a
  2233.         inc hl
  2234.         inc de
  2235.         djnz strcopy_maxb0
  2236.         ret
  2237. strcopy_maxb_fill
  2238.         ld a,' '
  2239. strcopy_maxb_fill0
  2240.         ld (de),a
  2241.         inc de
  2242.         djnz strcopy_maxb_fill0
  2243.         ret
  2244.  
  2245.  
  2246. nv_copydir_add;=nv_batch_pushrecord
  2247. ;       jp nv_batch_pushrecord
  2248. ;nv_batch_pushrecord
  2249.         OS_GETMAINPAGES
  2250.         ld a,h
  2251.         ld (savepg),a
  2252.         ld a,(dirpg)
  2253.         SETPG32KLOW
  2254.  
  2255.         ld hl,0x8000
  2256.         ld bc,(dir_batch_pointer)
  2257.         ld de,256
  2258. nv_batch_pushsrecord
  2259.         ld a,b
  2260.         or c
  2261.         jr z,nv_batch_pushsrecordend
  2262.         add hl,de
  2263.         dec bc
  2264.         jr nv_batch_pushsrecord
  2265. nv_batch_pushsrecordend
  2266.         push hl
  2267. ;dir 1
  2268.         ld de,dir_buf
  2269.         ex hl,de
  2270.         ld bc,filenametext
  2271.         call nv_makefilepath_hltode
  2272.         pop hl
  2273.         ld de,128 ;128 bytes for source, 128 bytes for dest???
  2274.         add hl,de
  2275. ;dir2
  2276.         ld de,dir2_buf
  2277.         ex hl,de
  2278.         ld bc,filenametext
  2279.         call nv_makefilepath_hltode
  2280.  
  2281.         ld bc,(dir_batch_pointer)
  2282.         inc bc
  2283.         ld (dir_batch_pointer),bc
  2284.         ld a,(savepg)
  2285.         SETPG32KLOW
  2286.         ret
  2287.  
  2288. nv_batch_poprecord ;z=empty
  2289.         OS_GETMAINPAGES
  2290.         ld a,h
  2291.         ld (savepg),a
  2292.         ld a,(dirpg)
  2293.         SETPG32KLOW
  2294.  
  2295.         ld hl,0x8000
  2296.         ld bc,(dir_batch_pointer)
  2297.         ld a,b
  2298.         or c
  2299.         jr z,nv_batch_popsrecordq ;empty :(
  2300.         dec bc
  2301.         ld de,256
  2302. nv_batch_popsrecord
  2303.         ld a,b
  2304.         or c
  2305.         jr z,nv_batch_popsrecordend
  2306.         add hl,de
  2307.         dec bc
  2308.         jr nv_batch_popsrecord
  2309. nv_batch_popsrecordend
  2310.         ld de,dir_buf
  2311.         ld bc,128
  2312.         ldir
  2313.         ld de,dir2_buf
  2314.         ld  c,128
  2315.         ldir
  2316.         ld bc,(dir_batch_pointer)
  2317.         dec bc
  2318.         ld (dir_batch_pointer),bc
  2319.         ld a,1
  2320.         or a ;NZ
  2321. nv_batch_popsrecordq
  2322.         ld a,(savepg)
  2323.         SETPG32KLOW
  2324.         ret
  2325.  
  2326. nv_batch
  2327.         call nv_batch_poprecord
  2328.         ret z;empty
  2329. nv_label
  2330.         or a
  2331.         ld hl,(processfiles_proc)
  2332.         ld de,proceditcmd_copy
  2333.         sbc hl,de
  2334.         jr nz,nv_batch_nocopydir ;if it's not copy
  2335.  
  2336.         ld de,dir2_buf
  2337.         OS_MKDIR
  2338.         ld de,dir2_buf
  2339.         OS_CHDIR ;de
  2340.         or a
  2341.         jr nz,nv_batch ;can't open dest dir
  2342. nv_batch_nocopydir
  2343.         ld de,dir_buf
  2344.         OS_CHDIR ;;
  2345.         or a
  2346.         jr nz,nv_batch ;can't open src dir
  2347.  
  2348.         ld de,emptypath
  2349.         OS_OPENDIR
  2350.         ;ld de,fcb
  2351.         ;OS_SETDTA
  2352.         ;ld de,fcbmask
  2353.         ;OS_FSEARCHFIRST
  2354.         or a
  2355.         jr nz,nv_batch
  2356.        
  2357.         ;ld de,fcb
  2358.         ;OS_SETDTA
  2359.         ;ld de,fcbmask
  2360.         ;OS_FSEARCHNEXT
  2361.         ;or a
  2362.         ;jr nz,nv_batch ;skip . and ..
  2363.         call loaddir_filinfo ;out: CY=end dir, or else Z="."
  2364.         call loaddir_filinfo ;out: CY=end dir, or else Z="."
  2365. nv_batch1
  2366.         ;ld de,fcb
  2367.         ;OS_SETDTA
  2368.         ;ld de,fcbmask
  2369.         ;OS_FSEARCHNEXT
  2370.         ;or a
  2371.         ;jr nz,nv_batch_nofiles
  2372.         call loaddir_filinfo ;out: CY=end dir, or else Z="."
  2373.         jr c,nv_batch_nofiles
  2374.         ;jr z,nv_batch1
  2375.  
  2376.         ld hl,filinfo+FILINFO_LNAME
  2377.         ld a,(hl)
  2378.         or a
  2379.         jr nz,$+5
  2380.         ld hl,filinfo+FILINFO_FNAME
  2381.         ld (fcb+FCB_EXTENTNUMBERHI),hl
  2382.         ;ex de,hl
  2383.         ;ld hl,fcb_filename
  2384.         ;call dotname_to_cpmname ;de -> hl
  2385.  
  2386.         ld a,(filinfo+FILINFO_FATTRIB)
  2387.         ld (fcb_attrib),a
  2388.          ld a,(dirpg)
  2389.          ld (fcb+FCB_EXTENTNUMBERLO),a ;NU
  2390.  
  2391. nv_batch_proc=$+1
  2392.         call proceditcmd_copy_fcb
  2393.         jr nv_batch1
  2394.  
  2395. nv_batch_nofiles
  2396.         or a
  2397.         ld hl,(processfiles_proc)
  2398.         ld de,proc_del_file
  2399.         sbc hl,de
  2400.         jp nz,nv_batch ;if not del
  2401.         ld a,'/'
  2402.         ld (dir2_buf),a
  2403.         xor a
  2404.         ld (dir2_buf+1),a
  2405.         ld de,dir2_buf
  2406.         OS_CHDIR
  2407.         ld de,dir_buf
  2408.         OS_DELETE
  2409.         jp nv_batch
  2410.  
  2411. skipword_hl
  2412.         ld a,(hl)
  2413.         or a
  2414.         ret z
  2415.         cp ' '
  2416.         ret z
  2417.         inc hl
  2418.         jr skipword_hl
  2419.  
  2420. proceditcmd_copy
  2421.         bit 0,(hl)
  2422.         ret z
  2423.         call getfcbfromhl
  2424.  
  2425.         ld hl,proceditcmd_copy_fcb
  2426.         ld (nv_batch_proc),hl
  2427.  
  2428. proceditcmd_copy_fcb
  2429. ;нельзя CHDIR, потому что это вызывается в цикле чтения директории в nv_batch1!
  2430.         ld hl,proceditcmd_copy_q
  2431.         push hl
  2432.         ;ld de,dir_buf
  2433.         ;OS_CHDIR
  2434.  
  2435.        if 1==0
  2436.         ld de,filenametext ;wordbuf ;de=drive/path/file
  2437.         ld hl,fcb_filename
  2438.         call cpmname_to_dotname
  2439.        else
  2440.         ld a,(fcb+FCB_EXTENTNUMBERLO)
  2441.         SETPG32KHIGH
  2442.         ld hl,(fcb+FCB_EXTENTNUMBERHI)
  2443.         ld de,filenametext
  2444.         ld bc,63*256+0
  2445.         call prdirfile_copyfn
  2446.        endif
  2447.  
  2448.         ld a,(fcb_attrib)
  2449.         and FATTRIB_DIR
  2450.         jp nz,nv_copydir_add
  2451.  
  2452.         ld de,dir3_buf;wincopy_dest
  2453.         push de
  2454.         ld bc,filenametext
  2455.         ld hl,dir2_buf
  2456.         call nv_makefilepath_hltode
  2457.         pop hl
  2458.          ;ld hl,dir3_buf
  2459.          ld de,wincopy_dest
  2460.          push de
  2461.          ld bc,64
  2462.          ldir
  2463.          pop hl
  2464.         ;ld hl,wincopy_dest
  2465.         call nv_fillpathspaces_hl
  2466.         ld hl,wincopy2
  2467.         call upwindow_text
  2468.  
  2469.         ld de,dir3_buf;wincopy_src ;update copy window
  2470.         push de
  2471.         ld bc,filenametext
  2472.         ld hl,dir_buf
  2473.         call nv_makefilepath_hltode
  2474.         pop hl
  2475.          ;ld hl,dir3_buf
  2476.          ld de,wincopy_src
  2477.          push de
  2478.          ld bc,64
  2479.          ldir
  2480.          pop hl
  2481.         ;ld hl,wincopy_src
  2482.         call nv_fillpathspaces_hl
  2483.  
  2484.         ld de,dir3_buf
  2485.         ;push de
  2486.         ;ld bc,filenametext
  2487.         ;ld hl,dir_buf
  2488.         ;call nv_makefilepath_hltode
  2489.         ;pop de
  2490.         push de
  2491.         OS_OPENHANDLE
  2492.         pop de
  2493.         or a
  2494.         ret nz ;jp nz,cmd_error_wrongfile
  2495.         ld a,b
  2496.         ld (cmd_copy_close_file1_handle),a
  2497.         ld hl,cmd_copy_close_file1
  2498.         push hl
  2499.  
  2500.         ;ld de,filenametext
  2501.         OS_GETFILETIME ;ix=date, hl=time
  2502.         ld (proceditcmd_copy_time),hl
  2503.         ld (proceditcmd_copy_date),ix
  2504.  
  2505.         ;ld de,dir2_buf
  2506.         ;OS_CHDIR
  2507.         ld de,dir3_buf;wincopy_dest ;256 bytes
  2508.          push de
  2509.          ld bc,filenametext
  2510.          ld hl,dir2_buf
  2511.          call nv_makefilepath_hltode
  2512.          pop de
  2513.         ;ld de,filenametext;swordbuf2 ;de=drive/path/file
  2514.         OS_CREATEHANDLE
  2515.         or a
  2516.         ret nz ;jp nz,cmd_error_cant_copy
  2517.         ld a,b
  2518.         ld (cmd_copy_close_file2_handle),a
  2519.         ld hl,cmd_copy_close_file2
  2520.         push hl
  2521. cmd_copy0
  2522.         ld hl,copybuf_sz
  2523.         ld de,copybuf
  2524.         ld a,(cmd_copy_close_file1_handle)
  2525.         ld b,a
  2526. ;B = file handle, DE = Buffer address, HL = Number of bytes to read
  2527.         push de
  2528.         OS_READHANDLE
  2529. ;HL = Number of bytes actually read, A=error
  2530.         pop de
  2531.         ld a,h
  2532.         or l
  2533.         ret z ;0 bytes remain
  2534.         ld a,(cmd_copy_close_file2_handle)
  2535.         ld b,a
  2536. ;B = file handle, DE = Buffer address, HL = Number of bytes to write
  2537.         OS_WRITEHANDLE
  2538.         jr cmd_copy0
  2539.  
  2540. cmd_copy_close_file1
  2541. cmd_copy_close_file1_handle=$+1
  2542.         ld b,0
  2543.         OS_CLOSEHANDLE
  2544.         ret
  2545.  
  2546. cmd_copy_close_file2
  2547. cmd_copy_close_file2_handle=$+1
  2548.         ld b,0
  2549.         OS_CLOSEHANDLE
  2550. proceditcmd_copy_time=$+1
  2551.         ld hl,0
  2552. proceditcmd_copy_date=$+2
  2553.         ld ix,0
  2554.         ld de,dir3_buf;wincopy_dest;filenametext
  2555.         OS_SETFILETIME
  2556.         ret
  2557.  
  2558. proceditcmd_copy_q
  2559. filescopied=$+1
  2560.         ld hl,0
  2561.          if 1==0
  2562.         inc hl
  2563.         ld (filescopied),hl
  2564.         ;ld bc,32
  2565.         ;ex de,hl ;ld de,(percentcopyfile)
  2566.         ;call mulbcde_ahl
  2567.         add hl,hl
  2568.         add hl,hl
  2569.         add hl,hl
  2570.         add hl,hl
  2571.         add hl,hl
  2572.         push hl
  2573.         ld ix,(curpanel)
  2574. ;ix = panel
  2575.         call getmarkedfiles ;out: hl'hl = files
  2576.         ex de,hl ;de=files
  2577.         pop hl ;filescopied*32
  2578.         call divhlde
  2579.         ld a,l
  2580.         or a
  2581.         ret z
  2582.         ld b,a
  2583.         ld de,PROGRESBARWINXY+#0102
  2584. proceditcmd_copy_q_progress0      
  2585.         push de
  2586.         push bc
  2587.         call nv_setxy ;keeps de,hl,ix
  2588.         ;ld e,#ff
  2589.         ;OS_PRATTR
  2590.         ld a,'*'
  2591.         MYPRCHAR
  2592.         pop bc
  2593.         pop de
  2594.         inc e
  2595.         djnz proceditcmd_copy_q_progress0
  2596.          endif
  2597.         ret
  2598.  
  2599. mulbcde_ahl
  2600. ;bc * de результат в ahl
  2601.         xor a
  2602.         ld h,a
  2603.         ld l,a
  2604.         dup 8
  2605.         rlc b
  2606.         jr nc,$+5 ; c - был перенос, nc - не было переноса    
  2607.         add hl,de
  2608.         adc a,0
  2609.         add hl,hl
  2610.         rla
  2611.         edup
  2612.         dup 7
  2613.         rlc c
  2614.         jr nc,$+5 ; c - был перенос, nc - не было переноса    
  2615.         add hl,de
  2616.         adc a,0
  2617.         add hl,hl
  2618.         rla
  2619.         edup
  2620.         rlc c
  2621.         ret nc
  2622.         add hl,de
  2623.         adc a,0
  2624.         ret
  2625.  
  2626. ;hl / de результат в hl
  2627. divhlde
  2628.         ld c,h
  2629.         ld a,l
  2630.         ld hl,0
  2631.         ld b,16
  2632. ;don't mind carry
  2633. _DIV0.
  2634. ;shift left hlca
  2635.         rla
  2636.         rl c
  2637.         adc hl,hl
  2638. ;no carry
  2639. ;try sub
  2640.         sbc hl,de
  2641.         jr nc,$+3
  2642.         add hl,de
  2643. ;carry = inverted bit of result
  2644.         djnz _DIV0.
  2645.         rla
  2646.         cpl
  2647.         ld l,a
  2648.         ld a,c
  2649.         rla
  2650.         cpl
  2651.         ld h,a
  2652. reter
  2653.         ret
  2654.  
  2655.        if PRSTDIO == 0
  2656. editcmd_showscr
  2657.         call nv_copyscreen1to0
  2658.         YIELDGETKEYLOOP
  2659.         xor a
  2660.         ld (leftpanel+PANEL.drawtableunneeded),a
  2661.         ld (rightpanel+PANEL.drawtableunneeded),a
  2662.         jp editcmd_reprintall_keepcursor
  2663.        endif
  2664.  
  2665. editcmd_0
  2666.         call ifcmdnonempty_typedigit
  2667. editcmd_quit
  2668.         ld de,_COLOR_RED
  2669.         call nv_setcolor
  2670.         ld hl,winquit
  2671.         call prwindow_waitkey ;CY=OK
  2672.         jp nc,editcmd_reprintall_keepcursor;editcmd_reprintall
  2673.         call makeprompt
  2674.         OS_SETSYSDRV
  2675.         ld de,fn_path
  2676.         OS_CREATEHANDLE
  2677.         push bc
  2678.         call cmdcalcpromptsz ;hl=strlen
  2679.         inc hl ;size
  2680.         pop bc
  2681.         push bc
  2682.         ld de,cmdprompt
  2683.         OS_WRITEHANDLE
  2684.         pop bc
  2685.         OS_CLOSEHANDLE
  2686.         ld hl,cmdprompt
  2687.         OS_CHDIR
  2688.         ld hl,0 ;result
  2689.         QUIT
  2690.  
  2691. ifcmdnonempty_typedigit
  2692. ;keeps ix
  2693.         ld c,a
  2694.         ld a,(cmdbuf)
  2695.         or a
  2696.         ld a,c
  2697.         ret z ;cmd is empty
  2698.          pop bc ;skip return to editcmdN
  2699.         jp editcmd_typein
  2700.  
  2701. editcmd_typeword
  2702.         call getfcbundercursor
  2703.         ld hl,fcb_filename
  2704.         ld de,tnewfilename
  2705.         call cpmname_to_dotname ;de указывает на терминатор
  2706.         ld hl,cmdbuf
  2707.         call strlen ;hl=length
  2708.         ld bc,MAXCMDSZ-11
  2709.         or a
  2710.         sbc hl,bc
  2711.         ret nc ;некуда вводить
  2712.         add hl,bc
  2713.         ld bc,cmdbuf
  2714.         add hl,bc
  2715.         ex de,hl ;de=end of cmdbuf
  2716.         ld a,(cmdbuf)
  2717.         or a
  2718.         ld hl,tnewfilename
  2719.         jr z,editcmd_typeword_empty
  2720.         dec hl ;с пробелом
  2721. editcmd_typeword_empty
  2722.         call strcopy;nv_strcopy_hltode ;out: hl,de at terminator
  2723.         ld hl,cmdbuf
  2724.         call strlen ;hl=length
  2725.         ld a,l
  2726.         ld (curcmdx),a
  2727.         ret
  2728.  
  2729. windrv
  2730.         dw 0x0003 ;de=yx
  2731.         dw 256*(3+NDRIVES)+28 ;0x0809 ;bc=hgt,wid
  2732.         db "Drive",0
  2733.         db 3 ;next line
  2734.         db "  A: - 1st Floppy",0,3
  2735.         db "  B: - 2nd Floppy",0,3
  2736.         db "  C: - 3rd Floppy",0,3
  2737.         db "  D: - 4th Floppy",0,3
  2738.         db "  E: - IDE Master p.1",0,3
  2739.         db "  F: - IDE Master p.2",0,3
  2740.         db "  G: - IDE Master p.3",0,3
  2741.         db "  H: - IDE Master p.4",0,3
  2742.         db "  I: - IDE Slave p.1",0,3
  2743.         db "  J: - IDE Slave p.2",0,3
  2744.         db "  K: - IDE Slave p.3",0,3
  2745.         db "  L: - IDE Slave p.4",0,3
  2746.         db "  M: - SD Z-controller",0,3
  2747.         db "  N: - SD NeoGS",0,3
  2748.         db "  O: - USB flash zx-net",0,3
  2749.         db 0 ;end of window
  2750.  
  2751. winmkdir
  2752.         dw 0x0a07 ;de=yx
  2753.         dw 0x0544 ;bc=hgt,wid
  2754.         db "Create new directory:",0
  2755.         db 3 ;next line
  2756.         db 2 ;print outer text
  2757.         dw tnewfilename
  2758.         db 0 ;end of window
  2759.  
  2760. winrename
  2761.         dw 0x0a07 ;de=yx
  2762.         dw 0x0544 ;bc=hgt,wid
  2763.         db "Rename file:",0
  2764.         db 3 ;next line
  2765.         db 2 ;print outer text
  2766.         dw tnewfilename
  2767.         db 0 ;end of window
  2768.  
  2769. wincopy
  2770.         dw 0x0a07 ;de=yx
  2771.         dw 0x0544 ;bc=hgt,wid
  2772.         db "Copy ",0
  2773.         db 1
  2774.         db " file(s)/dir(s) to:",0
  2775.         db 3 ;next line
  2776.         db 2 ;print outer text
  2777.         dw dir2_buf
  2778.         db 0 ;end of window
  2779.  
  2780.         db ' ' ;для typeword - перед tnewfilename
  2781. tnewfilename
  2782.         ds 64 ;max filename size+terminator
  2783.  
  2784. winquit
  2785.         dw 0x0a1f ;de=yx
  2786.         dw 0x0515 ;bc=hgt,wid
  2787.         db 3 ;next line
  2788.         db "Quit Nedovigator?",0
  2789.         db 0 ;end of window
  2790.  
  2791. windel
  2792.         dw 0x0919 ;de=yx
  2793.         dw 0x051f ;bc=hgt,wid
  2794.         db 3 ;next line
  2795.         db "Delete ",0
  2796.         db 1 ;nfiles
  2797.         db " file(s)?",0
  2798.         db 0 ;end of window
  2799.  
  2800. wincopy2
  2801.         dw 0x0706 ;de=yx
  2802.         db 68,8 ;wid,hgt
  2803.         db 3 ;next line
  2804.         db " Copying",0,3
  2805. wincopy_src
  2806.         db "                                                                ",0,3
  2807.         db " to",0,3
  2808. wincopy_dest
  2809.         db "                                                                ",0
  2810.         db 0 ;end of window
  2811.  
  2812. windel2
  2813.         dw 0x0706 ;de=yx
  2814.         db 68,6 ;bc=wid,hgt
  2815.         db " Deleting",0,3
  2816.         db 3 ;next line
  2817. windel2_file
  2818.         db "                                                                ",0
  2819.         db 0 ;end of window
  2820.  
  2821. windrverr
  2822.         dw 0x040f ;de=yx
  2823.         dw 0x0510 ;bc=hgt,wid
  2824.         db 3 ;next line
  2825.         db "Drive error!",0
  2826.         db 0 ;end of window
  2827.  
  2828. tdotdot
  2829.         dw "..",0
  2830.  
  2831.         STRUCT PANEL
  2832. xy              WORD
  2833. catbuf          WORD ;TODO remove
  2834. poipg           BYTE
  2835. pointers        WORD ;TODO remove
  2836. pgadd           BYTE ;0/DIRPAGES
  2837. curpgfcbpoi     WORD
  2838. curpglnamepoi   WORD
  2839. drawtableunneeded BYTE
  2840. totalsize       DWORD
  2841. files           WORD ;visible files
  2842. filesdirs       WORD ;files+dirs (no ".", "..")
  2843. markedfiles     WORD
  2844. markedsize      DWORD
  2845. dirpos          WORD
  2846. dirscroll       WORD
  2847. dirviewmode     BYTE
  2848. dirsortproc     WORD
  2849. dirsortmode     BYTE
  2850. dir             BLOCK MAXPATH_sz
  2851.         ENDS
  2852. ;PANEL_sz=13+MAXPATH_sz
  2853.  
  2854. leftpanel PANEL
  2855. rightpanel PANEL
  2856.  
  2857. ;<0x4000 for hobeta
  2858. fcb
  2859.         ds FCB_sz
  2860. fcb_filename=fcb+FCB_FNAME        
  2861. fcb_attrib=fcb+FCB_FATTRIB
  2862.  
  2863. ;TODO kill (used in batch)
  2864. fcbmask
  2865.         db 0
  2866.         db "???????????"
  2867.         ds FCB_sz-11-1
  2868. fcbmask_filename=fcbmask+FCB_FNAME        
  2869.  
  2870. fcb2
  2871.         ds FCB_sz
  2872. fcb2_filename=fcb2+FCB_FNAME        
  2873.  
  2874. fn_ext
  2875.         db "nv.ext",0
  2876. fn_path
  2877.         db "nv.pth",0
  2878. cmd_filename
  2879.         db "cmd     com"
  2880. texted_filename
  2881.         db "texted  com"
  2882.  
  2883. filenametext ;for change dir, rename
  2884.         ds 64 ;max filename size+terminator
  2885.  
  2886. ext
  2887.         ds 3 ;TODO объединить с filenametext
  2888.  
  2889. copybuf=0x4000 ;нельзя 0xc000 - поверх какой-нибудь директории (а она используется при копировании) ;0x8000 можно только после выставления страницы там
  2890. copybuf_sz=0x4000 ;$-copybuf
  2891.  
  2892. dir_batch_pointer db 0,0
  2893. savepg db 0,0
  2894. dirpg db 0,0
  2895.  
  2896. washobetarunner
  2897. ;pgsys=pagexor-10
  2898. ;pgfatfs=pagexor-9
  2899. ;pgtrdosfs=pagexor-8
  2900. ;pgkillable=pagexor-4 ;в 128K памяти, т.к. можно портить
  2901.         disp hobetarunner ;in pgkillable
  2902. ;$c loaded in pages 4,1,0
  2903. ;only ATM2 ports here!
  2904.         ;di ;было выше
  2905.         ld a,0x7f-5
  2906.         ld bc,0xbff7
  2907.         out (c),a ;4,5,0
  2908.         ld a,0x7f-4
  2909.         ld b,0xff;f7
  2910.         out (c),a ;4,5,4
  2911.         ld hl,0xc000
  2912.         ld de,0x8000
  2913.         ld bc,0x4000
  2914.         ldir ;pg4 -> pg5
  2915.         ld a,0x7f-8;pgtrdosfs ;нельзя TOPDOWNMEM!!!
  2916.         ld bc,0xfff7
  2917.         out (c),a ;4,5,8
  2918.         ld hl,0x1c00+0xc000
  2919.         ld de,0x1c00+0x8000
  2920.         ld bc,0x400
  2921.         ldir ;restore sysvars
  2922.         ld a,0x7f-2
  2923.         ld bc,0xbff7
  2924.         out (c),a
  2925.         ld a,0x7f-1
  2926.         ld b,0xff;f7
  2927.         out (c),a
  2928.         ld hl,0xc000
  2929.         ld de,0x8000
  2930.         ld bc,0x4000
  2931.         ldir ;pg1 -> pg2
  2932.         ld a,0x7f-0+0x80
  2933.         ld bc,0xfff7
  2934.         out (c),a
  2935.         xor a;ld a,0x00
  2936.         ld bc,0x7ffd
  2937.         out (c),a
  2938.         ld a,0x81 ;128 basic (with 7ffd)
  2939.         ld bc,0x3ff7
  2940.         out (c),a
  2941.         ld a,0x7f-5
  2942.         ld b,0x7f;f7
  2943.         out (c),a
  2944. ;128: pages DOS,5,2,0(7ffd)
  2945.         ld a,0x10
  2946.         ld bc,0x7ffd
  2947.         out (c),a
  2948. ;48: pages A,4,4,4
  2949.         ld a,0x7f-5
  2950.         ld bc,0x7ff7
  2951.         out (c),a
  2952.         ld a,0x7f-2
  2953.         ld b,0xbf;f7
  2954.         out (c),a
  2955.         ld a,0x7f-0+0x80
  2956.         ld b,0xff;f7
  2957.         out (c),a
  2958.         ld a,0x83 ;48 basic switchable to DOS
  2959.         ld b,0x3f;f7
  2960.         out (c),a
  2961. ;48: pages DOS,5,2,0(7ffd)
  2962.  
  2963.         LD A,0b10101011 ;6912
  2964.         ld bc,0xff77 ;shadow ports off, palette off
  2965.         out (c),a
  2966.         ld sp,0x6000
  2967.         ld iy,23610
  2968.         ld a,0xc9
  2969.         ld (0x5cc2),a
  2970.         ei
  2971. hobetarunner_jp=$+1
  2972.         jp 0x6000
  2973.         ent
  2974. hobetarunner_sz=$-washobetarunner
  2975.  
  2976. wordfiles
  2977.         db "1234567890 files ";,0
  2978. wordbytes
  2979.         db "1234567890 bytes ",0
  2980. emptypath=$-1
  2981.         ;db 0
  2982.  
  2983. filinfo
  2984.         ds FILINFO_sz
  2985.  
  2986.         include "nvsort.asm"
  2987.         include "heapsort.asm"
  2988.  
  2989.         include "nvjptbl.asm"
  2990.         include "nvunit.asm"
  2991.         include "nveditln.asm"
  2992.         include "nvview.asm"
  2993.         include "nvhexed.asm"
  2994.         include "nvfind.asm"
  2995.  
  2996.         include "prdword.asm"
  2997.         include "cmdpr.asm"
  2998.        if PRSTDIO
  2999.         include "../_sdk/stdio.asm"
  3000.        endif
  3001.  
  3002.         align 256
  3003. searchbuf
  3004. SEARCHBUF_SZ=128 ;2 таких
  3005. file_buf
  3006. dir_buf
  3007.         ds 128
  3008. file_buf_end=$-1
  3009. dir2_buf
  3010.         ds 128        
  3011. dir3_buf
  3012.         ds 256 ;max size for no bugs
  3013.  
  3014.         align 256
  3015. HS_strpg
  3016.         ds 256;DIRPAGES*2+2 ;по 1 байту на маркеры "0"
  3017.         align 256
  3018. textpages
  3019.         ds 256
  3020. twinto866
  3021.         incbin "../_sdk/codepage/winto866"
  3022. cmd_end
  3023.  
  3024.         display "nv size ",/d,cmd_end-cmd_begin," bytes"
  3025.  
  3026.        if PRSTDIO
  3027.         savebin "nv.com",cmd_begin,cmd_end-cmd_begin
  3028.        else
  3029.         savebin "nvfast.com",cmd_begin,cmd_end-cmd_begin
  3030.        endif
  3031.  
  3032.         LABELSLIST "../../us/user.l"
  3033.