Category : OS/2 Files
Archive   : PPOS2.ZIP
Filename : TD.ASM

 
Output of file : TD.ASM contained in archive : PPOS2.ZIP
title TD.ASM --- time & date formatting
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



  3 Responses to “Category : OS/2 Files
Archive   : PPOS2.ZIP
Filename : TD.ASM

  1. Very nice! Thank you for this wonderful archive. I wonder why I found it only now. Long live the BBS file archives!

  2. This is so awesome! 😀 I’d be cool if you could download an entire archive of this at once, though.

  3. 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/