home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / sigm / sigmv016.ark / COMAND.LIB < prev    next >
Text File  |  1984-04-29  |  7KB  |  329 lines

  1. ;;
  2. ;; THIS MACRO PROCESSES COMMANDS ENTERED AT THE KEYBOARD.
  3. ;; PARAMETERS PASSED ARE:
  4. ;; 'PROMPT'    CHARACTER OR STRING ENCLOSED IN SINGLE QUOTES WHICH
  5. ;;        IS TO BE PRINTED AT THE BEGINNING OF EACH COMMAND
  6. ;;        LINE AS A PROMPT TO THE OPERATOR.
  7. ;; 'ERR'    CHARACTER OR STRING ENCLOSED IN SINGLE QUOTES WHICH
  8. ;;        IS TO BE PRINTED IN THE EVENT AN INPUT COMMAND DOES
  9. ;;        NOT MATCH THOSE FOUND IN THE TABLE.
  10. ;; IBUF        ADDRESS OF INPUT LINE BUFFER.
  11. ;;        DEFAULT IS 80H.
  12. ;; LEN        LENGTH OF INPUT LINE BUFFER.  SHOULD BE COMPUTED AS
  13. ;;        THE MAXIMUM LENGTH OF INPUT EXPECTED + 20.
  14. ;;        DEFAULT LENGTH IS 80H.
  15. ;; <COMS>    LIST OF VALID COMMAND WORDS WHICH ARE TO BE
  16. ;;        PLACED IN THE LOOK UP TABLE.  WORDS CAN BE OF ANY
  17. ;;        LENGTH.  ANY NUMBER OF WORDS CAN BE PRESENT.  WORDS
  18. ;;        MUST EVALUATE TO LABELS USED ELSEWARE IN THE
  19. ;;        PROGRAM.  LIST OF WORDS MUST BE ENCLOSED IN <> AND
  20. ;;        MUST BE SEPARATED BY COMMAS.  EXAMPLE <COM1,COM2,COM3>
  21. ;; ACON        SEE PARAM MACRO.  IF ACON = '0' PARAM WILL NOT BE
  22. ;;        EXPANDED.
  23. ;;
  24. COMAND    MACRO    PROMPT,ERR,IBUF,LEN,COMS,ACON
  25.     IF    NOT NUL IBUF
  26. @LINPT    SET    IBUF
  27. @BUF    SET    IBUF+2
  28.     ELSE
  29. @LINPT    SET    080H
  30. @BUF    SET    082H
  31.     ENDIF
  32.     IF    NUL LEN
  33. @LONG    SET    80H
  34.     ELSE
  35. @LONG    SET    LEN
  36.     ENDIF
  37.     LOCAL    INT1,INT2,INT3,INT4,INT5
  38.     JMP    @MAIN    ;;BYPASS ERROR MESSAGE
  39. EROR    CRLF
  40.     PRINT    ERR
  41. @MAIN    LXI    SP,STACK    ;;STACK DEFINED ELSEWARE
  42.     LXI    H,@MAIN    ;;SET RETURN ADDRESS
  43.     PUSH    H
  44. INT1    CRLF        ;;DO A CRLF
  45.     PRINT    PROMPT,S    ;;PRINT PROMPT AND SUPRESS CRLF
  46.     LXI    D,@BUF    ;;POINT TO BUFFER
  47.     MVI    A,@LONG    ;;SET BUFFER LENGTH
  48.     STAX    D
  49.     MVI    C,@BIN
  50.     CALL    @BDOS
  51.     LXI    H,@BUF+1    ;;TEST FOR INPUT
  52.     MOV    A,M
  53.     ORA    A
  54.     RZ
  55.     MVI    D,0
  56.     MOV    E,A
  57.     DAD    D
  58.     INX    H
  59.     MOV    M,D    ;;PLACE 0 AT END OF INPUT LINE
  60.     LXI    H,CTABLE    ;;POINT TO TABLE
  61.     JMP    INT3
  62. INT2    MOV    A,M    ;;STEP TO END OF COMMAND
  63.     ORA    A
  64.     INX    H
  65.     JNZ    INT2
  66.     INX    H
  67.     INX    H    ;;STEP PAST ADDRESS
  68. INT3    LXI    D,@BUF+2    ;;POINT TO WORD
  69.     MOV    A,M
  70.     ORA    A    ;;TEST FOR END OF TABLE
  71.     JZ    EROR
  72. INT4    LDAX    D    ;;GET CHARACTER FROM BUFFER
  73.     CPI    '@'    ;;IS IT A LETTER
  74.     JC    INT5
  75.     ANI    0DFH    ;;IF SO MAKE IT CAPITAL
  76. INT5    CMP    M    ;;COMPARE TO TABLE
  77.     JNZ    INT2
  78.     INX    H
  79.     INX    D
  80.     MOV    A,M
  81.     ORA    A
  82.     JNZ    INT4    ;;JUMP IF NOT END OF WORD
  83.     INX    H
  84.     MOV    A,M
  85.     INX    H
  86.     MOV    H,M
  87.     MOV    L,A
  88.     XCHG
  89.     SHLD    @LINPT
  90.     XCHG
  91.     PUSH    H
  92.     CRLF
  93.     POP    H
  94.     PCHL
  95. CTABLE    IRP    C?,<COMS&>
  96.     DB    'C?&',0
  97.     DW    @&C?
  98.     ENDM
  99.     DB    0
  100.     IRPC    B?,ACON
  101.     IF    NOT('B?&'='0')
  102.     PARAM    @LINPT,ACON,EROR
  103.     ENDIF
  104.     EXITM
  105.     ENDM
  106.     ENDM
  107. ;;
  108. ;;
  109. ;;
  110. ;; THIS MACRO EXTRACTS THE BINARY VALUE FROM A STRING OF CHARACTERS.
  111. ;; THE STRING OF CHARACTERS MUST BE OF THE FORM
  112. ;;    XXX:Y    OR   XXX
  113. ;; WHERE X IS AN ASCII CHARACTER FROM '0' THRU '9' OR 'A' THRU 'F'
  114. ;; DEPENDING ON THE VALUE OF Y OR THE DEFAULT CONVERSION BASE.
  115. ;; : IS THE OPTIONAL BASE DELIMITER
  116. ;; Y IS THE OPTIONAL CONVERSION BASE
  117. ;; THE PARAMETERS PASSED TO THE MACRO ARE:
  118. ;; ADR        ADDRESS OF POINTER TO BUFFER CONTAINING ASCII
  119. ;;        REPRESENTATION OF NUMBERS TO BE CONVERTED.
  120. ;; ACON        ALLOWED CONVERSION BASES AS FOLLOWS
  121. ;;        H=HEX        (0-FFFF)
  122. ;;        B=BINARY    (0-1111111111111111)
  123. ;;        O=OCTAL        (0-177777)
  124. ;;        D=DECIMAL    (0-65535)
  125. ;;        THE LEADING BASE IS ASSUMED TO BE THE DEFAULT BASE.
  126. ;;        EXAMPLE - IF "HOD" IS PASSED TO ACON - HEX, OCTAL
  127. ;;        AND DECIMAL WILL BE ALLOWED.  HEX WILL BE THE DEFAULT
  128. ;;        BASE.  (THAT IS ANY NUMBERS WHICH ARE NOT FOLLOWED BY
  129. ;;        A BASE DELIMITER AND CONVERSION BASE WILL BE ASSUMED
  130. ;;        IN THIS CASE TO BE HEX.)
  131. ;; ERR        ADDRESS OR LABEL OF ROUTINE TO PASS CONTROL TO
  132. ;;        IN THE EVENT OF AN ERROR IN THE CONVERSION ROUTINE.
  133. ;;        DEFAULT WILL RETURN TO THE CALLING PROGRAM WITH
  134. ;;        CARRY SET.
  135. ;; ON RETURN TO THE CALLING PROGRAM THE FOLLOWING FLAGS APPLY:
  136. ;; CARRY SET    AN ERROR WAS FOUND IN EITHER THE FORMAT OF THE
  137. ;;        CHARACTERS IN THE BUFFER OR THE NUMBER WAS OUT OF
  138. ;;        BOUNDS (ABOVE).
  139. ;; CARRY CLEAR    NO ERROR FOUND AND THE FOLLOWING APPLY:
  140. ;;        ZERO SET    TRY TO READ PAST END OF BUFFER.
  141. ;;                ZERO WILL NOT BE SET IF A VALID NUMBER
  142. ;;                WAS FOUND.
  143. ;;        A=FF        NULL ENTRY FOUND.  EXAMPLE -
  144. ;;                2345,64FF,,6778  THE THIRD ENTRY
  145. ;;                IS A NULL ENTRY.
  146. ;;        HL=VALUE    THIS IS ONLY VALID IF A<>FF AND
  147. ;;                THE ZERO IS NOT SET.
  148. ;;
  149. ;;
  150. PARAM    MACRO    ADR,ACON,ERR
  151.     LOCAL    INT1,INT2,INT3,INT4,INT5,INT6,INT7
  152.     IF    NOT NUL ERR
  153. INT1    RNC        ;;RETURN IF NO ERROR
  154.     JMP    ERR
  155. @PARAM    LXI    H,INT1    ;;SET ERROR TRAP
  156.     PUSH    H
  157.     ELSE
  158. @PARAM
  159.     ENDIF
  160.     LHLD    ADR    ;;GET POINTER TO BUFFER
  161.     MOV    D,H
  162.     MOV    E,L
  163.     MVI    B,0
  164.     CALL    @ADVAN    ;;POINT TO FIRST NON BLANK
  165.     ORA    A    ;;TEST FOR END OF LINE
  166.     RZ
  167.     CPI    ','    ;;TEST FOR NULL ENTRY
  168.     JNZ    INT2
  169.     MVI    A,0FFH    ;;SET NULL ENTRY FLAG
  170.     ORA    A    ;;CLEAR CARRY
  171.     INX    H
  172.     SHLD    ADR    ;;SAVE POINTER
  173.     RET
  174. INT2    CPI    '-'    ;;NEGATIVE NUMBER?
  175.     JNZ    INT3
  176.     MOV    B,A    ;;SAVE NEG FLAG
  177.     CALL    @ADVAN-1    ;;POINT NEXT
  178. INT3    HEXBI        ;;IS THIS A HEX DIGIT
  179.     RC        ;;RET IF NOT
  180. INT4    CALL    @ADVAN    ;;GET THE CHARACTER
  181.     STAX    D
  182.     INX    D
  183.     INX    H
  184.     CALL    @ADVAN    ;;GET THE NEXT CHARACTER
  185.     HEXBI        ;;HEX CHARACTER?
  186.     JNC    INT4
  187.     IF    NUL ACON    ;;SET DEFAULT CONVERSION BASE
  188.     MVI    C,'H'
  189.     ELSE
  190.     IRPC    B?,ACON
  191.     MVI    C,'B?&'
  192.     EXITM
  193.     ENDM
  194.     ENDIF
  195.     CALL    @ADVAN    ;;GET NEXT NON BLANK CHARACTER
  196.     CPI    ':'    ;;BASE DELIMITER?
  197.     JNZ    INT5
  198.     CALL    @ADVAN-1
  199.     MOV    C,A    ;;GET CONVERSION BASE
  200.     CALL    @ADVAN-1
  201. INT5    ORA    A    ;;END OF LINE?
  202.     JZ    INT6
  203.     CPI    ','    ;;END OF NUMBER
  204.     STC        ;;SET ERROR FLAG
  205.     RNZ
  206.     INX    H
  207. INT6    XCHG        ;;SAVE HL
  208.     MOV    M,B    ;;SET END OF NUMBER EITHER 0 OR '-'
  209.     LHLD    ADR    ;;GET POINTER TO START OF NUMBER
  210.     XCHG        ;;PUT IT TO DE
  211.     SHLD    ADR    ;;SAVE LINE POINTER
  212.     MOV    A,C    ;;GET CON
  213.     CPI    '@'    ;;BE SURE IT'S A CAP
  214.     JC    INT7
  215.     ANI    0DFH
  216. INT7    IF    NUL ACON    ;;BUILD JUMP TABLE FOR CONVERSION BASES
  217.     CPI    'H'
  218.     JZ    @HCON    ;;THIS IS DEFAULT
  219.     ELSE
  220.     IRPC    B?,ACON
  221.     CPI    'B?&'
  222.     JZ    @&B?&CON
  223.     ENDM
  224.     ENDIF
  225.     STC        ;;IF NO MATCH IN JUMP TABLE
  226.     RET        ;;ERROR AND RETURN
  227.     INX    H
  228. @ADVAN    MOV    A,M
  229.     CPI    ' '
  230.     RNZ
  231.     JMP    @ADVAN-1
  232. ;;BUILD CONVERSION ROUTINES
  233.     IF    NUL ACON
  234.     @CONV    <H>
  235.     ELSE
  236.     @CONV    ACON
  237.     ENDIF
  238. PARAM    MACRO
  239.     CALL    @PARAM
  240.     ENDM
  241.     ENDM
  242. @CONV    MACRO    ACB
  243.     IRPC    B?,ACB&
  244.     LOCAL    INT1,INT2,MAX
  245. MAX    SET    8
  246. @&B?&CON    LXI    H,0    ;;CLEAR    HL TO RECEIVE RESULT
  247. INT1    LDAX    D    ;;GET A CHARACTER
  248.     ORA    A    ;;TEST FOR END OF LINE
  249.     JNZ    INT2
  250.     INR    A    ;;CLEAR THE ZERO FLAG
  251.     RET
  252. INT2    CPI    '-'    ;;IS THIS NUMBER NEGATIVE
  253.     JZ    @NEG
  254.     HEXBI        ;;EXTRACT VALUE FROM CHARACTER
  255.     RC
  256.     IF    'B?&'='D'
  257. MAX    SET    10
  258.     MOV    B,H
  259.     MOV    C,L
  260.     ENDIF
  261.     DAD    H
  262.     RC        ;;ALWAYS RETURN IF OVERFLOW
  263.     IF    NOT('B?&'='B')
  264.     DAD    H
  265.     RC
  266.     IF    'B?&'='H'
  267. MAX    SET    16
  268.     DAD    H
  269.     RC
  270.     ENDIF
  271.     IF    'B?&'='D'
  272.     DAD    B
  273.     RC
  274.     ENDIF
  275.     DAD    H
  276.     RC
  277.     ELSE
  278. MAX    SET    2
  279.     ENDIF
  280.     CPI    MAX
  281.     CMC
  282.     RC        ;;IS THE DIGIT GREATER THAN MAX ALLOWED
  283.     MOV    C,A
  284.     MVI    B,0
  285.     DAD    B
  286.     RC
  287.     INX    D
  288.     JMP    INT1
  289.     ENDM
  290. @NEG    MOV    A,H    ;;GENERATE 2'S COMPLEMENT
  291.     CMA
  292.     MOV    H,A
  293.     MOV    A,L
  294.     CMA
  295.     MOV    L,A
  296.     INX    H
  297.     RET
  298.     ENDM
  299. ;;
  300. ;;
  301. ;; THIS MACRO TESTS A CHARACTER 'C' FOR '0'<=C<='9' OR 'A'<=C<='F'
  302. ;; ON RETURN CARRY CLEAR = TRUE AND THE A REGISTER CONTAINS
  303. ;; THE BINARY VALUE OF THE HEX DIGIT.
  304. ;;
  305. ;;
  306. HEXBI    MACRO
  307.     LOCAL    AROUND,INT1
  308.     JMP    AROUND
  309. @HEXBI    CPI    '@'
  310.     JC    INT1
  311.     ANI    0DFH    ;;MAKE IT A CAP
  312. INT1    SUI    30H
  313.     RC
  314.     CPI    0AH
  315.     CMC
  316.     RNC
  317.     SUI    07H
  318.     CPI    0AH
  319.     RC
  320.     CPI    10H
  321.     CMC
  322.     RET
  323. AROUND
  324. HEXBI    MACRO
  325.     CALL    @HEXBI
  326.     ENDM
  327.     HEXBI
  328.     ENDM
  329.