.TITLE TXTOUT .IDENT /01/ .PSECT CODE,RO ; ; VERSION 01 ; ; TOM GETZINGER 26-OCT-80 ; ; THIS ROUTINE OUTPUTS A TEXT RECORD ; ; INPUTS: ; FRSTXT -> FIRST ITEM OF DISASSEMBLED TEXT ; R4 -> LAST ITEM OF DISASSEMBLED TEXT ; R5 -> FIRST CHARACTER AFTER END OF OUTPUT RECORD ; ; LOCAL DATA ; .PSECT RODATA,RO,D BADBTS: .WORD 077777,037777,017777,007777,003777,001777 GDBITS: .WORD 100000,140000,160000,170000,174000,176000 .PSECT RWDATA,RW,D STADDR: .BLKW 1 ; TEXT START ADDRESS RECLEN: .BLKW 1 ; RECORD LENGTH .PSECT CODE .MCALL PUT$S TXTOUT:: TSTB SWITCH+1 ; ANY ADDITIONAL OUTPUT DESIRED? BEQ 22$ ; NO MOV #-1,R3 ; YES, ASSUME THERE WAS NO OPERAND TST OPSTRT ; IS OUR ASSUMPTION CORRECT? BEQ 2$ ; YES MOV R5,R3 ; NO, COPY OUTPUT BUFFER END ADDRESS SUB OPSTRT,R3 ; CALCULATE OPERAND LENGTH CMP R3,#24. ; PAST COMMENT COLUMN? BLT 2$ MOVB #' ,(R5)+ ; YES, ONLY OUTPUT A SPACE BR 4$ 2$: MOVB #' ,(R5)+ ; NO, OUTPUT A TAB ADD #8.,R3 CMP R3,#24. ; DONE YET? BLT 2$ ; NO, OUTPUT MORE TABS 4$: MOVB #';,(R5)+ ; OUTPUT SEMI-COLON (FOR COMMENT) MOVB #' ,(R5)+ ; OUTPUT A BLANK MOVB #'",(R5)+ ; OUTPUT A QUOTE BIT #S.ASC,SWITCH ; IS ASCII DESIRED? BEQ 14$ ; NO, THEY MUST WANT RAD50 MOV INSTLN,R0 ; GET THE INSTRUCTION LENGTH MOV #INST,R1 ; POINT TO THE INSTRUCTION BUFFER 6$: MOVB (R1)+,R2 ; GET THE NEXT BYTE BIC #^C177,R2 ; REMOVE THE PARITY BIT CMP R2,#177 ; IS THIS A GRAPHIC CHARACTER? BGE 8$ ; NO, IT'S TOO BIG CMP R2,#<' > ; MAYBE BGE 10$ ; YES 8$: MOV #<' >,R2 ; NO, MAKE IT A BLANK 10$: MOVB R2,(R5)+ ; OUTPUT THE CHARACTER DEC R0 ; ANY MORE? BNE 6$ ; YES, OUTPUT THEM MOVB #'",(R5)+ ; OUTPUT A TRAILING QUOTE BIT #S.RAD,SWITCH ; RAD50 DESIRED? BEQ 22$ ; NO MOV #7,R0 ; YES, CALCULATE AMOUNT TO SPACE OVER SUB INSTLN,R0 12$: MOVB #<' >,(R5)+ ; SPACE OVER DEC R0 BNE 12$ MOVB #'",(R5)+ ; OUTPUT A QUOTE 14$: MOV INSTLN,R3 ; GET THE INSTRUCTION LENGTH ASR R3 ; CONVERT TO A WORD COUNT BEQ 20$ ; THERE ARE NO WORDS TO DUMP MOV R5,R0 ; MOVE OUTPUT ADDRESS TO R0 MOV #INST,R5 ; POINT TO INSTRUCTION BUFFER 16$: MOV (R5)+,R1 ; GET THE NEXT WORD CALL $C5TA ; CONVERT IT TO ASCII DEC R3 ; ANY MORE WORDS? BNE 16$ ; YES MOV R0,R5 ; NO, RESTORE OUTPUT ADDRESS INTO R5 20$: MOVB #'",(R5)+ ; OUTPUT A TRAILING QUOTE 22$: SUB #OUTBUF+8.,R5 ; CALCULATE RECORD LENGTH MOV R5,RECLEN ; SAVE IT MOV INSTLN,R3 ; GET THE INSTRUCTION LENGTH MOV CRNPSN,R1 ; GET CURRENT PSECT NUMBER CALL LDBTMP ; LOAD THE BITMAP FOR THIS PSECT MOV FRSTXT,R0 MOV T.ADDR(R0),R2 ; GET STARTING ADDRESS MOV R2,STADDR ; SAVE IT MOV R2,R5 ; COPY STARTING ADDRESS BIC #^C17,R5 ; GET BIT NUMBER ASH #-3,R2 ; GET OFFSET BIC #160001,R2 MOV BITMAP(R2),R0 ; GET FIRST WORD MOV BITMAP+2(R2),R1 ; GET SECOND WORD ASHC R5,R0 ; SHIFT BITS UP ASL R3 ; DOUBLE R3 BIC BADBTS-2(R3),R0 ; CLEAR EXTRANEOUS BITS MOV R0,-(SP) ; SAVE BITS FOR THIS TEXT BEQ 50$ ; WE DON'T NEED A LABEL MOV GDBITS-2(R3),R0 ; GET MASK OF BITS TO CLEAR CLR R1 ; CLEAR LOWER 16 BITS OF MASK NEG R5 ; NEGATE SHIFT COUNT BEQ 30$ ; NO SHIFTING IS NEEDED CLC ; CLEAR CARRY ROR R0 ; SHIFT DOWN ONE BIT INC R5 ; DECREMENT SHIFT COUNT ASHC R5,R0 ; PUSH MASK INTO THE RIGHT BITS 30$: BIC R0,BITMAP(R2) ; CLEAR THE BITS IN THE BITMAP BIC R1,BITMAP+2(R2) MOV SP,CHANGD ; SET "BITMAP CHANGED" FLAG MOV CRNPSN,R0 ; GET CURRENT PSECT NUMBER MOV STADDR,R1 ; GET STARTING ADDRESS MOV F.NRBD+2+FDBOUT,R5 ; GET OUTPUT BUFFER ADDRESS CALL ADDLBL ; ADD THE LABEL MOVB #':,(R5)+ ; ADD A COLON MOV GBLADR,R3 ; WAS THIS A GLOBAL SYMBOL? BEQ 60$ ; NO, SO WE'RE DONE 43$: MOV CRNPSN,R0 ; YES, GET CURRENT PSECT NUMBER MOV STADDR,R1 ; GET STARTING ADDRESS 46$: ADD #8.,R3 ; SKIP TO THE NEXT GLOBAL SYMBOL CMP R3,GBLEND ; ANY MORE SYMBOLS TO CHECK? BEQ 60$ ; NO CMPB R0,5(R3) ; YES, DO THE PSECTS MATCH? BNE 46$ ; NO, SO THIS SYMBOL IS NO GOOD CMP R1,6(R3) ; YES, DO THE ADDRESSES MATCH? BNE 46$ ; NO, SO THIS SYMBOL IS NO GOOD TSTB 4(R3) ; YES, HAS THE SYMBOL BEEN DEFINED YET? BEQ 46$ ; YES, SO DON'T DEFINE IT AGAIN CLRB 4(R3) ; NO, BUT IT WILL BE NOW SUB F.NRBD+2+FDBOUT,R5 ; CALCULATE LENGTH OF PREVIOUS LINE PUT$S #FDBOUT,,R5 ; AND OUTPUT IT MOV F.NRBD+2+FDBOUT,R5 ; GET ADDRESS OF OUTPUT BUFFER MOV R3,R0 CALL ADDR50 ; OUTPUT THE SYMBOL NAME MOVB #':,(R5)+ ; FOLLOWED BY A COLON BR 43$ ; AND CHECK FOR ANOTHER GLOBAL SYMBOL 50$: MOV F.NRBD+2+FDBOUT,R5 ; GET STARTING ADDRESS OF OUTPUT BUFFER 60$: MOVB #11,(R5)+ ; ADD A TAB MOV RECLEN,R0 ; GET THE RECORD LENGTH MOV #OUTBUF+8.,R1 ; GET OUTPUT BUFFER START ADDRESS 70$: MOVB (R1)+,(R5)+ ; COPY THE RECORD SOB R0,70$ SUB F.NRBD+2+FDBOUT,R5 ; CALCULATE ACTUAL RECORD LENGTH PUT$S #FDBOUT,,R5 ; OUTPUT THE RECORD MOV (R4),R4 ; POINT TO THE NEXT TEXT ENTRY CALL RLSTXT ; RELEASE THE PREVIOUS STUFF MOV STADDR,R1 ; COPY STARTING ADDRESS MOV (SP)+,R3 ; GET BITS FOR THIS TEXT 80$: INC R1 ; INCREMENT CURRENT ADDRESS ASL R3 ; ANY MORE LABELS TO OUTPUT? BEQ 90$ ; NO BPL 80$ ; YES, BUT NOT FOR THIS ADDRESS MOV F.NRBD+2+FDBOUT,R5 ; YES, GET OUTPUT BUFFER ADDRESS MOV CRNPSN,R0 ; GET CURRENT PSECT NUMBER CALL ADDLBL ; OUTPUT THE LABEL MOVB #'=,(R5)+ ; FOLLOWED BY A '=' MOVB #11,(R5)+ ; AND A TAB MOV GBLADR,-(SP) ; SAVE ADDRESS OF POSSIBLE GLOBAL SYMBOL MOV R1,-(SP) ; SAVE CURRENT ADDRESS MOV STADDR,R1 ; GET START ADDRESS CALL ADDSYM ; OUTPUT A SYMBOL FOR IT MOVB #'+,(R5)+ ; FOLLOWED BY A '+' SUB (SP),R1 ; CALCULATE THE DIFFERENCE IN ADDRESSES NEG R1 ADD #'0,R1 ; CONVERT IT TO ASCII MOVB R1,(R5)+ ; AND ADD IT TO THE OUTPUT SUB F.NRBD+2+FDBOUT,R5 ; CALCULATE RECORD LENGTH PUT$S #FDBOUT,,R5 ; OUTPUT THE RECORD MOV (SP)+,R1 ; RESTORE CURRENT ADDRESS MOV (SP)+,GBLADR ; WAS THIS A GLOBAL SYMBOL? BEQ 80$ ; NO, SO NO USE SEARCHING FURTHER MOV GBLADR,R2 ; GET THE GLOBAL SYMBOL ADDRESS MOV CRNPSN,R0 ; GET THE CURRENT PSECT NUMBER 85$: ADD #8.,R2 ; SKIP TO THE NEXT SYMBOL CMP R2,GBLEND ; ANY MORE TO CHECK? BEQ 80$ ; NO CMPB R0,5(R2) ; DO THE PSECTS MATCH? BNE 85$ ; NO CMP R1,6(R2) ; DO THE ADDRESSES MATCH? BNE 85$ ; NO TSTB 4(R2) ; HAS THE SYMBOL BEEN DEFINED YET? BEQ 85$ ; YES CLRB 4(R3) ; NO, BUT IT WILL BE NOW MOV F.NRBD+2+FDBOUT,R5 ; YES, GET THE OUTPUT BUFFER ADDRESS MOV R2,R0 ; OUTPUT THE GLOBAL SYMBOL NAME CALL ADDR50 SUB F.NRBD+2+FDBOUT,R5 ; CALCULATE THE RECORD LENGTH PUT$S #FDBOUT,,R5 ; OUTPUT THE RECORD BR 85$ ; AND LOOK FOR OTHER SYMBOLS 90$: RETURN ; AND WE'RE DONE .END