您的位置:首页 > 编程语言

显示设置CMOS RAM时钟(汇编代码)

2012-08-30 20:55 288 查看
STRMAIN equ 19
STR1 equ 10
STR2 equ 12
STR3 equ 11
STR4 equ 19
org 7c00h
DispStr:
mov ax, cs
mov es, ax
mov bp, Message
mov ax, 1301h
mov bx, 0007h
mov cx, STRMAIN
mov dx, 001dh
int 10h
mov bp, Message + STRMAIN
mov ax, 1301h
mov bx, 0007h
mov cx, STR1
mov dx, 0100h
int 10h		;"1.reset pc"
mov bp, Message + STRMAIN + STR1
mov ax, 1301h
mov bx, 0007h
mov cx, STR2
mov dx, 0200h
int 10h		;"2.show clock"
mov bp, Message + STRMAIN + STR1 + STR2
mov ax, 1301h
mov bx, 0007h
mov cx, STR3
mov dx, 0300h
int 10h		;"3.set clock"
Input:
mov ah, 0h
int 16h
cmp al, 49		;1
je Reboot
cmp al, 50		;2
je DispClock
cmp al, 51		;3
je SetClock
jmp Input
;;
;;Reroot
;;
Reboot:
jmp 0ffffh:0000h
;;
;;Display Clock
;;
DispClock:
call ReadCMOS
CheckExit:
mov ah, 01h
int 16h
je DispClock
mov ah, 0h
int 16h		;eat input cache
cmp al, 1bh	;ESC key
jne DispClock
ClearScreen:
mov ah,6
mov al,0
mov bh,07h
mov cx,0
mov dx,184fh
int 10h
jmp DispStr
ReadCMOS:
mov ax, cs
mov ds, ax
mov si, Message + STRMAIN + STR1 + STR2 + STR3	;ds:si -> TimeStr
mov word [ds:si], 3032h	;"20"
add si, 2
mov bl, 9		;year
call ReadPort
mov byte [ds:si], 2fh	;"/"
inc si
mov bl, 8		;month
call ReadPort
mov byte [ds:si], 2fh	;"/"
inc si
mov bl, 7		;day
call ReadPort
mov byte [ds:si], 20h	;" "
inc si
mov bl, 4		;hour
call ReadPort
mov byte [ds:si], 3ah	;":"
inc si
mov bl, 2		;minute
call ReadPort
mov byte [ds:si], 3ah	;":"
inc si
mov bl, 0		;second
call ReadPort
DispTime:
mov ax, cs
mov es, ax
mov bp, Message + STRMAIN + STR1 + STR2 + STR3	;es:bp -> TimeStr
mov ax, 1301h
mov bx, 0007h
mov cx, 19
mov dx, 0500h
int 10h
ret
ReadPort:
mov al, bl
out 70h, al
in al, 71h
mov ah, al
shr ah, 4
and al, 00001111b
add ah, 30h
add al, 30h
xchg ah, al
mov word [ds:si], ax
add si, 2
ret
;;
;;Set Clock
;;
SetClock:
call ReadCMOS
mov ax, cs
mov ds, ax
mov si, Message + STRMAIN + STR1 + STR2 + STR3 + STR4
mov byte [ds:si], 0
SetCursor:
mov ah, 02h
mov bh, 00h
mov dh, 05h
mov si, Message + STRMAIN + STR1 + STR2 + STR3 + STR4
mov al, [ds:si]
mov dl, al
shr al, 1
add dl, al
add dl, 2	;dl = [ds:si]/2 + [ds:si] + 2
int 10h
WaitKey:
mov ah, 0h
int 16h
cmp al, 'a'	;left
je GoLeft
cmp al, 'w'
je GoUp		;Up
cmp al, 'd'
je GoRight	;Right
cmp al, 's'
je GoDown	;Down
cmp al, 27
je GoExit	;Esc
jmp SetCursor
GoLeft:
mov al, [ds:si]
cmp al, 0
je SetCursor
dec al
mov byte [ds:si], al
jmp SetCursor
GoRight:
mov al, [ds:si]
cmp al, 11
je SetCursor
inc al
mov byte [ds:si], al
jmp SetCursor
GetIndex:
mov ax, cs
mov ds, ax
mov si, Message + STRMAIN + STR1 + STR2 + STR3 + STR4
mov al, [ds:si]
mov bl, al
shr bl, 1
add al, bl
add al, 2
mov ah, 0		;ax: Cursor address
mov si, Message + STRMAIN + STR1 + STR2 + STR3
add si, ax
mov al, [ds:si]
ret
GoUp:
call GetIndex
cmp al, '9'
je SetCursor
inc al
mov [ds:si], al
call DispTime
jmp SetCursor
GoDown:
call GetIndex
cmp al, '0'
je SetCursor
dec al
mov [ds:si], al
call DispTime
jmp SetCursor
GoExit:
mov ah, 02h
mov bh, 00h
mov dx, 0513h
int 10h
mov ah, 0h
int 16h
cmp al, 'y'
je SetCMOS
cmp al, 'n'
je ClearScreen
jmp GoExit
SetCMOS:
;lack due to limited space(512 bytes)
jmp GoExit
;;
;;Program Data
;;
Message:
db "Welcome to Jerry OS"	;STRMAIN
db "1.reset pc"			;STR1
db "2.show clock"		;STR2
db "3.set clock"		;STR3
times 19 db 0			;STR4
db 0				;CHAR
times 510-($-$$) db 0
dw 0aa55h
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: