MISOSYS EDAS-4.3 04/19/99 00:05:55 DATE/TIME - LS-DOS 6.3 Page 00001 00001 ;LBDATE/ASM - Date/Time Commands 00003 ; 0000 00004 *GET BUILDVER/ASM:3 00005 ; 00006 ; Buildver/asm is a bit of a kludge since not all utilities can load 00007 ; equates from LDOS60 and still compile. LOWCORE and everybody else 00008 ; relies on this setting, and it eventually ends up in LDOS60/EQU 00009 ; for programs that can use that. 00010 ; FFFF 00011 @BLD631 EQU -1 ;<631>Build 631 distribution (LEVEL 1B) 00012 ; These switches activate patches made since the 1B release. 00013 ; It is important that all earlier patches be enabled when a higher 00014 ; patch is enabled. 00015 ; Patches C thru F were published in TMQ IV.iv, page 32 (NOTE: the 00016 ; patch addresses listed for SPOOL in SPOOL1/FIX are 19H high.) FFFF 00017 @BLD631C EQU -1 ;<631>Apply 1C patches (SETKI) FFFF 00018 @BLD631D EQU -1 ;<631>Apply 1D patches (DIR) FFFF 00019 @BLD631E EQU -1 ;<631>Apply 1E patches (DIR & MEMDISK/DCT) FFFF 00020 @BLD631F EQU -1 ;<631>Apply 1F patches (SPOOL) 00021 ; Patches G and H were published in TMQ V.i, pages 10 and 18/19. FFFF 00022 @BLD631G EQU -1 ;<631>Apply 1G patches (//KEYIN,DIR,DO *) FFFF 00023 @BLD631H EQU -1 ;<631>Apply 1H patches (MEMORY) 00024 ; 00025 ;End of BUILDVER/ASM 0000 00026 *GET SVCMAC:3 ;SVC Macro equivalents 00027 ;SVCMAC/ASM - LS-DOS Version VI 00028 *LIST OFF 00420 *LIST ON 00422 *LIST OFF ;Get LDOS60/EQU 00560 *LIST ON 00561 ; 000D 00562 CR EQU 13 001D 00563 @ADTSK EQU 29 ;Add Task SVC # 001E 00564 @RMTSK EQU 30 ;Remove Task SVC # 0005 00565 CLK_SLT EQU 5 ;Clock Task Slot # 00566 ; 00567 ; 00568 ; DATE$ Storage 00569 ; 00570 ; DATE$+0 Year (80-87) 00571 ; DATE$+1 Day of the month (1-31) 00572 ; DATE$+2 Month (1-12) 00573 ; DATE$+3 Bits 0-7 of Day of Year 00574 ; Date$+4 Bit 0 = bit 8 of Day of Year 00575 ; Bits 1-3 contain Day of Week 00576 ; Bit 7 set if a leap year 00577 ; 00578 ; TIME$ Storage 00579 ; 00580 ; TIME$+0 Seconds (0-59) 00581 ; TIME$+1 Minutes (0-59) 00582 ; TIME$+2 Hours (0-23) 00583 ; 00584 ; MISOSYS EDAS-4.3 04/19/99 00:05:55 DATE/TIME - LS-DOS 6.3 Page 00002 00585 ; 2400 00586 ORG 2400H 00587 ; 00588 ; Branch to TIME entry point 00589 ; 2400 C31825 00590 JP TIME ;Time entry point 00591 ; MISOSYS EDAS-4.3 04/19/99 00:05:55 DATE/TIME - LS-DOS 6.3 Page 00003 ' Dummy Buffer 2410 00605 @@DATE ;DE <= DATE$+0 2410+3E12 00606 LD A,18 2412+EF 00607 RST 40 2413 E1 00608 POP HL ;Recover command ptr 2414 D5 00609 PUSH DE ;Xfer ptr to IY 2415 FDE1 00610 POP IY 00611 ; 00612 ; Was a Date entered on the command line ? 00613 ; 2417 7E 00614 LD A,(HL) ;P/u character 2418 FE0E 00615 CP CR+1 ;Date entry ? 241A DA6224 00616 JP C,DSPDATE ;No - display date 00617 ; 00618 ; Date entered - check if legal format 00619 ; 241D 0E30 00620 LD C,'0' ;Init separator 241F CDB525 00621 CALL PARSDAT ;Parse entry 2422 C21125 00622 JP NZ,BADFMT ;Bad entry - abort 00623 ; 00624 ; Legal Date - If Intl date - swap DTBUF+1 & 2 00625 ; 00626 IF @INTL 00627 INC DE ;DE => DTBUF+1 00628 LD H,D ;HL => DTBUF+1 00629 LD L,E 00630 LD C,(HL) ;C = Intl MONTH 00631 INC HL ;HL => DTBUF+2 00632 LD A,(HL) ;A = Intl DAY 00633 LD (DE),A ;Set DTBUF+1 = DAY 00634 LD (HL),C ;Set DTBUF+2 = MONTH 00635 DEC DE ;DE => DTBUF+0 00636 ELSE 2425 00 00637 DC 9,0 ;Pad US ver to match Intl 00 00 00 00 00 00 00 00 00638 ENDIF 00639 ; 00640 ; Is the year legal ? 00641 ; 242E 1A 00642 LD A,(DE) ;P/u year entry 00643 IF @BLD631 MISOSYS EDAS-4.3 04/19/99 00:05:55 DATE/TIME - LS-DOS 6.3 Page 00004 ' 2431 3003 00645 JR NC,L2436 ;<631> 2433 C664 00646 ADD A,64H ;<631> 2435 12 00647 LD (DE),A ;<631> 00648 L2436: 00649 ENDIF 2436 D650 00650 SUB 80 ;Accept only 80-87 2438 DA1125 00651 JP C,BADFMT ;Less than 80 - bad 00652 IF @BLD631 243B FE20 00653 CP 20H ;<631> 00654 ELSE 00655 CP 20 ;Greater than 99 ? 00656 ENDIF 243D 3018 00657 JR NC,BADFMT2 ;Yes - bad 00658 ; 00659 ; If Year is 1980 or 84 then set FEB = 29 days 00660 ; 243F E603 00661 AND 3 ;0 or 4 ? 2441 214D27 00662 LD HL,MAXDAYS+2 ;Set Feb to have 29 days 2444 2001 00663 JR NZ,NOTLEAP ;No - don't inc 2446 34 00664 INC (HL) ;Leap year - inc max days 00665 ; 00666 ; Check Range of month - must be 1 - 12 00667 ; 2447 3A8D27 00668 NOTLEAP LD A,(DTBUF+2) ;P/u month 244A 3D 00669 DEC A ;Set month = 0-11 244B FE0C 00670 CP 12 ;Valid Month ? 244D 3008 00671 JR NC,BADFMT2 ;Abort if 0 or >12 00672 ; 00673 ; Valid month - point HL to max days/month 00674 ; 244F 2B 00675 DEC HL ;HL => Max day table 2450 85 00676 ADD A,L ;Add month # to start 2451 6F 00677 LD L,A ;HL => Max days for month 00678 ; 00679 ; Check for Day entry is valid 00680 ; 2452 3A8C27 00681 LD A,(DTBUF+1) ;P/u day entry 2455 3D 00682 DEC A ;Reduce for test (0->FF) 2456 BE 00683 CP (HL) ;More than max days ? 2457 D21125 00684 BADFMT2 JP NC,BADFMT ;Go if too large (or 0) 00685 ; 00686 ; Transfer Date into buffer 00687 ; 245A EB 00688 EX DE,HL ;Point HL to DTBUF 245B FDE5 00689 PUSH IY ;Point DE = DATE$ 245D D1 00690 POP DE 245E 0E03 00691 LD C,3 ;BC = 3 chars to xfer 2460 EDB0 00692 LDIR ;Xfer 3 chars 00693 ; 00694 ; Display "No Date in System" if illegal Date 00695 ; MISOSYS EDAS-4.3 04/19/99 00:05:55 DATE/TIME - LS-DOS 6.3 Page 00005 ' Max table 00714 ; 247D FD6E01 00715 PUDAY LD L,(IY+1) ;P/u day # this month 2480 2600 00716 LD H,0 ; in HL 2482 114B27 00717 LD DE,MAXDAYS ;DE => Max day table 00718 ; 00719 ; Loop to Count up total # of days up to now 00720 ; 2485 1A 00721 DAYLP LD A,(DE) ;P/u max day 2486 85 00722 ADD A,L ;Add to HL 2487 6F 00723 LD L,A 2488 8C 00724 ADC A,H 2489 95 00725 SUB L 248A 67 00726 LD H,A 248B 13 00727 INC DE ;Bump days ptr 248C 10F7 00728 DJNZ DAYLP ;B months of max days 00729 ; 00730 ; Stuff days (9 bits) into DATE$ 00731 ; 248E FD7503 00732 LD (IY+3),L ;Stuff in lsb 2491 7C 00733 LD A,H ;Get bit "8" 2492 FDB604 00734 OR (IY+4) ; and OR it in 2495 FD7704 00735 LD (IY+4),A ;Then put it back 00736 ; 00737 ; Pick up year in E (0-7) 00738 ; 2498 FD7E00 00739 LD A,(IY) ;P/u year 249B D650 00740 SUB 80 ;Offset from 80 249D 5F 00741 LD E,A ;Put 0-7 in E 249E C603 00742 ADD A,3 ;Ck for year >= 84 24A0 0F 00743 RRCA 24A1 0F 00744 RRCA 00745 IF @BLD631 24A2 E60F 00746 AND 0FH ;<631>Keep bits 3-0 00747 ELSE MISOSYS EDAS-4.3 04/19/99 00:05:55 DATE/TIME - LS-DOS 6.3 Page 00006 ' Day string table 24C4 113927 00781 LD DE,DATEBUF ;Date display buffer 24C7 D5 00782 PUSH DE ;Save start 24C8 CDA625 00783 CALL DSPMDY ;Write out the day 00784 ; 00785 ; Position DE to month destination in buffer 00786 ; 24CB 13 00787 INC DE ;Bump 24CC 13 00788 INC DE 00789 ; 00790 ; Pick up month, & stuff string into buffer 00791 ; 24CD FD7E02 00792 LD A,(IY+2) ;P/u month number 24D0 47 00793 LD B,A ;Stuff in B 24D1 211527 00794 LD HL,MONTBL ;HL => Month string table 24D4 CDA625 00795 CALL DSPMDY ;Write out the month name 00796 ; 00797 ; P/u day of the month & convert to ASCII 00798 ; 24D7 13 00799 INC DE ;DE => Day destination MISOSYS EDAS-4.3 04/19/99 00:05:55 DATE/TIME - LS-DOS 6.3 Page 00007 ' ones destination 24EE F1 00825 POP AF ;Get back remainder 24EF C63A 00826 ADD A,3AH ;Change to ASCII 24F1 12 00827 LD (DE),A ;Stuff in buffer 00828 ; 00829 ; P/u year & stuff lower digit + "0" in buffer 00830 ; 24F2 FD7E00 00831 LD A,(IY) ;Form last year digit 00832 IF @BLD631 24F5 216C07 00833 LD HL,1900 ;<631> 24F8 85 00834 ADD A,L ;<631> 24F9 6F 00835 LD L,A ;<631> 24FA 8C 00836 ADC A,H ;<631> 24FB 95 00837 SUB L ;<631> 24FC 67 00838 LD H,A ;<631> 24FD 114527 00839 LD DE,YRBUF ;<631> 2500 00840 @@HEXDEC ;<631> 2500+3E61 00841 LD A,97 2502+EF 00842 RST 40 00843 ELSE 00844 SUB 80 ;A = 0-19 00845 CP 10 ;In 1980's? 00846 JR C,WAS80 00847 LD B,A 00848 LD A,'9' ;Nope, 1990's 00849 LD (DATEBUF+15),A 00850 LD A,B ;Get back year offset 00851 SUB 10 ;Sub off decade MISOSYS EDAS-4.3 04/19/99 00:05:55 DATE/TIME - LS-DOS 6.3 Page 00008 ' Date/Time string 00860 ; 00861 ; Display Date or Time String 00862 ; 2506 C5 00863 LOGMSG PUSH BC ;Save Error #, B (exit) 2507 00864 @@LOGOT ;Log message 00865 IFEQ 00H,1 00866 LD HL, 00867 ENDIF 2507+3E0C 00868 LD A,12 2509+EF 00869 RST 40 250A C1 00870 POP BC ;B = exit condition 00871 ; 00872 ; If B = 0 then exit HL = 0, otherwise HL = -1 00873 ; 250B 60 00874 LD H,B ;Set HL = -1 or 0 250C 68 00875 LD L,B ; 250D 00876 @@CKBRKC ;Clear any break 250D+3E6A 00877 LD A,106 250F+EF 00878 RST 40 2510 C9 00879 RET ;RETurn with condition 00880 ; 00881 ; Bad Format - display error & abort 00882 ; 2511 216B27 00883 BADFMT LD HL,BADDAT$ ;Illegal Date/Time 2514 06FF 00884 LOGABRT LD B,-1 ;Abort Condition 2516 18EE 00885 JR LOGMSG ;Log Message 00886 ; MISOSYS EDAS-4.3 04/19/99 00:05:55 DATE/TIME - LS-DOS 6.3 Page 00009 ' Parameter Table 2531 00911 @@PARAM ;Get parameters 2531+3E11 00912 LD A,17 2533+EF 00913 RST 40 00914 ; 00915 ; Stuff "Illegal Time" Mess in error routine 00916 ; 2534 217B27 00917 CLRSTK LD HL,BADTIM$ ;Chg "Bad date format" 2537 221225 00918 LD (BADFMT+1),HL ; to "Bad time... 253A E1 00919 POP HL ;Recover command ptr 253B 280A 00920 JR Z,GDPARMS ;Z - ok to continue 00921 ; 00922 ; Parameter Error - Display & abort 00923 ; 253D 6F 00924 IOERR LD L,A ;Xfer errcod to HL 253E 2600 00925 LD H,0 2540 F6C0 00926 OR 0C0H ;Short error 2542 4F 00927 LD C,A ;Xfer to C 2543 00928 @@ERROR ;Log error 2543+3E1A 00929 LD A,26 2545+EF 00930 RST 40 2546 C9 00931 RET 00932 ; 00933 ; Was there a TIME string entered ? 00934 ; 2547 7E 00935 GDPARMS LD A,(HL) ;P/u char 2548 FE28 00936 CP '(' ;Parms only? 254A CA9925 00937 JP Z,DSPTIME ;Display old time 254D FE0D 00938 CP CR ;End of line? 254F CA9925 00939 JP Z,DSPTIME ;Display old time 00940 ; MISOSYS EDAS-4.3 04/19/99 00:05:55 DATE/TIME - LS-DOS 6.3 Page 00011 ' Hours byte 2563 3E17 00953 LD A,23 ;Greater than 23 ? 2565 BE 00954 CP (HL) 2566 38A9 00955 JR C,BADFMT ;Yes - bad format 00956 ; 00957 ; Hours legal - Check if minutes legal 00958 ; 2568 2B 00959 DEC HL ;HL => Minutes 2569 3E3B 00960 LD A,59 ;Greater than 59 ? 256B BE 00961 CP (HL) 256C 38A3 00962 JR C,BADFMT ;Yes - bad format 00963 ; 00964 ; Minutes legal - Check if seconds legal 00965 ; 256E 2B 00966 DEC HL ;HL => Seconds 256F BE 00967 CP (HL) ;Greater than 59 ? 2570 389F 00968 JR C,BADFMT ;Yes - bad format 00969 ; 00970 ; Legal input - transfer to TIME$ storage area 00971 ; 2572 E5 00972 PUSH HL ;Save TIME buffer ptr 2573 218E27 00973 LD HL,DUMBUF ;HL => dummy buffer 2576 00974 @@TIME ;DE <= TIME$+0 2576+3E13 00975 LD A,19 2578+EF 00976 RST 40 2579 E1 00977 POP HL ;Recover TIME buffer ptr 257A 010300 00978 LD BC,3 ;3 bytes to xfer 257D EDB0 00979 LDIR ;Xfer 00980 ; 00981 ; Was the CLOCK (C) parameter entered ? 00982 ; 257F 210000 00983 DOCLOCK LD HL,0 ;HL = 0 (Normal Exit) 2582 3AFF25 00984 LD A,(CRESP) ;P/u response 2585 B7 00985 OR A 2586 C8 00986 RET Z ;RETurn if no response 00987 ; 00988 ; CLOCK (C) parameter entered - ON or OFF ? 00989 ; 2587 110000 00990 CLOCK LD DE,$-$ ;P/u parm = FFFF or 0000 258A 00991 @@FLAGS ;IY => System Flags 258A+3E65 00992 LD A,101 MISOSYS EDAS-4.3 04/19/99 00:05:55 DATE/TIME - LS-DOS 6.3 Page 00012 ' Address 01015 SET 4,(IY+'V'-'A') ;Set clock bit 01016 LD A,@ADTSK ;A = Add Task SVC # 01017 CLOFF RST 40 ;Issue SVC 01018 XOR A ;Set Z for no error 01019 LD H,A ;Pass to HL 01020 LD L,A ;For normal exit 01021 RET 01022 ENDIF 01023 ; 01024 ; Display the Time 01025 ; 2599 214227 01026 DSPTIME LD HL,DATEBUF+9 ;Pt to space for time str 259C E5 01027 PUSH HL ;Save pointer 259D 01028 @@TIME ;Xfer time into buffer 259D+3E13 01029 LD A,19 259F+EF 01030 RST 40 25A0 CD7F25 01031 CALL DOCLOCK ;Set/Reset Clock bit 25A3 C30325 01032 JP LOGDT ;Log it & exit MISOSYS EDAS-4.3 04/19/99 00:05:55 DATE/TIME - LS-DOS 6.3 Page 00013 ' Entry # in table to display 01039 ; HL => Table to fetch data from 01040 ; DE => Buffer to receive string 01041 ; 25A6 05 01042 DSPMDY DEC B ;B = entry, 0-6 25A7 7D 01043 LD A,L ;P/u lsb of table start 25A8 80 01044 ADD A,B 25A9 80 01045 ADD A,B ;Entries 3 bytes long 25AA 80 01046 ADD A,B 25AB 6F 01047 LD L,A ;HL => Table entry 01048 ; 01049 ; Transfer string into buffer 01050 ; 25AC 0603 01051 LD B,3 ;Three chars to xfer 25AE 7E 01052 DSPM1 LD A,(HL) ;P/u char from table 25AF 12 01053 LD (DE),A ;Stuff into buffer 25B0 23 01054 INC HL ;Bump 25B1 13 01055 INC DE 25B2 10FA 01056 DJNZ DSPM1 ;Three chars to xfer 25B4 C9 01057 RET ;Done - RETurn 01058 ; 01059 ; PARSDAT - Parse TIME/DATE string entry 01060 ; 01061 ; HL => Buffer containing string to parse 01062 ; C => Delimiter (<"0" = DATE, <"0"or=":" = TIME) 01063 ; 01064 ; DTBUF-DTBUF+2 <= Data in compressed format 01065 ; Z - Set if successful 01066 ; 25B5 118D27 01067 PARSDAT LD DE,DTBUF+2 ;Point to buf end 25B8 0603 01068 LD B,3 ;Process 3 fields 01069 ; 01070 ; Parse a field - Return NZ if bad 01071 ; 25BA D5 01072 PRS1 PUSH DE ;Save pointer 25BB CDDB25 01073 CALL PRS2 ;Get a digit pair 25BE D1 01074 POP DE ;Recover pointer 25BF C0 01075 RET NZ ;Ret if bad digit pair 01076 ; 01077 ; Good field - Stuff in buff, dec ptr, & count 01078 ; 25C0 12 01079 LD (DE),A ; else stuff the value 25C1 05 01080 DEC B ;Loop countdown 25C2 C8 01081 RET Z ;Do for 3 fields 25C3 1B 01082 DEC DE ;Backup the pointer 01083 ; 01084 ; Parsed a field - is the separator valid ? 01085 ; 25C4 7E 01086 LD A,(HL) ;P/u separator MISOSYS EDAS-4.3 04/19/99 00:05:55 DATE/TIME - LS-DOS 6.3 Page 00015 ' 61 79 2C 20 4D 6F 6E 20 78 78 2C 2745 20 01165 YRBUF: DB ' 198x',CR ;<631> 31 39 38 78 0D 01166 ELSE 01167 DATEBUF DB 'Day, Mon xx, 198x',CR 01168 ENDIF 274B 00 01169 MAXDAYS DB 0,31,28,31,30,31,30,31,31,30,31,30,31 1F 1C 1F 1E 1F 1E 1F 1F 1E 1F 1E 1F 2758 44 01170 NODATE$ DB 'Date not in system',CR 61 74 65 20 6E 6F 74 20 69 6E 20 73 79 73 74 65 6D 0D 276B 42 01171 BADDAT$ DB 'Bad Date format',CR 61 64 20 44 61 74 65 20 66 6F 72 6D 61 74 0D MISOSYS EDAS-4.3 04/19/99 00:05:55 DATE/TIME - LS-DOS 6.3 Page 00017 '