home *** CD-ROM | disk | FTP | other *** search
/ Columbia Kermit / kermit.zip / archives / trs80model1and3.zip / trscmd.src next >
Text File  |  1984-05-28  |  14KB  |  470 lines

  1. ; JUMPING TO THIS LOCATION IS LIKE RETSKP.  IT ASSUMES THE INSTRUCTION
  2. ;   AFTER THE CALL IS A JMP ADDR.
  3. RSKP:    POP    HL        ; GET THE RETURN ADDRESS.
  4.     INC    HL        ; INCREMENT BY THREE.
  5.     INC    HL
  6.     INC    HL
  7.     JP   (HL)
  8. ; THIS ROUTINE PRINTS THE NUMBER IN HL ON THE SCREEN IN DECIMAL.
  9. ; SAVES ALL ACS.
  10. NOUT:    PUSH   AF    ; SAVE OUR ACS.
  11.     PUSH   BC
  12.     PUSH   DE
  13.     PUSH   HL
  14.     LD     BC,-10    ; GET SOME USEFUL CONSTANTS.
  15.     LD     DE,-1
  16. NOUT2:    ADD    HL,BC        ; SUBTRACT AS MANY 10S AS POSSIBLE.
  17.     INC    DE        ; COUNT THEM.
  18.     JP     C,NOUT2    ; IF SOME LEFT KEEP GOING.
  19.     LD     BC,10    ; RESTORE THE LAST 10 WE TOOK AWAY.
  20.     ADD    HL,BC
  21.     EX   DE,HL               ; SWAP THE REMAINDER AND THE QUOTIENT.
  22.     LD     A,H        ; GET THE NUMBER OF 10S FOUND.
  23.     OR     L        ;* I THINK THIS CHECKS IF H EQUALS ZERO.  IF
  24.     CALL   NZ,NOUT    ; IF NON ZERO, RECURSE.
  25.     LD     A,E        ; GET THE REMAINDER.
  26.     ADD    A,30H        ; MAKE THE NUMBER PRINTABLE.
  27.     CALL    CONOUT
  28.     POP    HL        ; RESTORE THE ACS.
  29.     POP    DE
  30.     POP    BC
  31.     POP    AF
  32.     RET
  33. ;    THIS SET OF ROUTINES PROVIDES A USER ORIENTED WAY OF PARSING
  34. ;    COMMANDS.  IT IS SIMILAR TO THAT OF THE COMND JSYS IN TOPS-20.
  35. ;    THIS ROUTINE PRINTS THE PROMPT IN DE AND SPECIFIES THE REPARSE
  36. ;    ADDRESS.
  37. PROMPT:    POP    HL        ; GET THE RETURN ADDRESS.
  38.     PUSH   HL        ; PUT IT ON THE STACK AGAIN.
  39.     LD     (CMRPRS),HL    ; SAVE IT AS THE ADDRESS TO GO TO ON REPARSE.
  40.     LD     (CMOSTP),SP    ; SAVE FOR LATER RESTORAL.
  41.     LD     (CMPRMP),DE    ;save the prompt location
  42.     LD     HL,CMDBUF
  43.     LD     (CMCPTR),HL    ; INITIALIZE THE COMMAND POINTER.
  44.     LD     (CMDPTR),HL
  45.     XOR    A
  46.     LD     (CMAFLG),A    ; ZERO THE FLAGS.
  47.     LD     (CMCCNT),A
  48.     LD     A,0FFH    ; TRY IT THIS WAY (DAPHNE.)
  49.     LD     (CMSFLG),A
  50.     LD     DE,CMCRLF
  51.     CALL   PRTSTR
  52.     LD     DE,(CMPRMP)    ; PRINT THE PROMPT.
  53.     CALL   PRTSTR
  54.     RET
  55. ;    THIS ADDRESS IS JUMPED TO ON REPARSE.
  56. REPARS:    LD     SP,(CMOSTP)    ; GET THE OLD STACK POINTER.
  57.     LD     HL,CMDBUF
  58.     LD     (CMDPTR),HL
  59.     LD     A,0FFH    ; TRY IT THIS WAY (DAPHNE.)
  60.     LD     (CMSFLG),A
  61.     LD     HL,(CMRPRS)    ; GET THE REPARSE ADDRESS.
  62.     JP   (HL)              ; GO THERE.
  63. ;    THIS ADDRESS CAN BE JUMPED TO ON A PARSING ERROR.
  64. PRSERR:    LD     SP,(CMOSTP)    ; GET THE OLD STACK POINTER.
  65.     LD     HL,CMDBUF
  66.     LD     (CMCPTR),HL    ; INITIALIZE THE COMMAND POINTER.
  67.     LD     (CMDPTR),HL
  68.     XOR    A
  69.     LD     (CMAFLG),A    ; ZERO THE FLAGS.
  70.     LD     (CMCCNT),A
  71.     LD     A,0FFH    ; TRY IT THIS WAY (DAPHNE.)
  72.     LD     (CMSFLG),A
  73.     LD     DE,CMCRLF
  74.     CALL   PRTSTR
  75.     LD     DE,(CMPRMP)    ; GET THE PROMPT.
  76.     CALL   PRTSTR
  77. ;* INSTEAD RETURN TO BEFORE THE PROMPT CALL.
  78.     LD     HL,(CMRPRS)
  79.     JP   (HL)
  80. ;    THIS ROUTINE PARSES THE SPECIFIED FUNCTION IN A.  ANY ADDITIONAL
  81. ;    INFORMATION IS IN DE AND HL.
  82. ;    RETURNS +1 ON SUCCESS
  83. ;        +4 ON FAILURE (ASSUMES A JMP FOLLOWS THE CALL)
  84. COMND:    LD     (CMSTAT),A    ; SAVE WHAT WE ARE PRESENTLY PARSING.
  85.     CALL   CMINBF    ; GET CHARS UNTIL AN ACTION OR A ERASE CHAR.
  86.     CP     CMCFM    ; PARSE A CONFIRM?
  87.     JP     Z,CMCFRM    ; GO GET ONE.
  88.     CP     CMKEY    ; PARSE A KEYWORD?
  89.     JP     Z,CMKEYW    ; TRY AND GET ONE.
  90.     CP     CMIFI    ; PARSE AN INPUT FILE SPEC?
  91.     JP     Z,CMIFIL    ; GO GET ONE.
  92.     CP     CMIFIN    ; INPUT FILE-SPEC SILENT?
  93.     JP     Z,CMIFIL    ; DO AS HE WISHES
  94.     CP     CMOFI    ; OUTPUT FILE SPEC?
  95.     JP     Z,CMOFIL    ; GO GET ONE.
  96.     CP     CMTXT    ; PARSE ARBITRARY TEXT?
  97.     JP     Z,CMTEXT    ; GO DO IT.
  98.     LD     DE,CMER00    ; "?UNRECOGNIZED COMND CALL"
  99.     CALL   PRTSTR
  100.     RET
  101. ;    THIS ROUTINE PARSES ARBITRARY TEXT UP TO A CR.
  102. ;    ACCEPTS DE:    ADDRESS TO PUT TEXT
  103. ;    RETURNS IN A:    NUMBER OF CHARS IN TEXT (MAY BE 0)
  104. ;          DE:    UPDATED POINTER
  105. CMTEXT:    EX   DE,HL               ; PUT THE POINTER TO THE DEST IN HL.
  106.     LD     (CMPTAB),HL    ; SAVE THE POINTER.
  107.     LD     B,0        ; INIT THE CHAR COUNT
  108. CMTXT1:    CALL   CMGTCH    ; GET A CHAR.
  109.     OR     A        ; TERMINATOR?
  110.     JP     P,CMTXT5    ; NO, PUT IN USER SPACE.
  111.     AND    7FH        ; TURN OFF MINUS BIT.
  112.     CP     ESC        ; AN ESCAPE?
  113.     JR     NZ,CMTXT2    ; NO.
  114.     LD     A,BELL    ; GET A BELL.
  115.     CALL   CONOUT
  116.     XOR    A
  117.     LD     (CMAFLG),A    ; TURN OFF THE ACTION FLAG.
  118.     LD     HL,(CMCPTR)    ; MOVE THE POINTER TO BEFORE THE ESCAPE.
  119.     DEC    HL
  120.     LD     (CMCPTR),HL
  121.     LD     (CMDPTR),HL
  122.     LD     HL,CMCCNT    ; GET THE CHAR COUNT.
  123.     DEC    (HL)        ; DECREMENT IT BY ONE.
  124.     JP     CMTXT1        ; TRY AGAIN.
  125. CMTXT2:    CP     '?'        ; IS IT A QUESTION MARK?
  126.     JR     Z,CMTXT3        ; IF SO PUT IT IN THE TEXT.
  127.     CP    ' '         ;blank?
  128.     JR    Z,CMTXT3    ;if so put in the text
  129.     CP     FF        ; IS IT A FORMFEED?
  130.     CALL   Z,CMBLNK        ; IF SO BLANK THE SCREEN.
  131.     LD     A,B        ; RETURN THE COUNT.
  132.     LD     HL,(CMPTAB)    ; RETURN UPDATED POINTER IN HL.
  133.     EX   DE,HL
  134.     JP     RSKP        ; RETURN SUCCESS.
  135. CMTXT3:    LD     HL,CMAFLG    ; POINT TO THE ACTION FLAG.
  136.     LD     (HL),0        ; SET IT TO ZERO.
  137. CMTXT5:    INC    B        ; INCREMENT THE COUNT.
  138.     CP    'a'
  139.     JR    C,CMTXT6    ;lower than 'a'
  140.     CP    'z'
  141.     JR    NC,CMTXT6    ;greater than 'z'
  142.     AND    5FH        ;capitalize it
  143. CMTXT6    LD     HL,(CMPTAB)    ; GET THE POINTER.
  144.     LD     (HL),A        ; PUT THE CHAR IN THE ARRAY.
  145.     INC    HL
  146.     LD     (CMPTAB),HL    ; SAVE THE UPDATED POINTER.
  147.     JP     CMTXT1        ; GET ANOTHER CHAR.
  148. ; THIS ROUTINE GETS A CONFIRM.
  149. CMCFRM:    LD     DE,CMIN00    ; PRINT SOMETHING USEFUL.
  150.     CALL   PRTSTR
  151.     LD     DE,CMCRLF    ; PRINT A CRLF.
  152.     CALL   PRTSTR
  153.     LD     DE,(CMPRMP)    ; REPRINT THE PROMPT.
  154.     CALL   PRTSTR
  155.     LD     HL,(CMDPTR)    ; GET THE POINTER INTO THE BUFFER.
  156.     LD     A,'$'        ; PUT A $ THERE FOR PRINTING.
  157.     LD     (HL),A
  158.     LD     HL,(CMCPTR)
  159.     DEC    HL        ; DECREMENT AND SAVE THE BUFFER POINTER.
  160.     LD     (CMCPTR),HL
  161.     LD     DE,CMDBUF
  162.     CALL   PRTSTR
  163.     XOR    A        ; TURN OFF THE ACTION FLAG.
  164.     LD     (CMAFLG),A
  165.     CALL    @KEY        ;get a key from the keyboard
  166.     CP    CR
  167.     JR    Z,CMCFR3
  168.     CP    FF
  169.     JR    Z,CMCFR3
  170.     CP    4
  171.     RET    M
  172.     LD    HL,(CMCPTR)
  173.     INC    HL
  174.     LD    (HL),A
  175.     INC    HL
  176.     LD    (CMCPTR),HL
  177.     CALL    CONOUT
  178.     JP     REPARS    ; REPARSE EVERYTHING.
  179. CMCFR3:    CP     FF        ; IS IT A FORM FEED?
  180.     CALL   Z,CMBLNK    ; IF SO BLANK THE SCREEN.
  181.     JP     RSKP
  182. ;    THIS ROUTINE PARSES A KEYWORD FROM THE TABLE POINTED
  183. ;    TO IN DE.  THE FORMAT OF THE TABLE IS AS FOLLOWS:
  184. ;
  185. ;    ADDR:    DB    N    ; WHERE N IS THE # OF ENTRIES IN THE TABLE.
  186. ;        DB    M    ; M IS THE SIZE OF THE KEYWORD.
  187. ;        DB    'STRING$' ; WHERE STRING IS THE KEYWORD.
  188. ;        DB    A,B    ; WHERE A & B ARE PIECES OF DATA
  189. ;                ;  TO BE RETURNED.  (MUST BE TWO OF THEM.)
  190. ;
  191. ;    THE KEYWORDS MUST BE IN ALPHABETICAL ORDER.
  192. ;**** NOTE:  THE DATA VALUE A IS RETURNED IN REGISTERS A AND E.  THE
  193. ;****    DATA VALUE B IS RETURNED IN REGISTER D.  THIS ALLOWS THE TWO DATA
  194. ;    BYTES TO BE STORED AS:
  195. ;        DW    XXX
  196. ;    AND RESULT IN A CORRECTLY FORMATTED 16-BIT VALUE IN REGISTER PAIR
  197. ;    DE.
  198. CMKEYW:    LD     (CMHLP),HL    ; SAVE THE HELP.
  199.     LD     (CMPTAB),DE    ; SAVE THE BEGINNING OF KEYWORD TAB FOR '?'.
  200.     LD     A,(DE)        ; GET THE NUMBER OF ENTRIES IN THE TABLE.
  201.     LD    B,A        ;save in B
  202.     INC    DE
  203.     LD     (CMKPTR),DE
  204.     LD     HL,(CMDPTR)    ; SAVE THE COMMAND POINTER.
  205.     LD     (CMSPTR),HL
  206. CMKEY2:    LD    A,B
  207.     OR     A        ; ANY LEFT?
  208.     RET   Z            ; IF NOT WE FAILED.
  209.     LD     HL,(CMKPTR)
  210.     LD     E,(HL)        ; GET THE LENGTH OF THE KEYWORD.
  211.     INC    HL
  212. CMKEY3:    DEC    E        ; DECREMENT THE NUMBER OF CHARS LEFT.
  213.     LD     A,E
  214.     CP     0FFH    ; HAVE WE PASSED THE END?
  215.     JP     M,CMKEY5    ; IF SO GO TO THE NEXT.
  216.     CALL   CMGTCH    ; GET A CHAR.
  217.     OR     A        ; IS IT A TERMINATER?
  218.     JP     P,CMKEY4    ; IF POSITIVE, IT IS NOT.
  219.     AND    7FH        ; TURN OFF THE MINUS BIT.
  220.     CP     '?'
  221.     JP     NZ,CMKY31
  222.     XOR    A
  223.     LD     (CMAFLG),A    ; TURN OFF THE ACTION FLAG.
  224.     LD     HL,CMCCNT    ; DECREMENT THE CHAR COUNT.
  225.     DEC    (HL)
  226. ;* MUST GO THROUGH THE KEYWORD TABLE AND PRINT THEM.
  227.     LD     DE,(CMHLP)    ; FOR NOW PRINT THE HELP TEXT.
  228.     CALL   PRTSTR
  229.     LD     DE,CMCRLF    ; PRINT A CRLF.
  230.     CALL   PRTSTR
  231.     LD     DE,(CMPRMP)    ; REPRINT THE PROMPT.
  232.     CALL   PRTSTR
  233.     LD     HL,(CMDPTR)    ; GET THE POINTER INTO THE BUFFER.
  234.     LD     A,'$'    ; PUT A $ THERE FOR PRINTING.
  235.     LD     (HL),A
  236.     LD     HL,(CMCPTR)
  237.     DEC    HL        ; DECREMENT AND SAVE THE BUFFER POINTER.
  238.     LD     (CMCPTR),HL
  239.     LD     DE,CMDBUF
  240.     CALL   PRTSTR
  241.     JP     REPARS    ; REPARSE EVERYTHING.
  242. CMKY31:    CP     ESC        ; IS IT AN ESCAPE?
  243.     JP     NZ,CMKY35
  244.     XOR    A
  245.     LD     (CMAFLG),A    ; TURN OFF THE ACTION FLAG.
  246.     PUSH   DE
  247.     PUSH   BC
  248.     PUSH   HL
  249.     CALL   CMAMBG
  250.     JP    CMKY32
  251.     LD     A,BELL
  252.     CALL    CONOUT
  253.     LD     HL,(CMCPTR)    ; MOVE THE POINTER TO BEFORE THE ESCAPE.
  254.     DEC    HL
  255.     LD     (CMCPTR),HL
  256.     LD     (CMDPTR),HL
  257.     LD     HL,CMCCNT    ; GET THE CHAR COUNT.
  258.     DEC    (HL)        ; DECREMENT IT BY ONE.
  259.     POP    HL
  260.     POP    BC
  261.     POP    DE
  262.     INC    E        ; INCREMENT THE LEFT TO PARSE CHAR COUNT.
  263.     JP     CMKEY3
  264. CMKY32:    LD     HL,(CMCPTR)    ; POINTER INTO BUFFER.
  265.     DEC    HL        ; BACKUP TO THE ESCAPE.
  266.     EX   DE,HL
  267.     POP    HL
  268.     PUSH   HL
  269. CMKY33:    LD     A,(HL)        ; GET THE NEXT CHAR.
  270.     CP     '$'        ; FINISHED?
  271.     JP     Z,CMKY34
  272.     INC    HL
  273.     EX   DE,HL
  274.     LD     (HL),A        ; MOVE IT INTO THE BUFFER.
  275.     INC    HL
  276.     EX   DE,HL
  277.     LD     A,(CMCCNT)    ; INCREMENT THE CHAR COUNT.
  278.     INC    A
  279.     LD     (CMCCNT),A
  280.     JP     CMKY33
  281. CMKY34:    LD     A,(CMCCNT)    ; GET THE CHARACTER COUNT.
  282.     INC    A        ; INCREMENT AND SAVE IT.
  283.     LD     (CMCCNT),A
  284.     EX   DE,HL               ; PUT THE COMMAND BUFFER POINTER IN HL.
  285.     LD     A,' '        ; GET A BLANK.
  286.     LD     (HL),A        ; PUT IT IN THE COMMAND BUFFER.
  287.     INC    HL        ; INCREMENT THE POINTER
  288.     LD     (CMCPTR),HL    ; SAVE THE UPDATED POINTER.
  289.     LD     (CMDPTR),HL
  290.     POP    HL
  291.     PUSH   HL
  292.     EX   DE,HL
  293.     CALL   PRTSTR    ; PRINT THE REST OF THE KEYWORD.
  294.     LD     A,' '
  295.     CALL    CONOUT
  296.     POP    HL
  297.     POP    BC
  298.     POP    DE
  299.     JP     CMKY37
  300. CMKY35:    PUSH   HL
  301.     PUSH   DE
  302.     CALL   CMAMBG
  303.     JP    CMKY36
  304.     LD    DE,CMER01
  305.     CALL   PRTSTR    ; SAY ITS AMBIGUOUS.
  306.     JP     PRSERR    ; GIVE UP.
  307. CMKY36:    POP    DE
  308.     POP    HL
  309. CMKY37:    INC    E        ; ADD ONE INCASE IT IS NEGATIVE.
  310.     LD     D,0
  311.     ADD    HL,DE        ; INCREMENT PAST THE KEYWORD.
  312.     INC    HL        ; PAST THE $.
  313.     LD     E,(HL)        ; GET THE DATA.
  314.     INC    HL
  315.     LD     D,(HL)
  316.     LD     A,E
  317.     JP     RSKP
  318. CMKEY4:    CP     'a'        ; IS IT LESS THAN A?
  319.     JR     C,CMKY41    ; IF SO DON'T CAPITALIZE IT.
  320.     CP     'z'    ; IS IT MORE THAN Z?
  321.     JR     NC,CMKY41    ; IF SO DON'T CAPITALIZE IT.
  322.     AND    137O    ; CAPITALIZE IT.
  323. CMKY41:    LD     D,(HL)        ; GET THE NEXT CHAR OF THE KEYWORD.
  324.     INC    HL
  325.     CP     D        ; MATCH?
  326.     JP     Z,CMKEY3    ; IF SO GET THE NEXT LETTER.
  327. CMKEY5:    LD     D,0
  328.     LD     A,E        ; GET THE NUMBER OF CHARS LEFT.
  329.     OR     A        ; IS IT NEGATIVE?
  330.     JP     P,CMKY51
  331.     LD     D,0FFH    ; IF SO, SIGN EXTEND.
  332. CMKY51:    ADD    HL,DE        ; INCREMENT PAST THE KEYWORD.
  333.     LD     DE,0003H    ; PLUS THE $ AND DATA.
  334.     ADD    HL,DE
  335.     LD     (CMKPTR),HL
  336.     DEC    B        ; DECREMENT THE NUMBER OF ENTRIES LEFT.
  337.     LD     HL,(CMSPTR)    ; GET THE OLD CMDPTR.
  338.     LD     (CMDPTR),HL    ; RESTORE IT.
  339. ;* CHECK SO WE DON'T PASS IT.
  340.     JP     CMKEY2    ; GO CHECK THE NEXT KEYWORD.
  341. CMAMBG:    DEC    B        ; DECREMENT THE NUMBER OF ENTRIES LEFT.
  342.     RET   M            ; IF NONE LEFT THEN IT IS NOT AMBIGUOUS.
  343.     INC    E        ; THIS IS OFF BY ONE; ADJUST.
  344.     LD     C,E        ; SAVE THE CHAR COUNT.
  345.     LD     A,E
  346.     OR     A        ; ANY CHARS LEFT?
  347.     RET   Z            ; NO, IT CAN'T BE AMBIGUOUS.
  348.     LD     D,0
  349.     ADD    HL,DE        ; INCREMENT PAST THE KEYWORD.
  350.     LD     E,3        ; PLUS THE $ AND DATA.
  351.     ADD    HL,DE
  352.     LD     B,(HL)        ; GET THE LENGTH OF THE KEYWORD.
  353.     INC    HL
  354.     EX   DE,HL
  355.     LD     HL,(CMKPTR)    ; GET POINTER TO KEYWORD ENTRY.
  356.     LD     A,(HL)        ; GET THE LENGTH OF THE KEYWORD.
  357.     SUB    C        ; SUBTRACT HOW MANY LEFT.
  358.     LD     C,A        ; SAVE THE COUNT.
  359.     CP     B
  360.     JP     Z,CMAMB0
  361.     RET   P            ; IF LARGER THAN THE NEW WORD THEN NOT AMB.
  362. CMAMB0:    LD     HL,(CMSPTR)    ; GET THE POINTER TO WHAT PARSED.
  363. CMAMB1:    DEC    C        ; DECREMENT THE COUNT.
  364.     JP     M,RSKP        ; IF WE ARE DONE THEN IT IS AMBIGUOUS.
  365.     EX   DE,HL               ; EXCHANGE THE POINTERS.
  366.     LD     B,(HL)        ; GET THE NEXT CHAR OF THE KEYWORD
  367.     INC    HL
  368.     EX   DE,HL               ; EXCHANGE THE POINTERS.
  369.     LD     A,(HL)        ; GET THE NEXT PARSED CHAR.
  370.     INC    HL
  371.     CP     'a'        ; IS IT LESS THAN A?
  372.     JR     C,CMAMB2    ; IF SO DON'T CAPITALIZE IT.
  373.     CP     'z'    ; IS IT MORE THAN Z?
  374.     JR     NC,CMAMB2    ; IF SO DON'T CAPITALIZE IT.
  375.     AND    137O
  376. CMAMB2:    CP     B        ; ARE THEY EQUAL?
  377.     RET   NZ             ; IF NOT THEN ITS NOT AMBIGUOUS.
  378.     JP     CMAMB1    ; CHECK THE NEXT CHAR.
  379. CMIFIL    EX    DE,HL
  380.     LD    (CMFCB),HL
  381.     EX    DE,HL
  382.     LD    HL,(CMFCB)
  383.     LD    B,50        ;number to blank
  384. CMIFI0:    LD     (HL),' '            ; BLANK THE FCB.
  385.     INC    HL
  386.     DJNZ    CMIFI0
  387. CMIFI1:    LD    HL,(CMDPTR)    ;GET COMMAND FCB
  388.     CALL    @FSPEC
  389.     JR    Z,CMIFI2
  390.     LD     DE,CMER02
  391.     CALL   PRTSTR
  392.     JP    PRSERR
  393. CMIFI2:    LD    (CMDPTR),HL
  394.     JP    RSKP
  395. CMOFIL:    JP    CMIFIL
  396. CMINBF:    PUSH   AF
  397.     PUSH   DE
  398.     PUSH   HL
  399.     LD     A,(CMAFLG)    ; IS THE ACTION CHAR FLAG SET?
  400.     OR     A
  401.     JP     NZ,CMINB9    ; IF SO GET NO MORE CHARS.
  402.     LD    HL,(CMCPTR)
  403.     LD    DE,CMFCB    ;END OF BUFFER
  404.     XOR    A
  405.     SBC    HL,DE
  406.     LD    B,L        ;size of cmdbuf
  407.     LD    HL,(CMCPTR)
  408.     CALL    @KEYIN        ;rom lineinput routine
  409.     JP    C,PRSERR    ;action if <BREAK> typed
  410.     LD    A,B
  411.     LD    (CMCCNT),A
  412.     OR    A
  413.     JP      Z,PRSERR    ; IF NOT, JUST START OVER.
  414.     LD    HL,(CMCPTR)
  415.     LD    E,B
  416.     LD    D,0
  417.     ADD    HL,DE
  418.     LD    (CMCPTR),HL    ;update pointer
  419. CMINB6:    LD     A,0FFH    ; SET THE ACTION FLAG.
  420.     LD     (CMAFLG),A
  421. CMINB9:    POP    HL
  422.     POP    DE
  423.     POP    AF
  424.     RET
  425. CMGTCH:    PUSH   HL
  426.     PUSH   BC
  427. CMGTC1:    LD     A,(CMAFLG)
  428.     OR     A        ; IS IT SET.
  429.     CALL   Z,CMINBF    ; IF THE ACTION CHAR FLAG IS NOT SET GET MORE.
  430.     LD     HL,(CMDPTR)    ; GET A POINTER INTO THE BUFFER.
  431.     LD     A,(HL)        ; GET THE NEXT CHAR.
  432.     INC    HL
  433.     LD     (CMDPTR),HL
  434.     CP     ' '            ; IS IT A SPACE?
  435.     JP     Z,CMGTC2
  436.     CP     TAB        ; OR A TAB?
  437.     JP     NZ,CMGTC3
  438. CMGTC2:    LD     A,(CMSFLG)    ; GET THE SPACE FLAG.
  439.     OR     A        ; WAS THE LAST CHAR A SPACE?
  440.     JP     NZ,CMGTC1    ; YES, GET ANOTHER CHAR.
  441.     LD     A,0FFH    ; SET THE SPACE FLAG.
  442.     LD     (CMSFLG),A
  443.     LD     A,' '
  444.     POP    BC
  445.     POP    HL
  446.     JP     CMGTC5
  447. CMGTC3:    PUSH   AF
  448.     XOR    A
  449.     LD     (CMSFLG),A    ; ZERO THE SPACE FLAG.
  450.     POP    AF
  451.     POP    BC
  452.     POP    HL
  453.     CP     ESC
  454.     JP     Z,CMGTC5
  455.     CP     '?'        ; IS THE USER CURIOUS?
  456.     JP     Z,CMGTC4
  457.     CP     CR
  458.     JP     Z,CMGTC4
  459.     CP     LF
  460.     JP     Z,CMGTC4
  461.     CP     FF
  462.     RET   NZ             ; NOT AN ACTION CHAR, JUST RETURN.
  463. CMGTC4:    PUSH   HL
  464.     LD     HL,(CMDPTR)
  465.     DEC    HL
  466.     LD     (CMDPTR),HL
  467.     POP    HL
  468. CMGTC5:    OR     80H        ; MAKE THE CHAR NEGATIVE TO INDICATE IT IS
  469.     RET                ;  A TERMINATOR.
  470.