; PROGRAM DISOBJ.MAC ; PROGRAM TO DISASSEMBLE A MACRO OBJECT FILE ; PRODUCED FOR TASK BUILDER UNDER RSX-11D ; IT IS OPERATED AS AN MCR FUNCTION WITH STANDARD COMMAND LINE FORMAT ; WITH TWO LEVELS OF INDIRECT COMMAND FILES. ; CALL: ; MCR>DOB [OUTSPEC=]FILESPEC/SWS ; WHERE FILESPEC IS THE FILES-11 SPEC (OR INDIRECT COMMAND FILE). ; DEFAULTS: SY:DISOBJ.OBJ ; OUTSPEC IS OPTIONAL. IF NOT SPECIFIED THE OUTPUT FILE HAS THE ; FOLLOWING DEFAULTS: TI:DISOBJ.DOB ; THE LUN FOR FILESPEC IS 1 AND FOR OUTSPEC IT IS 3. ; THE DEVICES CAN BE CHANGED IN THE BUILD FILE OR WITH THE MCR REASSIGN FCN. ; THERE IS ONE SWITCH SUPPORTED: ; /LB:MODNAM ; THIS SWITCH SPECIFIES A MODULE NAME WITHIN A LIBRARY SPECIFIED IN FILESPEC. .TITLE DISOBJ ; DEFINE MACROS USED IN THIS PROGRAM .MACRO QIOEXE ADD,LEN PUT$ #OUTFDB,ADD,LEN .ENDM QIOEXE .MACRO BLNKLN ADD,LEN MOV ADD,R0 MOV LEN,R1 JSR PC,BLNKIT .ENDM BLNKLN .MACRO R5ASCL ADR,RAD50 MOV ADR,R0 MOV RAD50,R1 JSR PC,$C5TA .ENDM R5ASCL .MACRO CBASCL ADR,NUM,FLAG,ROUTIN MOV ADR,R0 MOV NUM,R1 MOV FLAG,R2 JSR PC,ROUTIN .ENDM CBASCL .CSECT .MCALL FDBDF$ FDBK$A FDOP$A FDBF$A NMBLK$ .MCALL GCMLB$ CSI$ GCML$ CSI$1 CSI$2 .MCALL OPEN$R READ$ CLOSE$ EXIT$S WAIT$ .MCALL FINIT$ DIR$ QIOW$ FSRSZ$ GET$ .MCALL FDRC$A FDOF$L FCSBT$ FILIO$ PUT$ .MCALL FDAT$A OPEN$W SVTK$ GTIM$ .MCALL CSI$SW CSI$ND CSI$SV ; ; GLOBALS DEFINED HERE .GLOBL BLNKIT RECINP EOMPRC FILFDB RECBF2 .GLOBL PSCBUF ENDPRC STKSAV HBUF1 HBUF1E .GLOBL PSCCNT OUTFDB RECSET STRPSC HBUFL .GLOBL ATTACH DETACH ; ; GLOBALS DEFINED ELSEWHERE .GLOBL RECFIL TXTSET OUTBUF $CBDSG DS.END .GLOBL FLWORD DS.GSD DS.NRL $C5TA $CBOMG .GLOBL TRPHDL TXTRAN GSDDEC PSECAD XFRADD .GLOBL $CAT5 .POINT TE.LSF ; ; GLOBAL TRAP SYMBOLS .GLOBL TE.GCM TE.CSI TE.OPO TE.OPI TE.INP .GLOBL TE.RTP TE.PSC ; DEFINE VARIOUS SYMBOLS LOCALLY FDOF$L ;FDB OFFSETS FCSBT$ ;FDB BIT VALUES FILIO$ ;QIO FCN CODES FILFDB: FDBDF$ ;DEFINE FDB FOR DISK FILE FDRC$A ,RECBF2,1000 FDOP$A 1,CSIBLK+C.DSDS,FIDFNB,FO.RD .EVEN OUTFDB: FDBDF$ ;DEFINE FDB FOR OUTPUT FDAT$A R.VAR,FD.CR FDOP$A 3,,OUTFNB,FO.WRT RECBF2: .BLKB 1000 FIDFNB: NMBLK$ DISOBJ,OBJ,,SY OUTFNB: NMBLK$ DISOBJ,DOB,,SY TRMFNB: NMBLK$ DISOBJ,DOB,,TI ULBFNB: NMBLK$ USLIB,OLB,,SY SLBFNB: NMBLK$ SYSLIB,OLB,,DK DIRDSC: .WORD DIREND-DIRST .WORD DIRST DIRST: .ASCII /[1,1]/ DIREND: .EVEN GETTIM: GTIM$ TIMBUF ;DPB TO GET TIME & DATE TIMBUF: .BLKW 8. ;BUFFER FOR GETTIM CMLBLK: GCMLB$ 2,DOB,FIDSPT,2 FIDSPT: .BLKW 41. CSI$ .EVEN CSIBLK: .BLKB C.SIZE HBUFL: .WORD 0 ;PLACE FOR LEN OF HEADER HBUF1: .ASCII <11><11><11><11>/; / .BLKB 40 HBUF1E: .EVEN LABWRD: .ASCII /.WORD / .EVEN VECDIR: SVTK$ VECADR,7 VECADR: .BLKW 6 .WORD TRPHDL STKSAV: .WORD 0 ;PLACE TO SAVE ORIGINAL STACK POINTER SWORD: .WORD 0 ;WORD FOR SWITCH FLAGS SWTABL: CSI$SW LB,1,SWORD,SET,,SVTABL CSI$ND SVTABL: CSI$SV ASCII,MODNAM,6 CSI$ND MODNAM: .BLKW 3 ;SPACE FOR ASCII MODULE NAME R50MOD: .BLKW 2 ;SPACE FOR RAD50 MODULE NAME LIBBUF=RECBF2 ;USE SAME BUFFER FOR RECORD AND BLOCK I/O MNBLST: .WORD 0 ;STARTING BLOCK FOR MODULE MNENCT: .WORD 0 ;# OF MODULE ENTRIES MNENSZ: .WORD 0 ;SIZE OF EACH ENTRY (BYTES) MNENUS: .WORD 0 ;# USED EXIT1: JMP EXIT ;BRANCH HELP ATTDET: QIOW$ IO.ATT,3,1,,STATUS STATUS: .BLKW 2 ATTACH: MOV #IO.ATT,ATTDET+Q.IOFN BR COMATD DETACH: MOV #IO.DET,ATTDET+Q.IOFN COMATD: DIR$ #ATTDET RTS PC START1: FINIT$ MOV SP,STKSAV ;SAVE SP IN CASE RE-START FROM TRAP ROUTINE DIR$ #VECDIR ;SET UP TRAP HANDLER MOV #FILFDB,R0 ;SET UP FOR MOV #SLBFNB,R1 ;CALL TO GET DEFAULT DIRECTORY MOV #DIRDSC,R2 ;INFO IN SYSTEM LIBRARY JSR PC,.GTDIR ;DFNB START: CLR FLWORD ;CLEAR FLAG WORD IN CASE 2ND FILE JSR PC,DETACH ;IN CASE WE HAVE ATTACHED TERMINAL MOV STKSAV,SP ;RESTORE STACK POINTER CLR PSCCNT ;CLEAR THE PSECT COUNT MOV #MODNAM,R5 ;CLEAR OUT MODULE NAME CLR (R5)+ CLR (R5)+ CLR (R5)+ CLR OUTFDB+F.DSPT ;CLEAR THE DATASET POINTER CLR SWORD ;CLEAR THE SWITCH WORD GCML$ #CMLBLK BCC 2$ CMPB #GE.EOF,CMLBLK+G.ERR ;END OF FILE ON 1ST LEVEL? BEQ EXIT1 ;IF SO, EXIT TRAP TE.GCM 2$: DIR$ #GETTIM ;GET THE TIME MOV #HBUF1+6,R0 ;POINT TO BUFFER MOV #TIMBUF,R1 ;POINT TO TIME JSR PC,$DAT ;CONVERT DATE MOVB #40,HBUF1+9.+6 ;PUT IN MOVB #40,HBUF1+10.+6 ;SPACES MOV #HBUF1+6+2+9.,R0 ;ADDRESS FOR TIME MOV #TIMBUF+G.TIHR,R1 ;ADDRESS OF TIME MOV R2,-(SP) ;SAVE USED REG MOV #3,R2 ;SAY HOUR,MIN,SEC JSR PC,$TIM ;CONVERT TIME MOV (SP)+,R2 MOV #HBUF1+6+2+9.+8.,R5 ;ADDRESS TO CONTINUE -> R5 MOVB #40,(R5)+ ;PUT IN SPACE MOVB #76,(R5)+ ;AND ">" MOV CMLBLK+G.CMLD+2,R0 ;PUT COMMAND STRING AS HEADER MOV CMLBLK+G.CMLD,R1 ;ON OUTPUT FILE JSR PC,TXTRAN SUB #HBUF1,R5 ;LEN IN R5 MOV R5,HBUFL ;STORE FOR FUTURE CSI$1 #CSIBLK,CMLBLK+G.CMLD+2,CMLBLK+G.CMLD BCC 3$ TRAP TE.CSI 3$: CLRB CSIBLK+C.TYPR ;CLEAR THE IN/OUT SPEC MOVB #CS.OUT,CSIBLK+C.TYPR ;SPEC OUT MOV #OUTFDB,R0 MOV #TRMFNB,F.DFNB(R0) ;PUT IN TERMINAL DFNB BITB #CS.EQU,CSIBLK+C.STAT ;BOTH SPECS? BEQ 1$ ;IF NOT, DO DEFAULT OPEN MOV #OUTFNB,F.DFNB(R0) ;USE SY AS DEFAULT DEVICE CSI$2 #CSIBLK BCC 4$ TRAP TE.CSI 4$: MOV #CSIBLK+C.DSDS,OUTFDB+F.DSPT ;USE DATA SET POINTER MOVB #CS.INP,CSIBLK+C.TYPR ;SPEC INPUT FOR INPUT CSI 1$: OPEN$W #OUTFDB BITB #FD.TTY,F.RCTL(R0) ;AT TERMINAL? BEQ 8$ ;IF NOT, DON'T ATTACH JSR PC,ATTACH 8$: CSI$2 #CSIBLK,,#SWTABL BCC 5$ TRAP TE.OPO 5$: MOV #FILFDB,R0 ;CHECK FOR PROPER DFNB TO USE TST SWORD ;LIBRARY SWITCH? BEQ 20$ ;IF NOT, REGULAR .OBJ FILE BITB #CS.NMF!CS.DIF!CS.DVF,CSIBLK+C.STAT BNE 21$ ;IF NOTHING SPEC'D, USE SYSLIB MOV #SLBFNB,F.DFNB(R0) ;PUT IN DFNB SPEC BR 22$ 21$: MOV #ULBFNB,F.DFNB(R0) ;PUT IN USER LIBRARY SPEC BR 22$ 20$: MOV #FIDFNB,F.DFNB(R0) ;PUT IN OBJ FILE SPEC 22$: OPEN$R #FILFDB BCC 6$ TRAP TE.OPI 6$: TST SWORD ;LIBRARY? BNE 17$ ;IF SO, DO LIB THING JMP 7$ ;ELSE SKIP ALL THIS 17$: BISB #FD.RAN,F.RACC(R0) ;SET FOR RANDOM ACCESS CLR F.RCNM(R0) ;SET FOR FIRST RECORD (BLOCK) MOV #1,F.RCNM+2(R0) GET$ ,,#1000 MOV #LIBBUF,R1 ;BUFFER ADDRESS IN R1 MOVB 32(R1),MNENSZ ;STORE SIZE MNT ENTRIES MOV 34(R1),MNBLST ;STORE STARTING BLOCK # MOV 36(R1),MNENUS ;AND # ALLOC SUB 40(R1),MNENUS ;USED MOV #MODNAM,R0 MOV #1,R1 CLR R50MOD+2 JSR PC,$CAT5 ;CONVERT FROM ASCII TO RAD50 MOV R1,R50MOD ;PUT RESULT AWAY BCS 11$ ;IF C, NON RAD50 TERM. JSR PC,$CAT5 ;CONVERT SECOND HALF MOV R1,R50MOD+2 ;PUT IT AWAY 11$: MOV #FILFDB,R0 MOV MNBLST,F.RCNM+2(R0) ;SET UP FOR SEARCH MOV MNENUS,R1 MOV MNENSZ,R2 MOV #R50MOD,R4 BR 16$ 14$: CMP R3,#1000 BLT 15$ 16$: CLR R3 ;R3=OFFSET INTO BLOCK GET$ ;READ IN NEXT BLOCK 15$: CMP LIBBUF(R3),(R4) ;COMPARE 1ST HALF OF RAD50 NAME BNE 12$ CMP LIBBUF+2(R3),2(R4) ;THEN SECOND BEQ 13$ ;IF MATCH, GO FINISH 12$: ADD R2,R3 ;INC OFFSET SOB R1,14$ ;KEEP GOING TILL DONE TRAP TE.LSF ;LIBRARY SEARCH FAILURE 13$: CLR R1 ;SET BLOCK NUM MOV LIBBUF+4(R3),R2 ;(TWO PARTS) MOV LIBBUF+6(R3),R3 ;AND BYTE MOVB #R.VAR,F.RTYP(R0) ;SET VARIABLE RECORD TYPE BICB #FD.RAN,F.RACC(R0) ;MAKE SEQUENTIAL JSR PC,.POINT ;POINT TO MODULE HEADER GET$ ;READ IT IN 7$: JMP RECSET EXIT: EXIT$S ENDPRC: CLOSE$ #FILFDB CLOSE$ #OUTFDB JMP START BLNKIT: TST R1 ;CHECK NO OF BYTES BEQ 2$ ;IF ZERO, THEN DONE 1$: MOVB #40,(R0)+ ;MOVE IN A BLANK SOB R1,1$ ;AND DO IT TILL DONE 2$: RTS PC RECINP: GET$ #FILFDB,#RECBF2,#52 BCC 1$ TRAP TE.INP 1$: RTS PC RECSET: JSR PC,RECINP ;GET A RECORD MOV #RECBF2,R4 ;USE R4 TO KEEP LINE POSITION MOV (R4)+,R1 ;RECORD TYPE IN R1 TST R1 ;CHECK FOR ZERO BPL 2$ ;POSITIVE OK TRAP TE.RTP 2$: CMP R1,#6 ;SEE IF > 6 BLE 1$ TRAP TE.RTP 1$: DEC R1 ;SET UP R1 ASL R1 ;TO BE JMP @JMPTBL(R1) ;A JUMP INDEX AND DO IT ERTRP: TRAP TE.RTP JMPTBL: .WORD GSDDEC ;GLOBAL SYMBOL DECODE .WORD ENDGSD ;END OF GLOBAL SYMBOL DIRECTORY .WORD ERTRP .WORD ALTEND ;IN CASE NO END GSD RECORD .WORD ERTRP ;DON'T KNOW ABOUT THIS .WORD EOMPRC ;IN CASE STOPPED SHORT ; ; ROUTINE FOR END OF GLOBAL SYMBOL DIRECTORY ; ENDGSD: JSR PC,RECINP ;INPUT NEXT RECORD ALTEND: BIC #DS.GSD,FLWORD ;TURN OFF GLOBAL SYMBOL FLAG SUB #PSCBUF,R5 ;NO. OF BYTES USED IN R5 ASR R5 ;DIVIDE BY 4 ASR R5 DEC R5 ;PSECT NO. 0 IS FIRST PSECT MOV R5,PSCCNT ;AND STORE IT BLNKLN #OUTBUF,#80. ;BLANK OUT A LINE MOV #OUTBUF,R5 ;START FILLING MOV #<11*400+11>,(R5)+ ;LINE WITH TABS MOV #<11*400+11>,(R5)+ MOV #"; ,(R5)+ ;AND FINISH WITH ; SUB #OUTBUF,R5 ;LEN -> R5 QIOEXE #OUTBUF,R5 ;OUTPUT IT MOV RECBF2,R1 CMP R1,#4 ;IS RECORD AN RLD RECORD BEQ 1$ ;IF SO, GOOD CMP R1,#6 ;IS IT FAST STOP BEQ EOMPRC ;IF SO, GO END TRAP TE.RTP ;IF NOT, ERROR 1$: BIS #DS.NRL,FLWORD ;INDICATE TYPE JMP TXTSET ;AND GO PROCESS ; ; ROUTINE TO PROCESS END OF MODULE ; EOMMSG: .ASCII <11><11><11><11><11>/.END/ EOMMS1: .BLKB 10 .EVEN EOMPRC: MOV #EOMMS1,R5 ;START AT END OF FIXED PART BIT #1,XFRADD ;SUBROUTINE BNE 1$ ;IF SO, BRANCH MOVB #11,(R5)+ ;PUT IN TAB CBASCL R5,XFRADD,#1,$CBOMG MOV R0,R5 ;UPDATE R5 1$: SUB #EOMMSG,R5 ;LEN IN R5 QIOEXE #EOMMSG,R5 ;PRINT IT JMP ENDPRC STRPSC: MOV R0,-(SP) ;SAVE R0 MOV PSECAD,R0 ;CURRENT NEXT OPEN ADDRESS IN R0 ADD #4,R0 ;SEE IF ROOM FOR ONE MORE CMP R0,#PSCCNT ;AT END? BLE 1$ ;IF NOT, OK TRAP TE.PSC ;ELSE ERROR 1$: SUB #4,R0 ;BACK TO WHERE WE WERE MOV -4(R4),(R0)+ ;MOVE IN RAD50 MOV -2(R4),(R0)+ ;PSECT NAME INC PSCCNT ;COUNT IT MOV R0,PSECAD ;STORE NEW ADDRESS MOV (SP)+,R0 ;RESTORE OLD R0 RTS PC .PSECT PSCSEC N.PSCT=60 ;DEFINE NO. OF PSECTS TO ALLOW PSCBUF: .BLKW 2*N.PSCT ;TWO WORDS FOR EACH PSECT .PSECT PSCSED ;PSECT TO FOLLOW PSCSEC PSCCNT: .WORD 0 ;COUNT OF NO. OF PSECTS USED FSRSZ$ 4 .END START1