最近不知是怎么了,喜欢上了写操作系统(OS)。但是本人水平实在是有限,什么也干不成。学了一些汇编和操作系统的基本代码(软硬件),就头晕,看不进去了。
或许这需要时间,而我似乎也有这么一些时间。。。总之,这一切起初是晦涩难懂的,不过以后应该会好一些。我写了一个键盘驱动,一些小代码,复制在这里:
keyboard.asm
ORG 7C00H
MOV AX, CS
MOV DS, AX
MOV SS, AX
MOV SP, 0X7C00
MOV AX, 0XB800
MOV ES, AX
MOV SI, 0
KEYBD:
CALL _READ_KEY
CMP AL, 80H
JAE KEYBD
PUSH AX
CALL _PRINT_KEY
ADD SP, 2
JMP KEYBD
; byte READ_KEY();
; global _READ_KEY
_READ_KEY:
IN AL, 0X64
TEST AL, 1
JZ _READ_KEY
IN AL, 0X60
RET
; void PRINT_KEY(byte)
; 位置:SI
; global _PRINT_KEY
_PRINT_KEY:
PUSH BP
MOV BP, SP
PUSH AX
PUSH BX
;BACKSPACE
MOV AL, [BP + 4]
CMP AL, 0X0E
JNZ SKIP1
CMP SI, 0
JZ RET_SKIP
SUB SI, 2
MOV BYTE [ES : SI], ' '
JMP RET_SKIP
SKIP1:
;ENTER
CMP AL, 0X1C
JNZ SKIP2
PUSH AX
MOV AX, SI
MOV BL, 160
DIV BL
ADD SI, 160
MOV AL, AH
MOV AH, 0
SUB SI, AX
POP AX
JMP RET_SKIP
SKIP2:
;TAB
CMP AL, 0X0F
JNZ SKIP3
PUSH AX
MOV AX, SI
MOV BL, 16
DIV BL
ADD SI, 16
MOV AL, AH
MOV AH, 0
SUB SI, AX
POP AX
JMP RET_SKIP
SKIP3:
MOV AH, 0
MOV BP, AX
MOV AL, [KEY_MAP + BP]
MOV BYTE [ES : SI], AL
ADD SI, 2
RET_SKIP:
POP BX
POP AX
POP BP
RET
%INCLUDE "KEY_MAP. TXT"
TIMES 510-($-$$) DB 0
DW 0XAA55
KEY_MAP.txt
KEY_MAP DB 0, 0, '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '=', 0, 0, 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', '[', ']', 0, 0, 'A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L', '; ', '"', '`', 0, '\', 'Z', 'X', 'C', 'V', 'B', 'N', 'M', ', ', '.', '/', 0