📄 222.asm
字号:
cseg segment
assume cs:cseg,ds:cseg
start:
jmp main
table db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h
db 7fh,6fh,77h,7ch,39h,5eh,79h,71h
status db 0
ls db 0
rs db 0
lm db 0
rm db 0
count db 90
main:
mov al, 80h;initiate 8255
mov dx, 203h
out dx, al
mov dx, 233h;8253
mov al, 34h
out dx, al
mov ax, 9600
mov dx, 230h
out dx, al
mov al, ah
out dx, al
mov dx, 233h
mov al, 01010100b
out dx, al
mov dx, 231h
mov al, 30
out dx, al
mov dx, 210h;initiate 8259
mov al, 13h
out dx, al
inc dx
mov al, 32
out dx, al
mov al, 03h
out dx, al
mov al, 0fch
out dx, al
mov dx, 222h;8279
mov al, 00h
out dx, al
mov al, 38h
out dx, al
mov al, 0d0h
out dx, al
cli
mov ax, 0 ;set interrupt
mov ds, ax
mov ax, offset int0
mov ds:word ptr [32*4],ax
mov ax, 8100h
mov ds:word ptr 2[32*4],ax
mov ax, offset intp
mov ds:word ptr [33*4],ax
mov ax, 8100h
mov ds:word ptr 2[33*4],ax
sti
mov bx, offset table
wa:
mov al, 0c2h
mov dx, 222h
out dx, al
in al, dx
test al, 80h
jnz wa
aa: test status, 16
jnz aa
WAIIT: NOP
IN AL,DX
call disp
MOV BL,AL
AND AL,80H
CMP AL,80H
JE WAIIT ;FIFO正在清除期间则跳转等待
MOV AL,BL
AND AL,0FH
CMP AL,00H
JE WAIIT ;无键按下则等待
MOV AL,40H ;写 读FIFO RAM命令字
OUT DX,AL
MOV DX,220h ;读入FIFO RAM内容
IN AL,DX
cmp al, 0
je l
cmp al, 1
je r
cmp al, 2
je star
jmp wa
star: or status, 20h
jmp wa
l: cmp cl, 80h
jz co1
and status, 0f7h
inc rs
cmp rs, 11
jnz wa
inc rm
mov al, rm
add al, lm
test al, 1
jz lf0
or status, 4
jmp g0
lf0: and status, 0fbh
g0: mov rs, 0
mov ls, 0
jmp wa
co1: and status, 0fdh
jmp wa
r: cmp cl, 1
jz co2
and status, 0f7h
inc ls
cmp ls, 11
jnz rt
inc lm
mov al, rm
add al, lm
test al, 1
jz lf1
or status, 4
jmp g1
lf1: and status, 0fbh
g1: mov rs, 0
mov ls, 0
rt: jmp wa
co2: or status, 2
jmp wa
disp proc near
push bx
push ax
push dx
push cs
pop ds
mov dx, 222h
mov al, 84h
out dx, al
mov bx, offset table
mov al, rs
xlat
mov dx, 220h
out dx, al
mov dx, 222h
mov al, 85h
out dx, al
mov al, ls
xlat
mov dx, 220h
out dx, al
mov dx, 222h
mov al, 86h
out dx, al
mov al, rm
xlat
mov dx, 220h
out dx, al
mov dx, 222h
mov al, 87h
out dx, al
mov al, lm
xlat
mov dx, 220h
out dx, al
pop dx
pop ax
pop bx
ret
disp endp
int0: push ax
push bx
push dx
push ds
push cs
pop ds
lea bx, table
test status, 20h
jnz t
jmp exitint0
t: test status, 8
jnz begin
test status, 1
jnz pause1
jmp nobegin
begin:test cl, 80h
jz next
test status , 2
jnz adrs
jmp goon
next: test cl, 1
jz goon
test status, 2
jz adls
jmp goon
goon: test status, 2
jz ltr
rol cl, 1
jmp outd
ltr: ror cl, 1
jmp outd
adrs: inc rs
and status, 0f7h
cmp rs, 11
jnz adt
inc rm
mov al, rm
add al, lm
test al, 1
jz lf2
or status, 4
jmp g2
lf2: and status, 0fbh
g2: mov rs, 0
mov ls, 0
adt: jmp exitint0
pause1:jmp pause
adls: inc ls
and status, 0f7h
cmp ls, 11
jnz adt
inc lm
mov al, rm
add al, lm
test al, 1
jz lf3
or status, 4
jmp g3
lf3: and status, 0fbh
g3: mov rs, 0
mov ls, 0
jmp exitint0
nobegin:
test status, 4
jz lfirst
or status, 2
or status, 8
mov cl, 1
jmp outd
lfirst:
and status, 0fdh
or status, 8
mov cl, 80h
jmp outd
outd: mov dx, 200h
mov al, cl
not al
out dx, al
jmp exitint0
pause:or status, 16
mov bx, offset table
mov dx, 222h
mov al, 81h
out dx, al
dec count
xor ah, ah
mov dx, 220h
mov al, count
xor ah, ah
mov cl, 10
div cl
xlat
nop
nop
nop
nop
out dx, al
mov dx, 222h
mov al, 80h
out dx, al
mov dx, 220h
mov al, ah
xlat
out dx, al
cmp count, 0
jnz exitint0
mov count , 90
and status, 0eeh
exitint0:
pop ds
pop dx
pop bx
pop ax
iret
intp: or status, 1
iret
cseg ends
end start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -