home *** CD-ROM | disk | FTP | other *** search
/ C!T ROM 5 / ctrom5b.zip / ctrom5b / PROGRAM / ASM / ALIB30B / SORT03.ASM < prev    next >
Assembly Source File  |  1994-11-04  |  4KB  |  173 lines

  1. ;***************************** SORT03.ASM ***********************************
  2.  
  3. LIBSEG           segment byte public "LIB"
  4.         assume cs:LIBSEG , ds:nothing
  5.  
  6. ;----------------------------------------------------------------------------
  7. .xlist
  8.     include  mac.inc
  9.     include  common.inc
  10.     extrn     dos_mem_allocate:far
  11.     extrn     dos_mem_release:far
  12. .list
  13.  
  14.     public    sort_engine
  15. sort_engine    dw    0        ;ptr to sort kernel
  16.  
  17.     public    prime_name_ptr,prime_asciiz_off,prime_asciiz_seg
  18. prime_name_ptr    label    dword
  19. prime_asciiz_off    dw    0
  20. prime_asciiz_seg    dw    0
  21.  
  22.     public    buffer,buffer_off,buffer_seg
  23. buffer    label    dword
  24. buffer_off    dw    0    ;offset
  25. buffer_seg    dw    0    ;seg
  26.  
  27.     public    buffer_len
  28. buffer_len    dw    0    ;callers sort buffer len
  29.  
  30.     public    fixed_record_len
  31. fixed_record_len dw    0    ;if non-zero then, fixed record length
  32.  
  33.     public    rec_term_char
  34. rec_term_char    db    0    ;callers terminatior for variable record len
  35.  
  36.     public    sort_field_len
  37. sort_field_len dw    0    ;word  value of above
  38.  
  39.     public    sort_column,last_sort_column
  40. sort_column    dw    0    ;index to sort field
  41. last_sort_column dw    0    ;last column of sort field
  42.  
  43.     public    index_length
  44. index_length    dw    0    ;length of index    
  45.  
  46.  
  47. comment 
  48. ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -(  SORT   )
  49. ; make_index - make index for sort routines
  50. ;  inputs:  es:di = pointer to buffer
  51. ;              cx = buffer length
  52. ;              bx = record length if fixed length, else zero if variable len.
  53. ;              al = record terminator for variable lenght records. else zero
  54. ;           ds:0  = ptr to buffer for index creation
  55. ;
  56. ;  Output:  ds:0  - ptr to index struc. <word buf_ptr>, <word record_length>
  57. ;                   Last entry contains -1 to indicate end of index.
  58. ;              di - ptr to partial record at end of buffer if -cx- non zero
  59. ;* * * * * * * * * * * * * *
  60. 
  61.     public    make_index              
  62. make_index:
  63.     push    bp
  64.     mov    bp,0
  65.     cld
  66.     cmp    bx,0
  67.     je    variable_records
  68. ;
  69. ; records are fixed length, bx=length
  70. ;
  71. fixed_loop:
  72.     cmp    cx,bx
  73.     jb    buf_end            ;jmp if incomplete record left
  74.     
  75.     mov    ds:[bp],di        ;put ptr in index
  76.     mov    ds:[bp+2],bx        ;put length in index
  77.     sub    cx,bx
  78.     add    bp,4            ;move to next index
  79.     jmp    fixed_loop
  80. buf_end:
  81.     mov    word ptr ds:[bp],-1    ;terminate index
  82.     jmp    mi_exit
  83. ;
  84. ; records are variable length, -al- has record terminator char.
  85. ;  inputs:  es:di = pointer to buffer
  86. ;              cx = buffer length
  87. ;              bx = record length if fixed length, else zero if variable len.
  88. ;              al = record terminator for variable lenght records. else zero
  89. ;           ds:bp = ptr to buffer for index creation
  90. ;
  91. variable_records:
  92.     mov    bx,di        ;save search start
  93.     mov    si,cx
  94.     repne    scasb
  95.     jne    buf_end2    ;jmp if partial record at end
  96.     mov    ds:[bp],bx        ;put ptr in index
  97.     sub    si,cx
  98.     mov    ds:[bp+2],si        ;put length in index
  99.     add    bp,4            ;move to next index
  100.     jcxz    buf_end3
  101.     jmp    variable_records
  102.         
  103.     
  104. buf_end2:
  105.     mov    di,bx        ;restore start ptr to partial record at end
  106.     mov    cx,si        ;restore lenght of partial record
  107. buf_end3:
  108.     mov    word ptr ds:[bp],-1    ;terminate index
  109. mi_exit:
  110.     mov    cs:index_length,bp
  111.     pop    bp
  112.     ret
  113.  
  114. ;-------------------------------------------------------------------------
  115. ; order_buffer - arrange records in index order
  116. ;  inputs: ds:si = buffer seg
  117. ;          dx = index seg
  118. ;  output: carry set if insufficient memory
  119. ;
  120. buf_in        label    dword
  121. buf_off_in    dw    0
  122. buf_seg_in    dw    0
  123. index_seg_in    dw    0
  124. temp_seg    dw    0
  125.  
  126.     public    order_buffer
  127. order_buffer:
  128.     mov    cs:buf_off_in,si
  129.     mov    cs:buf_seg_in,ds
  130.     mov    cs:index_seg_in,dx
  131.         
  132.     mov    dx,0
  133.     mov    ax,0f000h        ;allocate 61k bytes for work buffer
  134.     call    dos_mem_allocate    ;retruns es: = memory seg
  135.     jc    no_memory3        ;jmp if error
  136.     mov    cs:temp_seg,es        ;save index
  137.  
  138.     mov    bx,0            ;index buffer ptr
  139.     mov    di,0            ;store ptr
  140.     cld
  141. ;
  142. ; move data to temp buffer using index to select records.    
  143. ;
  144. rec_move_lp:
  145.     mov    ds,cs:index_seg_in
  146.     mov    si,word ptr ds:[bx]    ;get record ptr
  147.     cmp    si,-1
  148.     je    rec_move_done        ;jmp if end of index
  149.     mov    cx,word ptr ds:[bx+2]    ;get record length
  150.     mov    ds,cs:buf_seg_in
  151.     rep    movsb            ;move one record
  152.     add    bx,4            ;move to next index
  153.     jmp    rec_move_lp    
  154. ;
  155. ; now move data from temp buffer back into the origional buffer
  156. ;
  157. rec_move_done:
  158.     mov    cx,di            ;length of move from -di-
  159.     les    di,cs:buf_in
  160.     mov    ds,cs:temp_seg
  161.     mov    si,0
  162.     rep    movsb
  163.         
  164.     mov    es,cs:temp_seg
  165.     call    dos_mem_release
  166.     clc
  167. no_memory3:    
  168.     ret
  169.  
  170. LIBSEG    ENDS
  171.     end
  172.