; Doug's Programming Language  -- DPL, Version 2.22
; Copyright (c) 1988 Douglas S. Cody, All rights reserved.
;-------------------------------------
; CMDLN -- THIS ROUTINE RETURNS THE NEXT ELEMENT FROM THE
;	   COMMAND LINE INTO THE STRING SUPPLIED IN THE AX REGISTER
;
; Entry conditions:
;	AX holds the string address
;	ES segment contains the PSP segment
; Exit conditions:
;	Carry clear = data available
;	Carry set   = No data available
;
; Calling Example:
;
;	STRING	STR,132
;	;
;	CALL	CMDLN STR
;
; Calling results:
;
;	DOS>[PROG] /T TESTING A
;
;	1st call result:
;	  STR = "T"
;
;	2nd call result:
;	  STR = "TESTING"
;
;	3rd call result:
;	  STR = "A"
;	
SUBPGM	CMDLN
;
INTEGER	PSPLEN
INTEGER	PSPPTR
;
SPACE	EQU	20H
TAB	EQU	09H
SWITCH	EQU	2FH
;
BEGIN	CMDLN
	CALL	SETUP		; SETUP THE VARIABLES
	JCXZ	CMDL_20		; EXIT IF NULL REMAINING...
;
CMDL_05:
	LODSB			; FETCH THE CHARACTER
	CMP	AL,'/'		; SWITCH CHARACTER?
	JE	CMDL_06		; YES, SKIP IT
	CMP	AL,' '		; SPACE CHARACTER?
	JE	CMDL_06		; YES, SKIP IT
	CMP	AL,09		; TAB CHARACTER?
	JNE	CMDL_11		; NO, ACCEPT IT
;
CMDL_06:
	LOOP	CMDL_05		; LOOP TILL DONE...
	JMP	SHORT CMDL_20	; EXIT IF DONE...
;
CMDL_10:
	LODSB			; FETCH THE NEXT CHARACTER
	CMP	AL,'/'		; SWITCH? ('/')
	JE	CMDL_14		; YES, QUIT.
	CMP	AL,' '		; LESS THAN OR EQUAL TO A SPACE?
	JLE	CMDL_14		; YES, QUIT.
	CMP	AL,09		; TAB
	JE	CMDL_14		; YES, QUIT.
;
CMDL_11:
	STOSB
	LOOP	CMDL_10		; CONTINUE TILL DONE...
	JMP	SHORT CMDL_15	; SKIP THE ADJUSTMENT
;
CMDL_14:
	DEC	CX		; ADJUST FOR THE FOUND MATCH
;
CMDL_15:
	MOV	ES:[PSPPTR],SI	; SAVE THE POINTER
	MOV	ES:[PSPLEN],CX	; SAVE THE REMAINING LENGTH
	CLC			; RETURN FULL...
;
CMDL_16:
	PUSH	ES		; SWAP ES & DS
	PUSH	DS
	POP	ES
	POP	DS
	MOV	BYTE PTR [DI],00H ; SET THE TERMINATOR
	RET
;
CMDL_20:
	STC			; RETURN NULL AND VOID
	JMP	SHORT CMDL_16	; EXIT THROUGH COMMON CODE
;
;
; C M D A L L  --  MOVE THE ENTIRE COMMAND LINE
;
; Entry conditions:
;	None
; Exit conditions:
;	None
;
	PUBLIC	CMDALL
CMDALL	PROC
	CALL	SETUP
	JCXZ	CMDL_20		; EXIT NULL & VOID
	REP	MOVSB		; MOVE THE WHOLE LINE
	JMP	CMDL_16		; RETURN THROUGH COMMON CODE

CMDALL	ENDP
;
;
; C M D R S T  --  RESET THE POINTER TO THE BEGINNING OF THE COMMAND LINE
;
; Entry conditions:
;	None
; Exit conditions:
;	None
;
	PUBLIC	CMDRST
CMDRST	PROC
	MOV	WORD PTR [PSPLEN],00H	; RESET THE PSP POINTERS
	MOV	WORD PTR [PSPPTR],00H
	RET

CMDRST	ENDP
;
;
;=====================
;   ROUTINE SECTION
;	LEVEL 1
;=====================
;
;
SETUP	PROC	NEAR
	PUSH	ES
	PUSH	DS		; SWAP ES & DS
	POP	ES		; ES = DATA SEGMENT
	POP	DS
;
	MOV	DI,AX		; DI POINTS TO THE TARGET
	MOV	SI,ES:[PSPPTR]	; FETCH THE PSP POINTER
	MOV	CX,ES:[PSPLEN]	; AND THE REMAINING LENGTH
	OR	SI,SI		; IS THIS A FRESH START?
	JNE	STUP_02		; NO, USE THIS POINTER
;
	MOV	SI,80H		; YES, RE-INIT ALL
	SUB	CH,CH		; CLEAR THE MSB
	MOV	CL,[SI]		; ALSO THE COUNT
	INC	SI		; MOVE PAST THE LENGTH
;
STUP_02:
	CLD			; ALL STRINGS FORWARD...
	RET

SETUP	ENDP
;
ENDPGM	CMDLN
;
