992 lines
28 KiB
Plaintext
992 lines
28 KiB
Plaintext
*=================================
|
|
* OUTPUT HANDLER 2.
|
|
* (IGNORE NON-DOS COMMAND.)
|
|
*=================================
|
|
|
|
OPUTHDL2 CMP #$8D ;<CR>?
|
|
BNE DSPLYALL ;NO - (WAS AN "RH BRACKETT"?)
|
|
SET2EVAL LDX #0 ;SET CONDITION0 - EVALUATE START
|
|
STX OPUTCOND ;OF LINE.
|
|
JMP DSPLYALL ;GO DISPLAY CHAR UNCONDITIONALLY.
|
|
|
|
|
|
*=================================
|
|
* OUTPUT HANDLER 3.
|
|
* (PROCESS INPUT INFO.)
|
|
*=================================
|
|
|
|
OPUTHDL3 LDX #0 ;SET CONDITION 0 WHEN INPUT ENDS.
|
|
STX OPUTCOND
|
|
CMP #$8D ;<CR>?
|
|
BEQ ASUMIMED ;YES.
|
|
|
|
|
|
TESTEXEC LDA EXECFLAG ;ARE WE EXECING?
|
|
BEQ DSPLYALL ;NO.
|
|
BNE DSPLYINP ;YES. EXECFLAG CONTAINS THE 1RST
|
|
;CHR OF NAME OF THE EXEC FILE.
|
|
|
|
ASUMIMED PHA ;SAVE CHAR ON STK.
|
|
SEC ;(C)=1, DFLT, ASSUME IMMED MODE.
|
|
LDA EXECFLAG ;ARE WE EXECING?
|
|
BNE TESTMODE ;BRANCH IF EXECING.
|
|
JSR CKBSCRUN ;NOT EXECING, SO SEE IF BASIC IS
|
|
;RUNNING A PRGM OR NOT.
|
|
;(C) = 0, EITHER BASIC RUNNING.
|
|
;(C) = 1 IF IMMEDIATE.
|
|
TESTMODE PLA ;RETRIEVE CHAR FROM STK.
|
|
BCC TESTEXEC ;BASIC RUNNING, DSPLY INPUT & XIT
|
|
|
|
* EXECING OR IN IMMEDIATE MODE
|
|
* (CAUSE (C) = 1).
|
|
|
|
LDX XSAVED ;RETRIEVE (X).
|
|
JMP PUTINBUF ;GO PUT CHR IN INPUT BUF (COND 1)
|
|
|
|
|
|
*=================================
|
|
* OUTPUT HANDLER 4.
|
|
* (WRITING DATA.)
|
|
*=================================
|
|
|
|
OPUTHDL4 CMP #$8D ;<CR>?
|
|
BNE CMWRTBYT ;NO.
|
|
LDA #5 ;SET CONDITION 5.
|
|
STA OPUTCOND
|
|
CMWRTBYT JSR WRITEXT ;GO WRITE DATA BYTE.
|
|
JMP DSPLYOUT ;DISPLAY OUTPUT CONDITIONALLY.
|
|
|
|
|
|
*===================================
|
|
* OUTPUT HANDLER 5.
|
|
* (EVALUATE START OF DATA TO WRITE)
|
|
*===================================
|
|
|
|
OPUTHDL5 CMP DCTRLCHR ;IS CHAR = DOS'S CTRL CHAR?
|
|
;************* NOTE ************
|
|
;* DOS'S CTRL CHAR CANCELS THE *
|
|
;* WRITE MODE. *
|
|
;*******************************
|
|
|
|
BEQ OPUTHDL0 ;YES - SO GO TO CONDITION 0.
|
|
CMP #$8A ;IS CHAR AN <LF>?
|
|
BEQ CMWRTBYT ;YES -GO WRITE IT, STAY IN COND 5
|
|
LDX #4 ;NO -RESET TO CONDITION4 - SIGNAL
|
|
STX OPUTCOND ;WANT TO WRITE ANOTHER LINE.
|
|
BNE OPUTHDL4 ;ALWAYS.
|
|
|
|
|
|
*=================================
|
|
* OUTPUT HANDLER 6.
|
|
* (SKIP THE QUESTION MARK PROMPT.)
|
|
*=================================
|
|
|
|
OPUTHDL6 LDA #0 ;SET CONDITION 0.
|
|
STA OPUTCOND
|
|
BEQ DSPLYINP ;ALWAYS.
|
|
;GO CONDITIONALLY DISPLAY INPUT.
|
|
|
|
|
|
*=================================
|
|
* FINISH OFF THE RUN COMMAND
|
|
* (BECAUSE IT WAS INTERRUPTED TO
|
|
* DO A LOAD.)
|
|
*=================================
|
|
|
|
FINSHRUN LDA #0 ;ZERO OUT THE RUN INTERRUPT FLAG.
|
|
STA RUNTRUPT
|
|
JSR INITIOHK ;RESET I/O HOOKS 2 PT AT DOS.
|
|
JMP RUNFPINT ;JUMP BACK INTO THE RUN COMMAND
|
|
;TO FINISH IT OFF.
|
|
;************* NOTE *************
|
|
;* THE STACK WAS RESET SO WE *
|
|
;* RETURN AT THE CORRECT LEVEL. *
|
|
;********************************
|
|
|
|
|
|
*======================================
|
|
* COMMON ROUT'N TO FINISH OFF MOST DOS
|
|
* CMDS. THE WRITE & READ CMD HNDLRS
|
|
* RTN HERE. CMDWRITE ($A510) SETS
|
|
* OPUTCOND=5 BEFORE RETURNING.
|
|
* CMDREAD ($A51B) RTNS WITH CONDNFLG=1.
|
|
*======================================
|
|
|
|
FINSHCMD LDA BUF200 ;GET FIRST CHAR IN BUF.
|
|
CMP DCTRLCHR ;WAS CMD DONE VIA DOS'S CTRL CHR?
|
|
BEQ DSPLYCMD ;YES.
|
|
|
|
|
|
* CANCEL CMD BY REPLACING THE CHAR
|
|
* WITH A <CR> & THEN FALL THRU TO
|
|
* CONTINUE THE EXIT SEQUENCE.
|
|
|
|
LDA #$8D ;<CR>
|
|
STA BUF200 ;SET 200: 8D.
|
|
LDX #0 ;SET INDEX TO START OF INPUT BUF.
|
|
STX XSAVED
|
|
|
|
|
|
*---------------------------------------
|
|
* DISPLAY CHARACTER OUPUT CONDITIONALLY.
|
|
* (THAT IS, PREPARE TO SEND THE CHAR
|
|
* TO THE OUTPUT DEVICE.)
|
|
*---------------------------------------
|
|
|
|
DSPLYCMD LDA #%01000000 ;SET BIT6 TO SEE IF USING "MON C"
|
|
BNE DSPLYCHR ;ALWAYS.
|
|
DSPLYOUT LDA #%00010000 ;SET BIT4 TO SEE IF USING "MON O"
|
|
BNE DSPLYCHR ;ALWAYS.
|
|
DSPLYINP LDA #%00100000 ;SET BIT5 TO SEE IF USING "MON I"
|
|
DSPLYCHR AND CIOCUMUL ;TEST FLAG: SEE IF SHOULD DSPLY.
|
|
BEQ DOSEXIT ;NO DISPLAY -SPECIFIC BIT WAS OFF
|
|
;MON/NOMON CLR/SET SPECIFIC BITS.
|
|
|
|
|
|
*---------------------------------
|
|
* DISPLAY THE CHARACTER.
|
|
*---------------------------------
|
|
|
|
DSPLYALL JSR RESTOREG ;RESTORE (A), (Y) & (X) REGS.
|
|
JSR GODSPLY ;OUTPUT CHR VIA TRU OUTPUT HNDLR
|
|
STA ASAVED ;SAVE (A), (Y) & (X) REGS.
|
|
STY YSAVED
|
|
STX XSAVED
|
|
|
|
|
|
*=================================
|
|
* ROUTINE TO EXIT DOS.
|
|
* POINT THE I/O HKS AT DOS AND
|
|
* RESET THE STACK POINTER.
|
|
*---------------------------------
|
|
|
|
DOSEXIT JSR INITIOHK ;RESET I/O HKS TO POINT TO DOS.
|
|
LDX STKSAVED ;RETRIEVE SAVED STACK POINTER.
|
|
TXS
|
|
RESTOREG LDA ASAVED ;RESTORE (A), (Y) & (X) REGS.
|
|
LDY YSAVED
|
|
LDX XSAVED
|
|
SEC ;WHY?????
|
|
RTS ;************ NOTE **************
|
|
;* IF THIS RTS IS ENCOUNTERED *
|
|
;* VIA A FALL THRU FROM DOSEXIT,*
|
|
;* THEN RTN TO THE ROUTINE THAT *
|
|
;* CALLED THE ROUTINE THAT *
|
|
;* CONTAINED THE "JSR PREP4DOS" *
|
|
;* INSTRUCTION. *
|
|
;********************************
|
|
|
|
|
|
*=================================
|
|
* CHARACTER OUTPUT HANDLER.
|
|
*=================================
|
|
|
|
GODSPLY JMP (CSW) ;USUALLY POINTS 2 THE TRUE OUTPUT
|
|
;HANDLER (COUT1, $FDF0 IF SCRN).
|
|
CRVIADOS LDA #$8D ;<CR>.
|
|
JMP GODSPLY ;USUALLY PRINTS A <CR> THRU THE
|
|
;OUTPUT HANDLER (COUT1). HOWEVER,
|
|
;WHEN ACCESSED BY RUNFPINT($A4DC)
|
|
;DURING A COLDSTART, GOES INTO
|
|
;DOS'S OUTPUT INTERCEPT ROUTINE
|
|
;(OPUTINCP, $9EBD).
|
|
|
|
|
|
*=================================
|
|
* DOS'S COMMAND PARSING ROUTINE.
|
|
*=================================
|
|
|
|
PARSECMD LDY #$FF ;INITIALIZE INDEX TO CMD TXT TBL.
|
|
STY NDX2CMD
|
|
INY ;(Y) = 0.
|
|
STY NEXTCMD ;SIGNAL NO PENDING COMMAND FOR
|
|
;NEXT TIME AROUND.
|
|
GETCHR1 INC NDX2CMD ;INDEX TO COMMAND TEXT TABLE.
|
|
;(0 ON ENTRY.)
|
|
LDX #0 ;INITIALIZE INDEX TO INPUT CHARS.
|
|
PHP ;SAVE STATUS (WITH Z=1) ON STK.
|
|
;(DFLT STATUS, ASSUME CHRS MTCH.)
|
|
LDA BUF200,X ;GET FIRST CHAR IN INPUT BUFFER.
|
|
CMP DCTRLCHR ;IF IT IS NOT DOS'S CTRL CHAR,
|
|
BNE SAVLINDX ;SET LINE INDEX TO 0. IF IT IS
|
|
INX ;DOS'S CTRL CHAR, SET INDEX TO 1
|
|
;SO SKIP CTRL CHAR.
|
|
|
|
* DOES THE INPUT CHAR EQUAL A CHAR
|
|
* IN DOS'S CMD TEXT TABLE (CMDTXTBL)?
|
|
* (NOTE: LAST CHAR IN @ CMD IS NEGATIVE
|
|
* ASCII, REST OF CHARS IN A GIVEN CMD
|
|
* ARE POSITIVE ACSII.)
|
|
|
|
SAVLINDX STX NDX2INBF ;SAVE INDEX TO INPUT BUF.
|
|
INVSCMD JSR PURGECMD ;GET CHAR FROM INPUT BUFFER
|
|
;(IGNORE SPACES).
|
|
AND #$7F ;STRIP HI BIT OFF OF CHAR.
|
|
EOR CMDTXTBL,Y ;DOES INPUT CHAR MATCH A CMD CHR?
|
|
;IF POS INPUT CHAR/POS ASCII CMD
|
|
;CHAR MATCH, THEN (A) = 0.
|
|
;IF POS INPUT CHR / NEG ASCII CMD
|
|
;CHAR MATCH, THEN (A) = $80.
|
|
INY ;KICK UP INDEX TO NEXT CHAR IN
|
|
;THE COMMAND TEXT TABLE.
|
|
ASL ;IF POS/POS MATCH (A)=0 & (C)=0.
|
|
;IF POS/NEG MTCH (A)=$80 & (C)=1.
|
|
BEQ CKIFCHRS ;CHAR MATCHED SO GO CHK CARRY.
|
|
|
|
* INPUT CHARS < > TEXT CMD CHAR.
|
|
|
|
PLA ;PULL SAVED STATUS OFF STK TO CLR
|
|
;Z-FLG (CAUSE IF SAVED STATUS
|
|
;HAD (Z) OR (C) = 1, THEN NEW (A)
|
|
;WILL HAVE AT LEAST 1 BIT SET SO
|
|
;THEN (A) < > 0.)
|
|
PHP ;PUSH STATUS ON STK (WITH Z-FLAG
|
|
;CLR & (C) CONDITIONED AS PER
|
|
;ABOVE "ASL" INSTRUCTION.
|
|
|
|
* SEE IF THER ARE ANY MORE CHARS TO
|
|
* CHECK IN THE TEXT OF A GIVEN CMD.
|
|
|
|
CKIFCHRS BCC INVSCMD ;IF (C)=0, MORE CHARS TO CHK IN
|
|
;GIVEN CMD LISTED IN TABLE.
|
|
;IF (C)=1, CHKD LAST CHR IN TBL.
|
|
|
|
* FINISHED CHECKING TEXT
|
|
* OF A PARTICULAR COMMAND.
|
|
|
|
PLP ;GET STATUS OFF STACK.
|
|
|
|
* DID COMMAND MATCH?
|
|
|
|
BEQ PRPDOCMD ;IF LAST CHR MATCHED, THEN ENTIRE
|
|
;CMD MATCHED SO GO PROCESS CMD.
|
|
|
|
* CHECK IF SEARCHED ENTIRE TABLE.
|
|
|
|
LDA CMDTXTBL,Y ;LAST CHAR DIDN'T MATCH, SO NOT
|
|
BNE GETCHR1 ;CORRECT CMD. THERE4, GO CHK IF
|
|
;NEXT CHAR BYTE IN TABLE IS $00.
|
|
;IF NOT $00, GO CHK REMAINING
|
|
;CMDS IN TBL. IF IT IS $00, THEN
|
|
;DONE ENTIRE TBL & NO CMDS MTCHD.
|
|
|
|
* EITHER AT END OF TABLE AND NO
|
|
* CMDS MATCHED OR ELSE DETECTED A
|
|
* BSAVE CMD WITH NO ACCOMPANYING
|
|
* A- OR L- PARAMETERS.
|
|
|
|
* CHECK IF DOS'S CTRL CHAR WAS USED.
|
|
|
|
CKIFCTRL LDA BUF200 ;IS 1RST CHAR IN THE INPUT BUFFER
|
|
CMP DCTRLCHR ;EQUAL TO DOS'S CTRL CHAR?
|
|
BEQ CHKIFCR ;YES.
|
|
JMP DSPLYALL ;NO -GO DSPLY CHR & THEN XIT DOS.
|
|
|
|
* WAS DOS'S CTRL CHAR THE ONLY CHAR ON LINE?
|
|
|
|
CHKIFCR LDA BUF200+1 ;GET 2ND BYTE IN INPUT BUFFER.
|
|
CMP #$8D ;WAS IT A <CR>?
|
|
BNE PRSYNERR ;NO -NOT SIMPLY DEALING WITH CMD
|
|
;CANCELLING DOS CTRL CHR AND <CR>
|
|
;SO GO ISSUE A SYNTAX-ERROR MSG.
|
|
JSR RESTAT0 ;YES - SET CONDITION 0.
|
|
JMP DSPLYCMD ;GO DISPLAY <CR>.
|
|
PRSYNERR JMP SYNTXERR ;EITHER A CTRL CHR DENOTED THAT A
|
|
;DOS CMD WAS WANTED & NO MATCHING
|
|
;CMD WAS FOUND (ELSE DETECTED A
|
|
;BSAVE CMD WITH NO A- OR L-PARMS)
|
|
;SO GO GIVE DOS'S SYNTAX ERR MSG.
|
|
|
|
|
|
*========================================
|
|
* PREPARE TO EXECUTE THE DOS COMMAND.
|
|
* ON ENTRY - A DOS CMD WAS PARSED.
|
|
* - NDX2CMD = COMMAND CODE.
|
|
* - I/O HKS PT TO TRUE HANDLERS.
|
|
* NOTE THAT THIS ROUTINE MAKES EXTENSIVE
|
|
* USE OF A TABLE (CMDATTRB, $A909-$A940)
|
|
* WHICH CONTAINS AN ENCODED LIST OF THE
|
|
* ATTRIBUTES ASSOCIATED WITH @ COMMAND.
|
|
*========================================
|
|
|
|
PRPDOCMD ASL NDX2CMD ;DOUBLE INDEX CAUSE 2 BYTES/ADDR
|
|
LDY NDX2CMD ;IN TABLE OF DOS CMD ENTRY PTS.
|
|
JSR CKBSCRUN ;CHECK IF BASIC IS RUNNING A PGM:
|
|
BCC CHKIFRUN ; (C)=0= BASIC RUNNING.
|
|
; (C)=1= BASIC NOT RUNNING.
|
|
|
|
* USING IMMEDIATE MODE, SO NOW CHK
|
|
* IF CMD IS LEGAL IN THAT MODE.
|
|
|
|
IMMED LDA #%00000010 ;CHK BIT1 OF CMDATTRB TO SEE IF
|
|
AND CMDATTRB,Y ;CMD IS LEGAL IN THAT MODE.
|
|
BEQ CHKIFRUN ;BRANCH IF LEGAL.
|
|
NODIRCMD LDA #15 ;SET RETURN CODE TO SIGNAL THAT
|
|
JMP ERRHNDLR ;WE GOT A NOT-DIRECT-COMMAND ERR.
|
|
|
|
* RUNNING PROGRAM OR ELSE COMMAND
|
|
* COMPLIES WITH IMMEDIATE MODE.
|
|
|
|
CHKIFRUN CPY #6 ;CHECK TO SEE IF CMD WAS A "RUN".
|
|
BNE TST4NAME ;BRANCH IF NOT.
|
|
STY PROMPT ;PUT AN $06 IN PROMPT IF COMMAND
|
|
;WAS A "RUN".
|
|
|
|
* CHECK TO SEE IF A FILENAME
|
|
* IS APPLICABLE TO THE COMMAND.
|
|
|
|
TST4NAME LDA #%00100000 ;BIT5 = 1 IF FILENAME APPLICABLE.
|
|
AND CMDATTRB,Y
|
|
BEQ FNOTAPPL ;BRANCH IF NAME NOT APPLICABLE.
|
|
;(EX. CMDS: CATALOG, PR#, IN#,
|
|
;MON, NOMON, MAXFILES, FP & INT.)
|
|
|
|
* FILENAME APPLICABLE TO CMD ISSUED
|
|
* SO BLANK OUT FILENAME BUFFERS IN
|
|
* ANTICIPATION OF RECEIVING NAME.
|
|
|
|
FNXPCTD JSR BLNKFNBF ;BLANK BOTH 1RST & 2ND NAME BUFS.
|
|
PHP ;SAVE STATUS (Z-FLAG=1) ON STK.
|
|
;NOTE: Z-FLAG USED TO SIGNAL IF
|
|
; DEALING WITH PRIMARY OR
|
|
; SECONDARY NAME BUFFERS.
|
|
FNAMCHR1 JSR PURGECMD ;GET 1RST CHAR IN NAME. (IGNORE
|
|
;LEADING SPACES.)
|
|
BEQ DONEFN ;GOT "," OR <CR> - CHK IF DONE
|
|
;(CAUSE THESE NOT LEGAL 4 NAME).
|
|
|
|
* CHK IF CHAR IS LEGAL TENDER FOR NAME.
|
|
* (KNOW IT WASN'T A <SPC>, "," OR <CR>
|
|
* BUT IT STILL MAY NOT BE LEGAL.)
|
|
|
|
ASL ;(C) = HI BIT OF CHAR.
|
|
BCC LGLFNCHR ;IF INV OR FLSH, OK FOR NAME.
|
|
;BUT, NOTE THAT THEY CAN ONLY BE
|
|
;POKED INTO INPUT BUF FROM A
|
|
;RUNNING PRGM. (THIS TECHNIQUE IS
|
|
;USED IN MANY PROTECT'N SCHEMES.)
|
|
BMI LGLFNCHR ;ACTUALLY TESTING BIT6 CAUSE JUST
|
|
;DID AN "ASL".IF BYTE IS 11XXXXXX
|
|
;(IE. $C0, NORMAL "@" OR GREATER)
|
|
;CHAR IS LEGAL FOR NAME.
|
|
JMP CKIFCTRL ;GOT ILLEGAL NAME CHAR SO GO DO A
|
|
;FEW MORE CHKS ON CTRL CHRS, ETC
|
|
;& EXIT DOS. (WAS IT A CTRL CHAR,
|
|
;NUMBER OR ONE OF THE FOLLOWING
|
|
;NORMAL CHARS:SPC, !, ", #, $, %,
|
|
;&, ', (, ), *, +, COMMA, -, ., /
|
|
;:, ;, <, -, >, OR ?
|
|
|
|
* CHAR IS LEGAL TENDER FOR NAME.
|
|
|
|
LGLFNCHR ROR ;RESTORE NAME CHAR.
|
|
JMP SVFNCHAR ;SAVE IT IN 1RST OR 2ND NAME BUF.
|
|
|
|
* PROCESS REST OF CHARS.
|
|
|
|
NCHR2ETC JSR CMDCHAR ;GET 2ND & SUB'QUENT CHRS IN NAME
|
|
BEQ DONEFN ;GOT A <CR> OR "," SO GO CHK IF
|
|
;JUST FINISHED SECOND FILENAME.
|
|
|
|
* PUT CHARS IN FILENAME BUF.
|
|
|
|
SVFNCHAR STA PRIMFNBF,Y ;(Y)=OFFSET FRM PRIMARY NAME BUF.
|
|
INY
|
|
CPY #60 ;TOTAL OF 60 CHARS IN BOTH BUFS.
|
|
BCC NCHR2ETC ;HAVEN'T HIT ",", EOL MARKER (IE.
|
|
;<CR>) OR DONE ALL 60 CHARS YET.
|
|
|
|
* DONE ALL 60 CHARS SO IGNORE REST
|
|
* OF CHARS UNTIL GET "," OR <CR>.
|
|
|
|
PURGEFN JSR CMDCHAR ;GET NEXT CHAR.
|
|
BNE PURGEFN ;NOT $00 YET SO GO GET NXT CHAR.
|
|
|
|
* JUST FINISHED NAME, SO CHK IF IT
|
|
* WAS FIRST OR SECOND FILENAME.
|
|
|
|
DONEFN PLP ;RETRIEVE STATUS FROM STACK.
|
|
BNE CKFN2LGL ;Z-FLAG CLR SO DONE 2ND FILENAME.
|
|
|
|
* JUST FINISHED FIRST NAME, SO SEE
|
|
* IF A SECOND FILENAME IS REQUIRED.
|
|
* (THAT IS, ARE WE DEALING WITH
|
|
* THE "RENAME" COMMAND?)
|
|
|
|
FINFIRST LDY NDX2CMD ;GET INDEX ASSOC WITH CMD ISSUED.
|
|
LDA #%00010000 ;CHK BIT 4 OF CMDATTRB TO SEE IF
|
|
AND CMDATTRB,Y ;2ND NAME REQUIRED (IE RENAME ?).
|
|
BEQ CKFN1LGL ;2ND NAME NOT APPLICABLE SO GO
|
|
;& CHK 1RST NAME BUF.
|
|
|
|
* SECONDARY FILENAME APPLICABLE SO
|
|
* DEALING WITH "RENAME" COMMAND.
|
|
|
|
LDY #30 ;(Y) = INDEX 2 START OF 2ND NAME.
|
|
PHP ;PUT STATUS ON STK (Z-FLG = 0) TO
|
|
BNE FNAMCHR1 ;SIGNAL DEALING WITH 2ND NAME &
|
|
;GO BACK TO GET ITS CHARS.
|
|
;ALWAYS TAKE BRANCH.
|
|
|
|
* DONE PROCESSING ASSOC WITH SECONDARY
|
|
* FILENAME SO NOW CHK IF ANY OF THESE
|
|
* CHARS WERE LEGAL & THERE4 STUCK IN
|
|
* THE SECONDARY FILENAME BUFFER.
|
|
|
|
CKFN2LGL LDA SCNDFNBF ;CHK 1RST BYTE IN SECONDARY.
|
|
CMP #" " ;IF IT IS A <SPC>, THEN NO CHARS
|
|
BEQ GOXITDOS ;WERE GOOD & SO A 2ND NAME WAS
|
|
;REQUIRED BUT NOT ISSUED,SO EXIT.
|
|
|
|
* ONLY PRIMARY FILENAME APPLICABLE
|
|
* SO CHK IF WE GOT ANY CHRS THAT
|
|
* WERE LEGAL & THERE4 PUT IN THE
|
|
* PRIMARY FILENAME BUFFER.
|
|
|
|
CKFN1LGL LDA PRIMFNBF ;IF 1RST CHAR IN BUF IS A <SPC>,
|
|
CMP #" " ;A LEGAL PRIMARY FILENAME WAS NOT
|
|
;ISSUED SO FALL THRU TO SEE IF IT
|
|
;WAS REQUIRED OR OPTIONAL.
|
|
BNE DFLTPRSD ;BRANCH IF GOT PRIMARY FILENAME.
|
|
|
|
* PRIMARY FILENAME WAS NOT ISSUED
|
|
* SO CHK IF IT WAS REQUIRED OR OPTIONAL.
|
|
* (IE. WAS CMD A CLOSE, LOAD, SAVE OR RUN?)
|
|
|
|
LDY NDX2CMD ;GET INDEX ASSOC WITH CMD.
|
|
LDA #%11000000 ;CHK BITS 7 & 6 TO SEE IF A NAME
|
|
AND CMDATTRB,Y ;IS REQUIRED.
|
|
BEQ GOXITDOS ;A PRIMARY NAME IS REQUIRED BUT
|
|
;WAS NOT ISSUED, SO GO EXIT DOS.
|
|
|
|
* WAS COMMAND A "CLOSE"?
|
|
|
|
BPL DFLTPRSD ;NAME WASN'T PRESENT, BUT IS NO
|
|
;BIG DEAL CAUSE IT WAS OPTIONAL.
|
|
GOXITDOS JMP CKIFCTRL ;CMD WAS LOAD, RUN OR SAVE WHICH
|
|
;CAN ALSO BE BASIC COMMANDS.
|
|
|
|
|
|
*======================================
|
|
* BLANK OUT BOTH PRIMARY ($AA75-$AA92)
|
|
* AND SECONDARY ($AA93-$AAB0) FILENAME
|
|
* BUFFERS.
|
|
*======================================
|
|
|
|
BLNKFNBF LDY #60 ;30 BYTES IN EACH BUFFER.
|
|
BLNK1RST LDA #" " ;BLANK.
|
|
STORBLNK STA PRIMFNBF-1,Y
|
|
DEY
|
|
BNE STORBLNK ;MORE BYTES TO BLANK OUT.
|
|
RTS
|
|
|
|
|
|
*===================================
|
|
* FILENAME NOT APPLICABLE TO COMMAND
|
|
* (EX. CATALOG, MON, NOMON, FP, INT,
|
|
* PR#, IN# OR MAXFILES).
|
|
*===================================
|
|
|
|
FNOTAPPL STA PRIMFNBF ;PUT A $00 IN THE FIRST BYTE OF
|
|
;THE PRIMARY FILENAME BUFFER.
|
|
;************* NOTE *************
|
|
;* ALTHOUGH THIS SEEMS LIKE A *
|
|
;* BEGNIN INSTRUCTION, IT IS *
|
|
;* IMPORTANT BECAUSE IT IS LATER*
|
|
;* USED 2 INSURE THAT A MATCHING*
|
|
;* DOS FILENAME BUF WON'T BE *
|
|
;* FOUND WHEN THE GETBUFF ROUT'N*
|
|
;* ($A764) IS EVENTUALLY USED BY*
|
|
;* THE VARIOUS DOS CMDS. AS A *
|
|
;* RESULT, THE HIGHEST NUMBERED *
|
|
;* (LOWEST IN MEMORY) FREE DOS *
|
|
;* FILENAME BUFFER WILL BE *
|
|
;* SELECTED. *
|
|
;********************************
|
|
|
|
* COMMAND DIDN'T REQUIRE A FILENAME
|
|
* SO NOW CHK & SEE IF IT EXPECTS ANY
|
|
* NUMERIC ARGUMENTS. (IE. WAS IT PR#,
|
|
* IN# OR MAXFILES CMD?)
|
|
|
|
LDA #%00001100 ;TEST BITS 2 & 3 TO SEE IF IN#,
|
|
AND CMDATTRB,Y ;PR# OR MAXFILES NUMERIC
|
|
;OPERAND IS EXPECTED.
|
|
BEQ DFLTPRSD ;BRANCH IF NOT EXPECTED.
|
|
|
|
* IN#,PR# OR MAXFILES NUMERIC
|
|
* OPERAND EXPECTED.
|
|
|
|
INPRMAX JSR CNVRTASC ;CONVERT ASCII NUMBER ARGUMENT TO
|
|
;HEX WITH RESULT IN A5L/H.
|
|
BCS TOSYNTX ;CHR NOT #, EXIT WITH SYNTAX ERR.
|
|
TAY ;(Y) = HI BYTE OF CONVERTED CHAR.
|
|
BNE ARGRNGER ;RANGE ERROR - CAUSE VALUE > 255.
|
|
CPX #17
|
|
BCS ARGRNGER ;RANGE ERROR CAUSE IF MAXFILES OR
|
|
;IN# OR PR# ARGUMENT > 16, THEN
|
|
;VALUE TOO LARGE.
|
|
|
|
* WAS COMMAND A PR# OR IN#?
|
|
|
|
LDY NDX2CMD ;CHK TO SEE IF A SLOT VALUE IS
|
|
LDA #%00001000 ;APPLICABLE TO THE COMMAND.
|
|
AND CMDATTRB,Y
|
|
BEQ MAXFMIN ;SLOT VAL NOT APPLICABLE SO MUST
|
|
;BE DEALING WITH MAXFILES.
|
|
|
|
* COMMAND WAS PR# OR IN# SO NOW CHECK
|
|
* IF SLOT VALUE IS TOO LARGE OR NOT.
|
|
* (LEGAL RANGE IS 0 TO 7.)
|
|
|
|
CPX #8 ;TOO LARGE?
|
|
BCS GOXITDOS ;YES -BAIL OUT.
|
|
BCC DFLTPRSD ;NO -SET DFLTS & CONTINUE PARSING
|
|
|
|
* CHECK MINIMUM VALUE FOR MAXFILES.
|
|
* (LEGAL RANGE IS 1 TO 16.)
|
|
|
|
MAXFMIN TXA
|
|
BNE DFLTPRSD ;NOT 0, SO OKAY.
|
|
|
|
* ARGUMENT FOR MAXFILES, SLOT, IN#
|
|
* OR PR# WERE ILLEGAL.
|
|
|
|
ARGRNGER LDA #2 ;SET RETURN CODE FOR RANGE ERROR.
|
|
JMP ERRHNDLR ;GO HANDLE THE ERROR.
|
|
|
|
TOSYNTX JMP SYNTXERR ;EXIT VIA SYNTAX ERROR.
|
|
|
|
* INITIALIZE CUMLOPTN & PARSED TABLE.
|
|
|
|
DFLTPRSD LDA #0
|
|
STA CUMLOPTN ;SET CUMLOPTN TO DEFAULT VAL OF 0
|
|
;TO ASSUME NO OPTIONS ISSUED.
|
|
STA MONPRSD ;SET DEFAULT VALS IN PARSED TBL.
|
|
STA VOLPRSD ;THAT IS ASSUME THAT:
|
|
STA LENPRSD ; - C, I, O WEREN'T ISSUED.
|
|
STA LENPRSD+1 ; - VOL # AND LENGTH ARE 0.
|
|
JSR ZEROPTCH ;SET TEMPBYT & BYTPRSD TO 0 DFLTS
|
|
LDA NDX2INBF ;IRREL, MIGHT AS WELL BE 3 "NOP"S
|
|
;(MADE OBSOLETE BY ZEROPTCH).
|
|
|
|
* DO MORE PARSING OF COMMAND LINE.
|
|
* (IGNORE ANY COMMAS OR SPACES.)
|
|
|
|
NXCMDCHR JSR PURGECMD ;GET NEXT CHAR.
|
|
BNE CHKOPTNS ;IF IT ISN'T A <CR> OR COMMA THEN
|
|
;MAYBE ITS AN OPTION, SO TAKE
|
|
;BRANCH TO CHECK IT OUT.
|
|
CMP #$8D ;WAS IT A <CR>?
|
|
BNE NXCMDCHR ;NO - SO MUST HAVE BEEN A COMMA.
|
|
;BRANCH BACK TO IGNORE COMMAS.
|
|
|
|
* GOT A <CR> (IE. EOL MARKER), SO NOW
|
|
* DONE PARSING & MUST MAKE SURE THAT
|
|
* THE CUMMULATIVE RECORD OF THE OPTIONS
|
|
* WE ENCOUNTERED IS APPLICABLE TO THE CMD.
|
|
|
|
LDX NDX2CMD
|
|
LDA CUMLOPTN ;CHK IF OPTIONS ARE LEGAL.
|
|
ORA CMDATTRB+1,X
|
|
EOR CMDATTRB+1,X
|
|
BNE GOXITDOS ;ILLEGAL SO EXIT.
|
|
|
|
* CUMMULATIVE RECORD OF OPTIONS CAN
|
|
* LEGALLY BE ASSOCIATED WITH COMMAND.
|
|
|
|
LDX TEMPBYT ;TEMPBYT = 0 AS SET IN ZEROPTCH.
|
|
BEQ TODOSCMD ;ALWAYS.
|
|
|
|
* MEANINGLESS INSTRUCTIONS (MADE
|
|
* OBSOLETE BY INCLUSION OF ZEROPTCH).
|
|
|
|
STA TEMPBYT
|
|
STX NDX2INBF
|
|
BNE NXCMDCHR
|
|
|
|
* CHECK IF CHAR IS AN OPTION.
|
|
* (IE. A, B, R, L, S, D, V, C, I, O.)
|
|
|
|
CHKOPTNS LDX #10
|
|
CKNXOPTN CMP OPTNTXT-1,X
|
|
BEQ OPTNOK ;FOUND AN OPTION.
|
|
DEX
|
|
BNE CKNXOPTN ;HAVEN'T CHKD ALL OPTIONS YET.
|
|
|
|
TOTOSYNT BEQ TOSYNTX ;COULDN'T FIND A MATCH.
|
|
;(SYNTAX ERR - CHAR NOT OPTION.)
|
|
|
|
* GOT AN OPTION SO CHK IF IT WAS
|
|
* "C", "I" OR "O". (IE. IS A
|
|
* NUMERIC ARGUMENT EXPECTED?)
|
|
|
|
OPTNOK LDA OPTNISSD-1,X
|
|
BMI CIOPTNS ;IF HI BIT=0, THEN OPTION WAS A
|
|
;"C", "I" OR "O" AND NO NUMERIC
|
|
;ARGUMENT IS NEEDED.
|
|
|
|
* UPDATE CUMLOPTN TO REFLECT
|
|
* THE LATEST OPTION.
|
|
|
|
ORA CUMLOPTN
|
|
STA CUMLOPTN
|
|
|
|
* NOW CHK IF NUMERIC ARGUMENT THAT
|
|
* WAS ISSUED WITH OPTION IS LEGAL.
|
|
|
|
DEX ;REDUCE COUNTER THAT WAS KICKED UP
|
|
;IN ANTICIPATION OF MORE CHARS
|
|
;IN THE CMDCHAR ROUTINE.
|
|
STX NDX2OPTN ;SAVE INDEX TO OPTION.
|
|
JSR CNVRTASC ;CONVERT ASCII # TO HEX.
|
|
|
|
* WAS IT A NUMERIC CHARACTER?
|
|
|
|
BCS TOSYNTX ;NO - SYNTAX ERROR.
|
|
|
|
* CHARACTER WAS NUMERIC.
|
|
|
|
LDA NDX2OPTN ;RETRIEVE INDEX TO OPTION.
|
|
ASL ;TIMES 4 CAUSE GOING TO CHK MIN
|
|
ASL ;& MAX VALS OF LEGAL RANGES ASSOC
|
|
;WITH OPTION (2 BYTES @).
|
|
TAY ;(Y) = INDEX TO LEGAL RANGE TBL.
|
|
|
|
* CHECK IF ARGUMENT IS TOO LARGE.
|
|
|
|
LDA A5L+1 ;GET HI BYTE OF ARGUMENT.
|
|
BNE CKMAXVAL ;BRANCH IF NOT 0.
|
|
LDA A5L ;HI BYTE WAS 0 SO CHK LOW BYTE.
|
|
CMP OPTNRNG,Y
|
|
BCC ARGRNGER ;RANGE ERR -ARGUMENT < MIN LEGAL.
|
|
|
|
* CHECK IF ARGUMENT < = MAX LEGAL PLUS 1.
|
|
|
|
LDA A5L+1
|
|
CKMAXVAL CMP OPTNRNG+3,Y ;CMP HI BYTE TO MAX LEGAL VAL.
|
|
BCC SVALOPTN ;LESS THAN MAX SO ARGUMENT OK.
|
|
TOARGRNG BNE ARGRNGER ;ARGUMENT > MAX LGL, SO RNG ERR.
|
|
LDA A5L ;NOW CHK IF LOW BYTE OF ARGUMENT
|
|
CMP OPTNRNG+2,Y ;COMPLIES TO MAX LEGAL LOW BYTE.
|
|
BCC SVALOPTN ;ARGUMENT IS LEGAL.
|
|
BNE TOARGRNG ;ARGUMENT IS ILLEGAL.
|
|
|
|
* SAVE THE OPTION VALUE IN THE PARSED TABLE.
|
|
|
|
SVALOPTN LDA TEMPBYT ;OBSOLETE, TEMPBYT WAS SET TO 0
|
|
BNE NXCMDCHR ;IN ZEROPTCH SO ALWAYS FALL THRU.
|
|
TYA ;(Y)-->(A)=INDEX TO OPTION RNGS.
|
|
LSR ;DIVIDE BY 2 CAUSE @ OPTION RANGE
|
|
;TABLE HAS 4 BYTES, BUT @ PARSED
|
|
;VAL ENTRY IS ONLY 2 BYTES LONG.
|
|
TAY ;PUT INDEX 2 PARSED TABLE IN (Y).
|
|
LDA A5L+1 ;STORE ARGUMENT IN PARSED TBL.
|
|
STA VOLPRSD+1,Y
|
|
LDA A5L
|
|
STA VOLPRSD,Y
|
|
|
|
* GO SEE IF ANY MORE OPTIONS ARE
|
|
* PRESENT ON THE COMMAND LINE.
|
|
|
|
TONXOPTN JMP NXCMDCHR
|
|
|
|
* OPTION WAS A "C", "I" OR "O".
|
|
|
|
CIOPTNS PHA ;PUT (A) = OPTNISSD ON STK.
|
|
LDA #%10000000 ;UPDATE CUMLOPTN TO SIGNAL THAT
|
|
ORA CUMLOPTN ;"C", "I" OR "O" OPTIONS ISSUED.
|
|
STA CUMLOPTN
|
|
PLA ;GET (A) = OPTNISSD BACK FRM STK.
|
|
AND #%01111111 ;TURN HI BIT OFF.
|
|
ORA MONPRSD ;UPDATE MONPRSD IN PARSED TABLE.
|
|
STA MONPRSD
|
|
BNE TONXOPTN ;GO SEE IF ANY MORE OPTIONS.
|
|
BEQ TOTOSYNT ;IRRELEVANT.
|
|
|
|
|
|
*=================================
|
|
* FINAL PROCESSING OF DOS COMMAND.
|
|
*=================================
|
|
|
|
TODOSCMD JSR DODOSCMD ;GO DO THE DOS COMMAND.
|
|
|
|
|
|
*---------------------------------------*
|
|
* *
|
|
* - MOST, BUT NOT ALL, DOS CMDS RTN HERE. *
|
|
* - IF AN ERROR IS ENCOUNTERED, EXECUTION *
|
|
* EXITS DOS'S ERROR HANDLER VIA RESTART *
|
|
* ($D43C) OR BASIC'S ERROR-HANDLING *
|
|
* ROUTINE (BSCERHLR, $D865). *
|
|
* - FP EXITS BACK INTO DOS'S COLDSTART *
|
|
* ROUTINE (DOSCOLD, $9D84). *
|
|
* - INT & CHAIN GO INTO INTEGER BASIC IF *
|
|
* THE INTEGER LANGUAGE IS AVAILABLE. *
|
|
* - THE WRITE & READ CMDS RETURN TO THE *
|
|
* FINSHCMD ROUTINE ($9F83) SHOWN BELOW. *
|
|
* - BLOAD RTNS TO AFTRCMD IF IT WAS NOT *
|
|
* CALLED BY THE BRUN CMD. OTHERWISE, *
|
|
* BLOAD RTNS TO THE BRUN CMD HNDLR AT *
|
|
* $A391. *
|
|
* - BRUN EXECUTES THE BINARY FILE BEFORE *
|
|
* RETURNING. IF THE BRUNED PGM PERFORMED*
|
|
* ANY INPUT OR OUTPUT, OR IF THE BINARY *
|
|
* FILE WAS BRUN WITH MON IN EFFECT, THE *
|
|
* PRGM GETS HUNG UP IN AN ININITE LOOP. *
|
|
* (SEE FORMATTED DISASSEMBLY OF THE CMD *
|
|
* PARSING & PROCESSING ROUTINES FOR *
|
|
* FURTHER DETAILS.)
|
|
* - THE LOAD CMD GOES INTO APPLESOFT (AT *
|
|
* $D4F2) TO RESET THE PRGM LINK PTRS *
|
|
* AND THEN GOES ON TO THE RESTART *
|
|
* ROUTINE ($D43C). IF THE LOAD CMD WAS *
|
|
* CALLED FROM A RUN, EXECUTION JUMPS *
|
|
* BACK INTO THE RUN CMD HNDLR AT *
|
|
* RUNFPINT ($A4DC). *
|
|
* - THE RUN CMD EXITS INTO APPLESOFT AT *
|
|
* STKINI ($D683) & EVENTUALLY RTNS TO *
|
|
* THE RESTART ROUTINE ($D43C). *
|
|
* *
|
|
*-----------------------------------------*
|
|
|
|
AFTRCMD JMP FINSHCMD
|
|
|
|
|
|
|
|
*=================================
|
|
* DO THE DOS COMMAND.
|
|
*=================================
|
|
|
|
DODOSCMD JSR RESTAT0 ;RESET CONDITION TO 0. THAT IS,
|
|
;SET CONDNFLG AND OPUTCOND = 0.
|
|
JSR CLRFMPRM ;CLEAR OUT THE FM PARAMETER LIST
|
|
;SO WE CAN CUSTOMIZE IT IN
|
|
;ACCORDANCE WITH THE SPECIFIC DOS
|
|
;COMMAND HANDLER CALLED.
|
|
LDA NDX2CMD ;GET (A) = INDEX TO COMMAND.
|
|
TAX ;(X) = INDEX 2 TBL OF ENTRY PTS.
|
|
LDA CMDTBL+1,X ;GET ADR-1 OF THE CMD'S ROUTINE &
|
|
PHA ;PUT IT ON STACK (HI BYTE 1RST).
|
|
LDA CMDTBL,X
|
|
PHA
|
|
RTS ;DO A "STK JMP" TO PROCESS CMD.
|
|
|
|
|
|
*=================================
|
|
* GET CHAR FROM INPUT BUFFER, SET
|
|
* Z-FLAG IF <CR> OR COMMA.
|
|
*=================================
|
|
|
|
CMDCHAR LDX NDX2INBF ;(X) = INDEX TO INPUT BUFFER.
|
|
LDA BUF200,X ;GET NEXT CHAR.
|
|
CMP #$8D ;IS IT A <CR>?
|
|
BEQ CMDCHRTS ;YES.
|
|
INX ;(X)=INDEX 4 NXT ANTICIPATED CHR.
|
|
STX NDX2INBF
|
|
CMP #"," ;COMMA?
|
|
CMDCHRTS RTS ;EXIT WITH Z-FLAG CONDITIONED.
|
|
;Z=1 IF CHAR IS A <CR> OR COMMA.
|
|
|
|
|
|
*========================================
|
|
* GET 1RST NON-SPACE CHAR FROM INPUT BUF.
|
|
* SET Z-FLAG IF IT IS <CR> OR ",".
|
|
*========================================
|
|
|
|
PURGECMD JSR CMDCHAR ;GET 1RST CHAR.
|
|
BEQ CMDCHRTS ;EXIT IF <CR> OR COMMA.
|
|
CMP #" " ;SPACE?
|
|
BEQ PURGECMD ;YES - IGNORE LEADING SPACES.
|
|
RTS
|
|
|
|
|
|
*=================================
|
|
* CLEAR OUT THE FM PARAMETER LIST.
|
|
* - SO WE CAN CUSTOMIZE IT IN
|
|
* ACCORANCE WITH THE SPECIFIC
|
|
* DOS COMMAND HANDLER CALLED.
|
|
*=================================
|
|
|
|
CLRFMPRM LDA #0
|
|
LDY #$16 ;22 BYTES TO ZERO OUT.
|
|
ZFMPARM STA FMPRMLST-1,Y ;STORE ZERO BYTE.
|
|
DEY ;$16 --> $01, EXIT AT $00.
|
|
BNE ZFMPARM
|
|
RTS
|
|
|
|
|
|
*======================================
|
|
* CONVERT ASCII TO HEX OR DEC.
|
|
* ON ENTRY: NDX2INBF INDEXES INPUT BUF.
|
|
* ON EXIT: A5L/H AND (X,A) = LOW/HI
|
|
* BYTES OF RESULT.
|
|
* (C) = 0 = GOOD CONVERSION.
|
|
* (C) = 1 = INVALID CHARS.
|
|
*======================================
|
|
|
|
CNVRTASC LDA #0 ;ZERO OUT LOC'S TO HOLD RESULT.
|
|
STA A5L ;LOW BYTE OF RESULT.
|
|
STA A5L+1 ;HI BYTE OF RESULT.
|
|
JSR PURGECMD ;GET 1RST NON-SPACE CHAR.
|
|
PHP ;SAVE STATUS (Z-FLAG) ON STK.
|
|
;(IF <CR> OR COMMA, Z-FLAG = 1.)
|
|
|
|
* CHK TO SEE IF WANT TO CONVERT
|
|
* ASCII TO HEX OR ASCII TO DEC.
|
|
|
|
CMP #"$" ;IS HEX SYMBOL PRESENT?
|
|
BEQ ASC2HEX ;YES - BRANCH FOR ASCII TO HEX.
|
|
|
|
|
|
*--------------------------------
|
|
* ASCII TO DEC CONVERSION WANTED.
|
|
*--------------------------------
|
|
|
|
PLP ;GET STATUS DENOTING IF CR OR ","
|
|
JMP CKIFDONE ;BEGIN DEC CONVERSION OF 1RST CHR
|
|
|
|
ASC2DEC JSR PURGECMD ;GET 2ND & SUBSEQUENT ASCII CHARS
|
|
;TO BE CONVERTED TO DECIMAL.
|
|
;(IGNORE SPACES.)
|
|
|
|
CKIFDONE BNE SUBTRASC ;BRANCH IF NOT <CR> OR COMMA.
|
|
;(ALWAYS FALL THRU IF ACCESSED FRM
|
|
;THE HEX CONVERSION ROUTINE.)
|
|
|
|
* SUCCESSFUL CONVERSION - EXIT
|
|
* WITH A5L/H AND (X,A) CONTAINING
|
|
* LOW/HI BYTES OF RESULT.
|
|
|
|
LDX A5L ;RESULT LOW.
|
|
LDA A5L+1 ;RESULT HI.
|
|
CLC ;(C)=0 TO SIGNAL GOOD CONVERSION.
|
|
RTS ;EXIT TO CALLER OF CNVRTASC.
|
|
|
|
* CHECK VALIDITY OF ASCII CHARS FOR
|
|
* REPRESENTATION OF DECIMAL NUMBERS.
|
|
|
|
SUBTRASC SEC
|
|
SBC #$B0 ;SUBTRACT ASCII "0".
|
|
BMI NOTASCII ;ERROR CAUSE < 0.
|
|
CMP #$0A ;DECIMAL 10.
|
|
BCS NOTASCII ;ERROR CAUSE > 9.
|
|
|
|
* MULTIPLY RUNNING RESULT * 10
|
|
* AND THEN ADD NEW DIGIT.
|
|
|
|
JSR DOUBLE ;GET RESULT * 2.
|
|
ADC A5L
|
|
TAX ;(X) = LOW RESULT * 2 + NEW DIGIT
|
|
LDA #0
|
|
ADC A5L+1 ;ADD (C) TO HI BYTE OF RESULT.
|
|
TAY ;(Y) = HI BYTE OF RESULT*2 + (C).
|
|
JSR DOUBLE ;(A) = RESULT * 8.
|
|
JSR DOUBLE
|
|
TXA
|
|
ADC A5L
|
|
STA A5L ;(RESULT*2+NEW DIGIT)+(RESULT*8).
|
|
TYA
|
|
ADC A5L+1 ;ADD (C) TO UPDATE HI BYTE.
|
|
STA A5L+1
|
|
BCC ASC2DEC ;BRANCH IF # <65536.
|
|
|
|
* ERROR - INVALID ASCII NUMBER.
|
|
|
|
NOTASCII SEC ;EXIT WITH (C)=1 TO SIGNAL ERROR.
|
|
RTS ;RETURN TO CALLER OF CNVRTASC.
|
|
|
|
* MULTIPLY 2-BYTE RESULT TIMES 2.
|
|
|
|
DOUBLE ASL A5L ;"ROLL" HI & LOW BYTES AS A UNIT.
|
|
ROL A5L+1 ;(PICK UP (C) IN HI BYTE.)
|
|
RTS
|
|
|
|
|
|
*---------------------------------
|
|
* CONVERT ASCII CHARS TO HEX.
|
|
*---------------------------------
|
|
|
|
ASC2HEX PLP ;THROW SAVED STATUS OFF STACK.
|
|
GETASCII JSR PURGECMD ;GET 1RST & SUBSEQUENT CHARS THAT
|
|
;OCCUR AFTER THE HEX ("$") SYMBOL
|
|
BEQ CKIFDONE ;GO EXIT IF <CR> OR COMMA.
|
|
|
|
* CHECK VALIDITY OF ASCII CHARS
|
|
* FOR CONVERSION TO HEX.
|
|
|
|
SEC
|
|
SBC #$B0 ;SUBTRACT ASCII "0".
|
|
BMI NOTASCII ;ERROR CAUSE < 0.
|
|
CMP #$0A
|
|
BCC PRP2DUBL ;VALID: 0 <--> 9.
|
|
SBC #7 ;CHK HI RANGE OF HEX #'S.
|
|
BMI NOTASCII ;ERROR CAUSE > $09 AND < $0A.
|
|
CMP #$10
|
|
BCS NOTASCII ;ERROR CAUSE > $0F.
|
|
|
|
* MOVE RESULT IN A5L/H UP A NIBBLE
|
|
* BY ROLLING IT AS A UNIT (IE. *16).
|
|
|
|
PRP2DUBL LDX #4 ;(X) = # OF TIMES TO DOUBLE UNIT.
|
|
TIMES2 JSR DOUBLE ;MULTIPLY RESULT * 2.
|
|
DEX
|
|
BNE TIMES2 ;MORE MULTIPLICATION TO DO.
|
|
|
|
* MERGE HEX REPRESENTATION OF DIGIT
|
|
* INTO LOW NIBBLE POS'N OF RESULT.
|
|
*
|
|
* NOTE BUG: NO CHK IS MADE TO TRAP
|
|
* NUMBERS > $FFFF. IF TOO MANY #'S
|
|
* ARE INPUT, ONLY THE LAST 4 DIGITS
|
|
* ARE REFLECTED IN THE RESULT.
|
|
|
|
ORA A5L
|
|
STA A5L
|
|
JMP GETASCII ;GO GET NEXT CHAR TO CONVERT.
|
|
|
|
|
|
*==================================
|
|
* PR# COMMAND HANDLER.
|
|
*==================================
|
|
|
|
* ON ENTRY, A5L/H CONTAINS THE HEX
|
|
* VALUE OF THE ARGUMENT (SLOT #)
|
|
* THAT WAS ISSUED WITH THE CMD.
|
|
* THE ARGUMENT WAS PREVIOUSLY
|
|
* SCREENED BY THE INPRMAX ($A0AA)
|
|
* ROUTINE. IF SLOT# = 0, THEN THE
|
|
* OUTPUT HOOK (CSW) POINTS 2 COUT1
|
|
* ($FDF0). OTHERWISE, CSW POINTS
|
|
* TO $CS00 (WHERE S = SLOT #).
|
|
|
|
CMDPR LDA A5L ;GET SLOT NUMBER.
|
|
JMP OUTPORT ;USE MONITOR ROM 2 SET OUTPUT HK.
|
|
;RTN 2 THE CALLER OF THE PR# CMD.
|
|
;(OFTEN RETURNS 2 AFTRCMD ($A17D)
|
|
;ASSOCIATED WITH THE COMMAND
|
|
;PARSING & PROCESSING ROUTINES.)
|
|
|
|
|
|
*=================================
|
|
* THE IN# COMMAND HANDLER.
|
|
*=================================
|
|
|
|
* ON ENTRY, A5L/H CONTAINS THE HEX
|
|
* VALUE OF THE ARGUMENT (SLOT #)
|
|
* THAT WAS ISSUED WITH THE CMD.
|
|
* THE ARGUMENT WAS PREVIOUSLY
|
|
* SCREENED BY THE INPRMAX ($A0AA)
|
|
* ROUTINE. IF SLOT# = 0, THEN THE
|
|
* INPUT HOOK (KSW) POINTS TO KEYIN
|
|
* ($FD1B). OTHERWISE, KSW POINTS
|
|
* TO $CS00 (WHERE S = SLOT #).
|
|
|
|
CMDIN LDA A5L ;GET SLOT NUMBER.
|
|
JMP INPORT ;USE MONITOR ROM TO SET INPUT HK.
|
|
;RTN 2 THE CALLER OF THE IN# CMD.
|
|
;(OFTEN RETURNS 2 AFTRCMD ($A17D)
|
|
;ASSOCIATED WITH THE COMMAND
|
|
;PARSING & PROCESSING ROUTINES.)
|
|
|