Advertisement
DimkaM

сортировка

Nov 17th, 2018
279
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. readfnos
  2.     ld a,mem.fat_p
  3.     ld bc,mem.b1
  4.     out (c),a
  5.     WIN_GETPAGES a
  6.     ld (.num),a
  7.     ld b,high mem.b2
  8.     out (c),a
  9.     ld de,0xc000
  10.     ld (ix+txt.FWIN.fno_1),de
  11.     ld (ix+txt.FWIN.p_fno_1),a
  12.     MEM_SET 0x8000,0,0x20
  13.     ld a,(ix+txt.FWIN.drive):add a,0x30:ld (curdir),a
  14.     ld de,dir
  15.     ld bc,curdir
  16.     F_OPDIR
  17. .l2 ld bc,0x8000
  18. .l1 ld de,dir
  19.     F_RDIR
  20.     push bc:pop iy
  21.     ld a,FILINFO.FNAME:add c:ld c,a
  22.     LD A,(BC):or a:ret z
  23.     dec c
  24.     sub 0x2e:or (iy+FILINFO.FNAME+1)
  25.     jr z,.l2        ;пропускаем точку
  26.     ld a,(bc):and 0x10:jr nz,.cat
  27.     ld a,0x20
  28. .cat    ld (bc),a
  29.     ld d,b,e,c
  30.     push bc
  31.     call fno_sort
  32.     pop bc
  33.     ADDBC8 0x18
  34.     bit 6,b:jr z,.l1
  35.     ld hl,.num:inc (hl)
  36.     ld bc,mem.b2:ld a,(hl)
  37.     out (c),a
  38.     ld bc,0x8000
  39.     jr .l1
  40. .num    word 0
  41.  
  42. fno_sort
  43.     xor a:ld hl,0x8008:sbc hl,de:jp z,.first
  44.     ld a,(ix+txt.FWIN.p_fno_1)
  45.     ld bc,mem.b3
  46.     out (c),a
  47.     ld (.num),a
  48.     ld a,(ix+txt.FWIN.fno_1):ld h,(ix+txt.FWIN.fno_1+1)
  49.     add FILINFO.FATTRIB:ld l,a
  50. .l3 ld a,(de):cp (hl):jr .cat
  51. .l2 inc l,e
  52.     ld a,(de):or (hl):jr z,.prev
  53.     ld a,(de):cp (hl)
  54. .cat    jr z,.l2
  55.     jr c,.prev
  56.     ld a,l
  57.     and %11100000:or FILINFO.NEXT:ld l,a ;get fno
  58.     ld c,(hl):inc hl:ld b,(hl):inc hl:ld a,(hl)
  59.     or a:jr z,.new
  60.     ld hl,FILINFO.FNAME-1 ; -4000+9
  61.     add hl,bc
  62.     ld bc,mem.b3:out (c),a
  63.     ld (.num),a
  64.     ld a,e:and %11100000
  65.     or FILINFO.FATTRIB:ld e,a ;взад на имя
  66.     jr .l3
  67. .new    ;добавим после текущего
  68.     ld a,l:and %11100000:ld l,a ;смещение в ноль
  69.     push hl:ex (sp),ix          ;в индексный
  70.     push iy:pop de:set 6,d
  71.     xor a
  72.     ld (iy+FILINFO.NEXTP),a     ;устанавливаем следующий фно zero
  73.     ld a,(.num)
  74.     ld (iy+FILINFO.PREVP),a ;устанавливаем предыдущий
  75.     ld (iy+FILINFO.PREV),hl
  76.     ld (ix+FILINFO.NEXT),de     ;устанавливаем следующий
  77.     ld a,(readfnos.num)
  78.     ld (ix+FILINFO.NEXTP),a
  79.     pop ix:ret
  80.  
  81. .prev   ;вставим перед текущим
  82.     ld a,l:and %11100000:ld l,a ;смещение в ноль
  83.     push hl:ex (sp),ix          ;в индексный
  84.     push iy:pop de:set 6,d
  85.     ld a,(.num)
  86.     ld (iy+FILINFO.NEXTP),a
  87.     ld (iy+FILINFO.NEXT),hl ;устанавливаем следующий фно
  88.     ld hl,(ix+FILINFO.PREV)     ;берём предыдущий фно
  89.     ld (iy+FILINFO.PREV),hl     ;устанавливаем предыдущий
  90.     ld (ix+FILINFO.PREV),de     ;устанавливаем предыдущий
  91.     ld a,(readfnos.num):ld b,a
  92.     ld a,(ix+FILINFO.PREVP)
  93.     ld (ix+FILINFO.PREVP),b
  94.     ld (iy+FILINFO.PREVP),a
  95.     pop ix
  96.     or a:jr z,.firstfno ;если ноль то первый элемент списка
  97.     ld bc,mem.b3:out (c),a
  98.     push hl:pop iy
  99.     ld (iy+FILINFO.NEXT),de ;установим следующим
  100.     ld a,(readfnos.num)
  101.     ld (iy+FILINFO.NEXTP),a
  102.     ret
  103. .first
  104.     push iy:pop de:set 6,d
  105.     xor a
  106.     ld (iy+FILINFO.PREVP),a
  107.     ld (iy+FILINFO.NEXTP),a
  108. .firstfno
  109.     ld (ix+txt.FWIN.fno_1),de   ;запомним первый элемент списка
  110.     ld a,(readfnos.num)
  111.     ld (ix+txt.FWIN.p_fno_1),a
  112.     ret
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement