; SUBROUTINE MOCNVT ; TO CONVERT MONTHS FROM NUMBER TO ASCII AND VICE VERSA ; FORTRAN CALL: ; CALL MOCNVT(NUM,MONTH,MODE,ISTAT) ; WHERE: ; NUM = NUMBER OF MONTH (1-12) ; MONTH = 3 CHAR ASCII MONTH NAME ; MODE: ; 1 = NUM > ASCII ; 2 = ASCII > NUM ; ISTAT: STATUS RETURN ; 1 = OK ; 2 = INVALID PARAM FOR CONVERSION ; 3 = INVALID MODE .TITLE MOCNVT .CSECT .GLOBL MOCNVT MOTABL: .ASCII /JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC/ .EVEN MOCNVT: CMP #1,@6(R5) ;IS IT NUM TO ASCII BEQ NTOA ;IF SO BRANCH TO THAT ROUTINE CMP #2,@6(R5) ;IS IT ASCII TO NUM BEQ ATON ;BRANCH TO APPROPRIATE ROUTINE MOV #3,@10(R5) ;IF NOT EITHER, MOVE ERROR CODE RTS PC ;TO STATUS AND RETURN NTOA: MOV @2(R5),R1 ;MONTH NUMBER IN R1 CMP R1,#1 ;IS IT LESS THAN 1 BLT ERR01 ;IF SO REPORT ERROR CMP R1,#12. ;IS IT GREATER THAN 12. BGT ERR01 ;IF SO REPORT ERROR DEC R1 ;SUBTRACT 1 MUL #3,R1 ;AND MULTIPLY BY 3 FOR OFFSET ADD #MOTABL,R1 ;ADDRESS IN TABLE NOW IN R1 MOV #3,R0 ;COUNTER FOR BYTE TRANSFER MOV 4(R5),R2 ;TRANSFER DESTINATION ADDRESS IN R2 1$: MOVB (R1)+,(R2)+ ;MOV A CHARACTER SOB R0,1$ ;AND DO IT OVER (R0) TIMES (3) MOV #1,@10(R5) ;INDICATE SUCCESS RTS PC ;AND RETURN ATON: MOV 4(R5),R4 ;MONTH ADDRESS IN R4 FOR SAFEKEEPING MOV #12.,R3 ;SET UP COUNT DOWN REGISTER 2$: MOV R3,R1 ;CALCULATE TABLE ADDRESS IN R1 DEC R1 ;BY DECREMENTING MONTH COUNTER MUL #3,R1 ;AND MULTIPLYING BY 3 ADD #MOTABL,R1 ;AND ADDING IN STARTING ADDRESS MOV R4,R2 ;RENEW MONTH ADDRESS IN R2 MOV #3,R0 ;SET CHAR COUNTER TO 3 4$: CMPB (R1)+,(R2)+ ;SEE IF CHARACTERS MATCH BNE 3$ ;IF NOT TRY AGAIN SOB R0,4$ ;KEEP CHECKING (R0) TIMES (3) MOV R3,@2(R5) ;IF WE SURVIVED THE CHECK R3 IS IT MOV #1,@10(R5) ;INDICATE SUCCESS RTS PC ;AND WE ARE DONE 3$: SOB R3,2$ ;TRY ANOTHER MONTH ERR01: MOV #2,@10(R5) ;TIME RAN OUT, SET ERROR STATUS RTS PC ;AND RETURN .END