Subversion Repositories NedoOS

Rev

Rev 86 | Rev 111 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download

  1.         DEVICE ZXSPECTRUM128
  2.         include "../_sdk/sys_h.asm"
  3.  
  4. HEAPSORT_LH=1 ;byte order in poiters: LSB,HSB
  5.        
  6. 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. COLOR=7
  14. PANELCOLOR=0x4f;0xf
  15. PANELSELECTCOLOR=0x17
  16. CURSORCOLOR=0x38
  17. FILECURSORCOLOR=0x38
  18. COLOR_RED=0x17
  19.  
  20. PROGRESBARWINXY=0x0e16 ;0x0919 + 051f ;de=yx
  21. PROGRESBARWINHGTWID=0x0324 ;0x051f ;bc=hgt,wid
  22.  
  23.  
  24. CONST_HGT_TABLE=21
  25.  
  26. ;8192fcbs*32bytes*2panels = 32 pages
  27. DIRPAGES=16
  28.  
  29. catbuf_left=0xc000
  30. catbuf_right=0xc000
  31. FILES_POINTERS_left=0xc000;0x3700
  32. FILES_POINTERS_right=0xc000;0x3b00
  33. left_panel_xy=0x0000
  34. right_panel_xy=0x0028
  35. firstfiley=left_panel_xy/256 + 1
  36.  
  37.         macro PGW2elpg0
  38.         ;LD A,(HS_elpg)
  39.         ld a,(ix+PANEL.poipg)
  40.         SETPG32KLOW
  41.         endm
  42.        
  43.         macro PGW2elpg
  44.                 ;LD      A,H
  45.                 ;RLCA
  46.                 ;RLCA
  47.                 ;AND     1
  48.         ;LD A,(HS_elpg)
  49.         ;jr z,$+5
  50.         ;LD A,(HS_elpg+1)
  51.         ld a,(ix+PANEL.poipg)
  52.         SETPG32KLOW
  53.         endm
  54.  
  55.         macro PGW2strpg
  56.         ld ($+4),a
  57.         LD A,(HS_strpg)
  58.         SETPG32KLOW
  59.         endm
  60.  
  61.         macro PGW3elpg
  62.                 ;LD      A,H
  63.                 ;RLCA
  64.                 ;RLCA
  65.                 ;AND     1
  66.         ;LD A,(HS_elpg)
  67.         ;jr z,$+5
  68.         ;LD A,(HS_elpg+1)
  69.         ld a,(ix+PANEL.poipg)
  70.         SETPG32KHIGH
  71.         endm
  72.  
  73.         macro PGW3strpg
  74.         ld ($+4),a
  75.         LD A,(HS_strpg)
  76.         SETPG32KHIGH
  77.         endm
  78.  
  79.         org PROGSTART
  80. cmd_begin
  81.         ld sp,0x4000
  82.  
  83.         ld e,6 ;textmode
  84.         OS_SETGFX
  85.        
  86.         GET_KEY ;ё·хфрхь key_redraw
  87.        
  88.         ld e,COLOR
  89.         OS_CLS
  90.        
  91.         ld de,nvpal
  92.         OS_SETPAL
  93.        
  94.         OS_GETSCREENPAGES
  95. ;de=pages of screen 0 (d=higher page), hl=pages of screen 1 (h=higher page)
  96.         ld a,e
  97.         ld (cmdpgscreen0_0),a
  98.  
  99.         OS_GETMAINPAGES
  100. ;dehl=эюьхЁр ёЄЁрэшЎ т 0000,4000(copybuf),8000,c000
  101.         push hl
  102.         ld e,h
  103.         OS_DELPAGE
  104.         pop hl
  105.         ld e,l
  106.         OS_DELPAGE
  107.  
  108.         ;OS_NEWPAGE
  109.         ;ld a,e
  110.         ;ld (HS_elpg),a
  111.         ;OS_NEWPAGE
  112.         ;ld a,e
  113.         ;ld (HS_elpg+1),a
  114.  
  115.         ld hl,HS_strpg
  116.         ld b,DIRPAGES*2 ;TODO чрърч√трЄ№ яЁш ўЄхэшш фшЁхъЄюЁшш
  117. initstrpgs0
  118.         push bc
  119.         push hl
  120.         OS_NEWPAGE
  121.         pop hl
  122.         ld (hl),e
  123.         inc hl
  124.         pop bc
  125.         djnz initstrpgs0
  126.        
  127.         ld hl,left_panel_xy
  128.         ld (leftpanel+PANEL.xy),hl
  129.         ;OS_NEWPAGE
  130.         ;ld a,e
  131.         ;ld (leftpanel+PANEL.pg),a ;TODO remove
  132.         OS_NEWPAGE
  133.         ld a,e
  134.         ld (leftpanel+PANEL.poipg),a
  135.         ld hl,FILES_POINTERS_left
  136.         ld (leftpanel+PANEL.pointers),hl
  137.         ld hl,catbuf_left
  138.         ld (leftpanel+PANEL.catbuf),hl
  139.         xor a
  140.         ld (leftpanel+PANEL.pgadd),a
  141.  
  142.         ld hl,right_panel_xy
  143.         ld (rightpanel+PANEL.xy),hl
  144.         ;OS_NEWPAGE
  145.         ;ld a,e
  146.         ;ld (rightpanel+PANEL.pg),a ;TODO remove
  147.         OS_NEWPAGE
  148.         ld a,e
  149.         ld (rightpanel+PANEL.poipg),a
  150.         ld hl,FILES_POINTERS_right
  151.         ld (rightpanel+PANEL.pointers),hl
  152.         ld hl,catbuf_right
  153.         ld (rightpanel+PANEL.catbuf),hl
  154.         ld a,DIRPAGES
  155.         ld (leftpanel+PANEL.pgadd),a
  156.  
  157.         ld hl,compareext
  158.         ld (leftpanel+PANEL.dirsortproc),hl
  159.         ld (rightpanel+PANEL.dirsortproc),hl
  160.  
  161.         ;ld a,0xc3
  162.         ;ld (leftpanel+PANEL.sorterjp),a
  163.         ;ld (rightpanel+PANEL.sorterjp),a
  164.         ;ld hl,sorter1
  165.         ;ld (leftpanel+PANEL.sorter),hl
  166.         ;ld hl,sorter2
  167.         ;ld (rightpanel+PANEL.sorter),hl
  168.        
  169.         ld hl,rightpanel
  170.         call editcmd_setpaneldirfromcurdir_panelhl
  171.         ld hl,leftpanel
  172.         call editcmd_setpaneldirfromcurdir_panelhl
  173.  
  174.         ;ld e,0
  175.         ;OS_SETDRV
  176. ;l=NVOLUMES
  177.        
  178.         call readpanels_reprint
  179.        
  180. mainloop
  181.         call editcmd_readprompt_setendcmdx
  182.         call controlloop
  183.         jp mainloop
  184.  
  185. nvpal
  186.         dw 0xf3f3,0x1313,0xf1f1,0xf0f0,0xe3e3,0xe2e2,0xe1e1,0xe0e0 ;NB color 1
  187.         dw 0xf3f3,0xd2d2,0xb1b1,0x9090,0x6363,0x4242,0x2121,0x0000
  188.        
  189. printhint
  190.         ld de,24*256
  191.         call nv_setxy
  192.         ld hl,thint
  193. prhint0
  194.         ld a,(hl)
  195.         inc hl
  196.         or a
  197.         ret z
  198.         cp '{'
  199.         jr z,prhint_color0
  200.         cp '}'
  201.         jr z,prhint_color1
  202.         push hl
  203.         PRCHAR ;testing (351/352t) (was 986/987t)
  204.         pop hl
  205.         jr prhint0
  206. prhint_color0
  207.         ld e,7
  208.         jr prhint_color
  209. prhint_color1
  210.         ld e,5*8
  211. prhint_color
  212.         call nv_setcolor
  213.         jr prhint0
  214. thint
  215.         db "{1}LeftDrv { 2}RightDrv { 3}View { 4}Edit { 5}Copy { 6}Rename { 7}MkDir { 8}Del  { 9}     { 0}     ",0
  216.        
  217. readpanels_reprint
  218.         ld e,COLOR
  219.         OS_CLS
  220.         call printhint
  221.         ld ix,leftpanel
  222.         call readsortdrawpanel
  223.         ld ix,rightpanel
  224. readsortdrawpanel
  225.         call readdir
  226.         call sortfiles
  227.         jp drawpanel_with_files
  228.  
  229. readpanels_reprint_keepcursor
  230.         ld e,COLOR
  231.         OS_CLS
  232.         call printhint
  233.         ld ix,leftpanel
  234.         call readsortdrawpanel_keepcursor
  235.         ld ix,rightpanel
  236. readsortdrawpanel_keepcursor
  237.         call readdir_keepcursor
  238.         call sortfiles
  239.         jp drawpanel_with_files
  240.  
  241.        
  242. drawpanel_with_files
  243. ;ix=panel
  244.         call setpanelcolor
  245.         call nv_getpanelxy_de
  246.         call prtable ;keeps ix
  247.         call setpaneldir_makeprompt ;keeps ix
  248.         ld e,7
  249.         call nv_setcolor
  250.         call nv_getpanelxy_de
  251.         inc e
  252.         inc e
  253.         call nv_setxy
  254.         push ix
  255.         pop hl
  256.         ld de,PANEL.dir
  257.         add hl,de
  258.         ld c,0
  259.         call panelprtext
  260.  
  261.         call drawpanelfilesandsize
  262.        
  263. drawpanel_files
  264. ;ix=panel
  265.         ;ld a,(ix+PANEL.pg)
  266.         ;SETPG32KHIGH
  267.  
  268.         call setpanelcolor
  269.         ld l,(ix+PANEL.files)
  270.         ld h,(ix+PANEL.files+1)
  271.         call nv_getdirscroll_bc
  272.         push bc ;dirscroll
  273.         or a
  274.         sbc hl,bc ;hl=number of files in panel - scroll in panel
  275.         ld bc,CONST_HGT_TABLE
  276.         call minhl_bc_tobc ;bc = min(CONST_HGT_TABLE, number of files in panel - scroll in panel)
  277.         pop de ;dirscroll
  278.         ;ld l,(ix+PANEL.pointers)
  279.         ;ld h,(ix+PANEL.pointers+1)
  280.         ;add hl,de
  281.         ;add hl,de
  282.         call gotofilepointer_numberde
  283.  
  284.         call nv_getpanelxy_de
  285.         inc d
  286.         inc e
  287.         ld b,c ;files to show
  288.  
  289.         ld a,b
  290.         or a
  291.         ret z
  292. prNfiles       
  293.         push bc
  294.         push de
  295.         call nv_setxy ;keeps de,hl
  296.         ;ld e,(hl)
  297.         ;inc hl
  298.         ;ld d,(hl)
  299.         ;inc hl
  300.         call getfilepointer_de_fromhl
  301.         push hl
  302.         ex de,hl
  303.         push ix
  304.         call prdirfile
  305.         pop ix
  306.         pop hl
  307.         pop de 
  308.         pop bc
  309.         inc d
  310.         djnz prNfiles
  311.         ret    
  312.  
  313. prdirfile
  314. ;hl=fcb
  315.         ld a,(hl) ;mark
  316.         and 1
  317.         ld e,PANELCOLOR
  318.         jr z,$+4
  319.         ld e,PANELSELECTCOLOR
  320.         push hl
  321.         call nv_setcolor
  322.         pop hl
  323.         push hl
  324.         inc hl
  325.         ld b,8
  326.         call cmdprNchars
  327.         pop ix
  328.         push ix
  329.         ld a,(ix+FCB_FATTRIB)
  330.         and FATTRIB_DIR
  331.         xor '.'
  332.         call cmdprchar
  333.         ld b,3
  334.         call cmdprNchars
  335.         ld a,'│'
  336.         PRCHAR
  337.         pop ix
  338.         ld l,(ix+FCB_FSIZE+2)
  339.         ld h,(ix+FCB_FSIZE+3)
  340.         exx
  341.         ld l,(ix+FCB_FSIZE)
  342.         ld h,(ix+FCB_FSIZE+1)
  343.         push ix
  344.         call prdword
  345.         ld a,'│'
  346.         PRCHAR
  347.         pop ix
  348.         ld l,(ix+FCB_FDATE)
  349.         ld h,(ix+FCB_FDATE+1)
  350.         push ix
  351.         push hl
  352.         ld a,h
  353.         srl a
  354.         sub 20
  355.         jr nc,$+4
  356.         add a,100 ;XX century
  357.         call prNNcmd ;year
  358.         ld a,'-'       
  359.         PRCHAR
  360.         pop hl
  361.         ld a,l
  362.         push af
  363.         add hl,hl
  364.         add hl,hl
  365.         add hl,hl
  366.         ld a,h
  367.         and #0f
  368.         call prNNcmd ;month
  369.         ld a,'-'
  370.         PRCHAR
  371.         pop af
  372.         and #1f
  373.         call prNNcmd ;day
  374.         ld a,' '
  375.         PRCHAR
  376.         pop ix
  377.         ld l,(ix+FCB_FTIME)
  378.         ld h,(ix+FCB_FTIME+1)
  379.         push hl
  380.         ld a,h
  381.         rra
  382.         rra
  383.         rra
  384.         and #1f
  385.         call prNNcmd ;hour
  386.         ld a,':'
  387.         PRCHAR
  388.         pop hl
  389.         add hl,hl
  390.         add hl,hl
  391.         add hl,hl
  392.         ld a,h
  393.         and #3f
  394.         jp prNNcmd ;minute
  395.  
  396. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  397.  
  398. readdir
  399. ;ix=panel
  400.         call readdir_keepcursor
  401. nv_setcursor_zero
  402.         ld bc,0
  403.         call nv_setdirscroll_bc
  404.         jp nv_setdirpos_zero
  405.  
  406. readdir_keepcursor
  407. ;ix=panel
  408.         xor a
  409.         ld (ix+PANEL.totalsize),a
  410.         ld (ix+PANEL.totalsize+1),a
  411.         ld (ix+PANEL.totalsize+2),a
  412.         ld (ix+PANEL.totalsize+3),a
  413.         ld (ix+PANEL.markedsize),a
  414.         ld (ix+PANEL.markedsize+1),a
  415.         ld (ix+PANEL.markedsize+2),a
  416.         ld (ix+PANEL.markedsize+3),a
  417.         ld (ix+PANEL.markedfiles),a
  418.         ld (ix+PANEL.markedfiles+1),a
  419.  
  420.         ;ld a,(ix+PANEL.pg)
  421.         ;SETPG32KHIGH
  422.        
  423.         push ix
  424.         call setpaneldir
  425.         ld de,fcb
  426.         OS_SETDTA ;set disk transfer address = de
  427.         ;call makeemptymask
  428.         ld de,fcbmask
  429.         OS_FSEARCHFIRST
  430.         pop ix
  431.         or a
  432.  
  433.         ld e,(ix+PANEL.catbuf)
  434.         ld d,(ix+PANEL.catbuf+1)
  435.         ld l,(ix+PANEL.pointers)
  436.         ld h,(ix+PANEL.pointers+1)
  437.         ld bc,0 ;nfiles
  438.         jr nz,loaddir_error
  439. loaddir0
  440.         push bc
  441.  
  442.         push de
  443.         push hl
  444.         ;ld a,(ix+PANEL.pg) ;TODO ьхэ Є№
  445.         ;SETPG32KHIGH
  446.         ld a,e
  447.         and 31
  448.         add a,(ix+PANEL.pgadd)
  449.         PGW3strpg
  450.         ld a,e
  451.         and 0xe0
  452.         ld e,a
  453.         xor a
  454.         ld (de),a ;mark
  455.         inc de
  456.         ld hl,fcb+1
  457.         ld bc,31;FCB_sz
  458.         ldir
  459.         pop hl
  460.         pop de
  461.         call putfilepointer_de_tohl
  462.         ex de,hl
  463.         ld bc,32
  464.         add hl,bc
  465.         ex hl,de
  466.          jr nc,$+3
  467.          inc de ;next page
  468.          set 7,d
  469.          set 6,d
  470.  
  471.         ;TODO ўхЁхч яЁюЎхфєЁє
  472.         push hl
  473.         ld l,(ix+PANEL.totalsize)
  474.         ld h,(ix+PANEL.totalsize+1)
  475.         ld bc,(fcb+FCB_FSIZE)
  476.         add hl,bc
  477.         ld (ix+PANEL.totalsize),l
  478.         ld (ix+PANEL.totalsize+1),h
  479.         ld l,(ix+PANEL.totalsize+2)
  480.         ld h,(ix+PANEL.totalsize+3)
  481.         ld bc,(fcb+FCB_FSIZE+2)
  482.         adc hl,bc
  483.         ld (ix+PANEL.totalsize+2),l
  484.         ld (ix+PANEL.totalsize+3),h
  485.         pop hl
  486.        
  487.         pop bc
  488.         inc bc ;nfiles
  489.         bit 5,b;1,b ;ёЄЁрэшўър pgtemp чръюэўшырё№? max 512 Їрщыют яю 32 срщЄр
  490.         jr nz,loaddirq
  491.         push bc
  492.         push de ;catbuf
  493.         push hl
  494.         push ix
  495.         ld de,fcb
  496.         OS_SETDTA ;set disk transfer address = de
  497.          ld de,fcbmask ;т CP/M эх эєцэю, эю юЄёєЄёЄтшх тЁхфшЄ ьэюуючрфрўэюёЄш
  498.         OS_FSEARCHNEXT
  499.         pop ix
  500.         pop hl
  501.         pop de ;catbuf
  502.         pop bc ;nfiles
  503.         or a
  504.         jr z,loaddir0
  505. loaddir_error
  506. loaddirq
  507. ;bc=nfiles
  508.         ld (ix+PANEL.files),c
  509.         ld (ix+PANEL.files+1),b
  510.  
  511.         if 1==0
  512.         ld l,(ix+PANEL.pointers)
  513.         ld h,(ix+PANEL.pointers+1)
  514.         ld e,(ix+PANEL.catbuf)
  515.         ld d,(ix+PANEL.catbuf+1)
  516. sortfiles_0
  517.         push bc
  518.         ;ld (hl),e     
  519.         ;inc hl
  520.         ;ld (hl),d
  521.         ;inc hl
  522.         call putfilepointer_de_tohl
  523.         ex hl,de
  524.         ld bc,32
  525.         add hl,bc
  526.         ex hl,de
  527.          jr nc,$+3
  528.          inc de ;next page
  529.         pop bc
  530.         dec bc 
  531.         ld a,b
  532.         or c
  533.         jr nz,sortfiles_0
  534.         endif
  535.  
  536.         call countfiles
  537.         ld (ix+PANEL.filesdirs),l
  538.         ld (ix+PANEL.filesdirs+1),h
  539.        
  540.         ex de,hl
  541.         call nv_getdirpos_hl
  542.         or a
  543.         sbc hl,de ;dirpos<files?
  544.         ret c ;OK
  545.         jp nv_setcursor_zero
  546.  
  547. controlloop
  548.         call fixscroll_prcmd
  549. controlloop_noprline
  550.         ld hl,controlloop
  551.         push hl
  552.         ld ix,(curpanel)
  553.         ld a,(ix+PANEL.files)
  554.         or (ix+PANEL.files+1)
  555.         call z,nv_setdirpos_zero ;can't move cursor if 0 files
  556.         call cmdcalccurxy
  557.         call nv_setxy
  558.         ld e,CURSORCOLOR;#38
  559.         OS_PRATTR ;draw cursor
  560.         ld a,FILECURSORCOLOR
  561.         call prfilecursor
  562.          push af ;color under file cursor
  563.         YIELDGETKEYLOOP
  564.          pop de ;d=color under file cursor
  565.         push af
  566.         ld a,d
  567.         call prfilecursor ;remove file cursor
  568.         call cmdcalccurxy
  569.         call nv_setxy
  570.         ld e,COLOR;7
  571.         OS_PRATTR ;remove cursor
  572.          ld e,COLOR
  573.          call nv_setcolor ;even if we didn't reprint command line, draw windows with its color
  574.         pop af
  575.         ld hl,tnvcmds
  576.         ld bc,nnvcmds
  577.         cpir
  578.         jp nz,editcmd_keyfail
  579. ;bc=nnvcmds-(#ъюьрэф√+1) = 0..(nnvcmds-1)
  580.         add hl,bc
  581. ;hl=tnvcmds+nnvcmds
  582.         add hl,bc
  583.         add hl,bc
  584. ;hl=tnvcmds+nnvcmds+ 2*(nnvcmds-(#ъюьрэф√+1))
  585.         ld c,(hl)
  586.         inc hl
  587.         ld h,(hl)
  588.         ld l,c
  589.         push hl ;jump addr
  590.         ld hl,cmdbuf
  591.         ld ix,(curpanel)
  592.         ret
  593. editcmd_keyfail
  594.         cp ' '
  595.         ret c ;яЁюўшх ёшёЄхьэ√х ъэюяъш эх эєцэ√
  596. editcmd_typein
  597. ;keeps ix
  598.         ld e,a
  599.         ld hl,cmdbuf
  600.         call strlen ;hl=length
  601.         ld bc,MAXCMDSZ
  602.         or a
  603.         sbc hl,bc
  604.         ret nc ;эхъєфр ттюфшЄ№
  605.         call cmdcalctextaddr ;hl=addr, a=curcmdx
  606.         inc a
  607.         ld (curcmdx),a
  608.         jp strinsch
  609.  
  610. editcmd_space
  611.         ld a,(cmdbuf)
  612.         or a
  613.         ld a,' '
  614.         jr nz,editcmd_typein
  615.         call getfcbaddrundercursor;hl=addr fcb ;ix=curpanel
  616.         call isthisdotdir_hl
  617.         call nz,changemark_hl
  618.         push hl
  619.         call setfilecursorxy
  620.         pop hl
  621.         call prdirfile
  622.         ld ix,(curpanel)
  623.         call drawpanelfilesandsize
  624.         jp editcmd_down
  625.        
  626. editcmd_backspace
  627.         call cmdcalctextaddr ;hl=addr, a=curcmdx
  628.         or a
  629.         jr z,editcmddirback;editcmdok ;эхўхую єфры Є№
  630.         dec a
  631.         ld (curcmdx),a
  632.         jp strdelch
  633.        
  634. editcmddirback
  635.         call setpaneldir
  636.         ld de,tdotdot
  637.         OS_CHDIR
  638.         jp editcmd_setpaneldirfromcurdir
  639.  
  640. editcmd_left
  641.         ld a,(curcmdx)
  642.         or a
  643.         ret z ;эхъєфр тыхтю
  644.         dec a
  645.         ld (curcmdx),a
  646.         ret
  647.      
  648. editcmd_right
  649.         call cmdcalctextaddr ;hl=addr, a=curcmdx
  650.         inc (hl)
  651.         dec (hl)
  652.         ret z ;эхъєфр яЁртю, ёЄюшь эр ЄхЁьшэрЄюЁх
  653.         inc a
  654.         ld (curcmdx),a
  655.         ret
  656.      
  657. editcmd_pageDown
  658.         call count_filecursor_y
  659.         cp CONST_HGT_TABLE-1+firstfiley -1 ;???
  660.         jr c,editcmd_pageDown_nolastvisible ;not last visible file
  661.         call nv_getdirpos_hl
  662.         ld bc,CONST_HGT_TABLE
  663.         add hl,bc
  664. editcmd_pageDown_end_q        
  665.         call cpfiles_setdirpos ;hl=dirpos
  666.         ld bc,CONST_HGT_TABLE-1
  667.         xor a
  668.         sbc hl,bc
  669.         jr nc,$+4
  670.         ld h,a
  671.         ld l,a;0
  672.         jr editcmd_pageUpq
  673. editcmd_pageDown_nolastvisible
  674.         call nv_getdirscroll_bc
  675.         ld hl,CONST_HGT_TABLE-1
  676.         add hl,bc ;last visible file
  677.         call cpfiles_setdirpos
  678.         jp drawpanel_files      
  679.  
  680. editcmd_pageUp
  681.         call count_filecursor_y
  682.         cp firstfiley
  683.         jr nc,editcmd_pageDown_nofirstvisible ;not first visible file
  684.         call nv_getdirpos_hl
  685.         ld bc,CONST_HGT_TABLE-1
  686.         xor a
  687.         sbc hl,bc
  688.         jr nc,$+4
  689.         ld h,a
  690.         ld l,a;0
  691.         call nv_setdirpos_hl
  692. editcmd_pageUpq
  693.         ld b,h
  694.         ld c,l
  695.         call nv_setdirscroll_bc
  696.         jp drawpanel_files      
  697. editcmd_pageDown_nofirstvisible
  698.         call nv_getdirscroll_bc
  699.         ld h,b
  700.         ld l,c
  701.         call nv_setdirpos_hl
  702.         jp drawpanel_files    
  703.  
  704. editcmd_End
  705.         ld hl,-1 ;>=files
  706.         jp editcmd_pageDown_end_q
  707.  
  708. editcmd_Home
  709.         xor a
  710.         ld h,a
  711.         ld l,a;0
  712.         call nv_setdirpos_hl
  713.         ld b,h
  714.         ld c,l
  715.         call nv_setdirscroll_bc
  716.         jp drawpanel_files    
  717.  
  718.        
  719. editcmd_up
  720.          ld hl,controlloop_noprline
  721.          ex (sp),hl
  722.         call nv_getdirpos_hl
  723.         ld a,h
  724.         or l
  725.         ret z ;first file
  726.         dec hl
  727.         call nv_setdirpos_hl
  728.         call count_filecursor_y
  729.         cp firstfiley-2;or a
  730.         ret nz ;not above first visible file
  731.         call nv_getdirscroll_bc
  732.         dec bc
  733.         call nv_setdirscroll_bc
  734.          push bc
  735.         call nv_getpanelxy_de
  736.         inc d
  737.         push de
  738.         ld hl,CONST_HGT_TABLE*256 + 40
  739.         OS_SCROLLDOWN
  740.         pop de
  741.         inc e
  742.         call nv_setxy
  743.          pop hl ;file number
  744.         call getfcbaddrunderhl
  745.         jp prdirfile
  746.  
  747. editcmd_down
  748.          ld hl,controlloop_noprline
  749.          ex (sp),hl
  750.         call nv_getdirpos_hl
  751.         call nv_getpanelfiles_bc
  752.         inc hl
  753.         or a
  754.         sbc hl,bc
  755.         add hl,bc
  756.         ret z ;last file
  757.         call nv_setdirpos_hl
  758.         call count_filecursor_y
  759.         cp CONST_HGT_TABLE-1+firstfiley
  760.         ret c ;not last visible file
  761.         call nv_getdirscroll_bc
  762.         inc bc
  763.         call nv_setdirscroll_bc
  764.         ld hl,CONST_HGT_TABLE-1
  765.         add hl,bc
  766.          push hl
  767.         call nv_getpanelxy_de
  768.         inc d
  769.         push de
  770.         ld hl,CONST_HGT_TABLE*256 + 40
  771.         OS_SCROLLUP
  772.         pop de
  773.         ld a,d
  774.         add a,CONST_HGT_TABLE-1
  775.         ld d,a
  776.         inc e
  777.         call nv_setxy
  778.          pop hl ;file number
  779.         call getfcbaddrunderhl
  780.         jp prdirfile
  781.  
  782. editcmd_ss1
  783.         ld hl,comparefilename
  784.         jr editcmd_setsortmodehl
  785. editcmd_ss2
  786.         ld hl,compareext
  787.         jr editcmd_setsortmodehl
  788. editcmd_ss3
  789.         ld hl,comparesize
  790.         jr editcmd_setsortmodehl
  791. editcmd_ss4
  792.         ld hl,comparedate
  793.         jr editcmd_setsortmodehl
  794. editcmd_ss5
  795.         ld hl,compareempty
  796. editcmd_setsortmodehl
  797.         call ifcmdnonempty_typedigit
  798.         ld c,(ix+PANEL.dirsortproc)
  799.         ld b,(ix+PANEL.dirsortproc+1)
  800.         xor a
  801.         sbc hl,bc
  802.         add hl,bc
  803.         jr nz,editcmd_setsortmodehl_noold
  804.         ld a,(ix+PANEL.dirsortmode)
  805.         cpl
  806. editcmd_setsortmodehl_noold
  807.         ld (ix+PANEL.dirsortmode),a
  808.         ld (ix+PANEL.dirsortproc),l
  809.         ld (ix+PANEL.dirsortproc+1),h
  810.         jp editcmd_reprintcurpanel
  811.  
  812. editcmd_tab
  813.         call getanotherpanel_ix
  814.         ld (curpanel),ix
  815.         jp editcmd_readprompt_setendcmdx
  816.  
  817. editcmd_enter
  818.         ld a,(cmdbuf)
  819.         or a
  820.         jr nz,editcmd_enter_runcmd
  821.         call getfcbundercursor ;->fcb
  822.         ld a,(fcb+FCB_FATTRIB)
  823.         and FATTRIB_DIR;#10
  824.         jp z,editcmd_enter_run
  825.         call changedir_fromfcb
  826. editcmd_setpaneldirfromcurdir
  827.         ld hl,editcmd_reprintcurpanel
  828.         push hl
  829.         ld hl,(curpanel)
  830. editcmd_setpaneldirfromcurdir_panelhl
  831.         ld de,PANEL.dir
  832.         add hl,de
  833.         ex de,hl ;de=pointer to 64 byte (MAXPATH_sz!) buf
  834.         OS_GETPATH
  835.         ret
  836.  
  837. editcmd_enter_runcmd
  838. ;run "cmd <command to run>"
  839.         OS_SETSYSDRV ;TODO ърЄрыюу cmd
  840.         ld hl,cmd_filename
  841.         call copy_to_fcb_filename
  842.         ;---
  843.         ld de,#1800
  844.         call nv_setxy
  845.         ld a,#0d
  846.         PRCHAR
  847.         ld a,#0a
  848.         PRCHAR
  849.         ;---
  850.         ld hl,cmdbuf
  851.          ;jr $
  852.          ;call setcurpaneldir
  853.         call loadandrun ;nz=error, e=id
  854.         jp nz,execcmd_error
  855. ;ъюьрэфр scratch - Ёхры№эю cmd scratch, чряєёърхЄ scratch яю Їюэє ш т√їюфшЄ
  856.         ;YIELD ;фрЄ№ тЁхь  чрфрўх cmd чрїтрЄшЄ№ Їюъєё
  857.         ;ld e,-1
  858.         ;OS_SETGFX ;disable gfx, give focus
  859.         WAITPID
  860. execcmd_runfocusq
  861.         ;YIELD ;фрЄ№ тЁхь  ёшёЄхьх яхЁхфрЄ№ Їюъєё Ёрэфюьэющ чрфрўх
  862.         ;ld b,25
  863. ;execcmd_waitchildredraw0
  864.         ;push bc
  865.         ;YIELD ;фрЄ№ тЁхь  чрфрўх scratch чрїтрЄшЄ№ Їюъєё ш яхЁхЁшёютрЄ№ (эю чруЁєчшЄ№ ърЁЄшэъє ш яхЁхЁшёютрЄ№ эх єёяххЄ)
  866.         ;pop bc
  867.         ;djnz execcmd_waitchildredraw0
  868.         ;ld e,6 ;textmode
  869.         ;OS_SETGFX ;take focus (can be random after closing cmd)
  870.         ld hl,cmdbuf
  871.         ld (hl),0
  872.         jp editcmd_reprintall
  873.  
  874. editcmd_enter_run
  875.         call setpaneldir
  876.         ld hl,fcb_filename+8
  877.         ld a,(hl)
  878.         inc hl
  879.         ld c,(hl)
  880.         inc hl
  881.         ld b,(hl)
  882.         cp '$'
  883.         jp z,editcmd_enter_runfile_hobeta
  884.         or #20
  885.         cp 'c'
  886.         jr nz,editcmd_enter_runfile_nocom
  887.         ld a,c
  888.         or #20
  889.         cp 'o'
  890.         jr nz,editcmd_enter_runfile_nocom
  891.         ld a,b
  892.         or #20
  893.         cp 'm'
  894.         jr nz,editcmd_enter_runfile_nocom
  895. editcmd_enter_runfile_com
  896.         ld hl,cmdbuf
  897.         ld (hl),0
  898. ;hl=rest of command line
  899.         jp loadandrun ;nz=error, e=id
  900.  
  901. execcmd_error
  902.         jp execcmd_runfocusq;editcmd_reprintall
  903.        
  904. editcmd_enter_runfile_nocom
  905.         ld hl,runfile_nocomq
  906.         push hl
  907.         call makeprompt_filename
  908.        
  909.         call runfile_findhandler ;find fcb_filename ext (spoiled) in "nv.ext"
  910.         ret nz ;jp nz,execcmd_error
  911.  
  912.         ld de,cmdbuf
  913.         ld hl,fcb_filename
  914.         OS_PARSEFNAME ;de->hl
  915.        
  916.         OS_SETSYSDRV ;TODO фшЁхъЄюЁш  cmd
  917.         ld hl,cmdprompt
  918.         jp loadandrun ;nz=error, e=id
  919.  
  920. makeprompt_filename
  921.         call setpaneldir_makeprompt ;keeps ix
  922.         call getfcbundercursor ;->fcb
  923.         ld hl,cmdprompt
  924.         xor a
  925.         cpir
  926.         dec hl ;hl=рфЁхё ЄхЁьшэрЄюЁр
  927.         ld a,'/'
  928.         dec hl
  929.         cp (hl)
  930.         inc hl
  931.         jr z,$+4
  932.          ld (hl),a
  933.          inc hl
  934.         ex de,hl ;de=prompt = "d:/path/" схч ЄхЁьшэрЄюЁр
  935.         ld hl,fcb_filename
  936.         call cpmname_to_dotname ;prompt = "d:/path/filename"
  937.         ret
  938.        
  939. runfile_findhandler
  940. ;find fcb_filename ext (spoiled) in "nv.ext"
  941. ;out: nz=error, cmdbuf=handler
  942.         ld hl,fcb_filename+8
  943.         ld de,ext
  944.         ld b,3
  945. runfile_nocom_recodeext0
  946.         ld a,(hl)
  947.         or #20
  948.         ld (de),a
  949.         inc hl
  950.         inc de
  951.         djnz runfile_nocom_recodeext0
  952.         OS_SETSYSDRV ;TODO фшЁхъЄюЁш  nv
  953.         ld hl,ext_filename
  954.         call copy_to_fcb_filename
  955.         call nv_openfcb ;autopush nv_closefcb
  956.         ret nz ;error
  957.         ld iy,file_buf_end
  958. runfile_nocom_extloop
  959.         call checkoneext ;c=ю°шсъш, z=эхЄ ю°шсюъ
  960.         jr z,runfile_nocom_extok
  961.         call checkcomma
  962.         jr z,runfile_nocom_extloop
  963.         call skiptonextline
  964.         jr nz,runfile_nocom_extloop ;no EOF
  965.         xor a
  966.         dec a
  967.         ret ;nz
  968. runfile_nocom_extok
  969.         call skiptocolon ;яЁющЄш яюёых ':'
  970.         ld hl,cmdbuf
  971.         call loadtoendline
  972.         xor a
  973.         ret ;z
  974.        
  975. runfile_nocomq
  976.         ld hl,cmdbuf
  977.         ld (hl),0
  978.         ld ix,(curpanel)
  979. setpaneldir_makeprompt
  980.         call setpaneldir ;keeps ix
  981.         jp makeprompt ;-> prompt ;keeps ix
  982.  
  983.         macro READBYTE_A
  984. ;out: z=EOF
  985.         inc ly
  986.         call m,readbyte_readbuf
  987.         ld a,(iy)
  988.         endm
  989.  
  990. checkoneext
  991.         ld hl,ext
  992.         ld bc,3*256
  993. checkoneext0
  994.         READBYTE_A
  995.         ret z ;EOF
  996.         cp #0a
  997.         jr z,checkoneext0 ;skip LF
  998.         or #20
  999.         xor (hl)
  1000.         inc hl
  1001.         or c
  1002.         ld c,a
  1003.         djnz checkoneext0
  1004. ;c=ю°шсъш, z=эхЄ ю°шсюъ
  1005.         ret
  1006.  
  1007. skiptocolon
  1008.         READBYTE_A
  1009.         ret z ;EOF
  1010.         cp ':'
  1011.         jr nz,skiptocolon
  1012.         ret
  1013.  
  1014. checkcomma
  1015.         READBYTE_A
  1016.         cp ','
  1017.         ret ;TODO яЁютхЁшЄ№ EOF
  1018.        
  1019. loadtoendline
  1020. ;hl=buf
  1021.         READBYTE_A
  1022.         jr z,loadtoendlineq
  1023.         cp #0d
  1024.         jr z,loadtoendlineq
  1025.         ld (hl),a
  1026.         inc hl
  1027.         jr loadtoendline
  1028. loadtoendlineq
  1029.         ld (hl),0
  1030.         ret
  1031.  
  1032. skiptonextline
  1033.         READBYTE_A
  1034.         ret z ;EOF
  1035.         cp #0d
  1036.         jr nz,skiptonextline
  1037.         or a
  1038.         ret ;nz
  1039.  
  1040. readbyte_readbuf
  1041. ;out: z=EOF
  1042.         push bc
  1043.         push de
  1044.         push hl
  1045.         push ix
  1046.         ld de,file_buf
  1047.         push de
  1048.         OS_SETDTA ;set disk transfer address = de
  1049.         ld de,fcb
  1050.         OS_FREAD
  1051.         cp 128 ;128=no bytes read
  1052.         pop iy
  1053.         pop ix
  1054.         pop hl
  1055.         pop de
  1056.         pop bc
  1057.         ret
  1058.        
  1059.  
  1060. editcmd_enter_runfile_hobeta
  1061. hobetarunner=#4100
  1062.         ld a,(cmdpgscreen0_0)
  1063.         sub 4-1 ;ld a,#ff-4 ;pgkillable
  1064.         SETPG16K
  1065.  
  1066.         ld hl,washobetarunner
  1067.         ld de,hobetarunner
  1068.         ld bc,hobetarunner_sz
  1069.         ldir
  1070. cmdpgscreen0_0=$+1
  1071.         ld a,#ff-1
  1072.         SETPG32KLOW
  1073.         inc a ;ld a,#ff-0
  1074.         SETPG32KHIGH
  1075.  
  1076.         call loadhobeta
  1077.         ret nz ;error
  1078.         ld hl,#6000
  1079.         ld bc,(#6000-17+11) ;len
  1080.         add hl,bc
  1081.         dec hl ;hl=load end
  1082.         ex de,hl
  1083.         ld hl,(#6000-17+9) ;start
  1084.         ld (hobetarunner_jp),hl
  1085.         add hl,bc
  1086.         dec hl
  1087.         ex de,hl ;de=destination end
  1088.         lddr
  1089.         jp hobetarunner
  1090.  
  1091. loadhobeta        
  1092.         call nv_openfcb ;autopush nv_closefcb
  1093.         ret nz ;error
  1094.         ld de,#6000-17
  1095.         OS_SETDTA
  1096. editcmd_enter_runfile_hobeta_fcb0      
  1097.         ld de,fcb
  1098.         OS_FREAD
  1099.         or a
  1100.         jr z,editcmd_enter_runfile_hobeta_fcb0
  1101. ;editcmd_enter_runfile_hobeta_fcbq
  1102.         ret ;call nv_closefcb
  1103.  
  1104. loadandrun
  1105. ;hl=rest of command line
  1106. ;out: nz=error, e=id
  1107. ;load file in fcb from system current dir with parameters in tcmd, then set curpaneldir and run
  1108.         ld (loadandrun_restcmd),hl
  1109.         call nv_openfcb ;autopush nv_closefcb
  1110.         ret nz ;error
  1111.         ;set current drive and dir (will be copied into new app)
  1112.         call setcurpaneldir
  1113.        
  1114.         OS_NEWAPP
  1115.         or a
  1116.         ret nz ;error
  1117. ;dehl=эюьхЁр ёЄЁрэшЎ т 0000,4000,8000,c000 эютюую яЁшыюцхэш , b=id, a=error
  1118.         push bc ;b=id
  1119.         ld a,d
  1120.         SETPG32KHIGH
  1121.         push de
  1122.         push hl
  1123.         ld hl,fcb_filename
  1124.         ld de,#c000+COMMANDLINE
  1125.         call cpmname_to_dotname ;de єърч√трхЄ эр ЄхЁьшэрЄюЁ
  1126. loadandrun_restcmd=$+1
  1127.         ld hl,0
  1128.          ld a,(hl)
  1129.          or a
  1130.          jr z,loadandrun_noparams
  1131.         ld a,' '
  1132.         ld (de),a
  1133.         inc de
  1134. loadandrun_noparams
  1135.         ld bc,COMMANDLINE_sz;-tcmd_sz
  1136.         ldir ;copy command line ;ьюцхь чрыхчЄ№ чр #0100!
  1137.         xor a
  1138.         ld (#c000+COMMANDLINE+COMMANDLINE_sz-1),a
  1139.         pop hl
  1140.         pop de
  1141.  
  1142.         call readfile_pages_dehl
  1143.  
  1144.         pop de
  1145.         ld e,d ;e=id
  1146. ;run "cmd <commandline>"
  1147.         push de
  1148.         OS_RUNAPP
  1149.         pop de
  1150.         xor a
  1151.         ret ;z
  1152.  
  1153. editcmd_1
  1154.         call ifcmdnonempty_typedigit
  1155.         ld hl,leftpanel
  1156.         ld a,10
  1157.         jr editcmd_drvselector
  1158. editcmd_2
  1159.         call ifcmdnonempty_typedigit
  1160.         ld hl,rightpanel
  1161.         ld a,50
  1162. editcmd_drvselector
  1163.         ld (windrv),a ;x
  1164.         ld (curpanel),hl
  1165.         ld hl,editcmd_reprintcurpanel;editcmd_reprintall_onlyreadcurdir
  1166.         push hl
  1167.  
  1168. seldrv_redraw_mainloop
  1169.         ld hl,windrv
  1170. ;hl=window
  1171.         call prwindow_text ;de=YX of last line
  1172. seldrv_mainloop
  1173.         ld de,(windrv)
  1174. seldrv_cury=$+1
  1175.         ld a,0
  1176.         add a,d
  1177.         add a,2
  1178.         ld d,a
  1179.         inc e
  1180.         inc e
  1181.         inc e
  1182.         push de
  1183.         ld a,CURSORCOLOR;#38
  1184.         ld b,4
  1185.         call drawfilecursor_sizeb ;draw cursor
  1186.         YIELDGETKEYLOOP
  1187.         pop de
  1188.         push af
  1189.         ld a,COLOR
  1190.         ld b,4
  1191.         call drawfilecursor_sizeb ;remove cursor
  1192.         pop af
  1193.         cp key_redraw
  1194.         jr z,seldrv_redraw_mainloop
  1195.         ld hl,seldrv_cury
  1196.         cp Enter
  1197.         jr z,seldrv_ok
  1198.         cp csSpace
  1199.         ret z
  1200.         ld bc,seldrv_mainloop
  1201.         push bc
  1202.         cp cs6
  1203.         jr z,seldrv_down
  1204.         cp cs7
  1205.         jr z,seldrv_up
  1206.         ret
  1207. seldrv_ok
  1208.         ld a,(hl);(seldrv_cury)
  1209.         add a,'0'
  1210.         ld ix,(curpanel)
  1211.         ld (ix+PANEL.dir),a
  1212.         ld (ix+PANEL.dir+1),':'
  1213.         ld (ix+PANEL.dir+2),'/'
  1214.         ld (ix+PANEL.dir+3),0
  1215.         ret
  1216. seldrv_down
  1217.         ld a,(hl)
  1218.         inc a
  1219.         cp NVOLUMES;5 ;drives
  1220.         ret z
  1221.         ld (hl),a
  1222.         ret
  1223. seldrv_up
  1224.         ld a,(hl)
  1225.         or a
  1226.         ret z
  1227.         dec (hl)
  1228.         ret
  1229.  
  1230. editcmd_4
  1231.         call ifcmdnonempty_typedigit
  1232.         call getfcbundercursor ;->fcb
  1233.         ld a,(fcb+FCB_FATTRIB)
  1234.         and FATTRIB_DIR;#10
  1235.         ret nz
  1236.  
  1237.         ld hl,editcmd_reprintall_noreaddir
  1238.         push hl
  1239.  
  1240.         call makeprompt_filename
  1241.        
  1242.         ;call runfile_findhandler ;find fcb_filename ext (spoiled) in "nv.ext"
  1243.         ;ret nz ;jp nz,execcmd_error
  1244.  
  1245.         ;ld de,cmdbuf
  1246.         ;ld hl,fcb_filename
  1247.         ;OS_PARSEFNAME ;de->hl
  1248.        
  1249.         OS_SETSYSDRV ;TODO фшЁхъЄюЁш  texted
  1250.        
  1251.         ld hl,texted_filename
  1252.         call copy_to_fcb_filename
  1253.        
  1254.         ;ld hl,cmdbuf
  1255.         ;ld (hl),0
  1256.         ld hl,cmdprompt
  1257. ;load file in fcb from system current dir with parameters in tcmd, then set curpaneldir and run
  1258.         jp loadandrun ;nz=error, e=id
  1259.        
  1260. editcmd_0
  1261. editcmd_9
  1262.         call ifcmdnonempty_typedigit
  1263.         ret
  1264.  
  1265. editcmd_reprintall_keepcursor
  1266.         call readpanels_reprint_keepcursor
  1267.         jp editcmd_readprompt_setendcmdx
  1268.  
  1269. editcmd_reprintcurdir
  1270.         ld hl,leftpanel+PANEL.dir
  1271.         ld de,rightpanel+PANEL.dir
  1272.         call strcp
  1273.         jr nz,editcmd_reprintcurpanel
  1274. editcmd_reprintall
  1275.         call readpanels_reprint
  1276.         jp editcmd_readprompt_setendcmdx
  1277. editcmd_reprintcurpanel
  1278.         ld ix,(curpanel)
  1279.         call readdir
  1280.         call sortfiles
  1281.         call drawpanel_with_files
  1282.         jp editcmd_readprompt_setendcmdx
  1283. editcmd_reprintall_noreaddir
  1284.         ld e,COLOR
  1285.         OS_CLS
  1286.         call printhint
  1287.         ld ix,leftpanel
  1288.         call drawpanel_with_files
  1289.         ld ix,rightpanel
  1290.         jp drawpanel_with_files
  1291. ;editcmd_reprintall_onlyreadcurdir
  1292. ;       ld e,COLOR
  1293. ;       OS_CLS
  1294. ;       call printhint
  1295. ;       call getanotherpanel_ix
  1296. ;       call drawpanel_with_files
  1297. ;       jp editcmd_reprintcurpanel
  1298.        
  1299. editcmd_invfiles
  1300. ;ix=curpanel
  1301.         ld hl,changemark_hl
  1302.         call processfiles
  1303.         jp drawpanel_with_files
  1304.  
  1305. editcmd_6 ;ren
  1306.         call ifcmdnonempty_typedigit
  1307.         ld hl,editcmd_reprintall
  1308.         push hl
  1309.         call setpaneldir
  1310.         call getfcbundercursor
  1311.         ld hl,fcb_filename
  1312.         ld de,tnewfilename
  1313.         push de
  1314.         call cpmname_to_dotname
  1315.         pop hl
  1316.         ld de,filenametext
  1317.         ld bc,12
  1318.         ldir
  1319.  
  1320.         ld hl,winrename
  1321.         call prwindow_edit ;CY=OK
  1322.         ret nc ;cancel
  1323.        
  1324. ;хёыш т шьхэш хёЄ№ ёшьтюы√ :,/,\, Єю т√щЄш ё ю°шсъющ
  1325.         ld hl,tnewfilename
  1326. editcmd_ren_checkname0
  1327.         ld a,(hl)
  1328.         or a
  1329.         jr z,editcmd_ren_checknameq
  1330.         inc hl
  1331.         cp ':'
  1332.         ret z ;error
  1333.         cp '/'
  1334.         ret z ;error
  1335.         cp 0x5c;'\\'
  1336.         ret z ;error
  1337.         jr editcmd_ren_checkname0
  1338. editcmd_ren_checknameq
  1339.         ld de,filenametext
  1340.         ld hl,tnewfilename
  1341.         OS_RENAME
  1342.         ;todo error
  1343.         ret
  1344.  
  1345. editcmd_7 ;mkdir
  1346.         call ifcmdnonempty_typedigit
  1347.         ld hl,editcmd_reprintall
  1348.         push hl
  1349.         call setpaneldir
  1350.  
  1351.         ld hl,winmkdir
  1352.         call prwindow_edit ;CY=OK, de=filename
  1353.         ret nc ;cancel
  1354.         OS_MKDIR
  1355.         ;TODO error
  1356.         ret
  1357.  
  1358. editcmd_8 ;del
  1359.         call ifcmdnonempty_typedigit
  1360.         ;ld ix,(curpanel)
  1361.         call getmarkedfiles;countmarkedfiles
  1362.         ld a,h
  1363.         or l
  1364.         jr nz,editcmd_8_0      
  1365.         call getfcbaddrundercursor;hl=fcb
  1366.         call isthisdotdir_hl
  1367.         ret z ;"." or ".."
  1368.         call changemark_hl ;ld (hl),1
  1369. editcmd_8_0  
  1370.         ld e,COLOR_RED
  1371.         call nv_setcolor
  1372.         ld hl,windel
  1373.         call prwindow_waitkey ;CY=OK
  1374.         jp nc,editcmd_reprintall_noreaddir
  1375.         ld hl,editcmd_reprintall
  1376.         push hl
  1377.         ld hl,proc_del_file
  1378.         ld ix,(curpanel)
  1379.         jp processfiles
  1380.        
  1381. proc_del_file
  1382.         bit 0,(hl)
  1383.         ret z
  1384.         call getfcbfromhl
  1385.         call setcurpaneldir
  1386.         ld a,(fcb+FCB_FATTRIB)
  1387.         and FATTRIB_DIR;#10 ;dir?
  1388.         jr nz,editcmd_deldir
  1389.         ld de,fcb
  1390.         OS_FDEL
  1391.         ret
  1392. editcmd_deldir
  1393.         call changedir_fromfcb
  1394. ;check if dir is empty (contains only "." and "..")
  1395.         ld de,fcb2
  1396.         OS_SETDTA ;set disk transfer address = de
  1397.         ;call makeemptymask
  1398.         ld de,fcbmask
  1399.         OS_FSEARCHFIRST
  1400.         or a
  1401.         ret nz
  1402.         ld de,fcb2
  1403.         OS_SETDTA ;set disk transfer address = de
  1404.         ld de,fcbmask
  1405.         OS_FSEARCHNEXT
  1406.         or a
  1407.         ret nz
  1408.         ld de,fcb2
  1409.         OS_SETDTA ;set disk transfer address = de
  1410.         ld de,fcbmask
  1411.         OS_FSEARCHNEXT
  1412.         or a
  1413.         ret z ;at least 3 files = there is a real file
  1414.         call setcurpaneldir
  1415.         ld de,fcb
  1416.         OS_FDEL
  1417.         ret
  1418.  
  1419. editcmd_5 ;copy
  1420.         call ifcmdnonempty_typedigit
  1421.         ;ld ix,(curpanel)
  1422.         call getmarkedfiles;countmarkedfiles
  1423.         ld a,h
  1424.         or l
  1425.         jr nz,editcmd_5_0      
  1426.         call getfcbaddrundercursor;hl=fcb
  1427.         call isthisdotdir_hl
  1428.         ret z ;"." or ".."
  1429.         call changemark_hl ;ld (hl),1
  1430. editcmd_5_0        
  1431.         ld hl,wincopy
  1432.         call prwindow_waitkey ;CY=OK
  1433.         jp nc,editcmd_reprintall_noreaddir
  1434.  
  1435.         ld hl,editcmd_reprintall
  1436.         push hl;═┼ ╥╨╬├└╥▄ !!
  1437.  
  1438.         ld hl,0
  1439.         ld (filescopied),hl
  1440.        
  1441.         ld de,PROGRESBARWINXY
  1442.         ld bc,PROGRESBARWINHGTWID
  1443.         call prwin
  1444.         ld hl,proceditcmd_copy
  1445.         ld ix,(curpanel)
  1446.         jp processfiles
  1447.  
  1448. proceditcmd_copy
  1449.         bit 0,(hl)
  1450.         ret z
  1451.         call getfcbfromhl
  1452.         call setcurpaneldir
  1453.  
  1454.         if 1==1
  1455.  
  1456.         ld hl,proceditcmd_copy_q
  1457.         push hl
  1458.  
  1459.         ld de,filenametext;wordbuf ;de=drive/path/file
  1460.          push de
  1461.          ld hl,fcb_filename
  1462.          call cpmname_to_dotname
  1463.          pop de
  1464.         OS_OPENHANDLE
  1465.         or a
  1466.         ret nz ;jp nz,cmd_error_wrongfile
  1467.         ld a,b
  1468.         ld (cmd_copy_close_file1_handle),a
  1469.         ld hl,cmd_copy_close_file1
  1470.         push hl
  1471.  
  1472.         ld de,filenametext
  1473.         OS_GETFILETIME ;ix=date, hl=time
  1474.         ld (proceditcmd_copy_time),hl
  1475.         ld (proceditcmd_copy_date),ix
  1476.  
  1477.         call setanotherpaneldir
  1478.        
  1479.         ld de,filenametext;swordbuf2 ;de=drive/path/file
  1480.         OS_CREATEHANDLE
  1481.         or a
  1482.         ret nz ;jp nz,cmd_error_cant_copy
  1483.         ld a,b
  1484.         ld (cmd_copy_close_file2_handle),a
  1485.         ld hl,cmd_copy_close_file2
  1486.         push hl
  1487. cmd_copy0
  1488.         ld hl,copybuf_sz
  1489.         ld de,copybuf
  1490.         ld a,(cmd_copy_close_file1_handle)
  1491.         ld b,a
  1492. ;B = file handle, DE = Buffer address, HL = Number of bytes to read
  1493.         push de
  1494.         OS_READHANDLE
  1495. ;HL = Number of bytes actually read, A=error
  1496.         pop de
  1497.         ld a,h
  1498.         or l
  1499.         ret z ;0 bytes remain
  1500.         ld a,(cmd_copy_close_file2_handle)
  1501.         ld b,a
  1502. ;B = file handle, DE = Buffer address, HL = Number of bytes to write
  1503.         OS_WRITEHANDLE
  1504.         jr cmd_copy0
  1505.        
  1506. cmd_copy_close_file1
  1507. cmd_copy_close_file1_handle=$+1
  1508.         ld b,0
  1509.         OS_CLOSEHANDLE
  1510.         ret
  1511.        
  1512. cmd_copy_close_file2
  1513. cmd_copy_close_file2_handle=$+1
  1514.         ld b,0
  1515.         OS_CLOSEHANDLE
  1516. proceditcmd_copy_time=$+1
  1517.         ld hl,0
  1518. proceditcmd_copy_date=$+2
  1519.         ld ix,0
  1520.         ld de,filenametext
  1521.         OS_SETFILETIME
  1522.         ret
  1523.        
  1524.         else ;CP/M-like functions
  1525.        
  1526.         ld hl,fcb_filename
  1527.         ld de,fcb2_filename
  1528.         call copy_to_defcb_filename
  1529.         call nv_openfcb ;autopush nv_closefcb
  1530.         ret nz ;jp nz,editcmd_copy_error_wrongfile
  1531.         call setanotherpaneldir
  1532.         call nv_createfcb2 ;autopush nv_closefcb2
  1533.         ret nz ;jp nz,editcmd_copy_error_cant_copy
  1534. editcmd_copy0
  1535.         ld de,copybuf
  1536.         OS_SETDTA
  1537.         ld de,fcb
  1538.         OS_FREAD
  1539.         xor 128
  1540.         jp z,proceditcmd_copy_q ;яЁюўшЄрыш 0 срщЄ - єёях°э√щ т√їюф
  1541.          ld l,a
  1542.          ld h,0
  1543.          push hl
  1544.         ld de,copybuf
  1545.         OS_SETDTA
  1546.          pop hl
  1547.         ld de,fcb2
  1548.         OS_FWRITE_NBYTES
  1549.         or a
  1550.         jr z,editcmd_copy0
  1551. ;can't write
  1552.         ;ret
  1553.        
  1554.         endif
  1555.        
  1556. proceditcmd_copy_q
  1557. filescopied=$+1
  1558.         ld hl,0
  1559.         inc hl
  1560.         ld (filescopied),hl
  1561.         ;ld bc,32
  1562.         ;ex de,hl ;ld de,(percentcopyfile)
  1563.         ;call mulbcde_ahl
  1564.         add hl,hl
  1565.         add hl,hl
  1566.         add hl,hl
  1567.         add hl,hl
  1568.         add hl,hl
  1569.         push hl
  1570.         ld ix,(curpanel)
  1571. ;ix = panel
  1572.         call getmarkedfiles ;out: hl'hl = files
  1573.         ex de,hl ;de=files
  1574.         pop hl ;filescopied*32
  1575.         call divhlde
  1576.         ld a,l
  1577.         or a
  1578.         ret z
  1579.         ld b,a
  1580.         ld de,PROGRESBARWINXY+#0102
  1581. proceditcmd_copy_q_progress0      
  1582.         push de
  1583.         push bc
  1584.         OS_SETXY
  1585.         ld e,#ff
  1586.         OS_PRATTR
  1587.         pop bc
  1588.         pop de
  1589.         inc e
  1590.         djnz proceditcmd_copy_q_progress0
  1591.         ret
  1592.        
  1593. mulbcde_ahl
  1594. ;bc * de Ёхчєы№ЄрЄ т ahl
  1595.         xor a
  1596.         ld h,a
  1597.         ld l,a
  1598.         dup 8
  1599.         rlc b
  1600.         jr nc,$+5 ; c - с√ы яхЁхэюё, nc - эх с√ыю яхЁхэюёр    
  1601.         add hl,de
  1602.         adc a,0
  1603.         add hl,hl
  1604.         rla
  1605.         edup
  1606.         dup 7
  1607.         rlc c
  1608.         jr nc,$+5 ; c - с√ы яхЁхэюё, nc - эх с√ыю яхЁхэюёр    
  1609.         add hl,de
  1610.         adc a,0
  1611.         add hl,hl
  1612.         rla
  1613.         edup
  1614.         rlc c
  1615.         ret nc
  1616.         add hl,de
  1617.         adc a,0
  1618.         ret
  1619.        
  1620. ;hl / de Ёхчєы№ЄрЄ т hl
  1621. divhlde
  1622.         ld c,h
  1623.         ld a,l
  1624.         ld hl,0
  1625.         ld b,16
  1626. ;don't mind carry
  1627. _DIV0.
  1628. ;shift left hlca
  1629.         rla
  1630.         rl c
  1631.         adc hl,hl
  1632. ;no carry
  1633. ;try sub
  1634.         sbc hl,de
  1635.         jr nc,$+3
  1636.         add hl,de
  1637. ;carry = inverted bit of result
  1638.         djnz _DIV0.
  1639.         rla
  1640.         cpl
  1641.         ld l,a
  1642.         ld a,c
  1643.         rla
  1644.         cpl
  1645.         ld h,a
  1646.         ret
  1647.        
  1648. editcmd_quit
  1649.         ld e,COLOR_RED
  1650.         call nv_setcolor
  1651.         ld hl,winquit
  1652.         call prwindow_waitkey ;CY=OK
  1653.         jp nc,editcmd_reprintall
  1654.         QUIT
  1655.  
  1656. ifcmdnonempty_typedigit
  1657. ;keeps ix
  1658.         ld c,a
  1659.         ld a,(cmdbuf)
  1660.         or a
  1661.         ld a,c
  1662.         ret z ;cmd is empty
  1663.          pop bc ;skip return to editcmdN
  1664.         jp editcmd_typein
  1665.  
  1666. windrv
  1667.         dw 0x0803 ;de=yx
  1668.         dw 256*(3+NVOLUMES)+9;0x0809 ;bc=hgt,wid
  1669.         db "Drive",0
  1670.         db 3 ;next line
  1671.         db "  0:",0,3
  1672.         db "  1:",0,3
  1673.         db "  2:",0,3
  1674.         db "  3:",0,3
  1675.         db "  4:",0,3
  1676.         db "  5:",0,3
  1677.         db "  6:",0,3
  1678.         db "  7:",0,3
  1679.         db 0 ;end of window
  1680.        
  1681. winmkdir
  1682.         dw 0x0a0f ;de=yx
  1683.         dw 0x0520 ;bc=hgt,wid
  1684.         db "Create new directory:",0
  1685.         db 3 ;next line
  1686.         db 2 ;print outer text
  1687.         dw tnewfilename
  1688.         db 0 ;end of window
  1689.  
  1690. winrename
  1691.         dw 0x0a0f ;de=yx
  1692.         dw 0x0520 ;bc=hgt,wid
  1693.         db "Rename file:",0
  1694.         db 3 ;next line
  1695.         db 2 ;print outer text
  1696.         dw tnewfilename
  1697.         db 0 ;end of window
  1698.        
  1699. tnewfilename
  1700.         db "12345678.123",0
  1701. tnewfilename_sz=12
  1702.  
  1703. winquit
  1704.         dw 0x0a1f ;de=yx
  1705.         dw 0x0515 ;bc=hgt,wid
  1706.         db 3 ;next line
  1707.         db "Quit Nedovigator?",0
  1708.         db 0 ;end of window
  1709.  
  1710. windel
  1711.         dw 0x0919 ;de=yx
  1712.         dw 0x051f ;bc=hgt,wid
  1713.         db 3 ;next line
  1714.         db "Delete ",0
  1715.         db 1 ;nfiles
  1716.         db " file(s)?",0
  1717.         db 0 ;end of window
  1718.  
  1719. wincopy
  1720.         dw 0x0919 ;de=yx
  1721.         dw 0x051f ;bc=hgt,wid
  1722.         db 3 ;next line
  1723.         db "Copy ",0
  1724.         db 1 ;nfiles
  1725.         db " file(s)?",0
  1726.         db 0 ;end of window
  1727.        
  1728.        
  1729. tdotdot
  1730.         dw "..",0
  1731.  
  1732.  
  1733.         STRUCT PANEL
  1734. ;sorterjp       BYTE ;TODO remove
  1735. ;sorter         WORD ;TODO remove
  1736. xy              WORD
  1737. ;pg             BYTE ;TODO remove
  1738. pgadd           BYTE ;0/DIRPAGES
  1739. catbuf          WORD ;TODO remove
  1740. poipg           BYTE
  1741. pointers        WORD ;TODO remove
  1742. totalsize       DWORD
  1743. files           WORD ;visible files
  1744. filesdirs       WORD ;files+dirs (no ".", "..")
  1745. markedfiles     WORD
  1746. markedsize      DWORD
  1747. dirpos          WORD
  1748. dirscroll       WORD
  1749. dirviewmode     BYTE
  1750. dirsortproc     WORD
  1751. dirsortmode     BYTE
  1752. dir             BLOCK MAXPATH_sz
  1753.         ENDS
  1754. ;PANEL_sz=13+MAXPATH_sz
  1755.  
  1756. leftpanel PANEL
  1757. rightpanel PANEL
  1758.  
  1759. oldtimer
  1760.         dw 0
  1761.        
  1762. ;<0x4000 for hobeta
  1763. fcb
  1764.         ds FCB_sz
  1765. fcb_filename=fcb+FCB_FNAME        
  1766.  
  1767. fcbmask
  1768.         db 0
  1769.         db "???????????"
  1770.         ds FCB_sz-11-1
  1771. fcbmask_filename=fcbmask+FCB_FNAME        
  1772.  
  1773. fcb2
  1774.         ds FCB_sz
  1775. fcb2_filename=fcb2+FCB_FNAME        
  1776.  
  1777. cmd_filename
  1778.         db "cmd     com"
  1779. ext_filename
  1780.         db "nv      ext"
  1781. texted_filename
  1782.         db "texted  com"
  1783.  
  1784. filenametext ;for change dir, rename
  1785.         db "prince  .   ",0 ;ds 64
  1786.  
  1787. ext
  1788.         ds 3 ;TODO юс·хфшэшЄ№ ё filenametext
  1789.        
  1790. copybuf=0x4000 ;эхы№ч  0xc000 - яютхЁї ъръющ-эшсєф№ фшЁхъЄюЁшш (р юэр шёяюы№чєхЄё  яЁш ъюяшЁютрэшш) ;0x8000 ьюцэю Єюы№ъю яюёых т√ёЄртыхэш  ёЄЁрэшЎ√ Єрь
  1791.         ;ds 4096;128
  1792. copybuf_sz=0x4000;$-copybuf
  1793.  
  1794.         align 256
  1795. file_buf
  1796.         ds 128
  1797. file_buf_end=$-1
  1798.  
  1799. washobetarunner
  1800. ;pgsys=pagexor-10
  1801. ;pgfatfs=pagexor-9
  1802. ;pgtrdosfs=pagexor-8
  1803. ;pgkillable=pagexor-4 ;т 128K ярь Єш, Є.ъ. ьюцэю яюЁЄшЄ№
  1804.         disp hobetarunner ;in pgkillable
  1805. ;$c loaded in pages 4,1,0
  1806. ;only ATM2 ports here!
  1807.         di
  1808.         ld a,#7f-5
  1809.         ld bc,#bff7
  1810.         out (c),a
  1811.         ld a,#7f-4
  1812.         ld bc,#fff7
  1813.         out (c),a
  1814.         ld hl,#c000
  1815.         ld de,#8000
  1816.         ld bc,#4000
  1817.         ldir ;pg4 -> pg5
  1818.         ld a,#7f-8;pgtrdosfs
  1819.         ld bc,#fff7
  1820.         out (c),a
  1821.         ld hl,#1c00+#c000
  1822.         ld de,#1c00+#8000
  1823.         ld bc,#400
  1824.         ldir ;restore sysvars
  1825.         ld a,#7f-2
  1826.         ld bc,#bff7
  1827.         out (c),a
  1828.         ld a,#7f-1
  1829.         ld bc,#fff7
  1830.         out (c),a
  1831.         ld hl,#c000
  1832.         ld de,#8000
  1833.         ld bc,#4000
  1834.         ldir ;pg1 -> pg2
  1835.         ld a,#7f-0+#80
  1836.         ld bc,#fff7
  1837.         out (c),a
  1838.         ld a,#00
  1839.         ld bc,#7ffd
  1840.         out (c),a
  1841.         ld a,#81 ;128 basic (with 7ffd)
  1842.         ld bc,#3ff7
  1843.         out (c),a
  1844.         ld a,#7f-5
  1845.         ld bc,#7ff7
  1846.         out (c),a
  1847. ;128: pages DOS,5,2,0(7ffd)
  1848.         ld a,#10
  1849.         ld bc,#7ffd
  1850.         out (c),a
  1851. ;48: pages 2,4,4,4
  1852.         ld a,#7f-5
  1853.         ld bc,#7ff7
  1854.         out (c),a
  1855.         ld a,#7f-2
  1856.         ld bc,#bff7
  1857.         out (c),a
  1858.         ld a,#7f-0+#80
  1859.         ld bc,#fff7
  1860.         out (c),a
  1861.         ld a,#83 ;48 basic switchable to DOS
  1862.         ld bc,#3ff7
  1863.         out (c),a
  1864. ;48: pages DOS,5,2,0(7ffd)
  1865.        
  1866.         LD A,%10101011 ;6912
  1867.         ld bc,#ff77 ;shadow ports off, palette off
  1868.         out (c),a
  1869.         ld sp,#6000
  1870.         ei
  1871. hobetarunner_jp=$+1
  1872.         jp #6000
  1873.         ent
  1874. hobetarunner_sz=$-washobetarunner
  1875.  
  1876. wordfiles
  1877.         db " files",0
  1878. wordbytes
  1879.         db " bytes",0
  1880.  
  1881. ;HS_elpg ;2 pages
  1882. ;        ds 2
  1883.         align 256
  1884. HS_strpg
  1885.         ds DIRPAGES*2
  1886.        
  1887.         include "nvsort.asm"
  1888.         include "heapsort.asm"
  1889.  
  1890.         include "nvjptbl.asm"
  1891.         include "nvunit.asm"
  1892.         include "nveditln.asm"
  1893.         include "nvview.asm"
  1894.         include "nvhexed.asm"
  1895.  
  1896.         include "../_sdk/prdword.asm"
  1897.         include "../_sdk/loadpage.asm"
  1898.         include "../_sdk/cmdpr.asm"
  1899.        
  1900. cmd_end
  1901.  
  1902.         display "nv size ",/d,cmd_end-cmd_begin," bytes"
  1903.  
  1904.         savebin "nv.com",cmd_begin,cmd_end-cmd_begin
  1905.        
  1906.         ;LABELSLIST "..\us\user.l"
  1907.