;+ ; UDI MWC86 VERSION 2.3.3 ; COPYRIGHT (C) 1982, 1983, 1984 BY MARK WILLIAMS COMPANY, CHICAGO. ; ALL RIGHTS RESERVED. MAY NOT BE COPIED OR DISCLOSED WITHOUT PERMISSION. ;- NAME DQMAIN_ ;+ ; UDI MWC86 RUNTIME. ; SMALL MODEL. ; FULL BLOWN RUN TIME STARTOFF. ; INCLUDES STANDARD I/O. ;- NARGV EQU 30 ; MAX NUMBER OF COMMAND ARGS. NARGB EQU 250 ; MAX NUMBER OF COMMAND BYTES. CGROUP GROUP CODE DGROUP GROUP DATA, STACK, MEMORY ;+ ; THE STACK SEGMENT HERE IS 0 BYTES ; LONG. THE SYSTEMSTACK MODULE IN SMALL.LIB ACTUALLY ; ALLOCATES THE STACK. THE LABEL IN THIS MODULE WILL GET ; RELOCATED TO THE TOP OF THE STACK SEGMENT BY LINK86 ; AND IS USED TO SET THE SP. ; ; THE MEMORY SEGMENT IS REFERENCED ONLY TO CARRY A LABEL ; TO ITS START. ALL MEMORY FROM THIS LABEL TO THE END OF ; MEMORY (FROM DQ$GET$SIZE) IS USED BY MALLOC. ;- STACK SEGMENT STACK 'STACK' STKTOP LABEL WORD ; SET TO 'REAL' TOP BY LINK86 STACK ENDS MEMORY SEGMENT MEMORY 'MEMORY' MBASE LABEL WORD ; THE ONLY THING IN MEMORY. MEMORY ENDS DATA SEGMENT PUBLIC 'DATA' EXTRN _MBOT_:WORD EXTRN _MTOP_:WORD ARGC DW 0 ; ARGUMENT COUNT. ARGV DW NARGV DUP (?) ; POINTERS TO ARGUMENTS. STATUS DW ? ; STATUS. LDELIM DB 020H ; LAST DELIMITER; INIT TO SPACE. ARGP DW DGROUP:ARGB ; SAVE FOR ARGUMENT POINTER. ARGB DB NARGB DUP (?) ; ARGUMENTS THEMSELVES. DATA ENDS ARGLIM EQU OFFSET DGROUP:ARGB+NARGB-81 EXTRN INIT87:FAR CODE SEGMENT PUBLIC 'CODE' ASSUME CS:CGROUP ASSUME DS:DGROUP ASSUME SS:DGROUP EXTRN MAIN_:NEAR EXTRN DQEXIT:NEAR EXTRN DQGETARGUMENT:NEAR EXTRN DQGETSIZE:NEAR EXTRN _FSETUP_:NEAR EXTRN _FREDIR_:NEAR EXTRN EXIT_:NEAR BEGIN LABEL FAR STI ; INTERRUPT ON. MOV AX,DGROUP ; GET BASE OF DGROUP AND MOV ES,AX ; SET UP ES. ASSUME ES:DGROUP PUSH ES PUSH AX ; FIND OUT HOW BIG THE MOV AX,OFFSET DGROUP:STATUS ; DATA SEGMENT PUSH AX ; IS CALL DQGETSIZE ; FOR MALLOC. POP ES MOV _MTOP_,AX ; SIZE IS TOP ADDRESS. MOV AX,OFFSET DGROUP:MBASE ; SAVE THE BASE ADDRESS OF MOV _MBOT_,AX ; THE POOL FOR MALLOC. L0: CMP ARGC,NARGV-1 ; TOO MANY ARGS ?? JAE SHORT L4 ; YES DUCK. CMP ARGP,ARGLIM ; ENOUGH ROOM FOR ANOTHER ?? JA SHORT L4 ; NOPE, DUCK. PUSH ES PUSH ARGP ; GET A MOV AX,OFFSET DGROUP:STATUS ; COMMAND LINE PUSH AX ; ARGUMENT FROM THE CALL DQGETARGUMENT ; SYSTEM. POP ES XCHG LDELIM,AL ; SAVE DELIM; GET LAST ONE. MOV BX,ARGC ; GET COUNT. ADD BX,BX ; WORD OFFSET. MOV DI,ARGP ; SET UP DI AND SAVE MOV ARGV[BX],DI ; ARGV POINTER. MOV CL,[DI] ; GET STRING LENGTH. LEA SI,[DI+1] ; POINT SI AT THE STRING. CLD ; BE WARY OF DQGETARGUMENT. CMP AL,020H ; WAS LAST DELIMITER A BLANK ?? JE L0A ; YES, IGNORE IT. STOSB ; SAVE LAST DELIMITER AS FIRST BYTE. L0A: SUB CH,CH ; MAKE LENGTH A WORD AND JCXZ SHORT L3 ; SKIP IF 0 LENGTH. L1: LODSB ; GRAB A BYTE FROM THE ARG. CMP AL,041H ; IF UPPER CASE JB SHORT L2 ; LETTER CMP AL,05AH ; MAP TO THE JA SHORT L2 ; LOWER CASE ADD AL,020H ; VERSION. L2: STOSB ; SAVE BYTE AND LOOP L1 ; DO ALL BYTES IN THE STRING. L3: SUB AL,AL ; PUT A 0 BYTE ON STOSB ; THE END OF THE STRING AND MOV ARGP,DI ; SAVE UPDATED ARGP. INC ARGC ; COUNT AN ARG. CMP LDELIM,0DH ; LAST DELIMITER A CR ?? JNE L0 ; NOPE, GET ANOTHER. L4: MOV BX,ARGC ; PUT A NULL POINTER ADD BX,BX ; ON THE END MOV ARGV[BX],0 ; OF THE ARGV ARRAY. CALL INIT87 ; CLEAR THE 8087, THEN SUB BP,BP ; CLEAR FP SO SETJMP WORKS. CALL _FSETUP_ ; SET UP STANDARD I/O. MOV AX,OFFSET DGROUP:ARGV ; PUSH POINTER TO THE PUSH AX ; ARGV. MOV AX,OFFSET DGROUP:ARGC ; PUSH POINTER TO THE PUSH AX ; ARGC. CALL _FREDIR_ ; PERFORM REDIRECTION ADD SP,4 ; AND POP 2 WORDS. SUB AX,AX ; PUSH A NULL ENV PUSH AX ; POINTER. MOV AX,OFFSET DGROUP:ARGV ; PUSH POINTER TO THE PUSH AX ; ARGV. PUSH ARGC ; AND THE COUNT. CALL MAIN_ ; CALL MAIN. ADD SP,6 ; POP OFF 3 WORDS. PUSH AX ; IF MAIN RETURNS, EXIT WITH CALL EXIT_ ; ITS STATUS. ADD SP,2 ; AND IF THAT RETURNS. MOV AX,1 ; CALL THE SYSTEM EXIT ROUTINE PUSH AX ; WITH A CALL DQEXIT ; NON ZERO STATUS. HLT ; LAST RESORT. CODE ENDS END BEGIN, DS:DGROUP, SS:DGROUP:STKTOP