home *** CD-ROM | disk | FTP | other *** search
/ QBasic & Borland Pascal & C / Delphi5.iso / C / Samples / CASM.ARJ / PARALL.ASM < prev    next >
Assembly Source File  |  1988-02-04  |  3KB  |  175 lines

  1. ;_ parall.asm   Thu Feb  4 1988   Modified by: Walter Bright */
  2. ; Copyright (C) 1985-1988 by Northwest Software
  3. ; All rights reserved
  4. ; Written by Walter Bright
  5.  
  6. include    macros.asm
  7.  
  8.     c_extrn    _doserrno,word
  9.  
  10.     begcode    parall
  11.  
  12.     c_public paralloc,parcallo,parfree
  13.  
  14. ; Storage allocator
  15.  
  16. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  17. ; Allocate a block of data.
  18. ; Use:
  19. ;    p = paralloc(unsigned numpara);
  20. ; Returns:
  21. ;    segment of allocated data else 0
  22.  
  23. func    paralloc
  24.     push    BP
  25.     mov    BP,SP
  26.     mov    BX,P[BP]    ;get numpara
  27.     bdos    48h        ;allocate memory
  28.     jnc    A1        ;no error
  29.     mov    _doserrno,AX
  30.     clr    AX
  31. A1:    pop    BP
  32.     ret
  33. c_endp    paralloc
  34.  
  35. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  36. ; Allocate a block of data and clear it.
  37. ; Use:
  38. ;    p = parcallo(numpar);
  39. ; Returns:
  40. ;    segment of allocated data else NULL
  41.  
  42. func    parcallo
  43.     push    BP
  44.     mov    BP,SP
  45.     push    P[BP]
  46.     callm    paralloc
  47.     mov    SP,BP
  48.     tst    AX        ;error?
  49.     jz    CA2        ;yes
  50.     .save    DI
  51.     cld
  52.     clr    DI        ;start at ES:0
  53.     mov    BX,AX        ;save segment of result
  54. CA4:    mov    ES,AX
  55.     mov    CX,P[BP]    ;# of paragraphs
  56.     jcxz    CA1
  57.     and    CX,03FFFh
  58.     jnz    CA3
  59.     mov    CX,1000h    ;clear 64k
  60. CA3:    sub    P[BP],CX
  61.     shl    CX,1
  62.     shl    CX,1
  63.     shl    CX,1        ;# of words
  64.     mov    AX,DI        ;AX = 0
  65.     rep    stosw        ;clear the memory
  66.     mov    AX,ES
  67.     add    AX,1000h    ;next segment
  68.     jmp    CA4
  69.  
  70. CA1:    .restore DI
  71.     if SPTR
  72.     push    DS
  73.     pop    ES
  74.     endif
  75.     mov    AX,BX        ;restore segment of result
  76. CA2:    pop    BP
  77.     ret
  78. c_endp    parcallo
  79.  
  80. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  81. ; Free memory that was allocated by paralloc() or parcallo().
  82. ; Use:
  83. ;    parfree(segment);
  84. ; Returns:
  85. ;    0    success
  86. ;    -1    error
  87.  
  88. func    parfree
  89.     push    BP
  90.     mov    BP,SP
  91.     mov    ES,P[BP]        ;get segment
  92.     bdos    49h            ;free allocated memory
  93.     if SPTR
  94.     push    DS
  95.     pop    ES
  96.     endif
  97.     jnc    F1            ;no error
  98.     mov    _doserrno,AX
  99. F1:    sbb    AX,AX
  100.     pop    BP
  101.     ret
  102. c_endp    parfree
  103.  
  104. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  105. ; Modify allocated memory.
  106. ;    unsigned dos_setblock(newsize,segment);
  107. ; Returns:
  108. ;    if _doserrno is set, it returns the max possible size
  109.  
  110.     c_public dos_setblock
  111. func    dos_setblock
  112.     push    BP
  113.     mov    BP,SP
  114.     les    BX,P[BP]
  115.     bdos    4Ah        ;modify allocated memory
  116.     jnc    S1        ;no error
  117.     mov    _doserrno,AX
  118. S1:    mov    AX,BX        ;return max possible
  119.     if SPTR
  120.     push    DS
  121.     pop    ES
  122.     endif
  123.     pop    BP
  124.     ret
  125. c_endp    dos_setblock
  126.  
  127. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  128. ; Copy paragraphs of memory.
  129. ;    void _copy(unsigned newseg,unsigned oldseg,unsigned numpar);
  130.  
  131.     c_public _copy
  132. func    _copy
  133.     push    BP
  134.     mov    BP,SP
  135.     .save    <SI,DI>
  136.     push    DS
  137.     cld
  138.     clr    DI        ;start at ES:0
  139.     clr    SI        ;start at DS:0
  140.     mov    ES,P[BP]    ;newseg
  141.     mov    DS,P+2[BP]    ;oldseg
  142.     mov    BX,P+4[BP]    ;numpar
  143. COP4:    mov    CX,BX        ;# of paragraphs
  144.     jcxz    COP1
  145.     and    CX,03FFFh
  146.     jnz    COP3
  147.     mov    CX,1000h    ;clear 64k
  148. COP3:    sub    BX,CX
  149.     shl    CX,1
  150.     shl    CX,1
  151.     shl    CX,1        ;# of words
  152.     mov    AX,DI        ;AX = 0
  153.     rep    movsw        ;clear the memory
  154.     mov    AX,ES
  155.     add    AX,1000h    ;next segment
  156.     mov    ES,AX
  157.     mov    AX,DS
  158.     add    AX,1000h    ;next segment
  159.     mov    DS,AX
  160.     jmp    COP4
  161.  
  162. COP1:    pop    DS
  163.     .restore <DI,SI>
  164.     if SPTR
  165.     push    DS
  166.     pop    ES
  167.     endif
  168.     pop    BP
  169.     ret
  170. c_endp    _copy
  171.  
  172.     endcode    parall
  173.  
  174.     end
  175.