⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bios.asm

📁 assembly source code that explain how to develop bios.enjoy.
💻 ASM
📖 第 1 页 / 共 5 页
字号:
        DEC     BL
        JNZ     POLL_1
        OR      BH,BH                           ; Clear mask to show timeout

POLLXT: RET                                     ; Exit AH reg. Z flag status

WAITFR: ADD     DX,4                            ; Reset the Modem Control Reg.
        OUT     DX,AL                           ;  ...index RS232_BASE + 4
        INC     DX                              ; Calculate Modem Status Reg.
        INC     DX                              ;  ...index RS232_BASE + 6
        PUSH    BX                              ; Save masks (BH=MSR,BL=LSR)
        CALL    POLL                            ; ...wait on MSR modem status
        POP     BX                              ; ...restore wait masks BH,BL
        JNZ     WAITF1                          ; ..."Error Somewhere" by DEC

        DEC     DX                              ; Calculate Line Status Reg.
        MOV     BH,BL                           ;  ...index RS232_BASE + 5
        CALL    POLL                            ;  ...wait on LSR line status

WAITF1: RET                                     ; Status in AH reg. and Z flag

        ENTRY   0E82Eh                          ; IBM entry, key bios service

INT_16: STI                                     ; Keyboard bios services
        PUSH    DS
        PUSH    BX
        MOV     BX,40h
        MOV     DS,BX                           ; Load work segment
        OR      AH,AH
        JZ      KPD_RD                          ; Read keyboard buffer, AH=0
        DEC     AH
        JZ      KPD_WT                          ; Set Z if char  ready, AH=1
        DEC     AH
        JZ      KPD_SH                          ; Return shift in AL  , AH=2

KPD_XT: POP     BX                              ; Exit INT_16 keypad service
        POP     DS
        IRET

KPD_RD: CLI                                     ; No interrupts, alters buffer
        MOV     BX,DS:1Ah                       ;  ...point to buffer head
        CMP     BX,DS:1Ch                       ; If not equal to buffer tail
        JNZ     KPD_R1                          ;  ...char waiting to be read
        STI                                     ; Else allow interrupts
        JMP     KPD_RD                          ;  ...wait for him to type

KPD_R1: MOV     AX,[BX]                         ; Fetch the character
        INC     BX                              ;  ...point to next character
        INC     BX                              ;  ...char = scan code + shift
        MOV     DS:1Ah,BX                       ; Save position in head
        CMP     BX,DS:82h                       ;  ...buffer overflowed?
        JNZ     KPD_XT                          ;  ...no, done
        MOV     BX,DS:80h                       ; Else reset to point at start
        MOV     DS:1Ah,BX                       ;  ...and correct head position
        JMP     KPD_XT

KPD_WT: CLI                                     ; No interrupts, critical code
        MOV     BX,DS:1Ah                       ;  ...point to buffer head
        CMP     BX,DS:1Ch                       ;  ...equal buffer tail?
        MOV     AX,[BX]                         ;     (fetch, look ahead)
        STI                                     ; Enable interrupts
        POP     BX
        POP     DS
        RETF    2                               ; Do IRET, preserve flags

KPD_SH: MOV     AL,DS:17h                       ; Read keypad shift status
        JMP     KPD_XT

        ENTRY   0E885h                          ; Align INT_9 at correct place

ASCII   db      000h,037h,02Eh,020h             ; Scan -> Ascii.  Sign bit set
        db      02Fh,030h,031h,021h             ;  ...if further work needed
        db      032h,033h,034h,035h
        db      022h,036h,038h,03Eh
        db      011h,017h,005h,012h
        db      014h,019h,015h,009h
        db      00Fh,010h,039h,03Ah
        db      03Bh,084h,001h,013h
        db      004h,006h,007h,008h
        db      00Ah,00Bh,00Ch,03Fh
        db      040h,041h,082h,03Ch
        db      01Ah,018h,003h,016h
        db      002h,00Eh,00Dh,042h
        db      043h,044h,081h,03Dh
        db      088h,02Dh,0C0h,023h
        db      024h,025h,026h,027h
        db      028h,029h,02Ah,02Bh
        db      02Ch,0A0h,090h

