.TITLE ORCP3 .IDENT /V01.7/ ; ; ORCAM - PASS 3 ; ; PASS 3 PUTS IN THE LABELS ; READS ENTRIES FROM .TMP INTO MACPS ; WRITES MACRO CODE TO .MAC FROM MACLIN ; ; Modifications Record: ; ===================== ; V01.7 9-Oct-86 CJD ; Flush out any undeclared globals at end of file. ; ; DEFINE MACRO: ; .MACRO FTAB JSR PC,TAB8 .ENDM FTAB ; ; ; ; ****************************** ; * PASS 3 - PUT IN THE LABELS * ; ****************************** ; ORCP3:: CLR BLKB ; BLOCK BYTE PROCESSING FLAG 5$: JSR PC,RD$SCR BCC 8$ 7$: JMP FINISH ; ERROR OR EOF - FINISH 8$: MOV #GLOBS,R1 ;V01.7 MOV (R1)+,R0 ; CHECK FOR GLOBAL DEFS ;V01.7 BEQ 140$ ; THERE ARE NONE CMP MACPS,#177776 ; .END coming up? ;V01.7 BNE 110$ ;V01.7 JMP 1000$ ; Yes, flush any unfound labels ;V01.7 110$: CMP MACPS,4(R1) BNE 120$ CMP MACLC,6(R1) BEQ 130$ 120$: ADD #8.,R1 SOB R0,110$ BR 140$ 130$: BIS #100000,4(R1) ; Flag this label as declared ;V01.7 JSR PC,CKBLKB ; CHECK FOR BLKB PROCESSING MOV R0,-(SP) MOV R1,-(SP) MOV #MACLIN,R0 ; POINT TO MACRO LINE JSR PC,R50ASC ; PUT ASCII NAME IN MOV R0,R2 ; MAKE R2 POINT TO MACRO LINE 135$: CMPB -(R2),#40 BEQ 135$ TSTB (R2)+ MOVB #':,(R2) ;V01.7 MOVB (R2)+,(R2)+ ;V01.7 MOV MACLEN,-(SP) MOV #MACLIN+8.,MACLEN JSR PC,WR$MAC MOV (SP)+,MACLEN MOV #MACLIN,R2 ; CLEAR OUT LABEL FTAB MOV (SP)+,R1 ; RESTORE REGISTERS MOV (SP)+,R0 BR 120$ ; ; CHECK FOR LESS LOCAL LABELS (IE. LOCAL SYMBOLS) ; 140$: MOV LLLABS,R0 ; CHECK FOR LESS LOCAL LABELS BEQ 10$ ; THERE ARE NONE MOV #LLLABS+2,R1 150$: CMP MACPS,(R1)+ ; CHECK PSECT NUMBER BNE 160$ CMP MACLC,(R1) ; CHECK LOCATION COUNTER BEQ 170$ 160$: TST (R1)+ ; NO MATCH - POINT TO NEXT ENTRY SOB R0,150$ ; AND TRY AGAIN BR 10$ ; END OF TABLE 170$: JSR PC,CKBLKB ; CHECK FOR BLKB PROCESSING MOV #MACLIN,R2 ; POINT TO MACRO LINE MOV MACPS,R0 ; GET PSECT NUMBER ADD #100,R0 ; CONVERT TO A LETTER (A-Z) MOVB R0,(R2)+ ; INSERT IN LINE MOV (R1),OCOBUF ; GET LOCATION COUNTER BIS #100000,OCOBUF ; ENSURE 6 CHARACTERS JSR PC,OCO ; CONVERT TO ASCII MOV #OCOBUF+1,R1 ; REMOVE INITIAL "1" DEC R0 180$: MOVB (R1)+,(R2)+ ; INSERT IN LINE SOB R0,180$ MOVB #':,(R2)+ ; INSERT COLON ; ; CHECK FOR LOCAL LABELS (IE. NNN$:) ; 10$: MOV LABELS,R0 BEQ 100$ ; IE NO LABELS EXIST MOV #LABELS+2,R1 15$: CMP MACPS,(R1)+ BNE 20$ CMP MACLC,(R1) BEQ 40$ 20$: TST (R1)+ SOB R0,15$ BR 100$ ; NO MATCH 40$: JSR PC,CKBLKB ; CHECK FOR BLKB PROCESSING CMPB #' ,MACLIN ; LOCAL LABEL FOUND - CHECK WHETHER BEQ 45$ ; WE ALREADY HAVE A LOCAL SYMBOL HERE MOV MACLEN,-(SP) MOV #MACLIN+7,MACLEN JSR PC,WR$MAC ; WRITE OUT THE LOCAL SYMBOL FIRST MOV (SP)+,MACLEN MOV #MACLIN,R2 ; CLEAR IT OUT OF THE LINE FTAB 45$: MOV MACLC,OCOBUF TST OCOBUF BNE 50$ INC OCOBUF ; 0$ ISN'T VALID - SO MAKE IT 1$ 50$: JSR PC,OCO MOV #OCOBUF,R1 MOV #MACLIN,R2 70$: MOVB (R1)+,(R2)+ SOB R0,70$ MOVB #'$,(R2)+ MOVB #':,(R2)+ 100$: TST BLKB ; PROCESSING A BLKB? BNE 190$ ; BRANCH IF YES MOV #MACLIN+8.,R0 ; CHECK IF THIS LINE IS .BLKB CMP R0,MACLEN ; SHORT LINE? BGE 300$ ; BRANCH IF YES CMP (R0)+,#".B BNE 300$ CMP (R0)+,#"LK BNE 300$ CMP (R0)+,(R0)+ ; YES - POINT TO SIZE OF BLOCK CLRB @MACLEN ; TERMINATE NUMBER JSR PC,$COTB ; CONVERT TO BINARY MOV R1,R3 ; SIZE IN R3 MOV R1,R5 ; COPY IN R5 190$: MOV #1,R4 ; STEP ON LC BIT R4,MACLC BNE 200$ ; - BY 1, IF IT IS ODD INC R4 ; - BY 2, OTHERWISE 200$: SUB R4,R3 ; NO. OF BYTES LEFT BLE 300$ ; BRANCH IF NONE MOV #1,BLKB ; SHOW PROCESSING BLKB ADD R4,MACLC ; SET UP NEW LC JMP 8$ ; AND LOOK FOR LABELS 300$: CLR BLKB JSR PC,WR$MAC JMP 5$ ; Before ending, search the globals table for any not yet defined (bit 7 of ;V01.7 ; flags word still clear). This handles cases where a global points ;V01.7 ; to the middle of an instruction or data item, and absolute definitions ;V01.7 ; of the form GLOB==1234 ;V01.7 ; ;V01.7 ; The basic method is to put in a switch to any PSECT with an undeclared ;V01.7 ; symbol, set . to the beginning of the PSECT, then declare each symbol value ;V01.7 ; as .+offset, e.g. ;V01.7 ; ;V01.7 ; .PSECT NAME ;V01.7 ; .=.-123 ;V01.7 ; GLOB==.+456 ;V01.7 ; ;V01.7 ; Note that the absolute PSECT (.ASECT) is a special case, where no PSECT ;V01.7 ; name is required, as the symbol can just be declared as GLOB==value. ;V01.7 ; This covers the case (more likely in practice) where the symbol was ;V01.7 ; originally declared that way anyway (there is no way to distinguish between ;V01.7 ; symbols in a real .ASECT, and thore declared by ==. ;V01.7 ; ;V01.7 ; NOTE: An alternative method, which seems simpler at first, is just to force ;V01.7 ; the labelling of the base of each PSECT as p00000:, and then declare symbols ;V01.7 ; in the form GLOB==p00000+offset. However, THIS DOES NOT WORK, because you ;V01.7 ; may not actually have done a .PSECT before (if it contained no actual code). ;V01.7 ; Hence one would have to include definitions of any undefined PSECTs, making ;V01.7 ; the alternative code just as complicated as this is. ;V01.7 ;V01.7 1000$: CLR PSNUM ; No current PSECT ;V01.7 MOV #PSECTS,R4 ; Address PSECT table ;V01.7 MOV (R4)+,R3 ; Get size ;V01.7 CLR R0 ; PSECT NUMBER ;V01.7 1040$: INC R0 ;V01.7 MOV #GLOBS,R1 ; Address globals table ;V01.7 MOV (R1)+,R5 ; Get globals count ;V01.7 1041$: CMP 4(R1),R0 ; In this PSECT, and not declared? ;V01.7 BEQ 1045$ ; Yes ;V01.7 1042$: ADD #8.,R1 ; No, try next ;V01.7 1043$: SOB R5,1041$ ; global ;V01.7 ADD #8.,R4 ; Address next PSECT data ;V01.7 SOB R3,1040$ ; Try next PSECT ;V01.7 MOVB #';,MACLIN ; Restore penultimate line ;V01.7 MOV #MACLIN+1,MACLEN ;V01.7 BR 300$ ; Finish off ;V01.7 1045$: CMP R0,PSNUM ; In required PSECT already? ;V01.7 BEQ 1048$ ; Yes, no change needed ;V01.7 MOV R0,PSNUM ; Set new PSECT ;V01.7 CMP R0,ASNUM ; In .ASECT? ;V01.7 BEQ 1048$ ; Yes, don't need to specify a PSECT ;V01.7 ; Change to new PSECT, and set . to its start. ;V01.7 MOV R1,-(SP) ; Save R1 ;V01.7 MOV R4,R1 ; Point it at PSECT name ;V01.7 CMP (R4)+,(R4)+ ; Point R4 at flags word ;V01.7 JSR PC,DOPSCT ; Do PSECT title ;V01.7 MOV R2,MACLEN ; Write out PSECT line ;V01.7 JSR PC,WR$MAC ;V01.7 MOV 2(R4),OCOBUF ; Get last address in PSECT ;V01.7 BEQ 1047$ ; If 0, no change needed ;V01.7 MOV #MACLIN,R2 ; Else write out ;V01.7 MOV #".=,(R2)+ ; ".= ;V01.7 MOV #".-,(R2)+ ; .-" ;V01.7 JSR PC,OCO ; Convert offset to ASCII ;V01.7 MOV #OCOBUF,R1 ; Copy into buffer ;V01.7 1046$: MOVB (R1)+,(R2)+ ;V01.7 SOB R0,1046$ ;V01.7 MOV R2,MACLEN ; Output change ;V01.7 JSR PC,WR$MAC ;V01.7 1047$: CMP -(R4),-(R4) ; Reset R4 ;V01.7 MOV (SP)+,R1 ;V01.7 ; Show symbol value as GLOB==.+xxx, unless .ASECT, when GLOB==xxx will do ;V01.7 1048$: MOV #MACLIN,R0 ; Address buffer ;V01.7 JSR PC,R50ASC ; Put in name ;V01.7 1049$: CMPB -(R0),#40 ; Trim spaces ;V01.7 BEQ 1049$ ;V01.7 INC R0 ;V01.7 MOVB #'=,(R0) ; Put in == ;V01.7 MOVB (R0)+,(R0)+ ;V01.7 CMP PSNUM,ASNUM ; Absolute symbol? ;V01.7 BEQ 1050$ ; Yes ;V01.7 MOVB #'.,(R0)+ ; No, show relative to base of PSECT ;V01.7 MOVB #'+,(R0)+ ;V01.7 1050$: MOV R0,R2 ; Set pointer ;V01.7 TST (R1)+ ; Address value ;V01.7 MOV (R1)+,OCOBUF ; Get it ;V01.7 JSR PC,OCO ; Convert to octal ;V01.7 MOV R1,-(SP) ; Save R1 ;V01.7 MOV #OCOBUF,R1 ;V01.7 1052$: MOVB (R1)+,(R2)+ ; Copy octal value ;V01.7 SOB R0,1052$ ;V01.7 MOV (SP)+,R1 ; Restore R1 ;V01.7 MOV R2,MACLEN ; Set pointer ;V01.7 JSR PC,WR$MAC ; Write out line ;V01.7 MOV PSNUM,R0 ; Restore PSECT No ;V01.7 BR 1043$ ; Try next global ;V01.7 ; FINISH: RTS PC ; ; ; SUBROUTINE FOR PASS 3 ; ; ; ; CKBLKB - CHECK FOR BLKB BEING PROCESSED ; ON ENTRY: R3 = NO. OF BYTES LEFT IN BLOCK ; R5 = TOTAL SIZE OF BLOCK ; CKBLKB: TST BLKB ; BLKB IN PROGRESS? BEQ 100$ ; RETURN IF NOT MOV R0,-(SP) ; SAVE REGISTERS MOV R1,-(SP) MOV R2,-(SP) SUB R3,R5 ; NO. OF BYTES BEFORE THIS LABEL MOV R5,OCOBUF JSR PC,OCO ; CONVERT TO ASCII MOV #OCOBUF,R1 MOV #MACLIN+16.,R2 10$: MOVB (R1)+,(R2)+ ; PUT INTO MACRO LINE SOB R0,10$ MOV R2,MACLEN ; SET END OF LINE JSR PC,WR$MAC ; OUTPUT THE LINE MOV #MACLIN,R2 FTAB ; CLEAR OUT LABELS MOV R3,OCOBUF ; NO. OF BYTES LEFT JSR PC,OCO ; CONVERT TO ASCII MOV #OCOBUF,R1 MOV #MACLIN+16.,R2 20$: MOVB (R1)+,(R2)+ ; PUT INTO MACRO LINE SOB R0,20$ MOV R2,MACLEN ; SET END OF LINE CLR BLKB MOV (SP)+,R2 ; RESTORE REGISTERS MOV (SP)+,R1 MOV (SP)+,R0 100$: RTS PC ; .END