1 min read

Categories

  • 技术

最近不知是怎么了,喜欢上了写操作系统(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