;STNDTE.M68 Convert Julian Date to MMDDYY Subroutine ; ; Author.............. Jalal E. Raissi ; Installation........ Mini-Microcomputer Consultants ; Last Date Modified.. April 14, 1984 ; Reason for Change... Added the System Date routine. JER ; ; Purpose............. To edit dates in days since 01/01/00 form and return ; their value in MMDDYY format! ; ; XCALL STNDTE,SNDDTE,RCVDTE,FLGDTE ; ; Where: ; MAP1 SNDDTE,S,6 ; MAP1 RCVDTE,F,6 ; MAP1 FLGDTE,B,1 ; ; And: ; A4 = address of SNDDTE ; A5 = address of RCVDTE ; A2 = address of FLGDTE ; D5 = RCVDTE ; SEARCH SYS SEARCH SYSSYM SEARCH MMCRT SEARCH TRM VMAJOR=1. VMINOR=1. VSUB=0. VEDIT=0. VWHO=0. OBJNAM .SBR PHDR -1,PV$RSM,PH$REE!PH$REU CLR D0 ; clear D0 CLR D1 ; clear D1 CLR D2 ; clear D2 MOV A3,A1 ; move A3 to A1 MOVW @A1,D1 ; look at the argument count CMPB D1,#3 ; three arguments must be passed JLT LESARG ; if less, let'm know CLR D4 ; clear index register MOVW 2(A1)[D4],D1 ; move argument type to D1 CMPB D1,#2 ; is it string? JNE NOSTR ; no, let'm know MOVL 4(A1)[D4],A4 ; move address of SNDDTE to A4 MOVL 10(A1)[D4],D1 ; move size of SNDDTE to D1 CMPB D1,#6 ; must be at least 6 bytes JLT SERROR ; if less, let'm know ADD #12,D4 ; step to the next argument passed MOVW 2(A1)[D4],D1 ; move argument type to D1 CMPB D1,#4 ; is it floating point? JNE NOFLT ; no, let'm know MOV 4(A1)[D4],A5 ; move address of RCVDTE to A5 FFTOL @A5,D5 ; move the 'JULIAN' date to D5 ADD #12,D4 ; step to the next argument passed MOVW 2(A1)[D4],D1 ; move argument type to D1 CMPB D1,#6 ; is it binary? JNE NOBIN ; no, let'm know MOV 4(A1)[D4],A2 ; move the address of FLGDTE to A2 MOVB @A2,D1 ; move FLGDTE to D1 CMPB D1,#2 ; System Date wished? BNE FNDYER ; if not, go to FNDYER ;::::::::::::::::::::::::::: ; System Date : ;::::::::::::::::::::::::::: CLR D2 ; clear D2 CLR D3 ; clear D3 CLR D5 ; clear D5 GDATES D2 ; get System Date SWAP D2 ; exchange halves MOVB D2,D5 ; move month to D5 MOV D2,D3 ; move entire word to D3 RORW D3,#10 ; rotate 8 bits AND #377,D3 ; get DAY SWAP D2 ; exchange again AND #377,D2 ; get YEAR JMP ENDRTN ; go to ENDRTN ;::::::::::::::::::::::: ; FIND YEAR : ;::::::::::::::::::::::: FNDYER: CLR D3 ; clear D3 CMP D5,#1 ; compare RCVDTE to 1! JLT JERROR ; if less, let'm know CMP D5,#107254 ; compare RCVDTE to 36524. YY=99! JGT JERROR ; if greater, let'm know MOV D5,D0 ; move RCVDTE to work area MUL D0,#144 ; multiply it by 100 DIV D0,#107255 ; divide by 36525 to get the year MOVB D0,D2 ; save the year MOV D2,D0 ; move it to work area DIV D0,#4 ; divide it by 4 MOVB D0,D3 ; save the leap days MUL D0,#4 ; multiply it by 4 MOV D0,D1 ; store in D1 MOV D2,D0 ; move the year to D0 MUL D0,#555 ; multiply it by 365 CMP D1,D2 ; is it a leap year? BNE SKPDEC ; if not, go to SKPDEC DEC D3 ; why? SKPDEC: ADD D3,D0 ; add the leap days MOV D5,D3 ; move RCVDTE to D3 SUB D0,D3 ; get days into this year ;::::::::::::::::::::::::::::::::::: ; check for LEAP YEAR : ;::::::::::::::::::::::::::::::::::: CMP D1,D2 ; is it a leap year? BNE MONTH ; if not, go to MONTH CMP D3,#75 ; past February? BGE DECONE ; skip fiddling! CMP D3,#74 ; February 29? BNE MONTH ; if not, go to MONTH MOVB #2,D5 ; month is February MOVB #35,D3 ; number of days is 29 JMP ENDRTN ; go to ENDRTN DECONE: DEC D3 ; subtract 1 for leap year ;:::::::::::::::::::::::::::::::: ; SORT OUT THE MONTH : ;:::::::::::::::::::::::::::::::: MONTH: MOV D3,D4 ; store number of days in D4 MOV #1,D5 ; assume it is January SUB #37,D4 ; take out 31 days CMP D4,#1 ; anything left? JLT ENDRTN ; if not, go to ENDRTN MOV D4,D3 ; update number of days left MOV #2,D5 ; assume it is February SUB #34,D4 ; take out 28 days CMP D4,#1 ; anything left? JLT ENDRTN ; if not, go to ENDRTN MOV D4,D3 ; update number of days left MOV #3,D5 ; assume it is March SUB #37,D4 ; take out 31 days CMP D4,#1 ; anything left? JLT ENDRTN ; if not, go to ENDRTN MOV D4,D3 ; update number of days left MOV #4,D5 ; assume it is April SUB #36,D4 ; take out 30 days CMP D4,#1 ; anything left? JLT ENDRTN ; if not, go to ENDRTN MOV D4,D3 ; update number of days left MOV #5,D5 ; assume it is May SUB #37,D4 ; take out 31 days CMP D4,#1 ; anything left? JLT ENDRTN ; if not, go to ENDRTN MOV D4,D3 ; update number of days left MOV #6,D5 ; assume it is June SUB #36,D4 ; take out 30 days CMP D4,#1 ; anything left? JLT ENDRTN ; if not, go to ENDRTN MOV D4,D3 ; update number of days left MOV #7,D5 ; assume it is July SUB #37,D4 ; take out 31 days CMP D4,#1 ; anything left? JLT ENDRTN ; if not, go to ENDRTN MOV D4,D3 ; update number of days left MOV #10,D5 ; assume it is August SUB #37,D4 ; take out 31 days CMP D4,#1 ; anything left? JLT ENDRTN ; if not, go to ENDRTN MOV D4,D3 ; update number of days left MOV #11,D5 ; assume it is September SUB #36,D4 ; take out 30 days CMP D4,#1 ; anything left? JLT ENDRTN ; if no, go to ENDRTN MOV D4,D3 ; update number of days left MOV #12,D5 ; assume it is October SUB #37,D4 ; take out 31 days CMP D4,#1 ; anything left? JLT ENDRTN ; if not, go to ENDRTN MOV D4,D3 ; update number of days left MOV #13,D5 ; assume it is November SUB #36,D4 ; take out 30 days CMP D4,#1 ; anything left? JLT ENDRTN ; if not, go to ENDRTN MOV D4,D3 ; update number of days left MOV #14,D5 ; it must be December, then! ;:::::::::::::::::::::::::: ; END ROUTINE : ;:::::::::::::::::::::::::: ENDRTN: CMPB D5,#12 ; is it October? BLT ZEROM ; if less, go to ZEROM MOVB #61,D0 ; set MONTH's 1st digit to 1 MOV D5,D1 ; move MONTH to work area SUBB #12,D1 ; get MONTH's 2nd digit BR FSTMM ; go to FSTMM ZEROM: MOVB #60,D0 ; set MONTH's 1st digit to 0 MOV D5,D1 ; move MONTH to work area FSTMM: MOVB D0,(A4)+ ; move MONTH's 1st digit to SNDDTE[1,1] ADDB #60,D1 ; ASCII 2nd digit MOVB D1,(A4)+ ; move MONTH's 2nd digit to SNDDTE[2,2] CLR D0 ; clear work area CMPB D3,#12 ; is DAY 10? BLT ZEROD ; if not, go to ZEROD MOVB D3,D0 ; move number of days this month to D0 DIV D0,#12 ; single out 1st digit MOVB D0,D4 ; store it in D4 MUL D4,#12 ; multiply it by 10 SUB D4,D3 ; get DAY's 2nd digit MOV D3,D1 ; put it in D1 ADDB #60,D0 ; ASCII DAY's 1st digit BR FSTDD ; go to FSTDD ZEROD: MOVB #60,D0 ; set DAY's 1st digit to 0 MOV D3,D1 ; move DAY's 2nd digit to D1 FSTDD: MOVB D0,(A4)+ ; move DAY's 1st digit to SNDDTE[3,3] ADDB #60,D1 ; ASCII 2nd digit MOVB D1,(A4)+ ; move DAY's 2nd digit to SNDDTE[4,4] CLR D0 ; clear work area CMPB D2,#12 ; is YEAR 10? BLT ZEROY ; if less, go to ZEROY MOV D2,D0 ; move YEAR to D0 DIV D0,#12 ; single out YEAR's 1st digit MOV D0,D4 ; move it to D4 MUL D4,#12 ; multiply it by 10 SUB D4,D2 ; get YEAR's 2nd digit MOV D2,D1 ; put it in D1 ADDB #60,D0 ; ASCII YEAR's 1st digit BR FSTYY ; go to FSTYY ZEROY: MOVB #60,D0 ; set YEAR's 1st digit to 0 MOV D2,D1 ; move YEAR's 2nd digit to D1 FSTYY: MOVB D0,(A4)+ ; move YEAR's 1st digit to SNDDTE[5,5] ADDB #60,D1 ; ASCII 2nd digit! MOVB D1,(A4)+ ; move YEAR's 2nd digit to SNDDTE[6,6] ;::::::::::::::::::::::::::::::: ; go back to BASIC : ;::::::::::::::::::::::::::::::: EXT: MOVB #0,@A2 ; all went ok RTN ; return to BASIC ;:::::::::::::::::::::::::::::: ; error routines : ;:::::::::::::::::::::::::::::: LESARG: CALL SETUP TYPE JMP PROMPT NOSTR: CALL SETUP TYPE JMP PROMPT SERROR: CALL SETUP TYPE JMP PROMPT NOFLT: CALL SETUP TYPE JMP PROMPT NOBIN: CALL SETUP TYPE BR PROMPT JERROR: CALL SETUP TYPE 36524.> PROMPT: MMCRT #30,#63 ; ? TAB(24,51); TYPE TIN ; get a key stroke MMCRT #30,#1 ; ? TAB(24,1); MOV #177411,D1 ; ? TAB(-1,9); TCRT ; do it! MOVB #1,@A2 ; all did not go ok! RTN ; return to BASIC SETUP: MOV #7,D1 ; ding! TTY ; do it! MMCRT #30,#1 ; ? TAB(24,1); RTN ; fetch next instruction from PC END ; end of source program .