; ; ARKDATE - support for Time and Date stamping ; ; 11/28/88 BEM -- changed to overlay structure ; ; Patch your time routine entry into the jump at TDate_ (for systems without ; individual file stamping) or at FDate (for systems that DO have date stamps ; on each file). Your routine should call CDate_ to convert the date to the ; ARK format. The TDate_ call is made immediately after printing the signon ; message, and may include a message indicating what date-stamping routine is ; used. You may call the Puts function to output a null-terminated message ; addressed by HL. Note that Puts will convert a LF (ASCII 0Ah) to a CR-LF ; sequence. yr DB 88 ; [103h] mo DB 11 ; [104h] iday DB 27 ; [105h] hour db 16 ; [106h] min db 0 ; [107h] public TDate_, FDate_ TDate_: JMP TDOSDate ; Today's-Date (called at init-time) [108h] FDate_: db 0C9h,00,00 ; File-Date (called immediately after F_OPEN) [10Bh] CDate_: JMP get_date ; convert and save date [10Eh] Puts: JMP puts ; print the null-terminated string at HL [111h] ; Start of user-supplied date routine [114h] ; Get Z80-DOS date, convert to YYMMDDHHMM and save at 0103h ; DO NOT CHANGE IX,IY, or BC. Any and all other registers can be ; destroyed. TDOSDate: db 0ddh, 0e5h ; push ix db 0fdh, 0e5h ; push iy push b lxi h,TDOSMsg call Puts xra a sta osflag mvi c,105 ; DOS+ GET DATE ROUTINE lxi d,mo ; BUFFER AREA call 5 mov a,h ora l ; return == 0?? jz jtoc4 sta osflag lhld mo ;GET THE JULIAN DATE lxi d,06F0DH ; ADJUST FM DIGITAL RESEARCH dad d ; FORMAT TO ALGORITHM lxi d,4 ;4*JDATE +3 call mulww ; DE*HL TO (DE,HL) lxi b,3 dad b jnc jtoc1 inx d jtoc1: lxi b,1461 ;y = (4*JDATE+3)/1461 call divlw ; (DE,HL)/BC TO DE(Q) AND HL(R) push d ;SAVE y, HL HAS d (REMAINDER) lxi b,4 ;d = d/4 +1 lxi d,0 call divlw inx d lxi h,5 ;5 * d - 3 call mulww ; DE*HL TO (DE,HL) lxi b,3 ora a db 0EDh,042h ; SBC HL,BC jnc jtoc2 dcx d jtoc2: lxi b,153 ;m = (5*d - 3)/153 call divlw push d ;SAVE m, HL HAS d (REMAINDER) lxi b,5 ;DAY = d/5 + 1 lxi d,0 call divlw inx d mov a,e sta iday pop h ;m pop d ;y mov a,l ;MONTH = m + 3 adi 3 cpi 12+1 ;IF MONTH > 12 jc jtoc3 sui 12 ; MONTH = MONTH - 12 inx d ; y = y + 1 jtoc3: sta mo mov a,e sta yr jtoc4: ora a call CDate_ ; make it readable to ARK pop b db 0fdh, 0e1h ; pop iy db 0ddh, 0e1h ; pop ix ret mulww: ; 16 * 16 MULTIPLICATON DE*HL TO (DE,HL) mov b,h mov c,l lxi h,0 mvi a,10H mulw1: dad h xchg db 0EDh,06Ah ; ADC HL,HL xchg jnc mulw2 dad b jnc mulw2 inx d mulw2: dcr a jnz mulw1 ret divlw: ; 32-BIT DIVIDE (DE,HL)/BC TO DE(Q) AND HL(R) xchg mvi a,10H divl1: xchg dad h xchg db 0EDh,06Ah ; ADC HL,HL db 0EDh,042h ; SBC HL,BC jnc divl3 dad b divl2: dcr a jnz divl1 ret divl3: inx d jmp divl2 ; ; osflag: db 0 TDOSMsg db 'Turbo-DOS version',10,0 ds 200h get_date: ; PUT DATE IN ARC FORMAT (YYYYYYYM MMMDDDDD) lda mo mov L,A lda yr sui 80 db 0CBh, 025h ; SLA L db 0CBh, 025h ; SLA L db 0CBh, 025h ; SLA L db 0CBh, 025h ; SLA L db 0CBh, 025h ; SLA L RAL ; RLA mov h,a lda iday ani 01Fh ora l mov l,a shld arcdate_ ; SAVE IN ARK.COM ; PUT TIME IN ARC FORMAT (HHHHHMMM MMMSSSSS) IGNORING SECONDS lxi h,hour lda osflag ora a jnz get_d0 ; if OS supports TOD, Jmp mov d,m ; else get hour... inx h mov e,m jmp get_d1 get_d0: xra a db 0EDh,06fh ; RLD : A = 1, (HL) = 80 mov d,a db 0CBh,027h ; SLA A : A = 2 db 0CBh,027h ; SLA A : A = 4 add d ; A = 5 db 0CBh,027h ; SLA A : A = A mov d,a ; D =0ah xra a db 0EDh,067h ; RRD : A = 0, (HL) = 08 mov a,m add d ; A = 12 mov d,a inx h ; OOOPS!!! -- replaced for ARK 0.33 xra a db 0EDh,06fh ; RLD mov e,a db 0CBh,027h ; SLA A db 0CBh,027h ; SLA A add e db 0CBh,027h ; SLA A mov e,a xra a db 0EDh,067h ; RRD mov a,m add e mov e,a get_d1: db 0CBh,023h ; SLA E db 0CBh,023h ; SLA E db 0CBh,023h ; SLA E db 0CBh,012h ; RL D db 0CBh,023h ; SLA E db 0CBh,012h ; RL D db 0CBh,023h ; SLA E db 0CBh,012h ; RL D ; SAVE IN ARK.COM xchg shld arctime_ ret extrn arcdate_, arctime_, puts end