NOALFA  db      032h,036h,02Dh,0BBh             ; Non-Alphabetic secondary
        db      0BCh,0BDh,0BEh,0BFh             ;  ...translation table
        db      0C0h,0C1h,0C2h,0C3h
        db      0C4h,020h,031h,033h
        db      034h,035h,037h,038h
        db      039h,030h,03Dh,01Bh
        db      008h,05Bh,05Dh,00Dh
        db      05Ch,02Ah,009h,03Bh
        db      027h,060h,02Ch,02Eh
        db      02Fh

CTRLUP  db      040h,05Eh,05Fh,0D4h             ; CTRL uppercase secondary
        db      0D5h,0D6h,0D7h,0D8h             ;  ...translation table
        db      0D9h,0DAh,0DBh,0DCh             ;  ...for non-ASCII control
        db      0DDh,020h,021h,023h
        db      024h,025h,026h,02Ah
        db      028h,029h,02Bh,01Bh
        db      008h,07Bh,07Dh,00Dh
        db      07Ch,005h,08Fh,03Ah
        db      022h,07Eh,03Ch,03Eh
        db      03Fh

CTRLLO  db      003h,01Eh,01Fh,0DEh             ; CTRL lowercase secondary
        db      0DFh,0E0h,0E1h,0E2h             ;  ...translation table
        db      0E3h,0E4h,0E5h,0E6h             ;  ...for non-ASCII control
        db      0E7h,020h,005h,005h
        db      005h,005h,005h,005h
        db      005h,005h,005h,01Bh
        db      07Fh,01Bh,01Dh,00Ah
        db      01Ch,0F2h,005h,005h
        db      005h,005h,005h,005h
        db      005h

ALTKEY  db      0F9h,0FDh,002h,0E8h             ; ALT key secondary
        db      0E9h,0EAh,0EBh,0ECh             ;  ...translation table
        db      0EDh,0EEh,0EFh,0F0h
        db      0F1h,020h,0F8h,0FAh
        db      0FBh,0FCh,0FEh,0FFh
        db      000h,001h,003h,005h
        db      005h,005h,005h,005h
        db      005h,005h,005h,005h
        db      005h,005h,005h,005h
        db      005h

NUMPAD  db      '789-456+1230.'                 ; Keypad secondary tralsator

NUMCTR  db      0F7h,005h,004h,005h             ; Numeric keypad CTRL sec.
        db      0F3h,005h,0F4h,005h             ;  ...translation table
        db      0F5h,005h,0F6h,005h
        db      005h

NUMUPP  db      0C7h,0C8h,0C9h,02Dh             ; Numeric keypad SHIFT sec.
        db      0CBh,005h,0CDh,02Bh             ;  ...translation table
        db      0CFh,0D0h,0D1h,0D2h
        db      0D3h

INT_9:  STI                                     ; Key press hardware interrupt
        PUSH    AX
        PUSH    BX
        PUSH    CX
        PUSH    DX
        PUSH    SI
        PUSH    DI
        PUSH    DS
        PUSH    ES
        CLD
        MOV     AX,40h
        MOV     DS,AX
        IN      AL,60h                          ; Read the scan code data
        PUSH    AX                              ;  ...save it
        IN      AL,61h                          ; Get control port status
        PUSH    AX                              ;  ...save it
        OR      AL,10000000b                    ; Set "latch" bit to
        OUT     61h,AL                          ;  ...acknowledge data
        POP     AX                              ; Restore control status
        OUT     61h,AL                          ;  ...to enable keyboard
        POP     AX                              ;  ...restore scan code
        MOV     AH,AL                           ; Save copy of scan code
        CMP     AL,11111111b                    ;  ...check for overrun
        JNZ     KY_01                           ;  ...no, OK
        JMP     KY_BEP                          ; Else beep bell on overrun

