Category : OS/2 Files
Archive   : PPOS2.ZIP
Filename : TD.ASM
page 55,132
.286
; TD.ASM --- Time and Date Formatting Functions
; OS/2 version
;
; by Ray Duncan, Copyright (C) 1988 Ziff Davis
;
; This module contains six public routines:
;
; TCVT convert time to ASCII
; DCVT convert date to ASCII
;
; SYSTCVT convert current time to ASCII
; SYSDCVT convert current date to ASCII
;
; DIRTCVT convert time in directory format to ASCII
; DIRDCVT convert date in directory format to ASCII
; OS/2 API functions
extrn DosGetDateTime:far
extrn DosGetCtryInfo:far
DGROUP group _DATA
_DATA segment word public 'DATA'
dtinfo label byte ; receives date/time info
hour db 0
min db 0
sec db 0
csec db 0 ; hundredths of secs.
day db 0
month db 0
year dw 0
zone dw 0 ; time zone
dow db 0 ; day of week
ccode dw 0 ; country code (0=default)
dw 0 ; code page ID (0=default)
cbuff db 38 dup (0) ; receives country info
cb_len equ $-cbuff ; length of buffer
cbytes dw ? ; receives actual length
; of country info
dbuff db 8 dup (' ') ; date formatting buffer
tbuff db 11 dup (' ') ; time formatting buffer
; filled in by 'getctry'
doffs dw 0 ; offset of ASCII day
moffs dw 0 ; offset of ASCII month
yoffs dw 0 ; offset of ASCII year
; date format determined
; by DosGetCtryInfo
dtab dw mdy ; 0 = USA format
dw dmy ; 1 = Europe format
dw ymd ; 2 = Japan format
mdy dw dbuff+3 ; USA: month day year
dw dbuff
dw dbuff+6
dmy dw dbuff ; Europe: day month year
dw dbuff+3
dw dbuff+6
ymd dw dbuff+6 ; Japan: year month day
dw dbuff+3
dw dbuff
_DATA ends
_TEXT segment word public 'CODE'
assume cs:_TEXT,ds:DGROUP
public dcvt ; make routines available
public tcvt ; to Linker
public systcvt
public sysdcvt
public dirtcvt
public dirdcvt
sysdcvt proc near ; format system date
; BX = length
; DS:SI = buffer
; preserves all registers
push ax ; save registers
push bx
push cx
push dx
; get current date...
push ds ; receives date/time info
push offset DGROUP:dtinfo
call DosGetDateTime ; transfer to OS/2
mov dh,month ; load up registers
mov dl,day ; with day/month/year
mov cx,year
call dcvt ; convert to ASCII
pop dx ; restore registers
pop cx
pop bx
pop ax
ret ; back to caller
sysdcvt endp
systcvt proc near ; format system time
; BX = length
; DS:SI = buffer
; preserves all registers
push ax ; save registers
push bx
push cx
push dx
; get current time...
push ds ; receives date/time info
push offset DGROUP:dtinfo
call DosGetDateTime ; transfer to OS/2
mov ch,hour ; load up registers
mov cl,min ; with hour/min/sec/csec
mov dh,sec
mov dl,csec
call tcvt ; convert to ASCII
pop dx ; restore registers
pop cx
pop bx
pop ax
ret ; back to caller
systcvt endp
dirdcvt proc near ; format directory date
; AX = directory date
; BX = length
; DS:SI = buffer
; preserves all registers
push ax ; save registers
push bx
push cx
push dx
mov dx,ax ; isolate months & days
and dx,01ffh
shl dx,3 ; position month
shr dl,3 ; position day
shr ax,9 ; position year
add ax,1980
mov cx,ax
call dcvt ; convert to ASCII
pop dx ; restore registers
pop cx
pop bx
pop ax
ret ; back to caller
dirdcvt endp
dirtcvt proc near ; format directory time
; AX = directory time
; BX = length
; DS:SI = buffer
; preserves all registers
push ax ; save registers
push bx
push cx
push dx
mov dx,ax ; isolate seconds field
and dx,1fh ; and position it
shl dx,9 ; (includes seconds*2)
shr ax,3 ; position hours
shr al,2 ; position minutes
mov cx,ax
call tcvt ; convert to ASCII
pop dx ; restore registers
pop cx
pop bx
pop ax
ret ; back to caller
dirtcvt endp
dcvt proc near ; format ASCII date
; BX = length
; CX = year (1980+)
; DH = month (1-12)
; DL = day (1-31)
; DS:SI = buffer
; length clamped to 8
; destroys AX BX CX DX
cmp bx,8 ; make sure length OK
jle dcvt1
mov bx,8 ; too long, use 8 max
dcvt1: push es ; save registers
push di
push si
push bx
call getctry ; get country info
mov si,moffs ; convert month
mov al,dh
call b2dec
mov si,doffs ; convert day
mov al,dl
call b2dec
mov si,yoffs ; convert year,
sub cx,1900 ; corrected to 80-99
mov al,cl
call b2dec
mov ax,ds ; transfer ASCII date
mov es,ax ; to caller's buffer
mov si,offset DGROUP:dbuff
pop cx ; buffer length
pop di ; buffer address
push di
rep movsb ; copy string
pop si ; restore registers
pop di
pop es
ret ; return to caller
dcvt endp
tcvt proc near ; format ASCII time
; BX = length
; CH = hour
; CL = minute
; DH = second
; DL = hundredths
; DS:SI = buffer
; length clamped to 11
; destroys AX BX CX DX
cmp bx,11 ; make sure length OK
jle tcvt1
mov bx,11 ; too long, use 11 max
tcvt1: push es ; save registers
push di
push si
push bx
call getctry ; get country info
mov al,ch ; convert hours
mov si,offset DGROUP:tbuff
call b2dec
mov al,cl ; convert minutes
add si,3
call b2dec
mov al,dh ; convert seconds
add si,3
call b2dec
mov al,dl ; convert hundredths
add si,3
call b2dec
mov ax,ds ; transfer ASCII time
mov es,ax ; to caller's buffer
mov si,offset DGROUP:tbuff
pop cx ; buffer length
pop di ; buffer address
push di
rep movsb ; copy string
pop si ; restore registers
pop di
pop es
ret ; return to caller
tcvt endp
b2dec proc near ; convert binary 0-99
; to two ASCII digits.
; AL = value
; DS:SI = storage address
; destroys AX
aam ; divide AL by 10 ->
; AH = quot., AL = rem.
add ax,'00' ; convert to ASCII
xchg ah,al
mov [si],ax ; and store digits
ret ; back to caller
b2dec endp
getctry proc near ; get country information
test doffs,-1 ; did we already get info?
jnz getc3 ; if we did, just exit
push ax ; save registers
push bx
; get country info...
push cb_len ; length of buffer
push ds ; country code address
push offset DGROUP:ccode
push ds ; receives country info
push offset DGROUP:cbuff
push ds ; receives length of info
push offset DGROUP:cbytes
call DosGetCtryInfo ; transfer to OS/2
or ax,ax ; function successful?
jz getc1 ; jump, got country info
; no, use USA defaults
mov al,'.' ; decimal separator
mov bl,':' ; time separator
mov bh,'-' ; date separator
jmp getc2
getc1: mov al,cbuff+0dh ; get decimal separator
mov bl,cbuff+11h ; get time separator
mov bh,cbuff+0fh ; get date separator
getc2: mov tbuff+8,al ; store decimal separator
mov tbuff+2,bl ; store time separator
mov tbuff+5,bl
mov dbuff+2,bh ; store date separator
mov dbuff+5,bh
; set date field offsets
; using country info
mov bx,word ptr cbuff+4
shl bx,1 ; date code*2=dtab index
mov bx,[bx+dtab]
mov ax,[bx] ; offset for ASCII day
mov doffs,ax
mov ax,[bx+2] ; offset for ASCII month
mov moffs,ax
mov ax,[bx+4] ; offset for ASCII year
mov yoffs,ax
pop bx ; restore registers
pop ax
getc3: ret ; back to caller
getctry endp
_TEXT ends
end
Very nice! Thank you for this wonderful archive. I wonder why I found it only now. Long live the BBS file archives!
This is so awesome! 😀 I’d be cool if you could download an entire archive of this at once, though.
But one thing that puzzles me is the “mtswslnkmcjklsdlsbdmMICROSOFT” string. There is an article about it here. It is definitely worth a read: http://www.os2museum.com/wp/mtswslnk/