```Contributor: INBAR RAZ

I just happen to have programmed such a thing, for a certain program. It's not
perfect, in the essence that It will produce good results only from 1970 to
2099, because I didn't feel like starting to investigate which are leap years
and which are not. All the leap years between 1970 and 2099 ARE included,
though.

---------------------------------= cut here =---------------------------------
{ ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß }

{ This procedure returns a LongInt UNIX-like timestamp. TimeRec will be  }
{ overwritten by the resulted UNSIGNED DWORD.                            }

Procedure SecondSince1970(Year, Month, Day, Hour, Minute:Word; Var TimeRec);

Var       T_Lo,
T_Hi       : Word;

Begin
Asm

Call @Table

@Table:

Pop Si
Add Si,6            { Point Si to data table }
Jmp @Compute

{ This table contains the number of days in all months UNTIL this one }

dw  0               { Within January }
dw  31              { January }
dw  59              { February }
dw  90              { Mars }
dw  120             { April }
dw  151             { May }
dw  181             { June }
dw  212             { July }
dw  243             { August }
dw  273             { September }
dw  304             { October }
dw  334             { November }

{ This i a routine to multiply a DWORD by a WORD }
{ Input: DX:AX word to multilpy, CX multiplier }

@Calc:

Push Si
Push Di

Mov Di,Dx
Mov Si,Ax

Dec Cx              { We already have it multiplied by 1 }

Pop Di
Pop Si

Ret

@Compute:

Xor Di,Di           { Variable for leap year }

{ Seconds of round years }

Mov Bx,Year
Sub Bx,1970
Mov Ax,365*24       { Hours per year }
Mov Cx,60*60        { Seconds per hour }
Xor Dx,Dx

Call @Calc          { Multiply dword response by CX }
Mov Cx,Bx
Call @Calc

Push Ax
Push Dx

{ Seconds of leap years }

Mov Ax,Year
Sub Ax,1972         { First leap year after 1972 }
Mov Bx,4
Xor Dx,Dx
Div Bx

{ DX now holds number of days to add becaues of leap years. }
{ If DX is 0, this is a leap year, and we need to take it into
conideration }

Mov Di,Dx          { If DI is 0, this is a leap year }

Inc Ax             { We must count 1972 as well }
Xor Dx,Dx
Mov Bx,60*60
Mov Cx,24

Mul Bx
Call @Calc

Mov Cx,Dx
Mov Bx,Ax

Pop Dx
Pop Ax

Push Ax
Push Dx

{ DX:AX holds the number of seconds since 1970 till the beginning of year
}

{ Add days within this year }

Mov Bx,Month
Dec Bx
Shl Bx,1
Mov Bx,cs:[Bx]      { Lookup Table, sum of months EXCEPT this one }
Dec Bx              { Today hasn't ended yet }

Mov Ax,60*60
Mov Cx,24
Xor Dx,Dx
Mul Bx
Call @Calc

Mov Cx,Dx
Mov Bx,Ax

{ Now add what we had before - days until beginning of the year }

Pop Dx
Pop Ax

{ DX:AX now holds the number of secondss since 1970 till beginning of
day. }

Push Ax
Push Dx

{ DX:AX holds the number of seconds until the beginning of this day }

Mov Bx,Hour
Mov Ax,60*60   { Seconds per hour }
Xor Dx,Dx
Mul Bx

Push Ax
Push Dx

Mov Bx,Minute
Mov Ax,60      { Seconds per minute }
Xor Dx,Dx
Mul Bx

Mov Cx,Dx
Mov Bx,Ax

Pop Dx
Pop Ax

{ And add the seconds until beginning of year }

Pop Dx
Pop Ax

{ DX:AX now holds number of second since 1970 }

Mov T_Hi,Dx
Mov T_Lo,Ax

End;

Move(Mem[Seg(T_Lo):Ofs(T_Lo)],
Mem[Seg(TimeRec):Ofs(TimeRec)],2);

Move(Mem[Seg(T_Hi):Ofs(T_Hi)],
Mem[Seg(TimeRec):Ofs(TimeRec)+2],2);

End;

{ ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß }

---------------------------------= cut here =---------------------------------

Hope this helps.

Inbar Raz

--- FMail 0.94
* Origin: Castration takes balls. (2:403/100.42)
                                                                                                                               ```