.IIF NDF RSX RSX = 0 ;Assume RT11 01 + .TITLE AS3E .ident /X01.01/ .ENABL LC,GBL .LIST MEB,CND .NLIST BEX ;01 - ; ; AS ; LISTING. ; ; VERSION X01 ; ; DAVID G. CONROY 14-MAY-78 ; ; Edit history ; 01 28-Aug-79 MM Added RT11 support ; .GLOBL LIST .GLOBL LCB .GLOBL LCW .GLOBL LMODE .GLOBL LADDR .GLOBL LCBUF .GLOBL LCPTR .IF NE RSX ;01 .MCALL CALL .MCALL CALLR .MCALL RETURN .IFF ;01 + .MACRO CALL ARG1,ARG2 .IF B ARG2 JSR PC,ARG1 .IFF JSR ARG1,ARG2 .ENDC .ENDM CALL .MACRO CALLR ARG1 JMP ARG1 .ENDM .MACRO RETURN ARG1 .IF B ARG1 RTS PC .IFF RTS ARG1 .ENDC .ENDM RETURN .ENDC ;01 - ; ; GLOBAL DATA ; LMODE: .BLKW 1 ;LISTING MODE LADDR: .BLKW 1 ;LISTING ADDRESS LCBUF: .BLKW 3 ;LISTING CODE BUFFER LCPTR: .BLKW 1 ;LISTING CODE POINTER LL: .BLKB 40.+81. ;SIZEOF(LINBUF) + 40. .EVEN ;+ ; ** LIST -- LISTING ; ; THIS ROUTINE IS CALLED TO OUTPUT A LINE OF THE ASSEMBLY LISTING TO ; THE LISTING FILE OPEN ON THE LISTING FDB. THE LISTING IS ALWAYS IN ; WIDE FORMAT AND NLIST BEX. THIS MAKES LIFE A LOT EASIER. ; ; IT IS ONLY CALLED DURING PASS 3. ; ; INPUTS: ; LMODE=LISTING MODE CONTROL ; LM.N NO LISTING ; LM.S SOURCE ONLY ; LM.A ADDRESS ONLY ; LM.W WORDS ; LM.B BYTES ; LADDR=LISTING ADDRESS ; LCBUF=UP TO 3 WORDS OF BINARY DATA ; LCPTR=POINTER JUST PAST END OF DATA IN LCBUF ; ; USES: ; ALL ;- LIST: CMP LMODE,#LM.N ;IS THIS NOLIST MODE BEQ 130$ ;YES, DUCK TSTB LFLAG ;DOES HE WANT A LISTING BEQ 130$ ;NO, DUCK ; ; ERRORS. ; 11 COLUMNS. ; MOV #LL,R5 ;POINT AT THE LISTING LINE MOV #ERRTAB,R4 ;POINT AT ERRORS 10$: TSTB (R4) ;IS THERE AN ERROR? BEQ 20$ ;NO MOVB 1(R4),(R5)+ ;MOVE TO THE LISTING LINE 20$: ADD #2,R4 ;ADVANCE TO NEXT ERROR CMP R4,#ERREND ;MORE? BLO 10$ ;YES MOV #' ,R0 ;PAD OUT WITH BLANKS 30$: CMP R5,#LL+11. ; BHIS 40$ ; MOVB R0,(R5)+ ; BR 30$ ; ; ; ADDRESS. ; 40$: CMP LMODE,#LM.S ;NEED THE ADDRESS BEQ 100$ ;NO MOVB R0,(R5)+ ;BLANK MOV LADDR,R0 ;PUT OUT THE ADDRESS CALL LWORD ; ; ; CODE. ; MOV LMODE,R0 ;DO WE NEED CODE CMP R0,#LM.S ; BEQ 100$ ;NO CMP R0,#LM.A ; BEQ 100$ ;NO CMP R0,#LM.B ;IS THIS BYTE MODE BNE 70$ ;NO CMP LCPTR,#LCBUF+3 ;DO ONLY 3 BYTES BLOS 70$ ; MOV #LCBUF+3,LCPTR ; 70$: MOV #LCBUF,R4 ;POINT AT THE CODE BUFFER 80$: CMP R4,LCPTR ;IS THERE MORE CODE BHIS 100$ ;NO CMP LMODE,#LM.W ;WORDS OR BYTES? BNE 90$ ;BYTES MOVB #' ,(R5)+ ;PUT OUT A WORD OF CODE MOV (R4)+,R0 ; CALL LWORD ; BR 80$ ; 90$: MOV #' ,R0 ;PUT OUT A BYTE OF CODE MOVB R0,(R5)+ ;4 BLANKS MOVB R0,(R5)+ ; MOVB R0,(R5)+ ; MOVB R0,(R5)+ ; MOVB (R4)+,R0 ; CALL LBYTE ; BR 80$ ; ; ; PAD TO COLUMN 40. ; 100$: CMP R5,#LL+40. ;AT COLUMN 40 BHIS 110$ ;YES MOVB #' ,(R5)+ ;PAD BR 100$ ; ; ; COPY SOURCE LINE TO THE LISTING LINE. ; 110$: MOV #LINBUF,R4 ;POINT AT SOURCE LINE 120$: MOVB (R4)+,(R5)+ ;COPY TO THE NULL BNE 120$ ; DEC R5 ;COMPUTE THE LINE SIZE SUB #LL,R5 ; MOV #LFILE,R0 ;01 + MOV R5,-(SP) MOV #LL,-(SP) CALL PUTTXT ;OFF IT GOES BIT (SP)+,(SP)+ ;TRASH THE STACK ;01 - 130$: RETURN ;DONE ;+ ; ** LCB -- CODE BYTE FOR LISTING ; ** LCW -- CODE WORD FOR LISTING ; ; THESE ROUTINES ARE USED TO PROVIDE A LEVEL OF ISOLATION BETWEEN ; THE CODER AND THE LISTING BUFFER. ; ; INPUTS: ; R0=BYTE OR WORD. ;- LCW: CALL LCB ;LOW BYTE SWAB R0 ; CALL LCB ;HIGH BYTE SWAB R0 ; RETURN ; LCB: CMP LCPTR,#LCBUF+6 ;ROOM BHIS 10$ ;NO MOVB R0,@LCPTR ;SAVE THE BYTE INC LCPTR ;FIX POINTER 10$: RETURN ; ;+ ; ** LWORD -- INTEGER TO OCTAL ASCII (WORD) ; ** LBYTE -- INTEGER TO OCTAL ASCII (BYTE) ; ; INPUTS: ; R0=DATA ; ; OUTPUTS: ; R5=UPDATED ; ; USES: ; R0, R1, R2 ;- .ENABL LSB LWORD: MOVB #'0,(R5) ;THE TOP DIGIT IS SPECIAL ASL R0 ; ADCB (R5)+ ; MOV #5,R1 ;SET DIGIT COUNT BR 10$ ;GO TO COMMON CODE LBYTE: SWAB R0 ;REPOSITION THE BYTE CLC ; ROR R0 ;IN THE TOP 9 BITS MOV #3,R1 ;SET DIGIT COUNT 10$: MOV #6,R2 ;INITIAL ASCII BIAS ASL R0 ;GET A DIGIT ROL R2 ; ASL R0 ; ROL R2 ; ASL R0 ; ROL R2 ; MOVB R2,(R5)+ ;PUT IN BUFFER DEC R1 ;MORE? BNE 10$ ;NO RETURN ;DONE .DSABL LSB .END