home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / magazine / progjour / 1990 / 05 / wold.asm < prev    next >
Assembly Source File  |  1990-07-06  |  4KB  |  242 lines

  1.     title    misc - miscellaneous routines for pj82
  2.     include    asm.inc
  3.  
  4. MALLOC_MAX        equ    0FFF0h    ; maximum size of malloc block
  5.  
  6.  
  7.     .data
  8.     extw    psp
  9.  
  10. error_text        dw    0    ; asciiz error msg offset in DGROUP
  11.  
  12. err_no_memory        db    'Out of memory',0
  13. err_too_big        db    'malloc max exceeded',0
  14.  
  15.     .data?
  16. argc            dw    ?
  17. argv            dd    ?
  18.  
  19.  
  20.     .code
  21.     extn    set_strerror
  22.  
  23. ;;    exit program
  24. ;
  25. exit_program proc
  26.     mov    ax,4C00h
  27.     jmp    ms_dos
  28. exit_program endp
  29.  
  30.  
  31. ;;    exit with error
  32. ;
  33. exit_with_error proc
  34.     mov    ax,4C01h
  35.     jmp    ms_dos
  36. exit_with_error endp
  37.  
  38.  
  39. ;;    free raw
  40. ;
  41. ;    entry    ES:DI    storage ptr
  42. ;    exit    Cf    if bad ptr
  43. ;    uses    AX
  44. ;
  45. free_raw proc
  46.     mov    ah,49h
  47.     jmp    ms_dos
  48. free_raw endp
  49.  
  50.  
  51. ;;    malloc raw
  52. ;
  53. ;    entry    CX    request bytes size (may not exceed 65536-16)
  54. ;    exit    ES:DI    storage ptr
  55. ;        Cf    if not enough memory available or request too large
  56. ;    uses    AX
  57. ;
  58. malloc_raw proc
  59.     push    bx
  60.     mov    bx,cx
  61.     add    bx,15
  62.     jc    mar2            ; if too much requested
  63.     shr    bx,1
  64.     shr    bx,1
  65.     shr    bx,1
  66.     shr    bx,1
  67.  
  68.     mov    ah,48h
  69.     call    ms_dos
  70.     jc    mar3            ; if not enough memory
  71.  
  72.     mov    es,ax
  73.     xor    di,di
  74.  
  75. mar1:    pop    bx
  76.     ret
  77.  
  78. mar2:    lea    ax,err_too_big
  79.     call    set_strerror
  80.     jmp    mar1
  81. mar3:    lea    ax,err_no_memory
  82.     call    set_strerror
  83.     jmp    mar1
  84. malloc_raw endp
  85.  
  86.  
  87. ;;    ms dos
  88. ;
  89. ms_dos    proc
  90.     int    21h
  91.     ret
  92. ms_dos    endp
  93.  
  94.  
  95. ;;    read command line
  96. ;
  97. ;    exit    DS:SI    program command line
  98. ;
  99. read_command_line proc
  100.     mov    ds,psp[bp]
  101.     mov    si,81h
  102.     ret
  103. read_command_line endp
  104.  
  105.  
  106. ;;    read environment
  107. ;
  108. ;    exit    DS:SI    environment
  109. ;
  110. read_environment proc
  111.     xor    si,si
  112.     mov    ds,psp[bp]
  113.     mov    ds,[si+2Ch]
  114.     ret
  115. read_environment endp
  116.  
  117.  
  118. ;;    set argc argv
  119. ;
  120. ;    exit    Cf    if no memory
  121. ;    uses    AX,CX,DI,SI,ES,DS
  122. ;
  123. set_argc_argv proc
  124.     mov    cx,256
  125.     call    malloc_raw
  126.     jc    saa9            ; if no memory
  127.  
  128.     mov    argc[bp],1
  129.     mov    wptr argv[bp],di
  130.     mov    wptr argv[bp+2],es
  131.  
  132.     mov    ah,30h
  133.     call    ms_dos
  134.     cmp    al,3
  135.     jb    saa10            ;  if prior to DOS version 3.x
  136.  
  137.     call    read_environment    ; skip environment
  138. saa1:    call    strskp
  139.     lodsb
  140.     cmp    al,NULL_CHAR
  141.     jne    saa1
  142.     lodsw                ;  (skip 1)
  143.  
  144.     call    strcpy            ; copy program name which appears
  145.     inc    di            ;  after environment
  146.  
  147. saa2:    call    read_command_line
  148. saa3:    call    strskp_white
  149.     cmp    al,CR_CHAR
  150.     je    saa7            ; if no more arguments
  151.  
  152.     inc    argc[bp]
  153.     jmp    saa5
  154. saa4:    stosb
  155. saa5:    lodsb
  156.     cmp    al,SPACE_CHAR
  157.     jbe    saa6
  158.     cmp    al,','
  159.     je    saa6
  160.     cmp    al,'~'
  161.     jbe    saa4
  162.  
  163. saa6:    cmp    al,CR_CHAR
  164.     mov    al,NULL_CHAR
  165.     stosb
  166.     jne    saa3
  167.  
  168. saa7:    inc    di            ; word align table
  169.     and    di,-2
  170.  
  171.     lds    si,argv[bp]        ; get ptr to first argument
  172.     mov    wptr argv[bp],di    ; set pointer list offset
  173.     mov    cx,argc[bp]        ; get list count (cannot==0)
  174.  
  175. saa8:    mov    ax,si            ; build pointer list
  176.     stosw
  177.     call    strskp
  178.     loop    saa8
  179.     clc
  180. saa9:    ret
  181.  
  182. saa10:    mov    ax,'C'
  183.     stosw
  184.     jmp    saa2
  185. set_argc_argv endp
  186.  
  187.  
  188. ;;    strcpy
  189. ;
  190. ;    entry    DS:SI    source ptr
  191. ;        ES:DI    destination ptr
  192. ;    exit    SI    updated past NULL
  193. ;        DI    updated, points to NULL
  194. ;    uses    AX
  195. ;
  196. strcpy    proc
  197.     lodsb
  198.     stosb
  199.     cmp    al,NULL_CHAR
  200.     jne    strcpy
  201.     dec    di
  202.     ret
  203. strcpy    endp
  204.  
  205.  
  206. ;;    strskp
  207. ;
  208. ;    entry    DS:SI    asciiz string ptr
  209. ;    exit    SI    updated past null
  210. ;    uses    AX
  211. ;
  212. strskp    proc
  213.     lodsb
  214.     cmp    al,NULL_CHAR
  215.     jne    strskp
  216.     ret
  217. strskp    endp
  218.  
  219.  
  220. ;;    strskp white
  221. ;
  222. ;    entry    DS:SI    text ptr
  223. ;    exit    SI    updated past spaces and tabs
  224. ;        AL    non-white character
  225. ;
  226. strskp_white proc
  227.     lodsb
  228.     cmp    al,SPACE_CHAR
  229.     je    strskp_white
  230.     cmp    al,TAB_CHAR
  231.     je    strskp_white
  232.     dec    si
  233.     ret
  234. strskp_white endp
  235.  
  236.  public    error_text,err_no_memory,err_too_big
  237.  public argc,argv,exit_program,exit_with_error
  238.  public free_raw,malloc_raw,ms_dos,read_command_line
  239.  public read_environment,set_argc_argv,strcpy,strskp,strskp_white
  240.  
  241.     end
  242.