?login_element?

Subversion Repositories NedoOS

Rev

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