NEW AUTO 3,1 *-------------------------------------- .DA COMMAND.TABLE needed for HELP command *-------------------------------- * PARSE COMMAND LINE *-------------------------------- PARSE.COMMAND JSR SCAN.COMMAND.TABLE BCS SYNERR2 ...SYNTAX ERROR LDA #0 STA FBITS STA FBITS+1 STA PATHNAME.TWO.BUFFER STA PATHNAME.ONE.BUFFER+1 LDA D.SLOT STA VAL.S LDA D.DRIV STA VAL.D *---Handle special cases--------- BIT PBITS Check for PR# or IN# BVS PARSE.INPR PR# & IN# commands BPL .1 ...not CAT(ALOG) or PREFIX JSR MLI.C7 ...CAT, CATALOG, or PREFIX *---TEST CHAR AFTER COMMAND------ .1 JSR GET.NEXT.NONBLANK BNE .2 ...not comma or BCC .5 ... already JMP GET.ANOTHER.PARM *---Get a pathname--------------- .2 CMP #'/' MUST START WITH "/" OR LETTER BEQ .3 CMP #'A' BCC SYNERR2 ...SYNTAX ERROR .3 DEX RE-SCAN THE FIRST CHAR OF PATH LDY #0 .4 JSR GET.NEXT.CHAR.FROM.WBUF STA PATHNAME.ONE.BUFFER+1,Y JSR STORE.PATH.TWO.AND.TEST BCC .4 DEY STY PATHNAME.ONE.BUFFER STY PATHNAME.TWO.BUFFER LDA #$01 TELL THE WORLD ABOUT IT STA FBITS *-------------------------------- DEX RE-SCAN CHAR AFTER PATHNAME JSR GET.NEXT.NONBLANK BNE SYNERR2 ...NOT COMMA OR BCS MORE.PARMS ...COMMA .5 JMP NO.MORE.PARMS ... SYNERR2 JMP ERR.SYNTAX *-------------------------------- * PR# or IN# commands *-------------------------------- PARSE.INPR JSR GET.NEXT.NONBLANK CHAR AFTER COMMAND BEQ SYNERR2 ...comma or DEX ...IN CASE IT IS "Axxx" CMP #'A' BEQ GET.ANOTHER.PARM ...HANDLE PR#Axxx or IN#Axxx INX RESTORE X JSR ZERO.ACCUM STY PARM.LENM1 Y=0, 1 BYTE PARM LDY #VAL.LB-VAL.A PARM OFFSET FROM VAL.A STY PARM.OFFSET LDY #$40 STY FBITS JSR CONVERT.DECIMAL.NUMBER BCS RTS4 LDA VAL.LB CMP #$08 BCC TEST.IF.MORE.PARMS SCI.ERR.RANGE LDA #$02 SEC RTS4 RTS *-------------------------------- MORE.PARMS LDA PBITS LSR TEST BIT 0 BCC SYNERR2 ...NO PATHNAME EXPECTED LSR TEST BIT 1 BCC GET.ANOTHER.PARM ...NO PATH-TWO EXPECTED *---Get second pathname---------- JSR GET.NEXT.NONBLANK BEQ SYNERR2 ...COMMA OR DEX RE-SCAN FIRST CHAR OF PATHNAME LDY #0 .1 JSR GET.NEXT.CHAR.FROM.WBUF JSR STORE.PATH.TWO.AND.TEST BCC .1 DEY STY PATHNAME.TWO.BUFFER LDA #$03 WE GOT TWO PATHNAMES, SO STA FBITS MARK THE BITS DEX RE-SCAN TERM. CHAR *-------------------------------- TEST.IF.MORE.PARMS JSR GET.NEXT.NONBLANK BNE SYNERR2 BCC NO.MORE.PARMS GET.ANOTHER.PARM JSR GET.NEXT.NONBLANK BEQ SYNERR2 ...NULL PARAMETER JSR PARSE.PARAMETER BCC TEST.IF.MORE.PARMS RTS ...error return *-------------------------------- NO.MORE.PARMS LDA VAL.S CHECK RANGE OF S AND D BEQ SCI.ERR.RANGE CMP #$08 BCS SCI.ERR.RANGE LDA VAL.D BEQ SCI.ERR.RANGE CMP #$03 BCS SCI.ERR.RANGE *---CHECK IF DEFERRED COMMAND---- LDA PBITS (only OPEN and WRITE are deferred) AND #$21 LSR BEQ .1 ...NOT DEFERRED LDA STATE ...ARE WE IN DIRECT MODE? BEQ .6 ...YES, DEFERRED IS ILLEGAL *---CHECK PATHNAME--------------- .1 BCC .5 ...NO PATH PERMITTED LDA PBITS+1 AND #$04 S OR D OK? BEQ .5 ...NO LDA FBITS LSR HAVE WE A PATHNAME? BCS .2 ...YES LDA PBITS ...NO, IS PATH NEEDED AND #$90 BEQ ERR.SYNTAX ...YES BPL .5 *---NEED PREFIX OR S,D----------- .2 LDA PATHNAME.ONE.BUFFER+1 EOR #'/' SLASH BEQ .3 ...EXPLICIT PREFIX LDA PREFIX.FLAG MLI's flag BEQ .4 ...NO PREFIX IS SET .3 LDA FBITS+1 DID WE GET S,D? AND #$04 BEQ .5 ...NO BCS .4 ...YES, AND THERE IS A PATHNAME LDA #0 ...YES, BUT NO PATHNAME STA PATHNAME.ONE.BUFFER STA PATHNAME.ONE.BUFFER+1 LDA #$01 SIGNAL WE GOT PATHNAME AFTER ALL ORA FBITS STA FBITS .4 JSR INSERT.VOLUME.NAME BCS .7 *---BRANCH TO COMMAND------------ .5 CLC SIGNAL NO ERROR LDA COMMAND.NUMBER BEQ EXTERNAL ...USER'S COMMAND EOR #CN.PREFIX BEQ INTERNAL ...PREFIX COMMAND LDA PBITS+1 ARE S/D VALID? AND #$04 BEQ INTERNAL ...NO LDA FBITS ANY PATHNAME SPECIFIED? LSR BCC INTERNAL ...NO JSR GET.FILE.INFO ...YES BCC INTERNAL ...NO ERROR ORA #0 ...ERROR, WAS IT "FILE NOT FOUND"? BPL .7 ...NO, REAL ERROR LDA PBITS OKAY TO CREATE PATHNAME? AND #$08 BNE INTERNAL ...YES LDA #$06 "PATH NOT FOUND" .HS 2C .6 LDA #$0F "NOT DIRECT COMMAND" SEC .7 RTS *-------------------------------- INTERNAL JMP (COMMAND.ADDR) EXTERNAL JMP (EXTERNAL.COMMAND.HANDLER) *-------------------------------- ERR.SYNTAX LDA #$10 SYNTAX ERROR ERRR SEC RTS *-------------------------------- * INSERT PREFIX BEFORE PATHNAME *-------------------------------- INSERT.VOLUME.NAME LDA VAL.S BUILD UNIT # FROM SLOT,DRIVE TAY SAVE VAL.S LSR 0000.00SS S ROR S000.000S S ROR SS00.0000 S ROR SSS0.0000 0 LDX VAL.D CPX #2 .CS. if 2, .CC. if 1 ROR DSSS.0000 STA MISC.PARMS+1 LDA #WBUF+1 STA MISC.PARMS+2 LDA /WBUF+1 STA MISC.PARMS+3 JSR MLI.C5 ONLINE -- READ VOLUME NAME BCS .4 NO SUCH SLOT AND DRIVE STX D.DRIV UPDATE DEFAULT S AND D STY D.SLOT *-------------------------------- LDA PATHNAME.ONE.BUFFER+1 EOR #'/' ALREADY HAVE VOLUME NAME? BEQ .4 ...YES, DON'T NEED ANOTHER *---ISOLATE VOLNAME LENGTH------- LDA WBUF+1 DSSSLLLL AND #$0F 0000LLLL STA WBUF+1 *---MOVE PATHNAMES OVER L+2------ LDY #62 TYA SEC SBC WBUF+1 TAX .1 LDA PATHNAME.ONE.BUFFER,X STA PATHNAME.ONE.BUFFER+2,Y LDA PATHNAME.TWO.BUFFER,X STA PATHNAME.TWO.BUFFER+2,Y DEY DEX BNE .1 *---INSERT VOLUME SLASHES-------- LDA #'/' STA PATHNAME.ONE.BUFFER+2,Y STA PATHNAME.ONE.BUFFER+1 STA PATHNAME.TWO.BUFFER+2,Y STA PATHNAME.TWO.BUFFER+1 *---COPY VOLUME NAME------------- .2 LDA WBUF+1,Y STA PATHNAME.ONE.BUFFER+1,Y STA PATHNAME.TWO.BUFFER+1,Y DEY BNE .2 *---UPDATE PATH LENGTHS---------- CLC LDA WBUF+1 ADC #2 INCLUDE SLASHES TAY ADC PATHNAME.ONE.BUFFER CMP #64 .3 BCS ERR.SYNTAX STA PATHNAME.ONE.BUFFER TYA ADC PATHNAME.TWO.BUFFER STA PATHNAME.TWO.BUFFER CMP #64 BCS .3 ...BRIDGE TO SYNTAX ERROR *-------------------------------- .4 RTS *-------------------------------- SCAN.COMMAND.TABLE LDY #0 PNTR INTO COMMAND TABLE STY COMMAND.NUMBER DEY *---COMPARE COMMAND NAME--------- .1 INC COMMAND.NUMBER LDX #0 PNTR INTO WBUF .2 INY next byte in command table JSR GET.NEXT.NONBLANK BEQ .4 ...end of WBUF contents EOR COMMAND.TABLE,Y BEQ .2 ...same so far ASL Might be last char BNE .4 ...No, try next command *---We found the command--------- LDA COMMAND.TABLE+1,Y STA COMMAND.ADDR LDA COMMAND.TABLE+2,Y STA COMMAND.ADDR+1 LDA COMMAND.TABLE+3,Y STA PBITS LDA COMMAND.TABLE+4,Y STA PBITS+1 CLC RTS *---SKIP TO NEXT COMMAND--------- .3 INY .4 LDA COMMAND.TABLE,Y BPL .3 ...NOT LAST CHAR YET INY SKIP OVER ADDRESS INY INY SKIP OVER PBITS INY LDA COMMAND.TABLE+1,Y BNE .1 ...more commands in table *---TRY EXTERNAL COMMAND--------- LDA #$FF STA COMMAND.NUMBER SEC JMP SCI.USER.CMD *-------------------------------- SYNERR1 JMP ERR.SYNTAX *-------------------------------- PARSE.PARAMETER JSR ZERO.ACCUM LDY #NO.PARM.NAMES-1 .1 CMP PARM.NAMES,Y BEQ FOUND.PARM DEY BPL .1 CMP #'T' BNE SYNERR1 ...SYNTAX ERROR *---PARSE T PARAMETER------------ LDA #$04 AND PBITS BEQ ERR.BADPARM ORA FBITS STA FBITS LDA #0 SINGLE BLYTE STA PARM.LENM1 LDA #VAL.T-VAL.A PARM OFFSET FROM VAL.A STA PARM.OFFSET JSR GET.NEXT.NONBLANK BEQ SYNERR1 CMP #'$' BEQ CONVERT.HEX.NUMBER CMP #'A' BCC CONVERT.DECIMAL.NUMBER JMP CONVERT.FILE.TYPE *-------------------------------- ERR.BADPARM SEC "INVALID PARAMETER" LDA #$0B RTS *-------------------------------- FOUND.PARM LDA PARM.MASKS,Y BEQ .2 AND PBITS+1 BEQ ERR.BADPARM CMP #$04 IS IT S OR D BNE .1 ...NO AND FBITS+1 ...YES, DID WE ALREADY HAVE S OR D BNE .2 ...YES LDA #1 ...NO, SET D=1 STA VAL.D LDA #$04 .1 ORA FBITS+1 STA FBITS+1 .2 LDA PARM.VARIABLES,Y AND #$03 STA PARM.LENM1 LDA PARM.VARIABLES,Y LSR LSR STA PARM.OFFSET JSR GET.NEXT.NONBLANK BEQ GO.ERR.SYNTAX.1 CMP #'$' BEQ CONVERT.HEX.NUMBER *-------------------------------- CONVERT.DECIMAL.NUMBER STX COMMAND.LINE.LENGTH JSR ACCUMULATE.DECIMAL.DIGIT BCC .1 BMI GO.ERR.RANGE.1 BCS GO.ERR.SYNTAX.1 .1 LDX COMMAND.LINE.LENGTH JSR GET.NEXT.NONBLANK BNE CONVERT.DECIMAL.NUMBER BEQ CHECK.PARAMETER.RANGE *-------------------------------- CONVERT.HEX.NUMBER JSR GET.NEXT.NONBLANK BEQ GO.ERR.SYNTAX.1 .1 STX COMMAND.LINE.LENGTH JSR ACCUMULATE.HEX.DIGIT BCC .2 BMI GO.ERR.RANGE.1 BCS GO.ERR.SYNTAX.1 .2 LDX COMMAND.LINE.LENGTH JSR GET.NEXT.NONBLANK BNE .1 *-------------------------------- CHECK.PARAMETER.RANGE LDX #$02 .1 CPX PARM.LENM1 BEQ .2 LDA ACCUM,X BNE GO.ERR.RANGE.1 DEX BNE .1 .2 LDY PARM.OFFSET .3 LDA ACCUM,X STA VAL.A,Y DEY DEX BPL .3 LDX COMMAND.LINE.LENGTH CLC RTS *-------------------------------- GO.ERR.SYNTAX.1 JMP ERR.SYNTAX *-------------------------------- GO.ERR.RANGE.1 JMP SCI.ERR.RANGE *-------------------------------- CONVERT.FILE.TYPE STA ACCUM+2 1ST LETTER LDY #2 GET 2ND AND 3RD .1 JSR GET.NEXT.NONBLANK BEQ GO.ERR.SYNTAX.1 STA ACCUM-1,Y STORE THEM BACKWARDS DEY BNE .1 ...UNTIL Y=0 STX COMMAND.LINE.LENGTH SAVE X-REG .2 LDX #2 COMPARE NEXT ENTRY .3 LDA ACCUM,X EOR FILE.TYPES,Y INY ASL IGNORE BIT 7 BNE .4 ...NOT THE SAME DEX NEXT CHAR BPL .3 LDA FILE.TYPES,Y STA VAL.T LDX COMMAND.LINE.LENGTH RESTORE X-REG CLC RTS .4 INY DEX BPL .4 CPY #LAST.FILE.TYPE BCC .2 BCS GO.ERR.SYNTAX.1 *-------------------------------- * GET NEXT NON-BLANK CHAR FROM WBUF * CHAR Z C * YES CLR * COMMA YES SET * OTHER NO ? *-------------------------------- GET.NEXT.NONBLANK .1 JSR GET.NEXT.CHAR.FROM.WBUF CMP #' ' BEQ .1 IGNORE BLANKS CMP #',' BEQ .2 .CS. and .EQ. CMP #$0D .EQ. if CLC .CC. .2 RTS *-------------------------------- GET.NEXT.CHAR.FROM.WBUF LDA WBUF,X BNE .1 MAKE 00==8D LDA #$0D .1 AND #$7F .DO LOWERCASE=1 .ELSE CMP #$60 CONVERT LOWER CASE TO UPPER BCC .2 AND #$5F .2 .FIN INX RTS *-------------------------------- ACCUMULATE.DECIMAL.DIGIT CMP #$30 BCC .1 CMP #$3A BCC .2 .1 SEC ORA #0 RTS *-------------------------------- .2 AND #$0F PHA LDA ACCUM+2 CMP #$1A BCS .5 LDX #$02 .3 LDA ACCUM,X PHA DEX BPL .3 JSR SHIFT.ACCUM.LEFT JSR SHIFT.ACCUM.LEFT LDX #0 CLC .4 PLA ADC ACCUM,X STA ACCUM,X INX TXA EOR #$03 BNE .4 JSR SHIFT.ACCUM.LEFT .5 PLA BCS TOOBIG ADC ACCUM STA ACCUM BCC RTS1 CLC INC ACCUM+1 BNE RTS1 INC ACCUM+2 BNE RTS1 TOOBIG LDA #$FF SEC RTS1 RTS *-------------------------------- ACCUMULATE.HEX.DIGIT CMP #'0' BCC .1 CMP #'9'+1 BCC .3 CMP #'A' BCC .1 CMP #'F'+1 BCC .2 .1 SEC ORA #0 RTS .2 SBC #$06 .3 AND #$0F LDX #$03 .4 JSR SHIFT.ACCUM.LEFT BCS TOOBIG DEX BPL .4 ORA ACCUM STA ACCUM RTS *-------------------------------- SHIFT.ACCUM.LEFT ASL ACCUM ROL ACCUM+1 ROL ACCUM+2 RTS *-------------------------------- ZERO.ACCUM LDY #0 STY ACCUM STY ACCUM+1 STY ACCUM+2 RTS *-------------------------------- * RETURN .CC. IF NOT END OF PATHNAME YET * ELSE .CS. *-------------------------------- STORE.PATH.TWO.AND.TEST STA PATHNAME.TWO.BUFFER+1,Y INY CMP #',' BEQ .1 CMP #' ' BEQ .1 CMP #$0D BEQ .1 CPY #65 .1 RTS *-------------------------------------- MAN SAVE usr/src/scmasm.31/sci.s.cpar LOAD usr/src/scmasm.31/scmasm.s ASM