code segment
assume cs:code
org 100h
begin: jmp start
color db 0ah
numbase dw 3030h
vidoff dw 0
vidbase dw 0B800h
optp db 0
setend label byte
datechg db 1
btw db ':'
hour db 0
min db 0
sec db 0
lastsec db 0
year db 0
month db 0
day db 0
chgit proc near
div bx
mov cs:[si], al
inc si
ret
chgit endp
showdigit proc near
mov al, cs:[si]
xor ah, ah
div bl
or ax, cs:numbase-0d0h
push ax
mov ah, cs:color-0d0h
stosw
pop ax
mov al, ah
mov ah, cs:color-0d0h
stosw
inc si
ret
showdigit endp
twopo proc near
mov ah, cs:color-0d0h
mov al, cs:btw-0d0h
stosw
ret
twopo endp
int08h:
cmp ax, 4c4ch
jnz cont0
cmp bx, 0c4c4h
jnz cont0
xchg ax, bx
push cs
pop es
iret
cont0:
push ax
push bx
push dx
push di
push si
push ds
push es
cld ; set video address
mov ax, cs:vidbase-0d0h
mov es, ax
mov di, cs:vidoff-0d0h
xor ax, ax ; get time counter
mov ds, ax
mov ax, ds:[46ch]
mov dx, ds:[46eh]
cmp ax, 00
jnz notchgdate
cmp dx, 00
jnz notchgdate
mov cs:datechg-0d0h, 1
notchgdate:
shr dx, 1 ; get hour, min, sec
rcr ax, 1
mov bx, 32772
mov si, offset hour-0d0h
call chgit
mov ax, dx
mov bx, 10
mul bx
mov bx, 5460
call chgit
mov ax, dx
xor dx, dx
mov bx, 91
call chgit
cmp al, cs:lastsec-0d0h
jz timeend
mov cs:lastsec-0d0h, al
mov si, offset cs:hour-0d0h
mov cs:btw-0d0h, ':'
mov bl, 10
cmp cs:optp-0d0h, 1
jnz showing
test al, 2
jnz showing
showdate:
cmp cs:datechg-0d0h, 0
jz skiploaddate
mov al, 7
out 70h, al
in al, 71h
mov cs:day-0d0h, al
mov al, 8
out 70h, al
in al, 71h
mov cs:month-0d0h, al
mov al, 9
out 70h, al
in al, 71h
mov cs:year-0d0h, al
mov cs:datechg-0d0h, 0
skiploaddate:
mov si, offset year-0d0h
mov cs:btw-0d0h, '-'
mov bl, 16
showing:
call showdigit
call twopo
call showdigit
call twopo
call showdigit
timeend:
pop es
pop ds
pop si
pop di
pop dx
pop bx
pop ax
db 0eah
oldip dw 0
oldcs dw 0
info db 0dh,0ah
db '谀哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪?',0dh,0ah
db '? ON-LINE CLOCK ?',0dH,0aH
db '? Zhang Jiu Qiang, 1996 in ZunYi ?',0dh,0ah
db '滥哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪?',0dh,0ah,'$'
info1 db 'TI [1] [d]'
db '$'
lcdnumbit label byte
LCD0 DB 0,1EH,21H,21H,21H,21H,21H,21H,0 ,21H,21H,21H,21H,21H,21H,1EH
LCD1 DB 0, 0,1 ,1 ,1 ,1 ,1 ,1 ,0 ,1 ,1 ,1 ,1 ,1 ,1 ,0
LCD2 DB 0,1EH,1 ,1 ,1 ,1 ,1 ,1 ,1EH,20H,20H,20H,20H,20H,20H,1EH
LCD3 DB 0,1EH,1 ,1 ,1 ,1 ,1 ,1 ,1EH,1 ,1 ,1 ,1 ,1 ,1 ,1EH
LCD4 DB 0, 0,21H,21H,21H,21H,21H,21H,1EH,1 ,1 ,1 ,1 ,1 ,1 ,0
LCD5 DB 0,1EH,20H,20H,20H,20H,20H,20H,1EH,1 ,1 ,1 ,1 ,1 ,1 ,1EH
LCD6 DB 0,1EH,20H,20H,20H,20H,20H,20H,1EH,21H,21H,21H,21H,21H,21H,1EH
LCD7 DB 0,1EH,1 ,1 ,1 ,1 ,1 ,1 ,0 ,1 ,1 ,1 ,1 ,1 ,1 ,0
LCD8 DB 0,1EH,21H,21H,21H,21H,21H,21H,1EH,21H,21H,21H,21H,21H,21H,1EH
LCD9 DB 0,1EH,21H,21H,21H,21H,21H,21H,1EH,1 ,1 ,1 ,1 ,1 ,1 ,1EH
db 'COLOR'
color0 db 0ah
db 'YPOS'
cordy db 0
db 'XPOS'
cordx dw 72
start:
mov al, cs:cordy
mov bl, 80
mul bl
add ax, cs:cordx
mov di, ax
shl di, 1
mov cs:vidoff, di
mov al, cs:color0
mov cs:color, al
mov di, 80h
cmp byte ptr [di], 2
jb skippp
repskp:
inc di
comp1:
cmp byte ptr [di], 20h
jz repskp
cmp byte ptr ds:[di], '1'
jnz noskip
cmp byte ptr ds:[di+1], 20h
ja wrong
mov bp, offset lcdnumbit
pointnum:
mov ax, cs
mov ds, ax
mov es, ax
mov ax, 1100h
mov bx, 1000h
mov cx, 10
mov dx, 0a0h
int 10h
mov ds:numbase, 0a0a0h
compdj:
inc di
cmp byte ptr [di], 20h
jz compdj
noskip:
cmp byte ptr ds:[di], 0dh
jz skippp
or byte ptr ds:[di], 20h
cmp byte ptr ds:[di], 'd'
jnz wrong
cmp byte ptr ds:[di+1], 20h
ja wrong
mov cs:optp, 1 ; show date
jmp repskp
wrong:
mov ah, 9
mov dx, offset info1
int 21h
mov ah, 4ch
int 21h
skippp:
mov ah,09
mov dx, offset info
int 21h
mov ax, 4c4ch
mov bx, 0c4c4h
int 08h
cmp ax, 0c4c4h
jnz cont1
cmp bx, 4c4ch
jz already
cont1:
xor ax, ax
mov ds, ax
mov ax, ds:[08h*4]
mov cs:oldip, ax
mov ax, ds:[08h*4+2]
mov cs:oldcs, ax
cli
mov ds:word ptr [08h*4], offset int08h - 0d0h ; offset
mov ds:word ptr [08h*4+2], cs
mov ax, cs
mov ds, ax
mov di, 30h ;dest
mov si, 100h ;source
mov cx, offset info - 100h ;length
cld
rep movsb
sti
mov ax, cs:[2ch]
dec ax
mov ds, ax
mov word ptr ds:[01], 0000h
mov dx, offset info - 0d0h ;resident length, 计算驻留长度
add dx, 0fh ;info 以后的内容不驻留
mov cl, 4 ;右移4位,因为放在DX中的长度是以16字节为单位的。
shr dx, cl ;即驻留长度是 DX * 16
mov ah, 31h ;DOS系统调用,驻留功能
int 21h
already:
mov ax, ds:numbase
mov es:numbase-0d0h, ax
mov al, ds:optp
mov es:optp-0d0h, al
mov ah, 4ch
int 21h
code ends
end begin