.TITLE DISCMD COMMAND PARSE AND HANDLER ; ; THIS MODULE MAKES USE OF THE .TPARS MACROS AND SUBROUTINE ; TO PARSE THE DISASSEMBLER COMMANDS. ; .SBTTL CALL TPARS ; ; ; I:R0=ADDRESS OF INPUT LINE DESCRIPTOR ; R1=ADDRESS OF COMMAND TABLE DESCRIPTOR ; .PSECT ; .ENABL LSB ; ; $CMDPRS:: MOV R0,-(SP) ;SAVE INPUT DESCRIPTOR ADDRESS MOV (R0)+,R3 ;SET SIZE OF LINE MOV (R0),R4 ;SET ADDRESS OF LINE ; MOV (R1)+,R5 ;SET INITAL STATE MOV (R1)+,R2 ;SET KEYWORD ADDRESS MOV (R1),R1 ;SET BLANK SWITCH ; MOV SP,.SPSAV ;SAVE FOR POSSIBLE EXIT CALL .TPARS ;DO IT ; 10$: MOV (SP)+,R0 ;RESTORE INPUT DESC. ADDRESS RETURN ; .SYNER:: MOV .SPSAV,SP ;RESTORE CALL STACK MOV R3,.PSTCN ;SAVE DESCRIPTOR OF UNSCANNED STACK MOV R4,.PSTPT SEC BR 10$ ;AND RETURN ; .DSABL LSB .SBTTL COMMAND STATE TABLE ; CMDTAB:: DISSTA ;ADDRESS OF STATE TABLE DISKEY ;ADDRESS OF KEYWORD TABLE 1 ;BLANK HANDLER FLAG ; ; .MCALL ISTAT$,STATE$,TRAN$,MTRAN$ ; ; ISTAT$ DISSTA,DISKEY ;INITAL STATE LABELS ; STATE$ START TRAN$ $EOS,$EXIT ;IF END OF LINE TRAN$ "PDR",LIST,SETPDR TRAN$ "PAR",LIST,SETPAR TRAN$ "KNL",$EXIT,SETKNL TRAN$ "TSK",NAME,SETTSK TRAN$ "HDR",$EXIT,SETHDR TRAN$ "OCT",LIST,SETOCT TRAN$ "SYM",LIST,SETSYM TRAN$ "DAT",LIST,SETDAT TRAN$ "ASC",LIST,SETASC TRAN$ "TIT",STRING,SETTIT TRAN$ "PAG",$EXIT,SETPAG TRAN$ "TES",$EXIT,SETTES TRAN$ "EXI",$EXIT,SETEXI TRAN$ "FPU",LIST,SETFPU TRAN$ "FILE",FNAME,SETFIL TRAN$ "SEG",NAME,SETSEG TRAN$ "PSGT",$EXIT,SETPSG TRAN$ "TSGT",$EXIT,SETTSG ; ; SUB COMMAND STATES ; ;EXTRACT A LIST OF UP TO 8 OCTAL nUMBERS ; STATE$ LIST TRAN$ '= ; STATE$ LLOOP TRAN$ $EOS,$EXIT TRAN$ <',>,LLOOP TRAN$ $BLANK,LLOOP TRAN$ $NUMBR,LLOOP,PUTNUM ; ; EXTRACT A STRING OF CHARACTERS FOR A TITLE ; STATE$ STRING TRAN$ '=,SLOOP ; STATE$ SLOOP TRAN$ $EOS,$EXIT TRAN$ $ANY,SLOOP,PUTSTR ; ; EXTRACT A TASK NAME (6-CHAR RAD50) ; STATE$ NAME TRAN$ '= ; STATE$ TRAN$ $RAD50,$EXIT,SETR50 ; ; PROCESS A FILENAME ; STATE$ FNAME TRAN$ '= STATE$ TRAN$ !FDDU,FD2 TRAN$ !FTRM,$EXIT,FDFNDN TRAN$ $LAMDA STATE$ FD2 TRAN$ !FDUI,FD3 TRAN$ !FTRM,$EXIT TRAN$ $LAMDA STATE$ FD3 TRAN$ !FDFN,FD4 TRAN$ !FTRM,$EXIT TRAN$ $LAMDA STATE$ FD4 TRAN$ !FDEX,FD5 TRAN$ !FTRM,$EXIT,FDFNDN TRAN$ $LAMDA STATE$ FD5 TRAN$ !FDVE,$EXIT,FDFNDN TRAN$ !FTRM,$EXIT,FDFNDN TRAN$ $LAMDA,$EXIT,FDFNDN ; ; SUBEXPRESSION STATES ; ; DEVICE UNIT SUB-EXPRESSION ; STATE$ FDDU TRAN$ $ANY,,FDDUS1 ;DEVICE1 STATE$ TRAN$ $ANY,,FDDUS2 ;DEVICE2 STATE$ TRAN$ ':,$EXIT,FDDUGO ;DONE TRAN$ $NUMBR ;UNIT SPECIFIED STATE$ TRAN$ ':,$EXIT,FDDUGO ;DONE ; ; DIRECTORY SUB-EXPRESSION ; STATE$ FDUI TRAN$ '[,,FDUISS STATE$ TRAN$ $NUMBR,,FDUISG STATE$ TRAN$ <',> STATE$ TRAN$ $NUMBR,,FDUISG STATE$ TRAN$ '],$EXIT,FDUIGO ; ; FILENAME SUB-EXPRESSION ; STATE$ FDFN TRAN$ $STRNG,$EXIT,FDFNGO ; ; EXTENSION SUB-EXPRESSION ; STATE$ FDEX TRAN$ '. STATE$ TRAN$ $STRNG,$EXIT,FDEXGO ; ; VERSION SUB-EXPRESSION ; STATE$ FDVE TRAN$ <';> STATE$ TRAN$ $NUMBR,$EXIT,FDVEGO ; ; ; TERMINATOR SUBSTATE ; STATE$ FTRM TRAN$ <',>,$EXIT TRAN$ '/,$EXIT TRAN$ $EOS,$EXIT ; ; ; ; ENDSTATES ; STATE$ .SBTTL COMMAND PARSE SUBROUTINES .PSECT ; ; ; SETPDR: MOV #.CMPDR,-(SP) BR RESLST ; SETPAR: MOV #.CMPAR,-(SP) BR RESLST ; SETKNL: MOV #.CMKNL,-(SP) BR RESLST ; SETTSK: MOV #.CMTSK,-(SP) BR RESLST ; SETHDR: MOV #.CMHDR,-(SP) BR RESLST ; SETOCT: CLR .SWITCH ;SET OCTAL MODE BR MODCOM ; SETSYM: MOV #1,.SWITCH ;SET SYMBOLIC MODE BR MODCOM ; SETDAT: MOV #2,.SWITCH ;SET DATA MODE BR MODCOM ; SETASC: MOV #3,.SWITCH ;SET ASCII MODE ; MODCOM: MOV #.CMDIS,-(SP) BR RESLST ; SETTIT: MOV #.CMTIT,-(SP) BR RESLST ; SETPAG: MOV #.CMPAG,-(SP) BR RESLST ; SETTES: MOV #.CMTES,-(SP) BR RESLST ; SETEXI: MOV #.CMEXI,-(SP) BR RESLST ; SETFPU: MOV #.CMFPU,-(SP) BR RESLST ; SETPSG: MOV #.CMPSG,-(SP) BR RESLST ; SETTSG: MOV #.CMTSG,-(SP) BR RESLST ; ; RESLST: MOV (SP)+,.COMMAND ; RETURN ; ; OTHER TRANSITION ROUTINES ; PUTNUM: MOV .PNUMB,@.LSPTR ;SAVE NEXT NUMBER ADD #2,.LSPTR ;BUMP POINTER RETURN ; PUTSTR: MOVB .PCHAR,@.STPTR ;SAVE NEXT BYTE INC .STPTR ;BUMP POINTER CLRB @.STPTR ;ADVANCE TERMINATOR RETURN ; SETR50: MOV .PSTCN,.NABUF MOV .PSTPT,.NABUF+2 ;SAVE ADDRESS OF NAME STRING RETURN ; ; FILE NAME ROUTINES ; SETFIL: MOV #.CMFIL,-(SP) ;SPECIFY WHICH COMMMAND ; MOV R0,-(SP) MOV R1,-(SP) MOV #.DFNB,R0 ;SET FILENAME BLOCK WITH DEFAULT MOV #S.FNBW,R1 ;COUNT OF WORDS TO COPY 10$: MOV (R0)+,.FNB-.DFNB-2(R0) SOB R1,10$ ;COPY LOOP ; MOV #.DFDSP,R0 ;RESET DEFAULT DATASET POINTER ALSO MOV #6,R1 ;6 WORDS LONG 15$: MOV (R0)+,.DSPT-.DFDSPT-2(R0) SOB R1,15$ ; MOV (SP)+,R1 MOV (SP)+,R0 ; BR RESLST ; ; SETSEG: MOV #.CMSEG,-(SP) ;SET SEGMENT NAME COMMAND BR RESLST ; ; ; FDDUS1: MOVB .PCHAR,.TEMP+0 ;SAVE DEVICE1 ; MOV R4,.TEMP0 ;SAVE START OF DEVICE STRING DEC .TEMP0 ; RETURN FDDUS2: MOVB .PCHAR,.TEMP+1 ;SAVE DEVICE2 RETURN FDDUGO: MOV .TEMP,.FNB+N.DVNM ;SET DEVICE NAME MOV .PNUMB,.FNB+N.UNIT ;AND UNIT ; MOV R4,.DSPT+DSP.DV+0 SUB .TEMP0,.DSPT+DSP.DV+0 ;DERIVE COUNT OF DEVICE STRING MOV .TEMP0,.DSPT+DSP.DV+2 ;SET ADDRESS OF DEVICE STRING ; RETURN ; FDUISS: MOV R4,.TEMP0 ;SAVE ADDRESS OF STAT OF UIC STRING DEC .TEMP0 RETURN ; FDUISG: MOVB .PNUMB,.TEMP SWAB .TEMP RETURN FDUIGO: ; MOV R4,.DSPT+DSP.DI+0 ;GET COUNT OF DIRECTORY STRING SUB .TEMP0,.DSPT+DSP.DI+0 MOV .TEMP0,.DSPT+DSP.DI+2 ;SET START ; RETURN ; FDFNGO: CMP #12.,.PSTCN ;CHECK NAME SIZE BLO SYNERR ;BR IF TOO LARGE ; MOV R0,-(SP) MOV R1,-(SP) ; MOV .PSTPT,R0 ;POINT TO STRING MOV PC,R1 ;SET R1.NE.0 CALL $CAT5 MOV R1,.FNB+N.FNAM+0 SUB #3.,.PSTCN BLE 10$ CALL $CAT5 MOV R1,.FNB+N.FNAM+2 SUB #3.,.PSTCN BLE 10$ CALL $CAT5 MOV R1,.FNB+N.FNAM+4 ; ; 10$: MOV .PSTPT,.TEMP0 ;SAVE START OF FILENAME STRING MOV (SP)+,R1 MOV (SP)+,R0 RETURN ; FDEXGO: CMP #3.,.PSTCN ;MAX OF 3 CHARS IN AN EXTENSION BLO SYNERR MOV R0,-(SP) MOV R1,-(SP) MOV .PSTPT,R0 CALL $CAT5 MOV R1,.FNB+N.FTYP MOV (SP)+,R1 MOV (SP)+,R0 RETURN ; FDVEGO: MOV .PNUMB,.FNB+N.FVER RETURN ; FDFNDN: MOV R4,.DSPT+DSP.FN+0 ;GET COUNT OF FILENAME STRING SUB .TEMP0,.DSPT+DSP.FN+0 MOV .TEMP0,.DSPT+DSP.FN+2 ;SET POINTER RETURN ; ; SYNERR: JMP .SYNERR ; ; .END