?login_element?

Subversion Repositories NedoOS

Rev

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

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