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 cmp #'a' bcc .20 cmp #'z'+1 bcs .20 eor #$20 .20 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