home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Power-Programmierung
/
CD1.mdf
/
lan
/
net_time
/
srvclock.asm
< prev
next >
Wrap
Assembly Source File
|
1988-01-22
|
10KB
|
228 lines
;
; srvclock.asm - From PC Magazine . August '87, pp468-470
;
; A background task for use on any AT running NETBIOS. This routine will
; get and send its date and time information to any node executing
; NETCLOCK.EXE. NETCLOCK.EXE then installs the received date and time in the
; node. Since SRVCLOCK.EXE reads th AT's CMOS RAM directly, it works only on
; ATs
;
cr equ 0dh
lf equ 0ah
cseg segment para public 'code'
net proc far
assume cs:cseg,ds:netdata,ss:stack,es:netdata
push ds
xor ax,ax
push ax
mov ax,netdata
mov ds,ax
mov es,ax
;
; dealocate block containing environment
;
mov ah,62h ; get program segment prefix
int 21h ; address
push ds ; save old data segment
mov ds,bx ; mov PSP segment to DS - rsb
mov es,ds:02ch ; move the block address
mov ah,49h ; containing the enviroment
int 21h ; and deallocate it
pop ds ; restore DS
mov ax,ds ;
mov es,ax ; and ES
;
; netbios add name call (waits for completion)
;
add_name: mov command,30h ; Command 30H adds a neme
mov bx,offset mcb ; point BX at MCB
int 5ch ; call netbios
cmp retcode,00h ; check for success
je prep_res ; prepare for TSR if good
mov dx,offset add_err ; else write errro message
jmp error ; name that was not successful
prep_res:
mov dx,30h ; number of paragraphs for
; terminate and stay resident
;
; do netbios listen posting into get_clock, then tsr
;
mov command,91h ; Move listen to MCB no wait
mov post@,offset get_clock ; and post at get clock
mov post@+2,cs ; routine
mov bx,offset mcb ; point BX to MCB
int 5ch ; netbios call
cmp al,00h ; check for good return
je go_res ; if good, make resident
mov dx,offset lsn_err ; else write error
jmp error ;
go_res: mov ah,31h ; DOS terminate and stay
int 21h ; resident
;
; this listen is returned to after a opost into get_clock
;
listen: mov command,91h ; Move listen to MCB
mov post@,offset get_clock ; also posts to clock
mov post@+2,cs ; routine
mov bx,offset mcb ; point BX to block
int 5ch ; NETBIOS call
sti ; restore interrupts
iret ; and return
;
; get date and time to send to requesting node
;
get_clock: cli ; cut off interrupts
mov ax,es ; ES is restored by network
mov ds,ax ; use to restore DS
xor ax,ax ; clear AX
mov al,09 ; 09 = Year
out 70h,al ; Real time clock at 70H
in al,71h ; returns at 71H
call bcd2bin ; convert to binary
add ax,76ch ; add 1900 decimal, only works
; until 1999
mov year,ax ; load buffer with year
xor ax,ax ; get month
mov al,08 ;
out 70h,al ;
in al,71h ;
call bcd2bin ;
mov month,al ;
xor ax,ax ; get date of month
mov al,07 ;
out 70h,al ;
in al,71h ;
call bcd2bin ;
mov day,al ;
xor ax,ax ; get hours
mov al,04 ;
out 70h,al ;
in al,71h ;
call bcd2bin ;
mov hours,al ;
xor ax,ax ; get minutes
mov al,02 ;
out 70h,al ;
in al,71h ;
call bcd2bin ;
mov minutes,al ;
xor ax,ax ; get seconds
mov al,00 ;
out 70h,al ;
in al,71h ;
call bcd2bin ;
mov seconds,al ;
;
; send clock data to requesting node using a netbios send
;
mov buffer@,offset clock ; point to clock data area
mov buffer@+2,ds ; insure correct segment
mov buf_length,8 ; clock takes 8 byees
mov command,14h ; 14H=send and wait
mov bx,offset mcb ; point to MCB
int 5ch ; NETBIOS
hangup: mov command,12h ; 12H=hangup
mov bx,offset mcb ; point BX
int 5ch ; NETBIOS call
mov si,offset fill_name ; fill name=listen any
mov di,offset callname ; move to call name
mov cx,0fh ; names are 16 bytes
repnz movsb ;
jmp listen ; back to waiting for call
;
; error message, failed before coming resident
;
error: mov ah,09h ; display error message
int 21h ; if routine fails before
; becoming resident
mov command,12h ; hang up session if any
mov bx,offset mcb ; point BX
int 5ch ; NETBIOS call
quit: ret ;
net endp
;
; procedure to convert time as delivered from CMOS clodk (binary coded decimal)
; to binary (as used by DOS function calls and NETCLOCK) (returns in AL)
;
bcd2bin proc near
push ax ; save contents
and al,0f0h ; clear out low nibble
shr al,1 ; divide by 16
shr al,1 ; so that hi nibble
shr al,1 ; is now in
shr al,1 ; lo position
mov bl,al ; hold in al
shl al,1 ; multiply by ten, two here
shl al,1 ; four
shl al,1 ; eight
add al,bl ; nine
add al,bl ; ten
pop bx ; get previous AX contents
and bl,0fh ; clear out hi nibble
add al,bl ; add to total
ret
bcd2bin endp
cseg ends
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; message data
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
netdata segment para public 'data'
add_err db cr,lf,'"add name" command failed',cr,lf,'$'
lsn_err db cr,lf,'"listen" command failed',cr,lf,'$'
fill_name db '* '
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; message control area
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
clock equ $
year dw 0000h
month db 00h
day db 00h
hours db 00h
minutes db 00h
seconds db 00h
hundredths db 00h
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; message control block
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
mcb equ $
command db 00h
retcode db 00h
lsn db 00h
num db 00h
buffer@ dw 0000h
dw 0000h
buf_length dw 0000h
callname db '* '
our_name db 'srv_clock '
rto db 00h
sto db 00h
post@ dw 0000h
dw 0000h
adapter_num db 00h
cmd_stat db 00h
reserve db 14 dup(0)
netdata ends
stack segment para stack 'stack'
db 32 dup('stack ')
stack ends
end