📄 rombios.c
字号:
#else# define BX_DEBUG_INT1A(a...)#endif#if DEBUG_INT74# define BX_DEBUG_INT74(a...) BX_DEBUG(a)#else# define BX_DEBUG_INT74(a...)#endif#define SET_AL(val8) AX = ((AX & 0xff00) | (val8))#define SET_BL(val8) BX = ((BX & 0xff00) | (val8))#define SET_CL(val8) CX = ((CX & 0xff00) | (val8))#define SET_DL(val8) DX = ((DX & 0xff00) | (val8))#define SET_AH(val8) AX = ((AX & 0x00ff) | ((val8) << 8))#define SET_BH(val8) BX = ((BX & 0x00ff) | ((val8) << 8))#define SET_CH(val8) CX = ((CX & 0x00ff) | ((val8) << 8))#define SET_DH(val8) DX = ((DX & 0x00ff) | ((val8) << 8))#define GET_AL() ( AX & 0x00ff )#define GET_BL() ( BX & 0x00ff )#define GET_CL() ( CX & 0x00ff )#define GET_DL() ( DX & 0x00ff )#define GET_AH() ( AX >> 8 )#define GET_BH() ( BX >> 8 )#define GET_CH() ( CX >> 8 )#define GET_DH() ( DX >> 8 )#define GET_ELDL() ( ELDX & 0x00ff )#define GET_ELDH() ( ELDX >> 8 )#define SET_CF() FLAGS |= 0x0001#define CLEAR_CF() FLAGS &= 0xfffe#define GET_CF() (FLAGS & 0x0001)#define SET_ZF() FLAGS |= 0x0040#define CLEAR_ZF() FLAGS &= 0xffbf#define GET_ZF() (FLAGS & 0x0040)#define UNSUPPORTED_FUNCTION 0x86#define none 0#define MAX_SCAN_CODE 0x58static struct { Bit16u normal; Bit16u shift; Bit16u control; Bit16u alt; Bit8u lock_flags; } scan_to_scanascii[MAX_SCAN_CODE + 1] = { { none, none, none, none, none }, { 0x011b, 0x011b, 0x011b, 0x0100, none }, /* escape */ { 0x0231, 0x0221, none, 0x7800, none }, /* 1! */ { 0x0332, 0x0340, 0x0300, 0x7900, none }, /* 2@ */ { 0x0433, 0x0423, none, 0x7a00, none }, /* 3# */ { 0x0534, 0x0524, none, 0x7b00, none }, /* 4$ */ { 0x0635, 0x0625, none, 0x7c00, none }, /* 5% */ { 0x0736, 0x075e, 0x071e, 0x7d00, none }, /* 6^ */ { 0x0837, 0x0826, none, 0x7e00, none }, /* 7& */ { 0x0938, 0x092a, none, 0x7f00, none }, /* 8* */ { 0x0a39, 0x0a28, none, 0x8000, none }, /* 9( */ { 0x0b30, 0x0b29, none, 0x8100, none }, /* 0) */ { 0x0c2d, 0x0c5f, 0x0c1f, 0x8200, none }, /* -_ */ { 0x0d3d, 0x0d2b, none, 0x8300, none }, /* =+ */ { 0x0e08, 0x0e08, 0x0e7f, none, none }, /* backspace */ { 0x0f09, 0x0f00, none, none, none }, /* tab */ { 0x1071, 0x1051, 0x1011, 0x1000, 0x40 }, /* Q */ { 0x1177, 0x1157, 0x1117, 0x1100, 0x40 }, /* W */ { 0x1265, 0x1245, 0x1205, 0x1200, 0x40 }, /* E */ { 0x1372, 0x1352, 0x1312, 0x1300, 0x40 }, /* R */ { 0x1474, 0x1454, 0x1414, 0x1400, 0x40 }, /* T */ { 0x1579, 0x1559, 0x1519, 0x1500, 0x40 }, /* Y */ { 0x1675, 0x1655, 0x1615, 0x1600, 0x40 }, /* U */ { 0x1769, 0x1749, 0x1709, 0x1700, 0x40 }, /* I */ { 0x186f, 0x184f, 0x180f, 0x1800, 0x40 }, /* O */ { 0x1970, 0x1950, 0x1910, 0x1900, 0x40 }, /* P */ { 0x1a5b, 0x1a7b, 0x1a1b, none, none }, /* [{ */ { 0x1b5d, 0x1b7d, 0x1b1d, none, none }, /* ]} */ { 0x1c0d, 0x1c0d, 0x1c0a, none, none }, /* Enter */ { none, none, none, none, none }, /* L Ctrl */ { 0x1e61, 0x1e41, 0x1e01, 0x1e00, 0x40 }, /* A */ { 0x1f73, 0x1f53, 0x1f13, 0x1f00, 0x40 }, /* S */ { 0x2064, 0x2044, 0x2004, 0x2000, 0x40 }, /* D */ { 0x2166, 0x2146, 0x2106, 0x2100, 0x40 }, /* F */ { 0x2267, 0x2247, 0x2207, 0x2200, 0x40 }, /* G */ { 0x2368, 0x2348, 0x2308, 0x2300, 0x40 }, /* H */ { 0x246a, 0x244a, 0x240a, 0x2400, 0x40 }, /* J */ { 0x256b, 0x254b, 0x250b, 0x2500, 0x40 }, /* K */ { 0x266c, 0x264c, 0x260c, 0x2600, 0x40 }, /* L */ { 0x273b, 0x273a, none, none, none }, /* ;: */ { 0x2827, 0x2822, none, none, none }, /* '" */ { 0x2960, 0x297e, none, none, none }, /* `~ */ { none, none, none, none, none }, /* L shift */ { 0x2b5c, 0x2b7c, 0x2b1c, none, none }, /* |\ */ { 0x2c7a, 0x2c5a, 0x2c1a, 0x2c00, 0x40 }, /* Z */ { 0x2d78, 0x2d58, 0x2d18, 0x2d00, 0x40 }, /* X */ { 0x2e63, 0x2e43, 0x2e03, 0x2e00, 0x40 }, /* C */ { 0x2f76, 0x2f56, 0x2f16, 0x2f00, 0x40 }, /* V */ { 0x3062, 0x3042, 0x3002, 0x3000, 0x40 }, /* B */ { 0x316e, 0x314e, 0x310e, 0x3100, 0x40 }, /* N */ { 0x326d, 0x324d, 0x320d, 0x3200, 0x40 }, /* M */ { 0x332c, 0x333c, none, none, none }, /* ,< */ { 0x342e, 0x343e, none, none, none }, /* .> */ { 0x352f, 0x353f, none, none, none }, /* /? */ { none, none, none, none, none }, /* R Shift */ { 0x372a, 0x372a, none, none, none }, /* * */ { none, none, none, none, none }, /* L Alt */ { 0x3920, 0x3920, 0x3920, 0x3920, none }, /* space */ { none, none, none, none, none }, /* caps lock */ { 0x3b00, 0x5400, 0x5e00, 0x6800, none }, /* F1 */ { 0x3c00, 0x5500, 0x5f00, 0x6900, none }, /* F2 */ { 0x3d00, 0x5600, 0x6000, 0x6a00, none }, /* F3 */ { 0x3e00, 0x5700, 0x6100, 0x6b00, none }, /* F4 */ { 0x3f00, 0x5800, 0x6200, 0x6c00, none }, /* F5 */ { 0x4000, 0x5900, 0x6300, 0x6d00, none }, /* F6 */ { 0x4100, 0x5a00, 0x6400, 0x6e00, none }, /* F7 */ { 0x4200, 0x5b00, 0x6500, 0x6f00, none }, /* F8 */ { 0x4300, 0x5c00, 0x6600, 0x7000, none }, /* F9 */ { 0x4400, 0x5d00, 0x6700, 0x7100, none }, /* F10 */ { none, none, none, none, none }, /* Num Lock */ { none, none, none, none, none }, /* Scroll Lock */ { 0x4700, 0x4737, 0x7700, none, 0x20 }, /* 7 Home */ { 0x4800, 0x4838, none, none, 0x20 }, /* 8 UP */ { 0x4900, 0x4939, 0x8400, none, 0x20 }, /* 9 PgUp */ { 0x4a2d, 0x4a2d, none, none, none }, /* - */ { 0x4b00, 0x4b34, 0x7300, none, 0x20 }, /* 4 Left */ { 0x4c00, 0x4c35, none, none, 0x20 }, /* 5 */ { 0x4d00, 0x4d36, 0x7400, none, 0x20 }, /* 6 Right */ { 0x4e2b, 0x4e2b, none, none, none }, /* + */ { 0x4f00, 0x4f31, 0x7500, none, 0x20 }, /* 1 End */ { 0x5000, 0x5032, none, none, 0x20 }, /* 2 Down */ { 0x5100, 0x5133, 0x7600, none, 0x20 }, /* 3 PgDn */ { 0x5200, 0x5230, none, none, 0x20 }, /* 0 Ins */ { 0x5300, 0x532e, none, none, 0x20 }, /* Del */ { none, none, none, none, none }, /* ??? */ { none, none, none, none, none }, /* ??? */ { none, none, none, none, none }, /* ??? */ { 0x8500, 0x8700, 0x8900, 0x8b00, none }, /* F11 */ { 0x8600, 0x8800, 0x8a00, 0x8c00, none }, /* F12 */ }; Bit8uinb(port) Bit16u port;{ASM_START push bp mov bp, sp push dx mov dx, 4[bp] in al, dx pop dx pop bpASM_END}#if BX_USE_ATADRV Bit16uinw(port) Bit16u port;{ASM_START push bp mov bp, sp push dx mov dx, 4[bp] in ax, dx pop dx pop bpASM_END}#endif voidoutb(port, val) Bit16u port; Bit8u val;{ASM_START push bp mov bp, sp push ax push dx mov dx, 4[bp] mov al, 6[bp] out dx, al pop dx pop ax pop bpASM_END}#if BX_USE_ATADRV voidoutw(port, val) Bit16u port; Bit16u val;{ASM_START push bp mov bp, sp push ax push dx mov dx, 4[bp] mov ax, 6[bp] out dx, ax pop dx pop ax pop bpASM_END}#endif voidoutb_cmos(cmos_reg, val) Bit8u cmos_reg; Bit8u val;{ASM_START push bp mov bp, sp mov al, 4[bp] ;; cmos_reg out 0x70, al mov al, 6[bp] ;; val out 0x71, al pop bpASM_END} Bit8uinb_cmos(cmos_reg) Bit8u cmos_reg;{ASM_START push bp mov bp, sp mov al, 4[bp] ;; cmos_reg out 0x70, al in al, 0x71 pop bpASM_END} voidinit_rtc(){ outb_cmos(0x0a, 0x26); outb_cmos(0x0b, 0x02); inb_cmos(0x0c); inb_cmos(0x0d);} bx_boolrtc_updating(){ // This function checks to see if the update-in-progress bit // is set in CMOS Status Register A. If not, it returns 0. // If it is set, it tries to wait until there is a transition // to 0, and will return 0 if such a transition occurs. A 1 // is returned only after timing out. The maximum period // that this bit should be set is constrained to 244useconds. // The count I use below guarantees coverage or more than // this time, with any reasonable IPS setting. Bit16u count; count = 25000; while (--count != 0) { if ( (inb_cmos(0x0a) & 0x80) == 0 ) return(0); } return(1); // update-in-progress never transitioned to 0} Bit8uread_byte(seg, offset) Bit16u seg; Bit16u offset;{ASM_START push bp mov bp, sp push bx push ds mov ax, 4[bp] ; segment mov ds, ax mov bx, 6[bp] ; offset mov al, [bx] ;; al = return value (byte) pop ds pop bx pop bpASM_END} Bit16uread_word(seg, offset) Bit16u seg; Bit16u offset;{ASM_START push bp mov bp, sp push bx push ds mov ax, 4[bp] ; segment mov ds, ax mov bx, 6[bp] ; offset mov ax, [bx] ;; ax = return value (word) pop ds pop bx pop bpASM_END} voidwrite_byte(seg, offset, data) Bit16u seg; Bit16u offset; Bit8u data;{ASM_START push bp mov bp, sp push ax push bx push ds mov ax, 4[bp] ; segment mov ds, ax mov bx, 6[bp] ; offset mov al, 8[bp] ; data byte mov [bx], al ; write data byte pop ds pop bx pop ax pop bpASM_END} voidwrite_word(seg, offset, data) Bit16u seg; Bit16u offset; Bit16u data;{ASM_START push bp mov bp, sp push ax push bx push ds mov ax, 4[bp] ; segment mov ds, ax mov bx, 6[bp] ; offset mov ax, 8[bp] ; data word mov [bx], ax ; write data word pop ds pop bx pop ax pop bpASM_END} Bit16uget_CS(){ASM_START mov ax, csASM_END}// Bit16u//get_DS()//{//ASM_START// mov ax, ds//ASM_END//}//// void//set_DS(ds_selector)// Bit16u ds_selector;//{//ASM_START// push bp// mov bp, sp//// push ax// mov ax, 4[bp] ; ds_selector// mov ds, ax// pop ax//// pop bp//ASM_END//} Bit16uget_SS(){ASM_START mov ax, ssASM_END}#ifdef HVMASSISTvoidcopy_e820_table(){ Bit8u nr_entries = read_byte(0x9000, 0x1e8); Bit32u base_mem; if (nr_entries > 32) nr_entries = 32; write_word(0xe000, 0x8, nr_entries); memcpyb(0xe000, 0x10, 0x9000, 0x2d0, nr_entries * 0x14); /* Report the proper base memory size at address 0x0413: otherwise * non-e820 code will clobber things if BASE_MEM_IN_K is bigger than * the first e820 entry. Get the size by reading the second 64bit * field of the first e820 slot. */ base_mem = read_dword(0x9000, 0x2d0 + 8); write_word(0x40, 0x13, base_mem >> 10);}voidset_rom_write_access(action) Bit16u action;{ Bit16u off = (Bit16u)&((struct bios_info *)0)->xen_pfiob;ASM_START mov si,.set_rom_write_access.off[bp] push ds mov ax,#(ACPI_PHYSICAL_ADDRESS >> 4) mov ds,ax mov dx,[si] pop ds mov ax,.set_rom_write_access.action[bp] out dx,alASM_END}void enable_rom_write_access(){ set_rom_write_access(0);}void disable_rom_write_access(){ set_rom_write_access(PFFLAG_ROM_LOCK);} #endif /* HVMASSIST */#if BX_DEBUG_SERIAL/* serial debug port*/#define BX_DEBUG_PORT 0x03f8/* data */#define UART_RBR 0x00#define UART_THR 0x00/* control */#define UART_IER 0x01#define UART_IIR 0x02#define UART_FCR 0x02#define UART_LCR 0x03#define UART_MCR 0x04#define UART_DLL 0x00#define UART_DLM 0x01/* status */#define UART_LSR 0x05#define UART_MSR 0x06#define UART_SCR 0x07int uart_can_tx_byte(base_port) Bit16u base_port;{ return inb(base_port + UART_LSR) & 0x20;}void uart_wait_to_tx_byte(base_port) Bit16u base_port;{ while (!uart_can_tx_byte(base_port));}void uart_wait_until_sent(base_port) Bit16u base_port;{ while (!(inb(base_port + UART_LSR) & 0x40));}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -