?login_element?

Subversion Repositories NedoOS

Rev

Rev 878 | Blame | Compare with Previous | Last modification | View Log | Download

  1. compareattrib
  2.         push hl
  3.         push de
  4.         ld bc,FCB_FATTRIB
  5.         ex de,hl
  6.         add hl,bc
  7.         ex de,hl
  8.         add hl,bc
  9.         ld a,(hl)
  10.         and FATTRIB_DIR|0x80 ;0x80=".."
  11.         ld c,a
  12.         ld a,(de)
  13.         and FATTRIB_DIR|0x80
  14.         cp c
  15. findmin_ccf=$
  16.         ccf
  17.         pop de  
  18.         pop hl
  19.         ret
  20.  
  21. comparedate
  22.         call compareattrib
  23.         ret nz
  24.         ld bc,FCB_FDATE+1
  25.         ex de,hl
  26.         add hl,bc
  27.         ex de,hl
  28.         add hl,bc
  29.         ld a,(de)
  30.         cp (hl)
  31.         ret nz
  32.         dec hl
  33.         dec de
  34.         ld a,(de)
  35.         cp (hl)
  36.         ret nz
  37.  
  38.         ld bc,FCB_FTIME+1-FCB_FDATE
  39.         ex de,hl
  40.         add hl,bc
  41.         ex de,hl
  42.         add hl,bc
  43.         ld a,(de)
  44.         cp (hl)
  45.         ret nz
  46.         dec hl
  47.         dec de
  48.         ld a,(de)
  49.         cp (hl)
  50.         ret nz
  51.  
  52.         ld bc,-FCB_FTIME
  53.         ex de,hl
  54.         add hl,bc
  55.         ex de,hl
  56.         add hl,bc
  57.         jr compareext_go
  58.  
  59. comparesize
  60.         call compareattrib
  61.         ret nz
  62.         ld bc,FCB_FSIZE+3
  63.         ex de,hl
  64.         add hl,bc
  65.         ex de,hl
  66.         add hl,bc
  67.         ld a,(de)
  68.         cp (hl)
  69.         ret nz
  70.         dec hl
  71.         dec de
  72.         ld a,(de)
  73.         cp (hl)
  74.         ret nz
  75.         dec hl
  76.         dec de
  77.         ld a,(de)
  78.         cp (hl)
  79.         ret nz
  80.         dec hl
  81.         dec de
  82.         ld a,(de)
  83.         cp (hl)
  84.         ret nz
  85.         ld bc,-FCB_FSIZE
  86.         ex de,hl
  87.         add hl,bc
  88.         ex de,hl
  89.         add hl,bc
  90.         jr compareext_go
  91.  
  92. compareext
  93.         call compareattrib
  94.         ret nz
  95. compareext_go
  96.         ld bc,8
  97.         ex de,hl
  98.         add hl,bc
  99.         ex de,hl
  100.         add hl,bc
  101.         ld b,3
  102. compareext0
  103.         inc hl
  104.         inc de
  105.         ld a,(de)
  106.         cp (hl)
  107.         jr nz,casecompareext;ret nz
  108. casecompareextq
  109.         djnz compareext0
  110.         ld bc,-11
  111.         ex de,hl
  112.         add hl,bc
  113.         ex de,hl
  114.         add hl,bc
  115.         ld b,8
  116.         jp comparefilename0
  117.  
  118. casecompareext
  119.         ld a,(de)
  120.         ld c,(hl)
  121.         or 0x20
  122.         set 5,c
  123.         cp c
  124.         jr z,casecompareextq
  125.         ret
  126.  
  127. comparefilename
  128. ;hl=fcb1
  129. ;de=fcb2
  130. ;out: NC = *de>=*hl
  131.         call compareattrib
  132.         ret nz
  133.         ld b,11
  134. comparefilename0
  135.         inc hl
  136.         inc de
  137.         ld a,(de)
  138.         cp (hl)
  139.         jr nz,casecompare;ret nz
  140. casecompareq
  141.         djnz comparefilename0
  142.         ret
  143.  
  144. casecompare
  145.         ld a,(de)
  146.         ld c,(hl)
  147.         or 0x20
  148.         set 5,c
  149.         cp c
  150.         jr z,casecompareq
  151.         ret
  152.  
  153. compareempty
  154.         scf
  155.         ret
  156.  
  157. comparer
  158. ;hl = FCB1, de = FCB2
  159. findmin_proc=$+1
  160.         call compareext
  161. ;NC = *de>=*hl
  162. findmin_ccf2=$
  163.         ccf ;/nop
  164.         ret
  165.  
  166. sortfiles
  167. ;ix=panel
  168.         ld l,(ix+PANEL.dirsortproc)
  169.         ld h,(ix+PANEL.dirsortproc+1)
  170.         ld (findmin_proc),hl
  171.        
  172.         ld a,(ix+PANEL.dirsortmode)
  173.         or a
  174.         ld bc,0x3f38
  175.         jr z,$+5
  176.         ld bc,0x0030
  177.         ;ld a,c
  178.         ;ld (findmin_jrc),a
  179.         ld a,b
  180.         ld (findmin_ccf),a
  181.         ld (findmin_ccf2),a
  182.        
  183.         ;jp (ix)
  184.  
  185. sorter2
  186.         ;jr $
  187.         call HPSRT_init
  188.        
  189.         ld c,(ix+PANEL.files)
  190.         ld b,(ix+PANEL.files+1)
  191.         ld a,b
  192.         or c
  193.         ret z
  194.         ;ld l,(ix+PANEL.pointers)
  195.         ;ld h,(ix+PANEL.pointers+1)
  196.         ld e,(ix+PANEL.catbuf)
  197.         ld d,(ix+PANEL.catbuf+1)
  198. sorter2_add0
  199.         push bc
  200.         push de
  201.         ;call getfilepointer_de_fromhl
  202.         ;push hl ;hl=next pointer
  203. ;de=fcb (mangled addr)
  204.         ;exd
  205.         ;push hl
  206.         ;ld d,h
  207.         ;ld e,l
  208.         ;res 6,d
  209.         ;ld a,3 ;TODO remove copy
  210.         ;PGW2strpg
  211. ;в c000 PANEL.pg
  212.         ;ld bc,32
  213.         ;ldir
  214.         ;pop hl
  215.         ;ld     de,0
  216. ;hl=addr to add
  217.         ;exd
  218.         call HPSRT_add
  219.         ;pop hl
  220.         pop de
  221.         ex de,hl
  222.         ld bc,32
  223.         add hl,bc
  224.         ex hl,de
  225.          jr nc,$+3
  226.          inc de ;next page
  227.          set 7,d
  228.          set 6,d
  229.         pop bc
  230.         dec bc
  231.         ld a,b
  232.         or c
  233.         jr nz,sorter2_add0
  234.        
  235.         jp HPSRT_sort
  236.  
  237.         if 1==0
  238. sorter1
  239.        
  240.         ;ld a,(ix+PANEL.pg)
  241.         ;SETPGC000
  242.        
  243.         ld c,(ix+PANEL.files)
  244.         ld b,(ix+PANEL.files+1)
  245.         ld a,b
  246.         or c
  247.         ret z
  248.         ld l,(ix+PANEL.pointers)
  249.         ld h,(ix+PANEL.pointers+1)
  250. ;при обратной сортировке в режиме "без сортировки" на каждом проходе в конец списка попадёт первый файл, а на следующем он попадёт в очередное начало, т.е. перестановка в обратном порядке не выйдет
  251. sortfiles_pass0
  252.         push bc
  253.         push hl ;hl=start (in pointers)
  254. ;bc=files!=0
  255.         call findmin
  256. ;de=min (pointer)
  257.          ld hl,(findmin_proc)
  258.          ld bc,compareempty
  259.          or a
  260.          sbc hl,bc
  261.         pop hl ;hl=start (in pointers)
  262. ;copy pointer into hl, move to next pointer
  263.         push af
  264.         call swapfilepointers_hl_de ;out: hl=next pointer
  265.         pop af
  266.         pop bc
  267.          jr nz,$+6 ;not compareempty
  268.          dec bc ;если compareempty
  269.          ld a,b
  270.          or c
  271.          ret z
  272.         dec bc
  273.         ld a,b
  274.         or c
  275.         jr nz,sortfiles_pass0
  276.         ret
  277.  
  278. findmin
  279. ;hl=start (in pointers)
  280. ;bc=files!=0
  281. ;out: de=min (pointer)
  282.         ld e,l
  283.         ld d,h ;de=current min (pointer)
  284. findmin0
  285. ;de=current min (pointer)
  286.         dec bc
  287.         ld a,b
  288.         or c
  289.         ret z
  290.         inc hl
  291.         inc hl
  292.        
  293.         push bc
  294.         push de ;de=current min (pointer)
  295.         push hl
  296.        
  297.         push de ;de=current min (pointer)
  298.         call getfilepointer_de_fromhl
  299.          SETPG8000 ;а то сейчас по current min включается PGC000
  300.          res 6,d
  301.         ex de,hl ;hl=FCB
  302.         ex (sp),hl ;hl=current min (pointer)
  303.         call getfilepointer_de_fromhl
  304.  
  305. ;de=current min (FCB)
  306.         pop hl ;hl=FCB
  307.  
  308.         call comparer
  309.        
  310.         pop hl
  311.         pop de ;de=current min (pointer)
  312.         pop bc
  313. ;NC = *de>=*hl
  314. ;findmin_jrc=$
  315.         jr nc,findmin0;findmin_nomin
  316.         ld e,l
  317.         ld d,h ;de=current min (pointer)
  318. findmin_nomin
  319.         jr findmin0
  320.  
  321.         endif
  322.