home *** CD-ROM | disk | FTP | other *** search
- include %c86.inc
-
- ttl _MAIN, 1.01, 07-28-86 jwk
-
- ;does arg scan and dispatch for C86 programs (Croot() for Aztec)
-
- dseg
- extv _args, word
- mmsg db 'main',0
- linl dw 0
- qchr dw 0
- tmptr dw 0
- argc dw 0
- argv dw 0,0,0,0,0,0,0,0,0,0
- dw 0,0,0,0,0,0,0,0,0,0
- dw 0,0,0,0,0,0,0,0,0,0
- dw 0,0,0,0,0,0,0,0,0,0
- dw 0,0,0,0,0,0,0,0,0,0
- dw 0,0,0,0,0,0,0,0,0,0
- dw 0,0,0,0,0,0,0,0,0,0
- dw 0,0,0,0,0,0,0,0,0,0
-
- cseg
-
- xtfs <main, exit>
-
- procdef _main, <>
- mov ax,_args ;t = _args
- mov tmptr,ax
-
- mov si,tmptr ;n = *t++
- cld
- lodsb
- mov tmptr,si
- xor ah,ah
- mov linl,ax
-
- mov si,tmptr ;t[n] = 0
- add si,linl
- xor ax,ax
- mov byte ptr [si],al
-
- mov qchr,ax ;q = 0
-
- inc ax ;argc = 1
- mov argc,ax
-
- mov ax,offset mmsg ;argv[0] = "main"
- mov di,offset argv
- stosw
-
- scan: mov ax,linl ;scan loop: if (linl) ...
- or ax,ax
- jnz scan1
- jmp fini
- ;
- scan1: mov si,tmptr ;switch (*t)
- mov al,byte ptr [si]
-
- caseb 22h, qa ;double quote
- caseb 27h, qa ;single quote
- caseb 09h, blank ;tab
- caseb ' ', blank ;space
- caseb 0Dh, blank ;CR
- caseb 0, blank ;end of string
- jmp dfltsw ;anything else
-
- qa: mov si,tmptr ;q = *t++
- cld
- lodsb
- mov tmptr,si
- xor ah,ah
- mov qchr,ax
-
- call setptr ;argv[argc++] = t
-
- inqs: mov si,tmptr ;while (*t != q) ...
- cld
- lodsb
- xor ah,ah
- cmp ax,qchr
- jz blank ;end string, blank out quote
- ;
- mov tmptr,si
- dec linl
- jmp inqs
- ;
- blank: mov di,tmptr ;end of quot string
- xor ax,ax
- cld
- stosb
- mov tmptr,di
- mov qchr,ax ;q = (*t++ = 0)
- jmp endsw
- ;
- dfltsw: mov ax,qchr ;any other char
- inc qchr
- or ax,ax ;first one?
- jnz inwd ;no
- call setptr ;yes, set in ptr
-
- inwd: inc word ptr tmptr ;++t
- ;
- endsw: dec word ptr linl ;--n
- jmp scan
- ;
- fini: lea ax,argv ;exit(main(argc,argv))
- push ax
- push argc
- call main ;the user program
- mov sp,bp
- push ax
- call exit ;won't come back
-
- pend _main
-
- setptr: mov ax,argc ;argv[argc++] = t
- inc argc
- shl ax,1
- lea si,argv
- add si,ax
- mov ax,tmptr
- mov word ptr [si],ax
- ret
-
- finish
-
- end
-