您的位置:首页 > 其它

NASM 纯汇编打造简单中文操作系统(5)

2010-01-29 12:11 239 查看
五、interrupt.inc 初始化中断控制器

[BITS 32]
[ORG 0x0]
;JMP DWORD main
%macro WritePort 2
MOV DX,%1
MOV AL,%2
OUT DX,AL
%endmacro
%macro ReadPort 1
MOV DX,%1
IN AL,DX
%endmacro
IDT_TABLE:
;IDT_STRUCT_ADDR: equ $-IDT_TABLE
IDT_STRUCT:
DW 0x0 ;中断处理过程低16位 0-15位
DW 0x0 ;段选择字 16-31位
DB 00000000b ;32-39位
DB 10001110b ;40-47位
DW 0 ;中断处理过程地址高16位48-63
IDT_END:

;初始化8259A
SetChip8259A:
PUSH EBP
MOV EBP,ESP
CLI
;按顺序发每次打开和关闭状态8259a端口才会变化

; 发送 ICW1 : 使用 ICW4,级联工作
WritePort 0x20,0x11
WritePort 0xa0,0x11

; 发送 ICW2,中断起始号从 0x30 开始(第一片)及 0x38开始(第二片)
WritePort 0x21,0x30 ;0-7个中断表示0-7个IDT表数组下标,键盘中断是2那么对应的就是1号下标(数组下标从0开始数)
WritePort 0xa1,0x38

; 发送 ICW3
WritePort 0x21,0x4 ;主片IRQ2和从片IRQ0相连
WritePort 0xa1,0x2

; 发送 ICW4
WritePort 0x21,0x1 ;发送1表示工作在8086模式下
WritePort 0xa1,0x1

; 设置中断屏蔽位 OCW1 ,屏蔽所有中断请求
; 由于主片的 IRQ2 与从边相连,故不屏蔽它
WritePort 0x21,0xfb ;屏蔽中断11111011b屏蔽中断.0 1 (2不关)3 4 5 6 7
WritePort 0xa1,0xff ;关闭从片所有中断
STI
MOV ESP,EBP
POP EBP
RET
;设置中断向量表
CreateIdtTable:
MOV ECX,256
PUSH CS
POP ES
MOV ESI,IDT_STRUCT
MOV EDI,SYSTB ;IDT表存放地址
s:
MOV EAX,[ES:ESI]
MOV [DS:EDI],EAX
ADD ESI,4
ADD EDI,4
MOV EAX,[ES:ESI]
MOV [DS:EDI],EAX
SUB ESI,4
ADD EDI,4
LOOP s
MOV EAX,256*8 ;所有IDT表的总个数
MOV [DS:EDI],AX
MOV EAX,SYSTB
MOV [DS:EDI+2],EAX ;IDT表所在的位置
LIDT [DS:EDI]
RET
kb_read:

push ecx
push edx

mov ecx,0xffff
kr_loop:
in al,0x64
test al,1
jnz kr_ready
loop kr_loop
mov ah,1
jmp kr_exit
kr_ready:
push ecx
mov ecx,32
kr_delay:
loop kr_delay
pop ecx
in al,0x60
xor ah,ah
kr_exit:

pop edx
pop ecx

ret

kb_write:

push ecx
push edx

mov dl,al
mov ecx,0xffff
kw_loop1:
in al,0x64
test al,0x20
jz kw_ok1
loop kw_loop1
mov ah,1
jmp kw_exit
kw_ok1:
in al,0x60
mov ecx,0xffff
kw_loop:
in al,0x64
test al,2
jz kw_ok
loop kw_loop
mov ah,1
jmp kw_exit
kw_ok:
mov al,dl
out 0x60,al
mov ecx,0xffff
kw_loop3:
in al,0x64
test al,2
jz kw_ok3
loop kw_loop3
mov ah,1
jmp kw_exit
kw_ok3:
mov ah,8
kw_loop4:
mov ecx,0xffff
kw_loop5:
in al,0x64
test al,1
jnz kw_ok4
loop kw_loop5
dec ah
jnz kw_loop4
kw_ok4:
xor ah,ah
kw_exit:

pop edx
pop ecx

ret

kb_cmd:

mov ecx,0xffff
c_wait:
in al,0x64
test al,2
jz c_send
loop c_wait
jmp c_error
c_send:
mov al,bl
out 0x64,al
mov ecx,0xffff
c_accept:
in al,0x64
test al,2
jz c_ok
loop c_accept
c_error:
mov ah,1
jmp c_exit
c_ok:
xor ah,ah
c_exit:
ret

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/kylixfire/archive/2009/03/06/3963889.aspx
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