📄 dianfengshan.asm
字号:
data segment
isend db 0
n0 db 0
n1 db 0
n2 db 0
isright db 1
keykind db 0
oldkey db 0
kind db 0
isstop db 0
flags db 0
numbers db 3fh,6,5bh,0,0,0,0,0,0,0
data ends
code segment
assume cs:code,ds:data
main:;主程序
cli
mov ax,cs
mov ds,ax
mov kind,0
mov isright,1
mov keykind,0ah
mov oldkey,0ah
mov kind,0
mov isstop,0
mov flags,0
mov isend,0
mov n0,0
mov n1,0
mov n2,0
call initnumbers
call init8255
call init8259
call init8253
call modifyint
mov dx,212h
mov al,0
out dx,al
call cleardevice
call display
mov al,0
mov dx,22ah
out dx,al
mov al,30h
out dx,al
mov al,7fh
sti
dowhat:
push ax
dowait:
mov al,0ffh;单色灯清零
mov dx,211h
out dx,al
mov dx,210h
in al,dx
test al,1;判断开关
jz dowait
pop ax
call readakey
cmp keykind,0ah
jnz a1
mov kind,2
call gotonext
jmp aa
a1:;判断风速改变
cmp keykind,0bh
jnz a2
mov kind,1
call gotonext
jmp aa
a2:
cmp keykind,0ch
jnz a3
mov kind,0
call gotonext
jmp aa
a3:
cmp keykind,0dh
jnz a4
push ax
mov dx,212h
mov al,0
out dx,al
pop ax
mov isstop,0
push ax
mov al,oldkey
mov keykind,al
call reading
mov dx,212h
mov al,0ffh
out dx,al
pop ax
sti
jmp aa
a4:
cmp keykind,0eh
jnz aa
not flags
push ax
mov al,oldkey
mov keykind,al
pop ax
aa:
jmp dowhat
gotonext:;单色灯循环亮灭
cmp isright,1
jnz left
mov dx,211h
out dx,al
cmp flags,0
jnz noror
ror al,1
noror:
cmp al,0feh
jnz continue
mov isright,0
jmp continue
left:
mov dx,211h
out dx,al
cmp flags,0
jnz norol
rol al,1
norol:
cmp al,7fh
jnz continue
mov isright,1
continue:
cmp kind,2
jnz mm1
call speed2
jmp mm3
mm1:;改变风速
cmp kind,1
jnz mm2
call speed1
jmp mm3
mm2:
cmp kind,0
jnz mm3
call speed0
mm3:
push ax
mm33:
cmp isstop,0
jz mm4
mov dx,211h
mov al,0ffh
out dx,al
mov dx,210h
in al,dx
test al,1
jnz mm33
mov isstop,0
cli
mm4:
pop ax
ret
readakey:;读取键盘输入
push ax
mov al,keykind
mov oldkey,al
mov dx,22ah
in al,dx
and al,0fh
cmp al,0
jz gotoexit
mov al,40h
mov dx,22ah
out dx,al
mov dx,228h
in al,dx
mov keykind,al
gotoexit:
pop ax
ret
speed1:;速度设置
push cx
mov cx,18000
sp1:
loop sp1
pop cx
ret
speed2:
push cx
mov cx,50000
sp2:
loop sp2
pop cx
ret
speed0:
push cx
mov cx,8000
sp0:
loop sp0
pop cx
ret
readisd:
key:
mov dx,22ah
in al,dx
and al,0fh
cmp al,0
jz key
mov al,40h
out dx,al
mov dx,228h
in al,dx
cmp al,0dh
jnz key
ret
reading:;输入时间
push ax
mov n0,0
mov n1,0
mov n2,0
call readanumber
mov n0,al
call display
call readanumber
cmp al,0dh
jz readexit
mov ah,n0
mov n0,al
mov n1,ah
call display
call readanumber
cmp al,0dh
jz readexit
mov ah,n0
mov n0,al
mov al,n1
mov n1,ah
mov n2,al
call display
call readisd
readexit:
pop ax
ret
readanumber:
key2:
mov dx,22ah
in al,dx
and al,0fh
cmp al,0
jz key2
mov al,40h
out dx,al
mov dx,228h
in al,dx
ret
initnumbers:
push bx
mov bx,offset numbers
mov byte ptr[bx],3fh
mov byte ptr[bx+1],6
mov byte ptr[bx+2],5bh
mov byte ptr[bx+3],4fh
mov byte ptr[bx+4],66h
mov byte ptr[bx+5],6dh
mov byte ptr[bx+6],7dh
mov byte ptr[bx+7],7
mov byte ptr[bx+8],7fh
mov byte ptr[bx+9],6fh
pop bx
ret
display:;时间显示
call cleardevice
mov bx,offset numbers
mov al,80h
mov dx,22ah
out dx,al
mov al,n0
xor ah,ah
add bx,ax
mov al,[bx]
mov dx,228h
out dx,al
mov bx,offset numbers
mov al,81h
mov dx,22ah
out dx,al
mov dx,228h
mov al,n1
xor ah,ah
add bx,ax
mov al,[bx]
out dx,al
mov bx,offset numbers
mov al,82h
mov dx,22ah
out dx,al
mov dx,228h
mov al,n2
xor ah,ah
add bx,ax
mov al,[bx]
out dx,al
ret
intcount:
push ax
push bx
push dx
cmp n0,0
jz next1
dec n0
jmp next4
next1:
mov n0,9
cmp n1,0
jz next2
dec n1
jmp next4
next2:
mov n1,9
cmp n2,0
jz next3
dec n2
jmp next4
next3:
mov n2,9
next4:
cmp n0,0
jnz next5
cmp n1,0
jnz next5
cmp n2,0
jnz next5
mov isstop,1
mov dx,212h
mov al,0
out dx,al
next5:
call display
pop dx
pop bx
pop ax
iret
init8255:
mov al,90h
mov dx,213h
out dx,al
ret
init8259:
mov al,13h
mov dx,220h
out dx,al
mov dx,221h
mov al,30h
out dx,al
mov al,3
out dx,al
mov al,0feh
out dx,al
ret
modifyint:
push ds
push bx
push ax
xor ax,ax
mov ds,ax
mov bx,30h*4
mov ax,offset intcount
mov [bx],ax
mov ax,8100h
mov [bx+2],ax
pop ax
pop bx
pop ds
ret
init8253:
push ax
mov al,35h
mov dx,203h
out dx,al
mov ax,0ffffh
mov dx,200h
out dx,al
mov al,ah
out dx,al
mov al,75h
mov dx,203h
out dx,al
mov ax,27
mov dx,201h
out dx,al
mov al,ah
out dx,al
pop ax
ret
cleardevice:
push ax
push dx
mov al,0c1h
mov dx,22ah
out dx,al
wait1:
mov dx,22ah
in al,dx
test al,80h
jnz wait1
pop dx
pop ax
ret
code ends
end main
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -