.TITLE CLENUP .IDENT /hah003/ .PSECT CODE,RO ; ; VERSION 01 ; ; TOM GETZINGER 26-OCT-80 ; ; Modified: 04-Nov-83 HAH003 ; Convert negative numbers to positive numbers ; ; THIS ROUTINE PERFORMS ALL CLEANING UP REQUIRED. ; ; SYSTEM MACRO CALLS ; .MCALL CLOSE$ PUT$S ; ; LOCAL DATA ; .PSECT RWDATA,RW,D PSN: .BLKW 1 ; PSECT NUMBER CURRENTLY BEING WORKED ON .PSECT CODE CLENUP:: CLR PSN ; CLEAR PSECT NUMBER MOV CRNPSN,R0 ; GET CURRENT PSECT NUMBER BMI 10$ ; THERE IS NONE ASH #3,R0 ; CONVERT IT TO AN OFFSET IN THE PSECT TABLE ADD PSCTBL,R0 ; CONVERT IT TO AN ADDRESS IN THE PSECT TABLE MOV CRNADR,4(R0) ; SAVE CURRENT ADDRESS CMP CRNADR,6(R0) ; DID WE HIT THE MAX ADDRESS? BNE 10$ ; NO CLR 6(R0) ; YES, SO CLEAR THE MAX ADDRESS 10$: MOV PSCTBL,R4 ; POINT TO THE PSECT TABLE 20$: TST 6(R4) ; DID WE HIT THE MAX IN THIS PSECT? BEQ 40$ ; YES CMP CRNPSN,PSN ; NO, ARE WE IN THE RIGHT PSECT? BEQ 30$ ; YES MOV F.NRBD+2+FDBOUT,R5 ; NO, GET OUTPUT BUFFER ADDRESS CMP (R4),#^R. A ; IS THIS .ASECT? BNE 23$ ; NO MOV #ASECT,R0 ; YES, SO OUTPUT " .ASECT" CALL APPEND BR 26$ 23$: MOV #PSECT,R0 ; NO, SO OUTPUT " .PSECT " CALL APPEND MOV R4,R0 ; FOLLOWED BY THE PSECT NAME CALL ADDR50 26$: SUB F.NRBD+2+FDBOUT,R5 ; CALCULATE RECORD LENGTH PUT$S #FDBOUT,,R5 ; OUTPUT THE RECORD MOV PSN,CRNPSN ; NOW IT'S THE RIGHT PSECT 30$: MOV F.NRBD+2+FDBOUT,R5 ; GET THE OUTPUT BUFFER ADDRESS MOV #BLKB,R0 ; OUTPUT " .BLKB " CALL APPEND MOV 6(R4),R0 ; GET MAX ADDRESS SUB 4(R4),R0 ; MINUS CURRENT ADDRESS MOV 6(R4),4(R4) ; SET CURRENT ADDRESS TO MAX ADDRESS CALL ADDOCT ; ADD DIFFERENCE TO OUTPUT STRING SUB F.NRBD+2+FDBOUT,R5 ; CALCULATE RECORD LENGTH PUT$S #FDBOUT,,R5 ; OUTPUT THE RECORD 40$: MOV PSN,R1 ; GET THE PSECT NUMBER CALL LDBTMP ; LOAD THE BITMAP FOR THIS PSECT MOV #BITMAP,R3 ; GET THE STARTING ADDRESS OF THE BITMAP CLR R1 ; INITIALIZE ADDRESS 45$: MOV (R3)+,R2 ; GET THE NEXT 16 BITS BEQ 90$ ; THERE ARE NO LABELS HERE CMP CRNPSN,PSN ; ARE WE IN THE RIGHT PSECT? BEQ 50$ ; YES CMP (R4),#^R. A ; IS THIS .ASECT? BEQ 50$ ; YES, SO DON'T BOTHER WITH A ".PSECT" MOV F.NRBD+2+FDBOUT,R5 ; NO, GET OUTPUT BUFFER ADDRESS MOV #PSECT,R0 ; OUTPUT " .PSECT " CALL APPEND MOV R4,R0 ; FOLLOWED BY THE PSECT NAME CALL ADDR50 SUB F.NRBD+2+FDBOUT,R5 ; CALCULATE THE RECORD LENGTH PUT$S #FDBOUT,,R5 ; OUTPUT THE RECORD MOV PSN,CRNPSN ; WE ARE NOW IN THE RIGHT PSECT 50$: TST 4(R4) ; ARE WE AT LOCATION 0? BEQ 60$ ; YES MOV F.NRBD+2+FDBOUT,R5 ; NO, GET THE OUTPUT BUFFER ADDRESS MOV #.EQ.M,R0 ; OUTPUT " .=.-" CALL APPEND MOV 4(R4),R0 ; FOLLOWED BY THE CURRENT ADDRESS CLR 4(R4) CALL ADDOCT SUB F.NRBD+2+FDBOUT,R5 ; CALCULATE RECORD LENGTH PUT$S #FDBOUT,,R5 ; AND OUTPUT IT 60$: MOV R1,-(SP) ; SAVE CURRENT ADDRESS 70$: ROL R2 ; DO WE NEED A LABEL HERE? BCC 80$ ; NO MOV F.NRBD+2+FDBOUT,R5 ; YES, GET OUTPUT BUFFER ADDRESS MOV PSN,R0 ; GET CURRENT PSECT NUMBER CALL ADDLBL ; OUTPUT THE LABEL 72$: MOVB #'=,(R5)+ ; FOLLOWED BY AN EQUAL MOVB #11,(R5)+ ; FOLLOWED BY A TAB movb #' ,(r5)+ ;Store space for a '-' sign ;hah003 CMP (R4),#^R. A ; IS THIS .ASECT? BEQ 75$ ; YES dec r5 ;Forget the space ;hah003 MOV #.EQ.P+3,R0 ; NO, SO ADD ".+" CALL APPEND 75$: MOV R1,R0 ; FOLLOWED BY THE ADDRESS cmp #170000,r0 ;Is this a negative number? ;hah003 bhi 76$ ;No ;hah003 neg r0 ;Make it positive ;hah003 movb #'-,-1(r5) ;Put a minus sign over the space or the ;hah003 76$: ; plus sign ;hah003 CALL ADDOCT SUB F.NRBD+2+FDBOUT,R5 ; CALCULATE THE RECORD LENGTH PUT$S #FDBOUT,,R5 ; AND OUTPUT IT MOV GBLADR,R5 ; WAS THIS A GLOBAL SYMBOL? BEQ 80$ ; NO, SO WE'RE DONE WITH THIS LOCATION MOV PSN,R0 ; YES, SO GET THE CURRENT PSECT NUMBER 77$: ADD #8.,R5 ; SKIP TO THE NEXT GLOBAL SYMBOL CMP R5,GBLEND ; ARE THERE ANY MORE? BEQ 80$ ; NO, SO WE'RE DONE WITH THIS LOCATION CMPB R0,5(R5) ; YES, DO THE PSECTS MATCH? BNE 77$ ; NO, TRY THE NEXT SYMBOL CMP R1,6(R5) ; YES, DO THE ADDRESSES MATCH? BNE 77$ ; NO, TRY THE NEXT SYMBOL TSTB 4(R5) ; YES, HAS THIS SYMBOL BEEN DEFINED YET? BEQ 77$ ; YES, TRY THE NEXT SYMBOL MOV R5,GBLADR ; NO, SAVE THE ADDRESS OF THE SYMBOL ENTRY MOV R5,R0 MOV F.NRBD+2+FDBOUT,R5 ; GET THE OUTPUT BUFFER ADDRESS CALL ADDR50 ; OUTPUT THE SYMBOL BR 72$ ; FOLLOWED BY THE REST 80$: INC R1 ; INCREMENT THE ADDRESS TST R2 ; ANY MORE LABELS NEEDED? BNE 70$ ; YES MOV (SP)+,R1 ; NO, RESTORE ADDRESS 90$: ADD #16.,R1 ; SKIP OVER 16 BYTES BNE 45$ ; AND CONTINUE LOOKING FOR LABELS ADD #8.,R4 ; SKIP TO THE NEXT PSECT IN THE TABLE INC PSN ; INCREMENT PSECT NUMBER CMP PSN,NPSCTS ; ANY MORE TO CHECK? BEQ 95$ ; NO, SO GO ADD THE ".END" JMP 20$ ; YES, SO GO CHECK THEM 95$: MOV F.NRBD+2+FDBOUT,R5 ; GET OUTPUT BUFFER ADDRESS MOV #END,R0 ; OUTPUT = " .END" CALL APPEND BIT #1,ENDADR ; DOES THE .END SPECIFY AN ADDRESS? BNE 100$ ; NO MOVB #11,(R5)+ ; YES, SO ADD A TAB TO THE OUTPUT MOV #ENDPSC,R0 ; GET THE .END PSECT NUMBER CALL PSCNUM MOV ENDADR,R1 ; AND THE .END ADDRESS CALL ADDSYM ; ADD A SYMBOL TO THE .END 100$: SUB F.NRBD+2+FDBOUT,R5 ; CALCULATE THE RECORD LENGTH PUT$S #FDBOUT,,R5 ; OUTPUT THE RECORD CLOSE$ ; CLOSE THE OUTPUT FILE CLOSE$ #FDBIN ; AND THE INPUT FILE CLOSE$ #FDBTMP ; AND THE TEMPORARY FILE RETURN ; THAT'S ALL .END