.TITLE PWINTG - WRITE INTEGER .IDENT /790717/ .GLOBL P.FPAD,P.FPUT ; PARMS ; 1. POINTER TO FILE BLOCK ; 2. INTEGER TO BE OUTPUT ; 3. WIDTH OF FIELD ; REGISTER USAGE ; R0 - INPUT VALUE ; R1 -> FILE BLOCK ; R2 -> CONVERTED STRING ; R3 - WIDTH, PAD CHAR TO P$FPAD ; R4 - NOT USED ; CALLS: P$FPAD, P$FPUT ; .PSECT $$$031:: MOV 6(SP),R1 ; UNPACK STACK FRAME; -> FILE BLOCK MOV (SP)+,4(SP) ; RETURN ADDRESS MOV R2,-(SP) ;SAVE R2 MOV R3,-(SP) ;SAVE R3 MOV SP,R0 ;R0 -> LOCAL WORK SPACE SUB #6,SP ;SIZE OF WORKSPACE = 6 BYTES MOV 12.(SP),R2 ;R2 = VALUE TO BE PRINTED BGE 1$ NEG R2 ;GET ABSOLUTE VALUE 1$: MOV R2,R3 ;PREPARE FOR DIVIDE CLR R2 DIV #10.,R2 ;DIVIDE VALUE BY 10 ADD #'0,R3 ;MAKE ASCII DIGIT OF REMAINDER MOVB R3,-(R0) ;STORE IT IN WORKSPACE TST R2 ;IS ANYTHING LEFT BNE 1$ ;YES, LOOP ON TST 12.(SP) ;WAS ORINGINAL VALUE <0 BGE 2$ MOVB #'-,-(R0) ;YES, MOVE IN A MINUS SIGN 2$: MOV 10.(SP),R3 ;GET FIELD LENGTH MOV SP,R2 ;COMPUTE LENGTH OF STRING BUILT ADD #6,R2 SUB R0,R2 ;R2 = LENGTH OF STRING MOV R0,-(SP) ;SAVE POINTER TO STRING MOV R2,-(SP) ;SAVE LENGTH OF STRING SUB R2,R3 ;COMPUTE PADDING NEEDED BLE 3$ ;BRANCH IF NONE NEEDED MOVB #40,R2 MOV R3,R0 JSR PC,P.FPAD ;OUTPUT PAD CHARACTERS 3$: MOV (SP)+,R3 ;RESTORE LENGTH OF STRING TO R3 MOV (SP)+,R2 ;RESTORE ADDRESS OF STRING TO R2 4$: MOVB (R2)+,@(R1) ;PUT OUT STRING JSR PC,P.FPUT SOB R3,4$ 5$: ADD #6,SP ;DELETE WORKSPACE MOV (SP)+,R3 ;RESTORE R3 MOV (SP)+,R2 ;RESTORE R2 CMP (SP)+,(SP)+ ;POP OFF REMAINING PARAMTERS RTS PC .END