📄 bios.asm
字号:
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 + -