home *** CD-ROM | disk | FTP | other *** search
/ Hall of Fame / HallofFameCDROM.cdr / proglc / tnylib.lzh / _MAIN.ASM < prev    next >
Encoding:
Assembly Source File  |  1986-07-28  |  2.1 KB  |  130 lines

  1. include %c86.inc
  2.  
  3.     ttl    _MAIN, 1.01, 07-28-86 jwk
  4.  
  5. ;does arg scan and dispatch for C86 programs (Croot() for Aztec)
  6.  
  7.     dseg
  8.     extv    _args, word
  9. mmsg    db    'main',0
  10. linl    dw    0
  11. qchr    dw    0
  12. tmptr    dw    0
  13. argc    dw    0
  14. argv    dw    0,0,0,0,0,0,0,0,0,0
  15.     dw    0,0,0,0,0,0,0,0,0,0
  16.     dw    0,0,0,0,0,0,0,0,0,0
  17.     dw    0,0,0,0,0,0,0,0,0,0
  18.     dw    0,0,0,0,0,0,0,0,0,0
  19.     dw    0,0,0,0,0,0,0,0,0,0
  20.     dw    0,0,0,0,0,0,0,0,0,0
  21.     dw    0,0,0,0,0,0,0,0,0,0
  22.  
  23.     cseg
  24.  
  25.     xtfs    <main, exit>
  26.  
  27.     procdef    _main, <>
  28.     mov    ax,_args        ;t = _args
  29.     mov    tmptr,ax
  30.  
  31.     mov    si,tmptr        ;n = *t++
  32.     cld
  33.     lodsb
  34.     mov    tmptr,si
  35.     xor    ah,ah
  36.     mov    linl,ax
  37.  
  38.     mov    si,tmptr        ;t[n] = 0
  39.     add    si,linl
  40.     xor    ax,ax
  41.     mov    byte ptr [si],al
  42.  
  43.     mov    qchr,ax            ;q = 0
  44.  
  45.     inc    ax            ;argc = 1
  46.     mov    argc,ax
  47.  
  48.     mov    ax,offset mmsg        ;argv[0] = "main"
  49.     mov    di,offset argv
  50.     stosw
  51.  
  52. scan:    mov    ax,linl            ;scan loop: if (linl) ...
  53.     or    ax,ax
  54.     jnz    scan1
  55.     jmp    fini
  56. ;
  57. scan1:    mov    si,tmptr        ;switch (*t)
  58.     mov    al,byte ptr [si]
  59.  
  60.     caseb    22h, qa            ;double quote
  61.     caseb    27h, qa            ;single quote
  62.     caseb    09h, blank        ;tab
  63.     caseb    ' ', blank        ;space
  64.     caseb    0Dh, blank        ;CR
  65.     caseb      0, blank        ;end of string
  66.     jmp    dfltsw            ;anything else
  67.  
  68. qa:    mov    si,tmptr        ;q = *t++
  69.     cld
  70.     lodsb
  71.     mov    tmptr,si
  72.     xor    ah,ah
  73.     mov    qchr,ax
  74.  
  75.     call    setptr            ;argv[argc++] = t
  76.  
  77. inqs:    mov    si,tmptr        ;while (*t != q) ...
  78.     cld
  79.     lodsb
  80.     xor    ah,ah
  81.     cmp    ax,qchr
  82.     jz    blank            ;end string, blank out quote
  83. ;
  84.     mov    tmptr,si
  85.     dec    linl
  86.     jmp    inqs
  87. ;
  88. blank:    mov    di,tmptr        ;end of quot string
  89.     xor    ax,ax
  90.     cld
  91.     stosb
  92.     mov    tmptr,di
  93.     mov    qchr,ax            ;q = (*t++ = 0)
  94.     jmp    endsw
  95. ;
  96. dfltsw:    mov    ax,qchr            ;any other char
  97.     inc    qchr
  98.     or    ax,ax            ;first one?
  99.     jnz    inwd            ;no
  100.     call    setptr            ;yes, set in ptr
  101.  
  102. inwd:    inc    word ptr tmptr        ;++t
  103. ;
  104. endsw:    dec    word ptr linl        ;--n
  105.     jmp    scan
  106. ;
  107. fini:    lea    ax,argv            ;exit(main(argc,argv))
  108.     push    ax
  109.     push    argc
  110.     call    main            ;the user program
  111.     mov    sp,bp
  112.     push    ax
  113.     call    exit            ;won't come back
  114.  
  115.     pend    _main
  116.  
  117. setptr:    mov    ax,argc            ;argv[argc++] = t
  118.     inc    argc
  119.     shl    ax,1
  120.     lea    si,argv
  121.     add    si,ax
  122.     mov    ax,tmptr
  123.     mov    word ptr [si],ax
  124.     ret
  125.  
  126.     finish
  127.  
  128.     end
  129. 
  130.