?login_element?

Subversion Repositories NedoOS

Rev

Rev 576 | Rev 595 | 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. NVOLUMES=8;5
  7.        
  8. MAXCMDSZ=COMMANDLINE_sz-1-4 ;not counting terminator (-4 for "cmd ")
  9. txtscrhgt=25
  10. txtscrwid=80
  11. CMDLINEY=23;24
  12.  
  13. ;0 1 2 3 4 5 6 7 8 9 a b c d e f
  14.  
  15. _COLOR=0x0007;0x07
  16. _PANELCOLOR=0x040f;0x4f
  17. _PANELDIRCOLOR=0x040f;0x4f
  18. _PANELEXECOLOR=0x040a;0x4c
  19. _PANELFILECOLOR=0x0407;0b00001111;0xf
  20. _PANELSELECTCOLOR=0x040b;0x4e
  21. _CURSORCOLOR=0x0600;0x28
  22. _FILECURSORCOLOR=0x0600;0x28
  23. _COLOR_RED=0x0107;0x17
  24. _COLOR_DIALOG=0x0700;0x38
  25. _HINTCOLOR1=0x0007;7
  26. _HINTCOLOR0=0x0600;5*8
  27.  
  28. PROGRESBARWINXY=0x0f16 ;0x0919 + 051f ;de=yx
  29. PROGRESBARWINHGTWID=0x0324 ;0x051f ;bc=hgt,wid
  30.  
  31. CONST_HGT_TABLE=21
  32.  
  33. ;8192fcbs*32bytes*2panels = 32 pages
  34. DIRPAGES=16
  35.  
  36. catbuf_left=0xc000
  37. catbuf_right=0xc000
  38. FILES_POINTERS_left=0xc000;0x3700
  39. FILES_POINTERS_right=0xc000;0x3b00
  40. left_panel_xy=0x0000
  41. right_panel_xy=0x0028
  42. firstfiley=left_panel_xy/256 + 1
  43.  
  44.         macro PGW2elpg0
  45.         ;LD A,(HS_elpg)
  46.         ld a,(ix+PANEL.poipg)
  47.         SETPG32KLOW
  48.         endm
  49.        
  50.         macro PGW2elpg
  51.                 ;LD      A,H
  52.                 ;RLCA
  53.                 ;RLCA
  54.                 ;AND     1
  55.         ;LD A,(HS_elpg)
  56.         ;jr z,$+5
  57.         ;LD A,(HS_elpg+1)
  58.         ld a,(ix+PANEL.poipg)
  59.         SETPG32KLOW
  60.         endm
  61.  
  62.         macro PGW2strpg
  63.         ld ($+4),a
  64.         LD A,(HS_strpg)
  65.         SETPG32KLOW
  66.         endm
  67.  
  68.         macro PGW3elpg
  69.                 ;LD      A,H
  70.                 ;RLCA
  71.                 ;RLCA
  72.                 ;AND     1
  73.         ;LD A,(HS_elpg)
  74.         ;jr z,$+5
  75.         ;LD A,(HS_elpg+1)
  76.         ld a,(ix+PANEL.poipg)
  77.         SETPG32KHIGH
  78.         endm
  79.  
  80.         macro PGW3strpg
  81.         ld ($+4),a
  82.         LD A,(HS_strpg)
  83.         SETPG32KHIGH
  84.         endm
  85.  
  86.         org PROGSTART
  87. cmd_begin
  88.         ld sp,0x4000
  89.         call initstdio
  90.  
  91.         ;ld e,6 ;textmode
  92.         ;OS_SETGFX
  93.        
  94.         ;call nv_copyscreen0to1
  95.         ;GET_KEY ;съедаем key_redraw
  96.        
  97.         ;ld e,COLOR
  98.         ;OS_CLS
  99.         CLS_
  100.        
  101. ;        ld de,nvpal
  102. ;        OS_SETPAL
  103.        
  104.         ;OS_GETSCREENPAGES
  105. ;de=pages of screen 0 (d=higher page), hl=pages of screen 1 (h=higher page)
  106.         ;ld a,e
  107.         ;ld (cmdpgscreen0_0),a
  108.  
  109.         OS_GETMAINPAGES
  110. ;dehl=номера страниц в 0000,4000(copybuf),8000,c000*(dirbuf)
  111.         push hl
  112.         ld e,h
  113.         OS_DELPAGE
  114.         pop hl
  115.         ld e,l
  116.         OS_DELPAGE
  117.  
  118.         OS_NEWPAGE ; for dircopy batch
  119.         ld hl,dirpg
  120.         ld (hl),e
  121.  
  122.         OS_NEWPAGE ;выделяем по одной страничке для каталогов
  123.         ld hl,HS_strpg
  124.         ld (hl),e
  125.         inc hl
  126.         xor a
  127.         ld (hl),a ;маркер конца списка страниц
  128.  
  129.         OS_NEWPAGE
  130.         ld hl, HS_strpg+DIRPAGES+1
  131.         ld (hl),e
  132.         inc hl
  133.         xor a
  134.         ld (hl),a ;маркер конца списка страниц
  135.        
  136.         ld hl,left_panel_xy
  137.         ld (leftpanel+PANEL.xy),hl
  138.         OS_NEWPAGE
  139.         ld a,e
  140.         ld (leftpanel+PANEL.poipg),a
  141.         ld hl,FILES_POINTERS_left
  142.         ld (leftpanel+PANEL.pointers),hl
  143.         ld hl,catbuf_left
  144.         ld (leftpanel+PANEL.catbuf),hl
  145.         xor a
  146.         ld (leftpanel+PANEL.pgadd),a
  147.  
  148.         ld hl,right_panel_xy
  149.         ld (rightpanel+PANEL.xy),hl
  150.         OS_NEWPAGE
  151.         ld a,e
  152.         ld (rightpanel+PANEL.poipg),a
  153.         ld hl,FILES_POINTERS_right
  154.         ld (rightpanel+PANEL.pointers),hl
  155.         ld hl,catbuf_right
  156.         ld (rightpanel+PANEL.catbuf),hl
  157.         ld a,DIRPAGES+1
  158.         ld (leftpanel+PANEL.pgadd),a
  159.  
  160.         ld hl,compareext
  161.         ld (leftpanel+PANEL.dirsortproc),hl
  162.         ld (rightpanel+PANEL.dirsortproc),hl
  163.  
  164.         ;ld a,0xc3
  165.         ;ld (leftpanel+PANEL.sorterjp),a
  166.         ;ld (rightpanel+PANEL.sorterjp),a
  167.         ;ld hl,sorter1
  168.         ;ld (leftpanel+PANEL.sorter),hl
  169.         ;ld hl,sorter2
  170.         ;ld (rightpanel+PANEL.sorter),hl
  171.        
  172.         ld hl,rightpanel
  173.         call editcmd_setpaneldirfromcurdir_panelhl
  174.         ld hl,leftpanel
  175.         call editcmd_setpaneldirfromcurdir_panelhl
  176.  
  177.         ;ld e,0
  178.         ;OS_SETDRV
  179. ;l=NVOLUMES
  180.        
  181.         call readpanels_reprint
  182.        
  183. mainloop
  184.         call editcmd_readprompt_setendcmdx
  185.         call controlloop
  186.         jp mainloop
  187.  
  188. strdelpages ;удаляем str страницы. IX - панель. первую страничку не удаляем
  189.         ld hl, HS_strpg
  190.         ld e, (ix+PANEL.pgadd)
  191.         ld d, (ix+PANEL.pgadd+1)
  192.         adc hl, de
  193. strdelpages_next
  194.         inc hl
  195.         ld a, (hl)
  196.         or a
  197.         ret z
  198.         ld e, a
  199.         push hl
  200.         OS_DELPAGE
  201.         pop hl
  202.         xor a
  203.         ld (hl), a
  204.         jr strdelpages_next
  205.  
  206. strnewpage ;выделяем новую страничку IX - панель, E номер странички в HS_strpg
  207.         push hl
  208.         push de
  209.  
  210.         push de
  211.         OS_NEWPAGE
  212.         ld a, e
  213.         ld hl, HS_strpg
  214.         pop de
  215.         adc hl, de
  216.         ld e, (ix+PANEL.pgadd)
  217.         ld d, (ix+PANEL.pgadd+1)
  218.         adc hl, de
  219.         ld (hl), a
  220.         xor a
  221.         inc hl
  222.         ld (hl),a ; маркер конца списка
  223.  
  224.         pop de
  225.         pop hl
  226.         ret
  227.  
  228. ;nvpal
  229. ;       dw 0xffff,0x1f1f,0xfdfd,0xfcfc,0xefef,0xeeee,0xeded,0xecec ;NB color 1
  230. ;       dw 0xffff,0xdede,0xbdbd,0x9c9c,0x6f6f,0x4e4e,0x2d2d,0x0c0c
  231.  
  232.        
  233. printhint
  234.         ld de,24*256
  235.         call nv_setxy
  236.         ld hl,thint
  237. prhint0
  238.         ld a,(hl)
  239.         inc hl
  240.         or a
  241.         ret z
  242.         cp '{'
  243.         jr z,prhint_color0
  244.         cp '}'
  245.         jr z,prhint_color1
  246.         push hl
  247.         PRCHAR_
  248.         pop hl
  249.         jr prhint0
  250. prhint_color0
  251.         ld de,_HINTCOLOR1;7
  252.         jr prhint_color
  253. prhint_color1
  254.         ld de,_HINTCOLOR0;5*8
  255. prhint_color
  256.         call nv_setcolor
  257.         jr prhint0
  258. thint
  259.         db "{1}Left  { 2}Right { 3}View  { 4}Edit  { 5}Copy  { 6}Rename{ 7}MkDir { 8}Delete{ 9}Screen{ 0}Quit  ",0
  260.        
  261. readpanels_reprint
  262.         ;ld e,COLOR
  263.         ;OS_CLS
  264.         call printhint
  265.         ld ix,leftpanel
  266.         call readsortdrawpanel
  267.         ld ix,rightpanel
  268. readsortdrawpanel
  269.         call readdir
  270.         call sortfiles
  271.         jp drawpanel_with_files
  272.  
  273. readpanels_reprint_keepcursor
  274.         ;ld e,COLOR
  275.         ;OS_CLS
  276.         call printhint
  277.         ld ix,leftpanel
  278.         call readsortdrawpanel_keepcursor
  279.         ld ix,rightpanel
  280. readsortdrawpanel_keepcursor
  281.         call readdir_keepcursor
  282.         call sortfiles
  283.         jp drawpanel_with_files
  284.  
  285. drawpanel_head ;ix=panel
  286.         call nv_getpanelxy_de
  287.         inc e
  288.         inc e
  289.         call nv_setxy
  290.         push ix
  291.         or a
  292.         ld de,(curpanel)
  293.         pop hl
  294.         push hl
  295.         sbc hl,de
  296.         pop hl
  297.         jr nz,drawpanel_dir
  298.         ld de,_FILECURSORCOLOR
  299.         jr drawpanel_dir0
  300. drawpanel_dir
  301.         ld de,_PANELCOLOR
  302. drawpanel_dir0
  303.         call nv_setcolor
  304.         ld de,PANEL.dir
  305.         add hl,de
  306.         ld c,0
  307.         call panelprtext
  308.         ret
  309.        
  310. drawpanel_with_files
  311. ;ix=panel
  312.         call setpanelcolor
  313.         call nv_getpanelxy_de
  314.         call prtable ;keeps ix
  315.  
  316.  
  317.         call setpaneldir_makeprompt ;keeps ix
  318.         ld de,_COLOR
  319.         call nv_setcolor
  320.  
  321.         call drawpanel_head
  322.         call drawpanelfilesandsize
  323.        
  324. drawpanel_files
  325. ;ix=panel
  326.         ;ld a,(ix+PANEL.pg)
  327.         ;SETPG32KHIGH
  328.  
  329.         call setpanelcolor
  330.         ld l,(ix+PANEL.files)
  331.         ld h,(ix+PANEL.files+1)
  332.         call nv_getdirscroll_bc
  333.         push bc ;dirscroll
  334.         or a
  335.         sbc hl,bc ;hl=number of files in panel - scroll in panel
  336.         ld bc,CONST_HGT_TABLE
  337.         call minhl_bc_tobc ;bc = min(CONST_HGT_TABLE, number of files in panel - scroll in panel)
  338.         pop de ;dirscroll
  339.         ;ld l,(ix+PANEL.pointers)
  340.         ;ld h,(ix+PANEL.pointers+1)
  341.         ;add hl,de
  342.         ;add hl,de
  343.         call gotofilepointer_numberde
  344.  
  345.         call nv_getpanelxy_de
  346.         inc d
  347.         inc e
  348.         ld b,c ;files to show
  349.  
  350.         ld a,b
  351.         or a
  352.         ret z
  353. prNfiles       
  354.         push bc
  355.         push de
  356.         call nv_setxy ;keeps de,hl
  357.         ;ld e,(hl)
  358.         ;inc hl
  359.         ;ld d,(hl)
  360.         ;inc hl
  361.         call getfilepointer_de_fromhl
  362.         push hl
  363.         ex de,hl
  364.         push ix
  365.         call prdirfile
  366.         pop ix
  367.         pop hl
  368.         pop de 
  369.         pop bc
  370.         inc d
  371.         djnz prNfiles
  372.         ret    
  373.  
  374. fileiscom_ix;ix=fcb output: z=com
  375.         ld a,(ix+9)
  376.          or 0x20
  377.          cp 'c'
  378.         jr nz,fileiscom_ix_nocom
  379.         ld a,(ix+10)
  380.          or 0x20
  381.          cp 'o'
  382.         jr nz,fileiscom_ix_nocom
  383.         ld a,(ix+11)
  384.          or 0x20
  385.          cp 'm'
  386.         jr nz,fileiscom_ix_nocom
  387.         xor a
  388.         ret
  389. fileiscom_ix_nocom
  390.         cp '$'
  391.         jr nz,fileiscom_ix_nohobeta
  392.         ld a,(ix+10)
  393.         cp 'C'
  394.         jr nz,fileiscom_ix_nohobeta
  395.         ld a,(ix+11)
  396.         cp ' '
  397.         jr nz,fileiscom_ix_nohobeta
  398.         xor a
  399.         ret
  400. fileiscom_ix_nohobeta
  401.         ld a,1
  402.         or a
  403.         ret
  404.  
  405. colorfile
  406. ;ix=fcb
  407. ;out: de=color
  408.         ld de,_PANELFILECOLOR
  409.         ;ld (nvcolor),de
  410.         ld a,(ix+FCB_FATTRIB)
  411.         and FATTRIB_DIR
  412.         jr z,regfile
  413.         ld de,_PANELDIRCOLOR
  414.         ;ld (nvcolor),de
  415. regfile
  416.         call fileiscom_ix
  417.         jr nz,nocomfile
  418.         ld de,_PANELEXECOLOR
  419.         ;ld (nvcolor),de
  420. nocomfile
  421.         ld a,(ix) ;mark
  422.         and 1
  423.         ret z ;jr z,nomarkfile
  424.         ld de,_PANELSELECTCOLOR
  425. ;nomarkfile
  426.         ;ld (nvcolor),de
  427.         ret
  428.  
  429. prdirfile
  430. ;hl=fcb
  431.         push hl
  432.         pop ix
  433.         call colorfile ;de=color
  434. ;       push ix
  435.         call nv_setcolor
  436.         inc hl
  437.          ld de,filelinebuf
  438.          ld bc,8
  439.          ldir
  440. ;       pop ix
  441. ;       push ix
  442.         ld a,(ix+FCB_FATTRIB)
  443.         and FATTRIB_DIR
  444.         xor '.'
  445.         ;call cmdprchar
  446.          ld (de),a
  447.          inc de
  448.          ld c,3
  449.          ldir
  450.         ;ld de,_PANELCOLOR
  451.         ;call nv_setcolor
  452.         ;ld a,0xb3 ;'|'
  453.         ;PRCHAR_
  454.          inc de
  455.          inc de
  456.          inc de
  457.         ;ld de,(nvcolor)
  458.         ;call nv_setcolor
  459. ;        pop ix
  460.         exx
  461.         ld l,(ix+FCB_FSIZE+2)
  462.         ld h,(ix+FCB_FSIZE+3)
  463.         exx
  464.         ld l,(ix+FCB_FSIZE)
  465.         ld h,(ix+FCB_FSIZE+1)
  466. ;        push ix
  467.         call prdword_de
  468.         ;ld de,_PANELCOLOR
  469.         ;call nv_setcolor
  470.         ;ld a,0xb3 ;'|'
  471.         ;PRCHAR_
  472.          inc de
  473.          inc de
  474.          inc de
  475.         ;ld de,(nvcolor)
  476.         ;call nv_setcolor
  477. ;        pop ix
  478.         ld l,(ix+FCB_FDATE)
  479.         ld h,(ix+FCB_FDATE+1)
  480. ;       push ix
  481.         push hl
  482.         ld a,h
  483.         srl a
  484.         sub 20
  485.         jr nc,$+4
  486.         add a,100 ;XX century
  487.         call prNNcmd ;year
  488.         ;ld a,'-'      
  489.         ;PRCHAR_
  490.          inc de
  491.         pop hl
  492.         ld a,l
  493.         push af
  494.         add hl,hl
  495.         add hl,hl
  496.         add hl,hl
  497.         ld a,h
  498.         and 0x0f
  499.         call prNNcmd ;month
  500.         ;ld a,'-'
  501.         ;PRCHAR_
  502.          inc de
  503.         pop af
  504.         and 0x1f
  505.         call prNNcmd ;day
  506.         ;ld a,' '
  507.         ;PRCHAR_
  508.          inc de
  509. ;       pop ix
  510.         ld l,(ix+FCB_FTIME)
  511.         ld h,(ix+FCB_FTIME+1)
  512.         push hl
  513.         ld a,h
  514.         rra
  515.         rra
  516.         rra
  517.         and 0x1f
  518.         call prNNcmd ;hour
  519.         ;ld a,':'
  520.         ;PRCHAR_
  521.          inc de
  522.         pop hl
  523.         add hl,hl
  524.         add hl,hl
  525.         add hl,hl
  526.         ld a,h
  527.         and 0x3f
  528.         call prNNcmd ;minute
  529.         ld de,filelinebuf
  530.         ld hl,filelinebuf_sz
  531.         jp sendchars
  532. prNNcmd
  533. ;a=NN
  534. ;de=buf
  535.         ld bc,10+(256*('0'-1))
  536.         sub c
  537.         inc b
  538.         jr nc,$-2
  539.          ex de,hl
  540.          ld (hl),b
  541.          ex de,hl
  542.          inc de
  543.         add a,'0'+10
  544.          ld (de),a
  545.          inc de
  546.         ret
  547.  
  548. filelinebuf
  549.         ;db "filename.ext",0xb3,"1234567890",0xb3,"YY-MM-DD hh:mm"
  550.         db "filename.ext",0x1b,"[C1234567890",0x1b,"[CYY-MM-DD hh:mm"
  551. filelinebuf_sz=$-filelinebuf
  552.        
  553. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  554.  
  555. readdir
  556. ;ix=panel
  557.         call readdir_keepcursor
  558. nv_setcursor_zero
  559.         ld bc,0
  560.         call nv_setdirscroll_bc
  561.         jp nv_setdirpos_zero
  562.  
  563. readdir_keepcursor
  564. ;ix=panel
  565.         xor a
  566.         ld (ix+PANEL.totalsize),a
  567.         ld (ix+PANEL.totalsize+1),a
  568.         ld (ix+PANEL.totalsize+2),a
  569.         ld (ix+PANEL.totalsize+3),a
  570.         ld (ix+PANEL.markedsize),a
  571.         ld (ix+PANEL.markedsize+1),a
  572.         ld (ix+PANEL.markedsize+2),a
  573.         ld (ix+PANEL.markedsize+3),a
  574.         ld (ix+PANEL.markedfiles),a
  575.         ld (ix+PANEL.markedfiles+1),a
  576.  
  577.         push ix
  578.         call setpaneldir
  579.         call strdelpages
  580.         ld de,fcb
  581.         OS_SETDTA ;set disk transfer address = de
  582.         ;call makeemptymask
  583.         ld de,fcbmask
  584.         OS_FSEARCHFIRST
  585.         pop ix
  586.         or a
  587.  
  588.         ld e,(ix+PANEL.catbuf)     ;00
  589.         ld d,(ix+PANEL.catbuf+1)   ;c0
  590.         ld l,(ix+PANEL.pointers)   ;00  номер страницы
  591.         ld h,(ix+PANEL.pointers+1) ;c0  номер файла
  592.         ld bc,0 ;nfiles
  593.         jp nz,loaddir_error
  594.                 ld a,(fcb+1)
  595.                 cp '.'
  596.                 jp z,loaddir_onedot
  597. loaddir0
  598.         push bc
  599.  
  600.         push de
  601.         push hl
  602.         ld a,e
  603.         and 31
  604.         add a,(ix+PANEL.pgadd)
  605.         PGW3strpg
  606.         ld a,e
  607.         and 0xe0 ;отбрасываем младшую часть (<32) с номером страницы, остается только номер файла
  608.         ld e,a
  609.         xor a
  610.         ld (de),a ;mark
  611.         inc de
  612.         ld hl,fcb+1
  613.         ld bc,31;FCB_sz
  614.         ldir ; копируем fcb в catbuf
  615.         pop hl
  616.         pop de
  617.         call putfilepointer_de_tohl ; возвращает в верхнее окно страницу poipg и в pointers заносит de
  618.         ex de,hl
  619.         ld bc,32
  620.         add hl,bc
  621.         ex hl,de ; увеличили на 32 catbuf
  622.         jr nc,nonewpg ; всё ещё убираемся в страницу
  623.         inc de ;next page de
  624.         call strnewpage
  625.         set 7,d
  626.         set 6,d ;de=c0pg
  627. nonewpg:
  628.         ;TODO через процедуру
  629.         push hl
  630.         ld l,(ix+PANEL.totalsize)
  631.         ld h,(ix+PANEL.totalsize+1)
  632.         ld bc,(fcb+FCB_FSIZE)
  633.         add hl,bc
  634.         ld (ix+PANEL.totalsize),l
  635.         ld (ix+PANEL.totalsize+1),h
  636.         ld l,(ix+PANEL.totalsize+2)
  637.         ld h,(ix+PANEL.totalsize+3)
  638.         ld bc,(fcb+FCB_FSIZE+2)
  639.         adc hl,bc
  640.         ld (ix+PANEL.totalsize+2),l
  641.         ld (ix+PANEL.totalsize+3),h
  642.         pop hl
  643.        
  644.         pop bc
  645.         inc bc ;nfiles
  646.         bit 5,b;1,b ;страничка pgtemp закончилась? max 512 файлов по 32 байта
  647.         jr nz,loaddirq
  648. loaddir_onedot
  649.         push bc
  650.         push de ;catbuf
  651.         push hl
  652.         push ix
  653.         ld de,fcb
  654.         OS_SETDTA ;set disk transfer address = de
  655.          ld de,fcbmask ;в CP/M не нужно, но отсутствие вредит многозадачности
  656.         OS_FSEARCHNEXT
  657.         pop ix
  658.         pop hl
  659.         pop de ;catbuf
  660.         pop bc ;nfiles
  661.         or a
  662.         jr z,loaddir0
  663. loaddir_error
  664. loaddirq
  665. ;bc=nfiles
  666.         ld (ix+PANEL.files),c
  667.         ld (ix+PANEL.files+1),b
  668.  
  669.         if 1==0
  670.         ld l,(ix+PANEL.pointers)
  671.         ld h,(ix+PANEL.pointers+1)
  672.         ld e,(ix+PANEL.catbuf)
  673.         ld d,(ix+PANEL.catbuf+1)
  674. sortfiles_0
  675.         push bc
  676.         ;ld (hl),e     
  677.         ;inc hl
  678.         ;ld (hl),d
  679.         ;inc hl
  680.         call putfilepointer_de_tohl
  681.         ex hl,de
  682.         ld bc,32
  683.         add hl,bc
  684.         ex hl,de
  685.          jr nc,$+3
  686.          inc de ;next page
  687.         pop bc
  688.         dec bc 
  689.         ld a,b
  690.         or c
  691.         jr nz,sortfiles_0
  692.         endif
  693.  
  694.         call countfiles
  695.         ld (ix+PANEL.filesdirs),l
  696.         ld (ix+PANEL.filesdirs+1),h
  697.        
  698.         ex de,hl
  699.         call nv_getdirpos_hl
  700.         or a
  701.         sbc hl,de ;dirpos<files?
  702.         ret c ;OK
  703.         jp nv_setcursor_zero
  704.  
  705. controlloop
  706.         call fixscroll_prcmd
  707. controlloop_noprline
  708.         ld hl,controlloop
  709.         push hl
  710.         ld ix,(curpanel)
  711.         ld a,(ix+PANEL.files)
  712.         or (ix+PANEL.files+1)
  713.         call z,nv_setdirpos_zero ;can't move cursor if 0 files
  714.         ;ld e,CURSORCOLOR;#38
  715.         ;OS_PRATTR ;draw cursor
  716.         ld hl,_FILECURSORCOLOR
  717.         call prfilecursor
  718.          ;push hl ;color under file cursor
  719.         call cmdcalccurxy
  720.         call nv_setxy
  721. controlloop_nokey
  722.         call yieldgetkeyloop ;YIELDGETKEYLOOP
  723.          or a
  724.          jr z,controlloop_nokey ;TODO handle mouse events
  725.          ;pop hl ;color under file cursor
  726.         push af
  727.         ld ix,(curpanel)
  728.         call getfcbaddrundercursor
  729.         push hl
  730.         pop ix
  731.         ;display $
  732.         call colorfile
  733.         ex de,hl ;hl=color
  734.         call prfilecursor ;remove file cursor
  735.         ;call cmdcalccurxy
  736.         ;call nv_setxy
  737.         ;ld e,COLOR;7
  738.         ;OS_PRATTR ;remove cursor
  739.          ld de,_COLOR
  740.          call nv_setcolor ;even if we didn't reprint command line, draw windows with its color
  741.         pop af
  742.         ld hl,tnvcmds
  743.         ld bc,nnvcmds
  744.         cpir
  745.         jp nz,editcmd_keyfail
  746. ;bc=nnvcmds-(#команды+1) = 0..(nnvcmds-1)
  747.         add hl,bc
  748. ;hl=tnvcmds+nnvcmds
  749.         add hl,bc
  750.         add hl,bc
  751. ;hl=tnvcmds+nnvcmds+ 2*(nnvcmds-(#команды+1))
  752.         ld c,(hl)
  753.         inc hl
  754.         ld h,(hl)
  755.         ld l,c
  756.         push hl ;jump addr
  757.         ld hl,cmdbuf
  758.         ld ix,(curpanel)
  759.         ret
  760. editcmd_keyfail
  761.         cp 0x20
  762.         ret c ;прочие системные кнопки не нужны
  763. editcmd_typein
  764. ;keeps ix
  765.         ld e,a
  766.         ld hl,cmdbuf
  767.         call strlen ;hl=length
  768.         ld bc,MAXCMDSZ
  769.         or a
  770.         sbc hl,bc
  771.         ret nc ;некуда вводить
  772.         call cmdcalctextaddr ;hl=addr, a=curcmdx
  773.         inc a
  774.         ld (curcmdx),a
  775.         jp strinsch
  776.  
  777. editcmd_space
  778.         ld a,(cmdbuf)
  779.         or a
  780.         ld a,' '
  781.         jr nz,editcmd_typein
  782.         call getfcbaddrundercursor;hl=addr fcb ;ix=curpanel
  783.         call isthisdotdir_hl
  784.         call nz,changemark_hl
  785.         push hl
  786.         call setfilecursorxy
  787.         pop hl
  788.         call prdirfile
  789.         ld ix,(curpanel)
  790.         call drawpanelfilesandsize
  791.         jp editcmd_down
  792.        
  793. editcmd_backspace
  794.         call cmdcalctextaddr ;hl=addr, a=curcmdx
  795.         or a
  796.         jr z,editcmddirback;editcmdok ;нечего удалять
  797.         dec a
  798.         ld (curcmdx),a
  799.         jp strdelch
  800.        
  801. editcmddirback
  802.         call setpaneldir
  803.         ld de,tdotdot
  804.         OS_CHDIR
  805.         jp editcmd_setpaneldirfromcurdir
  806.  
  807. editcmd_left
  808.         ld a,(curcmdx)
  809.         or a
  810.         ret z ;некуда влево
  811.         dec a
  812.         ld (curcmdx),a
  813.         ret
  814.      
  815. editcmd_right
  816.         call cmdcalctextaddr ;hl=addr, a=curcmdx
  817.         inc (hl)
  818.         dec (hl)
  819.         ret z ;некуда вправо, стоим на терминаторе
  820.         inc a
  821.         ld (curcmdx),a
  822.         ret
  823.      
  824. editcmd_pageDown
  825.         call count_filecursor_y
  826.         cp CONST_HGT_TABLE-1+firstfiley -1 ;???
  827.         jr c,editcmd_pageDown_nolastvisible ;not last visible file
  828.         call nv_getdirpos_hl
  829.         ld bc,CONST_HGT_TABLE
  830.         add hl,bc
  831. editcmd_pageDown_end_q        
  832.         call cpfiles_setdirpos ;hl=dirpos
  833.         ld bc,CONST_HGT_TABLE-1
  834.         xor a
  835.         sbc hl,bc
  836.         jr nc,$+4
  837.         ld h,a
  838.         ld l,a;0
  839.         jr editcmd_pageUpq
  840. editcmd_pageDown_nolastvisible
  841.         call nv_getdirscroll_bc
  842.         ld hl,CONST_HGT_TABLE-1
  843.         add hl,bc ;last visible file
  844.         call cpfiles_setdirpos
  845.         jp drawpanel_files      
  846.  
  847. editcmd_pageUp
  848.         call count_filecursor_y
  849.         cp firstfiley
  850.         jr nc,editcmd_pageDown_nofirstvisible ;not first visible file
  851.         call nv_getdirpos_hl
  852.         ld bc,CONST_HGT_TABLE-1
  853.         xor a
  854.         sbc hl,bc
  855.         jr nc,$+4
  856.         ld h,a
  857.         ld l,a;0
  858.         call nv_setdirpos_hl
  859. editcmd_pageUpq
  860.         ld b,h
  861.         ld c,l
  862.         call nv_setdirscroll_bc
  863.         jp drawpanel_files      
  864. editcmd_pageDown_nofirstvisible
  865.         call nv_getdirscroll_bc
  866.         ld h,b
  867.         ld l,c
  868.         call nv_setdirpos_hl
  869.         jp drawpanel_files    
  870.  
  871. editcmd_End
  872.         ld hl,-1 ;>=files
  873.         jp editcmd_pageDown_end_q
  874.  
  875. editcmd_Home
  876.         xor a
  877.         ld h,a
  878.         ld l,a;0
  879.         call nv_setdirpos_hl
  880.         ld b,h
  881.         ld c,l
  882.         call nv_setdirscroll_bc
  883.         jp drawpanel_files    
  884.  
  885.        
  886. editcmd_up
  887.          ld hl,controlloop_noprline
  888.          ex (sp),hl
  889.         call nv_getdirpos_hl
  890.         ld a,h
  891.         or l
  892.         ret z ;first file
  893.         dec hl
  894.         call nv_setdirpos_hl
  895.         call count_filecursor_y
  896.         cp firstfiley-2;or a
  897.         ret nz ;not above first visible file
  898.         call nv_getdirscroll_bc
  899.         dec bc
  900.         call nv_setdirscroll_bc
  901.          push bc
  902.         call nv_getpanelxy_de
  903.         inc d
  904.         push de
  905.         ld hl,CONST_HGT_TABLE*256 + 40
  906.         call scrolldown ;OS_SCROLLDOWN
  907.         pop de
  908.         inc e
  909.         call nv_setxy
  910.          pop hl ;file number
  911.         call getfcbaddrunderhl
  912.         jp prdirfile
  913.  
  914. editcmd_down
  915.          ld hl,controlloop_noprline
  916.          ex (sp),hl
  917.         call nv_getdirpos_hl
  918.         call nv_getpanelfiles_bc
  919.         inc hl
  920.         or a
  921.         sbc hl,bc
  922.         add hl,bc
  923.         ret z ;last file
  924.         call nv_setdirpos_hl
  925.         call count_filecursor_y
  926.         cp CONST_HGT_TABLE-1+firstfiley
  927.         ret c ;not last visible file
  928.         call nv_getdirscroll_bc
  929.         inc bc
  930.         call nv_setdirscroll_bc
  931.         ld hl,CONST_HGT_TABLE-1
  932.         add hl,bc
  933.         push hl
  934.         call nv_getpanelxy_de
  935.         inc d
  936.         push de
  937.         ld hl,CONST_HGT_TABLE*256 + 40
  938.         call scrollup ;OS_SCROLLUP
  939.         pop de
  940.         ld a,d
  941.         add a,CONST_HGT_TABLE-1
  942.         ld d,a
  943.         inc e
  944.         call nv_setxy
  945.          pop hl ;file number
  946.         call getfcbaddrunderhl
  947.         jp prdirfile
  948.  
  949. editcmd_ss1
  950.         ld hl,comparefilename
  951.         jr editcmd_setsortmodehl
  952. editcmd_ss2
  953.         ld hl,compareext
  954.         jr editcmd_setsortmodehl
  955. editcmd_ss3
  956.         ld hl,comparesize
  957.         jr editcmd_setsortmodehl
  958. editcmd_ss4
  959.         ld hl,comparedate
  960.         jr editcmd_setsortmodehl
  961. editcmd_ss5
  962.         ld hl,compareempty
  963. editcmd_setsortmodehl
  964.         call ifcmdnonempty_typedigit
  965.         ld c,(ix+PANEL.dirsortproc)
  966.         ld b,(ix+PANEL.dirsortproc+1)
  967.         xor a
  968.         sbc hl,bc
  969.         add hl,bc
  970.         jr nz,editcmd_setsortmodehl_noold
  971.         ld a,(ix+PANEL.dirsortmode)
  972.         cpl
  973. editcmd_setsortmodehl_noold
  974.         ld (ix+PANEL.dirsortmode),a
  975.         ld (ix+PANEL.dirsortproc),l
  976.         ld (ix+PANEL.dirsortproc+1),h
  977.         jp editcmd_reprintcurpanel
  978.  
  979. editcmd_tab
  980.         push ix
  981.         call getanotherpanel_ix
  982.         ld (curpanel),ix
  983.         call drawpanel_head
  984.         pop ix
  985.         call drawpanel_head ;inactive panel
  986.         jp editcmd_readprompt_setendcmdx
  987.  
  988. editcmd_enter
  989.         ld a,(cmdbuf)
  990.         or a
  991.         jr nz,editcmd_enter_runcmd
  992.         call getfcbundercursor ;->fcb
  993.         ld a,(fcb+FCB_FATTRIB)
  994.         and FATTRIB_DIR;#10
  995.         jp z,editcmd_enter_run
  996.         call changedir_fromfcb
  997. editcmd_setpaneldirfromcurdir
  998.         ld hl,editcmd_reprintcurpanel
  999.         push hl
  1000.         ld hl,(curpanel)
  1001. editcmd_setpaneldirfromcurdir_panelhl
  1002.         ld de,PANEL.dir
  1003.         add hl,de
  1004.         ex de,hl ;de=pointer to 64 byte (MAXPATH_sz!) buf
  1005.         OS_GETPATH
  1006.         ret
  1007.  
  1008. editcmd_enter_runcmd
  1009. ;run "cmd <command to run>"
  1010.         OS_SETSYSDRV ;TODO каталог cmd
  1011.         ld hl,cmd_filename
  1012.         call copy_to_fcb_filename
  1013.        
  1014.         ld hl,cmdbuf
  1015. loadandrun_waitpid
  1016. ;hl=cmdbuf или cmdprompt (для loadandrun_restcmd)
  1017.         push hl
  1018.         ;---
  1019. ;        ld de,#1800
  1020. ;        call nv_setxy
  1021.         ;call nv_copyscreen1to0
  1022.         ;ld a,0x0d
  1023.         ;PRCHAR_
  1024.         ;ld a,0x0a
  1025.         ;PRCHAR_
  1026.         ld de,0
  1027.         SETXY_
  1028.         ld de,_COLOR
  1029.         SETCOLOR_
  1030.         ;---
  1031.         ;ld e,-1
  1032.         ;OS_SETGFX ;disable gfx, give focus ;before RUNAPP!!!
  1033.         pop hl ;hl=cmdbuf или cmdprompt
  1034.          ;call setcurpaneldir
  1035.         call loadandrun ;nz=error, e=id
  1036.         jp nz,execcmd_error
  1037. ;команда scratch - реально cmd scratch в текущем терминале
  1038.         ;YIELD ;дать время задаче cmd захватить фокус
  1039.         WAITPID
  1040. execcmd_error
  1041. execcmd_runfocusq
  1042.         ;YIELD ;дать время системе передать фокус рандомной задаче
  1043.         ;ld b,25
  1044. ;execcmd_waitchildredraw0
  1045.         ;push bc
  1046.         ;YIELD ;дать время задаче scratch захватить фокус и перерисовать (но загрузить картинку и перерисовать не успеет)
  1047.         ;pop bc
  1048.         ;djnz execcmd_waitchildredraw0
  1049.         ;ld e,6 ;textmode
  1050.         ;OS_SETGFX ;take focus (can be random after closing cmd)
  1051.         ;call nv_copyscreen0to1
  1052.         ;YIELDGETKEY ;key refresh
  1053.         CLS_
  1054.         ld hl,cmdbuf
  1055.         ld (hl),0
  1056.         jp editcmd_reprintall
  1057.  
  1058. ;execcmd_error
  1059. ;        jp execcmd_runfocusq;editcmd_reprintall
  1060.  
  1061. editcmd_enter_run
  1062.         call setpaneldir
  1063.         ld hl,fcb_filename+8
  1064.         ld a,(hl)
  1065.         inc hl
  1066.         ld c,(hl)
  1067.         inc hl
  1068.         ld b,(hl)
  1069.         cp '$'
  1070.         jp z,editcmd_enter_runfile_hobeta
  1071.         or 0x20
  1072.         cp 'c'
  1073.         jr nz,editcmd_enter_runfile_nocom
  1074.         ld a,c
  1075.         or 0x20
  1076.         cp 'o'
  1077.         jr nz,editcmd_enter_runfile_nocom
  1078.         ld a,b
  1079.         or 0x20
  1080.         cp 'm'
  1081.         jr nz,editcmd_enter_runfile_nocom
  1082. editcmd_enter_runfile_com
  1083.         ld hl,cmdbuf
  1084.         ld (hl),0
  1085. ;hl=rest of command line
  1086.         jp loadandrun_waitpid
  1087.  
  1088.         ;display "editcmd_enter_runfile_nocom",editcmd_enter_runfile_nocom
  1089. editcmd_enter_runfile_nocom
  1090.         ld hl,runfile_nocomq
  1091.         push hl
  1092.         call makeprompt_filename
  1093.        
  1094.         call runfile_findhandler ;find fcb_filename ext (spoiled) in "nv.ext"
  1095.         ret nz ;jp nz,execcmd_error
  1096.  
  1097.         ld de,cmdbuf
  1098.         ld hl,fcb_filename
  1099.         OS_PARSEFNAME ;de->hl
  1100.        
  1101.         OS_SETSYSDRV ;TODO директория cmd
  1102.         ld hl,cmdprompt
  1103.         jp loadandrun_waitpid
  1104.  
  1105. makeprompt_filename
  1106.         call setpaneldir_makeprompt ;keeps ix
  1107.         call getfcbundercursor ;->fcb
  1108.         ld hl,cmdprompt
  1109.         xor a
  1110.         cpir
  1111.         dec hl ;hl=адрес терминатора
  1112.         ld a,'/'
  1113.         dec hl
  1114.         cp (hl)
  1115.         inc hl
  1116.         jr z,$+4
  1117.          ld (hl),a
  1118.          inc hl
  1119.         ex de,hl ;de=prompt = "d:/path/" без терминатора
  1120.         ld hl,fcb_filename
  1121.         call cpmname_to_dotname ;prompt = "d:/path/filename"
  1122.         ret
  1123.        
  1124. runfile_findhandler
  1125. ;find fcb_filename ext (spoiled) in "nv.ext"
  1126. ;out: nz=error, cmdbuf=handler
  1127.         ld hl,fcb_filename+8
  1128.         ld de,ext
  1129.         ld b,3
  1130. runfile_nocom_recodeext0
  1131.         ld a,(hl)
  1132.         or 0x20
  1133.         ld (de),a
  1134.         inc hl
  1135.         inc de
  1136.         djnz runfile_nocom_recodeext0
  1137.         OS_SETSYSDRV ;TODO директория nv
  1138.         ld hl,ext_filename
  1139.         call copy_to_fcb_filename
  1140.         call nv_openfcb ;autopush nv_closefcb
  1141.         ret nz ;error
  1142.         ld iy,file_buf_end
  1143. runfile_nocom_extloop
  1144.         call checkoneext ;c=ошибки, z=нет ошибок
  1145.         jr c,runfile_nocom_readerror
  1146.         jr z,runfile_nocom_extok
  1147.         call checkcomma
  1148.         jr c,runfile_nocom_readerror
  1149.         jr z,runfile_nocom_extloop
  1150.         call skiptonextline
  1151.         jr nz,runfile_nocom_extloop ;no EOF
  1152. runfile_nocom_readerror
  1153.         xor a
  1154.         dec a
  1155.         ret ;nz
  1156. runfile_nocom_extok
  1157.         call skiptocolon ;пройти к ':'
  1158.         ld hl,cmdbuf
  1159.         call loadtoendline
  1160.          ;jr $
  1161.         xor a
  1162.         ret ;z
  1163.        
  1164. runfile_nocomq
  1165.         ld hl,cmdbuf
  1166.         ld (hl),0
  1167.         ld ix,(curpanel)
  1168. setpaneldir_makeprompt
  1169.         call setpaneldir ;keeps ix
  1170.         jp makeprompt ;-> prompt ;keeps ix
  1171.  
  1172.         macro READBYTE_A
  1173. ;out: z=EOF
  1174.         inc ly
  1175.         call m,readbyte_readbuf
  1176.         ld a,(iy)
  1177.         endm
  1178.  
  1179. checkoneext
  1180.         ld hl,ext
  1181.         ld bc,3*256
  1182. checkoneext0
  1183.         READBYTE_A
  1184.         ret z ;EOF
  1185.         cp 0x0a
  1186.         jr z,checkoneext0 ;skip LF
  1187.         or 0x20
  1188.         xor (hl)
  1189.         inc hl
  1190.         or c
  1191.         ld c,a
  1192.         djnz checkoneext0
  1193. ;c=ошибки, z=нет ошибок
  1194.         ret
  1195.  
  1196. skiptocolon
  1197.         READBYTE_A
  1198.         ret z ;EOF
  1199.         cp ':'
  1200.         jr nz,skiptocolon
  1201.         ret
  1202.  
  1203. checkcomma
  1204.         READBYTE_A
  1205.         cp ','
  1206.         ret ;TODO проверить EOF
  1207.        
  1208. loadtoendline
  1209. ;hl=buf
  1210.         READBYTE_A
  1211.         jr z,loadtoendlineq
  1212.         cp 0x0d
  1213.         jr z,loadtoendlineq
  1214.         ld (hl),a
  1215.         inc hl
  1216.         jr loadtoendline
  1217. loadtoendlineq
  1218.         ld (hl),0
  1219.         ret
  1220.  
  1221. skiptonextline
  1222.         READBYTE_A
  1223.         ret z ;EOF
  1224.         cp 0x0d
  1225.         jr nz,skiptonextline
  1226.         or a
  1227.         ret ;nz
  1228.  
  1229. readbyte_readbuf
  1230. ;out: z=EOF
  1231.         push bc
  1232.         push de
  1233.         push hl
  1234.         push ix
  1235.         ld de,file_buf
  1236.         push de
  1237.         OS_SETDTA ;set disk transfer address = de
  1238.         ld de,fcb
  1239.         OS_FREAD
  1240.         cp 128 ;128=no bytes read
  1241.         pop iy
  1242.         pop ix
  1243.         pop hl
  1244.         pop de
  1245.         pop bc
  1246.         ret
  1247.        
  1248.  
  1249. editcmd_enter_runfile_hobeta
  1250. hobetarunner=0x4100
  1251.         ld e,6 ;textmode
  1252.         OS_SETGFX
  1253.         ld a,(user_scr0_low) ;ok
  1254.         sub 4-1 ;ld a,#ff-4 ;pgkillable
  1255.         SETPG16K
  1256.  
  1257.         ld hl,washobetarunner
  1258.         ld de,hobetarunner
  1259.         ld bc,hobetarunner_sz
  1260.         ldir
  1261.        
  1262. ;cmdpgscreen0_0=$+1
  1263. ;       ld a,#ff-1
  1264.         ld a,(user_scr0_low) ;ok
  1265.         SETPG32KLOW
  1266.         inc a ;ld a,#ff-0
  1267.         SETPG32KHIGH
  1268. ;0x4000 : pg4
  1269. ;0x8000 : pg1
  1270. ;0xc000 : pg0
  1271.  
  1272.         call loadhobeta
  1273.         ret nz ;error
  1274.          ;jr $
  1275.         ld hl,0x6000
  1276.         ld bc,(0x6000-17+11) ;len
  1277.         add hl,bc
  1278.         dec hl ;hl=load end
  1279.         ex de,hl
  1280.         ld hl,(0x6000-17+9) ;start
  1281.         ld (hobetarunner_jp),hl
  1282.         add hl,bc
  1283.         dec hl
  1284.         ex de,hl ;de=destination end
  1285.         lddr
  1286.         jp hobetarunner
  1287.  
  1288. loadhobeta        
  1289.         call nv_openfcb ;autopush nv_closefcb
  1290.         ret nz ;error
  1291.         ld de,0x6000-17
  1292.         OS_SETDTA
  1293. editcmd_enter_runfile_hobeta_fcb0      
  1294.         ld de,fcb
  1295.         OS_FREAD
  1296.         or a
  1297.         jr z,editcmd_enter_runfile_hobeta_fcb0
  1298. ;editcmd_enter_runfile_hobeta_fcbq
  1299.         xor a ;no error
  1300.         ret ;call nv_closefcb
  1301.  
  1302. loadandrun
  1303. ;hl=rest of command line
  1304. ;out: nz=error, e=id
  1305. ;load file in fcb from system current dir with parameters in tcmd, then set curpaneldir and run
  1306.         ld (loadandrun_restcmd),hl
  1307.         call nv_openfcb ;autopush nv_closefcb
  1308.         ret nz ;error
  1309.         ;set current drive and dir (will be copied into new app)
  1310.         call setcurpaneldir
  1311.        
  1312.         OS_NEWAPP
  1313.         or a
  1314.         ret nz ;error
  1315. ;dehl=номера страниц в 0000,4000,8000,c000 нового приложения, b=id, a=error
  1316.         push bc ;b=id
  1317.         ld a,d
  1318.         SETPG32KHIGH
  1319.         push de
  1320.         push hl
  1321.         ld hl,fcb_filename
  1322.         ld de,0xc000+COMMANDLINE
  1323.         call cpmname_to_dotname ;de указывает на терминатор
  1324. loadandrun_restcmd=$+1
  1325.         ld hl,0
  1326.          ld a,(hl)
  1327.          or a
  1328.          jr z,loadandrun_noparams
  1329.         ld a,' '
  1330.         ld (de),a
  1331.         inc de
  1332. loadandrun_noparams
  1333.         ld bc,COMMANDLINE_sz;-tcmd_sz
  1334.         ldir ;copy command line ;можем залезть за 0x0100!
  1335.         xor a
  1336.         ld (0xc000+COMMANDLINE+COMMANDLINE_sz-1),a
  1337.         pop hl
  1338.         pop de
  1339.  
  1340.         call readfile_pages_dehl
  1341.  
  1342.         pop de
  1343.         ld e,d ;e=id
  1344. ;run "cmd <commandline>"
  1345.         push de
  1346.         OS_RUNAPP
  1347.         pop de
  1348.         xor a
  1349.         ret ;z
  1350.  
  1351. editcmd_1
  1352.         call ifcmdnonempty_typedigit
  1353.         ld hl,leftpanel
  1354.         ld a,10
  1355.         jr editcmd_drvselector
  1356. editcmd_2
  1357.         call ifcmdnonempty_typedigit
  1358.         ld hl,rightpanel
  1359.         ld a,50
  1360. editcmd_drvselector
  1361.         ld (windrv),a ;x
  1362.         add 5
  1363.         ld (windrverr),a
  1364.         ld (curpanel),hl
  1365.         ld hl,editcmd_reprintcurpanel;editcmd_reprintall_onlyreadcurdir
  1366.         push hl
  1367.  
  1368. seldrv_redraw_mainloop
  1369.         ld hl,windrv
  1370. ;hl=window
  1371.         ld de,_COLOR_DIALOG
  1372.         call nv_setcolor
  1373.  
  1374.         call prwindow_text ;de=YX of last line
  1375. seldrv_mainloop
  1376.         ld de,(windrv)
  1377. seldrv_cury=$+1
  1378.         ld a,0
  1379.         add a,d
  1380.         add a,2
  1381.         ld d,a
  1382.         inc e
  1383.         inc e
  1384.         inc e
  1385.         push de
  1386.         ld hl,_CURSORCOLOR
  1387.         ld b,22
  1388.         call drawfilecursor_sizeb_colorhl ;draw cursor
  1389. seldrv_mainloop_nokey
  1390.         call yieldgetkeyloop ;YIELDGETKEYLOOP
  1391.          or a
  1392.          jr z,seldrv_mainloop_nokey ;TODO handle mouse events
  1393.         ld a,c
  1394.         pop de
  1395.         push af
  1396.         ld hl,_COLOR_DIALOG
  1397.         ld b,22
  1398.         call drawfilecursor_sizeb_colorhl ;remove cursor
  1399.         pop af
  1400.         cp key_redraw
  1401.         jr z,seldrv_redraw_mainloop
  1402.         ld hl,seldrv_cury
  1403.         cp key_enter
  1404.         jr z,seldrv_selcursor
  1405.         cp key_esc
  1406.         ret z
  1407.         cp 'a'
  1408.         jr c,seldrv_cursor
  1409.         cp 'p'
  1410.         jr nc,seldrv_cursor
  1411.         jr seldrv_selletter
  1412. seldrv_cursor
  1413.         ld bc,seldrv_mainloop
  1414.         push bc
  1415.         cp key_down
  1416.         jr z,seldrv_down
  1417.         cp key_up
  1418.         jr z,seldrv_up
  1419.         ret
  1420. seldrv_selletter
  1421.         sub 'a'
  1422.         jr seldrv_ok
  1423. seldrv_selcursor
  1424.         ld a,(hl)
  1425. seldrv_ok
  1426.         ld e,a
  1427.         push de
  1428.         OS_SETDRV
  1429.         pop de
  1430.         or a
  1431.         jr z,seldrv_ok0
  1432.         ld de,_COLOR_RED
  1433.         call nv_setcolor
  1434.         ld hl,windrverr
  1435.         call prwindow_waitkey
  1436.         ld de,_COLOR
  1437.         call nv_setcolor
  1438.         jp seldrv_redraw_mainloop
  1439. seldrv_ok0
  1440.         ld a,e
  1441.         add 'a'
  1442.         ld ix,(curpanel)
  1443.         ld (ix+PANEL.dir),a
  1444.         ld (ix+PANEL.dir+1),':'
  1445.         ld (ix+PANEL.dir+2),'/'
  1446.         ld (ix+PANEL.dir+3),0
  1447. ;       ld hl,ix
  1448. ;       ld de,PANEL.dir
  1449. ;       add hl,de
  1450. ;       ex hl,de
  1451. ;       OS_CHDIR
  1452. ;       or a
  1453. ;        ret z
  1454. ;       ld de,_COLOR_RED
  1455. ;       call nv_setcolor
  1456. ;       ld hl,windrverr
  1457. ;       call prwindow_waitkey
  1458. ;       ld de,_COLOR
  1459. ;       call nv_setcolor
  1460. ;       jp seldrv_redraw_mainloop
  1461.         ret
  1462.  
  1463. seldrv_down
  1464.         ld a,(hl)
  1465.         inc a
  1466.         cp 15; drives
  1467.         ret z
  1468.         ld (hl),a
  1469.         ret
  1470. seldrv_up
  1471.         ld a,(hl)
  1472.         or a
  1473.         ret z
  1474.         dec (hl)
  1475.         ret
  1476.  
  1477. editcmd_4
  1478.         call ifcmdnonempty_typedigit
  1479.         call getfcbundercursor ;->fcb
  1480.         ld a,(fcb+FCB_FATTRIB)
  1481.         and FATTRIB_DIR;#10
  1482.         ret nz
  1483.  
  1484.         ld hl,editcmd_reprintall_noreaddir
  1485.         push hl
  1486.  
  1487.         call makeprompt_filename
  1488.        
  1489.         ;call runfile_findhandler ;find fcb_filename ext (spoiled) in "nv.ext"
  1490.         ;ret nz ;jp nz,execcmd_error
  1491.  
  1492.         ;ld de,cmdbuf
  1493.         ;ld hl,fcb_filename
  1494.         ;OS_PARSEFNAME ;de->hl
  1495.        
  1496.         OS_SETSYSDRV ;TODO директория texted
  1497.        
  1498.         ld hl,texted_filename
  1499.         call copy_to_fcb_filename
  1500.        
  1501.         ;ld hl,cmdbuf
  1502.         ;ld (hl),0
  1503.         ld hl,cmdprompt
  1504. ;load file in fcb from system current dir with parameters in tcmd, then set curpaneldir and run
  1505.         jp loadandrun_waitpid
  1506.        
  1507. editcmd_9
  1508.         call ifcmdnonempty_typedigit
  1509.         ;ld e,1
  1510.         ;OS_SETSCREEN
  1511.         ;YIELDGETKEYLOOP
  1512.         ;ld e,0
  1513.         ;OS_SETSCREEN
  1514.         ret
  1515.  
  1516. editcmd_reprintall_keepcursor
  1517.         call readpanels_reprint_keepcursor
  1518.         jp editcmd_readprompt_setendcmdx
  1519.  
  1520. editcmd_reprintcurdir
  1521.         ld hl,leftpanel+PANEL.dir
  1522.         ld de,rightpanel+PANEL.dir
  1523.         call strcp
  1524.         jr nz,editcmd_reprintcurpanel
  1525. editcmd_reprintall
  1526.         call readpanels_reprint
  1527.         jp editcmd_readprompt_setendcmdx
  1528. editcmd_reprintcurpanel
  1529.         ld ix,(curpanel)
  1530.         call readdir
  1531.         call sortfiles
  1532.         call drawpanel_with_files
  1533.         jp editcmd_readprompt_setendcmdx
  1534. editcmd_reprintall_noreaddir
  1535.         ;ld e,COLOR
  1536.         ;OS_CLS
  1537.         call printhint
  1538.         ld ix,leftpanel
  1539.         call drawpanel_with_files
  1540.         ld ix,rightpanel
  1541.         jp drawpanel_with_files
  1542. ;editcmd_reprintall_onlyreadcurdir
  1543. ;       ld e,COLOR
  1544. ;       OS_CLS
  1545. ;       call printhint
  1546. ;       call getanotherpanel_ix
  1547. ;       call drawpanel_with_files
  1548. ;       jp editcmd_reprintcurpanel
  1549.        
  1550. editcmd_invfiles
  1551. ;ix=curpanel
  1552.         ld hl,changemark_hl
  1553.         call processfiles
  1554.         jp drawpanel_with_files
  1555.  
  1556. editcmd_6 ;ren
  1557.         call ifcmdnonempty_typedigit
  1558.         ld hl,editcmd_reprintall
  1559.         push hl
  1560.         call setpaneldir
  1561.         call getfcbundercursor
  1562.         ld hl,fcb_filename
  1563.         ld de,tnewfilename
  1564.         push de
  1565.         call cpmname_to_dotname
  1566.         pop hl
  1567.         ld de,filenametext
  1568.         ld bc,12
  1569.         ldir
  1570.  
  1571.         ld de,_COLOR_DIALOG
  1572.         call nv_setcolor       
  1573.  
  1574.         ld hl,winrename
  1575.         ld de,tnewfilename
  1576.         ld c,13
  1577.         call prwindow_edit ;CY=OK
  1578.         ret nc ;cancel
  1579. ;если в имени есть символы :,/,\, то выйти с ошибкой
  1580.         ld hl,tnewfilename
  1581. editcmd_ren_checkname0
  1582.         ld a,(hl)
  1583.         or a
  1584.         jr z,editcmd_ren_checknameq
  1585.         inc hl
  1586.         cp ':'
  1587.         ret z ;error
  1588.         cp '/'
  1589.         ret z ;error
  1590.         cp 0x5c;'\\'
  1591.         ret z ;error
  1592.         jr editcmd_ren_checkname0
  1593. editcmd_ren_checknameq
  1594.         ld de,filenametext
  1595.         ld hl,tnewfilename
  1596.         OS_RENAME
  1597.         ;todo error
  1598.         ret
  1599.  
  1600. editcmd_7 ;mkdir
  1601.         call ifcmdnonempty_typedigit
  1602.         ld hl,editcmd_reprintall
  1603.         push hl
  1604.         call setpaneldir
  1605.  
  1606.  
  1607.         ld de,_COLOR_DIALOG
  1608.         call nv_setcolor
  1609.         xor a
  1610.         ld hl,winmkdir
  1611.         ld de,tnewfilename
  1612.         ld (de),a
  1613.         ld c,13
  1614.         call prwindow_edit ;CY=OK, de=filename
  1615.         ret nc ;cancel
  1616.         OS_MKDIR
  1617.         ;TODO error
  1618.         ret
  1619.  
  1620. editcmd_8 ;del
  1621.         call ifcmdnonempty_typedigit
  1622.         ;ld ix,(curpanel)
  1623.         call getmarkedfiles;countmarkedfiles
  1624.         ld a,h
  1625.         or l
  1626.         jr nz,editcmd_8_0      
  1627.         call getfcbaddrundercursor;hl=fcb
  1628.         call isthisdotdir_hl
  1629.         ret z ;"." or ".."
  1630.         call changemark_hl ;ld (hl),1
  1631. editcmd_8_0  
  1632.         ld de,_COLOR_RED
  1633.         call nv_setcolor
  1634.         ld hl,windel
  1635.         call prwindow_waitkey ;CY=OK
  1636.         jp nc,editcmd_reprintall_noreaddir
  1637.         ld hl,editcmd_reprintall
  1638.         push hl
  1639.         ld hl,windel2
  1640.         call prwindow_text
  1641.         ld hl,proc_del_file
  1642.         ld ix,(curpanel)
  1643.         jp processfiles
  1644.        
  1645. proc_del_file
  1646.         bit 0,(hl)
  1647.  ;marked?
  1648.         ret z
  1649.         call getfcbfromhl
  1650.  
  1651.         ld ix,(curpanel)
  1652.         ld de,PANEL.dir
  1653.         add ix,de
  1654.         push ix
  1655.         pop hl
  1656.         ld de,dir_buf
  1657.         call nv_strcopy_hltode
  1658.  
  1659.         ld hl,proc_del_file_batch
  1660.         ld (nv_batch_proc),hl
  1661.  
  1662. proc_del_file_batch
  1663.         ld de,dir_buf
  1664.         OS_CHDIR
  1665.  
  1666.         ld de,filenametext ;needed for batch
  1667.         ld hl,fcb_filename
  1668.         call cpmname_to_dotname
  1669.  
  1670.         ld de,windel2_file ;dest
  1671.         ld bc,filenametext ;add
  1672.         ld hl,dir_buf ;src
  1673.         call nv_makefilepath_hltode ;result :  de=hl'/'bc
  1674.         ld hl,windel2_file
  1675.         call nv_fillpathspaces_hl ;fill to 64bytes spaces
  1676.         ld hl,windel2
  1677.         call upwindow_text ;update window
  1678.  
  1679.         ld de,filenametext
  1680.         OS_DELETE
  1681.         or a
  1682.         ret z ;if success return
  1683.  
  1684.         ld a,(fcb_attrib)
  1685.         and FATTRIB_DIR
  1686.         push af
  1687.         call nz,nv_copydir_add
  1688.         pop af
  1689.         jp nz,nv_copydir_add ;twice to remove empty dirs
  1690.  
  1691.         ret
  1692.  
  1693. editcmd_5 ;copy
  1694.         call ifcmdnonempty_typedigit
  1695.         ;ld ix,(curpanel)
  1696.         call getmarkedfiles ;countmarkedfiles
  1697.         ld a,h
  1698.         or l
  1699.         jr nz,editcmd_5_0      
  1700.         call getfcbaddrundercursor ;hl=fcb
  1701.         call isthisdotdir_hl
  1702.         ret z ;"." or ".."
  1703.         call changemark_hl ;ld (hl),1
  1704. editcmd_5_0
  1705.  
  1706.         call getanotherpanel_ix
  1707.         ld de,PANEL.dir
  1708.         add ix,de
  1709.         push ix
  1710.         pop hl
  1711.         ld de,dir2_buf
  1712.         call nv_strcopy_hltode
  1713.  
  1714.         ld ix,(curpanel)
  1715.         ld de,PANEL.dir
  1716.         add ix,de
  1717.         push ix
  1718.         pop hl
  1719.         ld de,dir_buf
  1720.         call nv_strcopy_hltode
  1721.  
  1722.         ld de,_COLOR_DIALOG
  1723.         call nv_setcolor
  1724.         ld ix,(curpanel)
  1725.  
  1726.         ld hl,wincopy
  1727.         ld de,dir2_buf
  1728.         ld c,60
  1729.         call prwindow_edit ;CY=OK
  1730.         jp nc,editcmd_reprintall_noreaddir
  1731.  
  1732.         ld hl,editcmd_reprintall
  1733.         push hl ;don't change!
  1734.  
  1735.         ld hl,0
  1736.         ld (filescopied),hl
  1737.        
  1738. ;        ld de,PROGRESBARWINXY
  1739. ;        ld bc,PROGRESBARWINHGTWID
  1740. ;        call prwin
  1741.         ld hl,wincopy2
  1742.         call prwindow_text
  1743.         ld hl,proceditcmd_copy
  1744.         ld ix,(curpanel)
  1745.         jp processfiles
  1746.  
  1747.         if 1==0
  1748. nv_addslashtopath_hl ; out=terminator
  1749.         push hl
  1750.         call skipword_hl
  1751.         dec hl
  1752.         ld a,(hl)
  1753.         cp '/'
  1754.         jr z,nv_addslashtopath_hl0
  1755.         inc hl
  1756.         ld a,'/'
  1757.         ld (hl),a
  1758. nv_addslashtopath_hl0
  1759.         inc hl
  1760.         xor a
  1761.         ld (hl),a
  1762.         pop hl
  1763.         ret
  1764.  
  1765. nv_adddirtopath_detohl ; hl=path de=dirname; out - last component of path
  1766.         push hl
  1767.         call skipword_hl
  1768.         ex hl,de
  1769.         push hl
  1770.         call strlen
  1771.         ld b,h
  1772.         ld c,l
  1773.         pop hl
  1774.         ldir
  1775.         xor a
  1776.         ld (de),a
  1777.         pop hl
  1778.         ret
  1779.         endif
  1780.  
  1781. nv_strcopy_hltode
  1782.         ld a,(hl)
  1783.         ld (de),a
  1784.         inc hl
  1785.         inc de
  1786.         or a
  1787.         ret z
  1788.         jr nv_strcopy_hltode
  1789.  
  1790. nv_addslash_de ;assumed thad DE positioned to the next char after terminator
  1791.         dec de
  1792.         dec de
  1793.         ld a,(de)
  1794.         cp '/'
  1795.         jr z,nv_addslash0
  1796.         inc de
  1797.         ld a,'/'
  1798.         ld (de),a
  1799. nv_addslash0
  1800.         inc de
  1801.         xor a
  1802.         ld (de),a
  1803.         inc de
  1804.         ret
  1805.  
  1806. nv_makefilepath_hltode ;DE=dest HL=src BC=filename
  1807.         call nv_strcopy_hltode
  1808.         call nv_addslash_de
  1809.         dec de
  1810.         ld h,b
  1811.         ld l,c
  1812.         call nv_strcopy_hltode
  1813.         ret
  1814.  
  1815. nv_fillpathspaces_hl
  1816.         ld b,0
  1817. nv_fillpathspaces_hl0
  1818.         ld a,(hl)
  1819.         inc b
  1820.         inc hl
  1821.         or a
  1822.         jr nz,nv_fillpathspaces_hl0
  1823.         dec hl
  1824.         dec b
  1825.         ld c,' '
  1826.         ld a,b
  1827. nv_fillpathspaces_hl1
  1828.         ld (hl),c
  1829.         inc hl
  1830.         inc a
  1831.         cp 64
  1832.         jr c,nv_fillpathspaces_hl1
  1833.         ret
  1834.        
  1835. nv_batch_pushrecord
  1836.         OS_GETMAINPAGES
  1837.         ld a,h
  1838.         ld (savepg),a
  1839.         ld a,(dirpg)
  1840.         SETPG32KLOW
  1841.  
  1842.         ld hl,0x8000
  1843.         ld bc,(dir_batch_pointer)
  1844.         ld de,256
  1845. nv_batch_pushsrecord
  1846.         ld a,b
  1847.         or c
  1848.         jr z,nv_batch_pushsrecordend
  1849.         add hl,de
  1850.         dec bc
  1851.         jr nv_batch_pushsrecord
  1852. nv_batch_pushsrecordend
  1853.         push hl
  1854. ;dir 1
  1855.         ld de,dir_buf
  1856.         ex hl,de
  1857.         ld bc,filenametext
  1858.         call nv_makefilepath_hltode
  1859.         pop hl
  1860.         ld de,128
  1861.         add hl,de
  1862. ;dir2
  1863.         ld de,dir2_buf
  1864.         ex hl,de
  1865.         ld bc,filenametext
  1866.         call nv_makefilepath_hltode
  1867.  
  1868.         ld bc,(dir_batch_pointer)
  1869.         inc bc
  1870.         ld (dir_batch_pointer),bc
  1871.         ld a,(savepg)
  1872.         SETPG32KLOW
  1873.         ret
  1874.  
  1875. nv_batch_poprecord ;z=empty
  1876.         OS_GETMAINPAGES
  1877.         ld a,h
  1878.         ld (savepg),a
  1879.         ld a,(dirpg)
  1880.         SETPG32KLOW
  1881.  
  1882.         ld hl,0x8000
  1883.         ld bc,(dir_batch_pointer)
  1884.         ld a,b
  1885.         or c
  1886.         jr z,nv_batch_popsrecordq ;empty :(
  1887.         dec bc
  1888.         ld de,256
  1889. nv_batch_popsrecord
  1890.         ld a,b
  1891.         or c
  1892.         jr z,nv_batch_popsrecordend
  1893.         add hl,de
  1894.         dec bc
  1895.         jr nv_batch_popsrecord
  1896. nv_batch_popsrecordend
  1897.         ld de,dir_buf
  1898.         ld bc,128
  1899.         ldir
  1900.         ld de,dir2_buf
  1901.         ld bc,128
  1902.         ldir
  1903.         ld bc,(dir_batch_pointer)
  1904.         dec bc
  1905.         ld (dir_batch_pointer),bc
  1906.         ld a,1
  1907.         or a
  1908. nv_batch_popsrecordq
  1909.         ld a,(savepg)
  1910.         SETPG32KLOW
  1911.         ret
  1912.  
  1913. nv_copydir_add
  1914.         call nv_batch_pushrecord
  1915.         ret
  1916.  
  1917. nv_batch
  1918.         call nv_batch_poprecord
  1919.         ret z;empty
  1920. nv_label
  1921.         or a
  1922.         ld hl,(processfiles_proc)
  1923.         ld de,proceditcmd_copy
  1924.         sbc hl,de
  1925.         jr nz,nv_batch_nocopydir ;if it's not copy
  1926.  
  1927.         ld de,dir2_buf
  1928.         OS_MKDIR
  1929.         ld de,dir2_buf
  1930.         OS_CHDIR ;de
  1931.         or a
  1932.         jr nz,nv_batch ;can't open dest dir
  1933. nv_batch_nocopydir
  1934.         ld de,dir_buf
  1935.         OS_CHDIR ;;
  1936.         or a
  1937.         jr nz,nv_batch ;can't open src dir
  1938.  
  1939.         ld de,fcb
  1940.         OS_SETDTA
  1941.         ld de,fcbmask
  1942.         OS_FSEARCHFIRST
  1943.         or a
  1944.         jr nz,nv_batch
  1945.         ld de,fcb
  1946.         OS_SETDTA
  1947.         ld de,fcbmask
  1948.         OS_FSEARCHNEXT
  1949.         or a
  1950.         jr nz,nv_batch ;skip . and ..
  1951. nv_batch1
  1952.         ld de,fcb
  1953.         OS_SETDTA
  1954.         ld de,fcbmask
  1955.         OS_FSEARCHNEXT
  1956.         or a
  1957.         jr nz,nv_batch_nofiles
  1958. nv_batch_proc=$+1
  1959.         call 0
  1960.         jr nv_batch1
  1961. nv_batch_nofiles
  1962.         or a
  1963.         ld hl,(processfiles_proc)
  1964.         ld de,proc_del_file
  1965.         sbc hl,de
  1966.         jr nz,nv_batch ;if not del
  1967.         ld a,'/'
  1968.         ld (dir2_buf),a
  1969.         xor a
  1970.         ld (dir2_buf+1),a
  1971.         ld de,dir2_buf
  1972.         OS_CHDIR
  1973.         ld de,dir_buf
  1974.         OS_DELETE
  1975.         jp nv_batch
  1976.  
  1977. skipword_hl
  1978.         ld a,(hl)
  1979.         or a
  1980.         ret z
  1981.         cp ' '
  1982.         ret z
  1983.         inc hl
  1984.         jr skipword_hl
  1985.  
  1986. proceditcmd_copy
  1987.         bit 0,(hl)
  1988.         ret z
  1989.         call getfcbfromhl
  1990.  
  1991.         ld hl,proceditcmd_copy_fcb
  1992.         ld (nv_batch_proc),hl
  1993.  
  1994. proceditcmd_copy_fcb
  1995.         ld hl,proceditcmd_copy_q
  1996.         push hl
  1997.         ld de,dir_buf
  1998.         OS_CHDIR
  1999.  
  2000.         ld de,filenametext ;wordbuf ;de=drive/path/file
  2001.         ld hl,fcb_filename
  2002.         call cpmname_to_dotname
  2003.  
  2004.         ld a,(fcb_attrib)
  2005.         and FATTRIB_DIR
  2006.         jp nz,nv_copydir_add
  2007.  
  2008.         ld de,wincopy_src ;update copy window
  2009.         ld bc,filenametext
  2010.         ld hl,dir_buf
  2011.         call nv_makefilepath_hltode
  2012.         ld hl,wincopy_src
  2013.         call nv_fillpathspaces_hl
  2014.         ld de,wincopy_dest
  2015.         ld bc,filenametext
  2016.         ld hl,dir2_buf
  2017.         call nv_makefilepath_hltode
  2018.         ld hl,wincopy_dest
  2019.         call nv_fillpathspaces_hl
  2020.         ld hl,wincopy2
  2021.         call upwindow_text
  2022.  
  2023.         ld de,filenametext
  2024.         OS_OPENHANDLE
  2025.         or a
  2026.         ret nz ;jp nz,cmd_error_wrongfile
  2027.         ld a,b
  2028.         ld (cmd_copy_close_file1_handle),a
  2029.         ld hl,cmd_copy_close_file1
  2030.         push hl
  2031.  
  2032.         ld de,filenametext
  2033.         OS_GETFILETIME ;ix=date, hl=time
  2034.         ld (proceditcmd_copy_time),hl
  2035.         ld (proceditcmd_copy_date),ix
  2036.  
  2037.         ld de,dir2_buf
  2038.         OS_CHDIR
  2039.        
  2040.         ld de,filenametext;swordbuf2 ;de=drive/path/file
  2041.         OS_CREATEHANDLE
  2042.         or a
  2043.         ret nz ;jp nz,cmd_error_cant_copy
  2044.         ld a,b
  2045.         ld (cmd_copy_close_file2_handle),a
  2046.         ld hl,cmd_copy_close_file2
  2047.         push hl
  2048. cmd_copy0
  2049.         ld hl,copybuf_sz
  2050.         ld de,copybuf
  2051.         ld a,(cmd_copy_close_file1_handle)
  2052.         ld b,a
  2053. ;B = file handle, DE = Buffer address, HL = Number of bytes to read
  2054.         push de
  2055.         OS_READHANDLE
  2056. ;HL = Number of bytes actually read, A=error
  2057.         pop de
  2058.         ld a,h
  2059.         or l
  2060.         ret z ;0 bytes remain
  2061.         ld a,(cmd_copy_close_file2_handle)
  2062.         ld b,a
  2063. ;B = file handle, DE = Buffer address, HL = Number of bytes to write
  2064.         OS_WRITEHANDLE
  2065.         jr cmd_copy0
  2066.        
  2067. cmd_copy_close_file1
  2068. cmd_copy_close_file1_handle=$+1
  2069.         ld b,0
  2070.         OS_CLOSEHANDLE
  2071.         ret
  2072.        
  2073. cmd_copy_close_file2
  2074. cmd_copy_close_file2_handle=$+1
  2075.         ld b,0
  2076.         OS_CLOSEHANDLE
  2077. proceditcmd_copy_time=$+1
  2078.         ld hl,0
  2079. proceditcmd_copy_date=$+2
  2080.         ld ix,0
  2081.         ld de,filenametext
  2082.         OS_SETFILETIME
  2083.         ret
  2084.        
  2085. proceditcmd_copy_q
  2086. filescopied=$+1
  2087.         ld hl,0
  2088.          if 1==0
  2089.         inc hl
  2090.         ld (filescopied),hl
  2091.         ;ld bc,32
  2092.         ;ex de,hl ;ld de,(percentcopyfile)
  2093.         ;call mulbcde_ahl
  2094.         add hl,hl
  2095.         add hl,hl
  2096.         add hl,hl
  2097.         add hl,hl
  2098.         add hl,hl
  2099.         push hl
  2100.         ld ix,(curpanel)
  2101. ;ix = panel
  2102.         call getmarkedfiles ;out: hl'hl = files
  2103.         ex de,hl ;de=files
  2104.         pop hl ;filescopied*32
  2105.         call divhlde
  2106.         ld a,l
  2107.         or a
  2108.         ret z
  2109.         ld b,a
  2110.         ld de,PROGRESBARWINXY+#0102
  2111. proceditcmd_copy_q_progress0      
  2112.         push de
  2113.         push bc
  2114.         SETXY_
  2115.         ;ld e,#ff
  2116.         ;OS_PRATTR
  2117.         ld a,'*'
  2118.         PRCHAR_
  2119.         pop bc
  2120.         pop de
  2121.         inc e
  2122.         djnz proceditcmd_copy_q_progress0
  2123.          endif
  2124.         ret
  2125.        
  2126. mulbcde_ahl
  2127. ;bc * de результат в ahl
  2128.         xor a
  2129.         ld h,a
  2130.         ld l,a
  2131.         dup 8
  2132.         rlc b
  2133.         jr nc,$+5 ; c - был перенос, nc - не было переноса    
  2134.         add hl,de
  2135.         adc a,0
  2136.         add hl,hl
  2137.         rla
  2138.         edup
  2139.         dup 7
  2140.         rlc c
  2141.         jr nc,$+5 ; c - был перенос, nc - не было переноса    
  2142.         add hl,de
  2143.         adc a,0
  2144.         add hl,hl
  2145.         rla
  2146.         edup
  2147.         rlc c
  2148.         ret nc
  2149.         add hl,de
  2150.         adc a,0
  2151.         ret
  2152.        
  2153. ;hl / de результат в hl
  2154. divhlde
  2155.         ld c,h
  2156.         ld a,l
  2157.         ld hl,0
  2158.         ld b,16
  2159. ;don't mind carry
  2160. _DIV0.
  2161. ;shift left hlca
  2162.         rla
  2163.         rl c
  2164.         adc hl,hl
  2165. ;no carry
  2166. ;try sub
  2167.         sbc hl,de
  2168.         jr nc,$+3
  2169.         add hl,de
  2170. ;carry = inverted bit of result
  2171.         djnz _DIV0.
  2172.         rla
  2173.         cpl
  2174.         ld l,a
  2175.         ld a,c
  2176.         rla
  2177.         cpl
  2178.         ld h,a
  2179.         ret
  2180.        
  2181. editcmd_0
  2182.         call ifcmdnonempty_typedigit
  2183. editcmd_quit
  2184.         ld de,_COLOR_RED
  2185.         call nv_setcolor
  2186.         ld hl,winquit
  2187.         call prwindow_waitkey ;CY=OK
  2188.         jp nc,editcmd_reprintall
  2189.         QUIT
  2190.  
  2191. ifcmdnonempty_typedigit
  2192. ;keeps ix
  2193.         ld c,a
  2194.         ld a,(cmdbuf)
  2195.         or a
  2196.         ld a,c
  2197.         ret z ;cmd is empty
  2198.          pop bc ;skip return to editcmdN
  2199.         jp editcmd_typein
  2200.  
  2201. windrv
  2202.         dw 0x0003 ;de=yx
  2203.         dw 256*(3+15)+28 ;0x0809 ;bc=hgt,wid
  2204.         db "Drive",0
  2205.         db 3 ;next line
  2206.         db "  A: - 1st Floppy",0,3
  2207.         db "  B: - 2nd Floppy",0,3
  2208.         db "  C: - 3rd Floppy",0,3
  2209.         db "  D: - 4th Floppy",0,3
  2210.         db "  E: - IDE Master p.1",0,3
  2211.         db "  F: - IDE Master p.2",0,3
  2212.         db "  G: - IDE Master p.3",0,3
  2213.         db "  H: - IDE Master p.4",0,3
  2214.         db "  I: - IDE Slave p.1",0,3
  2215.         db "  J: - IDE Slave p.2",0,3
  2216.         db "  K: - IDE Slave p.3",0,3
  2217.         db "  L: - IDE Slave p.4",0,3
  2218.         db "  M: - SD Z-controller",0,3
  2219.         db "  N: - SD NeoGS",0,3
  2220.         db "  O: - USB flash zx-net",0,3
  2221.         db 0 ;end of window
  2222.        
  2223. winmkdir
  2224.         dw 0x0a0f ;de=yx
  2225.         dw 0x0520 ;bc=hgt,wid
  2226.         db "Create new directory:",0
  2227.         db 3 ;next line
  2228.         db 2 ;print outer text
  2229.         dw tnewfilename
  2230.         db 0 ;end of window
  2231.  
  2232. winrename
  2233.         dw 0x0a0f ;de=yx
  2234.         dw 0x0520 ;bc=hgt,wid
  2235.         db "Rename file:",0
  2236.         db 3 ;next line
  2237.         db 2 ;print outer text
  2238.         dw tnewfilename
  2239.         db 0 ;end of window
  2240.  
  2241. wincopy
  2242.         dw 0x0a08 ;de=yx
  2243.         dw 0x0540 ;bc=hgt,wid
  2244.         db "Copy ",0
  2245.         db 1
  2246.         db " file(s)/dir(s) to:",0
  2247.         db 3 ;next line
  2248.         db 2 ;print outer text
  2249.         dw dir2_buf
  2250.         db 0 ;end of window
  2251.        
  2252.  
  2253. tnewfilename
  2254.         ds 12
  2255.         db 0
  2256. tnewfilename_sz=12
  2257.  
  2258. winquit
  2259.         dw 0x0a1f ;de=yx
  2260.         dw 0x0515 ;bc=hgt,wid
  2261.         db 3 ;next line
  2262.         db "Quit Nedovigator?",0
  2263.         db 0 ;end of window
  2264.  
  2265. windel
  2266.         dw 0x0919 ;de=yx
  2267.         dw 0x051f ;bc=hgt,wid
  2268.         db 3 ;next line
  2269.         db "Delete ",0
  2270.         db 1 ;nfiles
  2271.         db " file(s)?",0
  2272.         db 0 ;end of window
  2273.  
  2274. wincopy2
  2275.         dw 0x0706 ;de=yx
  2276.         db 68,8 ;bc=wid,hgt
  2277.         db 3 ;next line
  2278.         db " Copying",0,3
  2279. wincopy_src
  2280.         db "                                                                ",0,3
  2281.         db " to",0,3
  2282. wincopy_dest
  2283.         db "                                                                ",0
  2284.         db 0 ;end of window
  2285.  
  2286. windel2
  2287.         dw 0x0706 ;de=yx
  2288.         db 68,6 ;bc=wid,hgt
  2289.         db " Deleting",0,3
  2290.         db 3 ;next line
  2291. windel2_file
  2292.         db "                                                                ",0
  2293.         db 0 ;end of window
  2294.  
  2295. windrverr
  2296.         dw 0x040f ;de=yx
  2297.         dw 0x0510 ;bc=hgt,wid
  2298.         db 3 ;next line
  2299.         db "Drive error!",0
  2300.         db 0 ;end of window
  2301.  
  2302.  
  2303. tdotdot
  2304.         dw "..",0
  2305.  
  2306.  
  2307.         STRUCT PANEL
  2308. ;sorterjp       BYTE ;TODO remove
  2309. ;sorter         WORD ;TODO remove
  2310. xy              WORD
  2311. ;pg             BYTE ;TODO remove
  2312. pgadd           BYTE ;0/DIRPAGES
  2313. catbuf          WORD ;TODO remove
  2314. poipg           BYTE
  2315. pointers        WORD ;TODO remove
  2316. totalsize       DWORD
  2317. files           WORD ;visible files
  2318. filesdirs       WORD ;files+dirs (no ".", "..")
  2319. markedfiles     WORD
  2320. markedsize      DWORD
  2321. dirpos          WORD
  2322. dirscroll       WORD
  2323. dirviewmode     BYTE
  2324. dirsortproc     WORD
  2325. dirsortmode     BYTE
  2326. dir             BLOCK MAXPATH_sz
  2327.         ENDS
  2328. ;PANEL_sz=13+MAXPATH_sz
  2329.  
  2330. leftpanel PANEL
  2331. rightpanel PANEL
  2332.  
  2333. ;oldtimer
  2334. ;        dw 0
  2335.        
  2336. ;<0x4000 for hobeta
  2337. fcb
  2338.         ds FCB_sz
  2339. fcb_filename=fcb+FCB_FNAME        
  2340. fcb_attrib=fcb+FCB_FATTRIB
  2341.  
  2342. fcbmask
  2343.         db 0
  2344.         db "???????????"
  2345.         ds FCB_sz-11-1
  2346. fcbmask_filename=fcbmask+FCB_FNAME        
  2347.  
  2348. fcb2
  2349.         ds FCB_sz
  2350. fcb2_filename=fcb2+FCB_FNAME        
  2351.  
  2352. cmd_filename
  2353.         db "cmd     com"
  2354. ext_filename
  2355.         db "nv      ext"
  2356. texted_filename
  2357.         db "texted  com"
  2358.  
  2359. filenametext ;for change dir, rename
  2360.         db "prince  .   ",0 ;ds 64
  2361.  
  2362. ext
  2363.         ds 3 ;TODO объединить с filenametext
  2364.        
  2365. copybuf=0x4000 ;нельзя 0xc000 - поверх какой-нибудь директории (а она используется при копировании) ;0x8000 можно только после выставления страницы там
  2366.         ;ds 4096;128
  2367. copybuf_sz=0x4000 ;$-copybuf
  2368.  
  2369.         align 256
  2370. file_buf
  2371. dir_buf
  2372.         ds 128
  2373. file_buf_end=$-1
  2374. dir2_buf
  2375.         ds 128
  2376. dir_batch_pointer db 0,0
  2377. savepg db 0,0
  2378. dirpg db 0,0
  2379. ;nvcolor ds 2
  2380.  
  2381. washobetarunner
  2382. ;pgsys=pagexor-10
  2383. ;pgfatfs=pagexor-9
  2384. ;pgtrdosfs=pagexor-8
  2385. ;pgkillable=pagexor-4 ;в 128K памяти, т.к. можно портить
  2386.         disp hobetarunner ;in pgkillable
  2387. ;$c loaded in pages 4,1,0
  2388. ;only ATM2 ports here!
  2389.         di
  2390.         ld a,0x7f-5
  2391.         ld bc,0xbff7
  2392.         out (c),a ;4,5,0
  2393.         ld a,0x7f-4
  2394.         ld bc,0xfff7
  2395.         out (c),a ;4,5,4
  2396.         ld hl,0xc000
  2397.         ld de,0x8000
  2398.         ld bc,0x4000
  2399.         ldir ;pg4 -> pg5
  2400.         ld a,0x7f-8;pgtrdosfs ;нельзя TOPDOWNMEM!!!
  2401.         ld bc,0xfff7
  2402.         out (c),a ;4,5,8
  2403.         ld hl,0x1c00+0xc000
  2404.         ld de,0x1c00+0x8000
  2405.         ld bc,0x400
  2406.         ldir ;restore sysvars
  2407.         ld a,0x7f-2
  2408.         ld bc,0xbff7
  2409.         out (c),a
  2410.         ld a,0x7f-1
  2411.         ld bc,0xfff7
  2412.         out (c),a
  2413.         ld hl,0xc000
  2414.         ld de,0x8000
  2415.         ld bc,0x4000
  2416.         ldir ;pg1 -> pg2
  2417.         ld a,0x7f-0+0x80
  2418.         ld bc,0xfff7
  2419.         out (c),a
  2420.         ld a,0x00
  2421.         ld bc,0x7ffd
  2422.         out (c),a
  2423.         ld a,0x81 ;128 basic (with 7ffd)
  2424.         ld bc,0x3ff7
  2425.         out (c),a
  2426.         ld a,0x7f-5
  2427.         ld bc,0x7ff7
  2428.         out (c),a
  2429. ;128: pages DOS,5,2,0(7ffd)
  2430.         ld a,0x10
  2431.         ld bc,0x7ffd
  2432.         out (c),a
  2433. ;48: pages 2,4,4,4
  2434.         ld a,0x7f-5
  2435.         ld bc,0x7ff7
  2436.         out (c),a
  2437.         ld a,0x7f-2
  2438.         ld bc,0xbff7
  2439.         out (c),a
  2440.         ld a,0x7f-0+0x80
  2441.         ld bc,0xfff7
  2442.         out (c),a
  2443.         ld a,0x83 ;48 basic switchable to DOS
  2444.         ld bc,0x3ff7
  2445.         out (c),a
  2446. ;48: pages DOS,5,2,0(7ffd)
  2447.        
  2448.         LD A,0b10101011 ;6912
  2449.         ld bc,0xff77 ;shadow ports off, palette off
  2450.         out (c),a
  2451.         ld sp,0x6000
  2452.          ;jr $
  2453.         ei
  2454. hobetarunner_jp=$+1
  2455.         jp 0x6000
  2456.         ent
  2457. hobetarunner_sz=$-washobetarunner
  2458.  
  2459. wordfiles
  2460.         db " files",0
  2461. wordbytes
  2462.         db " bytes ",0
  2463.  
  2464. ;HS_elpg ;2 pages
  2465. ;        ds 2
  2466.         align 256
  2467. HS_strpg
  2468.         ds DIRPAGES*2+2 ;по 1 байту на маркеры "0"
  2469.        
  2470.         include "nvsort.asm"
  2471.         include "heapsort.asm"
  2472.  
  2473.         include "nvjptbl.asm"
  2474.         include "nvunit.asm"
  2475.         include "nveditln.asm"
  2476.         include "nvview.asm"
  2477.         include "nvhexed.asm"
  2478.  
  2479.         include "prdword.asm"
  2480.         include "../_sdk/loadpage.asm"
  2481.         include "cmdpr.asm"
  2482.         include "../_sdk/stdio.asm"
  2483.        
  2484. cmd_end
  2485.  
  2486.         display "nv size ",/d,cmd_end-cmd_begin," bytes"
  2487.  
  2488.         savebin "nv.com",cmd_begin,cmd_end-cmd_begin
  2489.        
  2490.         LABELSLIST "..\..\us\user.l"
  2491.