KY_EOI: MOV     AL,20h                          ; Send end_of_interrupt code
        OUT     20h,AL                          ;  ...to 8259 interrupt chip

KY_XIT: POP     ES                              ; Exit the interrupt
        POP     DS
        POP     DI
        POP     SI
        POP     DX
        POP     CX
        POP     BX
        POP     AX
        IRET

KY_01:  AND     AL,01111111b                    ; Valid scan code, no break
        CMP     AL,46h
        JBE     KY_02
        JMP     KY_CT8

KY_02:  MOV     BX,offset ASCII                 ; Table for ESC thru Scroll Lck
        XLAT    CS:[BX]                         ;  ...translate to Ascii
        OR      AL,AL                           ; Sign flags "Shift" type key
        JS      KY_FLG                          ;  ...shift,caps,num,scroll etc
        OR      AH,AH                           ; Invalid scan code?
        JS      KY_EOI                          ;  ...exit if so
        JMP     short   KY_ASC                  ; Else normal character

KY_FLG: AND     AL,01111111b                    ; Remove sign flag bit
        OR      AH,AH                           ;  ...check scan code
        JS      KY_SUP                          ;  ...negative, key released
        CMP     AL,10h                          ; Is it a "toggle" type key?
        JNB     KY_TOG                          ;  ...yes
        OR      DS:17h,AL                       ; Else set bit in "flag" byte
        JMP     KY_EOI                          ;  ...and exit

KY_TOG: TEST    Byte ptr DS:17h,00000100b       ; Control key pressed?
        JNZ     KY_ASC                          ;  ...yes, skip
        TEST    AL,DS:18h                       ; Else check "CAPS, NUM, SCRL"
        JNZ     KY_EOI                          ;  ...set, invalid, exit
        OR      DS:18h,AL                       ; Show set in "flag_1" byte
        XOR     DS:17h,AL                       ;  ...flip bits in "flag" byte
        JMP     KY_EOI

KY_SUP: CMP     AL,10h                          ; Released - is it "toggle" key
        JNB     KY_TUP                          ;  ...skip if so
        NOT     AL                              ; Else form two's complement
        AND     DS:17h,AL                       ;  ...to do BIT_CLEAR "flags"
        CMP     AL,11110111b                    ; ALT key release special case
        JNZ     KY_EOI                          ;  ...no, exit
        MOV     AL,DS:19h                       ; Else get ALT-keypad character
        MOV     AH,0                            ;  ...pretend null scan code
        MOV     DS:19h,AH                       ;  ...zero ALT-keypad character
        CMP     AL,AH                           ; Was there a valid ALT-keypad?
        JZ      KY_EOI                          ;  ...no, ignore, exit
        JMP     KY_NUL                          ; Else stuff it in ASCII buffer

KY_TUP: NOT     AL                              ; Form complement of toggle key
        AND     DS:18h,AL                       ;  ...to do BIT_CLEAR "flag_1"
        JMP     KY_EOI

KY_ASC: TEST    Byte ptr DS:18h,00001000b       ; Scroll lock pressed?
        JZ      KY_NLK                          ;  ...no
        CMP     AH,45h                          ; Is this a NUM LOCK character?
        JZ      KY_03                           ;  ...no
        AND     Byte ptr DS:18h,11110111b       ; Else clear bits in "flag_1"

KY_03:  JMP     KY_EOI                          ;  ...and exit

KY_NLK: TEST    Byte ptr DS:17h,00001000b       ; ALT key pressed?
        JNZ     KY_ALT                          ;  ...yes
        TEST    Byte ptr DS:17h,00000100b       ; CTRL key pressed?
        JNZ     KY_CTL                          ;  ...yes
        TEST    Byte ptr DS:17h,00000011b       ; Either shift key pressed?
        JNZ     KSHIFT                          ;  ...yes

KY_LC:  CMP     AL,1Ah                          ; Alphabetic character?
        JA      KY_LC1                          ;  ...no
        ADD     AL,'a'-1             

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -