*********************************************************
*                                                       *
*       RETURN CP/M COMMAND LINE TO MBASIC              *
*                                                       *
*       A LINKABLE MODULE IN THE MICROSOFT              *
*       RELOCATION FORMAT                               *
*                                                       *
*       (C) 1981, Software Tools                        *
*                 P.O. Box 80                           *
*                 Newport Beach                         *
*                 NSW, 2106                             *
*                 AUSTRALIA                             *
*                                                       *
*       Written by:     Bill Bolton                     *
*                                                       *
*       Date:           26/Jan/1981                     *
*                                                       *
*       Version:        1.1     (Initial Release)       *
*                                                       *
*       Date:           16/Feb/1981                     *
*                                                       *
*       Version:        1.2     Eliminated redundant    *
*                               code, added length      *
*                               checks and absolute     *
*                               exit on terminator.     *
*                                                       *
*       -------------------------------------------     *
*                                                       *
*       ************ CAUTION *****************          *
*                                                       *
*       This module will only work with the             *
*       Microsoft BASIC compiler                        *
*                                                       *
*       -------------------------------------------     *
*                                                       *
*       INPUT PARAMETERS:                               *
*                                                       *
*       1st. passed in HL = Address of length of        *
*                           string (1 byte), followed   *
*                           pointer to string (2 bytes) *
*                                                       *
*       RETURNED VALUE:                                 *
*                                                       *
*       1st. passed by writing command line buffer      *
*                   into string passed as 1st. input    *
*                   parameter. First leading blank      *
*                   is stripped if present.             *
*                                                       *
*       Note 1      If running under a debugger         *
*                   with command lines forced by        *
*                   using "I", the leading blank is     *
*                   not inserted in the command         *
*                   buffer by the debugger unless       *
*                   explicitly typed.                   *
*                                                       *
*       Note 2      The CP/M CCP converts any           *
*                   lower case characters in the        *
*                   command line to UPPER CASE.         *
*                                                       *
*       ------------------------------------------      *
*                                                       *
*       Assembler:      RMAC.ASM (Digital Research)     *
*                                                       *
*       Support:        MACRO3.LIB (Software Tools)     *
*                                                       *
*********************************************************

       PUBLIC  CMD

       MACLIB  MACRO3

       CSEG

CMD:
       MOV     A,M             ;GET LENGTH OF STRING
       STA     LENGTH          ;SAVE IT FOR LATER
       INX     H               ;HL <---- POINTER TO STRING LOC
       CONTENTS                ;HL <---- POINTER TO BASIC STRING
       XCHG                    ;DE <---- POINTER TO BASIC STRING
       LXI     H,80H           ;POINT TO COMMAND BUFFER
       MOV     A,M             ;GET LENGTH OF COMMAND LINE
       ORA     A               ;IS IT ZERO?
       RZ                      ;YES, DO NOTHING
       PUSH    H               ;SAVE COMMAND LINE POINTER
       LXI     H,LENGTH        ;POINT TO LENGTH OF BASIC STRING
       CMP     M               ;WILL COMMAND LINE FIT?
       JC      FITS            ;YES
       MOV     A,M             ;NO, ONLY MOVE LENGTH THAT WILL FIT
FITS:
       POP     H               ;RESTORE COMMAND LINE POINTER
       MVI     B,0
       MOV     C,A             ;BC <--- LENGTH TO MOVE
       DCX     D               ;PREPARE FOR LOOP ENTRY
       INX     H               ;POINT TO FIRST BYTE OF COMMAND
       MOV     A,M             ;GET FIRST BYTE
       CPI     ' '             ;IS IT A SPACE?
       JZ      LOOP            ;YES, IGNORE IT
       INX     D               ;NO
       STAX    D               ;SAVE IT
LOOP:
       INX     H               ;POINT TO NEXT COMMAND BYTE
       INX     D               ;POINT TO NEXT STRING BYTE
       MOV     A,M             ;GET BYTE FROM COMMAND
       CPI     0               ;IS IT TERMINATOR?
       RZ                      ;YES
       STAX    D               ;PUT BYTE TO STRING
       DCR     C               ;ADJUST COUNT
       JNZ     LOOP
       RET
;
;       DATA STORAGE
;
       DSEG
;
       DB      'Portions (C) 1981, Software Tools'
;
LENGTH: DB      0               ;POINTER TO BASIC LENGTH BYTE
;
       END