.TITLE CNVDAT - CONVERT DATE .IDENT -5.0- .MCALL DIR$,QIOW$,EXIT$S P$SECT=0 ;+ ; CNVDAT---CONVERT DATE FROM STRING TO MONOTONICALLY INCREASING ; BINARY INTEGER. ;- ; .NLIST BEX .IF NE P$SECT .PSECT CODE,RO .ENDC MONTHS: .ASCII \JAN\<-1>\FEB\<-1>\MAR\<-1>\APR\<-1>\MAY\<-1>\JUN\<-1> .ASCII \JUL\<-1>\AUG\<-1>\SEP\<-1>\OCT\<-1>\NOV\<-1>\DEC\<-1> .LIST BEX .BYTE 0 .EVEN CNVDAT:: JSR R5,$SAVRG ; SAVE REGS 3,4,5 CALL CNV2 ; CONVERT TO BINARY MOV R2,-(SP) ; SAVE THAT MUCH BEQ 50$ ; MUST BE SOMETING CMPB #'-,(R1)+ ; SKIP SEPARATOR BEQ 10$ ; BR IF SEPARATOR DEC R1 ; BACK UP 10$: MOV #MONTHS,R4 ; LIST OF ALL MONTHS 20$: MOV R1,R3 ; COPY ADDRESS OF MONTH NAME 30$: CMPB (R3)+,(R4)+ ; SAME? BEQ 30$ ; BR AS LONG AS YES TSTB -1(R4) ; END OF MONTH BMI 60$ ; YES-FOUND IT ADD #31.,(SP) ; NO ADD IN A MONTH'S WORTH OF DAYS 40$: TSTB (R4)+ ; LOOK FOR NEXT MONTH BGT 40$ ; BR IF NOT END TSTB (R4) ; END OF LIST? BNE 20$ ; BR IF NO 50$: DIR$ #FERR ; BAD DATE FORMAT SEC ;INDICATE ERROR RETURN 60$: MOV R3,R1 ; COPY PLACE IN INPUT STRING CMPB -(R1),#'- ; SEPARATOR? BNE 70$ ; INC R1 ; BACK UP 70$: CALL CNV2 ; GET YEAR SUB #70.,R2 ; ADJ TO REL 1970 BMI 50$ ; BR IF BAD SWAB R2 ; MULT X 256 ASL R2 ; 2 MORE = 512 ADD (SP)+,R2 ; FIND TOTAL DATE BR EXIT CNV2: CLR R2 ; INIT ACCUMULATOR MOV #2,R5 ; SET MAX CHARS TO CONVERT 10$: CMPB (R1),#'0 ; CHECK FOR RANGE BLO 20$ ; BR IF OUT CMPB (R1),#'9 ; CHECK OTHER END BHI 20$ ; BR IF OUT CLR -(SP) ; GET A ZERO MOVB (R1)+,(SP) ; GET THE VALUE SUB #'0,(SP) ; REMOVE ASCII BIAS ASL R2 ; MULT PREVIOUS ADD R2,(SP) ; SAVE TIME 2 RESULT ASL R2 ; X 4 ASL R2 ; X 8 ADD (SP)+,R2 ; FINAL RESULT OLD X 10 + NEW SOB R5,10$ ; LOOP? 20$: EXIT: CLC ;INDICATE NO ERROR RETURN ; FERR: QIOW$ IO.WVB,5,5,,,, MESS: .ASCII <12><15>/CNVDAT - BAD DATE/ MESSL=.-MESS .EVEN .END