On-screen clock for DOS
A clock that runs in the background in a DOS system and display the system time while it's operational.
As I remember I used either Microsoft Assembler or Turbo Assembler to compile this code. Program make use of a technology called "Terminate and Stay Resident" (TSR) which was used by many applications those days to emulate multi-tasking in DOS.
;Clock, Version 2.00
;Created 05/20/1999
include mac_main.lib
assume cs:code,ds:code,es:code,ss:code
code segment
org 100h
start proc
do: initialize
mov si,81h
mov al,[si]
cmp al,'/'
jnz nopa
inc si
mov al,[si]
cmp al,'?'
jz hl
cmp al,'U'
jz ul
cmp al,'u'
jz ul
print ivmsg
jmp finish
hl: print hlmsg
jmp finish
ul: call lodchk
cmp ax,0h
jnz nolod
call unload
print ulmsg
jmp finish
nopa: call lodchk
cmp ax,0h
jz loded
xor ax,ax
mov ds,ax
mov si,70h
mov di,offset oldisr
mov ax,[si]
mov cs:[di],ax
mov ax,[si+2]
mov cs:[di+2],ax
mov si,413h
mov ax,[si]
sub ax,1h
mov [si],ax
mov cl,6h
shl ax,cl
mov es,ax
push cs
pop ds
mov si,offset clockproc
xor di,di
mov cx,((offset idvmsg)-(offset clockproc))/2
cld
rep movsw
xor ax,ax
mov ds,ax
mov si,70h
mov [si],ax
mov [si+2],es
jmp finish
nolod: print nlmsg
jmp finish
loded: print almsg
finish: close
start endp
unload proc
push ax
push ds
push si
push cx
push es
push di
xor ax,ax
mov ds,ax
mov si,413h
mov ax,[si]
push ax
mov cl,6h
shl ax,cl
mov es,ax
pop ax
inc ax
mov [si],ax
mov si,70h
mov di,(offset oldisr)-(offset clockproc)
mov ax,es:[di]
mov [si],ax
mov ax,es:[di+2]
mov [si+2],ax
xor ax,ax
xor di,di
mov cx,((offset idvmsg)-(offset clockproc))/2
cld
rep stosw
push cs
pop ds
mov ax,0b800h
mov es,ax
mov si,offset msg2
mov di,8ch
mov cx,0ah
cld
rep movsw
pop di
pop es
pop cx
pop si
pop ds
pop ax
ret
unload endp
lodchk proc
push cx
push di
push si
push ds
push es
xor ax,ax
mov ds,ax
mov si,413h
mov ax,[si]
mov cl,6h
shl ax,cl
mov es,ax
push cs
pop ds
xor di,di
mov si,offset clockproc
mov cx,(offset msg)-(offset clockproc)
cld
rep cmpsb
mov ax,cx
pop es
pop ds
pop si
pop di
pop cx
ret
lodchk endp
clockproc proc far
push ax
push es
push si
push di
push cx
push cs
pop ds
mov ax,0b800h
mov es,ax
mov si,(offset msg)-(offset clockproc)
mov di,8ch
mov cx,0ah
mov al,0h
out 70h,al
in al,71h
byte2asc al,tstr
mov ah,tstr[0]
mov [si+14],ah
mov ah,tstr[1]
mov [si+16],ah
mov al,2h
out 70h,al
in al,71h
byte2asc al,tstr
mov ah,tstr[0]
mov [si+8],ah
mov ah,tstr[1]
mov [si+10],ah
mov al,4h
out 70h,al
in al,71h
byte2asc al,tstr
mov ah,tstr[0]
mov [si+2],ah
mov ah,tstr[1]
mov [si+4],ah
cld
rep movsw
pop cx
pop di
pop si
pop es
pop ax
iret
clockproc endp
attr equ 3eh
msg db ' ',attr,'X',attr,'X',attr,':',attr,'X',attr,'X',attr
db ':',attr,'X',attr,'X',attr,' ',attr
tstr db 'XX'
oldisr dw ?
dw ?
crnote db 'Clock, Version 2.00',0ah,0dh
db 'Copyright (c) Sudaraka Wijesinghe 1999.',0ah,0dh,24h
idvmsg db 'This program requiers DOS version 5.00 or later.',0ah,0dh,24h
ulmsg db 0ah,0dh,'Clock Unloaded.',0ah,0dh,24h
hlmsg db 0ah,0dh,'USAGE: SC2[/?][/U]',0ah,0dh,0ah,0dh
db 'Without any parameter loads the clock,',0ah,0dh
db ' /? - Display this help screen.',0ah,0dh
db ' /U - Unload the clock.',0ah,0dh,0ah,0dh
db ' Clock is a program that display the system time in DOS mode.',0ah,0dh
db 'After the clock is loaded successfully you''ll see a digital clock on the top',0ah,0dh
db 'right hand corner of your computers screen.',0ah,0dh,24h
ivmsg db 0ah,0dh,'Invalid parameter.',0ah,0dh,24h
almsg db 0ah,0dh,'Clock is already loaded.',0ah,0dh,24h
nlmsg db 0ah,0dh,'Clock is not loaded.',0ah,0dh,24h
msg2 db ' ',1fh,' ',1fh,' ',1fh,'D',1fh,'i',1fh,'n',1fh,'o',1fh,' ',1fh
db ' ',1fh,' ',1fh
code ends
end start